diff --exclude=*.elc --exclude=*~ --exclude=*-[0-9] --exclude=gnus --context --recursive pub/dgnus/lisp/ChangeLog dgnus/lisp/ChangeLog *** pub/dgnus/lisp/ChangeLog Sun Mar 19 02:18:11 1995 --- dgnus/lisp/ChangeLog Wed Mar 22 08:59:11 1995 *************** *** 1,3 **** --- 1,115 ---- + Wed Mar 22 08:37:15 1995 Lars Magne Ingebrigtsen + + * nntp.el (nntp-send-mode-reader): Actually send the mode reader + command. + + Wed Mar 22 00:00:01 1995 Lars Ingebrigtsen + + * gnus.el (gnus-make-threads-and-expunge): Really, really expunge + low-scored articles. Right. + (gnus-make-threads): Simpler function to speed things up when + expunging is not needed. + + * nnvirtual.el (nnvirtual-create-mapping): Would bug out in the + presence of bogus groups. + + * nnspool.el (nnspool-possibly-change-directory): Don't error out + when errors occur, but return a message instead. + + * nndoc.el (nndoc-possibly-change-buffer): Would bug out if the + file didn't exist. + + * gnus.el (gnus-mark-xrefs-as-read): Handled crossrefs to groups + with no read articles strangely. Also didn't perform crossreffing + when select methods were only almost equal. + (gnus-make-articles-unread): Would bug out when nnmh was the + native server. + + * nnbabyl.el (nnbabyl-read-mbox): Did not properly label articles. + + * gnus.el (gnus-set-mode-line): Do unread-and-unticked by default. + (gnus-summary-pop-article): New command and keystroke. + (gnus-mode-non-string-length): New variable. + (gnus-set-mode-line): Use it. + (gnus-score-mode): New mode to edit score files. + (gnus-inews-date): Did the opposite thing of what it was supposed + to do with time zones. + (gnus-group-make-group): Don't prompt for address if that is + irrelevant. + + Tue Mar 21 10:01:20 1995 Lars Ingebrigtsen + + * nnfolder.el (nnfolder-read-folder): Would only work if incoming + mail was split by Gnus. + + * gnus.el (gnus-score-transform-old-to-new): Function for + rewriting old score files. + (gnus-score-expiry-days): Name change from + `gnus-kill-expiry-days'. + (gnus-score-headers): All score functions rewritten to deal with + the new format. + (gnus-summary-goto-unread): New variable. + (gnus-summary-mark-forward): Use it. + + Tue Mar 21 04:50:05 1995 Lars Magne Ingebrigtsen + + * gnus.el (gnus-summary-mark-article): Low-scored articles in + auto-expirable grups should be expirable. + + Mon Mar 20 00:07:36 1995 Lars Ingebrigtsen + + * gnus.el (gnus-post-news): Also prompt for Subject, if that is + required. + (gnus-global-score-files): New variable. + (gnus-score-score-files): Use it. + (gnus-score-save): Don't attempt to save read-only score files. + (gnus-summary-mode-map): Score map error. + (gnus-score-load-score-alist): New function. + (gnus-summary-*-raise/lower-by-id): New commands and keystrokes + for raising/lowering by message-id. + + * nntp.el (nntp-request-post-buffer): Don't rely on any Gnus + variables. + + * gnus.el: Lots and lots of doc fixes. + (gnus-execute): Would not allow use from summary buffer. + (gnus-local-timezone): Removed variable. + (gnus-summary-followup): Don't display article. + + Sun Mar 19 04:34:30 1995 Lars Ingebrigtsen + + * gnus.el (gnus-activate-newsgroup): If a server can't be reached, + there's not much point in trying to request groups from it. + (gnus-mark-xrefs-as-read): Also do Xrefs to unsubscribed groups + unconditionally if virtual groups are used. + + * nntp.el (nntp-open-server): Set up timeouts for connections. + (nntp-connection-timeout): New variable. + + * gnus.el (gnus-get-unread-articles): Allow activation of virtual + groups. + (gnus-kill-file-mode): Reinstated most GNUS functions and took out + all gnus-raise/lower code. + (gnus-summary-mode): Doc fix. (Snicker.) + (gnus): Move startup hook backwards. + (gnus-articles-to-read): Use total-number as the default. + (gnus-member-of-range): Minor inaccuracy. + (gnus-sorted-complement): New, faster function. + (gnus-articles-to-read): Use it. + (gnus-sorted-intersection, gnus-set-sorted-intersection): New + functions. + (gnus-select-newsgroup): Use them. + + Sun Mar 19 02:46:15 1995 Lars Magne Ingebrigtsen + + * nnvirtual.el (nnvirtual-retrieve-headers): Would leave extra + spaces before the Xref sometimes, causing problems for subsequent + Xref handling. + + Sun Mar 19 02:46:01 1995 Lars Magne Ingebrigtsen + + * gnus.el: 0.36 is released. + Sun Mar 19 00:03:37 1995 Lars Magne Ingebrigtsen * nnvirtual.el (nnvirtual-retrieve-headers): When NOV lines only diff --exclude=*.elc --exclude=*~ --exclude=*-[0-9] --exclude=gnus --context --recursive pub/dgnus/lisp/doc.txt dgnus/lisp/doc.txt *** pub/dgnus/lisp/doc.txt Sun Mar 19 02:18:11 1995 --- dgnus/lisp/doc.txt Wed Mar 22 05:48:43 1995 *************** *** 205,211 **** have all changed. If you have some code lying around that depend on these, or change these, you'll have to re-write your code. ! The old hilit code, for instance, will fail with (ding) Gnus. There is absolutely no chance, whatsoever, of getting Gnus to work with Emacs 18. --- 205,216 ---- have all changed. If you have some code lying around that depend on these, or change these, you'll have to re-write your code. ! Old hilit19 code does not work at all. In fact, you should probably ! remove all hihit code from all the Gnus hooks ! (`gnus-group-prepare-hook', `gnus-summary-prepare-hook' and ! `gnus-summary-article-hook'). (Well, at the very least the first ! two.) Gnus provides various integrated functions for highlighting, ! which are both faster and more accurated. There is absolutely no chance, whatsoever, of getting Gnus to work with Emacs 18. *************** *** 300,308 **** (setq gnus-select-group-hook (lambda () (if (eq 'nnvirtual (car (gnus-find-method-for-group ! gnus-newsgroup-name))) (progn ! (make-local-variable gnus-thread-sort-functions) (setq gnus-thread-sort-functions '(gnus-thread-sort-by-date)))))) --- 305,313 ---- (setq gnus-select-group-hook (lambda () (if (eq 'nnvirtual (car (gnus-find-method-for-group ! gnus-newsgroup-name))) (progn ! (make-local-variable 'gnus-thread-sort-functions) (setq gnus-thread-sort-functions '(gnus-thread-sort-by-date)))))) diff --exclude=*.elc --exclude=*~ --exclude=*-[0-9] --exclude=gnus --context --recursive pub/dgnus/lisp/gnus-visual.el dgnus/lisp/gnus-visual.el *** pub/dgnus/lisp/gnus-visual.el Sun Mar 19 02:18:06 1995 --- dgnus/lisp/gnus-visual.el Wed Mar 22 01:02:36 1995 *************** *** 191,196 **** --- 191,197 ---- ["First unread article" gnus-summary-first-unread-article t] ["Go to subject number..." gnus-summary-goto-subject t] ["Go to the last article" gnus-summary-goto-last-article t] + ["Pop article off history" gnus-summary-pop-article t] )) (easy-menu-define diff --exclude=*.elc --exclude=*~ --exclude=*-[0-9] --exclude=gnus --context --recursive pub/dgnus/lisp/gnus.el dgnus/lisp/gnus.el *** pub/dgnus/lisp/gnus.el Sun Mar 19 02:18:08 1995 --- dgnus/lisp/gnus.el Wed Mar 22 08:59:10 1995 *************** *** 51,58 **** "nntp") "Default method for selecting a newsgroup. This variable should be a list, where the first element is how the ! news is to be fetched, the second is the address, and the optional ! third element is the \"port number\", if nntp is used. For instance, if you want to get your news via NNTP from \"flab.flab.edu\" on port 23, you could say: --- 51,58 ---- "nntp") "Default method for selecting a newsgroup. This variable should be a list, where the first element is how the ! news is to be fetched, the second is the address. An optional third ! element can be included to specify a port number if nntp is used. For instance, if you want to get your news via NNTP from \"flab.flab.edu\" on port 23, you could say: *************** *** 68,74 **** ;; Added by Sudish Joseph . (defvar gnus-post-method nil "Preferred method for posting USENET news. ! If this variable is nil, GNUS will use the current method to decide which method to use when posting. If it is non-nil, it will override the current method. This method will not be used in mail groups and the like, only in \"real\" newsgroups. --- 68,74 ---- ;; Added by Sudish Joseph . (defvar gnus-post-method nil "Preferred method for posting USENET news. ! If this variable is nil, Gnus will use the current method to decide which method to use when posting. If it is non-nil, it will override the current method. This method will not be used in mail groups and the like, only in \"real\" newsgroups. *************** *** 86,99 **** in the documentation of `gnus-select-method'") (defvar gnus-secondary-select-methods nil ! "A list of secondary methods that will be used for reading news.") ! (defvar gnus-default-nntp-server nil ! "Specify a default NNTP server. ! This variable should be defined in paths.el, and should never be set ! by the user. ! If you want to change servers, you should use `gnus-select-method'. ! See the documentation to that variable.") (defvar gnus-secondary-servers nil "List of NNTP servers that the user can choose between interactively. --- 86,99 ---- in the documentation of `gnus-select-method'") (defvar gnus-secondary-select-methods nil ! "A list of secondary methods that will be used for reading news. ! This is a list where each element is a complete select methdod (see ! `gnus-select-method'). ! If, for instance, you want to read your mail with the nnml backend, ! you could set this variable: ! ! (setq gnus-secondary-select-methods '((nnml ""))") (defvar gnus-secondary-servers nil "List of NNTP servers that the user can choose between interactively. *************** *** 101,107 **** non-numeric prefix - `C-u M-x gnus', in short.") (defvar gnus-nntp-server nil ! "*The name of the host running the NNTP server. This variable is semi-obsolete. Use the `gnus-select-method' variable instead.") --- 101,107 ---- non-numeric prefix - `C-u M-x gnus', in short.") (defvar gnus-nntp-server nil ! "The name of the host running the NNTP server. This variable is semi-obsolete. Use the `gnus-select-method' variable instead.") *************** *** 113,125 **** (setq gnus-select-method '(nntp \"my.nntp.server\" 899))") - (defvar gnus-group-faq-directory "/ftp@rtfm.mit.edu:/pub/usenet-by-groups/" - "Directory where the group FAQs are stored. - This will most commonly be on a remote machine, and the file will be - fetched by ange-ftp.") - (defvar gnus-startup-file "~/.newsrc" ! "Your `.newsrc' file. Use `.newsrc-SERVER' instead if it exists.") (defvar gnus-signature-file "~/.signature" "Your signature file. --- 113,121 ---- (setq gnus-select-method '(nntp \"my.nntp.server\" 899))") (defvar gnus-startup-file "~/.newsrc" ! "Your `.newsrc' file. ! `.newsrc-SERVER' will be used instead if that exists.") (defvar gnus-signature-file "~/.signature" "Your signature file. *************** *** 137,159 **** (defvar gnus-init-file "~/.gnus" "Your Gnus elisp startup file. ! If a file with the .el or .elc suffixes exist, they will be read instead.") (defvar gnus-default-subscribed-newsgroups nil "This variable lists what newsgroups should be susbcribed the first time Gnus is used. It should be a list of strings. If it is `t', Gnus will not do anything special the first time it is started; it'll just use the normal newsgroups subscription methods.") - (defconst gnus-backup-default-subscribed-newsgroups - '("news.announce.newusers" "news.groups.questions" "gnu.emacs.gnus") - "Default default new newsgroups the first time Gnus is run.") - (defvar gnus-post-prepare-function nil "Function that is run after a post buffer has been prepared. It is called with the name of the newsgroup that is posted to. It ! might be use, for instance, for inserting signatures based on the newsgroup name. (In that case, `gnus-signature-file' and `mail-signature' should both be set to nil).") --- 133,156 ---- (defvar gnus-init-file "~/.gnus" "Your Gnus elisp startup file. ! If a file with the .el or .elc suffixes exist, it will be read instead.") + (defvar gnus-group-faq-directory "/ftp@rtfm.mit.edu:/pub/usenet-by-groups/" + "Directory where the group FAQs are stored. + This will most commonly be on a remote machine, and the file will be + fetched by ange-ftp.") + (defvar gnus-default-subscribed-newsgroups nil "This variable lists what newsgroups should be susbcribed the first time Gnus is used. It should be a list of strings. If it is `t', Gnus will not do anything special the first time it is started; it'll just use the normal newsgroups subscription methods.") (defvar gnus-post-prepare-function nil "Function that is run after a post buffer has been prepared. It is called with the name of the newsgroup that is posted to. It ! might be used, for instance, for inserting signatures based on the newsgroup name. (In that case, `gnus-signature-file' and `mail-signature' should both be set to nil).") *************** *** 171,177 **** (defvar gnus-use-followup-to 'use "Specifies what to do with Followup-To header. If nil, ignore the header. If it is t, use its value, but ignore ! `poster'. If it is neither nil nor t, always use the value.") (defvar gnus-followup-to-function nil "A variable that contains a function that returns a followup address. --- 168,175 ---- (defvar gnus-use-followup-to 'use "Specifies what to do with Followup-To header. If nil, ignore the header. If it is t, use its value, but ignore ! `poster'. If it is neither nil nor t, which is the default, always use ! the value.") (defvar gnus-followup-to-function nil "A variable that contains a function that returns a followup address. *************** *** 199,231 **** (defvar gnus-large-newsgroup 200 "The number of articles which indicates a large newsgroup. ! If the number of articles in a newsgroup is greater than the value, confirmation is required for selecting the newsgroup.") (defvar gnus-author-copy (getenv "AUTHORCOPY") ! "Name of the file the article will be saved before it is posted using the FCC header. Initialized from the AUTHORCOPY environment variable. ! Articles are saved using a function specified by the the variable ! `gnus-author-copy-saver' (`rmail-output' is default) if a file name is ! given. Instead, if the first character of the name is `|', the ! contents of the article is piped out to the named program. It is ! possible to save an article in an MH folder as follows: ! \(setq gnus-author-copy \"|/usr/local/lib/mh/rcvstore +Article\")") (defvar gnus-mail-self-blind nil ! "Non-nil means insert BCC to self in messages to be sent. ! This is done when the message is initialized, ! so you can remove or alter the BCC header to override the default.") (defvar gnus-author-copy-saver (function rmail-output) ! "A function called with a file name to save an author copy to. ! The default function is `rmail-output' which saves in Unix mailbox format.") (defvar gnus-use-long-file-name (not (memq system-type '(usg-unix-v xenix))) ! "Non-nil means that the default name of a file to save articles in is the newsgroup name. ! If it's nil, the directory form of the newsgroup name is used instead.") (defvar gnus-article-save-directory (or (getenv "SAVEDIR") "~/News/") "Name of the directory articles will be saved in (default \"~/News\"). --- 197,233 ---- (defvar gnus-large-newsgroup 200 "The number of articles which indicates a large newsgroup. ! If the number of articles in a newsgroup is greater than this value, confirmation is required for selecting the newsgroup.") (defvar gnus-author-copy (getenv "AUTHORCOPY") ! "Save outgoing articles in this file. Initialized from the AUTHORCOPY environment variable. ! If this variable begins with the character \"|\", outgoing articles ! will be piped to the named program. It is possible to save an article ! in an MH folder as follows: ! ! \(setq gnus-author-copy \"|/usr/local/lib/mh/rcvstore +Article\") ! If the first character is not a pipe, articles are saved using the ! function specified by the `gnus-author-copy-saver' variable.") (defvar gnus-mail-self-blind nil ! "Non-nil means insert a BCC header in all outgoing articles. ! This will result in having a copy of the article mailed to yourself. ! The BCC header is inserted when the post buffer is initialized, so you ! can remove or alter the BCC header to override the default.") (defvar gnus-author-copy-saver (function rmail-output) ! "A function called to save outgoing articles. ! This function will be called with the same of the file to store the ! article in. The default function is `rmail-output' which saves in Unix ! mailbox format.") (defvar gnus-use-long-file-name (not (memq system-type '(usg-unix-v xenix))) ! "Non-nil means that the default name of a file to save articles in is the group name. ! If it's nil, the directory form of the group name is used instead.") (defvar gnus-article-save-directory (or (getenv "SAVEDIR") "~/News/") "Name of the directory articles will be saved in (default \"~/News\"). *************** *** 235,242 **** "Name of the directory where kill files will be stored (default \"~/News\"). Initialized from the SAVEDIR environment variable.") ! (defvar gnus-kill-expiry-days 7 ! "*Number of days before unused kill file entries are expired.") (defvar gnus-default-article-saver (function gnus-summary-save-in-rmail) "A function to save articles in your favorite format. --- 237,244 ---- "Name of the directory where kill files will be stored (default \"~/News\"). Initialized from the SAVEDIR environment variable.") ! (defvar gnus-score-expiry-days 7 ! "*Number of days before unused score file entries are expired.") (defvar gnus-default-article-saver (function gnus-summary-save-in-rmail) "A function to save articles in your favorite format. *************** *** 269,289 **** (defvar gnus-kill-file-name "KILL" "Suffix of the kill files.") (defvar gnus-fetch-old-headers nil "Non-nil means that Gnus will try to build threads by grabbing old headers. If an unread article in the group refers to an older, already read (or just marked as read) article, the old article will not normally be ! displayed in the Summary buffer. If this variable is non-nil, Gnus will attempt to grab the headers to the old articles, and thereby ! build complete threads. `gnus-nov-is-evil' has to be nil if this is ! to work. If it has the value `some', only enough headers to connect ! otherwise loose threads will be displayed.") (defvar gnus-visual t "*If non-nil, will do various highlighting. ! If nil, no mouse highlights (or any other) will be performed. This ! might speed up Gnus some when generating large group and summary ! buffers.") (defvar gnus-novice-user t "*Non-nil means that you are a usenet novice. --- 271,295 ---- (defvar gnus-kill-file-name "KILL" "Suffix of the kill files.") + (defvar gnus-score-file-suffix "SCORE" + "Suffix of the score files.") + (defvar gnus-fetch-old-headers nil "Non-nil means that Gnus will try to build threads by grabbing old headers. If an unread article in the group refers to an older, already read (or just marked as read) article, the old article will not normally be ! displayed in the Summary buffer. If this variable is non-nil, Gnus will attempt to grab the headers to the old articles, and thereby ! build complete threads. If it has the value `some', only enough ! headers to connect otherwise loose threads will be displayed. ! ! The server has to support XOVER for any of this to work.") (defvar gnus-visual t "*If non-nil, will do various highlighting. ! If nil, no mouse highlights (or any other highlights) will be ! performed. This might speed up Gnus some when generating large group ! and summary buffers.") (defvar gnus-novice-user t "*Non-nil means that you are a usenet novice. *************** *** 327,337 **** If this variable is `adopt', Gnus will make one of the \"children\" the parent and mark all the step-children as such. If this variable is `empty', the \"children\" are printed with empty ! subject fields.") (defvar gnus-summary-gather-subject-limit nil ! "*Maximum length of subject to compare when gathering loose threads. ! Use nil to compare the whole subject.") (defvar gnus-check-new-newsgroups t "Non-nil means that Gnus will add new newsgroups at startup. --- 333,357 ---- If this variable is `adopt', Gnus will make one of the \"children\" the parent and mark all the step-children as such. If this variable is `empty', the \"children\" are printed with empty ! subject fields. (Or rather, they will be printed with a string ! given by the `gnus-summary-same-subject' variable.)") (defvar gnus-summary-gather-subject-limit nil ! "*Maximum length of subject comparisons when gathering loose threads. ! Use nil to compare full subjects. Setting this variable to a low ! number will help gather threads that have been corrupted by ! newsreaders chopping off subject lines, but it might also mean that ! unrelated articles that have subject that happen to begin with the ! same few characters will be incorrectly gathered.") ! ! ;; Added by Per Abrahamsen . ! (defvar gnus-summary-same-subject "" ! "String indicating that the current article has the same subject as the previous. ! This variable will only be used if the value of ! `gnus-summary-make-false-root' is `empty'.") ! ! (defvar gnus-summary-goto-unread nil ! "If non-nil, marking commands will go to the next unread article.") (defvar gnus-check-new-newsgroups t "Non-nil means that Gnus will add new newsgroups at startup. *************** *** 339,346 **** groups since the last time it checked. This means that the killed list is no longer necessary, so you could set `gnus-save-killed-list' to nil. ! A variant is to have this variable be a list of select methods. Then ! Gnus will use the `ask-server' method on all these select methods to query for new groups from all those servers. Eg. --- 359,367 ---- groups since the last time it checked. This means that the killed list is no longer necessary, so you could set `gnus-save-killed-list' to nil. ! ! A variant is to have this variable be a list of select methods. Gnus ! will then use the `ask-server' method on all these select methods to query for new groups from all those servers. Eg. *************** *** 369,399 **** If you subscribe to lots of newsgroups from different servers, startup might take a while. By setting this variable to nil, you'll save time, but you won't be told how many unread articles there are in the ! newsgroups.") (defvar gnus-save-newsrc-file t ! "Non-nil means that Gnus will save a .newsrc file. ! Gnus always saves its own startup file, which is called \".newsrc.el\". ! The file called \".newsrc\" is in a format that can be readily ! understood by other newsreaders. If you don't plan on using other ! newsreaders, set this variable to nil to save some time on exit.") (defvar gnus-save-killed-list t "If non-nil, save the list of killed groups to the startup file. ! This will save both time (when starting and quitting) and space (on ! disk), but it will also mean that Gnus has no record of what ! newsgroups are new or old, so the automatic new newsgroups ! subscription methods become meaningless. You should always set ! `gnus-check-new-newsgroups' to nil if you set this variable to nil.") (defvar gnus-interactive-catchup t ! "Require your confirmation when catching up a newsgroup if non-nil.") (defvar gnus-interactive-post t ! "Group and subject will be asked for if non-nil.") (defvar gnus-interactive-exit t ! "Require your confirmation when exiting Gnus if non-nil.") (defvar gnus-kill-killed nil "If non-nil, Gnus will apply kill files to already killed articles. --- 390,422 ---- If you subscribe to lots of newsgroups from different servers, startup might take a while. By setting this variable to nil, you'll save time, but you won't be told how many unread articles there are in the ! groups.") (defvar gnus-save-newsrc-file t ! "Non-nil means that Gnus will save the `.newsrc' file. ! Gnus always saves its own startup file, which is called ! \".newsrc.eld\". The file called \".newsrc\" is in a format that can ! be readily understood by other newsreaders. If you don't plan on ! using other newsreaders, set this variable to nil to save some time on ! exit.") (defvar gnus-save-killed-list t "If non-nil, save the list of killed groups to the startup file. ! This will save both time (when starting and quitting) and space (both ! memory and disk), but it will also mean that Gnus has no record of ! which groups are new and which are old, so the automatic new ! newsgroups subscription methods become meaningless. You should always ! set `gnus-check-new-newsgroups' to `ask-server' or nil if you set this ! variable to nil.") (defvar gnus-interactive-catchup t ! "If non-nil, require your confirmation when catching up a group.") (defvar gnus-interactive-post t ! "If non-nil, group name will be asked for when posting.") (defvar gnus-interactive-exit t ! "If non-nil, require your confirmation when exiting Gnus.") (defvar gnus-kill-killed nil "If non-nil, Gnus will apply kill files to already killed articles. *************** *** 405,429 **** "Function for extracting address components from a From header. Two pre-defined function exist: `gnus-extract-address-components', which is the default, quite fast, and too simplistic solution, and ! `mail-extract-address-components', which works very nicely, but is slower.") - ;; Added by Ethan Bradford . - (defvar gnus-mail-courtesy-message - "The following message is a courtesy copy of an article\nthat has been postedas well.\n\n" - "This is inserted at the start of a mailed copy of a posted message. - If this variable is nil, no such courtesy message will be added.") - - ;; Added by Per Abrahamsen . - (defvar gnus-summary-same-subject "" - "String indicating that the current article has the same subject as the previous.") - (defvar gnus-score-interactive-default-score 1000 ! "Scoring commands will raise/lower with this number as the default.") (defvar gnus-summary-default-score 0 "Default article score level. ! If this variable is nil, scoring will not be disabled.") (defvar gnus-user-login-name nil "The login name of the user. --- 428,456 ---- "Function for extracting address components from a From header. Two pre-defined function exist: `gnus-extract-address-components', which is the default, quite fast, and too simplistic solution, and ! `mail-extract-address-components', which works much better, but is slower.") (defvar gnus-score-interactive-default-score 1000 ! "Scoring commands will raise/lower the score with this number as the default.") ! ! (defvar gnus-global-score-files nil ! "List of global score files and directories. ! Set this variable if you want to use people's score files. One entry ! for each score file or each score file directory. Gnus will decide ! by itself what score files are applicable to which group. ! ! Say you want to use the single score file ! \"/ftp.ifi.uio.no@ftp:/pub/larsi/ding/score/soc.motss.SCORE\" and all ! score files in the \"/ftp.some-where:/pub/score\" directory. ! ! (setq gnus-global-score-files ! '(\"/ftp.ifi.uio.no:/pub/larsi/ding/score/soc.motss.SCORE\" ! \"/ftp.some-where:/pub/score\"))") (defvar gnus-summary-default-score 0 "Default article score level. ! If this variable is nil, scoring will be disabled.") (defvar gnus-user-login-name nil "The login name of the user. *************** *** 434,459 **** Got from the NAME environment variable if undefined.") (defvar gnus-show-mime nil ! "*Show MIME message if non-nil.") (defvar gnus-show-threads t ! "*Show conversation threads in summary mode if non-nil.") (defvar gnus-thread-hide-subtree nil ! "Non-nil means hide thread subtrees initially. ! If non-nil, you have to run the command `gnus-summary-show-thread' by ! hand or by using `gnus-select-article-hook' to show hidden threads.") (defvar gnus-thread-hide-killed t ! "Non-nil means hide killed thread subtrees automatically.") (defvar gnus-thread-ignore-subject nil ! "Don't take care of subject differences, but only references if non-nil. ! If it is non-nil, some commands that work on subjects do not function ! properly.") (defvar gnus-thread-indent-level 4 ! "Indentation of thread subtrees.") ;; jwz: nuke newsgroups whose name is all digits - that means that ;; some loser has let articles get into the root of the news spool, --- 461,493 ---- Got from the NAME environment variable if undefined.") (defvar gnus-show-mime nil ! "*If non-ni, do mime processing of articles. ! The articles will simply be fed to the function given by ! `gnus-show-mime-method'.") ! ! (defvar gnus-show-mime-method (function metamail-buffer) ! "Function to process a MIME message. ! The function is called from the article buffer.") (defvar gnus-show-threads t ! "*If non-nil, display threads in summary mode.") (defvar gnus-thread-hide-subtree nil ! "If non-nil, hide all threads initially. ! If threads are hidden, you have to run the command ! `gnus-summary-show-thread' by hand or use `gnus-select-article-hook' ! to expose hidden threads.") (defvar gnus-thread-hide-killed t ! "If non-nil, hide killed threads automatically.") (defvar gnus-thread-ignore-subject nil ! "If non-nil, ignore subjects and do all threading based on the Reference header. ! If nil, which is the default, articles that have different subjects ! from their parents will start separate threads.") (defvar gnus-thread-indent-level 4 ! "Number that says how much each sub-thread should be indented.") ;; jwz: nuke newsgroups whose name is all digits - that means that ;; some loser has let articles get into the root of the news spool, *************** *** 490,551 **** (defvar gnus-required-headers '(From Date Newsgroups Subject Message-ID Organization Lines X-Newsreader) ! ;; changed by jwz because it's not so nice to do "Lines: 0" by default. ! ;; and to remove Path, since it's incorrect for Gnus to try ! ;; and generate that - it is the responsibility of inews or nntpd. ! "All required headers for articles you post. RFC977 and RFC1036 require From, Date, Newsgroups, Subject, Message-ID and Path headers. Organization, Lines and X-Newsreader are optional. If you want Gnus not to insert some header, remove it from this ! variable.") (defvar gnus-show-all-headers nil ! "*Show all headers of an article if non-nil.") (defvar gnus-save-all-headers t ! "*Save all headers of an article if non-nil.") (defvar gnus-inhibit-startup-message nil ! "The startup message will not be displayed if this function is non-nil.") (defvar gnus-auto-extend-newsgroup t ! "Extend visible articles to forward and backward if non-nil.") (defvar gnus-auto-select-first t ! "Select the first unread article automagically if non-nil. If you want to prevent automatic selection of the first unread article ! in some newsgroups, set the variable to nil in `gnus-select-group-hook' ! or `gnus-apply-kill-hook'.") (defvar gnus-auto-select-next t ! "Select the next newsgroup automagically if non-nil. If the value is t and the next newsgroup is empty, Gnus will exit summary mode and go back to group mode. If the value is neither nil ! nor t, Gnus will select the following unread newsgroup. Especially, if ! the value is the symbol `quietly', the next unread newsgroup will be ! selected without any confirmations.") (defvar gnus-auto-select-same nil ! "Select the next article with the same subject automagically if non-nil.") (defvar gnus-auto-center-summary t ! "*Always center the current summary in Gnus summary window if non-nil.") (defvar gnus-auto-mail-to-author nil ! "Insert `To: author' of the article when following up if non-nil. ! If this variable is `ask', the user will be prompted. ! Mail is sent using the function specified by the variable ! `gnus-mail-send-method'.") (defvar gnus-break-pages t ! "*Break an article into pages if non-nil. ! Page delimiter is specified by the variable `gnus-page-delimiter'.") (defvar gnus-page-delimiter "^\^L" ! "Regexp describing line-beginnings that separate pages of news article.") (defvar gnus-use-full-window t ! "*Non-nil means to take up the entire screen of Emacs.") (defvar gnus-window-configuration '((summary (0 1 0)) --- 524,594 ---- (defvar gnus-required-headers '(From Date Newsgroups Subject Message-ID Organization Lines X-Newsreader) ! "Headers to be generated or prompted for when posting an article. RFC977 and RFC1036 require From, Date, Newsgroups, Subject, Message-ID and Path headers. Organization, Lines and X-Newsreader are optional. If you want Gnus not to insert some header, remove it from this ! list.") (defvar gnus-show-all-headers nil ! "*If non-nil, don't hide any headers.") (defvar gnus-save-all-headers t ! "*If non-nil, don't remove any headers before saving.") (defvar gnus-inhibit-startup-message nil ! "If non-nil, the startup message will not be displayed.") (defvar gnus-auto-extend-newsgroup t ! "If non-nil, extend newsgroup forward and backward when requested.") (defvar gnus-auto-select-first t ! "If non-nil, select the first unread article when entering a group. If you want to prevent automatic selection of the first unread article ! in some newsgroups, set the variable to nil in ! `gnus-select-group-hook'.") (defvar gnus-auto-select-next t ! "If non-nil, offer to go to the next group from the end of the previous. If the value is t and the next newsgroup is empty, Gnus will exit summary mode and go back to group mode. If the value is neither nil ! nor t, Gnus will select the following unread newsgroup. In ! particular, if the value is the symbol `quietly', the next unread ! newsgroup will be selected without any confirmations.") (defvar gnus-auto-select-same nil ! "If non-nil, select the next article with the same subject.") (defvar gnus-auto-center-summary t ! "*If non-nil, always center the current summary buffer.") (defvar gnus-auto-mail-to-author nil ! "*If non-nil, mail the authors of articles a copy of your follow-ups. ! If this variable is `ask', the user will be prompted for whether to ! mail a copy. The string given by `gnus-mail-courtesy-message' will be ! inserted at the beginning of the mail copy. ! ! Mail is sent using the function specified by the ! `gnus-mail-send-method' variable.") ! ! ;; Added by Ethan Bradford . ! (defvar gnus-mail-courtesy-message ! "The following message is a courtesy copy of an article\nthat has been posted as well.\n\n" ! "This is inserted at the start of a mailed copy of a posted message. ! If this variable is nil, no such courtesy message will be added.") (defvar gnus-break-pages t ! "*If non-nil, do page breaking on articles. ! The page delimiter is specified by the `gnus-page-delimiter' ! variable.") (defvar gnus-page-delimiter "^\^L" ! "Regexp describing what to use as article page delimiters. ! The default value is \"^\^L\", which is a form linefeed at the ! beginning of a line.") (defvar gnus-use-full-window t ! "*If non-nil, use the entire Emacs screen.") (defvar gnus-window-configuration '((summary (0 1 0)) *************** *** 558,600 **** is a function that will be called with ACTION as an argument. ACTION can be `summary', `newsgroups', or `article'.") ! (defvar gnus-show-mime-method (function metamail-buffer) ! "Function to process a MIME message. ! The function is expected to process current buffer as a MIME message.") ! ! (defvar gnus-mail-reply-method ! (function gnus-mail-reply-using-mail) ! "Function to compose reply mail. ! The function `gnus-mail-reply-using-mail' uses usual sendmail mail ! program. The function `gnus-mail-reply-using-mhe' uses the MH-E mail ! program. You can use yet another program by customizing this variable.") ! ! (defvar gnus-mail-forward-method ! (function gnus-mail-forward-using-mail) ! "Function to forward current message to another user. ! The function `gnus-mail-reply-using-mail' uses usual sendmail mail ! program. You can use yet another program by customizing this variable.") ! ! (defvar gnus-mail-other-window-method ! (function gnus-mail-other-window-using-mail) ! "Function to compose mail in other window. ! The function `gnus-mail-other-window-using-mail' uses the usual sendmail ! mail program. The function `gnus-mail-other-window-using-mhe' uses the MH-E ! mail program. You can use yet another program by customizing this variable.") (defvar gnus-mail-send-method send-mail-function ! "Function to mail a message too which is being posted as an article. The message must have To or Cc header. The default is copied from the variable `send-mail-function'.") ! (defvar gnus-subscribe-newsgroup-method ! (function gnus-subscribe-zombies) ! "Function called with a newsgroup name when new newsgroup is found. ! The function `gnus-subscribe-randomly' inserts a new newsgroup a the ! beginning of newsgroups. The function `gnus-subscribe-alphabetically' ! inserts it in strict alphabetic order. The function ! `gnus-subscribe-hierarchically' inserts it in hierarchical newsgroup ! order. The function `gnus-subscribe-interactively' asks for your decision.") ;; Suggested by a bug report by Hallvard B Furuseth ;; . --- 601,634 ---- is a function that will be called with ACTION as an argument. ACTION can be `summary', `newsgroups', or `article'.") ! (defvar gnus-mail-reply-method (function gnus-mail-reply-using-mail) ! "Function to compose a reply. ! Two pre-made functions are `gnus-mail-reply-using-mail' (sendmail) and ! `gnus-mail-reply-using-mhe' (MH-E).") ! ! (defvar gnus-mail-forward-method (function gnus-mail-forward-using-mail) ! "Function to forward the current message to another user. ! Two pre-made functions are `gnus-mail-forward-using-mail' (sendmail) ! and `gnus-mail-forward-using-mhe' (MH-E).") ! ! (defvar gnus-mail-other-window-method 'gnus-mail-other-window-using-mail ! "Function to compose mail in the other window. ! Two pre-made functions are `gnus-mail-other-window-using-mail' ! (sendmail) and `gnus-mail-other-window-using-mhe' (MH-E).") (defvar gnus-mail-send-method send-mail-function ! "Function to mail a message which is also being posted as an article. The message must have To or Cc header. The default is copied from the variable `send-mail-function'.") ! (defvar gnus-subscribe-newsgroup-method 'gnus-subscribe-zombies ! "Function called with a group name when new group is detected. ! A few pre-made functions are supplied: `gnus-subscribe-randomly' ! inserts new groups at the beginning of the list of groups; ! `gnus-subscribe-alphabetically' inserts new groups in strict ! alphabetic order; `gnus-subscribe-hierarchically' inserts new groups ! in hierarchical newsgroup order; `gnus-subscribe-interactively' asks ! for your decision.") ;; Suggested by a bug report by Hallvard B Furuseth ;; . *************** *** 610,620 **** Gnus will the subscribe all new newsgroups in these hierarchies with the subscription method in this variable.") (defvar gnus-group-sort-function 'gnus-group-sort-by-alphabet "Function used for sorting the group buffer. ! This function will be called with info lists for the groups to be ! sorted. Pre-made functions include `gnus-sort-by-alphabet', ! `gnus-sort-by-unread' and `gnus-sort-by-level'") ;; Mark variables suggested by Thomas Michanek ;; . --- 644,665 ---- Gnus will the subscribe all new newsgroups in these hierarchies with the subscription method in this variable.") + (defvar gnus-subscribe-hierarchical-interactive nil + "If non-nil, Gnus will offer to subscribe hierarchically. + When a new hierarchy appears, Gnus will ask the user: + + 'alt.binaries': Do you want to subscribe to this hierarchy? ([d]ys): + + If the user pressed `d', Gnus will descend the hierarchy, `y' will + subscribe to all newsgroups in the hierarchy and `s' will skip this + hierarchy in its entirety.") + (defvar gnus-group-sort-function 'gnus-group-sort-by-alphabet "Function used for sorting the group buffer. ! This function will be called with group info entries as the arguments ! for the groups to be sorted. Pre-made functions include ! `gnus-sort-by-alphabet', `gnus-sort-by-unread' and ! `gnus-sort-by-level'") ;; Mark variables suggested by Thomas Michanek ;; . *************** *** 640,647 **** "Mark used for articles that are caught up.") (defvar gnus-replied-mark ?R "Mark used for articles that have been replied to.") ! (defvar gnus-process-mark ?# ! "Mark used for marking articles as processable.") (defvar gnus-ancient-mark ?A "Mark used for ancient articles.") (defvar gnus-canceled-mark ?G --- 685,692 ---- "Mark used for articles that are caught up.") (defvar gnus-replied-mark ?R "Mark used for articles that have been replied to.") ! (defvar gnus-process-mark ?# ! "Process mark.") (defvar gnus-ancient-mark ?A "Mark used for ancient articles.") (defvar gnus-canceled-mark ?G *************** *** 659,811 **** If `not-confirm', pseudos will be viewed automatically, and the user will not be asked to confirm the command.") - (defvar gnus-group-mode-hook nil - "A hook for Gnus group mode.") - - (defvar gnus-summary-mode-hook nil - "A hook for Gnus summary mode.") - - (defvar gnus-article-mode-hook nil - "A hook for Gnus article mode.") - - (defvar gnus-kill-file-mode-hook nil - "A hook for Gnus KILL File mode.") - - (defvar gnus-open-server-hook nil - "A hook called just before opening connection to news server.") - - (defvar gnus-startup-hook nil - "A hook called at startup time. - This hook is called after Gnus is connected to the NNTP server. So, it - is possible to change the behavior of Gnus according to the selected - NNTP server.") - - (defvar gnus-group-prepare-function 'gnus-group-prepare-flat - "A function that is called to set up the group buffer. - The function is called with three arguments: The first is a number; - all group with a level less or equal to that number should be listed, - if the second is non-nil, empty groups should also be displayed. If - the third is non-nil, it is a number. No groups with a level lower - than this number should be displayed.") - - (defvar gnus-group-prepare-hook nil - "A hook called after the newsgroup list is created in the group buffer. - If you want to modify the group buffer, you can use this hook.") - - (defvar gnus-summary-prepare-hook nil - "A hook called after summary list is created in the summary buffer. - If you want to modify the summary buffer, you can use this hook.") - - (defvar gnus-article-prepare-hook nil - "A hook called after an article is prepared in the article buffer. - If you want to run a special decoding program like nkf, use this hook.") - - (defvar gnus-article-display-hook nil - "A hook called after the article is displayed in the article buffer. - The hook is designed to change the contents of the article - buffer. Typical functions that this hook may contain are - `gnus-article-hide-headers' (hide selected headers), - `gnus-article-hide-signature' (hide signature) and - `gnus-article-treat-overstrike' (turn \"^H_\" into bold characters).") - (add-hook 'gnus-article-display-hook 'gnus-article-hide-headers-if-wanted) - (add-hook 'gnus-article-display-hook 'gnus-article-treat-overstrike) - - (defvar gnus-select-group-hook nil - "A hook called when a newsgroup is selected. - - If you'd like to simplify subjects like the - `gnus-summary-next-same-subject' command does, you can use the - following hook: - - (setq gnus-select-group-hook - (list - (lambda () - (mapcar (lambda (header) - (header-set-subject - header - (gnus-simplify-subject - (header-subject header) 're-only))) - gnus-newsgroup-headers)))) - ") - - (defvar gnus-select-article-hook - '(gnus-summary-show-thread) - "A hook called when an article is selected. - The default hook shows conversation thread subtrees of the selected - article automatically using `gnus-summary-show-thread'.") - - (defvar gnus-apply-kill-hook '(gnus-apply-kill-file) - "A hook called when a newsgroup is selected and summary list is prepared. - This hook is intended to apply a kill file to the selected newsgroup. - The function `gnus-apply-kill-file' is called by default. - - Since a general kill file is too heavy to use only for a few - newsgroups, I recommend you to use a lighter hook function. For - example, if you'd like to apply a kill file to articles which contains - a string `rmgroup' in subject in newsgroup `control', you can use the - following hook: - - \(setq gnus-apply-kill-hook - (list - (lambda () - (cond ((string-match \"control\" gnus-newsgroup-name) - (gnus-kill \"Subject\" \"rmgroup\") - (gnus-expunge \"X\"))))))") - - (defvar gnus-visual-mark-article-hook - (list 'gnus-visual-highlight-selected-summary) - "Hook run after selecting an article in the summary buffer. - It is meant to be used for highlighting the article in some way. It is - not run if `gnus-visual' is nil.") - - (defvar gnus-prepare-article-hook (list (function gnus-inews-insert-signature)) - "A hook called after preparing body, but before preparing header headers. - The default hook (`gnus-inews-insert-signature') inserts a signature - file specified by the variable `gnus-signature-file'.") - - (defvar gnus-inews-article-hook (list (function gnus-inews-do-fcc)) - "A hook called before finally posting an article. - The default hook (`gnus-inews-do-fcc') does FCC processing (save article - to a file).") - - (defvar gnus-inews-article-header-hook nil - "A hook called after inserting the headers in an article to be posted. - The hook is called from the *post-news* buffer, narrowed to the - headers.") - - (defvar gnus-exit-group-hook nil - "A hook called when exiting (not quitting) summary mode. - If your machine is so slow that exiting from summary mode takes very - long time, set the variable `gnus-use-cross-reference' to nil. This - inhibits marking articles as read using cross-reference information.") - - (defvar gnus-suspend-gnus-hook nil - "A hook called when suspending (not exiting) Gnus.") - - (defvar gnus-exit-gnus-hook (list 'nntp-request-close) - "A hook called when exiting Gnus.") - - (defvar gnus-save-newsrc-hook nil - "A hook called when saving the newsrc file. - This hook is called before saving the `.newsrc' file.") - - (defvar gnus-auto-expirable-newsgroups nil - "All newsgroups that match this regexp will have all read articles automatically marked as expirable.") - - (defvar gnus-subscribe-hierarchical-interactive nil - "If non-nil, Gnus will offer to subscribe hierarchically. - When a new hierarchy appears, Gnus will ask the user: - - 'alt.binaries': Do you want to subscribe to this hierarchy? ([d]ys): - - If the user pressed `d', Gnus will descend the hierarchy, `y' will - subscribe to all newsgroups in the hierarchy and `s' will skip this - hierarchy in its entirety.") - (defvar gnus-group-line-format "%M%S%5y: %(%g%)\n" "Format of groups lines. It works along the same lines as a normal formatting string, ! with some simple extrensions. %M Only marked articles (character, \"*\" or \" \") %S Whether the group is subscribed (character, \"U\", \"K\", \"Z\" or \" \") --- 704,713 ---- If `not-confirm', pseudos will be viewed automatically, and the user will not be asked to confirm the command.") (defvar gnus-group-line-format "%M%S%5y: %(%g%)\n" "Format of groups lines. It works along the same lines as a normal formatting string, ! with some simple extensions. %M Only marked articles (character, \"*\" or \" \") %S Whether the group is subscribed (character, \"U\", \"K\", \"Z\" or \" \") *************** *** 826,832 **** %n Select from where (string) %z A string that look like `<%s:%n>' if a foreign select method is used %u User defined specifier. The next character in the format string should ! be a letter. GNUS will call the function gnus-user-format-function-X, where X is the letter following %u. The function will be passed the current header as argument. The function should return a string, which will be inserted into the buffer just like information from any other --- 728,734 ---- %n Select from where (string) %z A string that look like `<%s:%n>' if a foreign select method is used %u User defined specifier. The next character in the format string should ! be a letter. Gnus will call the function gnus-user-format-function-X, where X is the letter following %u. The function will be passed the current header as argument. The function should return a string, which will be inserted into the buffer just like information from any other *************** *** 872,878 **** %i Article score (number) %z Article zcore (character) %u User defined specifier. The next character in the format string should ! be a letter. GNUS will call the function gnus-user-format-function-X, where X is the letter following %u. The function will be passed the current header as argument. The function should return a string, which will be inserted into the summary just like information from any other --- 774,780 ---- %i Article score (number) %z Article zcore (character) %u User defined specifier. The next character in the format string should ! be a letter. Gnus will call the function gnus-user-format-function-X, where X is the letter following %u. The function will be passed the current header as argument. The function should return a string, which will be inserted into the summary just like information from any other *************** *** 910,1020 **** (defvar gnus-group-mode-line-format "(ding) List of groups {%M:%S} " "The format specification for the group mode line.") - - - ;; Site dependent variables. You have to define these variables in - ;; site-init.el, default.el or your .emacs. - - (defvar gnus-local-timezone nil - "Local time zone. - This value is used only if `current-time-zone' does not work in your Emacs. - It specifies the GMT offset, i.e. a decimal integer - of the form +-HHMM giving the hours and minutes ahead of (i.e. east of) GMT. - For example, +0900 should be used in Japan, since it is 9 hours ahead of GMT. - - For backwards compatibility, it may also be a string like \"JST\", - but strings are obsolescent: you should use numeric offsets instead.") - - (defvar gnus-local-domain nil - "Local domain name without a host name. - The DOMAINNAME environment variable is used instead if it is defined. - If the `system-name' function returns the full Internet name, there is - no need to set this variable.") - - (defvar gnus-local-organization nil - "String with a description of what organization (if any) the user belongs to. - The ORGANIZATION environment variable is used instead if it is defined. - If this variable contains a function, this function will be called - with the current newsgroup name as the argument. The function should - return a string. - In any case, if the string (either in the variable, in the environment - variable, or returned by the function) is a file name, the contents of - this file will be used as the organization.") - - (defvar gnus-use-generic-from nil - "If nil, the full host name will be the system name prepended to the domain name. - If this is a string, the full host name will be this string. - If this is non-nil, non-string, the domain name will be used as the - full host name.") - - (defvar gnus-use-generic-path nil - "If nil, use the NNTP server name in the Path header. - If stringp, use this; if non-nil, use no host name (user name only).") - (defvar gnus-valid-select-methods ! '(("nntp" post address) ("nnspool" post) ("nnvirtual" none virtual) ("nnmbox" mail respool) ("nnml" mail respool) ! ("nnmh" mail respool) ("nndir" none) ("nndigest" none) ! ("nndoc" none) ("nnbabyl" mail respool) ("nnkiboze" none virtual) ("nnfolder" mail respool)) ! "A list of valid select methods. ! Each element in this list should be a list. The first element of these ! lists should be a string with the name of the select method. The ! other elements may be be the category of this method (ie. `post', ! `mail', `none' or whatever) or other properties that this method has ! (like being respoolable). If you implement a new select method, all you should have to change is this variable. I think.") (defvar gnus-updated-mode-lines '(group article summary) ! "This variable is a list of buffers that should keep their mode lines updated. The list may contain the symbols `group', `article' and `summary'. If the corresponding symbol is present, Gnus will keep that mode line updated with information that may be pertinent. If this variable is nil, screen refresh may be quicker.") ;; Added by Per Abrahamsen . (defvar gnus-mouse-face 'highlight "Face used for mouse highlighting in Gnus. No mouse highlights will be done if `gnus-visual' is nil.") - (defvar gnus-visual-summary-update-hook - (list 'gnus-visual-summary-highlight-line) - "A hook called when a summary line is changed. - The hook will not be called if `gnus-visual' is nil. - - Point will be at the beginning of the line, and the following free - variables can be used for convenience: - - score: (gnus-summary-article-score) - default: gnus-summary-default-score - below: gnus-summary-mark-below - - The default hook `gnus-visual-summary-highlight-line' will highlight the line - according to the `gnus-visual-summary-highlight' variable.") - (defvar gnus-summary-mark-below nil ! "Score below which articles automatically become marked as read. This variable is local to each summary buffer and usually set by the score file.") (defvar gnus-thread-sort-functions '(gnus-thread-sort-by-number) ! "List of functions used for thread roots in the summary buffer. Each function takes two threads and return non-nil if the first thread should be sorted before the other. If you use more than one function, ! list the function you want to act as the primary sort key last. ! Functions you can use are: ! - gnus-thread-sort-by-number ! - gnus-thread-sort-by-author ! - gnus-thread-sort-by-subject ! - gnus-thread-sort-by-date ! - gnus-thread-sort-by-score ! - gnus-thread-sort-by-total-score (see `gnus-thread-score-function'). ! The two later only works on articles that have already been scored prior ! to entering the newsgroup.") (defvar gnus-thread-score-function '+ "Function used for calculating the total score of a thread. --- 812,868 ---- (defvar gnus-group-mode-line-format "(ding) List of groups {%M:%S} " "The format specification for the group mode line.") (defvar gnus-valid-select-methods ! '(("nntp" post address prompt-address) ! ("nnspool" post) ("nnvirtual" none virtual prompt-address) ("nnmbox" mail respool) ("nnml" mail respool) ! ("nnmh" mail respool) ("nndir" none prompt-address) ("nndigest" none) ! ("nndoc" none prompt-address) ("nnbabyl" mail respool) ("nnkiboze" none virtual) ("nnfolder" mail respool)) ! "An alist of valid select methods. ! The first element of each list lists should be a string with the name ! of the select method. The other elements may be be the category of ! this method (ie. `post', `mail', `none' or whatever) or other ! properties that this method has (like being respoolable). If you implement a new select method, all you should have to change is this variable. I think.") (defvar gnus-updated-mode-lines '(group article summary) ! "List of buffers that should update their mode lines. The list may contain the symbols `group', `article' and `summary'. If the corresponding symbol is present, Gnus will keep that mode line updated with information that may be pertinent. If this variable is nil, screen refresh may be quicker.") + ;; Added by Keinonen Kari . + (defvar gnus-mode-non-string-length 21 + "Max length of mode-line non-string contents buffer contents.") + ;; Added by Per Abrahamsen . (defvar gnus-mouse-face 'highlight "Face used for mouse highlighting in Gnus. No mouse highlights will be done if `gnus-visual' is nil.") (defvar gnus-summary-mark-below nil ! "Mark all articles with a score below this variable as read. This variable is local to each summary buffer and usually set by the score file.") (defvar gnus-thread-sort-functions '(gnus-thread-sort-by-number) ! "List of functions used for sorting threads in the summary buffer. ! By default, threads are sorted by article number. Each function takes two threads and return non-nil if the first thread should be sorted before the other. If you use more than one function, ! the primary sort function should be the last. ! Ready-mady functions include `gnus-thread-sort-by-number', ! `gnus-thread-sort-by-author', `gnus-thread-sort-by-subject', ! `gnus-thread-sort-by-date', `gnus-thread-sort-by-score' and ! `gnus-thread-sort-by-total-score' (see `gnus-thread-score-function'). ! The latter two only work on threads that have been scored prior to ! entering the newsgroup.") (defvar gnus-thread-score-function '+ "Function used for calculating the total score of a thread. *************** *** 1026,1033 **** (defvar gnus-score-find-score-files-function 'gnus-score-find-bnews "Function used to find SCORE files. ! The value should be a function that takes a group name as an argument, ! and return a list of SCORE files that applies to that group. Predefined values are: --- 874,882 ---- (defvar gnus-score-find-score-files-function 'gnus-score-find-bnews "Function used to find SCORE files. ! The function will be called with the group name as the argument, and ! should return a list of score files to apply to that group. The score ! files do not actually have to exist. Predefined values are: *************** *** 1035,1068 **** gnus-score-find-hierarchical: Also apply SCORE files from parent groups. gnus-score-find-bnews: Apply SCORE files whose names matches. ! See the definition of the individual functions for more information.") (defvar gnus-options-subscribe nil ! "All new groups matching this regexp will be subscribed. ! Note that this variable deals only with new newsgroups. This variable does not affect old newsgroups.") (defvar gnus-options-not-subscribe nil "All new groups matching this regexp will be ignored. ! Note that this variable deals only with new newsgroups. This variable does not affect old (already subscribed) newsgroups.") ;; Internal variables ;; Avoid highlighting in kill files. (defvar gnus-summary-inhibit-highlight nil) (defvar caesar-translate-table nil) - (defvar gnus-dribble-buffer nil) (defvar gnus-headers-retrieved-by nil) - (defvar gnus-article-reply nil) (defvar gnus-override-method nil) (defvar gnus-article-check-size nil) - (defvar gnus-score-file-list nil) (defvar gnus-score-alist nil "Alist containing score information. The keys can be symbols or strings. The following symbols are defined. --- 884,1110 ---- gnus-score-find-hierarchical: Also apply SCORE files from parent groups. gnus-score-find-bnews: Apply SCORE files whose names matches. ! See the documentation to these functions for more information.") (defvar gnus-options-subscribe nil ! "All new groups matching this regexp will be subscribed unconditionally. ! Note that this variable deals only with new newsgroups. This variable does not affect old newsgroups.") (defvar gnus-options-not-subscribe nil "All new groups matching this regexp will be ignored. ! Note that this variable deals only with new newsgroups. This variable does not affect old (already subscribed) newsgroups.") + (defvar gnus-auto-expirable-newsgroups nil + "Groups in which to automatically mark read articles as expirable. + If non-nil, this should be a regexp that should match all groups in + which to perform auto-expiry. This only makes sense for mail groups.") + + + ;; Hooks. + + (defvar gnus-group-mode-hook nil + "A hook for Gnus group mode.") + + (defvar gnus-summary-mode-hook nil + "A hook for Gnus summary mode.") + + (defvar gnus-article-mode-hook nil + "A hook for Gnus article mode.") + + (defvar gnus-kill-file-mode-hook nil + "A hook for Gnus kill file mode.") + + (defvar gnus-open-server-hook nil + "A hook called just before opening connection to the news server.") + + (defvar gnus-startup-hook nil + "A hook called at startup. + This hook is called after Gnus is connected to the NNTP server.") + + (defvar gnus-get-new-news-hook nil + "A hook run just before Gnus checks for new news.") + + (defvar gnus-group-prepare-function 'gnus-group-prepare-flat + "A function that is called to generate the group buffer. + The function is called with three arguments: The first is a number; + all group with a level less or equal to that number should be listed, + if the second is non-nil, empty groups should also be displayed. If + the third is non-nil, it is a number. No groups with a level lower + than this number should be displayed. + + The only current function implemented is `gnus-group-prepare-flat'.") + + (defvar gnus-group-prepare-hook nil + "A hook called after the group buffer has been generated. + If you want to modify the group buffer, you can use this hook.") + + (defvar gnus-summary-prepare-hook nil + "A hook called after the summary buffer has been generated. + If you want to modify the summary buffer, you can use this hook.") + + (defvar gnus-article-prepare-hook nil + "A hook called after an article has been prepared in the article buffer. + If you want to run a special decoding program like nkf, use this hook.") + + (defvar gnus-article-display-hook nil + "A hook called after the article is displayed in the article buffer. + The hook is designed to change the contents of the article + buffer. Typical functions that this hook may contain are + `gnus-article-hide-headers' (hide selected headers), + `gnus-article-hide-signature' (hide signature) and + `gnus-article-treat-overstrike' (turn \"^H_\" into bold characters).") + (add-hook 'gnus-article-display-hook 'gnus-article-hide-headers-if-wanted) + (add-hook 'gnus-article-display-hook 'gnus-article-treat-overstrike) + + (defvar gnus-select-group-hook nil + "A hook called when a newsgroup is selected. + + If you'd like to simplify subjects like the + `gnus-summary-next-same-subject' command does, you can use the + following hook: + + (setq gnus-select-group-hook + (list + (lambda () + (mapcar (lambda (header) + (header-set-subject + header + (gnus-simplify-subject + (header-subject header) 're-only))) + gnus-newsgroup-headers))))") + + (defvar gnus-select-article-hook + '(gnus-summary-show-thread) + "A hook called when an article is selected. + The default hook shows conversation thread subtrees of the selected + article automatically using `gnus-summary-show-thread'.") + + (defvar gnus-apply-kill-hook '(gnus-apply-kill-file) + "A hook called to apply kill files to a group. + This hook is intended to apply a kill file to the selected newsgroup. + The function `gnus-apply-kill-file' is called by default. + + Since a general kill file is too heavy to use only for a few + newsgroups, I recommend you to use a lighter hook function. For + example, if you'd like to apply a kill file to articles which contains + a string `rmgroup' in subject in newsgroup `control', you can use the + following hook: + + \(setq gnus-apply-kill-hook + (list + (lambda () + (cond ((string-match \"control\" gnus-newsgroup-name) + (gnus-kill \"Subject\" \"rmgroup\") + (gnus-expunge \"X\"))))))") + + (defvar gnus-visual-mark-article-hook + (list 'gnus-visual-highlight-selected-summary) + "Hook run after selecting an article in the summary buffer. + It is meant to be used for highlighting the article in some way. It + is not run if `gnus-visual' is nil.") + + (defvar gnus-prepare-article-hook (list 'gnus-inews-insert-signature) + "A hook called after preparing body, but before preparing header headers. + The default hook (`gnus-inews-insert-signature') inserts a signature + file specified by the variable `gnus-signature-file'.") + + (defvar gnus-inews-article-hook (list 'gnus-inews-do-fcc) + "A hook called before finally posting an article. + The default hook (`gnus-inews-do-fcc') does FCC processing (ie. saves + the article to a file).") + + (defvar gnus-inews-article-header-hook nil + "A hook called after inserting the headers in an article to be posted. + The hook is called from the *post-news* buffer, narrowed to the + headers.") + + (defvar gnus-exit-group-hook nil + "A hook called when exiting (not quitting) summary mode.") + + (defvar gnus-suspend-gnus-hook nil + "A hook called when suspending (not exiting) Gnus.") + + (defvar gnus-exit-gnus-hook nil + "A hook called when exiting Gnus.") + + (defvar gnus-save-newsrc-hook nil + "A hook called when saving the newsrc file.") + + (defvar gnus-visual-summary-update-hook + (list 'gnus-visual-summary-highlight-line) + "A hook called when a summary line is changed. + The hook will not be called if `gnus-visual' is nil. + + The default function `gnus-visual-summary-highlight-line' will + highlight the line according to the `gnus-visual-summary-highlight' + variable.") + + (defvar gnus-mark-article-hook (list 'gnus-summary-mark-unread-as-read) + "A hook called when an article is selected for the first time. + The hook is intended to mark an article as read (or unread) + automatically when it is selected.") + + ;; Site dependent variables. These variables should be defined in + ;; paths.el. + + (defvar gnus-default-nntp-server nil + "Specify a default NNTP server. + This variable should be defined in paths.el, and should never be set + by the user. + If you want to change servers, you should use `gnus-select-method'. + See the documentation to that variable.") + + (defconst gnus-backup-default-subscribed-newsgroups + '("news.announce.newusers" "news.groups.questions" "gnu.emacs.gnus") + "Default default new newsgroups the first time Gnus is run. + Should be set in paths.el, and shouldn't be touched by the user.") + + (defvar gnus-local-domain nil + "Local domain name without a host name. + The DOMAINNAME environment variable is used instead if it is defined. + If the `system-name' function returns the full Internet name, there is + no need to set this variable.") + + (defvar gnus-local-organization nil + "String with a description of what organization (if any) the user belongs to. + The ORGANIZATION environment variable is used instead if it is defined. + If this variable contains a function, this function will be called + with the current newsgroup name as the argument. The function should + return a string. + In any case, if the string (either in the variable, in the environment + variable, or returned by the function) is a file name, the contents of + this file will be used as the organization.") + + (defvar gnus-use-generic-from nil + "If nil, the full host name will be the system name prepended to the domain name. + If this is a string, the full host name will be this string. + If this is non-nil, non-string, the domain name will be used as the + full host name.") + + (defvar gnus-use-generic-path nil + "If nil, use the NNTP server name in the Path header. + If stringp, use this; if non-nil, use no host name (user name only).") + ;; Internal variables ;; Avoid highlighting in kill files. (defvar gnus-summary-inhibit-highlight nil) + (defvar gnus-newsgroup-selected-overlay nil) + (defvar gnus-article-mode-map nil) (defvar caesar-translate-table nil) (defvar gnus-dribble-buffer nil) (defvar gnus-headers-retrieved-by nil) (defvar gnus-article-reply nil) (defvar gnus-override-method nil) (defvar gnus-article-check-size nil) (defvar gnus-score-file-list nil) + (defvar gnus-internal-global-score-files nil) + (defvar gnus-current-score-file nil) + (defvar gnus-score-alist nil "Alist containing score information. The keys can be symbols or strings. The following symbols are defined. *************** *** 1085,1101 **** (defvar gnus-score-index nil) (defvar gnus-newsgroup-dependencies nil) - (defconst gnus-group-edit-buffer "*Gnus edit newsgroup*") ! ! (defvar gnus-default-subscribe-level 2 ! "Default subscription level.") ! ! (defvar gnus-default-unsubscribe-level 6 ! "Default unsubscription level.") ! ! (defvar gnus-default-kill-level 9 ! "Default kill level.") (defconst gnus-group-line-format-alist (list (list ?M 'marked ?c) --- 1127,1136 ---- (defvar gnus-score-index nil) (defvar gnus-newsgroup-dependencies nil) (defconst gnus-group-edit-buffer "*Gnus edit newsgroup*") ! (defvar gnus-default-subscribe-level 2) ! (defvar gnus-default-unsubscribe-level 6) ! (defvar gnus-default-kill-level 9) (defconst gnus-group-line-format-alist (list (list ?M 'marked ?c) *************** *** 1168,1174 **** (defconst gnus-maintainer "Lars Magne Ingebrigtsen " "The mail address of the Gnus maintainer.") ! (defconst gnus-version "(ding) Gnus v0.36" "Version number for this version of Gnus.") (defvar gnus-info-nodes --- 1203,1209 ---- (defconst gnus-maintainer "Lars Magne Ingebrigtsen " "The mail address of the Gnus maintainer.") ! (defconst gnus-version "(ding) Gnus v0.37" "Version number for this version of Gnus.") (defvar gnus-info-nodes *************** *** 1185,1191 **** (defvar gnus-article-buffer "*Article*") (defvar gnus-buffer-list nil ! "Gnus buffers that should be killed when exiting.") (defvar gnus-variable-list '(gnus-newsrc-options --- 1220,1226 ---- (defvar gnus-article-buffer "*Article*") (defvar gnus-buffer-list nil ! "Gnus buffers that should be killed on exit.") (defvar gnus-variable-list '(gnus-newsrc-options *************** *** 1263,1272 **** (defvar gnus-newsgroup-last-mail nil) (defvar gnus-newsgroup-last-folder nil) (defvar gnus-newsgroup-last-file nil) ! (defvar gnus-newsgroup-auto-expire nil ! "If non-nil, all read articles will be marked as expirable.") ! ! (defvar gnus-newsgroup-selected-overlay nil) (defvar gnus-newsgroup-unreads nil "List of unread articles in the current newsgroup.") --- 1298,1304 ---- (defvar gnus-newsgroup-last-mail nil) (defvar gnus-newsgroup-last-folder nil) (defvar gnus-newsgroup-last-file nil) ! (defvar gnus-newsgroup-auto-expire nil) (defvar gnus-newsgroup-unreads nil "List of unread articles in the current newsgroup.") *************** *** 1310,1326 **** (defvar gnus-current-article nil) (defvar gnus-article-current nil) (defvar gnus-current-headers nil) ! (defvar gnus-have-all-headers nil "Must be either T or NIL.") (defvar gnus-last-article nil) (defvar gnus-current-kill-article nil) ;; Save window configuration. (defvar gnus-winconf-kill-file nil) (defvar gnus-winconf-edit-group nil) ! ! (defvar gnus-group-mode-map nil) ! (defvar gnus-article-mode-map nil) ! (defvar gnus-kill-file-mode-map nil) ;; Format specs (defvar gnus-summary-line-format-spec nil) --- 1342,1356 ---- (defvar gnus-current-article nil) (defvar gnus-article-current nil) (defvar gnus-current-headers nil) ! (defvar gnus-have-all-headers nil) (defvar gnus-last-article nil) + (defvar gnus-newsgroup-history nil) (defvar gnus-current-kill-article nil) ;; Save window configuration. (defvar gnus-winconf-kill-file nil) (defvar gnus-winconf-edit-group nil) ! (defvar gnus-winconf-edit-score nil) ;; Format specs (defvar gnus-summary-line-format-spec nil) *************** *** 1329,1339 **** (defvar gnus-summary-mode-line-format-spec nil) (defvar gnus-article-mode-line-format-spec nil) (defvar gnus-group-mode-line-format-spec nil) (defvar gnus-summary-expunge-below nil) (defvar gnus-reffed-article-number nil) - (defvar gnus-summary-mark-positions nil) - (defvar rmail-default-file (expand-file-name "~/XMBOX")) (defvar rmail-default-rmail-file (expand-file-name "~/XNEWS")) --- 1359,1369 ---- (defvar gnus-summary-mode-line-format-spec nil) (defvar gnus-article-mode-line-format-spec nil) (defvar gnus-group-mode-line-format-spec nil) + (defvar gnus-summary-mark-positions nil) + (defvar gnus-summary-expunge-below nil) (defvar gnus-reffed-article-number nil) (defvar rmail-default-file (expand-file-name "~/XMBOX")) (defvar rmail-default-rmail-file (expand-file-name "~/XNEWS")) *************** *** 1350,1381 **** gnus-newsgroup-headers gnus-newsgroup-headers-hashtb-by-number gnus-current-article gnus-current-headers gnus-have-all-headers gnus-last-article gnus-article-internal-prepare-hook ! gnus-newsgroup-selected-overlay gnus-newsgroup-dependencies gnus-newsgroup-scored gnus-newsgroup-kill-headers ! gnus-score-alist gnus-summary-expunge-below ! gnus-summary-mark-below gnus-newsgroup-ancient) "Variables that are buffer-local to the summary buffers.") ! (defvar gnus-mark-article-hook ! (list ! (lambda () ! (or (memq gnus-current-article gnus-newsgroup-marked) ! (memq gnus-current-article gnus-newsgroup-dormant) ! (memq gnus-current-article gnus-newsgroup-expirable) ! (progn ! (gnus-summary-mark-as-read gnus-current-article gnus-read-mark))))) ! "A hook called when an article is selected at the first time. ! The hook is intended to mark an article as read (or unread) ! automatically when it is selected. ! ! If you'd like to tick articles instead, use the following hook: ! ! \(setq gnus-mark-article-hook ! (list ! (lambda () ! (gnus-summary-tick-article gnus-current-article))))") ! ;; Define some autoload functions Gnus may use. (eval-and-compile (autoload 'metamail-buffer "metamail") (autoload 'Info-goto-node "info") --- 1380,1395 ---- gnus-newsgroup-headers gnus-newsgroup-headers-hashtb-by-number gnus-current-article gnus-current-headers gnus-have-all-headers gnus-last-article gnus-article-internal-prepare-hook ! gnus-newsgroup-dependencies gnus-newsgroup-selected-overlay gnus-newsgroup-scored gnus-newsgroup-kill-headers ! gnus-score-alist gnus-current-score-file gnus-summary-expunge-below ! (gnus-summary-mark-below . gnus-summary-default-score) ! gnus-newsgroup-history gnus-newsgroup-ancient) "Variables that are buffer-local to the summary buffers.") ! ;;; End of variables. ! ;; Define some autoload functions Gnus might use. (eval-and-compile (autoload 'metamail-buffer "metamail") (autoload 'Info-goto-node "info") *************** *** 1388,1393 **** --- 1402,1408 ---- (autoload 'rmail-output "rmailout") (autoload 'mail-position-on-field "sendmail") (autoload 'mail-setup "sendmail") + (autoload 'news-mail-other-window "rnewspost") (autoload 'gnus-mail-reply-using-mhe "gnus-mh") (autoload 'gnus-mail-forward-using-mhe "gnus-mh") *************** *** 1970,1975 **** --- 1985,1991 ---- gnus-score-cache nil gnus-newsgroup-headers-hashtb-by-number nil gnus-newsgroup-name nil + gnus-internal-global-score-files nil gnus-current-select-method nil) ;; Kill the startup file. (and gnus-current-startup-file *************** *** 2191,2198 **** (and (not (fboundp (car defs))) (car (cdr (cdr defs))) (load (car (cdr (cdr defs))) nil 'nomessage)) ! (fset (car defs) (car (cdr defs))) ! ))) (defun gnus-replace-chars-in-string (string from to) "Replace characters in STRING from FROM to TO." --- 2207,2213 ---- (and (not (fboundp (car defs))) (car (cdr (cdr defs))) (load (car (cdr (cdr defs))) nil 'nomessage)) ! (fset (car defs) (car (cdr defs)))))) (defun gnus-replace-chars-in-string (string from to) "Replace characters in STRING from FROM to TO." *************** *** 2217,2222 **** --- 2232,2243 ---- (timezone-absolute-from-gregorian (nth 1 d2) (nth 2 d2) (car d2))))) + (defun gnus-day-number (date) + (let ((dat (mapcar (lambda (s) (and s (string-to-int s)) ) + (timezone-parse-date date)))) + (timezone-absolute-from-gregorian + (nth 1 dat) (nth 2 dat) (car dat)))) + (defun gnus-file-newer-than (file date) (let ((fdate (nth 5 (file-attributes file)))) (or (> (car fdate) (car date)) *************** *** 2271,2276 **** --- 2292,2313 ---- (setq list2 (cdr list2))) list1)) + (defun gnus-sorted-complement (list1 list2) + "Return a list of elements of LIST1 that do not appear in LIST2. + Both lists have to be sorted over <." + (let (out) + (while (and list1 list2) + (cond ((= (car list1) (car list2)) + (setq list1 (cdr list1) + list2 (cdr list2))) + ((< (car list1) (car list2)) + (setq out (cons (car list1) out)) + (setq list1 (cdr list1))) + (t + (setq out (cons (car list2) out)) + (setq list2 (cdr list2))))) + (append (or list1 list2) out))) + (defun gnus-intersection (list1 list2) (let ((result nil)) (while list2 *************** *** 2279,2284 **** --- 2316,2353 ---- (setq list2 (cdr list2))) result)) + (defun gnus-sorted-intersection (list1 list2) + ;; LIST1 and LIST2 have to be sorted over <. + (let (out) + (while (and list1 list2) + (cond ((= (car list1) (car list2)) + (setq out (cons (car list1) out) + list1 (cdr list1) + list2 (cdr list2))) + ((< (car list1) (car list2)) + (setq list1 (cdr list1))) + (t + (setq list2 (cdr list2))))) + out)) + + (defun gnus-set-sorted-intersection (list1 list2) + ;; LIST1 and LIST2 have to be sorted over <. + ;; This function modifies LIST1. + (let* ((top (cons nil list1)) + (prev top)) + (while (and list1 list2) + (cond ((= (car list1) (car list2)) + (setq prev list1 + list1 (cdr list1) + list2 (cdr list2))) + ((< (car list1) (car list2)) + (setcdr prev (cdr list1)) + (setq list1 (cdr list1))) + (t + (setcdr prev (cdr list1)) + (setq list2 (cdr list2))))) + (cdr top))) + (defun gnus-compress-sequence (numbers &optional always-list) "Convert list of numbers to a list of ranges or a single range. If ALWAYS-LIST is non-nil, this function will always release a list of *************** *** 2376,2382 **** Note: LIST has to be sorted over `<'." ;; !!! This function shouldn't look like this, but I've got a headache. (gnus-compress-sequence ! (gnus-set-difference (gnus-uncompress-sequence ranges) list))) (defun gnus-member-of-range (number ranges) --- 2445,2451 ---- Note: LIST has to be sorted over `<'." ;; !!! This function shouldn't look like this, but I've got a headache. (gnus-compress-sequence ! (gnus-sorted-complement (gnus-uncompress-sequence ranges) list))) (defun gnus-member-of-range (number ranges) *************** *** 2384,2390 **** (and (>= number (car ranges)) (<= number (cdr ranges))) (let ((not-stop t)) ! (while (and ranges (> number (car (car ranges))) not-stop) (if (and (>= number (car (car ranges))) (<= number (cdr (car ranges)))) (setq not-stop nil)) --- 2453,2459 ---- (and (>= number (car ranges)) (<= number (cdr ranges))) (let ((not-stop t)) ! (while (and ranges (>= number (car (car ranges))) not-stop) (if (and (>= number (car (car ranges))) (<= number (cdr (car ranges)))) (setq not-stop nil)) *************** *** 2396,2401 **** --- 2465,2471 ---- ;;; Gnus group mode ;;; + (defvar gnus-group-mode-map nil) (defvar gnus-group-make-map nil) (defvar gnus-group-list-map nil) *************** *** 2482,2537 **** All normal editing commands are switched off. The following commands are available: ! \\ ! \\[gnus-group-read-group]\t Choose the current group ! \\[gnus-group-select-group]\t Select the current group without selecting the first article ! \\[gnus-group-jump-to-group]\t Go to some group ! \\[gnus-group-next-unread-group]\t Go to the next unread group ! \\[gnus-group-prev-unread-group]\t Go to the previous unread group ! \\[gnus-group-next-group]\t Go to the next group ! \\[gnus-group-prev-group]\t Go to the previous group ! \\[gnus-group-next-unread-group-same-level]\t Go to the next unread group on the same level ! \\[gnus-group-prev-unread-group-same-level]\t Go to the previous unread group un the same level ! \\[gnus-group-unsubscribe-current-group]\t (Un)subscribe to the current group ! \\[gnus-group-unsubscribe-group]\t (Un)subscribe to some group ! \\[gnus-group-catchup-current]\t Mark all unread articles in the current group as read ! \\[gnus-group-catchup-current-all]\t Mark all alrticles in the current group as read ! \\[gnus-group-list-groups]\t List groups that have unread articles ! \\[gnus-group-list-all-groups]\t List all groups ! \\[gnus-group-mail]\t Compose a mail ! \\[gnus-group-get-new-news]\t Look for new news ! \\[gnus-group-get-new-news-this-group]\t Look for new news for the current group ! \\[gnus-group-restart]\t Restart Gnus ! \\[gnus-group-save-newsrc]\t Save the startup file(s) ! \\[gnus-group-browse-foreign-server]\t Browse a foreign (NNTP) server ! \\[gnus-group-check-bogus-groups]\t Check for and remove bogus newsgroups ! \\[gnus-find-new-newsgroups]\t Find new newsgroups ! \\[gnus-group-describe-group]\t Describe the current newsgroup ! \\[gnus-group-describe-all-groups]\t Describe all newsgroups ! \\[gnus-group-post-news]\t Post an article to some newsgroup ! \\[gnus-group-make-group]\t Add a newsgroup entry ! \\[gnus-group-edit-group]\t Edit a newsgroup entry ! \\[gnus-group-make-directory-group]\t Read a directory as a newsgroups ! \\[gnus-group-edit-local-kill]\t Edit a local kill file ! \\[gnus-group-edit-global-kill]\t Edit the global kill file ! \\[gnus-group-kill-group]\t Kill the current newsgroup ! \\[gnus-group-yank-group]\t Yank a previously killed newsgroup ! \\[gnus-group-kill-region]\t Kill all newsgroups between point and mark ! \\[gnus-group-kill-all-zombies]\t Kill all zombie newsgroups ! \\[gnus-group-transpose-groups]\t Transpose two newsgroups ! \\[gnus-group-list-killed]\t List all killed newsgroups ! \\[gnus-group-list-zombies]\t List all zombie newsgroups ! \\[gnus-group-expire-articles]\t Expire the expirable articles in the current newsgroup ! \\[gnus-group-expire-all-groups]\t Expire expirable articles in all newsgroups ! \\[gnus-version]\t Display the current Gnus version ! \\[gnus-group-set-current-level]\t Set the level of the current newsgroup ! \\[gnus-group-suspend]\t Suspend Gnus ! \\[gnus-group-clear-dribble]\t Clear the dribble buffer ! \\[gnus-group-exit]\t Stop reading news ! \\[gnus-group-quit]\t Stop reading news without saving the startup files ! \\[gnus-group-describe-briefly]\t Give a brief description of the current mode ! \\[gnus-info-find-node]\t Find the info pages for Gnus ! " (interactive) (if gnus-visual (gnus-group-make-menu-bar)) (kill-all-local-variables) --- 2552,2558 ---- All normal editing commands are switched off. The following commands are available: ! \\{gnus-group-mode-map}" (interactive) (if gnus-visual (gnus-group-make-menu-bar)) (kill-all-local-variables) *************** *** 2591,2596 **** --- 2612,2618 ---- (if (and (not dont-connect) (not (gnus-server-opened gnus-select-method))) (gnus-group-quit) + (run-hooks 'gnus-startup-hook) ;; NNTP server is successfully open. (gnus-update-format-specifications) (let ((buffer-read-only nil)) *************** *** 2599,2605 **** (progn (gnus-group-startup-message) (sit-for 0)))) - (run-hooks 'gnus-startup-hook) (gnus-setup-news nil level) (and gnus-use-dribble-file (gnus-dribble-open)) (or t (not gnus-novice-user) --- 2621,2626 ---- *************** *** 3127,3136 **** The user will be prompted for a NAME, for a select METHOD, and an ADDRESS." (interactive ! (list (read-string "Group name: ") ! (completing-read "Method: " gnus-valid-select-methods nil t) ! (read-string "Address: "))) (let ((nname (gnus-group-prefixed-name name (list (intern method) address))) info) (gnus-group-change-level --- 3148,3163 ---- The user will be prompted for a NAME, for a select METHOD, and an ADDRESS." (interactive ! (cons (read-string "Group name: ") ! (let ((method ! (completing-read ! "Method: " gnus-valid-select-methods nil t))) ! (list method ! (if (memq 'prompt-address ! (assoc method gnus-valid-select-methods)) ! (read-string "Address: ") ! ""))))) (let ((nname (gnus-group-prefixed-name name (list (intern method) address))) info) (gnus-group-change-level *************** *** 3209,3215 **** (read-string "nnkiboze group name: ") (read-string "Source groups (regexp): ") (let ((headers (mapcar (lambda (group) (list group)) ! '("subject" "from" "number" "date" "id" "references" "chars" "lines" "xref"))) scores header regexp regexps) (while (not (equal "" (setq header (completing-read --- 3236,3242 ---- (read-string "nnkiboze group name: ") (read-string "Source groups (regexp): ") (let ((headers (mapcar (lambda (group) (list group)) ! '("subject" "from" "number" "date" "message-id" "references" "chars" "lines" "xref"))) scores header regexp regexps) (while (not (equal "" (setq header (completing-read *************** *** 3227,3237 **** (buffer-disable-undo (current-buffer)) (let (emacs-lisp-mode-hook) (pp (list 'setq 'gnus-score-alist ! (list 'quote (list (list 'touched) scores))) (current-buffer))) (write-region (point-min) (point-max) ! (concat gnus-kill-files-directory "nnkiboze:" group ! "." gnus-score-file-suffix)) (kill-buffer (current-buffer))) (gnus-group-position-cursor)) --- 3254,3264 ---- (buffer-disable-undo (current-buffer)) (let (emacs-lisp-mode-hook) (pp (list 'setq 'gnus-score-alist ! (list 'quote (list scores))) (current-buffer))) (write-region (point-min) (point-max) ! (concat (or gnus-kill-files-directory "~/News") ! "nnkiboze:" group "." gnus-score-file-suffix)) (kill-buffer (current-buffer))) (gnus-group-position-cursor)) *************** *** 3525,3530 **** --- 3552,3558 ---- If ARG is non-nil, it should be a number between one and nine to specify which levels you are interested in re-scanning." (interactive "P") + (run-hooks 'gnus-get-new-news-hook) (if (and gnus-read-active-file (not arg)) (progn (gnus-read-active-file) *************** *** 3712,3734 **** (interactive) (mail)) ! (defun gnus-group-edit-global-kill () ! "Edit a global kill file." ! (interactive) ! (setq gnus-current-kill-article nil) ;No articles selected. ! (gnus-kill-file-edit-file nil) ;Nil stands for global KILL file. (message (substitute-command-keys "Editing a global kill file (Type \\[gnus-kill-file-exit] to exit)"))) ! (defun gnus-group-edit-local-kill () "Edit a local kill file." ! (interactive) ! (setq gnus-current-kill-article nil) ;No articles selected. ! (gnus-kill-file-edit-file (gnus-group-group-name)) ! (message ! (substitute-command-keys ! "Editing a local kill file (Type \\[gnus-kill-file-exit] to exit)"))) (defun gnus-group-force-update () "Update `.newsrc' file." --- 3740,3759 ---- (interactive) (mail)) ! (defun gnus-group-edit-global-kill (article &optional group) ! "Edit the global kill file. ! If GROUP, edit that local kill file instead." ! (interactive "P") ! (setq gnus-current-kill-article article) ! (gnus-kill-file-edit-file group) (message (substitute-command-keys "Editing a global kill file (Type \\[gnus-kill-file-exit] to exit)"))) ! (defun gnus-group-edit-local-kill (article group) "Edit a local kill file." ! (interactive (list nil (gnus-group-group-name))) ! (gnus-group-edit-global-kill article group)) (defun gnus-group-force-update () "Update `.newsrc' file." *************** *** 3994,4011 **** --- 4019,4039 ---- (defvar gnus-summary-various-map nil) (defvar gnus-summary-interest-map nil) (defvar gnus-summary-process-map nil) + (defvar gnus-summary-score-map nil) (defvar gnus-summary-sort-map nil) (defvar gnus-summary-mgroup-map nil) (defvar gnus-summary-vkill-map nil) (defvar gnus-summary-increase-map nil) (defvar gnus-summary-inc-subject-map nil) (defvar gnus-summary-inc-author-map nil) + (defvar gnus-summary-inc-id-map nil) (defvar gnus-summary-inc-xref-map nil) (defvar gnus-summary-inc-thread-map nil) (defvar gnus-summary-inc-fol-map nil) (defvar gnus-summary-lower-map nil) (defvar gnus-summary-low-subject-map nil) (defvar gnus-summary-low-author-map nil) + (defvar gnus-summary-low-id-map nil) (defvar gnus-summary-low-xref-map nil) (defvar gnus-summary-low-thread-map nil) (defvar gnus-summary-low-fol-map nil) *************** *** 4015,4021 **** (setq gnus-summary-mode-map (make-keymap)) (suppress-keymap gnus-summary-mode-map) ! ;;Non-orthogonal keys (define-key gnus-summary-mode-map " " 'gnus-summary-next-page) (define-key gnus-summary-mode-map "\177" 'gnus-summary-prev-page) --- 4043,4049 ---- (setq gnus-summary-mode-map (make-keymap)) (suppress-keymap gnus-summary-mode-map) ! ;; Non-orthogonal keys (define-key gnus-summary-mode-map " " 'gnus-summary-next-page) (define-key gnus-summary-mode-map "\177" 'gnus-summary-prev-page) *************** *** 4075,4081 **** (define-key gnus-summary-mode-map "w" 'gnus-summary-stop-page-breaking) (define-key gnus-summary-mode-map "\C-c\C-r" 'gnus-summary-caesar-message) (define-key gnus-summary-mode-map "\M-t" 'gnus-summary-toggle-mime) - (define-key gnus-summary-mode-map "\C-d" 'gnus-summary-enter-digest-group) (define-key gnus-summary-mode-map "f" 'gnus-summary-followup) (define-key gnus-summary-mode-map "F" 'gnus-summary-followup-with-original) (define-key gnus-summary-mode-map "C" 'gnus-summary-cancel-article) --- 4103,4108 ---- *************** *** 4105,4111 **** (define-key gnus-summary-mode-map "\C-c\C-v\C-v" 'gnus-uu-decode-uu) ! ;; Orthogonal keymap (define-prefix-command 'gnus-summary-mark-map) (define-key gnus-summary-mode-map "M" 'gnus-summary-mark-map) (define-key gnus-summary-mark-map "t" 'gnus-summary-tick-article-forward) --- 4132,4138 ---- (define-key gnus-summary-mode-map "\C-c\C-v\C-v" 'gnus-uu-decode-uu) ! ;; Sort of orthogonal keymap (define-prefix-command 'gnus-summary-mark-map) (define-key gnus-summary-mode-map "M" 'gnus-summary-mark-map) (define-key gnus-summary-mark-map "t" 'gnus-summary-tick-article-forward) *************** *** 4181,4193 **** (define-key gnus-summary-goto-map "b" 'gnus-summary-best-unread-article) (define-key gnus-summary-goto-map "g" 'gnus-summary-goto-subject) (define-key gnus-summary-goto-map "l" 'gnus-summary-goto-last-article) (define-prefix-command 'gnus-summary-thread-map) (define-key gnus-summary-mode-map "T" 'gnus-summary-thread-map) (define-key gnus-summary-thread-map "k" 'gnus-summary-kill-thread) (define-key gnus-summary-thread-map "l" 'gnus-summary-lower-thread) ! (define-key gnus-summary-thread-map "r" 'gnus-summary-raise-thread) (define-key gnus-summary-thread-map "T" 'gnus-summary-toggle-threads) (define-key gnus-summary-thread-map "s" 'gnus-summary-show-thread) (define-key gnus-summary-thread-map "S" 'gnus-summary-show-all-threads) --- 4208,4221 ---- (define-key gnus-summary-goto-map "b" 'gnus-summary-best-unread-article) (define-key gnus-summary-goto-map "g" 'gnus-summary-goto-subject) (define-key gnus-summary-goto-map "l" 'gnus-summary-goto-last-article) + (define-key gnus-summary-goto-map "p" 'gnus-summary-pop-article) (define-prefix-command 'gnus-summary-thread-map) (define-key gnus-summary-mode-map "T" 'gnus-summary-thread-map) (define-key gnus-summary-thread-map "k" 'gnus-summary-kill-thread) (define-key gnus-summary-thread-map "l" 'gnus-summary-lower-thread) ! (define-key gnus-summary-thread-map "i" 'gnus-summary-raise-thread) (define-key gnus-summary-thread-map "T" 'gnus-summary-toggle-threads) (define-key gnus-summary-thread-map "s" 'gnus-summary-show-thread) (define-key gnus-summary-thread-map "S" 'gnus-summary-show-all-threads) *************** *** 4282,4293 **** (define-key gnus-summary-various-map "d" 'gnus-summary-describe-group) (define-key gnus-summary-various-map "?" 'gnus-summary-describe-briefly) (define-key gnus-summary-various-map "i" 'gnus-info-find-node) - (define-key gnus-summary-various-map "S" 'gnus-summary-set-score) - (define-key gnus-summary-various-map "C" 'gnus-summary-change-score-file) - (define-key gnus-summary-various-map "b" 'gnus-summary-set-mark-below) - (define-key gnus-summary-various-map "B" 'gnus-summary-expunge-below) (define-key gnus-summary-various-map "D" 'gnus-summary-enter-digest-group) (define-prefix-command 'gnus-summary-sort-map) (define-key gnus-summary-various-map "s" 'gnus-summary-sort-map) (define-key gnus-summary-sort-map "n" 'gnus-summary-sort-by-number) --- 4310,4325 ---- (define-key gnus-summary-various-map "d" 'gnus-summary-describe-group) (define-key gnus-summary-various-map "?" 'gnus-summary-describe-briefly) (define-key gnus-summary-various-map "i" 'gnus-info-find-node) (define-key gnus-summary-various-map "D" 'gnus-summary-enter-digest-group) + (define-prefix-command 'gnus-summary-score-map) + (define-key gnus-summary-various-map "S" 'gnus-summary-score-map) + (define-key gnus-summary-score-map "s" 'gnus-summary-set-score) + (define-key gnus-summary-score-map "c" 'gnus-score-change-score-file) + (define-key gnus-summary-score-map "m" 'gnus-score-set-mark-below) + (define-key gnus-summary-score-map "E" 'gnus-score-set-expunge-below) + (define-key gnus-summary-score-map "e" 'gnus-score-edit-file) + (define-prefix-command 'gnus-summary-sort-map) (define-key gnus-summary-various-map "s" 'gnus-summary-sort-map) (define-key gnus-summary-sort-map "n" 'gnus-summary-sort-by-number) *************** *** 4311,4318 **** (define-key gnus-summary-vkill-map "K" 'gnus-summary-kill-same-subject) (define-key gnus-summary-vkill-map "\M-k" 'gnus-summary-edit-local-kill) (define-key gnus-summary-vkill-map "\M-K" 'gnus-summary-edit-global-kill) - (define-key gnus-summary-vkill-map "x" 'gnus-kill-file-set-expunge-below) - (define-key gnus-summary-vkill-map "m" 'gnus-kill-file-set-mark-below) (define-prefix-command 'gnus-summary-increase-map) --- 4343,4348 ---- *************** *** 4337,4342 **** --- 4367,4380 ---- (define-key gnus-summary-inc-author-map "t" 'gnus-summary-temporarily-raise-by-author) (define-key gnus-summary-inc-author-map "p" 'gnus-summary-raise-by-author) + (define-prefix-command 'gnus-summary-inc-id-map) + (define-key gnus-summary-increase-map "i" 'gnus-summary-inc-id-map) + (define-key gnus-summary-increase-map "I" 'gnus-summary-temporarily-raise-by-id) + (define-key gnus-summary-inc-id-map "i" 'gnus-summary-temporarily-raise-by-id) + (define-key gnus-summary-inc-id-map "I" 'gnus-summary-raise-by-id) + (define-key gnus-summary-inc-id-map "t" 'gnus-summary-temporarily-raise-by-id) + (define-key gnus-summary-inc-id-map "p" 'gnus-summary-raise-by-id) + (define-prefix-command 'gnus-summary-inc-thread-map) (define-key gnus-summary-increase-map "t" 'gnus-summary-inc-thread-map) (define-key gnus-summary-increase-map "T" 'gnus-summary-temporarily-raise-by-thread) *************** *** 4383,4388 **** --- 4421,4434 ---- (define-key gnus-summary-low-author-map "t" 'gnus-summary-temporarily-lower-by-author) (define-key gnus-summary-low-author-map "p" 'gnus-summary-lower-by-author) + (define-prefix-command 'gnus-summary-low-id-map) + (define-key gnus-summary-lower-map "i" 'gnus-summary-low-id-map) + (define-key gnus-summary-lower-map "I" 'gnus-summary-temporarily-lower-by-id) + (define-key gnus-summary-low-id-map "i" 'gnus-summary-temporarily-lower-by-id) + (define-key gnus-summary-low-id-map "I" 'gnus-summary-lower-by-id) + (define-key gnus-summary-low-id-map "t" 'gnus-summary-temporarily-lower-by-id) + (define-key gnus-summary-low-id-map "p" 'gnus-summary-lower-by-id) + (define-prefix-command 'gnus-summary-low-thread-map) (define-key gnus-summary-lower-map "t" 'gnus-summary-low-thread-map) (define-key gnus-summary-lower-map "T" 'gnus-summary-temporarily-lower-by-thread) *************** *** 4412,4539 **** (defun gnus-summary-mode () ! "Major mode for reading articles in this newsgroup. All normal editing commands are switched off. The following commands are available: ! \\ ! \\[gnus-summary-next-page]\t Scroll the article buffer a page forwards ! \\[gnus-summary-prev-page]\t Scroll the article buffer a page backwards ! \\[gnus-summary-scroll-up]\t Scroll the article buffer one line forwards ! \\[gnus-summary-next-unread-article]\t Go to the next unread article ! \\[gnus-summary-prev-unread-article]\t Go to the previous unread article ! \\[gnus-summary-next-article]\t Go to the next article ! \\[gnus-summary-prev-article]\t Go to the previous article ! \\[gnus-summary-next-same-subject]\t Go to the next summary line with the same subject ! \\[gnus-summary-prev-same-subject]\t Go to the previous summary line with the same subject ! \\[gnus-summary-next-subject]\t Go to the next summary line ! \\[gnus-summary-prev-subject]\t Go to the previous summary line ! \\[gnus-summary-next-unread-subject]\t Go to the next unread summary line ! \\[gnus-summary-prev-unread-subject]\t Go to the previous unread summary line ! \\[gnus-summary-first-unread-article]\t Go to the first unread article ! \\[gnus-summary-best-unread-article]\t Go to the unread article with the highest score ! \\[gnus-summary-goto-subject]\t Go to some subject ! \\[gnus-summary-goto-last-article]\t Go to the previous article ! ! \\[gnus-summary-beginning-of-article]\t Go to the beginning of the article ! \\[gnus-summary-end-of-article]\t Go to the end of the article ! ! \\[gnus-summary-refer-parent-article]\t Get the parent of the current article from the server ! \\[gnus-summary-refer-article]\t Request some article by Message-ID from the server ! ! \\[gnus-summary-isearch-article]\t Do an interactive search on the current article ! \\[gnus-summary-search-article-forward]\t Search all articles forward for a regular expression ! \\[gnus-summary-search-article-backward]\t Search all articles backward for a regular expression ! ! \\[gnus-summary-tick-article-forward]\t Tick current article and move forward ! \\[gnus-summary-tick-article-backward]\t Tick current article and move backward ! \\[gnus-summary-mark-as-read-forward]\t Mark the current article as read and move forward ! \\[gnus-summary-mark-as-read-backward]\t Mark the current article as read and move backward ! \\[gnus-summary-clear-mark-forward]\t Clear tick and read marks and move forward ! \\[gnus-summary-clear-mark-backward]\t Clear tick and read marks and move backward ! \\[gnus-summary-mark-as-processable]\t Set the process mark on the current article ! \\[gnus-summary-unmark-as-processable]\t Remove the process mark from the current article ! \\[gnus-summary-unmark-all-processable]\t Remove the process mark from all articles ! ! \\[gnus-summary-raise-same-subject-and-select]\t Raise all articles with the current subject and select the next article ! \\[gnus-summary-raise-same-subject]\t Raise all articles with the current subject ! \\[gnus-summary-lower-same-subject-and-select]\t Lower all articles with the current subject and select the next article ! \\[gnus-summary-lower-same-subject]\t Lower all articles with the current subject ! ! \\[gnus-summary-toggle-threads]\t Toggle thread display ! \\[gnus-summary-show-thread]\t Show the current thread ! \\[gnus-summary-hide-thread]\t Hide the current thread ! \\[gnus-summary-next-thread]\t Go to the next thread ! \\[gnus-summary-prev-thread]\t Go to the previous thread ! \\[gnus-summary-up-thread]\t Go up the current thread ! \\[gnus-summary-down-thread]\t Descend the current thread ! \\[gnus-summary-raise-thread]\t Raise the current thread ! \\[gnus-summary-lower-thread]\t Lower the current thread ! \\[gnus-summary-mark-as-expirable]\t Mark the current artivles as expirable ! \\[gnus-summary-remove-lines-marked-as-read]\t Remove all articles that are marked as read ! \\[gnus-summary-remove-lines-marked-with]\t Remove all articles that have some mark ! ! \\[gnus-summary-execute-command]\t Execute a command ! \\[gnus-summary-catchup-and-exit]\t Mark all unread articles as read and exit ! \\[gnus-summary-toggle-truncation]\t Toggle truncation of summary lines ! \\[gnus-summary-expand-window]\t Expand the summary window ! \\[gnus-summary-universal-argument]\t Run a command on all articles with the process mark ! ! \\[gnus-summary-sort-by-number]\t Sort the summary buffer by article number ! \\[gnus-summary-sort-by-author]\t Sort the summary buffer by author ! \\[gnus-summary-sort-by-subject]\t Sort the summary buffer by subject ! \\[gnus-summary-sort-by-date]\t Sort the summary buffer by date ! ! \\[gnus-summary-reselect-current-group]\t Exit and reselect the current group ! \\[gnus-summary-rescan-group]\t Exit, get new articles and reselect the group ! \\[gnus-summary-stop-page-breaking]\t Stop page breaking of the current article ! \\[gnus-summary-caesar-message]\t Caesar rotate (rot13) the current article ! \\[gnus-summary-show-article]\t Reselect the current article ! \\[gnus-summary-toggle-header]\t Toggle header display ! \\[gnus-summary-toggle-mime]\t Toggle whether to use MIME ! \\[gnus-summary-enter-digest-group]\t Enter a newsgroup based on the current digest ! \\[gnus-summary-post-news]\t Post an article to the current group ! \\[gnus-summary-followup]\t Post a followup to the current article ! \\[gnus-summary-followup-with-original]\t Post a followup and include the original article ! \\[gnus-summary-cancel-article]\t Cancel the current article ! \\[gnus-summary-supersede-article]\t Supersede the current article ! \\[gnus-summary-reply]\t Mail a reply to the author of the current article ! \\[gnus-summary-reply-with-original]\t Mail a reply and include the current article ! \\[gnus-summary-mail-forward]\t Forward the current article ! \\[gnus-summary-mail-other-window]\t Mail in the other window ! \\[gnus-summary-save-article]\t Save the current article ! \\[gnus-summary-save-article-mail]\t Save the current article in rmail format ! \\[gnus-summary-pipe-output]\t Pipe the current article to a process ! \\[gnus-summary-move-article]\t Move the article to a different newsgroup ! \\[gnus-summary-respool-article]\t Respool the article ! \\[gnus-summary-edit-local-kill]\t Edit the local kill file ! \\[gnus-summary-edit-global-kill]\t Edit the global kill file ! \\[gnus-version]\t Display the current Gnus version ! \\[gnus-summary-exit]\t Exit the summary buffer ! \\[gnus-summary-quit]\t Exit the summary buffer without saving any changes ! \\[gnus-summary-describe-group]\t Describe the current newsgroup ! \\[gnus-summary-describe-briefly]\t Give a brief key overview ! \\[gnus-info-find-node]\t Go to the Gnus info node ! ! \\[gnus-kill-file-set-expunge-below] Automatically expunge articles below LEVEL. ! ! \\[gnus-kill-file-set-mark-below] Automatically mark articles below LEVEL. ! \\[gnus-summary-temporarily-raise-by-subject]\t Temporarily raise score for articles with the current subject ! \\[gnus-summary-temporarily-raise-by-author]\t Temporarily raise score for articles from the current author ! \\[gnus-summary-temporarily-raise-by-xref]\t Temporarily raise score for articles with the current cross-posting ! \\[gnus-summary-raise-by-subject]\t Permanently raise score for articles with the current subject ! \\[gnus-summary-raise-by-author]\t Permanently raise score for articles from the current author ! \\[gnus-summary-raise-followups-to-author]\t Permanently raise score for followups to the current author ! \\[gnus-summary-raise-by-xref]\t Permanently raise score for articles with the current cross-posting ! \\[gnus-summary-temporarily-lower-by-subject]\t Temporarily lower score for articles with the current subject ! \\[gnus-summary-temporarily-lower-by-author]\t Temporarily lower score for articles from the current author ! \\[gnus-summary-temporarily-lower-by-xref]\t Temporarily lower score for articles with the current cross-posting ! \\[gnus-summary-lower-by-subject]\t Permanently lower score for articles with the current subject ! \\[gnus-summary-lower-by-author]\t Permanently lower score for articles from the current author ! \\[gnus-summary-lower-followups-to-author]\t Permanently lower score for followups to the current author ! \\[gnus-summary-lower-by-thread]\t Permanently lower score for articles in the current thread ! \\[gnus-summary-lower-by-xref]\t Permanently lower score for articles with the current cross-posting ! " (interactive) (if gnus-visual (gnus-summary-make-menu-bar)) (kill-all-local-variables) --- 4458,4468 ---- (defun gnus-summary-mode () ! "Major mode for reading articles. All normal editing commands are switched off. The following commands are available: ! \\{gnus-summary-mode-map}" (interactive) (if gnus-visual (gnus-summary-make-menu-bar)) (kill-all-local-variables) *************** *** 4656,4670 **** ;; Update summary line after change. (or (not gnus-summary-default-score) gnus-summary-inhibit-highlight ! (progn ! (or dont-update ! (if (< (gnus-summary-article-score) gnus-summary-mark-below) ! (and (eq (gnus-summary-article-mark) gnus-unread-mark) ! (gnus-summary-mark-article nil gnus-low-score-mark)) ! (and (eq (gnus-summary-article-mark) gnus-low-score-mark) ! (gnus-summary-mark-article nil gnus-unread-mark)))) ! (and gnus-visual ! (run-hooks 'gnus-visual-summary-update-hook))))) (defun gnus-summary-update-lines () ;; Rehighlight summary buffer according to `gnus-summary-highlight'. --- 4585,4602 ---- ;; Update summary line after change. (or (not gnus-summary-default-score) gnus-summary-inhibit-highlight ! (let ((gnus-summary-inhibit-highlight t)) ! (progn ! (or dont-update ! (if (and gnus-summary-mark-below ! (< (gnus-summary-article-score) gnus-summary-mark-below)) ! (and (not (memq (gnus-summary-article-mark) ! gnus-newsgroup-unreads)) ! (gnus-summary-mark-article nil gnus-low-score-mark)) ! (and (eq (gnus-summary-article-mark) gnus-low-score-mark) ! (gnus-summary-mark-article nil gnus-unread-mark)))) ! (and gnus-visual ! (run-hooks 'gnus-visual-summary-update-hook)))))) (defun gnus-summary-update-lines () ;; Rehighlight summary buffer according to `gnus-summary-highlight'. *************** *** 4737,4746 **** (erase-buffer) (gnus-summary-prepare-threads (if gnus-show-threads ! (gnus-gather-threads (gnus-sort-threads (gnus-make-threads))) gnus-newsgroup-headers) 0 nil nil t) ;; Erase header retrieval message. (message "") ;; Call hooks for modifying summary buffer. ;; Suggested by sven@tde.LTH.Se (Sven Mattisson). --- 4669,4683 ---- (erase-buffer) (gnus-summary-prepare-threads (if gnus-show-threads ! (gnus-gather-threads ! (gnus-sort-threads ! (if gnus-summary-expunge-below ! (gnus-make-threads-and-expunge) ! (gnus-make-threads)))) gnus-newsgroup-headers) 0 nil nil t) ;; Erase header retrieval message. + (gnus-summary-update-lines) (message "") ;; Call hooks for modifying summary buffer. ;; Suggested by sven@tde.LTH.Se (Sven Mattisson). *************** *** 4789,4800 **** (mapatoms (lambda (refs) (if (not (car (symbol-value refs))) (if (and gnus-summary-expunge-below (not gnus-fetch-old-headers)) (let ((headers (cdr (symbol-value refs)))) (while headers (if (not (< (or (cdr (assq (header-number (car headers)) ! gnus-newsgroup-scored)) 0) gnus-summary-expunge-below)) (setq roots (cons (car headers) roots)) (setq gnus-newsgroup-unreads --- 4726,4776 ---- (mapatoms (lambda (refs) (if (not (car (symbol-value refs))) + (setq roots (append (cdr (symbol-value refs)) roots)) + ;; Ok, these refer back to valid articles, but if + ;; `gnus-thread-ignore-subject' is nil, we have to check that + ;; the root has the same subject as its children. The children + ;; that do not are made into roots and removed from the list + ;; of children. + (or gnus-thread-ignore-subject + (let* ((prev (symbol-value refs)) + (subject (gnus-simplify-subject-re + (header-subject (car prev)))) + (headers (cdr prev))) + (while headers + (if (not (string= subject + (gnus-simplify-subject-re + (header-subject (car headers))))) + (progn + (setq roots (cons (car headers) roots)) + (setcdr prev (cdr headers))) + (setq prev headers)) + (setq headers (cdr headers))))))) + gnus-newsgroup-dependencies) + + (mapcar 'gnus-trim-thread + (apply 'append + (mapcar 'gnus-cut-thread + (mapcar 'gnus-make-sub-thread roots)))))) + + (defun gnus-make-threads-and-expunge () + ;; This function takes the dependencies already made by + ;; `gnus-get-newsgroup-headers' and builds the trees. First we go + ;; through the dependecies in the hash table and finds all the + ;; roots. Roots do not refer back to any valid articles. + (let (roots) + (and gnus-fetch-old-headers (eq gnus-headers-retrieved-by 'nov) + (gnus-build-old-threads)) + (mapatoms + (lambda (refs) + (if (not (car (symbol-value refs))) (if (and gnus-summary-expunge-below (not gnus-fetch-old-headers)) (let ((headers (cdr (symbol-value refs)))) (while headers (if (not (< (or (cdr (assq (header-number (car headers)) ! gnus-newsgroup-scored)) ! gnus-summary-default-score 0) gnus-summary-expunge-below)) (setq roots (cons (car headers) roots)) (setq gnus-newsgroup-unreads *************** *** 4829,4835 **** (while headers (if (not (< (or (cdr (assq (header-number (car headers)) gnus-newsgroup-scored)) ! gnus-summary-expunge-below) gnus-summary-expunge-below)) (setq prev (cdr prev)) (setq gnus-newsgroup-unreads --- 4805,4811 ---- (while headers (if (not (< (or (cdr (assq (header-number (car headers)) gnus-newsgroup-scored)) ! gnus-summary-default-score 0) gnus-summary-expunge-below)) (setq prev (cdr prev)) (setq gnus-newsgroup-unreads *************** *** 4838,4844 **** (setcdr prev (cdr headers)) (setq id (gnus-gethash (header-id (car headers)) gnus-newsgroup-dependencies)) ! (setq roots (append (cdr id) roots))) (setq headers (cdr headers))))))) gnus-newsgroup-dependencies) --- 4814,4827 ---- (setcdr prev (cdr headers)) (setq id (gnus-gethash (header-id (car headers)) gnus-newsgroup-dependencies)) ! (let ((h (cdr id))) ! (while h ! (if (not (< (or (cdr (assq (header-number (car h)) ! gnus-newsgroup-scored)) ! gnus-summary-default-score 0) ! gnus-summary-expunge-below)) ! (setq roots (cons (car h) roots))) ! (setq h (cdr h))))) (setq headers (cdr headers))))))) gnus-newsgroup-dependencies) *************** *** 4858,4864 **** (and gnus-summary-expunge-below (eq gnus-fetch-old-headers 'some) (< (or (cdr (assq number gnus-newsgroup-scored)) ! gnus-summary-expunge-below) gnus-summary-expunge-below) (progn (setq gnus-newsgroup-unreads --- 4841,4847 ---- (and gnus-summary-expunge-below (eq gnus-fetch-old-headers 'some) (< (or (cdr (assq number gnus-newsgroup-scored)) ! gnus-summary-default-score 0) gnus-summary-expunge-below) (progn (setq gnus-newsgroup-unreads *************** *** 5039,5045 **** (or (memq (setq number (header-number header)) gnus-newsgroup-dormant) (and gnus-summary-expunge-below ! (< (or (cdr (assq number gnus-newsgroup-scored)) 0) gnus-summary-expunge-below))) (progn (setq header nil) --- 5022,5029 ---- (or (memq (setq number (header-number header)) gnus-newsgroup-dormant) (and gnus-summary-expunge-below ! (< (or (cdr (assq number gnus-newsgroup-scored)) ! gnus-summary-default-score 0) gnus-summary-expunge-below))) (progn (setq header nil) *************** *** 5112,5124 **** (or (gnus-activate-newsgroup (car info)) (progn (kill-buffer (current-buffer)) ! (error "Couldn't request newsgroup %s" group)))) (setq gnus-current-select-method (or (nth 4 info) gnus-select-method)) (gnus-check-news-server (nth 4 info)) (or (gnus-request-group group t) (progn (kill-buffer (current-buffer)) ! (error "Couldn't request newsgroup %s" group))) (setq gnus-newsgroup-name group) (setq gnus-newsgroup-unselected nil) --- 5096,5110 ---- (or (gnus-activate-newsgroup (car info)) (progn (kill-buffer (current-buffer)) ! (error "Couldn't request group %s: %s" ! group (gnus-status-message group))))) (setq gnus-current-select-method (or (nth 4 info) gnus-select-method)) (gnus-check-news-server (nth 4 info)) (or (gnus-request-group group t) (progn (kill-buffer (current-buffer)) ! (error "Couldn't request group %s: %s" ! group (gnus-status-message group)))) (setq gnus-newsgroup-name group) (setq gnus-newsgroup-unselected nil) *************** *** 5163,5169 **** (setq gnus-newsgroup-headers (cdr gnus-newsgroup-headers))) ;; Remove cancelled articles from the list of unread articles. (setq gnus-newsgroup-unreads ! (gnus-intersection gnus-newsgroup-unreads (mapcar (lambda (headers) (header-number headers)) gnus-newsgroup-headers))) --- 5149,5155 ---- (setq gnus-newsgroup-headers (cdr gnus-newsgroup-headers))) ;; Remove cancelled articles from the list of unread articles. (setq gnus-newsgroup-unreads ! (gnus-set-sorted-intersection gnus-newsgroup-unreads (mapcar (lambda (headers) (header-number headers)) gnus-newsgroup-headers))) *************** *** 5189,5195 **** ;; unread articles are dormant articles. (if (or read-all (= (length gnus-newsgroup-unreads) ! (length gnus-newsgroup-scored))) (gnus-uncompress-sequence (gnus-gethash group gnus-active-hashtb)) gnus-newsgroup-unreads)) --- 5175,5181 ---- ;; unread articles are dormant articles. (if (or read-all (= (length gnus-newsgroup-unreads) ! (length gnus-newsgroup-dormant))) (gnus-uncompress-sequence (gnus-gethash group gnus-active-hashtb)) gnus-newsgroup-unreads)) *************** *** 5215,5227 **** (let ((input (read-string (format ! "%s %s (%d scored, %d total, %d default): " "How many articles from" ! group scored number scored)))) (if (string-equal input "") ! scored input))) (t number)) ! (quit 0)))) (setq select (if (numberp select) select (string-to-number select))) (if (zerop select) () --- 5201,5214 ---- (let ((input (read-string (format ! "%s %s (%d scored, %d total): " "How many articles from" ! group scored number)))) (if (string-equal input "") ! number input))) (t number)) ! (quit 0))) ! total-articles) (setq select (if (numberp select) select (string-to-number select))) (if (zerop select) () *************** *** 5231,5236 **** --- 5218,5225 ---- (setq number (length articles))) (setq articles (copy-sequence articles))) + (setq total-articles articles) + (if (< (abs select) number) (if (< select 0) ;; Select the N oldest articles. *************** *** 5238,5244 **** ;; Select the N most recent articles. (setq articles (nthcdr (- number select) articles)))) (setq gnus-newsgroup-unselected ! (gnus-set-difference gnus-newsgroup-unreads articles)) articles))) (defun gnus-killed-articles (killed articles) --- 5227,5235 ---- ;; Select the N most recent articles. (setq articles (nthcdr (- number select) articles)))) (setq gnus-newsgroup-unselected ! (gnus-sorted-intersection ! gnus-newsgroup-unselected ! (gnus-sorted-complement articles total-articles))) articles))) (defun gnus-killed-articles (killed articles) *************** *** 5371,5385 **** (article-number (or gnus-current-article 0)) (unread (- (length gnus-newsgroup-unreads) (length gnus-newsgroup-dormant))) (unselected (length gnus-newsgroup-unselected)) (unread-and-unselected ! (cond ((and (zerop unread) (zerop unselected)) "") ! ((zerop unselected) (format "{%d more}" unread)) ! (t (format "{%d(+%d) more}" unread unselected)))) (subject (if gnus-current-headers (header-subject gnus-current-headers) "")) ! (max-len (if (eq where 'summary) 59 59))) (setq mode-string (eval mformat)) (if (> (length mode-string) max-len) (setq mode-string --- 5362,5381 ---- (article-number (or gnus-current-article 0)) (unread (- (length gnus-newsgroup-unreads) (length gnus-newsgroup-dormant))) + (unread-and-unticked + (- unread (length gnus-newsgroup-marked))) (unselected (length gnus-newsgroup-unselected)) (unread-and-unselected ! (cond ((and (zerop unread-and-unticked) ! (zerop unselected)) "") ! ((zerop unselected) ! (format "{%d more}" unread-and-unticked)) ! (t (format "{%d(+%d) more}" ! unread-and-unticked unselected)))) (subject (if gnus-current-headers (header-subject gnus-current-headers) "")) ! (max-len (- (frame-width) gnus-mode-non-string-length))) (setq mode-string (eval mformat)) (if (> (length mode-string) max-len) (setq mode-string *************** *** 5422,5428 **** (defun gnus-mark-xrefs-as-read (from-newsgroup headers unreads expirable) "Look through all the headers and mark the Xrefs as read." ! (let (name entry read info xref-hashtb idlist active num range exps method) (save-excursion (set-buffer gnus-group-buffer) (if (setq xref-hashtb --- 5418,5428 ---- (defun gnus-mark-xrefs-as-read (from-newsgroup headers unreads expirable) "Look through all the headers and mark the Xrefs as read." ! (let ((virtual (memq 'virtual ! (assoc (symbol-name (car (gnus-find-method-for-group ! from-newsgroup))) ! gnus-valid-select-methods))) ! name entry read info xref-hashtb idlist active num range exps method) (save-excursion (set-buffer gnus-group-buffer) (if (setq xref-hashtb *************** *** 5433,5450 **** () (setq idlist (symbol-value group)) ;; Dead groups are not updated. ! (if (and (setq entry (gnus-gethash name gnus-newsrc-hashtb)) ;; Only do the xrefs if the group has the same ;; select method as the group we have just read. ! (or (and (not (nth 4 (setq info (nth 2 entry)))) ! (eq (gnus-find-method-for-group ! from-newsgroup) ! gnus-select-method)) ! (memq 'virtual ! (assoc (symbol-name ! (car (gnus-find-method-for-group ! from-newsgroup))) ! gnus-valid-select-methods)) (equal (nth 4 info) (setq method (gnus-find-method-for-group from-newsgroup))) --- 5433,5446 ---- () (setq idlist (symbol-value group)) ;; Dead groups are not updated. ! (if (and (setq entry (gnus-gethash name gnus-newsrc-hashtb) ! info (nth 2 entry)) ;; Only do the xrefs if the group has the same ;; select method as the group we have just read. ! (or (gnus-methods-equal-p ! (nth 4 info) ! (gnus-find-method-for-group from-newsgroup)) ! virtual (equal (nth 4 info) (setq method (gnus-find-method-for-group from-newsgroup))) *************** *** 5452,5457 **** --- 5448,5456 ---- (equal (nth 1 (nth 4 info)) (nth 1 method)))) gnus-use-cross-reference (or (not (eq gnus-use-cross-reference t)) + virtual + ;; Only do cross-references on subscribed + ;; groups, if that is what is wanted. (<= (nth 1 info) 5))) (progn (setq num 0) *************** *** 5476,5481 **** --- 5475,5483 ---- (setq ids (cdr ids))))) ;; Update expirable articles. (gnus-add-marked-articles nil 'expirable exps info) + (and (null (nth 2 info)) + (> (car active) 1) + (setcar (nthcdr 2 info) (cons 1 (1- (car active))))) (setcar (nthcdr 2 info) (setq range (gnus-add-to-range *************** *** 5507,5512 **** --- 5509,5523 ---- (gnus-group-update-group name t))))))) xref-hashtb))))) + (defun gnus-methods-equal-p (m1 m2) + (let ((m1 (or m1 gnus-select-method)) + (m2 (or m2 gnus-select-method))) + (or (equal m1 m2) + (and (eq (car m1) (car m2)) + (or (not (memq 'address (assoc (symbol-name (car m1)) + gnus-valid-select-methods))) + (equal (nth 1 m1) (nth 1 m2))))))) + (defsubst gnus-header-value () (buffer-substring (match-end 0) (save-excursion (end-of-line) (point)))) *************** *** 6091,6097 **** (setq gnus-newsgroup-killed (gnus-compress-sequence (nconc ! (gnus-intersection (gnus-uncompress-sequence gnus-newsgroup-killed) (setq gnus-newsgroup-unselected (sort gnus-newsgroup-unselected '<))) --- 6102,6108 ---- (setq gnus-newsgroup-killed (gnus-compress-sequence (nconc ! (gnus-set-sorted-intersection (gnus-uncompress-sequence gnus-newsgroup-killed) (setq gnus-newsgroup-unselected (sort gnus-newsgroup-unselected '<))) *************** *** 6602,6607 **** --- 6613,6630 ---- (gnus-summary-goto-article gnus-last-article)) (gnus-summary-position-cursor)) + (defun gnus-summary-pop-article (number) + "Pop one article off the history and go to the previous. + NUMBER articles will be popped off." + (interactive "p") + (let (to) + (setq gnus-newsgroup-history + (cdr (setq to (nthcdr number gnus-newsgroup-history)))) + (if to + (gnus-summary-goto-article (car to)) + (error "Article history empty"))) + (gnus-summary-position-cursor)) + ;; Summary article oriented commands (defun gnus-summary-refer-parent-article (n) *************** *** 6763,6769 **** (list (let ((completion-ignore-case t)) (completing-read "Field name: " '(("Number")("Subject")("From") ! ("Lines")("Date")("Id") ("Xref")("References")) nil 'require-match)) (read-string "Regexp: ") --- 6786,6792 ---- (list (let ((completion-ignore-case t)) (completing-read "Field name: " '(("Number")("Subject")("From") ! ("Lines")("Date")("Message-ID") ("Xref")("References")) nil 'require-match)) (read-string "Regexp: ") *************** *** 7401,7407 **** (mark (or mark gnus-dread-mark))) (while (and (> n 0) (gnus-summary-mark-article nil mark) ! (zerop (gnus-summary-next-subject (if backward -1 1)))) (setq n (1- n))) (if (/= 0 n) (message "No more %sarticles" (if mark "" "unread "))) (gnus-set-mode-line 'summary) --- 7424,7431 ---- (mark (or mark gnus-dread-mark))) (while (and (> n 0) (gnus-summary-mark-article nil mark) ! (zerop (gnus-summary-next-subject ! (if backward -1 1) gnus-summary-goto-unread))) (setq n (1- n))) (if (/= 0 n) (message "No more %sarticles" (if mark "" "unread "))) (gnus-set-mode-line 'summary) *************** *** 7418,7424 **** --- 7442,7450 ---- ;; If no mark is given, then we check auto-expiring. (and (or (not mark) (and (numberp mark) (or (= mark gnus-killed-mark) + (= mark gnus-dread-mark) (= mark gnus-catchup-mark) + (= mark gnus-low-score-mark) (= mark gnus-read-mark)))) gnus-newsgroup-auto-expire (setq mark gnus-expirable-mark)) *************** *** 7555,7560 **** --- 7581,7593 ---- (interactive "p") (gnus-summary-mark-forward (- n) gnus-unread-mark)) + (defun gnus-summary-mark-unread-as-read () + "Intended to be used by `gnus-summary-mark-article-hook'." + (or (memq gnus-current-article gnus-newsgroup-marked) + (memq gnus-current-article gnus-newsgroup-dormant) + (memq gnus-current-article gnus-newsgroup-expirable) + (gnus-summary-mark-as-read gnus-current-article gnus-read-mark))) + ;; Fix by Per Abrahamsen . (defalias 'gnus-summary-delete-marked-as-read 'gnus-summary-remove-lines-marked-as-read) *************** *** 7631,7646 **** (gnus-summary-mark-article nil mark)) (forward-line 1)))) - ;; Added by Per Abrahamsen . - (defun gnus-summary-set-mark-below (score) - "Automatically mark articles with score below SCORE as read." - (interactive "P") - (setq score (if score - (prefix-numeric-value score) - (or gnus-summary-default-score 0))) - (setq gnus-summary-mark-below score) - (gnus-summary-update-lines)) - (defun gnus-summary-kill-below (score) "Mark articles with score below SCORE as read." (interactive "P") --- 7664,7669 ---- *************** *** 7778,7784 **** (if (null arg) (not gnus-show-threads) (> (prefix-numeric-value arg) 0))) (gnus-summary-prepare) ! (gnus-summary-goto-subject current))) (defun gnus-summary-show-all-threads () "Show all threads." --- 7801,7808 ---- (if (null arg) (not gnus-show-threads) (> (prefix-numeric-value arg) 0))) (gnus-summary-prepare) ! (gnus-summary-goto-subject current) ! (gnus-summary-position-cursor))) (defun gnus-summary-show-all-threads () "Show all threads." *************** *** 8266,8288 **** TYPE is a flag indicating if it is a regexp or substring. SCORE is the score to add. DATE is the expire date." ! (interactive (list (completing-read "Header: " ! gnus-header-index ! (lambda (x) (fboundp (nth 2 x))) ! t) ! (read-string "Match: ") ! (y-or-n-p "Use regexp match? ") ! (prefix-numeric-value current-prefix-arg) ! (if (y-or-n-p "Expire kill? ") ! (current-time-string) ! nil))) (and prompt (setq match (read-string "Match: " match))) (let ((score (gnus-score-default score))) (gnus-summary-score-effect header match type score) ! (gnus-score-set header ! (cons (list match type score date) ! (gnus-score-get header))) ! (gnus-score-set 'touched t))) (defun gnus-summary-score-effect (header match type score) "Simulate the effect of a score file entry. --- 8290,8324 ---- TYPE is a flag indicating if it is a regexp or substring. SCORE is the score to add. DATE is the expire date." ! (interactive ! (list (completing-read "Header: " ! gnus-header-index ! (lambda (x) (fboundp (nth 2 x))) ! t) ! (read-string "Match: ") ! (y-or-n-p "Use regexp match? ") ! (prefix-numeric-value current-prefix-arg) ! (if (y-or-n-p "Expire kill? ") ! (current-time-string) ! nil))) (and prompt (setq match (read-string "Match: " match))) (let ((score (gnus-score-default score))) (gnus-summary-score-effect header match type score) ! (and (= score gnus-score-interactive-default-score) ! (setq score nil)) ! (let ((new (cond (type ! (list match score (and date (gnus-day-number date)) type)) ! (date ! (list match score (gnus-day-number date))) ! (score ! (list match score)) ! (t ! (list match)))) ! (old (gnus-score-get header))) ! (gnus-score-set ! header ! (if old (cons new old) (list new)))) ! (gnus-score-set 'touched '(t)))) (defun gnus-summary-score-effect (header match type score) "Simulate the effect of a score file entry. *************** *** 8331,8337 **** (defun gnus-summary-temporarily-lower-by-subject (level) "Temporarily lower score by LEVEL for current subject. ! See `gnus-kill-expiry-days'." (interactive "P") (gnus-summary-score-entry "subject" (gnus-simplify-subject-re (gnus-summary-header "subject")) --- 8367,8373 ---- (defun gnus-summary-temporarily-lower-by-subject (level) "Temporarily lower score by LEVEL for current subject. ! See `gnus-score-expiry-days'." (interactive "P") (gnus-summary-score-entry "subject" (gnus-simplify-subject-re (gnus-summary-header "subject")) *************** *** 8340,8363 **** (defun gnus-summary-temporarily-lower-by-author (level) "Temporarily lower score by LEVEL for current author. ! See `gnus-kill-expiry-days'." (interactive "P") (gnus-summary-score-entry "from" (gnus-summary-header "from") nil (- (gnus-score-default level)) (current-time-string) t)) (defun gnus-summary-temporarily-lower-by-xref (level) "Temporarily lower score by LEVEL for current xref. ! See `gnus-kill-expiry-days'." (interactive "P") ! (gnus-summary-score-crossposting (- (gnus-score-default level)) (current-time-string))) (defun gnus-summary-temporarily-lower-by-thread (level) "Temporarily lower score by LEVEL for current thread. ! See `gnus-kill-expiry-days'." (interactive "P") (gnus-summary-score-entry ! "references" (gnus-summary-header "id") nil (- (gnus-score-default level)) (current-time-string))) (defun gnus-summary-lower-by-subject (level) --- 8376,8409 ---- (defun gnus-summary-temporarily-lower-by-author (level) "Temporarily lower score by LEVEL for current author. ! See `gnus-score-expiry-days'." (interactive "P") (gnus-summary-score-entry "from" (gnus-summary-header "from") nil (- (gnus-score-default level)) (current-time-string) t)) + (defun gnus-summary-temporarily-lower-by-id (level) + "Temporarily lower score by LEVEL for current message-id. + See `gnus-score-expiry-days'." + (interactive "P") + (gnus-summary-score-entry + "message-id" (gnus-summary-header "message-id") + nil (- (gnus-score-default level)) + (current-time-string))) + (defun gnus-summary-temporarily-lower-by-xref (level) "Temporarily lower score by LEVEL for current xref. ! See `gnus-score-expiry-days'." (interactive "P") ! (gnus-summary-score-crossposting ! (- (gnus-score-default level)) (current-time-string))) (defun gnus-summary-temporarily-lower-by-thread (level) "Temporarily lower score by LEVEL for current thread. ! See `gnus-score-expiry-days'." (interactive "P") (gnus-summary-score-entry ! "references" (gnus-summary-header "message-id") nil (- (gnus-score-default level)) (current-time-string))) (defun gnus-summary-lower-by-subject (level) *************** *** 8372,8378 **** "Lower score by LEVEL for current author." (interactive "P") (gnus-summary-score-entry ! "from" (gnus-summary-header "from") nil (- (gnus-score-default level)) nil t)) (defun gnus-summary-lower-by-xref (level) "Lower score by LEVEL for current xref." --- 8418,8432 ---- "Lower score by LEVEL for current author." (interactive "P") (gnus-summary-score-entry ! "from" (gnus-summary-header "from") nil ! (- (gnus-score-default level)) nil t)) ! ! (defun gnus-summary-lower-by-id (level) ! "Lower score by LEVEL for current message-id." ! (interactive "P") ! (gnus-summary-score-entry ! "message-id" (gnus-summary-header "message-id") nil ! (- (gnus-score-default level)) nil)) (defun gnus-summary-lower-by-xref (level) "Lower score by LEVEL for current xref." *************** *** 8382,8396 **** (defun gnus-summary-lower-followups-to-author (level) "Lower score by LEVEL for all followups to the current author." (interactive "P") ! (gnus-kill-file-lower-followups-to-author ! (gnus-score-default level) ! (let ((article (gnus-summary-article-number))) ! (if article (gnus-get-header-by-number article) ! (error "No article on current line"))))) (defun gnus-summary-temporarily-raise-by-subject (level) "Temporarily raise score by LEVEL for current subject. ! See `gnus-kill-expiry-days'." (interactive "P") (gnus-summary-score-entry "subject" (gnus-simplify-subject-re (gnus-summary-header "subject")) --- 8436,8447 ---- (defun gnus-summary-lower-followups-to-author (level) "Lower score by LEVEL for all followups to the current author." (interactive "P") ! (gnus-summary-raise-followups-to-author ! (- (gnus-score-default level)))) (defun gnus-summary-temporarily-raise-by-subject (level) "Temporarily raise score by LEVEL for current subject. ! See `gnus-score-expiry-days'." (interactive "P") (gnus-summary-score-entry "subject" (gnus-simplify-subject-re (gnus-summary-header "subject")) *************** *** 8398,8420 **** (defun gnus-summary-temporarily-raise-by-author (level) "Temporarily raise score by LEVEL for current author. ! See `gnus-kill-expiry-days'." (interactive "P") (gnus-summary-score-entry "from" (gnus-summary-header "from") nil level (current-time-string) t)) (defun gnus-summary-temporarily-raise-by-xref (level) "Temporarily raise score by LEVEL for current xref. ! See `gnus-kill-expiry-days'." (interactive "P") (gnus-summary-score-crossposting level (current-time-string))) (defun gnus-summary-temporarily-raise-by-thread (level) "Temporarily raise score by LEVEL for current thread. ! See `gnus-kill-expiry-days'." (interactive "P") (gnus-summary-score-entry ! "references" (gnus-summary-header "id") nil level (current-time-string))) (defun gnus-summary-raise-by-subject (level) --- 8449,8479 ---- (defun gnus-summary-temporarily-raise-by-author (level) "Temporarily raise score by LEVEL for current author. ! See `gnus-score-expiry-days'." (interactive "P") (gnus-summary-score-entry "from" (gnus-summary-header "from") nil level (current-time-string) t)) + (defun gnus-summary-temporarily-raise-by-id (level) + "Temporarily raise score by LEVEL for current message-id. + See `gnus-score-expiry-days'." + (interactive "P") + (gnus-summary-score-entry + "message-id" (gnus-summary-header "message-id") + nil level (current-time-string))) + (defun gnus-summary-temporarily-raise-by-xref (level) "Temporarily raise score by LEVEL for current xref. ! See `gnus-score-expiry-days'." (interactive "P") (gnus-summary-score-crossposting level (current-time-string))) (defun gnus-summary-temporarily-raise-by-thread (level) "Temporarily raise score by LEVEL for current thread. ! See `gnus-score-expiry-days'." (interactive "P") (gnus-summary-score-entry ! "references" (gnus-summary-header "message-id") nil level (current-time-string))) (defun gnus-summary-raise-by-subject (level) *************** *** 8430,8467 **** (gnus-summary-score-entry "from" (gnus-summary-header "from") nil level nil t)) (defun gnus-summary-raise-by-xref (level) "Raise score by LEVEL for current xref." (interactive "P") (gnus-summary-score-crossposting level nil)) - (defun gnus-summary-edit-global-kill () - "Edit a global score file." - (interactive) - (setq gnus-current-kill-article (gnus-summary-article-number)) - (gnus-kill-file-edit-file nil) ;Nil stands for global score file. - (message - (substitute-command-keys - "Editing a global score file (Type \\[gnus-kill-file-exit] to exit)"))) - (defun gnus-summary-raise-followups-to-author (level) "Raise score by LEVEL for all followups to the current author." (interactive "P") (gnus-kill-file-raise-followups-to-author ! (gnus-score-default level) ! (let ((article (gnus-summary-article-number))) ! (if article (gnus-get-header-by-number article) ! (error "No article on current line"))))) (defun gnus-summary-edit-local-kill () "Edit a local score file applied to the current newsgroup." (interactive) ! (setq gnus-current-kill-article (gnus-summary-article-number)) ! (gnus-kill-file-edit-file gnus-newsgroup-name) ! (message ! (substitute-command-keys ! "Editing a local score file (Type \\[gnus-kill-file-exit] to exit)"))) ! ;;; --- 8489,8531 ---- (gnus-summary-score-entry "from" (gnus-summary-header "from") nil level nil t)) + (defun gnus-summary-raise-by-id (level) + "Raise score by LEVEL for current message-id." + (interactive "P") + (gnus-summary-score-entry + "message-id" (gnus-summary-header "message-id") nil level nil)) + (defun gnus-summary-raise-by-xref (level) "Raise score by LEVEL for current xref." (interactive "P") (gnus-summary-score-crossposting level nil)) (defun gnus-summary-raise-followups-to-author (level) "Raise score by LEVEL for all followups to the current author." (interactive "P") + (let ((article (gnus-summary-article-number))) + (if article (setq gnus-current-headers (gnus-get-header-by-number article)) + (error "No article on current line"))) (gnus-kill-file-raise-followups-to-author ! (gnus-score-default level))) ! ! ;; Summary kill commands. ! ! (defun gnus-summary-edit-global-kill (article) ! "Edit the global score file." ! (interactive (list (gnus-summary-article-number))) ! (gnus-group-edit-global-kill article)) (defun gnus-summary-edit-local-kill () "Edit a local score file applied to the current newsgroup." (interactive) ! (setq gnus-current-headers ! (gnus-gethash ! (int-to-string (gnus-summary-article-number)) ! gnus-newsgroup-headers-hashtb-by-number)) ! (gnus-set-global-variables) ! (gnus-group-edit-local-kill ! (gnus-summary-article-number) gnus-newsgroup-name)) ;;; *************** *** 8474,8484 **** (suppress-keymap gnus-article-mode-map) (define-key gnus-article-mode-map " " 'gnus-article-next-page) (define-key gnus-article-mode-map "\177" 'gnus-article-prev-page) ! (define-key gnus-article-mode-map "\C-x^" 'gnus-article-refer-article) (define-key gnus-article-mode-map "h" 'gnus-article-show-summary) (define-key gnus-article-mode-map "s" 'gnus-article-show-summary) ! (define-key gnus-article-mode-map "\C-xm" 'gnus-article-mail) ! (define-key gnus-article-mode-map "\C-xM" 'gnus-article-mail-with-original) (define-key gnus-article-mode-map "?" 'gnus-article-describe-briefly) ;; Duplicate almost all summary keystrokes in the article mode map. --- 8538,8548 ---- (suppress-keymap gnus-article-mode-map) (define-key gnus-article-mode-map " " 'gnus-article-next-page) (define-key gnus-article-mode-map "\177" 'gnus-article-prev-page) ! (define-key gnus-article-mode-map "\C-c^" 'gnus-article-refer-article) (define-key gnus-article-mode-map "h" 'gnus-article-show-summary) (define-key gnus-article-mode-map "s" 'gnus-article-show-summary) ! (define-key gnus-article-mode-map "\C-c\C-m" 'gnus-article-mail) ! (define-key gnus-article-mode-map "\C-c\C-M" 'gnus-article-mail-with-original) (define-key gnus-article-mode-map "?" 'gnus-article-describe-briefly) ;; Duplicate almost all summary keystrokes in the article mode map. *************** *** 8510,8518 **** \\[gnus-article-mail]\t Send a reply to the address near point \\[gnus-article-mail-with-original]\t Send a reply to the address near point; include the original article \\[gnus-article-describe-briefly]\t Describe the current mode briefly ! \\[gnus-info-find-node]\t Go to the Gnus info node ! ! " (interactive) (if gnus-visual (gnus-article-make-menu-bar)) (kill-all-local-variables) --- 8574,8580 ---- \\[gnus-article-mail]\t Send a reply to the address near point \\[gnus-article-mail-with-original]\t Send a reply to the address near point; include the original article \\[gnus-article-describe-briefly]\t Describe the current mode briefly ! \\[gnus-info-find-node]\t Go to the Gnus info node" (interactive) (if gnus-visual (gnus-article-make-menu-bar)) (kill-all-local-variables) *************** *** 8646,8651 **** --- 8708,8715 ---- (save-excursion (set-buffer summary-buffer) (setq gnus-last-article gnus-current-article + gnus-newsgroup-history (cons gnus-current-article + gnus-newsgroup-history) gnus-current-article 0 gnus-current-headers nil gnus-article-current nil) *************** *** 8661,8671 **** ;; `gnus-current-article' must be an article number. (save-excursion (set-buffer summary-buffer) ! (setq gnus-last-article gnus-current-article) ! (setq gnus-current-article article) ! (setq gnus-current-headers ! (gnus-get-header-by-number gnus-current-article)) ! (setq gnus-article-current (cons gnus-newsgroup-name gnus-current-article)) (run-hooks 'gnus-mark-article-hook) (gnus-set-mode-line 'summary) --- 8725,8737 ---- ;; `gnus-current-article' must be an article number. (save-excursion (set-buffer summary-buffer) ! (setq gnus-last-article gnus-current-article ! gnus-newsgroup-history (cons gnus-current-article ! gnus-newsgroup-history) ! gnus-current-article article ! gnus-current-headers ! (gnus-get-header-by-number gnus-current-article) ! gnus-article-current (cons gnus-newsgroup-name gnus-current-article)) (run-hooks 'gnus-mark-article-hook) (gnus-set-mode-line 'summary) *************** *** 9015,9022 **** (point))))) (defun gnus-gmt-to-local () ! "Rewrite Date: field described in GMT to local in current buffer. ! The variable gnus-local-timezone is used for local time zone. Intended to be used with gnus-article-prepare-hook." (save-excursion (save-restriction --- 9081,9087 ---- (point))))) (defun gnus-gmt-to-local () ! "Rewrite Date header described in GMT to local in current buffer. Intended to be used with gnus-article-prepare-hook." (save-excursion (save-restriction *************** *** 9031,9037 **** (delete-region (match-beginning 1) (match-end 1)) (insert (timezone-make-date-arpa-standard ! date nil gnus-local-timezone))))))) ;; Article mode commands --- 9096,9102 ---- (delete-region (match-beginning 1) (match-end 1)) (insert (timezone-make-date-arpa-standard ! date nil (current-time-zone)))))))) ;; Article mode commands *************** *** 9187,9294 **** ;;; ! ;;; Gnus Score File Mode ;;; (if gnus-kill-file-mode-map nil (setq gnus-kill-file-mode-map (copy-keymap emacs-lisp-mode-map)) ! (define-key gnus-kill-file-mode-map "\C-c\C-x" ! 'gnus-kill-file-set-expunge-below) ! (define-key gnus-kill-file-mode-map "\C-c@" ! 'gnus-kill-file-set-mark-below) ! (define-key gnus-kill-file-mode-map "\C-c\C-k\C-s" ! 'gnus-kill-file-temporarily-lower-by-subject) ! (define-key gnus-kill-file-mode-map "\C-c\C-k\C-a" ! 'gnus-kill-file-temporarily-lower-by-author) ! (define-key gnus-kill-file-mode-map "\C-c\C-k\C-x" ! 'gnus-kill-file-temporarily-lower-by-xref) ! (define-key gnus-kill-file-mode-map "\C-c\C-ks" ! 'gnus-kill-file-lower-by-subject) ! (define-key gnus-kill-file-mode-map "\C-c\C-ka" ! 'gnus-kill-file-lower-by-author) ! (define-key gnus-kill-file-mode-map "\C-c\C-kt" ! 'gnus-kill-file-lower-by-thread) ! (define-key gnus-kill-file-mode-map "\C-c\C-kx" ! 'gnus-kill-file-lower-by-xref) ! (define-key gnus-kill-file-mode-map "\C-c\C-kf" ! 'gnus-kill-file-lower-followups-to-author) ! (define-key gnus-kill-file-mode-map "\C-c\C-i\C-s" ! 'gnus-kill-file-temporarily-raise-by-subject) ! (define-key gnus-kill-file-mode-map "\C-c\C-i\C-a" ! 'gnus-kill-file-temporarily-raise-by-author) ! (define-key gnus-kill-file-mode-map "\C-c\C-i\C-t" ! 'gnus-kill-file-temporarily-raise-by-thread) ! (define-key gnus-kill-file-mode-map "\C-c\C-i\C-x" ! 'gnus-kill-file-temporarily-raise-by-xref) ! (define-key gnus-kill-file-mode-map "\C-c\C-is" ! 'gnus-kill-file-raise-by-subject) ! (define-key gnus-kill-file-mode-map "\C-c\C-ia" ! 'gnus-kill-file-raise-by-author) ! (define-key gnus-kill-file-mode-map "\C-c\C-ix" ! 'gnus-kill-file-raise-by-xref) ! (define-key gnus-kill-file-mode-map "\C-c\C-if" ! 'gnus-kill-file-raise-followups-to-author) ! (define-key gnus-kill-file-mode-map "\C-c\C-a" 'gnus-kill-file-apply-buffer) ! (define-key gnus-kill-file-mode-map "\C-c\C-e" 'gnus-kill-file-apply-last-sexp) ! (define-key gnus-kill-file-mode-map "\C-c\C-c" 'gnus-kill-file-exit) ! (define-key gnus-kill-file-mode-map "\C-c\C-i" 'gnus-info-find-node)) (defun gnus-kill-file-mode () ! "Major mode for editing score files. ! In addition to Emacs-Lisp mode, the following commands are available: ! \\[gnus-kill-file-set-expunge-below] Automatically expunge articles below LEVEL. ! \\[gnus-kill-file-set-mark-below] Automatically mark articles below LEVEL. ! \\[gnus-kill-file-temporarily-lower-by-author] Insert temporary lower command for current author. ! \\[gnus-kill-file-temporarily-lower-by-thread] Insert temporary lower command for current thread. ! \\[gnus-kill-file-temporarily-lower-by-xref] Insert temporary lower command for current cross-posting. ! \\[gnus-kill-file-lower-by-subject] Insert permanent lower command for current subject. ! \\[gnus-kill-file-lower-by-author] Insert permanent lower command for current author. ! \\[gnus-kill-file-lower-followups-to-author] Insert permanent lower command for followups to the current author. ! \\[gnus-kill-file-lower-by-xref] Insert permanent lower command for current cross-posting. ! \\[gnus-kill-file-temporarily-raise-by-subject] Insert temporary raise command for current subject. ! \\[gnus-kill-file-temporarily-raise-by-author] Insert temporary raise command for current author. ! \\[gnus-kill-file-temporarily-raise-by-thread] Insert temporary raise command for current thread. ! \\[gnus-kill-file-temporarily-raise-by-xref] Insert temporary raise command for current cross-posting. ! \\[gnus-kill-file-raise-by-subject] Insert permanent raise command for current subject. ! \\[gnus-kill-file-raise-by-author] Insert permanent raise command for current author. ! \\[gnus-kill-file-raise-followups-to-author] Insert permanent raise command for followups to the current author. ! \\[gnus-kill-file-raise-by-xref] Insert permanent raise command for current cross-posting. ! \\[gnus-kill-file-apply-buffer] Apply current buffer to selected newsgroup. ! \\[gnus-kill-file-apply-last-sexp] Apply sexp before point to selected newsgroup. ! \\[gnus-kill-file-exit] Save file and exit editing score file. ! \\[gnus-info-find-node] Read Info about score files. ! A score file contains Lisp expressions to be applied to a selected newsgroup. The purpose is to mark articles as read on the basis of ! some set of regexps. A global score file is applied to every ! newsgroup, and a local score file is applied to a specified newsgroup. ! Since a global score file is applied to every newsgroup, for better ! performance use a local one. ! A score file can contain any kind of Emacs Lisp expressions expected ! to be evaluated in the summary buffer. Writing Lisp programs for this purpose is not so easy because the internal working of Gnus must be well-known. For this reason, Gnus provides a general function which does this easily for non-Lisp programmers. ! The `gnus-kill' function executes commands available in summary mode by their key sequences. `gnus-kill' should be called with FIELD, REGEXP and optional COMMAND and ALL. FIELD is a string representing the header field or an empty string. If FIELD is an empty string, the entire article body is searched for. REGEXP is a string which is compared with FIELD value. COMMAND is a string representing a valid ! key sequence in summary mode or Lisp expression. COMMAND defaults to '(gnus-summary-mark-as-read nil \"X\"). Make sure that COMMAND is ! executed in the summary buffer. If the second optional argument ALL is non-nil, the COMMAND is applied to articles which are already marked as read or unread. Articles which are marked are skipped over by default. For example, if you want to mark articles of which subjects contain ! the string `AI' as read, a possible score file may look like: (gnus-kill \"Subject\" \"AI\") --- 9252,9320 ---- ;;; ! ;;; Gnus Kill File Mode ;;; + (defvar gnus-kill-file-mode-map nil) + (if gnus-kill-file-mode-map nil (setq gnus-kill-file-mode-map (copy-keymap emacs-lisp-mode-map)) ! (define-key gnus-kill-file-mode-map ! "\C-c\C-k\C-s" 'gnus-kill-file-kill-by-subject) ! (define-key gnus-kill-file-mode-map ! "\C-c\C-k\C-a" 'gnus-kill-file-kill-by-author) ! (define-key gnus-kill-file-mode-map ! "\C-c\C-k\C-a" 'gnus-kill-file-kill-by-thread) ! (define-key gnus-kill-file-mode-map ! "\C-c\C-k\C-a" 'gnus-kill-file-kill-by-xref) ! (define-key gnus-kill-file-mode-map ! "\C-c\C-a" 'gnus-kill-file-apply-buffer) ! (define-key gnus-kill-file-mode-map ! "\C-c\C-e" 'gnus-kill-file-apply-last-sexp) ! (define-key gnus-kill-file-mode-map ! "\C-c\C-c" 'gnus-kill-file-exit)) (defun gnus-kill-file-mode () ! "Major mode for editing kill files. ! ! If you are using this mode - you probably shouldn't. Kill files ! perform badly and paint with a pretty broad brush. Score files, on ! the other hand, are vastly faster (40x speedup) and give you more ! control over what to do. ! In addition to Emacs-Lisp Mode, the following commands are available: ! \\{gnus-kill-file-mode-map} ! A kill file contains Lisp expressions to be applied to a selected newsgroup. The purpose is to mark articles as read on the basis of ! some set of regexps. A global kill file is applied to every newsgroup, ! and a local kill file is applied to a specified newsgroup. Since a ! global kill file is applied to every newsgroup, for better performance ! use a local one. ! A kill file can contain any kind of Emacs Lisp expressions expected ! to be evaluated in the Summary buffer. Writing Lisp programs for this purpose is not so easy because the internal working of Gnus must be well-known. For this reason, Gnus provides a general function which does this easily for non-Lisp programmers. ! The `gnus-kill' function executes commands available in Summary Mode by their key sequences. `gnus-kill' should be called with FIELD, REGEXP and optional COMMAND and ALL. FIELD is a string representing the header field or an empty string. If FIELD is an empty string, the entire article body is searched for. REGEXP is a string which is compared with FIELD value. COMMAND is a string representing a valid ! key sequence in Summary mode or Lisp expression. COMMAND defaults to '(gnus-summary-mark-as-read nil \"X\"). Make sure that COMMAND is ! executed in the Summary buffer. If the second optional argument ALL is non-nil, the COMMAND is applied to articles which are already marked as read or unread. Articles which are marked are skipped over by default. For example, if you want to mark articles of which subjects contain ! the string `AI' as read, a possible kill file may look like: (gnus-kill \"Subject\" \"AI\") *************** *** 9298,9313 **** (gnus-kill \"Subject\" \"AI\" \"d\") In this example it is assumed that the command ! `gnus-summary-mark-as-read-forward' is assigned to `d' in summary mode. ! It is possible to remove unnecessary headers which are marked with ! `X' in a score file as follows: (gnus-expunge \"X\") ! If the summary buffer is empty after applying score files, Gnus will exit the selected newsgroup normally. If headers which are marked ! with `D' are deleted in a score file, it is impossible to read articles which are marked as read in the previous Gnus sessions. Marks other than `D' should be used for articles which should really be deleted. --- 9324,9339 ---- (gnus-kill \"Subject\" \"AI\" \"d\") In this example it is assumed that the command ! `gnus-summary-mark-as-read-forward' is assigned to `d' in Summary Mode. ! It is possible to delete unnecessary headers which are marked with ! `X' in a kill file as follows: (gnus-expunge \"X\") ! If the Summary buffer is empty after applying kill files, Gnus will exit the selected newsgroup normally. If headers which are marked ! with `D' are deleted in a kill file, it is impossible to read articles which are marked as read in the previous Gnus sessions. Marks other than `D' should be used for articles which should really be deleted. *************** *** 9318,9330 **** (use-local-map gnus-kill-file-mode-map) (set-syntax-table emacs-lisp-mode-syntax-table) (setq major-mode 'gnus-kill-file-mode) ! (setq mode-name "score-file") (lisp-mode-variables nil) (run-hooks 'emacs-lisp-mode-hook 'gnus-kill-file-mode-hook)) (defun gnus-kill-file-edit-file (newsgroup) ! "Begin editing a score file for NEWSGROUP. ! If NEWSGROUP is nil, the global score file is selected." (interactive "sNewsgroup: ") (let ((file (gnus-newsgroup-kill-file newsgroup))) (gnus-make-directory (file-name-directory file)) --- 9344,9356 ---- (use-local-map gnus-kill-file-mode-map) (set-syntax-table emacs-lisp-mode-syntax-table) (setq major-mode 'gnus-kill-file-mode) ! (setq mode-name "Kill") (lisp-mode-variables nil) (run-hooks 'emacs-lisp-mode-hook 'gnus-kill-file-mode-hook)) (defun gnus-kill-file-edit-file (newsgroup) ! "Begin editing a kill file for NEWSGROUP. ! If NEWSGROUP is nil, the global kill file is selected." (interactive "sNewsgroup: ") (let ((file (gnus-newsgroup-kill-file newsgroup))) (gnus-make-directory (file-name-directory file)) *************** *** 9369,9539 **** (and (buffer-modified-p) (save-buffer)) (kill-buffer (current-buffer))))))) ! (defun gnus-article-fetch-field (field) ! (save-excursion ! (set-buffer gnus-article-buffer) ! (save-restriction ! (widen) ! (goto-char 1) ! (narrow-to-region 1 (save-excursion ! (search-forward "\n\n" nil t) (point))) ! (goto-char 1) ! (prog1 ! (mail-fetch-field field) ! (widen))))) ! ! (defun gnus-kill-file-enter-kill (field regexp level date edit) ! ;; Enter score file entry. ! ;; FIELD: String containing the name of the header field to score. ! ;; REGEXP: The string to score. ! ;; LEVEL: How much to raise the score by. ! ;; DATE: A date string for expire score or nil for permanent kills. ! ;; EDIT: Allow the user to edit REGEXP iff non-nil. (save-excursion ! (gnus-kill-set-kill-buffer) ! (goto-char (point-min)) ! (let ((regexp ! (if edit (read-string ! (format "Add %d to articles with %s matching: " ! level (downcase field)) ! regexp) ! regexp)) ! entry string kill beg) ! (setq entry (if date (cons regexp date) regexp) ! string (format "(gnus-raise %S (quote %S) %S)\n" ! field entry level)) ! (while (and (setq beg (point)) ! (condition-case nil ! (setq kill (read (current-buffer))) ! (error nil)) ! (or (not (eq (nth 0 kill) 'gnus-raise)) ! (not (string= (downcase (nth 1 kill)) (downcase field))) ! (not (eq (nth 3 kill) level)))) ! (setq kill nil)) ! (if (not kill) ! (progn ! (goto-char (point-min)) ! (insert string)) ! (let ((list (nth 2 kill))) ! (if (and (listp list) (eq 'quote (car list))) ! (setq list (car (cdr list)))) ! (setcar ! (nthcdr 2 kill) ! (if (and (listp list) (listp (cdr list))) ! (list 'quote (cons entry list)) ! (list 'quote (list entry list))))) ! (delete-region beg (point)) ! (insert (gnus-pp-gnus-kill kill))) ! (gnus-kill-file-apply-string string)) ! ;; Added by Sudish Joseph . ! (or edit ! (message "Added kill file entry %s: %s" (downcase field) regexp)))) ! ! (defun gnus-kill-file-set-variable (symbol value) ! ;; Set SYMBOL to VALUE in the score file. ! (save-excursion ! (gnus-kill-set-kill-buffer) ! (goto-char (point-min)) ! (let ((string (format "(setq %S %S)\n" symbol value)) ! kill beg) ! (while (and (setq beg (point)) ! (condition-case nil ! (setq kill (read (current-buffer))) ! (error nil)) ! (or (not (eq (nth 0 kill) 'setq)) ! (not (eq (nth 1 kill) symbol)))) ! (setq kill nil)) ! (if (not kill) ! (progn ! (goto-char (point-min)) ! (insert string)) ! (delete-region beg (point)) ! (insert string))))) ! (defun gnus-kill-file-set-expunge-below (level) ! "Automatically expunge articles with score below LEVEL." ! (interactive "P") ! (setq level (if level ! (prefix-numeric-value level) ! (or gnus-summary-default-score 0))) ! (if (eq major-mode 'gnus-summary-mode) ! (progn ! (gnus-score-set 'expunge level) ! (gnus-score-set 'touched t)) ! (gnus-kill-file-set-variable 'expunge-below level)) ! (message "Set expunge below level to %d." level)) ! ! (defun gnus-kill-file-set-mark-below (level) ! "Automatically mark articles with score below LEVEL as read." ! (interactive "P") ! (setq level (if level ! (prefix-numeric-value level) ! (or gnus-summary-default-score 0))) ! (if (eq major-mode 'gnus-summary-mode) ! (progn ! (gnus-score-set 'mark level) ! (gnus-score-set 'touched t) ! (gnus-summary-set-mark-below level)) ! (gnus-kill-file-set-variable 'mark-below level)) ! (message "Set mark below level to %d." level)) ! ! (defun gnus-kill-file-temporarily-raise-by-subject (level &optional header) ! "Temporarily raise score by LEVEL for current subject. ! See `gnus-kill-expiry-days'." ! (interactive "p") ! (gnus-kill-file-raise-by-subject level header (current-time-string))) ! ! (defun gnus-kill-file-temporarily-raise-by-author (level &optional header) ! "Temporarily raise score by LEVEL for current author. ! See `gnus-kill-expiry-days'." ! (interactive "p") ! (gnus-kill-file-raise-by-author level header (current-time-string))) ! ! (defun gnus-kill-file-temporarily-raise-by-thread (level &optional header) ! "Temporarily raise score by LEVEL for current thread. ! See `gnus-kill-expiry-days'." ! (interactive "p") ! (gnus-kill-file-enter-kill ! "References" ! (regexp-quote (header-id (or header gnus-current-headers))) ! level ! (current-time-string) ! nil)) ! ! (defun gnus-kill-file-temporarily-raise-by-xref (level &optional header) ! "Insert temporary score commands for articles that have been crossposted. ! By default use the current crossposted groups. ! See `gnus-kill-expiry-days'." ! (interactive "p") ! (gnus-kill-file-raise-by-xref level header (current-time-string))) ! ! (defun gnus-kill-file-raise-by-subject (level &optional header date) ! "Raise score by LEVEL for current subject." ! (interactive "p") (gnus-kill-file-enter-kill ! "Subject" (regexp-quote ! (gnus-simplify-subject ! (header-subject (or header gnus-current-headers)))) ! level ! date ! t)) ! (defun gnus-kill-file-raise-by-author (level &optional header date) ! "Raise score by LEVEL for current author." ! (interactive "p") (gnus-kill-file-enter-kill ! "From" ! (regexp-quote (header-from (or header gnus-current-headers))) ! level ! date ! t)) ! (defun gnus-kill-file-raise-by-xref (level &optional header date) ! "Raise score by LEVEL for articles that have been crossposted. ! By default use the current crossposted groups." (interactive "p") ! (let ((xref (header-xref (or header gnus-current-headers))) (start 0) group) (if xref --- 9395,9435 ---- (and (buffer-modified-p) (save-buffer)) (kill-buffer (current-buffer))))))) ! (defun gnus-kill-file-enter-kill (field regexp) ! ;; Enter kill file entry. ! ;; FIELD: String containing the name of the header field to kill. ! ;; REGEXP: The string to kill. (save-excursion ! (let (string) ! (gnus-kill-set-kill-buffer) ! (goto-char (point-max)) ! (insert (setq string (format "(gnus-kill %S %S)\n" field regexp))) ! (gnus-kill-file-apply-string string)))) ! (defun gnus-kill-file-kill-by-subject () ! "Kill by subject." ! (interactive) (gnus-kill-file-enter-kill ! "Subject" (regexp-quote ! (gnus-simplify-subject (header-subject gnus-current-headers))))) ! (defun gnus-kill-file-kill-by-author () ! "Kill by author." ! (interactive) (gnus-kill-file-enter-kill ! "From" (regexp-quote (header-from gnus-current-headers)))) ! (defun gnus-kill-file-kill-by-thread () ! "Kill by author." (interactive "p") ! (gnus-kill-file-enter-kill ! "References" (regexp-quote (header-id gnus-current-headers)))) ! ! (defun gnus-kill-file-kill-by-xref () ! "Kill by Xref." ! (interactive) ! (let ((xref (header-xref gnus-current-headers)) (start 0) group) (if xref *************** *** 9544,9620 **** (substring xref (match-beginning 1) (match-end 1))) gnus-newsgroup-name)) (gnus-kill-file-enter-kill ! "Xref" ! (concat " " (regexp-quote group) ":") ! level ! date ! t)))))) ! (defun gnus-kill-file-raise-followups-to-author ! (level &optional header) "Raise score for all followups to the current author." ! (interactive) ! (let ((name (header-from (or header gnus-current-headers))) ! (string)) (save-excursion (gnus-kill-set-kill-buffer) (goto-char (point-min)) (setq name (read-string (concat "Add " level " to followup articles to: ") (regexp-quote name))) ! (setq string ! (format "(gnus-kill %S %S '(gnus-summary-temporarily-raise-by-thread %S))\n" ! "From" name level)) (insert string) (gnus-kill-file-apply-string string)) (message "Added permanent score file entry for followups to %s." name))) - (defun gnus-kill-file-temporarily-lower-by-subject (level &optional header) - "Temporarily lower score by LEVEL for current subject. - See `gnus-kill-expiry-days'." - (interactive "p") - (gnus-kill-file-lower-by-subject level header (current-time-string))) - - (defun gnus-kill-file-temporarily-lower-by-author (level &optional header) - "Temporarily lower score by LEVEL for current author. - See `gnus-kill-expiry-days'." - (interactive "p") - (gnus-kill-file-lower-by-author level header (current-time-string))) - - (defun gnus-kill-file-temporarily-lower-by-thread (level &optional header) - "Temporarily lower score by LEVEL for current thread. - See `gnus-kill-expiry-days'." - (interactive "p") - (gnus-kill-file-temporarily-raise-by-thread (- (gnus-score-default level)) header)) - - (defun gnus-kill-file-temporarily-lower-by-xref (level &optional header) - "Insert temporary score commands for articles that have been crossposted. - By default use the current crossposted groups. - See `gnus-kill-expiry-days'." - (interactive "p") - (gnus-kill-file-lower-by-xref level header (current-time-string))) - - (defun gnus-kill-file-lower-by-subject (level &optional header date) - "Lower score by LEVEL for current subject." - (interactive "p") - (gnus-kill-file-raise-by-subject (- (gnus-score-default level)) header date)) - - (defun gnus-kill-file-lower-by-author (level &optional header date) - "Lower score by LEVEL for current author." - (interactive "p") - (gnus-kill-file-raise-by-author (- (gnus-score-default level)) header date)) - - (defun gnus-kill-file-lower-by-xref (level &optional header date) - "Lower score by LEVEL for articles that have been crossposted. - By default use the current crossposted groups." - (gnus-kill-file-raise-by-xref (- (gnus-score-default level)) header date)) - - (defun gnus-kill-file-lower-followups-to-author - (level &optional header) - "Lower score for all followups to the current author." - (interactive "p") - (gnus-kill-file-raise-followups-to-author (- (gnus-score-default level)) header)) - (defun gnus-kill-file-apply-buffer () "Apply current buffer to current newsgroup." (interactive) --- 9440,9468 ---- (substring xref (match-beginning 1) (match-end 1))) gnus-newsgroup-name)) (gnus-kill-file-enter-kill ! "Xref" (concat " " (regexp-quote group) ":")))) ! (gnus-kill-file-enter-kill "Xref" "")))) ! (defun gnus-kill-file-raise-followups-to-author (level) "Raise score for all followups to the current author." ! (interactive "p") ! (let ((name (header-from gnus-current-headers)) ! string) (save-excursion (gnus-kill-set-kill-buffer) (goto-char (point-min)) (setq name (read-string (concat "Add " level " to followup articles to: ") (regexp-quote name))) ! (setq ! string ! (format ! "(gnus-kill %S %S '(gnus-summary-temporarily-raise-by-thread %S))\n" ! "From" name level)) (insert string) (gnus-kill-file-apply-string string)) (message "Added permanent score file entry for followups to %s." name))) (defun gnus-kill-file-apply-buffer () "Apply current buffer to current newsgroup." (interactive) *************** *** 9649,9655 **** (ding) (message "No newsgroup is selected."))) (defun gnus-kill-file-exit () ! "Save a score file, then return to the previous buffer." (interactive) (save-buffer) (let ((killbuf (current-buffer))) --- 9497,9503 ---- (ding) (message "No newsgroup is selected."))) (defun gnus-kill-file-exit () ! "Save a kill file, then return to the previous buffer." (interactive) (save-buffer) (let ((killbuf (current-buffer))) *************** *** 9667,9677 **** ;; Basic ideas by emv@math.lsa.umich.edu (Edward Vielmetti) (defalias 'gnus-batch-kill 'gnus-batch-score) ;;;###autoload (defun gnus-batch-score () "Run batched scoring. ! Usage: emacs -batch -l gnus -f gnus-batch-kill ... Newsgroups is a list of strings in Bnews format. If you want to score the comp hierarchy, you'd say \"comp.all\". If you would not like to score the alt hierarchy, you'd say \"!alt.all\"." --- 9515,9526 ---- ;; Basic ideas by emv@math.lsa.umich.edu (Edward Vielmetti) + ;;;###autoload (defalias 'gnus-batch-kill 'gnus-batch-score) ;;;###autoload (defun gnus-batch-score () "Run batched scoring. ! Usage: emacs -batch -l gnus -f gnus-batch-score ... Newsgroups is a list of strings in Bnews format. If you want to score the comp hierarchy, you'd say \"comp.all\". If you would not like to score the alt hierarchy, you'd say \"!alt.all\"." *************** *** 9713,9726 **** (switch-to-buffer gnus-group-buffer) (gnus-group-save-newsrc))) ! ;; For score files (defun gnus-Newsgroup-kill-file (newsgroup) ! "Return the name of a score file for NEWSGROUP. ! If NEWSGROUP is nil, return the global score file instead." (cond ((or (null newsgroup) (string-equal newsgroup "")) ! ;; The global score file is placed at top of the directory. (expand-file-name gnus-kill-file-name (or gnus-kill-files-directory "~/News"))) (gnus-use-long-file-name --- 9562,9575 ---- (switch-to-buffer gnus-group-buffer) (gnus-group-save-newsrc))) ! ;; For kill files (defun gnus-Newsgroup-kill-file (newsgroup) ! "Return the name of a kill file for NEWSGROUP. ! If NEWSGROUP is nil, return the global kill file instead." (cond ((or (null newsgroup) (string-equal newsgroup "")) ! ;; The global kill file is placed at top of the directory. (expand-file-name gnus-kill-file-name (or gnus-kill-files-directory "~/News"))) (gnus-use-long-file-name *************** *** 9735,9742 **** (or gnus-kill-files-directory "~/News"))))) (defun gnus-newsgroup-kill-file (newsgroup) ! "Return the name of a score file name for NEWSGROUP. ! If NEWSGROUP is nil, return the global score file name instead." (cond ((or (null newsgroup) (string-equal newsgroup "")) ;; The global KILL file is placed at top of the directory. --- 9584,9591 ---- (or gnus-kill-files-directory "~/News"))))) (defun gnus-newsgroup-kill-file (newsgroup) ! "Return the name of a kill file name for NEWSGROUP. ! If NEWSGROUP is nil, return the global kill file name instead." (cond ((or (null newsgroup) (string-equal newsgroup "")) ;; The global KILL file is placed at top of the directory. *************** *** 9752,9762 **** "/" gnus-kill-file-name) (or gnus-kill-files-directory "~/News"))))) - (defalias 'gnus-expunge 'gnus-summary-remove-lines-marked-with) (defun gnus-apply-kill-file () ! "Apply a score file to the current newsgroup. Returns the number of articles marked as read." (let* ((kill-files (list (gnus-newsgroup-kill-file nil) (gnus-newsgroup-kill-file gnus-newsgroup-name))) --- 9601,9610 ---- "/" gnus-kill-file-name) (or gnus-kill-files-directory "~/News"))))) (defalias 'gnus-expunge 'gnus-summary-remove-lines-marked-with) (defun gnus-apply-kill-file () ! "Apply a kill file to the current newsgroup. Returns the number of articles marked as read." (let* ((kill-files (list (gnus-newsgroup-kill-file nil) (gnus-newsgroup-kill-file gnus-newsgroup-name))) *************** *** 9810,9822 **** (progn (delete-region beg (point)) (insert (or (eval form) ""))) ! (eval form))) (and (buffer-modified-p) (save-buffer)) (message "Processing kill file %s...done" (car kill-files)))) (setq kill-files (cdr kill-files))))) - ;; (if expunge-below (gnus-summary-expunge-below expunge-below)) - (let (gnus-summary-inhibit-highlight) - (gnus-summary-set-mark-below mark-below)) (if beg (let ((nunreads (- unreads (length gnus-newsgroup-unreads)))) (or (eq nunreads 0) --- 9658,9669 ---- (progn (delete-region beg (point)) (insert (or (eval form) ""))) ! (condition-case () ! (eval form) ! (error nil)))) (and (buffer-modified-p) (save-buffer)) (message "Processing kill file %s...done" (car kill-files)))) (setq kill-files (cdr kill-files))))) (if beg (let ((nunreads (- unreads (length gnus-newsgroup-unreads)))) (or (eq nunreads 0) *************** *** 9852,9858 **** (if (zerop (gnus-execute field (car kill-list) command nil (not all))) (if (> (gnus-days-between date (cdr kill-list)) ! gnus-kill-expiry-days) (setq regexp nil)) (setcdr kill-list date)) (while (setq kill (car kill-list)) --- 9699,9705 ---- (if (zerop (gnus-execute field (car kill-list) command nil (not all))) (if (> (gnus-days-between date (cdr kill-list)) ! gnus-score-expiry-days) (setq regexp nil)) (setcdr kill-list date)) (while (setq kill (car kill-list)) *************** *** 9863,9869 **** (if (zerop (gnus-execute field (car kill) command nil (not all))) (if (> (gnus-days-between date kdate) ! gnus-kill-expiry-days) ;; Time limit has been exceeded, so we ;; remove the match. (if prev --- 9710,9716 ---- (if (zerop (gnus-execute field (car kill) command nil (not all))) (if (> (gnus-days-between date kdate) ! gnus-score-expiry-days) ;; Time limit has been exceeded, so we ;; remove the match. (if prev *************** *** 9876,9882 **** (setq prev kill-list) (setq kill-list (cdr kill-list)))) (gnus-execute field kill-list command nil (not all)))))) ! (if regexp (gnus-pp-gnus-kill (nconc (list 'gnus-kill field (if (consp regexp) (list 'quote regexp) regexp)) --- 9723,9729 ---- (setq prev kill-list) (setq kill-list (cdr kill-list)))) (gnus-execute field kill-list command nil (not all)))))) ! (if (and (eq major-mode 'gnus-kill-file-mode) regexp) (gnus-pp-gnus-kill (nconc (list 'gnus-kill field (if (consp regexp) (list 'quote regexp) regexp)) *************** *** 9975,9991 **** (setq article (gnus-summary-search-subject backward (not ignore-marked)))) ! (and (memq article gnus-newsgroup-kill-headers) (gnus-execute-1 function regexp form (gnus-get-header-by-number article)) (setq killed-no (1+ killed-no)))) killed-no))) ! ;;; Gnus Score File ;; All score code written by Per Abrahamsen . (defun gnus-score-default (level) (if level (prefix-numeric-value level) gnus-score-interactive-default-score)) --- 9822,9862 ---- (setq article (gnus-summary-search-subject backward (not ignore-marked)))) ! (and (or (null gnus-newsgroup-kill-headers) ! (memq article gnus-newsgroup-kill-headers)) (gnus-execute-1 function regexp form (gnus-get-header-by-number article)) (setq killed-no (1+ killed-no)))) killed-no))) ! ;;; ! ;;; Gnus Score Files ! ;;; ;; All score code written by Per Abrahamsen . + ;; Added by Per Abrahamsen . + (defun gnus-score-set-mark-below (score) + "Automatically mark articles with score below SCORE as read." + (interactive + (list (or (and current-prefix-arg (prefix-numeric-value current-prefix-arg)) + (string-to-int (read-string "Mark below: "))))) + (setq score (or score gnus-summary-default-score 0)) + (gnus-score-set 'mark (list score)) + (gnus-score-set 'touched '(t)) + (setq gnus-summary-mark-below score) + (gnus-summary-update-lines)) + + (defun gnus-score-set-expunge-below (score) + "Automatically expunge articles with score below SCORE." + (interactive + (list (or (and current-prefix-arg (prefix-numeric-value current-prefix-arg)) + (string-to-int (read-string "Mark below: "))))) + (setq score (or score gnus-summary-default-score 0)) + (gnus-score-set 'expunge (list score)) + (gnus-score-set 'touched '(t))) + (defun gnus-score-default (level) (if level (prefix-numeric-value level) gnus-score-interactive-default-score)) *************** *** 9999,10010 **** (gnus-score-load (gnus-score-file-name gnus-newsgroup-name)) gnus-score-alist))) (entry (assoc symbol alist))) ! (cond (entry (setcdr entry value)) ((null alist) (error "Empty alist")) (t ! (setcdr alist (cons (cons symbol value) (cdr alist))))))) (defun gnus-score-get (symbol &optional alist) ;; Get SYMBOL's definition in ALIST. --- 9870,9885 ---- (gnus-score-load (gnus-score-file-name gnus-newsgroup-name)) gnus-score-alist))) (entry (assoc symbol alist))) ! (cond ((gnus-score-get 'read-only alist) ! ;; This is a read-only score file, so we do nothing. ! ) ! (entry (setcdr entry value)) ((null alist) (error "Empty alist")) (t ! (setcdr alist ! (cons (cons symbol value) (cdr alist))))))) (defun gnus-score-get (symbol &optional alist) ;; Get SYMBOL's definition in ALIST. *************** *** 10020,10050 **** "Change current score alist." (interactive (list (completing-read "Score file: " gnus-score-cache))) ! (setq gnus-score-alist (cdr (assoc file gnus-score-cache)))) ! ! (defun gnus-score-edit-file (group) ! "Edit score file for GROUP." ! (interactive (list (read-string "Edit SCORE file for: " ! (cons (or gnus-newsgroup-name "") 1)))) ! (and (get-buffer gnus-summary-buffer) (gnus-score-save)) ! (find-file (gnus-score-file-name group)) ! (emacs-lisp-mode)) (defun gnus-score-load-file (file) ;; Load score file FILE. Returns a list a retrieved score-alists. (let ((cached (assoc file gnus-score-cache)) lists) (if cached ;; The score file was already loaded. (setq gnus-score-alist (cdr cached)) ;; We load the score file. (setq gnus-score-alist nil) ! (load file t nil t) ;; We add '(touched) to the alist to signify that it hasn't been ;; touched (yet). (if (not (assq 'touched gnus-score-alist)) ! (setq gnus-score-alist (cons (copy-alist '(touched . nil)) ! gnus-score-alist))) ;; Update cache. (setq gnus-score-cache (cons (cons file gnus-score-alist) gnus-score-cache))) --- 9895,9935 ---- "Change current score alist." (interactive (list (completing-read "Score file: " gnus-score-cache))) ! (setq gnus-current-score-file file) ! (gnus-score-load-file file)) + (defun gnus-score-edit-file (file) + "Edit score file." + (interactive (list gnus-current-score-file)) + (and (buffer-name gnus-summary-buffer) (gnus-score-save)) + (setq gnus-winconf-edit-score (current-window-configuration)) + (gnus-configure-windows 'article) + (pop-to-buffer (find-file-noselect file)) + (message (substitute-command-keys + "\\\\[gnus-score-edit-done] to save edits")) + (gnus-score-mode)) + (defun gnus-score-load-file (file) ;; Load score file FILE. Returns a list a retrieved score-alists. (let ((cached (assoc file gnus-score-cache)) + (global (member file gnus-internal-global-score-files)) lists) (if cached ;; The score file was already loaded. (setq gnus-score-alist (cdr cached)) ;; We load the score file. (setq gnus-score-alist nil) ! (gnus-score-load-score-alist file) ;; We add '(touched) to the alist to signify that it hasn't been ;; touched (yet). (if (not (assq 'touched gnus-score-alist)) ! (setq gnus-score-alist ! (cons (list 'touched nil) gnus-score-alist))) ! ;; If it is a global score file, we make it read-only. ! (and global ! (not (assq 'read-only gnus-score-alist)) ! (setq gnus-score-alist ! (cons (list 'read-only t) gnus-score-alist))) ;; Update cache. (setq gnus-score-cache (cons (cons file gnus-score-alist) gnus-score-cache))) *************** *** 10053,10087 **** (if (memq t (mapcar (lambda (e) (stringp (car e))) gnus-score-alist)) (setq lists (list gnus-score-alist))) ;; Treat the other possible atoms in the score alist. ! (let ((mark (gnus-score-get 'mark gnus-score-alist)) ! (expunge (gnus-score-get 'expunge gnus-score-alist)) (mark-and-expunge ! (gnus-score-get 'mark-and-expunge gnus-score-alist)) (files (gnus-score-get 'files gnus-score-alist)) (eval (gnus-score-get 'eval gnus-score-alist))) ! (if files ! (setq lists (apply 'append lists ! (mapcar (lambda (file) ! (gnus-score-load-file file)) ! files)))) ! (if eval (eval eval)) ! (setq gnus-summary-mark-below (or mark mark-and-expunge)) (setq gnus-summary-expunge-below (or expunge mark-and-expunge))) lists)) (defun gnus-score-load (file) ;; Load score FILE. - ;; Updates free variables `gnus-score-alist' and `scores'. - (let ((cache (assoc file gnus-score-cache))) (if cache (setq gnus-score-alist (cdr cache)) (setq gnus-score-alist nil) ! (load file t nil t) (or gnus-score-alist (setq gnus-score-alist (copy-alist '((touched . nil))))) (setq gnus-score-cache (cons (cons file gnus-score-alist) gnus-score-cache))))) (defun gnus-score-save () ;; Save all SCORE information. --- 9938,10023 ---- (if (memq t (mapcar (lambda (e) (stringp (car e))) gnus-score-alist)) (setq lists (list gnus-score-alist))) ;; Treat the other possible atoms in the score alist. ! (let ((mark (car (gnus-score-get 'mark gnus-score-alist))) ! (expunge (car (gnus-score-get 'expunge gnus-score-alist))) (mark-and-expunge ! (car (gnus-score-get 'mark-and-expunge gnus-score-alist))) ! (read-only (gnus-score-get 'read-only gnus-score-alist)) (files (gnus-score-get 'files gnus-score-alist)) (eval (gnus-score-get 'eval gnus-score-alist))) ! ;; We do not respect eval and files atoms from global score ! ;; files. ! (and files (not global) ! (setq lists (apply 'append lists ! (mapcar (lambda (file) ! (gnus-score-load-file file)) ! files)))) ! (and eval (not global) (eval eval)) ! (setq gnus-summary-mark-below (or mark mark-and-expunge ! gnus-summary-default-score)) (setq gnus-summary-expunge-below (or expunge mark-and-expunge))) + (setq gnus-current-score-file file) lists)) (defun gnus-score-load (file) ;; Load score FILE. (let ((cache (assoc file gnus-score-cache))) (if cache (setq gnus-score-alist (cdr cache)) (setq gnus-score-alist nil) ! (gnus-score-load-score-alist file) (or gnus-score-alist (setq gnus-score-alist (copy-alist '((touched . nil))))) (setq gnus-score-cache (cons (cons file gnus-score-alist) gnus-score-cache))))) + + (defun gnus-score-remove-from-cache (file) + (setq gnus-score-cache (delq (assoc file gnus-score-cache) + gnus-score-cache))) + + (defun gnus-score-load-score-alist (file) + (let (alist) + (if (file-readable-p file) + (progn + (save-excursion + (set-buffer (get-buffer-create " *gnus work*")) + (buffer-disable-undo (current-buffer)) + (erase-buffer) + (insert-file-contents file) + (goto-char (point-min)) + (setq alist + (condition-case () + (read (current-buffer)) + (error + (progn + (message "Problem with score file %s" file) + (ding) + nil))))) + (if (eq (car alist) 'setq) + (setq gnus-score-alist + (gnus-score-transform-old-to-new alist)) + (setq gnus-score-alist alist)))))) + + (defun gnus-score-transform-old-to-new (alist) + (let* ((alist (nth 2 alist)) + out entry) + (if (eq (car alist) 'quote) + (setq alist (nth 1 alist))) + (while alist + (setq entry (car alist)) + (if (stringp (car entry)) + (let ((scor (cdr entry))) + (setq out (cons entry out)) + (while scor + (setcar scor + (list (car (car scor)) (nth 2 (car scor)) + (and (nth 3 (car scor)) + (gnus-day-number (nth 3 (car scor)))) + (if (nth 1 (car scor)) 'r 's))) + (setq scor (cdr scor)))) + (setq out (cons (list (car entry) (cdr entry)) out))) + (setq alist (cdr alist))) + (cons (list 'touched t) (nreverse out)))) (defun gnus-score-save () ;; Save all SCORE information. *************** *** 10100,10115 **** cache (cdr cache) file (car entry) score (cdr entry)) ! (if (null (gnus-score-get 'touched score)) () - (gnus-score-set 'touched nil score) (setq score (delq (assq 'touched score) score)) (erase-buffer) (let (emacs-lisp-mode-hook) ! (pp (list 'setq 'gnus-score-alist (list 'quote score)) ! (current-buffer))) (make-directory (file-name-directory file) t) ! (write-region (point-min) (point-max) file nil 'silent)))) (kill-buffer (current-buffer))))) (defun gnus-score-headers () --- 10036,10051 ---- cache (cdr cache) file (car entry) score (cdr entry)) ! (if (or (null (gnus-score-get 'touched score)) ! (gnus-score-get 'read-only score) ! (not (file-writable-p file))) () (setq score (delq (assq 'touched score) score)) (erase-buffer) (let (emacs-lisp-mode-hook) ! (pp score (current-buffer))) (make-directory (file-name-directory file) t) ! (write-region (point-min) (point-max) file nil 'silent)))) (kill-buffer (current-buffer))))) (defun gnus-score-headers () *************** *** 10129,10136 **** (length gnus-newsgroup-scored)))) () (let* ((entries gnus-header-index) ! (now (current-time-string)) ! (expire (- (gnus-useful-date now) gnus-kill-expiry-days)) (headers gnus-newsgroup-headers) entry header) (message "Scoring...") --- 10065,10072 ---- (length gnus-newsgroup-scored)))) () (let* ((entries gnus-header-index) ! (now (gnus-day-number (current-time-string))) ! (expire (- now gnus-score-expiry-days)) (headers gnus-newsgroup-headers) entry header) (message "Scoring...") *************** *** 10163,10169 **** ;; Remove the buffer. (kill-buffer (current-buffer))) - (message "Scoring...") ;; Add articles to `gnus-newsgroup-scored'. (while gnus-scores-articles (or (= gnus-summary-default-score (cdr (car gnus-scores-articles))) --- 10099,10104 ---- *************** *** 10233,10248 **** (let* ((rest (cdr entries)) (kill (car rest)) (match (nth 0 kill)) ! (type (nth 1 kill)) ! (score (nth 2 kill)) ! (date (nth 3 kill)) (found nil) (case-fold-search t) arts art) (goto-char (point-min)) ! (while (if type ! (re-search-forward match nil t) ! (search-forward match nil t)) (end-of-line 1) (setq found t arts (get-text-property (point) 'articles)) --- 10168,10184 ---- (let* ((rest (cdr entries)) (kill (car rest)) (match (nth 0 kill)) ! (type (or (nth 3 kill) 's)) ! (score (or (nth 1 kill) gnus-score-interactive-default-score)) ! (date (nth 2 kill)) (found nil) (case-fold-search t) arts art) (goto-char (point-min)) ! (while (cond ((eq type 'r) ! (re-search-forward match nil t)) ! ((eq type 's) ! (search-forward match nil t))) (end-of-line 1) (setq found t arts (get-text-property (point) 'articles)) *************** *** 10254,10263 **** ;; Update expire date (cond ((null date)) ;Permanent entry. (found ;Match, update date. ! (gnus-score-set 'touched t alist) ! (setcar (nthcdr 3 kill) now)) ! ((< (gnus-useful-date date) expire) ;Old entry, remove. ! (gnus-score-set 'touched t alist) (setcdr entries (cdr rest)) (setq rest entries))) (setq entries rest)))))) --- 10190,10199 ---- ;; Update expire date (cond ((null date)) ;Permanent entry. (found ;Match, update date. ! (gnus-score-set 'touched '(t) alist) ! (setcar (nthcdr 2 kill) now)) ! ((< date expire) ;Old entry, remove. ! (gnus-score-set 'touched '(t) alist) (setcdr entries (cdr rest)) (setq rest entries))) (setq entries rest)))))) *************** *** 10268,10279 **** (string-lessp (aref (car a1) gnus-score-index) (aref (car a2) gnus-score-index))) - (defun gnus-useful-date (date) - ;; Return the numeric day corresponding to the DATE string. - (let ((d (mapcar (lambda (s) (and s (string-to-int s))) - (timezone-parse-date date)))) - (timezone-absolute-from-gregorian (nth 1 d) (nth 2 d) (car d)))) - (defun gnus-score-build-cons (article) ;; Build a `gnus-newsgroup-scored' type cons from ARTICLE. (cons (header-number (car article)) (cdr article))) --- 10204,10209 ---- *************** *** 10284,10298 **** ("subject" 1 gnus-score-string) ("from" 2 gnus-score-string) ("date" 3 gnus-score-date) ! ("id" 4 gnus-score-string) ("references" 5 gnus-score-string) ("chars" 6 gnus-score-integer) ("lines" 7 gnus-score-integer) ("xref" 8 gnus-score-string))) - (defvar gnus-score-file-suffix "SCORE" - "Suffix of the score files.") - (defun gnus-score-file-name (newsgroup) "Return the name of a score file for NEWSGROUP." (cond ((or (null newsgroup) --- 10214,10225 ---- ("subject" 1 gnus-score-string) ("from" 2 gnus-score-string) ("date" 3 gnus-score-date) ! ("message-id" 4 gnus-score-string) ("references" 5 gnus-score-string) ("chars" 6 gnus-score-integer) ("lines" 7 gnus-score-integer) ("xref" 8 gnus-score-string))) (defun gnus-score-file-name (newsgroup) "Return the name of a score file for NEWSGROUP." (cond ((or (null newsgroup) *************** *** 10305,10317 **** (expand-file-name (concat newsgroup "." gnus-score-file-suffix) (or gnus-kill-files-directory "~/News"))) (t ! ;; Place "KILL" under the hierarchical directory. (expand-file-name (concat (gnus-newsgroup-directory-form newsgroup) "/" gnus-score-file-suffix) (or gnus-kill-files-directory "~/News"))))) (defun gnus-score-score-files (group) "Return a list of all possible score files." (setq gnus-kill-files-directory (file-name-as-directory (or gnus-kill-files-directory "~/News/"))) --- 10232,10247 ---- (expand-file-name (concat newsgroup "." gnus-score-file-suffix) (or gnus-kill-files-directory "~/News"))) (t ! ;; Place "SCORE" under the hierarchical directory. (expand-file-name (concat (gnus-newsgroup-directory-form newsgroup) "/" gnus-score-file-suffix) (or gnus-kill-files-directory "~/News"))))) (defun gnus-score-score-files (group) "Return a list of all possible score files." + (and gnus-global-score-files + (or gnus-internal-global-score-files + (gnus-score-search-global-directories gnus-global-score-files))) (setq gnus-kill-files-directory (file-name-as-directory (or gnus-kill-files-directory "~/News/"))) *************** *** 10339,10345 **** (setq files (cons (concat dir "/all/" gnus-score-file-suffix) files))) (string-match "/[^/]*$" dir) ! (setq dir (substring dir (match-beginning 0)))) (setq gnus-score-file-list (cons nil (nreverse files))))) (cdr gnus-score-file-list))) --- 10269,10275 ---- (setq files (cons (concat dir "/all/" gnus-score-file-suffix) files))) (string-match "/[^/]*$" dir) ! (setq dir (substring dir 0 (match-beginning 0)))) (setq gnus-score-file-list (cons nil (nreverse files))))) (cdr gnus-score-file-list))) *************** *** 10363,10372 **** "Return a list of score files for GROUP. The score files are those files in the ~/News directory which matches GROUP using BNews sys file syntax." ! (let ((sfiles (gnus-score-score-files group)) ! (klen (length (file-name-as-directory ! (expand-file-name gnus-kill-files-directory)))) ! ofiles not-match regexp) (save-excursion (set-buffer (get-buffer-create "*gnus score files*")) (buffer-disable-undo (current-buffer)) --- 10293,10304 ---- "Return a list of score files for GROUP. The score files are those files in the ~/News directory which matches GROUP using BNews sys file syntax." ! (let* ((sfiles (append (gnus-score-score-files group) ! gnus-internal-global-score-files)) ! (kill-dir (file-name-as-directory ! (expand-file-name gnus-kill-files-directory))) ! (klen (length kill-dir)) ! ofiles not-match regexp) (save-excursion (set-buffer (get-buffer-create "*gnus score files*")) (buffer-disable-undo (current-buffer)) *************** *** 10380,10388 **** (re-search-forward (concat "." gnus-score-file-suffix "$")) (replace-match "") (goto-char 1) ! ;; If the file name was just "SCORE", `klen' is one character ! ;; too much. ! (delete-char (min (1- (point-max)) klen)) ;; Translate "all" to ".*". (while (search-forward "all" nil t) (replace-match ".*")) --- 10312,10324 ---- (re-search-forward (concat "." gnus-score-file-suffix "$")) (replace-match "") (goto-char 1) ! (if (looking-at (regexp-quote kill-dir)) ! ;; If the file name was just "SCORE", `klen' is one character ! ;; too much. ! (delete-char (min (1- (point-max)) klen)) ! (goto-char (point-max)) ! (search-backward "/") ! (delete-region (1+ (point)) (point-min))) ;; Translate "all" to ".*". (while (search-forward "all" nil t) (replace-match ".*")) *************** *** 10421,10428 **** --- 10357,10423 ---- (setq ofiles (cons localscore ofiles))) (nreverse ofiles)))) + (defun gnus-score-search-global-directories (files) + "Scan all global score directories for score files." + ;; Set the variable `gnus-internal-global-score-files' to all + ;; available global score files. + (interactive (list gnus-global-score-files)) + (let (out) + (while files + (if (string-match "/$" (car files)) + (setq out (nconc (directory-files + (car files) t + (concat gnus-score-file-suffix "$")))) + (setq out (cons (car files) out))) + (setq files (cdr files))) + (setq gnus-internal-global-score-files out))) + + ;;; + ;;; Score mode. + ;;; + + (defvar gnus-score-mode-map nil) + (defvar gnus-score-mode-hook nil) + + (if gnus-score-mode-map + () + (setq gnus-score-mode-map (copy-keymap emacs-lisp-mode-map)) + (define-key gnus-score-mode-map "\C-c\C-c" 'gnus-score-edit-done) + (define-key gnus-score-mode-map "\C-c\C-d" 'gnus-score-edit-insert-date)) + + (defun gnus-score-mode () + "Mode for editing score files. + This mode is an extended emacs-lisp mode. + + \\{gnus-score-mode-map}" + (interactive) + (kill-all-local-variables) + (use-local-map gnus-score-mode-map) + (set-syntax-table emacs-lisp-mode-syntax-table) + (setq major-mode 'gnus-score-mode) + (setq mode-name "Score") + (lisp-mode-variables nil) + (run-hooks 'emacs-lisp-mode-hook 'gnus-score-mode-hook)) + + (defun gnus-score-edit-insert-date () + "Insert date in numerical format." + (interactive) + (insert (int-to-string (gnus-day-number (current-time-string))))) + + (defun gnus-score-edit-done () + "Save the score file and return to the summary buffer." + (interactive) + (let ((bufnam (buffer-file-name (current-buffer)))) + (save-buffer) + (kill-buffer (current-buffer)) + (and gnus-winconf-edit-score + (set-window-configuration gnus-winconf-edit-score)) + (debug (current-buffer)) + (gnus-score-remove-from-cache bufnam) + (gnus-score-load-file bufnam))) + ;;; ;;; Gnus Posting Functions ;;; *************** *** 10432,10439 **** (defvar gnus-post-news-buffer "*post-news*") (defvar gnus-winconf-post-news nil) - (autoload 'news-reply-mode "rnewspost") - ;;; Post news commands of Gnus group mode and summary mode (defun gnus-group-post-news () --- 10427,10432 ---- *************** *** 10445,10451 **** ;; Fix by Sudish Joseph . (or gnus-newsgroup-name (setq gnus-newsgroup-name (gnus-group-group-name))) (unwind-protect ! (gnus-post-news 'post nil) (or (and (eq (current-buffer) (get-buffer gnus-post-news-buffer)) (not (zerop (buffer-size)))) ;; Restore last window configuration. --- 10438,10444 ---- ;; Fix by Sudish Joseph . (or gnus-newsgroup-name (setq gnus-newsgroup-name (gnus-group-group-name))) (unwind-protect ! (gnus-post-news 'post) (or (and (eq (current-buffer) (get-buffer gnus-post-news-buffer)) (not (zerop (buffer-size)))) ;; Restore last window configuration. *************** *** 10480,10486 **** If prefix argument YANK is non-nil, original article is yanked automatically." (interactive "P") (gnus-set-global-variables) ! (gnus-summary-select-article t) (let ((headers gnus-current-headers) (gnus-newsgroup-name gnus-newsgroup-name)) ;; Check Followup-To: poster. --- 10473,10480 ---- If prefix argument YANK is non-nil, original article is yanked automatically." (interactive "P") (gnus-set-global-variables) ! (save-window-excursion ! (gnus-summary-select-article t)) (let ((headers gnus-current-headers) (gnus-newsgroup-name gnus-newsgroup-name)) ;; Check Followup-To: poster. *************** *** 10495,10501 **** ;; Save window configuration. (setq gnus-winconf-post-news (current-window-configuration)) (unwind-protect ! (gnus-post-news 'followup headers gnus-article-buffer yank) (or (and (eq (current-buffer) (get-buffer gnus-post-news-buffer)) (not (zerop (buffer-size)))) ;; Restore last window configuration. --- 10489,10496 ---- ;; Save window configuration. (setq gnus-winconf-post-news (current-window-configuration)) (unwind-protect ! (gnus-post-news nil gnus-newsgroup-name ! headers gnus-article-buffer yank) (or (and (eq (current-buffer) (get-buffer gnus-post-news-buffer)) (not (zerop (buffer-size)))) ;; Restore last window configuration. *************** *** 10569,10578 **** ;;;###autoload (fset 'postnews 'gnus-post-news) ! (defun gnus-post-news (method &optional header article-buffer yank) "Begin editing a new USENET news article to be posted. Type \\[describe-mode] in the buffer to get a list of commands." ! (interactive (list 'post)) (if (or (not gnus-novice-user) gnus-expert-user (not (eq 'post --- 10564,10573 ---- ;;;###autoload (fset 'postnews 'gnus-post-news) ! (defun gnus-post-news (post &optional group header article-buffer yank) "Begin editing a new USENET news article to be posted. Type \\[describe-mode] in the buffer to get a list of commands." ! (interactive (list t)) (if (or (not gnus-novice-user) gnus-expert-user (not (eq 'post *************** *** 10582,10643 **** gnus-valid-select-methods)))) (assq 'to-address (gnus-find-method-for-group gnus-newsgroup-name)) (gnus-y-or-n-p "Are you sure you want to post to all of USENET? ")) ! (let ((sumart (if (eq method 'followup) (save-excursion (set-buffer gnus-summary-buffer) (cons (current-buffer) gnus-current-article)))) ! post-buf) ! (if (and gnus-interactive-post ! (not gnus-expert-user) ! (eq method 'post) ! (not header)) ! (setq header ! (completing-read "Group: " gnus-active-hashtb nil t))) (setq mail-reply-buffer article-buffer) (setq gnus-post-news-buffer ! (setq post-buf ! (gnus-request-post-buffer ! method ! (if (stringp header) (gnus-group-real-name header) header) ! article-buffer))) ! (if (eq method 'post) (progn (gnus-configure-windows '(1 0 0)) ! (switch-to-buffer post-buf)) (gnus-configure-windows '(0 1 0)) (if (not yank) (progn (switch-to-buffer article-buffer) ! (pop-to-buffer post-buf)) ! (switch-to-buffer post-buf))) (gnus-overload-functions) (make-local-variable 'gnus-article-reply) (make-local-variable 'gnus-article-check-size) (setq gnus-article-reply sumart) ;; Handle author copy using BCC field. (if (and gnus-mail-self-blind (not (mail-fetch-field "bcc"))) (progn ! (mail-position-on-field "BCC") (insert (if (stringp gnus-mail-self-blind) gnus-mail-self-blind (user-login-name))))) ;; Handle author copy using FCC field. (if gnus-author-copy (progn ! (mail-position-on-field "FCC") (insert gnus-author-copy))) (goto-char (point-min)) ! (if (and (eq method 'post) (not header)) ! (end-of-line) (search-forward (concat "\n" mail-header-separator "\n")) (if yank (save-excursion (run-hooks 'news-reply-header-hook) (mail-yank-original nil))) (if gnus-post-prepare-function ! (funcall gnus-post-prepare-function ! (if (stringp header) header gnus-newsgroup-name)))))) (setq gnus-article-check-size (cons (buffer-size) (gnus-article-checksum))) (message "") t) --- 10577,10666 ---- gnus-valid-select-methods)))) (assq 'to-address (gnus-find-method-for-group gnus-newsgroup-name)) (gnus-y-or-n-p "Are you sure you want to post to all of USENET? ")) ! (let ((sumart (if (not post) (save-excursion (set-buffer gnus-summary-buffer) (cons (current-buffer) gnus-current-article)))) ! (from (and header (header-from header))) ! subject follow-to real-group) ! (and gnus-interactive-post ! (not gnus-expert-user) ! post (not group) ! (progn ! (setq group ! (completing-read "Group: " gnus-active-hashtb nil t)) ! (setq subject (read-string "Subject: ")))) (setq mail-reply-buffer article-buffer) + + (setq real-group (gnus-group-real-name group)) (setq gnus-post-news-buffer ! (gnus-request-post-buffer ! post real-group subject header article-buffer ! (nth 2 (gnus-gethash group gnus-newsrc-hashtb)) ! (if (and (boundp 'gnus-followup-to-function) ! gnus-followup-to-function) ! (setq follow-to ! (save-excursion ! (set-buffer article-buffer) ! (funcall gnus-followup-to-function group)))) ! (eq gnus-use-followup-to t))) ! (if post (progn (gnus-configure-windows '(1 0 0)) ! (switch-to-buffer gnus-post-news-buffer)) (gnus-configure-windows '(0 1 0)) (if (not yank) (progn (switch-to-buffer article-buffer) ! (pop-to-buffer gnus-post-news-buffer)) ! (switch-to-buffer gnus-post-news-buffer))) (gnus-overload-functions) (make-local-variable 'gnus-article-reply) (make-local-variable 'gnus-article-check-size) (setq gnus-article-reply sumart) + ;; Handle `gnus-auto-mail-to-author'. + ;; Suggested by Daniel Quinlan . + (let ((to (if (eq gnus-auto-mail-to-author 'ask) + (and (y-or-n-p "Also send mail to author? ") from) + (and gnus-auto-mail-to-author from)))) + (if to + (progn + (if (mail-fetch-field "To") + (progn + (beginning-of-line) + (insert "Cc: " to "\n")) + (mail-position-on-field "To") + (insert to))))) ;; Handle author copy using BCC field. (if (and gnus-mail-self-blind (not (mail-fetch-field "bcc"))) (progn ! (mail-position-on-field "Bcc") (insert (if (stringp gnus-mail-self-blind) gnus-mail-self-blind (user-login-name))))) ;; Handle author copy using FCC field. (if gnus-author-copy (progn ! (mail-position-on-field "Fcc") (insert gnus-author-copy))) (goto-char (point-min)) ! (if post ! (cond ((not group) ! (re-search-forward "^Newsgroup:" nil t) ! (end-of-line)) ! ((not subject) ! (re-search-forward "^Subject:" nil t) ! (end-of-line)) ! (t ! (search-forward (concat "\n" mail-header-separator "\n")))) (search-forward (concat "\n" mail-header-separator "\n")) (if yank (save-excursion (run-hooks 'news-reply-header-hook) (mail-yank-original nil))) (if gnus-post-prepare-function ! (funcall gnus-post-prepare-function group))))) (setq gnus-article-check-size (cons (buffer-size) (gnus-article-checksum))) (message "") t) *************** *** 11233,11239 **** (defun gnus-inews-date () "Current time string." ! (timezone-make-date-arpa-standard (current-time-string))) (defun gnus-inews-organization () "Return user's organization. --- 11256,11263 ---- (defun gnus-inews-date () "Current time string." ! (timezone-make-date-arpa-standard ! (current-time-string) (current-time-zone))) (defun gnus-inews-organization () "Return user's organization. *************** *** 11283,11291 **** ;;; Gnus Mail Functions ;;; - (autoload 'news-mail-reply "rnewspost") - (autoload 'news-mail-other-window "rnewspost") - ;;; Mail reply commands of Gnus summary mode (defun gnus-summary-reply (yank) --- 11307,11312 ---- *************** *** 11467,11473 **** (defun gnus-mail-other-window-using-mail () "Compose mail other window using mail." ! (news-mail-other-window) (gnus-overload-functions)) --- 11488,11494 ---- (defun gnus-mail-other-window-using-mail () "Compose mail other window using mail." ! (mail-other-window) (gnus-overload-functions)) *************** *** 11815,11823 **** article (gnus-group-real-name group) (nth 1 method)))) ;; Fix by Sudish Joseph . ! (defun gnus-request-post-buffer (post header artbuf) ! (let* ((group gnus-newsgroup-name) ! (info (nth 2 (gnus-gethash group gnus-newsrc-hashtb))) (method (if (and gnus-post-method ;; Fix by Sudish Joseph . --- 11836,11844 ---- article (gnus-group-real-name group) (nth 1 method)))) ;; Fix by Sudish Joseph . ! (defun gnus-request-post-buffer (post group subject header artbuf ! info follow-to respect-poster) ! (let* ((info (or info (nth 2 (gnus-gethash group gnus-newsrc-hashtb)))) (method (if (and gnus-post-method ;; Fix by Sudish Joseph . *************** *** 11827,11834 **** gnus-valid-select-methods))) gnus-post-method (gnus-find-method-for-group gnus-newsgroup-name)))) ! (funcall (gnus-get-function method 'request-post-buffer) ! post header artbuf (gnus-group-real-name group) info))) (defun gnus-request-post (method &optional force) (and (not force) gnus-post-method --- 11848,11858 ---- gnus-valid-select-methods))) gnus-post-method (gnus-find-method-for-group gnus-newsgroup-name)))) ! (let ((mail-self-blind nil) ! (mail-archive-file-name nil)) ! (funcall (gnus-get-function method 'request-post-buffer) ! post group subject header artbuf info follow-to ! respect-poster)))) (defun gnus-request-post (method &optional force) (and (not force) gnus-post-method *************** *** 12246,12252 **** (defun gnus-get-unread-articles (&optional level) (let ((newsrc (cdr gnus-newsrc-assoc)) (level (or level 6)) ! info group active) (message "Checking new news...") (while newsrc (setq info (car newsrc)) --- 12270,12276 ---- (defun gnus-get-unread-articles (&optional level) (let ((newsrc (cdr gnus-newsrc-assoc)) (level (or level 6)) ! info group active virtuals) (message "Checking new news...") (while newsrc (setq info (car newsrc)) *************** *** 12264,12271 **** (and (numberp gnus-activate-foreign-newsgroups) (<= (nth 1 info) gnus-activate-foreign-newsgroups) (<= (nth 1 info) level))) ! (or (eq (car (nth 4 info)) 'nnvirtual) ! (setq active (gnus-activate-newsgroup (car info))))) (if (and (not gnus-read-active-file) (<= (nth 1 info) level)) (progn --- 12288,12296 ---- (and (numberp gnus-activate-foreign-newsgroups) (<= (nth 1 info) gnus-activate-foreign-newsgroups) (<= (nth 1 info) level))) ! (if (eq (car (nth 4 info)) 'nnvirtual) ! (setq virtuals (cons info virtuals)) ! (setq active (gnus-activate-newsgroup (car info))))) (if (and (not gnus-read-active-file) (<= (nth 1 info) level)) (progn *************** *** 12275,12280 **** --- 12300,12314 ---- (setcar (gnus-gethash group gnus-newsrc-hashtb) t))) (and active (gnus-get-unread-articles-in-group info active)) (setq newsrc (cdr newsrc))) + + ;; Activate the virtual groups. This has to be done after all the + ;; other groups. + ;; !!! If one virtual group contains another virtual group, even + ;; doing it this way might cause problems. + (while virtuals + (gnus-activate-newsgroup (car (car virtuals))) + (setq virtuals (cdr virtuals))) + (message "Checking new news... done"))) ;; Create a hash table out of the newsrc alist. The `car's of the *************** *** 12285,12291 **** (setq gnus-newsrc-hashtb (gnus-make-hashtable (length alist))) (setq alist (setq prev (setq gnus-newsrc-assoc ! (cons (list "dummy.group" 0 (cons 0 0)) alist)))) (while alist (gnus-sethash (car (car alist)) (cons nil prev) gnus-newsrc-hashtb) (setq prev alist) --- 12319,12325 ---- (setq gnus-newsrc-hashtb (gnus-make-hashtable (length alist))) (setq alist (setq prev (setq gnus-newsrc-assoc ! (cons (list "dummy.group" 0 nil) alist)))) (while alist (gnus-sethash (car (car alist)) (cons nil prev) gnus-newsrc-hashtb) (setq prev alist) *************** *** 12377,12384 **** (defun gnus-activate-newsgroup (group) (let ((method (gnus-find-method-for-group group)) active) ! (or (gnus-server-opened method) (gnus-open-server method)) ! (and (gnus-request-group group) (save-excursion (set-buffer nntp-server-buffer) (goto-char 1) --- 12411,12418 ---- (defun gnus-activate-newsgroup (group) (let ((method (gnus-find-method-for-group group)) active) ! (and (or (gnus-server-opened method) (gnus-open-server method)) ! (gnus-request-group group) (save-excursion (set-buffer nntp-server-buffer) (goto-char 1) *************** *** 12445,12451 **** (defun gnus-make-articles-unread (group articles) "Mark ARTICLES in GROUP as unread." ! (let ((info (nth 2 (gnus-gethash group gnus-newsrc-hashtb)))) (setcar (nthcdr 2 info) (gnus-remove-from-range (nth 2 info) articles)) (gnus-group-update-group group t))) --- 12479,12487 ---- (defun gnus-make-articles-unread (group articles) "Mark ARTICLES in GROUP as unread." ! (let ((info (nth 2 (or (gnus-gethash group gnus-newsrc-hashtb) ! (gnus-gethash (gnus-group-real-name group) ! gnus-newsrc-hashtb))))) (setcar (nthcdr 2 info) (gnus-remove-from-range (nth 2 info) articles)) (gnus-group-update-group group t))) diff --exclude=*.elc --exclude=*~ --exclude=*-[0-9] --exclude=gnus --context --recursive pub/dgnus/lisp/nnbabyl.el dgnus/lisp/nnbabyl.el *** pub/dgnus/lisp/nnbabyl.el Sun Mar 19 02:18:08 1995 --- dgnus/lisp/nnbabyl.el Wed Mar 22 04:35:40 1995 *************** *** 331,349 **** (delete-region (point-min) (point-max)))))) (defun nnbabyl-possibly-change-newsgroup (newsgroup) ! (if (not (get-buffer nnbabyl-mbox-buffer)) (save-excursion ! (let ((buf (or (get-buffer (file-name-nondirectory nnbabyl-mbox-file)) ! (create-file-buffer nnbabyl-mbox-file)))) ! (set-buffer (setq nnbabyl-mbox-buffer buf)) ! (insert-file-contents nnbabyl-mbox-file) ! (setq buffer-file-name nnbabyl-mbox-file)) ! (buffer-disable-undo (current-buffer)))) (if (not nnbabyl-group-alist) (setq nnbabyl-group-alist (nnmail-get-active))) (if newsgroup (if (assoc newsgroup nnbabyl-group-alist) ! (setq nnbabyl-current-group newsgroup)))) (defun nnbabyl-article-string (article) (concat "\nX-Gnus-Newsgroup: " nnbabyl-current-group ":" --- 331,347 ---- (delete-region (point-min) (point-max)))))) (defun nnbabyl-possibly-change-newsgroup (newsgroup) ! (if (or (not nnbabyl-mbox-buffer) ! (not (buffer-name nnbabyl-mbox-buffer))) (save-excursion ! (nnbabyl-read-mbox))) (if (not nnbabyl-group-alist) (setq nnbabyl-group-alist (nnmail-get-active))) (if newsgroup (if (assoc newsgroup nnbabyl-group-alist) ! (setq nnbabyl-current-group newsgroup) ! (setq nnbabyl-status-string "No such group in file") ! nil))) (defun nnbabyl-article-string (article) (concat "\nX-Gnus-Newsgroup: " nnbabyl-current-group ":" *************** *** 397,425 **** (create-file-buffer nnbabyl-mbox-file))) start end) (set-buffer (setq nnbabyl-mbox-buffer buf)) (insert-file-contents nnbabyl-mbox-file) (setq buffer-file-name nnbabyl-mbox-file) - (buffer-disable-undo (current-buffer)) (goto-char (point-min)) (while (re-search-forward delim nil t) (setq start (match-beginning 0)) ! (if (not (search-forward "\nX-Gnus-Newsgroup: " ! (save-excursion ! (setq end ! (or ! (and ! (re-search-forward delim nil t) ! (match-beginning 0)) ! (point-max)))) ! t)) ! (goto-char end) ! (save-excursion ! (save-restriction ! (goto-char start) ! (narrow-to-region start end) ! (nnbabyl-save-mail)))) ! ))))) (defun nnbabyl-get-new-mail () (let (incoming) --- 395,426 ---- (create-file-buffer nnbabyl-mbox-file))) start end) (set-buffer (setq nnbabyl-mbox-buffer buf)) + (buffer-disable-undo (current-buffer)) + (insert-file-contents nnbabyl-mbox-file) (setq buffer-file-name nnbabyl-mbox-file) + (set-buffer-modified-p nil) (goto-char (point-min)) (while (re-search-forward delim nil t) (setq start (match-beginning 0)) ! (if (and ! (save-excursion (re-search-forward delim nil t)) ! (not (search-forward ! "\nX-Gnus-Newsgroup: " ! (save-excursion ! (setq end (or (and (re-search-forward delim nil t) ! (match-beginning 0)) ! (point-max)))) t))) ! (progn ! (goto-char end) ! (save-excursion ! (save-restriction ! (goto-char start) ! (narrow-to-region start end) ! (nnbabyl-save-mail)))))) ! (save-buffer) ! (nnmail-save-active nnbabyl-group-alist nnbabyl-active-file))))) (defun nnbabyl-get-new-mail () (let (incoming) diff --exclude=*.elc --exclude=*~ --exclude=*-[0-9] --exclude=gnus --context --recursive pub/dgnus/lisp/nndoc.el dgnus/lisp/nndoc.el *** pub/dgnus/lisp/nndoc.el Sun Mar 19 02:18:08 1995 --- dgnus/lisp/nndoc.el Wed Mar 22 05:27:57 1995 *************** *** 96,102 **** (and nntp-server-buffer (get-buffer nntp-server-buffer))) ! (defun nndoc-status-message () "Return server status response as string." nndoc-status-string) --- 96,102 ---- (and nntp-server-buffer (get-buffer nntp-server-buffer))) ! (defun nndoc-status-message (&optional server) "Return server status response as string." nndoc-status-string) *************** *** 126,145 **** (defun nndoc-request-group (group &optional server dont-check) "Select news GROUP." (save-excursion ! (nndoc-possibly-change-buffer group server) ! (if dont-check ! t ! (save-excursion ! (set-buffer nntp-server-buffer) ! (erase-buffer) ! (let ((number (nndoc-number-of-articles))) ! (if (zerop number) ! (progn ! (nndoc-close-group group) ! nil) ! (insert (format "211 %d %d %d %s\n" ! number 1 number group)) ! t)))))) (defun nndoc-close-group (group &optional server) (nndoc-possibly-change-buffer group server) --- 126,148 ---- (defun nndoc-request-group (group &optional server dont-check) "Select news GROUP." (save-excursion ! (if (not (nndoc-possibly-change-buffer group server)) ! (progn ! (setq nndoc-status-string "No such file") ! nil) ! (if dont-check ! t ! (save-excursion ! (set-buffer nntp-server-buffer) ! (erase-buffer) ! (let ((number (nndoc-number-of-articles))) ! (if (zerop number) ! (progn ! (nndoc-close-group group) ! nil) ! (insert (format "211 %d %d %d %s\n" ! number 1 number group)) ! t))))))) (defun nndoc-close-group (group &optional server) (nndoc-possibly-change-buffer group server) *************** *** 173,188 **** (setq buf (cdr (assoc group nndoc-group-alist))))) (if buf (setq nndoc-current-buffer buf) ! (setq nndoc-group-alist ! (cons (cons group (setq nndoc-current-buffer ! (get-buffer-create ! (concat " *nndoc " group "*")))) ! nndoc-group-alist)) ! (save-excursion ! (set-buffer nndoc-current-buffer) ! (buffer-disable-undo (current-buffer)) ! (erase-buffer) ! (insert-file-contents file)))))) (defun nndoc-number-of-articles () (save-excursion --- 176,195 ---- (setq buf (cdr (assoc group nndoc-group-alist))))) (if buf (setq nndoc-current-buffer buf) ! (if (or (not (file-exists-p file)) ! (file-directory-p file)) ! () ! (setq nndoc-group-alist ! (cons (cons group (setq nndoc-current-buffer ! (get-buffer-create ! (concat " *nndoc " group "*")))) ! nndoc-group-alist)) ! (save-excursion ! (set-buffer nndoc-current-buffer) ! (buffer-disable-undo (current-buffer)) ! (erase-buffer) ! (insert-file-contents file) ! t)))))) (defun nndoc-number-of-articles () (save-excursion diff --exclude=*.elc --exclude=*~ --exclude=*-[0-9] --exclude=gnus --context --recursive pub/dgnus/lisp/nnfolder.el dgnus/lisp/nnfolder.el *** pub/dgnus/lisp/nnfolder.el Sun Mar 19 02:18:08 1995 --- dgnus/lisp/nnfolder.el Tue Mar 21 23:44:15 1995 *************** *** 322,328 **** (nnfolder-request-list) (setq nnfolder-group-alist (nnmail-get-active)))) (let (inf file) ! (if (equal group nnfolder-current-group) () (if (setq inf (member group nnfolder-buffer-alist)) (setq nnfolder-current-buffer (nth 1 inf))) --- 322,329 ---- (nnfolder-request-list) (setq nnfolder-group-alist (nnmail-get-active)))) (let (inf file) ! (if (and (equal group nnfolder-current-group) ! (buffer-name nnfolder-current-buffer)) () (if (setq inf (member group nnfolder-buffer-alist)) (setq nnfolder-current-buffer (nth 1 inf))) *************** *** 336,345 **** (setq file (concat nnfolder-directory group)) (if (not (file-exists-p file)) (write-region 1 1 file t 'nomesg)) ! (set-buffer ! (setq nnfolder-current-buffer ! (find-file-noselect file))) ! (buffer-disable-undo (current-buffer)) (setq nnfolder-buffer-alist (cons (list group (current-buffer)) nnfolder-buffer-alist)))))) (setq nnfolder-current-group group)) --- 337,343 ---- (setq file (concat nnfolder-directory group)) (if (not (file-exists-p file)) (write-region 1 1 file t 'nomesg)) ! (set-buffer (nnfolder-read-folder file)) (setq nnfolder-buffer-alist (cons (list group (current-buffer)) nnfolder-buffer-alist)))))) (setq nnfolder-current-group group)) *************** *** 388,421 **** (setcdr active (1+ (cdr active))) (cdr active))) ! (defun nnfolder-read-mbox (file) (nnfolder-request-list) (setq nnfolder-group-alist (nnmail-get-active)) ! (if (save-excursion ! (set-buffer nnfolder-current-buffer) ! (= (buffer-size) (nth 7 (file-attributes file)))) ! () ! (save-excursion ! (let ((delim (concat "^" rmail-unix-mail-delimiter)) ! start end) ! (set-buffer nnfolder-current-buffer ) ! (goto-char (point-min)) ! (while (re-search-forward delim nil t) ! (setq start (match-beginning 0)) ! (if (not (search-forward "\nX-Gnus-Article-Number: " ! (save-excursion ! (setq end ! (or ! (and ! (re-search-forward delim nil t) ! (match-beginning 0)) ! (point-max)))) ! t)) ! (save-excursion ! (save-restriction ! (narrow-to-region start end) ! (nnfolder-save-mail)))) ! (goto-char end)))))) (defun nnfolder-get-new-mail () (let (incoming) --- 386,420 ---- (setcdr active (1+ (cdr active))) (cdr active))) ! (defun nnfolder-read-folder (file) (nnfolder-request-list) (setq nnfolder-group-alist (nnmail-get-active)) ! (save-excursion ! (set-buffer ! (setq nnfolder-current-buffer ! (find-file-noselect file))) ! (buffer-disable-undo (current-buffer)) ! (let ((delim (concat "^" rmail-unix-mail-delimiter)) ! start end) ! (goto-char (point-min)) ! (while (re-search-forward delim nil t) ! (setq start (match-beginning 0)) ! (if (not (search-forward "\nX-Gnus-Article-Number: " ! (save-excursion ! (setq end ! (or ! (and ! (re-search-forward delim nil t) ! (match-beginning 0)) ! (point-max)))) ! t)) ! (save-excursion ! (save-restriction ! (narrow-to-region start end) ! (nnfolder-insert-newsgroup-line ! (cons nil (nnfolder-active-number nnfolder-current-group)))))) ! (goto-char end))) ! (current-buffer))) (defun nnfolder-get-new-mail () (let (incoming) *************** *** 436,443 **** (let ((bufs nnfolder-buffer-alist)) (save-excursion (while bufs ! (set-buffer (nth 1 (car bufs))) ! (save-buffer) (setq bufs (cdr bufs))))) ;; (if incoming (delete-file incoming)) )) --- 435,445 ---- (let ((bufs nnfolder-buffer-alist)) (save-excursion (while bufs ! (if (not (buffer-name (nth 1 (car bufs)))) ! (setq nnfolder-buffer-alist ! (delq (car bufs) nnfolder-buffer-alist)) ! (set-buffer (nth 1 (car bufs))) ! (save-buffer)) (setq bufs (cdr bufs))))) ;; (if incoming (delete-file incoming)) )) diff --exclude=*.elc --exclude=*~ --exclude=*-[0-9] --exclude=gnus --context --recursive pub/dgnus/lisp/nnmail.el dgnus/lisp/nnmail.el *** pub/dgnus/lisp/nnmail.el Sun Mar 19 02:18:08 1995 --- dgnus/lisp/nnmail.el Tue Mar 21 03:35:25 1995 *************** *** 123,132 **** ! (defun nnmail-request-post-buffer (method header article-buffer group info) (let ((method-address (cdr (assq 'to-address (nth 4 info)))) from subject date to reply-to message-of ! references message-id sender follow-to cc) (setq method-address (if (and (stringp method-address) (string= method-address "")) --- 123,133 ---- ! (defun nnmail-request-post-buffer (post group subject header article-buffer ! info follow-to respect-poster) (let ((method-address (cdr (assq 'to-address (nth 4 info)))) from subject date to reply-to message-of ! references message-id sender cc) (setq method-address (if (and (stringp method-address) (string= method-address "")) *************** *** 140,156 **** (not (y-or-n-p "Unsent mail being composed; erase it? "))) () (erase-buffer) ! (if (eq method 'post) ! (mail-setup method-address nil nil nil nil nil) (save-excursion (set-buffer article-buffer) (goto-char (point-min)) (narrow-to-region (point-min) (progn (search-forward "\n\n") (point))) (set-text-properties (point-min) (point-max) nil) - (if (and (boundp 'gnus-followup-to-function) - gnus-followup-to-function) - (setq follow-to (funcall gnus-followup-to-function group))) (setq from (header-from header)) (setq date (header-date header)) (and from --- 141,154 ---- (not (y-or-n-p "Unsent mail being composed; erase it? "))) () (erase-buffer) ! (if post ! (mail-setup method-address subject nil nil nil nil) (save-excursion (set-buffer article-buffer) (goto-char (point-min)) (narrow-to-region (point-min) (progn (search-forward "\n\n") (point))) (set-text-properties (point-min) (point-max) nil) (setq from (header-from header)) (setq date (header-date header)) (and from *************** *** 186,193 **** (if message-id (insert message-id)) ;; The region must end with a newline to fill the region ;; without inserting extra newline. ! (fill-region-as-paragraph begin (1+ (point)))) ! )) (current-buffer)))) (defun nnmail-find-file (file) --- 184,190 ---- (if message-id (insert message-id)) ;; The region must end with a newline to fill the region ;; without inserting extra newline. ! (fill-region-as-paragraph begin (1+ (point)))))) (current-buffer)))) (defun nnmail-find-file (file) diff --exclude=*.elc --exclude=*~ --exclude=*-[0-9] --exclude=gnus --context --recursive pub/dgnus/lisp/nnspool.el dgnus/lisp/nnspool.el *** pub/dgnus/lisp/nnspool.el Sun Mar 19 02:18:08 1995 --- dgnus/lisp/nnspool.el Wed Mar 22 05:48:54 1995 *************** *** 93,129 **** (do-message (and (numberp nnspool-large-newsgroup) (> number nnspool-large-newsgroup))) file beg article) ! (nnspool-possibly-change-directory newsgroup) ! (if (nnspool-retrieve-headers-with-nov sequence) ! 'nov ! (while sequence ! (setq article (car sequence)) ! (setq file (concat nnspool-current-directory ! (int-to-string article))) ! (and (file-exists-p file) ! (progn ! (insert (format "221 %d Article retrieved.\n" article)) ! (setq beg (point)) ! (insert-file-contents file) ! (goto-char beg) ! (search-forward "\n\n" nil t) ! (forward-char -1) ! (insert ".\n") ! (delete-region (point) (point-max)))) ! (setq sequence (cdr sequence)) ! ! (and do-message ! (zerop (% (setq count (1+ count)) 20)) ! (message "NNSPOOL: Receiving headers... %d%%" ! (/ (* count 100) number)))) ! ! (and do-message (message "NNSPOOL: Receiving headers... done")) ! ! ;; Fold continuation lines. ! (goto-char 1) ! (while (re-search-forward "\\(\r?\n[ \t]+\\)+" nil t) ! (replace-match " " t t)) ! 'headers)))) (defun nnspool-open-server (host &optional service) "Open local spool." --- 93,130 ---- (do-message (and (numberp nnspool-large-newsgroup) (> number nnspool-large-newsgroup))) file beg article) ! (if (not (nnspool-possibly-change-directory newsgroup)) ! () ! (if (nnspool-retrieve-headers-with-nov sequence) ! 'nov ! (while sequence ! (setq article (car sequence)) ! (setq file (concat nnspool-current-directory ! (int-to-string article))) ! (and (file-exists-p file) ! (progn ! (insert (format "221 %d Article retrieved.\n" article)) ! (setq beg (point)) ! (insert-file-contents file) ! (goto-char beg) ! (search-forward "\n\n" nil t) ! (forward-char -1) ! (insert ".\n") ! (delete-region (point) (point-max)))) ! (setq sequence (cdr sequence)) ! ! (and do-message ! (zerop (% (setq count (1+ count)) 20)) ! (message "NNSPOOL: Receiving headers... %d%%" ! (/ (* count 100) number)))) ! ! (and do-message (message "NNSPOOL: Receiving headers... done")) ! ! ;; Fold continuation lines. ! (goto-char 1) ! (while (re-search-forward "\\(\r?\n[ \t]+\\)+" nil t) ! (replace-match " " t t)) ! 'headers))))) (defun nnspool-open-server (host &optional service) "Open local spool." *************** *** 380,386 **** (progn (setq nnspool-current-directory pathname) (setq nnspool-current-group newsgroup)) ! (error "No such newsgroup: %s" newsgroup))))) (defun nnspool-article-pathname (group) "Make pathname for GROUP." --- 381,390 ---- (progn (setq nnspool-current-directory pathname) (setq nnspool-current-group newsgroup)) ! (setq nnspool-status-string ! (format "No such newsgroup: %s" newsgroup)) ! nil)) ! t)) (defun nnspool-article-pathname (group) "Make pathname for GROUP." diff --exclude=*.elc --exclude=*~ --exclude=*-[0-9] --exclude=gnus --context --recursive pub/dgnus/lisp/nntp.el dgnus/lisp/nntp.el *** pub/dgnus/lisp/nntp.el Sun Mar 19 02:18:09 1995 --- dgnus/lisp/nntp.el Wed Mar 22 08:59:11 1995 *************** *** 31,37 **** (eval-and-compile (autoload 'news-setup "rnewspost") (autoload 'news-reply-mode "rnewspost") ! (autoload 'nnmail-request-post-buffer "nnmail")) (defvar nntp-server-hook nil "Hooks for the NNTP server. --- 31,38 ---- (eval-and-compile (autoload 'news-setup "rnewspost") (autoload 'news-reply-mode "rnewspost") ! (autoload 'nnmail-request-post-buffer "nnmail") ! (autoload 'cancel-timer "timer")) (defvar nntp-server-hook nil "Hooks for the NNTP server. *************** *** 88,93 **** --- 89,98 ---- none of the commands are successful, nntp will just grab headers one by one.") + (defvar nntp-connection-timeout nil + "Number of seconds to wait before an nntp connection times out. + If this variable is nil, which is the default, no timers are set.") + (defconst nntp-version "nntp 4.0" "Version numbers of this version of NNTP.") *************** *** 184,197 **** If SERVER is nil, use value of environment variable `NNTPSERVER'. If optional argument SERVICE is non-nil, open by the service name." (let ((server (or server (getenv "NNTPSERVER"))) ! (status nil)) (setq nntp-status-string "") (message "nntp: Connecting to server on %s..." server) (cond ((and server (nntp-open-server-internal server service)) (setq nntp-current-server server) ! (unwind-protect (setq status (nntp-wait-for-response "^[23].*\r$")) ! (or status (nntp-close-server-internal server))) (and nntp-server-process (progn (set-process-sentinel --- 189,206 ---- If SERVER is nil, use value of environment variable `NNTPSERVER'. If optional argument SERVICE is non-nil, open by the service name." (let ((server (or server (getenv "NNTPSERVER"))) ! (status nil) ! (timer ! (and nntp-connection-timeout ! (run-at-time nntp-connection-timeout ! nil 'nntp-kill-connection server)))) (setq nntp-status-string "") (message "nntp: Connecting to server on %s..." server) (cond ((and server (nntp-open-server-internal server service)) (setq nntp-current-server server) ! (condition-case nil (setq status (nntp-wait-for-response "^[23].*\r$")) ! (error (nntp-close-server-internal server))) (and nntp-server-process (progn (set-process-sentinel *************** *** 201,206 **** --- 210,216 ---- (run-hooks 'nntp-server-opened-hook)))) ((null server) (setq nntp-status-string "NNTP server is not specified."))) + (and timer (cancel-timer timer)) (message "") status)) *************** *** 238,244 **** nntp-status-string)) (substring nntp-status-string (match-beginning 1) (match-end 1)) ;; Empty message if nothing. ! "")) (defun nntp-request-article (id &optional newsgroup server buffer) "Select article by message ID (or number)." --- 248,254 ---- nntp-status-string)) (substring nntp-status-string (match-beginning 1) (match-end 1)) ;; Empty message if nothing. ! nntp-status-string)) (defun nntp-request-article (id &optional newsgroup server buffer) "Select article by message ID (or number)." *************** *** 336,346 **** ;; appended to end of the status message. (nntp-wait-for-response "^[23].*$")))) ! (defun nntp-request-post-buffer (method header article-buffer group info) (if (assq 'to-address (nth 4 info)) ! (nnmail-request-post-buffer method header article-buffer group info) ! (let (from subject date to followup-to newsgroups message-of ! references distribution message-id follow-to) (save-excursion (set-buffer (get-buffer-create "*post-news*")) (news-reply-mode) --- 346,359 ---- ;; appended to end of the status message. (nntp-wait-for-response "^[23].*$")))) ! (defun nntp-request-post-buffer ! (post group subject header article-buffer info follow-to ! respect-poster) (if (assq 'to-address (nth 4 info)) ! (nnmail-request-post-buffer ! post group subject header article-buffer info follow-to respect-poster) ! (let (from date to followup-to newsgroups message-of ! references distribution message-id) (save-excursion (set-buffer (get-buffer-create "*post-news*")) (news-reply-mode) *************** *** 349,402 **** (not (y-or-n-p "Unsent article being composed; erase it? "))) () (erase-buffer) ! (if (eq method 'post) ! (news-setup nil nil nil header article-buffer) (save-excursion (set-buffer article-buffer) (goto-char (point-min)) (narrow-to-region (point-min) (progn (search-forward "\n\n") (point))) - (if (and (boundp 'gnus-followup-to-function) - gnus-followup-to-function) - (setq follow-to (funcall gnus-followup-to-function group))) (setq from (header-from header)) (setq date (header-date header)) (and from (let ((stop-pos (string-match " *at \\| *@ \\| *(\\| *<" from))) ! (setq message-of ! (concat (if stop-pos (substring from 0 stop-pos) from) ! "'s message of " date)))) ! (setq subject (header-subject header)) (or (string-match "^[Rr][Ee]:" subject) (setq subject (concat "Re: " subject))) (setq followup-to (mail-fetch-field "followup-to")) ! (if (or (null gnus-use-followup-to) ;Ignore followup-to: field. (string-equal "" followup-to) ;Bogus header. (string-equal "poster" followup-to)) ;Poster (setq followup-to nil)) ! (setq newsgroups (or followup-to (mail-fetch-field "newsgroups"))) (setq references (header-references header)) (setq distribution (mail-fetch-field "distribution")) ;; Remove bogus distribution. ! (and (string= distribution "world") (setq distribution nil)) (setq message-id (header-id header)) (widen)) (setq news-reply-yank-from from) (setq news-reply-yank-message-id message-id) ! ;; Prevent getting BCC or FCC fields inserted for both mail ! ;; and news. ! (let ((mail-self-blind ! (and (not gnus-mail-self-blind) mail-self-blind)) ! (mail-archive-file-name ! (and (not gnus-author-copy) mail-archive-file-name))) ! (news-setup ! ;; Suggested by Daniel Quinlan . ! (if (eq gnus-auto-mail-to-author 'ask) ! (and (y-or-n-p "Also send mail to author? ") from) ! (and gnus-auto-mail-to-author from)) ! subject message-of newsgroups article-buffer)) ;; Fold long references line to follow RFC1036. (mail-position-on-field "References") (let ((begin (- (point) (length "References: "))) --- 362,404 ---- (not (y-or-n-p "Unsent article being composed; erase it? "))) () (erase-buffer) ! (if post ! (news-setup nil subject nil group nil) (save-excursion (set-buffer article-buffer) (goto-char (point-min)) (narrow-to-region (point-min) (progn (search-forward "\n\n") (point))) (setq from (header-from header)) (setq date (header-date header)) (and from (let ((stop-pos (string-match " *at \\| *@ \\| *(\\| *<" from))) ! (setq ! message-of ! (concat (if stop-pos (substring from 0 stop-pos) from) ! "'s message of " date)))) ! (setq subject (or subject (header-subject header))) (or (string-match "^[Rr][Ee]:" subject) (setq subject (concat "Re: " subject))) (setq followup-to (mail-fetch-field "followup-to")) ! (if (or (null respect-poster) ;Ignore followup-to: field. (string-equal "" followup-to) ;Bogus header. (string-equal "poster" followup-to)) ;Poster (setq followup-to nil)) ! (setq newsgroups ! (or follow-to followup-to (mail-fetch-field "newsgroups"))) (setq references (header-references header)) (setq distribution (mail-fetch-field "distribution")) ;; Remove bogus distribution. ! (and (stringp distribution) ! (string-match "world" distribution) (setq distribution nil)) (setq message-id (header-id header)) (widen)) (setq news-reply-yank-from from) (setq news-reply-yank-message-id message-id) ! (news-setup to subject message-of newsgroups article-buffer) ;; Fold long references line to follow RFC1036. (mail-position-on-field "References") (let ((begin (- (point) (length "References: "))) *************** *** 421,434 **** This function is supposed to be called from `nntp-server-opened-hook'. It will make innd servers enter nnrpd mode to allow actual article reading." ! (nntp-send-command "MODE" "READER")) (defun nntp-send-authinfo () "Send the AUTHINFO to the nntp server. This function is supposed to be called from `nntp-server-opened-hook'. It will prompt for a password." ! (nntp-send-command "AUTHINFO USER" (user-login-name)) ! (nntp-send-command "AUTHINFO PASS" (read-string "NNTP password: "))) (defun nntp-default-sentinel (proc status) "Default sentinel function for NNTP server process." --- 423,436 ---- This function is supposed to be called from `nntp-server-opened-hook'. It will make innd servers enter nnrpd mode to allow actual article reading." ! (nntp-send-command nil "MODE READER")) (defun nntp-send-authinfo () "Send the AUTHINFO to the nntp server. This function is supposed to be called from `nntp-server-opened-hook'. It will prompt for a password." ! (nntp-send-command nil "AUTHINFO USER" (user-login-name)) ! (nntp-send-command nil "AUTHINFO PASS" (read-string "NNTP password: "))) (defun nntp-default-sentinel (proc status) "Default sentinel function for NNTP server process." *************** *** 443,448 **** --- 445,458 ---- (or (car (car servers)) "(none)")) (ding))) + (defun nntp-kill-connection (server) + (let ((proc (nth 1 (assoc server nntp-server-alist)))) + (if proc (delete-process (process-name proc))) + (nntp-close-server server) + (setq nntp-status-string + (message "Connection timed out to server %s." server)) + (ding))) + ;; Encoding and decoding of NNTP text. (defun nntp-decode-text () *************** *** 708,730 **** ;; accept-process-output is called. ;; Suggested by Jason Venner . ;; This is a copy of `nntp-default-sentinel'. ! (or (memq (process-status nntp-server-process) '(open run)) ! (error "NNTP: Connection closed.")) ! (if nntp-buggy-select ! (progn ! ;; We cannot use `accept-process-output'. ! ;; Fujitsu UTS requires messages during sleep-for. I don't know why. ! (message "NNTP: Reading...") ! (sleep-for 1) ! (message "")) ! (condition-case errorcode ! (accept-process-output nntp-server-process) ! (error ! (cond ((string-equal "select error: Invalid argument" (nth 1 errorcode)) ! ;; Ignore select error. ! nil) ! (t ! (signal (car errorcode) (cdr errorcode)))))))) (defun nntp-last-element (list) "Return last element of LIST." --- 718,742 ---- ;; accept-process-output is called. ;; Suggested by Jason Venner . ;; This is a copy of `nntp-default-sentinel'. ! (if (or (not nntp-server-process) ! (not (memq (process-status nntp-server-process) '(open run)))) ! (error (format "nntp: Process connection closed")) ! (if nntp-buggy-select ! (progn ! ;; We cannot use `accept-process-output'. ! ;; Fujitsu UTS requires messages during sleep-for. I don't know why. ! (message "NNTP: Reading...") ! (sleep-for 1) ! (message "")) ! (condition-case errorcode ! (accept-process-output nntp-server-process) ! (error ! (cond ((string-equal "select error: Invalid argument" ! (nth 1 errorcode)) ! ;; Ignore select error. ! nil) ! (t ! (signal (car errorcode) (cdr errorcode))))))))) (defun nntp-last-element (list) "Return last element of LIST." diff --exclude=*.elc --exclude=*~ --exclude=*-[0-9] --exclude=gnus --context --recursive pub/dgnus/lisp/nnvirtual.el dgnus/lisp/nnvirtual.el *** pub/dgnus/lisp/nnvirtual.el Sun Mar 19 02:18:09 1995 --- dgnus/lisp/nnvirtual.el Wed Mar 22 05:48:50 1995 *************** *** 96,101 **** --- 96,104 ---- (or (search-forward "\t" (save-excursion (end-of-line) (point)) t) (end-of-line)) + (while (= (char-after (1- (point))) ? ) + (forward-char -1) + (delete-char 1)) (if (eolp) (progn (end-of-line) *************** *** 306,312 **** (setq ireads (copy-alist ireads))))) (if (< (cdr (car ireads)) (car active)) (setq ireads (setq itreads (cdr ireads)))) ! (if (< (car (car ireads)) (car active)) (setcar (car ireads) (1+ (car active)))) (while itreads (setcar (car itreads) --- 309,315 ---- (setq ireads (copy-alist ireads))))) (if (< (cdr (car ireads)) (car active)) (setq ireads (setq itreads (cdr ireads)))) ! (if (and ireads (< (car (car ireads)) (car active))) (setcar (car ireads) (1+ (car active)))) (while itreads (setcar (car itreads) diff --exclude=*.elc --exclude=*~ --exclude=*-[0-9] --exclude=gnus --context --recursive pub/dgnus/readme dgnus/readme *** pub/dgnus/readme Sat Dec 31 23:46:40 1994 --- dgnus/readme Tue Mar 21 02:37:46 1995 *************** *** 1,18 **** ! This package contains a pre-release of (ding) Gnus, version 0.5. The ! lisp directory contains the source lisp files, and the texi directory ! contains an early draft of the Gnus info pages. ! ! IMPORTANT NOTE FOR NNML USERS: If you have used an earlier version of ! this package, you have to do the following: ! ! ESC ESC (load "nnml") ! M-x nnml-generate-nov-databases ! ! nnml will chew on your mail for a while, and then you can use Gnus ! again. Do not attempt to start Gnus before you have done this. ! ! (This note only applies to people who use nnml as a mail backedn.) ! Gnus is meant to be totally compatible with GNUS. But, alas, it probably isn't, which is one of the reasons for this pre-release. --- 1,6 ---- ! This package contains a pre-release of (ding) Gnus, version 0.37 or ! thereabouts . The lisp directory contains the source lisp files, and ! the texi directory contains an early draft of the Gnus info pages. Gnus is meant to be totally compatible with GNUS. But, alas, it probably isn't, which is one of the reasons for this pre-release. diff --exclude=*.elc --exclude=*~ --exclude=*-[0-9] --exclude=gnus --context --recursive pub/dgnus/texi/gnus.texi dgnus/texi/gnus.texi *** pub/dgnus/texi/gnus.texi Sun Mar 19 02:18:13 1995 --- dgnus/texi/gnus.texi Wed Mar 22 05:48:48 1995 *************** *** 20,26 **** This file documents (ding) Gnus, the GNU Emacs newsreader. ! Copyright (C) 1989, 1990, 1993 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice --- 20,26 ---- This file documents (ding) Gnus, the GNU Emacs newsreader. ! Copyright (C) 1989, 1990, 1993, 1995 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice *************** *** 95,172 **** @node History @chapter History ! GNUS was written by Masanobu UMEDA. When autumn crept up in '94, Lars ! Magne Ingebrigtsen grew bored and decided to write (ding) Gnus. ! (ding) Gnus is based on GNUS 4.1 and includes excellent functions from ! Per Abrahamsen, lots of fixes by Sudish Joseph, as well as bits and pieces from the XGnus distribution by Felix Lee and JWZ. The recommended pronounciation of the name this program is "ding guh-noose", with "ding" being half-sung in a loud, high-pitched voice, ! and "guh-noose" being grumbled and a disaffected fashion. Any irritation ! and/or damage this name may cause you is not the responsibility of the ! author, even though you might like to strangle him for the stupid idea. If you want to take a look at the person responsible for this outrage, you can point your (feh!) web browser to ! (@samp{http://www.ifi.uio.no/~larsi/}). This is also the primary ! distribution point for new and spiffy versions of Gnus, also know as The ! Place That Destroys Newsrcs And Drives People Mad. ! ! "(ding)", is, of course, short for "Ding Is Not Gnus", which is a total ! and utter lie, but who cares? (Besides, the "Gnus" in this abbreviation ! should probably be pronounced "news" as UMEDA intended, which makes it a ! more appropriate name, don't you think?) @menu ! * Compatibility:: Just how compatible is (ding) Gnus with GNUS? * New Features:: A short description of all the new stuff in Gnus. @end menu @node Compatibility @section Compatibility ! (ding) Gnus was designed to be fully compatible with GNUS. Almost all ! key binding have been kept. More key binding have been added, of course, ! but only in one or two obscure cases have key bindings been changed. All commands have kept their names. Some internal functions have changed their names. One major compatability question if the presence of several summary buffers. The variables that are relevant while reading a group are buffer-local to the summary buffer they belong in. Although most important variables have their values copied into their global counterparts whenever a command is executed in the summary buffer, this ! might lead to incorrect values being used if one is not careful. ! All code that relies on knowledge of GNUS internals will probably fail. ! To take two examples: Sorting @code{gnus-newsrc-assoc} (or changing it ! in any way, as a matter of fact) is strictly verboten. Gnus maintains a ! hash table that points to the entries in this assoc (which speeds up ! many functions), and changing the assoc directly will lead to peculiar ! results. Packages like @code{expire-kill} will no longer work. As a matter of ! fact, you should probably remove all old GNUS packages (and other code) ! when you start using (ding) Gnus. More likely than not, (ding) Gnus ! already do what you have written code to make GNUS do. (Snicker.) Even though old methods of doing things are still supported, only the new methods are documented in this manual. If you detect a new method of doing something while reading this manual, that does not mean you have to stop doing it the old way. ! (ding) Gnus understands all GNUS startup files. @kindex M-x gnus-bug ! Overall, a casual user who hasn't written much code that depends on GNUS ! internals should suffer no problems. If problems occur, please let me ! know (@kbd{M-x gnus-bug}). @node New Features @section New Features The look of all buffers can be changed by setting format-like variables. --- 95,197 ---- @node History @chapter History ! @cindex history ! @sc{GNUS} was written by Masanobu UMEDA. When autumn crept up in '94, ! Lars Magne Ingebrigtsen grew bored and decided to write (ding) Gnus. ! (ding) Gnus is based on @sc{GNUS 4.1} and includes excellent functions ! from Per Abrahamsen, lots of fixes by Sudish Joseph, as well as bits and pieces from the XGnus distribution by Felix Lee and JWZ. The recommended pronounciation of the name this program is "ding guh-noose", with "ding" being half-sung in a loud, high-pitched voice, ! and "guh-noose" being grumbled and a disaffected fashion. Any ! irritation and/or damage this name may cause you is not the ! responsibility of the author, even though you might like to strangle him ! for the stupid idea. If you want to take a look at the person responsible for this outrage, you can point your (feh!) web browser to ! @file{http://www.ifi.uio.no/~larsi/}. This is also the primary ! distribution point for the new and spiffy versions of Gnus, also know as ! The Site That Destroys Newsrcs And Drives People Mad. ! ! @dfn{(ding)}, is, of course, short for @dfn{ding is not Gnus}, which is ! a total and utter lie, but who cares? (Besides, the "Gnus" in this ! abbreviation should probably be pronounced "news" as UMEDA intended, ! which makes it a more appropriate name, don't you think?) @menu ! * Compatibility:: Just how compatible is (ding) Gnus with @sc{GNUS}? * New Features:: A short description of all the new stuff in Gnus. @end menu @node Compatibility @section Compatibility ! @cindex compatability ! (ding) Gnus was designed to be fully compatible with @sc{GNUS}. Almost ! all key binding have been kept. More key binding have been added, of ! course, but only in one or two obscure cases have key bindings been ! changed. ! ! Our motto is: ! @quotation ! @cartouche ! In a cloud bones of steel. ! @end cartouche ! @end quotation All commands have kept their names. Some internal functions have changed their names. + The @code{gnus-uu} package has changed drastically. @xref{Decoding + Articles}. + One major compatability question if the presence of several summary buffers. The variables that are relevant while reading a group are buffer-local to the summary buffer they belong in. Although most important variables have their values copied into their global counterparts whenever a command is executed in the summary buffer, this ! might lead to incorrect values being used if one is not careful. ! All code that relies on knowledge of @sc{GNUS} internals will probably ! fail. To take two examples: Sorting @code{gnus-newsrc-assoc} (or ! changing it in any way, as a matter of fact) is strictly verboten. Gnus ! maintains a hash table that points to the entries in this assoc (which ! speeds up many functions), and changing the assoc directly will lead to ! peculiar results. ! ! @cindex hilit19 ! @cindex highlighting ! Old hilit19 code does not work at all. In fact, you should probably ! remove all hihit code from all the Gnus hooks ! (@code{gnus-group-prepare-hook}, @code{gnus-summary-prepare-hook} and ! @code{gnus-summary-article-hook}). (Well, at the very least the first ! two.) Gnus provides various integrated functions for highlighting, ! which are both faster and more accurated. Packages like @code{expire-kill} will no longer work. As a matter of ! fact, you should probably remove all old @sc{GNUS} packages (and other ! code) when you start using (ding) Gnus. More likely than not, (ding) ! Gnus already do what you have written code to make @sc{GNUS} do. ! (Snicker.) Even though old methods of doing things are still supported, only the new methods are documented in this manual. If you detect a new method of doing something while reading this manual, that does not mean you have to stop doing it the old way. ! (ding) Gnus understands all @sc{GNUS} startup files. @kindex M-x gnus-bug ! Overall, a casual user who hasn't written much code that depends on ! @sc{GNUS} internals should suffer no problems. If problems occur, ! please let me know (@kbd{M-x gnus-bug}). @node New Features @section New Features + @cindex new features The look of all buffers can be changed by setting format-like variables. *************** *** 180,188 **** Killed groups can be displayed in the group buffer, and you can read them as well. ! Gnus can do partial updates of new articles - you do not have to ! retrieve the entire active file just to check for new articles in a few ! groups. Gnus implements a sliding scale of subscribedness to groups. --- 205,212 ---- Killed groups can be displayed in the group buffer, and you can read them as well. ! Gnus can do partial group updates - you do not have to retrieve the ! entire active file just to check for new articles in a few groups. Gnus implements a sliding scale of subscribedness to groups. *************** *** 192,214 **** @node Terminology @chapter Terminology @table @samp @item news ! This is what you are supposed to use this thing for - reading news. News ! is generally fetched from a nearby NNTP server, and is generally publicly available to everybody. If you post news, the entire world is ! likely to read just what you have writte, and they'll all snigger mischievously. Behind your back. @item mail Everything that's delivered to you personally is mail. Some news/mail readers (like Gnus) blur the distinction between mail and news, but ! there is a difference. Mail is private. News is public. Mailing is not ! posting, and replying is not following up. @item reply Send a mail to the person who has written what you are reading. @item follow up ! Post an article to the newsgroup you are reading, responding to the ! article you are reading. @item backend Gnus gets fed articles from a number of backends, both news and mail backends. Gnus does not handle the underlying media, so to speak - this --- 216,239 ---- @node Terminology @chapter Terminology + @cindex terminology @table @samp @item news ! This is what you are supposed to use this thing for - reading news. ! News is generally fetched from a nearby NNTP server, and is generally publicly available to everybody. If you post news, the entire world is ! likely to read just what you have written, and they'll all snigger mischievously. Behind your back. @item mail Everything that's delivered to you personally is mail. Some news/mail readers (like Gnus) blur the distinction between mail and news, but ! there is a difference. Mail is private. News is public. Mailing is ! not posting, and replying is not following up. @item reply Send a mail to the person who has written what you are reading. @item follow up ! Post an article to the current newsgroup responding to the article you ! are reading. @item backend Gnus gets fed articles from a number of backends, both news and mail backends. Gnus does not handle the underlying media, so to speak - this *************** *** 233,238 **** --- 258,264 ---- @node Starting Up @chapter Starting Gnus + @cindex starting up @kindex M-x gnus If your system administrator has set thing up properly, starting Gnus *************** *** 258,279 **** @vindex gnus-select-method The @code{gnus-select-method} variable controls how Gnus finds news. This variable should be a list where the first element says "how" and ! the second element says "where". This method is is your local ! server. All group that are not gotten with this method other servers are ! foreign groups. For instance, if you want to get your daily dosage of news from the NNTP server "news.friendly.server", you'd say: ! @example (setq gnus-select-method '(nntp "news.friendly.server")) ! @end example If you want to use a local spool, say: ! @example (setq gnus-select-method '(nnspool "")) ! @end example If you can use the local spool, you probably should, as it will almost certainly be much faster. --- 284,304 ---- @vindex gnus-select-method The @code{gnus-select-method} variable controls how Gnus finds news. This variable should be a list where the first element says "how" and ! the second element says "where". This method is is your native method. ! All groups that are not fetched with this method are foreign groups. For instance, if you want to get your daily dosage of news from the NNTP server "news.friendly.server", you'd say: ! @lisp (setq gnus-select-method '(nntp "news.friendly.server")) ! @end lisp If you want to use a local spool, say: ! @lisp (setq gnus-select-method '(nnspool "")) ! @end lisp If you can use the local spool, you probably should, as it will almost certainly be much faster. *************** *** 285,298 **** @vindex gnus-nntp-server If @code{gnus-nntp-server} is set, this variable will override @code{gnus-select-method}. You should therefore set ! @code{gnus-nntp-server} to nil, which is what it is by default. @vindex gnus-secondary-servers You can also make Gnus prompt you interactively for the name of an NNTP server. If you give a non-numerical prefix to @code{gnus} (ie. @kbd{C-u M-x gnus}), Gnus will let you choose between the servers in the ! @code{gnus-secondary-servers} variable (if any). You can also just type ! in the name of any server you feel like visiting. However, if you use one NNTP server regularly, and is just interested in a couple of groups from a different server, you would be better served --- 310,323 ---- @vindex gnus-nntp-server If @code{gnus-nntp-server} is set, this variable will override @code{gnus-select-method}. You should therefore set ! @code{gnus-nntp-server} to @code{nil}, which is what it is by default. @vindex gnus-secondary-servers You can also make Gnus prompt you interactively for the name of an NNTP server. If you give a non-numerical prefix to @code{gnus} (ie. @kbd{C-u M-x gnus}), Gnus will let you choose between the servers in the ! @code{gnus-secondary-servers} list (if any). You can also just type in ! the name of any server you feel like visiting. However, if you use one NNTP server regularly, and is just interested in a couple of groups from a different server, you would be better served *************** *** 302,325 **** @file{.newsrc} maintenance much tidier. @xref{Foreign Groups}. @vindex gnus-secondary-select-methods ! A slightly different approach is to set the @code{gnus-secondary-select-methods} variable. The select methods ! listed in this variable are in many ways just as local as the @code{gnus-select-method} server. They will also be asked for active files during startup (if that's required), and new newsgroups that ! appear on these servers will be subscribed (or not) just as local groups ! are. For instance, if you use the @code{nnmbox} backend to read you mail, you would typically set this variable to ! @example (setq gnus-secondary-select-methods '((nnmbox ""))) ! @end example @node The First Time @section The First Time If no startup files exist, Gnus will try to determine what groups should be subscribed by default. --- 327,351 ---- @file{.newsrc} maintenance much tidier. @xref{Foreign Groups}. @vindex gnus-secondary-select-methods ! A slightly different approach to foreign groups is to set the @code{gnus-secondary-select-methods} variable. The select methods ! listed in this variable are in many ways just as native as the @code{gnus-select-method} server. They will also be asked for active files during startup (if that's required), and new newsgroups that ! appear on these servers will be subscribed (or not) just as native ! groups are. For instance, if you use the @code{nnmbox} backend to read you mail, you would typically set this variable to ! @lisp (setq gnus-secondary-select-methods '((nnmbox ""))) ! @end lisp @node The First Time @section The First Time + @cindex first time usage If no startup files exist, Gnus will try to determine what groups should be subscribed by default. *************** *** 327,333 **** @vindex gnus-default-subscribed-newsgroups If the variable @code{gnus-default-subscribed-newsgroups} is set, Gnus will subscribe you to just those groups in that list, leaving the rest ! killed. Your systems administrator should have set this variable to something useful. Since she hasn't, Gnus will just subscribe you to a few randomly picked --- 353,359 ---- @vindex gnus-default-subscribed-newsgroups If the variable @code{gnus-default-subscribed-newsgroups} is set, Gnus will subscribe you to just those groups in that list, leaving the rest ! killed. Your system administrator should have set this variable to something useful. Since she hasn't, Gnus will just subscribe you to a few randomly picked *************** *** 337,348 **** You'll also be subscribed to the Gnus documentation group, which should help you with most common problems. ! If @code{gnus-default-subscribed-newsgroups} is t, Gnus will just use ! the normal functions for treating new groups, and not do anything special. @node The Server is Down @section The Server is Down If the default server is down, Gnus will understandably have some problems starting. However, if you have some mail groups in addition to --- 363,375 ---- You'll also be subscribed to the Gnus documentation group, which should help you with most common problems. ! If @code{gnus-default-subscribed-newsgroups} is @code{t}, Gnus will just use ! the normal functions for handling new groups, and not do anything special. @node The Server is Down @section The Server is Down + @cindex server errors If the default server is down, Gnus will understandably have some problems starting. However, if you have some mail groups in addition to *************** *** 351,362 **** @findex gnus-no-server You can do that by @kbd{M-x gnus-no-server}. This will start Gnus without attempting to contact the default server. Gnus will be started ! on level two, so you shouldn't have any groups from the local server on level one or two, but only have mail groups and other foreign groups on these two levels. @node New Groups @section New Groups @vindex gnus-subscribe-newsgroup-method What Gnus does when it encounters a new group is determined by the --- 378,390 ---- @findex gnus-no-server You can do that by @kbd{M-x gnus-no-server}. This will start Gnus without attempting to contact the default server. Gnus will be started ! on level two, so you shouldn't have any groups from the native server on level one or two, but only have mail groups and other foreign groups on these two levels. @node New Groups @section New Groups + @cindex new groups @vindex gnus-subscribe-newsgroup-method What Gnus does when it encounters a new group is determined by the *************** *** 378,384 **** @item gnus-subscribe-interactively @vindex gnus-subscribe-interactively Subscribe new groups interactively. This means that Gnus will ask ! you about *all* new groups. @item gnus-subscribe-zombies @vindex gnus-subscribe-zombies Make all new groups zombies. You can browse the zombies later and --- 406,412 ---- @item gnus-subscribe-interactively @vindex gnus-subscribe-interactively Subscribe new groups interactively. This means that Gnus will ask ! you about @strong{all} new groups. @item gnus-subscribe-zombies @vindex gnus-subscribe-zombies Make all new groups zombies. You can browse the zombies later and *************** *** 389,395 **** @vindex gnus-subscribe-hierarchical-interactive A closely related variable is @code{gnus-subscribe-hierarchical-interactive}. (That's quite a ! mouthful.) If this variable is non-nil, Gnus will ask you in a hierarchial fashion whether to subscribe to new groups or not. Gnus will ask you for each sub-hierarchy whether you want to descend the hierarchy or not. --- 417,423 ---- @vindex gnus-subscribe-hierarchical-interactive A closely related variable is @code{gnus-subscribe-hierarchical-interactive}. (That's quite a ! mouthful.) If this variable is non-@code{nil}, Gnus will ask you in a hierarchial fashion whether to subscribe to new groups or not. Gnus will ask you for each sub-hierarchy whether you want to descend the hierarchy or not. *************** *** 407,413 **** person (or she may just be plain old boring), because it says that all groups that have names beginning with @samp{alt} and @samp{rec} should be ignored, and all groups with names beginning with @samp{sci} should ! be subscribed. Gnus doesn't use the normal subscription method for subscribing these groups. @code{gnus-subscribe-options-newsgroup-method} is used instead. This variable defaults to @code{gnus-subscribe-alphabetically}. --- 435,441 ---- person (or she may just be plain old boring), because it says that all groups that have names beginning with @samp{alt} and @samp{rec} should be ignored, and all groups with names beginning with @samp{sci} should ! be subscribed. Gnus will not use the normal subscription method for subscribing these groups. @code{gnus-subscribe-options-newsgroup-method} is used instead. This variable defaults to @code{gnus-subscribe-alphabetically}. *************** *** 416,443 **** @vindex gnus-options-subscribe If you don't want to mess with your @file{.newsrc} file, you can just set the two variables @code{gnus-options-subscribe} and ! @code{gnus-options-not-subscribe}. These two functions does exactly the same as the @file{.newsrc} options -n trick. Both are regexps, and if the the new group matches the first, it will be unconditionally subscribed, and if it matches the latter, it will be ignored. @vindex gnus-check-new-newsgroups If you are satisfied that you really never want to see any new groups, ! you could set @code{gnus-check-new-newsgroups} to nil. This will also ! save you some time at startup. Even if this variable is nil, you can ! always subscribe to the new groups by just pressing @kbd{U} in the ! @dfn{group buffer}. @xref{Group Maintenance} for how to check for new ! groups manually. ! ! If @code{gnus-check-new-newsgroups} is @code{ask-server}, Gnus will ask ! the server for new groups since last time it asked instead of ! determining what groups are new by comparing active groups with known ! groups. This is both faster & cheaper. This also means that you can ! get rid of the list of killed groups altogether, so you may set ! @code{gnus-save-killed-list} to nil, which will save time both at ! startup, at exit, and all over. Saves disk space, too. The only ! problem with this method is that not all servers support this ! functionality. This variable can also be a list of select methods. If so, Gnus will issue an @code{ask-server} command to each of the select methods, and --- 444,471 ---- @vindex gnus-options-subscribe If you don't want to mess with your @file{.newsrc} file, you can just set the two variables @code{gnus-options-subscribe} and ! @code{gnus-options-not-subscribe}. These two variables do exactly the same as the @file{.newsrc} options -n trick. Both are regexps, and if the the new group matches the first, it will be unconditionally subscribed, and if it matches the latter, it will be ignored. @vindex gnus-check-new-newsgroups If you are satisfied that you really never want to see any new groups, ! you could set @code{gnus-check-new-newsgroups} to @code{nil}. This will ! also save you some time at startup. Even if this variable is ! @code{nil}, you can always subscribe to the new groups just by pressing ! @kbd{U} in the group buffer (@pxref{Group Maintenance}). ! ! Gnus normally determine whether a group is new or not by comparing the ! list of groups from the active file(s) with the lists of subscribed and ! dead groups. This isn't a particularly fast method. If ! @code{gnus-check-new-newsgroups} is @code{ask-server}, Gnus will ask the ! server for new groups since the last time. This is both faster & ! cheaper. This also means that you can get rid of the list of killed ! groups altogether, so you may set @code{gnus-save-killed-list} to ! @code{nil}, which will save time both at startup, at exit, and all over. ! Saves disk space, too. Why isn't this the default, then? ! Unfortunately, not all servers support this function. This variable can also be a list of select methods. If so, Gnus will issue an @code{ask-server} command to each of the select methods, and *************** *** 448,465 **** @node Startup Files @section Startup Files Now, you all know about the @file{.newsrc} files. All information about what groups you read is traditionally stored in this file, which has a rather rigid structure. ! Things got a bit more complicated with GNUS. In addition to keeping the ! @file{.newsrc} file updated, it also used a file called @file{.newsrc.el} for storing all the information that didn't fit into the @file{.newsrc} file. (Actually, it duplicated everything in the ! @file{.newsrc} file.) GNUS would read whichever one of these files that ! were the most recently saved, which enabled people to swap between GNUS ! and other newsreaders. That was kinda silly, so (ding) Gnus went one better: In addition to the @file{.newsrc} and @file{.newsrc.el} files, (ding) Gnus also has a file --- 476,495 ---- @node Startup Files @section Startup Files + @cindex startup files + @cindex .newsrc Now, you all know about the @file{.newsrc} files. All information about what groups you read is traditionally stored in this file, which has a rather rigid structure. ! Things got a bit more complicated with @sc{GNUS}. In addition to ! keeping the @file{.newsrc} file updated, it also used a file called @file{.newsrc.el} for storing all the information that didn't fit into the @file{.newsrc} file. (Actually, it duplicated everything in the ! @file{.newsrc} file.) @sc{GNUS} would read whichever one of these files ! that were the most recently saved, which enabled people to swap between ! @sc{GNUS} and other newsreaders. That was kinda silly, so (ding) Gnus went one better: In addition to the @file{.newsrc} and @file{.newsrc.el} files, (ding) Gnus also has a file *************** *** 468,485 **** @vindex gnus-save-newsrc-file You can also turn off writing @file{.newsrc} by setting ! @code{gnus-save-newsrc-file} to nil, which means you can delete the file ! and save some space, as well as some time when quitting Gnus. However, ! that will make it impossible to use other newsreaders than (ding) Gnus. ! But hey, who would want to, right? @vindex gnus-save-killed-list ! If @code{gnus-save-killed-list} is nil, Gnus will not save the list of ! killed groups to the startup file. This will save both time (when ! starting and quitting) and space (on disk). It will also means that ! Gnus has no record of what groups are new or old, so the automatic new ! groups subscription methods become meaningless. You should always set ! @code{gnus-check-new-newsgroups} to nil if you set this variable to nil. @vindex gnus-startup-file The @code{gnus-startup-file} variable says where the startup files are. --- 498,516 ---- @vindex gnus-save-newsrc-file You can also turn off writing @file{.newsrc} by setting ! @code{gnus-save-newsrc-file} to @code{nil}, which means you can delete ! the file and save some space, as well as some time when quitting Gnus. ! However, that will make it impossible to use other newsreaders than ! (ding) Gnus. But hey, who would want to, right? @vindex gnus-save-killed-list ! If @code{gnus-save-killed-list} is @code{nil}, Gnus will not save the ! list of killed groups to the startup file. This will save both time ! (when starting and quitting) and space (on disk). It will also means ! that Gnus has no record of what groups are new or old, so the automatic ! new groups subscription methods become meaningless. You should always ! set @code{gnus-check-new-newsgroups} to @code{nil} if you set this ! variable to @code{nil}. @vindex gnus-startup-file The @code{gnus-startup-file} variable says where the startup files are. *************** *** 492,497 **** --- 523,530 ---- @node Auto Save @section Auto Save + @cindex dribble file + @cindex auto-save Whenever you do something that changes the Gnus data (reading articles, cathing up, killing/subscribing to groups,) the change is added to a *************** *** 506,516 **** The auto save file is deleted whenever the real startup file is saved. @vindex gnus-use-dribble-file ! If @code{gnus-use-dribble-file} is nil, Gnus won't create and maintain a ! dribble buffer. @node The Active File @section The Active File When Gnus starts, or indeed whenever it tries to determine whether new articles have arrived, it reads the active file. This is a large file --- 539,551 ---- The auto save file is deleted whenever the real startup file is saved. @vindex gnus-use-dribble-file ! If @code{gnus-use-dribble-file} is @code{nil}, Gnus won't create and ! maintain a dribble buffer. @node The Active File @section The Active File + @cindex active file + @cindex ignored groups When Gnus starts, or indeed whenever it tries to determine whether new articles have arrived, it reads the active file. This is a large file *************** *** 526,543 **** @vindex gnus-read-active-file The active file can be rather Huge, so if you have a slow network, you ! can set @code{gnus-read-active-file} to nil to prevent Gnus from reading ! the active file. Gnus will try to make do by just getting information on the groups that you actually subscribe to. Note that if you subscribe to lots and lots of groups, setting this ! variable to nil will probabaly make Gnus slower, not faster. At ! present, having this variable nil will slow Gnus down considerably, ! unless you read news over a 2400 baud modem. Gnus does the group info ! fetching in total lock-step, so if you have this variable nil, you ! should kill all groups that you aren't interested in to speed things up. There are plans for doing lots of Gnus stuff asynchronously, which should make this option more useful, but that's probably some ways off --- 561,579 ---- @vindex gnus-read-active-file The active file can be rather Huge, so if you have a slow network, you ! can set @code{gnus-read-active-file} to @code{nil} to prevent Gnus from ! reading the active file. Gnus will try to make do by just getting information on the groups that you actually subscribe to. Note that if you subscribe to lots and lots of groups, setting this ! variable to @code{nil} will probabaly make Gnus slower, not faster. At ! present, having this variable @code{nil} will slow Gnus down ! considerably, unless you read news over a 2400 baud modem. Gnus does ! the group info fetching in total lock-step, so if you have this variable ! @code{nil}, you should kill all groups that you aren't interested in to ! speed things up. There are plans for doing lots of Gnus stuff asynchronously, which should make this option more useful, but that's probably some ways off *************** *** 549,568 **** @table @code @item gnus-check-bogus-newsgroups @vindex gnus-check-bogus-newsgroups ! If non-nil, Gnus will check for and delete all bogus groups at startup. ! A @dfn{bogus group} is a group that you have in your @file{.newsrc} ! file, but doesn't exist on the news server. Checking for bogus groups ! isn't very quick, so to save time and resources, it's best to leave this ! option off, and instead do the checking for bogus groups once in a while ! from the group buffer (@pxref{Group Maintenance}). @item gnus-inhibit-startup-message @vindex gnus-inhibit-startup-message ! If non-nil, the startup message won't be displayed. That way, your boss ! might not notice thay you are reading news instead of doing your job. @end table @node The Group Buffer @chapter The Group Buffer The @dfn{group buffer} lists all (or parts) of the available groups. It is the first buffer shown when Gnus starts, and will never be killed as --- 585,606 ---- @table @code @item gnus-check-bogus-newsgroups @vindex gnus-check-bogus-newsgroups ! If non-@code{nil}, Gnus will check for and delete all bogus groups at ! startup. A @dfn{bogus group} is a group that you have in your ! @file{.newsrc} file, but doesn't exist on the news server. Checking for ! bogus groups isn't very quick, so to save time and resources, it's best ! to leave this option off, and instead do the checking for bogus groups ! once in a while from the group buffer (@pxref{Group Maintenance}). @item gnus-inhibit-startup-message @vindex gnus-inhibit-startup-message ! If non-@code{nil}, the startup message won't be displayed. That way, ! your boss might not notice thay you are reading news instead of doing ! your job. @end table @node The Group Buffer @chapter The Group Buffer + @cindex group buffer The @dfn{group buffer} lists all (or parts) of the available groups. It is the first buffer shown when Gnus starts, and will never be killed as *************** *** 584,589 **** --- 622,628 ---- @node Group Buffer Format @section Group Buffer Format + @cindex group buffer format The default format of the group buffer is nice and dull, but you can make it as exciting and ugly as you feel like. *************** *** 668,674 **** used. @item u User defined specifier. The next character in the format string should ! be a letter. GNUS will call the function gnus-user-format-function-X, where X is the letter following %u. The function will be passed the current headers as argument. The function should return a string, which will be inserted into the buffer just like information from any other --- 707,713 ---- used. @item u User defined specifier. The next character in the format string should ! be a letter. @sc{GNUS} will call the function gnus-user-format-function-X, where X is the letter following %u. The function will be passed the current headers as argument. The function should return a string, which will be inserted into the buffer just like information from any other *************** *** 689,694 **** --- 728,734 ---- @node Group Manouvering @section Group Manouvering + @cindex group movement All movement commands understand the numeric prefix and will behave as expected, hopefully. *************** *** 699,705 **** @findex gnus-group-next-unread-group Go to the next group with unread articles (@code{gnus-group-next-unread-group}). ! @item p, DEL @kindex DEL (Group) @kindex p (Group) @findex gnus-group-prev-unread-group --- 739,746 ---- @findex gnus-group-next-unread-group Go to the next group with unread articles (@code{gnus-group-next-unread-group}). ! @item p ! @item DEL @kindex DEL (Group) @kindex p (Group) @findex gnus-group-prev-unread-group *************** *** 743,748 **** --- 784,790 ---- @node Selecting a Group @section Selecting a Group + @cindex group selection @table @kbd @item SPACE *************** *** 783,792 **** @vindex gnus-select-group-hook @vindex gnus-auto-select-newsgroup ! If @code{gnus-auto-select-newsgroup} is non-nil, the first unread article in the group will be displayed when you enter the group. If you want to prevent automatic selection in some group (say, in a binary ! group with Huge articles) you can set this variable to nil in @code{gnus-select-group-hook}, which is called when a group is selected. @findex gnus-thread-sort-by-total-score --- 825,834 ---- @vindex gnus-select-group-hook @vindex gnus-auto-select-newsgroup ! If @code{gnus-auto-select-newsgroup} is non-@code{nil}, the first unread article in the group will be displayed when you enter the group. If you want to prevent automatic selection in some group (say, in a binary ! group with Huge articles) you can set this variable to @code{nil} in @code{gnus-select-group-hook}, which is called when a group is selected. @findex gnus-thread-sort-by-total-score *************** *** 804,812 **** @code{gnus-thread-sort-by-date}, @code{gnus-thread-sort-by-score}, @code{gnus-thread-sort-by-total-score}. ! Each function takes two threads and return non-nil if the first thread ! should be sorted before the other. If you use more than one function, ! the primary sort key should be the last function in the list. @vindex gnus-thread-score-function The function in the @code{gnus-thread-score-function} variable (default --- 846,854 ---- @code{gnus-thread-sort-by-date}, @code{gnus-thread-sort-by-score}, @code{gnus-thread-sort-by-total-score}. ! Each function takes two threads and return non-@code{nil} if the first ! thread should be sorted before the other. If you use more than one ! function, the primary sort key should be the last function in the list. @vindex gnus-thread-score-function The function in the @code{gnus-thread-score-function} variable (default *************** *** 816,821 **** --- 858,864 ---- @node Group Subscribing @section Group Subscribing + @cindex subscribing @table @kbd @item u *************** *** 849,854 **** --- 892,898 ---- @node Group Levels @section Group Levels + @cindex group level All groups have a level of @dfn{subscribedness}. For instance, if a group is on level 2, it is more subscribed than a group on level 5. You *************** *** 878,885 **** and keep your mail groups (if any) on level 1 or 2. @vindex gnus-keep-same-level ! If @code{gnus-keep-same-level} is non-nil, some movement commands will ! only move to groups that are of the same level (or lower). In particular, going from the last article in one group to the next group will go to the next group of the same level (or lower). This might be handy if you want to read the most important groups before you read the --- 922,929 ---- and keep your mail groups (if any) on level 1 or 2. @vindex gnus-keep-same-level ! If @code{gnus-keep-same-level} is non-@code{nil}, some movement commands ! will only move to groups that are of the same level (or lower). In particular, going from the last article in one group to the next group will go to the next group of the same level (or lower). This might be handy if you want to read the most important groups before you read the *************** *** 887,892 **** --- 931,937 ---- @node Foreign Groups @section Foreign Groups + @cindex foreign groups A @dfn{foreign group} is a group that is not read by the usual (or default) means. It could be, for instance, a group from a different *************** *** 957,967 **** If the @code{gnus-activate-foreign-newsgroups} is a positive number, Gnus will check all foreign groups with this level or lower at startup. This might take quite a while, especially if you subscribe to lots of ! groups from different NNTP servers. It is nil by default, which means ! that you won't be told whether there are new articles in these groups. ! How many unread articles there are will be determined when, or if, you ! decide to enter them. You can also activate any group with @kbd{M-g} to ! see how many unread articles there are. @cindex to-address If the select method contains an element that looks like --- 1002,1012 ---- If the @code{gnus-activate-foreign-newsgroups} is a positive number, Gnus will check all foreign groups with this level or lower at startup. This might take quite a while, especially if you subscribe to lots of ! groups from different NNTP servers. It is @code{nil} by default, which ! means that you won't be told whether there are new articles in these ! groups. How many unread articles there are will be determined when, or ! if, you decide to enter them. You can also activate any group with ! @kbd{M-g} to see how many unread articles there are. @cindex to-address If the select method contains an element that looks like *************** *** 980,986 **** type @kbd{M e} to edit the group entry. You'll then be put in a buffer where you can edit the group entry. ! @example (gnus-group-set-info '("ifi.fritt-forum" 3 ((1 . 3321) --- 1025,1031 ---- type @kbd{M e} to edit the group entry. You'll then be put in a buffer where you can edit the group entry. ! @lisp (gnus-group-set-info '("ifi.fritt-forum" 3 ((1 . 3321) *************** *** 988,1010 **** ((score (3322 . 1000) (3324 . 1000))))) ! @end example A fifth entry has to be added. (In case there isn't a fourth one, you ! have to add a fourth one yourself - nil.) The fifth entry should look ! like this: ! @example (nntp "your.host" (to-address . "4ad-l@@jhuvm.hcf.jhu.edu")) ! @end example The two first entries in this method should, of course, be the same as @code{gnus-select-method}. Quite simple, eh? *Ouch*. @node nntp @subsection nntp Subscribing to a foreign group from an NNTP server is rather easy. You just specify @code{nntp} as method and the address of the NNTP server as --- 1033,1075 ---- ((score (3322 . 1000) (3324 . 1000))))) ! @end lisp A fifth entry has to be added. (In case there isn't a fourth one, you ! have to add a fourth one yourself - @code{nil}.) The fifth entry should ! look like this: ! @lisp (nntp "your.host" (to-address . "4ad-l@@jhuvm.hcf.jhu.edu")) ! @end lisp The two first entries in this method should, of course, be the same as @code{gnus-select-method}. Quite simple, eh? *Ouch*. + Let's take time out for a poem by Reznikoff: + + @quotation + Te Deum + @sp 2 + Not because of victories @* + I sing,@* + having none,@* + but for the common sunshine,@* + the breeze,@* + the largess of the spring. + @sp 2 + Not for victory@* + but for the day's work done@* + as well as I was able;@* + not for a seat upon the dais@* + but at the common table.@* + @end quotation + @node nntp @subsection nntp + @cindex nntp Subscribing to a foreign group from an NNTP server is rather easy. You just specify @code{nntp} as method and the address of the NNTP server as *************** *** 1026,1031 **** --- 1091,1097 ---- by default) or to send the @code{AUTHINFO} command, if the server requires that. + @vindex nntp-maximum-request If the NNTP server doesn't support NOV headers, this backend will collect headers by sending a series of @code{HEAD} commands. To speed things up, the backend sends lots of these commands, without waiting for *************** *** 1033,1040 **** --- 1099,1117 ---- @code{nntp-maximum-request} variable, and is 400 by default. If your network is buggy, you should set this to 1. + @vindex nntp-connection-timeout + If you have lots of foreign nntp groups that you connect to regularly, + you're sure to have problems with nntp servers not responding properly, + or being too loaded to reply within reasonable time. This is can lead + to awkward problems, which can be helped somewhat by setting + @code{nntp-connection-timeout}. This is an integer that says how many + seconds the nntp backend should wait for a connection before giving up. + If it is @code{nil}, which is the default, no timeouts are done. + @node nnspool @subsection nnspool + @cindex nnspool + @cindex news spool Subscribing to a foreign group from the local spool is extremely easy, and might be useful, for instance, to speed up reading groups like *************** *** 1061,1066 **** --- 1138,1145 ---- @node nnvirtual @subsection nnvirtual + @cindex nnvirtual + @cindex virtual groups A @dfn{virtual group} is really nothing more than a collection of other groups. *************** *** 1094,1103 **** "^nntp+some.server.jp:soc.motss\\|^nntp+some.server.no:soc.motss" @end example ! This should work kinda smootly, with no duplicates, but all articles ! from both groups. Threading (and the rest) will still work as usual, but ! there might be problems with the sequence of articles. Sorting on date ! might be an option here. One limitation, however - all groups that are included in a virtual group has to be alive (ie. subscribed or unsubscribed). Killed or --- 1173,1182 ---- "^nntp+some.server.jp:soc.motss\\|^nntp+some.server.no:soc.motss" @end example ! This should work kinda smoothly - all articles from both groups should ! end up in this one, and there should be no duplicates. Threading (and ! the rest) will still work as usual, but there might be problems with the ! sequence of articles. Sorting on date might be an option here. One limitation, however - all groups that are included in a virtual group has to be alive (ie. subscribed or unsubscribed). Killed or *************** *** 1105,1110 **** --- 1184,1191 ---- @node nnkiboze @subsection nnkiboze + @cindex nnkiboze + @cindex kibozing @dfn{kibozing} is defined by OED as "grepping through (parts of) the news feed". nnkiboze is a backend that will do this for you. Oh joy! *************** *** 1149,1154 **** --- 1230,1237 ---- @node nndir @subsection nndir + @cindex nndir + @cindex directory groups If you have a directory that has lots of articles in separate files in it, you might treat it as a newsgroup. The files have to have numerical *************** *** 1167,1172 **** --- 1250,1258 ---- @node nndoc @subsection nndoc + @cindex nndoc + @cindex documentation group + @cindex help group nndoc is a cute little thing that will let you read a single file as a newsgroup. The file has to be divided into articles by the use of Unix *************** *** 1176,1181 **** --- 1262,1269 ---- @node nndigest @subsection nndigest + @cindex nndigest + @cindex digest groups nndigest is a bit odd. It will use a buffer containing a valid digest as the basis of the group. *************** *** 1193,1200 **** @node Mail @subsection Mail ! ! @cindex Reading mail Reading mail with a newsreader - isn't that just plain WeIrD? But of course. --- 1281,1288 ---- @node Mail @subsection Mail ! @cindex reading mail ! @cindex mail Reading mail with a newsreader - isn't that just plain WeIrD? But of course. *************** *** 1224,1231 **** @vindex nnmail-spool-file @code{nnmail-spool-file} says where to look for new mail. If this ! variable is nil, the mail backends will never attempt to fetch mail by ! themselves. Gnus gives you all the opportunity you want for shooting yourself in your foot. Let's say you create a group that will contain all the mail --- 1312,1319 ---- @vindex nnmail-spool-file @code{nnmail-spool-file} says where to look for new mail. If this ! variable is @code{nil}, the mail backends will never attempt to fetch ! mail by themselves. Gnus gives you all the opportunity you want for shooting yourself in your foot. Let's say you create a group that will contain all the mail *************** *** 1239,1244 **** --- 1327,1333 ---- @node Creating Mail Groups @subsubsection Creating Mail Groups + @cindex creating mail groups You can make Gnus read your personal, private, secret mail. *************** *** 1253,1264 **** The you should set the variable @code{nnmail-split-methods} to specify how the incoming mail is to be split into groups. ! @example (setq nnmail-split-methods '(("mail.junk" "^From:.*Lars Ingebrigtsen") ("mail.crazzy" "^Subject:.*die\\|^Organization:.*flabby") ("mail.other" ""))) ! @end example This variable is a list of lists, where the first element of each of these lists contain the name of the mail group (they do not have to be --- 1342,1353 ---- The you should set the variable @code{nnmail-split-methods} to specify how the incoming mail is to be split into groups. ! @lisp (setq nnmail-split-methods '(("mail.junk" "^From:.*Lars Ingebrigtsen") ("mail.crazzy" "^Subject:.*die\\|^Organization:.*flabby") ("mail.other" ""))) ! @end lisp This variable is a list of lists, where the first element of each of these lists contain the name of the mail group (they do not have to be *************** *** 1268,1275 **** The second element can also be a function. In that case, it will be called narrowed to the headers with the first element of the rule as the ! argument. It should return a non-nil value if it thinks that the mail ! belongs in that group. The last of these groups should always be a general one, and the regular expression should *always* be @samp{""} so that it matches any mails --- 1357,1364 ---- The second element can also be a function. In that case, it will be called narrowed to the headers with the first element of the rule as the ! argument. It should return a non-@code{nil} value if it thinks that the ! mail belongs in that group. The last of these groups should always be a general one, and the regular expression should *always* be @samp{""} so that it matches any mails *************** *** 1282,1291 **** @node Mail & Procmail @subsubsection Mail & Procmail Many people use @code{procmail} to split incoming mail into groups. If ! you do that, you should set @code{nnmail-spool-file} to nil to make sure ! that the mail backends never ever try to fetch mail by themselves. This also means that you probably don't want to set @code{nnmail-split-methods} either, which has some, perhaps, unexpected --- 1371,1382 ---- @node Mail & Procmail @subsubsection Mail & Procmail + @cindex procmail Many people use @code{procmail} to split incoming mail into groups. If ! you do that, you should set @code{nnmail-spool-file} to @code{nil} to ! make sure that the mail backends never ever try to fetch mail by ! themselves. This also means that you probably don't want to set @code{nnmail-split-methods} either, which has some, perhaps, unexpected *************** *** 1318,1323 **** --- 1409,1415 ---- @node Expiring Old Mail Articles @subsubsection Expiring Old Mail Articles + @cindex article expiry Traditional mail readers have a tendency to remove mail articles when you mark them as read, in some way. Gnus takes a fundamentally *************** *** 1350,1359 **** Let's say you subscribe to a couple of mailing lists, and you want the articles you have read to disappear after a while: ! @example (setq gnus-auto-expirable-newsgroups "^mail.nonsense-list\\|^mail.nice-list") ! @end example @vindex nnmail-expiry-wait The @code{nnmail-expiry-wait} variable supplies the default time an --- 1442,1451 ---- Let's say you subscribe to a couple of mailing lists, and you want the articles you have read to disappear after a while: ! @lisp (setq gnus-auto-expirable-newsgroups "^mail.nonsense-list\\|^mail.nice-list") ! @end lisp @vindex nnmail-expiry-wait The @code{nnmail-expiry-wait} variable supplies the default time an *************** *** 1365,1371 **** expiry period in the @samp{mail.junk} group, and a six day expiry period everywhere else: ! @example (setq nnmail-expiry-wait-function '(lambda (group) (cond ((string= group "mail.private") --- 1457,1463 ---- expiry period in the @samp{mail.junk} group, and a six day expiry period everywhere else: ! @lisp (setq nnmail-expiry-wait-function '(lambda (group) (cond ((string= group "mail.private") *************** *** 1374,1383 **** 1) (t 6)))) ! @end example @node nnmbox @subsubsection nnmbox @vindex nnmbox-active-file @vindex nnmbox-mbox-file --- 1466,1482 ---- 1) (t 6)))) ! @end lisp ! ! @vindex nnmail-keep-last-article ! If @code{nnmail-keep-last-article} is non-@code{nil}, Gnus will never ! expire the final article in a mail newsgroup. This is to make life ! easier for procmail users. @node nnmbox @subsubsection nnmbox + @cindex nnmbox + @cindex unix mail box @vindex nnmbox-active-file @vindex nnmbox-mbox-file *************** *** 1392,1397 **** --- 1491,1498 ---- @node nnbabyl @subsubsection nnbabyl + @cindex nnbabyl + @cindex rmail mbox @vindex nnbabyl-active-file @vindex nnbabyl-mbox-file *************** *** 1406,1411 **** --- 1507,1514 ---- @node nnml @subsubsection nnml + @cindex nnml + @cindex mail nov spool The spool mail format (@code{nnml}) isn't compatible with any other known format. It should be used with some caution. *************** *** 1442,1447 **** --- 1545,1552 ---- @node nnmh @subsubsection nnmh + @cindex nnmh + @cindex mh-e mail spool @code{nnmh} is just like @code{nnml}, except that is doesn't generate NOV databases and it doesn't keep an active file. This makes *************** *** 1450,1455 **** --- 1555,1562 ---- @node nnfolder @subsubsection nnfolder + @cindex nnfolder + @cindex mbox folders @code{nnfolder} is a backend for storing each mail group in a separate file. Each file is in the standard Un*x mbox format. @code{nnfolder} *************** *** 1464,1474 **** @node Listing Groups @section Listing Groups These commands all list various slices of the groups that are available. @table @kbd ! @item l, G s @kindex G s (Group) @kindex l (Group) @findex gnus-group-list-groups --- 1571,1583 ---- @node Listing Groups @section Listing Groups + @cindex group listing These commands all list various slices of the groups that are available. @table @kbd ! @item l ! @item G s @kindex G s (Group) @kindex l (Group) @findex gnus-group-list-groups *************** *** 1476,1482 **** (@code{gnus-group-list-groups}). If the numeric prefix is used, this command will list only groups of level ARG and lower. By default, it only lists groups of level five or lower (ie. just subscribed groups). ! @item L, G u @kindex G u @kindex L (Group) @findex gnus-group-list-all-groups --- 1585,1592 ---- (@code{gnus-group-list-groups}). If the numeric prefix is used, this command will list only groups of level ARG and lower. By default, it only lists groups of level five or lower (ie. just subscribed groups). ! @item L ! @item G u @kindex G u @kindex L (Group) @findex gnus-group-list-all-groups *************** *** 1506,1511 **** --- 1616,1622 ---- @node Group Maintenance @section Group Maintenance + @cindex bogus groups @table @kbd @item b *************** *** 1543,1548 **** --- 1654,1661 ---- @node Browse Foreign Server @section Browse Foreign Server + @cindex foreign servers + @cindex browsing servers @table @kbd @item B *************** *** 1563,1568 **** --- 1676,1684 ---- new groups will be added to the group buffer, and then you can read them as you would any other group. + Future versions of Gnus may possibly permit reading groups straight from + the browse buffer. + Here's a list of keystrokes available in the browse mode: @table @kbd *************** *** 1592,1599 **** @node Exiting Gnus @section Exiting Gnus ! Yes, Gnus is exiting. @table @kbd @item z --- 1708,1716 ---- @node Exiting Gnus @section Exiting Gnus + @cindex exiting Gnus ! Yes, Gnus is ex(c)iting. @table @kbd @item z *************** *** 1617,1622 **** --- 1734,1748 ---- @code{gnus-suspend-gnus-hook} is called when you suspend Gnus and @code{gnus-exit-gnus-hook} is called when you quit Gnus. + Note: + + @quotation + Miss Lisa Cannifax, while sitting in English class, feels her feet go + numbly heavy and herself fall into a hazy trance as the boy sitting + behind her drew repeated lines with his pencil across the back of her + plastic chair. + @end quotation + @node Misc Group Stuff @section Misc Group Stuff *************** *** 1658,1676 **** @item D @kindex D (Group) @findex gnus-group-describe-group ! Give a description of the current group ! (@code{gnus-group-describe-group}). If given a prefix, force reading ! new description from the server. @item C-c C-a @kindex C-c C-a (Group) @findex gnus-group-apropos ! Give a listing of all groups that have names that match a regexp (@code{gnus-group-apropos}). @item C-c M-C-a @kindex C-c M-C-a (Group) @findex gnus-group-description-apropos ! Give a listing of all groups that have names or descriptions that match ! a regexp (@code{gnus-group-description-apropos}). @item a @kindex a (Group) @findex gnus-group-post-news --- 1784,1801 ---- @item D @kindex D (Group) @findex gnus-group-describe-group ! Describe the current group (@code{gnus-group-describe-group}). If given ! a prefix, force Gnus to re-read the description from the server. @item C-c C-a @kindex C-c C-a (Group) @findex gnus-group-apropos ! List all groups that have names that match a regexp (@code{gnus-group-apropos}). @item C-c M-C-a @kindex C-c M-C-a (Group) @findex gnus-group-description-apropos ! List all groups that have names or descriptions that match a regexp ! (@code{gnus-group-description-apropos}). @item a @kindex a (Group) @findex gnus-group-post-news *************** *** 1691,1697 **** @kindex M-d (Group) @findex gnus-group-describe-all-groups Describe all groups (@code{gnus-group-describe-all-groups}). If given a ! prefix, force reading new descriptions from the server. @item ? @kindex ? (Group) @findex gnus-group-describe-briefly --- 1816,1822 ---- @kindex M-d (Group) @findex gnus-group-describe-all-groups Describe all groups (@code{gnus-group-describe-all-groups}). If given a ! prefix, force Gnus to re-read the descriptoion file from the server. @item ? @kindex ? (Group) @findex gnus-group-describe-briefly *************** *** 1709,1714 **** --- 1834,1840 ---- @node The Summary Buffer @chapter The Summary Buffer + @cindex summary buffer A line for each article is displayed in the Summay buffer. You can move around, read articles, post articles and reply to them. *************** *** 1736,1741 **** --- 1862,1868 ---- @node Summary Buffer Format @section Summary Buffer Format + @cindex summary buffer format @menu * Summary Buffer Lines:: You can specify how summary lines should look. *************** *** 1824,1830 **** Xref @item u User defined specifier. The next character in the format string should ! be a letter. GNUS will call the function gnus-user-format-function-X, where X is the letter following %u. The function will be passed the current header as argument. The function should return a string, which will be inserted into the summary just like information from any other --- 1951,1957 ---- Xref @item u User defined specifier. The next character in the format string should ! be a letter. @sc{GNUS} will call the function gnus-user-format-function-X, where X is the letter following %u. The function will be passed the current header as argument. The function should return a string, which will be inserted into the summary just like information from any other *************** *** 1842,1849 **** you might not be arrested, but your summary buffer will look strange, which is bad enough. ! The smart choice is to have these specs as for to the left as ! possible. This restriction may disappear in later versions of Gnus. --- 1969,1976 ---- you might not be arrested, but your summary buffer will look strange, which is bad enough. ! The smart choice is to have these specs as far to the left as possible. ! (Isn't that the case with everything, though? But I digress.) This restriction may disappear in later versions of Gnus. *************** *** 1876,1881 **** --- 2003,2009 ---- @node Summary Manouvering @section Summary Manouvering + @cindex summary movement All the straight movement commands understand the numeric prefix and behave pretty much as you'd expect. *************** *** 1883,1927 **** None of these commands select articles. @table @kbd ! @item down ! @kindex down (Summary) ! @findex gnus-summary-next-subject ! Go to the next subject line (@code{gnus-summary-next-subject}). ! @item up ! @kindex up (Summary) ! @findex gnus-summary-prev-subject ! Go to the previous subject line (@code{gnus-summary-prev-subject}). @item M-n @kindex M-n (Summary) @findex gnus-summary-next-unread-subject Go to the next summary line of an unread article (@code{gnus-summary-next-unread-subject}). @item M-p @kindex M-p (Summary) @findex gnus-summary-prev-unread-subject Go to the previous summary line of an unread article (@code{gnus-summary-prev-unread-subject}). @item j @kindex j (Summary) @findex gnus-summary-goto-subject Ask for an article number and then go to this summary line (@code{gnus-summary-goto-subject}). - @item l - @kindex l (Summary) - @findex gnus-summary-goto-last-article - Go to the summary line of the previous article - (@code{gnus-summary-goto-last-article}). @end table @vindex gnus-auto-select-next If you are at the end of the group and issue one of the movement commands, Gnus will offer to go to the next group. If ! @code{gnus-auto-select-next} is t and the next group is empty, Gnus ! will exit summary mode and return to the group buffer. If this ! variable is neither t nor nil, Gnus will select the next group, no ! matter if it has any unread articles or not. As a special case, if this ! variable equals @code{quietly}, Gnus will select the next group ! without asking for confirmation. Also see @code{gnus-keep-same-level}. If Gnus asks you to press a key to confirm going to the next group, you can use the @kbd{C-n} and @kbd{C-p} keys to move around the group --- 2011,2049 ---- None of these commands select articles. @table @kbd ! @item G M-n @item M-n @kindex M-n (Summary) + @kindex G M-n (Summary) @findex gnus-summary-next-unread-subject Go to the next summary line of an unread article (@code{gnus-summary-next-unread-subject}). + @item G M-p @item M-p @kindex M-p (Summary) + @kindex G M-p (Summary) @findex gnus-summary-prev-unread-subject Go to the previous summary line of an unread article (@code{gnus-summary-prev-unread-subject}). + @item G g @item j @kindex j (Summary) + @kindex G g (Summary) @findex gnus-summary-goto-subject Ask for an article number and then go to this summary line (@code{gnus-summary-goto-subject}). @end table @vindex gnus-auto-select-next If you are at the end of the group and issue one of the movement commands, Gnus will offer to go to the next group. If ! @code{gnus-auto-select-next} is @code{t} and the next group is empty, ! Gnus will exit summary mode and return to the group buffer. If this ! variable is neither @code{t} nor @code{nil}, Gnus will select the next ! group, no matter if it has any unread articles or not. As a special ! case, if this variable equals @code{quietly}, Gnus will select the next ! group without asking for confirmation. Also see ! @code{gnus-keep-same-level}. If Gnus asks you to press a key to confirm going to the next group, you can use the @kbd{C-n} and @kbd{C-p} keys to move around the group *************** *** 1929,1942 **** to the group buffer. @vindex gnus-auto-center-summary ! If @code{gnus-auto-center-summary} is non-nil, Gnus will keep the point ! in the summary buffer centered at all times. This makes things quite ! tidy, but if you have a slow network connection, or do simply not like ! this un-Emacsism, you can set this variable to nil to get the normal ! Emacs scrolling action. @node Choosing Articles @section Choosing Articles None of the following movement commands understand the numeric prefix, and they all select and display an article. --- 2051,2065 ---- to the group buffer. @vindex gnus-auto-center-summary ! If @code{gnus-auto-center-summary} is non-@code{nil}, Gnus will keep the ! point in the summary buffer centered at all times. This makes things ! quite tidy, but if you have a slow network connection, or do simply not ! like this un-Emacsism, you can set this variable to @code{nil} to get ! the normal Emacs scrolling action. @node Choosing Articles @section Choosing Articles + @cindex selecting articles None of the following movement commands understand the numeric prefix, and they all select and display an article. *************** *** 1947,2016 **** @findex gnus-summary-next-page Select the current article, or, if that one's read already, the next unread article (@code{gnus-summary-next-page}). @item n @kindex n (Summary) @findex gnus-summary-next-unread-article Go to next unread article (@code{gnus-summary-next-unread-article}). @item p @kindex p (Summary) @findex gnus-summary-prev-unread-article Go to previous unread article (@code{gnus-summary-prev-unread-article}). @item N @kindex N (Summary) @findex gnus-summary-next-article Go to the next article (@code{gnus-summary-next-article}). @item P @kindex P (Summary) @findex gnus-summary-prev-article Go to the previous article (@code{gnus-summary-prev-article}). ! @item M-C-n ! @kindex M-C-n (Summary) @findex gnus-summary-next-same-subject Go to the next article with the same subject (@code{gnus-summary-next-same-subject}). ! @item M-C-p ! @kindex M-C-p (Summary) @findex gnus-summary-prev-same-subject Go to the previous article with the same subject (@code{gnus-summary-prev-same-subject}). @item . @kindex . (Summary) @findex gnus-summary-first-unread-article Go to the first unread article (@code{gnus-summary-first-unread-article}). @item , @kindex , (Summary) Go to the article with the highest score (@code{gnus-summary-best-unread-article}). @end table @vindex gnus-auto-extend-newsgroup All the movement commands will try to go to the previous (or next) article, even if that article isn't displayed in the Summary buffer if ! @code{gnus-auto-extend-newsgroup} is non-nil. Gnus will fetch the ! article from the server and present it in the article buffer. ! @vindex gnus-select-article-hook ! @code{gnus-select-article-hook} is called whenever an article is ! selected. By default it makes any threads hidden under the current ! article visible. ! @vindex gnus-mark-article-hook ! @code{gnus-mark-article-hook} is called when an article is selected for ! the first time. It is intended to be used for marking articles as read ! automatically when articles are selected. ! @vindex gnus-visual-mark-article-hook ! @code{gnus-visual-mark-article-hook} is run after selecting an article ! in the summary buffer. It is meant to be used for highlighting the ! article in some way. It is not run if @code{gnus-visual} is nil. ! @vindex gnus-visual-summary-update-hook ! @code{gnus-visual-summary-update-hook} is called when a summary line is ! changed. It is not run if @code{gnus-visual} is nil. @node Paging the Article @section Scrolling the Article @table @kbd @item SPACE --- 2070,2169 ---- @findex gnus-summary-next-page Select the current article, or, if that one's read already, the next unread article (@code{gnus-summary-next-page}). + @item G n @item n @kindex n (Summary) + @kindex G n (Summary) @findex gnus-summary-next-unread-article Go to next unread article (@code{gnus-summary-next-unread-article}). + @item G p @item p @kindex p (Summary) @findex gnus-summary-prev-unread-article Go to previous unread article (@code{gnus-summary-prev-unread-article}). + @item G N @item N @kindex N (Summary) + @kindex G N (Summary) @findex gnus-summary-next-article Go to the next article (@code{gnus-summary-next-article}). + @item G P @item P @kindex P (Summary) + @kindex G P (Summary) @findex gnus-summary-prev-article Go to the previous article (@code{gnus-summary-prev-article}). ! @item G C-n ! @kindex G C-n (Summary) @findex gnus-summary-next-same-subject Go to the next article with the same subject (@code{gnus-summary-next-same-subject}). ! @item G C-p ! @kindex G C-p (Summary) @findex gnus-summary-prev-same-subject Go to the previous article with the same subject (@code{gnus-summary-prev-same-subject}). + @item G f @item . + @kindex G f (Summary) @kindex . (Summary) @findex gnus-summary-first-unread-article Go to the first unread article (@code{gnus-summary-first-unread-article}). + @item G b @item , + @kindex G b (Summary) @kindex , (Summary) Go to the article with the highest score (@code{gnus-summary-best-unread-article}). + @item G l + @item l + @kindex l (Summary) + @kindex G l (Summary) + @findex gnus-summary-goto-last-article + Go to the summary line of the previous article + (@code{gnus-summary-goto-last-article}). + @item G p + @kindex G p + @findex gnus-summary-pop-article + Pop an article off the summary history and go to the previous article + (@code{gnus-summary-pop-article}). This command differs from the + command above in that you can pop as many previous articles off the + history as you like. @end table + Some variables that are relevant for moving and selecting articles: + + @table @code + @item gnus-auto-extend-newsgroup @vindex gnus-auto-extend-newsgroup All the movement commands will try to go to the previous (or next) article, even if that article isn't displayed in the Summary buffer if ! this variable is non-@code{nil}. Gnus will then fetch the article from ! the server and display it in the article buffer. ! @item gnus-select-article-hook @vindex gnus-select-article-hook ! This hook is called whenever an article is selected. By default it ! exposes any threads hidden under the selected article. ! @item gnus-mark-article-hook @vindex gnus-mark-article-hook ! This hook is called when an article is selected for the first time. It ! is intended to be used for marking articles as read automatically when ! articles are selected. ! @item gnus-visual-mark-article-hook @vindex gnus-visual-mark-article-hook ! This hook is run after selecting an article. It is meant to be used for ! highlighting the article in some way. It is not run if ! @code{gnus-visual} is @code{nil}. ! @item gnus-visual-summary-update-hook @vindex gnus-visual-summary-update-hook ! This hook is called when a summary line is changed. It is not run if ! @code{gnus-visual} is @code{nil}. ! @end table @node Paging the Article @section Scrolling the Article + @cindex article scrolling @table @kbd @item SPACE *************** *** 2028,2040 **** @findex gnus-summary-scroll-up Scroll the current article one line forward (@code{gnus-summary-scroll-up}). ! @item <, A < @kindex < (Summary) @kindex A < (Summary) @findex gnus-summary-beginning-of-article Scroll to the beginning of the article (@code{gnus-summary-beginning-of-article}). ! @item >, A > @kindex > (Summary) @kindex A > (Summary) @findex gnus-summary-end-of-article --- 2181,2195 ---- @findex gnus-summary-scroll-up Scroll the current article one line forward (@code{gnus-summary-scroll-up}). ! @item < ! @item A < @kindex < (Summary) @kindex A < (Summary) @findex gnus-summary-beginning-of-article Scroll to the beginning of the article (@code{gnus-summary-beginning-of-article}). ! @item > ! @item A > @kindex > (Summary) @kindex A > (Summary) @findex gnus-summary-end-of-article *************** *** 2043,2048 **** --- 2198,2206 ---- @node Reply Followup and Post @section Reply Followup and Post + @cindex reply + @cindex followup + @cindex post @kindex C-c C-c (Post) All the commands for posting and mailing will put you in a post or mail *************** *** 2109,2132 **** (@code{gnus-uu-post-news}). @end table @vindex gnus-required-headers Gnus determines which headers it should generate in outgoing posts by ! consulting the @code{gnus-required-headers} variable. This is a list of ! headers that Gnus makes sure is present in all outgoing posts before it ! tries to post them. ! @vindex gnus-post-method ! If @code{gnus-post-method} is non-nil, Gnus will use that method instead ! of the default method when posting. ! @vindex gnus-use-followup-to ! If @code{gnus-use-followup-to} is nil, always ignore the Followup-To ! header. If nil, ignore the header. If it is t, use its value, but ignore ! the value @samp{poster}. If it is neither nil nor t, always use the ! Followup-To value. ! ! @vindex gnus-followup-to-function @vindex gnus-reply-to-function Gnus uses the normal methods to determine where replys and follow-ups are to go, but you can change the behaviour to suit your need by fiddling with the @code{gnus-reply-to-function} and --- 2267,2294 ---- (@code{gnus-uu-post-news}). @end table + @table @code + @item gnus-required-headers @vindex gnus-required-headers Gnus determines which headers it should generate in outgoing posts by ! consulting the this variable. All headers mentioned in this list will ! either be generated automatically or prompted for before an article is ! posted. ! @item gnus-post-method @vindex gnus-post-method ! If non-@code{nil}, Gnus will use this method instead of the default ! select method when posting. ! @item gnus-use-followup-to @vindex gnus-use-followup-to ! If @code{nil}, always ignore the Followup-To header. If it is @code{t}, ! use its value, but ignore the special value @samp{poster}, which will ! send the followup as a reply mail to the person you are responding to. ! If it is neither @code{nil} nor @code{t}, always use the Followup-To ! value. ! @item gnus-followup-to-function ! @item gnus-reply-to-function @vindex gnus-reply-to-function + @vindex gnus-followup-to-function Gnus uses the normal methods to determine where replys and follow-ups are to go, but you can change the behaviour to suit your need by fiddling with the @code{gnus-reply-to-function} and *************** *** 2136,2209 **** "sender" instead of the "from" in the group "mail.stupid-list", you could do something like this: ! @example (setq gnus-reply-to-function '(lambda (group) (cond ((string= group "mail.stupid-list") (mail-fetch-field "sender")) (t nil)))) ! @end example These functions will be called with point in the buffer of the article that is being replied to (or followed up). ! @vindex gnus-signature-function ! If @code{gnus-signature-function} is non-nil, it should be a function ! that should return a signature file name. The function will be called ! with the name of the newsgroup being posted to. If the function returns ! a string that doesn't correspond to a file, the string itself is ! inserted. If the function returns nil, the @code{gnus-signature-file} ! variable will be used instead. ! @vindex mail-signature @vindex gnus-signature-file ! If @code{gnus-signature-file} is non-nil, it should be the name of a ! file containing a signature (@samp{~/.signature} by default). This ! signature will be appended to all outgoing post. Most people find it ! more convenient to use @code{mail-signature}, which does the same, but ! inserts the signature into the buffer before you start editing the post ! (or mail). So - if you have both of these variables set, you will get ! two signatures. ! @vindex gnus-post-prepare-function ! In any case, @code{gnus-post-prepare-function} is called with the name ! of the current group after the post buffer has been initialized, and can ! be used for inserting a signature. Nice if you use different signatures ! in different groups. ! @vindex gnus-auto-mail-to-author ! If @code{gnus-auto-mail-to-author} is non-nil, Gnus will send a mail ! with a copy of all follow-ups to the authors of the articles you follow ! up. It's nice in one way - you make sure that the person you are ! responding to gets your response. Other people loathe this method and ! will hate you dearly for it, because it means that they will first get a ! mail, and then have to read the same article later when they read the ! news. It is nil by default. ! @vindex gnus-mail-send-method ! @code{gnus-mail-send-method} says how a mail should be mailed. It uses ! the function in the @code{send-mail-function} as the default. ! @vindex gnus-prepare-article-hook ! @code{gnus-prepare-article-hook} is called before the header fields have ! been prepared. By default it inserts the signature specified by ! @code{gnus-signature-file}. ! @vindex gnus-inews-article-hook ! @code{gnus-inews-article-hook} is called right before the article is ! posted. By default it handles FCC processing (ie. saving the article to ! a file.) ! @vindex gnus-inews-article-header-hook ! @code{gnus-inews-article-header-hook} is called after inserting the ! headers in an article to be posted. The hook is called from the ! *post-news* buffer, narrowed to the headers, and is intended for people ! who would like to insert additional headers, or just change headers in ! some way. @node Cancelling and Superseding @section Cancelling Articles Have you ever written something, and then decided that you really, really, really hadn't posted that? --- 2298,2380 ---- "sender" instead of the "from" in the group "mail.stupid-list", you could do something like this: ! @lisp (setq gnus-reply-to-function '(lambda (group) (cond ((string= group "mail.stupid-list") (mail-fetch-field "sender")) (t nil)))) ! @end lisp These functions will be called with point in the buffer of the article that is being replied to (or followed up). ! @item gnus-signature-function @vindex gnus-signature-function ! If non-@code{nil}, this variable should be a function that returns a ! signature file name. The function will be called with the name of the ! group being posted to. If the function returns a string that doesn't ! correspond to a file, the string itself is inserted. If the function ! returns @code{nil}, the @code{gnus-signature-file} variable will be used ! instead. ! @item gnus-signature-file ! @item mail-signature @vindex mail-signature @vindex gnus-signature-file ! If non-@code{nil}, this variable should be the name of a file containing ! a signature (@samp{~/.signature} by default). This signature will be ! appended to all outgoing post. Most people find it more convenient to ! use @code{mail-signature}, which does the same, but inserts the ! signature into the buffer before you start editing the post (or mail). ! So - if you have both of these variables set, you will get two ! signatures. ! ! Note that RFC1036 says that a signature should be preceded by the three ! characters @samp{-- } on a line by themselves. This is to make it ! easier for the recipient to automatically filter the signature away. So ! don't remove those characters, even though you might feel that they ruin ! you beautiful design, like, totally. ! ! Also note that no signature should be more than four lines long. ! Including ASCII graphics is an efficient way to get everybody to believe ! that you are silly and have nothing important to say. ! @item gnus-post-prepare-function @vindex gnus-post-prepare-function ! This function is called with the name of the current group after the ! post buffer has been initialized, and can be used for inserting a ! signature. Nice if you use different signatures in different groups. ! @item gnus-auto-mail-to-author @vindex gnus-auto-mail-to-author ! If non-@code{nil}, Gnus will send a mail with a copy of all follow-ups ! to the authors of the articles you follow up. It's nice in one way - ! you make sure that the person you are responding to gets your response. ! Other people loathe this method and will hate you dearly for it, because ! it means that they will first get a mail, and then have to read the same ! article later when they read the news. It is @code{nil} by default. ! @item gnus-mail-send-method @vindex gnus-mail-send-method ! This variable says how a mail should be mailed. It uses the function in ! the @code{send-mail-function} variable as the default. ! @item gnus-prepare-article-hook @vindex gnus-prepare-article-hook ! This hook is called before the headers have been prepared. By default ! it inserts the signature specified by @code{gnus-signature-file}. ! @item gnus-inews-article-hook @vindex gnus-inews-article-hook ! This hook is called right before the article is posted. By default it ! handles FCC processing (ie. saving the article to a file.) ! @item gnus-inews-article-header-hook @vindex gnus-inews-article-header-hook ! This hook is called after inserting the required headers in an article ! to be posted. The hook is called from the @code{*post-news*} buffer, ! narrowed to the headers, and is intended for people who would like to ! insert additional headers, or just change headers in some way. ! @end table @node Cancelling and Superseding @section Cancelling Articles + @cindex cancelling articles + @cindex superseding articles Have you ever written something, and then decided that you really, really, really hadn't posted that? *************** *** 2249,2254 **** --- 2420,2427 ---- @node Ticking and Marking @section Ticking and Marking + @cindex article marking + @cindex article ticking There are several marks you can set on an article. *************** *** 2298,2303 **** --- 2471,2477 ---- @node Read Articles @subsection Read Articles + @cindex expirable mark All the following marks mark articles as read. *************** *** 2342,2347 **** --- 2516,2523 ---- @node Other Marks @subsection Other Marks + @cindex process mark + @cindex bookmarks There are some marks that have nothing to do with whether the article is read or not. *************** *** 2360,2381 **** @node Setting Marks @subsection Setting Marks All the marking commands understand the numeric prefix. @table @kbd ! @item M t, ! @kindex ! (Summary) @kindex M t (Summary) @findex gnus-summary-tick-article-forward Tick the current article (@code{gnus-summary-tick-article-forward}). ! @item M ?, ? @kindex ? (Summary) @kindex M ? (Summary) @findex gnus-summary-mark-as-dormant Mark the current article as dormant (@code{gnus-summary-mark-as-dormant}). ! @item M d, d @kindex M d (Summary) @kindex d (Summary) @findex gnus-summary-mark-as-read-forward --- 2536,2561 ---- @node Setting Marks @subsection Setting Marks + @cindex setting marks All the marking commands understand the numeric prefix. @table @kbd ! @item M t ! @item ! @kindex ! (Summary) @kindex M t (Summary) @findex gnus-summary-tick-article-forward Tick the current article (@code{gnus-summary-tick-article-forward}). ! @item M ? ! @item ? @kindex ? (Summary) @kindex M ? (Summary) @findex gnus-summary-mark-as-dormant Mark the current article as dormant (@code{gnus-summary-mark-as-dormant}). ! @item M d ! @item d @kindex M d (Summary) @kindex d (Summary) @findex gnus-summary-mark-as-read-forward *************** *** 2404,2416 **** @kindex M H (Summary) @findex gnus-summary-catchup-to-here Catchup the current group to point (@code{gnus-summary-catchup-to-here}). ! @item M c, M-u @kindex M c (Summary) @kindex M-u (Summary) @findex gnus-summary-clear-mark-forward Clear tick and read marks from the current article (@code{gnus-summary-clear-mark-forward}). ! @item M e, E @kindex M e (Summary) @kindex E (Summary) @findex gnus-summary-mark-as-expirable --- 2584,2598 ---- @kindex M H (Summary) @findex gnus-summary-catchup-to-here Catchup the current group to point (@code{gnus-summary-catchup-to-here}). ! @item M c ! @item M-u @kindex M c (Summary) @kindex M-u (Summary) @findex gnus-summary-clear-mark-forward Clear tick and read marks from the current article (@code{gnus-summary-clear-mark-forward}). ! @item M e ! @item E @kindex M e (Summary) @kindex E (Summary) @findex gnus-summary-mark-as-expirable *************** *** 2426,2438 **** @findex gnus-summary-remove-bookmark Remove the bookmark from the current article (@code{gnus-summary-remove-bookmark}). ! @item M M-r, M-d @kindex M M-r (Summary) @kindex M-d (Summary) @findex gnus-summary-remove-lines-marked-as-read Expunge all deleted articles from the summary buffer (@code{gnus-summary-remove-lines-marked-as-read}). ! @item M M-C-r, M-C-d @kindex M M-C-r (Summary) @kindex M-C-d (Summary) @findex gnus-summary-remove-lines-marked-with --- 2608,2622 ---- @findex gnus-summary-remove-bookmark Remove the bookmark from the current article (@code{gnus-summary-remove-bookmark}). ! @item M M-r ! @item M-d @kindex M M-r (Summary) @kindex M-d (Summary) @findex gnus-summary-remove-lines-marked-as-read Expunge all deleted articles from the summary buffer (@code{gnus-summary-remove-lines-marked-as-read}). ! @item M M-C-r ! @item M-C-d @kindex M M-C-r (Summary) @kindex M-C-d (Summary) @findex gnus-summary-remove-lines-marked-with *************** *** 2473,2495 **** (@code{gnus-summary-clear-above}). @end table @node Setting Process Marks @subsection Setting Process Marks @table @kbd ! @item #, M p @kindex # (Summary) @kindex M p p (Summary) @findex gnus-summary-mark-as-processable Mark the current article with the process mark (@code{gnus-summary-mark-as-processable}). @findex gnus-summary-unmark-as-processable ! @item M-#, M p u @kindex M-# (Summary) @kindex M p u (Summary) Remove the process mark from the current article (@code{gnus-summary-unmark-as-processable}). ! @item C-c M-#, M p U @kindex C-c M-# (Summary) @kindex M p U (Summary) @findex gnus-summary-unmark-all-processable --- 2657,2688 ---- (@code{gnus-summary-clear-above}). @end table + The @code{gnus-summary-goto-unread} variable controls what action should + be taken after setting a mark. If non-@code{nil}, point will move to + the next/previous unread article. If @code{nil}, point will just move + one line up or down. + @node Setting Process Marks @subsection Setting Process Marks + @cindex setting process marks @table @kbd ! @item # ! @item M p @kindex # (Summary) @kindex M p p (Summary) @findex gnus-summary-mark-as-processable Mark the current article with the process mark (@code{gnus-summary-mark-as-processable}). @findex gnus-summary-unmark-as-processable ! @item M-# ! @item M p u @kindex M-# (Summary) @kindex M p u (Summary) Remove the process mark from the current article (@code{gnus-summary-unmark-as-processable}). ! @item C-c M-# ! @item M p U @kindex C-c M-# (Summary) @kindex M p U (Summary) @findex gnus-summary-unmark-all-processable *************** *** 2531,2536 **** --- 2724,2731 ---- @node Threading @section Threading + @cindex threading + @cindex article threading Gnus threads articles by default. @dfn{To thread} is to put replies to articles directly after the articles they reply to - in a hierarchical *************** *** 2538,2575 **** @menu * Customizing Threading:: Variables you can change to affect the threading. ! * Threading Commands:: Thread based commands in the summary buffer. @end menu @node Customizing Threading @subsection Customizing Threading @table @code @item gnus-show-threads @vindex gnus-show-threads ! If this variable is nil, no threading will be done, and all of the rest ! of the variables here will have no effect. Turning threading off will ! speed group selection up a bit, but it is sure to make reading slower and more awkward. @item gnus-fetch-old-headers @vindex gnus-fetch-old-headers ! If non-nil, Gnus will attempt to build old threads by fetching more old ! headers - headers to articles that are marked as read. If it has the ! value `some', only enough headers to connect otherwise loose threads ! will be displayed. Fetching old headers only works if the select method ! you are using supports XOVER. Also remember that if the root of the ! thread has been expired by the server, there's not much Gnus can do ! about that. @item gnus-gather-loose-threads @vindex gnus-gather-loose-threads ! If non-nil, Gnus will gather all loose subtrees into one big tree and ! create a dummy root at the top. (Wait a minute. Root at the top? Yup.) ! Loose subtrees occur when the real root has expired, or you've read it ! or marked it as read in a previous session. @item gnus-summary-gather-subject-limit ! If this variable is nil, the entire subject line will be used to gather ! loose threads. If you would limit this to the 20 first characters of the ! subjects, set this variable to 20. @item gnus-summary-make-false-root @vindex gnus-summary-make-false-root When there is no real root of a thread, Gnus will have to fudge --- 2733,2771 ---- @menu * Customizing Threading:: Variables you can change to affect the threading. ! * Thread Commands:: Thread based commands in the summary buffer. @end menu @node Customizing Threading @subsection Customizing Threading + @cindex customizing threading @table @code @item gnus-show-threads @vindex gnus-show-threads ! If this variable is @code{nil}, no threading will be done, and all of ! the rest of the variables here will have no effect. Turning threading ! off will speed group selection up a bit, but it is sure to make reading slower and more awkward. @item gnus-fetch-old-headers @vindex gnus-fetch-old-headers ! If non-@code{nil}, Gnus will attempt to build old threads by fetching ! more old headers - headers to articles that are marked as read. If it ! has the value `some', only enough headers to connect otherwise loose ! threads will be displayed. Fetching old headers only works if the ! select method you are using supports XOVER. Also remember that if the ! root of the thread has been expired by the server, there's not much Gnus ! can do about that. @item gnus-gather-loose-threads @vindex gnus-gather-loose-threads ! If non-@code{nil}, Gnus will gather all loose subtrees into one big tree ! and create a dummy root at the top. (Wait a minute. Root at the top? ! Yup.) Loose subtrees occur when the real root has expired, or you've ! read it or marked it as read in a previous session. @item gnus-summary-gather-subject-limit ! If this variable is @code{nil}, the entire subject line will be used to ! gather loose threads. If you would limit this to the 20 first ! characters of the subjects, set this variable to 20. @item gnus-summary-make-false-root @vindex gnus-summary-make-false-root When there is no real root of a thread, Gnus will have to fudge *************** *** 2597,2642 **** @item gnus-thread-hide-subtree @vindex gnus-thread-hide-subtree ! If non-nil, all subtrees will be hidden when the summary buffer is ! generated. @item gnus-thread-hide-killed @vindex gnus-thread-hide-killed ! if you kill a thread and this variable is non-nil, the subtree will be ! hidden. @item gnus-thread-ignore-subject @vindex gnus-thread-ignore-subject Sometimes somebody changes the subject in the middle of a thread. If ! this variable is non-nil, the change in subject is ignored. If it is ! nil, which is the default, a change in the subject will result in a new ! thread. @item gnus-thread-indent-level @vindex gnus-thread-indent-level This is a number that how much each subthread should be indented. The default is @samp{4}. @end table ! @node Threading Commands ! @subsection Threading Commands @table @kbd ! @item T k, M-C-k @kindex T k (Summary) @kindex M-C-k (Summary) @findex gnus-summary-kill-thread Mark all articles under the current one as read (@code{gnus-summary-kill-thread}). If the prefix argument is positive, remove all marks. If the prefix argument is negative, tick articles. ! @item T l, M-C-l @kindex T l (Summary) @kindex M-C-l (Summary) @findex gnus-summary-lower-thread Lower the score of the current thread (@code{gnus-summary-lower-thread}). ! @item T r ! @kindex T r (Summary) @findex gnus-summary-raise-thread ! Lower the score of the current thread ! (@code{gnus-summary-raise-thread}). @item T # @kindex T # (Summary) @findex gnus-uu-mark-thread --- 2793,2841 ---- @item gnus-thread-hide-subtree @vindex gnus-thread-hide-subtree ! If non-@code{nil}, all subtrees will be hidden when the summary buffer ! is generated. @item gnus-thread-hide-killed @vindex gnus-thread-hide-killed ! if you kill a thread and this variable is non-@code{nil}, the subtree ! will be hidden. @item gnus-thread-ignore-subject @vindex gnus-thread-ignore-subject Sometimes somebody changes the subject in the middle of a thread. If ! this variable is non-@code{nil}, the change in subject is ignored. If ! it is @code{nil}, which is the default, a change in the subject will ! result in a new thread. @item gnus-thread-indent-level @vindex gnus-thread-indent-level This is a number that how much each subthread should be indented. The default is @samp{4}. @end table ! @node Thread Commands ! @subsection Thread Commands ! @cindex thread commands @table @kbd ! @item T k ! @item M-C-k @kindex T k (Summary) @kindex M-C-k (Summary) @findex gnus-summary-kill-thread Mark all articles under the current one as read (@code{gnus-summary-kill-thread}). If the prefix argument is positive, remove all marks. If the prefix argument is negative, tick articles. ! @item T l ! @item M-C-l @kindex T l (Summary) @kindex M-C-l (Summary) @findex gnus-summary-lower-thread Lower the score of the current thread (@code{gnus-summary-lower-thread}). ! @item T i ! @kindex T i (Summary) @findex gnus-summary-raise-thread ! Increase the score of the current thread ! (@code{gnus-summary-raise-thread}). @item T # @kindex T # (Summary) @findex gnus-uu-mark-thread *************** *** 2689,2694 **** --- 2888,2894 ---- @node Exiting the Summary Buffer @section Exiting the Summary Buffer + @cindex summary exit Exiting from the summary buffer will normally update all info on the group and return you to the group buffer. *************** *** 2718,2727 **** @vindex gnus-use-cross-reference When you exit the summary buffer, the data on the current group will be updated (which articles you have read, which articles you have replied ! to, etc.) If the @code{gnus-use-cross-reference} variable is t, articles that are cross-referenced to this group, and are marked as read, will also be marked as read in the other subscribed groups they were ! cross-posted to. If this variable is neither nil nor t, the article will be marked as read in both subscribed and unsubscribed groups. --- 2918,2927 ---- @vindex gnus-use-cross-reference When you exit the summary buffer, the data on the current group will be updated (which articles you have read, which articles you have replied ! to, etc.) If the @code{gnus-use-cross-reference} variable is @code{t}, articles that are cross-referenced to this group, and are marked as read, will also be marked as read in the other subscribed groups they were ! cross-posted to. If this variable is neither @code{nil} nor @code{t}, the article will be marked as read in both subscribed and unsubscribed groups. *************** *** 2747,2758 **** @vindex gnus-nov-is-evil If you want Gnus to get the Xrefs right all the time, you have to set ! @code{gnus-nov-is-evil} to t, which slows things down considerably. C'est la vie. @node Process/Prefix @section Process/Prefix Many functions, among them functions for moving articles, decoding articles and saving articles use what is known as the --- 2947,2959 ---- @vindex gnus-nov-is-evil If you want Gnus to get the Xrefs right all the time, you have to set ! @code{gnus-nov-is-evil} to @code{t}, which slows things down considerably. C'est la vie. @node Process/Prefix @section Process/Prefix + @cindex process/prefix convention Many functions, among them functions for moving articles, decoding articles and saving articles use what is known as the *************** *** 2780,2785 **** --- 2981,2987 ---- @node Saving Articles @section Saving Articles + @cindex saving articles Gnus can save articles in a number of ways. Below is the documentation for saving articles in a fairly straight-forward fashion (ie. little *************** *** 2787,2793 **** approach (uudecoding, unsharing) see gnus-uu. @xref{Decoding Articles}. @vindex gnus-save-all-headers ! If @code{gnus-save-all-headers} is non-nil, Gnus will not delete unwanted headers before saving the article. @table @kbd --- 2989,2995 ---- approach (uudecoding, unsharing) see gnus-uu. @xref{Decoding Articles}. @vindex gnus-save-all-headers ! If @code{gnus-save-all-headers} is non-@code{nil}, Gnus will not delete unwanted headers before saving the article. @table @kbd *************** *** 2857,2870 **** @vindex gnus-use-long-file-name Finally, you have the @code{gnus-use-long-file-name} variable. If it is ! nil, all the preceding functions will replace all periods (@samp{.}) in ! the group names with slashes (@samp{/}) - which means that the functions ! will generate hierarchies of directories instead of having all the files ! in the toplevel directory (@samp{~/News/alt/andrea-dworkin} instead of @samp{~/News/alt.andrea-dworkin}.) @node Decoding Articles @section Decoding Articles Sometime users post articles (or series of articles) that have been encoded in some way or other. Gnus can decode them for you. --- 3059,3074 ---- @vindex gnus-use-long-file-name Finally, you have the @code{gnus-use-long-file-name} variable. If it is ! @code{nil}, all the preceding functions will replace all periods ! (@samp{.}) in the group names with slashes (@samp{/}) - which means that ! the functions will generate hierarchies of directories instead of having ! all the files in the toplevel directory ! (@samp{~/News/alt/andrea-dworkin} instead of @samp{~/News/alt.andrea-dworkin}.) @node Decoding Articles @section Decoding Articles + @cindex decoding articles Sometime users post articles (or series of articles) that have been encoded in some way or other. Gnus can decode them for you. *************** *** 2899,2913 **** --- 3103,3127 ---- @node Uuencoded Articles @subsection Uuencoded Articles + @cindex uudecode + @cindex uuencoded articles @table @kbd @item X u + @kindex X u (Summary) + @findex gnus-uu-decode-uu Uudecodes the current series (@code{gnus-uu-decode-uu}). @item X U + @kindex X U (Summary) + @findex gnus-uu-decode-and-save Uudecodes and saves the current series (@code{gnus-uu-decode-and-save}). @item X v u + @kindex X v u (Summary) + @findex gnus-uu-decode-uu-view Uudecodes and views the current series (@code{gnus-uu-decode-uu-view}). @item X v U + @kindex X v U (Summary) + @findex gnus-uu-decode-uu-and-save-view Uudecodes, views and saves the current series (@code{gnus-uu-decode-uu-and-save-view}). @end table *************** *** 2917,2926 **** entire newsgroup, you'd typically do @kbd{M p a} (@code{gnus-uu-mark-all}) and then @kbd{X U} (@code{gnus-uu-decode-uu}). ! All this is very much different from how gnus-uu worked with GNUS 4.1, ! where you had explicit keystrokes for everything under the sun. This ! version of gnus-uu generally assumes that you either mark articles in ! some way (@pxref{Setting Process Marks}) and then press @kbd{X u}. Note: When trying to decode articles that have names matching @samp{[Cc][Ii][Nn][Dd][Yy][0-9]+.\\(gif\\|jpg\\)} --- 3131,3140 ---- entire newsgroup, you'd typically do @kbd{M p a} (@code{gnus-uu-mark-all}) and then @kbd{X U} (@code{gnus-uu-decode-uu}). ! All this is very much different from how gnus-uu worked with @sc{GNUS ! 4.1}, where you had explicit keystrokes for everything under the sun. ! This version of gnus-uu generally assumes that you either mark articles ! in some way (@pxref{Setting Process Marks}) and then press @kbd{X u}. Note: When trying to decode articles that have names matching @samp{[Cc][Ii][Nn][Dd][Yy][0-9]+.\\(gif\\|jpg\\)} *************** *** 2930,2944 **** --- 3144,3168 ---- @node Shared Articles @subsection Shared Articles + @cindex unshar + @cindex shared articles @table @kbd @item X s + @kindex X s (Summary) + @findex gnus-uu-decode-unshar Unshars the current series (@code{gnus-uu-decode-unshar}). @item X S + @kindex X S (Summary) + @findex gnus-uu-decode-unshar-and-save Unshars and saves the current series (@code{gnus-uu-decode-unshar-and-save}). @item X v s + @kindex X v s (Summary) + @findex gnus-uu-decode-unshar-view Unshars and views the current series (@code{gnus-uu-decode-unshar-view}). @item X v S + @kindex X v S (Summary) + @findex gnus-uu-decode-unshar-and-save-view Unshars, views and saves the current series (@code{gnus-uu-decode-unshar-and-save-view}). @end table *************** *** 2955,2969 **** @node Rule Variables @subsubsection Rule Variables Gnus uses @dfn{rule} variables to decide how to view a file. All these variables are on the form ! @example (list '(regexp1 command2) '(regexp2 command2) ...) ! @end example @table @code @item gnus-uu-user-view-rules --- 3179,3194 ---- @node Rule Variables @subsubsection Rule Variables + @cindex rule variables Gnus uses @dfn{rule} variables to decide how to view a file. All these variables are on the form ! @lisp (list '(regexp1 command2) '(regexp2 command2) ...) ! @end lisp @table @code @item gnus-uu-user-view-rules *************** *** 2971,2992 **** This variable is consulted first when viewing files. If you wish to use, for instance, @code{sox} to convert an @samp{.au} sound file, you could say something like: ! @example (setq gnus-uu-user-view-rules (list '(\"\\\\.au$\" \"sox %s -t .aiff > /dev/audio\"))) ! @end example @item gnus-uu-user-view-rules-end @vindex gnus-uu-user-view-rules-end This variable is consulted if Gnus couldn't make any matches from the user and default view rules. - @item gnus-uu-user-interactive-view-rules - @vindex gnus-uu-user-interactive-view-rules - This is the variable used instead of @code{gnus-uu-user-view-rules} - when in interactive mode. - @item gnus-uu-user-interactive-view-rules-end - @vindex gnus-uu-user-interactive-view-rules-end - This variable is used instead of @code{gnus-uu-user-view-rules-end} when - in interactive mode. @item gnus-uu-user-archive-rules @vindex gnus-uu-user-archive-rules This variable can be used to say what comamnds should be used to unpack --- 3196,3209 ---- This variable is consulted first when viewing files. If you wish to use, for instance, @code{sox} to convert an @samp{.au} sound file, you could say something like: ! @lisp (setq gnus-uu-user-view-rules (list '(\"\\\\.au$\" \"sox %s -t .aiff > /dev/audio\"))) ! @end lisp @item gnus-uu-user-view-rules-end @vindex gnus-uu-user-view-rules-end This variable is consulted if Gnus couldn't make any matches from the user and default view rules. @item gnus-uu-user-archive-rules @vindex gnus-uu-user-archive-rules This variable can be used to say what comamnds should be used to unpack *************** *** 3013,3070 **** @item gnus-uu-do-not-unpack-archives @vindex gnus-uu-do-not-unpack-archives ! Non-nil means that gnus-uu won't peek inside archives looking for files ! to dispay. @item gnus-uu-view-and-save @vindex gnus-uu-view-and-save ! Non-nil means that the user will always be asked to save a file after ! viewing it. @item gnus-uu-ignore-default-view-rules @vindex gnus-uu-ignore-default-view-rules ! Non-nil means that gnus-uu will ignore the default viewing rules. @item gnus-uu-ignore-default-archive-rules @vindex gnus-uu-ignore-default-archive-rules ! Non-nil means that gnus-uu will ignore the default archive unpacking ! commands. @item gnus-uu-kill-carriage-return @vindex gnus-uu-kill-carriage-return ! Non-nil means that gnus-uu will strip all carriage returns from articles. @item gnus-uu-unmark-articles-not-decoded @vindex gnus-uu-unmark-articles-not-decoded ! Non-nil means that gnus-uu will mark articles that were unsuccessfully ! decoded as unread. @item gnus-uu-correct-stripped-uucode @vindex gnus-uu-correct-stripped-uucode ! Non-nil means that gnus-uu will *try* to fix uuencoded files that have ! had traling spaces deleted. @item gnus-uu-view-with-metamail @vindex gnus-uu-view-with-metamail ! Non-nil means that gnus-uu will ignore the viewing commands defined by ! the rule variables and just fudge a MIME content type based on the file ! name. The result will be fed to metamail for viewing. @item gnus-uu-save-in-digest @vindex gnus-uu-save-in-digest ! Non-nil means that gnus-uu, when asked to save without decoding, will ! save in digests. If this variable is nil, gnus-uu will just save ! everything in a file without any embellishments. The digesting almost ! conforms to RFC1153 - no easy way to specify any meaningful volume and ! issue numbers were found, so I simply dropped them. @item gnus-uu-post-include-before-composing @vindex gnus-uu-post-include-before-composing ! Non-nil means that gnus-uu will ask for a file to encode before you ! compose the article. If this variable is t, you can either include an ! encoded file with @key{C-c C-i} or have one included for you when you ! post the article. @item gnus-uu-post-length @vindex gnus-uu-post-length --- 3230,3287 ---- @item gnus-uu-do-not-unpack-archives @vindex gnus-uu-do-not-unpack-archives ! Non-@code{nil} means that gnus-uu won't peek inside archives looking for ! files to dispay. @item gnus-uu-view-and-save @vindex gnus-uu-view-and-save ! Non-@code{nil} means that the user will always be asked to save a file ! after viewing it. @item gnus-uu-ignore-default-view-rules @vindex gnus-uu-ignore-default-view-rules ! Non-@code{nil} means that gnus-uu will ignore the default viewing rules. @item gnus-uu-ignore-default-archive-rules @vindex gnus-uu-ignore-default-archive-rules ! Non-@code{nil} means that gnus-uu will ignore the default archive ! unpacking commands. @item gnus-uu-kill-carriage-return @vindex gnus-uu-kill-carriage-return ! Non-@code{nil} means that gnus-uu will strip all carriage returns from articles. @item gnus-uu-unmark-articles-not-decoded @vindex gnus-uu-unmark-articles-not-decoded ! Non-@code{nil} means that gnus-uu will mark articles that were ! unsuccessfully decoded as unread. @item gnus-uu-correct-stripped-uucode @vindex gnus-uu-correct-stripped-uucode ! Non-@code{nil} means that gnus-uu will *try* to fix uuencoded files that ! have had traling spaces deleted. @item gnus-uu-view-with-metamail @vindex gnus-uu-view-with-metamail ! Non-@code{nil} means that gnus-uu will ignore the viewing commands ! defined by the rule variables and just fudge a MIME content type based ! on the file name. The result will be fed to metamail for viewing. @item gnus-uu-save-in-digest @vindex gnus-uu-save-in-digest ! Non-@code{nil} means that gnus-uu, when asked to save without decoding, ! will save in digests. If this variable is @code{nil}, gnus-uu will just ! save everything in a file without any embellishments. The digesting ! almost conforms to RFC1153 - no easy way to specify any meaningful ! volume and issue numbers were found, so I simply dropped them. @item gnus-uu-post-include-before-composing @vindex gnus-uu-post-include-before-composing ! Non-@code{nil} means that gnus-uu will ask for a file to encode before ! you compose the article. If this variable is @code{t}, you can either ! include an encoded file with @key{C-c C-i} or have one included for you ! when you post the article. @item gnus-uu-post-length @vindex gnus-uu-post-length *************** *** 3073,3095 **** @item gnus-uu-post-threaded @vindex gnus-uu-post-threaded ! Non-nil means that gnus-uu will post the encoded file in a thread. This ! may not be smart, as no other decoder I have seen are able to follow ! threads when collecting uuencoded articles. (Well, I have seen one ! package that does that - gnus-uu, but somehow, I don't think that ! counts...) Default is nil. @item gnus-uu-post-separate-description @vindex gnus-uu-post-separate-description ! Non-nil means that the description will be posted in a separate article. ! The first article will typically be numbered (0/x). If this variable is ! nil, the description the user enters will be included at the beginning ! of the first article, which will be numbered (1/x). Default is t. @end table @node Viewing Files @subsection Viewing Files After decoding, if the file is some sort of archive, Gnus will attempt to unpack the archive and see if any of the files in the archive can be --- 3290,3315 ---- @item gnus-uu-post-threaded @vindex gnus-uu-post-threaded ! Non-@code{nil} means that gnus-uu will post the encoded file in a ! thread. This may not be smart, as no other decoder I have seen are able ! to follow threads when collecting uuencoded articles. (Well, I have ! seen one package that does that - gnus-uu, but somehow, I don't think ! that counts...) Default is @code{nil}. @item gnus-uu-post-separate-description @vindex gnus-uu-post-separate-description ! Non-@code{nil} means that the description will be posted in a separate ! article. The first article will typically be numbered (0/x). If this ! variable is @code{nil}, the description the user enters will be included ! at the beginning of the first article, which will be numbered (1/x). ! Default is @code{t}. @end table @node Viewing Files @subsection Viewing Files + @cindex vieving files + @cindex pseudo-articles After decoding, if the file is some sort of archive, Gnus will attempt to unpack the archive and see if any of the files in the archive can be *************** *** 3105,3112 **** suggestion), and then the command will be run. @vindex gnus-view-pseudo-asynchronously ! If @code{gnus-view-pseudo-asynchronously} is nil, Emacs will wait until ! the viewing is done before proceeding. @vindex gnus-view-pseudos If @code{gnus-view-pseudos} is @code{automatic}, Gnus will not insert --- 3325,3332 ---- suggestion), and then the command will be run. @vindex gnus-view-pseudo-asynchronously ! If @code{gnus-view-pseudo-asynchronously} is @code{nil}, Emacs will wait ! until the viewing is done before proceeding. @vindex gnus-view-pseudos If @code{gnus-view-pseudos} is @code{automatic}, Gnus will not insert *************** *** 3191,3196 **** --- 3411,3417 ---- @node Summary Sorting @section Summary Sorting + @cindex summary sorting You can have the summary buffer sorted in various ways, even though I can't really se why you'd want that. *************** *** 3216,3221 **** --- 3437,3444 ---- @node Finding the Parent @section Finding the Parent + @cindex parent articles + @cindex refering articles @findex gnus-summary-refer-parent-article @kindex ^ (Summary) *************** *** 3238,3247 **** @vindex gnus-refer-article-method If the group you are reading is located on a backend that does not support fetching by Message-ID very well (like @code{nnspool}), you can ! set @code{gnus-refer-article-method} to an NNTP method. @node Score Files @section Score Files Other people use @dfn{kill files}, but we here at (ding) Gnus Towers like scoring better than killing, so we'd rather switch than fight. They --- 3461,3474 ---- @vindex gnus-refer-article-method If the group you are reading is located on a backend that does not support fetching by Message-ID very well (like @code{nnspool}), you can ! set @code{gnus-refer-article-method} to an NNTP method. It would, ! perhaps, be best if the NNTP server you consult is the same as the one ! that keeps the spool you are erading from updated, but that's not really ! necessary. @node Score Files @section Score Files + @cindex score files Other people use @dfn{kill files}, but we here at (ding) Gnus Towers like scoring better than killing, so we'd rather switch than fight. They *************** *** 3259,3266 **** There are several commands reachable from the summary buffer that inserts commands for scoring articles based on the current article. You ! can, for instance, ask Gnus to lower or raise the score of all articles ! with a certain subject. There are two sorts of scoring entries: Permanent and temporary. Temporary score entries are self-expiring entries. Any entries that are --- 3486,3493 ---- There are several commands reachable from the summary buffer that inserts commands for scoring articles based on the current article. You ! can, for instance, ask Gnus to lower or increase the score of all ! articles with a certain subject. There are two sorts of scoring entries: Permanent and temporary. Temporary score entries are self-expiring entries. Any entries that are *************** *** 3271,3313 **** * Summary Score Commands:: Adding score commands to the score file. * Score Variables:: Customize your scoring. (My, what terminology). * Score File Format:: What a score file may contain. * Scoring Tips:: How to score effectively. @end menu @node Summary Score Commands @subsection Summary Score Commands ! General score commands that have nothing to do with the score files: @table @kbd ! @item V S ! @kindex V S (Summary) @findex gnus-summary-set-score Set the score of the current article (@code{gnus-summary-set-score}). @item I C-i @kindex I C-i (Summary) @findex gnus-summary-raise-score ! Raise the score of the current article ! (@code{gnus-summary-raise-score}). @item L C-l @kindex L C-l (Summary) @findex gnus-summary-lower-score Lower the score of the current article (@code{gnus-summary-lower-score}). ! @item V b ! @kindex V b (Summary) ! @findex gnus-summary-set-mark-below ! Prompt for a score, and mark all articles with a score below this as ! read (@code{gnus-summary-set-mark-below}). ! @item V B ! @kindex V B (Summary) ! @findex gnus-summary-expunge-below ! Expunge all articles with a score below the default score (or the ! numeric prefix) (@code{gnus-summary-expunge-below}). @end table The rest of these commands modify the local score file. Commands for increasing score: @table @kbd --- 3498,3557 ---- * Summary Score Commands:: Adding score commands to the score file. * Score Variables:: Customize your scoring. (My, what terminology). * Score File Format:: What a score file may contain. + * Score File Editing:: You can edit score files by hand as well. * Scoring Tips:: How to score effectively. + * Global Score Files:: Earth-spanning, ear-splitting score files. @end menu @node Summary Score Commands @subsection Summary Score Commands + @cindex score commands ! General score commands don't actually change score files: @table @kbd ! @item V S s ! @kindex V S s (Summary) @findex gnus-summary-set-score Set the score of the current article (@code{gnus-summary-set-score}). @item I C-i @kindex I C-i (Summary) @findex gnus-summary-raise-score ! Increase the score of the current article ! (@code{gnus-summary-raise-score}). @item L C-l @kindex L C-l (Summary) @findex gnus-summary-lower-score Lower the score of the current article (@code{gnus-summary-lower-score}). ! @item V S c ! @kindex V S c (Summary) ! @findex gnus-score-change-score-file ! Make a different score file the current ! (@code{gnus-score-change-score-file}). ! @item V S e ! @kindex V S e (Summary) ! @findex gnus-score-edit-file ! Edit the current score file (@code{gnus-score-edit-file}). You will be ! popped into a @code{gnus-score-mode} buffer (@pxref{Score File ! Editing}). @end table The rest of these commands modify the local score file. + @table @kbd + @item V S m + @kindex V S m (Summary) + @findex gnus-score-set-mark-below + Prompt for a score, and mark all articles with a score below this as + read (@code{gnus-score-set-mark-below}). + @item V S E + @kindex V S E (Summary) + @findex gnus-score-set-expunge-below + Expunge all articles with a score below the default score (or the + numeric prefix) (@code{gnus-score-set-expunge-below}). + @end table + Commands for increasing score: @table @kbd *************** *** 3331,3336 **** --- 3575,3590 ---- @findex gnus-summary-raise-by-author Increase the current author permanently (@code{gnus-summary-raise-by-author}). + @item I i t + @kindex I i t (Summary) + @findex gnus-summary-temporarily-raise-by-id + Increase the current message-id temporarily + (@code{gnus-summary-temporarily-raise-by-id}). + @item I i p + @kindex I i p (Summary) + @findex gnus-summary-raise-by-id + Increase the current message-id permanently + (@code{gnus-summary-raise-by-id}). @item I t t @kindex I t t (Summary) @findex gnus-summary-temporarily-raise-by-thread *************** *** 3386,3391 **** --- 3640,3655 ---- @findex gnus-summary-lower-by-author Lower the current author permanently (@code{gnus-summary-lower-by-author}). + @item L i t + @kindex L i t (Summary) + @findex gnus-summary-temporarily-lower-by-id + Lower the current message-id temporarily + (@code{gnus-summary-temporarily-lower-by-id}). + @item L a p + @kindex L a p (Summary) + @findex gnus-summary-lower-by-id + Lower the current message-id permanently + (@code{gnus-summary-lower-by-id}). @item L t t @kindex L t t (Summary) @findex gnus-summary-temporarily-lower-by-thread *************** *** 3420,3435 **** @node Score Variables @subsection Score Variables @table @code @item gnus-kill-killed @vindex gnus-kill-killed ! If this variable is nil, Gnus will never apply score files to articles ! that have already been through the kill process. While this may save ! you lots of time, it also means that if you apply a kill file to a ! group, and then change the kill file and want to run it over you group ! again to kill more articles, it won't work. You have to set this ! variable to t to do that. @item gnus-kill-files-directory @vindex gnus-kill-files-directory All kill files will be stored in this directory, which is initialized --- 3684,3700 ---- @node Score Variables @subsection Score Variables + @cindex score variables @table @code @item gnus-kill-killed @vindex gnus-kill-killed ! If this variable is @code{nil}, Gnus will never apply score files to ! articles that have already been through the kill process. While this ! may save you lots of time, it also means that if you apply a kill file ! to a group, and then change the kill file and want to run it over you ! group again to kill more articles, it won't work. You have to set this ! variable to @code{t} to do that. @item gnus-kill-files-directory @vindex gnus-kill-files-directory All kill files will be stored in this directory, which is initialized *************** *** 3485,3490 **** --- 3750,3756 ---- @node Score File Format @subsection Score File Format + @cindex score file format A score file is an emacs-lisp file that normally contains just a single form. Casual users are not expected to edit these files, everthing can *************** *** 3492,3532 **** Anyway, if you'd like to dig into it yourself, here's an example: ! @example ! (setq gnus-score-alist ! '(("from" ! ("Lars Ingebrigtsen" nil -10000 nil) ! ("larsi\\|lmi" t -50000 nil)) ! ("subject" ! ("Ding is Badd" nil 1000 "Mon Mar 6 11:16:33 1995")) ! ("xref" ! ("alt.politics" nil -1000 "Mon Mar 6 11:17:24 1995")) ! (mark . 0) ! (expunge . -1000) ! (mark-and-expunge . -10) ! (files "/hom/larsi/News/gnu.SCORE") ! (eval (ding)))) ! @end example This example demonstrates absolutely everything about a score file. ! There's a @code{setq} that sets @code{gnus-score-alist} to an alist. ! Even though you could concievably put other lisp forms in these files as ! well, the score files are overwritten at Gnus' whim, so that would ! presently not be a good idea. ! Five atoms are supported by this alist: @table @code @item STRING If the key is a string, it is a header name to perform the scoring on. ! The value is a random amount of four element lists. The first element ! is a string. If the second element is t, this string is a regexp. If ! nil, simple string comparison will be performed. The third element is ! the score to be added if the match is made. This score may range from ! posinf to neginf. The fourth and last element is either nil, if the ! score entry is to live forever, or a date that says when the last time a ! match was made. @item mark The value of this entry should be a number. Any articles with a score lower than this number will be marked as read. --- 3758,3814 ---- Anyway, if you'd like to dig into it yourself, here's an example: ! @lisp ! (("from" ! ("Lars Ingebrigtsen" -10000) ! ("Per Abrahamsen") ! ("larsi\\|lmi" -50000 nil r)) ! ("subject" ! ("Ding is Badd" nil 728373)) ! ("xref" ! ("alt.politics" -1000 728372 s)) ! (mark 0) ! (expunge -1000) ! (mark-and-expunge -10) ! (read-only t) ! (files "/hom/larsi/News/gnu.SCORE") ! (eval (ding))) ! @end lisp This example demonstrates absolutely everything about a score file. ! Even though this looks much like lisp code, nothing here is actually ! @code{eval}ed. The lisp reader is used to read this form, though, so it ! has to be legal syntactically, if not semantically. ! Six keys are supported by this alist: @table @code @item STRING If the key is a string, it is a header name to perform the scoring on. ! Following this key is a random number of element score entries, where ! each score entry have one to four elements. ! @enumerate ! @item ! The first element is always a string - the @dfn{match element}. ! @item ! If the second element is present, it should be a number - the @dfn{score ! element}. This number should be an integer in the neginf to posinf ! interval. If this element is not present, the ! @code{gnus-score-interactive-default-score} number will be used instead. ! @item ! If the third element is present, it should be a number - the @dfn{date ! element}. This date says when the last time this score entry provided a ! match, which provides a mechanism for expiring the score entries. It ! this element is not present, the score entry is premanent. The date is ! represented by the number of days since December 31, 1 CE. ! @item ! If the fourth element is present, it should be a symbol - the @dfn{type ! element}. Currently supported are the @code{r} (regexp) and @code{s} ! (substring) types. If this element is not present, Gnus will assume ! that substring matching should be used. ! @end enumerate ! @item mark The value of this entry should be a number. Any articles with a score lower than this number will be marked as read. *************** *** 3542,3570 **** are assumed to be score files as well, and will be loaded the same way this one was. @item eval ! The value of this entry will be @code{eval}el. @end table @node Scoring Tips @subsection Scoring Tips ! @table @samp @item Crossposts If you want to lower the score of crossposts, the line to match on is the Xref header. ! @example ! ("xref" (" talk.politics.misc:" nil -1000 nil)) ! @end example @item Multiple crossposts If you want to lower the score of articles that have been crossposted to more than, say, 3 groups: ! @example ! ("xref" (" +[^ ]+:[0-9]+ +[^ ]+:[0-9]+ +[^ ]+:[0-9]+" t -1000 nil)) ! @end example ! @end table @node Mail Group Commands @section Mail Group Commands Some commands only make sense in mail groups. If these commands are illegal in the current group, they will raise a hell and let you know. --- 3824,3953 ---- are assumed to be score files as well, and will be loaded the same way this one was. @item eval ! The value of this entry will be @code{eval}el. This element will be ! ignored when handling global score files. ! @item read-only ! Read-only score files will not be updated or saved. Global score files ! should feature this atom (@pxref{Global Score Files}). ! @end table ! ! @node Score File Editing ! @subsection Score File Editing ! ! You normally enter all scoring commands from the summary buffer, but you ! might feel the urge to edit them by hand as well, so we've supplied you ! with a mode for that. ! ! It's simply a slightly customized emacs-lisp mode, with these additional ! commands: ! ! @table @kbd ! @item C-c C-c ! @kindex C-c C-c (Score) ! @findex gnus-score-edit-done ! Save the changes you have made and return to the summary buffer ! (@code{gnus-score-edit-done}). ! @item C-c C-d ! @kindex C-c C-d (Score) ! @findex gnus-score-edit-insert-date ! Insert the current date in numerical format ! (@code{gnus-score-edit-insert-date}). This is really the day number, if ! you were wondering. @end table @node Scoring Tips @subsection Scoring Tips + @cindex scoring tips ! @table @item Crossposts If you want to lower the score of crossposts, the line to match on is the Xref header. ! @lisp ! ("xref" (" talk.politics.misc:" -1000)) ! @end lisp @item Multiple crossposts If you want to lower the score of articles that have been crossposted to more than, say, 3 groups: ! @lisp ! ("xref" (" +[^ ]+:[0-9]+ +[^ ]+:[0-9]+ +[^ ]+:[0-9]+" -1000 nil r)) ! @end lisp ! @end table ! ! @node Global Score Files ! @subsection Global Score Files ! @cindex global score files ! ! Sure, other newsreaders have "global kill files". These are usually ! nothing more than a single kill file that applies to all groups, stored ! under the user's home directory. Bah! Puny, weak newsreaders! ! ! What I'm talking about here are Global Score Files. Score files from ! all over the world, from users everywhere, uniting all nations in one ! big, happy score file union! Ange-score! New and untested! ! ! @vindex gnus-global-score-files ! All you have to do to use other people's score files is to set the ! @code{gnus-global-score-files}. One entry for each score file, or each ! score file directory. Gnus will decide by itself what score files are ! applicable to which group. ! ! Say you want to use the single score file ! @file{/ftp@@ftp.ifi.uio.no:/pub/larsi/ding/score/soc.motss.SCORE} and all ! score files in the @file{/ftp@@ftp.some-where:/pub/score} directory. ! ! @lisp ! (setq gnus-global-score-files ! '("/frp@@ftp.ifi.uio.no:/pub/larsi/ding/score/soc.motss.SCORE" ! "/ftp@@ftp.some-where:/pub/score/")) ! @end lisp ! ! @findex gnus-score-search-global-directories ! Simple, eh? Directory names must end with a @samp{/}. These ! directories are typically scanned only once during each Gnus session. ! If you feel the need to manually re-scan the remote directories, you can ! use the @code{gnus-score-search-global-directories} command. ! ! Note that, at present, using this option will slow down group entry ! somewhat. (That is - a lot.) ! ! If you want to start maintaining score files for other people to use, ! just put your score file up for anonymous ftp and announce it to the ! world. Become a retro-moderator! Participate in the retro-moderator ! wars sure to ensue, where retro-moderators battle it out for the ! sympathy of the people, luring them to use their score files on false ! premises! Yay! The net is saved! ! ! Here are some tips for the would-be retro-moderator, off the top of my ! head: ! ! @itemize @bullet ! @item ! Articles that are heavily crossposted are probably junk. ! @item ! To lower a single inappropriate article, lower by message-id. ! @item ! Particularly brilliant authors can be raised on a permanent basis. ! @item ! Authors that repeatedly post off-charter for the group can safely be ! lowered out of existance. ! @item ! Set the @code{mark} and @code{expunge} atoms to obliterate the nastiest ! articles completely. ! @item ! Use expiring score entries to keep the size of the file down. You ! should probably have a long expiry period, though, as some sites keep ! old articles for a long time. ! @end itemize ! ! ... I wonder whether other newsreaders will support global score files ! in the future. *Snicker*. Yup, any day now, newsreaders like Blue ! Wave, xrn and 1stReader are bound to implement scoring. Should we start ! holding our breath yet? @node Mail Group Commands @section Mail Group Commands + @cindex mail group commands Some commands only make sense in mail groups. If these commands are illegal in the current group, they will raise a hell and let you know. *************** *** 3598,3604 **** @kindex V m r (Summary) @findex gnus-summary-respool-article Respool the mail article (@code{gnus-summary-move-article}). ! @item V m w, e @kindex V m w (Summary) @kindex e (Summary) @findex gnus-summary-edit-article --- 3981,3988 ---- @kindex V m r (Summary) @findex gnus-summary-respool-article Respool the mail article (@code{gnus-summary-move-article}). ! @item V m w ! @item e @kindex V m w (Summary) @kindex e (Summary) @findex gnus-summary-edit-article *************** *** 3661,3667 **** Give a brief description of the current group (@code{gnus-summary-describe-group}). If given a prefix, force reading new description from the server. ! @item V g, M-g @kindex V g (Summary) @kindex M-g (Summary) @findex gnus-summary-rescan-group --- 4045,4052 ---- Give a brief description of the current group (@code{gnus-summary-describe-group}). If given a prefix, force reading new description from the server. ! @item V g ! @item M-g @kindex V g (Summary) @kindex M-g (Summary) @findex gnus-summary-rescan-group *************** *** 3689,3694 **** --- 4074,4080 ---- @node The Article Buffer @chapter The Article Buffer + @cindex article buffer The articles are displayed in the article buffer, of which there is only one. All the summary buffer share the same article buffer. *************** *** 3703,3708 **** --- 4089,4096 ---- @node Hiding Headers @section Hiding Headers + @cindex hiding headers + @cindex deleting headers The top section of each article is the @dfn{header}. (The rest is the @dfn{body}, but you may have guessed that already.) *************** *** 3715,3754 **** reaching you, the message id, the references, etc. ad nauseum - and you'll probably want to get rid of some of those lines. If you want to keep all those lines in the article buffer, you can set ! @code{gnus-show-all-headers} to t. Gnus provides you with two variables for sifting header lines: @table @code @item gnus-visible-headers @vindex gnus-visible-headers ! If this variable is non-nil, it should be a regular expression that says ! what header lines you wish to keep in the article buffer. All header ! lines that does not match this variable will be hidden. For instance, if you only want to see the name of the person who wrote the article and the subject, you'd say: ! @example (setq gnus-visible-headers "^From:\\|^Subject:") ! @end example @item gnus-ignored-headers @vindex gnus-ignored-headers This variable is the reverse of @code{gnus-visible-headers}. If this ! variable is set (and @code{gnus-visible-headers} is nil), it should be a ! regular expression that matches all lines that you want to hide. All ! lines that does not match this variable will remain visible. For instance, if you just want to get rid of the references line and the xref line, you might say: ! @example (setq gnus-ignored-headers "^References:\\|^Xref:") ! @end example ! Note that if @code{gnus-visible-headers} is non-nil, this variable will ! have no effect. @end table @vindex gnus-sorted-header-list --- 4103,4142 ---- reaching you, the message id, the references, etc. ad nauseum - and you'll probably want to get rid of some of those lines. If you want to keep all those lines in the article buffer, you can set ! @code{gnus-show-all-headers} to @code{t}. Gnus provides you with two variables for sifting header lines: @table @code @item gnus-visible-headers @vindex gnus-visible-headers ! If this variable is non-@code{nil}, it should be a regular expression ! that says what header lines you wish to keep in the article buffer. All ! header lines that does not match this variable will be hidden. For instance, if you only want to see the name of the person who wrote the article and the subject, you'd say: ! @lisp (setq gnus-visible-headers "^From:\\|^Subject:") ! @end lisp @item gnus-ignored-headers @vindex gnus-ignored-headers This variable is the reverse of @code{gnus-visible-headers}. If this ! variable is set (and @code{gnus-visible-headers} is @code{nil}), it ! should be a regular expression that matches all lines that you want to ! hide. All lines that does not match this variable will remain visible. For instance, if you just want to get rid of the references line and the xref line, you might say: ! @lisp (setq gnus-ignored-headers "^References:\\|^Xref:") ! @end lisp ! Note that if @code{gnus-visible-headers} is non-@code{nil}, this ! variable will have no effect. @end table @vindex gnus-sorted-header-list *************** *** 3760,3768 **** For instance, if you want the name of the author of the article first, and then the subject, you might say something like: ! @example (setq gnus-sorted-header-list '("^From:" "^Subject:")) ! @end example Any headers that are to remain visible, but are not listed in this variable, will be displayed in random order after all the headers that --- 4148,4156 ---- For instance, if you want the name of the author of the article first, and then the subject, you might say something like: ! @lisp (setq gnus-sorted-header-list '("^From:" "^Subject:")) ! @end lisp Any headers that are to remain visible, but are not listed in this variable, will be displayed in random order after all the headers that *************** *** 3770,3775 **** --- 4158,4164 ---- @node Using Mime @section Using Mime + @cindex MIME Mime is a standard for waving your hands through the air, aimlessly, while people stand around yawning. *************** *** 3785,3791 **** @vindex gnus-show-mime-method Gnus handles MIME by shoving the articles through @code{gnus-show-mime-method}, which is @code{metamail-buffer} by ! default. Set @code{gnus-show-mime} to t if you want to use MIME all the time; it might be best just use the toggling functions from the summary buffer to avoid getting nasty surprises (for instance, you enter the group @samp{alt.sing-a-long} and, before you know it, MIME has decoded --- 4174,4180 ---- @vindex gnus-show-mime-method Gnus handles MIME by shoving the articles through @code{gnus-show-mime-method}, which is @code{metamail-buffer} by ! default. Set @code{gnus-show-mime} to @code{t} if you want to use MIME all the time; it might be best just use the toggling functions from the summary buffer to avoid getting nasty surprises (for instance, you enter the group @samp{alt.sing-a-long} and, before you know it, MIME has decoded *************** *** 3800,3805 **** --- 4189,4195 ---- @node Customizing Articles @section Customizing Articles + @cindex article customization @vindex gnus-article-display-hook The @code{gnus-article-display-hook} is called after the article has *************** *** 3843,3860 **** @kindex DEL (Article) @findex gnus-article-prev-page Scroll backwards one page (@code{gnus-article-prev-page}). ! @item C-x r ! @kindex C-x r (Article) @findex gnus-article-refer-article If point is in the neighborhood of a message-id and you press @kbd{r}, Gnus will try to get that article from the server. (Only available with nntp). (@code{gnus-article-refer-article}). ! @item C-x m ! @kindex C-x m (Article) @findex gnus-article-mail Send a reply to the address near point (@code{gnus-article-mail}). ! @item C-x M ! @kindex C-x M (Article) @findex gnus-article-mail-with-original Send a reply to the address near point and include the original article (@code{gnus-article-mail-with-original}). --- 4233,4250 ---- @kindex DEL (Article) @findex gnus-article-prev-page Scroll backwards one page (@code{gnus-article-prev-page}). ! @item C-c ^ ! @kindex C-c ^ (Article) @findex gnus-article-refer-article If point is in the neighborhood of a message-id and you press @kbd{r}, Gnus will try to get that article from the server. (Only available with nntp). (@code{gnus-article-refer-article}). ! @item C-c C-m ! @kindex C-c C-m (Article) @findex gnus-article-mail Send a reply to the address near point (@code{gnus-article-mail}). ! @item C-c C-M ! @kindex C-c C-M (Article) @findex gnus-article-mail-with-original Send a reply to the address near point and include the original article (@code{gnus-article-mail-with-original}). *************** *** 3873,3900 **** @node Misc Article @section Misc Article ! @vindex gnus-article-display-hook @vindex gnus-article-prepare-hook ! The @code{gnus-article-prepare-hook} is called right after the article ! has been inserted into the article buffer. It is mainly intended for ! functions that do something depending on the contents; it should ! probably not be used for changing the contents of the article buffer. ! Use the @code{gnus-article-display-hook} for that, which is called after ! this hook is called. ! @vindex gnus-article-mode-line-format ! @code{gnus-article-mode-line-format} is a format string along the same ! lines as @code{gnus-summary-mode-line-format}. It accepts exactly the ! same format specifications as that variable. ! @vindex gnus-break-pages ! The @code{gnus-break-pages} variable controls whether @dfn{page ! breaking} is to take place. If this variable is non-nil, the articles ! will be divided into pages whenever a @code{gnus-page-delimiter} appears ! in the article. If this variable is nil, paging will not be done. ! @vindex gnus-page-delimiter ! @code{gnus-page-delimiter} is @samp{^L} (form linefeed) by default. @node Various @chapter Various --- 4263,4296 ---- @node Misc Article @section Misc Article ! @table @code @vindex gnus-article-prepare-hook ! @item gnus-article-prepare-hook ! This hook is called right after the article has been inserted into the ! article buffer. It is mainly intended for functions that do something ! depending on the contents; it should probably not be used for changing ! the contents of the article buffer. ! @vindex gnus-article-display-hook ! @item gnus-article-display-hook ! This hook is called as the last thing when displaying an article, and is ! intended for modifying the contents of the buffer, highlight, hiding ! headers, and the like. @vindex gnus-article-mode-line-format ! @item gnus-article-mode-line-format ! This variable is a format string along the same lines as ! @code{gnus-summary-mode-line-format}. It accepts exactly the same ! format specifications as that variable. @vindex gnus-break-pages ! @item gnus-break-pages ! Controls whether @dfn{page breaking} is to take place. If this variable ! is non-@code{nil}, the articles will be divided into pages whenever a ! page delimeter appears in the article. If this variable is @code{nil}, ! paging will not be done. ! @item gnus-page-delimeter @vindex gnus-page-delimiter ! This is the delimeter mentioned above. By default, it is @samp{^L} ! (form linefeed). ! @end table @node Various @chapter Various *************** *** 3907,3932 **** @node Interactive @section Interactive @table @code @item gnus-novice-user @vindex gnus-novice-user ! If this variable is non-nil, you are either a newcomer to the usenet ! world, or you are very cautious, which is a nice thing to be, really. You will be given questions of the type "Are you sure you want to do this?" before doing anything dangerous. @item gnus-expert-user @vindex gnus-expert-user ! If this variable is non-nil, you will never ever be asked any questions ! by Gnus. It will simply assume you know what your are doing, no matter ! how strange. @item gnus-interactive-catchup @vindex gnus-interactive-catchup ! Require confirmation before catching up a group if non-nil. @item gnus-interactive-post @vindex gnus-interactive-post ! If non-nil, the user will be prompted for a group name when posting ! an article. @item gnus-interactive-exit @vindex gnus-interactive-exit Require confirmation before exiting Gnus. --- 4303,4329 ---- @node Interactive @section Interactive + @cindex interaction @table @code @item gnus-novice-user @vindex gnus-novice-user ! If this variable is non-@code{nil}, you are either a newcomer to the ! usenet world, or you are very cautious, which is a nice thing to be, really. You will be given questions of the type "Are you sure you want to do this?" before doing anything dangerous. @item gnus-expert-user @vindex gnus-expert-user ! If this variable is non-@code{nil}, you will never ever be asked any ! questions by Gnus. It will simply assume you know what your are doing, ! no matter how strange. @item gnus-interactive-catchup @vindex gnus-interactive-catchup ! Require confirmation before catching up a group if non-@code{nil}. @item gnus-interactive-post @vindex gnus-interactive-post ! If non-@code{nil}, the user will be prompted for a group name when ! posting an article. @item gnus-interactive-exit @vindex gnus-interactive-exit Require confirmation before exiting Gnus. *************** *** 3934,3958 **** @node Windows Configuration @section Windows Configuration No, there's nothing here about X, so be quiet. @table @code @item gnus-use-full-window @vindex gnus-use-full-window ! If non-nil, Gnus will delete all other windows and occupy the entire ! Emacs screen by itself. It is t by default. @item gnus-window-configuration @vindex gnus-window-configuration This variable describes how much space each Gnus buffer should be given, compared to the other Gnus buffers. Here's an example: ! @example (setq gnus-window-configuration '((summary (0 1 0)) (groups (1 0 0)) (article (0 3 10)))) ! @end example This variable is a list of lists, where each of these small lists is on the form @var{(action (g s a))}. As you can see, there are three --- 4331,4356 ---- @node Windows Configuration @section Windows Configuration + @cindex windows configuration No, there's nothing here about X, so be quiet. @table @code @item gnus-use-full-window @vindex gnus-use-full-window ! If non-@code{nil}, Gnus will delete all other windows and occupy the ! entire Emacs screen by itself. It is @code{t} by default. @item gnus-window-configuration @vindex gnus-window-configuration This variable describes how much space each Gnus buffer should be given, compared to the other Gnus buffers. Here's an example: ! @lisp (setq gnus-window-configuration '((summary (0 1 0)) (groups (1 0 0)) (article (0 3 10)))) ! @end lisp This variable is a list of lists, where each of these small lists is on the form @var{(action (g s a))}. As you can see, there are three *************** *** 3971,4022 **** whenever Gnus tries to configure the Gnus buffers, that function will be called with the @var{action} as its parameter. There is one pre-made function supplied, @code{gnus-window-configuration-split}, which may be ! suitable if you have a very wide Emacs window, and wants to have the ! summary buffer and the article buffer side by side. Here's the ! definition of this function, which you may use as a template for your ! own function(s): ! ! @example ! (defun gnus-window-configuration-split (action) ! ;; The group buffer always exists, so it's nice to use ! ;; it as a starting point. ! (switch-to-buffer gnus-group-buffer t) ! (delete-other-windows) ! (split-window-horizontally) ! (cond ((or (eq action 'group) (eq action 'summary)) ! (if (and (get-buffer gnus-summary-buffer) ! (buffer-name gnus-summary-buffer)) ! (switch-to-buffer-other-window gnus-summary-buffer))) ! ((eq action 'article) ! (switch-to-buffer gnus-summary-buffer t) ! (other-window 1) ! ;; Create and initialize the article buffer if it doesn't ! ;; exist. ! (gnus-article-setup-buffer) ! (switch-to-buffer gnus-article-buffer t)))) ! @end example @end table @node Various Various @section Various Various @vindex gnus-updated-mode-lines ! The @code{gnus-updated-mode-lines} variable is a list of buffers that ! should keep their mode lines updated. The list may contain the symbols ! `group', `article' and `summary'. If the corresponding symbol is ! present, Gnus will keep that mode line updated with information that may ! be pertinent. If this variable is nil, screen refresh may be quicker. @vindex gnus-visual ! If @code{gnus-visual} is nil, Gnus won't attempt to create menus or use ! fancy colours or fonts. This will also inhibit loading of the ! @file{gnus-visual.el} file. ! ! @code{gnus-mouse-face} is the face used for mouse highlighting in Gnus. ! No mouse highlights will be done if @code{gnus-visual} is nil. @node Customization @chapter Customization All variables are properly documented elsewhere in this manual. This section is designed to give general pointers on how to customize Gnus --- 4369,4423 ---- whenever Gnus tries to configure the Gnus buffers, that function will be called with the @var{action} as its parameter. There is one pre-made function supplied, @code{gnus-window-configuration-split}, which may be ! suitable if you have a very wide Emacs window, and want to have the ! summary buffer and the article buffer side by side. @end table @node Various Various @section Various Various + @cindex mode lines + @cindex highlights + @table @code + @item gnus-updated-mode-lines @vindex gnus-updated-mode-lines ! This is a list of buffers that should keep their mode lines updated. ! The list may contain the symbols `group', `article' and `summary'. If ! the corresponding symbol is present, Gnus will keep that mode line ! updated with information that may be pertinent. If this variable is ! @code{nil}, screen refresh may be quicker. ! ! @item gnus-mode-non-string-length ! @vindex gnus-mode-non-string-length ! By default, Gnus displays information of article in the mode lines of ! the summary and article buffers. The information Gnus wishes to display ! (eg. the subject of the article) is often longer than the mode lines, ! and therefore have to be cut off at some point. This variable says how ! long the other info on the line is (ie. the non-info part). If you put ! additional elements on the mode line (eg. a clock), you should modify ! this variable: ! @c Hook written by Keinonen Kari . ! @lisp ! (add-hook 'display-time-hook ! (lambda () ! (setq gnus-mode-non-string-length ! (+ 21 (length display-time-string))))) ! @end lisp + @item gnus-visual @vindex gnus-visual ! If @code{nil}, Gnus won't attempt to create menus or use fancy colours ! or fonts. This will also inhibit loading the @file{gnus-visual.el} ! file. ! @item gnus-mouse-face ! @vindex gnus-mouse-face ! This is the face (ie. font) used for mouse highlighting in Gnus. No ! mouse highlights will be done if @code{gnus-visual} is @code{nil}. ! @end table @node Customization @chapter Customization + @cindex general customization All variables are properly documented elsewhere in this manual. This section is designed to give general pointers on how to customize Gnus *************** *** 4038,4053 **** @table @code @item gnus-read-active-file ! Set this to nil, which will inhibit Gnus from requesting the entire active ! file from the server. This file is often v. large. You also have to set ! @code{gnus-check-new-news} and @code{gnus-check-bogus-newsgroups} to nil ! to make sure that Gnus doesn't suddenly decide to fetch the active file ! anyway. Note that this will make it difficult for you to get hold of new ! groups. ! @item nntp-xover-is-evil ! This one has to be nil. If not, grabbing article headers from the NNTP ! server will not be very fast. Not all NNTP servers support XOVER; Gnus ! will detect this by itself. @end table @node Slow Terminal Connection --- 4439,4454 ---- @table @code @item gnus-read-active-file ! Set this to @code{nil}, which will inhibit Gnus from requesting the ! entire active file from the server. This file is often v. large. You ! also have to set @code{gnus-check-new-news} and ! @code{gnus-check-bogus-newsgroups} to @code{nil} to make sure that Gnus ! doesn't suddenly decide to fetch the active file anyway. Note that this ! will make it difficult for you to get hold of new groups. ! @item gnus-nov-is-evil ! This one has to be @code{nil}. If not, grabbing article headers from ! the NNTP server will not be very fast. Not all NNTP servers support ! XOVER; Gnus will detect this by itself. @end table @node Slow Terminal Connection *************** *** 4059,4066 **** @table @code @item gnus-auto-center-summary ! Set this to nil to inhibit Gnus from recentering the summary buffer all ! the time. @item gnus-visible-headers Cut down on the headers that are included in the articles to the minimum. You can, in fact, make do without them altogether - most of the --- 4460,4467 ---- @table @code @item gnus-auto-center-summary ! Set this to @code{nil} to inhibit Gnus from recentering the summary ! buffer all the time. @item gnus-visible-headers Cut down on the headers that are included in the articles to the minimum. You can, in fact, make do without them altogether - most of the *************** *** 4068,4089 **** @samp{"^NEVVVVER"} or @samp{"From:"}, or whatever you feel you need. @item gnus-article-display-hook Set this hook to all the available hiding commands: ! @example (setq gnus-article-display-hook '(gnus-article-hide-headers gnus-article-hide-signature gnus-article-hide-citation)) ! @end example @item gnus-use-full-window ! By setting this to nil, you can make all the windows smaller. While this ! doesn't really cut down much generally, it means that you have to see ! smaller portions of articles before deciding that you didn't want to ! read them anyway. @item gnus-thread-hide-subtree ! If this is non-nil, all threads in the summary buffer will be hidden ! initially. @item gnus-updated-mode-lines ! If this is nil, Gnus will not put information in the buffer mode lines, ! which might save some time. @end table @node Little Disk Space --- 4469,4490 ---- @samp{"^NEVVVVER"} or @samp{"From:"}, or whatever you feel you need. @item gnus-article-display-hook Set this hook to all the available hiding commands: ! @lisp (setq gnus-article-display-hook '(gnus-article-hide-headers gnus-article-hide-signature gnus-article-hide-citation)) ! @end lisp @item gnus-use-full-window ! By setting this to @code{nil}, you can make all the windows smaller. ! While this doesn't really cut down much generally, it means that you ! have to see smaller portions of articles before deciding that you didn't ! want to read them anyway. @item gnus-thread-hide-subtree ! If this is non-@code{nil}, all threads in the summary buffer will be ! hidden initially. @item gnus-updated-mode-lines ! If this is @code{nil}, Gnus will not put information in the buffer mode ! lines, which might save some time. @end table @node Little Disk Space *************** *** 4094,4109 **** @table @code @item gnus-save-newsrc-file ! If this is nil, Gnus will never save @file{.newsrc} - it will only save ! @file{.newsrc.eld}. This means that you will not be able to use any ! other newsreaders than Gnus. @item gnus-save-killed-list ! If this is nil, Gnus will not save the list of dead groups. That ! means that Gnus will not know whether groups are new or old, which ! makes automatic handling of new groups impossible. You should also ! set @code{gnus-check-new-newsgroups} and ! @code{gnus-check-bogus-newsgroups} to nil if you set this variable to ! nil. @end table @node Slow Machine --- 4495,4509 ---- @table @code @item gnus-save-newsrc-file ! If this is @code{nil}, Gnus will never save @file{.newsrc} - it will ! only save @file{.newsrc.eld}. This means that you will not be able to ! use any other newsreaders than Gnus. @item gnus-save-killed-list ! If this is @code{nil}, Gnus will not save the list of dead groups. That ! means that Gnus will not know whether groups are new or old, which makes ! automatic handling of new groups impossible. You should also set ! @code{gnus-check-new-newsgroups} and @code{gnus-check-bogus-newsgroups} ! to @code{nil} if you set this variable to @code{nil}. @end table @node Slow Machine *************** *** 4113,4129 **** few things you can do to make Gnus run faster. Set @code{gnus-read-active-file}, @code{gnus-check-new-newsgroups}, ! @code{gnus-check-bogus-newsgroups} to nil to make startup faster. Set @code{gnus-show-threads}, @code{gnus-use-cross-reference} and ! @code{nntp-xover-is-evil} to nil to make entering and exiting the summary buffer faster. ! Set @code{gnus-article-display-hook} to nil to make article processing a ! bit faster. @node Troubleshooting @chapter Troubleshooting (ding) Gnus work so well straight out of the box, so I can't imagine any problems, really. --- 4513,4530 ---- few things you can do to make Gnus run faster. Set @code{gnus-read-active-file}, @code{gnus-check-new-newsgroups}, ! @code{gnus-check-bogus-newsgroups} to @code{nil} to make startup faster. Set @code{gnus-show-threads}, @code{gnus-use-cross-reference} and ! @code{nntp-xover-is-evil} to @code{nil} to make entering and exiting the summary buffer faster. ! Set @code{gnus-article-display-hook} to @code{nil} to make article ! processing a bit faster. @node Troubleshooting @chapter Troubleshooting + @cindex troubleshooting (ding) Gnus work so well straight out of the box, so I can't imagine any problems, really. *************** *** 4133,4139 **** Make sure your computer is switched on. Make sure that you really load the current Gnus version. If you have ! been running GNUS, you need to exit Emacs and start it up again before Gnus will work. Read the help group (@kbd{M h} in the group buffer) for a FAQ and a --- 4534,4540 ---- Make sure your computer is switched on. Make sure that you really load the current Gnus version. If you have ! been running @sc{GNUS}, you need to exit Emacs and start it up again before Gnus will work. Read the help group (@kbd{M h} in the group buffer) for a FAQ and a *************** *** 4144,4149 **** --- 4545,4552 ---- @node Reporting Bugs @chapter Reporting Bugs + @cindex bugs + @cindex reporting bugs @kindex M-x gnus-bug @findex gnus-bug