Path: utzoo!attcan!uunet!kddlab!titcca!fgw!flab!umerin From: umerin@flab.flab.fujitsu.JUNET (Masanobu UMEDA) Newsgroups: comp.emacs,fj.editor.emacs Subject: GNUS 3.11: A GNU Emacs newsreader (1 of 9) Message-ID: <4799@flab.flab.fujitsu.JUNET> Date: 23 Feb 89 07:14:53 GMT Reply-To: umerin@flab.flab.fujitsu.JUNET (Masanobu UMEDA) Followup-To: comp.emacs Organization: Fujitsu Laboratories Ltd., Kawasaki, Japan. Lines: 1307 This is a new version of GNUS, an NNTP-based newsreader for GNU Emacs. This release includes many bug fixes and improvements. The first edition of the Texinfo manual of GNUS is also included. Please read the installation guide INSTALL.GNUS carefully before getting started with GNUS. New features of GNUS version 3.11: * Selecting articles partially in a large newsgroup. * Better help system using an Info file produced from gnus.texinfo. * More hooks and variables for customization. * Texinfo manual of GNUS 3.11. Please send questions, bug fixes, and extensions to: info-gnus-english@tut.cis.ohio-state.edu, or USENET newsgroup `gnu.emacs.gnus' Masanobu UMEDA umerin@flab.flab.Fujitsu.JUNET umerin%flab.flab.Fujitsu.JUNET@uunet.uu.NET ---- Cut Here and unpack ---- #!/bin/sh # shar: Shell Archiver (v1.22) # # This is part 1 of a multipart archive # do not concatenate these parts, unpack them in order with /bin/sh # # Run the following text with /bin/sh to create: # INSTALL.GNUS # gnus-user.el # gnus.el # mhspool.el # nnspool.el # nntp.el # tcp.el # tcp.c # gnus.texinfo # if test -r s2_seq_.tmp then echo "Must unpack archives in sequence!" next=`cat s2_seq_.tmp`; echo "Please unpack part $next next" exit 1; fi sed 's/^X//' << 'SHAR_EOF' > INSTALL.GNUS && XThis is a copy of one chapter from the Info file gnus-1. For full Xinformation on installing GNUS, refer to the GNUS manual. X X XInstalling GNUS X*************** X X Installation of GNUS and some initializations of your computing Xenvironment are described in this chapter. Please read the following Xsections carefully before getting started with GNUS. X X* Menu: X X* Files of GNUS:: How many files of GNUS are there? X* Compilation:: How to byte-compile lisp sources. X* Autoloading:: How to define autoload entries. X* Environment:: How to define your environment. X* Texinfo Manual:: How to install an Info file and print the manual. X X XFiles of GNUS X============= X X Unpacking the shar files will produce the following files. They are XEmacs lisp sources, a C source, and a Texinfo manual of GNUS. X X`gnus.el' X Main part of GNUS newsreader. X X`nntp.el' X NNTP package. X X`nnspool.el' X Patches to `nntp.el' for spool access. X X`mhspool.el' X Patches to `nnspool.el' for private directory access. X X`tcp.el' X Patches to old GNU Emacs which does not have a function X `open-network-stream'. X X`tcp.c' X C program for external TCP/IP implementation. This is used with X `tcp.el'. X X`gnus.texinfo' X Texinfo manual of GNUS. X X XByte-Compilation X================ X X Move the lisp files to the appropriate directory in the search path Xdefined by the variable `load-path'. Before actually byte-compiling the Xlisp files, make sure there are no byte-compiled files of older versions Xof GNUS in that directory. Remove or rename such files as the Xbyte-compiler may be got confused with old macro definitions. X X The C file `tcp.c' should be compiled with a C compiler and installed Xin a directory in the search path defined by the variable `exec-path', Xif this is required. X X Byte-compile lisp files in the following order according to your Xcomputing environment: X X 1. Byte-compile `nntp.el' and `gnus.el' in this order. X X 2. Byte-compile `nnspool.el' if you want to use a local news spool of X your machine instead of NNTP (*Note Local News Spool::). X X 3. Byte-compile `mhspool.el' if you want to read articles or mail in X your private directory using GNUS (*Note Private Directory::). X X 4. Compile and install `tcp.el' and `tcp.c' if TCP/IP stream is not X supported by Emacs but is supported by your operating system. X X `tcp.el' defines the function `open-network-stream', and `tcp.c' is an Xemulation program of the stream which is called from that function. If Xyou modified `tcp.c' for your system, please send the author the diffs. XSome of them will be included in the future releases of GNUS. X X XAutoloading X=========== X X It is useful to define autoload entries in `.emacs', `site-init.el' or X`default.el' as follows: X X (autoload 'gnus "gnus" "Read network news." t) X (autoload 'gnus-post-news "gnus" "Post news." t) X X XEnvironment X=========== X X The NNTP server and its service name, your domain and organization, Xand other important definitions of your computing environment are Xdescribed in this section. Since these definitions depend heavily on Xyour environment, you'd better be familiar with the operating system you Xare using and an abstract of USENET. X X* Menu: X X* Server: NNTP Server. How to define NNTP server. X* Service: NNTP Service. How to define NNTP service. X* Domain:: How to define your domain and organization. X* GENERICFROM:: How to use GENERICFROM feature. X* GENERICPATH:: How to use GENERICPATH feature. X* Startup File:: About the startup files of GNUS. X X XNNTP Server X----------- X X The variable `gnus-nntp-server' specifies the default NNTP server. To Xdefine the server `flab', put the following codes in `.emacs', X`site-init.el' or `default.el': X X (setq gnus-nntp-server "flab") X X The variable `gnus-nntp-server' is initialized from the `NNTPSERVER' Xenvironment variable. To define the server using the `NNTPSERVER' Xenvironment variable, put the following codes in `.login': X X setenv NNTPSERVER "flab" X X If an NNTP server is preceded by a colon such as `:Mail', the user's Xprivate directory `~/Mail' is used as the news spool. This makes it Xpossible to read mail stored in MH folders or articles saved by GNUS. X*Note Private Directory::, for more information. X X GNUS will ask you for the NNTP server at start up time unless it is Xdefined. Even if the default server is defined, it is possible to Xchoose another server by invoking GNUS with a prefix argument like `C-u XM-x gnus' (*Note Getting Started::). X X XNNTP Service X------------ X X The default service name of NNTP is `"nntp"'. You may, however, have Xto define the service name as the number `119' as follows: X X (setq gnus-nntp-service 119) X X If you'd like to use a local news spool of your machine directly Xinstead of NNTP, set the variable to `nil' as follows: X X (setq gnus-nntp-service nil) X XIn this case, the NNTP server must be a local host name returned by the Xfunction `system-name' (*Note Local News Spool::). X X XDomain and Organization X----------------------- X X "Domain" and "organization" must be defined before you post your first Xarticle, because they are included in all articles you post, and will be Xused for identifying who you are. X X "Domain" is the domain part of your mail address excluding the local Xhost name. For example, if your mail address is X`umerin@photon.stars.flab.Fujitsu.JUNET' and the local host name is X`photon', your domain is `stars.flab.Fujitsu.JUNET'. If the function X`system-name' of your Emacs returns the full Internet name, you do not Xhave to define the domain. X X "Organization" is the organization you belong to. It must be defined Xunconditionally. X X To define the domain `stars.flab.Fujitsu.JUNET' and the organization X`Fujitsu Laboratories Ltd., Kawasaki, Japan.' using lisp variables, put Xthe following codes in `.emacs', `site-init.el' or `default.el'. If you Xare a system administrator and installing GNUS for other users, X`site-init.el' is the best place to define them because the domain and Xorganization are common to all users of the system. X X (setq gnus-your-domain "stars.flab.Fujitsu.JUNET") X (setq gnus-your-organization X "Fujitsu Laboratories Ltd., Kawasaki, Japan.") X X The `DOMAINNAME' and `ORGANIZATION' environment variables are used Xinstead if defined. To define these variables, put the following codes Xin `.login'. X X setenv DOMAINNAME "stars.flab.Fujitsu.JUNET" X setenv ORGANIZATION "Fujitsu Laboratories Ltd., Kawasaki, Japan." X X XGENERICFROM X----------- X X If the variable `gnus-use-generic-from' is non-`nil', the local host Xname of your machine will not appear in the `From:' field of article Xheaders you post. This is called the "GENERICFROM" feature in the Bnews Xsystem. This may be useful if there are many workstations connected to Xeach other in a local area network, and aliases service or automatic Xforwarding of mail is supported between the workstations. X X To use the GENERICFROM, put the following codes in `.emacs', X`site-init.el' or `default.el'. If you are a system administrator and Xinstalling GNUS for other users, `site-init.el' is the best place to Xdefine it because the definition is common to all users of the system Xhaving the same domain and organization (*Note Domain and Organization: XDomain.). X X (setq gnus-use-generic-from t) X X As a special case of the GENERICFROM feature, if the variable X`gnus-use-generic-from' is a string, it is used as your domain instead Xof the definition of the variable `gnus-your-domain' or the environment Xvariable `DOMAINNAME' (*Note Domain and Organization: Domain.). X X XGENERICPATH X----------- X X If the variable `gnus-use-generic-path' is `nil', the NNTP server name Xfollowed by the user login name is used in the `Path:' field of article Xheaders you post. If it is a string, the string followed by the user Xlogin name is used instead. Otherwise, if it is non-`nil', only the Xuser login name is used. This is called the "GENERICPATH" feature in Xthe Bnews system. X X For example, to define the generic path `flab', put the following Xcodes in `.emacs', `site-init.el' or `default.el'. If you are a system Xadministrator and installing GNUS for other users, `site-init.el' is the Xbest place to define it because the definition is common to all users of Xthe system having the same domain and organization (*Note Domain and XOrganization: Domain.). X X (setq gnus-use-generic-path "flab") X XIn this case, the `Path:' field will be generated as `Path: flab!USER'. X X XStartup File X------------ X X "Startup file" is a file recording information on articles you have Xalready read. GNUS uses `.newsrc' for the startup file as in the Bnews Xsystem. If you think you will talk to exactly one NNTP server, you can Xuse it without any problems. Otherwise, if you want to talk to several XNNTP servers, you'd better use server specific startup files since Xstartup files are not portable between servers. The server specific Xstartup file for an NNTP server on a machine SERVER is a file named X`.newsrc-SERVER'. For example, `.newsrc-photon' is for an NNTP server Xon a machine named `photon'. The primary name of the startup file, X`.newsrc', is specified by the variable `gnus-startup-file' (*Note XVariables::). X X GNUS automatically adds newly created newsgroups to a startup file Xwhen getting started. To prevent adding the newsgroups under some Xnewsgroup hierarchies, you can use the options line in the startup file. XOption `-n' of the options line in the startup file is recognized Xproperly the same as for the Bnews system. For example, if the options Xline is `options -n !talk talk.rumors', newsgroups under the `talk' Xhierarchy except for `talk.rumors' are ignored while checking new Xnewsgroups. This is the only way to keep startup files small. These Xignored newsgroups can be added manually using the command `U' X(`gnus-Group-unsubscribe-group') in the Newsgroup buffer (*Note XMaintenance::). X X Once a startup file is updated by GNUS, the "quick startup file" of Xwhich the file name is generated by appending `.el' to that of the raw Xstartup file is also created. The quick startup file can be read by XEmacs faster than the raw startup file since all information in the file Xis in lisp form. If there is a quick startup file and it is newer than Xthe raw startup file, the quick startup file is loaded instead of the Xraw startup file. If the raw startup file is newer, it is normally read Xafter loading the quick startup file. You should not remove the quick Xstartup file because it contains additional information. Instead, make Xthe raw startup file newer than that by touching it or force GNUS to Xread it by using the command `gnus-Group-restart' if you want to reflect Xthe changes of the raw startup file to GNUS. X X XTexinfo Manual X============== X X `gnus.texinfo' is a manual of GNUS written in Texinfo format. This Xfile can be printed using TeX, and also can be read using Info Mode of XEmacs. X X *Note Creating an Info File: (texinfo)Creating an Info File, to create Xan on-line Info file from the Texinfo manual. If you are not allowed to Xcreate the Info file in the standard Info directory specified by the Xvariable `Info-directory', create it in your private directory and set Xthe variable `gnus-Info-directory' to the directory. X X If this Info file is installed, you can read the documentation of GNUS Xaccording to the current major mode of GNUS. The command X`gnus-Info-find-node' to read the appropriate Info nodes of the Info Xfile is assigned to `C-c C-i' in all major modes of GNUS. X X *Note Printing Hardcopy: (texinfo)Printing Hardcopy, to print a Xhardcopy of the manual. SHAR_EOF chmod 0644 INSTALL.GNUS || echo "restore of INSTALL.GNUS fails" set `wc -c INSTALL.GNUS`;Sum=$1 if test "$Sum" != "11715" then echo original size 11715, current size $Sum;fi sed 's/^X//' << 'SHAR_EOF' > gnus-user.el && X;;; User Contributed Software for GNUS newsreader X;; Copyright (C) 1989 Masanobu UMEDA X X;; This file is part of GNU Emacs. X X;; GNU Emacs is distributed in the hope that it will be useful, X;; but WITHOUT ANY WARRANTY. No author or distributor X;; accepts responsibility to anyone for the consequences of using it X;; or for whether it serves any particular purpose or works at all, X;; unless he says so in writing. Refer to the GNU Emacs General Public X;; License for full details. X X;; Everyone is granted permission to copy, modify and redistribute X;; GNU Emacs, but only under the conditions described in the X;; GNU Emacs General Public License. A copy of this license is X;; supposed to have been given to you along with GNU Emacs so you X;; can know your rights and responsibilities. It should be in a X;; file named COPYING. Among other things, the copyright notice X;; and this notice must be preserved on all copies. X X;; All codes in this file are contributed by GNUS users, and those are X;; not part of the standard GNUS. This file consists of several X;; independent programs that may interfare with each other. If you X;; think some of them are useful, you'd better extract and copy them X;; to your own file. Some of these programs may be included in the X;; future releases of GNUS. Please do not send me any flame on them. X X;;Date: Tue, 15 Nov 88 16:49:50 JST X;;From: hattori@kaba.junet (Takashi Hattori) X;;Return-Path: X;;To: info-gnus@flab.fujitsu.junet X;;In-Reply-To: Ricardo A. Cardenas's message of Wed, 9 Nov 88 09:58:37 PST <8811091758.AA22287@hqpyr1.oracle.com> X;;Subject: moving newsgroups around X;; X;;Months ago, I made lisp functions to change the order of newsgroups in X;;the GNUS buffer. It seems to work well with GNUS 3.10 though it is not X;;fully tested. X;; X;; Takashi Hattori X;; hattori@kaba.junet X;; X;;--------------------------------------------------------------------- X;;USAGE: Set mark at the line of the newsgroup to be moved. Then, eval X;;gnus-move-group-{front, behind} at the place it should be located. X X(defun gnus-move-group-front () X "Move the marked news group to the line before dot." X (interactive) X (gnus-move-group nil)) X X(defun gnus-move-group-behind () X "Move the marked news group to the line after dot." X (interactive) X (gnus-move-group t)) X X(defun gnus-move-group (behind) X (let* ((buffer-read-only nil) X (src (save-excursion X (exchange-point-and-mark) X (gnus-Group-group-name))) X (dst (gnus-Group-group-name)) X (before-src nil) (before-dst nil) (src-group nil) X (newsrc (cons nil gnus-newsrc-assoc)) X (newsrc-head newsrc)) X (save-excursion X (and src dst X (progn X (while (not (and before-src before-dst)) X (let ((group-name (car (car (cdr newsrc))))) X (if (equal src group-name) X (setq before-src newsrc)) X (if (equal dst group-name) X (setq before-dst newsrc))) X (setq newsrc (cdr newsrc))) X (setq src-group (cdr before-src)) X (if behind X (setq before-dst (cdr before-dst))) X (rplacd before-src (cdr (cdr before-src))) X (rplacd src-group (cdr before-dst)) X (rplacd before-dst src-group) X (setq gnus-newsrc-assoc (cdr newsrc-head)) X (exchange-point-and-mark) X (beginning-of-line) X (kill-line 1) X (exchange-point-and-mark) X (if behind X (forward-line)) X (beginning-of-line) X (yank) X (set-buffer (find-file-noselect gnus-current-startup-file)) X (goto-char (point-min)) X (re-search-forward (concat "^" src "[:!]")) X (beginning-of-line) X (kill-line 1) X (goto-char (point-min)) X (re-search-forward (concat "^" dst "[:!]")) X (if behind X (forward-line)) X (beginning-of-line) X (yank)))))) X X(define-key gnus-Group-mode-map "m" 'gnus-move-group-front) X(define-key gnus-Group-mode-map "M" 'gnus-move-group-behind) X X X;;Return-Path: X;;Date: Thu, 16 Feb 89 17:28:32 EST X;;From: David.Detlefs@DLD.AVALON.CS.CMU.EDU X;;To: kddlab!flab.flab.fujitsu.jp!flab.flab.fujitsu.junet!umerin@uunet.UU.NET X;;Subject: Some gnus enhancements I've made... X;; X;;Masanobu -- X;; X;;I've been using gnus now for about a month with a fair degree of X;;satisfaction. Great work! However, like a typical hacker, I couldn't X;;leave well-enough alone, and changed some things I didn't like. X X(defvar gnus-Group-cur-target-loc nil X "Location to insert moving group to.") X X(defmacro gnus-alist-delete (alist key) X "Deletes (the first instance of) an alist element whose key is key Xfrom alist." X (` (if (equal (car (car (, alist))) (, key)) X (setq (, alist) (cdr (, alist))) X (let ((temp-alist (, alist)) X (next-elem nil)) X (while (and (cdr temp-alist) X (not (equal (car (car (cdr temp-alist))) (, key)))) X (setq temp-alist (cdr temp-alist))) X (if (cdr temp-alist) X (rplacd temp-alist (cdr (cdr temp-alist)))))) )) X X(defmacro gnus-alist-insert (alist list loc) X "Inserts 'list' into 'alist' as the 'loc'th element." X (` (if (= (, loc) 1) X (setq (, alist) (cons (, list) (, alist))) X (let ((temp-alist (, alist)) X (temp-loc (1- (, loc)))) X (while (and (cdr temp-alist) (not (= temp-loc 1))) X (setq temp-alist (cdr temp-alist)) X (setq temp-loc (1- temp-loc))) X (rplacd temp-alist (cons (, list) (cdr temp-alist))))))) X X(defun gnus-Group-normalize-display () X "Removes unsubscribed and empty newsgroups from the display." X (interactive) X (gnus-reorder-newsrc-file) X (gnus-Group-prepare nil)) X X(defun gnus-Group-move-group (new-loc) X "Moves the current group (the one on the line containing the cursor) Xin the Newsgroup ordering. If new-loc is nil (no prefix argument), Xthe current group is inserted just after the place where the last group Xwas inserted, or to the beginning of the list if no previous insert has Xbeen done in this buffer. If a numeric argument is given X(^U-n) the current group is moved to that position in the list. If the mark Xhas been set and a prefix argument without a value (^U) is given, the current Xgroup is inserted after the marked group." X (interactive "P") X (let* ((mark-val (mark)) X (group-name (gnus-Group-group-name)) X (group-entry (assoc group-name gnus-newsrc-assoc))) X (gnus-alist-delete gnus-newsrc-assoc group-name) X (if (not gnus-have-all-newsgroups) X (if (and new-loc (listp new-loc)) X (error "Can only insert before mark if all groups are showing.")) X (gnus-Group-prepare t)) X (cond X ((integerp new-loc) (setq gnus-Group-cur-target-loc new-loc)) X ((null new-loc) (or gnus-Group-cur-target-loc X (setq gnus-Group-cur-target-loc 1))) X ;; Otherwise, is plain ^U X (t (if (not mark-val) X (error "The mark is not set.") X (setq gnus-Group-cur-target-loc X (save-excursion (goto-char mark-val) X (count-lines 1 (point))))))) X (gnus-alist-insert gnus-newsrc-assoc group-entry X gnus-Group-cur-target-loc) X (setq gnus-Group-cur-target-loc (1+ gnus-Group-cur-target-loc)) X (gnus-reorder-newsrc-file) X (gnus-Group-prepare t) X (goto-line gnus-Group-cur-target-loc) X (beginning-of-line 1) X (search-forward ":"))) X X(defvar gnus-newsrc-subscribed-regexp "^.*:.*$") X(defvar gnus-newsrc-unsubscribed-regexp "^.*!.*$") X X;;; Suitable for calling as a gnus-Save-newsrc-hook. X(defun gnus-reorder-newsrc-file () X ;; First, move any (newly) unsubscribed groups in gnus-newsrc-assoc X ;; to the unsubscribed section. We will scan the alist twice, once X ;; to find the last subscribed group, and once to move all X ;; unsubscribed groups that precede it behind it. X (let ((last-subscribed nil) X (cur-group-list gnus-newsrc-assoc) X (prev-group-list nil) X (this-group nil) X (insert-point nil)) X (while cur-group-list X (setq this-group (car cur-group-list)) X ;; Is it subscribed? X (if (nth 1 this-group) (setq last-subscribed cur-group-list)) X (setq cur-group-list (cdr cur-group-list))) X (setq cur-group-list gnus-newsrc-assoc) X ;; Now move any unsubscribed behind. X (setq insert-point last-subscribed) X (while (not (eq cur-group-list last-subscribed)) X (setq this-group (car cur-group-list)) X ;; Is it unsubscribed? X (if (not (nth 1 this-group)) X (progn X (if prev-group-list X (progn ; Delete after prev-group X (rplacd prev-group-list (cdr cur-group-list)) X (rplacd cur-group-list (cdr insert-point)) X (rplacd insert-point cur-group-list) X (setq cur-group-list (cdr prev-group-list))) X ; Else remove from front. X (setq gnus-newsrc-assoc (cdr cur-group-list)) X (rplacd cur-group-list (cdr last-subscribed)) X (rplacd last-subscribed cur-group-list) X (setq cur-group-list gnus-newsrc-assoc)) X ;; In either case, we inserted. X (setq insert-point (cdr insert-point))) X ;; It is subscribed; go on. X (setq prev-group-list cur-group-list) X (setq cur-group-list (cdr cur-group-list))))) X X ;; Now, make the .newsrc order match the gnus-newsrc-assoc order. X (save-excursion X (set-buffer (get-file-buffer gnus-current-startup-file)) X (goto-char (point-min)) X (let ((cur-group-list gnus-newsrc-assoc) X (this-group nil) X (cur-insert-place nil) X (cur-group-string nil) X (cur-group-name-regexp nil)) X (while cur-group-list X (setq this-group (car cur-group-list)) X X ;; Is it not already in order? X (setq cur-group-name-regexp X (concat "^" (regexp-quote (car this-group)) "[!:]")) X (if (not (looking-at cur-group-name-regexp)) X (progn X (setq cur-insert-place (point)) X (re-search-forward cur-group-name-regexp) X (goto-char (match-beginning 0)) X (setq cur-group-string X (buffer-substring X (point) X (save-excursion (beginning-of-line 2) (point)))) X (delete-region (point) X (save-excursion (beginning-of-line 2) (point))) X (goto-char cur-insert-place) X (insert cur-group-string)) X (beginning-of-line 2)) X (setq cur-group-list (cdr cur-group-list)))))) X X(define-key gnus-Group-mode-map "i" 'gnus-Group-move-group) SHAR_EOF chmod 0444 gnus-user.el || echo "restore of gnus-user.el fails" set `wc -c gnus-user.el`;Sum=$1 if test "$Sum" != "10028" then echo original size 10028, current size $Sum;fi sed 's/^X//' << 'SHAR_EOF' > gnus.el && X;;; GNUS: an NNTP-based News Reader for GNU Emacs X;; Copyright (C) 1987, 1988, 1989 Fujitsu Laboratories LTD. X;; Copyright (C) 1987, 1988, 1989 Masanobu UMEDA X;; $Header: gnus.el,v 3.11 89/02/23 15:38:09 umerin Exp $ X X;; This file is part of GNU Emacs. X X;; GNU Emacs is distributed in the hope that it will be useful, X;; but WITHOUT ANY WARRANTY. No author or distributor X;; accepts responsibility to anyone for the consequences of using it X;; or for whether it serves any particular purpose or works at all, X;; unless he says so in writing. Refer to the GNU Emacs General Public X;; License for full details. X X;; Everyone is granted permission to copy, modify and redistribute X;; GNU Emacs, but only under the conditions described in the X;; GNU Emacs General Public License. A copy of this license is X;; supposed to have been given to you along with GNU Emacs so you X;; can know your rights and responsibilities. It should be in a X;; file named COPYING. Among other things, the copyright notice X;; and this notice must be preserved on all copies. X X;; How to Install GNUS: X;; (0) First of all, remove GNUS related OLD *.elc files (at least nntp.elc). X;; (1) Unshar gnus.el, nntp.el, and nnspool.el. X;; (2) byte-compile-file nntp.el, nnspool.el, and gnus.el. X;; (3) Define three environment variables in .login file as follows: X;; X;; setenv NNTPSERVER flab X;; setenv DOMAINNAME "stars.flab.Fujitsu.JUNET" X;; setenv ORGANIZATION "Fujitsu Laboratories Ltd., Kawasaki, Japan." X;; X;; Or instead, define lisp variables in your .emacs, site-init.el, X;; or default.el as follows: X;; X;; (setq gnus-nntp-server "flab") X;; (setq gnus-your-domain "stars.flab.Fujitsu.JUNET") X;; (setq gnus-your-organization "Fujitsu Laboratories Ltd., ...") X;; X;; If the function (system-name) returns the full internet name, X;; you don't have to define the domain. X;; X;; (4) You may have to define NNTP service name as number 119. X;; X;; (setq gnus-nntp-service 119) X;; X;; Or, if you'd like to use a local news spool directly in stead X;; of NNTP, set the variable to nil as follows: X;; X;; (setq gnus-nntp-service nil) X;; X;; (5) If you'd like to use the GENERICFROM feature like the Bnews, X;; define the variable as follows: X;; X;; (setq gnus-use-generic-from t) X;; X;; (6) Define autoload entries in .emacs file as follows: X;; X;; (autoload 'gnus "gnus" "Read network news." t) X;; (autoload 'gnus-post-news "gnus" "Post a news." t) X;; X;; (7) Read nntp.el if you have problems with NNTP or kanji handling. X;; X;; (8) Install mhspool.el, tcp.el and tcp.c if you think it is necessary. X;; X;; mhspool.el is a package for reading articles or mail in your X;; private directory using GNUS. X;; X;; tcp.el and tcp.c are necessary if and only if your Emacs does X;; not have a function `open-network-stream' which is used for X;; communicating with the NNTP server inside Emacs. tcp.el X;; contains a few patches for very OOOOOOOLD versions of Emacs. X;; X;; (9) Install an Info file generated from texinfo manual gnus.texinfo. X;; X;; If you are not allowed to create the Info file to the standard X;; Info-directory, create it in your private directory and set the X;; variable gnus-Info-directory to the directory. X X;; GNUS Mailing List: X;; There are two mailing lists for GNUS lovers in the world: X;; X;; info-gnus@flab.fujitsu.junet, and X;; info-gnus-english@tut.cis.ohio-state.edu. X;; X;; Both of them are intended to exchange useful information about X;; GNUS, such as bug fixes, useful hooks and extensions. The major X;; difference of the two lists is what the official language is. Both X;; Japanese and English are available in info-gnus, while English is X;; only available in info-gnus-english. There is no need to subscribe X;; to info-gnus if you cannot read Japanese messages, because most of X;; the discussion and important announcements will be sent to X;; info-gnus-english. Moreover, if you are able to read gnu.emacs.gnus X;; newsgroup of USENET, you need not, either. info-gnus-english and X;; gnu.emacs.gnus are linked each other. X;; X;; Please send subscription request to: X;; X;; info-gnus-request%flab.fujitsu.junet@uunet.uu.net, or X;; info-gnus-english-request@cis.ohio-state.edu X X;; TO DO: X;; (1) Incremental update of active info. X;; (2) GNUS own poster and programmable interface to various mailers. X;; (3) Multi-GNUS (Talking to many hosts same time). X;; (4) Asynchronous transmission of large messages. X X(provide 'gnus) X(require 'nntp) X(require 'mail-utils) X X(defvar gnus-nntp-server (getenv "NNTPSERVER") X "*Name of the host running the NNTP server. XIf it is a string such as `:DIRECTORY', the user's private DIRECTORY Xis used as a news spool. XInitialized from the NNTPSERVER environment variable.") X X(defvar gnus-nntp-service "nntp" X "*NNTP service name (\"nntp\" or 119). XGo to a local news spool if its value is nil.") X X(defvar gnus-startup-file "~/.newsrc" X "*Your .newsrc file. Use `.newsrc-SERVER' instead if exists.") X X(defvar gnus-signature-file "~/.signature" X "*Your .signature file. Use `.signature-DISTRIBUTION' instead if exists.") X X(defvar gnus-subject-lines-height 4 X "*The number of subject lines displayed at one time. XIf you'd like to set the height of the Subject Mode window according Xto that of the Emacs window, set the value in gnus-Subject-mode-hook Xas follows: X X(setq gnus-Subject-mode-hook X '(lambda () X (setq gnus-subject-lines-height (/ (window-height) 5))))") X X(defvar gnus-large-newsgroup 50 X "*The number of articles which indicates a large newsgroup. XIf the number of articles in a newsgroup is greater than the value, Xconfirmation is required for selecting the newsgroup.") X X(defvar gnus-author-copy-file (getenv "AUTHORCOPY") X "*File name saving a copy of an article posted in Unix mail format. XInitialized from the AUTHORCOPY environment variable. X XIf the first character of the name is `|', the contents of the article Xis piped out to the named program. It is possible to save an article Xin an MH folder as follows: X X(setq gnus-author-copy-file \"|/usr/local/lib/mh/rcvstore +Article\")") X X(defvar gnus-use-long-file-name t X "*Non-nil means that a newsgroup name is used as a default file name Xto save articles to. If it's nil, the directory form of a newsgroup is Xused instead.") X X(defvar gnus-article-save-name (function gnus-article-save-name) X "*A function generating a file name to save articles to. XThe function is called with 2 arguments: NEWSGROUP and HEADERS. XAccess macros to the headers are defined as nntp-header-FIELD, and Xfunctions are defined as gnus-header-FIELD.") X X(defvar gnus-article-default-saver (function gnus-Subject-save-in-rmail) X "*A function to save articles in your favorite format. XThe function must be interactively callable (in other words, it must Xbe an Emacs command). X XGNUS provides the following functions: X gnus-Subject-save-in-rmail (in Rmail format) X gnus-Subject-save-in-mail (in Unix mail format) X gnus-Subject-save-in-folder (in an MH folder) X gnus-Subject-save-in-file (in a plain file).") X X(defvar gnus-article-save-directory (getenv "SAVEDIR") X "*A directory name to save articles to (default to ~/News). XInitialized from the SAVEDIR environment variable.") X X(defvar gnus-article-mh-folder "+News" X "*An MH folder to save articles to by \\[gnus-Subject-save-in-folder]. XIt is possible to change the default folder according to newsgroups as Xfollows: X X(setq gnus-article-default-saver X '(lambda () X (interactive) X (let ((gnus-article-mh-folder (concat \"+\" gnus-newsgroup-name))) X (call-interactively 'gnus-Subject-save-in-folder))))") X X(defvar gnus-kill-file-name "KILL" X "*File name of a KILL file.") X X(defvar gnus-default-distribution "local" X "*Use this value as distribution if no distribution is specified.") X X(defvar gnus-novice-user t X "*You will be asked for newsgroup, subject, and distribution when Xposting an article if it is non-nil.") X X(defvar gnus-user-login-name X (or (getenv "USER") (getenv "LOGNAME") (user-login-name)) X "*The login name of the user. XInitialized from the USER and LOGNAME environment variable if defined.") X X(defvar gnus-user-full-name (or (getenv "NAME") (user-full-name)) X "*The full name of the user. XInitialized from the NAME environment variable if defined.") X X(defvar gnus-ignored-headers X "^Path:\\|^Posting-Version:\\|^Article-I.D.:\\|^Expires:\\|^Date-Received:\\|^References:\\|^Control:\\|^Xref:\\|^Lines:\\|^Posted:\\|^Relay-Version:\\|^Message-ID:\\|^Nf-ID:\\|^Nf-From:\\|^Approved:\\|^Sender:" X "*All random fields within the header of a message.") X X(defvar gnus-show-all-headers nil X "*Show all headers of an article if non-nil.") X X(defvar gnus-save-all-headers nil X "*Save all headers of an article if non-nil.") X X(defvar gnus-auto-select-first t X "*Select the first unread article automagically if non-nil. XIf you want to prevent automatic selection of the first unread article Xin some newsgroups, set the variable to nil in gnus-Select-group-hook Xor gnus-Apply-kill-hook.") X X(defvar gnus-auto-select-next t X "*Select the next newsgroup automagically if non-nil. XIf the value is t and the next newsgroup is empty, GNUS will exit XSubject mode and go back to Group mode. If the value is neither nil Xnor t, GNUS will select the following unread newsgroup. Especially, if Xthe value is the symbol `quietly', the next unread newsgroup will be Xselected without any confirmations.") X X(defvar gnus-auto-select-same nil X "*Select the next article with the same subject automagically if non-nil.") X X(defvar gnus-break-pages t X "*Break an article into pages if non-nil. XPage delimiter is specified by variable `gnus-page-delimiter'. A Xmessage shown at the end of pages is specified by the variable X`gnus-more-message'.") X X(defvar gnus-page-delimiter "^\^L" X "*Regexp describing line-beginnings that separate pages of news article.") X X(defvar gnus-more-message "*** More ***" X "*The message shown at the end of pages in page break mode.") X X(defvar gnus-digest-show-summary t X "*Show a summary of undigestified messages if non-nil.") X X(defvar gnus-optional-headers (function gnus-optional-lines-and-from) X "*A function generating a optional string displayed in GNUS Subject Xmode buffer. The function is called with an article HEADER. The Xresult must be a string excluding `[' and `]'.") X X(defvar gnus-keep-subject-centered t X "*Always center the current subject in GNUS Subject mode window if non-nil.") X X(defvar gnus-Group-mode-hook nil X "*A hook for GNUS Group mode.") X X(defvar gnus-Subject-mode-hook nil X "*A hook for GNUS Subject mode.") X X(defvar gnus-Article-mode-hook nil X "*A hook for GNUS Article mode.") X X(defvar gnus-Kill-file-mode-hook nil X "*A hook for GNUS Kill file mode.") X X(defvar gnus-Startup-hook nil X "*A hook called at start up time. XThis hook is called after GNUS is connected to the NNTP server. So, it Xis possible to change the behavior of GNUS according to the selected XNNTP server.") X X(defvar gnus-Group-prepare-hook X (function X (lambda () X ;; Search for the first unread newsgroup. X (goto-char (point-min)) X (re-search-forward "^[ \t]+[1-9][0-9]*:" nil t))) X "*A hook called after newsgroup list is created in the Newsgroup buffer. XThis hook is used for moving the point to the first unread newsgroup Xby default. If you want to modify the Newsgroup buffer, you can use Xthis hook.") X X(defvar gnus-Subject-prepare-hook nil X "*A hook called after subject list is created in the Subject buffer. XIf you want to modify the Subject buffer, you can use this hook.") X X(defvar gnus-Article-prepare-hook nil X "*A hook called after an article is prepared in the Article buffer. XIf you want to run a special decoding program like nkf, use this hook.") X X(defvar gnus-Select-group-hook nil X "*A hook called when a newsgroup is selected. XIf you want to sort Subject buffer by date and then by subject, you Xcan use the following hook: X X(setq gnus-Select-group-hook X '(lambda () X ;; First of all, sort by date. X (gnus-sort-headers X '(lambda (a b) X (gnus-date-lessp (gnus-header-date a) X (gnus-header-date b)))) X ;; Then sort by subject string ignoring `Re:'. X ;; If case-fold-search is non-nil, case of letters is ignored. X (gnus-sort-headers X '(lambda (a b) X (gnus-string-lessp X (gnus-simplify-subject (gnus-header-subject a) 're) X (gnus-simplify-subject (gnus-header-subject b) 're) X ))))) X XIf you'd like to simplify subjects like the X`gnus-Subject-next-same-subject' command does, you can use the Xfollowing hook: X X(setq gnus-Select-group-hook X '(lambda () X (mapcar (function X (lambda (header) X (nntp-set-header-subject X header X (gnus-simplify-subject X (gnus-header-subject header) 're-only)))) X gnus-newsgroup-headers))) X XIn some newsgroups author name is meaningless. It is possible to Xprevent listing author names in GNUS Subject buffer as follows: X X(setq gnus-Select-group-hook X '(lambda () X (cond ((string-equal \"comp.sources.unix\" gnus-newsgroup-name) X (setq gnus-optional-headers X (function gnus-optional-lines))) X (t X (setq gnus-optional-headers X (function gnus-optional-lines-and-from))))))") X X(defvar gnus-Select-article-hook nil X "*A hook called when an article is selected. XIf you'd like to run RMAIL on a digest article automagically, you can Xuse the following hook: X X(setq gnus-Select-article-hook X '(lambda () X (cond ((string-equal \"comp.sys.sun\" gnus-newsgroup-name) X (gnus-Subject-rmail-digest)) X ((and (string-equal \"comp.text\" gnus-newsgroup-name) X (string-match \"^TeXhax Digest\" X (gnus-header-subject gnus-current-headers))) X (gnus-Subject-rmail-digest) X ))))") X X(defvar gnus-Select-digest-hook X (function X (lambda () X ;; Reply-To: is required by `undigestify-rmail-message'. X (or (mail-position-on-field "Reply-to" t) X (progn X (mail-position-on-field "Reply-to") X (insert (gnus-fetch-field "From")))))) X "*A hook called when reading digest messages using Rmail. XThis hook can be used to modify incomplete digest articles as follows X(this is the default): X X(setq gnus-Select-digest-hook X '(lambda () X ;; Reply-To: is required by `undigestify-rmail-message'. X (or (mail-position-on-field \"Reply-to\" t) X (progn X (mail-position-on-field \"Reply-to\") X (insert (gnus-fetch-field \"From\"))))))") X X(defvar gnus-Rmail-digest-hook nil X "*A hook called when reading digest messages using Rmail. XThis hook is intended to customize Rmail mode for reading digest articles.") X X(defvar gnus-Apply-kill-hook (function gnus-Kill-file-apply) X "*A hook called when a newsgroup is selected and subject list is prepared. XThis hook is intended to apply a KILL file to the selected newsgroup. XThe function `gnus-Kill-file-apply' is called defaultly. X XSince a general KILL file is too heavy to use only for a few Xnewsgroups, I recommend you to use a lighter hook function. For Xexample, if you'd like to apply a KILL file to articles which contains Xa string `rmgroup' in subject in newsgroup `control', you can use the Xfollowing hook: X X(setq gnus-Apply-kill-hook X '(lambda () X (cond ((string-match \"control\" gnus-newsgroup-name) X (gnus-kill \"Subject\" \"rmgroup\" \"d\")))))") X X(defvar gnus-Mark-article-hook X (function X (lambda () X (or (memq gnus-current-article gnus-newsgroup-marked) X (gnus-Subject-mark-as-read gnus-current-article)) X (gnus-Subject-set-current-mark "+"))) X "*A hook called when an article is selected at the first time. XThe hook is intended to mark an article as read (or unread) Xautomatically when it is selected. X XIf you'd like to mark as unread (-) instead, use the following hook: X X(setq gnus-Mark-article-hook X '(lambda () X (gnus-Subject-mark-as-unread gnus-current-article) X (gnus-Subject-set-current-mark "+")))") X X(defvar gnus-Inews-article-hook nil X "*A hook called before posting an article. XIf you'd like to run a special encoding program, use this hook.") X X(defvar gnus-Exit-group-hook nil X "*A hook called when exiting (not quitting) Subject mode. XIf your machine is so slow that exiting from Subject mode takes very Xlong time, set the variable gnus-newsgroup-headers to nil. This Xinhibits marking articles as read using cross-reference information.") X X(defvar gnus-Exit-gnus-hook nil X "*A hook called when exiting or suspending GNUS.") X X(defvar gnus-Save-newsrc-hook nil X "*A hook for saving the newsrc file. XThis hook is called before writing to .newsrc file.") X X;; Site dependent variables. You have to define these variables in X;; site-init.el, default.el or your .emacs. X X(defvar gnus-your-domain nil X "*Your domain name without your host name like: \"stars.flab.Fujitsu.JUNET\" XThe `DOMAINNAME' environment variable is used instead if defined. If Xthe function (system-name) returns the full internet name, there is no Xneed to define the name.") X X(defvar gnus-your-organization nil X "*Your organization like: \"Fujitsu Laboratories Ltd., Kawasaki, Japan.\" XThe `ORGANIZATION' environment variable is used instead if defined.") X X(defvar gnus-use-generic-from nil X "*If nil, prepend local host name to the defined domain in the From: Xfield; if stringp, use this; if non-nil, strip of the local host name.") X X(defvar gnus-use-generic-path nil X "*If nil, use the NNTP server name in the Path: field; if stringp, Xuse this; if non-nil, use no host name (user name only)") X X(defvar gnus-Info-directory Info-directory X "*A directory creating an Info file of GNUS.") X X;; Internal variables. X X(defconst gnus-version "GNUS 3.11" X "Version numbers of this version of GNUS.") X X(defvar gnus-Info-nodes X '((gnus-Group-mode . "(gnus)Newsgroup Commands") X (gnus-Subject-mode . "(gnus)Subject Commands") X (gnus-Article-mode . "(gnus)Article Commands") X (gnus-Kill-file-mode . "(gnus)KILL File")) X "Assoc list of major modes and related Info nodes.") ;Not user variable. X X;; Names of the following five variables should not be changed since X;; they are contained in quickly loadable .newsrc file. X X(defvar gnus-newsrc-options nil X "Options line in the .newsrc file.") X X(defvar gnus-newsrc-options-n-yes nil X "Regexp representing subscribed newsgroups.") X X(defvar gnus-newsrc-options-n-no nil X "Regexp representing unsubscribed newsgroups.") X X(defvar gnus-newsrc-assoc nil X "Assoc list of read articles.") X X(defvar gnus-marked-assoc nil X "Assoc list of articles marked as unread.") X X(defvar gnus-unread-hashtb nil X "Hashtable of unread articles.") X X(defvar gnus-active-hashtb nil X "Hashtable of active articles.") X X(defvar gnus-octive-hashtb nil X "Hashtable of OLD active articles.") X X(defvar gnus-current-startup-file nil X "Startup file for the current host.") X X(defvar gnus-Group-buffer "*Newsgroup*") X(defvar gnus-Subject-buffer "*Subject*") X(defvar gnus-Article-buffer "*Article*") X(defvar gnus-Digest-buffer "GNUS Digest") X(defvar gnus-Digest-summary-buffer "GNUS Digest-summary") X X(defvar gnus-last-search nil X "Default regexp for article search command.") X X(defvar gnus-last-command nil X "Default shell command on article.") X X(defvar gnus-newsgroup-name nil) X(defvar gnus-newsgroup-begin nil) X(defvar gnus-newsgroup-end nil) X(defvar gnus-newsgroup-last-file nil) X(defvar gnus-have-all-newsgroups nil) X X(defvar gnus-newsgroup-unreads nil X "List of unread articles in the current newsgroup.") X X(defvar gnus-newsgroup-unselected nil X "List of unselected unread articles in the current newsgroup.") X X(defvar gnus-newsgroup-marked nil X "List of marked articles in the current newsgroup (a subset of unread art).") X X(defvar gnus-newsgroup-headers nil X "List of article headers in the current newsgroup.") X X(defvar gnus-current-article nil) X(defvar gnus-current-headers nil) X(defvar gnus-current-history nil) X(defvar gnus-have-all-headers nil) X(defvar gnus-last-article nil) X X(defvar gnus-Group-mode-map nil) X(defvar gnus-Subject-mode-map nil) X(defvar gnus-Article-mode-map nil) X(defvar gnus-Kill-file-mode-map nil) X X(defvar rmail-last-file (expand-file-name "~/XMBOX")) X(defvar rmail-last-rmail-file (expand-file-name "~/XNEWS")) X X(autoload 'rmail-output "rmailout" X "Append this message to Unix mail file named FILE-NAME." t) X(autoload 'news-mail-reply "rnewspost") X(autoload 'news-mail-other-window "rnewspost") X(autoload 'news-reply-mode "rnewspost") X(autoload 'mail-position-on-field "sendmail") X(autoload 'mh-find-path "mh-e") X(autoload 'mh-prompt-for-folder "mh-e") X X(put 'gnus-Group-mode 'mode-class 'special) X(put 'gnus-Subject-mode 'mode-class 'special) X(put 'gnus-Article-mode 'mode-class 'special) X X X;;(put 'eval-in-buffer-window 'lisp-indent-hook 1) X X(defmacro eval-in-buffer-window (buffer &rest forms) X "Pop to BUFFER, evaluate FORMS, and then returns to original window." X (` (let ((StartBufferWindow (selected-window))) X (unwind-protect X (progn X (pop-to-buffer (, buffer)) X (,@ forms)) X (select-window StartBufferWindow))))) X X(defmacro gnus-make-hashtable () X '(make-abbrev-table)) X X(defmacro gnus-gethash (string hashtable) X "Get hash value of STRING in HASHTABLE." X ;;(` (symbol-value (abbrev-symbol (, string) (, hashtable)))) X (` (abbrev-expansion (, string) (, hashtable)))) X X(defmacro gnus-sethash (string value hashtable) X "Set hash value. Arguments are STRING, VALUE, and HASHTABLE." X ;; We cannot use define-abbrev since it only accepts string as value. X (` (set (intern (, string) (, hashtable)) (, value)))) X X;; Note: Macros defined here are also defined in nntp.el. I don't like X;; to put them here, but many users got troubled with the old X;; definitions in nntp.elc. These codes are NNTP 3.7 version. X X(defmacro nntp-header-number (header) X "Return article number in HEADER." X (` (aref (, header) 0))) X X(defmacro nntp-set-header-number (header number) X "Set article number of HEADER to NUMBER." X (` (aset (, header) 0 (, number)))) X X(defmacro nntp-header-subject (header) X "Return subject string in HEADER." X (` (aref (, header) 1))) X X(defmacro nntp-set-header-subject (header subject) X "Set article subject of HEADER to SUBJECT." X (` (aset (, header) 1 (, subject)))) X X(defmacro nntp-header-from (header) X "Return author string in HEADER." X (` (aref (, header) 2))) X X(defmacro nntp-set-header-from (header from) X "Set article author of HEADER to FROM." X (` (aset (, header) 2 (, from)))) X X(defmacro nntp-header-xref (header) X "Return xref string in HEADER." X (` (aref (, header) 3))) X X(defmacro nntp-set-header-xref (header xref) X "Set article xref of HEADER to xref." X (` (aset (, header) 3 (, xref)))) X X(defmacro nntp-header-lines (header) X "Return lines in HEADER." X (` (aref (, header) 4))) X X(defmacro nntp-set-header-lines (header lines) X "Set article lines of HEADER to LINES." X (` (aset (, header) 4 (, lines)))) X X(defmacro nntp-header-date (header) X "Return date in HEADER." X (` (aref (, header) 5))) X X(defmacro nntp-set-header-date (header date) X "Set article date of HEADER to DATE." X (` (aset (, header) 5 (, date)))) X X(defmacro nntp-header-id (header) X "Return date in HEADER." X (` (aref (, header) 6))) X X(defmacro nntp-set-header-id (header id) X "Set article ID of HEADER to ID." X (` (aset (, header) 6 (, id)))) X X X;;; X;;; GNUS Group mode X;;; X X(if gnus-Group-mode-map X nil X (setq gnus-Group-mode-map (make-keymap)) X (suppress-keymap gnus-Group-mode-map) X (define-key gnus-Group-mode-map " " 'gnus-Group-read-group) X (define-key gnus-Group-mode-map "=" 'gnus-Group-select-group) X (define-key gnus-Group-mode-map "j" 'gnus-Group-jump-to-group) X (define-key gnus-Group-mode-map "n" 'gnus-Group-next-unread-group) X (define-key gnus-Group-mode-map "p" 'gnus-Group-prev-unread-group) X (define-key gnus-Group-mode-map "\177" 'gnus-Group-prev-unread-group) X (define-key gnus-Group-mode-map "N" 'gnus-Group-next-group) X (define-key gnus-Group-mode-map "P" 'gnus-Group-prev-group) X (define-key gnus-Group-mode-map "\C-n" 'gnus-Group-next-group) X (define-key gnus-Group-mode-map "\C-p" 'gnus-Group-prev-group) X (define-key gnus-Group-mode-map "/" 'isearch-forward) X (define-key gnus-Group-mode-map "<" 'beginning-of-buffer) X (define-key gnus-Group-mode-map ">" 'end-of-buffer) X (define-key gnus-Group-mode-map "u" 'gnus-Group-unsubscribe-current-group) X (define-key gnus-Group-mode-map "U" 'gnus-Group-unsubscribe-group) X (define-key gnus-Group-mode-map "c" 'gnus-Group-catch-up) X (define-key gnus-Group-mode-map "l" 'gnus-Group-list-groups) X (define-key gnus-Group-mode-map "L" 'gnus-Group-list-all-groups) X (define-key gnus-Group-mode-map "g" 'gnus-Group-get-new-news) X (define-key gnus-Group-mode-map "R" 'gnus-Group-restart) X (define-key gnus-Group-mode-map "b" 'gnus-Group-check-bogus-groups) X (define-key gnus-Group-mode-map "r" 'gnus-Group-restrict-groups) X (define-key gnus-Group-mode-map "a" 'gnus-Group-post-news) X (define-key gnus-Group-mode-map "\eK" 'gnus-Group-edit-global-kill) X (define-key gnus-Group-mode-map "\ek" 'gnus-Group-edit-local-kill) X (define-key gnus-Group-mode-map "V" 'gnus-version) X (define-key gnus-Group-mode-map "x" 'gnus-Group-force-update) X (define-key gnus-Group-mode-map "s" 'gnus-Group-force-update) X (define-key gnus-Group-mode-map "z" 'gnus-Group-suspend) X (define-key gnus-Group-mode-map "q" 'gnus-Group-exit) X (define-key gnus-Group-mode-map "Q" 'gnus-Group-quit) X (define-key gnus-Group-mode-map "?" 'gnus-Group-describe-briefly) X (define-key gnus-Group-mode-map "\C-c\C-i" 'gnus-Info-find-node)) X X(defun gnus-Group-mode () X "Major mode for reading network news. SHAR_EOF echo "End of part 1, continue with part 2" echo "2" > s2_seq_.tmp exit 0