From: tomo Date: Sun, 17 May 1998 14:27:17 +0000 (+0000) Subject: This commit was manufactured by cvs2svn to create tag 'gnus-6_2_5'. X-Git-Tag: gnus-6_2_5 X-Git-Url: http://git.chise.org/gitweb/?a=commitdiff_plain;h=8812ba473751767cecd1f80724b4e48c5ea46e20;hp=dc9b03604a47bf5d66e2a5819ad562927c251acc;p=elisp%2Fgnus.git- This commit was manufactured by cvs2svn to create tag 'gnus-6_2_5'. --- diff --git a/ChangeLog b/ChangeLog index db57397..846da41 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,440 @@ +1998-05-04 MORIOKA Tomohiko + + * lisp/lpath.el: Must add "flim" instead of "mel" to load-path. + +1998-05-03 MORIOKA Tomohiko + + * lisp/gnus.el (gnus-version-number): Update to 6.2.5. + + * texi/gnus.texi, lisp/ChangeLog: Sync up with Gnus v5.6.9. + + * lisp/gnus.el, lisp/message.el, lisp/gnus-sum.el, + lisp/gnus-msg.el, lisp/gnus-draft.el, lisp/gnus-agent.el: Sync up + with Gnus v5.6.9. + +1998-04-30 MORIOKA Tomohiko + + * lisp/gnus.el (gnus-version-number): Update to 6.2.4. + + * texi/gnus.texi, lisp/ChangeLog: Sync up with Gnus 5.6.7. + + * lisp/gnus.el, lisp/message.el, lisp/gnus-sum.el, + lisp/gnus-msg.el, lisp/gnus-cache.el, lisp/gnus-art.el: Sync up + with Gnus 5.6.7. + +1998-04-28 Shuhei KOBAYASHI + + * lisp/gnus.el (gnus-version-number): Update to 6.2.3. + + * Sync up with Gnus 5.6.6. + +1998-04-27 MORIOKA Tomohiko + + * lisp/nnheader.el: Sync up with Gnus 5.6.5. + +1998-04-26 Shuhei KOBAYASHI + + * lisp/gnus.el (gnus-version-number): Update to 6.2.2. + + * Sync up with Gnus 5.6.5. + + * texi/custom.texi, texi/widget.texi: Removed from Semi-gnus. + +1998-04-25 MORIOKA Tomohiko + + * README.semi (How to get? (via CVS)): Modify descriptions about + TAG. + +1998-04-23 MORIOKA Tomohiko + + * lisp/gnus.el (gnus-version-number): Update to 6.2.1. + +1998-04-23 MORIOKA Tomohiko + + * lisp/message.el (message-make-forward-subject): Use + `eword-decode-unstructured-field-body' for subject. + + * lisp/gnus-msg.el (gnus-summary-mail-forward): Make local + variable `default-mime-charset' of `gnus-original-article-buffer' + and set up by `default-mime-charset' of `gnus-summary-buffer'. + +1998-04-23 MORIOKA Tomohiko + + * texi/gnus-ja.texi: Fix typos. + + * texi/gnus.texi: Modify for Semi-gnus. + +1998-04-23 Yoshiki Hayashi + + * texi/gnus-ja.texi: Add "Auto Save". + +1998-04-22 Yoshiki Hayashi + + * texi/gnus-ja.texi: Add "Startup Files". + +1998-04-21 MORIOKA Tomohiko + + * lisp/gnus.el (gnus-version-number): Update to 6.2.0. + (gnus-version): Modify for SEMI 1.3. + + * lisp/gnus-sum.el: Use 'ctree-set-calist-strictly instead of + 'set-atype to set up for 'mime-acting-condition. + +1998-04-21 Yoshiki Hayashi + + * texi/gnus-ja.texi: Add "Changing Servers". + +1998-04-20 MORIOKA Tomohiko + + * texi/gnus-ja.texi: Modify styles. + + * texi/gnus.texi: Modify for Semi-gnus (sync up with + gnus-ja.texi). + +1998-04-20 Yoshiki Hayashi + + * texi/gnus-ja.texi: Add "New Groups". + +1998-04-20 Yoshiki Hayashi + + * texi/gnus-ja.texi: Modify styles. + +1998-04-18 MORIOKA Tomohiko + + * texi/gnus-ja.texi: Check and modify for Semi-gnus. + +1998-04-18 Yoshiki Hayashi + + * texi/gnus-ja.texi: New file. + +1998-04-19 MORIOKA Tomohiko + + * lisp/gnus.el (gnus-version-number): Update to 6.1.3. + +1998-04-19 MORIOKA Tomohiko + + * lisp/gnus-art.el (gnus-following-method): New function; set up + for 'mime-view-following-method-alist. + +1998-04-18 MORIOKA Tomohiko + + * texi/gnus.texi: Add and modify description for Semi-gnus. + +1998-04-16 MORIOKA Tomohiko + + * texi/gnus.texi: "Gnus 5.6.4" -> "Semi-gnus 6.1.2". + (Top): "Gnus" -> "gnus". + (Starting Up): "Gnus" -> "gnus". + +1998-04-10 Shuhei KOBAYASHI + + * lisp/ChangeLog, lisp/gnus-agent.el: Sync up with Gnus 5.6.4. + +1998-04-08 MORIOKA Tomohiko + + * lisp/gnus.el (gnus-version-number): Update to 6.1.2. + (gnus-version): Include corresponding SEMI version. + + * lisp/gnus.el, lisp/nnkiboze.el, lisp/message.el, + lisp/gnus-sum.el, lisp/gnus-agent.el: Sync up with Gnus 5.6.4. + +1998-03-27 Shuhei KOBAYASHI + + * README.semi: Change descriptions of sending bug report. + +1998-03-20 Shuhei KOBAYASHI + + * lisp/gnus.el (gnus-version-number): Update to 6.1.1. + (gnus-version): Include corresponding SEMI version. + + * Sync up with Gnus 5.6.3. + +1998-03-15 Shuhei KOBAYASHI + + * lisp/gnus-agent.el (gnus-agent-crosspost): Use + `nnheader-insert-file-contents'. + (gnus-agent-braid-nov): Ditto. + (gnus-agent-expire): Ditto. + + * lisp/gnus-cache.el (gnus-cache-request-article): Ditto. + (gnus-cache-retrieve-headers): Ditto. + (gnus-cache-change-buffer): Ditto. + (gnus-cache-braid-nov): Ditto. + + * lisp/gnus-sum.el (gnus-summary-import-article): Ditto. + + * lisp/nnkiboze.el (nnkiboze-retrieve-headers): Ditto. + + * lisp/message.el (message-generate-headers): Fix regexp. + (cf. [semi-gnus-ja:107]) + +1998-03-14 MORIOKA Tomohiko + + * lisp/gnus-art.el: Add setting for + `mime-raw-buffer-coding-system-alist'. + +1998-03-13 MORIOKA Tomohiko + + * lisp/gnus-art.el: Rename `mime-view-quitting-method-for-gnus' -> + `mime-preview-quitting-method-for-gnus'. + + * lisp/gnus-art.el: Rename `mime-view-quitting-method-alist' -> + `mime-preview-quitting-method-alist'. + + * lisp/gnus-art.el: Rename `mime-view-kill-buffer' -> + `mime-preview-kill-buffer'. + + * lisp/gnus.el (gnus-version-number): Update to 6.0.10. + + * lisp/gnus-sum.el: Add code to check latest SEMI. + (mime-acting-condition): Separate type and subtype; rename + `mime-combine-message/partials-automatically' -> + `mime-method-to-combine-message/partial-pieces'. + +1998-03-08 Shuhei KOBAYASHI + + * lisp/gnus.el (gnus-version-number): Update to 6.0.9. + + * README.semi (How to get?): Add description of daily snapshot. + (How to join development): Change mailing list command address. + + * Sync up with Gnus 5.6.2. + +1998-03-01 Tatsuya Ichikawa + + * lisp/gnus-ems.el: Change variable name + gnus-bdf-image-file to gnus-mule-bitmap-image-file. + +1998-02-28 MORIOKA Tomohiko + + * lisp/gnus.el (gnus-version-number): Update to 6.0.8. + + * lisp/gnus.el: Sync up with qgnus-0.34. + +1998-02-28 MORIOKA Tomohiko + + * lisp/message.el: Sync up with qgnus-0.33. + + * lisp/gnus-ems.el (gnus-bdf-image-file): New variable; moved from + gnus.el. + (gnus-mule-group-startup-message): New function; moved and renamed + from `gnus-group-startup-message' of gnus.el. + + * lisp/gnus.el, lisp/gnus-sum.el, lisp/gnus-art.el, + lisp/gnus-agent.el: Sync up with qgnus-0.33. + +1998-02-28 Tatsuya Ichikawa + + * lisp/gnus.el (gnus-bdf-image-file): New variable. + (gnus-mule-group-startup-message): Display bitmap image using + bitmap.el running with Emacs 20. + + * lisp/gnus-agent.el (gnus-agent-fetch-headers): Fix problem when + Xref field is not exist. + +1998-02-26 MORIOKA Tomohiko + + * README.semi (How to join development): Modify for Semi-gnus + mailing list. + + * lisp/gnus.el (gnus-version-number): Update to 6.0.7. + + * lisp/gnus.el (gnus-article-display-hook): Delete + `gnus-article-de-quoted-unreadable' from options. + + * lisp/gnus-sum.el (gnus-article-make-menu-bar): Delete key for + `gnus-article-de-quoted-unreadable'. + (gnus-summary-make-menu-bar): Delete menu for + `gnus-article-de-quoted-unreadable'. + + * lisp/gnus-art.el (gnus-article-make-menu-bar): Delete menu for + `gnus-article-de-quoted-unreadable'. + +1998-02-24 MORIOKA Tomohiko + + * lisp/gnus.el, lisp/message.el: Sync up with qgnus-0.32. + +1998-02-23 MORIOKA Tomohiko + + * lisp/gnus.el (gnus-version-number): Update to 6.0.6. + + * lisp/message.el (message-fill-references): Abolish unused local + variables. + + * lisp/pop3.el, lisp/message.el, lisp/gnus.el, lisp/gnus-sum.el, + lisp/gnus-art.el: Sync up with qgnus-0.31. + + * lisp/gnus.el, lisp/message.el, lisp/gnus-sum.el, + lisp/gnus-art.el: Sync up with qgnus-0.30. + +1998-02-20 Christophe Broult + + * README.semi (How to get?): The command `update' must come before + `-r semi-gnus'. (cf. [tm-en:1559]) + +1998-02-17 MORIOKA Tomohiko + + * lisp/gnus.el: Sync up with qgnus-0.29. + + * lisp/gnus.el, lisp/message.el: Sync up with qgnus-0.28. + + * lisp/message.el: Abolish variable + `message-references-generator'. Abolish function + `message-generate-filled-references', + `message-generate-folded-references' and + `message-generate-unfolded-references'. + (message-reply): Don't use `message-references-generator'. + (message-followup): Don't use `message-references-generator'. + + (message-fill-references): New function. + (message-header-format-alist): Use `message-fill-references' for + References. + +1998-02-17 MORIOKA Tomohiko + + * lisp/gnus.el (gnus-version-number): Update to 6.0.5. + +1998-02-17 MORIOKA Tomohiko + + * lisp/gnus-sum.el: Check SEMI-0.118.2 (Otomaru) or later. + (gnus-structured-field-decoder): Use + `eword-decode-and-unfold-structured-field'. + + * lisp/gnus-art.el (gnus-article-decode-rfc1522): Use charset + conversion option of `eword-decode-header'. + (gnus-article-decode-encoded-word): Use charset conversion option + of `eword-decode-header'; use `gnus-run-hooks'. + (gnus-content-header-filter): Use charset conversion option of + `eword-decode-header'. + + * README.semi (How to get?): Should specify "-r semi-gnus". + +1998-02-16 MORIOKA Tomohiko + + * lisp/gnus-art.el (gnus-article-decode-rfc1522): Decode header by + localized code. + +1998-02-16 MORIOKA Tomohiko + + * lisp/gnus-msg.el: Delete commented-out function + `gnus-inews-insert-mime-headers'. + + * lisp/gnus.el, lisp/message.el, lisp/gnus-sum.el, + lisp/gnus-art.el: Sync up with qgnus-0.27. + +1998-02-16 MORIOKA Tomohiko + + * lisp/nnheader.el: Use original. + + * lisp/gnus.el, lisp/pop3.el, lisp/message.el, lisp/gnus-sum.el, + lisp/gnus-msg.el, lisp/gnus-draft.el, lisp/gnus-art.el: Sync up + with qgnus-0.26. + +1998-02-15 MORIOKA Tomohiko + + * lisp/nnmail.el, lisp/nnmh.el: Use original. + + * lisp/gnus.el, lisp/gnus-draft.el, lisp/gnus-sum.el, + lisp/message.el, lisp/gnus-art.el: Sync up with qgnus-0.25. + +1998-02-11 Shuhei Kobayashi + + * texi/message.texi, texi/gnus.texi, texi/ChangeLog, + lisp/message.el, lisp/gnus.el, lisp/gnus-uu.el, + lisp/gnus-topic.el, lisp/gnus-sum.el, lisp/gnus-start.el, + lisp/gnus-score.el, lisp/gnus-group.el, lisp/gnus-art.el, + lisp/gnus-agent.el, lisp/ChangeLog: Importing qgnus-0.24 + +1998-02-10 MORIOKA Tomohiko + + * lisp/gnus-art.el (gnus-article-prepare): Don't bind coding + systems. + + * lisp/gnus.el (gnus-version-number): Update to 6.0.4. + (gnus-version): Sync with qgnus-0.23. + + * lisp/pop3.el, lisp/nnmh.el, lisp/nnheader.el, lisp/message.el, + lisp/gnus-sum.el, lisp/gnus-msg.el, lisp/gnus-draft.el, + lisp/gnus-art.el: Merge qgnus-0.23. + +1998-02-09 Shuhei Kobayashi + + * texi/message.texi, texi/gnus.texi, texi/ChangeLog, lisp/nntp.el, + lisp/nnheader.el, lisp/message.el, lisp/gnus.el, + lisp/gnus-xmas.el, lisp/gnus-sum.el, lisp/gnus-start.el, + lisp/gnus-msg.el, lisp/gnus-group.el, lisp/gnus-draft.el, + lisp/gnus-art.el, lisp/gnus-agent.el, lisp/ChangeLog: Importing + qgnus-0.23 + +1998-02-04 MORIOKA Tomohiko + + * lisp/message.el (message-references-generator): New variable. + (message-generate-filled-references): New function. + (message-generate-folded-references): New function. + (message-generate-unfolded-references): New function. + (message-reply): Refer `message-references-generator'. + (message-followup): Refer `message-references-generator'. + +1998-01-17 MORIOKA Tomohiko + + * lisp/message.el (message-send-mail-with-sendmail): Guard + `coding-system-for-write' by binary. + (message-send-mail-with-qmail): Likewise. + +1998-01-16 MORIOKA Tomohiko + + * lisp/lpath.el: Require path-util; add load-path of APEL, MEL and + SEMI. + +1998-01-12 MORIOKA Tomohiko + + * lisp/message.el: Require smtp.el when compile. + + * lisp/message.el (message-send-mail-with-smtp): Use + `(current-buffer)' instead of `tembuf'; rename + `smtp-recipient-address-list' -> `recipient-address-list'. + +1998-01-12 MORIOKA Tomohiko + + * lisp/smtp.el (smtp-deduce-address-list): Don't use + `smtp-recipient-address-list' as global variable. + + * lisp/message.el (message-send-mail-with-smtp): Don't use + `smtp-recipient-address-list' as global variable. + + * lisp/smtpmail.el (smtpmail-recipient-address-list): New + variable; renamed from `smtp-recipient-address-list'. + (smtpmail-send-it): Remove `(not (null ...))'. + (smtpmail-send-queued-mail): Likewise. + +1998-01-12 MORIOKA Tomohiko + + * lisp/message.el (message-send-mail-with-smtp): Don't generate + temporary buffer for message; don't generate and kill + `smtp-address-buffer' for `smtp-deduce-address-list'. + + * lisp/smtpmail.el (smtpmail-send-it): Don't generate and kill + `smtp-address-buffer' for `smtp-deduce-address-list'. + + * lisp/smtp.el (smtp-deduce-address-list): Bind and generate + `smtp-address-buffer' in itself. + +1998-01-12 MORIOKA Tomohiko + + * lisp/gnus.el (gnus-version-number): Update to version 6.0.3. + +1998-01-11 MORIOKA Tomohiko + + * lisp/smtp.el: New file. + + * lisp/smtpmail.el: Split basic features into smtp.el. + + * lisp/message.el (message-send-mail-function): Add + `message-send-mail-with-smtp' as an item. + (message-send-mail-with-smtp): New function. + + * ChangeLog: New file. + 1998-01-08 MORIOKA Tomohiko * lisp/smtpmail.el (smtpmail-via-smtp): Bind diff --git a/Makefile b/Makefile deleted file mode 100644 index 05503f4..0000000 --- a/Makefile +++ /dev/null @@ -1,36 +0,0 @@ -EMACS=emacs -XEMACS=xemacs - -all: lick info - -lick: - cd lisp; $(MAKE) EMACS=$(EMACS) all - -# Rule for Lars and nobody else. -some: - cd lisp; $(MAKE) EMACS=$(EMACS) some -l: - cd lisp; $(MAKE) EMACS=$(EMACS) clever - -info: - cd texi; $(MAKE) EMACS=$(EMACS) all - -clean: - rm -f */*.orig */*.rej *.orig *.rej - -xsome: - cd lisp; $(MAKE) EMACS=$(XEMACS) some - -elclean: - rm lisp/*.elc - -x: - make EMACS=xemacs - -distclean: - make clean - rm -r *~ - for i in lisp texi; do (cd $$i; make distclean); done - -osome: - make EMACS=emacs-19.34 some diff --git a/README.semi b/README.semi new file mode 100644 index 0000000..8d1d852 --- /dev/null +++ b/README.semi @@ -0,0 +1,92 @@ +This package contains Semi-gnus. + +What is Semi-gnus? +================== + + Semi-gnus is a replacement of Gnus with gnus-mime for SEMI. It has +all features of Gnus and gnus-mime, so there are no need to install +Gnus to use it, and you must not use gnus-mime for SEMI. + + It requires SEMI package, so please get and install SEMI package +before to install it. + + +How to get? (via CVS) +===================== + +(0) cvs login + + % cvs -d :pserver:anonymous@chamonix.jaist.ac.jp:/hare/cvs/root \ + login + + CVS password: [CR] # NULL string + +(1) checkout + + % cvs -d :pserver:anonymous@chamonix.jaist.ac.jp:/hare/cvs/root \ + checkout [-r TAG] gnus + +(2) compile + + % cd gnus + % make EMACS= + +(3) update + + % cvs update [-r TAG] + +Major tags are following: + + semi-gnus assigned to the latest stable version. It is + very conservative. + + for-semi-N1_N2 assigned to the latest stable version for SEMI + API N1.N2 (N1 and N2 are natural number). + (e.g. `for-semi-1_3' is for SEMI API 1.3) + + gnus-N1_N2_N3 assigned to gnus(Gnus) N1.N2.N3 + (e.g. `gnus-6_2_1' means gnus 6.2.1). + + larsi Original Gnus + + himi himi branch + + ichikawa ichikawa branch + + akr akr branch + + +How to get? (via ftp) +===================== + + Semi-daily snapshots are also available from + + ftp://ftp.jaist.ac.jp/pub/GNU/elisp/semi-gnus/ + + NOTE: These snapshots are automatically created from our repository +if something was changed within a day, and will usually not be tested. + + +How to join development +======================= + + If you have found a bug in Gnus proper, please do `M-x gnus-bug' and +send a bug report to the Gnus maintainers. + + If you have found a bug in Semi-gnus, or if you're not sure whether it +is a Gnus proper, please send a bug report to the Semi-gnus mailing list: + + semi-gnus-en@meadow.scphys.kyoto-u.ac.jp (English) + semi-gnus-ja@meadow.scphys.kyoto-u.ac.jp (Japanese) + +Suggestions for Semi-gnus improvements are also welcome. + + Via the Semi-gnus ML, you can report Semi-gnus related bugs, obtain +the latest release of Semi-gnus, and discuss future enhancements to +Semi-gnus. To join the Semi-gnus ML, send an empty e-mail to + + semi-gnus-en-help@meadow.scphys.kyoto-u.ac.jp (English) + semi-gnus-ja-help@meadow.scphys.kyoto-u.ac.jp (Japanese) + + In addition, we need developers. If you would like to develop it, +please send mail to cvs@chamonix.jaist.ac.jp. diff --git a/lisp/ChangeLog b/lisp/ChangeLog index eef2a1f..b03978a 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,11 @@ +Fri May 1 21:59:35 1998 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.6.9 is released. + +Fri May 1 21:54:30 1998 Lars Magne Ingebrigtsen + + * nnfolder.el (nnfolder-goto-article): Would infloop. + Fri May 1 19:45:50 1998 Lars Magne Ingebrigtsen * gnus.el: Gnus v5.6.8 is released. diff --git a/lisp/Makefile b/lisp/Makefile deleted file mode 100644 index b949400..0000000 --- a/lisp/Makefile +++ /dev/null @@ -1,40 +0,0 @@ -SHELL = /bin/sh -EMACS=emacs -FLAGS=-batch -q -no-site-file -l ./dgnushack.el - -total: - rm -f *.elc ; $(EMACS) $(FLAGS) -f dgnushack-compile - -all: - rm -f *.elc ; $(EMACS) $(FLAGS) -f dgnushack-compile - -clever: - $(EMACS) $(FLAGS) -f dgnushack-compile - -some: - $(EMACS) $(FLAGS) -f dgnushack-compile - -tags: - etags *.el - -separately: - rm -f *.elc ; for i in *.el; do $(EMACS) $(FLAGS) -f batch-byte-compile $$i; done - -pot: - xpot -drgnus -r`cat ./version` *.el > rgnus.pot - -gnus-load.el: - echo ";;; gnus-load.el --- automatically extracted custom dependencies" > gnus-load.el - echo ";;" >> gnus-load.el - echo ";;; Code:" >> gnus-load.el - echo >> gnus-load.el - $(EMACS) $(FLAGS) -l ./dgnushack.el -l cus-edit.el *.el \ - -f custom-make-dependencies >> gnus-load.el - echo >> gnus-load.el - echo "(provide 'gnus-load)" >> gnus-load.el - echo >> gnus-load.el - echo ";;; gnus-load.el ends here" >> gnus-load.el - -distclean: - rm -f *.orig *.rej *.elc *~ - diff --git a/lisp/gnus-agent.el b/lisp/gnus-agent.el index 10668b7..a9a1f4f 100644 --- a/lisp/gnus-agent.el +++ b/lisp/gnus-agent.el @@ -1,4 +1,4 @@ -;;; gnus-agent.el --- unplugged support for Gnus +;;; gnus-agent.el --- unplugged support for Semi-gnus ;; Copyright (C) 1997,98 Free Software Foundation, Inc. ;; Author: Lars Magne Ingebrigtsen @@ -719,7 +719,7 @@ the actual number of articles toggled is returned." (when (= (point-max) (point-min)) (push (cons group (current-buffer)) gnus-agent-buffer-alist) (ignore-errors - (insert-file-contents + (nnheader-insert-file-contents (gnus-agent-article-name ".overview" group)))) (nnheader-find-nov-line (string-to-number (cdar crosses))) (insert (string-to-number (cdar crosses))) @@ -760,6 +760,17 @@ the actual number of articles toggled is returned." (set-buffer nntp-server-buffer) (unless (eq 'nov (gnus-retrieve-headers articles group)) (nnvirtual-convert-headers)) + ;; + ;; To gnus-agent-expire work fine with no Xref field in .overview + ;; Tatsuya Ichikawa + (goto-char (point-min)) + (while (not (eobp)) + (goto-char (point-at-eol)) + (insert "\t") + (forward-line 1)) + ;; Tatsuya Ichikawa + ;; To gnus-agent-expire work fine with no Xref field in .overview + ;; ;; Save these headers for later processing. (copy-to-buffer gnus-agent-overview-buffer (point-min) (point-max)) (let (file) @@ -788,7 +799,7 @@ the actual number of articles toggled is returned." (goto-char (point-min)) (set-buffer nntp-server-buffer) (erase-buffer) - (insert-file-contents file) + (nnheader-insert-file-contents file) (goto-char (point-min)) (if (or (= (point-min) (point-max)) (progn @@ -1299,7 +1310,7 @@ The following commands are available: (set-buffer overview) (erase-buffer) (when (file-exists-p nov-file) - (insert-file-contents nov-file)) + (nnheader-insert-file-contents nov-file)) (goto-char (point-min)) (while (setq elem (pop articles)) (setq article (car elem)) diff --git a/lisp/gnus-art.el b/lisp/gnus-art.el index f88792c..7ff92f7 100644 --- a/lisp/gnus-art.el +++ b/lisp/gnus-art.el @@ -1,8 +1,9 @@ -;;; gnus-art.el --- article mode commands for Gnus +;;; gnus-art.el --- article mode commands for Semi-gnus ;; Copyright (C) 1996,97,98 Free Software Foundation, Inc. ;; Author: Lars Magne Ingebrigtsen -;; Keywords: news +;; MORIOKA Tomohiko +;; Keywords: mail, news, MIME ;; This file is part of GNU Emacs. @@ -33,6 +34,8 @@ (require 'gnus-spec) (require 'gnus-int) (require 'browse-url) +(require 'alist) +(require 'mime-view) (defgroup gnus-article nil "Article display." @@ -365,13 +368,13 @@ be used as possible file names." :group 'gnus-article-mime :type 'boolean) -(defcustom gnus-show-mime-method 'metamail-buffer +(defcustom gnus-show-mime-method 'gnus-article-preview-mime-message "Function to process a MIME message. The function is called from the article buffer." :group 'gnus-article-mime :type 'function) -(defcustom gnus-decode-encoded-word-method 'gnus-article-de-quoted-unreadable +(defcustom gnus-decode-encoded-word-method 'gnus-article-decode-encoded-word "*Function to decode MIME encoded words. The function is called from the article buffer." :group 'gnus-article-mime @@ -924,84 +927,14 @@ characters to translate to." (process-send-region "article-x-face" beg end) (process-send-eof "article-x-face")))))))))) -(defun gnus-hack-decode-rfc1522 () - "Emergency hack function for avoiding problems when decoding." - (let ((buffer-read-only nil)) - (goto-char (point-min)) - ;; Remove encoded TABs. - (while (search-forward "=09" nil t) - (replace-match " " t t)) - ;; Remove encoded newlines. - (goto-char (point-min)) - (while (search-forward "=10" nil t) - (replace-match " " t t)))) - -(defalias 'gnus-decode-rfc1522 'article-decode-rfc1522) -(defalias 'gnus-article-decode-rfc1522 'article-decode-rfc1522) -(defun article-decode-rfc1522 () - "Hack to remove QP encoding from headers." - (let ((case-fold-search t) - (inhibit-point-motion-hooks t) - (buffer-read-only nil) - string) - (save-restriction - (narrow-to-region - (goto-char (point-min)) - (or (search-forward "\n\n" nil t) (point-max))) - (goto-char (point-min)) - (while (re-search-forward - "=\\?iso-8859-1\\?q\\?\\([^?\t\n]*\\)\\?=" nil t) - (setq string (match-string 1)) - (save-restriction - (narrow-to-region (match-beginning 0) (match-end 0)) - (delete-region (point-min) (point-max)) - (insert string) - (article-mime-decode-quoted-printable - (goto-char (point-min)) (point-max)) - (subst-char-in-region (point-min) (point-max) ?_ ? ) - (goto-char (point-max))) - (goto-char (point-min)))))) - -(defun article-de-quoted-unreadable (&optional force) - "Do a naive translation of a quoted-printable-encoded article. -This is in no way, shape or form meant as a replacement for real MIME -processing, but is simply a stop-gap measure until MIME support is -written. -If FORCE, decode the article whether it is marked as quoted-printable -or not." - (interactive (list 'force)) - (save-excursion - (let ((case-fold-search t) - (buffer-read-only nil) - (type (gnus-fetch-field "content-transfer-encoding"))) - (gnus-article-decode-rfc1522) - (when (or force - (and type (string-match "quoted-printable" (downcase type)))) - (goto-char (point-min)) - (search-forward "\n\n" nil 'move) - (article-mime-decode-quoted-printable (point) (point-max)))))) - -(defun article-mime-decode-quoted-printable-buffer () - "Decode Quoted-Printable in the current buffer." - (article-mime-decode-quoted-printable (point-min) (point-max))) - -(defun article-mime-decode-quoted-printable (from to) - "Decode Quoted-Printable in the region between FROM and TO." - (interactive "r") - (goto-char from) - (while (search-forward "=" to t) - (cond ((eq (following-char) ?\n) - (delete-char -1) - (delete-char 1)) - ((looking-at "[0-9A-F][0-9A-F]") - (subst-char-in-region - (1- (point)) (point) ?= - (hexl-hex-string-to-integer - (buffer-substring (point) (+ 2 (point))))) - (delete-char 2)) - ((looking-at "=") - (delete-char 1)) - ((gnus-message 3 "Malformed MIME quoted-printable message"))))) +(defun gnus-article-decode-rfc1522 () + "Decode MIME encoded-words in header fields." + (let (buffer-read-only) + (let ((charset (save-excursion + (set-buffer gnus-summary-buffer) + default-mime-charset))) + (eword-decode-header charset) + ))) (defun article-hide-pgp (&optional arg) "Toggle hiding of any PGP headers and signatures in the current article. @@ -1913,7 +1846,7 @@ If variable `gnus-use-long-file-name' is non-nil, it is ["Hide citation" gnus-article-hide-citation t] ["Treat overstrike" gnus-article-treat-overstrike t] ["Remove carriage return" gnus-article-remove-cr t] - ["Remove quoted-unreadable" gnus-article-de-quoted-unreadable t])) + )) ;; Note "Commands" menu is defined in gnus-sum.el for consistency @@ -2014,6 +1947,41 @@ commands: (forward-line line) (point))))) +;;; @@ article filters +;;; + +(defun gnus-article-preview-mime-message () + (make-local-variable 'mime-button-mother-dispatcher) + (setq mime-button-mother-dispatcher + (function gnus-article-push-button)) + (let ((default-mime-charset + (save-excursion + (set-buffer gnus-summary-buffer) + default-mime-charset)) + ) + (save-excursion + (mime-view-mode nil nil nil gnus-original-article-buffer + gnus-article-buffer + gnus-article-mode-map) + )) + (run-hooks 'gnus-mime-article-prepare-hook) + ) + +(defun gnus-article-decode-encoded-word () + "Header filter for gnus-article-mode. +It is registered to variable `mime-view-content-header-filter-alist'." + (let ((charset (save-excursion + (set-buffer gnus-summary-buffer) + default-mime-charset))) + (eword-decode-header charset) + (goto-char (point-min)) + (if (search-forward "\n\n" nil t) + (decode-mime-charset-region (match-end 0) (point-max) charset)) + (mime-maybe-hide-echo-buffer) + ) + (gnus-run-hooks 'gnus-mime-article-prepare-hook) + ) + (defun gnus-article-prepare (article &optional all-headers header) "Prepare ARTICLE in article mode buffer. ARTICLE should either be an article number or a Message-ID. @@ -2115,9 +2083,7 @@ If ALL-HEADERS is non-nil, no headers are hidden." (when gnus-show-mime (if (or (not gnus-strict-mime) (gnus-fetch-field "Mime-Version")) - (let ((coding-system-for-write 'binary) - (coding-system-for-read 'binary)) - (funcall gnus-show-mime-method)) + (funcall gnus-show-mime-method) (funcall gnus-decode-encoded-word-method))) ;; Perform the article display hooks. (gnus-run-hooks 'gnus-article-display-hook)) @@ -3268,6 +3234,61 @@ forbidden in URL encoding." (gnus-article-prev-page) (select-window win))) + +;;; @ for mime-view +;;; + +(defun gnus-content-header-filter () + "Header filter for mime-view. +It is registered to variable `mime-view-content-header-filter-alist'." + (eword-decode-header default-mime-charset)) + +(defun mime-preview-quitting-method-for-gnus () + (if (not gnus-show-mime) + (mime-preview-kill-buffer)) + (delete-other-windows) + (gnus-article-show-summary) + (if (or (not gnus-show-mime) + (null gnus-have-all-headers)) + (gnus-summary-select-article nil t) + )) + +(set-alist 'mime-raw-buffer-coding-system-alist + 'gnus-original-article-mode + 'raw-text) + +(set-alist 'mime-view-content-header-filter-alist + 'gnus-original-article-mode + #'gnus-content-header-filter) + +(set-alist 'mime-text-decoder-alist + 'gnus-original-article-mode + #'mime-text-decode-buffer) + +(set-alist 'mime-preview-quitting-method-alist + 'gnus-original-article-mode + #'mime-preview-quitting-method-for-gnus) + +(set-alist 'mime-view-show-summary-method + 'gnus-original-article-mode + #'mime-preview-quitting-method-for-gnus) + +(defun gnus-following-method (buf) + (set-buffer buf) + (message-followup) + (message-yank-original) + (kill-buffer buf) + (goto-char (point-min)) + ) + +(set-alist 'mime-view-following-method-alist + 'gnus-original-article-mode + #'gnus-following-method) + + +;;; @ end +;;; + (gnus-ems-redefine) (provide 'gnus-art) diff --git a/lisp/gnus-cache.el b/lisp/gnus-cache.el index af2513b..430a452 100644 --- a/lisp/gnus-cache.el +++ b/lisp/gnus-cache.el @@ -242,7 +242,7 @@ variable to \"^nnml\"." (when (file-exists-p file) (erase-buffer) (gnus-kill-all-overlays) - (insert-file-contents file) + (nnheader-insert-file-contents file) t))) (defun gnus-cache-possibly-alter-active (group active) @@ -288,7 +288,7 @@ variable to \"^nnml\"." ;; unsuccessful), so we use the cached headers exclusively. (set-buffer nntp-server-buffer) (erase-buffer) - (insert-file-contents cache-file) + (nnheader-insert-file-contents cache-file) 'nov) ((eq type 'nov) ;; We have both cached and uncached NOV headers, so we @@ -465,7 +465,7 @@ Returns the list of articles removed." (set-buffer cache-buf) (buffer-disable-undo (current-buffer)) (erase-buffer) - (insert-file-contents (or file (gnus-cache-file-name group ".overview"))) + (nnheader-insert-file-contents (or file (gnus-cache-file-name group ".overview"))) (goto-char (point-min)) (insert "\n") (goto-char (point-min))) @@ -508,7 +508,7 @@ Returns the list of articles removed." (save-excursion (set-buffer cache-buf) (erase-buffer) - (insert-file-contents (gnus-cache-file-name group (car cached))) + (nnheader-insert-file-contents (gnus-cache-file-name group (car cached))) (goto-char (point-min)) (insert "220 ") (princ (car cached) (current-buffer)) @@ -559,7 +559,7 @@ $ emacs -batch -l ~/.emacs -l gnus -f gnus-jog-cache" ;; We simply read the active file. (save-excursion (gnus-set-work-buffer) - (insert-file-contents gnus-cache-active-file) + (nnheader-insert-file-contents gnus-cache-active-file) (gnus-active-to-gnus-format nil (setq gnus-cache-active-hashtb (gnus-make-hashtable diff --git a/lisp/gnus-draft.el b/lisp/gnus-draft.el index 8ecbf1f..7b7c6fb 100644 --- a/lisp/gnus-draft.el +++ b/lisp/gnus-draft.el @@ -1,8 +1,9 @@ -;;; gnus-draft.el --- draft message support for Gnus +;;; gnus-draft.el --- draft message support for Semi-gnus ;; Copyright (C) 1997,98 Free Software Foundation, Inc. -;; Author: Lars Magne Ingebrigtgnus-run-hooks -;; Keywords: news +;; Author: Lars Magne Ingebrigtsen +;; MORIOKA Tomohiko +;; Keywords: mail, news, MIME, offline ;; This file is part of GNU Emacs. @@ -162,6 +163,16 @@ ;;; Utility functions +(defcustom gnus-draft-decoding-function + (function + (lambda () + (mime-edit-decode-buffer nil) + (eword-decode-header) + )) + "*Function called to decode the message from network representation." + :group 'gnus-agent + :type 'function) + ;;;!!!If this is byte-compiled, it fails miserably. ;;;!!!This is because `gnus-setup-message' uses uninterned symbols. ;;;!!!This has been fixed in recent versions of Emacs and XEmacs, @@ -176,6 +187,7 @@ (if (not (gnus-request-restore-buffer article group)) (error "Couldn't restore the article") ;; Insert the separator. + (funcall gnus-draft-decoding-function) (goto-char (point-min)) (search-forward "\n\n") (forward-char -1) diff --git a/lisp/gnus-ems.el b/lisp/gnus-ems.el index d7e8fb8..734723a 100644 --- a/lisp/gnus-ems.el +++ b/lisp/gnus-ems.el @@ -1,7 +1,8 @@ -;;; gnus-ems.el --- functions for making Gnus work under different Emacsen +;;; gnus-ems.el --- functions for making Semi-gnus work under different Emacsen ;; Copyright (C) 1995,96,97,98 Free Software Foundation, Inc. ;; Author: Lars Magne Ingebrigtsen +;; Tatsuya Ichikawa ;; Keywords: news ;; This file is part of GNU Emacs. @@ -78,6 +79,56 @@ (truncate-string valstr (, max-width)) valstr)))) +(defvar gnus-mule-bitmap-image-file nil) +(defun gnus-mule-group-startup-message (&optional x y) + "Insert startup message in current buffer." + ;; Insert the message. + (erase-buffer) + (insert + (if (featurep 'bitmap) + (format " %s + +" + "" (if (and (stringp gnus-mule-bitmap-image-file) + (file-exists-p gnus-mule-bitmap-image-file)) + (insert-file gnus-mule-bitmap-image-file))) + (format " %s + _ ___ _ _ + _ ___ __ ___ __ _ ___ + __ _ ___ __ ___ + _ ___ _ + _ _ __ _ + ___ __ _ + __ _ + _ _ _ + _ _ _ + _ _ _ + __ ___ + _ _ _ _ + _ _ + _ _ + _ _ + _ + __ + +" + ""))) + ;; And then hack it. + (gnus-indent-rigidly (point-min) (point-max) + (/ (max (- (window-width) (or x 46)) 0) 2)) + (goto-char (point-min)) + (forward-line 1) + (let* ((pheight (count-lines (point-min) (point-max))) + (wheight (window-height)) + (rest (- wheight pheight))) + (insert (make-string (max 0 (* 2 (/ rest 3))) ?\n))) + ;; Fontify some. + (put-text-property (point-min) (point-max) 'face 'gnus-splash-face) + (goto-char (point-min)) + (setq mode-line-buffer-identification (concat " " gnus-version)) + (setq gnus-simple-splash t) + (set-buffer-modified-p t)) + (defun gnus-encode-coding-string (string system) string) @@ -182,7 +233,11 @@ (fset 'gnus-summary-set-display-table (lambda ())) (fset 'gnus-encode-coding-string 'encode-coding-string) (fset 'gnus-decode-coding-string 'decode-coding-string) - + + (and window-system + (module-installed-p 'bitmap) + (fset 'gnus-group-startup-message 'gnus-mule-group-startup-message)) + (when (boundp 'gnus-check-before-posting) (setq gnus-check-before-posting (delq 'long-lines diff --git a/lisp/gnus-i18n.el b/lisp/gnus-i18n.el new file mode 100644 index 0000000..3737fb9 --- /dev/null +++ b/lisp/gnus-i18n.el @@ -0,0 +1,95 @@ +;;; gnus-i18n.el --- Internationalization for Gnus + +;; Copyright (C) 1996,1997 Free Software Foundation, Inc. + +;; Author: MORIOKA Tomohiko +;; Created: 1997/11/27 +;; Keywords: internationalization, news, mail + +;; This file is not part of GNU Emacs yet. + +;; This program is free software; you can redistribute it and/or +;; modify it under the terms of the GNU General Public License as +;; published by the Free Software Foundation; either version 2, or (at +;; your option) any later version. + +;; This program is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;;; Code: + +;;; @ newsgroup default charset +;;; + +(defvar gnus-newsgroup-default-charset-alist + '(("^\\(fj\\|tnn\\|japan\\)\\." . iso-2022-jp-2) + ("^han\\." . euc-kr) + ("^relcom\\." . koi8-r) + ("^alt\\.chinese\\.text\\.big5" . cn-big5) + ("^hk\\(star\\)?\\." . cn-big5) + ("^tw\\." . cn-big5) + ("^alt\\.chinese" . hz-gb-2312) + ) + "Alist of newsgroup patterns vs. corresponding default MIME charset. +Each element looks like (REGEXP . SYMBOL). REGEXP is pattern for +newsgroup name. SYMBOL is MIME charset or coding-system.") + +(defun gnus-set-newsgroup-default-charset (newsgroup charset) + "Set CHARSET for the NEWSGROUP as default MIME charset." + (let* ((ng-regexp (concat "^" (regexp-quote newsgroup) "\\($\\|\\.\\)")) + (pair (assoc ng-regexp gnus-newsgroup-default-charset-alist)) + ) + (if pair + (setcdr pair charset) + (setq gnus-newsgroup-default-charset-alist + (cons (cons ng-regexp charset) + gnus-newsgroup-default-charset-alist)) + ))) + + +;;; @ localization +;;; + +(defun gnus-set-summary-default-charset () + "Set up `default-mime-charset' of summary buffer. +It is specified by variable `gnus-newsgroup-default-charset-alist' +\(cf. function `gnus-set-newsgroup-default-charset')." + (if (buffer-live-p gnus-summary-buffer) + (let ((charset + (catch 'found + (let ((group + (save-excursion + (set-buffer gnus-summary-buffer) + gnus-newsgroup-name)) + (alist gnus-newsgroup-default-charset-alist)) + (while alist + (let ((pair (car alist))) + (if (string-match (car pair) group) + (throw 'found (cdr pair)) + )) + (setq alist (cdr alist))) + )))) + (when charset + (save-excursion + (set-buffer gnus-summary-buffer) + (make-local-variable 'default-mime-charset) + (setq default-mime-charset charset) + ) + (make-local-variable 'default-mime-charset) + (setq default-mime-charset charset) + )))) + + +;;; @ end +;;; + +(provide 'gnus-i18n) + +;;; gnus-i18n.el ends here diff --git a/lisp/gnus-msg.el b/lisp/gnus-msg.el index 82ac3d0..824c191 100644 --- a/lisp/gnus-msg.el +++ b/lisp/gnus-msg.el @@ -1,9 +1,10 @@ -;;; gnus-msg.el --- mail and post interface for Gnus +;;; gnus-msg.el --- mail and post interface for Semi-gnus ;; Copyright (C) 1995,96,97,98 Free Software Foundation, Inc. ;; Author: Masanobu UMEDA -;; Lars Magne Ingebrigtsen -;; Keywords: news +;; Lars Magne Ingebrigtsen +;; MORIOKA Tomohiko +;; Keywords: mail, news, MIME ;; This file is part of GNU Emacs. @@ -299,8 +300,10 @@ post using the current select method." article) (while (setq article (pop articles)) (when (gnus-summary-select-article t nil nil article) - (when (gnus-eval-in-buffer-window gnus-original-article-buffer - (message-cancel-news)) + (when (gnus-eval-in-buffer-window gnus-article-buffer + (save-excursion + (set-buffer gnus-original-article-buffer) + (message-cancel-news))) (gnus-summary-mark-as-read article gnus-canceled-mark) (gnus-cache-remove-article 1)) (gnus-article-hide-headers-if-wanted)) @@ -502,60 +505,9 @@ If SILENT, don't prompt the user." ;;; as well include the Emacs version as well. ;;; The following function works with later GNU Emacs, and XEmacs. (defun gnus-extended-version () - "Stringified Gnus version and Emacs version" + "Stringified Gnus version" (interactive) - (concat - gnus-version - "/" - (cond - ((string-match "^\\([0-9]+\\.[0-9]+\\)\\.[.0-9]+$" emacs-version) - (concat "Emacs " (substring emacs-version - (match-beginning 1) - (match-end 1)))) - ((string-match "\\([A-Z]*[Mm][Aa][Cc][Ss]\\)[^(]*\\(\\((beta.*)\\|'\\)\\)?" - emacs-version) - (concat (substring emacs-version - (match-beginning 1) - (match-end 1)) - (format " %d.%d" emacs-major-version emacs-minor-version) - (if (match-beginning 3) - (substring emacs-version - (match-beginning 3) - (match-end 3)) - "") - (if (boundp 'xemacs-codename) - (concat " - \"" xemacs-codename "\"")))) - (t emacs-version)))) - -;; Written by "Mr. Per Persson" . -(defun gnus-inews-insert-mime-headers () - "Insert MIME headers. -Assumes ISO-Latin-1 is used iff 8-bit characters are present." - (goto-char (point-min)) - (let ((mail-header-separator - (progn - (goto-char (point-min)) - (if (and (search-forward (concat "\n" mail-header-separator "\n") - nil t) - (not (search-backward "\n\n" nil t))) - mail-header-separator - "")))) - (or (mail-position-on-field "Mime-Version") - (insert "1.0") - (cond ((save-restriction - (widen) - (goto-char (point-min)) - (re-search-forward "[^\000-\177]" nil t)) - (or (mail-position-on-field "Content-Type") - (insert "text/plain; charset=ISO-8859-1")) - (or (mail-position-on-field "Content-Transfer-Encoding") - (insert "8bit"))) - (t (or (mail-position-on-field "Content-Type") - (insert "text/plain; charset=US-ASCII")) - (or (mail-position-on-field "Content-Transfer-Encoding") - (insert "7bit"))))))) - -(custom-add-option 'message-header-hook 'gnus-inews-insert-mime-headers) + gnus-version) ;;; @@ -610,7 +562,11 @@ If FULL-HEADERS (the prefix), include full headers when forwarding." (interactive "P") (gnus-setup-message 'forward (gnus-summary-select-article) - (set-buffer gnus-original-article-buffer) + (let ((charset default-mime-charset)) + (set-buffer gnus-original-article-buffer) + (make-local-variable 'default-mime-charset) + (setq default-mime-charset charset) + ) (let ((message-included-forward-headers (if full-headers "" message-included-forward-headers))) (message-forward post)))) @@ -902,7 +858,7 @@ this is a reply." (save-restriction (message-narrow-to-headers) (let ((gcc (or gcc (mail-fetch-field "gcc" nil t))) - (cur (current-buffer)) + (coding-system-for-write 'raw-text) groups group method) (when gcc (message-remove-header "gcc") @@ -930,7 +886,8 @@ this is a reply." (gnus-request-create-group group method)) (save-excursion (nnheader-set-temp-buffer " *acc*") - (insert-buffer-substring cur) + (insert-buffer-substring message-encoding-buffer) + (gnus-run-hooks 'gnus-before-do-gcc-hook) (goto-char (point-min)) (when (re-search-forward (concat "^" (regexp-quote mail-header-separator) "$") diff --git a/lisp/gnus-sum.el b/lisp/gnus-sum.el index 409e2fc..cbcc92e 100644 --- a/lisp/gnus-sum.el +++ b/lisp/gnus-sum.el @@ -1,8 +1,9 @@ -;;; gnus-sum.el --- summary mode commands for Gnus +;;; gnus-sum.el --- summary mode commands for Semi-gnus ;; Copyright (C) 1996,97,98 Free Software Foundation, Inc. ;; Author: Lars Magne Ingebrigtsen -;; Keywords: news +;; MORIOKA Tomohiko +;; Keywords: mail, news, MIME ;; This file is part of GNU Emacs. @@ -33,7 +34,11 @@ (require 'gnus-range) (require 'gnus-int) (require 'gnus-undo) +(require 'std11) +(require 'mime-view) + (autoload 'gnus-summary-limit-include-cached "gnus-cache" nil t) +(autoload 'gnus-set-summary-default-charset "gnus-i18n" nil t) (defcustom gnus-kill-summary-on-exit t "*If non-nil, kill the summary buffer when you exit from it. @@ -325,7 +330,7 @@ variable." :group 'gnus-article-various :type 'boolean) -(defcustom gnus-show-mime nil +(defcustom gnus-show-mime t "*If non-nil, do mime processing of articles. The articles will simply be fed to the function given by `gnus-show-mime-method'." @@ -659,18 +664,24 @@ is not run if `gnus-visual' is nil." :group 'gnus-summary-visual :type 'hook) -(defcustom gnus-structured-field-decoder 'identity +(defcustom gnus-structured-field-decoder + #'eword-decode-and-unfold-structured-field "Function to decode non-ASCII characters in structured field for summary." :group 'gnus-various :type 'function) -(defcustom gnus-unstructured-field-decoder 'identity +(defcustom gnus-unstructured-field-decoder + (function + (lambda (string) + (eword-decode-unstructured-field-body + (std11-unfold-string string) 'must-unfold) + )) "Function to decode non-ASCII characters in unstructured field for summary." :group 'gnus-various :type 'function) (defcustom gnus-parse-headers-hook - (list 'gnus-hack-decode-rfc1522 'gnus-decode-rfc1522) + '(gnus-set-summary-default-charset) "*A hook called before parsing the headers." :group 'gnus-various :type 'hook) @@ -1137,6 +1148,7 @@ increase the score of each group you read." [delete] gnus-summary-prev-page [backspace] gnus-summary-prev-page "\r" gnus-summary-scroll-up + "\e\r" gnus-summary-scroll-down "n" gnus-summary-next-unread-article "p" gnus-summary-prev-unread-article "N" gnus-summary-next-article @@ -1218,6 +1230,7 @@ increase the score of each group you read." "t" gnus-article-hide-headers "g" gnus-summary-show-article "l" gnus-summary-goto-last-article + "v" gnus-summary-preview-mime-message "\C-c\C-v\C-v" gnus-uu-decode-uu-view "\C-d" gnus-summary-enter-digest-group "\M-\C-d" gnus-summary-read-document @@ -1361,7 +1374,6 @@ increase the score of each group you read." "e" gnus-article-emphasize "w" gnus-article-fill-cited-article "c" gnus-article-remove-cr - "q" gnus-article-de-quoted-unreadable "f" gnus-article-display-x-face "l" gnus-summary-stop-page-breaking "r" gnus-summary-caesar-message @@ -1506,7 +1518,6 @@ increase the score of each group you read." ["Word wrap" gnus-article-fill-cited-article t] ["CR" gnus-article-remove-cr t] ["Show X-Face" gnus-article-display-x-face t] - ["Quoted-Printable" gnus-article-de-quoted-unreadable t] ["UnHTMLize" gnus-article-treat-html t] ["Rot 13" gnus-summary-caesar-message t] ["Unix pipe" gnus-summary-pipe-message t] @@ -4639,7 +4650,7 @@ taken into consideration." (let ((max (max (point) (mark))) articles article) (save-excursion - (goto-char (min (min (point) (mark)))) + (goto-char (min (point) (mark))) (while (and (push (setq article (gnus-summary-article-number)) articles) @@ -5160,6 +5171,28 @@ which existed when entering the ephemeral is reset." (gnus-summary-recenter) (gnus-summary-position-point)))) +(defun gnus-summary-preview-mime-message (arg) + "MIME decode and play this message." + (interactive "P") + (let ((gnus-break-pages nil)) + (gnus-summary-select-article t t) + ) + (pop-to-buffer gnus-original-article-buffer t) + (let (buffer-read-only) + (if (text-property-any (point-min) (point-max) 'invisible t) + (remove-text-properties (point-min) (point-max) + gnus-hidden-properties) + )) + (mime-view-mode nil nil nil gnus-original-article-buffer + gnus-article-buffer) + ) + +(defun gnus-summary-scroll-down () + "Scroll down one line current article." + (interactive) + (gnus-summary-scroll-up -1) + ) + ;;; Dead summaries. (defvar gnus-dead-summary-mode-map nil) @@ -7112,7 +7145,7 @@ latter case, they will be copied into the relevant groups." (set-buffer (get-buffer-create " *import file*")) (buffer-disable-undo (current-buffer)) (erase-buffer) - (insert-file-contents file) + (nnheader-insert-file-contents file) (goto-char (point-min)) (unless (nnheader-article-p) ;; This doesn't look like an article, so we fudge some headers. @@ -8909,6 +8942,34 @@ save those articles instead." (gnus-summary-exit)) buffers))))) + +;;; @ for mime-partial +;;; + +(defun gnus-mime-partial-preview-function () + (gnus-summary-preview-mime-message (gnus-summary-article-number)) + ) + +(autoload 'mime-method-to-combine-message/partial-pieces + "mime-partial" + "Internal method to combine message/partial messages automatically.") + +(ctree-set-calist-strictly + 'mime-acting-condition + '((type . message)(subtype . partial) + (method . mime-method-to-combine-message/partial-pieces) + (major-mode . gnus-original-article-mode) + (summary-buffer-exp . gnus-summary-buffer) + )) + +(set-alist 'mime-view-partial-message-method-alist + 'gnus-original-article-mode + 'gnus-mime-partial-preview-function) + + +;;; @ end +;;; + (gnus-ems-redefine) (provide 'gnus-sum) diff --git a/lisp/gnus.el b/lisp/gnus.el index 5d3e566..7daa50d 100644 --- a/lisp/gnus.el +++ b/lisp/gnus.el @@ -250,11 +250,13 @@ is restarted, and sometimes reloaded." :link '(custom-manual "(gnus)Exiting Gnus") :group 'gnus) -(defconst gnus-version-number "5.6.8" - "Version number for this version of Gnus.") +(defconst gnus-version-number "6.2.5" + "Version number for this version of gnus.") -(defconst gnus-version (format "Gnus v%s" gnus-version-number) - "Version string for this version of Gnus.") +(defconst gnus-version + (format "Semi-gnus %s (based on Gnus 5.6.9; for SEMI 1.3)" + gnus-version-number) + "Version string for this version of gnus.") (defcustom gnus-inhibit-startup-message nil "If non-nil, the startup message will not be displayed. @@ -1340,7 +1342,6 @@ want." gnus-article-emphasize gnus-article-fill-cited-article gnus-article-remove-cr - gnus-article-de-quoted-unreadable gnus-summary-stop-page-breaking ;; gnus-summary-caesar-message ;; gnus-summary-verbose-headers @@ -1541,8 +1542,7 @@ gnus-newsrc-hashtb should be kept so that both hold the same information.") (if (eq (nth 1 package) ':interactive) (cdddr package) (cdr package))))) - '(("metamail" metamail-buffer) - ("info" Info-goto-node) + '(("info" Info-goto-node) ("hexl" hexl-hex-string-to-integer) ("pp" pp pp-to-string pp-eval-expression) ("ps-print" ps-print-preprint) @@ -1667,7 +1667,7 @@ gnus-newsrc-hashtb should be kept so that both hold the same information.") gnus-article-hide-headers gnus-article-hide-boring-headers gnus-article-treat-overstrike gnus-article-word-wrap gnus-article-remove-cr gnus-article-remove-trailing-blank-lines - gnus-article-display-x-face gnus-article-de-quoted-unreadable + gnus-article-display-x-face gnus-article-mime-decode-quoted-printable gnus-article-hide-pgp gnus-article-hide-pem gnus-article-hide-signature gnus-article-strip-leading-blank-lines gnus-article-date-local diff --git a/lisp/lpath.el b/lisp/lpath.el index 10bab6b..b4b458c 100644 --- a/lisp/lpath.el +++ b/lisp/lpath.el @@ -2,6 +2,12 @@ (defvar byte-compile-default-warnings) +(or (featurep 'path-util) + (load "apel/path-util")) +(add-path "apel") +(add-path "flim") +(add-path "semi") + (defun maybe-fbind (args) (while args (or (fboundp (car args)) diff --git a/lisp/message.el b/lisp/message.el index ac2857e..4aa804b 100644 --- a/lisp/message.el +++ b/lisp/message.el @@ -2,7 +2,8 @@ ;; Copyright (C) 1996,97,98 Free Software Foundation, Inc. ;; Author: Lars Magne Ingebrigtsen -;; Keywords: mail, news +;; MORIOKA Tomohiko +;; Keywords: mail, news, MIME ;; This file is part of GNU Emacs. @@ -29,7 +30,10 @@ ;;; Code: -(eval-when-compile (require 'cl)) +(eval-when-compile + (require 'cl) + (require 'smtp) + ) (require 'mailheader) (require 'nnheader) @@ -39,6 +43,7 @@ (if (string-match "XEmacs\\|Lucid" emacs-version) (require 'mail-abbrevs) (require 'mailabbrev)) +(require 'mime-edit) (defgroup message '((user-mail-address custom-variable) (user-full-name custom-variable)) @@ -122,6 +127,11 @@ mailbox format." (function :tag "Other")) :group 'message-sending) +(defcustom message-encode-function 'message-maybe-encode + "*A function called to encode messages." + :group 'message-sending + :type 'function) + (defcustom message-courtesy-message "The following message is a courtesy copy of an article\nthat has been posted to %s as well.\n\n" "*This is inserted at the start of a mailed copy of a posted message. @@ -270,13 +280,13 @@ If t, use `message-user-organization-file'." :group 'message-headers) (defcustom message-forward-start-separator - "------- Start of forwarded message -------\n" + (concat (mime-make-tag "message" "rfc822") "\n") "*Delimiter inserted before forwarded messages." :group 'message-forwarding :type 'string) (defcustom message-forward-end-separator - "------- End of forwarded message -------\n" + "" "*Delimiter inserted after forwarded messages." :group 'message-forwarding :type 'string) @@ -316,16 +326,17 @@ variable `mail-header-separator'. Legal values include `message-send-mail-with-sendmail' (the default), `message-send-mail-with-mh', `message-send-mail-with-qmail' and -`smtpmail-send-it'." +`message-send-mail-with-smtp'." :type '(radio (function-item message-send-mail-with-sendmail) (function-item message-send-mail-with-mh) (function-item message-send-mail-with-qmail) - (function-item smtpmail-send-it) + (function-item message-send-mail-with-smtp) (function :tag "Other")) :group 'message-sending :group 'message-mail) -(defcustom message-send-news-function 'message-send-news +;; 1997-09-29 by MORIOKA Tomohiko +(defcustom message-send-news-function 'message-send-news-with-gnus "Function to call to send the current buffer as news. The headers should be delimited by a line whose contents match the variable `mail-header-separator'." @@ -411,7 +422,8 @@ variable isn't used." :group 'message-headers :type 'boolean) -(defcustom message-setup-hook nil +(defcustom message-setup-hook + '(message-maybe-setup-default-charset turn-on-mime-edit) "Normal hook, run each time a new outgoing message is initialized. The function `message-setup' runs this hook." :group 'message-various @@ -429,7 +441,7 @@ the signature is inserted." :group 'message-various :type 'hook) -(defcustom message-header-hook nil +(defcustom message-header-hook '(eword-encode-header) "Hook run in a message mode buffer narrowed to the headers." :group 'message-various :type 'hook) @@ -910,7 +922,7 @@ The cdr of ech entry is a function for applying the face to a region.") (Lines) (Expires) (Message-ID) - (References . message-fill-header) + (References . message-fill-references) (X-Mailer) (X-Newsreader)) "Alist used for formatting headers.") @@ -1875,20 +1887,29 @@ the user from the mailer." (message-fix-before-sending) (run-hooks 'message-send-hook) (message "Sending...") - (let ((alist message-send-method-alist) + (let ((message-encoding-buffer + (message-generate-new-buffer-clone-locals " message encoding")) + (message-edit-buffer (current-buffer)) + (message-mime-mode mime-edit-mode-flag) + (alist message-send-method-alist) (success t) elem sent) - (while (and success - (setq elem (pop alist))) - (when (and (or (not (funcall (cadr elem))) - (and (or (not (memq (car elem) - message-sent-message-via)) - (y-or-n-p - (format - "Already sent message via %s; resend? " - (car elem)))) - (setq success (funcall (caddr elem) arg))))) - (setq sent t))) + (save-excursion + (set-buffer message-encoding-buffer) + (erase-buffer) + (insert-buffer message-edit-buffer) + (funcall message-encode-function) + (while (and success + (setq elem (pop alist))) + (when (and (or (not (funcall (cadr elem))) + (and (or (not (memq (car elem) + message-sent-message-via)) + (y-or-n-p + (format + "Already sent message via %s; resend? " + (car elem)))) + (setq success (funcall (caddr elem) arg))))) + (setq sent t)))) (when (and success sent) (message-do-fcc) ;;(when (fboundp 'mail-hist-put-headers-into-history) @@ -1911,7 +1932,7 @@ the user from the mailer." (defun message-send-via-news (arg) "Send the current message via news." - (funcall message-send-news-function arg)) + (message-send-news arg)) (defun message-fix-before-sending () "Do various things to make the message nice before sending it." @@ -1945,8 +1966,7 @@ the user from the mailer." (require 'mail-utils) (let ((tembuf (message-generate-new-buffer-clone-locals " message temp")) (case-fold-search nil) - (news (message-news-p)) - (mailbuf (current-buffer))) + (news (message-news-p))) (save-restriction (message-narrow-to-headers) ;; Insert some headers. @@ -1959,11 +1979,7 @@ the user from the mailer." (save-excursion (set-buffer tembuf) (erase-buffer) - ;; Avoid copying text props. - (insert (format - "%s" (save-excursion - (set-buffer mailbuf) - (buffer-string)))) + (insert-buffer message-encoding-buffer) ;; Remove some headers. (save-restriction (message-narrow-to-headers) @@ -1977,9 +1993,15 @@ the user from the mailer." (or (message-fetch-field "cc") (message-fetch-field "to"))) (message-insert-courtesy-copy)) + (mime-edit-maybe-split-and-send + (function + (lambda () + (interactive) + (funcall message-send-mail-function) + ))) (funcall message-send-mail-function)) (kill-buffer tembuf)) - (set-buffer mailbuf) + (set-buffer message-edit-buffer) (push 'mail message-sent-message-via))) (defun message-send-mail-with-sendmail () @@ -2106,13 +2128,151 @@ to find out how to use this." ;; Pass it on to mh. (mh-send-letter))) +(defun message-send-mail-with-smtp () + "Send the prepared message buffer with SMTP." + (require 'smtp) + (let ((errbuf (if mail-interactive + (generate-new-buffer " smtp errors") + 0)) + (case-fold-search nil) + resend-to-addresses + delimline) + (unwind-protect + (save-excursion + (goto-char (point-max)) + ;; require one newline at the end. + (or (= (preceding-char) ?\n) + (insert ?\n)) + ;; Change header-delimiter to be what sendmail expects. + (goto-char (point-min)) + (re-search-forward + (concat "^" (regexp-quote mail-header-separator) "\n")) + (replace-match "\n") + (backward-char 1) + (setq delimline (point-marker)) + (run-hooks 'message-send-mail-hook) + ;; (sendmail-synch-aliases) + ;; (if mail-aliases + ;; (expand-mail-aliases (point-min) delimline)) + (goto-char (point-min)) + ;; ignore any blank lines in the header + (while (and (re-search-forward "\n\n\n*" delimline t) + (< (point) delimline)) + (replace-match "\n")) + (let ((case-fold-search t)) + (goto-char (point-min)) + (goto-char (point-min)) + (while (re-search-forward "^Resent-to:" delimline t) + (setq resend-to-addresses + (save-restriction + (narrow-to-region (point) + (save-excursion + (end-of-line) + (point))) + (append (mail-parse-comma-list) + resend-to-addresses)))) +;;; Apparently this causes a duplicate Sender. +;;; ;; If the From is different than current user, insert Sender. +;;; (goto-char (point-min)) +;;; (and (re-search-forward "^From:" delimline t) +;;; (progn +;;; (require 'mail-utils) +;;; (not (string-equal +;;; (mail-strip-quoted-names +;;; (save-restriction +;;; (narrow-to-region (point-min) delimline) +;;; (mail-fetch-field "From"))) +;;; (user-login-name)))) +;;; (progn +;;; (forward-line 1) +;;; (insert "Sender: " (user-login-name) "\n"))) + ;; Don't send out a blank subject line + (goto-char (point-min)) + (if (re-search-forward "^Subject:[ \t]*\n" delimline t) + (replace-match "")) + ;; Put the "From:" field in unless for some odd reason + ;; they put one in themselves. + (goto-char (point-min)) + (if (not (re-search-forward "^From:" delimline t)) + (let* ((login user-mail-address) + (fullname (user-full-name))) + (cond ((eq mail-from-style 'angles) + (insert "From: " fullname) + (let ((fullname-start (+ (point-min) 6)) + (fullname-end (point-marker))) + (goto-char fullname-start) + ;; Look for a character that cannot appear unquoted + ;; according to RFC 822. + (if (re-search-forward "[^- !#-'*+/-9=?A-Z^-~]" + fullname-end 1) + (progn + ;; Quote fullname, escaping specials. + (goto-char fullname-start) + (insert "\"") + (while (re-search-forward "[\"\\]" + fullname-end 1) + (replace-match "\\\\\\&" t)) + (insert "\"")))) + (insert " <" login ">\n")) + ((eq mail-from-style 'parens) + (insert "From: " login " (") + (let ((fullname-start (point))) + (insert fullname) + (let ((fullname-end (point-marker))) + (goto-char fullname-start) + ;; RFC 822 says \ and nonmatching parentheses + ;; must be escaped in comments. + ;; Escape every instance of ()\ ... + (while (re-search-forward "[()\\]" fullname-end 1) + (replace-match "\\\\\\&" t)) + ;; ... then undo escaping of matching parentheses, + ;; including matching nested parentheses. + (goto-char fullname-start) + (while (re-search-forward + "\\(\\=\\|[^\\]\\(\\\\\\\\\\)*\\)\\\\(\\(\\([^\\]\\|\\\\\\\\\\)*\\)\\\\)" + fullname-end 1) + (replace-match "\\1(\\3)" t) + (goto-char fullname-start)))) + (insert ")\n")) + ((null mail-from-style) + (insert "From: " login "\n"))))) + ;; Insert an extra newline if we need it to work around + ;; Sun's bug that swallows newlines. + (goto-char (1+ delimline)) + (if (eval mail-mailer-swallows-blank-line) + (newline)) + ;; Find and handle any FCC fields. + (goto-char (point-min)) + (if (re-search-forward "^FCC:" delimline t) + (mail-do-fcc delimline)) + (if mail-interactive + (save-excursion + (set-buffer errbuf) + (erase-buffer)))) + ;; + ;; + ;; + (let ((recipient-address-list + (or resend-to-addresses + (smtp-deduce-address-list (current-buffer) + (point-min) delimline)))) + (smtp-do-bcc delimline) + + (if recipient-address-list + (if (not (smtp-via-smtp recipient-address-list + (current-buffer))) + (error "Sending failed; SMTP protocol error")) + (error "Sending failed; no recipients")) + )) + (if (bufferp errbuf) + (kill-buffer errbuf))))) + (defun message-send-news (&optional arg) (let ((tembuf (message-generate-new-buffer-clone-locals " *message temp*")) (case-fold-search nil) (method (if (message-functionp message-post-method) (funcall message-post-method arg) message-post-method)) - (messbuf (current-buffer)) (message-syntax-checks (if arg (cons '(existing-newsgroups . disabled) @@ -2135,11 +2295,7 @@ to find out how to use this." (set-buffer tembuf) (buffer-disable-undo (current-buffer)) (erase-buffer) - ;; Avoid copying text props. - (insert (format - "%s" (save-excursion - (set-buffer messbuf) - (buffer-string)))) + (insert-buffer message-encoding-buffer) ;; Remove some headers. (save-restriction (message-narrow-to-headers) @@ -2149,30 +2305,48 @@ to find out how to use this." ;; require one newline at the end. (or (= (preceding-char) ?\n) (insert ?\n)) - (let ((case-fold-search t)) - ;; Remove the delimiter. - (goto-char (point-min)) - (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "\n")) - (replace-match "\n") - (backward-char 1)) - (run-hooks 'message-send-news-hook) - ;;(require (car method)) - ;;(funcall (intern (format "%s-open-server" (car method))) - ;;(cadr method) (cddr method)) - ;;(setq result - ;; (funcall (intern (format "%s-request-post" (car method))) - ;; (cadr method))) - (gnus-open-server method) - (setq result (gnus-request-post method))) + (mime-edit-maybe-split-and-send + (function + (lambda () + (interactive) + (save-restriction + (std11-narrow-to-header mail-header-separator) + (goto-char (point-min)) + (when (re-search-forward "^Message-Id:" nil t) + (delete-region (match-end 0)(std11-field-end)) + (insert (concat " " (message-make-message-id))) + )) + (funcall message-send-news-function method) + ))) + (setq result (funcall message-send-news-function method))) (kill-buffer tembuf)) - (set-buffer messbuf) + (set-buffer message-edit-buffer) (if result (push 'news message-sent-message-via) (message "Couldn't send message via news: %s" (nnheader-get-report (car method))) nil)))) +;; 1997-09-29 by MORIOKA Tomohiko +(defun message-send-news-with-gnus (method) + (let ((case-fold-search t)) + ;; Remove the delimiter. + (goto-char (point-min)) + (re-search-forward + (concat "^" (regexp-quote mail-header-separator) "\n")) + (replace-match "\n") + (backward-char 1) + (run-hooks 'message-send-news-hook) + ;;(require (car method)) + ;;(funcall (intern (format "%s-open-server" (car method))) + ;;(cadr method) (cddr method)) + ;;(setq result + ;; (funcall (intern (format "%s-request-post" (car method))) + ;; (cadr method))) + (gnus-open-server method) + (gnus-request-post method) + )) + ;;; ;;; Header generation & syntax checking. ;;; @@ -2206,7 +2380,9 @@ to find out how to use this." (message-narrow-to-headers) (message-check-news-header-syntax))) ;; Check the body. - (message-check-news-body-syntax))))) + (save-excursion + (set-buffer message-edit-buffer) + (message-check-news-body-syntax)))))) (defun message-check-news-header-syntax () (and @@ -2467,18 +2643,19 @@ to find out how to use this." (defun message-do-fcc () "Process Fcc headers in the current buffer." (let ((case-fold-search t) - (buf (current-buffer)) + (coding-system-for-write 'raw-text) list file) (save-excursion (set-buffer (get-buffer-create " *message temp*")) (buffer-disable-undo (current-buffer)) (erase-buffer) - (insert-buffer-substring buf) + (insert-buffer-substring message-encoding-buffer) (save-restriction (message-narrow-to-headers) (while (setq file (message-fetch-field "fcc")) (push file list) (message-remove-header "fcc" nil t))) + (run-hooks 'message-header-hook 'message-before-do-fcc-hook) (goto-char (point-min)) (re-search-forward (concat "^" (regexp-quote mail-header-separator) "$")) (replace-match "" t t) @@ -2973,6 +3150,13 @@ Headers already prepared in the buffer are not modified." (widen) (forward-line 1))) +(defun message-fill-references (header value) + (insert (capitalize (symbol-name header)) + ": " + (std11-fill-msg-id-list-string + (if (consp value) (car value) value)) + "\n")) + (defun message-fill-header (header value) (let ((begin (point)) (fill-column 990) @@ -3424,8 +3608,8 @@ responses here are directed to other newsgroups.")) ;; Make sure that this article was written by the user. (unless (string-equal (downcase - (or sender (cadr (mail-extract-address-components from)))) - (downcase (message-make-sender))) + (or sender (cadr (std11-extract-address-components from)))) + (downcase (message-make-address))) (error "This article is not yours")) ;; Make control message. (setq buf (set-buffer (get-buffer-create " *message cancel*"))) @@ -3442,8 +3626,10 @@ responses here are directed to other newsgroups.")) message-cancel-message) (message "Canceling your article...") (if (let ((message-syntax-checks - 'dont-check-for-anything-just-trust-me)) - (funcall message-send-news-function)) + 'dont-check-for-anything-just-trust-me) + (message-encoding-buffer (current-buffer)) + (message-edit-buffer (current-buffer))) + (message-send-news)) (message "Canceling your article...done")) (kill-buffer buf))))) @@ -3506,7 +3692,8 @@ header line with the old Message-ID." (concat "[" (or (message-fetch-field (if (message-news-p) "newsgroups" "from")) "(nowhere)") - "] " (or (message-fetch-field "Subject") ""))))) + "] " (or (eword-decode-unstructured-field-body + (message-fetch-field "Subject") "")))))) ;;;###autoload (defun message-forward (&optional news) @@ -3556,7 +3743,10 @@ Optional NEWS will use news to forward instead of mail." (set-buffer (get-buffer-create " *message resend*")) (buffer-disable-undo (current-buffer)) (erase-buffer) - (message-setup `((To . ,address))) + ;; avoid to turn-on-mime-edit + (let (message-setup-hook) + (message-setup `((To . ,address))) + ) ;; Insert our usual headers. (message-generate-headers '(From Date To)) (message-narrow-to-headers) @@ -3587,7 +3777,9 @@ Optional NEWS will use news to forward instead of mail." (when (looking-at "From ") (replace-match "X-From-Line: ")) ;; Send it. - (message-send-mail) + (let ((message-encoding-buffer (current-buffer)) + (message-edit-buffer (current-buffer))) + (message-send-mail)) (kill-buffer (current-buffer))) (message "Resending message to %s...done" address))) @@ -3839,6 +4031,47 @@ regexp varstr." (cdr local))))) locals))) + +;;; @ for MIME Edit mode +;;; + +(defun message-maybe-setup-default-charset () + (let ((charset + (and (boundp 'gnus-summary-buffer) + (buffer-live-p gnus-summary-buffer) + (save-excursion + (set-buffer gnus-summary-buffer) + default-mime-charset)))) + (if charset + (progn + (make-local-variable 'default-mime-charset) + (setq default-mime-charset charset) + )))) + +(defun message-maybe-encode () + (when message-mime-mode + (run-hooks 'mime-edit-translate-hook) + (if (catch 'mime-edit-error + (save-excursion + (mime-edit-translate-body) + )) + (error "Translation error!") + ) + (end-of-invisible) + (run-hooks 'mime-edit-exit-hook) + )) + +(defun message-mime-insert-article (&optional message) + (interactive) + (let ((message-cite-function 'mime-edit-inserted-message-filter) + (message-reply-buffer gnus-original-article-buffer) + ) + (message-yank-original nil) + )) + +(set-alist 'mime-edit-message-inserter-alist + 'message-mode (function message-mime-insert-article)) + ;;; Miscellaneous functions ;; stolen (and renamed) from nnheader.el diff --git a/lisp/nnfolder.el b/lisp/nnfolder.el index 3045284..3f8811f 100644 --- a/lisp/nnfolder.el +++ b/lisp/nnfolder.el @@ -478,20 +478,31 @@ time saver for large mailboxes.") "Place point at the start of the headers of ARTICLE. ARTICLE can be an article number or a Message-ID." (let ((art-string (nnfolder-article-string article)) - end-search end) - (while (not end-search) - (if (or (search-forward art-string nil t) - ;; Don't search the whole file twice! Also, articles - ;; probably have some locality by number, so searching - ;; backwards will be faster. Especially if we're at the - ;; beginning of the buffer :-). -SLB - (search-backward art-string nil t)) - (progn - (setq end (point)) - (nnmail-search-unix-mail-delim-backward) - (unless (save-excursion (search-forward "\n\n" nil end)) - (setq end-search 'found))) - (setq end-search t))) + end-search end start beg) + (beginning-of-line) + (unless (bobp) + (forward-char -1)) + (setq start (point)) + (while (and (not end-search) + (search-forward art-string nil t)) + (setq end (point)) + (nnmail-search-unix-mail-delim-backward) + (setq beg (point)) + (when (and (search-forward "\n\n" nil end) + (search-backward art-string nil beg)) + (setq end-search 'found) + (goto-char beg))) + (unless end-search + (goto-char start) + (while (and (not end-search) + (search-backward art-string nil t)) + (setq end (point)) + (nnmail-search-unix-mail-delim-backward) + (setq beg (point)) + (when (and (search-forward "\n\n" nil end) + (search-backward art-string nil beg)) + (setq end-search 'found) + (goto-char beg)))) (eq end-search 'found))) (defun nnfolder-delete-mail (&optional force leave-delim) diff --git a/lisp/nnkiboze.el b/lisp/nnkiboze.el index 75fcd51..028d9e4 100644 --- a/lisp/nnkiboze.el +++ b/lisp/nnkiboze.el @@ -234,7 +234,7 @@ Finds out what articles are to be part of the nnkiboze groups." (load newsrc-file)) (nnheader-temp-write nov-file (when (file-exists-p nov-file) - (insert-file-contents nov-file)) + (nnheader-insert-file-contents nov-file)) (setq nov-buffer (current-buffer)) ;; Go through the active hashtb and add new all groups that match the ;; kiboze regexp. diff --git a/lisp/pop3.el b/lisp/pop3.el index 3362ed5..1bfd8ec 100644 --- a/lisp/pop3.el +++ b/lisp/pop3.el @@ -1,10 +1,10 @@ ;;; pop3.el --- Post Office Protocol (RFC 1460) interface -;; Copyright (C) 1996,1997 Free Software Foundation, Inc. +;; Copyright (C) 1996,97,98 Free Software Foundation, Inc. ;; Author: Richard L. Pieri ;; Keywords: mail, pop3 -;; Version: 1.3l +;; Version: 1.3l+ ;; This file is part of GNU Emacs. @@ -37,7 +37,7 @@ (require 'mail-utils) (provide 'pop3) -(defconst pop3-version "1.3l") +(defconst pop3-version "1.3l+") (defvar pop3-maildrop (or (user-login-name) (getenv "LOGNAME") (getenv "USER") nil) "*POP3 maildrop.") @@ -60,6 +60,9 @@ values are 'apop.") "Timestamp returned when initially connected to the POP server. Used for APOP authentication.") +(defvar pop3-movemail-file-coding-system 'binary + "Crashbox made by pop3-movemail with this coding system.") + (defvar pop3-read-point nil) (defvar pop3-debug nil) @@ -91,7 +94,8 @@ Used for APOP authentication.") (pop3-retr process n crashbuf) (save-excursion (set-buffer crashbuf) - (append-to-file (point-min) (point-max) crashbox) + (let ((coding-system-for-write pop3-movemail-file-coding-system)) + (append-to-file (point-min) (point-max) crashbox)) (set-buffer (process-buffer process)) (while (> (buffer-size) 5000) (goto-char (point-min)) @@ -111,7 +115,8 @@ Used for APOP authentication.") Returns the process associated with the connection." (let ((process-buffer (get-buffer-create (format "trace of POP session to %s" mailhost))) - (process)) + (process) + (coding-system-for-read 'binary)) (save-excursion (set-buffer process-buffer) (erase-buffer) @@ -123,8 +128,7 @@ Returns the process associated with the connection." (setq pop3-timestamp (substring response (or (string-match "<" response) 0) (+ 1 (or (string-match ">" response) -1))))) - process - )) + process)) ;; Support functions diff --git a/lisp/smtp.el b/lisp/smtp.el new file mode 100644 index 0000000..7dde447 --- /dev/null +++ b/lisp/smtp.el @@ -0,0 +1,457 @@ +;;; smtp.el --- basic functions to send mail with SMTP server + +;; Copyright (C) 1995, 1996, 1998 Free Software Foundation, Inc. + +;; Author: Tomoji Kagatani +;; ESMTP support: Simon Leinen +;; Keywords: SMTP, mail + +;; This file is part of GNU Emacs. + +;; GNU Emacs is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;;; Code: + +(defgroup smtp nil + "SMTP protocol for sending mail." + :group 'mail) + +(defcustom smtp-default-server nil + "*Specify default SMTP server." + :type '(choice (const nil) string) + :group 'smtp) + +(defcustom smtp-server + (or (getenv "SMTPSERVER") smtp-default-server) + "*The name of the host running SMTP server." + :type '(choice (const nil) string) + :group 'smtp) + +(defcustom smtp-service 25 + "*SMTP service port number. smtp or 25 ." + :type 'integer + :group 'smtp) + +(defcustom smtp-local-domain nil + "*Local domain name without a host name. +If the function (system-name) returns the full internet address, +don't define this value." + :type '(choice (const nil) string) + :group 'smtp) + +(defcustom smtp-debug-info nil + "*smtp debug info printout. messages and process buffer." + :type 'boolean + :group 'smtp) + +(defcustom smtp-coding-system 'binary + "*Coding-system for SMTP output." + :type 'coding-system + :group 'smtp) + + +(defun smtp-fqdn () + (if smtp-local-domain + (concat (system-name) "." smtp-local-domain) + (system-name))) + +(defun smtp-via-smtp (recipient smtp-text-buffer) + (let ((process nil) + (host smtp-server) + (port smtp-service) + response-code + greeting + process-buffer + (supported-extensions '()) + (coding-system-for-read smtp-coding-system) + (coding-system-for-write smtp-coding-system)) + (unwind-protect + (catch 'done + ;; get or create the trace buffer + (setq process-buffer + (get-buffer-create + (format "*trace of SMTP session to %s*" host))) + + ;; clear the trace buffer of old output + (save-excursion + (set-buffer process-buffer) + (erase-buffer)) + + ;; open the connection to the server + (setq process (open-network-stream "SMTP" process-buffer host port)) + (and (null process) (throw 'done nil)) + + ;; set the send-filter + (set-process-filter process 'smtp-process-filter) + + (save-excursion + (set-buffer process-buffer) + (make-local-variable 'smtp-read-point) + (setq smtp-read-point (point-min)) + + (if (or (null (car (setq greeting (smtp-read-response process)))) + (not (integerp (car greeting))) + (>= (car greeting) 400)) + (throw 'done nil) + ) + + ;; EHLO + (smtp-send-command process (format "EHLO %s" (smtp-fqdn))) + + (if (or (null (car (setq response-code (smtp-read-response process)))) + (not (integerp (car response-code))) + (>= (car response-code) 400)) + (progn + ;; HELO + (smtp-send-command process (format "HELO %s" (smtp-fqdn))) + + (if (or (null (car (setq response-code (smtp-read-response process)))) + (not (integerp (car response-code))) + (>= (car response-code) 400)) + (throw 'done nil))) + (let ((extension-lines (cdr (cdr response-code)))) + (while extension-lines + (let ((name (intern (downcase (substring (car extension-lines) 4))))) + (and name + (cond ((memq name '(verb xvrb 8bitmime onex xone + expn size dsn etrn + help xusr)) + (setq supported-extensions + (cons name supported-extensions))) + (t (message "unknown extension %s" + name))))) + (setq extension-lines (cdr extension-lines))))) + + (if (or (member 'onex supported-extensions) + (member 'xone supported-extensions)) + (progn + (smtp-send-command process (format "ONEX")) + (if (or (null (car (setq response-code (smtp-read-response process)))) + (not (integerp (car response-code))) + (>= (car response-code) 400)) + (throw 'done nil)))) + + (if (and smtp-debug-info + (or (member 'verb supported-extensions) + (member 'xvrb supported-extensions))) + (progn + (smtp-send-command process (format "VERB")) + (if (or (null (car (setq response-code (smtp-read-response process)))) + (not (integerp (car response-code))) + (>= (car response-code) 400)) + (throw 'done nil)))) + + (if (member 'xusr supported-extensions) + (progn + (smtp-send-command process (format "XUSR")) + (if (or (null (car (setq response-code (smtp-read-response process)))) + (not (integerp (car response-code))) + (>= (car response-code) 400)) + (throw 'done nil)))) + + ;; MAIL FROM: + (let ((size-part + (if (member 'size supported-extensions) + (format " SIZE=%d" + (save-excursion + (set-buffer smtp-text-buffer) + ;; size estimate: + (+ (- (point-max) (point-min)) + ;; Add one byte for each change-of-line + ;; because or CR-LF representation: + (count-lines (point-min) (point-max)) + ;; For some reason, an empty line is + ;; added to the message. Maybe this + ;; is a bug, but it can't hurt to add + ;; those two bytes anyway: + 2))) + "")) + (body-part + (if (member '8bitmime supported-extensions) + ;; FIXME: + ;; Code should be added here that transforms + ;; the contents of the message buffer into + ;; something the receiving SMTP can handle. + ;; For a receiver that supports 8BITMIME, this + ;; may mean converting BINARY to BASE64, or + ;; adding Content-Transfer-Encoding and the + ;; other MIME headers. The code should also + ;; return an indication of what encoding the + ;; message buffer is now, i.e. ASCII or + ;; 8BITMIME. + (if nil + " BODY=8BITMIME" + "") + ""))) +; (smtp-send-command process (format "MAIL FROM:%s@%s" (user-login-name) (smtp-fqdn))) + (smtp-send-command process (format "MAIL FROM: <%s>%s%s" + user-mail-address + size-part + body-part)) + + (if (or (null (car (setq response-code (smtp-read-response process)))) + (not (integerp (car response-code))) + (>= (car response-code) 400)) + (throw 'done nil) + )) + + ;; RCPT TO: + (let ((n 0)) + (while (not (null (nth n recipient))) + (smtp-send-command process (format "RCPT TO: <%s>" (nth n recipient))) + (setq n (1+ n)) + + (setq response-code (smtp-read-response process)) + (if (or (null (car response-code)) + (not (integerp (car response-code))) + (>= (car response-code) 400)) + (throw 'done nil) + ) + )) + + ;; DATA + (smtp-send-command process "DATA") + + (if (or (null (car (setq response-code (smtp-read-response process)))) + (not (integerp (car response-code))) + (>= (car response-code) 400)) + (throw 'done nil) + ) + + ;; Mail contents + (smtp-send-data process smtp-text-buffer) + + ;;DATA end "." + (smtp-send-command process ".") + + (if (or (null (car (setq response-code (smtp-read-response process)))) + (not (integerp (car response-code))) + (>= (car response-code) 400)) + (throw 'done nil) + ) + + ;;QUIT +; (smtp-send-command process "QUIT") +; (and (null (car (smtp-read-response process))) +; (throw 'done nil)) + t )) + (if process + (save-excursion + (set-buffer (process-buffer process)) + (smtp-send-command process "QUIT") + (smtp-read-response process) + +; (if (or (null (car (setq response-code (smtp-read-response process)))) +; (not (integerp (car response-code))) +; (>= (car response-code) 400)) +; (throw 'done nil) +; ) + (delete-process process)))))) + +(defun smtp-process-filter (process output) + (save-excursion + (set-buffer (process-buffer process)) + (goto-char (point-max)) + (insert output))) + +(defun smtp-read-response (process) + (let ((case-fold-search nil) + (response-strings nil) + (response-continue t) + (return-value '(nil ())) + match-end) + + (while response-continue + (goto-char smtp-read-point) + (while (not (search-forward "\r\n" nil t)) + (accept-process-output process) + (goto-char smtp-read-point)) + + (setq match-end (point)) + (setq response-strings + (cons (buffer-substring smtp-read-point (- match-end 2)) + response-strings)) + + (goto-char smtp-read-point) + (if (looking-at "[0-9]+ ") + (let ((begin (match-beginning 0)) + (end (match-end 0))) + (if smtp-debug-info + (message "%s" (car response-strings))) + + (setq smtp-read-point match-end) + + ;; ignore lines that start with "0" + (if (looking-at "0[0-9]+ ") + nil + (setq response-continue nil) + (setq return-value + (cons (string-to-int + (buffer-substring begin end)) + (nreverse response-strings))))) + + (if (looking-at "[0-9]+-") + (progn (if smtp-debug-info + (message "%s" (car response-strings))) + (setq smtp-read-point match-end) + (setq response-continue t)) + (progn + (setq smtp-read-point match-end) + (setq response-continue nil) + (setq return-value + (cons nil (nreverse response-strings))) + ) + ))) + (setq smtp-read-point match-end) + return-value)) + +(defun smtp-send-command (process command) + (goto-char (point-max)) + (if (= (aref command 0) ?P) + (insert "PASS \r\n") + (insert command "\r\n")) + (setq smtp-read-point (point)) + (process-send-string process command) + (process-send-string process "\r\n")) + +(defun smtp-send-data-1 (process data) + (goto-char (point-max)) + + (if smtp-debug-info + (insert data "\r\n")) + + (setq smtp-read-point (point)) + ;; Escape "." at start of a line + (if (eq (string-to-char data) ?.) + (process-send-string process ".")) + (process-send-string process data) + (process-send-string process "\r\n") + ) + +(defun smtp-send-data (process buffer) + (let + ((data-continue t) + (sending-data nil) + this-line + this-line-end) + + (save-excursion + (set-buffer buffer) + (goto-char (point-min))) + + (while data-continue + (save-excursion + (set-buffer buffer) + (beginning-of-line) + (setq this-line (point)) + (end-of-line) + (setq this-line-end (point)) + (setq sending-data nil) + (setq sending-data (buffer-substring this-line this-line-end)) + (if (/= (forward-line 1) 0) + (setq data-continue nil))) + + (smtp-send-data-1 process sending-data) + ) + ) + ) + +(defun smtp-deduce-address-list (smtp-text-buffer header-start header-end) + "Get address list suitable for smtp RCPT TO:
." + (require 'mail-utils) ;; pick up mail-strip-quoted-names + (let ((case-fold-search t) + (simple-address-list "") + this-line + this-line-end + addr-regexp + (smtp-address-buffer (generate-new-buffer " *smtp-mail*"))) + (unwind-protect + (save-excursion + ;; + (set-buffer smtp-address-buffer) + (erase-buffer) + (insert-buffer-substring smtp-text-buffer + header-start header-end) + (goto-char (point-min)) + ;; RESENT-* fields should stop processing of regular fields. + (save-excursion + (if (re-search-forward "^RESENT-TO:" header-end t) + (setq addr-regexp + "^\\(RESENT-TO:\\|RESENT-CC:\\|RESENT-BCC:\\)") + (setq addr-regexp "^\\(TO:\\|CC:\\|BCC:\\)"))) + + (while (re-search-forward addr-regexp header-end t) + (replace-match "") + (setq this-line (match-beginning 0)) + (forward-line 1) + ;; get any continuation lines + (while (and (looking-at "^[ \t]+") (< (point) header-end)) + (forward-line 1)) + (setq this-line-end (point-marker)) + (setq simple-address-list + (concat simple-address-list " " + (mail-strip-quoted-names + (buffer-substring this-line this-line-end)))) + ) + (erase-buffer) + (insert-string " ") + (insert-string simple-address-list) + (insert-string "\n") + ;; newline --> blank + (subst-char-in-region (point-min) (point-max) 10 ? t) + ;; comma --> blank + (subst-char-in-region (point-min) (point-max) ?, ? t) + ;; tab --> blank + (subst-char-in-region (point-min) (point-max) 9 ? t) + + (goto-char (point-min)) + ;; tidyness in case hook is not robust when it looks at this + (while (re-search-forward "[ \t]+" header-end t) (replace-match " ")) + + (goto-char (point-min)) + (let (recipient-address-list) + (while (re-search-forward " \\([^ ]+\\) " (point-max) t) + (backward-char 1) + (setq recipient-address-list + (cons (buffer-substring (match-beginning 1) (match-end 1)) + recipient-address-list)) + ) + recipient-address-list) + ) + (kill-buffer smtp-address-buffer)) + )) + +(defun smtp-do-bcc (header-end) + "Delete BCC: and their continuation lines from the header area. +There may be multiple BCC: lines, and each may have arbitrarily +many continuation lines." + (let ((case-fold-search t)) + (save-excursion + (goto-char (point-min)) + ;; iterate over all BCC: lines + (while (re-search-forward "^BCC:" header-end t) + (delete-region (match-beginning 0) (progn (forward-line 1) (point))) + ;; get rid of any continuation lines + (while (and (looking-at "^[ \t].*\n") (< (point) header-end)) + (replace-match "")) + ) + ) ;; save-excursion + ) ;; let + ) + +(provide 'smtp) + +;;; smtp.el ends here diff --git a/lisp/smtpmail.el b/lisp/smtpmail.el new file mode 100644 index 0000000..77a5947 --- /dev/null +++ b/lisp/smtpmail.el @@ -0,0 +1,285 @@ +;;; smtpmail.el --- simple SMTP protocol (RFC 821) for sending mail + +;; Copyright (C) 1995, 1996 Free Software Foundation, Inc. + +;; Author: Tomoji Kagatani +;; Maintainer: Brian D. Carlstrom +;; ESMTP support: Simon Leinen +;; Keywords: mail + +;; This file is part of GNU Emacs. + +;; GNU Emacs is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;;; Commentary: + +;; Send Mail to smtp host from smtpmail temp buffer. + +;; Please add these lines in your .emacs(_emacs). +;; +;;(setq send-mail-function 'smtpmail-send-it) +;;(setq smtp-default-server "YOUR SMTP HOST") +;;(setq smtp-service "smtp") +;;(setq smtp-local-domain "YOUR DOMAIN NAME") +;;(setq smtp-debug-info t) +;;(autoload 'smtpmail-send-it "smtpmail") +;;(setq user-full-name "YOUR NAME HERE") + +;; To queue mail, set smtpmail-queue-mail to t and use +;; smtpmail-send-queued-mail to send. + + +;;; Code: + +(require 'smtp) +(require 'sendmail) +(require 'time-stamp) + +;;; + +(defcustom smtpmail-queue-mail nil + "*Specify if mail is queued (if t) or sent immediately (if nil). +If queued, it is stored in the directory `smtpmail-queue-dir' +and sent with `smtpmail-send-queued-mail'." + :type 'boolean + :group 'smtp) + +(defcustom smtpmail-queue-dir "~/Mail/queued-mail/" + "*Directory where `smtpmail.el' stores queued mail." + :type 'directory + :group 'smtp) + +(defvar smtpmail-queue-index-file "index" + "File name of queued mail index, +This is relative to `smtpmail-queue-dir'.") + +(defvar smtpmail-queue-index (concat smtpmail-queue-dir + smtpmail-queue-index-file)) + +(defvar smtpmail-recipient-address-list nil) + + +;;; +;;; +;;; + +(defun smtpmail-send-it () + (require 'mail-utils) + (let ((errbuf (if mail-interactive + (generate-new-buffer " smtpmail errors") + 0)) + (tembuf (generate-new-buffer " smtpmail temp")) + (case-fold-search nil) + resend-to-addresses + delimline + (mailbuf (current-buffer))) + (unwind-protect + (save-excursion + (set-buffer tembuf) + (erase-buffer) + (insert-buffer-substring mailbuf) + (goto-char (point-max)) + ;; require one newline at the end. + (or (= (preceding-char) ?\n) + (insert ?\n)) + ;; Change header-delimiter to be what sendmail expects. + (goto-char (point-min)) + (re-search-forward + (concat "^" (regexp-quote mail-header-separator) "\n")) + (replace-match "\n") + (backward-char 1) + (setq delimline (point-marker)) +;; (sendmail-synch-aliases) + (if mail-aliases + (expand-mail-aliases (point-min) delimline)) + (goto-char (point-min)) + ;; ignore any blank lines in the header + (while (and (re-search-forward "\n\n\n*" delimline t) + (< (point) delimline)) + (replace-match "\n")) + (let ((case-fold-search t)) + (goto-char (point-min)) + (goto-char (point-min)) + (while (re-search-forward "^Resent-to:" delimline t) + (setq resend-to-addresses + (save-restriction + (narrow-to-region (point) + (save-excursion + (end-of-line) + (point))) + (append (mail-parse-comma-list) + resend-to-addresses)))) +;;; Apparently this causes a duplicate Sender. +;;; ;; If the From is different than current user, insert Sender. +;;; (goto-char (point-min)) +;;; (and (re-search-forward "^From:" delimline t) +;;; (progn +;;; (require 'mail-utils) +;;; (not (string-equal +;;; (mail-strip-quoted-names +;;; (save-restriction +;;; (narrow-to-region (point-min) delimline) +;;; (mail-fetch-field "From"))) +;;; (user-login-name)))) +;;; (progn +;;; (forward-line 1) +;;; (insert "Sender: " (user-login-name) "\n"))) + ;; Don't send out a blank subject line + (goto-char (point-min)) + (if (re-search-forward "^Subject:[ \t]*\n" delimline t) + (replace-match "")) + ;; Put the "From:" field in unless for some odd reason + ;; they put one in themselves. + (goto-char (point-min)) + (if (not (re-search-forward "^From:" delimline t)) + (let* ((login user-mail-address) + (fullname (user-full-name))) + (cond ((eq mail-from-style 'angles) + (insert "From: " fullname) + (let ((fullname-start (+ (point-min) 6)) + (fullname-end (point-marker))) + (goto-char fullname-start) + ;; Look for a character that cannot appear unquoted + ;; according to RFC 822. + (if (re-search-forward "[^- !#-'*+/-9=?A-Z^-~]" + fullname-end 1) + (progn + ;; Quote fullname, escaping specials. + (goto-char fullname-start) + (insert "\"") + (while (re-search-forward "[\"\\]" + fullname-end 1) + (replace-match "\\\\\\&" t)) + (insert "\"")))) + (insert " <" login ">\n")) + ((eq mail-from-style 'parens) + (insert "From: " login " (") + (let ((fullname-start (point))) + (insert fullname) + (let ((fullname-end (point-marker))) + (goto-char fullname-start) + ;; RFC 822 says \ and nonmatching parentheses + ;; must be escaped in comments. + ;; Escape every instance of ()\ ... + (while (re-search-forward "[()\\]" fullname-end 1) + (replace-match "\\\\\\&" t)) + ;; ... then undo escaping of matching parentheses, + ;; including matching nested parentheses. + (goto-char fullname-start) + (while (re-search-forward + "\\(\\=\\|[^\\]\\(\\\\\\\\\\)*\\)\\\\(\\(\\([^\\]\\|\\\\\\\\\\)*\\)\\\\)" + fullname-end 1) + (replace-match "\\1(\\3)" t) + (goto-char fullname-start)))) + (insert ")\n")) + ((null mail-from-style) + (insert "From: " login "\n"))))) + ;; Insert an extra newline if we need it to work around + ;; Sun's bug that swallows newlines. + (goto-char (1+ delimline)) + (if (eval mail-mailer-swallows-blank-line) + (newline)) + ;; Find and handle any FCC fields. + (goto-char (point-min)) + (if (re-search-forward "^FCC:" delimline t) + (mail-do-fcc delimline)) + (if mail-interactive + (save-excursion + (set-buffer errbuf) + (erase-buffer)))) + ;; + ;; + ;; + (setq smtpmail-recipient-address-list + (or resend-to-addresses + (smtp-deduce-address-list tembuf (point-min) delimline))) + + (smtp-do-bcc delimline) + ; Send or queue + (if (not smtpmail-queue-mail) + (if smtpmail-recipient-address-list + (if (not (smtp-via-smtp + smtpmail-recipient-address-list tembuf)) + (error "Sending failed; SMTP protocol error")) + (error "Sending failed; no recipients")) + (let* ((file-data (concat + smtpmail-queue-dir + (time-stamp-strftime + "%02y%02m%02d-%02H%02M%02S"))) + (file-elisp (concat file-data ".el")) + (buffer-data (create-file-buffer file-data)) + (buffer-elisp (create-file-buffer file-elisp)) + (buffer-scratch "*queue-mail*")) + (save-excursion + (set-buffer buffer-data) + (erase-buffer) + (insert-buffer tembuf) + (write-file file-data) + (set-buffer buffer-elisp) + (erase-buffer) + (insert (concat + "(setq smtpmail-recipient-address-list '" + (prin1-to-string smtpmail-recipient-address-list) + ")\n")) + (write-file file-elisp) + (set-buffer (generate-new-buffer buffer-scratch)) + (insert (concat file-data "\n")) + (append-to-file (point-min) + (point-max) + smtpmail-queue-index) + ) + (kill-buffer buffer-scratch) + (kill-buffer buffer-data) + (kill-buffer buffer-elisp)))) + (kill-buffer tembuf) + (if (bufferp errbuf) + (kill-buffer errbuf))))) + +(defun smtpmail-send-queued-mail () + "Send mail that was queued as a result of setting `smtpmail-queue-mail'." + (interactive) + ;;; Get index, get first mail, send it, get second mail, etc... + (let ((buffer-index (find-file-noselect smtpmail-queue-index)) + (file-msg "") + (tembuf nil)) + (save-excursion + (set-buffer buffer-index) + (beginning-of-buffer) + (while (not (eobp)) + (setq file-msg (buffer-substring (point) (save-excursion + (end-of-line) + (point)))) + (load file-msg) + (setq tembuf (find-file-noselect file-msg)) + (if smtpmail-recipient-address-list + (if (not (smtp-via-smtp smtpmail-recipient-address-list tembuf)) + (error "Sending failed; SMTP protocol error")) + (error "Sending failed; no recipients")) + (delete-file file-msg) + (delete-file (concat file-msg ".el")) + (kill-buffer tembuf) + (kill-line 1)) + (set-buffer buffer-index) + (save-buffer smtpmail-queue-index) + (kill-buffer buffer-index) + ))) + + +;;; + +(provide 'smtpmail) + +;;; smtpmail.el ends here diff --git a/texi/Makefile b/texi/Makefile deleted file mode 100644 index ea5ef8f..0000000 --- a/texi/Makefile +++ /dev/null @@ -1,161 +0,0 @@ -TEXI2DVI=texi2dvi -EMACS=emacs -MAKEINFO=$(EMACS) -batch -q -no-site-file -INFOSWI=-l texinfmt -f texinfo-every-node-update -f texinfo-format-buffer -f save-buffer -XINFOSWI=-l texinfmt -f texinfo-every-node-update -f texinfo-format-buffer -f save-buffer -LATEX=latex -DVIPS=dvips -PERL=perl -INFODIR=/usr/local/info - -all: gnus message - -most: texi2latex.elc latex latexps - -.SUFFIXES: .texi .dvi .ps - -.texi: - $(MAKEINFO) -eval '(find-file "$<")' $(XINFOSWI) - -dvi: gnus.dvi message.dvi - -.texi.dvi : - $(PERL) -n -e 'print unless (/\@iflatex/ .. /\@end iflatex/)' $< > gnustmp.texi - $(TEXI2DVI) gnustmp.texi - cp gnustmp.dvi $*.dvi - rm gnustmp.* - -refcard.dvi: refcard.tex gnuslogo.refcard gnusref.tex - $(LATEX) refcard.tex - -clean: - rm -f gnus.*.bak *.ky *.cp *.fn *.cps *.kys *.log *.aux *.dvi *.vr \ - *.tp *.toc *.pg gnus.latexi *.aux *.[cgk]idx \ - gnus.ilg gnus.ind gnus.[cgk]ind gnus.idx \ - gnus.tmptexi *.tmplatexi gnus.tmplatexi1 texput.log *.orig *.rej \ - gnus.latexi*~* tmp/*.ps xface.tex picons.tex smiley.tex *.latexi - -makeinfo: - makeinfo -o gnus gnus.texi - makeinfo -o message message.texi - -texi2latex.elc: texi2latex.el - $(EMACS) -batch -l bytecomp --eval '(byte-compile-file "texi2latex.el")' - -latex: gnus.texi texi2latex.elc - $(EMACS) -batch -q -no-site-file gnus.texi -l ./texi2latex.elc -f latexi-translate - -latexps: - make texi2latex.elc - rm -f gnus.aux - egrep -v "label.*Index|chapter.*Index" gnus.latexi > gnus.tmplatexi1 - $(LATEX) gnus.tmplatexi1 - ./splitindex - makeindex -o gnus.kind gnus.kidx - makeindex -o gnus.cind gnus.cidx - makeindex -o gnus.gind gnus.gidx - sed 's/\\char 5E\\relax {}/\\symbol{"5E}/' < gnus.kind > gnus.tmpkind - mv gnus.tmpkind gnus.kind - egrep -v "end{document}" gnus.tmplatexi1 > gnus.tmplatexi - cat postamble.tex >> gnus.tmplatexi - $(LATEX) gnus.tmplatexi - $(LATEX) gnus.tmplatexi - $(DVIPS) -f gnus.dvi > gnus.ps - -pss: - make latex - make latexps - -psout: - make latex - make latexboth - make out - -latexboth: - rm -f gnus-manual-a4.ps.gz gnus-manual-standard.ps.gz - make latexps - mv /local/tmp/larsi/gnus.ps /local/tmp/larsi/gnus-manual-a4.ps - gzip /local/tmp/larsi/gnus-manual-a4.ps - sed 's/,a4paper//' gnus.latexi > gnus-standard.latexi - mv gnus-standard.latexi gnus.latexi - make latexps - mv /local/tmp/larsi/gnus.ps /local/tmp/larsi/gnus-manual-standard.ps - gzip /local/tmp/larsi/gnus-manual-standard.ps - -out: - cp /local/tmp/larsi/gnus-manual-standard.ps.gz \ - /local/tmp/larsi/gnus-manual-a4.ps.gz \ - /local/ftp/pub/emacs/gnus/manual - mv /local/tmp/larsi/gnus-manual-standard.ps.gz \ - /local/tmp/larsi/gnus-manual-a4.ps.gz \ - /hom/larsi/www_docs/www.gnus.org/documents - -veryclean: - make clean - rm -f gnus.dvi gnus.ps - -distclean: - make clean - rm -f *.orig *.rej *.elc *~ gnus gnus-[0-9] gnus-[0-9][0-9] - rm -f message message-[0-9] - -install: - cp gnus gnus-[0-9] gnus-[0-9][0-9] $(INFODIR) - cp message $(INFODIR) - - -tmps: - if [ ! -e tmp ]; then mkdir tmp; fi - make screens - make herdss - make etcs - make piconss - make xfaces - make smiley - make miscs - -herdss: - cd herds ; for i in new-herd-[0-9]*.gif; do echo $$i; giftopnm $$i | pnmcrop -white | pnmmargin -white 9 | pnmscale 2 | pnmconvol convol5.pnm | ppmtopgm | pnmdepth 255 | pnmtops -width 100 -height 100 -noturn > ../tmp/`basename $$i .gif`.ps; done - cd herds ; giftopnm new-herd-section.gif | pnmscale 4 | pnmconvol convol11.pnm | ppmtopgm | pnmdepth 255 | pnmtops -noturn -width 100 -height 100 > ../tmp/new-herd-section.ps - - -screens: - cd screen ; for i in *.gif; do echo $$i; giftopnm $$i | pnmmargin -black 1 | ppmtopgm | pnmtops -width 100 -height 100 -noturn > ../tmp/`basename $$i .gif`.ps; done - -miscs: - giftopnm misc/larsi.gif | ppmtopgm | pnmtops -noturn > tmp/larsi.ps - tifftopnm misc/eseptember.tif | pnmscale 4 | ppmtopgm | pnmtops -noturn -width 100 -height 100 > tmp/september.ps - tifftopnm misc/fseptember.tif | pnmscale 2 | ppmtopgm | pnmtops -noturn -width 100 -height 100 > tmp/fseptember.ps - tifftopnm misc/fred.tif | pnmscale 2 | ppmtopgm | pnmtops -noturn -width 100 -height 100 > tmp/fred.ps - tifftopnm misc/ered.tif | pnmscale 2 | ppmtopgm | pnmtops -noturn -width 100 -height 100 > tmp/red.ps - -etcs: - cd etc; for i in gnus-*.xpm; do echo $$i; xpmtoppm $$i | ppmtopgm | pnmdepth 255 | pnmtops -noturn > ../tmp/`basename $$i .xpm`.ps; done - -piconss: - cd picons; for i in *.xbm; do echo $$i; xbmtopbm $$i | pnmtops -noturn > ../tmp/picons-`basename $$i .xbm`.ps; done - cd picons; for i in *.gif; do echo $$i; giftopnm $$i | ppmtopgm | pnmtops -noturn > ../tmp/picons-`basename $$i .gif`.ps; done - for i in tmp/picons-*.ps; do echo "\\gnuspicon{$$i}"; done > picons.tex - -xfaces: - cd xface; for i in *.gif; do echo $$i; giftopnm $$i | ppmtopgm | pnmtops -noturn > ../tmp/xface-`basename $$i .gif`.ps; done - for i in tmp/xface-*.ps; do \ - if [ -n "$$a" ]; then a=""; echo "{$$i}"; else \ - a="h"; echo -n "\\gnusxface{$$i}"; fi done > xface.tex; \ - if [ -n "$$a" ]; then echo "{$$i}" >> xface.tex; fi - -smiley: - cd smilies; tifftopnm BigFace.tif | ppmtopgm | pnmtops > ../tmp/BigFace.ps - cd smilies; for i in *.xpm; do echo $$i; sed "s/none/#FFFFFF/" $$i | xpmtoppm | ppmtopgm | pnmdepth 255 | pnmtops > ../tmp/smiley-`basename $$i .xpm`.ps; done - for i in tmp/smiley-*.ps; do \ - if [ -n "$$a" ]; then a=""; echo "{$$i}"; else \ - a="h"; echo -n "\\gnussmiley{$$i}"; fi done > smiley.tex; \ - if [ -n "$$a" ]; then echo "{$$i}" >> smiley.tex; fi - -pspackage: - tar czvf pspackage.tar.gz gnus-faq.texi gnus.texi herds misc pagestyle.sty picons pixidx.sty postamble.tex ps screen smilies splitindex texi2latex.el xface Makefile README etc - -complete: - make texi2latex.elc - make tmps - make pss diff --git a/texi/custom.texi b/texi/custom.texi deleted file mode 100644 index 5b6fe4a..0000000 --- a/texi/custom.texi +++ /dev/null @@ -1,695 +0,0 @@ -\input texinfo.tex - -@c %**start of header -@setfilename custom -@settitle The Customization Library -@iftex -@afourpaper -@headings double -@end iftex -@c %**end of header - -@node Top, Introduction, (dir), (dir) -@comment node-name, next, previous, up -@top The Customization Library - -Version: 1.82 - -@menu -* Introduction:: -* User Commands:: -* The Customization Buffer:: -* Declarations:: -* Utilities:: -* The Init File:: -* Wishlist:: -@end menu - -@node Introduction, User Commands, Top, Top -@comment node-name, next, previous, up -@section Introduction - -This library allows customization of @dfn{user options}. Currently two -types of user options are supported, namely @dfn{variables} and -@dfn{faces}. Each user option can have four different values -simultaneously: -@table @dfn -@item factory setting -The value specified by the programmer. -@item saved value -The value saved by the user as the default for this variable. This -overwrites the factory setting when starting a new emacs. -@item current value -The value used by Emacs. This will not be remembered next time you -run Emacs. -@item widget value -The value entered by the user in a customization buffer, but not yet -applied. -@end table - -Variables also have a @dfn{type}, which specifies what kind of values -the variable can hold, and how the value is presented in a customization -buffer. By default a variable can hold any valid expression, but the -programmer can specify a more limited type when declaring the variable. - -The user options are organized in a number of @dfn{groups}. Each group -can contain a number user options, as well as other groups. The groups -allows the user to concentrate on a specific part of emacs. - -@node User Commands, The Customization Buffer, Introduction, Top -@comment node-name, next, previous, up -@section User Commands - -The following commands will create a customization buffer: - -@table @code -@item customize -Create a customization buffer containing a specific group, by default -the @code{emacs} group. - -@item customize-variable -Create a customization buffer containing a single variable. - -@item customize-face -Create a customization buffer containing a single face. - -@item customize-apropos -Create a customization buffer containing all variables, faces, and -groups that match a user specified regular expression. -@end table - -@node The Customization Buffer, Declarations, User Commands, Top -@comment node-name, next, previous, up -@section The Customization Buffer. - -The customization buffer allows the user to make temporary or permanent -changes to how specific aspects of emacs works, by setting and editing -user options. - -The customization buffer contains three types of text: - -@table @dfn -@item informative text -where the normal editing commands are disabled. - -@item editable fields -where you can edit with the usual emacs commands. Editable fields are -usually displayed with a grey background if your terminal supports -colors, or an italic font otherwise. - -@item buttons -which can be activated by either pressing the @kbd{@key{ret}} while -point is located on the text, or pushing @kbd{mouse-2} while the mouse -pointer is above the tex. Buttons are usually displayed in a bold -font. -@end table - -You can move to the next the next editable field or button by pressing -@kbd{@key{tab}} or the previous with @kbd{M-@key{tab}}. Some buttons -have a small helpful message about their purpose, which will be -displayed when you move to it with the @key{tab} key. - -The buffer is divided into three part, an introductory text, a list of -customization options, and a line of customization buttons. Each part -will be described in the following. - -@menu -* The Introductory Text:: -* The Customization Options:: -* The Variable Options:: -* The Face Options:: -* The Group Options:: -* The State Button:: -* The Customization Buttons:: -@end menu - -@node The Introductory Text, The Customization Options, The Customization Buffer, The Customization Buffer -@comment node-name, next, previous, up -@subsection The Introductory Text - -The start of the buffer contains a short explanation of what it is, and -how to get help. It will typically look like this: - -@example -This is a customization buffer. -Push RET or click mouse-2 on the word _help_ for more information. -@end example - -Rather boring. It is mostly just informative text, but the word -@samp{help} is a button that will bring up this document when -activated. - -@node The Customization Options, The Variable Options, The Introductory Text, The Customization Buffer -@comment node-name, next, previous, up -@subsection The Customization Options - -Each customization option looks similar to the following text: - -@example - *** custom-background-mode: default - State: this item is unchanged from its factory setting. - [ ] [?] The brightness of the background. -@end example - -The option contains the parts described below. - -@table @samp -@item *** -The Level Button. The customization options in the buffer are organized -in a hierarchy, which is indicated by the number of stars in the level -button. The top level options will be shown as @samp{*}. When they are -expanded, the suboptions will be shown as @samp{**}. The example option -is thus a subsuboption. - -Activating the level buttons will toggle between hiding and exposing the -content of that option. The content can either be the value of the -option, as in this example, or a list of suboptions. - -@item custom-background-mode -This is the tag of the the option. The tag is a name of a variable, a -face, or customization group. Activating the tag has an effect that -depends on the exact type of the option. In this particular case, -activating the tag will bring up a menu that will allow you to choose -from the three possible values of the `custom-background-mode' -variable. - -@item default -After the tag, the options value is shown. Depending on its type, you -may be able to edit the value directly. If an option should contain a -file name, it is displayed in an editable field, i.e. you can edit it -using the standard emacs editing commands. - -@item State: this item is unchanged from its factory setting. -The state line. This line will explain the state of the option, -e.g. whether it is currently hidden, or whether it has been modified or -not. Activating the button will allow you to change the state, e.g. set -or reset the changes you have made. This is explained in detail in the -following sections. - -@item [ ] -The magic button. This is an abbreviated version of the state line. - -@item [?] -The documentation button. If the documentation is more than one line, -this button will be present. Activating the button will toggle whether -the complete documentation is shown, or only the first line. - -@item The brightness of the background. -This is a documentation string explaining the purpose of this particular -customization option. - -@end table - -@node The Variable Options, The Face Options, The Customization Options, The Customization Buffer -@comment node-name, next, previous, up -@subsection The Variable Options - -The most common customization options are emacs lisp variables. The -actual editing of these variables depend on what type values the -variable is expected to contain. For example, a lisp variable whose -value should be a string will typically be represented with an editable -text field in the buffer, where you can change the string directly. If -the value is a list, each item in the list will be presented in the -buffer buffer on a separate line, with buttons to insert new items in -the list, or delete existing items from the list. You may want to see -@ref{User Interface,,, widget, The Widget Library}, where some examples -of editing are discussed. - -You can either choose to edit the value directly, or edit the lisp -value for that variable. The lisp value is a lisp expression that -will be evaluated when you start emacs. The result of the evaluation -will be used as the initial value for that variable. Editing the -lisp value is for experts only, but if the current value of the -variable is of a wrong type (i.e. a symbol where a string is expected), -the `edit lisp' mode will always be selected. - -You can see what mode is currently selected by looking at the state -button. If it uses parenthesises (like @samp{( )}) it is in edit lisp -mode, with square brackets (like @samp{[ ]}) it is normal edit mode. -You can switch mode by activating the state button, and select either -@samp{Edit} or @samp{Edit lisp} from the menu. - -You can change the state of the variable with the other menu items: - -@table @samp -@item Set -When you have made your modifications in the buffer, you need to -activate this item to make the modifications take effect. The -modifications will be forgotten next time you run emacs. - -@item Save -Unless you activate this item instead! This will mark the modification -as permanent, i.e. the changes will be remembered in the next emacs -session. - -@item Reset -If you have made some modifications and not yet applied them, you can -undo the modification by activating this item. - -@item Reset to Saved -Activating this item will reset the value of the variable to the last -value you marked as permanent with `Save'. - -@item Reset to Factory Settings -Activating this item will undo all modifications you have made, and -reset the value to the initial value specified by the program itself. -@end table - -By default, the value of large or complicated variables are hidden. You -can show the value by clicking on the level button. - -@node The Face Options, The Group Options, The Variable Options, The Customization Buffer -@comment node-name, next, previous, up -@subsection The Face Options - -A face is an object that controls the appearance of some buffer text. -The face has a number of possible attributes, such as boldness, -foreground color, and more. For each attribute you can specify whether -this attribute is controlled by the face, and if so, what the value is. -For example, if the attribute bold is not controlled by a face, using -that face on some buffer text will not affect its boldness. If the bold -attribute is controlled by the face, it can be turned either on or of. - -It is possible to specify that a face should have different attributes -on different device types. For example, a face may make text red on a -color device, and bold on a monochrome device. You do this by -activating `Edit All' in the state menu. - -The way this is presented in the customization buffer is to have a list -of display specifications, and for each display specification a list of -face attributes. For each face attribute, there is a checkbox -specifying whether this attribute has effect and what the value is. -Here is an example: - -@example - *** custom-invalid-face: (sample) - State: this item is unchanged from its factory setting. - [ ] Face used when the customize item is invalid. - [INS] [DEL] Display: [ ] Type: [ ] X [ ] PM [ ] Win32 [ ] DOS [ ] TTY - [X] Class: [X] Color [ ] Grayscale [ ] Monochrome - [ ] Background: [ ] Light [ ] Dark - Attributes: [ ] Bold: off - [ ] Italic: off - [ ] Underline: off - [X] Foreground: yellow (sample) - [X] Background: red (sample) - [ ] Stipple: - [INS] [DEL] Display: all - Attributes: [X] Bold: on - [X] Italic: on - [X] Underline: on - [ ] Foreground: default (sample) - [ ] Background: default (sample) - [ ] Stipple: - [INS] -@end example - -This has two display specifications. The first will match all color -displays, independently on what window system the device belongs to, and -whether background color is dark or light. For devices matching this -specification, @samp{custom-invalid-face} will force text to be -displayed in yellow on red, but leave all other attributes alone. - -The second display will simply match everything. Since the list is -prioritised, this means that it will match all non-color displays. For -these, the face will not affect the foreground or background color, but -force the font to be both bold, italic, and underline. - -You can add or delete display specifications by activating the -@samp{[INS]} and @samp{[DEL]} buttons, and modify them by clicking on -the check boxes. The first checkbox in each line in the display -specification is special. It specify whether this particular property -will even be relevant. By not checking the box in the first display, we -match all device types, also device types other than those listed. - -After modifying the face, you can activate the state button to make the -changes take effect. The menu items in the state button menu is similar -to the state menu items for variables described in the previous section. - -@node The Group Options, The State Button, The Face Options, The Customization Buffer -@comment node-name, next, previous, up -@subsection The Group Options - -Since Emacs has approximately a zillion configuration options, they have -been organized in groups. Each group can contain other groups, thus -creating a customization hierarchy. The nesting of the customization -within the visible part of this hierarchy is indicated by the number of -stars in the level button. - -Since there is really no customization needed for the group itself, the -menu items in the groups state button will affect all modified group -members recursively. Thus, if you activate the @samp{Set} menu item, -all variables and faces that have been modified and belong to that group -will be applied. For those members that themselves are groups, it will -work as if you had activated the @samp{Set} menu item on them as well. - -@node The State Button, The Customization Buttons, The Group Options, The Customization Buffer -@comment node-name, next, previous, up -@subsection The State Line and The Magic Button - -The state line has two purposes. The first is to hold the state menu, -as described in the previous sections. The second is to indicate the -state of each customization item. - -For the magic button, this is done by the character inside the brackets. -The following states have been defined, the first that applies to the -current item will be used: - -@table @samp -@item - -The option is currently hidden. For group options that means the -members are not shown, for variables and faces that the value is not -shown. You cannot perform any of the state change operations on a -hidden customization option. - -@item * -The value if this option has been modified in the buffer, but not yet -applied. - -@item + -The item has has been set by the user. - -@item : -The current value of this option is different from the saved value. - -@item ! -The saved value of this option is different from the factory setting. - -@item @@ -The factory setting of this option is not known. This occurs when you -try to customize variables or faces that have not been explicitly -declared as customizable. - -@item SPC -The factory setting is still in effect. - -@end table - -For non-hidden group options, the state shown is the most severe state -of its members, where more severe means that it appears earlier in the -list above (except hidden members, which are ignored). - -@node The Customization Buttons, , The State Button, The Customization Buffer -@comment node-name, next, previous, up -@subsection The Customization Buttons - -The last part of the customization buffer looks like this: - -@example -[Set] [Save] [Reset] [Done] -@end example - -Activating the @samp{[Set]}, @samp{[Save]}, or @samp{[Reset]} -button will affect all modified customization items that are visible in -the buffer. @samp{[Done]} will bury the buffer. - -@node Declarations, Utilities, The Customization Buffer, Top -@comment node-name, next, previous, up -@section Declarations - -This section describes how to declare customization groups, variables, -and faces. It doesn't contain any examples, but please look at the file -@file{cus-edit.el} which contains many declarations you can learn from. - -@menu -* Declaring Groups:: -* Declaring Variables:: -* Declaring Faces:: -* Usage for Package Authors:: -@end menu - -All the customization declarations can be changes by keyword arguments. -Groups, variables, and faces all share these common keywords: - -@table @code -@item :group -@var{value} should be a customization group. -Add @var{symbol} to that group. -@item :link -@var{value} should be a widget type. -Add @var{value} to the extrenal links for this customization option. -Useful widget types include @code{custom-manual}, @code{info-link}, and -@code{url-link}. -@item :load -Add @var{value} to the files that should be loaded nefore displaying -this customization option. The value should be iether a string, which -should be a string which will be loaded with @code{load-library} unless -present in @code{load-history}, or a symbol which will be loaded with -@code{require}. -@item :tag -@var{Value} should be a short string used for identifying the option in -customization menus and buffers. By default the tag will be -automatically created from the options name. -@end table - -@node Declaring Groups, Declaring Variables, Declarations, Declarations -@comment node-name, next, previous, up -@subsection Declaring Groups - -Use @code{defgroup} to declare new customization groups. - -@defun defgroup symbol members doc [keyword value]... -Declare @var{symbol} as a customization group containing @var{members}. -@var{symbol} does not need to be quoted. - -@var{doc} is the group documentation. - -@var{members} should be an alist of the form ((@var{name} -@var{widget})...) where @var{name} is a symbol and @var{widget} is a -widget for editing that symbol. Useful widgets are -@code{custom-variable} for editing variables, @code{custom-face} for -editing faces, and @code{custom-group} for editing groups.@refill - -Internally, custom uses the symbol property @code{custom-group} to keep -track of the group members, and @code{group-documentation} for the -documentation string. - -The following additional @var{keyword}'s are defined: - -@table @code -@item :prefix -@var{value} should be a string. If the string is a prefix for the name -of a member of the group, that prefix will be ignored when creating a -tag for that member. -@end table -@end defun - -@node Declaring Variables, Declaring Faces, Declaring Groups, Declarations -@comment node-name, next, previous, up -@subsection Declaring Variables - -Use @code{defcustom} to declare user editable variables. - -@defun defcustom symbol value doc [keyword value]... -Declare @var{symbol} as a customizable variable that defaults to @var{value}. -Neither @var{symbol} nor @var{value} needs to be quoted. -If @var{symbol} is not already bound, initialize it to @var{value}. - -@var{doc} is the variable documentation. - -The following additional @var{keyword}'s are defined: - -@table @code -@item :type -@var{value} should be a widget type. -@item :options -@var{value} should be a list of possible members of the specified type. -For hooks, this is a list of function names. -@end table - -@xref{Sexp Types,,,widget,The Widget Library}, for information about -widgets to use together with the @code{:type} keyword. -@end defun - -Internally, custom uses the symbol property @code{custom-type} to keep -track of the variables type, @code{factory-value} for the program -specified default value, @code{saved-value} for a value saved by the -user, and @code{variable-documentation} for the documentation string. - -Use @code{custom-add-option} to specify that a specific function is -useful as an meber of a hook. - -@defun custom-add-option symbol option -To the variable @var{symbol} add @var{option}. - -If @var{symbol} is a hook variable, @var{option} should be a hook -member. For other types variables, the effect is undefined." -@end defun - -@node Declaring Faces, Usage for Package Authors, Declaring Variables, Declarations -@comment node-name, next, previous, up -@subsection Declaring Faces - -Faces are declared with @code{defface}. - -@defun defface face spec doc [keyword value]... - -Declare @var{face} as a customizable face that defaults to @var{spec}. -@var{face} does not need to be quoted. - -If @var{face} has been set with `custom-set-face', set the face attributes -as specified by that function, otherwise set the face attributes -according to @var{spec}. - -@var{doc} is the face documentation. - -@var{spec} should be an alist of the form @samp{((@var{display} @var{atts})...)}. - -@var{atts} is a list of face attributes and their values. The possible -attributes are defined in the variable `custom-face-attributes'. -Alternatively, @var{atts} can be a face in which case the attributes of -that face is used. - -The @var{atts} of the first entry in @var{spec} where the @var{display} -matches the frame should take effect in that frame. @var{display} can -either be the symbol `t', which will match all frames, or an alist of -the form @samp{((@var{req} @var{item}...)...)}@refill - -For the @var{display} to match a FRAME, the @var{req} property of the -frame must match one of the @var{item}. The following @var{req} are -defined:@refill - -@table @code -@item type -(the value of (window-system))@* -Should be one of @code{x} or @code{tty}. - -@item class -(the frame's color support)@* -Should be one of @code{color}, @code{grayscale}, or @code{mono}. - -@item background -(what color is used for the background text)@* -Should be one of @code{light} or @code{dark}. -@end table - -Internally, custom uses the symbol property @code{factory-face} for the -program specified default face properties, @code{saved-face} for -properties saved by the user, and @code{face-doc-string} for the -documentation string.@refill - -@end defun - -@node Usage for Package Authors, , Declaring Faces, Declarations -@comment node-name, next, previous, up -@subsection Usage for Package Authors - -The recommended usage for the author of a typical emacs lisp package is -to create one group identifying the package, and make all user options -and faces members of that group. If the package has more than around 20 -such options, they should be divided into a number of subgroups, with -each subgroup being member of the top level group. - -The top level group for the package should itself be member of one or -more of the standard customization groups. There exists a group for -each @emph{finder} keyword. Press @kbd{C-c p} to see a list of finder -keywords, and add you group to each of them, using the @code{:group} -keyword. - -@node Utilities, The Init File, Declarations, Top -@comment node-name, next, previous, up -@section Utilities - -These utilities can come in handy when adding customization support. - -@deffn Widget custom-manual -Widget type for specifying the info manual entry for a customization -option. It takes one argument, an info address. -@end deffn - -@defun custom-add-to-group group member widget -To existing @var{group} add a new @var{member} of type @var{widget}, -If there already is an entry for that member, overwrite it. -@end defun - -@defun custom-add-link symbol widget -To the custom option @var{symbol} add the link @var{widget}. -@end defun - -@defun custom-add-load symbol load -To the custom option @var{symbol} add the dependency @var{load}. -@var{load} should be either a library file name, or a feature name. -@end defun - -@defun custom-menu-create symbol &optional name -Create menu for customization group @var{symbol}. -If optional @var{name} is given, use that as the name of the menu. -Otherwise make up a name from @var{symbol}. -The menu is in a format applicable to @code{easy-menu-define}. -@end defun - -@node The Init File, Wishlist, Utilities, Top -@comment node-name, next, previous, up -@section The Init File - -When you save the customizations, call to @code{custom-set-variables}, -@code{custom-set-faces} are inserted into the file specified by -@code{custom-file}. By default @code{custom-file} is your @file{.emacs} -file. If you use another file, you must explicitly load it yourself. -The two functions will initialize variables and faces as you have -specified. - -@node Wishlist, , The Init File, Top -@comment node-name, next, previous, up -@section Wishlist - -@itemize @bullet -@item -The menu items should be grayed out when the information is -missing. I.e. if a variable doesn't have a factory setting, the user -should not be allowed to select the @samp{Factory} menu item. - -@item -Better support for keyboard operations in the customize buffer. - -@item -Integrate with @file{w3} so you can customization buffers with much -better formatting. I'm thinking about adding a name -tag. The latest w3 have some support for this, so come up with a -convincing example. - -@item -Add an `examples' section, with explained examples of custom type -definitions. - -@item -Support selectable color themes. I.e., change many faces by setting one -variable. - -@item -Support undo using lmi's @file{gnus-undo.el}. - -@item -Make it possible to append to `choice', `radio', and `set' options. - -@item -Make it possible to customize code, for example to enable or disable a -global minor mode. - -@item -Ask whether set or modified variables should be saved in -@code{kill-buffer-hook}. - -Ditto for @code{kill-emacs-query-functions}. - -@item -Command to check if there are any customization options that -does not belong to an existing group. - -@item -Optionally disable the point-cursor and instead highlight the selected -item in XEmacs. This is like the *Completions* buffer in XEmacs. -Suggested by Jens Lautenbacher -@samp{}.@refill - -@item -Empty customization groups should start open (harder than it looks). - -@item -Make it possible to include a comment/remark/annotation when saving an -option. - -@end itemize - -@contents -@bye diff --git a/texi/gnus-ja.texi b/texi/gnus-ja.texi new file mode 100644 index 0000000..f3f6a16 --- /dev/null +++ b/texi/gnus-ja.texi @@ -0,0 +1,979 @@ +\input texinfo @c -*-texinfo-*- + +@setfilename gnus-ja +@settitle Semi-gnus 6.1.2 Manual +@synindex fn cp +@synindex vr cp +@synindex pg cp +@c @direntry +@c * Gnus-ja: (gnus-ja). The news reader gnus ($BF|K\8lHG(B). +@c @end direntry +@iftex +@finalout +@end iftex +@setchapternewpage odd + +@iftex +@iflatex +\documentclass[twoside,a4paper,openright,11pt]{book} +\usepackage[latin1]{inputenc} +\usepackage{pagestyle} +\usepackage{epsfig} +\usepackage{bembo} +\usepackage{pixidx} + +\makeindex +\begin{document} + +\newcommand{\gnuschaptername}{} +\newcommand{\gnussectionname}{} + +\newcommand{\gnusbackslash}{/} + +\newcommand{\gnusxref}[1]{See ``#1'' on page \pageref{#1}} +\newcommand{\gnuspxref}[1]{see ``#1'' on page \pageref{#1}} + +\newcommand{\gnuskindex}[1]{\index{#1}} +\newcommand{\gnusindex}[1]{\index{#1}} + +\newcommand{\gnustt}[1]{{\fontfamily{pfu}\fontsize{10pt}{10}\selectfont #1}} +\newcommand{\gnuscode}[1]{\gnustt{#1}} +\newcommand{\gnussamp}[1]{``{\fontencoding{OT1}\fontfamily{pfu}\fontsize{10pt}{10}\selectfont #1}''} +\newcommand{\gnuslisp}[1]{\gnustt{#1}} +\newcommand{\gnuskbd}[1]{`\gnustt{#1}'} +\newcommand{\gnusfile}[1]{`\gnustt{#1}'} +\newcommand{\gnusdfn}[1]{\textit{#1}} +\newcommand{\gnusi}[1]{\textit{#1}} +\newcommand{\gnusstrong}[1]{\textbf{#1}} +\newcommand{\gnusemph}[1]{\textit{#1}} +\newcommand{\gnusvar}[1]{{\fontsize{10pt}{10}\selectfont\textsl{\textsf{#1}}}} +\newcommand{\gnussc}[1]{\textsc{#1}} +\newcommand{\gnustitle}[1]{{\huge\textbf{#1}}} +\newcommand{\gnusauthor}[1]{{\large\textbf{#1}}} + +\newcommand{\gnusbullet}{{${\bullet}$}} +\newcommand{\gnusdollar}{\$} +\newcommand{\gnusampersand}{\&} +\newcommand{\gnuspercent}{\%} +\newcommand{\gnushash}{\#} +\newcommand{\gnushat}{\symbol{"5E}} +\newcommand{\gnusunderline}{\symbol{"5F}} +\newcommand{\gnusnot}{$\neg$} +\newcommand{\gnustilde}{\symbol{"7E}} +\newcommand{\gnusless}{{$<$}} +\newcommand{\gnusgreater}{{$>$}} + +\newcommand{\gnushead}{\raisebox{-1cm}{\epsfig{figure=ps/gnus-head.eps,height=1cm}}} +\newcommand{\gnusinteresting}{ +\marginpar[\mbox{}\hfill\gnushead]{\gnushead} +} + +\newcommand{\gnuscleardoublepage}{\ifodd\count0\mbox{}\clearpage\thispagestyle{empty}\mbox{}\clearpage\else\clearpage\fi} + +\newcommand{\gnuspagechapter}[1]{ +{\mbox{}} +} + +\newdimen{\gnusdimen} +\gnusdimen 0pt + +\newcommand{\gnuschapter}[2]{ +\gnuscleardoublepage +\ifdim \gnusdimen = 0pt\setcounter{page}{1}\pagestyle{gnus}\pagenumbering{arabic} \gnusdimen 1pt\fi +\chapter{#2} +\renewcommand{\gnussectionname}{} +\renewcommand{\gnuschaptername}{#2} +\thispagestyle{empty} +\hspace*{-2cm} +\begin{picture}(500,500)(0,0) +\put(480,350){\makebox(0,0)[tr]{#1}} +\put(40,300){\makebox(500,50)[bl]{{\Huge\bf{#2}}}} +\end{picture} +\clearpage +} + +\newcommand{\gnusfigure}[3]{ +\begin{figure} +\mbox{}\ifodd\count0\hspace*{-0.8cm}\else\hspace*{-3cm}\fi\begin{picture}(440,#2) +#3 +\end{picture} +\caption{#1} +\end{figure} +} + +\newcommand{\gnusicon}[1]{ +\marginpar[\mbox{}\hfill\raisebox{-1.5cm}{\epsfig{figure=tmp/#1-up.ps,height=1.5cm}}]{\raisebox{-1cm}{\epsfig{figure=tmp/#1-up.ps,height=1cm}}} +} + +\newcommand{\gnuspicon}[1]{ +\margindex{\epsfig{figure=#1,width=2cm}} +} + +\newcommand{\gnusxface}[2]{ +\margindex{\epsfig{figure=#1,width=1cm}\epsfig{figure=#2,width=1cm}} +} + +\newcommand{\gnussmiley}[2]{ +\margindex{\makebox[2cm]{\hfill\epsfig{figure=#1,width=0.5cm}\hfill\epsfig{figure=#2,width=0.5cm}\hfill}} +} + +\newcommand{\gnusitemx}[1]{\mbox{}\vspace*{-\itemsep}\vspace*{-\parsep}\item#1} + +\newcommand{\gnussection}[1]{ +\renewcommand{\gnussectionname}{#1} +\section{#1} +} + +\newenvironment{codelist}% +{\begin{list}{}{ +} +}{\end{list}} + +\newenvironment{kbdlist}% +{\begin{list}{}{ +\labelwidth=0cm +} +}{\end{list}} + +\newenvironment{dfnlist}% +{\begin{list}{}{ +} +}{\end{list}} + +\newenvironment{stronglist}% +{\begin{list}{}{ +} +}{\end{list}} + +\newenvironment{samplist}% +{\begin{list}{}{ +} +}{\end{list}} + +\newenvironment{varlist}% +{\begin{list}{}{ +} +}{\end{list}} + +\newenvironment{emphlist}% +{\begin{list}{}{ +} +}{\end{list}} + +\newlength\gnusheadtextwidth +\setlength{\gnusheadtextwidth}{\headtextwidth} +\addtolength{\gnusheadtextwidth}{1cm} + +\newpagestyle{gnuspreamble}% +{ +{ +\ifodd\count0 +{ +\hspace*{-0.23cm}\underline{\makebox[\gnusheadtextwidth]{\mbox{}}\textbf{\hfill\roman{page}}} +} +\else +{ +\hspace*{-3.25cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\roman{page}\hfill\mbox{}}} +} +} +\fi +} +} +{ +\ifodd\count0 +\mbox{} \hfill +\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}} +\else +\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}} +\hfill \mbox{} +\fi +} + +\newpagestyle{gnusindex}% +{ +{ +\ifodd\count0 +{ +\hspace*{-0.23cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\gnuschaptername\hfill\arabic{page}}}} +} +\else +{ +\hspace*{-3.25cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{page}\hfill\gnuschaptername}}} +} +\fi +} +} +{ +\ifodd\count0 +\mbox{} \hfill +\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}} +\else +\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}} +\hfill \mbox{} +\fi +} + +\newpagestyle{gnus}% +{ +{ +\ifodd\count0 +{ +\makebox[12cm]{\hspace*{3.1cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{chapter}.\arabic{section}} \textbf{\gnussectionname\hfill\arabic{page}}}}} +} +\else +{ +\makebox[12cm]{\hspace*{-2.95cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{page}\hfill\gnuschaptername}}}} +} +\fi +} +} +{ +\ifodd\count0 +\mbox{} \hfill +\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}} +\else +\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}} +\hfill \mbox{} +\fi +} + +\pagenumbering{roman} +\pagestyle{gnuspreamble} + +@end iflatex +@end iftex + +@iftex +@iflatex +\begin{titlepage} +{ + +%\addtolength{\oddsidemargin}{-5cm} +%\addtolength{\evensidemargin}{-5cm} +\parindent=0cm +\addtolength{\textheight}{2cm} + +\gnustitle{\gnustitlename}\\ +\rule{15cm}{1mm}\\ +\vfill +\hspace*{0cm}\epsfig{figure=ps/gnus-big-logo.eps,height=15cm} +\vfill +\rule{15cm}{1mm}\\ +\gnusauthor{by Lars Magne Ingebrigtsen} +\newpage +} + +\mbox{} +\vfill + +\thispagestyle{empty} + +Copyright \copyright{} 1995,96,97 Free Software Foundation, Inc. + +Permission is granted to make and distribute verbatim copies of +this manual provided the copyright notice and this permission notice +are preserved on all copies. + +$BCx:n8"I=<($H$3$N5v2DJ8$,$9$Y$F$NJ#@=$KB8:_$9$k8B$j!"$3$N@bL@=q$N$^$C$?$/(B +$BF10l$NJ#@=$r:n$j!"G[I[$9$k$3$H$r5v2D$9$k!#(B + +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, provided that the +entire resulting derived work is distributed under the terms of a +permission notice identical to this one. + +$BF10lJ#@=$N>r7o$N2<$G!"$=$l$K$h$C$FF@$i$l$?7k2L$r$3$N5v2DJ8$NI=<($HF10l$N(B +$B>r7o$N$b$H$GG[I[$9$k8B$j!"$3$N@bL@=q$N=$@5HG$NJ#@=$r$7!"G[I[$9$k$3$H$r5v(B +$B2D$9$k!#(B + +Permission is granted to copy and distribute translations of this manual +into another language, under the above conditions for modified versions. + +$B>e5-$N=$@5HG$K4X$9$k>r7o$N2<$G!"$3$N@bL@=q$NK]Lu$NJ#@=$r:n$j!"G[I[$9$k$3(B +$B$H$r5v2D$9$k!#(B + +\newpage +\end{titlepage} +@end iflatex +@end iftex + +@ifinfo + +This file documents gnus, the GNU Emacs newsreader. + +$B$3$N%U%!%$%k$O(B GNU Emacs $B$N%K%e!<%9%j!<%@$G$"$k(B gnus $B$K4X$9$k@bL@=q$G$9!#(B + +Copyright (C) 1995,96 Free Software Foundation, Inc. + +Permission is granted to make and distribute verbatim copies of +this manual provided the copyright notice and this permission notice +are preserved on all copies. + +$BCx:n8"I=<($H$3$N5v2DJ8$,$9$Y$F$NJ#@=$KB8:_$9$k8B$j!"$3$N@bL@=q$N$^$C$?$/(B +$BF10l$NJ#@=$r:n$j!"G[I[$9$k$3$H$r5v2D$9$k!#(B + +@ignore +Permission is granted to process this file through Tex and print the +results, provided the printed document carries copying permission +notice identical to this one except for the removal of this paragraph +(this paragraph not being relevant to the printed manual). + +$B$3$NCJMn$,r7o$N2<$G!"$=$l$K$h$C$FF@$i$l$?7k2L$b$3$N5v2DJ8$NI=<($HF10l$N(B +$B>r7o$N$b$H$GG[I[$9$k8B$j!"$3$N@bL@=q$N=$@5HG$NJ#@=$r$7!"G[I[$9$k$3$H$r5v(B +$B2D$9$k!#(B + +Permission is granted to copy and distribute translations of this manual +into another language, under the above conditions for modified versions. + +$B>e5-$N=$@5HG$K4X$9$k>r7o$N2<$G!"$3$N@bL@=q$NK]Lu$NJ#@=$r:n$j!"G[I[$9$k$3(B +$B$H$r5v2D$9$k!#(B + +@end ifinfo + +@tex + +@titlepage +@title Semi-gnus 6.1.2 Manual + +@author by Lars Magne Ingebrigtsen +@author by members of Semi-gnus mailing-list +@page + +@vskip 0pt plus 1filll +Copyright @copyright{} 1995,96,97 Free Software Foundation, Inc. + +Permission is granted to make and distribute verbatim copies of +this manual provided the copyright notice and this permission notice +are preserved on all copies. + +$BCx:n8"I=<($H$3$N5v2DJ8$,$9$Y$F$NJ#@=$KB8:_$9$k8B$j!"$3$N@bL@=q$N$^$C$?$/(B +$BF10l$NJ#@=$r:n$j!"G[I[$9$k$3$H$r5v2D$9$k!#(B + +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, provided that the +entire resulting derived work is distributed under the terms of a +permission notice identical to this one. + +$BF10lJ#@=$N>r7o$N2<$G!"$=$l$K$h$C$FF@$i$l$?7k2L$r$3$N5v2DJ8$NI=<($HF10l$N(B +$B>r7o$N$b$H$GG[I[$9$k8B$j!"$3$N@bL@=q$N=$@5HG$NJ#@=$r$7!"G[I[$9$k$3$H$r5v(B +$B2D$9$k!#(B + +Permission is granted to copy and distribute translations of this manual +into another language, under the above conditions for modified versions. + +$B>e5-$N=$@5HG$K4X$9$k>r7o$N2<$G!"$3$N@bL@=q$NK]Lu$NJ#@=$r:n$j!"G[I[$9$k$3(B +$B$H$r5v2D$9$k!#(B + +@end titlepage +@page + +@end tex + + +@node Top +@top The gnus Newsreader + +@ifinfo + +Gnus $B$r;H$&$3$H$K$h$C$F(B Emacs $B$G%K%e!<%9(B (news) $B$r!J$=$l$K%a!<%k(B (mail) +$B$b!KFI$`$3$H$,$G$-$^$9!#%K%e!<%9$O(B @sc{nntp}$B!"%m!<%+%k%9%W!<%k!"(Bmbox $B%U%!(B +$B%$%k$J$I$N$"$i$f$k6K0-$Jl$G$9!#(BGnus $B$O$9$Y$F$r%K%e!<%9%0(B +$B%k!<%W$N$h$&$KI=<($7$^$9!#(BGnus $B$G%a!<%k$rFI$_!"%G%#%l%/%H%j!<$r%V%i%&%:(B +$B$7!"(B@code{ftp} $B$r$9$k$3$H$,$G$-$^$9!#$"$"!"$=$l$K!"%K%e!<%9$rFI$`$3$H$5(B +$B$($G$-$^$9!*(B + +Emacs $B$,J8>O$rJT=8$9$k?M$KNO$rM?$($k$h$&$K!"(Bgnus $B$O%K%e!<%9$rFI$`?M$KNO(B +$B$rM?$($h$&$H$7$F$$$^$9!#(BGnus $B$OMxMQ$`F0:n$r$9$k$h$&$K(B gnus $B$r3HD%$9$k$3$H$r>)Ne$7$F$$$^$9!#(B +$B%W%m%0%i%`$,?M$rA`:n$9$k$Y$-$G$O$"$j$^$;$s!#?M$,%W%m%0%i%`$r;H$&!J$b$7$/(B +$B$OMtMQ$9$k!K$3$H$K$h$C$F!"$d$j$?$$$3$H$r$G$-$k$h$&$K$J$C$F$$$k$Y$-$G$9!#(B + +@end iftex + + +@menu +* Starting Up:: $B%K%e!<%9$r8+$D$1$k$N$K$O6lO+$,H<$&$+$bCN$l$J$$(B +* The Group Buffer:: $B%0%k!<%W$rA*Br$7!"9VFI$7!":o=|$9$k(B +* The Summary Buffer:: $B5-;v$rFI$_!"J]B8$7!"Ej9F$9$k(B +* The Article Buffer:: $B5-;v$rI=<($7!"07$&(B +* Composing Messages:: $B%a!<%k$H%K%e!<%9$rAw$k$?$a$N>pJs(B +* Select Methods:: Gnus $B$OA4$F$N%a%C%;!<%8$r$$$m$$$m$JA*BrJ}K!$GFI$`(B +* Scoring:: $B5-;v$KCM$r$D$1$k(B +* Various:: $B0lHLE*$J@_Dj(B +* The End:: $B$5$i$P!"$=$7$F$5$h$&$J$i(B +* Appendices:: $BMQ8l!"(BEmacs $BF~Lg!"(BFAQ$B!"Nr;K!"FbIt9=B$(B +* Index:: $BJQ?t!"4X?t!"35G0$N:w0z(B +* Key Index:: $B%-!<:w0z(B +@end menu + +@node Starting Up +@chapter Starting gnus +@cindex starting up + +@kindex M-x gnus +@findex gnus +$B%7%9%F%`4IM}o$K4JC1$G$9!#$=$&!"(BEmacs $B$G(B @kbd{M-x gnus} $B$HBG$D$@$1$G$9!#(B + +@findex gnus-other-frame +@kindex M-x gnus-other-frame +$BJL$N%U%l!<%`$G(B gnus $B$r5/F0$7$?$$$H$-$O!"%3%^%s%I(B @kbd{M-x +gnus-other-frame} $B$r;H$&$3$H$,$G$-$^$9!#(B + +$B3+;O;~$K2?$+$,$&$^$/$$$+$J$$$H$-$O(B @file{~/.gnus} $B%U%!%$%k$NCf$GJQ?t$r$$(B +$B$/$D$+$$$8$/$j$^$o$5$J$1$l$P$J$i$J$$$G$7$g$&!#$3$N%U%!%$%k$O(B +@file{~/.emacs} $B$H;w$F$$$^$9$,!"$3$l$O(B gnus $B$,5/F0$9$k$H$-$KFI$_9~$^$l$^(B +$B$9!#(B + +$B$3$N@bL@=q$G$h$/$o$+$i$J$$MQ8l$,$G$F$-$?$H$-$O!"MQ8l$N9`(B +(@pxref{Terminology}) $B$r;2>H$7$F$/$@$5$$!#(B + +@menu +* Finding the News:: $B%K%e!<%9$re$N(B gnus $B$r:nF0$5$;$k$3$H$,$G$-$k(B +* Fetching a Group:: $B%0%k!<%W$rFI$`$?$a$@$1$K(B gnus $B$r5/F0$9$k(B +* New Groups:: Gnus $B$,?7$7$$%0%k!<%W$KBP$7$F2?$r$9$k$+(B +* Startup Files:: $B$d$C$+$$$J%9%?!<%H%"%C%W%U%!%$%k(B--@file{.newsrc} +* Auto Save:: $B%/%i%C%7%e$+$i$N2sI|(B +* The Active File:: $BCY$$2s@~$+$i$N%U%!%$%k$Nl9g$O!"(B + +@lisp +(setq gnus-select-method '(nnspool "")) +@end lisp + +$B$N$h$&$K$G$-$^$9!#(B + +$B%m!<%+%k$N%9%W!<%k$r;H$($k$N$G$"$l$P!"$+$J$j$N3NN($G$=$NJ}$,$:$C$HB.$$$G(B +$B$7$g$&$7!"$=$l$r;H$&$Y$-$G$7$g$&!#(B + +@vindex gnus-nntpserver-file +@cindex NNTPSERVER +@cindex @sc{nntp} server +$B$b$7$3$NJQ?t$,@_Dj$5$l$F$$$J$1$l$P!"(Bgnus $B$O(B @code{NNTPSERVER} $B4D6-JQ?t$rFI(B +$B$_$K$$$-$^$9!#$b$7$=$NJQ?t$,@_Dj$5$l$F$$$J$1$l$P!"(Bgnus $B$O(B +@code{gnus-nntpserver-file}$B!J@_Dj$5$l$F$$$J$$>l9g$O(B +@file{/etc/nntpserver}$B!K$,$3$N7o$K4X$7$F2?$+$r8@$C$F$$$J$$$+$rD4$Y$^$9!#$b(B +$B$7$=$l$b<:GT$7$?$J$i!"(Bgnus $B$O(B Emacs $B$,F0:n$7$F$$$k%5!<%P!<$r(B @sc{nntp} $B%5!<(B +$B%P!<$H$7$F;H$*$&$H$7$^$9!#?oJ,$JEv$F?dNL$G$9$1$I$M!#(B + +@vindex gnus-nntp-server +@code{gnus-nntp-server} $B$,@_Dj$5$l$F$$$k$H!"$3$NJQ?t$O(B +@code{gnus-select-method} $B$r>e=q$-$7$^$9!#$G$9$+$i!"(B +@code{gnus-nntp-server} $B$O(B @code{nil} $B$K@_Dj$9$k$Y$-$G!"I8=`@_Dj$G$b$=$N$h(B +$B$&$K$J$C$F$$$^$9!#(B + +@vindex gnus-secondary-servers +Gnus $B$K(B @sc{nntp} $B%5!<%P!<$NL>A0$NF~NO$rBPOCE*$K;XDj$9$k$3$H$b$G$-$^$9!#(B +@code{gnus} $B$K?tCM$G$J$$@\F,0z?t$rEO$9$H!JNc!'(B@kbd{C-u M-x gnus}$B!K!"(Bgnus +$B$O(B @code{gnus-secondary-servers} $B%j%9%H!J$b$7B8:_$9$k$J$i$P!K$+$i%5!<%P!<(B +$B$rA*$V$3$H$,$G$-$k$h$&$K$7$^$9!#$?$@C1$K@\B3$7$?$$$H;W$C$?%5!<%P!<$NL>A0(B +$B$rBG$D$3$H$b$G$-$^$9!#(B + +@findex gnus-group-browse-foreign-server +@kindex B (Group) +$B$7$+$7!"IaCJF|>oE*$K$O0l$D$N(B @sc{nntp} $B%5!<%P$r;H$$!"0c$C$?%5!<%P!<$K$O6=(B +$BL#$N$"$k%0%k!<%W$,>/$7$7$+$J$$>l9g!"%0%k!<%W%P%C%U%!$G(B @kbd{B} $BL?Na$r;H$&(B +$B$3$H$NJ}$,NI$$$G$7$g$&!#$=$l$O!"A*Br2DG=$J%0%k!<%W$rI=<($7!"$=$NCf$+$i$I$l(B +$B$G$b9%$-$J$b$N$r9XFI$9$k$3$H$,$G$-$^$9!#$3$l$O!"(B@file{.newsrc} $B$NJ];}$r$:$C(B +$B$H$d$j$d$9$/$7$^$9!#(B@xref{Foreign Groups}. + +@vindex gnus-secondary-select-methods +@c @head +$B30$N%0%k!<%W$KBP$9$k>/$70c$C$?$d$jJ}$O!"JQ?t(B +@code{gnus-secondary-select-methods} $B$r@_Dj$9$k$3$H$G$9!#$3$NJQ?t$KI=$5(B +$B$l$F$$$kA*BrJ}K!$O!"B?$/$NE@$G(B @code{gnus-select-method} $B%5!<%P!<$H$NA*(B +$BBrJ}K!$HF1$8$h$&$K07$o$l$^$9!#5/F0Cf$K%"%/%F%#%V%U%!%$%k$rC5$7$K$$$-$^$9$7(B +$B!J$b$7MW5a$5$l$F$$$l$P!K!"$3$l$i$N%5!<%P!<>e$K$G$-$??7$7$$%K%e!<%9%0%k!<(B +$B%W$O85!9$N%0%k!<%W$HF1$8$h$&$K9XFI!J$b$7$/$OIT9XFI!K$5$l$^$9!#(B + +$B$?$H$($P!"%a!<%k$rFI$`$?$a$K(B @code{nnmbox} $B%P%C%/%(%s%I(B (backend) $B$r;H$$(B +$B$?$$$H$-$O!"IaDL!"$3$NJQ?t$r!"(B + +@lisp +(setq gnus-secondary-select-methods '((nnmbox ""))) +@end lisp + +$B$H@_Dj$7$^$9!#(B + +@node The First Time +@section The First Time +@cindex first time usage + +$B5/F0MQ%U%!%$%k$,B8:_$7$J$$$H$-$O!"(Bgnus $B$O%G%#%U%)%k%H$G$I$N%0%k!<%W$,9X(B +$BFI$5$l$F$$$k$Y$-$+$r7hDj$7$h$&$H$7$^$9!#(B + +@vindex gnus-default-subscribed-newsgroups +$BJQ?t(B @code{gnus-default-subscribed-newsgroups} $B$,@_Dj$5$l$F$$$k$H!"(Bgnus $B$O(B +$B$=$N%j%9%H$NCf$N%0%k!<%W$r9XFI$7!";D$j$r:o=|$7$^$9!#%7%9%F%`4IM}/$7$NG$0U$N%0%k!<%W$r9XFI$7$^$9!JNc!'(B +@samp{*.newusers}$B!K!#!J(B@dfn{$BG$0U(B}$B$O$3$3$G$O!"(B@dfn{Lars $B$5$s$,FI$`$Y$-$G(B +$B$"$k$H9M$($k$b$N(B}$B$H$$$&$h$&$KDj5A$5$l$F$$$^$9!K(B + +$B$^$?!"$?$$$F$$$N6&DL$NLdBj$N2r7h$N$K$$$/$D$+%a!<%k$N%0%k!<(B +$B%W$,$"$l$P!"$=$l$K$b$+$+$o$i$:(B gnus $B$r5/F0$7$?$$$H;W$&$+$b$7$l$^$;$s!#(B + +Gnus $B$O!"?.Mj$G$-$k%W%m%0%i%`$N0l$D$H$7$F!"%5!<%P!<$H@\B3$G$-$J$$$H$-$O(B +$B4pK\A*BrJ}K!$J$7$GB3$1$k$+$I$&$+$r?R$M$^$9!#$3$l$Ol9g!K$d%5!<%P!<$,2?$i$+$NM}M3$G0l(B +$B;~E*$KD4;R$,$*$+$7$/$J$C$F$$$k$H$-$K5/$3$j$^$9!#$b$7$=$N$^$^B39T$9$k$3$H(B +$B$K$7$F!"30$N%0%k!<%W$,0l$D$bL5$$>l9g!"uBV$K$7$^$9!J4pK\%0%k!<%W$G$J$$%0%k!<%W$O$=$N#2$D$N%l%Y%k$K$7$F$*$/$N(B +$B$,K>$^$7$$$G$7$g$&!K!#(B + + +@node Slave Gnusae +@section Slave Gnusae +@cindex slave + +$B$"$J$?$O#2$D0J>e$N(B Emacs $B$H!"#2$D0J>e$N(B gnus $B$rF1;~$KF0$+$7$?$$$H;W$&$+(B +$B$b$7$l$^$;$s!#0c$C$?(B @file{.newsrc} $B%U%!%$%k$r;H$C$F$$$k$J$i!JNc$($P!"#2(B +$B$D$N0c$C$?%5!<%P!<$+$iFI$_9~$`$?$a$K!"#2$D$N0c$C$?(B gnus $B$rF0:n$5$;$F$$$k(B +$B>l9g!K!"$^$C$?$/LdBj$O$"$j$^$;$s!#$=$l$r9T$($PNI$$$@$1$G$9!#(B + +$BLdBj$O!"F1$8(B @code{.newsrc} $B%U%!%$%k$r;H$$D$N(B gnus $B$rF0$+$=$&$H$7$?$H(B +$B$-$K5/$3$j$^$9!#(B + +$B$3$NLdBj$KBP=h$9$k$?$a$K!"(Bgnus $B%?%o!<$N%7%s%/%?%s%/$K$$$k2f!9$O?7$7$$35(B +$BG0$K$?$I$j$D$-$^$7$?!#(B@dfn{$B%^%9%?!<(B} $B$H(B @dfn{$B%9%l!<%V(B} $B$G$9!#!J2f!9$O$3(B +$B$N35G0$KFC5v$r?=@A$7$^$7$?!#$=$7$F!"$=$N8@MU$NCx:n8"$rF@$^$7$?!#$*8_$$$K(B +$B4XO"$7$F$3$l$i$N8@MU$r;H$$$?$$$J$i!"#12s;H$&Kh$K!";d$K(B $1 $B$rAw$i$J$1$l$P(B +$B$J$j$^$;$s!#$b$A$m$s!"(B@dfn{$B%3%s%T%e!<%?!<%"%W%j%1!<%7%g%s$N%^%9%?!$l(B @kbd{M-x gnus-slave} $B$G5/F0(B +$B$7$^$9!#%9%l!<%V$OIaDL$N(B @file{.newsrc} $B$OJ]B8$7$^$;$s$,!"Be$o$j$K(B@dfn +{$B%9%l!<%V%U%!%$%k(B} $B$K%9%l!<%V$N5/F0Cf$K$I$N$h$&$J%0%k!<%W$,FI$^$l$?$+$H(B +$B$$$&>pJs$@$1$rJ]B8$7$^$9!#%^%9%?!<(B gnus $B$,5/F0$9$k$H$-!"$=$l$O$=$l$i$N%9(B +$B%l!<%V%U%!%$%k$rFI$_9~$_!J$=$7$F>C$7!K!"$=$l$i$+$i$9$Y$F$N>pJs$rpJs$OIaDL$N!JNc$($P!"%^%9%?!<$N!K%U%!%$(B +$B%k$h$j$bM%@h$5$l$^$9!#(B + + +@node Fetching a Group +@section Fetching a Group +@cindex fetching a group + +@findex gnus-fetch-group +$B;~!9!"!H$3$N%0%k!<%W$rFI$_$?$$$N$G$"$C$F!"(Bgnus $B$,5/F0$7$F$$$k$+$I$&$+$r(B +$B5$$K$7$?$/$J$$!#!I$H$$$&$3$H$,$G$-$l$PJXMx$J$3$H$,$"$j$^$9!#$3$l$O!"MxMQ(B +$BA0$r0z?t$H$7$F$H$j$^$9!#(B + + +@node New Groups +@section New Groups +@cindex new groups +@cindex subscription + +@vindex gnus-check-new-newsgroups +$B?7$7$$%K%e!<%9%0%k!<%W$rA4$/8+$J$$$GK~B-$G$"$k$J$i$P!"(B +@code{gnus-check-new-newsgroups} $B$r(B @code{nil} $B$K@_Dj$9$k$3$H$,$G$-$^$9!#(B +$B$3$l$r@_Dj$7$?>l9g!"5/F0$K$+$+$k;~4V$,C;$/$J$j$^$9!#$3$NJQ?t$,(B nil $B$K@_(B +$BDj$5$l$F$$$F$b!"%0%k!<%W%P%C%U%!$G(B @kbd{U} $B$r2!$;$P$$$D$G$b?7$7$$%0%k!<(B +$B%W$r9XFI$9$k$3$H$,$G$-$^$9(B (@pxref{Group Maintenance})$B!#@_Dj$5$l$F$$$J$$(B +$B>l9g(B (default) $B$G$O$3$NJQ?t$O(B @code{ask-server} $B$G$9!#$3$NJQ?t$,(B +@code{always} $B$K@_Dj$5$l$F$$$k$H!"L?Na(B @kbd{g} $B$ru%U%!%$%k(B (active file) $B$rHf3S$9$k$3$H$K$h$j7h(B +$BDj$7$F$$$^$9!#$3$NJ}K!$OFC$KB.$$$H$$$&$o$1$G$O$"$j$^$;$s!#(B +@code{gnus-check-new-newsgroups} $B$,(B @code{ask-server} $B$G$"$k$H!"(Bgnus $B$O%5!<(B +$B%P!<$K!":G8e$K@\B3$7$F$+$i?7$7$$%0%k!<%W$,$G$-$F$$$k$+$I$&$+$r?R$M$^$9!#$3(B +$B$NJ}K!$OB.$$$7!"0B>e$,$j$G$9!#$3$l$K$h$j!":o=|$5$l$?%0%k!<%W$N%j%9%H$rJ];}(B +$B$7$F$*$/$3$H$+$i$+$i40A4$K3+J|$5$l$^$9!#$G$9$+$i!"(B +@code{gnus-save-killed-list} $B$r(B @code{nil} $B$K$9$k$3$H$,$G$-$k$G$7$g$&!#$=(B +$B$&$9$l$P!"5/F0!"=*N;$NN>J}!"$=$7$FA4BN$K$o$?$C$F;~4V$r@aLs$G$-$^$9!#%G%#%9(B +$B%/>CHqNL$b>/$J$/$J$j$^$9!#$=$l$J$i!"$I$&$7$F$3$l$,I8=`(B (default) $B$G$O$J$$(B +$B$N$G$7$g$&!);DG0$J$,$i!"$9$Y$F$N%5!<%P!<$,$3$NL?Na$rM}2r$9$k$o$1$G$O$J$$$N(B +$B$G$9!#(B + +$B;d$O:#$"$J$?$,2?$r9M$($F$$$k$+$rEv$F$i$l$^$9!#$I$&$9$l$P%5!<%P!<$,(B +@code{ask-server} $B$rM}2r$9$k$+$,$o$+$k$N$G$7$g$&!)$(!"0c$&$N$G$9$+!)$"$!!"(B +$BNI$+$C$?!#$H$$$&$N$O!"3N$NJ}K!$H$7$F$O!"%5!<%P!<$K(B @code{telnet} $B$r$7$F!"(B +@code{HELP} $B$HBG$A!"%5!<%P!<$,M}2r$9$k%3%^%s%I$NCf$K(B @samp{NEWGROUPS} $B$,$"(B +$B$k$+$I$&$+$rD4$Y$k$3$H$b$G$-$^$9!#$b$7$"$l$P!"$*$=$i$/F0:n$9$k$G$7$g$&!J$7(B +$B$+$7!"E,@Z$K5!G=$rDs6!$9$k$3$H$J$/(B @samp{NEGROUPS} $B$r%j%9%H$K4^$a$k%5!<%P!<(B +$B$b$"$j$^$9!K!#(B + +$B$3$NJQ?t$O!"A*BrJ}K!$N%j%9%H$G$"$k$3$H$b$G$-$^$9!#$=$N$H$-$O!"(Bgnus $B$OL?(B +$BNa(B @code{ask-server} $B$r$=$l$>$l$NA*BrJ}K!$KBP$7$FA0(B +$B$rM#0l$N0z?t$H$7$F8F$P$l$^$9!#(B + +$B$$$/$D$+$N%s%S(B (zombie) $B$K$7$^$9!#$3$l$,I8=`(B (default) $B$K(B +$B$J$C$F$$$^$9!#8e$G%>%s%S$r(B (@kbd{A z} $B$K$h$C$F(B) $B354Q$7$?$j!"!J(B@kbd{S z} $B$K(B +$B$h$C$F!KE,@Z$KA4$F$r:o=|$7$?$j!"!J(B@kbd{u} $B$K$h$C$F!K9XFI$7$?$j$G$-$^$9!#(B + +@item gnus-subscribe-randomly +@vindex gnus-subscribe-randomly +$BG$0U$N=gHV$G$9$Y$F$N?7$7$$%0%k!<%W$r9XFI$7$^$9!#e!Y$K2C$($i$l$^$9!#(B + +@item gnus-subscribe-alphabetically +@vindex gnus-subscribe-alphabetically +$B$9$Y$F$N?7$7$$%0%k!<%W$r%"%k%U%!%Y%C%H=g$K9XFI$7$^$9!#(B + +@item gnus-subscribe-hierarchically +@vindex gnus-subscribe-hierarchically +$B$9$Y$F$N?7$7$$%0%k!<%W$r3,AXE*$K9XFI$7$^$9!#$3$N4X?t$H(B +@code{gnus-subscribe-alphabetically} $B$N0c$$$O>/$7$7$+$"$j$^$;$s!#(B +@code{gnus-subscribe-alphabetically} $B$O?7$7$$%0%k!<%W$r87L)$K%"%k%U%!%Y%C(B +$B%H=g$K$J$i$Y$^$9$,!"$3$N4X?t$O%0%k!<%W$r$=$N3,AX$NCf$KF~$l$^$9!#$G$9$+$i!"(B +@samp{rec} $B$N3,AX$r(B @samp{comp} $B$N3,AX$NA0$K;}$C$F$-$?$$>l9g!"$3$N4X?t$O(B +$B$=$NG[CV$r$0$A$c$0$A$c$K$O$7$^$;$s!#$b$7$/$O!"$=$N$h$&$J$b$N$G$9!#(B + +@item gnus-subscribe-interactively +@vindex gnus-subscribe-interactively +$B?7$7$$%0%k!<%W$rBPOCE*$K9XFI$7$^$9!#$3$l$O(B gnus $B$,(B@strong{$BA4$F(B}$B$N%0%k!<(B +$B%W$KBP$7$F?R$M$k$3$H$r0UL#$7$F$$$^$9!#9XFI$9$k%0%k!<%W$O3,AXE*$K9XFI$5$l(B +$B$^$9!#(B + +@item gnus-subscribe-killed +@vindex gnus-subscribe-killed +$B$9$Y$F$N?7$7$$%0%k!<%W$r:o=|$7$^$9!#(B + +@end table + +@vindex gnus-subscribe-hierarchical-interactive +$B>e$NJQ?t$HNI$/4X78$7$?JQ?t$O!"(B +@code{gnus-subscribe-hierarchical-interactive} $B$G$9!#$3$NJQ?t$,(B +@code{nil} $B$G$J$$$H!"(Bgnus $B$O3,AXE*$JJ}K!$G?7$7$$%0%k!<%W$r9XFI$9$k$+$I$&$+(B +$B$r?R$M$^$9!#(Bgnus $B$O$=$l$>$l$N3,AX$G!"$=$l$r2<$K9_$j$k$+$I$&$+$r?R$M$^$9!#(B + +$BNI$/$"$k4V0c$$$O!"?tCJMnA0$NJQ?t(B +(@code{gnus-subscribe-newsgroup-method}) $B$r(B +@code{gnus-subscribe-hierarchical-interactive} $B$K@_Dj$9$k$3$H$G$9!#$3$l$O(B +$B8m$j$G$9!#$3$l$OF0:n$7$^$;$s!#$3$l$O$*$a$G$?$$?M$N$9$k$3$H$G$9!#$G$9$+$i!"(B +$B@dBP$K$7$J$$$G$/$@$5$$!#(B + + +@node Filtering New Groups +@subsection Filtering New Groups + +$B$I$N?7$7$$%0%k!<%W$,9XFI!J$b$7$/$O!"L5;k!K$5$l$k$Y$-$+$r4IM}$9$k2wE,$GA0$r;}$D%0%k!<%W$OA4$FL5;k$5$l!"(B@samp{sci} $B$G;O$^$kL>A0$r;}$D%0%k!<(B +$B%W$OA4$F9XFI$9$k!"$H$$$&$3$H$rI=$7$F$$$k$+$i$G$9!#(BGnus $B$O$3$l$i$N%0%k!<(B +$B%W$r9XFI$9$k$N$K!"IaDL$N9XFIJ}K!$rMQ$$$^$;$s!#Be$o$j$K!"(B +@code{gnus-subscribe-options-newsgroup-method} $B$,MQ$$$i$l$^$9!#$3$NJQ?t(B +$B$OI8=`(B (default) $B$G$O(B @code{gnus-subscribe-alphabetically} $B$G$9!#(B + +@vindex gnus-options-not-subscribe +@vindex gnus-options-subscribe +$B%U%!%$%k(B @file{.newsrc} $B$r$$$8$j$?$/$J$$>l9g$O!"(B +@code{gnus-options-subscribe} $B$H(B @code{gnus-options-not-subscribe} $B$N#2$D(B +$B$NJQ?t$@$1$r@_Dj$9$k$3$H$b$G$-$^$9!#$3$N#2$D$NJQ?t$O%U%!%$%k(B +@file{.newsrc} $B$N(B @samp{options -n} $B9T$HA4$/F1$8$3$H$r$7$^$9!#$I$A$i$NJQ?t(B +$B$b@55,I=8=$G!"?7$7$$%0%k!<%W$OA0r7o$K9XFI$5$l!"8eJ,$J$b$N$G$9!#$7$+$7!";d$O$3$NFs$D$,$"$C$?J}$,NI$$$H;W$$$^$7(B +$B$?!#$b$&0lJ}$NJQ?t$O%f!<%6$,$$$8$/$k$N$K;H$o$l$k$N$KBP$7$F!"$3$NJQ?t$O$$(B +$B$/$D$+$N4pK\E*$J5,B'$r@_Dj$9$k$?$a$N$b$N$G$9!#%G%#%U%)%k%H$G$O$3$NJQ?t$O(B +$B%a!<%k%P%C%/%(%s%I(B (@code{nnml} $B!"(B@code{nnbabyl} $B!"(B@code{nnfolder} $B!"(B +@code{nnmbox} $B$H(B@code{nnmh}) $B$+$i$G$-$kA4$F$N?7$7$$%0%k!<%W$r9XFI$9$k$h(B +$B$&$K$J$C$F$$$^$9!#$=$l$,7y$G$"$l$P!"$3$NJQ?t$r(B @code{nil} $B$K@_Dj$7$F$/$@(B +$B$5$$!#(B + +$B$3$N@55,I=8=$K9gCW$9$k?7$7$$%0%k!<%W$O(B +@code{gnus-subscribe-options-newsgroup-method} $B$r;H$C$F9XFI$5$l$^$9!#(B + + +@node Changing Servers +@section Changing Servers +@cindex changing servers + +$B$H$-$I$-!"$"$k(B @sc{nntp} $B%5!<%P!<$+$iJL$N%5!<%P!<$X0\F0$7$J$1$l$P$J$i$J(B +$B$$$3$H$,$"$j$^$9!#$3$N$h$&$J$3$H$O$a$C$?$K$*$-$^$;$s$,!"$*$=$i$/$"$J$?$,(B +$B;E;v$rJQ$($?$j!";H$C$F$$$k%5!<%P!<$,$H$F$bIT0BDj$G!"JL$N$b$N$K>h$j49$($?(B +$B$$$H$$$&$H$-$KI,MW$K$J$k$G$7$g$&!#(B + +$B%5!<%P!<$rJQ99$9$k$N$O$H$F$b4JC1$G$9$h$M!)(B +@code{gnus-select-method} $B$r?7$7$$%5!<%P!<$r;X$7<($9$h$&$KJQ99$9$l$P$$$$(B +$B$@$1$G$9$M!)(B + +@emph{$B0c$$$^$9!*(B} + +$B5-;v$NHV9f$O0c$C$?(B @sc{nntp} $B%5!<%P!<$G$b(B ($B$I$&$K$+$7$F(B) $BF1$8$K$7$F$"$k!"(B +$B$H$$$&$3$H$O$"$j$^$;$s!#$=$7$F!"(Bguns $B$,$I$N5-;v$rFI$s$@$+$r5-O?$9$kM#0l$N(B +$BJ}K!$O!"5-;vHV9f$r5-O?$9$k$3$H$G$9!#$G$9$+$i!"(B@code{gnus-select-method} $B$r(B +$BJQ99$7$?$H$-$O!"%U%!%$%k(B @file{.newsrc} $B$O0UL#$,$J$/$J$j$^$9!#(B + +Gnus $B$O%U%!%$%k(B @file{.newsrc} $B$r$"$k%5!<%P!J}$N%5!<%P!<$K@\B3$G$-$k$J$i!"(Bgnus $B$O$"$J$?$,FI$s$@5-;vA4$F$KBP$7$F(B +$B%X%C%@!<(B (headers) $B$rMW5a$7$F!"(B@code{Message-ID} $B$rHf3S$7!"FI$s$@5-;v$H5-(B +$B;v$N0u$r?7$7$/5-O?$7$^$9!#%3%^%s%I(B @kbd{M-x gnus-change-server} $B$O$3$l$r$9(B +$B$Y$F$N4pK\%0%k!<%W$KBP$7$F9T$$$^$9!#$=$N%3%^%s%I$O0\F0@h$NJ}K!$NF~NO$rB%$7(B +$B$^$9!#(B + +@kindex M-x gnus-group-move-group-to-server +@findex gnus-group-move-group-to-server +$B8D!9$N%0%k!<%W$rL?Na(B @kbd{M-x gnus-group-move-group-to-server} $B$G0\F0$9$k(B +$B$3$H$b$G$-$^$9!#$3$l$O$"$k%5!<%P!<$+$iJL$N%5!<%P!<$X0l$D$N!J30$N!K%0%k!<%W(B +$B$r0\F0$7$?$$$H$-$KLr$KN)$A$^$9!#(B + +@kindex M-x gnus-group-clear-data-on-native-groups +@findex gnus-group-clear-data-on-native-groups +$B8E$$%5!<%P!<$H?7$7$$%5!<%P!<$NN>J}$K@\B3$9$k$3$H$,$G$-$J$$$H$-!"0u$HFI$s$@(B +$BHO0O$O$9$Y$F0UL#$,L5$/$J$j$^$9!#$=$N$h$&$J$H$-$O!"L?Na(B @kbd{M-x +gnus-group-clear-data-on-native-groups} $B$r;H$C$F!"4pK\%0%k!<%W$K4X$9$k%G!<(B +$B%?$r$9$Y$F>C5n$9$k$3$H$,$G$-$^$9!#$3$NL?Na$OCm0U$7$F;H$C$F$/$@$5$$!#(B + + +@node Startup Files +@section Startup Files +@cindex startup files +@cindex .newsrc +@cindex .newsrc.el +@cindex .newsrc.eld + +$B:#$d!"$"$J$?$O%U%!%$%k(B @file{.newsrc} $B$K$D$$$F$9$Y$FCN$C$F$$$^$9!#$9$Y$F$N(B +$B9XFI>pJs$OEAE}E*$K$3$N%U%!%$%k$KC_@Q$5$l$^$9!#(B + +@sc{GNUS} $B$G$OJ*;v$,>/!9J#;($K$J$C$F$$$^$9!#%U%!%$%k(B @file{.newsrc} $B$r:G?7(B +$B$N$b$N$K$9$k$@$1$G$O$J$/!"%U%!%$%k(B @file{.newsrc} $B$K$O9g$o$J$$>pJs$rJ]B8$7(B +$B$F$*$/$?$a$K(B @file{.newsrc.el} $B$H8F$P$l$k%U%!%$%k$r;H$$$^$9!JpJs$rJ#@=$7$FJ];}$7$F$$$^$9!K!#(B@sc{GNUS} $B$O$3(B +$B$l$i$NCf$G0lHV:G8e$KJ]B8$5$l$?$b$N$r;H$$$^$9!#$3$l$r$9$k$3$H$K$h$j!"(B +@sc{GNUS} $B$HB>$N%K%e!<%9%j!<%@!<$r@Z$jBX$($F;H$&$3$H$,$G$-$^$9!#(B + +$B$3$l$O$A$g$C$H$P$+$JJ}K!$J$N$G!"(BGnus $B$O$b$C$HNI$$J}K!$rJT$_=P$7$^$7$?!#(B +@file{.newsrc} $B$H(B @file{.newsrc.el} $B%U%!%$%k$K2C$($F!"(BGnus $B$O(B +@file{.newsrc.eld} $B$H8F$P$l$k%U%!%$%k$b;}$C$F$$$^$9!#(BGnus $B$O$3$l$i$NCf$G0l(B +$BHV?7$7$$%U%!%$%k$rFI$_$^$9$,!"%U%!%$%k(B @file{.newsrc.el} $B$K=q$-9~$`$3$H$O(B +$B$"$j$^$;$s!#%U%!%$%k(B @file{.newsrc.eld} $B$O@dBP$K>C$9$Y$-$G$O$"$j$^$;$s!#(B +---$B$=$l$O%U%!%$%k(B @file{.newsrc} $B$K$O$J$$$?$/$5$s$N>pJs$rJ];}$7$F$$$^$9!#(B + +@vindex gnus-save-newsrc-file +@code{gnus-save-newsrc-file} $B$r(B @code{nil} $B$K$9$k$3$H$K$h$C$F%U%!%$%k(B +@file{.newsrc} $B$K=q$-9~$`$N$r;_$a$k$3$H$,$G$-$^$9!#$=$&$9$l$P!"$=$N%U%!(B +$B%$%k$r:o=|$9$k$3$H$,$G$-!"%G%#%9%/MFNL$r@aLs$9$k$3$H$,$G$-!"(Bgnus $B$N=*N;(B +$B$,B.$/$J$j$^$9!#$7$+$7!"$=$&$9$k$HB>$N%K%e!<%9%j!<%@!<$r;H$($J$/$J$j$^$9!#(B +$B$G$b!"$A$g$C$H!"C/$+$=$&$7$?$$?M$,$$$k$G$7$g$&$+!#(B + +@vindex gnus-save-killed-list +@code{gnus-save-killed-list}$B!JI8=`(B (default) $B$G$O(B @code{t}$B!K$,(B +@code{nil} $B$G$"$k$H!"(Bgnus $B$O:o=|$5$l$?%0%k!<%W$r5/F0%U%!%$%k$KJ]B8$7$^$;$s!#(B +$B$3$l$O!"!J5/F0;~$H=*N;;~$N!K;~4V$H!"!J%G%#%9%/$N!KMFNL$r@aLs$7$^$9!#$3$&$9(B +$B$k$H!"(Bgnus $B$,$I$N%0%k!<%W$,?7$7$$$+$N5-O?$r;}$C$F$$$J$$$3$H$K$J$j$^$9$N$G!"(B +$B?7$7$$%0%k!<%W$N<+F09XFIJ}K!$O0UL#$,L5$/$J$j$^$9!#$3$NJQ?t$r(B @code{nil} $B$K(B +$B$7$?$H$-$O!"(B@code{gnus-check-new-newsgroups} $B$r>o$K(B @code{nil} $B$+(B +@code{ask-server} $B$K$7$F$*$/$Y$-$G$7$g$&(B (@pxref{New Groups})$B!#$3$NJQ?t$O(B +$B@55,I=8=$K$9$k$3$H$b$G$-$^$9!#$=$N$h$&$J>l9g$O!"%U%!%$%k$rJ]B8$9$kD>A0$K$=(B +$B$N@55,I=8=$K9gCW$7$J$$$9$Y$F$N%0%k!<%W$r>C5n$7$^$9!#$3$l$O!"$9$Y$F$N%5!<%P!<(B +$B$,(B @code{ask-server} $B$rM}2r$9$k$o$1$G$O$J$$!"$H$$$C$?$h$&$J!"FCDj$N$"$$$^(B +$B$$$J>u67$N$H$-$KLr$KN)$D$G$7$g$&!#(B + +@vindex gnus-startup-file +$BJQ?t(B @code{gnus-startup-file} $B$O5/F0%U%!%$%k$,$I$3$K$"$k$+$r;XDj$7$^$9!#(B +$B%G%#%U%)%k%H$NCM$O(B @file{~/.newsrc} $B$G!"$=$l$,$I$N$h$&$J$b$N$G$"$l!"(B +$BKvHx$K(B @samp{.eld} $B$r$D$1$?$b$N$,(B gnus (El Dingo) $B$N5/F0%U%!%$%k$K$J$j$^(B +$B$9!#(B + +@vindex gnus-save-newsrc-hook +@vindex gnus-save-quick-newsrc-hook +@vindex gnus-save-standard-newsrc-hook +@code{gnus-save-newsrc-hook} $B$O(B newsrc $B%U%!%$%k$NCf$N$I$l$+$rJ]B8$9$kA0$KA0$N%U%!(B +$B%$%k$rD4$Y$^$9$,!"@\Hx8l(B @file{.elc} $B$H(B @file{.el} $B$,$D$$$F$$$k$b$N$bD4$Y(B +$B$^$9!#8@$$49$($l$P!"(B@code{gnus-init-file} $B$r(B @file{~/.gnus} $B$K@_Dj$9$k$H!"(B +gnus $B$O(B ($B$3$N=gHV$K(B) @file{~/.gnus.elc} $B!"(B@file{~/.gnus.el} $B$rC5$7!":G8e$K(B +@file{~/.gnus} $B$rC5$7$^$9!#(B + + + +@node Auto Save +@section Auto Save +@cindex dribble file +@cindex auto-save + +$B2?$+(B gnus $B$N%G!<%?$rJQ99$9$k$3$H!J5-;v$rFI$`!"0u$rIU$1$k!"%0%k!<%W$r:o=|$^(B +$B$?$O9XFI$9$k!K$r$7$?$H$-!"JQ99$OFCJL$J(B@dfn{$B%I%j%V%k%P%C%U%!(B (dribble +buffer)}$B$K=q$-9~$^$l$^$9!#$3$N%P%C%U%!$O(B Emacs $B$,IaDL$9$k$h$&$K<+F0J]B8$5(B +$B$l$^$9!#%U%!%$%k(B @file{.newsrc} $B$rJ]B8$9$kA0$K(B Emacs $B$,Mn$A$?$H$-$O!"$9$Y(B +$B$F$NJQ99$r$3$N%U%!%$%k$+$i2sI|$9$k$3$H$,$G$-$k$G$7$g$&!#(B + +$B5/F0;~$K(B gnus $B$,$3$N%U%!%$%k$NB8:_$rH/8+$9$k$H!"(Bgnus $B$O$=$l$rFI$_9~$`$+(B +$B$I$&$+$rMxMQ