+2006-04-11 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * README: No Gnus v0.4 is released.
+
+2006-04-11 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * Makefile.in (release-sign-files): Use rm -f.
+ (RELEASE_COMMIT_FILES): Add ./ChangeLog.
+ (release-bump-version): Add README.
+ (release-check-settings): OLD_TAG, not OLDTAG.
+ (release-commit): Echo command lines before prompt.
+ (RELEASE_COMMIT_FILES): Add README.
+ (OLD_PATTERN): Fix.
+ (release-bump-version): Fix gnusversionname substitution.
+ (OLD_PATTERN): Add grouping.
+
+2006-04-10 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * Makefile.in (GZIP_PROG): Use gzip -f.
+ (release-bump-version, RELEASE_COMMIT_FILES): Add README.
+ (release-sign-files): Remove old *.sig files.
+
+ * README: Say "development version". Let sentences end with
+ double space.
+
+2006-04-07 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * Makefile.in (GZIP_PROG): New variable.
+ (release-diff): Use it.
+ (release-sign-files): New sign-only target. Use GPG_AGENT_INFO.
+
+2006-04-04 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * Makefile.in (TAR_BALL_EXTRA, release-make-tar-ball, README):
+ Remove; README is in CVS now.
+ (release-files, release-files-signed, release-cvs-export)
+ (release-make-tar-ball): Use $(VERSION) instead of $(TAG).
+ (OLD_PATTERN): Catch stable and trunk.
+ (CIN): New variable.
+ (release-files, release-files-signed, release-cvs-export)
+ (release-make-tar-ball, release-diff, release-post-clean): Add
+ CIN.
+ (OLD_PATTERN): Remove quotes.
+ (release-bump-version): Fix typo.
+
+ * etc/images/README: Add more Emacs 22 icons. Add suggestion on
+ how to use those in Emacs 21.
+
+ * etc/images/close.xpm, etc/images/cut.xpm, etc/images/home.xpm,
+ etc/images/index.xpm, etc/images/jump-to.xpm, etc/images/new.xpm,
+ etc/images/next-node.xpm, etc/images/open.xpm,
+ etc/images/preferences.xpm, etc/images/prev-node.xpm,
+ etc/images/saveas.xpm, etc/images/spell.xpm: New icons duplicated
+ from Emacs 22.
+
+ * README: Addition from 5.10.6 tar ball. Clarify "beta".
+ Simplify Info directory setting. Update required Emacs and XEmacs
+ version. Use current Gnus version in examples.
+
+2006-03-31 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * GNUS-NEWS: Generated.
+
+ * Makefile.in (CVS_IGNORE_FILES): Additions.
+ (release-files-signed): New target.
+
+ * etc/images/README: Update separator.xpm.
+
+2006-03-30 Romain Francoise <romain@orebokech.com>
+
+ * GNUS-NEWS: Generated.
+
+2006-03-30 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * etc/images/separator.xpm: Update from Emacs CVS.
+
+ * GNUS-NEWS: Generated.
+
+2006-03-29 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * Makefile.in (release-bump-version): Consider named Gnus versions
+ in replacements.
+
+ * todo: Update "tool bar icons".
+
+2006-03-27 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * Makefile.in (release-revert-files): Replace
+ release-revert-changelog.
+ (release-diff): Remove garbage.
+
+2006-03-07 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * etc/images/README: Add GIMP script.
+ (attach.xpm): Move to top level.
+ (sort-*.xpm) Add.
+
+ * etc/images/sort-ascending.xpm,
+ etc/images/sort-column-ascending.xpm,
+ etc/images/sort-criteria.xpm, etc/images/sort-descending.xpm,
+ etc/images/sort-row-ascending.xpm: New icons from GNOME 2.6.
+
+2006-03-10 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * Makefile.in (release-check-settings): Add status and
+ suggestions.
+ (release-files): Remove duplicate release-cvs-export.
+ (README): New target.
+ (release-files, release-make-tar-ball, release-diff): List files.
+ (README, release-make-tar-ball): Fix.
+
+2006-03-06 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * GNUS-NEWS: Generated.
+
+ * Makefile.in (release-*): New targets.
+
+2006-02-28 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * todo: Remove nnweb. Add: widget for posting styles, doc string
+ for utility functions, LIST SUBSCRIPTIONS, divide emacs-mime.texi,
+ change servers.
+
+ * etc/images/README (next-page.xpm): From Gnome, not from Emacs
+ 22.
+
+ * cancel.xpm, copy.xpm, diropen.xpm, help.xpm, left-arrow.xpm,
+ next-page.xpm, paste.xpm, print.xpm, redo.xpm, right-arrow.xpm,
+ save.xpm, search.xpm: New icons duplicated from Emacs 22.
+
+ * etc/images/README: Add these icons.
+
+ * etc/images/README: Describe the new images.
+
+ * etc/gnus/gnus-setup.ast, etc/gnus/news-server.ast: Use
+ texinfo-mode.
+
+ * etc/images/mail/save.xpm, etc/images/mail/preview.xpm: Rename
+ char*.
+
+2006-03-03 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * xemacs.mak: Remove outdated file. Use make.bat instead.
+
+2006-03-02 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * make.bat: Add note about "Out of environment space" on Windows
+ 98 SE. Avoid `>' in echo.
+
+2006-02-27 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * ChangeLog, texi/ChangeLog, lisp/ChangeLog: Fix "From so-and-so"
+ and "(tiny change)" entries.
+
+2006-02-22 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * etc/images/gnus/mail_send.xpm: Emacs 21 icon for
+ message-tool-bar-retro.
+
+2006-02-21 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * make.bat (:etc): Also consider images in images/mail and
+ images/.
+
+ * etc/Makefile.in (install, uninstall): Also consider images in
+ images/mail and images/.
+
+ * etc/images/connect.xpm, etc/images/contact.xpm,
+ etc/images/delete.xpm, etc/images/describe.xpm,
+ etc/images/disconnect.xpm, etc/images/exit.xpm,
+ etc/images/lock-broken.xpm, etc/images/lock-ok.xpm,
+ etc/images/lock.xpm, etc/images/refresh.xpm,
+ etc/images/gnus/toggle-subscription.xpm,
+ etc/images/mail/attach.xpm, etc/images/mail/compose.xpm,
+ etc/images/mail/copy.xpm, etc/images/mail/forward.xpm,
+ etc/images/mail/inbox.xpm, etc/images/mail/move.xpm,
+ etc/images/mail/not-spam.xpm, etc/images/mail/outbox.xpm,
+ etc/images/mail/reply-all.xpm, etc/images/mail/reply.xpm,
+ etc/images/mail/save-draft.xpm, etc/images/mail/send.xpm,
+ etc/images/mail/spam.xpm: New icons from GNOME 2.6.
+
+2006-02-21 Miguel Frasson <frasson@math.leidenuniv.nl>
+
+ * etc/images/separator.xpm: Copy of sep.xpm from AUCTeX.
+
+2006-02-21 Adam Sj\e,Ax\e(Bgren <asjo@koldfront.dk>
+
+ * etc/images/mail/save.xpm, etc/images/mail/preview.xpm: New icons.
+
+2006-01-26 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * Makefile.in (clean): Clean all subdirectories; remove *~.
+ (elclean): Remove lisp/auto-autoloads.el, lisp/custom-load.el, and
+ lisp/gnus-load.el.
+ (distclean): Don't use sub-make to run clean; use $(MAKE) instead
+ of make.
+
+ * etc/Makefile.in (clean): New rule.
+ (distclean): Use it; remove Makefile.
+
+2005-12-06 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * GNUS-NEWS: Generated.
+
+2005-10-31 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * Testing CVS setup. Yes. Yes. Yes. Yes.
+
+2005-10-04 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * aclocal.m4 (AC_PATH_LISPDIR): Default to .../site-lisp/gnus for
+ Emacs.
+ (AC_PATH_ETCDIR): Don't change the default value for Emacs.
+
+ * configure: Generated.
+
+ * Makefile.in (list-installed-shadows): New entry.
+ (remove-installed-shadows): New entry.
+
+ * GNUS-NEWS: Generated.
+
+2005-09-28 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * todo: Remove some items that are already done. Add some new
+ items. Add some comments.
+
+2005-08-10 Romain Francoise <romain@orebokech.com>
+
+ * GNUS-NEWS: Generated.
+
+2005-07-18 Romain Francoise <romain@orebokech.com>
+
+ * GNUS-NEWS: Generated.
+
2005-02-19 Miles Bader <miles@gnu.org>
* etc/Makefile.in (install): Create $(etcdir)/images/gnus dir.
* etc/gnus/news-server.ast: Use library validation.
-2004-03-08 Kevin Greiner <kgreiner@xpediantsolutions.com>
+2004-03-08 Kevin Greiner <kgreiner@xpediantsolutions.com>
* make.bat: Make sure that gnus-load.el and sieve are writable to
avoid breakage.
-2004-03-01 Reiner Steib <Reiner.Steib@gmx.de>
+2004-03-01 Michael Schierl <schierlm-public@gmx.de> (tiny change)
- * make.bat: Fix directory test for Windows 9x/ME. From Michael
- Schierl <schierlm-public@gmx.de> (tiny change).
+ * make.bat: Fix directory test for Windows 9x/ME.
-2004-01-07 Hiroshi Fujishima <pooh@nature.tsukuba.ac.jp>
+2004-01-07 Hiroshi Fujishima <pooh@nature.tsukuba.ac.jp> (tiny change)
- * etc/gnus-tut.txt: `G m' instead of `G V' (tiny patch).
+ * etc/gnus-tut.txt: `G m' instead of `G V'
2004-01-05 Jesper Harder <harder@ifa.au.dk>
* configure.in: Use it.
-2001-01-15 Jesper Harder <harder@ifa.au.dk>
+2001-01-15 Jesper Harder <harder@ifa.au.dk>
* make.bat: Fix doc.
* configure.in: Add etc/Makefile.
-2000-12-20 Jesper Harder <jesper_harder@hotmail.com>
+2000-12-20 Jesper Harder <jesper_harder@hotmail.com>
* make.bat: set max-lisp-eval-depth.
-2000-10-12 Jesper Harder <jesper_harder@hotmail.com>
+2000-10-12 Jesper Harder <jesper_harder@hotmail.com>
* make.bat: Makes it possible to generate the Info files on
windows again.
-2000-08-24 Jesper Harder <jesper_harder@hotmail.com>
+2000-08-24 Jesper Harder <jesper_harder@hotmail.com>
* make.bat: Use emacs.exe if emacs.bat does not exist.
GNUS NEWS -- history of user-visible changes.
-Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ 2006 Free Software Foundation, Inc.
See the end for copying conditions.
Please send Gnus bug reports to bugs@gnus.org.
For older news, see Gnus info node "New Features".
-
\f
-* Changes in No Gnus
+* Installation changes
** Upgrading from previous (stable) version if you have used No Gnus.
If you have tried No Gnus (the unstable Gnus branch leading to this
-release) but went back to a stable version, be careful when upgrading
-to this version. In particular, you will probably want to remove the
-`~/News/marks' directory (perhaps selectively), so that flags are
-read from your `~/.newsrc.eld' instead of from the stale marks file,
-where this release will store flags for nntp. See a later entry for
-more information about nntp marks. Note that downgrading isn't safe
-in general.
+release) but went back to a stable version, be careful when upgrading to
+this version. In particular, you will probably want to remove the
+`~/News/marks' directory (perhaps selectively), so that flags are read
+from your `~/.newsrc.eld' instead of from the stale marks file, where
+this release will store flags for nntp. See a later entry for more
+information about nntp marks. Note that downgrading isn't safe in
+general.
+
+** Lisp files are now installed in `.../site-lisp/gnus/' by default. It
+defaulted to `.../site-lisp/' formerly. In addition to this, the new
+installer issues a warning if other Gnus installations which will shadow
+the latest one are detected. You can then remove those shadows manually
+or remove them using `make remove-installed-shadows'.
+
+\f
+* New packages and libraries within Gnus
-** The nntp back end store article marks in `~/News/marks'.
+** Gnus includes the Emacs Lisp SASL library.
-The directory can be changed using the (customizable) variable
-`nntp-marks-directory', and marks can be disabled using the (back
-end) variable `nntp-marks-is-evil'. The advantage of this is that
-you can copy `~/News/marks' (using rsync, scp or whatever) to another
-Gnus installation, and it will realize what articles you have read
-and marked. The data in `~/News/marks' has priority over the same
-data in `~/.newsrc.eld'.
+This provides a clean API to SASL mechanisms from within Emacs. The
+user visible aspects of this, compared to the earlier situation, include
+support for DIGEST-MD5 and NTLM. *Note Emacs SASL: (sasl)Top.
+
+** ManageSieve connections uses the SASL library by default.
+
+The primary change this brings is support for DIGEST-MD5 and NTLM, when
+the server supports it.
+
+** Gnus includes a password cache mechanism in password.el.
+
+It is enabled by default (see `password-cache'), with a short timeout of
+16 seconds (see `password-cache-expiry'). If PGG is used as the PGP
+back end, the PGP passphrase is managed by this mechanism. Passwords
+for ManageSieve connections are managed by this mechanism, after
+querying the user about whether to do so.
+
+\f
+* Changes in summary and article mode
+
+** International host names (IDNA) can now be decoded inside article bodies
+using `W i' (`gnus-summary-idna-message'). This requires that GNU Libidn
+(`http://www.gnu.org/software/libidn/') has been installed.
+
+** Gnus now displays DNS master files sent as text/dns using dns-mode.
+
+** Gnus supports new limiting commands in the Summary buffer: `/ r'
+(`gnus-summary-limit-to-replied') and `/ R'
+(`gnus-summary-limit-to-recipient'). *Note Limiting::.
+
+** Gnus supports a new sort command in the Summary buffer: `C-c C-s C-t'
+(`gnus-summary-sort-by-recipient'). *Note Summary Sorting::.
+
+** S/MIME now features LDAP user certificate searches. You need to
+configure the server in `smime-ldap-host-list'.
+
+** URLs inside OpenPGP headers are retrieved and imported to your PGP key
+ring when you click on them.
** Picons can be displayed right from the textual address, see
`gnus-picon-style'. *Note Picons::.
-** You can import and export your RSS subscriptions from OPML files.
-*Note RSS::.
+** ANSI SGR control sequences can be transformed using `W A'.
+
+ANSI sequences are used in some Chinese hierarchies for highlighting
+articles (`gnus-article-treat-ansi-sequences').
+
+** Gnus now MIME decodes articles even when they lack "MIME-Version" header.
+This changes the default of `gnus-article-loose-mime'.
+
+** `gnus-decay-scores' can be a regexp matching score files. For example,
+set it to `\\.ADAPT\\'' and only adaptive score files will be decayed.
+ *Note Score Decays::.
+
+** Strings prefixing to the `To' and `Newsgroup' headers in summary lines
+when using `gnus-ignored-from-addresses' can be customized with
+`gnus-summary-to-prefix' and `gnus-summary-newsgroup-prefix'. *Note To
+From Newsgroups::.
+
+** You can replace MIME parts with external bodies. See
+`gnus-mime-replace-part' and `gnus-article-replace-part'. *Note MIME
+Commands::, *Note Using MIME::.
** The option `mm-fill-flowed' can be used to disable treatment of
format=flowed messages. Also, flowed text is disabled when sending
-inline PGP signed messages.
+inline PGP signed messages. *Note Flowed text: (emacs-mime)Flowed text.
-** You can now drag and drop attachments to the Message buffer.
-** ANSI SGR control sequences can be transformed using `W A'.
+\f
+* Changes in Message mode
-ANSI sequences are used in some Chinese hierarchies for highlighting
-articles (`gnus-article-treat-ansi-sequences').
+** Gnus now supports the "hashcash" client puzzle anti-spam mechanism. Use
+`(setq message-generate-hashcash t)' to enable. *Note Hashcash::.
-** International host names (IDNA) can now be decoded inside article
-bodies using `W i' (`gnus-summary-idna-message'). This require that
-GNU Libidn (`http://www.gnu.org/software/libidn/') has been installed.
+** You can now drag and drop attachments to the Message buffer. See
+`mml-dnd-protocol-alist' and `mml-dnd-attach-options'. *Note MIME:
+(message)MIME.
-** Gnus includes an Emacs Lisp SASL library.
+** The option `message-yank-empty-prefix' now controls how empty lines are
+prefixed in cited text. *Note Insertion Variables: (message)Insertion
+Variables.
-This provide a clean API to SASL mechanisms from within Emacs. The
-user visible aspects of this, compared to the earlier situation,
-include support for DIGEST-MD5 and NTLM.
+** Gnus uses narrowing to hide headers in Message buffers. The
+`References' header is hidden by default. To make all headers visible,
+use `(setq message-hidden-headers nil)'. *Note Message Headers:
+(message)Message Headers.
-** ManageSieve connections uses the SASL library by default.
+\f
+* Changes in back ends
-The primary change this brings is support for DIGEST-MD5 and NTLM,
-when the server support it.
+** The nntp back end stores article marks in `~/News/marks'.
-** Gnus include a password cache mechanism in password.el.
+The directory can be changed using the (customizable) variable
+`nntp-marks-directory', and marks can be disabled using the (back end)
+variable `nntp-marks-is-evil'. The advantage of this is that you can
+copy `~/News/marks' (using rsync, scp or whatever) to another Gnus
+installation, and it will realize what articles you have read and
+marked. The data in `~/News/marks' has priority over the same data in
+`~/.newsrc.eld'.
-It is enabled by default (see `password-cache'), with a short timeout
-of 16 seconds (see `password-cache-expiry'). If PGG is used as the
-PGP back end, the PGP passphrase is managed by this mechanism.
-Passwords for ManageSieve connections are managed by this mechanism,
-after quering the user about whether to do so.
+** You can import and export your RSS subscriptions from OPML files. *Note
+RSS::.
** IMAP identity (RFC 2971) is supported.
-By default, Gnus do not send any information about itself, but you can
+By default, Gnus does not send any information about itself, but you can
customize it using the variable `nnimap-id'.
-** The `all.SCORE' file can be edited from the group buffer using `W e'.
+** The `nnrss' back end now supports multilingual text. Non-ASCII group
+names for the `nnrss' groups are also supported. *Note RSS::.
-** Gnus now MIME decode articles even when they lack "MIME-Version"
-header. This changes the default of `gnus-article-loose-mime'.
+** Retrieving mail with POP3 is supported over SSL/TLS and with StartTLS.
-** Gnus now view DNS master files sent as text/dns using dns-mode.
+** The nnml back end allows other compression programs beside `gzip' for
+compressed message files. *Note Mail Spool::.
-** Gnus now support the "hashcash" client puzzle anti-spam idea. See
-the Gnus manual, section Hashcash, for more information. Use `(setq
-message-generate-hashcash t)' to enable.
+\f
+* Appearance
-** Gnus supports new limiting commands in the Summary buffer: `/ r'
-(`gnus-summary-limit-to-replied') and `/ R'
-(`gnus-summary-limit-to-recipient'). *Note Limiting::.
+** The tool bar has been updated to use GNOME icons. You can also
+customize the tool bar. There's no documentation in the manual yet, but
+`M-x customize-apropos RET -tool-bar$' should get you started. (Only
+for Emacs, not in XEmacs.)
-** Gnus supports a new sort command in the Summary buffer: `C-c C-s C-t'
-(`gnus-summary-sort-by-recipient'). *Note Summary Sorting::
+** The tool bar icons are now (de)activated correctly in the group buffer,
+see the variable `gnus-group-update-tool-bar'. Its default value
+depends on your Emacs version.
-** The `nnrss' back end now supports multilingual text. Non-ASCII group
-names for the `nnrss' groups are also supported. *Note RSS::.
+** You can change the location of XEmacs' toolbars in Gnus buffers. See
+`gnus-use-toolbar' and `message-use-toolbar'.
-** URLs inside OpenPGP: headers are retrieved and imported to your PGP
-key ring when you click on them.
-** Gnus uses narrowing to hide headers in Message buffers. The
-`References' header is hidden by default. To make all headers
-visible, use `(setq message-hidden-headers nil)'.
+\f
+* Miscellaneous changes
-** `gnus-decay-scores' can be a regexp matching score files. This
-allows to decay only adaptive score files. *Note Score Decays::.
+** Having edited the select-method for the foreign server in the server
+buffer is immediately reflected to the subscription of the groups which
+use the server in question. For instance, if you change
+`nntp-via-address' into `bar.example.com' from `foo.example.com', Gnus
+will connect to the news host by way of the intermediate host
+`bar.example.com' from next time.
+
+** The `all.SCORE' file can be edited from the group buffer using `W e'.
-** S/MIME now feature LDAP user certificate searches. You need to
-configure the server in `smime-ldap-host-list'.
\f
* For older news, see Gnus info node "New Features".
----------------------------------------------------------------------
Copyright information:
-Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ 2006 Free Software Foundation, Inc.
Permission is granted to anyone to make or distribute verbatim copies
of this document as received, in any medium, provided that the
EMACS = @EMACS@
XEMACS = @EMACS@
+GZIP_PROG = gzip -f
+
+# # # # # # # # # # Release variables (for maintainer only):
+#
+# Files removed from `cvs export' output before creating the tar-ball:
+CVS_IGNORE_FILES = .cvsignore contrib/.cvsignore etc/.cvsignore \
+ lisp/.cvsignore texi/.cvsignore texi/ps/.cvsignore .arch-inventory
+# Name and mail address in ChangeLog format for the release commit:
+COMMITTER = Lars Magne Ingebrigtsen <lars@ingebrigtsen.no>
+# CODENAME for development releases (CODENAME must have a trailing space,
+# (e.g. "Oort ")
+CODENAME =
+# Codename initial (lower case), e.g. 'n' for "No Gnus".
+CIN =
+# Files with hard-coded versions numbers:
+RELEASE_COMMIT_FILES = ChangeLog README \
+ lisp/ChangeLog lisp/gnus.el \
+ texi/ChangeLog texi/gnus.texi texi/message.texi texi/gnus-faq.texi
+# Pattern matching previous version(s):
+OLD_PATTERN = \(5.10.[0-9]*\|0\.[1-9][0-9]*\)
+# CVS tag of the previous version:
+OLD_TAG = v5-10-6
+# CVS tag of the current release:
+TAG = v5-10
+#
+# Procedure:
+# - release-bump-version
+# - release-commit
+# - release-files or release-files-signed
+#
+# # # # # # # # # # End of release variables
+
all: lick info
lick:
cd texi && $(MAKE) EMACS="$(EMACS)" install
cd etc && $(MAKE) EMACS="$(EMACS)" install
+list-installed-shadows:
+ cd lisp && $(MAKE) EMACS="$(EMACS)" lispdir="$(lispdir)" list-installed-shadows
+
+remove-installed-shadows:
+ cd lisp && $(MAKE) EMACS="$(EMACS)" lispdir="$(lispdir)" remove-installed-shadows
+
uninstall:
cd lisp && $(MAKE) lispdir="$(lispdir)" uninstall
cd texi && $(MAKE) uninstall
cd texi && $(MAKE) EMACS="$(EMACS)" all
clean:
- rm -f */*.orig */*.rej *.orig *.rej
+ for i in lisp texi etc texi/ps; do (cd $$i; $(MAKE) clean); done
+ rm -f *.orig *.rej *~
elclean:
- rm lisp/*.elc
+ cd lisp && rm -f *.elc auto-autoloads.el custom-load.el gnus-load.el
x:
$(MAKE) EMACS=$(XEMACS)
xsome:
$(MAKE) EMACS="$(XEMACS)" some
-distclean:
- make clean
- rm -rf *~
- for i in lisp texi etc texi/ps; do (cd $$i; make distclean); done
+distclean: clean
+ for i in lisp texi etc texi/ps; do (cd $$i; $(MAKE) distclean); done
rm -f config.log config.status config.cache Makefile
config.status: $(srcdir)/configure
Makefile: $(srcdir)/Makefile.in config.status
CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
+# # # # # # # # # # Release targets (for maintainer only):
+
+release-check-settings:
+ @echo
+ @echo "COMMITTER = '$(COMMITTER)'"
+ @echo " (example: 'Foo Bar <foo.bar@somewhere.invalid>')"
+ @echo "VERSION = '$(VERSION)' (example: '5.10.6')"
+ @echo "CODENAME = '$(CODENAME)' (example: 'No ')"
+ @echo "CIN = '$(CIN)' (example: 'n', codename initial)"
+ @echo "TAG = '$(TAG)' (example: 'v5-10-6')"
+ @echo "OLD_TAG = '$(OLD_TAG)' (example: 'v5-10-5')"
+ @echo
+ @if [ x"$(VERSION)" = x ]; then echo "error: No VERSION given."; exit 1; else :; fi
+ @if [ x"$(TAG)" = x ]; then echo "error: No TAG given."; exit 1; else :; fi
+ @echo
+ @echo Settings checked successfully.
+ @echo
+ @echo You may now make...
+ @echo release-bump-version
+ @echo release-commit
+ @echo release-files or release-files-signed
+
+# Needs GNU grep and a recent GNU sed:
+release-bump-version: release-check-settings
+ sed -i -e '/^(defconst gnus-version-number /s,"$(OLD_PATTERN)","$(VERSION)",' lisp/gnus.el
+ sed -i -e '/^.newcommand{.gnusversionname}{[A-Za-z ]*Gnus v/s,$(OLD_PATTERN),$(VERSION),' texi/gnus.texi
+ sed -i -e '/^This manual corresponds to [A-Za-z ]*Gnus v/s,$(OLD_PATTERN),$(VERSION),' texi/gnus.texi
+ sed -i -e '/^corresponding to this manual is [A-Za-z ]*Gnus v/s,$(OLD_PATTERN),$(VERSION),' texi/message.texi
+ sed -i -e 's,/[a-z]*gnus-[0-9.]*/,/$(CIN)gnus-$(VERSION)/,' README
+ if [ "x$(CODENAME)" = "x" ]; then \
+ sed -i -e '/The current release ($(OLD_PATTERN)) should/s,$(OLD_PATTERN),$(VERSION),' texi/gnus-faq.texi; \
+ else \
+ true; \
+ fi
+ @if grep -q "$(CODENAME)Gnus v$(VERSION) is released" ChangeLog; then \
+ echo "ChangeLog is already updated"; \
+ else \
+ sed -i -e "1s|^|`date -I` $(COMMITTER)\n\n\t* README: $(CODENAME)Gnus v$(VERSION) is released.\n\n|" ChangeLog; \
+ fi
+ @if grep -q "$(CODENAME)Gnus v$(VERSION) is released" texi/ChangeLog; then \
+ echo "texi/ChangeLog is already updated"; \
+ else \
+ sed -i -e "1s|^|`date -I` $(COMMITTER)\n\n\t* gnus.texi, gnus-faq.texi, message.texi: $(CODENAME)Gnus v$(VERSION) is released.\n\n|" texi/ChangeLog; \
+ fi
+ @if grep -q "$(CODENAME)Gnus v$(VERSION) is released" lisp/ChangeLog; then \
+ echo "lisp/ChangeLog is already updated"; \
+ else \
+ sed -i -e "1s|^|`date -I` $(COMMITTER)\n\n\t* gnus.el: $(CODENAME)Gnus v$(VERSION) is released.\n\n|" lisp/ChangeLog; \
+ fi
+ cvs diff -U0 $(RELEASE_COMMIT_FILES); sleep 2
+
+release-revert-files:
+ rm -i $(RELEASE_COMMIT_FILES)
+ cvs update $(RELEASE_COMMIT_FILES)
+
+release-commit: release-check-settings
+ @echo -e '\007'
+ @echo
+ @echo "Really do the release-commit for $(CODENAME)Gnus v$(VERSION)?"
+ @echo "Command line:"
+ @echo " " cvs commit -m "$(CODENAME)Gnus v$(VERSION) is released." $(RELEASE_COMMIT_FILES)
+ @echo
+ @echo "Hit RET to continue or Ctrl-C to abort."
+ @echo
+ @read dummy
+ cvs commit -m "$(CODENAME)Gnus v$(VERSION) is released." $(RELEASE_COMMIT_FILES)
+ @echo
+ @echo "Add tag $(TAG) to CVS?"
+ @echo "Command line:"
+ @echo " " cvs tag $(TAG)
+ @echo "Hit RET to continue or Ctrl-C to abort."
+ @echo
+ @read dummy
+ cvs tag $(TAG)
+
+release-files: release-make-tar-ball release-diff
+ @echo "Release files have been created:"
+ @ls -l $(CIN)gnus-$(VERSION).tar.gz
+ @ls -l $(CIN)gnus-`echo $(OLD_TAG)%$(TAG)|tr - .|tr -d v|tr % -`.diff.gz
+
+release-files-signed: release-files release-sign-files
+
+# Sign prepared files:
+release-sign-files:
+ if [ "x$$GPG_AGENT_INFO" = "x" ]; then \
+ read -sp "Enter pass phrase: " phrase ; \
+ gpg_opt="--passphrase-fd 0"; \
+ else \
+ gpg_opt=""; phrase=""; \
+ fi; \
+ for i in $(CIN)gnus-$(VERSION).tar.gz \
+ $(CIN)gnus-`echo $(OLD_TAG)%$(TAG)|tr - .|tr -d v|tr % -`.diff.gz; do \
+ rm -f $$i.sig; \
+ echo "$$phrase" | gpg --detach-sign $$gpg_opt $$i; \
+ done; true
+ @ls -l $(CIN)gnus-$(VERSION).tar.gz{.sig,}
+ @ls -l $(CIN)gnus-`echo $(OLD_TAG)%$(TAG)|tr - .|tr -d v|tr % -`.diff.gz{.sig,}
+ @gpg --verify $(CIN)gnus-$(VERSION).tar.gz{.sig,}
+ @gpg --verify $(CIN)gnus-`echo $(OLD_TAG)%$(TAG)|tr - .|tr -d v|tr % -`.diff.gz{.sig,}
+
+release-cvs-export $(CIN)gnus-$(VERSION): release-check-settings
+ rm -fr $(CIN)gnus-$(VERSION)
+ cvs export -d $(CIN)gnus-$(VERSION) -r $(TAG) gnus
+
+release-make-tar-ball: $(CIN)gnus-$(VERSION)
+ [ -d $(CIN)gnus-$(VERSION) ] && cd $(CIN)gnus-$(VERSION) && \
+ rm $(CVS_IGNORE_FILES) || true
+ tar zcvf $(CIN)gnus-$(VERSION).tar.gz $(CIN)gnus-$(VERSION)
+ ls -l $(CIN)gnus-$(VERSION).tar.gz
+
+# Make a diff between current and previous release. Example:
+# ftp://quimby.gnus.org/pub/gnus/ding-patches/gnus-5.10.5-5.10.6.diff.gz
+release-diff: release-check-settings
+ cvs diff -r $(OLD_TAG) -r $(TAG) | sed -e '/^\? /d' > temp.diff || true
+ mv temp.diff $(CIN)gnus-`echo $(OLD_TAG)%$(TAG)|tr - .|tr -d v|tr % -`.diff
+ $(GZIP_PROG) $(CIN)gnus-`echo $(OLD_TAG)%$(TAG)|tr - .|tr -d v|tr % -`.diff
+ ls -l $(CIN)gnus-`echo $(OLD_TAG)%$(TAG)|tr - .|tr -d v|tr % -`.diff.gz
+
+release-post-clean: release-check-settings
+ rm -fr $(CIN)gnus-$(TAG) temp.diff
+
+# # # # # # # # # # End of release targets
+
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
-This package contains a beta version of Gnus. The lisp directory
-contains the source lisp files, and the texi directory contains a
-draft of the Gnus info pages.
+This package contains a development version of Gnus. The lisp directory
+contains the source lisp files, and the texi directory contains the Gnus info
+pages.
To use Gnus you first have to unpack the files, which you've obviously
done, because you are reading this.
-You should definitely byte-compile the source files. To do that, you
+You should definitely byte-compile the source files. To do that, you
can simply say "./configure && make" in this directory.
Do not say "make install". I repeat, do *NOT* say "make install". If
If you are using XEmacs, you *must* say "./configure && make EMACS=xemacs".
-Then you have to tell Emacs where Gnus is. You might put something
+Then you have to tell Emacs where Gnus is. You might put something
like
- (setq load-path (cons (expand-file-name "~/gnus-5.6.53/lisp") load-path))
+ (setq load-path (cons (expand-file-name "~/ngnus-0.4/lisp") load-path))
(require 'gnus-load)
in your .emacs file, or wherever you keep such things.
To enable reading the Gnus manual, you could say something like:
(require 'info)
- (setq Info-default-directory-list
- (cons "~/gnus-5.6.53/texi" Info-default-directory-list))
+ (if (featurep 'xemacs)
+ (add-to-list 'Info-directory-list "~/ngnus-0.4/texi/")
+ (add-to-list 'Info-default-directory-list "~/ngnus-0.4/texi/"))
-or
-
- (require 'info)
- (setq Info-directory-list
- (cons "~/gnus-5.6.53/texi" Info-directory-list))
-
-depending on which version of Emacs or XEmacs you're using.
-
-Note that Gnus and GNUS can't coexist in a single Emacs. They both use
-the same function and variable names. If you have been running GNUS
-in your Emacs, you should probably exit that Emacs and start a new one
-to fire up Gnus.
-
-Gnus does absolutely not work with anything older than Emacs 21.1 or
-XEmacs 21.4. You definitely need a relatively current Emacs.
+No Gnus does absolutely not work with anything older than Emacs 21.1 or
+XEmacs 21.4.
To compile the Gnus manual, you either need a pretty new Emacs, or a
pretty new version of the texinfo tools.
Then you do a `M-x gnus', and everything should... uhm... it should
-work, but it might not. Set `debug-on-error' to t, and mail me the
+work, but it might not. Set `debug-on-error' to t, and mail me the
backtraces, or, better yet, find out why Gnus does something wrong,
-fix it, and send me the diffs. :-)
+fix it, and send me the diffs. :-)
There are four main things I want your help and input on:
-1) Startup. Does everything go smoothly, and why not?
+1) Startup. Does everything go smoothly, and why not?
2) Any errors while you read news normally?
bit, and features you would like to see.
Send any comments and all your bug fixes/complaints to
-`bugs@gnus.org'.
+`bugs@gnus.org'.
datadir="\$(prefix)/lib"
lispdir="\$(datadir)/${EMACS_FLAVOR}/site-packages/lisp/gnus"
else
- lispdir="\$(datadir)/${EMACS_FLAVOR}/site-lisp"
+ lispdir="\$(datadir)/${EMACS_FLAVOR}/site-lisp/gnus"
fi
for thedir in share lib; do
potential=
if test "$EMACS_FLAVOR" = "xemacs"; then
lispdir="\$(prefix)/${thedir}/${EMACS_FLAVOR}/site-packages/lisp/gnus"
else
- lispdir="\$(datadir)/${EMACS_FLAVOR}/site-lisp"
+ lispdir="\$(datadir)/${EMACS_FLAVOR}/site-lisp/gnus"
fi
break
fi
if test "$EMACS_FLAVOR" = "xemacs"; then
etcdir="\$(lispdir)/../../etc"
else
- etcdir="\$(lispdir)/../etc"
+ etcdir="\$(lispdir)/../../etc"
fi
fi
AC_MSG_RESULT($etcdir)
#! /bin/sh
-
# Guess values for system-dependent variables and create Makefiles.
-# Generated automatically using autoconf version 2.13
-# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+# Generated by GNU Autoconf 2.59.
#
+# Copyright (C) 2003 Free Software Foundation, Inc.
# This configure script is free software; the Free Software Foundation
# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
-# Defaults:
-ac_help=
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+ ;;
+ esac
+ # We did not find ourselves, most probably we were run as `sh COMMAND'
+ # in which case we are not to be found in the path.
+ if test "x$as_myself" = x; then
+ as_myself=$0
+ fi
+ if test ! -f "$as_myself"; then
+ { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
ac_default_prefix=/usr/local
-# Any additions from configure.in:
-ac_help="$ac_help
- --with-xemacs Use XEmacs to build"
-ac_help="$ac_help
- --with-emacs Use Emacs to build"
-ac_help="$ac_help
- --with-lispdir=DIR Where to install lisp files"
-ac_help="$ac_help
- --with-etcdir=DIR Where to install etc files"
-ac_help="$ac_help
- --with-url=DIR Specify where to find the url package"
-ac_help="$ac_help
- --with-w3=DIR Specify where to find the w3 package"
-ac_help="$ac_help
- --with-fonts Assume all fonts required are available"
+ac_config_libobj_dir=.
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete. It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+
+ac_unique_file="lisp/gnus.el"
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS SET_MAKE INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA MAKEINFO EMACS XEMACS EMACS_FLAVOR lispdir etcdir info_dir HAVE_url URL HAVE_w3_forms W3 FLAGS LATEX WITH_FONTS_bembo WITHOUT_FONTS_bembo WITH_FONTS_pfu WITHOUT_FONTS_pfu WITH_FONTS_bcr WITHOUT_FONTS_bcr USE_FONTS LIBOBJS LTLIBOBJS'
+ac_subst_files=''
# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
# The variables have the same names as the options, with
# dashes changed to underlines.
-build=NONE
-cache_file=./config.cache
+cache_file=/dev/null
exec_prefix=NONE
-host=NONE
no_create=
-nonopt=NONE
no_recursion=
prefix=NONE
program_prefix=NONE
silent=
site=
srcdir=
-target=NONE
verbose=
x_includes=NONE
x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
bindir='${exec_prefix}/bin'
sbindir='${exec_prefix}/sbin'
libexecdir='${exec_prefix}/libexec'
infodir='${prefix}/info'
mandir='${prefix}/man'
-# Initialize some other variables.
-subdirs=
-MFLAGS= MAKEFLAGS=
-SHELL=${CONFIG_SHELL-/bin/sh}
-# Maximum number of lines to put in a shell here document.
-ac_max_here_lines=12
-
ac_prev=
for ac_option
do
-
# If the previous option needs an argument, assign it.
if test -n "$ac_prev"; then
eval "$ac_prev=\$ac_option"
continue
fi
- case "$ac_option" in
- -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
- *) ac_optarg= ;;
- esac
+ ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
# Accept the important Cygnus configure options, so we can diagnose typos.
- case "$ac_option" in
+ case $ac_option in
-bindir | --bindir | --bindi | --bind | --bin | --bi)
ac_prev=bindir ;;
-bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
- bindir="$ac_optarg" ;;
+ bindir=$ac_optarg ;;
-build | --build | --buil | --bui | --bu)
- ac_prev=build ;;
+ ac_prev=build_alias ;;
-build=* | --build=* | --buil=* | --bui=* | --bu=*)
- build="$ac_optarg" ;;
+ build_alias=$ac_optarg ;;
-cache-file | --cache-file | --cache-fil | --cache-fi \
| --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
ac_prev=cache_file ;;
-cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
| --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
- cache_file="$ac_optarg" ;;
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
-datadir | --datadir | --datadi | --datad | --data | --dat | --da)
ac_prev=datadir ;;
-datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
| --da=*)
- datadir="$ac_optarg" ;;
+ datadir=$ac_optarg ;;
-disable-* | --disable-*)
- ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+ ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
# Reject names that are not valid shell variable names.
- if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
- { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
- fi
- ac_feature=`echo $ac_feature| sed 's/-/_/g'`
- eval "enable_${ac_feature}=no" ;;
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ eval "enable_$ac_feature=no" ;;
-enable-* | --enable-*)
- ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+ ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
# Reject names that are not valid shell variable names.
- if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
- { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
- fi
- ac_feature=`echo $ac_feature| sed 's/-/_/g'`
- case "$ac_option" in
- *=*) ;;
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
*) ac_optarg=yes ;;
esac
- eval "enable_${ac_feature}='$ac_optarg'" ;;
+ eval "enable_$ac_feature='$ac_optarg'" ;;
-exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
| --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
-exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
| --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
| --exec=* | --exe=* | --ex=*)
- exec_prefix="$ac_optarg" ;;
+ exec_prefix=$ac_optarg ;;
-gas | --gas | --ga | --g)
# Obsolete; use --with-gas.
with_gas=yes ;;
- -help | --help | --hel | --he)
- # Omit some internal or obsolete options to make the list less imposing.
- # This message is too long to be a string in the A/UX 3.1 sh.
- cat << EOF
-Usage: configure [options] [host]
-Options: [defaults in brackets after descriptions]
-Configuration:
- --cache-file=FILE cache test results in FILE
- --help print this message
- --no-create do not create output files
- --quiet, --silent do not print \`checking...' messages
- --version print the version of autoconf that created configure
-Directory and file names:
- --prefix=PREFIX install architecture-independent files in PREFIX
- [$ac_default_prefix]
- --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
- [same as prefix]
- --bindir=DIR user executables in DIR [EPREFIX/bin]
- --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
- --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
- --datadir=DIR read-only architecture-independent data in DIR
- [PREFIX/share]
- --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
- --sharedstatedir=DIR modifiable architecture-independent data in DIR
- [PREFIX/com]
- --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
- --libdir=DIR object code libraries in DIR [EPREFIX/lib]
- --includedir=DIR C header files in DIR [PREFIX/include]
- --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
- --infodir=DIR info documentation in DIR [PREFIX/info]
- --mandir=DIR man documentation in DIR [PREFIX/man]
- --srcdir=DIR find the sources in DIR [configure dir or ..]
- --program-prefix=PREFIX prepend PREFIX to installed program names
- --program-suffix=SUFFIX append SUFFIX to installed program names
- --program-transform-name=PROGRAM
- run sed PROGRAM on installed program names
-EOF
- cat << EOF
-Host type:
- --build=BUILD configure for building on BUILD [BUILD=HOST]
- --host=HOST configure for HOST [guessed]
- --target=TARGET configure for TARGET [TARGET=HOST]
-Features and packages:
- --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
- --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
- --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
- --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
- --x-includes=DIR X include files are in DIR
- --x-libraries=DIR X library files are in DIR
-EOF
- if test -n "$ac_help"; then
- echo "--enable and --with options recognized:$ac_help"
- fi
- exit 0 ;;
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
-host | --host | --hos | --ho)
- ac_prev=host ;;
+ ac_prev=host_alias ;;
-host=* | --host=* | --hos=* | --ho=*)
- host="$ac_optarg" ;;
+ host_alias=$ac_optarg ;;
-includedir | --includedir | --includedi | --included | --include \
| --includ | --inclu | --incl | --inc)
ac_prev=includedir ;;
-includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
| --includ=* | --inclu=* | --incl=* | --inc=*)
- includedir="$ac_optarg" ;;
+ includedir=$ac_optarg ;;
-infodir | --infodir | --infodi | --infod | --info | --inf)
ac_prev=infodir ;;
-infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
- infodir="$ac_optarg" ;;
+ infodir=$ac_optarg ;;
-libdir | --libdir | --libdi | --libd)
ac_prev=libdir ;;
-libdir=* | --libdir=* | --libdi=* | --libd=*)
- libdir="$ac_optarg" ;;
+ libdir=$ac_optarg ;;
-libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
| --libexe | --libex | --libe)
ac_prev=libexecdir ;;
-libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
| --libexe=* | --libex=* | --libe=*)
- libexecdir="$ac_optarg" ;;
+ libexecdir=$ac_optarg ;;
-localstatedir | --localstatedir | --localstatedi | --localstated \
| --localstate | --localstat | --localsta | --localst \
-localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
| --localstate=* | --localstat=* | --localsta=* | --localst=* \
| --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
- localstatedir="$ac_optarg" ;;
+ localstatedir=$ac_optarg ;;
-mandir | --mandir | --mandi | --mand | --man | --ma | --m)
ac_prev=mandir ;;
-mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
- mandir="$ac_optarg" ;;
+ mandir=$ac_optarg ;;
-nfp | --nfp | --nf)
# Obsolete; use --without-fp.
with_fp=no ;;
-no-create | --no-create | --no-creat | --no-crea | --no-cre \
- | --no-cr | --no-c)
+ | --no-cr | --no-c | -n)
no_create=yes ;;
-no-recursion | --no-recursion | --no-recursio | --no-recursi \
-oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
| --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
| --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
- oldincludedir="$ac_optarg" ;;
+ oldincludedir=$ac_optarg ;;
-prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
ac_prev=prefix ;;
-prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
- prefix="$ac_optarg" ;;
+ prefix=$ac_optarg ;;
-program-prefix | --program-prefix | --program-prefi | --program-pref \
| --program-pre | --program-pr | --program-p)
ac_prev=program_prefix ;;
-program-prefix=* | --program-prefix=* | --program-prefi=* \
| --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
- program_prefix="$ac_optarg" ;;
+ program_prefix=$ac_optarg ;;
-program-suffix | --program-suffix | --program-suffi | --program-suff \
| --program-suf | --program-su | --program-s)
ac_prev=program_suffix ;;
-program-suffix=* | --program-suffix=* | --program-suffi=* \
| --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
- program_suffix="$ac_optarg" ;;
+ program_suffix=$ac_optarg ;;
-program-transform-name | --program-transform-name \
| --program-transform-nam | --program-transform-na \
| --program-transfo=* | --program-transf=* \
| --program-trans=* | --program-tran=* \
| --progr-tra=* | --program-tr=* | --program-t=*)
- program_transform_name="$ac_optarg" ;;
+ program_transform_name=$ac_optarg ;;
-q | -quiet | --quiet | --quie | --qui | --qu | --q \
| -silent | --silent | --silen | --sile | --sil)
ac_prev=sbindir ;;
-sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
| --sbi=* | --sb=*)
- sbindir="$ac_optarg" ;;
+ sbindir=$ac_optarg ;;
-sharedstatedir | --sharedstatedir | --sharedstatedi \
| --sharedstated | --sharedstate | --sharedstat | --sharedsta \
| --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
| --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
| --sha=* | --sh=*)
- sharedstatedir="$ac_optarg" ;;
+ sharedstatedir=$ac_optarg ;;
-site | --site | --sit)
ac_prev=site ;;
-site=* | --site=* | --sit=*)
- site="$ac_optarg" ;;
+ site=$ac_optarg ;;
-srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
ac_prev=srcdir ;;
-srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
- srcdir="$ac_optarg" ;;
+ srcdir=$ac_optarg ;;
-sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
| --syscon | --sysco | --sysc | --sys | --sy)
ac_prev=sysconfdir ;;
-sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
| --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
- sysconfdir="$ac_optarg" ;;
+ sysconfdir=$ac_optarg ;;
-target | --target | --targe | --targ | --tar | --ta | --t)
- ac_prev=target ;;
+ ac_prev=target_alias ;;
-target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
- target="$ac_optarg" ;;
+ target_alias=$ac_optarg ;;
-v | -verbose | --verbose | --verbos | --verbo | --verb)
verbose=yes ;;
- -version | --version | --versio | --versi | --vers)
- echo "configure generated by autoconf version 2.13"
- exit 0 ;;
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
-with-* | --with-*)
- ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+ ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
# Reject names that are not valid shell variable names.
- if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
- { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
- fi
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
ac_package=`echo $ac_package| sed 's/-/_/g'`
- case "$ac_option" in
- *=*) ;;
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
*) ac_optarg=yes ;;
esac
- eval "with_${ac_package}='$ac_optarg'" ;;
+ eval "with_$ac_package='$ac_optarg'" ;;
-without-* | --without-*)
- ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+ ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
# Reject names that are not valid shell variable names.
- if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
- { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
- fi
- ac_package=`echo $ac_package| sed 's/-/_/g'`
- eval "with_${ac_package}=no" ;;
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package | sed 's/-/_/g'`
+ eval "with_$ac_package=no" ;;
--x)
# Obsolete; use --with-x.
ac_prev=x_includes ;;
-x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
| --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
- x_includes="$ac_optarg" ;;
+ x_includes=$ac_optarg ;;
-x-libraries | --x-libraries | --x-librarie | --x-librari \
| --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
ac_prev=x_libraries ;;
-x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
| --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
- x_libraries="$ac_optarg" ;;
+ x_libraries=$ac_optarg ;;
- -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+ -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; }
;;
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+ { (exit 1); exit 1; }; }
+ ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+ eval "$ac_envvar='$ac_optarg'"
+ export $ac_envvar ;;
+
*)
- if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
- echo "configure: warning: $ac_option: invalid host type" 1>&2
- fi
- if test "x$nonopt" != xNONE; then
- { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
- fi
- nonopt="$ac_option"
+ # FIXME: should be removed in autoconf 3.0.
+ echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
;;
esac
done
if test -n "$ac_prev"; then
- { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ { echo "$as_me: error: missing argument to $ac_option" >&2
+ { (exit 1); exit 1; }; }
fi
-trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
-
-# File descriptor usage:
-# 0 standard input
-# 1 file creation
-# 2 errors and warnings
-# 3 some systems may open it to /dev/tty
-# 4 used on the Kubota Titan
-# 6 checking for... messages and results
-# 5 compiler messages saved in config.log
-if test "$silent" = yes; then
- exec 6>/dev/null
-else
- exec 6>&1
-fi
-exec 5>./config.log
-
-echo "\
-This file contains any messages produced by compilers while
-running configure, to aid debugging if configure makes a mistake.
-" 1>&5
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
-# Strip out --no-create and --no-recursion so they do not pile up.
-# Also quote any args containing shell metacharacters.
-ac_configure_args=
-for ac_arg
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+ localstatedir libdir includedir oldincludedir infodir mandir
do
- case "$ac_arg" in
- -no-create | --no-create | --no-creat | --no-crea | --no-cre \
- | --no-cr | --no-c) ;;
- -no-recursion | --no-recursion | --no-recursio | --no-recursi \
- | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
- *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
- ac_configure_args="$ac_configure_args '$ac_arg'" ;;
- *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
esac
done
-# NLS nuisances.
-# Only set these to C if already set. These must not be set unconditionally
-# because not all systems understand e.g. LANG=C (notably SCO).
-# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
-# Non-C LC_CTYPE values break the ctype check.
-if test "${LANG+set}" = set; then LANG=C; export LANG; fi
-if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
-if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
-if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+ If a cross compiler is detected then cross compile mode will be used." >&2
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
-# confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -rf conftest* confdefs.h
-# AIX cpp loses on an empty file, so make sure it contains at least a newline.
-echo > confdefs.h
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
-# A filename unique to this package, relative to the directory that
-# configure is in, which we can look for to find out if srcdir is correct.
-ac_unique_file=lisp/gnus.el
# Find the source files, if location was not specified.
if test -z "$srcdir"; then
ac_srcdir_defaulted=yes
# Try the directory containing this script, then its parent.
- ac_prog=$0
- ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
- test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+ ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$0" : 'X\(//\)[^/]' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
srcdir=$ac_confdir
if test ! -r $srcdir/$ac_unique_file; then
srcdir=..
fi
if test ! -r $srcdir/$ac_unique_file; then
if test "$ac_srcdir_defaulted" = yes; then
- { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+ { (exit 1); exit 1; }; }
else
- { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+ { (exit 1); exit 1; }; }
fi
fi
-srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
+ { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+ { (exit 1); exit 1; }; }
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+_ACEOF
+
+ cat <<_ACEOF
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --infodir=DIR info documentation [PREFIX/info]
+ --mandir=DIR man documentation [PREFIX/man]
+_ACEOF
+
+ cat <<\_ACEOF
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+
+ cat <<\_ACEOF
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-xemacs Use XEmacs to build
+ --with-emacs Use Emacs to build
+ --with-lispdir=DIR Where to install lisp files
+ --with-etcdir=DIR Where to install etc files
+ --with-url=DIR Specify where to find the url package
+ --with-w3=DIR Specify where to find the w3 package
+ --with-fonts Assume all fonts required are available
+
+_ACEOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ ac_popdir=`pwd`
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d $ac_dir || continue
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+ cd $ac_dir
+ # Check for guested configure; otherwise get Cygnus style configure.
+ if test -f $ac_srcdir/configure.gnu; then
+ echo
+ $SHELL $ac_srcdir/configure.gnu --help=recursive
+ elif test -f $ac_srcdir/configure; then
+ echo
+ $SHELL $ac_srcdir/configure --help=recursive
+ elif test -f $ac_srcdir/configure.ac ||
+ test -f $ac_srcdir/configure.in; then
+ echo
+ $ac_configure --help
+ else
+ echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi
+ cd $ac_popdir
+ done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+ cat <<\_ACEOF
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit 0
+fi
+exec 5>config.log
+cat >&5 <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo = `(hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ echo "PATH: $as_dir"
+done
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_sep=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+ 2)
+ ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+ # Get rid of the leading space.
+ ac_sep=" "
+ ;;
+ esac
+ done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+{
+ (set) 2>&1 |
+ case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ sed -n \
+ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+ ;;
+ *)
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+}
+ echo
+
+ cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=$`echo $ac_var`
+ echo "$ac_var='"'"'$ac_val'"'"'"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ cat <<\_ASBOX
+## ------------- ##
+## Output files. ##
+## ------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=$`echo $ac_var`
+ echo "$ac_var='"'"'$ac_val'"'"'"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+ echo
+ sed "/^$/d" confdefs.h | sort
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ echo "$as_me: caught signal $ac_signal"
+ echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core &&
+ rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+ ' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
# Prefer explicitly selected file to automatically selected ones.
if test -z "$CONFIG_SITE"; then
if test "x$prefix" != xNONE; then
fi
for ac_site_file in $CONFIG_SITE; do
if test -r "$ac_site_file"; then
- echo "loading site script $ac_site_file"
+ { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
. "$ac_site_file"
fi
done
if test -r "$cache_file"; then
- echo "loading cache $cache_file"
- . $cache_file
+ # Some versions of bash will fail to source /dev/null (special
+ # files actually), so we avoid doing that.
+ if test -f "$cache_file"; then
+ { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . $cache_file;;
+ *) . ./$cache_file;;
+ esac
+ fi
else
- echo "creating cache $cache_file"
- > $cache_file
+ { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+ sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+ eval ac_new_val="\$ac_env_${ac_var}_value"
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { echo "$as_me:$LINENO: former value: $ac_old_val" >&5
+echo "$as_me: former value: $ac_old_val" >&2;}
+ { echo "$as_me:$LINENO: current value: $ac_new_val" >&5
+echo "$as_me: current value: $ac_new_val" >&2;}
+ ac_cache_corrupted=:
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+ { (exit 1); exit 1; }; }
fi
ac_ext=c
-# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
-cross_compiling=$ac_cv_prog_cc_cross
-
-ac_exeext=
-ac_objext=o
-if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
- # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
- if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
- ac_n= ac_c='
-' ac_t=' '
- else
- ac_n=-n ac_c= ac_t=
- fi
-else
- ac_n= ac_c='\c' ac_t=
-fi
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
-echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
-echo "configure:540: checking whether ${MAKE-make} sets \${MAKE}" >&5
-set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
+
+
+
+
+
+
+
+
+
+
+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
else
- cat > conftestmake <<\EOF
+ cat >conftest.make <<\_ACEOF
all:
- @echo 'ac_maketemp="${MAKE}"'
-EOF
+ @echo 'ac_maketemp="$(MAKE)"'
+_ACEOF
# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
-eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
if test -n "$ac_maketemp"; then
eval ac_cv_prog_make_${ac_make}_set=yes
else
eval ac_cv_prog_make_${ac_make}_set=no
fi
-rm -f conftestmake
+rm -f conftest.make
fi
if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
- echo "$ac_t""yes" 1>&6
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
SET_MAKE=
else
- echo "$ac_t""no" 1>&6
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
SET_MAKE="MAKE=${MAKE-make}"
fi
ac_aux_dir=$ac_dir
ac_install_sh="$ac_aux_dir/install.sh -c"
break
+ elif test -f $ac_dir/shtool; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/shtool install -c"
+ break
fi
done
if test -z "$ac_aux_dir"; then
- { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+ { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
+echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+ { (exit 1); exit 1; }; }
fi
-ac_config_guess=$ac_aux_dir/config.guess
-ac_config_sub=$ac_aux_dir/config.sub
-ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
# Find a good install program. We prefer a C program (faster),
# so one script is as good as another. But avoid the broken or
# SunOS /usr/etc/install
# IRIX /sbin/install
# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
# AFS /usr/afsws/bin/install, which mishandles nonexistent args
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
# ./install, which can be erroneously created by make from ./install.sh.
-echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:597: checking for a BSD compatible install" >&5
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
if test -z "$INSTALL"; then
-if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
+if test "${ac_cv_path_install+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
else
- IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":"
- for ac_dir in $PATH; do
- # Account for people who put trailing slashes in PATH elements.
- case "$ac_dir/" in
- /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
- *)
- # OSF1 and SCO ODT 3.0 have their own names for install.
- # Don't use installbsd from OSF since it installs stuff as root
- # by default.
- for ac_prog in ginstall scoinst install; do
- if test -f $ac_dir/$ac_prog; then
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+ ./ | .// | /cC/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
if test $ac_prog = install &&
- grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
# AIX install. It has an incompatible calling convention.
:
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
else
- ac_cv_path_install="$ac_dir/$ac_prog -c"
- break 2
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
fi
fi
done
- ;;
- esac
- done
- IFS="$ac_save_IFS"
+ done
+ ;;
+esac
+done
+
fi
if test "${ac_cv_path_install+set}" = set; then
- INSTALL="$ac_cv_path_install"
+ INSTALL=$ac_cv_path_install
else
# As a last resort, use the slow shell script. We don't cache a
# path for INSTALL within a source directory, because that will
# break other packages using the cache if that directory is
# removed, or if the path is relative.
- INSTALL="$ac_install_sh"
+ INSTALL=$ac_install_sh
fi
fi
-echo "$ac_t""$INSTALL" 1>&6
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
# It thinks the first close brace ends the variable substitution.
test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
EMACS=""
fi
+
# Check whether --with-xemacs or --without-xemacs was given.
if test "${with_xemacs+set}" = set; then
withval="$with_xemacs"
- if test "${withval}" = "yes"; then EMACS=xemacs; else EMACS=${withval}; fi
-fi
+ if test "${withval}" = "yes"; then EMACS=xemacs; else EMACS=${withval}; fi
+fi;
# Check whether --with-emacs or --without-emacs was given.
if test "${with_emacs+set}" = set; then
withval="$with_emacs"
- if test "${withval}" = "yes"; then EMACS=emacs; else EMACS=${withval}; fi
-fi
-
+ if test "${withval}" = "yes"; then EMACS=emacs; else EMACS=${withval}; fi
+fi;
# Extract the first word of "makeinfo", so it can be a program name with args.
set dummy makeinfo; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:669: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_MAKEINFO'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_MAKEINFO+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
else
if test -n "$MAKEINFO"; then
ac_cv_prog_MAKEINFO="$MAKEINFO" # Let the user override the test.
else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_prog_MAKEINFO="makeinfo"
- break
- fi
- done
- IFS="$ac_save_ifs"
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_MAKEINFO="makeinfo"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
test -z "$ac_cv_prog_MAKEINFO" && ac_cv_prog_MAKEINFO="no"
fi
fi
-MAKEINFO="$ac_cv_prog_MAKEINFO"
+MAKEINFO=$ac_cv_prog_MAKEINFO
if test -n "$MAKEINFO"; then
- echo "$ac_t""$MAKEINFO" 1>&6
+ echo "$as_me:$LINENO: result: $MAKEINFO" >&5
+echo "${ECHO_T}$MAKEINFO" >&6
else
- echo "$ac_t""no" 1>&6
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
fi
# Extract the first word of "emacs", so it can be a program name with args.
set dummy emacs; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:700: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_prog_EMACS'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_EMACS+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
else
if test -n "$EMACS"; then
ac_cv_prog_EMACS="$EMACS" # Let the user override the test.
else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_prog_EMACS="emacs"
- break
- fi
- done
- IFS="$ac_save_ifs"
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_EMACS="emacs"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
test -z "$ac_cv_prog_EMACS" && ac_cv_prog_EMACS="xemacs"
fi
fi
-EMACS="$ac_cv_prog_EMACS"
+EMACS=$ac_cv_prog_EMACS
if test -n "$EMACS"; then
- echo "$ac_t""$EMACS" 1>&6
+ echo "$as_me:$LINENO: result: $EMACS" >&5
+echo "${ECHO_T}$EMACS" >&6
else
- echo "$ac_t""no" 1>&6
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
fi
-
- echo $ac_n "checking if $EMACS is really XEmacs""... $ac_c" 1>&6
-echo "configure:731: checking if $EMACS is really XEmacs" >&5
-
+
+ echo "$as_me:$LINENO: checking if $EMACS is really XEmacs" >&5
+echo $ECHO_N "checking if $EMACS is really XEmacs... $ECHO_C" >&6
+
elisp="(if (string-match \"XEmacs\" emacs-version) \"yes\" \"no\") "
if test -z ""noecho""; then
- echo $ac_n "checking for xemacsp""... $ac_c" 1>&6
-echo "configure:736: checking for xemacsp" >&5
+ echo "$as_me:$LINENO: checking for xemacsp" >&5
+echo $ECHO_N "checking for xemacsp... $ECHO_C" >&6
fi
-if eval "test \"`echo '$''{'EMACS_cv_SYS_xemacsp'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
+if test "${EMACS_cv_SYS_xemacsp+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
else
-
+
OUTPUT=./conftest-$$
- echo ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))" >& 5 2>&1
+ echo ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))" >& 5 2>&1
${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp x) (princ x 'ignore) (prin1-to-string x)) nil \"${OUTPUT}\"nil 5))" >& 5 2>&1
retval=`cat ${OUTPUT}`
echo "=> ${retval}" >& 5 2>&1
xemacsp=${EMACS_cv_SYS_xemacsp}
if test -z ""noecho""; then
- echo "$ac_t""$xemacsp" 1>&6
+ echo "$as_me:$LINENO: result: $xemacsp" >&5
+echo "${ECHO_T}$xemacsp" >&6
fi
XEMACS=${EMACS_cv_SYS_xemacsp}
if test "$XEMACS" = "yes"; then
EMACS_FLAVOR=xemacs
fi
- echo "$ac_t""$XEMACS" 1>&6
-
-
+ echo "$as_me:$LINENO: result: $XEMACS" >&5
+echo "${ECHO_T}$XEMACS" >&6
+
+
if test "$prefix" = "NONE"; then
- echo $ac_n "checking prefix for your Emacs""... $ac_c" 1>&6
-echo "configure:768: checking prefix for your Emacs" >&5
-
+ echo "$as_me:$LINENO: checking prefix for your Emacs" >&5
+echo $ECHO_N "checking prefix for your Emacs... $ECHO_C" >&6
+
elisp="(expand-file-name \"..\" invocation-directory)"
if test -z ""noecho""; then
- echo $ac_n "checking for prefix""... $ac_c" 1>&6
-echo "configure:773: checking for prefix" >&5
+ echo "$as_me:$LINENO: checking for prefix" >&5
+echo $ECHO_N "checking for prefix... $ECHO_C" >&6
fi
-if eval "test \"`echo '$''{'EMACS_cv_SYS_prefix'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
+if test "${EMACS_cv_SYS_prefix+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
else
-
+
OUTPUT=./conftest-$$
- echo ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))" >& 5 2>&1
+ echo ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))" >& 5 2>&1
${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp x) (princ x 'ignore) (prin1-to-string x)) nil \"${OUTPUT}\"nil 5))" >& 5 2>&1
retval=`cat ${OUTPUT}`
echo "=> ${retval}" >& 5 2>&1
prefix=${EMACS_cv_SYS_prefix}
if test -z ""noecho""; then
- echo "$ac_t""$prefix" 1>&6
+ echo "$as_me:$LINENO: result: $prefix" >&5
+echo "${ECHO_T}$prefix" >&6
fi
prefix=${EMACS_cv_SYS_prefix}
- echo "$ac_t""$prefix" 1>&6
+ echo "$as_me:$LINENO: result: $prefix" >&5
+echo "${ECHO_T}$prefix" >&6
fi
- # Check whether --with-lispdir or --without-lispdir was given.
+
+# Check whether --with-lispdir or --without-lispdir was given.
if test "${with_lispdir+set}" = set; then
withval="$with_lispdir"
lispdir=${withval}
-fi
-
- echo $ac_n "checking where .elc files should go""... $ac_c" 1>&6
-echo "configure:804: checking where .elc files should go" >&5
+fi;
+ echo "$as_me:$LINENO: checking where .elc files should go" >&5
+echo $ECHO_N "checking where .elc files should go... $ECHO_C" >&6
if test -z "$lispdir"; then
theprefix=$prefix
if test "x$theprefix" = "xNONE"; then
datadir="\$(prefix)/lib"
lispdir="\$(datadir)/${EMACS_FLAVOR}/site-packages/lisp/gnus"
else
- lispdir="\$(datadir)/${EMACS_FLAVOR}/site-lisp"
+ lispdir="\$(datadir)/${EMACS_FLAVOR}/site-lisp/gnus"
fi
for thedir in share lib; do
potential=
if test "$EMACS_FLAVOR" = "xemacs"; then
lispdir="\$(prefix)/${thedir}/${EMACS_FLAVOR}/site-packages/lisp/gnus"
else
- lispdir="\$(datadir)/${EMACS_FLAVOR}/site-lisp"
+ lispdir="\$(datadir)/${EMACS_FLAVOR}/site-lisp/gnus"
fi
break
fi
done
fi
- echo "$ac_t""$lispdir" 1>&6
-
+ echo "$as_me:$LINENO: result: $lispdir" >&5
+echo "${ECHO_T}$lispdir" >&6
+
+
- # Check whether --with-etcdir or --without-etcdir was given.
+# Check whether --with-etcdir or --without-etcdir was given.
if test "${with_etcdir+set}" = set; then
withval="$with_etcdir"
etcdir=${withval}
-fi
-
- echo $ac_n "checking where etc files should go""... $ac_c" 1>&6
-echo "configure:839: checking where etc files should go" >&5
+fi;
+ echo "$as_me:$LINENO: checking where etc files should go" >&5
+echo $ECHO_N "checking where etc files should go... $ECHO_C" >&6
if test -z "$etcdir"; then
if test "$EMACS_FLAVOR" = "xemacs"; then
etcdir="\$(lispdir)/../../etc"
else
- etcdir="\$(lispdir)/../etc"
+ etcdir="\$(lispdir)/../../etc"
fi
fi
- echo "$ac_t""$etcdir" 1>&6
-
+ echo "$as_me:$LINENO: result: $etcdir" >&5
+echo "${ECHO_T}$etcdir" >&6
- echo $ac_n "checking where the TeXinfo docs should go""... $ac_c" 1>&6
-echo "configure:852: checking where the TeXinfo docs should go" >&5
+
+ echo "$as_me:$LINENO: checking where the TeXinfo docs should go" >&5
+echo $ECHO_N "checking where the TeXinfo docs should go... $ECHO_C" >&6
if test "$infodir" = "\${prefix}/info"; then
if test "$EMACS_FLAVOR" = "xemacs"; then
info_dir="\$(prefix)/${thedir}/${EMACS_FLAVOR}/site-packages/info"
else
info_dir=$infodir
fi
- echo "$ac_t""$info_dir" 1>&6
-
+ echo "$as_me:$LINENO: result: $info_dir" >&5
+echo "${ECHO_T}$info_dir" >&6
+
-echo $ac_n "checking for acceptable URL version""... $ac_c" 1>&6
-echo "configure:867: checking for acceptable URL version" >&5
-if eval "test \"`echo '$''{'EMACS_cv_ACCEPTABLE_URL'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
+echo "$as_me:$LINENO: checking for acceptable URL version" >&5
+echo $ECHO_N "checking for acceptable URL version... $ECHO_C" >&6
+if test "${EMACS_cv_ACCEPTABLE_URL+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
else
-
+
if test -z ""noecho""; then
- echo $ac_n "checking for url-retrieve in url""... $ac_c" 1>&6
-echo "configure:875: checking for url-retrieve in url" >&5
+ echo "$as_me:$LINENO: checking for url-retrieve in url" >&5
+echo $ECHO_N "checking for url-retrieve in url... $ECHO_C" >&6
fi
library=`echo url | tr _ -`
elisp="(progn (fmakunbound 'url-retrieve) (condition-case nil (progn (require '$library) (fboundp 'url-retrieve)) (error (prog1 nil (message \"$library not found\")))))"
if test -z ""noecho""; then
- echo $ac_n "checking for url""... $ac_c" 1>&6
-echo "configure:882: checking for url" >&5
+ echo "$as_me:$LINENO: checking for url" >&5
+echo $ECHO_N "checking for url... $ECHO_C" >&6
fi
-if eval "test \"`echo '$''{'EMACS_cv_SYS_url'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
+if test "${EMACS_cv_SYS_url+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
else
-
+
OUTPUT=./conftest-$$
- echo ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))" >& 5 2>&1
+ echo ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))" >& 5 2>&1
${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp x) (princ x 'ignore) (prin1-to-string x)) nil \"${OUTPUT}\"nil 5))" >& 5 2>&1
retval=`cat ${OUTPUT}`
echo "=> ${retval}" >& 5 2>&1
url=${EMACS_cv_SYS_url}
if test -z ""noecho""; then
- echo "$ac_t""$url" 1>&6
+ echo "$as_me:$LINENO: result: $url" >&5
+echo "${ECHO_T}$url" >&6
fi
if test "${EMACS_cv_SYS_url}" = "nil"; then
HAVE_url=${EMACS_cv_SYS_url}
if test -z ""noecho""; then
- echo "$ac_t""$HAVE_url" 1>&6
+ echo "$as_me:$LINENO: result: $HAVE_url" >&5
+echo "${ECHO_T}$HAVE_url" >&6
fi
if test "${HAVE_url}" = "yes"; then
fi
if test "${EMACS_cv_ACCEPTABLE_URL}" = "yes"; then
-
+
elisp="(file-name-directory (locate-library \"url\"))"
if test -z ""noecho""; then
- echo $ac_n "checking for url_dir""... $ac_c" 1>&6
-echo "configure:926: checking for url_dir" >&5
+ echo "$as_me:$LINENO: checking for url_dir" >&5
+echo $ECHO_N "checking for url_dir... $ECHO_C" >&6
fi
-if eval "test \"`echo '$''{'EMACS_cv_SYS_url_dir'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
+if test "${EMACS_cv_SYS_url_dir+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
else
-
+
OUTPUT=./conftest-$$
- echo ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))" >& 5 2>&1
+ echo ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))" >& 5 2>&1
${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp x) (princ x 'ignore) (prin1-to-string x)) nil \"${OUTPUT}\"nil 5))" >& 5 2>&1
retval=`cat ${OUTPUT}`
echo "=> ${retval}" >& 5 2>&1
url_dir=${EMACS_cv_SYS_url_dir}
if test -z ""noecho""; then
- echo "$ac_t""$url_dir" 1>&6
+ echo "$as_me:$LINENO: result: $url_dir" >&5
+echo "${ECHO_T}$url_dir" >&6
fi
EMACS_cv_ACCEPTABLE_URL=$EMACS_cv_SYS_url_dir
fi
- # Check whether --with-url or --without-url was given.
+
+# Check whether --with-url or --without-url was given.
if test "${with_url+set}" = set; then
withval="$with_url"
- EMACS_cv_ACCEPTABLE_URL=`( cd $withval && pwd || echo "$withval" ) 2> /dev/null`
-fi
-
+ EMACS_cv_ACCEPTABLE_URL=`( cd $withval && pwd || echo "$withval" ) 2> /dev/null`
+fi;
URL=${EMACS_cv_ACCEPTABLE_URL}
-
- echo "$ac_t"""${URL}"" 1>&6
+ echo "$as_me:$LINENO: result: \"${URL}\"" >&5
+echo "${ECHO_T}\"${URL}\"" >&6
-echo $ac_n "checking for acceptable W3 version""... $ac_c" 1>&6
-echo "configure:964: checking for acceptable W3 version" >&5
-if eval "test \"`echo '$''{'EMACS_cv_ACCEPTABLE_W3'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
+
+echo "$as_me:$LINENO: checking for acceptable W3 version" >&5
+echo $ECHO_N "checking for acceptable W3 version... $ECHO_C" >&6
+if test "${EMACS_cv_ACCEPTABLE_W3+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
else
-
+
if test -z ""noecho""; then
- echo $ac_n "checking for w3-form-encode-xwfu in w3_forms""... $ac_c" 1>&6
-echo "configure:972: checking for w3-form-encode-xwfu in w3_forms" >&5
+ echo "$as_me:$LINENO: checking for w3-form-encode-xwfu in w3_forms" >&5
+echo $ECHO_N "checking for w3-form-encode-xwfu in w3_forms... $ECHO_C" >&6
fi
library=`echo w3_forms | tr _ -`
elisp="(progn (fmakunbound 'w3-form-encode-xwfu) (condition-case nil (progn (require '$library) (fboundp 'w3-form-encode-xwfu)) (error (prog1 nil (message \"$library not found\")))))"
if test -z ""noecho""; then
- echo $ac_n "checking for w3_forms""... $ac_c" 1>&6
-echo "configure:979: checking for w3_forms" >&5
+ echo "$as_me:$LINENO: checking for w3_forms" >&5
+echo $ECHO_N "checking for w3_forms... $ECHO_C" >&6
fi
-if eval "test \"`echo '$''{'EMACS_cv_SYS_w3_forms'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
+if test "${EMACS_cv_SYS_w3_forms+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
else
-
+
OUTPUT=./conftest-$$
- echo ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))" >& 5 2>&1
+ echo ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))" >& 5 2>&1
${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp x) (princ x 'ignore) (prin1-to-string x)) nil \"${OUTPUT}\"nil 5))" >& 5 2>&1
retval=`cat ${OUTPUT}`
echo "=> ${retval}" >& 5 2>&1
w3_forms=${EMACS_cv_SYS_w3_forms}
if test -z ""noecho""; then
- echo "$ac_t""$w3_forms" 1>&6
+ echo "$as_me:$LINENO: result: $w3_forms" >&5
+echo "${ECHO_T}$w3_forms" >&6
fi
if test "${EMACS_cv_SYS_w3_forms}" = "nil"; then
HAVE_w3_forms=${EMACS_cv_SYS_w3_forms}
if test -z ""noecho""; then
- echo "$ac_t""$HAVE_w3_forms" 1>&6
+ echo "$as_me:$LINENO: result: $HAVE_w3_forms" >&5
+echo "${ECHO_T}$HAVE_w3_forms" >&6
fi
if test "${HAVE_w3_forms}" = "yes"; then
fi
if test "${EMACS_cv_ACCEPTABLE_W3}" = "yes"; then
-
+
elisp="(file-name-directory (locate-library \"w3-forms\"))"
if test -z ""noecho""; then
- echo $ac_n "checking for w3_dir""... $ac_c" 1>&6
-echo "configure:1023: checking for w3_dir" >&5
+ echo "$as_me:$LINENO: checking for w3_dir" >&5
+echo $ECHO_N "checking for w3_dir... $ECHO_C" >&6
fi
-if eval "test \"`echo '$''{'EMACS_cv_SYS_w3_dir'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
+if test "${EMACS_cv_SYS_w3_dir+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
else
-
+
OUTPUT=./conftest-$$
- echo ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))" >& 5 2>&1
+ echo ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))" >& 5 2>&1
${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp x) (princ x 'ignore) (prin1-to-string x)) nil \"${OUTPUT}\"nil 5))" >& 5 2>&1
retval=`cat ${OUTPUT}`
echo "=> ${retval}" >& 5 2>&1
w3_dir=${EMACS_cv_SYS_w3_dir}
if test -z ""noecho""; then
- echo "$ac_t""$w3_dir" 1>&6
+ echo "$as_me:$LINENO: result: $w3_dir" >&5
+echo "${ECHO_T}$w3_dir" >&6
fi
EMACS_cv_ACCEPTABLE_W3=$EMACS_cv_SYS_w3_dir
fi
- # Check whether --with-w3 or --without-w3 was given.
+
+# Check whether --with-w3 or --without-w3 was given.
if test "${with_w3+set}" = set; then
withval="$with_w3"
- EMACS_cv_ACCEPTABLE_W3=`( cd $withval && pwd || echo "$withval" ) 2> /dev/null`
-fi
-
+ EMACS_cv_ACCEPTABLE_W3=`( cd $withval && pwd || echo "$withval" ) 2> /dev/null`
+fi;
W3=${EMACS_cv_ACCEPTABLE_W3}
-
- echo "$ac_t"""${W3}"" 1>&6
+
+ echo "$as_me:$LINENO: result: \"${W3}\"" >&5
+echo "${ECHO_T}\"${W3}\"" >&6
- echo $ac_n "checking which options to pass on to (X)Emacs""... $ac_c" 1>&6
-echo "configure:1061: checking which options to pass on to (X)Emacs" >&5
+ echo "$as_me:$LINENO: checking which options to pass on to (X)Emacs" >&5
+echo $ECHO_N "checking which options to pass on to (X)Emacs... $ECHO_C" >&6
if test "x$FLAGS" = "x"; then
if test "$EMACS_FLAVOR" = "xemacs"; then
FLAGS="-batch -no-autoloads -l \$(srcdir)/dgnushack.el"
else
FLAGS=$FLAGS
fi
- echo "$ac_t""$FLAGS" 1>&6
-
+ echo "$as_me:$LINENO: result: $FLAGS" >&5
+echo "${ECHO_T}$FLAGS" >&6
+
test "$LATEX" = t && LATEX=
test "$LATEX" || for ac_prog in latex
do
-# Extract the first word of "$ac_prog", so it can be a program name with args.
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1081: checking for $ac_word" >&5
-if eval "test \"`echo '$''{'ac_cv_path_LATEX'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_LATEX+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
else
- case "$LATEX" in
- /*)
+ case $LATEX in
+ [\\/]* | ?:[\\/]*)
ac_cv_path_LATEX="$LATEX" # Let the user override the test with a path.
;;
- ?:/*)
- ac_cv_path_LATEX="$LATEX" # Let the user override the test with a dos path.
- ;;
*)
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$ac_word; then
- ac_cv_path_LATEX="$ac_dir/$ac_word"
- break
- fi
- done
- IFS="$ac_save_ifs"
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_LATEX="$as_dir/$ac_word$ac_exec_ext"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
;;
esac
fi
-LATEX="$ac_cv_path_LATEX"
+LATEX=$ac_cv_path_LATEX
+
if test -n "$LATEX"; then
- echo "$ac_t""$LATEX" 1>&6
+ echo "$as_me:$LINENO: result: $LATEX" >&5
+echo "${ECHO_T}$LATEX" >&6
else
- echo "$ac_t""no" 1>&6
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
fi
-test -n "$LATEX" && break
+ test -n "$LATEX" && break
done
test -n "$LATEX" || LATEX="no"
-echo $ac_n "checking for available fonts""... $ac_c" 1>&6
-echo "configure:1118: checking for available fonts" >&5
+echo "$as_me:$LINENO: checking for available fonts" >&5
+echo $ECHO_N "checking for available fonts... $ECHO_C" >&6
+
# Check whether --with-fonts or --without-fonts was given.
if test "${with_fonts+set}" = set; then
withval="$with_fonts"
USE_FONTS="$withval"
-fi
-
+fi;
WITH_FONTS_bembo='%'
WITHOUT_FONTS_bembo=
WITH_FONTS_pfu='%'
else
OUTPUT=./conftest-$$
echo '\nonstopmode\documentclass{article}\usepackage{bembo}\begin{document}\end{document}' > ${OUTPUT}
- if ${LATEX} ${OUTPUT} </dev/null >& 5 2>&1 ; then
+ if ${LATEX} ${OUTPUT} </dev/null >& 5 2>&1 ; then
if test -z "${USE_FONTS}"; then
USE_FONTS="Adobe Bembo"
else
fi
echo '\nonstopmode\documentclass{article}\begin{document}{\fontfamily{pfu}\fontsize{10pt}{10}\selectfont test}\end{document}' > ${OUTPUT}
if retval=`${LATEX} ${OUTPUT} </dev/null 2>& 5`; then
- if echo "$retval" | grep 'Some font shapes were not available' >& 5 2>&1 ; then
+ if echo "$retval" | grep 'Some font shapes were not available' >& 5 2>&1 ; then
:
else
if test -z "${USE_FONTS}"; then
fi
echo '\nonstopmode\documentclass{article}\begin{document}{\fontfamily{bcr}\fontsize{10pt}{10}\selectfont test}\end{document}' > ${OUTPUT}
if retval=`${LATEX} ${OUTPUT} </dev/null 2>& 5`; then
- if echo "$retval" | grep 'Some font shapes were not available' >& 5 2>&1 ; then
+ if echo "$retval" | grep 'Some font shapes were not available' >& 5 2>&1 ; then
:
else
if test -z "${USE_FONTS}"; then
USE_FONTS=no
fi
USE_FONTS=`echo "${USE_FONTS}" | sed 's/,\([^,]*\)$/ and\1/'`
-echo "$ac_t"""${USE_FONTS}"" 1>&6
+echo "$as_me:$LINENO: result: \"${USE_FONTS}\"" >&5
+echo "${ECHO_T}\"${USE_FONTS}\"" >&6
if test "${USE_FONTS}" = yes ; then
USE_FONTS='Set in Adobe Bembo, Adobe Futura and Bitstream Courier.'
elif test "${USE_FONTS}" = no ; then
-trap '' 1 2 15
-cat > confcache <<\EOF
+ ac_config_files="$ac_config_files Makefile etc/Makefile lisp/Makefile texi/Makefile texi/gnusconfig.tex texi/ps/Makefile"
+cat >confcache <<\_ACEOF
# This file is a shell script that caches the results of configure
# tests run on this system so they can be shared between configure
-# scripts and configure runs. It is not useful on other systems.
-# If it contains results you don't want to keep, you may remove or edit it.
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
#
-# By default, configure uses ./config.cache as the cache file,
-# creating it if it does not exist already. You can give configure
-# the --cache-file=FILE option to use a different cache file; that is
-# what configure does when it calls configure scripts in
-# subdirectories, so they share the cache.
-# Giving --cache-file=/dev/null disables caching, for debugging configure.
-# config.status only pays attention to the cache file if you give it the
-# --recheck option to rerun configure.
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
#
-EOF
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
# The following way of writing the cache mishandles newlines in values,
# but we know of no workaround that is simple, portable, and efficient.
# So, don't put newlines in cache variables' values.
# Ultrix sh set writes to stderr and can't be redirected directly,
# and sets the high bit in the cache file unless we assign to the vars.
-(set) 2>&1 |
- case `(ac_space=' '; set | grep ac_space) 2>&1` in
- *ac_space=\ *)
- # `set' does not quote correctly, so add quotes (double-quote substitution
- # turns \\\\ into \\, and sed turns \\ into \).
- sed -n \
- -e "s/'/'\\\\''/g" \
- -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
- ;;
- *)
- # `set' quotes correctly as required by POSIX, so do not add quotes.
- sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
- ;;
- esac >> confcache
-if cmp -s $cache_file confcache; then
- :
-else
+{
+ (set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+} |
+ sed '
+ t clear
+ : clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ : end' >>confcache
+if diff $cache_file confcache >/dev/null 2>&1; then :; else
if test -w $cache_file; then
- echo "updating cache $cache_file"
- cat confcache > $cache_file
+ test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+ cat confcache >$cache_file
else
echo "not updating unwritable cache $cache_file"
fi
fi
rm -f confcache
-trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
-
test "x$prefix" = xNONE && prefix=$ac_default_prefix
# Let make expand exec_prefix.
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-# Any assignment to VPATH causes Sun make to only execute
-# the first set of double-colon rules, so remove it if not needed.
-# If there is a colon in the path, we need to keep it.
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
if test "x$srcdir" = x.; then
- ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
+ ac_vpsub='/^[ ]*VPATH[ ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[ ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[ ]*$//;
+}'
fi
-trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
-
# Transform confdefs.h into DEFS.
# Protect against shell expansion while executing Makefile rules.
# Protect against Makefile macro expansion.
-cat > conftest.defs <<\EOF
-s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
-s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g
-s%\[%\\&%g
-s%\]%\\&%g
-s%\$%$$%g
-EOF
-DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
-rm -f conftest.defs
-
-
-# Without the "./", some shells look in PATH for config.status.
-: ${CONFIG_STATUS=./config.status}
+#
+# If the first sed substitution is executed (which looks for macros that
+# take arguments), then we branch to the quote section. Otherwise,
+# look for a macro that doesn't take arguments.
+cat >confdef2opt.sed <<\_ACEOF
+t clear
+: clear
+s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g
+t quote
+s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g
+t quote
+d
+: quote
+s,[ `~#$^&*(){}\\|;'"<>?],\\&,g
+s,\[,\\&,g
+s,\],\\&,g
+s,\$,$$,g
+p
+_ACEOF
+# We use echo to avoid assuming a particular line-breaking character.
+# The extra dot is to prevent the shell from consuming trailing
+# line-breaks from the sub-command output. A line-break within
+# single-quotes doesn't work because, if this script is created in a
+# platform that uses two characters for line-breaks (e.g., DOS), tr
+# would break.
+ac_LF_and_DOT=`echo; echo .`
+DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'`
+rm -f confdef2opt.sed
+
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_i=`echo "$ac_i" |
+ sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
+ # 2. Add them.
+ ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
+ ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
-echo creating $CONFIG_STATUS
-rm -f $CONFIG_STATUS
-cat > $CONFIG_STATUS <<EOF
-#! /bin/sh
-# Generated automatically by configure.
+LTLIBOBJS=$ac_ltlibobjs
+
+
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
# Run this file to recreate the current configuration.
-# This directory was configured as follows,
-# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
-#
-# $0 $ac_configure_args
-#
# Compiler output produced by configure, useful for debugging
-# configure, is in ./config.log if it exists.
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
-ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
-for ac_option
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
do
- case "\$ac_option" in
- -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
- echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
- exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
- -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
- echo "$CONFIG_STATUS generated by autoconf version 2.13"
- exit 0 ;;
- -help | --help | --hel | --he | --h)
- echo "\$ac_cs_usage"; exit 0 ;;
- *) echo "\$ac_cs_usage"; exit 1 ;;
- esac
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ $as_unset $as_var
+ fi
done
-ac_given_srcdir=$srcdir
-ac_given_INSTALL="$INSTALL"
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
-trap 'rm -fr `echo "Makefile etc/Makefile lisp/Makefile texi/Makefile texi/gnusconfig.tex texi/ps/Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
-EOF
-cat >> $CONFIG_STATUS <<EOF
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
-# Protect against being on the right side of a sed subst in config.status.
-sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
- s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
-$ac_vpsub
-$extrasub
-s%@SHELL@%$SHELL%g
-s%@CFLAGS@%$CFLAGS%g
-s%@CPPFLAGS@%$CPPFLAGS%g
-s%@CXXFLAGS@%$CXXFLAGS%g
-s%@FFLAGS@%$FFLAGS%g
-s%@DEFS@%$DEFS%g
-s%@LDFLAGS@%$LDFLAGS%g
-s%@LIBS@%$LIBS%g
-s%@exec_prefix@%$exec_prefix%g
-s%@prefix@%$prefix%g
-s%@program_transform_name@%$program_transform_name%g
-s%@bindir@%$bindir%g
-s%@sbindir@%$sbindir%g
-s%@libexecdir@%$libexecdir%g
-s%@datadir@%$datadir%g
-s%@sysconfdir@%$sysconfdir%g
-s%@sharedstatedir@%$sharedstatedir%g
-s%@localstatedir@%$localstatedir%g
-s%@libdir@%$libdir%g
-s%@includedir@%$includedir%g
-s%@oldincludedir@%$oldincludedir%g
-s%@infodir@%$infodir%g
-s%@mandir@%$mandir%g
-s%@SET_MAKE@%$SET_MAKE%g
-s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
-s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
-s%@INSTALL_DATA@%$INSTALL_DATA%g
-s%@MAKEINFO@%$MAKEINFO%g
-s%@EMACS@%$EMACS%g
-s%@XEMACS@%$XEMACS%g
-s%@EMACS_FLAVOR@%$EMACS_FLAVOR%g
-s%@lispdir@%$lispdir%g
-s%@etcdir@%$etcdir%g
-s%@info_dir@%$info_dir%g
-s%@HAVE_url@%$HAVE_url%g
-s%@URL@%$URL%g
-s%@HAVE_w3_forms@%$HAVE_w3_forms%g
-s%@W3@%$W3%g
-s%@FLAGS@%$FLAGS%g
-s%@LATEX@%$LATEX%g
-s%@WITH_FONTS_bembo@%$WITH_FONTS_bembo%g
-s%@WITHOUT_FONTS_bembo@%$WITHOUT_FONTS_bembo%g
-s%@WITH_FONTS_pfu@%$WITH_FONTS_pfu%g
-s%@WITHOUT_FONTS_pfu@%$WITHOUT_FONTS_pfu%g
-s%@WITH_FONTS_bcr@%$WITH_FONTS_bcr%g
-s%@WITHOUT_FONTS_bcr@%$WITHOUT_FONTS_bcr%g
-s%@USE_FONTS@%$USE_FONTS%g
-CEOF
-EOF
-
-cat >> $CONFIG_STATUS <<\EOF
-
-# Split the substitutions into bite-sized pieces for seds with
-# small command number limits, like on Digital OSF/1 and HP-UX.
-ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
-ac_file=1 # Number of current file.
-ac_beg=1 # First line for current file.
-ac_end=$ac_max_sed_cmds # Line after last line for current file.
-ac_more_lines=:
-ac_sed_cmds=""
-while $ac_more_lines; do
- if test $ac_beg -gt 1; then
- sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
- else
- sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+ ;;
+ esac
+ # We did not find ourselves, most probably we were run as `sh COMMAND'
+ # in which case we are not to be found in the path.
+ if test "x$as_myself" = x; then
+ as_myself=$0
+ fi
+ if test ! -f "$as_myself"; then
+ { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+ { (exit 1); exit 1; }; }
fi
- if test ! -s conftest.s$ac_file; then
- ac_more_lines=false
- rm -f conftest.s$ac_file
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
else
- if test -z "$ac_sed_cmds"; then
- ac_sed_cmds="sed -f conftest.s$ac_file"
- else
- ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
- fi
- ac_file=`expr $ac_file + 1`
- ac_beg=$ac_end
- ac_end=`expr $ac_end + $ac_max_sed_cmds`
+ as_ln_s='ln -s'
fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling. Logging --version etc. is OK.
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+ echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+ echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+ echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+ echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number, then exit
+ -q, --quiet do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Report bugs to <bug-autoconf@gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.59,
+ with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+INSTALL="$INSTALL"
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value. By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=*)
+ ac_option=`expr "x$1" : 'x\([^=]*\)='`
+ ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ -*)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ *) # This is not an option, so the user has probably given explicit
+ # arguments.
+ ac_option=$1
+ ac_need_defaults=false;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --vers* | -V )
+ echo "$ac_cs_version"; exit 0 ;;
+ --he | --h)
+ # Conflict between --help and --header
+ { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; };;
+ --help | --hel | -h )
+ echo "$ac_cs_usage"; exit 0 ;;
+ --debug | --d* | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+ ac_need_defaults=false;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; } ;;
+
+ *) ac_config_targets="$ac_config_targets $1" ;;
+
+ esac
+ shift
done
-if test -z "$ac_sed_cmds"; then
- ac_sed_cmds=cat
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
fi
-EOF
-cat >> $CONFIG_STATUS <<EOF
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+ echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+ exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
-CONFIG_FILES=\${CONFIG_FILES-"Makefile etc/Makefile lisp/Makefile texi/Makefile texi/gnusconfig.tex texi/ps/Makefile"}
-EOF
-cat >> $CONFIG_STATUS <<\EOF
-for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
- # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
- case "$ac_file" in
- *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
- ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
- *) ac_file_in="${ac_file}.in" ;;
+_ACEOF
+
+
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+ case "$ac_config_target" in
+ # Handling of arguments.
+ "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "etc/Makefile" ) CONFIG_FILES="$CONFIG_FILES etc/Makefile" ;;
+ "lisp/Makefile" ) CONFIG_FILES="$CONFIG_FILES lisp/Makefile" ;;
+ "texi/Makefile" ) CONFIG_FILES="$CONFIG_FILES texi/Makefile" ;;
+ "texi/gnusconfig.tex" ) CONFIG_FILES="$CONFIG_FILES texi/gnusconfig.tex" ;;
+ "texi/ps/Makefile" ) CONFIG_FILES="$CONFIG_FILES texi/ps/Makefile" ;;
+ *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+ { (exit 1); exit 1; }; };;
esac
+done
- # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason to put it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+ trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+ trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+} ||
+{
+ tmp=./confstat$$-$RANDOM
+ (umask 077 && mkdir $tmp)
+} ||
+{
+ echo "$me: cannot create a temporary directory in ." >&2
+ { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
- # Remove last slash and all that follows it. Not all systems have dirname.
- ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
- if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
- # The file is in a subdirectory.
- test ! -d "$ac_dir" && mkdir "$ac_dir"
- ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
- # A "../" for each directory in $ac_dir_suffix.
- ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
- else
- ac_dir_suffix= ac_dots=
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+ # Protect against being on the right side of a sed subst in config.status.
+ sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+ s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s,@SHELL@,$SHELL,;t t
+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s,@exec_prefix@,$exec_prefix,;t t
+s,@prefix@,$prefix,;t t
+s,@program_transform_name@,$program_transform_name,;t t
+s,@bindir@,$bindir,;t t
+s,@sbindir@,$sbindir,;t t
+s,@libexecdir@,$libexecdir,;t t
+s,@datadir@,$datadir,;t t
+s,@sysconfdir@,$sysconfdir,;t t
+s,@sharedstatedir@,$sharedstatedir,;t t
+s,@localstatedir@,$localstatedir,;t t
+s,@libdir@,$libdir,;t t
+s,@includedir@,$includedir,;t t
+s,@oldincludedir@,$oldincludedir,;t t
+s,@infodir@,$infodir,;t t
+s,@mandir@,$mandir,;t t
+s,@build_alias@,$build_alias,;t t
+s,@host_alias@,$host_alias,;t t
+s,@target_alias@,$target_alias,;t t
+s,@DEFS@,$DEFS,;t t
+s,@ECHO_C@,$ECHO_C,;t t
+s,@ECHO_N@,$ECHO_N,;t t
+s,@ECHO_T@,$ECHO_T,;t t
+s,@LIBS@,$LIBS,;t t
+s,@SET_MAKE@,$SET_MAKE,;t t
+s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s,@INSTALL_DATA@,$INSTALL_DATA,;t t
+s,@MAKEINFO@,$MAKEINFO,;t t
+s,@EMACS@,$EMACS,;t t
+s,@XEMACS@,$XEMACS,;t t
+s,@EMACS_FLAVOR@,$EMACS_FLAVOR,;t t
+s,@lispdir@,$lispdir,;t t
+s,@etcdir@,$etcdir,;t t
+s,@info_dir@,$info_dir,;t t
+s,@HAVE_url@,$HAVE_url,;t t
+s,@URL@,$URL,;t t
+s,@HAVE_w3_forms@,$HAVE_w3_forms,;t t
+s,@W3@,$W3,;t t
+s,@FLAGS@,$FLAGS,;t t
+s,@LATEX@,$LATEX,;t t
+s,@WITH_FONTS_bembo@,$WITH_FONTS_bembo,;t t
+s,@WITHOUT_FONTS_bembo@,$WITHOUT_FONTS_bembo,;t t
+s,@WITH_FONTS_pfu@,$WITH_FONTS_pfu,;t t
+s,@WITHOUT_FONTS_pfu@,$WITHOUT_FONTS_pfu,;t t
+s,@WITH_FONTS_bcr@,$WITH_FONTS_bcr,;t t
+s,@WITHOUT_FONTS_bcr@,$WITHOUT_FONTS_bcr,;t t
+s,@USE_FONTS@,$USE_FONTS,;t t
+s,@LIBOBJS@,$LIBOBJS,;t t
+s,@LTLIBOBJS@,$LTLIBOBJS,;t t
+CEOF
+
+_ACEOF
+
+ cat >>$CONFIG_STATUS <<\_ACEOF
+ # Split the substitutions into bite-sized pieces for seds with
+ # small command number limits, like on Digital OSF/1 and HP-UX.
+ ac_max_sed_lines=48
+ ac_sed_frag=1 # Number of current file.
+ ac_beg=1 # First line for current file.
+ ac_end=$ac_max_sed_lines # Line after last line for current file.
+ ac_more_lines=:
+ ac_sed_cmds=
+ while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ else
+ sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ fi
+ if test ! -s $tmp/subs.frag; then
+ ac_more_lines=false
+ else
+ # The purpose of the label and of the branching condition is to
+ # speed up the sed processing (if there are no `@' at all, there
+ # is no need to browse any of the substitutions).
+ # These are the two extra sed commands mentioned above.
+ (echo ':t
+ /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+ fi
+ ac_sed_frag=`expr $ac_sed_frag + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_lines`
+ fi
+ done
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
fi
+fi # test -n "$CONFIG_FILES"
- case "$ac_given_srcdir" in
- .) srcdir=.
- if test -z "$ac_dots"; then top_srcdir=.
- else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
- /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
- *) # Relative path.
- srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
- top_srcdir="$ac_dots$ac_given_srcdir" ;;
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
esac
- case "$ac_given_INSTALL" in
- [/$]*) INSTALL="$ac_given_INSTALL" ;;
- *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
- esac
+ # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
- echo creating "$ac_file"
- rm -f "$ac_file"
- configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
- case "$ac_file" in
- *Makefile*) ac_comsub="1i\\
-# $configure_input" ;;
- *) ac_comsub= ;;
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
esac
- ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
- sed -e "$ac_comsub
-s%@configure_input@%$configure_input%g
-s%@srcdir@%$srcdir%g
-s%@top_srcdir@%$top_srcdir%g
-s%@INSTALL@%$INSTALL%g
-" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
-fi; done
-rm -f conftest.s*
+ if test x"$ac_file" != x-; then
+ { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+ rm -f "$ac_file"
+ fi
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ if test x"$ac_file" = x-; then
+ configure_input=
+ else
+ configure_input="$ac_file. "
+ fi
+ configure_input=$configure_input"Generated from `echo $ac_file_in |
+ sed 's,.*/,,'` by configure."
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ echo "$f";;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo "$f"
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo "$srcdir/$f"
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@abs_srcdir@,$ac_abs_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s,@builddir@,$ac_builddir,;t t
+s,@abs_builddir@,$ac_abs_builddir,;t t
+s,@top_builddir@,$ac_top_builddir,;t t
+s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+ rm -f $tmp/stdin
+ if test x"$ac_file" != x-; then
+ mv $tmp/out $ac_file
+ else
+ cat $tmp/out
+ rm -f $tmp/out
+ fi
-EOF
-cat >> $CONFIG_STATUS <<EOF
+done
+_ACEOF
-EOF
-cat >> $CONFIG_STATUS <<\EOF
+cat >>$CONFIG_STATUS <<\_ACEOF
-exit 0
-EOF
+{ (exit 0); exit 0; }
+_ACEOF
chmod +x $CONFIG_STATUS
-rm -fr confdefs* $ac_clean_files
-test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || { (exit 1); exit 1; }
+fi
+2006-02-11 Miles Bader <miles@gnu.org>
+
+ * sendmail.el, smtpmail.el: New files, from Emacs tree.
+
+2005-12-22 TSUCHIYA Masatoshi <tsuchiya@namazu.org>
+
+ * gnus-namazu.el (gnus-namazu-remote-groups): Accept `t' as an
+ symbol that matches the method specified by `gnus-select-method'.
+ (gnus-namazu/make-directory-table): Follow the above change.
+ (gnus-namazu/call-namazu): Wrap a query string with quotes.
+
+2005-12-05 Adrian Aichner <adrian@xemacs.org>
+
+ * nnir.el: New variable nnir-swish-e-index-files to support
+ multiple swish-e index files.
+ * nnir.el (nnir-swish-e-index-file): Make obsolete.
+ * nnir.el (nnir-swish-e-index-files): New.
+ * nnir.el (nnir-run-swish-e): Use nnir-swish-e-index-files.
+
+2005-05-17 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * nnir.el (nnir): Add :group.
+
2005-01-26 Steve Youngs <steve@sxemacs.org>
* gpg.el: Add timer/itimer compatibility.
one-line-cookie.diff
+sendmail.el
+smtpmail.el
+
+ Copies of the corresponding files from the Emacs lisp/mail/
+ directory, to provide features (occasionally) needed by Gnus which
+ may not be provided by the versions of these files in older Emacs
+ distributions.
+
ssl.el
+ Obsolete interface to OpenSSL. Completely replaced by
+ lisp/tls.el, which supports both GnuTLS and OpenSSL. This
+ file will be removed eventually.
+
ucs-tables.el
This file provides improved Unicode functionality. It defines
xml.el
- This is used for parsing RSS feeds. Part of Emacs 21.3 and
- later.
+ This is used for parsing RSS feeds. Part of Emacs 21.3 and later.
+ Note that the version of this file in the Gnus contrib/ directory is
+ out of date with respect to the version in the Emacs tree.
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;; You should have received a copy of the GNU General Public License
;; along with this program; if not, you can either send email to this
;; program's maintainer or write to: The Free Software Foundation,
-;; Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA.
+;; Inc.; 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
;;; Commentary:
\"~/Maildir/.group\"."
:group 'gnus-namazu
:type '(repeat
- (cons (regexp :tag "Regexp of group name")
+ (cons (choice (regexp :tag "Regexp of group name")
+ (const :tag "Groups served by `gnus-select-method'" t))
(string :tag "Base path of groups")))
:set (lambda (symbol value)
(prog1 (set-default symbol value)
"-a" ; show all matches
"-l") ; use list format
gnus-namazu-additional-arguments
- (list query)
+ (list (if gnus-namazu-command-prefix
+ (concat "'" query "'")
+ query))
gnus-namazu-index-directories)))
(apply 'call-process (car commands) nil t nil (cdr commands))))
(gnus-namazu/server-directory method))))
(push (cons dir group) alist)))
(dolist (pair gnus-namazu-remote-groups)
- (when (string-match (car pair) group)
- (setq dir (nnmail-group-pathname
- (substring group (match-end 0))
- "/"))
+ (when (setq dir
+ (or (and (eq t (car pair))
+ (gnus-method-equal method gnus-select-method)
+ group)
+ (and (stringp (car pair))
+ (string-match (car pair) group)
+ (substring group (match-end 0)))))
+ (setq dir (nnmail-group-pathname dir "/"))
(push (cons (concat (cdr pair)
;; nnmail-group-pathname() on some
;; systems returns pathnames which
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
\f
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; User Customizable Variables:
(defgroup nnir nil
- "Search nnmh and nnml groups in Gnus with Glimpse, freeWAIS-sf, or EWS.")
+ "Search nnmh and nnml groups in Gnus with Glimpse, freeWAIS-sf, or EWS."
+ :group 'gnus)
;; Mail backend.
:type '(regexp)
:group 'nnir)
-;; Swish-E. Next three variables Copyright (C) 2000 Christoph Conrad
-;; <christoph.conrad@gmx.de>.
+;; Swish-E.
;; URL: http://sunsite.berkeley.edu/SWISH-E/
;; New version: http://www.boe.es/swish-e
+;; Variables `nnir-swish-e-index-file', `nnir-swish-e-program' and
+;; `nnir-swish-e-additional-switches'
+;; Copyright (C) 2000 Christoph Conrad <christoph.conrad@gmx.de>.
+(make-obsolete-variable 'nnir-swish-e-index-file
+ 'nnir-swish-e-index-files)
(defcustom nnir-swish-e-index-file
(expand-file-name "~/Mail/index.swish-e")
"*Index file for swish-e.
-This could be a server parameter."
+This could be a server parameter.
+It is never consulted once `nnir-swish-e-index-files', which should be
+used instead, has been customized."
:type '(file)
:group 'nnir)
+(defcustom nnir-swish-e-index-files
+ (list nnir-swish-e-index-file)
+ "*List of index files for swish-e.
+This could be a server parameter."
+ :type '(repeat (file))
+ :group 'nnir)
+
(defcustom nnir-swish-e-program "swish-e"
"*Name of swish-e search executable.
This cannot be a server parameter."
(erase-buffer)
(message "Doing swish-e query %s..." query)
- (let* ((index-file
+ (let* ((index-files
(or (nnir-read-server-parm
- 'nnir-swish-e-index-file server)
- (error "Missing parameter `nnir-swish-e-index-file'")))
+ 'nnir-swish-e-index-files server)
+ (error "Missing parameter `nnir-swish-e-index-files'")))
(additional-switches
(nnir-read-server-parm
'nnir-swish-e-additional-switches server))
nil ; input from /dev/null
t ; output
nil ; don't redisplay
- "-f" ,index-file
+ "-f" ,@index-files
,@additional-switches
"-w"
,qstring ; the query, in swish-e format
--- /dev/null
+;;; sendmail.el --- mail sending commands for Emacs. -*- byte-compile-dynamic: t -*-
+
+;; Copyright (C) 1985, 1986, 1992, 1993, 1994, 1995, 1996, 1998, 2000,
+;; 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+
+;; Maintainer: FSF
+;; 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., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; This mode provides mail-sending facilities from within Emacs. It is
+;; documented in the Emacs user's manual.
+
+;;; Code:
+(eval-when-compile
+ ;; Necessary to avoid recursive `require's.
+ (provide 'sendmail)
+ (require 'rmail)
+ (require 'mailalias))
+
+(autoload 'rfc2047-encode-string "rfc2047")
+
+(defgroup sendmail nil
+ "Mail sending commands for Emacs."
+ :prefix "mail-"
+ :group 'mail)
+
+(defcustom mail-setup-with-from t
+ "Non-nil means insert `From:' field when setting up the message."
+ :type 'boolean
+ :group 'sendmail
+ :version "22.1")
+
+;;;###autoload
+(defcustom mail-from-style 'angles
+ "Specifies how \"From:\" fields look.
+
+If `nil', they contain just the return address like:
+ king@grassland.com
+If `parens', they look like:
+ king@grassland.com (Elvis Parsley)
+If `angles', they look like:
+ Elvis Parsley <king@grassland.com>
+If `system-default', allows the mailer to insert its default From field
+derived from the envelope-from address.
+
+In old versions of Emacs, the `system-default' setting also caused
+Emacs to pass the proper email address from `user-mail-address'
+to the mailer to specify the envelope-from address. But that is now
+controlled by a separate variable, `mail-specify-envelope-from'."
+ :type '(choice (const nil) (const parens) (const angles)
+ (const system-default))
+ :version "20.3"
+ :group 'sendmail)
+
+;;;###autoload
+(defcustom mail-specify-envelope-from nil
+ "If non-nil, specify the envelope-from address when sending mail.
+The value used to specify it is whatever is found in
+the variable `mail-envelope-from', with `user-mail-address' as fallback.
+
+On most systems, specifying the envelope-from address is a
+privileged operation. This variable affects sendmail and
+smtpmail -- if you use feedmail to send mail, see instead the
+variable `feedmail-deduce-envelope-from'."
+ :version "21.1"
+ :type 'boolean
+ :group 'sendmail)
+
+(defcustom mail-envelope-from nil
+ "If non-nil, designate the envelope-from address when sending mail.
+This only has an effect if `mail-specify-envelope-from' is non-nil.
+The value should be either a string, or the symbol `header' (in
+which case the contents of the \"From\" header of the message
+being sent is used), or nil (in which case the value of
+`user-mail-address' is used)."
+ :version "21.1"
+ :type '(choice (string :tag "From-name")
+ (const :tag "Use From: header from message" header)
+ (const :tag "Use `user-mail-address'" nil))
+ :group 'sendmail)
+
+;;;###autoload
+(defcustom mail-self-blind nil
+ "Non-nil means insert BCC to self in messages to be sent.
+This is done when the message is initialized,
+so you can remove or alter the BCC field to override the default."
+ :type 'boolean
+ :group 'sendmail)
+
+;;;###autoload
+(defcustom mail-interactive nil
+ "Non-nil means when sending a message wait for and display errors.
+nil means let mailer mail back a message to report errors."
+ :type 'boolean
+ :group 'sendmail)
+
+(defcustom mail-yank-ignored-headers
+ (concat "^"
+ (regexp-opt '("via" "mail-from" "origin" "status" "remailed"
+ "received" "message-id" "summary-line" "to" "subject"
+ "in-reply-to" "return-path" "mail-reply-to"
+ "mail-followup-to") "\\(?:")
+ ":")
+ "Delete these headers from old message when it's inserted in a reply."
+ :type 'regexp
+ :group 'sendmail)
+
+;; Prevent problems with `window-system' not having the correct value
+;; when loaddefs.el is loaded. `custom-reevaluate-setting' needs the
+;; standard value.
+;;;###autoload
+(put 'send-mail-function 'standard-value
+ '((if (and window-system (memq system-type '(darwin windows-nt)))
+ 'mailclient-send-it
+ 'sendmail-send-it)))
+
+;; Useful to set in site-init.el
+;;;###autoload
+(defcustom send-mail-function
+ (if (and window-system (memq system-type '(darwin windows-nt)))
+ 'mailclient-send-it
+ 'sendmail-send-it)
+ "Function to call to send the current buffer as mail.
+The headers should be delimited by a line which is
+not a valid RFC822 header or continuation line,
+that matches the variable `mail-header-separator'.
+This is used by the default mail-sending commands. See also
+`message-send-mail-function' for use with the Message package."
+ :type '(radio (function-item sendmail-send-it :tag "Use Sendmail package")
+ (function-item smtpmail-send-it :tag "Use SMTPmail package")
+ (function-item feedmail-send-it :tag "Use Feedmail package")
+ (function-item mailclient-send-it :tag "Use Mailclient package")
+ function)
+ :group 'sendmail)
+
+;;;###autoload
+(defcustom mail-header-separator "--text follows this line--"
+ "Line used to separate headers from text in messages being composed."
+ :type 'string
+ :group 'sendmail)
+
+;; Set up mail-header-separator for use as a category text property.
+(put 'mail-header-separator 'rear-nonsticky '(category))
+;; This was a nice idea, for preventing accidental modification of
+;; the separator. But I found it also prevented or obstructed
+;; certain deliberate operations, such as copying the separator line
+;; up to the top to send myself a copy of an already sent outgoing message
+;; and other things. So I turned it off. --rms.
+;;(put 'mail-header-separator 'read-only t)
+
+;;;###autoload
+(defcustom mail-archive-file-name nil
+ "Name of file to write all outgoing messages in, or nil for none.
+This can be an inbox file or an Rmail file."
+ :type '(choice file (const nil))
+ :group 'sendmail)
+
+;;;###autoload
+(defcustom mail-default-reply-to nil
+ "Address to insert as default Reply-to field of outgoing messages.
+If nil, it will be initialized from the REPLYTO environment variable
+when you first send mail."
+ :type '(choice (const nil) string)
+ :group 'sendmail)
+
+;;;###autoload
+(defcustom mail-alias-file nil
+ "If non-nil, the name of a file to use instead of `/usr/lib/aliases'.
+This file defines aliases to be expanded by the mailer; this is a different
+feature from that of defining aliases in `.mailrc' to be expanded in Emacs.
+This variable has no effect unless your system uses sendmail as its mailer."
+ :type '(choice (const nil) file)
+ :group 'sendmail)
+
+;;;###autoload
+(defcustom mail-personal-alias-file "~/.mailrc"
+ "If non-nil, the name of the user's personal mail alias file.
+This file typically should be in same format as the `.mailrc' file used by
+the `Mail' or `mailx' program.
+This file need not actually exist."
+ :type '(choice (const nil) file)
+ :group 'sendmail)
+
+;;;###autoload
+(defcustom mail-setup-hook nil
+ "Normal hook, run each time a new outgoing mail message is initialized.
+The function `mail-setup' runs this hook."
+ :type 'hook
+ :options '(fortune-to-signature spook mail-abbrevs-setup)
+ :group 'sendmail)
+
+;;;###autoload
+(defvar mail-aliases t
+ "Alist of mail address aliases,
+or t meaning should be initialized from your mail aliases file.
+\(The file's name is normally `~/.mailrc', but `mail-personal-alias-file'
+can specify a different file name.)
+The alias definitions in the file have this form:
+ alias ALIAS MEANING")
+
+(defvar mail-alias-modtime nil
+ "The modification time of your mail alias file when it was last examined.")
+
+;;;###autoload
+(defcustom mail-yank-prefix nil
+ "Prefix insert on lines of yanked message being replied to.
+nil means use indentation."
+ :type '(choice (const nil) string)
+ :group 'sendmail)
+
+;;;###autoload
+(defcustom mail-indentation-spaces 3
+ "Number of spaces to insert at the beginning of each cited line.
+Used by `mail-yank-original' via `mail-indent-citation'."
+ :type 'integer
+ :group 'sendmail)
+
+(defvar mail-yank-hooks nil
+ "Obsolete hook for modifying a citation just inserted in the mail buffer.
+Each hook function can find the citation between (point) and (mark t).
+And each hook function should leave point and mark around the citation
+text as modified.
+
+This is a normal hook, misnamed for historical reasons.
+It is semi-obsolete and mail agents should no longer use it.")
+
+;;;###autoload
+(defcustom mail-citation-hook nil
+ "Hook for modifying a citation just inserted in the mail buffer.
+Each hook function can find the citation between (point) and (mark t),
+and should leave point and mark around the citation text as modified.
+The hook functions can find the header of the cited message
+in the variable `mail-citation-header', whether or not this is included
+in the cited portion of the message.
+
+If this hook is entirely empty (nil), a default action is taken
+instead of no action."
+ :type 'hook
+ :group 'sendmail)
+
+(defvar mail-citation-header nil
+ "While running `mail-citation-hook', this variable holds the message header.
+This enables the hook functions to see the whole message header
+regardless of what part of it (if any) is included in the cited text.")
+
+;;;###autoload
+(defcustom mail-citation-prefix-regexp "[ \t]*[-a-z0-9A-Z]*>+[ \t]*\\|[ \t]*"
+ "Regular expression to match a citation prefix plus whitespace.
+It should match whatever sort of citation prefixes you want to handle,
+with whitespace before and after; it should also match just whitespace.
+The default value matches citations like `foo-bar>' plus whitespace."
+ :type 'regexp
+ :group 'sendmail
+ :version "20.3")
+
+(defvar mail-abbrevs-loaded nil)
+(defvar mail-mode-map
+ (let ((map (make-sparse-keymap)))
+ (define-key map "\M-\t" 'mail-complete)
+ (define-key map "\C-c?" 'describe-mode)
+ (define-key map "\C-c\C-f\C-t" 'mail-to)
+ (define-key map "\C-c\C-f\C-b" 'mail-bcc)
+ (define-key map "\C-c\C-f\C-f" 'mail-fcc)
+ (define-key map "\C-c\C-f\C-c" 'mail-cc)
+ (define-key map "\C-c\C-f\C-s" 'mail-subject)
+ (define-key map "\C-c\C-f\C-r" 'mail-reply-to)
+ (define-key map "\C-c\C-f\C-a" 'mail-mail-reply-to) ; author
+ (define-key map "\C-c\C-f\C-l" 'mail-mail-followup-to) ; list
+ (define-key map "\C-c\C-t" 'mail-text)
+ (define-key map "\C-c\C-y" 'mail-yank-original)
+ (define-key map "\C-c\C-r" 'mail-yank-region)
+ (define-key map [remap split-line] 'mail-split-line)
+ (define-key map "\C-c\C-q" 'mail-fill-yanked-message)
+ (define-key map "\C-c\C-w" 'mail-signature)
+ (define-key map "\C-c\C-v" 'mail-sent-via)
+ (define-key map "\C-c\C-c" 'mail-send-and-exit)
+ (define-key map "\C-c\C-s" 'mail-send)
+ (define-key map "\C-c\C-i" 'mail-attach-file)
+
+ (define-key map [menu-bar mail]
+ (cons "Mail" (make-sparse-keymap "Mail")))
+
+ (define-key map [menu-bar mail fill]
+ '("Fill Citation" . mail-fill-yanked-message))
+
+ (define-key map [menu-bar mail yank]
+ '("Cite Original" . mail-yank-original))
+
+ (define-key map [menu-bar mail signature]
+ '("Insert Signature" . mail-signature))
+
+ (define-key map [menu-bar mail mail-sep]
+ '("--"))
+
+ (define-key map [menu-bar mail cancel]
+ '("Cancel" . mail-dont-send))
+
+ (define-key map [menu-bar mail send-stay]
+ '("Send, Keep Editing" . mail-send))
+
+ (define-key map [menu-bar mail send]
+ '("Send Message" . mail-send-and-exit))
+
+ (define-key map [menu-bar headers]
+ (cons "Headers" (make-sparse-keymap "Move to Header")))
+
+ (define-key map [menu-bar headers text]
+ '("Text" . mail-text))
+
+ (define-key map [menu-bar headers expand-aliases]
+ '("Expand Aliases" . expand-mail-aliases))
+
+ (define-key map [menu-bar headers sent-via]
+ '("Sent Via" . mail-sent-via))
+
+ (define-key map [menu-bar headers mail-reply-to]
+ '("Mail Reply To" . mail-mail-reply-to))
+
+ (define-key map [menu-bar headers mail-followup-to]
+ '("Mail Followup To" . mail-mail-followup-to))
+
+ (define-key map [menu-bar headers reply-to]
+ '("Reply-To" . mail-reply-to))
+
+ (define-key map [menu-bar headers bcc]
+ '("Bcc" . mail-bcc))
+
+ (define-key map [menu-bar headers fcc]
+ '("Fcc" . mail-fcc))
+
+ (define-key map [menu-bar headers cc]
+ '("Cc" . mail-cc))
+
+ (define-key map [menu-bar headers subject]
+ '("Subject" . mail-subject))
+
+ (define-key map [menu-bar headers to]
+ '("To" . mail-to))
+
+ map))
+
+(autoload 'build-mail-aliases "mailalias"
+ "Read mail aliases from user's personal aliases file and set `mail-aliases'."
+ nil)
+
+(autoload 'expand-mail-aliases "mailalias"
+ "Expand all mail aliases in suitable header fields found between BEG and END.
+Suitable header fields are `To', `Cc' and `Bcc' and their `Resent-' variants.
+Optional second arg EXCLUDE may be a regular expression defining text to be
+removed from alias expansions."
+ nil)
+
+;;;###autoload
+(defcustom mail-signature nil
+ "Text inserted at end of mail buffer when a message is initialized.
+If t, it means to insert the contents of the file `mail-signature-file'.
+If a string, that string is inserted.
+ (To make a proper signature, the string should begin with \\n\\n-- \\n,
+ which is the standard way to delimit a signature in a message.)
+Otherwise, it should be an expression; it is evaluated
+and should insert whatever you want to insert."
+ :type '(choice (const :tag "None" nil)
+ (const :tag "Use `.signature' file" t)
+ (string :tag "String to insert")
+ (sexp :tag "Expression to evaluate"))
+ :group 'sendmail)
+(put 'mail-signature 'risky-local-variable t)
+
+;;;###autoload
+(defcustom mail-signature-file "~/.signature"
+ "File containing the text inserted at end of mail buffer."
+ :type 'file
+ :group 'sendmail)
+
+;;;###autoload
+(defcustom mail-default-directory "~/"
+ "Directory for mail buffers.
+Value of `default-directory' for mail buffers.
+This directory is used for auto-save files of mail buffers."
+ :type '(directory :tag "Directory")
+ :group 'sendmail
+ :version "22.1")
+
+(defvar mail-reply-action nil)
+(defvar mail-send-actions nil
+ "A list of actions to be performed upon successful sending of a message.")
+(put 'mail-reply-action 'permanent-local t)
+(put 'mail-send-actions 'permanent-local t)
+
+;;;###autoload
+(defcustom mail-default-headers nil
+ "A string containing header lines, to be inserted in outgoing messages.
+It is inserted before you edit the message,
+so you can edit or delete these lines."
+ :type '(choice (const nil) string)
+ :group 'sendmail)
+
+;;;###autoload
+(defcustom mail-bury-selects-summary t
+ "If non-nil, try to show RMAIL summary buffer after returning from mail.
+The functions \\[mail-send-on-exit] or \\[mail-dont-send] select
+the RMAIL summary buffer before returning, if it exists and this variable
+is non-nil."
+ :type 'boolean
+ :group 'sendmail)
+
+;;;###autoload
+(defcustom mail-send-nonascii 'mime
+ "Specify whether to allow sending non-ASCII characters in mail.
+If t, that means do allow it. nil means don't allow it.
+`query' means ask the user each time.
+`mime' means add an appropriate MIME header if none already present.
+The default is `mime'.
+Including non-ASCII characters in a mail message can be problematical
+for the recipient, who may not know how to decode them properly."
+ :type '(choice (const t) (const nil) (const query) (const mime))
+ :group 'sendmail)
+
+(defcustom mail-use-dsn nil
+ "Ask MTA for notification of failed, delayed or successful delivery.
+Note that only some MTAs (currently only recent versions of Sendmail)
+support Delivery Status Notification."
+ :group 'sendmail
+ :type '(repeat (radio (const :tag "Failure" failure)
+ (const :tag "Delay" delay)
+ (const :tag "Success" success)))
+ :version "22.1")
+
+;; Note: could use /usr/ucb/mail instead of sendmail;
+;; options -t, and -v if not interactive.
+(defvar mail-mailer-swallows-blank-line
+ (if (and (string-match "sparc-sun-sunos\\(\\'\\|[^5]\\)" system-configuration)
+ (file-readable-p "/etc/sendmail.cf")
+ (with-temp-buffer
+ (insert-file-contents "/etc/sendmail.cf")
+ (goto-char (point-min))
+ (let ((case-fold-search nil))
+ (re-search-forward "^OR\\>" nil t))))
+ ;; According to RFC822, "The field-name must be composed of printable
+ ;; ASCII characters (i.e. characters that have decimal values between
+ ;; 33 and 126, except colon)", i.e. any chars except ctl chars,
+ ;; space, or colon.
+ '(looking-at "[ \t]\\|[][!\"#$%&'()*+,-./0-9;<=>?@A-Z\\\\^_`a-z{|}~]+:"))
+ "Set this non-nil if the system's mailer runs the header and body together.
+\(This problem exists on Sunos 4 when sendmail is run in remote mode.)
+The value should be an expression to test whether the problem will
+actually occur.")
+
+(defvar mail-mode-syntax-table
+ (let ((st (make-syntax-table)))
+ ;; define-derived-mode will make it inherit from text-mode-syntax-table.
+ (modify-syntax-entry ?% ". " st)
+ st)
+ "Syntax table used while in `mail-mode'.")
+
+(defvar mail-font-lock-keywords
+ (eval-when-compile
+ (let* ((cite-chars "[>|}]")
+ (cite-prefix "[:alpha:]")
+ (cite-suffix (concat cite-prefix "0-9_.@-`'\"")))
+ (list '("^\\(To\\|Newsgroups\\):" . font-lock-function-name-face)
+ '("^\\(B?CC\\|Reply-to\\|Mail-\\(reply\\|followup\\)-to\\):" . font-lock-keyword-face)
+ '("^\\(Subject:\\)[ \t]*\\(.+\\)?"
+ (1 font-lock-comment-face)
+;; (2 font-lock-type-face nil t)
+ )
+ ;; Use EVAL to delay in case `mail-header-separator' gets changed.
+ '(eval .
+ (let ((separator (if (zerop (length mail-header-separator))
+ " \\`\\' "
+ (regexp-quote mail-header-separator))))
+ (cons (concat "^" separator "$") 'font-lock-warning-face)))
+ ;; Use MATCH-ANCHORED to effectively anchor the regexp left side.
+ `(,cite-chars
+ (,(concat "\\=[ \t]*"
+ "\\(\\(\\([" cite-prefix "]+[" cite-suffix "]*\\)?"
+ "\\(" cite-chars "[ \t]*\\)\\)+\\)"
+ "\\(.*\\)")
+ (beginning-of-line) (end-of-line)
+ (1 font-lock-comment-delimiter-face nil t)
+ (5 font-lock-comment-face nil t)))
+ '("^\\(X-[A-Za-z0-9-]+\\|In-reply-to\\):.*\\(\n[ \t]+.*\\)*$"
+ . font-lock-string-face))))
+ "Additional expressions to highlight in Mail mode.")
+
+\f
+(defun sendmail-sync-aliases ()
+ (when mail-personal-alias-file
+ (let ((modtime (nth 5 (file-attributes mail-personal-alias-file))))
+ (or (equal mail-alias-modtime modtime)
+ (setq mail-alias-modtime modtime
+ mail-aliases t)))))
+
+(defun mail-setup (to subject in-reply-to cc replybuffer actions)
+ (or mail-default-reply-to
+ (setq mail-default-reply-to (getenv "REPLYTO")))
+ (sendmail-sync-aliases)
+ (if (eq mail-aliases t)
+ (progn
+ (setq mail-aliases nil)
+ (when mail-personal-alias-file
+ (if (file-exists-p mail-personal-alias-file)
+ (build-mail-aliases)))))
+ ;; Don't leave this around from a previous message.
+ (kill-local-variable 'buffer-file-coding-system)
+ ;; This doesn't work for enable-multibyte-characters.
+ ;; (kill-local-variable 'enable-multibyte-characters)
+ (set-buffer-multibyte default-enable-multibyte-characters)
+ (if current-input-method
+ (inactivate-input-method))
+ (setq mail-send-actions actions)
+ (setq mail-reply-action replybuffer)
+ (goto-char (point-min))
+ (if mail-setup-with-from
+ (mail-insert-from-field))
+ (insert "To: ")
+ (save-excursion
+ (if to
+ ;; Here removed code to extract names from within <...>
+ ;; on the assumption that mail-strip-quoted-names
+ ;; has been called and has done so.
+ (let ((fill-prefix "\t")
+ (address-start (point)))
+ (insert to "\n")
+ (fill-region-as-paragraph address-start (point-max))
+ (goto-char (point-max))
+ (unless (bolp)
+ (newline)))
+ (newline))
+ (if cc
+ (let ((fill-prefix "\t")
+ (address-start (progn (insert "CC: ") (point))))
+ (insert cc "\n")
+ (fill-region-as-paragraph address-start (point-max))
+ (goto-char (point-max))
+ (unless (bolp)
+ (newline))))
+ (if in-reply-to
+ (let ((fill-prefix "\t")
+ (fill-column 78)
+ (address-start (point)))
+ (insert "In-reply-to: " in-reply-to "\n")
+ (fill-region-as-paragraph address-start (point-max))
+ (goto-char (point-max))
+ (unless (bolp)
+ (newline))))
+ (insert "Subject: " (or subject "") "\n")
+ (if mail-default-headers
+ (insert mail-default-headers))
+ (if mail-default-reply-to
+ (insert "Reply-to: " mail-default-reply-to "\n"))
+ (if mail-self-blind
+ (insert "BCC: " user-mail-address "\n"))
+ (if mail-archive-file-name
+ (insert "FCC: " mail-archive-file-name "\n"))
+ (put-text-property (point)
+ (progn
+ (insert mail-header-separator "\n")
+ (1- (point)))
+ 'category 'mail-header-separator)
+ ;; Insert the signature. But remember the beginning of the message.
+ (if to (setq to (point)))
+ (cond ((eq mail-signature t)
+ (if (file-exists-p mail-signature-file)
+ (progn
+ (insert "\n\n-- \n")
+ (insert-file-contents mail-signature-file))))
+ ((stringp mail-signature)
+ (insert mail-signature))
+ (t
+ (eval mail-signature)))
+ (goto-char (point-max))
+ (or (bolp) (newline)))
+ (if to (goto-char to))
+ (or to subject in-reply-to
+ (set-buffer-modified-p nil))
+ (run-hooks 'mail-setup-hook))
+\f
+(defcustom mail-mode-hook nil
+ "Hook run by Mail mode."
+ :group 'sendmail
+ :type 'hook
+ :options '(footnote-mode))
+
+(defvar mail-mode-abbrev-table text-mode-abbrev-table)
+;;;###autoload
+(define-derived-mode mail-mode text-mode "Mail"
+ "Major mode for editing mail to be sent.
+Like Text Mode but with these additional commands:
+
+\\[mail-send] mail-send (send the message)
+\\[mail-send-and-exit] mail-send-and-exit (send the message and exit)
+
+Here are commands that move to a header field (and create it if there isn't):
+ \\[mail-to] move to To: \\[mail-subject] move to Subject:
+ \\[mail-cc] move to CC: \\[mail-bcc] move to BCC:
+ \\[mail-fcc] move to FCC: \\[mail-reply-to] move to Reply-To:
+ \\[mail-mail-reply-to] move to Mail-Reply-To:
+ \\[mail-mail-followup-to] move to Mail-Followup-To:
+\\[mail-text] mail-text (move to beginning of message text).
+\\[mail-signature] mail-signature (insert `mail-signature-file' file).
+\\[mail-yank-original] mail-yank-original (insert current message, in Rmail).
+\\[mail-fill-yanked-message] mail-fill-yanked-message (fill what was yanked).
+\\[mail-sent-via] mail-sent-via (add a Sent-via field for each To or CC).
+Turning on Mail mode runs the normal hooks `text-mode-hook' and
+`mail-mode-hook' (in that order)."
+ (make-local-variable 'mail-reply-action)
+ (make-local-variable 'mail-send-actions)
+ (setq buffer-offer-save t)
+ (make-local-variable 'font-lock-defaults)
+ (setq font-lock-defaults '(mail-font-lock-keywords t t))
+ (make-local-variable 'paragraph-separate)
+ (make-local-variable 'normal-auto-fill-function)
+ (setq normal-auto-fill-function 'mail-mode-auto-fill)
+ (make-local-variable 'fill-paragraph-function)
+ (setq fill-paragraph-function 'mail-mode-fill-paragraph)
+ ;; Allow using comment commands to add/remove quoting (this only does
+ ;; anything if mail-yank-prefix is set to a non-nil value).
+ (set (make-local-variable 'comment-start) mail-yank-prefix)
+ (if mail-yank-prefix
+ (set (make-local-variable 'comment-start-skip)
+ (concat "^" (regexp-quote mail-yank-prefix) "[ \t]*")))
+ (make-local-variable 'adaptive-fill-regexp)
+ (setq adaptive-fill-regexp
+ (concat "[ \t]*[-[:alnum:]]+>+[ \t]*\\|"
+ adaptive-fill-regexp))
+ (make-local-variable 'adaptive-fill-first-line-regexp)
+ (setq adaptive-fill-first-line-regexp
+ (concat "[ \t]*[-[:alnum:]]*>+[ \t]*\\|"
+ adaptive-fill-first-line-regexp))
+ ;; `-- ' precedes the signature. `-----' appears at the start of the
+ ;; lines that delimit forwarded messages.
+ ;; Lines containing just >= 3 dashes, perhaps after whitespace,
+ ;; are also sometimes used and should be separators.
+ (setq paragraph-separate (concat (regexp-quote mail-header-separator)
+ "$\\|\t*\\([-|#;>* ]\\|(?[0-9]+[.)]\\)+$"
+ "\\|[ \t]*[[:alnum:]]*>+[ \t]*$\\|[ \t]*$\\|"
+ "--\\( \\|-+\\)$\\|"
+ page-delimiter)))
+
+
+(defun mail-header-end ()
+ "Return the buffer location of the end of headers, as a number."
+ (save-restriction
+ (widen)
+ (save-excursion
+ (rfc822-goto-eoh)
+ (point))))
+
+(defun mail-text-start ()
+ "Return the buffer location of the start of text, as a number."
+ (save-restriction
+ (widen)
+ (save-excursion
+ (rfc822-goto-eoh)
+ (forward-line 1)
+ (point))))
+
+(defun mail-sendmail-delimit-header ()
+ "Set up whatever header delimiter convention sendmail will use.
+Concretely: replace the first blank line in the header with the separator."
+ (rfc822-goto-eoh)
+ (insert mail-header-separator)
+ (point))
+
+(defun mail-sendmail-undelimit-header ()
+ "Remove header separator to put the message in correct form for sendmail.
+Leave point at the start of the delimiter line."
+ (rfc822-goto-eoh)
+ (delete-region (point) (progn (end-of-line) (point))))
+
+(defun mail-mode-auto-fill ()
+ "Carry out Auto Fill for Mail mode.
+If within the headers, this makes the new lines into continuation lines."
+ (if (< (point) (mail-header-end))
+ (let ((old-line-start (save-excursion (beginning-of-line) (point))))
+ (if (do-auto-fill)
+ (save-excursion
+ (beginning-of-line)
+ (while (not (eq (point) old-line-start))
+ ;; Use insert-before-markers in case we're inserting
+ ;; before the saved value of point (which is common).
+ (insert-before-markers " ")
+ (forward-line -1))
+ t)))
+ (do-auto-fill)))
+
+(defun mail-mode-fill-paragraph (arg)
+ ;; Do something special only if within the headers.
+ (if (< (point) (mail-header-end))
+ (let (beg end fieldname)
+ (when (prog1 (re-search-backward "^[-a-zA-Z]+:" nil 'yes)
+ (setq beg (point)))
+ (setq fieldname
+ (downcase (buffer-substring beg (1- (match-end 0))))))
+ (forward-line 1)
+ ;; Find continuation lines and get rid of their continuation markers.
+ (while (looking-at "[ \t]")
+ (delete-horizontal-space)
+ (forward-line 1))
+ (setq end (point-marker))
+ (goto-char beg)
+ ;; If this field contains addresses,
+ ;; make sure we can fill after each address.
+ (if (member fieldname
+ '("to" "cc" "bcc" "from" "reply-to"
+ "mail-reply-to" "mail-followup-to"
+ "resent-to" "resent-cc" "resent-bcc"
+ "resent-from" "resent-reply-to"))
+ (while (search-forward "," end t)
+ (or (looking-at "[ \t]")
+ (insert " "))))
+ (fill-region-as-paragraph beg end arg)
+ ;; Mark all lines except the first as continuations.
+ (goto-char beg)
+ (forward-line 1)
+ (while (< (point) end)
+ (insert " ")
+ (forward-line 1))
+ (move-marker end nil)
+ t)))
+\f
+;; User-level commands for sending.
+
+(defun mail-send-and-exit (&optional arg)
+ "Send message like `mail-send', then, if no errors, exit from mail buffer.
+Prefix arg means don't delete this window."
+ (interactive "P")
+ (mail-send)
+ (mail-bury arg))
+
+(defun mail-dont-send (&optional arg)
+ "Don't send the message you have been editing.
+Prefix arg means don't delete this window."
+ (interactive "P")
+ (mail-bury arg))
+
+(defun mail-bury (&optional arg)
+ "Bury this mail buffer."
+ (let ((newbuf (other-buffer (current-buffer))))
+ (bury-buffer (current-buffer))
+ (if (and (or (window-dedicated-p (frame-selected-window))
+ (cdr (assq 'mail-dedicated-frame (frame-parameters))))
+ (not (null (delq (selected-frame) (visible-frame-list)))))
+ (progn
+ (if (display-multi-frame-p)
+ (delete-frame (selected-frame))
+ ;; The previous frame is where normally they have the
+ ;; RMAIL buffer displayed.
+ (other-frame -1)))
+ (let (rmail-flag summary-buffer)
+ (and (not arg)
+ (not (one-window-p))
+ (with-current-buffer
+ (window-buffer (next-window (selected-window) 'not))
+ (setq rmail-flag (eq major-mode 'rmail-mode))
+ (setq summary-buffer
+ (and mail-bury-selects-summary
+ (boundp 'rmail-summary-buffer)
+ rmail-summary-buffer
+ (buffer-name rmail-summary-buffer)
+ (not (get-buffer-window rmail-summary-buffer))
+ rmail-summary-buffer))))
+ (if rmail-flag
+ ;; If the Rmail buffer has a summary, show that.
+ (if summary-buffer (switch-to-buffer summary-buffer)
+ (delete-window))
+ (switch-to-buffer newbuf))))))
+
+(defcustom mail-send-hook nil
+ "Hook run just before sending mail with `mail-send'."
+ :type 'hook
+ :options '(flyspell-mode-off)
+ :group 'sendmail)
+
+;;;###autoload
+(defcustom mail-mailing-lists nil "\
+*List of mailing list addresses the user is subscribed to.
+
+The variable is used to trigger insertion of the \"Mail-Followup-To\"
+header when sending a message to a mailing list."
+ :type '(repeat string)
+ :group 'sendmail)
+
+
+(defun mail-send ()
+ "Send the message in the current buffer.
+If `mail-interactive' is non-nil, wait for success indication
+or error messages, and inform user.
+Otherwise any failure is reported in a message back to
+the user from the mailer."
+ (interactive)
+ (if (if buffer-file-name
+ (y-or-n-p "Send buffer contents as mail message? ")
+ (or (buffer-modified-p)
+ (y-or-n-p "Message already sent; resend? ")))
+ (let ((inhibit-read-only t)
+ (opoint (point))
+ (ml (when mail-mailing-lists
+ ;; The surrounding regexp assumes the use of
+ ;; `mail-strip-quoted-names' on addresses before matching
+ ;; Cannot deal with full RFC 822 freedom, but that is
+ ;; unlikely to be problematic.
+ (concat "\\(?:[[:space:];,]\\|\\`\\)"
+ (regexp-opt mail-mailing-lists t)
+ "\\(?:[[:space:];,]\\|\\'\\)"))))
+ ;; If there are mailing lists defined
+ (when ml
+ (save-excursion
+ (let* ((to (mail-fetch-field "to" nil t))
+ (cc (mail-fetch-field "cc" nil t))
+ (new-header-values ; To: and Cc:
+ (mail-strip-quoted-names
+ (concat to (when cc (concat ", " cc))))))
+ ;; If message goes to known mailing list ...
+ (when (string-match ml new-header-values)
+ ;; Add Mail-Followup-To if none yet
+ (unless (mail-fetch-field "mail-followup-to")
+ (goto-char (mail-header-end))
+ (insert "Mail-Followup-To: "
+ (let ((l))
+ (mapc
+ ;; remove duplicates
+ '(lambda (e)
+ (unless (member e l)
+ (push e l)))
+ (split-string new-header-values
+ ",[[:space:]]+" t))
+ (mapconcat 'identity l ", "))
+ "\n"))
+ ;; Add Mail-Reply-To if none yet
+ (unless (mail-fetch-field "mail-reply-to")
+ (goto-char (mail-header-end))
+ (insert "Mail-Reply-To: "
+ (or (mail-fetch-field "reply-to")
+ user-mail-address)
+ "\n"))))))
+ (unless (memq mail-send-nonascii '(t mime))
+ (goto-char (point-min))
+ (skip-chars-forward "\0-\177")
+ (or (= (point) (point-max))
+ (if (eq mail-send-nonascii 'query)
+ (or (y-or-n-p "Message contains non-ASCII characters; send anyway? ")
+ (error "Aborted"))
+ (error "Message contains non-ASCII characters"))))
+ ;; Complain about any invalid line.
+ (goto-char (point-min))
+ (while (< (point) (mail-header-end))
+ (unless (looking-at "[ \t]\\|.*:\\|$")
+ (push-mark opoint)
+ (error "Invalid header line (maybe a continuation line lacks initial whitespace)"))
+ (forward-line 1))
+ (goto-char opoint)
+ (run-hooks 'mail-send-hook)
+ (message "Sending...")
+ (funcall send-mail-function)
+ ;; Now perform actions on successful sending.
+ (while mail-send-actions
+ (condition-case nil
+ (apply (car (car mail-send-actions))
+ (cdr (car mail-send-actions)))
+ (error))
+ (setq mail-send-actions (cdr mail-send-actions)))
+ (message "Sending...done")
+ ;; If buffer has no file, mark it as unmodified and delete auto-save.
+ (if (not buffer-file-name)
+ (progn
+ (set-buffer-modified-p nil)
+ (delete-auto-save-file-if-necessary t))))))
+
+(defun mail-envelope-from ()
+ "Return the envelope mail address to use when sending mail.
+This function uses `mail-envelope-from'."
+ (if (eq mail-envelope-from 'header)
+ (nth 1 (mail-extract-address-components
+ (mail-fetch-field "From")))
+ mail-envelope-from))
+\f
+;; This does the real work of sending a message via sendmail.
+;; It is called via the variable send-mail-function.
+
+;;;###autoload
+(defvar sendmail-coding-system nil
+ "*Coding system for encoding the outgoing mail.
+This has higher priority than `default-buffer-file-coding-system'
+and `default-sendmail-coding-system',
+but lower priority than the local value of `buffer-file-coding-system'.
+See also the function `select-message-coding-system'.")
+
+;;;###autoload
+(defvar default-sendmail-coding-system 'iso-latin-1
+ "Default coding system for encoding the outgoing mail.
+This variable is used only when `sendmail-coding-system' is nil.
+
+This variable is set/changed by the command `set-language-environment'.
+User should not set this variable manually,
+instead use `sendmail-coding-system' to get a constant encoding
+of outgoing mails regardless of the current language environment.
+See also the function `select-message-coding-system'.")
+
+(defun mail-insert-from-field ()
+ (let* ((login user-mail-address)
+ (fullname (user-full-name))
+ (quote-fullname nil))
+ (if (string-match "[^\0-\177]" fullname)
+ (setq fullname (rfc2047-encode-string fullname)
+ quote-fullname t))
+ (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 (or (re-search-forward "[^- !#-'*+/-9=?A-Z^-~]"
+ fullname-end 1)
+ quote-fullname)
+ (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)))
+ (if quote-fullname
+ (insert "\""))
+ (insert fullname)
+ (if quote-fullname
+ (insert "\""))
+ (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"))
+ ((eq mail-from-style 'system-default)
+ nil)
+ (t (error "Invalid value for `mail-from-style'")))))
+
+(defun sendmail-send-it ()
+ "Send the current mail buffer using the Sendmail package.
+This is a suitable value for `send-mail-function'. It sends using the
+external program defined by `sendmail-program'."
+ (require 'mail-utils)
+ (let ((errbuf (if mail-interactive
+ (generate-new-buffer " sendmail errors")
+ 0))
+ (tembuf (generate-new-buffer " sendmail temp"))
+ (multibyte enable-multibyte-characters)
+ (case-fold-search nil)
+ (selected-coding (select-message-coding-system))
+ resend-to-addresses
+ delimline
+ fcc-was-found
+ (mailbuf (current-buffer))
+ (program (if (boundp 'sendmail-program)
+ sendmail-program
+ "/usr/lib/sendmail"))
+ ;; Examine these variables now, so that
+ ;; local binding in the mail buffer will take effect.
+ (envelope-from
+ (and mail-specify-envelope-from
+ (or (mail-envelope-from) user-mail-address))))
+ (unwind-protect
+ (with-current-buffer tembuf
+ (erase-buffer)
+ (unless multibyte
+ (set-buffer-multibyte nil))
+ (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 (mail-header-end))
+ (delete-region (point) (progn (end-of-line) (point)))
+ (setq delimline (point-marker))
+ (sendmail-sync-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"))
+ (goto-char (point-min))
+ ;; Look for Resent- headers. They require sending
+ ;; the message specially.
+ (let ((case-fold-search t))
+ (goto-char (point-min))
+ (while (re-search-forward "^Resent-\\(to\\|cc\\|bcc\\):" delimline t)
+ ;; Put a list of such addresses in resend-to-addresses.
+ (setq resend-to-addresses
+ (save-restriction
+ (narrow-to-region (point)
+ (save-excursion
+ (forward-line 1)
+ (while (looking-at "^[ \t]")
+ (forward-line 1))
+ (point)))
+ (append (mail-parse-comma-list)
+ resend-to-addresses)))
+ ;; Delete Resent-BCC ourselves
+ (if (save-excursion (beginning-of-line)
+ (looking-at "resent-bcc"))
+ (delete-region (save-excursion (beginning-of-line) (point))
+ (save-excursion (end-of-line) (1+ (point))))))
+;;; 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\\)+\\b" delimline t)
+ (replace-match "")
+ ;; This one matches a Subject just before the header delimiter.
+ (if (and (re-search-forward "^Subject:\\([ \t]*\n\\)+" delimline t)
+ (= (match-end 0) delimline))
+ (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))
+ (mail-insert-from-field))
+ ;; Possibly add a MIME header for the current coding system
+ (let (charset)
+ (goto-char (point-min))
+ (and (eq mail-send-nonascii 'mime)
+ (not (re-search-forward "^MIME-version:" delimline t))
+ (progn (skip-chars-forward "\0-\177")
+ (/= (point) (point-max)))
+ selected-coding
+ (setq charset
+ (coding-system-get selected-coding 'mime-charset))
+ (goto-char delimline)
+ (insert "MIME-version: 1.0\n"
+ "Content-type: text/plain; charset="
+ (symbol-name charset)
+ "\nContent-Transfer-Encoding: 8bit\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)
+ (progn
+ (setq fcc-was-found t)
+ (mail-do-fcc delimline)))
+ (if mail-interactive
+ (with-current-buffer errbuf
+ (erase-buffer))))
+ (goto-char (point-min))
+ (if (let ((case-fold-search t))
+ (or resend-to-addresses
+ (re-search-forward "^To:\\|^cc:\\|^bcc:"
+ delimline t)))
+ (let* ((default-directory "/")
+ (coding-system-for-write selected-coding)
+ (args
+ (append (list (point-min) (point-max)
+ program
+ nil errbuf nil "-oi")
+ (and envelope-from
+ (list "-f" envelope-from))
+;;; ;; Don't say "from root" if running under su.
+;;; (and (equal (user-real-login-name) "root")
+;;; (list "-f" (user-login-name)))
+ (and mail-alias-file
+ (list (concat "-oA" mail-alias-file)))
+ (if mail-interactive
+ ;; These mean "report errors to terminal"
+ ;; and "deliver interactively"
+ '("-oep" "-odi")
+ ;; These mean "report errors by mail"
+ ;; and "deliver in background".
+ '("-oem" "-odb"))
+ ;; Get the addresses from the message
+ ;; unless this is a resend.
+ ;; We must not do that for a resend
+ ;; because we would find the original addresses.
+ ;; For a resend, include the specific addresses.
+ (or resend-to-addresses
+ '("-t")
+ )
+ (if mail-use-dsn
+ (list "-N" (mapconcat 'symbol-name
+ mail-use-dsn ",")))
+ )
+ )
+ (exit-value (apply 'call-process-region args)))
+ (or (null exit-value) (eq 0 exit-value)
+ (error "Sending...failed with exit value %d" exit-value)))
+ (or fcc-was-found
+ (error "No recipients")))
+ (if mail-interactive
+ (with-current-buffer errbuf
+ (goto-char (point-min))
+ (while (re-search-forward "\n\n* *" nil t)
+ (replace-match "; "))
+ (if (not (zerop (buffer-size)))
+ (error "Sending...failed to %s"
+ (buffer-substring (point-min) (point-max)))))))
+ (kill-buffer tembuf)
+ (if (bufferp errbuf)
+ (kill-buffer errbuf)))))
+
+(defun mail-do-fcc (header-end)
+ (unless (markerp header-end)
+ (error "Value of `header-end' must be a marker"))
+ (let (fcc-list
+ (rmailbuf (current-buffer))
+ (time (current-time))
+ (tembuf (generate-new-buffer " rmail output"))
+ (case-fold-search t))
+ (save-excursion
+ (goto-char (point-min))
+ (while (re-search-forward "^FCC:[ \t]*" header-end t)
+ (push (buffer-substring (point)
+ (progn
+ (end-of-line)
+ (skip-chars-backward " \t")
+ (point)))
+ fcc-list)
+ (delete-region (match-beginning 0)
+ (progn (forward-line 1) (point))))
+ (set-buffer tembuf)
+ (erase-buffer)
+ ;; This initial newline is written out if the fcc file already exists.
+ (insert "\nFrom " (user-login-name) " "
+ (current-time-string time) "\n")
+ ;; Insert the time zone before the year.
+ (forward-char -1)
+ (forward-word -1)
+ (require 'mail-utils)
+ (insert (mail-rfc822-time-zone time) " ")
+ (goto-char (point-max))
+ (insert-buffer-substring rmailbuf)
+ ;; Make sure messages are separated.
+ (goto-char (point-max))
+ (insert ?\n)
+ (goto-char 2)
+ ;; ``Quote'' "^From " as ">From "
+ ;; (note that this isn't really quoting, as there is no requirement
+ ;; that "^[>]+From " be quoted in the same transparent way.)
+ (let ((case-fold-search nil))
+ (while (search-forward "\nFrom " nil t)
+ (forward-char -5)
+ (insert ?>)))
+ (dolist (fcc fcc-list)
+ (let* ((buffer (find-buffer-visiting fcc))
+ (curbuf (current-buffer))
+ dont-write-the-file
+ buffer-matches-file
+ (beg (point-min)) (end (point-max))
+ (beg2 (save-excursion (goto-char (point-min))
+ (forward-line 2) (point))))
+ (if buffer
+ ;; File is present in a buffer => append to that buffer.
+ (with-current-buffer buffer
+ (setq buffer-matches-file
+ (and (not (buffer-modified-p))
+ (verify-visited-file-modtime buffer)))
+ ;; Keep the end of the accessible portion at the same place
+ ;; unless it is the end of the buffer.
+ (let ((max (if (/= (1+ (buffer-size)) (point-max))
+ (point-max))))
+ (unwind-protect
+ ;; Code below lifted from rmailout.el
+ ;; function rmail-output-to-rmail-file:
+ (let ((buffer-read-only nil)
+ (msg (and (boundp 'rmail-current-message)
+ rmail-current-message)))
+ ;; If MSG is non-nil, buffer is in RMAIL mode.
+ (if msg
+ (progn
+ ;; Append to an ordinary buffer as a
+ ;; Unix mail message.
+ (rmail-maybe-set-message-counters)
+ (widen)
+ (narrow-to-region (point-max) (point-max))
+ (insert "\C-l\n0, unseen,,\n*** EOOH ***\n"
+ "Date: " (mail-rfc822-date) "\n")
+ (insert-buffer-substring curbuf beg2 end)
+ (insert "\n\C-_")
+ (goto-char (point-min))
+ (widen)
+ (search-backward "\n\^_")
+ (narrow-to-region (point) (point-max))
+ (rmail-count-new-messages t)
+ (rmail-show-message msg)
+ (setq max nil))
+ ;; Output file not in rmail mode
+ ;; => just insert at the end.
+ (narrow-to-region (point-min) (1+ (buffer-size)))
+ (goto-char (point-max))
+ (insert-buffer-substring curbuf beg end))
+ (or buffer-matches-file
+ (progn
+ (if (y-or-n-p (format "Save file %s? "
+ fcc))
+ (save-buffer))
+ (setq dont-write-the-file t))))
+ (if max (narrow-to-region (point-min) max))))))
+ ;; Append to the file directly,
+ ;; unless we've already taken care of it.
+ (unless dont-write-the-file
+ (if (and (file-exists-p fcc)
+ ;; Check that the file isn't empty. We don't
+ ;; want to insert a newline at the start of an
+ ;; empty file.
+ (not (zerop (nth 7 (file-attributes fcc))))
+ (mail-file-babyl-p fcc))
+ ;; If the file is a Babyl file,
+ ;; convert the message to Babyl format.
+ (let ((coding-system-for-write
+ (or rmail-file-coding-system
+ 'emacs-mule)))
+ (with-current-buffer (get-buffer-create " mail-temp")
+ (setq buffer-read-only nil)
+ (erase-buffer)
+ (insert "\C-l\n0, unseen,,\n*** EOOH ***\nDate: "
+ (mail-rfc822-date) "\n")
+ (insert-buffer-substring curbuf beg2 end)
+ (insert "\n\C-_")
+ (write-region (point-min) (point-max) fcc t)
+ (erase-buffer)))
+ (write-region
+ (1+ (point-min)) (point-max) fcc t)))
+ (and buffer (not dont-write-the-file)
+ (with-current-buffer buffer
+ (set-visited-file-modtime))))))
+ (kill-buffer tembuf)))
+
+(defun mail-sent-via ()
+ "Make a Sent-via header line from each To or CC header line."
+ (interactive)
+ (save-excursion
+ ;; put a marker at the end of the header
+ (let ((end (copy-marker (mail-header-end)))
+ (case-fold-search t))
+ (goto-char (point-min))
+ ;; search for the To: lines and make Sent-via: lines from them
+ ;; search for the next To: line
+ (while (re-search-forward "^\\(to\\|cc\\):" end t)
+ ;; Grab this line plus all its continuations, sans the `to:'.
+ (let ((to-line
+ (buffer-substring (point)
+ (progn
+ (if (re-search-forward "^[^ \t\n]" end t)
+ (backward-char 1)
+ (goto-char end))
+ (point)))))
+ ;; Insert a copy, with altered header field name.
+ (insert-before-markers "Sent-via:" to-line))))))
+\f
+(defun mail-to ()
+ "Move point to end of To-field."
+ (interactive)
+ (expand-abbrev)
+ (mail-position-on-field "To"))
+
+(defun mail-subject ()
+ "Move point to end of Subject-field."
+ (interactive)
+ (expand-abbrev)
+ (mail-position-on-field "Subject"))
+
+(defun mail-cc ()
+ "Move point to end of CC-field. Create a CC field if none."
+ (interactive)
+ (expand-abbrev)
+ (or (mail-position-on-field "cc" t)
+ (progn (mail-position-on-field "to")
+ (insert "\nCC: "))))
+
+(defun mail-bcc ()
+ "Move point to end of BCC-field. Create a BCC field if none."
+ (interactive)
+ (expand-abbrev)
+ (or (mail-position-on-field "bcc" t)
+ (progn (mail-position-on-field "to")
+ (insert "\nBCC: "))))
+
+(defun mail-fcc (folder)
+ "Add a new FCC field, with file name completion."
+ (interactive "FFolder carbon copy: ")
+ (expand-abbrev)
+ (or (mail-position-on-field "fcc" t) ;Put new field after exiting FCC.
+ (mail-position-on-field "to"))
+ (insert "\nFCC: " folder))
+
+(defun mail-reply-to ()
+ "Move point to end of Reply-To-field. Create a Reply-To field if none."
+ (interactive)
+ (expand-abbrev)
+ (mail-position-on-field "Reply-To"))
+
+(defun mail-mail-reply-to ()
+ "Move point to end of Mail-Reply-To field.
+Create a Mail-Reply-To field if none."
+ (interactive)
+ (expand-abbrev)
+ (or (mail-position-on-field "mail-reply-to" t)
+ (progn (mail-position-on-field "to")
+ (insert "\nMail-Reply-To: "))))
+
+(defun mail-mail-followup-to ()
+ "Move point to end of Mail-Followup-To field.
+Create a Mail-Followup-To field if none."
+ (interactive)
+ (expand-abbrev)
+ (or (mail-position-on-field "mail-followup-to" t)
+ (progn (mail-position-on-field "to")
+ (insert "\nMail-Followup-To: "))))
+
+(defun mail-position-on-field (field &optional soft)
+ (let (end
+ (case-fold-search t))
+ (setq end (mail-header-end))
+ (goto-char (point-min))
+ (if (re-search-forward (concat "^" (regexp-quote field) ":") end t)
+ (progn
+ (re-search-forward "^[^ \t]" nil 'move)
+ (beginning-of-line)
+ (skip-chars-backward "\n")
+ t)
+ (or soft
+ (progn (goto-char end)
+ (insert field ": \n")
+ (skip-chars-backward "\n")))
+ nil)))
+
+(defun mail-text ()
+ "Move point to beginning of message text."
+ (interactive)
+ (expand-abbrev)
+ (goto-char (mail-text-start)))
+\f
+(defun mail-signature (&optional atpoint)
+ "Sign letter with signature based on `mail-signature-file'.
+Prefix arg means put contents at point."
+ (interactive "P")
+ (save-excursion
+ (or atpoint
+ (goto-char (point-max)))
+ (skip-chars-backward " \t\n")
+ (end-of-line)
+ (or atpoint
+ (delete-region (point) (point-max)))
+ (if (stringp mail-signature)
+ (insert mail-signature)
+ (insert "\n\n-- \n")
+ (insert-file-contents (expand-file-name mail-signature-file)))))
+
+(defun mail-fill-yanked-message (&optional justifyp)
+ "Fill the paragraphs of a message yanked into this one.
+Numeric argument means justify as well."
+ (interactive "P")
+ (save-excursion
+ (goto-char (mail-text-start))
+ (fill-individual-paragraphs (point)
+ (point-max)
+ justifyp
+ mail-citation-prefix-regexp)))
+
+(defun mail-indent-citation ()
+ "Modify text just inserted from a message to be cited.
+The inserted text should be the region.
+When this function returns, the region is again around the modified text.
+
+Normally, indent each nonblank line `mail-indentation-spaces' spaces.
+However, if `mail-yank-prefix' is non-nil, insert that prefix on each line."
+ (mail-yank-clear-headers (region-beginning) (region-end))
+ (if (null mail-yank-prefix)
+ (indent-rigidly (region-beginning) (region-end)
+ mail-indentation-spaces)
+ (save-excursion
+ (let ((end (set-marker (make-marker) (region-end))))
+ (goto-char (region-beginning))
+ (while (< (point) end)
+ (insert mail-yank-prefix)
+ (forward-line 1))))))
+
+(defun mail-yank-original (arg)
+ "Insert the message being replied to, if any (in rmail).
+Puts point after the text and mark before.
+Normally, indents each nonblank line ARG spaces (default 3).
+However, if `mail-yank-prefix' is non-nil, insert that prefix on each line.
+
+Just \\[universal-argument] as argument means don't indent, insert no prefix,
+and don't delete any header fields."
+ (interactive "P")
+ (if mail-reply-action
+ (let ((start (point))
+ (original mail-reply-action))
+ (and (consp original) (eq (car original) 'insert-buffer)
+ (setq original (nth 1 original)))
+ (if (consp original)
+ (apply (car original) (cdr original))
+ ;; If the original message is in another window in the same frame,
+ ;; delete that window to save screen space.
+ ;; t means don't alter other frames.
+ (delete-windows-on original t)
+ (with-no-warnings
+ ;; We really want this to set mark.
+ (insert-buffer original))
+ (set-text-properties (point) (mark t) nil))
+ (if (consp arg)
+ nil
+ (goto-char start)
+ (let ((mail-indentation-spaces (if arg (prefix-numeric-value arg)
+ mail-indentation-spaces))
+ ;; Avoid error in Transient Mark mode
+ ;; on account of mark's being inactive.
+ (mark-even-if-inactive t))
+ (cond (mail-citation-hook
+ ;; Bind mail-citation-header to the inserted
+ ;; message's header.
+ (let ((mail-citation-header
+ (buffer-substring-no-properties
+ start
+ (save-excursion
+ (save-restriction
+ (narrow-to-region start (point-max))
+ (goto-char start)
+ (rfc822-goto-eoh)
+ (point))))))
+ (run-hooks 'mail-citation-hook)))
+ (mail-yank-hooks
+ (run-hooks 'mail-yank-hooks))
+ (t
+ (mail-indent-citation)))))
+ ;; This is like exchange-point-and-mark, but doesn't activate the mark.
+ ;; It is cleaner to avoid activation, even though the command
+ ;; loop would deactivate the mark because we inserted text.
+ (goto-char (prog1 (mark t)
+ (set-marker (mark-marker) (point) (current-buffer))))
+ (if (not (eolp)) (insert ?\n)))))
+
+(defun mail-yank-clear-headers (start end)
+ (if (< end start)
+ (let (temp)
+ (setq temp start start end end temp)))
+ (if mail-yank-ignored-headers
+ (save-excursion
+ (goto-char start)
+ (if (search-forward "\n\n" end t)
+ (save-restriction
+ (narrow-to-region start (point))
+ (goto-char start)
+ (while (let ((case-fold-search t))
+ (re-search-forward mail-yank-ignored-headers nil t))
+ (beginning-of-line)
+ (delete-region (point)
+ (progn (re-search-forward "\n[^ \t]")
+ (forward-char -1)
+ (point)))))))))
+
+(defun mail-yank-region (arg)
+ "Insert the selected region from the message being replied to.
+Puts point after the text and mark before.
+Normally, indents each nonblank line ARG spaces (default 3).
+However, if `mail-yank-prefix' is non-nil, insert that prefix on each line.
+
+Just \\[universal-argument] as argument means don't indent, insert no prefix,
+and don't delete any header fields."
+ (interactive "P")
+ (and (consp mail-reply-action)
+ (eq (car mail-reply-action) 'insert-buffer)
+ (with-current-buffer (nth 1 mail-reply-action)
+ (or (mark t)
+ (error "No mark set: %S" (current-buffer))))
+ (let ((buffer (nth 1 mail-reply-action))
+ (start (point))
+ ;; Avoid error in Transient Mark mode
+ ;; on account of mark's being inactive.
+ (mark-even-if-inactive t))
+ ;; Insert the citation text.
+ (insert (with-current-buffer buffer
+ (buffer-substring-no-properties (point) (mark))))
+ (push-mark start)
+ ;; Indent or otherwise annotate the citation text.
+ (if (consp arg)
+ nil
+ (let ((mail-indentation-spaces (if arg (prefix-numeric-value arg)
+ mail-indentation-spaces)))
+ (if mail-citation-hook
+ ;; Bind mail-citation-hook to the original message's header.
+ (let ((mail-citation-header
+ (with-current-buffer buffer
+ (buffer-substring-no-properties
+ (point-min)
+ (save-excursion
+ (goto-char (point-min))
+ (rfc822-goto-eoh)
+ (point))))))
+ (run-hooks 'mail-citation-hook))
+ (if mail-yank-hooks
+ (run-hooks 'mail-yank-hooks)
+ (mail-indent-citation))))))))
+
+(defun mail-split-line ()
+ "Split current line, moving portion beyond point vertically down.
+If the current line has `mail-yank-prefix', insert it on the new line."
+ (interactive "*")
+ (split-line mail-yank-prefix))
+
+\f
+(defun mail-attach-file (&optional file)
+ "Insert a file at the end of the buffer, with separator lines around it."
+ (interactive "fAttach file: ")
+ (save-excursion
+ (goto-char (point-max))
+ (or (bolp) (newline))
+ (newline)
+ (let ((start (point))
+ middle)
+ (insert (format "===File %s===" file))
+ (insert-char ?= (max 0 (- 60 (current-column))))
+ (newline)
+ (setq middle (point))
+ (insert "============================================================\n")
+ (push-mark)
+ (goto-char middle)
+ (insert-file-contents file)
+ (or (bolp) (newline))
+ (goto-char start))))
+\f
+;; Put these commands last, to reduce chance of lossage from quitting
+;; in middle of loading the file.
+
+;;;###autoload (add-hook 'same-window-buffer-names "*mail*")
+
+;;;###autoload
+(defun mail (&optional noerase to subject in-reply-to cc replybuffer actions)
+ "Edit a message to be sent. Prefix arg means resume editing (don't erase).
+When this function returns, the buffer `*mail*' is selected.
+The value is t if the message was newly initialized; otherwise, nil.
+
+Optionally, the signature file `mail-signature-file' can be inserted at the
+end; see the variable `mail-signature'.
+
+\\<mail-mode-map>
+While editing message, type \\[mail-send-and-exit] to send the message and exit.
+
+Various special commands starting with C-c are available in sendmail mode
+to move to message header fields:
+\\{mail-mode-map}
+
+If `mail-self-blind' is non-nil, a BCC to yourself is inserted
+when the message is initialized.
+
+If `mail-default-reply-to' is non-nil, it should be an address (a string);
+a Reply-to: field with that address is inserted.
+
+If `mail-archive-file-name' is non-nil, an FCC field with that file name
+is inserted.
+
+The normal hook `mail-setup-hook' is run after the message is
+initialized. It can add more default fields to the message.
+
+The first argument, NOERASE, determines what to do when there is
+an existing modified `*mail*' buffer. If NOERASE is nil, the
+existing mail buffer is used, and the user is prompted whether to
+keep the old contents or to erase them. If NOERASE has the value
+`new', a new mail buffer will be created instead of using the old
+one. Any other non-nil value means to always select the old
+buffer without erasing the contents.
+
+The second through fifth arguments,
+ TO, SUBJECT, IN-REPLY-TO and CC, specify if non-nil
+ the initial contents of those header fields.
+ These arguments should not have final newlines.
+The sixth argument REPLYBUFFER is a buffer which contains an
+ original message being replied to, or else an action
+ of the form (FUNCTION . ARGS) which says how to insert the original.
+ Or it can be nil, if not replying to anything.
+The seventh argument ACTIONS is a list of actions to take
+ if/when the message is sent. Each action looks like (FUNCTION . ARGS);
+ when the message is sent, we apply FUNCTION to ARGS.
+ This is how Rmail arranges to mark messages `answered'."
+ (interactive "P")
+;;; This is commented out because I found it was confusing in practice.
+;;; It is easy enough to rename *mail* by hand with rename-buffer
+;;; if you want to have multiple mail buffers.
+;;; And then you can control which messages to save. --rms.
+;;; (let ((index 1)
+;;; buffer)
+;;; ;; If requested, look for a mail buffer that is modified and go to it.
+;;; (if noerase
+;;; (progn
+;;; (while (and (setq buffer
+;;; (get-buffer (if (= 1 index) "*mail*"
+;;; (format "*mail*<%d>" index))))
+;;; (not (buffer-modified-p buffer)))
+;;; (setq index (1+ index)))
+;;; (if buffer (switch-to-buffer buffer)
+;;; ;; If none exists, start a new message.
+;;; ;; This will never re-use an existing unmodified mail buffer
+;;; ;; (since index is not 1 anymore). Perhaps it should.
+;;; (setq noerase nil))))
+;;; ;; Unless we found a modified message and are happy, start a new message.
+;;; (if (not noerase)
+;;; (progn
+;;; ;; Look for existing unmodified mail buffer.
+;;; (while (and (setq buffer
+;;; (get-buffer (if (= 1 index) "*mail*"
+;;; (format "*mail*<%d>" index))))
+;;; (buffer-modified-p buffer))
+;;; (setq index (1+ index)))
+;;; ;; If none, make a new one.
+;;; (or buffer
+;;; (setq buffer (generate-new-buffer "*mail*")))
+;;; ;; Go there and initialize it.
+;;; (switch-to-buffer buffer)
+;;; (erase-buffer)
+;;; (setq default-directory (expand-file-name "~/"))
+;;; (auto-save-mode auto-save-default)
+;;; (mail-mode)
+;;; (mail-setup to subject in-reply-to cc replybuffer actions)
+;;; (if (and buffer-auto-save-file-name
+;;; (file-exists-p buffer-auto-save-file-name))
+;;; (message "Auto save file for draft message exists; consider M-x mail-recover"))
+;;; t))
+
+ (if (eq noerase 'new)
+ (pop-to-buffer (generate-new-buffer "*mail*"))
+ (and noerase
+ (not (get-buffer "*mail*"))
+ (setq noerase nil))
+ (pop-to-buffer "*mail*"))
+
+ ;; Avoid danger that the auto-save file can't be written.
+ (let ((dir (expand-file-name
+ (file-name-as-directory mail-default-directory))))
+ (if (file-exists-p dir)
+ (setq default-directory dir)))
+ ;; Only call auto-save-mode if necessary, to avoid changing auto-save file.
+ (if (or (and auto-save-default (not buffer-auto-save-file-name))
+ (and (not auto-save-default) buffer-auto-save-file-name))
+ (auto-save-mode auto-save-default))
+ (mail-mode)
+ ;; Disconnect the buffer from its visited file
+ ;; (in case the user has actually visited a file *mail*).
+;;; (set-visited-file-name nil)
+ (let (initialized)
+ (and (not (and noerase
+ (not (eq noerase 'new))))
+ (if buffer-file-name
+ (if (buffer-modified-p)
+ (when (y-or-n-p "Buffer has unsaved changes; reinitialize it and discard them? ")
+ (if (y-or-n-p "Disconnect buffer from visited file? ")
+ (set-visited-file-name nil))
+ t)
+ (when (y-or-n-p "Reinitialize buffer, and disconnect it from the visited file? ")
+ (set-visited-file-name nil)
+ t))
+ ;; A non-file-visiting buffer.
+ (if (buffer-modified-p)
+ (y-or-n-p "Unsent message being composed; erase it? ")
+ t))
+ (let ((inhibit-read-only t))
+ (erase-buffer)
+ (mail-setup to subject in-reply-to cc replybuffer actions)
+ (setq initialized t)))
+ (if (and buffer-auto-save-file-name
+ (file-exists-p buffer-auto-save-file-name))
+ (message "Auto save file for draft message exists; consider M-x mail-recover"))
+ initialized))
+
+(defun mail-recover-1 ()
+ "Pop up a list of auto-saved draft messages so you can recover one of them."
+ (interactive)
+ (let ((file-name (make-auto-save-file-name))
+ (ls-lisp-support-shell-wildcards t)
+ non-random-len wildcard)
+ ;; Remove the random part from the auto-save-file-name, and
+ ;; create a wildcard which matches possible candidates.
+ ;; Note: this knows that make-auto-save-file-name appends
+ ;; "#<RANDOM-STUFF>#" to the buffer name, where RANDOM-STUFF
+ ;; is the result of (make-temp-name "").
+ (setq non-random-len
+ (- (length file-name) (length (make-temp-name "")) 1))
+ (setq wildcard (concat (substring file-name 0 non-random-len) "*"))
+ (if (null (file-expand-wildcards wildcard))
+ (message "There are no auto-saved drafts to recover")
+ ;; Bind dired-trivial-filenames to t because all auto-save file
+ ;; names are normally ``trivial'', so Dired will set point after
+ ;; all the files, at buffer bottom. We want it on the first
+ ;; file instead.
+ (let ((dired-trivial-filenames t))
+ (dired-other-window wildcard (concat dired-listing-switches "t")))
+ (rename-buffer "*Auto-saved Drafts*" t)
+ (save-excursion
+ (goto-char (point-min))
+ (or (looking-at " Move to the draft file you want to recover,")
+ (let ((inhibit-read-only t))
+ ;; Each line starts with a space so that Font Lock mode
+ ;; won't highlight the first character.
+ (insert "\
+ Move to the draft file you want to recover, then type C-c C-c
+ to recover text of message whose composition was interrupted.
+ To browse text of a draft, type v on the draft file's line.
+
+ You can also delete some of these files;
+ type d on a line to mark that file for deletion.
+
+ List of possible auto-save files for recovery:
+
+"))))
+ (use-local-map
+ (let ((map (make-sparse-keymap)))
+ (set-keymap-parent map (current-local-map))
+ map))
+ (define-key (current-local-map) "v"
+ (lambda ()
+ (interactive)
+ (let ((coding-system-for-read 'emacs-mule-unix))
+ (dired-view-file))))
+ (define-key (current-local-map) "\C-c\C-c"
+ (lambda ()
+ (interactive)
+ (let ((fname (dired-get-filename))
+ ;; Auto-saved files are written in the internal
+ ;; representation, so they should be read accordingly.
+ (coding-system-for-read 'emacs-mule-unix))
+ (switch-to-buffer-other-window "*mail*")
+ (let ((buffer-read-only nil))
+ (erase-buffer)
+ (insert-file-contents fname nil)
+ ;; insert-file-contents will set buffer-file-coding-system
+ ;; to emacs-mule, which is probably not what they want to
+ ;; use for sending the message. But we don't know what
+ ;; was its value before the buffer was killed or Emacs
+ ;; crashed. We therefore reset buffer-file-coding-system
+ ;; to the default value, so that either the default does
+ ;; TRT, or the user will get prompted for the right
+ ;; encoding when they send the message.
+ (setq buffer-file-coding-system
+ default-buffer-file-coding-system))))))))
+
+(defun mail-recover ()
+ "Recover interrupted mail composition from auto-save files.
+
+If the mail buffer has a current valid auto-save file,
+the command recovers that file. Otherwise, it displays a
+buffer showing the existing auto-saved draft messages;
+you can move to one of them and type C-c C-c to recover that one."
+ (interactive)
+ ;; In case they invoke us from some random buffer...
+ (switch-to-buffer "*mail*")
+ ;; If *mail* didn't exist, set its directory, so that auto-saved
+ ;; drafts will be found.
+ (let ((dir (expand-file-name
+ (file-name-as-directory mail-default-directory))))
+ (if (file-exists-p dir)
+ (setq default-directory dir)))
+ (or (eq major-mode 'mail-mode)
+ (mail-mode))
+ (let ((file-name buffer-auto-save-file-name))
+ (cond ((and file-name (file-exists-p file-name))
+ (let ((dispbuf
+ ;; This used to invoke `ls' via call-process, but
+ ;; dired-noselect is more portable to systems where
+ ;; `ls' is not a standard program (it will use
+ ;; ls-lisp instead).
+ (dired-noselect file-name
+ (concat dired-listing-switches "t"))))
+ (save-selected-window
+ (select-window (display-buffer dispbuf t))
+ (goto-char (point-min))
+ (forward-line 2)
+ (dired-move-to-filename)
+ (setq dispbuf (rename-buffer "*Directory*" t)))
+ (if (not (yes-or-no-p
+ (format "Recover mail draft from auto save file %s? "
+ file-name)))
+ (error "mail-recover cancelled")
+ (let ((buffer-read-only nil)
+ (buffer-coding buffer-file-coding-system)
+ ;; Auto-save files are written in internal
+ ;; representation of non-ASCII characters.
+ (coding-system-for-read 'emacs-mule-unix))
+ (erase-buffer)
+ (insert-file-contents file-name nil)
+ (setq buffer-file-coding-system buffer-coding)))))
+ (t (mail-recover-1)))))
+
+;;;###autoload
+(defun mail-other-window (&optional noerase to subject in-reply-to cc replybuffer sendactions)
+ "Like `mail' command, but display mail buffer in another window."
+ (interactive "P")
+ (let ((pop-up-windows t)
+ (special-display-buffer-names nil)
+ (special-display-regexps nil)
+ (same-window-buffer-names nil)
+ (same-window-regexps nil))
+ (pop-to-buffer "*mail*"))
+ (mail noerase to subject in-reply-to cc replybuffer sendactions))
+
+;;;###autoload
+(defun mail-other-frame (&optional noerase to subject in-reply-to cc replybuffer sendactions)
+ "Like `mail' command, but display mail buffer in another frame."
+ (interactive "P")
+ (let ((pop-up-frames t)
+ (special-display-buffer-names nil)
+ (special-display-regexps nil)
+ (same-window-buffer-names nil)
+ (same-window-regexps nil))
+ (pop-to-buffer "*mail*"))
+ (mail noerase to subject in-reply-to cc replybuffer sendactions))
+
+;; Do not add anything but external entries on this page.
+
+(provide 'sendmail)
+
+;; arch-tag: 48bc1025-d993-4d31-8d81-2a29491f0626
+;;; sendmail.el ends here
--- /dev/null
+;;; smime-card.el --- Make smime.el work with card readers
+
+;; Copyright (C) 2005 Brailcom, o.p.s.
+;; Author: Milan Zamazal <pdm@zamazal.org>
+
+;; COPYRIGHT NOTICE
+;;
+;; 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 this program; if not, write to the Free Software
+;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+;;; Commentary:
+
+;; This is a simple wrapper around smime.el allowing to use private keys stored
+;; on a smard card.
+;;
+;; To use it, just put (require 'smime-card) to you Emacs startup file and
+;; customize the variable `smime-card-file-keys'.
+
+;;; Code:
+
+(require 'smime)
+
+;;; Configuration
+
+(defcustom smime-card-file-keys '()
+ "Alist of certificate files and their corresponding private key card ids.
+Each element of the list is of the form (FILE . KEY-ID), where FILE is a
+certificate file stored on a regular file system and KEY-ID is the identifier
+of the corresponding private key stored on the card.
+If FILE begins with the prefix `card:', the certificate is retrieved from the
+card under the id following the `card:' prefix in FILE."
+ :type '(alist :key-type (file :tag "Certificate file")
+ :value-type (string :tag "Key identifier"))
+ :group 'smime)
+
+(defcustom smime-card-fetch-certificates nil
+ "If non-nil, fetch certificates from the card before verifying messages."
+ :type 'boolean
+ :group 'smime)
+
+;;; Internals
+
+(defvar smime-card-key nil)
+
+(defun smime-card-key (keyfile)
+ (cdr (assoc keyfile smime-card-file-keys)))
+
+(defvar smime-card-engine-command
+ "engine dynamic -pre SO_PATH:/usr/lib/opensc/engine_pkcs11.so -pre ID:pkcs11 -pre LIST_ADD:1 -pre LOAD\n")
+
+(defvar smime-card-process-output "")
+
+(defun smime-card-process-filter (process string)
+ (setq smime-card-process-output (concat smime-card-process-output string)))
+
+(defun smime-card-wait-for-prompt (process)
+ (while (not (string-match "\\(OpenSSL> \\|PIN: \\)$"
+ smime-card-process-output))
+ (unless (accept-process-output process 5)
+ (message "OpenSSL: Timeout")
+ (throw 'error nil)))
+ (prog1 (if (string= (match-string 1 smime-card-process-output) "PIN: ")
+ 'pin
+ t)
+ (setq smime-card-process-output "")))
+
+(defun smime-card-call-openssl-region (b e buf &rest args)
+ (let* ((infile (make-temp-file "smime-card-in"))
+ (outfile (make-temp-file "smime-card-out"))
+ (cert-on-card (and (string-match "^card:\\(.*\\)$" keyfile)
+ (match-string 1 keyfile)))
+ (certfile (and cert-on-card (make-temp-file "smime-card-cert")))
+ (args (append args
+ (list "-engine" "pkcs11"
+ "-keyform" "engine"
+ "-inkey" smime-card-key
+ "-in" infile "-out" outfile)))
+ (process (start-process "openssl" " *openssl*" smime-openssl-program)))
+ (unwind-protect
+ (catch 'error
+ (when certfile
+ (unless (= (call-process "pkcs15-tool" nil nil nil
+ "-r" cert-on-card "-o" certfile)
+ 0)
+ (message "pkcs15: Error")
+ (throw 'error nil))
+ (let ((args* args))
+ (while (and args* (not (string= (car args*) "-signer")))
+ (setq args* (cdr args*)))
+ (setq args* (cdr args*))
+ (when args*
+ (setcar args* certfile))))
+ (setq smime-card-process-output "")
+ (set-process-filter process 'smime-card-process-filter)
+ (unless (eq (smime-card-wait-for-prompt process) t)
+ (message "OpenSSL: Error on startup")
+ (throw 'error nil))
+ (process-send-string process smime-card-engine-command)
+ (unless (eq (smime-card-wait-for-prompt process) t)
+ (message "OpenSSL: Error in pkcs11 loading")
+ (throw 'error nil))
+ (write-region b e infile nil 0)
+ (process-send-string process
+ (concat (mapconcat 'identity args " ") "\n"))
+ (let ((answer (smime-card-wait-for-prompt process)))
+ (cond
+ ((eq answer 'pin)
+ (process-send-string process (concat (read-passwd "Smartcard PIN: ") "\n"))
+ (unless (eq (smime-card-wait-for-prompt process) t)
+ (message "OpenSSL: Error after passphrase")
+ (throw 'error nil)))
+ ((eq answer t)
+ nil)
+ (t
+ (message "OpenSSL: Error in processing")
+ (throw 'error nil))))
+ (process-send-eof process)
+ (with-current-buffer (car buf)
+ (when (= (cadr (insert-file-contents outfile)) 0)
+ (message "OpenSSL: Empty output")
+ (throw 'error nil)))
+ t)
+ (delete-file infile)
+ (delete-file outfile)
+ (when certfile (delete-file certfile))
+ (delete-process process)
+ (kill-buffer " *openssl*"))))
+
+;;; smime.el advices
+
+(defadvice smime-sign-region (around smime-card-sign-region activate)
+ (let ((smime-card-key (smime-card-key (ad-get-arg 2))))
+ ad-do-it))
+
+(defadvice smime-decrypt-region (around smime-card-decrypt-region activate)
+ (let ((smime-card-key (smime-card-key (ad-get-arg 2))))
+ ad-do-it))
+
+(defadvice smime-call-openssl-region (around smime-card-openssl activate)
+ (if smime-card-key
+ (setq ad-return-value
+ (apply 'smime-card-call-openssl-region (ad-get-args 0)))
+ ad-do-it))
+
+(defadvice smime-verify-region (around smime-card-verify-region activate)
+ (if smime-card-fetch-certificates
+ (let ((cert-ids '()))
+ (with-temp-buffer
+ (unless (= (call-process
+ "pkcs15-tool" nil t nil "--list-certificates")
+ 0)
+ (error "pkcs15: Certificate listing"))
+ (goto-char (point-min))
+ (while (re-search-forward "^[\t ]+ID[ ]+: \\([0-9]+\\) *$" nil t)
+ (setq cert-ids (cons (match-string 1) cert-ids))))
+ (let ((certfile (make-temp-file "smime-card")))
+ (unwind-protect
+ (progn
+ (with-temp-file certfile
+ (when smime-CA-file
+ (insert-file-contents smime-CA-file))
+ (mapc (lambda (id)
+ (unless (= (call-process "pkcs15-tool" nil t nil
+ "-r" id)
+ 0)
+ (error "pkcs15: Certificat read")))
+ cert-ids))
+ (let ((smime-CA-file certfile))
+ ad-do-it))
+ (delete-file certfile))))
+ ad-do-it))
+
+(defadvice mml-smime-verify (around smime-card-mml-smime-verify activate)
+ ;; If both smime-CA-directory and smime-CA-file are unset, `mml-smime-verify'
+ ;; refuses to perform certificate verification.
+ (let ((smime-CA-file (if smime-card-fetch-certificates
+ (or smime-CA-file "/dev/null")
+ smime-CA-file)))
+ ad-do-it))
+
+;;; Announce
+
+(provide 'smime-card)
+
+;; arch-tag: 51da9eb2-1ebe-4255-a429-9f5b04aea4bd
+;;; smime-card.el ends here
--- /dev/null
+;;; smtpmail.el --- simple SMTP protocol (RFC 821) for sending mail
+
+;; Copyright (C) 1995, 1996, 2001, 2002, 2003, 2004, 2005,
+;; 2006 Free Software Foundation, Inc.
+
+;; Author: Tomoji Kagatani <kagatani@rbc.ncl.omron.co.jp>
+;; Maintainer: Simon Josefsson <simon@josefsson.org>
+;; w32 Maintainer: Brian D. Carlstrom <bdc@ai.mit.edu>
+;; ESMTP support: Simon Leinen <simon@switch.ch>
+;; Hacked by Mike Taylor, 11th October 1999 to add support for
+;; automatically appending a domain to RCPT TO: addresses.
+;; AUTH=LOGIN support: Stephen Cranefield <scranefield@infoscience.otago.ac.nz>
+;; 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., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; Send Mail to smtp host from smtpmail temp buffer.
+
+;; Please add these lines in your .emacs(_emacs) or use customize.
+;;
+;;(setq send-mail-function 'smtpmail-send-it) ; if you use `mail'
+;;(setq message-send-mail-function 'smtpmail-send-it) ; if you use message/Gnus
+;;(setq smtpmail-default-smtp-server "YOUR SMTP HOST")
+;;(setq smtpmail-local-domain "YOUR DOMAIN NAME")
+;;(setq smtpmail-sendto-domain "YOUR DOMAIN NAME")
+;;(setq smtpmail-debug-info t) ; only to debug problems
+;;(setq smtpmail-auth-credentials ; or use ~/.authinfo
+;; '(("YOUR SMTP HOST" 25 "username" "password")))
+;;(setq smtpmail-starttls-credentials
+;; '(("YOUR SMTP HOST" 25 "~/.my_smtp_tls.key" "~/.my_smtp_tls.cert")))
+;; Where the 25 equals the value of `smtpmail-smtp-service', it can be an
+;; integer or a string, just as long as they match (eq).
+
+;; To queue mail, set smtpmail-queue-mail to t and use
+;; smtpmail-send-queued-mail to send.
+
+;; Modified by Stephen Cranefield <scranefield@infoscience.otago.ac.nz>,
+;; 22/6/99, to support SMTP Authentication by the AUTH=LOGIN mechanism.
+;; See http://help.netscape.com/products/server/messaging/3x/info/smtpauth.html
+;; Rewritten by Simon Josefsson to use same credential variable as AUTH
+;; support below.
+
+;; Modified by Simon Josefsson <jas@pdc.kth.se>, 22/2/99, to support SMTP
+;; Authentication by the AUTH mechanism.
+;; See http://www.ietf.org/rfc/rfc2554.txt
+
+;; Modified by Simon Josefsson <simon@josefsson.org>, 2000-10-07, to support
+;; STARTTLS. Requires external program
+;; ftp://ftp.opaopa.org/pub/elisp/starttls-*.tar.gz.
+;; See http://www.ietf.org/rfc/rfc2246.txt, http://www.ietf.org/rfc/rfc2487.txt
+
+;;; Code:
+
+(require 'sendmail)
+(autoload 'starttls-open-stream "starttls")
+(autoload 'starttls-negotiate "starttls")
+(autoload 'mail-strip-quoted-names "mail-utils")
+(autoload 'message-make-date "message")
+(autoload 'message-make-message-id "message")
+(autoload 'rfc2104-hash "rfc2104")
+(autoload 'netrc-parse "netrc")
+(autoload 'netrc-machine "netrc")
+(autoload 'netrc-get "netrc")
+
+;;;
+(defgroup smtpmail nil
+ "SMTP protocol for sending mail."
+ :group 'mail)
+
+
+(defcustom smtpmail-default-smtp-server nil
+ "*Specify default SMTP server.
+This only has effect if you specify it before loading the smtpmail library."
+ :type '(choice (const nil) string)
+ :group 'smtpmail)
+
+(defcustom smtpmail-smtp-server
+ (or (getenv "SMTPSERVER") smtpmail-default-smtp-server)
+ "*The name of the host running SMTP server."
+ :type '(choice (const nil) string)
+ :group 'smtpmail)
+
+(defcustom smtpmail-smtp-service 25
+ "*SMTP service port number.
+The default value would be \"smtp\" or 25 ."
+ :type '(choice (integer :tag "Port") (string :tag "Service"))
+ :group 'smtpmail)
+
+(defcustom smtpmail-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 'smtpmail)
+
+(defcustom smtpmail-sendto-domain nil
+ "*Local domain name without a host name.
+This is appended (with an @-sign) to any specified recipients which do
+not include an @-sign, so that each RCPT TO address is fully qualified.
+\(Some configurations of sendmail require this.)
+
+Don't bother to set this unless you have get an error like:
+ Sending failed; SMTP protocol error
+when sending mail, and the *trace of SMTP session to <somewhere>*
+buffer includes an exchange like:
+ RCPT TO: <someone>
+ 501 <someone>: recipient address must contain a domain
+"
+ :type '(choice (const nil) string)
+ :group 'smtpmail)
+
+(defcustom smtpmail-debug-info nil
+ "Whether to print info in buffer *trace of SMTP session to <somewhere>*.
+See also `smtpmail-debug-verb' which determines if the SMTP protocol should
+be verbose as well."
+ :type 'boolean
+ :group 'smtpmail)
+
+(defcustom smtpmail-debug-verb nil
+ "Whether this library sends the SMTP VERB command or not.
+The commands enables verbose information from the SMTP server."
+ :type 'boolean
+ :group 'smtpmail)
+
+(defcustom smtpmail-code-conv-from nil ;; *junet*
+ "*smtpmail code convert from this code to *internal*..for tiny-mime.."
+ :type 'boolean
+ :group 'smtpmail)
+
+(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 'smtpmail)
+
+(defcustom smtpmail-queue-dir "~/Mail/queued-mail/"
+ "*Directory where `smtpmail.el' stores queued mail."
+ :type 'directory
+ :group 'smtpmail)
+
+(defcustom smtpmail-auth-credentials "~/.authinfo"
+ "Specify username and password for servers, directly or via .netrc file.
+This variable can either be a filename pointing to a file in netrc(5)
+format, or list of four-element lists that contain, in order,
+`servername' (a string), `port' (an integer), `user' (a string) and
+`password' (a string, or nil to query the user when needed). If you
+need to enter a `realm' too, add it to the user string, so that it
+looks like `user@realm'."
+ :type '(choice file
+ (repeat (list (string :tag "Server")
+ (integer :tag "Port")
+ (string :tag "Username")
+ (choice (const :tag "Query when needed" nil)
+ (string :tag "Password")))))
+ :version "22.1"
+ :group 'smtpmail)
+
+(defcustom smtpmail-starttls-credentials '(("" 25 "" ""))
+ "Specify STARTTLS keys and certificates for servers.
+This is a list of four-element list with `servername' (a string),
+`port' (an integer), `key' (a filename) and `certificate' (a filename)."
+ :type '(repeat (list (string :tag "Server")
+ (integer :tag "Port")
+ (file :tag "Key")
+ (file :tag "Certificate")))
+ :version "21.1"
+ :group 'smtpmail)
+
+(defcustom smtpmail-warn-about-unknown-extensions nil
+ "*If set, print warnings about unknown SMTP extensions.
+This is mainly useful for development purposes, to learn about
+new SMTP extensions that might be useful to support."
+ :type 'boolean
+ :version "21.1"
+ :group 'smtpmail)
+
+(defvar smtpmail-queue-index-file "index"
+ "File name of queued mail index,
+This is relative to `smtpmail-queue-dir'.")
+
+(defvar smtpmail-address-buffer)
+(defvar smtpmail-recipient-address-list)
+
+(defvar smtpmail-queue-counter 0)
+
+;; Buffer-local variable.
+(defvar smtpmail-read-point)
+
+(defvar smtpmail-queue-index (concat smtpmail-queue-dir
+ smtpmail-queue-index-file))
+
+(defconst smtpmail-auth-supported '(cram-md5 plain login)
+ "List of supported SMTP AUTH mechanisms.")
+
+;;;
+;;;
+;;;
+
+(defvar smtpmail-mail-address nil
+ "Value to use for envelope-from address for mail from ambient buffer.")
+
+;;;###autoload
+(defun smtpmail-send-it ()
+ (let ((errbuf (if mail-interactive
+ (generate-new-buffer " smtpmail errors")
+ 0))
+ (tembuf (generate-new-buffer " smtpmail temp"))
+ (case-fold-search nil)
+ delimline
+ (mailbuf (current-buffer))
+ ;; Examine this variable now, so that
+ ;; local binding in the mail buffer will take effect.
+ (smtpmail-mail-address
+ (or (and mail-specify-envelope-from (mail-envelope-from))
+ user-mail-address))
+ (smtpmail-code-conv-from
+ (if enable-multibyte-characters
+ (let ((sendmail-coding-system smtpmail-code-conv-from))
+ (select-message-coding-system)))))
+ (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.
+ (mail-sendmail-undelimit-header)
+ (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))
+ ;; We used to process Resent-... headers here,
+ ;; but it was not done properly, and the job
+ ;; is done correctly in smtpmail-deduce-address-list.
+ ;; Don't send out a blank subject line
+ (goto-char (point-min))
+ (if (re-search-forward "^Subject:\\([ \t]*\n\\)+\\b" delimline t)
+ (replace-match "")
+ ;; This one matches a Subject just before the header delimiter.
+ (if (and (re-search-forward "^Subject:\\([ \t]*\n\\)+" delimline t)
+ (= (match-end 0) delimline))
+ (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 smtpmail-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 a `Message-Id:' field if there isn't one yet.
+ (goto-char (point-min))
+ (unless (re-search-forward "^Message-Id:" delimline t)
+ (insert "Message-Id: " (message-make-message-id) "\n"))
+ ;; Insert a `Date:' field if there isn't one yet.
+ (goto-char (point-min))
+ (unless (re-search-forward "^Date:" delimline t)
+ (insert "Date: " (message-make-date) "\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
+ (with-current-buffer errbuf
+ (erase-buffer))))
+ ;;
+ ;;
+ ;;
+ (setq smtpmail-address-buffer (generate-new-buffer "*smtp-mail*"))
+ (setq smtpmail-recipient-address-list
+ (smtpmail-deduce-address-list tembuf (point-min) delimline))
+ (kill-buffer smtpmail-address-buffer)
+
+ (smtpmail-do-bcc delimline)
+ ; Send or queue
+ (if (not smtpmail-queue-mail)
+ (if (not (null smtpmail-recipient-address-list))
+ (if (not (smtpmail-via-smtp
+ smtpmail-recipient-address-list tembuf))
+ (error "Sending failed; SMTP protocol error"))
+ (error "Sending failed; no recipients"))
+ (let* ((file-data
+ (expand-file-name
+ (format "%s_%i"
+ (format-time-string "%Y-%m-%d_%H:%M:%S")
+ (setq smtpmail-queue-counter
+ (1+ smtpmail-queue-counter)))
+ smtpmail-queue-dir))
+ (file-data (convert-standard-filename file-data))
+ (file-elisp (concat file-data ".el"))
+ (buffer-data (create-file-buffer file-data))
+ (buffer-elisp (create-file-buffer file-elisp))
+ (buffer-scratch "*queue-mail*"))
+ (unless (file-exists-p smtpmail-queue-dir)
+ (make-directory smtpmail-queue-dir t))
+ (with-current-buffer buffer-data
+ (erase-buffer)
+ (insert-buffer-substring 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)))))
+
+;;;###autoload
+(defun smtpmail-send-queued-mail ()
+ "Send mail that was queued as a result of setting `smtpmail-queue-mail'."
+ (interactive)
+ (with-temp-buffer
+ ;;; Get index, get first mail, send it, update index, get second
+ ;;; mail, send it, etc...
+ (let ((file-msg ""))
+ (insert-file-contents smtpmail-queue-index)
+ (goto-char (point-min))
+ (while (not (eobp))
+ (setq file-msg (buffer-substring (point) (line-end-position)))
+ (load file-msg)
+ ;; Insert the message literally: it is already encoded as per
+ ;; the MIME headers, and code conversions might guess the
+ ;; encoding wrongly.
+ (with-temp-buffer
+ (let ((coding-system-for-read 'no-conversion))
+ (insert-file-contents file-msg))
+ (let ((smtpmail-mail-address
+ (or (and mail-specify-envelope-from (mail-envelope-from))
+ user-mail-address)))
+ (if (not (null smtpmail-recipient-address-list))
+ (if (not (smtpmail-via-smtp smtpmail-recipient-address-list
+ (current-buffer)))
+ (error "Sending failed; SMTP protocol error"))
+ (error "Sending failed; no recipients"))))
+ (delete-file file-msg)
+ (delete-file (concat file-msg ".el"))
+ (delete-region (point-at-bol) (point-at-bol 2)))
+ (write-region (point-min) (point-max) smtpmail-queue-index))))
+
+;(defun smtpmail-via-smtp (host,port,sender,destination,smtpmail-text-buffer)
+
+(defun smtpmail-fqdn ()
+ (if smtpmail-local-domain
+ (concat (system-name) "." smtpmail-local-domain)
+ (system-name)))
+
+(defsubst smtpmail-cred-server (cred)
+ (nth 0 cred))
+
+(defsubst smtpmail-cred-port (cred)
+ (nth 1 cred))
+
+(defsubst smtpmail-cred-key (cred)
+ (nth 2 cred))
+
+(defsubst smtpmail-cred-user (cred)
+ (nth 2 cred))
+
+(defsubst smtpmail-cred-cert (cred)
+ (nth 3 cred))
+
+(defsubst smtpmail-cred-passwd (cred)
+ (nth 3 cred))
+
+(defun smtpmail-find-credentials (cred server port)
+ (catch 'done
+ (let ((l cred) el)
+ (while (setq el (pop l))
+ (when (and (equal server (smtpmail-cred-server el))
+ (equal port (smtpmail-cred-port el)))
+ (throw 'done el))))))
+
+(defun smtpmail-maybe-append-domain (recipient)
+ (if (or (not smtpmail-sendto-domain)
+ (string-match "@" recipient))
+ recipient
+ (concat recipient "@" smtpmail-sendto-domain)))
+
+(defun smtpmail-intersection (list1 list2)
+ (let ((result nil))
+ (dolist (el2 list2)
+ (when (memq el2 list1)
+ (push el2 result)))
+ (nreverse result)))
+
+(defvar starttls-extra-args)
+(defvar starttls-extra-arguments)
+
+(defun smtpmail-open-stream (process-buffer host port)
+ (let ((cred (smtpmail-find-credentials
+ smtpmail-starttls-credentials host port)))
+ (if (null (and cred (condition-case ()
+ (with-no-warnings
+ (require 'starttls)
+ (call-process (if starttls-use-gnutls
+ starttls-gnutls-program
+ starttls-program)))
+ (error nil))))
+ ;; The normal case.
+ (open-network-stream "SMTP" process-buffer host port)
+ (let* ((cred-key (smtpmail-cred-key cred))
+ (cred-cert (smtpmail-cred-cert cred))
+ (starttls-extra-args
+ (append
+ starttls-extra-args
+ (when (and (stringp cred-key) (stringp cred-cert)
+ (file-regular-p
+ (setq cred-key (expand-file-name cred-key)))
+ (file-regular-p
+ (setq cred-cert (expand-file-name cred-cert))))
+ (list "--key-file" cred-key "--cert-file" cred-cert))))
+ (starttls-extra-arguments
+ (append
+ starttls-extra-arguments
+ (when (and (stringp cred-key) (stringp cred-cert)
+ (file-regular-p
+ (setq cred-key (expand-file-name cred-key)))
+ (file-regular-p
+ (setq cred-cert (expand-file-name cred-cert))))
+ (list "--x509keyfile" cred-key "--x509certfile" cred-cert)))))
+ (starttls-open-stream "SMTP" process-buffer host port)))))
+
+(defun smtpmail-try-auth-methods (process supported-extensions host port)
+ (let* ((mechs (cdr-safe (assoc 'auth supported-extensions)))
+ (mech (car (smtpmail-intersection smtpmail-auth-supported mechs)))
+ (cred (if (stringp smtpmail-auth-credentials)
+ (let* ((netrc (netrc-parse smtpmail-auth-credentials))
+ (port-name (format "%s" (or port "smtp")))
+ (hostentry (netrc-machine netrc host port-name
+ port-name)))
+ (when hostentry
+ (list host port
+ (netrc-get hostentry "login")
+ (netrc-get hostentry "password"))))
+ (smtpmail-find-credentials
+ smtpmail-auth-credentials host port)))
+ (passwd (when cred
+ (or (smtpmail-cred-passwd cred)
+ (read-passwd
+ (format "SMTP password for %s:%s: "
+ (smtpmail-cred-server cred)
+ (smtpmail-cred-port cred))))))
+ ret)
+ (when (and cred mech)
+ (cond
+ ((eq mech 'cram-md5)
+ (smtpmail-send-command process (upcase (format "AUTH %s" mech)))
+ (if (or (null (car (setq ret (smtpmail-read-response process))))
+ (not (integerp (car ret)))
+ (>= (car ret) 400))
+ (throw 'done nil))
+ (when (eq (car ret) 334)
+ (let* ((challenge (substring (cadr ret) 4))
+ (decoded (base64-decode-string challenge))
+ (hash (rfc2104-hash 'md5 64 16 passwd decoded))
+ (response (concat (smtpmail-cred-user cred) " " hash))
+ (encoded (base64-encode-string response)))
+ (smtpmail-send-command process (format "%s" encoded))
+ (if (or (null (car (setq ret (smtpmail-read-response process))))
+ (not (integerp (car ret)))
+ (>= (car ret) 400))
+ (throw 'done nil)))))
+ ((eq mech 'login)
+ (smtpmail-send-command process "AUTH LOGIN")
+ (if (or (null (car (setq ret (smtpmail-read-response process))))
+ (not (integerp (car ret)))
+ (>= (car ret) 400))
+ (throw 'done nil))
+ (smtpmail-send-command
+ process (base64-encode-string (smtpmail-cred-user cred)))
+ (if (or (null (car (setq ret (smtpmail-read-response process))))
+ (not (integerp (car ret)))
+ (>= (car ret) 400))
+ (throw 'done nil))
+ (smtpmail-send-command process (base64-encode-string passwd))
+ (if (or (null (car (setq ret (smtpmail-read-response process))))
+ (not (integerp (car ret)))
+ (>= (car ret) 400))
+ (throw 'done nil)))
+ ((eq mech 'plain)
+ ;; We used to send an empty initial request, and wait for an
+ ;; empty response, and then send the password, but this
+ ;; violate a SHOULD in RFC 2222 paragraph 5.1. Note that this
+ ;; is not sent if the server did not advertise AUTH PLAIN in
+ ;; the EHLO response. See RFC 2554 for more info.
+ (smtpmail-send-command process
+ (concat "AUTH PLAIN "
+ (base64-encode-string
+ (concat "\0"
+ (smtpmail-cred-user cred)
+ "\0"
+ passwd))))
+ (if (or (null (car (setq ret (smtpmail-read-response process))))
+ (not (integerp (car ret)))
+ (not (equal (car ret) 235)))
+ (throw 'done nil)))
+
+ (t
+ (error "Mechanism %s not implemented" mech)))
+ ;; Remember the password.
+ (when (and (not (stringp smtpmail-auth-credentials))
+ (null (smtpmail-cred-passwd cred)))
+ (setcar (cdr (cdr (cdr cred))) passwd)))))
+
+(defun smtpmail-via-smtp (recipient smtpmail-text-buffer)
+ (let ((process nil)
+ (host (or smtpmail-smtp-server
+ (error "`smtpmail-smtp-server' not defined")))
+ (port smtpmail-smtp-service)
+ ;; smtpmail-mail-address should be set to the appropriate
+ ;; buffer-local value by the caller, but in case not:
+ (envelope-from (or smtpmail-mail-address
+ (and mail-specify-envelope-from
+ (mail-envelope-from))
+ user-mail-address))
+ response-code
+ greeting
+ process-buffer
+ (supported-extensions '()))
+ (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
+ (with-current-buffer process-buffer
+ (setq buffer-undo-list t)
+ (erase-buffer))
+
+ ;; open the connection to the server
+ (setq process (smtpmail-open-stream process-buffer host port))
+ (and (null process) (throw 'done nil))
+
+ ;; set the send-filter
+ (set-process-filter process 'smtpmail-process-filter)
+
+ (with-current-buffer process-buffer
+ (set-buffer-process-coding-system 'raw-text-unix 'raw-text-unix)
+ (make-local-variable 'smtpmail-read-point)
+ (setq smtpmail-read-point (point-min))
+
+
+ (if (or (null (car (setq greeting (smtpmail-read-response process))))
+ (not (integerp (car greeting)))
+ (>= (car greeting) 400))
+ (throw 'done nil)
+ )
+
+ (let ((do-ehlo t)
+ (do-starttls t))
+ (while do-ehlo
+ ;; EHLO
+ (smtpmail-send-command process (format "EHLO %s" (smtpmail-fqdn)))
+
+ (if (or (null (car (setq response-code
+ (smtpmail-read-response process))))
+ (not (integerp (car response-code)))
+ (>= (car response-code) 400))
+ (progn
+ ;; HELO
+ (smtpmail-send-command
+ process (format "HELO %s" (smtpmail-fqdn)))
+
+ (if (or (null (car (setq response-code
+ (smtpmail-read-response process))))
+ (not (integerp (car response-code)))
+ (>= (car response-code) 400))
+ (throw 'done nil)))
+ (dolist (line (cdr (cdr response-code)))
+ (let ((name (mapcar (lambda (s) (intern (downcase s)))
+ (split-string (substring line 4) "[ ]"))))
+ (and (eq (length name) 1)
+ (setq name (car name)))
+ (and name
+ (cond ((memq (if (consp name) (car name) name)
+ '(verb xvrb 8bitmime onex xone
+ expn size dsn etrn
+ enhancedstatuscodes
+ help xusr
+ auth=login auth starttls))
+ (setq supported-extensions
+ (cons name supported-extensions)))
+ (smtpmail-warn-about-unknown-extensions
+ (message "Unknown extension %s" name)))))))
+
+ (if (and do-starttls
+ (smtpmail-find-credentials smtpmail-starttls-credentials host port)
+ (member 'starttls supported-extensions)
+ (numberp (process-id process)))
+ (progn
+ (smtpmail-send-command process (format "STARTTLS"))
+ (if (or (null (car (setq response-code (smtpmail-read-response process))))
+ (not (integerp (car response-code)))
+ (>= (car response-code) 400))
+ (throw 'done nil))
+ (starttls-negotiate process)
+ (setq do-starttls nil))
+ (setq do-ehlo nil))))
+
+ (smtpmail-try-auth-methods process supported-extensions host port)
+
+ (if (or (member 'onex supported-extensions)
+ (member 'xone supported-extensions))
+ (progn
+ (smtpmail-send-command process (format "ONEX"))
+ (if (or (null (car (setq response-code (smtpmail-read-response process))))
+ (not (integerp (car response-code)))
+ (>= (car response-code) 400))
+ (throw 'done nil))))
+
+ (if (and smtpmail-debug-verb
+ (or (member 'verb supported-extensions)
+ (member 'xvrb supported-extensions)))
+ (progn
+ (smtpmail-send-command process (format "VERB"))
+ (if (or (null (car (setq response-code (smtpmail-read-response process))))
+ (not (integerp (car response-code)))
+ (>= (car response-code) 400))
+ (throw 'done nil))))
+
+ (if (member 'xusr supported-extensions)
+ (progn
+ (smtpmail-send-command process (format "XUSR"))
+ (if (or (null (car (setq response-code (smtpmail-read-response process))))
+ (not (integerp (car response-code)))
+ (>= (car response-code) 400))
+ (throw 'done nil))))
+
+ ;; MAIL FROM:<sender>
+ (let ((size-part
+ (if (or (member 'size supported-extensions)
+ (assoc 'size supported-extensions))
+ (format " SIZE=%d"
+ (with-current-buffer smtpmail-text-buffer
+ ;; size estimate:
+ (+ (- (point-max) (point-min))
+ ;; Add one byte for each change-of-line
+ ;; because of CR-LF representation:
+ (count-lines (point-min) (point-max)))))
+ ""))
+ (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"
+ "")
+ "")))
+; (smtpmail-send-command process (format "MAIL FROM:%s@%s" (user-login-name) (smtpmail-fqdn)))
+ (smtpmail-send-command process (format "MAIL FROM:<%s>%s%s"
+ envelope-from
+ size-part
+ body-part))
+
+ (if (or (null (car (setq response-code (smtpmail-read-response process))))
+ (not (integerp (car response-code)))
+ (>= (car response-code) 400))
+ (throw 'done nil)
+ ))
+
+ ;; RCPT TO:<recipient>
+ (let ((n 0))
+ (while (not (null (nth n recipient)))
+ (smtpmail-send-command process (format "RCPT TO:<%s>" (smtpmail-maybe-append-domain (nth n recipient))))
+ (setq n (1+ n))
+
+ (setq response-code (smtpmail-read-response process))
+ (if (or (null (car response-code))
+ (not (integerp (car response-code)))
+ (>= (car response-code) 400))
+ (throw 'done nil)
+ )
+ ))
+
+ ;; DATA
+ (smtpmail-send-command process "DATA")
+
+ (if (or (null (car (setq response-code (smtpmail-read-response process))))
+ (not (integerp (car response-code)))
+ (>= (car response-code) 400))
+ (throw 'done nil)
+ )
+
+ ;; Mail contents
+ (smtpmail-send-data process smtpmail-text-buffer)
+
+ ;;DATA end "."
+ (smtpmail-send-command process ".")
+
+ (if (or (null (car (setq response-code (smtpmail-read-response process))))
+ (not (integerp (car response-code)))
+ (>= (car response-code) 400))
+ (throw 'done nil)
+ )
+
+ ;;QUIT
+; (smtpmail-send-command process "QUIT")
+; (and (null (car (smtpmail-read-response process)))
+; (throw 'done nil))
+ t ))
+ (if process
+ (with-current-buffer (process-buffer process)
+ (smtpmail-send-command process "QUIT")
+ (smtpmail-read-response process)
+
+; (if (or (null (car (setq response-code (smtpmail-read-response process))))
+; (not (integerp (car response-code)))
+; (>= (car response-code) 400))
+; (throw 'done nil)
+; )
+ (delete-process process)
+ (unless smtpmail-debug-info
+ (kill-buffer process-buffer)))))))
+
+
+(defun smtpmail-process-filter (process output)
+ (with-current-buffer (process-buffer process)
+ (goto-char (point-max))
+ (insert output)))
+
+(defun smtpmail-read-response (process)
+ (let ((case-fold-search nil)
+ (response-strings nil)
+ (response-continue t)
+ (return-value '(nil ()))
+ match-end)
+ (catch 'done
+ (while response-continue
+ (goto-char smtpmail-read-point)
+ (while (not (search-forward "\r\n" nil t))
+ (unless (memq (process-status process) '(open run))
+ (throw 'done nil))
+ (accept-process-output process)
+ (goto-char smtpmail-read-point))
+
+ (setq match-end (point))
+ (setq response-strings
+ (cons (buffer-substring smtpmail-read-point (- match-end 2))
+ response-strings))
+
+ (goto-char smtpmail-read-point)
+ (if (looking-at "[0-9]+ ")
+ (let ((begin (match-beginning 0))
+ (end (match-end 0)))
+ (if smtpmail-debug-info
+ (message "%s" (car response-strings)))
+
+ (setq smtpmail-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-number
+ (buffer-substring begin end))
+ (nreverse response-strings)))))
+
+ (if (looking-at "[0-9]+-")
+ (progn (if smtpmail-debug-info
+ (message "%s" (car response-strings)))
+ (setq smtpmail-read-point match-end)
+ (setq response-continue t))
+ (progn
+ (setq smtpmail-read-point match-end)
+ (setq response-continue nil)
+ (setq return-value
+ (cons nil (nreverse response-strings)))))))
+ (setq smtpmail-read-point match-end))
+ return-value))
+
+
+(defun smtpmail-send-command (process command)
+ (goto-char (point-max))
+ (if (= (aref command 0) ?P)
+ (insert "PASS <omitted>\r\n")
+ (insert command "\r\n"))
+ (setq smtpmail-read-point (point))
+ (process-send-string process command)
+ (process-send-string process "\r\n"))
+
+(defun smtpmail-send-data-1 (process data)
+ (goto-char (point-max))
+
+ (if (and (multibyte-string-p data)
+ smtpmail-code-conv-from)
+ (setq data (string-as-multibyte
+ (encode-coding-string data smtpmail-code-conv-from))))
+
+ (if smtpmail-debug-info
+ (insert data "\r\n"))
+
+ (setq smtpmail-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 smtpmail-send-data (process buffer)
+ (let ((data-continue t) sending-data)
+ (with-current-buffer buffer
+ (goto-char (point-min)))
+ (while data-continue
+ (with-current-buffer buffer
+ (setq sending-data (buffer-substring (point-at-bol) (point-at-eol)))
+ (end-of-line 2)
+ (setq data-continue (not (eobp))))
+ (smtpmail-send-data-1 process sending-data))))
+
+(defun smtpmail-deduce-address-list (smtpmail-text-buffer header-start header-end)
+ "Get address list suitable for smtp RCPT TO: <address>."
+ (unwind-protect
+ (with-current-buffer smtpmail-address-buffer
+ (erase-buffer)
+ (let
+ ((case-fold-search t)
+ (simple-address-list "")
+ this-line
+ this-line-end
+ addr-regexp)
+ (insert-buffer-substring smtpmail-text-buffer header-start header-end)
+ (goto-char (point-min))
+ ;; RESENT-* fields should stop processing of regular fields.
+ (save-excursion
+ (setq addr-regexp
+ (if (re-search-forward "^Resent-\\(to\\|cc\\|bcc\\):"
+ header-end t)
+ "^Resent-\\(to\\|cc\\|bcc\\):"
+ "^\\(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 " " simple-address-list "\n")
+ (subst-char-in-region (point-min) (point-max) 10 ? t);; newline --> blank
+ (subst-char-in-region (point-min) (point-max) ?, ? t);; comma --> blank
+ (subst-char-in-region (point-min) (point-max) 9 ? t);; tab --> blank
+
+ (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))
+ )
+ (setq smtpmail-recipient-address-list recipient-address-list))
+
+ )
+ )
+ )
+ )
+
+
+(defun smtpmail-do-bcc (header-end)
+ "Delete [Resent-]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 "^\\(RESENT-\\)?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 ""))))))
+
+
+(provide 'smtpmail)
+
+;;; arch-tag: a76992df-6d71-43b7-9e72-4bacc6c05466
+;;; smtpmail.el ends here
-;;; ssl.el --- ssl functions for emacsen without them builtin
+;;; ssl.el,v --- ssl functions for Emacsen without them builtin
+;; Author: William M. Perry <wmperry@cs.indiana.edu>
+;; $Revision: 1.1.1.5 $
;; Keywords: comm
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Copyright (c) 1995, 1996 by William M. Perry <wmperry@cs.indiana.edu>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
+;;; Copyright (c) 1996, 97, 98, 99, 2001 Free Software Foundation, Inc.
;;;
;;; This file is part of GNU Emacs.
;;;
(eval-when-compile (require 'cl))
(require 'base64)
-
-(eval-and-compile
- (condition-case ()
- (require 'custom)
- (error nil))
- (if (and (featurep 'custom) (fboundp 'custom-declare-variable))
- nil ;; We've got what we needed
- ;; We have the old custom-library, hack around it!
- (defmacro defgroup (&rest args)
- nil)
- (defmacro defcustom (var value doc &rest args)
- (` (defvar (, var) (, value) (, doc))))))
+(require 'url) ; for `url-configuration-directory'
(defgroup ssl nil
"Support for `Secure Sockets Layer' encryption."
:group 'comm)
(defcustom ssl-certificate-directory "~/.w3/certs/"
- "*Directory to store CA certificates in"
+ "*Directory in which to store CA certificates."
:group 'ssl
:type 'directory)
The certificate is piped to it.
Maybe a way of passing a file should be implemented"
:group 'ssl
- :type 'list)
+ :type '(repeat string))
(defcustom ssl-certificate-directory-style 'ssleay
"*Style of cert database to use, the only valid value right now is `ssleay'.
:group 'ssl
:type 'list)
+(defcustom ssl-view-certificate-program-name ssl-program-name
+ "*The program to run to provide a human-readable view of a certificate."
+ :group 'ssl
+ :type 'string)
+
+(defcustom ssl-view-certificate-program-arguments
+ '("x509" "-text" "-inform" "DER")
+ "*Arguments that should be passed to the certificate viewing program.
+The certificate is piped to it.
+Maybe a way of passing a file should be implemented."
+ :group 'ssl
+ :type 'list)
+
(defun ssl-certificate-information (der)
"Return an assoc list of information about a certificate in DER format."
(let ((certificate (concat "-----BEGIN CERTIFICATE-----\n"
(set-buffer (get-buffer-create " *openssl*"))
(erase-buffer)
(insert certificate)
- (setq exit-code (condition-case ()
- (call-process-region (point-min) (point-max)
- ssl-program-name
- t (list (current-buffer) nil) t
- "x509"
- "-subject" ; Print the subject DN
- "-issuer" ; Print the issuer DN
- "-dates" ; Both before and after dates
- "-serial" ; print out serial number
- "-noout" ; Don't spit out the certificate
- )
- (error -1)))
+ (setq exit-code
+ (condition-case ()
+ (call-process-region (point-min) (point-max)
+ ssl-program-name
+ t (list (current-buffer) nil) t
+ "x509"
+ "-subject" ; Print the subject DN
+ "-issuer" ; Print the issuer DN
+ "-dates" ; Both before and after dates
+ "-serial" ; print out serial number
+ "-noout" ; Don't spit out the certificate
+ )
+ (error -1)))
(if (/= exit-code 0)
nil
(let ((vals nil))
vals)))))
(defun ssl-accept-ca-certificate ()
- "Ask if the user is willing to accept a new CA certificate. The buffer-name
-should be the intended name of the certificate, and the buffer should probably
-be in DER encoding"
+ "Ask if the user is willing to accept a new CA certificate.
+The buffer name should be the intended name of the certificate, and
+the buffer should probably be in DER encoding"
;; TODO, check if it is really new or if we already know it
(let* ((process-connection-type nil)
(tmpbuf (generate-new-buffer "X509 CA Certificate Information"))
(response (save-excursion
- (and (eq 0
+ (and (eq 0
(apply 'call-process-region
- (point-min) (point-max)
- ssl-view-certificate-program-name
+ (point-min) (point-max)
+ ssl-view-certificate-program-name
nil tmpbuf t
ssl-view-certificate-program-arguments))
(switch-to-buffer tmpbuf)
nil nil nil
(expand-file-name ssl-certificate-directory))))))))
+(defvar ssl-exec-wrapper nil)
+
+(defun ssl-get-command ()
+ (if (memq system-type '(ms-dos ms-windows axp-vms vax-vms))
+ ;; Nothing to do on DOS, Windows, or VMS!
+ (cons ssl-program-name ssl-program-arguments)
+ (if (not ssl-exec-wrapper)
+ (let ((script
+ (expand-file-name "exec_ssl_quietly" url-configuration-directory)))
+ (if (not (file-executable-p script))
+ ;; Need to create our handy-dandy utility script to shut OpenSSL
+ ;; up completely.
+ (progn
+ (write-region "#!/bin/sh\n\nexec \"$@\" 2> /dev/null\n" nil
+ script nil 5)
+ (set-file-modes script 493))) ; (rwxr-xr-x)
+ (setq ssl-exec-wrapper script)))
+ (cons ssl-exec-wrapper (cons ssl-program-name ssl-program-arguments))))
+
(defun open-ssl-stream (name buffer host service)
"Open a SSL connection for a service to a host.
Returns a subprocess-object to represent the connection.
Input and output work as for subprocesses; `delete-process' closes it.
Args are NAME BUFFER HOST SERVICE.
NAME is name for process. It is modified if necessary to make it unique.
-BUFFER is the buffer (or buffer-name) to associate with the process.
- Process output goes at end of that buffer, unless you specify
- an output stream or filter function to handle the output.
- BUFFER may be also nil, meaning that this process is not associated
- with any buffer
+BUFFER is the buffer (or buffer name) to associate with the process.
+Process output goes at end of that buffer, unless you specify
+an output stream or filter function to handle the output.
+BUFFER may be also nil, meaning that this process is not associated
+with any buffer.
Third arg is name of the host to connect to, or its IP address.
Fourth arg SERVICE is name of the service desired, or an integer
specifying a port number to connect to."
(if (integerp service) (setq service (int-to-string service)))
(let* ((process-connection-type nil)
(port service)
- (proc (eval
- (`
- (start-process name buffer ssl-program-name
- (,@ ssl-program-arguments))))))
+ (proc (eval `(start-process name buffer ,@(ssl-get-command)))))
(process-kill-without-query proc)
proc))
(provide 'ssl)
-;;; arch-tag: 659fae92-1c67-4055-939f-32153c2f5114
+;; arch-tag: 659fae92-1c67-4055-939f-32153c2f5114
;; 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.
+;; along with GNU Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;; These are commented out since the current 8859-8 standard
;; does not yet define these codepoints, although there are
;; drafts which do).
-; (?\\e,H@\e(B . ?\x05B0) ;; HEBREW POINT SHEVA
-; (?\\e,HA\e(B . ?\x05B1) ;; HEBREW POINT HATAF SEGOL
-; (?\\e,HB\e(B . ?\x05B2) ;; HEBREW POINT HATAF PATAH
-; (?\\e,HC\e(B . ?\x05B3) ;; HEBREW POINT HATAF QAMATS
-; (?\\e,HD\e(B . ?\x05B4) ;; HEBREW POINT HIRIQ
-; (?\\e,HE\e(B . ?\x05B5) ;; HEBREW POINT TSERE
-; (?\\e,HF\e(B . ?\x05B6) ;; HEBREW POINT SEGOL
-; (?\\e,HG\e(B . ?\x05B7) ;; HEBREW POINT PATAH
-; (?\\e,HH\e(B . ?\x05B8) ;; HEBREW POINT QAMATS
-; (?\\e,HI\e(B . ?\x05B9) ;; HEBREW POINT HOLAM
-; (?\\e,HK\e(B . ?\x05BB) ;; HEBREW POINT QUBUTS
-; (?\\e,HL\e(B . ?\x05BC) ;; HEBREW POINT DAGESH
-; (?\\e,HM\e(B . ?\x05BD) ;; HEBREW POINT METEG
-; (?\\e,HN\e(B . ?\x05BE) ;; HEBREW POINT MAQAF
-; (?\\e,HO\e(B . ?\x05BF) ;; HEBREW POINT RAFE
-; (?\\e,HP\e(B . ?\x05C0) ;; HEBREW PUNCTUATION PASEQ
-; (?\\e,HQ\e(B . ?\x05C1) ;; HEBREW POINT SHIN DOT
-; (?\\e,HR\e(B . ?\x05C2) ;; HEBREW POINT SIN DOT
-; (?\\e,HS\e(B . ?\x05C3) ;; HEBREW PUNCTUATION SOF PASUQ
- (?\\e,H[\e(B . ?\x202D) ;; LEFT-TO-RIGHT OVERRIDE
- (?\\e,H\\e(B . ?\x202E) ;; RIGHT-TO-LEFT OVERRIDE
- (?\\e,H]\e(B . ?\x202C) ;; POP DIRECTIONAL FORMATTING
+; (?\@ . ?\x05B0) ;; HEBREW POINT SHEVA
+; (?\A . ?\x05B1) ;; HEBREW POINT HATAF SEGOL
+; (?\B . ?\x05B2) ;; HEBREW POINT HATAF PATAH
+; (?\C . ?\x05B3) ;; HEBREW POINT HATAF QAMATS
+; (?\D . ?\x05B4) ;; HEBREW POINT HIRIQ
+; (?\E . ?\x05B5) ;; HEBREW POINT TSERE
+; (?\F . ?\x05B6) ;; HEBREW POINT SEGOL
+; (?\G . ?\x05B7) ;; HEBREW POINT PATAH
+; (?\H . ?\x05B8) ;; HEBREW POINT QAMATS
+; (?\I . ?\x05B9) ;; HEBREW POINT HOLAM
+; (?\K . ?\x05BB) ;; HEBREW POINT QUBUTS
+; (?\L . ?\x05BC) ;; HEBREW POINT DAGESH
+; (?\M . ?\x05BD) ;; HEBREW POINT METEG
+; (?\N . ?\x05BE) ;; HEBREW POINT MAQAF
+; (?\O . ?\x05BF) ;; HEBREW POINT RAFE
+; (?\P . ?\x05C0) ;; HEBREW PUNCTUATION PASEQ
+; (?\Q . ?\x05C1) ;; HEBREW POINT SHIN DOT
+; (?\R . ?\x05C2) ;; HEBREW POINT SIN DOT
+; (?\S . ?\x05C3) ;; HEBREW PUNCTUATION SOF PASUQ
+ (?\[ . ?\x202D) ;; LEFT-TO-RIGHT OVERRIDE
+ (?\\ . ?\x202E) ;; RIGHT-TO-LEFT OVERRIDE
+ (?\] . ?\x202C) ;; POP DIRECTIONAL FORMATTING
(?\\e,H_\e(B . ?\x2017) ;; DOUBLE LOW LINE
(?\\e,H`\e(B . ?\x05D0) ;; HEBREW LETTER ALEF
(?\\e,Ha\e(B . ?\x05D1) ;; HEBREW LETTER BET
(?\\e,Hx\e(B . ?\x05E8) ;; HEBREW LETTER RESH
(?\\e,Hy\e(B . ?\x05E9) ;; HEBREW LETTER SHIN
(?\\e,Hz\e(B . ?\x05EA) ;; HEBREW LETTER TAV
- (?\\e,H{\e(B . ?\x202A) ;; LEFT-TO-RIGHT EMBEDDING
- (?\\e,H|\e(B . ?\x202B) ;; RIGHT-TO-LEFT EMBEDDING
+ (?\{ . ?\x202A) ;; LEFT-TO-RIGHT EMBEDDING
+ (?\| . ?\x202B) ;; RIGHT-TO-LEFT EMBEDDING
(?\\e,H}\e(B . ?\x200E) ;; LEFT-TO-RIGHT MARK
(?\\e,H~\e(B . ?\x200F) ;; RIGHT-TO-LEFT MARK
))
(?\e$(7#`\e(B . ?\e$,1GO\e(B)))
(ipa
- '((?\e,0 \e(B . ?i)
+ '((?i . ?i)
(?\e,0!\e(B . ?\e$,1#j\e(B)
- (?\e,0"\e(B . ?e)
+ (?e . ?e)
(?\e,0#\e(B . ?\e$,1#[\e(B)
(?\e,0$\e(B . ?\e,Af\e(B)
- (?\e,0%\e(B . ?a)
+ (?a . ?a)
(?\e,0&\e(B . ?\e$,1#h\e(B)
(?\e,0'\e(B . ?\e$,1#Y\e(B)
(?\e,0(\e(B . ?\e$,1#P\e(B)
(?\e,0*\e(B . ?\e$,1#d\e(B)
(?\e,0+\e(B . ?\e$,1$,\e(B)
(?\e,0,\e(B . ?\e$,1#Q\e(B)
- (?\e,0-\e(B . ?y)
+ (?y . ?y)
(?\e,0.\e(B . ?\e$,1$/\e(B)
(?\e,0/\e(B . ?\e,Ax\e(B)
(?\e,00\e(B . ?\e$,1 s\e(B)
(?\e,01\e(B . ?\e$,1#v\e(B)
(?\e,02\e(B . ?\e$,1$)\e(B)
(?\e,03\e(B . ?\e$,1#u\e(B)
- (?\e,04\e(B . ?u)
+ (?u . ?u)
(?\e,05\e(B . ?\e$,1$*\e(B)
- (?\e,06\e(B . ?o)
+ (?o . ?o)
(?\e,07\e(B . ?\e$,1#T\e(B)
(?\e,08\e(B . ?\e$,1#R\e(B)
(?\e,0:\e(B . ?\e$,1#Z\e(B)
- (?\e,0@\e(B . ?p)
- (?\e,0A\e(B . ?b)
- (?\e,0B\e(B . ?t)
- (?\e,0C\e(B . ?d)
- (?\e,0D\e(B . ?k)
- (?\e,0E\e(B . ?g)
- (?\e,0F\e(B . ?f)
- (?\e,0G\e(B . ?v)
+ (?p . ?p)
+ (?b . ?b)
+ (?t . ?t)
+ (?d . ?d)
+ (?k . ?k)
+ (?g . ?g)
+ (?f . ?f)
+ (?v . ?v)
(?\e,0H\e(B . ?\e$,1'8\e(B)
(?\e,0I\e(B . ?\e,Ap\e(B)
- (?\e,0J\e(B . ?s)
- (?\e,0K\e(B . ?z)
+ (?s . ?s)
+ (?z . ?z)
(?\e,0L\e(B . ?\e$,1$#\e(B)
(?\e,0M\e(B . ?\e$,1$2\e(B)
(?\e,0N\e(B . ?\e,Ag\e(B)
- (?\e,0O\e(B . ?x)
+ (?x . ?x)
(?\e,0P\e(B . ?\e$,1$!\e(B)
- (?\e,0Q\e(B . ?h)
- (?\e,0R\e(B . ?m)
- (?\e,0S\e(B . ?n)
+ (?h . ?h)
+ (?m . ?m)
+ (?n . ?n)
(?\e,0T\e(B . ?\e$,1#r\e(B)
(?\e,0U\e(B . ?\e$,1 k\e(B)
- (?\e,0V\e(B . ?r)
+ (?r . ?r)
(?\e,0W\e(B . ?\e$,1$ \e(B)
(?\e,0X\e(B . ?\e$,1#y\e(B)
- (?\e,0Y\e(B . ?j)
- (?\e,0Z\e(B . ?l)
+ (?j . ?j)
+ (?l . ?l)
(?\e,0[\e(B . ?\e$,1$.\e(B)
(?\e,0\\e(B . ?\e$,1$?\e(B)
(?\e,0]\e(B . ?\e$,1#e\e(B)
- (?\e,0^\e(B . ?w)
+ (?w . ?w)
(?\e,0_\e(B . ?\e$,1$-\e(B)
(?\e,0p\e(B . ?\e$,1$h\e(B)
(?\e,0q\e(B . ?\e$,1$l\e(B)
;; You should have received a copy of the GNU General Public License
;; along with this program; if not, you can either send email to this
;; program's maintainer or write to: The Free Software Foundation,
-;; Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA.
+;; Inc.; 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
;;; Commentary:
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
INSTALL_DATA = @INSTALL_DATA@
SHELL = /bin/sh
-install:
+install:
$(SHELL) $(top_srcdir)/mkinstalldirs $(etcdir)
cd $(srcdir) \
&& for p in gnus-tut.txt; do \
echo " $(INSTALL_DATA) $$p $(etcdir)/$$p"; \
$(INSTALL_DATA) $$p $(etcdir)/$$p; \
done
- $(SHELL) $(top_srcdir)/mkinstalldirs $(etcdir)/images/gnus
+ $(SHELL) $(top_srcdir)/mkinstalldirs $(etcdir)/images/gnus $(etcdir)/images/mail
cd $(srcdir) \
- && for p in images/gnus/*.xpm images/gnus/*.pbm images/gnus/*.xbm images/gnus/x-splash; do \
+ && for p in images/gnus/*.xpm images/gnus/*.pbm images/gnus/*.xbm \
+ images/mail/*.xpm images/mail/*.pbm \
+ images/*.xpm images/*.pbm \
+ images/gnus/x-splash; do \
echo " $(INSTALL_DATA) $$p $(etcdir)/$$p"; \
$(INSTALL_DATA) $$p $(etcdir)/$$p; \
done
$(INSTALL_DATA) $$p $(etcdir)/$$p; \
done
-uninstall:
+uninstall:
rm -f $(etcdir)/gnus-tut.txt
cd $(srcdir) \
- && for p in images/gnus/*.xpm images/gnus/*.pbm images/gnus/*.xbm images/gnus/x-splash; do \
+ && for p in images/gnus/*.xpm images/gnus/*.pbm images/gnus/*.xbm \
+ images/mail/*.xpm images/mail/*.pbm \
+ images/*.xpm images/*.pbm \
+ images/gnus/x-splash; do \
rm -f "$(etcdir)/$$p"; \
done
rmdir $(etcdir)/images/gnus 2> /dev/null || true
cd .. \
&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
-distclean:
- rm -f *~ Makefile
+clean:
+ rm -f *~
+
+distclean: clean
+ rm -f Makefile
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
heart's delight at <URL:http://www.gnus.org/> and
<URL:http://quimby.gnus.org/lmi/>.
-;; Copyright (C) 1995 Free Software Foundation, Inc.
+;; Copyright (C) 1995, 2002, 2003, 2004, 2005,
+;; 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
From lars Thu Feb 23 23:20:38 1995
From: larsi@gnus.org (ding)
@title Configuring Gnus for the first time
@node What do you want to do with Gnus?
+
@variable outbound (:radio ((item :tag "Send mail via sendmail" "sendmail") (item :tag "Send mail via SMTP" "smtp"))) "sendmail"
-@variable backends (:set ((item :tag "Read news via NNTP" "nntp") (item :tag"Sacrifice a goat" "goat") (item :tag "Read mail, store it locally" "nnml") (item :tag "Read mail and store it on an IMAP server" "nnimap"))) (list "nnml")
+
+@variable backends (:set ((item :tag "Read news via NNTP" "nntp") (item :tag "Read mail, store it locally" "nnml") (item :tag "Read mail and store it on an IMAP server" "nnimap"))) (list "nnml")
@result primary-mail-selections (list backends outbound)
@text
Run M-x assistant and use the news-server.ast file as input.
@end text
+\f
+@c Local variables:
+@c mode: texinfo
+@c End:
+
@ignore
arch-tag: 6b7b200b-9169-4b44-8b32-b73773fa71af
@end ignore
+
@end text
+@c Local variables:
+@c mode: texinfo
+@c End:
+
+@c arch tag is missing
+
--- /dev/null
+The following icons are from GNOME 2.6:
+
+ attach.xpm (stock_attach)
+ connect.xpm (stock_connect)
+ contact.xpm (stock_contact)
+ delete.xpm (stock_delete)
+ describe.xpm (stock_properties)
+ disconnect.xpm (stock_disconnect)
+ exit.xpm (stock_exit)
+ lock-broken.xpm (stock_lock_broken)
+ lock-ok.xpm (stock_lock_ok)
+ lock.xpm (stock_lock)
+ next-page.xpm (stock_next-page)
+ refresh.xpm (stock_refresh)
+ sort-ascending.xpm (stock_sort-ascending)
+ sort-column-ascending.xpm (stock_sort-column-ascending)
+ sort-criteria.xpm (stock_sort-criteria)
+ sort-descending.xpm (stock_sort-descending)
+ sort-row-ascending.xpm (stock_sort-row-ascending)
+
+ gnus/toggle-subscription.xpm (stock_task-recurring)
+
+ mail/compose.xpm (stock_mail-compose)
+ mail/copy.xpm (stock_mail-copy)
+ mail/forward.xpm (stock_mail-forward)
+ mail/inbox.xpm (stock_inbox)
+ mail/move.xpm (stock_mail-move)
+ mail/not-spam.xpm (stock_not-spam)
+ mail/outbox.xpm (stock_outbox)
+ mail/reply-all.xpm (stock_mail-reply-to-all)
+ mail/reply.xpm (stock_mail-reply)
+ mail/save-draft.xpm (stock_mail-handling)
+ mail/send.xpm (stock_mail-send)
+ mail/spam.xpm (stock_spam)
+
+
+The following icons were contributed by Adam Sjøgren <asjo@koldfront.dk>:
+
+ mail/preview.xpm (combining stock_mail and stock_zoom)
+ mail/save.xpm (combining stock_mail, stock_save and stock_convert)
+
+
+The folling icon are duplicated from Emacs 22. They are either not present in
+Emacs 21 or look different there.
+
+ cancel.xpm
+ close.xpm
+ copy.xpm
+ cut.xpm
+ diropen.xpm
+ help.xpm
+ home.xpm
+ index.xpm
+ jump-to.xpm
+ left-arrow.xpm
+ new.xpm
+ next-node.xpm
+ open.xpm
+ paste.xpm
+ preferences.xpm
+ prev-node.xpm
+ print.xpm
+ redo.xpm
+ right-arrow.xpm
+ save.xpm
+ saveas.xpm
+ search.xpm
+ separator.xpm
+ spell.xpm
+
+You might want to use the following code to get Gnome icons in Emacs 21:
+
+ ;; Only for Emacs 21:
+ (when (and (not (featurep 'xemacs))
+ (not (boundp 'image-load-path))
+ tool-bar-mode)
+ (push "/path/to/etc/images/" image-load-path)
+ (setq tool-bar-map (make-sparse-keymap))
+ (clear-image-cache)
+ (tool-bar-setup))
+
+The GNOME's stock_*.png files were converted to XPM using the following GIMP
+script:
+
+;; -*- scheme -*-
+;; Put this file in ~/.gimp-*/scripts/
+;; gimp -i -b '(rs-save-as-xpm "foo.png" "foo.xpm" 127)' '(gimp-quit 0)'
+(define (rs-save-as-xpm filename filename2 threshold)
+ (let* ((image (car (gimp-file-load RUN-NONINTERACTIVE filename filename)))
+ (drawable (car (gimp-image-get-active-layer image))))
+ (file-xpm-save RUN-NONINTERACTIVE image drawable
+ filename2 filename2 threshold)
+ (gimp-image-delete image)))
+;; end
--- /dev/null
+/* XPM */
+static char * stock_attach_xpm[] = {
+"24 24 99 2",
+" c None",
+". c #000000",
+"+ c #010101",
+"@ c #515151",
+"# c #9A9A9A",
+"$ c #CFCFCF",
+"% c #6F6F6F",
+"& c #464646",
+"* c #A5A5A5",
+"= c #E2E2E2",
+"- c #FFFFFF",
+"; c #F6F6F6",
+"> c #8A8A8A",
+", c #393939",
+"' c #1C1C1C",
+") c #8B8B8B",
+"! c #E6E6E6",
+"~ c #EEEEEE",
+"{ c #E1E1E1",
+"] c #F8F8F8",
+"^ c #F7F7F7",
+"/ c #CCCCCC",
+"( c #565656",
+"_ c #3E3E3E",
+": c #818181",
+"< c #D4D4D4",
+"[ c #E7E7E7",
+"} c #D7D7D7",
+"| c #FAFAFA",
+"1 c #F9F9F9",
+"2 c #C2C2C2",
+"3 c #CBCBCB",
+"4 c #F5F5F5",
+"5 c #D9D9D9",
+"6 c #030303",
+"7 c #545454",
+"8 c #DEDEDE",
+"9 c #B3B3B3",
+"0 c #797979",
+"a c #F4F4F4",
+"b c #9D9D9D",
+"c c #282828",
+"d c #FBFBFB",
+"e c #A6A6A6",
+"f c #C5C5C5",
+"g c #F0F0F0",
+"h c #CACACA",
+"i c #C7C7C7",
+"j c #F2F2F2",
+"k c #CECECE",
+"l c #C4C4C4",
+"m c #D5D5D5",
+"n c #DADADA",
+"o c #F3F3F3",
+"p c #858585",
+"q c #BEBEBE",
+"r c #D3D3D3",
+"s c #DCDCDC",
+"t c #9C9C9C",
+"u c #484848",
+"v c #A7A7A7",
+"w c #D6D6D6",
+"x c #C8C8C8",
+"y c #C6C6C6",
+"z c #4C4C4C",
+"A c #EAEAEA",
+"B c #E5E5E5",
+"C c #D8D8D8",
+"D c #ADADAD",
+"E c #BCBCBC",
+"F c #E0E0E0",
+"G c #F1F1F1",
+"H c #909090",
+"I c #686868",
+"J c #A2A2A2",
+"K c #C0C0C0",
+"L c #C1C1C1",
+"M c #787878",
+"N c #AEAEAE",
+"O c #151515",
+"P c #D0D0D0",
+"Q c #979797",
+"R c #727272",
+"S c #4A4A4A",
+"T c #ECECEC",
+"U c #ACACAC",
+"V c #BABABA",
+"W c #DDDDDD",
+"X c #DBDBDB",
+"Y c #B1B1B1",
+"Z c #232323",
+"` c #696969",
+" . c #B7B7B7",
+".. c #828282",
+"+. c #404040",
+"@. c #969696",
+"#. c #323232",
+"$. c #E8E8E8",
+"%. c #121212",
+" ",
+" . . . . . ",
+" . . . . ",
+" . + @ # $ % . ",
+" . . & * = - - ; > , ",
+" . ' ) ! ~ { - ] ^ ; / ( ",
+" . _ : < ' [ } | 1 ] 2 3 4 5 : . ",
+" 6 7 ! - - - . } 8 9 0 . = ; 4 a b c ",
+" . ; - - | | d . e f g ] . = 2 h a i ( ",
+" . j ] 1 k l f . m 1 ] ] . 9 n a o o 0 . ",
+" p - ] q 1 1 . r s 2 2 . = 4 a o j t c ",
+" u - ^ ^ ] ] . v w ^ ; . = a l x j y z ",
+" . A - ; q 2 . B C ; 4 . D E A F G A H . ",
+" I - 4 ; ; J . K L . M w o j G G m N O ",
+" , - a 4 4 n # . . 0 w j j G w P Q R S ",
+" . T - a U V W o k X T } w Y : ( Z . ",
+" ` - o o o o j j } ...+.Z . . ",
+" c - o j j } q @.#.Z . ",
+" . ! $./ # +.Z . . ",
+" , .., %.. ",
+" . . ",
+" ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 5 1",
+" c #01c601c601c6",
+". c Gray40",
+"X c #a527a527a527",
+"o c #da22da22da22",
+"O c None",
+/* pixels */
+"OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOO OOOOOOOOO",
+"OOOOOO XXooXX. OOOOOOO",
+"OOOOO XooooooooX. OOOOOO",
+"OOOOO oooooooooo. OOOOOO",
+"OOOO Xooo ooo XoX. OOOOO",
+"OOOO Xoo o XXX OOOOO",
+"OOOO oooo XoXX OOOOO",
+"OOOO Xoooo ooXXX OOOOO",
+"OOOO Xooo OXX. OOOOO",
+"OOOO Xoo o XX. OOOOO",
+"OOOO .Xoo ooX XX.. OOOOO",
+"OOOOO XXOoXoXXX.. OOOOOO",
+"OOOOO XXXXXXXXX.. OOOOOO",
+"OOOOOO XXXX... OOOOOOO",
+"OOOOOOOO OOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOO"
+};
--- /dev/null
+/* XPM */
+static char * close_xpm[] = {
+"24 24 2 1",
+" c None",
+". c #000000",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" . . ",
+" . ... ",
+" .. .... ",
+" .. ... ",
+" ..... ",
+" ... ",
+" ..... ",
+" ....... ",
+" ... .... ",
+" ... .... ",
+" ... .. ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char * stock_connect_xpm[] = {
+"24 24 58 1",
+" c None",
+". c #000000",
+"+ c #989389",
+"@ c #807D74",
+"# c #C6C2BA",
+"$ c #34332D",
+"% c #B7B3AA",
+"& c #C4C2BD",
+"* c #EAE8E3",
+"= c #9C978D",
+"- c #BCB9B2",
+"; c #363433",
+"> c #E2E1DD",
+", c #F0EFEC",
+"' c #AAA7A0",
+") c #F0EEEB",
+"! c #B2B0AB",
+"~ c #F9F9F8",
+"{ c #C5C3BD",
+"] c #0F0F0D",
+"^ c #F2F0ED",
+"/ c #EBEAE6",
+"( c #8A857B",
+"_ c #ECEBE8",
+": c #EEECEA",
+"< c #9F9C93",
+"[ c #F3F2F0",
+"} c #E8E7E4",
+"| c #E3E1DD",
+"1 c #78756B",
+"2 c #BEBBB5",
+"3 c #B3B1AA",
+"4 c #7D786E",
+"5 c #E1DFDB",
+"6 c #D1D0CC",
+"7 c #938E84",
+"8 c #C8C5BF",
+"9 c #A7A298",
+"0 c #010101",
+"a c #8C8981",
+"b c #A6A29B",
+"c c #726D63",
+"d c #CECAC3",
+"e c #A7A49E",
+"f c #7E7A70",
+"g c #A09D94",
+"h c #817D73",
+"i c #6C685E",
+"j c #3C3933",
+"k c #8B877E",
+"l c #706C62",
+"m c #B1ADA4",
+"n c #97938A",
+"o c #625E54",
+"p c #6A655B",
+"q c #37342D",
+"r c #646056",
+"s c #8B877D",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" .. .. ",
+" ..+@.#@.. ",
+" $%&*@.*@=-; ",
+" .>,'*@.)@!~{] ",
+"......@>,'*@.)@!~{@.....",
+"*******^/(_@.:@<[}|*****",
+"@@@@@1123451.6@789@@@@@@",
+".....01abcd1.e@fghi.....",
+" ]abcd1.e@fgh] ",
+" ]jklmi.n@opq. ",
+" ]]+r.s@.. ",
+" ]] ]. ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char * stock_contact_xpm[] = {
+"24 24 102 2",
+" c None",
+". c #000000",
+"+ c #E3E1DE",
+"@ c #ECEBE7",
+"# c #F0EEEB",
+"$ c #D2CFC9",
+"% c #81817F",
+"& c #4C4C4A",
+"* c #ECEAE6",
+"= c #ECEAE5",
+"- c #EBE9E5",
+"; c #D2CEC8",
+"> c #D9C7B8",
+", c #D9C7B9",
+"' c #D8C5B8",
+") c #D1C0B3",
+"! c #D6C5B7",
+"~ c #EBEAE5",
+"{ c #D3D0C9",
+"] c #CDBCAC",
+"^ c #AFA093",
+"/ c #3A3531",
+"( c #443F3A",
+"_ c #AE9F93",
+": c #CBBAAB",
+"< c #4E4E4C",
+"[ c #595957",
+"} c #595857",
+"| c #7D7C7A",
+"1 c #D3D0CA",
+"2 c #C6B5A4",
+"3 c #3D3833",
+"4 c #433D37",
+"5 c #C2B0A2",
+"6 c #D4D1CA",
+"7 c #B0A08E",
+"8 c #261F18",
+"9 c #D37D1E",
+"0 c #D68021",
+"a c #B26616",
+"b c #27241F",
+"c c #9C8E7F",
+"d c #EAE9E5",
+"e c #A29281",
+"f c #2E2012",
+"g c #CC751A",
+"h c #CC761A",
+"i c #BF6C16",
+"j c #24211C",
+"k c #8E8170",
+"l c #EAE8E3",
+"m c #E9E8E3",
+"n c #E9E7E3",
+"o c #8E7F6C",
+"p c #221E17",
+"q c #C56D14",
+"r c #7D450D",
+"s c #AF5F11",
+"t c #221E19",
+"u c #7F7260",
+"v c #E9E7E2",
+"w c #E8E6E1",
+"x c #E7E5E1",
+"y c #E7E5E0",
+"z c #D5D1CB",
+"A c #3E372C",
+"B c #1C1F1F",
+"C c #301B06",
+"D c #542D07",
+"E c #291B0E",
+"F c #151412",
+"G c #473F33",
+"H c #E8E6E2",
+"I c #546371",
+"J c #849CB4",
+"K c #56687C",
+"L c #343332",
+"M c #495868",
+"N c #566D85",
+"O c #293643",
+"P c #E6E4DF",
+"Q c #E5E4DE",
+"R c #EEEDE9",
+"S c #7B95AF",
+"T c #7B96B0",
+"U c #68819B",
+"V c #8999AA",
+"W c #5A7088",
+"X c #607A96",
+"Y c #5B7691",
+"Z c #E5E3DE",
+"` c #4B4A48",
+" . c #757471",
+".. c #E6E3DE",
+"+. c #3B3A39",
+"@. c #747371",
+"#. c #D3CFC8",
+"$. c #E2E1DD",
+"%. c #E7E4E0",
+"&. c #D2CFC8",
+"*. c #D1D0CA",
+"=. c #C2C0B9",
+" ",
+" ",
+" ",
+" . . . . . . . . . . . . . . . . . . . . ",
+" . + @ # # # # # # # # # # # # # # # # # $ . ",
+" . # % . . . . . . . & * = - - - - - - - ; . ",
+" . # . > , ' ) ! > , . * * ~ ~ ~ ~ - - ~ { . ",
+" . # . ] ^ / . ( _ : . * < [ ~ } } | - ~ 1 . ",
+" . # . 2 3 . . . 4 5 . * * ~ ~ - - - - - 6 . ",
+" . # . 7 8 9 0 a b c . * [ < | [ - } | d 6 . ",
+" . # . e f g h i j k . * * l l m n n n n 6 . ",
+" . # . o p q r s t u . v v w w w x y y y z . ",
+" . # . A B C D E F G . H H y y y y y y y 6 . ",
+" . # . I J K L M N O . y y P P P P P P Q { . ",
+" . R . S T U V W X Y . y y P P P P Z Z Z { . ",
+" . d ` . . . . . . . ` y y ...+.+.Z @.Z #.. ",
+" . $.y y y y y y y y y %.P Z Z Z Z Z Z Z &.. ",
+" . *.6 z 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 =.. ",
+" . . . . . . . . . . . . . . . . . . . . . ",
+" ",
+" ",
+" ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char * copy_xpm[] = {
+"24 24 26 1",
+" c None",
+". c #000000",
+"+ c #B4B4B4",
+"@ c #F8F8F8",
+"# c #F6F6F6",
+"$ c #C3C3C3",
+"% c #E9E9E9",
+"& c #989898",
+"* c #828282",
+"= c #8A8A8A",
+"- c #E8E8E8",
+"; c #636363",
+"> c #5A5A5A",
+", c #6B6B6B",
+"' c #B3B3B3",
+") c #FFFFFF",
+"! c #D6D6D6",
+"~ c #818181",
+"{ c #A7A7A7",
+"] c #8F8F8F",
+"^ c #C6C6C6",
+"/ c #808080",
+"( c #E7E7E7",
+"_ c #6D6D6D",
+": c #767676",
+"< c #F5F5F5",
+" ",
+" ",
+" ",
+"............. ",
+".+@@@@@@@@@#$. ",
+".@%%%%%%%%%%%. ",
+".@&**=%+*%*+%. ",
+".@%%%%%%%%---. ",
+".@;>%,*+-............ ",
+".@%%%%%%.'))))))))))!. ",
+".@&**%*~.)))))))))))). ",
+".@%%%%%-.){]]&)^])]^). ",
+".@;>>%,/.)))))))))))). ",
+".@%%%%%(.)_;):]^)^])). ",
+".@&**%*~.)))))))))))). ",
+".<%%%%%-.){]])]]^)&]). ",
+".$%%%%%-.)))))))))))). ",
+" ........)_;;):]^)^]). ",
+" .)))))))))))). ",
+" .){]])]]^)&]). ",
+" .)))))))))))). ",
+" .!))))))))))!. ",
+" .............. ",
+" "};
--- /dev/null
+/* XPM */
+static char * cut_xpm[] = {
+"24 24 40 1",
+" c None",
+". c #000000",
+"+ c #C9C7C2",
+"@ c #E6E4E0",
+"# c #EFEEED",
+"$ c #494946",
+"% c #73726E",
+"& c #F0EEED",
+"* c #7F7D75",
+"= c #F2F1EF",
+"- c #D2CFC8",
+"; c #E7E7E4",
+"> c #BAB5AB",
+", c #565653",
+"' c #EDECE9",
+") c #A4A097",
+"! c #817F7E",
+"~ c #4E4C48",
+"{ c #F6F5F4",
+"] c #474541",
+"^ c #EFEEEC",
+"/ c #8C8B8A",
+"( c #F3F2F0",
+"_ c #77746D",
+": c #323232",
+"< c #EBEBEA",
+"[ c #605D58",
+"} c #F5F4F3",
+"| c #CECCC7",
+"1 c #363634",
+"2 c #6F6E6D",
+"3 c #BEBDBB",
+"4 c #EAE7E4",
+"5 c #B8B5B1",
+"6 c #474747",
+"7 c #DAD8D4",
+"8 c #9B9996",
+"9 c #161615",
+"0 c #6D6B6A",
+"a c #3A3837",
+" ",
+" ",
+" . . ",
+" . . ",
+" .+. .@. ",
+" .#$ %@. ",
+" .&*. .=-. ",
+" .;>, %'). ",
+" !#*. .=-~ ",
+" .{>] ~^>. ",
+" /(_.:<-[ ",
+" .}|123>. ",
+" .456>. ",
+" .78.. ",
+" .90a. ",
+" ............. ",
+" . ... ... ... ",
+" .. .. .. .. ",
+" . . . . ",
+" .. .. .. .. ",
+" .... .. . ",
+" .... .... ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char * stock_delete_xpm[] = {
+"24 24 243 2",
+" c None",
+". c #000000",
+"+ c #1C1C1C",
+"@ c #767676",
+"# c #E6E6E6",
+"$ c #D3D3D3",
+"% c #C3C3C3",
+"& c #909090",
+"* c #494949",
+"= c #48473D",
+"- c #BAB8A6",
+"; c #E2E2DF",
+"> c #F1F1F0",
+", c #EAE9E6",
+"' c #F2F2EE",
+") c #EBEAE5",
+"! c #C1C0B5",
+"~ c #57564A",
+"{ c #525146",
+"] c #A8A68F",
+"^ c #BDBBA1",
+"/ c #C0BEA3",
+"( c #A3A18A",
+"_ c #6D6C5C",
+": c #7C7C72",
+"< c #4C4C49",
+"[ c #45453F",
+"} c #44433A",
+"| c #6F6F67",
+"1 c #C6C5B9",
+"2 c #B6B59B",
+"3 c #6D6C5D",
+"4 c #B3B19B",
+"5 c #A7A68E",
+"6 c #908F7A",
+"7 c #AAA993",
+"8 c #CCCBB5",
+"9 c #D0CEBA",
+"0 c #D5D3C1",
+"a c #AEADA3",
+"b c #94938A",
+"c c #454442",
+"d c #232321",
+"e c #353431",
+"f c #292823",
+"g c #1E1E1A",
+"h c #535246",
+"i c #ADAC93",
+"j c #929189",
+"k c #C2C1AF",
+"l c #B1AF96",
+"m c #ACAA92",
+"n c #93927D",
+"o c #080808",
+"p c #D1D0C1",
+"q c #D6D5C4",
+"r c #DFDED1",
+"s c #CECDC0",
+"t c #ACACA6",
+"u c #908F8A",
+"v c #7E7D77",
+"w c #5C5C55",
+"x c #47463E",
+"y c #656456",
+"z c #777665",
+"A c #807E6F",
+"B c #BEBDA7",
+"C c #B5B39A",
+"D c #A19F88",
+"E c #D9D8CC",
+"F c #F6F5F2",
+"G c #DBDAD1",
+"H c #DAD9CE",
+"I c #E5E4D9",
+"J c #D0CFC3",
+"K c #D3D3C9",
+"L c #CAC9BC",
+"M c #B7B6A6",
+"N c #B8B6A1",
+"O c #B0AF96",
+"P c #B9B89D",
+"Q c #B9B79D",
+"R c #B8B69C",
+"S c #C4C2A9",
+"T c #AFAD97",
+"U c #8B8976",
+"V c #AAA998",
+"W c #B6B6B2",
+"X c #F9F9F7",
+"Y c #FAFAF8",
+"Z c #F4F4F0",
+"` c #E2E1DA",
+" . c #D9D9CE",
+".. c #DBDACF",
+"+. c #D3D1BE",
+"@. c #C5C4AC",
+"#. c #D6D5C3",
+"$. c #CDCCBF",
+"%. c #BBBAAD",
+"&. c #7C7A69",
+"*. c #717060",
+"=. c #131313",
+"-. c #999882",
+";. c #AFAE9D",
+">. c #C3C3BE",
+",. c #DEDEDC",
+"'. c #E9E9E8",
+"). c #FBFBFA",
+"!. c #FDFDFC",
+"~. c #FDFDFD",
+"{. c #FCFBFA",
+"]. c #F2F2EF",
+"^. c #EAE9E3",
+"/. c #C0BFB1",
+"(. c #959484",
+"_. c #787766",
+":. c #6E6D5D",
+"<. c #5B5B4D",
+"[. c #5D5C4F",
+"}. c #A3A293",
+"|. c #B8B7A6",
+"1. c #D8D7D0",
+"2. c #DBDBD4",
+"3. c #D3D2CA",
+"4. c #C8C8C3",
+"5. c #C6C5BD",
+"6. c #BDBCAD",
+"7. c #BAB8A8",
+"8. c #9F9E8B",
+"9. c #8E8C78",
+"0. c #8C8B77",
+"a. c #7A7968",
+"b. c #6C6B5D",
+"c. c #4E4D45",
+"d. c #424242",
+"e. c #7B7B73",
+"f. c #9F9F96",
+"g. c #D2D1C7",
+"h. c #DCDBD2",
+"i. c #CCCBBE",
+"j. c #D1D0C2",
+"k. c #C4C3B6",
+"l. c #9A9883",
+"m. c #807F6D",
+"n. c #7D7C6B",
+"o. c #6A695E",
+"p. c #40403E",
+"q. c #37372D",
+"r. c #0F0F0F",
+"s. c #383734",
+"t. c #787875",
+"u. c #999893",
+"v. c #8A897E",
+"w. c #B3B2A4",
+"x. c #AAAA9E",
+"y. c #878673",
+"z. c #8F8D79",
+"A. c #626155",
+"B. c #545451",
+"C. c #31312E",
+"D. c #2B2B23",
+"E. c #71715D",
+"F. c #57574B",
+"G. c #42423A",
+"H. c #262620",
+"I. c #212121",
+"J. c #1B1B1B",
+"K. c #242424",
+"L. c #161613",
+"M. c #2A2A22",
+"N. c #303027",
+"O. c #3F3F34",
+"P. c #7A7A65",
+"Q. c #5B5B51",
+"R. c #858576",
+"S. c #76766B",
+"T. c #98988E",
+"U. c #75756B",
+"V. c #515146",
+"W. c #7F7F74",
+"X. c #6A6A58",
+"Y. c #404035",
+"Z. c #626251",
+"`. c #545445",
+" + c #3E3E33",
+".+ c #555546",
+"++ c #34342B",
+"@+ c #515143",
+"#+ c #85856E",
+"$+ c #5D5D54",
+"%+ c #919182",
+"&+ c #828278",
+"*+ c #AAAAA3",
+"=+ c #7A7A71",
+"-+ c #4E4E45",
+";+ c #8A8A80",
+">+ c #7C7C6D",
+",+ c #424237",
+"'+ c #606052",
+")+ c #5A5A4A",
+"!+ c #3C3C32",
+"~+ c #4E4E41",
+"{+ c #35352C",
+"]+ c #ACAC9C",
+"^+ c #85857B",
+"/+ c #BBBBB3",
+"(+ c #A3A39A",
+"_+ c #54544B",
+":+ c #93938A",
+"<+ c #919185",
+"[+ c #686856",
+"}+ c #414136",
+"|+ c #434337",
+"1+ c #A4A493",
+"2+ c #C1C1B6",
+"3+ c #B1B1A2",
+"4+ c #6B6B5F",
+"5+ c #9D9D8B",
+"6+ c #848470",
+"7+ c #71715E",
+"8+ c #A5A594",
+"9+ c #C2C2B7",
+"0+ c #7B7B65",
+"a+ c #5F5F4F",
+"b+ c #666654",
+"c+ c #49493C",
+"d+ c #575748",
+"e+ c #57574A",
+"f+ c #7D7D6D",
+"g+ c #767669",
+"h+ c #B3B3A8",
+"i+ c #A1A194",
+"j+ c #6D6D61",
+"k+ c #B3B3A5",
+"l+ c #696957",
+"m+ c #414135",
+"n+ c #565647",
+"o+ c #444438",
+"p+ c #595951",
+"q+ c #585849",
+"r+ c #4E4E40",
+"s+ c #747467",
+"t+ c #616153",
+" . . . . . . ",
+" . + @ # $ % & * . . ",
+" . . . = - ; > , ' ) ! ~ { . . . ",
+" . ] ^ / ( _ : < [ } | 1 2 3 4 5 6 . ",
+" . 7 8 9 0 a b c d e f g h i j k l m n . ",
+" o p 8 q r s t u v w x y z A B C 2 C D . ",
+" . E F G H I J K L M N O D P Q R S T U . ",
+" . V W X Y Z ` ...0 +.S / @.#.$.%.&.*.. ",
+" =.-.;.>.,.'.).!.~.{.X ].^.G /.(._.:.<.. ",
+" . [.n }.|.1.2.3.4.5.6.7.8.9.0.9.a.b.c. ",
+" . d.e.f.g.h.i.j.k.l l l l.m.n.o.p.. ",
+" . q.r.s.t.u.v.w.x.( y.z.A.B.C.. D.. ",
+" . E.F.G.H.I.J.. K.. . . . L.M.N.O.. ",
+" . P.Q.R.S.T.U.V.W.X.Y.Z.`. +.+++@+. ",
+" . #+$+%+&+*+=+-+;+>+,+'+)+!+~+{+`.. ",
+" . #+Q.]+^+/+(+_+:+<+,+'+[+}+X.|+X.. ",
+" . #+Q.1+^+2+3+4+3+5+`.6+7+|+X.|+X.. ",
+" . #+Q.8+^+9+3+4+3+5+`.6+7+|+X.|+X.. ",
+" . #+Q.5+^+2+3+4+3+5+`.6+7+|+X.|+X.. ",
+" . 0+Q.1+^+2+3+4+3+5+`.6+7+|+X.|+a+. ",
+" . b+Q.1+&+2+3+4+3+5+`.6+7+|+X.c+d+. ",
+" . e+f+g+h+i+j+k+5+`.6+l+m+n+o+. . ",
+" . . . p+q+r+s+t+~+c+c+. . . ",
+" . . . . . . . . . . "};
--- /dev/null
+/* XPM */
+static char * stock_properties_xpm[] = {
+"24 24 68 1",
+" c None",
+". c #000000",
+"+ c #74716E",
+"@ c #C9C4BD",
+"# c #DFDAD2",
+"$ c #F4EFE5",
+"% c #F2ECE1",
+"& c #FFFFFF",
+"* c #4C4B48",
+"= c #EEE5D4",
+"- c #ECE2CF",
+"; c #EADFC9",
+"> c #F9F9F9",
+", c #E2D2B1",
+"' c #F4F4F4",
+") c #EEEEEE",
+"! c #959595",
+"~ c #F5F5F5",
+"{ c #F6F6F6",
+"] c #D9D9D9",
+"^ c #C7B99C",
+"/ c #E9E9E9",
+"( c #787878",
+"_ c #E1E1E1",
+": c #E2E2E2",
+"< c #C8C8C8",
+"[ c #877E69",
+"} c #9A8F78",
+"| c #DEDEDE",
+"1 c #E3E3E3",
+"2 c #929292",
+"3 c #AFA389",
+"4 c #ACACAC",
+"5 c #A2A2A2",
+"6 c #E4E4E4",
+"7 c #BCBCBC",
+"8 c #939393",
+"9 c #EDEDED",
+"0 c #EFEFEF",
+"a c #F0F0F0",
+"b c #E5E5E5",
+"c c #E7E7E7",
+"d c #E8E8E8",
+"e c #EAEAEA",
+"f c #EBEBEB",
+"g c #BEBEBE",
+"h c #F1F1F1",
+"i c #DFDFDF",
+"j c #F3F3F3",
+"k c #E0E0E0",
+"l c #ABABAB",
+"m c #AEAEAE",
+"n c #AFAFAF",
+"o c #ADADAD",
+"p c #B0B0B0",
+"q c #B1B1B1",
+"r c #F7F7F7",
+"s c #B3B3B3",
+"t c #F8F8F8",
+"u c #B4B4B4",
+"v c #B5B5B5",
+"w c #B6B6B6",
+"x c #FAFAFA",
+"y c #FBFBFB",
+"z c #DCDCDC",
+"A c #DDDDDD",
+"B c #E6E6E6",
+"C c #969696",
+" ",
+" ",
+" ",
+" ......... ",
+" .+@#$%.&&. ",
+" *=---;.&>. ",
+" .......;.,,,,.'). ",
+" !~~{].;.^.,^^./(.. ",
+" .~_:<.;.[.^.}..|].. ",
+" .~:1.;.2.[.3.4...5. ",
+" .{16..7/8.[.49)0a|. ",
+" .{6bcd/ef8.g9)0ahi. ",
+" .{bcd/ef9ef9)0ahjk. ",
+" .{cllefmnomnppqj'_. ",
+" .rd/ef9)09)0ahj'~:. ",
+" .r/4o9)ppnppqss~{1. ",
+" .tef9)0ah0ahj'~{rb. ",
+" .>9npahssqssuvw>xc. ",
+" .>)0ahj'~j'~{r>xyd. ",
+" .nzA|ik_:k_:1bBcdC. ",
+" ................. ",
+" ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char * diropen_xpm[] = {
+"19 24 17 1",
+" c None",
+". c #000100",
+"+ c #C6C9A6",
+"@ c #D0D3AF",
+"# c #93997C",
+"$ c #E6E7D0",
+"% c #BEC19E",
+"& c #B4B895",
+"* c #A7AA88",
+"= c #6B6D59",
+"- c #4A4E40",
+"; c #7C8166",
+"> c #898E72",
+", c #3C4032",
+"' c #575845",
+") c #34332C",
+"! c #24231D",
+" ............... ",
+" .+@@@@@@@@@@@@@#. ",
+".$@@@@@@@@@@@@@@@#.",
+".++++%%%%%%%%%&&&*.",
+".&&&&&&&&&&******#.",
+".*%+++%%%%%%%%%&=#.",
+".*+***********##-#.",
+".*+****;===;####-#.",
+".*+****=*****###-#.",
+".*+****;*****###-#.",
+".*+****########>-#.",
+".*&######>>>>>>>,>.",
+".*#-------------'>)",
+".*&&&&&&&&&&&&&*#>)",
+".*&************#'>)",
+".*&***********##,>)",
+".*&****====;###>,>)",
+".#&****=**#**##>,;)",
+".#&****>****###>,;)",
+".#&****########>,;)",
+".##''''''''''''',;)",
+".#>==============;)",
+".''''''''''''''''-!",
+" ................. "};
--- /dev/null
+/* XPM */
+static char * stock_disconnect_xpm[] = {
+"24 24 42 1",
+" c None",
+". c #000000",
+"+ c #989389",
+"@ c #807D74",
+"# c #C6C2BA",
+"$ c #43423C",
+"% c #B7B3AA",
+"& c #C4C2BD",
+"* c #EAE8E3",
+"= c #E2E1DD",
+"- c #F0EFEC",
+"; c #AAA7A0",
+"> c #C5D2C8",
+", c #E9EEEA",
+"' c #F0EEEB",
+") c #F2F0ED",
+"! c #EBEAE6",
+"~ c #8A857B",
+"{ c #ECEBE8",
+"] c #EEECEA",
+"^ c #78756B",
+"/ c #BEBBB5",
+"( c #B3B1AA",
+"_ c #7D786E",
+": c #E1DFDB",
+"< c #D1D0CC",
+"[ c #010101",
+"} c #8C8981",
+"| c #A6A29B",
+"1 c #726D63",
+"2 c #CECAC3",
+"3 c #A7A49E",
+"4 c #0F0F0D",
+"5 c #F0F3F1",
+"6 c #272622",
+"7 c #8B877E",
+"8 c #706C62",
+"9 c #B1ADA4",
+"0 c #6C685E",
+"a c #97938A",
+"b c #646056",
+"c c #8B877D",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" .. ..",
+" ..+@. .#@",
+" $%&*@.... .*@",
+" .=-;*@.>>,. .'@",
+".....@=-;*@.... .'@",
+"******)!~{@. .]@",
+"@@@@^^/(_:^. .<@",
+"....[^}|12^.... .3@",
+" 4}|12^.>>5. .3@",
+" 67890.... .a@",
+" 44+b. .c@",
+" 44 4.",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char * stock_exit_xpm[] = {
+"24 24 140 2",
+" c None",
+". c #000000",
+"+ c #D6D6D4",
+"@ c #BDBDBC",
+"# c #A8A8A4",
+"$ c #92928F",
+"% c #727370",
+"& c #61615E",
+"* c #20201F",
+"= c #F1F1EF",
+"- c #E6E6E4",
+"; c #DADAD7",
+"> c #CFCFCD",
+", c #C4C4C1",
+"' c #A8A8A5",
+") c #767674",
+"! c #777774",
+"~ c #1E1E1D",
+"{ c #B9B9B7",
+"] c #AEAEAC",
+"^ c #8F8F8D",
+"/ c #262626",
+"( c #414140",
+"_ c #E9836C",
+": c #DEDEDC",
+"< c #C5C5C2",
+"[ c #636362",
+"} c #040504",
+"| c #040604",
+"1 c #050705",
+"2 c #E87B62",
+"3 c #E67056",
+"4 c #D5D5D3",
+"5 c #DBDBD8",
+"6 c #D0D0CE",
+"7 c #080A07",
+"8 c #0A0C09",
+"9 c #0A0D09",
+"0 c #0B0E0A",
+"a c #F0B0A1",
+"b c #EB8D77",
+"c c #DF421E",
+"d c #E97E66",
+"e c #CBCBC8",
+"f c #0C0F0B",
+"g c #0F130D",
+"h c #10140E",
+"i c #11150F",
+"j c #EFA392",
+"k c #BFBFBD",
+"l c #5D5D5C",
+"m c #10150F",
+"n c #141912",
+"o c #161C14",
+"p c #171D15",
+"q c #B7B7B4",
+"r c #0C0C0C",
+"s c #192017",
+"t c #1C2319",
+"u c #1D241A",
+"v c #CD8484",
+"w c #990000",
+"x c #701616",
+"y c #A6A6A5",
+"z c #181E16",
+"A c #1E261B",
+"B c #212A1E",
+"C c #222B1F",
+"D c #4F0000",
+"E c #AEAEAB",
+"F c #1D261B",
+"G c #242E21",
+"H c #273224",
+"I c #283325",
+"J c #580000",
+"K c #B5B5B3",
+"L c #293426",
+"M c #2D3929",
+"N c #2E3A2A",
+"O c #7C4343",
+"P c #6A0000",
+"Q c #720000",
+"R c #BDBDBB",
+"S c #232C20",
+"T c #2A3526",
+"U c #303C2B",
+"V c #33402E",
+"W c #C5C5C3",
+"X c #1E261C",
+"Y c #303D2C",
+"Z c #374532",
+"` c #394834",
+" . c #500000",
+".. c #CDCDCB",
+"+. c #1B2319",
+"@. c #253022",
+"#. c #303E2D",
+"$. c #394934",
+"%. c #3D4E38",
+"&. c #9D9D9B",
+"*. c #565655",
+"=. c #2C3828",
+"-. c #40503A",
+";. c #43553E",
+">. c #BABAB7",
+",. c #777776",
+"'. c #323830",
+"). c #232C1F",
+"!. c #313E2D",
+"~. c #3B4A36",
+"{. c #43553D",
+"]. c #485B42",
+"^. c #4A5E44",
+"/. c #F0F0EE",
+"(. c #E5E5E3",
+"_. c #C6C6C3",
+":. c #ACACAB",
+"<. c #8B8B8A",
+"[. c #32392F",
+"}. c #2C3728",
+"|. c #3F503A",
+"1. c #465840",
+"2. c #4B5E44",
+"3. c #4E6347",
+"4. c #506549",
+"5. c #DADAD8",
+"6. c #7A7D78",
+"7. c #333C30",
+"8. c #475A41",
+"9. c #4F6348",
+"0. c #53694C",
+"a. c #566C4E",
+"b. c #576D4F",
+"c. c #91968F",
+"d. c #3B4736",
+"e. c #42543C",
+"f. c #51674A",
+"g. c #586F50",
+"h. c #5B7353",
+"i. c #5C7454",
+" ",
+" . . . . . . . . . . . . . . . . ",
+" . + @ # $ % & & & * . . . . . . ",
+" . = - ; > , ' ) ! ~ . . . . . . ",
+" . . = - ; > , { ] ^ / . . . . . . ",
+" . . . = - ; > , { { { ( . . . . . . ",
+" . _ . : - ; > < { { { [ } | 1 1 1 . ",
+". . . . . . 2 3 . 4 5 6 < { { { [ 7 8 9 0 0 . ",
+". a 2 2 2 2 b c d . e 6 < { { { [ f g h i i . ",
+". j c c c c c c c 3 . k < { l { [ m n o p p . ",
+". j c c c c c c c c 3 . q { l r [ n s t u u . ",
+". v w w w w w w w w w x . y r { [ z A B C C . ",
+". v w w w w w w w w D . E { { { [ F G H I I . ",
+". v w w w w w w w J . K < { { { [ C L M N N . ",
+". O P P P P Q w J . R 6 < { { { [ S T U V V . ",
+". . . . . . Q J . W 5 6 < { { { [ X H Y Z ` . ",
+" . .. ..- 5 6 < { { { [ +.@.#.$.%.. ",
+" . . . = - 5 6 < { ] &.*.B =.Z -.;.. ",
+" . . = - 5 6 >.&.,.'.).!.~.{.].^.. ",
+" . /.(._.:.<.[.}.Z |.1.2.3.4.4.. ",
+" . 5.k 6.7.Z -.8.9.0.a.a.b.b.b.. ",
+" . c.d.e.^.f.g.h.i.i.i.i.i.i.i.. ",
+" . . . . . . . . . . . . . . . . ",
+" "};
--- /dev/null
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"24 24 9 1",
+" c Gray0",
+". c #675e6580613e",
+"X c #8c8c7c7c6969",
+"o c #9b458d377822",
+"O c #a941a6459f3e",
+"+ c #c8c8b2b29898",
+"@ c #dadac2c2a5a5",
+"# c #eb4dea2fe4ad",
+"$ c None",
+/* pixels */
+"$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$",
+"$$$$$$$$$$$$$ $$$$$$$",
+"$$$$$$$$ .@#+ $$$$$$",
+"$$$ .+#####@O $$$$$$",
+"$$ .+##########.+O $$$$$",
+"$$ @..########O.+# $$$$$",
+"$$ O@O..@#####.+## $$$$$",
+"$$$ ###+O.O##...##O $$$$",
+"$$$ @####@+..O#O.+# $$$$",
+"$$$ O####.#######.O $$$$",
+"$$$$ ###+O########.O $$$",
+"$$$$ ###.########@O $$$",
+"$$$$ +#+O#####@O $$$$$",
+"$$$$$ #.###@O $$$$$$",
+"$$$$$ .O@O $$ .. $$$$$",
+"$$$$$ .. $$$$ .oo. $$$$",
+"$$$$$$ $$$$$ oo $$$",
+"$$$$$$$$$$$$$$$ Oo $$$$$",
+"$$$$$$$$$$$$$$ oOOX $$$$",
+"$$$$$$$$$$$$$$ ++++ $$$$",
+"$$$$$$$$$$$$$ O@@@@O $$$",
+"$$$$$$$$$$$$$ $$$",
+"$$$$$$$$$$$$$$$$$$$$$$$$"
+};
--- /dev/null
+/* XPM */
+static char * stock_task_recurring_xpm[] = {
+"24 24 31 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+"@ c #F4E2BC",
+"# c #F4D597",
+"$ c #434343",
+"% c #F0CC84",
+"& c #EBB13D",
+"* c #4B4B4B",
+"= c #535353",
+"- c #C8C8C8",
+"; c #7D7D7D",
+"> c #7C7C7C",
+", c #858585",
+"' c #5C5C5C",
+") c #949494",
+"! c #F2F2F2",
+"~ c #B6B6B6",
+"{ c #BDBDBD",
+"] c #818181",
+"^ c #878787",
+"/ c #B2B2B2",
+"( c #FDFDFD",
+"_ c #DBDBDB",
+": c #CCCCCC",
+"< c #ECECEC",
+"[ c #7F7F99",
+"} c #333366",
+"| c #8F8FA9",
+"1 c #59597F",
+"2 c #EEEEEE",
+" ",
+" . . . . . . . ",
+" .+.+.+.+.+.+.+. ",
+" .@.#.#.#.#.#.#. ",
+" .$%$&*&*&=&=&$&*. ",
+" .-*;*>*>*>*>=,'). ",
+" .!>~>{]{]{]{]{^/. ",
+" .(_:::::::::::_/. ",
+" .+<<<<<<<<<<<<</. ",
+" .+_::[}::}}}}:_/. ",
+" .+<<|}<<<}}}<<</. ",
+" .+_:}[:::}}1[:_/. ",
+" .+<<}<<<<}<|}<</. ",
+" .+_:}[:}::::}:_/. ",
+" .+<<|}}}<<<|}<</. ",
+" .+_::}}}:::}[:_/. ",
+" .+<<}}}}<<}|<<</. ",
+" .+_:::::::::::_/. ",
+" .+<<<<<<<<<<<<</. ",
+" .2//////////////. ",
+" ................. ",
+" ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char * help_xpm[] = {
+"24 24 244 2",
+" c None",
+". c #000000",
+"+ c #454442",
+"@ c #1D1D1C",
+"# c #040404",
+"$ c #1B1B1B",
+"% c #3D3C3A",
+"& c #4D4C4B",
+"* c #2F2F2D",
+"= c #C1BFBB",
+"- c #ECEAE7",
+"; c #F5F3F0",
+"> c #F2F0EC",
+", c #E1DFDC",
+"' c #AFADAA",
+") c #272726",
+"! c #020202",
+"~ c #3F3E3E",
+"{ c #36302D",
+"] c #181818",
+"^ c #FBF8F5",
+"/ c #FEFCF8",
+"( c #FAF8F5",
+"_ c #F5F4F1",
+": c #F2F1ED",
+"< c #F1EFEB",
+"[ c #F1EEEB",
+"} c #EAE9E6",
+"| c #DAD8D4",
+"1 c #100E0E",
+"2 c #1F100E",
+"3 c #AF3A1E",
+"4 c #FBAB93",
+"5 c #FAE9E3",
+"6 c #F0EFEB",
+"7 c #E9E8E5",
+"8 c #EAE8E6",
+"9 c #ECEAE8",
+"0 c #EDEBE9",
+"a c #EDEBE8",
+"b c #EACFC6",
+"c c #D5340A",
+"d c #751904",
+"e c #100806",
+"f c #34160D",
+"g c #AF3C20",
+"h c #FCCCBD",
+"i c #F7BEAD",
+"j c #E67554",
+"k c #DFDDDB",
+"l c #DBD9D6",
+"m c #D8D7D3",
+"n c #DBDAD6",
+"o c #E3E2DE",
+"p c #ECEBE8",
+"q c #E5572D",
+"r c #E33A0B",
+"s c #D4340A",
+"t c #691504",
+"u c #100504",
+"v c #582C22",
+"w c #0F0F0F",
+"x c #FDD4C8",
+"y c #F7BFAF",
+"z c #E87554",
+"A c #D5512B",
+"B c #C68270",
+"C c #BEBDBA",
+"D c #A5A3A0",
+"E c #9C9A95",
+"F c #B9B7B2",
+"G c #D7D6D2",
+"H c #E7E5E2",
+"I c #E79A85",
+"J c #E53C0B",
+"K c #E43C0B",
+"L c #E23A0B",
+"M c #C93009",
+"N c #010000",
+"O c #040100",
+"P c #FAB19C",
+"Q c #FACCBE",
+"R c #EB8264",
+"S c #D8532D",
+"T c #C0340F",
+"U c #932006",
+"V c #141412",
+"W c #857974",
+"X c #DA370B",
+"Y c #EC7C5B",
+"Z c #E95B32",
+"` c #DE380B",
+" . c #9D2306",
+".. c #626261",
+"+. c #FEF1ED",
+"@. c #F09479",
+"#. c #DC532B",
+"$. c #C0350F",
+"%. c #942006",
+"&. c #621404",
+"*. c #E2522B",
+"=. c #F2A690",
+"-. c #E74E21",
+";. c #E23B0B",
+">. c #C99181",
+",. c #454342",
+"'. c #E5E4E2",
+"). c #FCFBFA",
+"!. c #E2D8D3",
+"~. c #C34C2A",
+"{. c #B02B07",
+"]. c #9E2D12",
+"^. c #EF8D71",
+"/. c #F09B83",
+"(. c #EADDD7",
+"_. c #272724",
+":. c #F0EEEC",
+"<. c #F3F2EF",
+"[. c #D7D6D3",
+"}. c #BFBEBB",
+"|. c #9E6153",
+"1. c #3F0D02",
+"2. c #F0B9A9",
+"3. c #F6F5F4",
+"4. c #E8E7E4",
+"5. c #DAD8D5",
+"6. c #585652",
+"7. c #F6F4F0",
+"8. c #DAD8D6",
+"9. c #C2C1BE",
+"0. c #989691",
+"a. c #0A0A08",
+"b. c #F6F4F2",
+"c. c #F4F3F1",
+"d. c #E4E3E0",
+"e. c #D3D2CE",
+"f. c #63625D",
+"g. c #DCDAD8",
+"h. c #C7C6C2",
+"i. c #ABAAA5",
+"j. c #0A0A0A",
+"k. c #FAF8F6",
+"l. c #EFEDEA",
+"m. c #DDDCD8",
+"n. c #C6C4C2",
+"o. c #3E3E39",
+"p. c #1B1B19",
+"q. c #F0EEEA",
+"r. c #E0DFDD",
+"s. c #CCCBC9",
+"t. c #C0BFBB",
+"u. c #131311",
+"v. c #676663",
+"w. c #FCFAF8",
+"x. c #D6D4D2",
+"y. c #BCBAB7",
+"z. c #3C3C3A",
+"A. c #DEDCD9",
+"B. c #7E4B3E",
+"C. c #232323",
+"D. c #CC9385",
+"E. c #FAFAF7",
+"F. c #E6E6E2",
+"G. c #CDCCCA",
+"H. c #B0B0AC",
+"I. c #EDE3DF",
+"J. c #E78468",
+"K. c #DF5D3A",
+"L. c #631909",
+"M. c #282828",
+"N. c #B46E5E",
+"O. c #FCC3B2",
+"P. c #F1A691",
+"Q. c #DCD2CC",
+"R. c #C8C6C3",
+"S. c #7E7C78",
+"T. c #E8AD9C",
+"U. c #E96139",
+"V. c #EB7452",
+"W. c #EF8E72",
+"X. c #EA8063",
+"Y. c #9E2E13",
+"Z. c #3F1811",
+"`. c #121212",
+" + c #6B433B",
+".+ c #E0A191",
+"++ c #FDD3C7",
+"@+ c #F4AD98",
+"#+ c #DE532B",
+"$+ c #C83409",
+"%+ c #B48274",
+"&+ c #383534",
+"*+ c #D6340A",
+"=+ c #E43D0F",
+"-+ c #E8582E",
+";+ c #ED7957",
+">+ c #F4B6A4",
+",+ c #F4B09D",
+"'+ c #F0E5E0",
+")+ c #F4F3EF",
+"!+ c #FDF8F6",
+"~+ c #FBCEC1",
+"{+ c #F28B6E",
+"]+ c #E44E23",
+"^+ c #D3370A",
+"/+ c #BF2F09",
+"(+ c #260800",
+"_+ c #190F0B",
+":+ c #D5350A",
+"<+ c #E43D0C",
+"[+ c #E74C1F",
+"}+ c #EFBBAB",
+"|+ c #F5F4F3",
+"1+ c #F5F3F1",
+"2+ c #EAB1A0",
+"3+ c #DE4316",
+"4+ c #C5310A",
+"5+ c #591202",
+"6+ c #0E0504",
+"7+ c #C83009",
+"8+ c #E0532B",
+"9+ c #E7E6E3",
+"0+ c #E7E6E2",
+"a+ c #DDDCD9",
+"b+ c #CFCECA",
+"c+ c #C14724",
+"d+ c #AE2907",
+"e+ c #290800",
+"f+ c #0F0705",
+"g+ c #9B2205",
+"h+ c #C1A89F",
+"i+ c #D1D0CC",
+"j+ c #CFCDCA",
+"k+ c #C7C6C3",
+"l+ c #BBBAB7",
+"m+ c #B5B4B1",
+"n+ c #A7A6A2",
+"o+ c #66564F",
+"p+ c #0B0908",
+"q+ c #010100",
+"r+ c #222221",
+"s+ c #51504B",
+"t+ c #5D5C57",
+"u+ c #3B3B37",
+" . . + @ # # $ % ",
+" . . . . & # * = - ; > , ' ) ! ~ . . . . ",
+". . { ] ^ / ( _ : > < [ } | . 1 . . ",
+" . 2 3 4 5 6 - 7 8 9 0 0 a b c d e . ",
+" . f g h i j k l m n o } p a q r s t u . . ",
+" v w x y z A B C D E F G H I J K L M . N ",
+" O P Q R S T U . . . . V W X Y Z K ` .. ",
+" ..+.@.#.$.%.. . . &.*.=.-.;.>.! . ",
+",.'.).!.~.{.. . . ].^./.(.n _.. ",
+"@ :.<.[.}.|.. 1.2.3.4.5.6.. ",
+"# 7.6 8.9.0.. a.b.c.d.e.f.. ",
+"# > < g.h.i.. j.k.l.m.n.o.. ",
+"p., q.r.s.t.u. v.w.9 x.y.. . ",
+"z.' [ 7 A.[.B.. C.D.E.F.G.H.. . ",
+" ) } 0 I.J.K.L.. M.N.O.P.Q.R.S.. . ",
+" ! | T.U.V.W.X.Y.Z.a.`. +.+++@+#+$+%+. . ",
+" &+. *+=+-+;+>+,+'+)+k.!+~+{+]+^+/+(+. . ",
+" . _+d :+L <+[+}+|+l.1+|+2+3+^+4+5+. . . ",
+" . 6+t 7+` 8+9+0+o a+[.b+c+d+e+. . . ",
+" . f+. g+h+i+j+k+l+m+n+o+. . . . ",
+" . . . p+. q+r+s+t+u+. . . . . . . ",
+" . . . . . . . . . . . . ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char * home_xpm[] = {
+"24 24 101 2",
+" c None",
+". c #000000",
+"+ c #212121",
+"@ c #2C2C2C",
+"# c #C1665A",
+"$ c #924B37",
+"% c #2A2A2A",
+"& c #333333",
+"* c #343434",
+"= c #242424",
+"- c #944D3A",
+"; c #A05443",
+"> c #181818",
+", c #474747",
+"' c #555555",
+") c #8D8D8D",
+"! c #383838",
+"~ c #191919",
+"{ c #974F3C",
+"] c #222222",
+"^ c #313131",
+"/ c #A1A1A1",
+"( c #676767",
+"_ c #ACACAC",
+": c #BCBCBC",
+"< c #585858",
+"[ c #141414",
+"} c #1C1C1C",
+"| c #464646",
+"1 c #666666",
+"2 c #BABABA",
+"3 c #7E7E7E",
+"4 c #D2D2D2",
+"5 c #FFFFFF",
+"6 c #4F4F4F",
+"7 c #262626",
+"8 c #232323",
+"9 c #505050",
+"0 c #B2B2B2",
+"a c #909090",
+"b c #9A9A9A",
+"c c #838383",
+"d c #171717",
+"e c #202020",
+"f c #717171",
+"g c #A6A6A6",
+"h c #616161",
+"i c #1D1D1D",
+"j c #1F1F1F",
+"k c #C4C4C4",
+"l c #CACACA",
+"m c #AEAEAE",
+"n c #D1D1D1",
+"o c #7C7C7C",
+"p c #BFBFBF",
+"q c #6C6C6C",
+"r c #EEEEEE",
+"s c #949494",
+"t c #C7C7C7",
+"u c #EBEBEB",
+"v c #7D7D7D",
+"w c #6E6E6E",
+"x c #A9A9A9",
+"y c #E99E8F",
+"z c #DD806D",
+"A c #9B5343",
+"B c #CECECE",
+"C c #626262",
+"D c #858585",
+"E c #ECA292",
+"F c #D0533A",
+"G c #934F3E",
+"H c #6D6D6D",
+"I c #ECA291",
+"J c #CF543C",
+"K c #371D16",
+"L c #5D5D5D",
+"M c #868686",
+"N c #787878",
+"O c #ECA696",
+"P c #C95C49",
+"Q c #E17C66",
+"R c #924E3D",
+"S c #888888",
+"T c #A0A0A0",
+"U c #3D1208",
+"V c #D15137",
+"W c #919191",
+"X c #879981",
+"Y c #82947C",
+"Z c #8A9B85",
+"` c #6E8467",
+" . c #5D7555",
+".. c #4C6042",
+"+. c #3F4F37",
+"@. c #303D2A",
+"#. c #7F8F7A",
+"$. c #64785E",
+"%. c #44563E",
+"&. c #657460",
+"*. c #40503A",
+" ",
+" . . ",
+" . . . . . + @ . ",
+" . # $ . . % & * = . ",
+" . - ; . > , ' ) ! ~ . ",
+" . { . ] ^ / ( _ : < [ . ",
+" . . } | 1 2 3 4 : 5 6 7 . ",
+" . 8 9 0 a 4 b 5 : 5 : c d . ",
+" . e f g 4 b 5 : 5 : 5 : 5 h i . ",
+" . j k k l 5 m 5 2 5 2 5 : 5 n o } . ",
+" . 8 m p p p p p p p p . . . . . a q = . ",
+" . . . . r 5 5 5 5 5 5 5 . s t u . v . . . . ",
+" . 4 5 . . . . . 5 . : 5 5 . w . ",
+" . x 5 . y z A . 5 . B 5 5 . C . ",
+" . D 5 . E F G . 5 . . . . . H . ",
+" . . 5 . I J K . k s L L M N . . ",
+" . . r . O P G . 5 5 5 5 5 2 . ",
+" . 2 . Q # R . : : : : : S . ",
+" . T U V # A . 5 5 5 5 5 W . ",
+" . . . . . . . . . . . . . . . . . . . . . ",
+" } X Y Z X ` ...+.@.. Y #.$.%.&.*.. ",
+" . . . . . . . . . . . . . . . . . ",
+" . . . ",
+" "};
--- /dev/null
+/* XPM */
+static char * index_xpm[] = {
+"24 24 174 2",
+" c None",
+". c #000000",
+"+ c #FDFDFD",
+"@ c #F5F5F5",
+"# c #F6F6F6",
+"$ c #D0D0D0",
+"% c #C1C1C1",
+"& c #C3C3C3",
+"* c #C6C6C6",
+"= c #C8C8C8",
+"- c #8D8D8D",
+"; c #CACACA",
+"> c #919191",
+", c #EFEFEF",
+"' c #878787",
+") c #8A8A8A",
+"! c #5C5C5C",
+"~ c #F8F8F8",
+"{ c #EAEAEA",
+"] c #CCCCCC",
+"^ c #CECECE",
+"/ c #979797",
+"( c #CDCDCD",
+"_ c #A1A1A1",
+": c #090600",
+"< c #A3A3A3",
+"[ c #C5C5C5",
+"} c #C4C4C4",
+"| c #D1D1D1",
+"1 c #D2D2D1",
+"2 c #D2D2D2",
+"3 c #9A9A9A",
+"4 c #E8E8E8",
+"5 c #949494",
+"6 c #939393",
+"7 c #574F4F",
+"8 c #FDFDFC",
+"9 c #777777",
+"0 c #7E7E7E",
+"a c #9D9D9D",
+"b c #6B6B6B",
+"c c #F1F1F1",
+"d c #ECECEC",
+"e c #CFCFCF",
+"f c #575050",
+"g c #FDFAF8",
+"h c #A5A5A5",
+"i c #B9B9B9",
+"j c #EEEEEE",
+"k c #EDEDED",
+"l c #D5D5D5",
+"m c #BABABA",
+"n c #6D6767",
+"o c #F9F1EA",
+"p c #9E9E9E",
+"q c #B5B5B5",
+"r c #D9D9D9",
+"s c #D7D7D7",
+"t c #BCBCBC",
+"u c #625C5B",
+"v c #F9EEE4",
+"w c #4F4D4A",
+"x c #646464",
+"y c #747474",
+"z c #D6D6D5",
+"A c #DFDFDF",
+"B c #A0A0A0",
+"C c #615C5B",
+"D c #F9F0E4",
+"E c #746C67",
+"F c #FEFDFC",
+"G c #FFFEFD",
+"H c #131210",
+"I c #636363",
+"J c #7C7C7C",
+"K c #F3F2F2",
+"L c #98948F",
+"M c #F9EFE3",
+"N c #A09489",
+"O c #FEFDFD",
+"P c #766D68",
+"Q c #736961",
+"R c #A3A3A2",
+"S c #A6A6A6",
+"T c #DBDBDB",
+"U c #C7C7C7",
+"V c #E8E5E2",
+"W c #97938E",
+"X c #F6E9D8",
+"Y c #84817A",
+"Z c #FBF3EA",
+"` c #908C86",
+" . c #F1EDE7",
+".. c #7B7975",
+"+. c #878786",
+"@. c #070000",
+"#. c #FAFAFA",
+"$. c #DDDDDD",
+"%. c #E2DFDC",
+"&. c #A8A199",
+"*. c #F0E0CE",
+"=. c #C8BFB4",
+"-. c #D5CCBF",
+";. c #DFD7CD",
+">. c #DAD3C9",
+",. c #DDCFC4",
+"'. c #928C84",
+"). c #A8A8A8",
+"!. c #959595",
+"~. c #040000",
+"{. c #D9D5D2",
+"]. c #D9CABB",
+"^. c #D7C8B8",
+"/. c #DECFBF",
+"(. c #D8C9B9",
+"_. c #E3D3C2",
+":. c #C9BBAC",
+"<. c #D9CEC2",
+"[. c #7F766D",
+"}. c #909090",
+"|. c #D3D3D3",
+"1. c #060100",
+"2. c #C0BDBA",
+"3. c #8C8782",
+"4. c #C2B5A7",
+"5. c #BFB4A6",
+"6. c #B8AB9D",
+"7. c #BAAD9E",
+"8. c #BEB0A2",
+"9. c #948A7F",
+"0. c #716860",
+"a. c #E2E2E2",
+"b. c #A9A9A8",
+"c. c #332C2B",
+"d. c #5D5954",
+"e. c #79736C",
+"f. c #958C80",
+"g. c #8D8379",
+"h. c #988D82",
+"i. c #706760",
+"j. c #787878",
+"k. c #E4E4E4",
+"l. c #C2C2C2",
+"m. c #201A1A",
+"n. c #57514F",
+"o. c #625C59",
+"p. c #625A53",
+"q. c #6B625A",
+"r. c #585251",
+"s. c #696764",
+"t. c #080000",
+"u. c #989898",
+"v. c #B0B0B0",
+"w. c #AFAFAF",
+"x. c #999999",
+"y. c #9D9897",
+"z. c #050000",
+"A. c #0C0303",
+"B. c #080100",
+"C. c #030000",
+"D. c #282523",
+"E. c #5A5A5A",
+"F. c #868686",
+"G. c #ECE4E2",
+"H. c #DED7D5",
+"I. c #D8D1D0",
+"J. c #E0DBD7",
+"K. c #E9E6E3",
+"L. c #FCFBFA",
+"M. c #030500",
+"N. c #0B0505",
+"O. c #14100F",
+"P. c #090806",
+"Q. c #000100",
+" ",
+" . . . . . . . . . . . . . . . . . . . . ",
+" . + @ @ @ @ @ @ @ # # # # # # # # # $ . ",
+" . @ % % % & & & & * * * * * = = = = - . ",
+" . # & & & * * * * = = = = = ; ; ; ; > . ",
+" . , ' ' ' ) ) ) ) - - - - - > > > > ! . ",
+" . ~ { { { { { { { { { { { { { { { { ; . ",
+" . # ; ; ; ] ] ] ] ] ^ ^ ^ ^ $ $ $ $ / . ",
+" . # ] ] ] ( ^ ^ ^ _ : < [ } | 1 | 2 3 . ",
+" . 4 5 5 5 / / / 6 7 8 . 9 0 - a a a b . ",
+" . ~ c d d d d d e f g . h i $ j j k * . ",
+" . ~ 2 2 2 2 l l m n o . > p q r r r < . ",
+" . ~ l l l l s s t u v w . x . y p z < . ",
+" . A B B B B < 9 . C D E F . G H . I J . ",
+" . ~ @ , , , j . K L M N O P F Q R . S . ",
+" . ~ T T T T U . V W X Y Z ` ...+.@.< . ",
+" . #.$.$.$.$.& . %.&.*.=.-.;.>.,.'.@.p . ",
+" . { ).).).).!.~.{.].^./.(._.:.<.[.@.}.. ",
+" . #.@ c c c |.1.2.3.4.5.6.7.8.9.0.@.] . ",
+" . #.a.a.a.a.l b.c.d.e.f.g.9.h.i.. j.q . ",
+" . #.a.a.a.a.k.l.j.m.n.o.p.q.r.s.t.u.q . ",
+" . a.v.v.v.v.v.w.x.y.z.A.t.B.C.D.E.F.m . ",
+" . . . . . . . . . ~.G.H.I.J.K.L.M.. . . ",
+" ~.N.z.O.C.P.. Q. "};
--- /dev/null
+/* XPM */
+static char * jump_to_xpm[] = {
+"24 24 144 2",
+" c None",
+". c #000000",
+"+ c #9ABC82",
+"@ c #C1E3AA",
+"# c #A0C487",
+"$ c #8F6508",
+"% c #AD671D",
+"& c #D6AF41",
+"* c #E1B744",
+"= c #B86F20",
+"- c #7E5907",
+"; c #D8E7CD",
+"> c #D9E7CF",
+", c #DDEAD2",
+"' c #E4EFDA",
+") c #EBF6DF",
+"! c #C8EBB0",
+"~ c #A2C688",
+"{ c #986F26",
+"] c #E2B946",
+"^ c #EFCD64",
+"/ c #F4D268",
+"( c #F6D469",
+"_ c #E7C24A",
+": c #D5B044",
+"< c #BC8C31",
+"[ c #1A0700",
+"} c #D7E6CD",
+"| c #B2D29C",
+"1 c #B6D69F",
+"2 c #BDDEA5",
+"3 c #C4E7AC",
+"4 c #CAEEB1",
+"5 c #A1C387",
+"6 c #CBB86E",
+"7 c #EDD97E",
+"8 c #FEE882",
+"9 c #FEE77E",
+"0 c #FDDF60",
+"a c #FBD14F",
+"b c #E4BF49",
+"c c #BB8C31",
+"d c #CFE2C3",
+"e c #B2D19C",
+"f c #B5D59F",
+"g c #BBDBA4",
+"h c #C1E3A9",
+"i c #C6E9AE",
+"j c #C3E6AB",
+"k c #A9CE8D",
+"l c #DCBA5C",
+"m c #FBE46B",
+"n c #FFEB64",
+"o c #FFE054",
+"p c #FED952",
+"q c #F8CF4E",
+"r c #C4A13E",
+"s c #8BA27B",
+"t c #618249",
+"u c #628349",
+"v c #64864B",
+"w c #66894D",
+"x c #688B4E",
+"y c #678B4D",
+"z c #6B9251",
+"A c #719755",
+"B c #55833A",
+"C c #ECC75E",
+"D c #FFED59",
+"E c #FFE757",
+"F c #FFDF54",
+"G c #FBD44F",
+"H c #E1BD48",
+"I c #B36C1F",
+"J c #608148",
+"K c #628449",
+"L c #63854A",
+"M c #65894C",
+"N c #6C9151",
+"O c #527E39",
+"P c #B39237",
+"Q c #F0C248",
+"R c #FFF25B",
+"S c #FFEB58",
+"T c #FFE155",
+"U c #FBD450",
+"V c #E3BD49",
+"W c #BC983B",
+"X c #618349",
+"Y c #628549",
+"Z c #65884B",
+"` c #4D7735",
+" . c #907934",
+".. c #DCB444",
+"+. c #FCDB52",
+"@. c #FFEF5A",
+"#. c #FFE957",
+"$. c #FEDF54",
+"%. c #F9D24F",
+"&. c #E0BA48",
+"*. c #B08F37",
+"=. c #52743B",
+"-. c #456A2F",
+";. c #608248",
+">. c #628448",
+",. c #476F31",
+"'. c #7F6B32",
+"). c #D0AF4B",
+"!. c #F5CF4E",
+"~. c #FFE255",
+"{. c #FEDA52",
+"]. c #EAC54B",
+"^. c #D0AC42",
+"/. c #9C5D1A",
+"(. c #5A7B42",
+"_. c #456C2F",
+":. c #6F5C23",
+"<. c #A78833",
+"[. c #F0C54A",
+"}. c #FFDA52",
+"|. c #FFDE53",
+"1. c #C39032",
+"2. c #886423",
+"3. c #BC9D3B",
+"4. c #F0C84E",
+"5. c #FFD551",
+"6. c #FED751",
+"7. c #FDD550",
+"8. c #EDC74C",
+"9. c #E5BF49",
+"0. c #CCA941",
+"a. c #AB7727",
+"b. c #B1822D",
+"c. c #DCB746",
+"d. c #DFBA47",
+"e. c #EDC64C",
+"f. c #E9C34B",
+"g. c #D6B144",
+"h. c #C19D3D",
+"i. c #AB7C2B",
+"j. c #BC7222",
+"k. c #BB983B",
+"l. c #B09638",
+"m. c #A2621B",
+" ",
+" ",
+" . ",
+" . . ",
+" . + . . . . . . . ",
+" . . . . . . @ # . . $ % & * = - . . ",
+" . ; > , ' ) ! ! ~ . { ] ^ / ( _ : < [ . ",
+" . } | 1 2 3 4 4 3 5 . 6 7 8 9 0 a b c . ",
+" . d e f g h i i h j k . l m n o p q r - . ",
+" . s t u v w x x y z A B . C D E F G H I . ",
+" . s J t K L v v M N O . P Q R S T U V W . ",
+" . s J J t X u Y Z ` . ...+.@.#.$.%.&.*.. ",
+" . =.-.-.-.-.;.>.,.. '.).!.E E ~.{.].^./.. ",
+" . . . . . . (._.. :.<.[.}.|.|.{.%.V 1.$ . ",
+" . -.. . 2.3.4.5.6.7.8.9.0.a.. ",
+" . . . . b.c.d.e.f.g.h.i.. . ",
+" . . $ j.k.l.m.$ . . ",
+" . . . . . . ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char * left_arrow_xpm[] = {
+"24 24 43 1",
+" c None",
+". c #000000",
+"+ c #B9D0B9",
+"@ c #CDDECB",
+"# c #B6C7B6",
+"$ c #B1C9B0",
+"% c #B3C4B3",
+"& c #B4CBB2",
+"* c #B5CEB5",
+"= c #B7CCB5",
+"- c #B9CEB7",
+"; c #BAD1BA",
+"> c #BBCFBA",
+", c #BBD0B9",
+"' c #B2C9B0",
+") c #7EAB78",
+"! c #AAC7A8",
+"~ c #B3CAB1",
+"{ c #B0C9B0",
+"] c #B0C9AE",
+"^ c #AEC7AC",
+"/ c #AAC5A8",
+"( c #A9C4A7",
+"_ c #698267",
+": c #2D2D2D",
+"< c #CFDFCC",
+"[ c #ADC8AB",
+"} c #B0C7AE",
+"| c #ADC6AB",
+"1 c #678C63",
+"2 c #9BAD9A",
+"3 c #85AE81",
+"4 c #87AF84",
+"5 c #87B083",
+"6 c #88AF84",
+"7 c #88B085",
+"8 c #86AF82",
+"9 c #547150",
+"0 c #3C5235",
+"a c #5B7950",
+"b c #4A6342",
+"c c #3B5035",
+"d c #415639",
+" ",
+" ",
+" ",
+" . ",
+" .. ",
+" .+. ",
+" .@#. ",
+" .@$%........ ",
+" .@&*=-;->,'). ",
+" .@!~{]^///^(_. ",
+" :<[}||[!^^}^[1. ",
+" .23444445645789. ",
+" .0aaaaaaaaaaab. ",
+" .0aaaaaaaaaab. ",
+" .0aabccccccd. ",
+" .0ab........ ",
+" .0b. ",
+" .b. ",
+" .. ",
+" . ",
+" ",
+" ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char * stock_lock_broken_xpm[] = {
+"24 24 204 2",
+" c None",
+". c #0E0E0E",
+"+ c #262626",
+"@ c #464646",
+"# c #3C3C3C",
+"$ c #3B3B3B",
+"% c #212121",
+"& c #252525",
+"* c #ADADAD",
+"= c #F0F0F0",
+"- c #EAEAEA",
+"; c #1A1A1A",
+"> c #000000",
+", c #FAFAFA",
+"' c #F4F4F4",
+") c #4D4D4D",
+"! c #303030",
+"~ c #D8D8D8",
+"{ c #E5E5E5",
+"] c #B0B0B0",
+"^ c #414141",
+"/ c #484848",
+"( c #030303",
+"_ c #DADADA",
+": c #E4E4E4",
+"< c #353535",
+"[ c #070707",
+"} c #A6A6A6",
+"| c #E6E6E6",
+"1 c #686868",
+"2 c #020202",
+"3 c #3E3E3E",
+"4 c #EFEFEF",
+"5 c #9B9B9B",
+"6 c #343434",
+"7 c #F8F8F8",
+"8 c #999999",
+"9 c #F1F1F1",
+"0 c #C4C4C4",
+"a c #232323",
+"b c #535353",
+"c c #AEAEAE",
+"d c #F3F3F3",
+"e c #D3D3D3",
+"f c #242424",
+"g c #4E4E4E",
+"h c #EEEEEE",
+"i c #B5B5B5",
+"j c #0F0601",
+"k c #200E03",
+"l c #765E49",
+"m c #7D6A56",
+"n c #38291D",
+"o c #180A03",
+"p c #D6CBC1",
+"q c #A09E9D",
+"r c #1D1109",
+"s c #2A1E13",
+"t c #3D2E21",
+"u c #3F3123",
+"v c #47423D",
+"w c #DBB98E",
+"x c #D6B183",
+"y c #D3AC7E",
+"z c #CFA573",
+"A c #CD9E67",
+"B c #C39056",
+"C c #46270A",
+"D c #281F14",
+"E c #675643",
+"F c #A48367",
+"G c #D8AB7C",
+"H c #BF9E7C",
+"I c #DCBB93",
+"J c #DCB786",
+"K c #D1A872",
+"L c #231B12",
+"M c #7B6C58",
+"N c #C69B63",
+"O c #C39860",
+"P c #C09257",
+"Q c #BD8A4A",
+"R c #B9803D",
+"S c #AA6E28",
+"T c #412409",
+"U c #100B07",
+"V c #CDB598",
+"W c #E8CCA9",
+"X c #DAB587",
+"Y c #D4AC7D",
+"Z c #D1A775",
+"` c #C99F6A",
+" . c #AF8B5B",
+".. c #2E2517",
+"+. c #1E1910",
+"@. c #0B0805",
+"#. c #594B39",
+"$. c #2A2015",
+"%. c #C2975E",
+"&. c #BE8D50",
+"*. c #BB823F",
+"=. c #AE722C",
+"-. c #422409",
+";. c #0E0B07",
+">. c #AB957E",
+",. c #E9CEAC",
+"'. c #DBB68A",
+"). c #D5AD7E",
+"!. c #D0A975",
+"~. c #C9A26F",
+"{. c #B99667",
+"]. c #AA895F",
+"^. c #31291C",
+"/. c #322A1C",
+"(. c #54493B",
+"_. c #C69C64",
+":. c #C2965E",
+"<. c #BE8E50",
+"[. c #C29156",
+"}. c #9E692A",
+"|. c #1A150D",
+"1. c #887762",
+"2. c #EAD1AF",
+"3. c #DDB98E",
+"4. c #D4AC7E",
+"5. c #D2A876",
+"6. c #C39E6D",
+"7. c #927751",
+"8. c #15110C",
+"9. c #988468",
+"0. c #C2945A",
+"a. c #BE8F51",
+"b. c #BC8544",
+"c. c #BE8A4F",
+"d. c #9A6526",
+"e. c #70604D",
+"f. c #EFD6B5",
+"g. c #DEBD93",
+"h. c #D4AC7C",
+"i. c #D0A672",
+"j. c #C9A069",
+"k. c #9D7E53",
+"l. c #140F09",
+"m. c #1F1710",
+"n. c #EFD8B9",
+"o. c #E3C39C",
+"p. c #D7B080",
+"q. c #D4AC79",
+"r. c #CDA46F",
+"s. c #3A2C1B",
+"t. c #FFFFFF",
+"u. c #1C160D",
+"v. c #B29E85",
+"w. c #E6C8A3",
+"x. c #D7B081",
+"y. c #D1A874",
+"z. c #CBA16A",
+"A. c #BA905A",
+"B. c #251C10",
+"C. c #DF421E",
+"D. c #F7F7F7",
+"E. c #DFDFDF",
+"F. c #2F2619",
+"G. c #92806A",
+"H. c #E6C7A2",
+"I. c #D6AF7E",
+"J. c #CCA26C",
+"K. c #53422A",
+"L. c #211910",
+"M. c #2A2014",
+"N. c #E1E1E1",
+"O. c #6A5C4A",
+"P. c #EAD0AD",
+"Q. c #DAB68B",
+"R. c #D2A978",
+"S. c #CEA56E",
+"T. c #C89D66",
+"U. c #856740",
+"V. c #534026",
+"W. c #F9F9F9",
+"X. c #FBFBFB",
+"Y. c #E2E2E2",
+"Z. c #42362B",
+"`. c #D1BA9B",
+" + c #DCBA8E",
+".+ c #D1A773",
+"++ c #C4975C",
+"@+ c #BE8C4C",
+"#+ c #B4813F",
+"$+ c #281B0B",
+"%+ c #E3E3E3",
+"&+ c #372416",
+"*+ c #74654F",
+"=+ c #B68E5C",
+"-+ c #926231",
+";+ c #452B11",
+">+ c #341E09",
+",+ c #221205",
+"'+ c #150802",
+")+ c #FDFDFD",
+"!+ c #030000",
+"~+ c #050000",
+"{+ c #010000",
+"]+ c #C3C3C3",
+" ",
+" ",
+" . + @ # $ % ",
+" & * = - ; > , ' ) > ",
+" ! ~ { ] ^ / ( $ _ : < ",
+" [ } | 1 2 3 4 5 > ",
+" 6 7 8 > > 9 0 a ",
+" b 9 c > > d e f ",
+" g h i > j k l m n o ",
+" ^ p q r s t u > v w x y z A B C ",
+" D E F G H I J K L > M N O P Q R S T ",
+" U V W X Y Z ` ...+. @.#.$.%.&.*.=.-. ",
+" ;.>.,.'.).!.~.{.].^./. (._.:.<.[.}.-. ",
+" |.1.2.3.4.5.6.7.8. > 9.0.a.b.c.d.T ",
+" e.f.g.h.i.j.k.l.> > > > > > > > > > ",
+" m.n.o.p.q.r._.s. > t.t.t.t.t.t.t.> ",
+" u.v.w.x.y.z.A.B.> > t.C.C.D.C.C.E.> ",
+" F.G.H.I.i.J.K.L.M. > t.C.C.C.C.C.N.> ",
+" O.P.Q.R.S.T.U.V. > t.W.C.C.C.X.Y.> ",
+" Z.`. +.+z.++@+#+$+> > t.C.C.C.C.C.%+> ",
+" &+*+=+-+;+>+,+'+ > t.C.C.)+C.C.{ > ",
+" !+~+{+> > - %+%+: { { ]+> ",
+" > > > > > > > > > ",
+" "};
--- /dev/null
+/* XPM */
+static char * stock_lock_ok_xpm[] = {
+"24 24 188 2",
+" c None",
+". c #000000",
+"+ c #212121",
+"@ c #9E9E9E",
+"# c #E6E6E6",
+"$ c #E7E7E7",
+"% c #C8C8C8",
+"& c #A0A0A0",
+"* c #131313",
+"= c #5F5F5F",
+"- c #EDEDED",
+"; c #D6D6D6",
+"> c #D5D5D5",
+", c #DDDDDD",
+"' c #D8D8D8",
+") c #A1A1A1",
+"! c #3C3C3C",
+"~ c #353535",
+"{ c #EFEFEF",
+"] c #CFCFCF",
+"^ c #4C4C4C",
+"/ c #141414",
+"( c #6A6A6A",
+"_ c #D0D0D0",
+": c #B2B2B2",
+"< c #454545",
+"[ c #E2E2E2",
+"} c #292929",
+"| c #0F0F0F",
+"1 c #949494",
+"2 c #E9E9E9",
+"3 c #C3C3C3",
+"4 c #1C1C1C",
+"5 c #E1E1E1",
+"6 c #272727",
+"7 c #DEDEDE",
+"8 c #B6B6B6",
+"9 c #B7B6B6",
+"0 c #150902",
+"a c #2E2419",
+"b c #251D15",
+"c c #616160",
+"d c #5E5A56",
+"e c #29211A",
+"f c #15100C",
+"g c #2F251B",
+"h c #1D1710",
+"i c #4A392B",
+"j c #656361",
+"k c #565352",
+"l c #392B1D",
+"m c #322110",
+"n c #0C0500",
+"o c #EFDBBF",
+"p c #EDD9C0",
+"q c #E9D5BE",
+"r c #E7D2B9",
+"s c #E5D0B3",
+"t c #DCC09D",
+"u c #D9BE99",
+"v c #DABE99",
+"w c #D7BB95",
+"x c #D5B68E",
+"y c #D2AF85",
+"z c #CFA77C",
+"A c #9A5E1B",
+"B c #F0DABF",
+"C c #E4C6A0",
+"D c #D6AF80",
+"E c #D3AC7B",
+"F c #D0A570",
+"G c #C99F68",
+"H c #C69B64",
+"I c #C69C64",
+"J c #C89D66",
+"K c #C79C65",
+"L c #C39860",
+"M c #C09256",
+"N c #BC8645",
+"O c #B67C36",
+"P c #985E1A",
+"Q c #EED8BC",
+"R c #E3C39C",
+"S c #D3AA7B",
+"T c #CFA670",
+"U c #CA9F68",
+"V c #C89E66",
+"W c #C89F68",
+"X c #C49961",
+"Y c #C09358",
+"Z c #BC8746",
+"` c #B77D39",
+" . c #EED8BB",
+".. c #E2C29B",
+"+. c #D6AE7F",
+"@. c #CA9E6D",
+"#. c #C69861",
+"$. c #BF925A",
+"%. c #BB8E56",
+"&. c #BD8E56",
+"*. c #5C7354",
+"=. c #EFDABE",
+"-. c #E4C49D",
+";. c #D7B080",
+">. c #DAB685",
+",. c #D4B07C",
+"'. c #D0A971",
+"). c #CEA46B",
+"!. c #CDA46D",
+"~. c #FFFFFF",
+"{. c #DBE0D9",
+"]. c #52684B",
+"^. c #4E6346",
+"/. c #52674A",
+"(. c #EFD8BB",
+"_. c #E0C199",
+":. c #D3AA7A",
+"<. c #C89B67",
+"[. c #C3965F",
+"}. c #BC8E56",
+"|. c #BA8B52",
+"1. c #BA8C54",
+"2. c #F6F6F6",
+"3. c #F7F7F7",
+"4. c #F8F8F8",
+"5. c #E6E9E5",
+"6. c #6B8064",
+"7. c #4B5F45",
+"8. c #44553D",
+"9. c #E3C29C",
+"0. c #D9B484",
+"a. c #D4AE77",
+"b. c #CFA770",
+"c. c #CCA46B",
+"d. c #CBA36B",
+"e. c #B6BEB3",
+"f. c #4E6047",
+"g. c #788274",
+"h. c #CBD2C9",
+"i. c #6A8063",
+"j. c #384834",
+"k. c #EDD6B8",
+"l. c #E1BD94",
+"m. c #D1A874",
+"n. c #BD9058",
+"o. c #B7874E",
+"p. c #B48349",
+"q. c #B5844C",
+"r. c #8F9C8A",
+"s. c #53684B",
+"t. c #475841",
+"u. c #657C5E",
+"v. c #4A5D44",
+"w. c #626E5D",
+"x. c #EED8BA",
+"y. c #E0C099",
+"z. c #D8B37F",
+"A. c #D2AD76",
+"B. c #CEA66F",
+"C. c #CCA46D",
+"D. c #FAFAFA",
+"E. c #6A7E63",
+"F. c #63715E",
+"G. c #E3E3E3",
+"H. c #EED5B7",
+"I. c #DFC096",
+"J. c #D2A776",
+"K. c #CEA46E",
+"L. c #C89D65",
+"M. c #C49960",
+"N. c #C1955C",
+"O. c #C2955C",
+"P. c #FBFBFB",
+"Q. c #FCFCFC",
+"R. c #80937A",
+"S. c #6D796A",
+"T. c #FEFEFE",
+"U. c #E5E5E5",
+"V. c #AC8C65",
+"W. c #CFA772",
+"X. c #C49256",
+"Y. c #C08D51",
+"Z. c #BA8849",
+"`. c #B78342",
+" + c #B48240",
+".+ c #B68241",
+"++ c #EAEAEA",
+"@+ c #E4E4E4",
+" ",
+" ",
+" . . . . . ",
+" . + @ # $ % & * ",
+" . = - # ; > , ' ) ! . ",
+" ~ { ] ^ . . / ( _ : < ",
+" . [ ' } . | ( % 1 . ",
+" * 2 3 . 4 5 @ . ",
+" 6 7 8 . . $ 9 . ",
+" 0 a b c d e f g b h b i j k l m n ",
+" . o p q r s t u u v u w x y z A . ",
+" . B C D E F G H I J K L M N O P . ",
+" . Q R D S T U I V W V X Y Z ` A . ",
+" . ...+.@.#.$.%.&.. . . . . . . . . *. ",
+" . =.-.;.>.,.'.).!.. ~.~.~.~.~.~.{.].^./.",
+" . (._.:.<.[.}.|.1.. ~.2.3.3.4.5.6.7.8. ",
+" . Q 9.+.0.a.b.c.d.. ~.e.f.g.h.i.7.j. ",
+" . k.l.m.#.n.o.p.q.. ~.r.s.t.u.v.w.. ",
+" . x.y.S z.A.B.c.C.. ~.D.E.s./.F.G.. ",
+" . H.I.J.K.L.M.N.O.. ~.P.Q.R.S.T.U.. ",
+" . V.W.X.Y.Z.`. +.+. ++G.G.@+U.U.3 . ",
+" . . . . . . . . . . . . . . . . . ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char * stock_lock_xpm[] = {
+"24 24 200 2",
+" c None",
+". c #000000",
+"+ c #212121",
+"@ c #9E9E9E",
+"# c #E6E6E6",
+"$ c #E7E7E7",
+"% c #C8C8C8",
+"& c #A0A0A0",
+"* c #131313",
+"= c #5F5F5F",
+"- c #EDEDED",
+"; c #D6D6D6",
+"> c #D5D5D5",
+", c #DDDDDD",
+"' c #D8D8D8",
+") c #A1A1A1",
+"! c #3C3C3C",
+"~ c #353535",
+"{ c #EFEFEF",
+"] c #CFCFCF",
+"^ c #4C4C4C",
+"/ c #141414",
+"( c #6A6A6A",
+"_ c #D0D0D0",
+": c #B2B2B2",
+"< c #454545",
+"[ c #E2E2E2",
+"} c #292929",
+"| c #0F0F0F",
+"1 c #949494",
+"2 c #E9E9E9",
+"3 c #C3C3C3",
+"4 c #1C1C1C",
+"5 c #E1E1E1",
+"6 c #272727",
+"7 c #DEDEDE",
+"8 c #B6B6B6",
+"9 c #B7B6B6",
+"0 c #150902",
+"a c #2E2419",
+"b c #251D15",
+"c c #616160",
+"d c #5E5A56",
+"e c #29211A",
+"f c #15100C",
+"g c #2F251B",
+"h c #1D1710",
+"i c #4A392B",
+"j c #656361",
+"k c #565352",
+"l c #392B1D",
+"m c #322110",
+"n c #0C0500",
+"o c #EFDBBF",
+"p c #EDD9C0",
+"q c #E9D5BE",
+"r c #E7D2B9",
+"s c #E5D0B3",
+"t c #DCC09D",
+"u c #D9BE99",
+"v c #DABE99",
+"w c #D7BB95",
+"x c #D5B68E",
+"y c #D2AF85",
+"z c #CFA77C",
+"A c #9A5E1B",
+"B c #F0DABF",
+"C c #E4C6A0",
+"D c #D6AF80",
+"E c #D3AC7B",
+"F c #D0A570",
+"G c #C99F68",
+"H c #C69B64",
+"I c #C69C64",
+"J c #C89D66",
+"K c #C79C65",
+"L c #C39860",
+"M c #C09256",
+"N c #BC8645",
+"O c #B67C36",
+"P c #985E1A",
+"Q c #EED8BC",
+"R c #E3C39C",
+"S c #D3AA7B",
+"T c #CFA670",
+"U c #CA9F68",
+"V c #C89E66",
+"W c #C89F68",
+"X c #C49961",
+"Y c #C09358",
+"Z c #BC8746",
+"` c #B77D39",
+" . c #EED8BB",
+".. c #E2C29B",
+"+. c #D6AE7F",
+"@. c #CA9E6D",
+"#. c #C69861",
+"$. c #BF925A",
+"%. c #BB8E56",
+"&. c #BD8E56",
+"*. c #BD9058",
+"=. c #BC8F58",
+"-. c #B9884E",
+";. c #B48145",
+">. c #BA8442",
+",. c #B47834",
+"'. c #975C1A",
+"). c #EFDABE",
+"!. c #E4C49D",
+"~. c #D7B080",
+"{. c #DAB685",
+"]. c #D4B07C",
+"^. c #D0A971",
+"/. c #CEA46B",
+"(. c #CDA46D",
+"_. c #CCA66D",
+":. c #CCA46B",
+"<. c #CA9F63",
+"[. c #C79858",
+"}. c #B9813F",
+"|. c #B37834",
+"1. c #975D1A",
+"2. c #EFD8BB",
+"3. c #E0C199",
+"4. c #D3AA7A",
+"5. c #C89B67",
+"6. c #C3965F",
+"7. c #BC8E56",
+"8. c #BA8B52",
+"9. c #BA8C54",
+"0. c #BB8D55",
+"a. c #BA8C55",
+"b. c #B6864C",
+"c. c #B47F43",
+"d. c #BA833F",
+"e. c #B37934",
+"f. c #9B601E",
+"g. c #E3C29C",
+"h. c #D9B484",
+"i. c #D4AE77",
+"j. c #CFA770",
+"k. c #CBA36B",
+"l. c #CCA46C",
+"m. c #CA9D61",
+"n. c #C69856",
+"o. c #BA813E",
+"p. c #B27733",
+"q. c #A36B2F",
+"r. c #EDD6B8",
+"s. c #E1BD94",
+"t. c #D1A874",
+"u. c #B7874E",
+"v. c #B48349",
+"w. c #B5844C",
+"x. c #B5884D",
+"y. c #B48146",
+"z. c #B27A3C",
+"A. c #B67D3A",
+"B. c #B07530",
+"C. c #A67137",
+"D. c #EED8BA",
+"E. c #E0C099",
+"F. c #D8B37F",
+"G. c #D2AD76",
+"H. c #CEA66F",
+"I. c #CCA46D",
+"J. c #CCA56D",
+"K. c #C99D61",
+"L. c #C69858",
+"M. c #B9803D",
+"N. c #B67D38",
+"O. c #AB783F",
+"P. c #EED5B7",
+"Q. c #DFC096",
+"R. c #D2A776",
+"S. c #CEA46E",
+"T. c #C89D65",
+"U. c #C49960",
+"V. c #C1955C",
+"W. c #C2955C",
+"X. c #C2965C",
+"Y. c #C09155",
+"Z. c #BC8A4B",
+"`. c #BE8A4C",
+" + c #A9773C",
+".+ c #AC8C65",
+"++ c #CFA772",
+"@+ c #C49256",
+"#+ c #C08D51",
+"$+ c #BA8849",
+"%+ c #B78342",
+"&+ c #B48240",
+"*+ c #B68241",
+"=+ c #B88544",
+"-+ c #BB8949",
+";+ c #BC8748",
+">+ c #BA874A",
+",+ c #B98548",
+"'+ c #B27B3B",
+")+ c #6D4215",
+" ",
+" ",
+" . . . . . ",
+" . + @ # $ % & * ",
+" . = - # ; > , ' ) ! . ",
+" ~ { ] ^ . . / ( _ : < ",
+" . [ ' } . | ( % 1 . ",
+" * 2 3 . 4 5 @ . ",
+" 6 7 8 . . $ 9 . ",
+" 0 a b c d e f g b h b i j k l m n ",
+" . o p q r s t u u v u w x y z A . ",
+" . B C D E F G H I J K L M N O P . ",
+" . Q R D S T U I V W V X Y Z ` A . ",
+" . ...+.@.#.$.%.&.*.=.-.;.>.,.'.. ",
+" . ).!.~.{.].^./.(._.:.<.[.}.|.1.. ",
+" . 2.3.4.5.6.7.8.9.0.a.b.c.d.e.f.. ",
+" . Q g.+.h.i.j.:.k.l.k.m.n.o.p.q.. ",
+" . r.s.t.#.*.u.v.w.x.b.y.z.A.B.C.. ",
+" . D.E.S F.G.H.:.I.J.l.K.L.M.N.O.. ",
+" . P.Q.R.S.T.U.V.W.X.X.Y.Z.>.`. +. ",
+" . .+++@+#+$+%+&+*+=+-+;+>+,+'+)+. ",
+" . . . . . . . . . . . . . . . ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char * stock_mail_compose_xpm[] = {
+"24 24 198 2",
+" c None",
+". c #000000",
+"+ c #D1AF61",
+"@ c #F1E3AC",
+"# c #FBA90F",
+"$ c #FFFFFF",
+"% c #B5B5B5",
+"& c #A06B09",
+"* c #816000",
+"= c #E0E0E0",
+"- c #C1C1C1",
+"; c #F4F4F4",
+"> c #FDFDFD",
+", c #E6C370",
+"' c #F1D387",
+") c #D58F0C",
+"! c #B2B2B2",
+"~ c #C3C3C3",
+"{ c #FBFBFB",
+"] c #A8A8A8",
+"^ c #F6F6F6",
+"/ c #B3B3B3",
+"( c #FAFAFA",
+"_ c #ADADAD",
+": c #767676",
+"< c #5D5D5D",
+"[ c #404040",
+"} c #F8F8F8",
+"| c #F1D07E",
+"1 c #ACACAC",
+"2 c #F8F8F6",
+"3 c #E2E2E2",
+"4 c #858585",
+"5 c #4B4B49",
+"6 c #161616",
+"7 c #FBFBFA",
+"8 c #7D7D7D",
+"9 c #F2F2F2",
+"0 c #F0F0F0",
+"a c #EFEFEF",
+"b c #D5D5D5",
+"c c #F9F9F9",
+"d c #F6F6F3",
+"e c #F3F3F3",
+"f c #878786",
+"g c #E5E5E5",
+"h c #DFDFDF",
+"i c #EBEBEB",
+"j c #AEAEAE",
+"k c #7B5307",
+"l c #EDEDED",
+"m c #EBEBE9",
+"n c #E9E9E7",
+"o c #E0E0DE",
+"p c #BFBFBF",
+"q c #F0F0ED",
+"r c #F1D284",
+"s c #CA870B",
+"t c #9E9E9C",
+"u c #DCDCD9",
+"v c #D9D9D9",
+"w c #D9D9D6",
+"x c #D6D6D4",
+"y c #E5E5E4",
+"z c #D9D9D7",
+"A c #BABABA",
+"B c #AAAAAA",
+"C c #E7E7E5",
+"D c #E4E4E2",
+"E c #E2E2E0",
+"F c #EEEEEC",
+"G c #979796",
+"H c #D4D4D1",
+"I c #DEDEDC",
+"J c #DEDEDB",
+"K c #BDBDBC",
+"L c #E7E7E7",
+"M c #EFEFED",
+"N c #A6A6A5",
+"O c #BA7C0A",
+"P c #7A5B00",
+"Q c #DBDBD9",
+"R c #D5D5D3",
+"S c #BCBCBC",
+"T c #E3E3E3",
+"U c #F2E6B6",
+"V c #7B7B7B",
+"W c #704B05",
+"X c #676764",
+"Y c #CBCBC7",
+"Z c #C9C9C7",
+"` c #DBDBD7",
+" . c #D7D7D5",
+".. c #D7D7D3",
+"+. c #B4B4B4",
+"@. c #E4E4E4",
+"#. c #DBD5C1",
+"$. c #7E6F57",
+"%. c #755800",
+"&. c #D9D9D5",
+"*. c #D5D5D1",
+"=. c #D0D0CE",
+"-. c #BABAB8",
+";. c #DDDDDB",
+">. c #D1D1CF",
+",. c #0E0E0E",
+"'. c #535353",
+"). c #8D8D8B",
+"!. c #C4C4C1",
+"~. c #C4C4BF",
+"{. c #C1C1BC",
+"]. c #D3D3D0",
+"^. c #D1D1D0",
+"/. c #DCDCDB",
+"(. c #E0E0DC",
+"_. c #898987",
+":. c #C9C9C6",
+"<. c #CDCDCA",
+"[. c #D0D0CD",
+"}. c #CECECB",
+"|. c #CFCFCC",
+"1. c #D0D0CC",
+"2. c #B6B6B6",
+"3. c #D4D4D0",
+"4. c #C3C3C0",
+"5. c #5B5B5B",
+"6. c #91918D",
+"7. c #91918F",
+"8. c #9F9F9D",
+"9. c #AFAFAC",
+"0. c #B9B9B6",
+"a. c #BEBEBB",
+"b. c #C5C5C2",
+"c. c #C8C8C5",
+"d. c #CACAC7",
+"e. c #CBCBC8",
+"f. c #CCCCC9",
+"g. c #CCCCC8",
+"h. c #D2D2D0",
+"i. c #D2D2CF",
+"j. c #BFBFBD",
+"k. c #9F9F9C",
+"l. c #888886",
+"m. c #878785",
+"n. c #8C8C8A",
+"o. c #959593",
+"p. c #9C9C9A",
+"q. c #A8A8A5",
+"r. c #B1B1AE",
+"s. c #B5B5B3",
+"t. c #BBBBB8",
+"u. c #BFBFBC",
+"v. c #C2C2BE",
+"w. c #D1D1CE",
+"x. c #AEAEAB",
+"y. c #9D9D9A",
+"z. c #979794",
+"A. c #949491",
+"B. c #9A9A97",
+"C. c #A3A3A0",
+"D. c #AAAAA7",
+"E. c #B0B0AC",
+"F. c #B8B8B5",
+"G. c #B0B0AE",
+"H. c #CFCFCD",
+"I. c #BEBEBC",
+"J. c #B4B4B0",
+"K. c #ACACA8",
+"L. c #A4A4A2",
+"M. c #A0A09C",
+"N. c #A4A4A0",
+"O. c #A8A8A6",
+"P. c #ABABA7",
+"Q. c #B2B2AE",
+"R. c #A4A4A4",
+"S. c #CECECC",
+"T. c #CECECA",
+"U. c #C6C6C2",
+"V. c #BCBCB9",
+"W. c #B3B3AF",
+"X. c #ABABA9",
+"Y. c #A6A6A3",
+"Z. c #A0A09D",
+"`. c #ACACA9",
+" + c #A1A1A1",
+".+ c #B1B1AF",
+"++ c #B4B4B3",
+"@+ c #B4B4B1",
+"#+ c #B3B3B1",
+"$+ c #AEAEAA",
+"%+ c #A7A7A4",
+"&+ c #A2A2A0",
+"*+ c #A5A5A1",
+"=+ c #999997",
+"-+ c #929290",
+";+ c #949490",
+">+ c #9D9D9B",
+",+ c #858583",
+" . . . ",
+" . . . . . . . . . . . . + @ # . . . ",
+" . $ $ $ $ $ $ $ $ $ % & @ # * . = - . ",
+" . $ ; $ $ $ $ $ > > . , ' ) . ! ~ { ] . ",
+" . $ ^ $ $ $ > > > / & @ # * . ( _ : < [ . ",
+" . $ ^ $ { { { { } . , | ) . 1 2 3 4 5 6 . ",
+" . $ ; > > { { 7 8 & @ # * . ; 9 0 a b _ . ",
+" . $ 9 c ^ ^ d e . , | ) . f g 3 h i 3 - . ",
+" . $ 0 } } } 2 j k @ # * . l i m n n o p . ",
+" . $ a e 0 q l . , r s . t u v w x y z A . ",
+" . $ l ; ; 9 B & @ # * . C y y D o E z A . ",
+" . $ i F C g . , r s . G H E o I J I z K . ",
+" . $ L M i N O # # P . E o I J u Q Q R S . ",
+" . $ g T v . U V W . X Y Z u ` z .z ..+.. ",
+" . $ E y @.. #.$.%.. u Q ` &...R *...=.-.. ",
+" . $ I ;.>.,.'.. . ).!.~.{.*.*.].^.].=.-.. ",
+" . $ /.(.;.. . _.:.<.[.}.[.[.[.[.|.[.1.2.. ",
+" . $ Q 3.4.5.6.7.8.9.0.a.4.b.c.d.e.f.g.! . ",
+" . $ h.i.|.j.k.l.m.n.o.p.q.r.s.t.a.u.v.! . ",
+" . $ w.1.f.|.4.x.y.z.z.A.B.k.C.q.D.E.F.G.. ",
+" . $ i.w.w.w.H.e.I.J.K.L.M.M.N.L.O.P.Q.R.. ",
+" . $ ^.w.=.S.T.T.g.U.V.W.J.X.Y.Z.Y.D.`. +. ",
+" . $ .+++@+@+@+#+#+Q.$+%+&+*+*+=+-+;+>+,+. ",
+" . . . . . . . . . . . . . . . . . . . . "};
--- /dev/null
+/* XPM */
+static char * stock_mail_copy_xpm[] = {
+"24 24 77 1",
+" c None",
+". c #010101",
+"+ c #2F2F2F",
+"@ c #E3E2E1",
+"# c #FCFCFC",
+"$ c #B3B2B1",
+"% c #95938E",
+"& c #F7F7F7",
+"* c #F5F4F2",
+"= c #F8F8F8",
+"- c #F7F6F6",
+"; c #EAE9E5",
+"> c #7B7976",
+", c #D2CFCA",
+"' c #E1E0DD",
+") c #908E8B",
+"! c #EBEAEA",
+"~ c #F1F0EE",
+"{ c #E2E0DD",
+"] c #7C7B78",
+"^ c #C6C3C0",
+"/ c #E5E3DE",
+"( c #DCDAD7",
+"_ c #8F8C88",
+": c #EBEBEA",
+"< c #EFEDEA",
+"[ c #DFDDDA",
+"} c #787774",
+"| c #C1BEBA",
+"1 c #E6E3E0",
+"2 c #EFEEEC",
+"3 c #CBCAC6",
+"4 c #ECECEC",
+"5 c #F3F2F0",
+"6 c #DCDCDC",
+"7 c #7D7C79",
+"8 c #B4B2AE",
+"9 c #E7E5E1",
+"0 c #F0EFEB",
+"a c #E4E2DD",
+"b c #7B7874",
+"c c #AFACA6",
+"d c #ABA8A3",
+"e c #F9F8F6",
+"f c #EAE9E8",
+"g c #B0ADA7",
+"h c #F5F3F0",
+"i c #B9B8B6",
+"j c #CBC9C4",
+"k c #DEDBD5",
+"l c #9D9994",
+"m c #DBD9D6",
+"n c #747370",
+"o c #A09C97",
+"p c #DAD8D5",
+"q c #E7E6E3",
+"r c #E8E6E1",
+"s c #E0DED9",
+"t c #F7F6F4",
+"u c #D3D1CF",
+"v c #868480",
+"w c #C2BFBD",
+"x c #DAD9D5",
+"y c #F6F5F1",
+"z c #D8D6D1",
+"A c #F7F5F2",
+"B c #92908B",
+"C c #CCCAC5",
+"D c #F7F6F2",
+"E c #F5F4F0",
+"F c #EAE8E3",
+"G c #D2D0CB",
+"H c #D9D7D2",
+"I c #DAD8D3",
+"J c #D5D3CE",
+"K c #D6D4CF",
+"L c #040404",
+" ",
+" ",
+" ",
+" .+........... ",
+" .@###########$. ",
+" .#%&*=*-*-*;>,. ",
+" .#')!~-*-*{]^/. ",
+" .#~(_:~<~[}|1/. ",
+" .#~23]4567890a. ",
+" .#22~b.+........... ",
+" .#~2c.@###########$. ",
+" .#2de.#%&*=*-*-*;>,. ",
+" .fgeh.#')!~-*-*{]^/. ",
+" .ijkk.#~(_:~<~[}|1/. ",
+" .....#~23]4567890a. ",
+" .#22~l]mnopqrs. ",
+" .#~2ctuvwxoy0z. ",
+" .#2deetptAABrC. ",
+" .fgehDEAEAhFBG. ",
+" .ijkkkHIJKGGGB. ",
+" ............L ",
+" ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char * stock_mail_forward_xpm[] = {
+"24 24 65 1",
+" c None",
+". c #000000",
+"+ c #535353",
+"@ c #FFFFFF",
+"# c #FEFEFE",
+"$ c #FDFDFD",
+"% c #FCFCFC",
+"& c #FBFBFB",
+"* c #F9F9F9",
+"= c #F8F8F8",
+"- c #F7F7F7",
+"; c #F6F6F6",
+"> c #F5F5F5",
+", c #F4F4F4",
+"' c #E3E3E3",
+") c #EEEEEE",
+"! c #4F4F4F",
+"~ c #F3F3F3",
+"{ c #F2F2F2",
+"] c #F1F1F1",
+"^ c #F0F0F0",
+"/ c #EFEFEF",
+"( c #EDEDED",
+"_ c #AEAEAE",
+": c #E4E4E4",
+"< c #434343",
+"[ c #ACACAC",
+"} c #C8C8C8",
+"| c #A0A0A0",
+"1 c #D4D4D4",
+"2 c #ECECEC",
+"3 c #959595",
+"4 c #3E3E3E",
+"5 c #4D4D4D",
+"6 c #818181",
+"7 c #C6C6C6",
+"8 c #6A6A6A",
+"9 c #636363",
+"0 c #B9B9B9",
+"a c #737373",
+"b c #7C7C7C",
+"c c #5B88B2",
+"d c #9EB8D1",
+"e c #5080AD",
+"f c #B5C9DC",
+"g c #AFC5DA",
+"h c #B2C7DB",
+"i c #B6CADD",
+"j c #A4BDD5",
+"k c #9CB7D1",
+"l c #080D11",
+"m c #BCBCBC",
+"n c #9BB6D0",
+"o c #A0BAD3",
+"p c #9AB5CF",
+"q c #97B3CE",
+"r c #5F8BB4",
+"s c #91B0CC",
+"t c #95B2CE",
+"u c #4C79A3",
+"v c #49749C",
+"w c #3F6588",
+"x c #2A435B",
+"y c #456F96",
+"z c #375978",
+" ",
+" ",
+" ",
+" ................. ",
+" .+@@@@#$%&*=-;>,'+. ",
+" .)!@>,~{{]^^/)('!_. ",
+" .@:<$~{{]^/))('![}. ",
+" .@>:!&]^^/)(('<|1}. ",
+" .@&>:<=^/)(2'!31:}. ",
+" .@>>>:4>)(2'567::}. ",
+" .@&>>:8<~2'!877>.}. ",
+" .@>>:9@0!^!37a7>... ",
+" .@&:9@>:1![7::b:.c. ",
+" .@:a@>>>>:.......de. ",
+" .@b@::::::.fghiiijkel ",
+" .ammmmmmmm.nokknpokqr. ",
+" ..........sdppnkkkotu.",
+" .vwwwwwwwwx. ",
+" .yzzzzzwwx. ",
+" .......wx. ",
+" .x. ",
+" .. ",
+" . ",
+" "};
--- /dev/null
+/* XPM */
+static char * stock_inbox_xpm[] = {
+"24 24 76 1",
+" c None",
+". c #000000",
+"+ c #B5CADD",
+"@ c #BFD1E1",
+"# c #C3D4E3",
+"$ c #C7D7E5",
+"% c #B0C6DA",
+"& c #6B94BB",
+"* c #131E29",
+"= c #739ABF",
+"- c #7EA2C4",
+"; c #9AB6D0",
+"> c #E4EBF2",
+", c #DDE6EF",
+"' c #8CACCA",
+") c #5C8AB4",
+"! c #090F15",
+"~ c #B1C7DB",
+"{ c #D0DDEA",
+"] c #D9E3ED",
+"^ c #88A9C8",
+"/ c #4D7CA7",
+"( c #030405",
+"_ c #41688D",
+": c #32506C",
+"< c #C4D5E4",
+"[ c #A5BED5",
+"} c #456F97",
+"| c #3B5F81",
+"1 c #C8D8E6",
+"2 c #9CB8D2",
+"3 c #395B7B",
+"4 c #C6D6E4",
+"5 c #BBCEDF",
+"6 c #3D6183",
+"7 c #B6CBDE",
+"8 c #426A90",
+"9 c #E2C6A9",
+"0 c #E5CDB4",
+"a c #D5AA7F",
+"b c #9D6733",
+"c c #CB9967",
+"d c #ADC4D9",
+"e c #B99877",
+"f c #CFBAA4",
+"g c #9A7149",
+"h c #CDA378",
+"i c #D2A87E",
+"j c #608DB6",
+"k c #AA7B4B",
+"l c #C2A588",
+"m c #996633",
+"n c #BB9978",
+"o c #C3976B",
+"p c #D2A980",
+"q c #D1A77D",
+"r c #E0C4A8",
+"s c #C9B097",
+"t c #D7B38E",
+"u c #DAC2A9",
+"v c #BD9063",
+"w c #CEA57C",
+"x c #E5CFBB",
+"y c #393633",
+"z c #E0C8B1",
+"A c #C9A480",
+"B c #D1A87E",
+"C c #D0A67B",
+"D c #E1CAB4",
+"E c #52504D",
+"F c #D8C6B5",
+"G c #CBA988",
+"H c #CCAF93",
+"I c #D2B496",
+"J c #A67D51",
+"K c #E2CFBD",
+" ...... ",
+" .+@#$%&*. ",
+" .=-;$>,')! ",
+" ...=~{]^/( ",
+" .=+#$_:. ",
+" .<[@}|. ",
+" .12@}3. ",
+" ....425}6.... ",
+" .=2527}8}:. ",
+" ..9.=227}}:. ",
+" ..0abb.=2~}:.. ",
+" ..0abbbbc.=d:.ef.. ",
+".0abbbbghii.j.kkklf.. ",
+".mnabgopqqqi.iokkkkef. ",
+".mmmnrooqiqqqiiiokkkks. ",
+".mmmmmnrooqiqqqiiiokkl. ",
+" ..mmmmmnrooqiqqiiituf. ",
+" ..mmmmmnrvwiqqtxxy. ",
+" ..mmmmmzABCDxE.. ",
+" ...mmmFGHIE.. ",
+" ...mJK... ",
+" ..... ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char * stock_mail_move_xpm[] = {
+"24 24 76 1",
+" c None",
+". c #010101",
+"+ c #2F2F2F",
+"@ c #E3E2E1",
+"# c #FCFCFC",
+"$ c #B3B2B1",
+"% c #95938E",
+"& c #F7F7F7",
+"* c #F5F4F2",
+"= c #F8F8F8",
+"- c #F7F6F6",
+"; c #EAE9E5",
+"> c #7B7976",
+", c #D2CFCA",
+"' c #E1E0DD",
+") c #908E8B",
+"! c #EBEAEA",
+"~ c #F1F0EE",
+"{ c #E2E0DD",
+"] c #7C7B78",
+"^ c #C6C3C0",
+"/ c #E5E3DE",
+"( c #DCDAD7",
+"_ c #8F8C88",
+": c #EBEBEA",
+"< c #EFEDEA",
+"[ c #DFDDDA",
+"} c #787774",
+"| c #C1BEBA",
+"1 c #E6E3E0",
+"2 c #EFEEEC",
+"3 c #CBCAC6",
+"4 c #ECECEC",
+"5 c #F3F2F0",
+"6 c #DCDCDC",
+"7 c #7D7C79",
+"8 c #B4B2AE",
+"9 c #E7E5E1",
+"0 c #F0EFEB",
+"a c #E4E2DD",
+"b c #9D9994",
+"c c #DBD9D6",
+"d c #747370",
+"e c #A09C97",
+"f c #DAD8D5",
+"g c #E7E6E3",
+"h c #E8E6E1",
+"i c #E0DED9",
+"j c #AFACA6",
+"k c #F7F6F4",
+"l c #D3D1CF",
+"m c #868480",
+"n c #C2BFBD",
+"o c #DAD9D5",
+"p c #F6F5F1",
+"q c #D8D6D1",
+"r c #ABA8A3",
+"s c #F9F8F6",
+"t c #F7F5F2",
+"u c #92908B",
+"v c #CCCAC5",
+"w c #EAE9E8",
+"x c #B0ADA7",
+"y c #F5F3F0",
+"z c #F7F6F2",
+"A c #F5F4F0",
+"B c #EAE8E3",
+"C c #D2D0CB",
+"D c #B9B8B6",
+"E c #CBC9C4",
+"F c #DEDBD5",
+"G c #D9D7D2",
+"H c #DAD8D3",
+"I c #D5D3CE",
+"J c #D6D4CF",
+"K c #040404",
+" ",
+" ",
+" ",
+" . . . . . . . ",
+" . . ",
+" ",
+" . . ",
+" ",
+" . . ",
+" .+........... ",
+" . .@###########$. ",
+" .#%&*=*-*-*;>,. ",
+" . .#')!~-*-*{]^/. ",
+" .#~(_:~<~[}|1/. ",
+" . . .#~23]4567890a. ",
+" .#22~b]cdefghi. ",
+" .#~2jklmnoep0q. ",
+" .#2rsskfkttuhv. ",
+" .wxsyzAtAtyBuC. ",
+" .DEFFFGHIJCCCu. ",
+" ............K ",
+" ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char * stock_not_spam_xpm[] = {
+"24 24 122 2",
+" c None",
+". c #1D1E1E",
+"+ c #333839",
+"@ c #393F40",
+"# c #171819",
+"$ c #B2B8B9",
+"% c #D5E3E7",
+"& c #AABABD",
+"* c #64696A",
+"= c #0C0D0D",
+"- c #929C9E",
+"; c #E7F0F3",
+"> c #EDF0F1",
+", c #E5EDEF",
+"' c #C5D9DD",
+") c #2E3132",
+"! c #3F4343",
+"~ c #1F2121",
+"{ c #DFEBEE",
+"] c #B7C4C8",
+"^ c #D2D9DA",
+"/ c #E1EFF2",
+"( c #B6CBCF",
+"_ c #3C4547",
+": c #1E2223",
+"< c #191E1F",
+"[ c #2D2E2F",
+"} c #191A1A",
+"| c #252829",
+"1 c #7E8E92",
+"2 c #B7C2C3",
+"3 c #C3D9DD",
+"4 c #9CACB0",
+"5 c #C3CDCE",
+"6 c #C7E1E7",
+"7 c #668F97",
+"8 c #90ACB2",
+"9 c #CDDDE1",
+"0 c #485559",
+"a c #88A6AC",
+"b c #1F2223",
+"c c #3F4545",
+"d c #242728",
+"e c #313B3E",
+"f c #A8C2C8",
+"g c #B2BDC0",
+"h c #CFE5E9",
+"i c #C2D9DE",
+"j c #81989C",
+"k c #A2C0C5",
+"l c #85A9B1",
+"m c #E5ECEE",
+"n c #E7F2F4",
+"o c #9BAEB3",
+"p c #C8E1E7",
+"q c #3A3E3F",
+"r c #0C0E0E",
+"s c #000000",
+"t c #333737",
+"u c #B3C2C5",
+"v c #DDEDF0",
+"w c #D8E4E6",
+"x c #DAECEF",
+"y c #D5E9ED",
+"z c #D2E7EC",
+"A c #95ADB2",
+"B c #DBE2E2",
+"C c #EDEFF0",
+"D c #A2B1B3",
+"E c #8FA4A8",
+"F c #D7E2E5",
+"G c #798F94",
+"H c #151819",
+"I c #F3B5A7",
+"J c #865E55",
+"K c #AFB9BB",
+"L c #F1F8F9",
+"M c #F7FBFB",
+"N c #D9EBEF",
+"O c #ECF4F6",
+"P c #F3F7F7",
+"Q c #E9F2F4",
+"R c #EEF2F3",
+"S c #E9EDEE",
+"T c #C5C8C9",
+"U c #C2C6C8",
+"V c #E0E7E7",
+"W c #DDEAED",
+"X c #7A9DA5",
+"Y c #EB8169",
+"Z c #B83618",
+"` c #924E3C",
+" . c #9FA5A6",
+".. c #E3EEF0",
+"+. c #ECF5F7",
+"@. c #D6EAED",
+"#. c #CBE4E9",
+"$. c #747C7D",
+"%. c #B43518",
+"&. c #E76A4D",
+"*. c #B53F24",
+"=. c #CB705A",
+"-. c #C4D8DB",
+";. c #D2E6E9",
+">. c #CAE3E8",
+",. c #A9C8CF",
+"'. c #EC927D",
+"). c #E66F54",
+"!. c #D26951",
+"~. c #F1A897",
+"{. c #E76547",
+"]. c #C58B7D",
+"^. c #A8ABAC",
+"/. c #70A1AB",
+"(. c #DF421E",
+"_. c #C43A1A",
+":. c #E17055",
+"<. c #DD8D7A",
+"[. c #FFFFFF",
+"}. c #030505",
+"|. c #A2432E",
+"1. c #AC3316",
+" ",
+" ",
+" . + @ ",
+" # $ % & * . ",
+" = - ; > , ' ) ! ",
+" ~ { ] ^ / ( _ : < [ } ",
+" | 1 2 3 4 5 6 7 8 9 0 a b ",
+" c d e f g h i j k l m n o p q r ",
+" s t u v w / x y z A B C D E F G H ",
+" s s I J K L M N O P Q R S T U V W X < ",
+"s I Y Z ` ...+.@.#.$.s s s s s s s s s s s s ",
+"s %.&.Y *.=.-.;.>.,.s '.).).).).).).).).).).!.s ",
+"s %.%.%.&.~.{.].^./.s ).(.(.(.(.(.(.(.(.(.(._.s ",
+"s %.%.%.%.%.&.~.:.<.s ).(.[.[.(.(.(.(.[.[.(._.s ",
+" s s %.%.%.%.%.&.~.s ).(.[.[.[.(.(.[.[.[.(._.s ",
+" s s %.%.%.%.%.s ).(.(.[.[.[.[.[.[.(.(._.s ",
+" s s %.%.%.s ).(.(.(.[.[.[.[.(.(.(._.s ",
+" }.s s |.s ).(.(.(.[.[.[.[.(.(.(._.s ",
+" s s s ).(.(.[.[.[.[.[.[.(.(._.s ",
+" s ).(.[.[.[.(.(.[.[.[.(._.s ",
+" s ).(.[.[.(.(.(.(.[.[.(._.s ",
+" s ).(.(.(.(.(.(.(.(.(.(._.s ",
+" s !._._._._._._._._._._.1.s ",
+" s s s s s s s s s s s s "};
--- /dev/null
+/* XPM */
+static char * stock_outbox_xpm[] = {
+"24 24 69 1",
+" c None",
+". c #000000",
+"+ c #E66040",
+"@ c #EE937E",
+"# c #E55E3F",
+"$ c #E1431F",
+"% c #EC8770",
+"& c #F0A08E",
+"* c #F3B7A9",
+"= c #EF9985",
+"- c #E76749",
+"; c #ED8C75",
+"> c #F5BEB1",
+", c #F3B4A5",
+"' c #F4B8AA",
+") c #F1A593",
+"! c #E55B3B",
+"~ c #E45534",
+"{ c #F4BDB0",
+"] c #F4BAAC",
+"^ c #EF9C89",
+"/ c #E34E2B",
+"( c #C0391A",
+"_ c #8A2912",
+": c #3E3E3C",
+"< c #D4D3D2",
+"[ c #DB411D",
+"} c #F1A999",
+"| c #D23E1C",
+"1 c #812611",
+"2 c #C7C7C5",
+"3 c #ACABA8",
+"4 c #6A6966",
+"5 c #E9775D",
+"6 c #CECDCC",
+"7 c #A93217",
+"8 c #9B9A97",
+"9 c #494846",
+"0 c #9A9996",
+"a c #BBBBB9",
+"b c #747370",
+"c c #A5A4A1",
+"d c #AAA9A6",
+"e c #686765",
+"f c #7D7C79",
+"g c #686764",
+"h c #9C9B98",
+"i c #999895",
+"j c #ABAAA7",
+"k c #A9A8A5",
+"l c #AF3417",
+"m c #E55D3D",
+"n c #C5C5C3",
+"o c #8D8C89",
+"p c #626260",
+"q c #B2B1AE",
+"r c #A7A6A3",
+"s c #B4B4B2",
+"t c #C3C3C1",
+"u c #92918E",
+"v c #D1D0CF",
+"w c #373735",
+"x c #CACAC8",
+"y c #A8A7A4",
+"z c #CCCCCA",
+"A c #52514E",
+"B c #C8C8C6",
+"C c #B5B5B3",
+"D c #7E7D7A",
+" . ",
+" .. ",
+" .+. ",
+" ....@#. ",
+" .$%&*=@-. ",
+" .;>,')@@@!. ",
+" .~{]*^@@@@@-.",
+" ...@>/((((((_. ",
+" .:<.[}|((((((1. ",
+" ..234.5+(_...(1. ",
+" ..63444.@(7...._. ",
+" ..6344448.@(.90a.. ",
+".634444bcd.#$.eff.a.. ",
+".gh34bijkk.lm.iffff0a. ",
+".ggghniikdo..pddiffffq. ",
+".ggggghniikdkkkdddiffr. ",
+" ..ggggghniikdkkdddsta. ",
+" ..ggggghnurdkksvvw. ",
+" ..gggggxrdyzvA.. ",
+" ...gggB3qCA.. ",
+" ...gDv... ",
+" ..... ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char * mail_preview_xpm[] = {
+"24 24 151 2",
+" c None",
+". c #343434",
+"+ c #2D2D2D",
+"@ c #292929",
+"# c #262626",
+"$ c #2E2E2E",
+"% c #303030",
+"& c #737373",
+"* c #A1A1A1",
+"= c #B4B4B4",
+"- c #B2B2B2",
+"; c #9D9D9D",
+"> c #676767",
+", c #202020",
+"' c #1C1C1C",
+") c #272727",
+"! c #616161",
+"~ c #CACACA",
+"{ c #CFCFCF",
+"] c #D0D0D0",
+"^ c #CECECE",
+"/ c #C9C9C9",
+"( c #C1C1C1",
+"_ c #A7A7A7",
+": c #4C4C4C",
+"< c #131313",
+"[ c #222222",
+"} c #757575",
+"| c #D3D3D3",
+"1 c #DBDBDB",
+"2 c #E7E7E7",
+"3 c #EFEFEF",
+"4 c #F3F3F3",
+"5 c #F1F1F1",
+"6 c #E5E5E5",
+"7 c #D2D2D2",
+"8 c #BCBCBC",
+"9 c #5E5E5E",
+"0 c #101010",
+"a c #212121",
+"b c #5B5B5B",
+"c c #CCCCCC",
+"d c #D7D7D7",
+"e c #F5F5F5",
+"f c #FAFAFA",
+"g c #FBFBFB",
+"h c #F8F8F8",
+"i c #F0F0F0",
+"j c #E1E1E1",
+"k c #C2C2C2",
+"l c #434343",
+"m c #0F0F0F",
+"n c #1F1F1F",
+"o c #B9B9B9",
+"p c #D4D4D4",
+"q c #F7F7F7",
+"r c #F9F9F9",
+"s c #F6F6F6",
+"t c #EAEAEA",
+"u c #E2E2E2",
+"v c #ABABAB",
+"w c #0E0E0E",
+"x c #000000",
+"y c #111111",
+"z c #686868",
+"A c #9C9C9C",
+"B c #808080",
+"C c #8E8E8E",
+"D c #919191",
+"E c #929292",
+"F c #949494",
+"G c #939393",
+"H c #8B8B8B",
+"I c #838383",
+"J c #A3A3A3",
+"K c #555555",
+"L c #080808",
+"M c #535353",
+"N c #333333",
+"O c #AFAFAF",
+"P c #E6E6E6",
+"Q c #FDFDFD",
+"R c #FEFEFE",
+"S c #FCFCFC",
+"T c #A8A8A8",
+"U c #8D8D8D",
+"V c #050505",
+"W c #EEEEEE",
+"X c #A6A6A6",
+"Y c #C8C8C8",
+"Z c #FFFFFF",
+"` c #B6B6B6",
+" . c #F4F4F4",
+".. c #F2F2F2",
+"+. c #A9A9A9",
+"@. c #040404",
+"#. c #2A2A2A",
+"$. c #AAAAAA",
+"%. c #ECECEC",
+"&. c #A5A5A5",
+"*. c #C7C7C7",
+"=. c #D8D8D8",
+"-. c #CDCDCD",
+";. c #858585",
+">. c #010101",
+",. c #606060",
+"'. c #646464",
+"). c #C3C3C3",
+"!. c #DADADA",
+"~. c #494949",
+"{. c #ADADAD",
+"]. c #0A0A0A",
+"^. c #BABABA",
+"/. c #DCDCDC",
+"(. c #989898",
+"_. c #E9E9E9",
+":. c #EBEBEB",
+"<. c #A4A4A4",
+"[. c #B7B7B7",
+"}. c #D1D1D1",
+"|. c #414141",
+"1. c #3D3D3D",
+"2. c #969696",
+"3. c #A0A0A0",
+"4. c #BEBEBE",
+"5. c #D9D9D9",
+"6. c #C5C5C5",
+"7. c #515151",
+"8. c #C0C0C0",
+"9. c #959595",
+"0. c #DDDDDD",
+"a. c #484848",
+"b. c #030303",
+"c. c #454545",
+"d. c #060606",
+"e. c #B5B5B5",
+"f. c #C6C6C6",
+"g. c #C4C4C4",
+"h. c #A2A2A2",
+"i. c #828282",
+"j. c #1E1E1E",
+"k. c #191919",
+"l. c #7C7C7C",
+"m. c #E4E4E4",
+"n. c #9E9E9E",
+"o. c #525252",
+"p. c #B0B0B0",
+"q. c #6C6C6C",
+"r. c #565656",
+"s. c #797979",
+"t. c #3A3A3A",
+" ",
+" ",
+" . + @ # # # ",
+" $ % & * = - ; > , ' ",
+" ) ! = ~ { ] ^ / ( _ : < ",
+" [ } ~ | 1 2 3 4 5 6 7 8 9 0 ",
+" a b c d 6 e f g f h e i j k l m ",
+" n o p 6 q r g g f r s i t u v w ",
+" x y z A B C D E F F G G D C H I J K L ",
+"x M N O P e r g Q R R Q S f h e i T U V ",
+"x W y ~ t 5 q q g r S r f q e i X Y _ V ",
+"x Z y ` t 3 4 e s q q q s ...+.~ ] J @. ",
+"x Z #.$.v %.i .. .e e e 4 5 &.*.=.-.;.>. ",
+"x Z ,.'.1 ; %.3 i 5 5 i i T ).=.!./ ~.x ",
+"x Z {.].^./.(._.:.%.%.%.<.[.}.!.p &.>. ",
+"x Z /.|.1.7 +.2.6 6 6 3.$.4.=.5.).% x ",
+"x Z e 6.L 7.8.( 9.0.(.= Y J ).( a.b.x ",
+"x Z g d c.d.. 3.( F e.8.~ f.U + b.].x x ",
+"x Z e & ^.g.1.b.a.I h.&.i.l x j.[.k.x x x ",
+"x Z l.p m.m.Y n.o.j.b.b.j.o.n.p.q.O j.n x x ",
+"x & 8 8 8 8 8 8 &.&.&.&.&.&.&.8 8 r.x > N x x ",
+" x x x x x x x x x x x x x x x x x x x s.t.x x ",
+" x z n x ",
+" x x "};
--- /dev/null
+/* XPM */
+static char * stock_mail_reply_to_all_xpm[] = {
+"24 24 149 2",
+" c None",
+". c #000000",
+"+ c #ADA99C",
+"@ c #E6E1D0",
+"# c #F0EAD9",
+"$ c #A9A598",
+"% c #141416",
+"& c #161618",
+"* c #080809",
+"= c #DBD6C7",
+"- c #1B1B1C",
+"; c #050505",
+"> c #5A5A5A",
+", c #676767",
+"' c #020202",
+") c #807D76",
+"! c #D49A3E",
+"~ c #D2973B",
+"{ c #040402",
+"] c #6D6B6B",
+"^ c #7A7979",
+"/ c #030100",
+"( c #040100",
+"_ c #282724",
+": c #DD9831",
+"< c #DA962F",
+"[ c #1A0E01",
+"} c #BC6D1B",
+"| c #BE6E13",
+"1 c #BE6D13",
+"2 c #BD6C13",
+"3 c #3E3C36",
+"4 c #D69029",
+"5 c #D18D27",
+"6 c #737067",
+"7 c #110900",
+"8 c #CF791C",
+"9 c #CE791C",
+"0 c #CD761A",
+"a c #C47013",
+"b c #4A4136",
+"c c #A0731E",
+"d c #96691A",
+"e c #000100",
+"f c #291703",
+"g c #BA6613",
+"h c #8C4E0D",
+"i c #844A0D",
+"j c #BF6D13",
+"k c #1F2A0D",
+"l c #306220",
+"m c #4F7242",
+"n c #448D44",
+"o c #2E802E",
+"p c #3A6F3A",
+"q c #FFFFFF",
+"r c #535353",
+"s c #171009",
+"t c #AC600C",
+"u c #713F0A",
+"v c #693A0A",
+"w c #AA5F0A",
+"x c #192B10",
+"y c #275926",
+"z c #68A769",
+"A c #358A36",
+"B c #2D812D",
+"C c #FBFBFB",
+"D c #F7F7F7",
+"E c #FAFAFA",
+"F c #F5F5F5",
+"G c #4F4F4F",
+"H c #AEAEAE",
+"I c #141517",
+"J c #6F767C",
+"K c #534C46",
+"L c #241609",
+"M c #23180E",
+"N c #484644",
+"O c #354A4D",
+"P c #050B07",
+"Q c #4F7E4F",
+"R c #399239",
+"S c #2D852D",
+"T c #297F29",
+"U c #ACACAC",
+"V c #C8C8C8",
+"W c #151618",
+"X c #6C7C8B",
+"Y c #728EA9",
+"Z c #5D6B78",
+"` c #C8CBCD",
+" . c #C3C7CD",
+".. c #8090A2",
+"+. c #5A728B",
+"@. c #4E6479",
+"#. c #111714",
+"$. c #328732",
+"%. c #2B7F2C",
+"&. c #2B772C",
+"*. c #434343",
+"=. c #A0A0A0",
+"-. c #D4D4D4",
+";. c #25282A",
+">. c #8A9EB4",
+",. c #6A86A1",
+"'. c #596A7C",
+"). c #DDE1E4",
+"!. c #DCE2E7",
+"~. c #899CAC",
+"{. c #687E96",
+"]. c #546D87",
+"^. c #10161D",
+"/. c #8C8C8C",
+"(. c #959595",
+"_. c #E4E4E4",
+":. c #23282D",
+"<. c #8096AB",
+"[. c #5D7996",
+"}. c #53687D",
+"|. c #CDD3D9",
+"1. c #CBD2DC",
+"2. c #899BAB",
+"3. c #CCD4DC",
+"4. c #5C748C",
+"5. c #111820",
+"6. c #4D4D4D",
+"7. c #818181",
+"8. c #C6C6C6",
+"9. c #1F252B",
+"0. c #6B8197",
+"a. c #536D89",
+"b. c #4A5D6F",
+"c. c #81919F",
+"d. c #8293A4",
+"e. c #5A7087",
+"f. c #496481",
+"g. c #445D79",
+"h. c #0E151B",
+"i. c #6A6A6A",
+"j. c #0E141A",
+"k. c #0D1319",
+"l. c #0E141B",
+"m. c #0E131A",
+"n. c #0F141A",
+"o. c #636363",
+"p. c #737373",
+"q. c #7C7C7C",
+"r. c #BCBCBC",
+" ",
+" . . ",
+" + @ # $ . ",
+" % & * = # # # . ",
+" - ; > , ' ) ! ~ # . ",
+" { ] ^ / ( _ : < # . ",
+" [ } | 1 2 3 4 5 # 6 ",
+" 7 8 9 0 a b c d # # . e . . . . . . ",
+" f g h i j k l m n o p . q q q q q r . ",
+" s t u v w x y z A o B . C D E F G H . ",
+" I J K L M N O P Q R S T . F F F G U V . ",
+" W X Y Z ` ...+.@.#.$.%.&.. F F *.=.-.V . ",
+" ;.>.,.'.).!.~.{.].^.. . . /.F G (.-._.V . ",
+" :.<.[.}.|.1.2.3.4.5.F F F F 6.7.8._._.V . ",
+" 9.0.a.b.c.d.e.f.g.h.F F F G i.=._.F _.V . ",
+" j.k.l.l.l.j.m.n.o.G F G (.8.p.8.F _.V . ",
+" . q C F o.8.F _.-.G U 8._.F q._._.V . ",
+" . q F p.-.F F F F _._.F F F F q._.V . ",
+" . q q.-._._._._._._._._._._._._.q.V . ",
+" . p.r.r.r.r.r.r.r.r.r.r.r.r.r.r.r.o.. ",
+" . . . . . . . . . . . . . . . . . . ",
+" ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char * stock_mail_reply_xpm[] = {
+"24 24 67 1",
+" c None",
+". c #000000",
+"+ c #535353",
+"@ c #FFFFFF",
+"# c #FEFEFE",
+"$ c #FDFDFD",
+"% c #FCFCFC",
+"& c #FBFBFB",
+"* c #F9F9F9",
+"= c #F8F8F8",
+"- c #F7F7F7",
+"; c #F6F6F6",
+"> c #F5F5F5",
+", c #F4F4F4",
+"' c #E3E3E3",
+") c #EEEEEE",
+"! c #4F4F4F",
+"~ c #F3F3F3",
+"{ c #F2F2F2",
+"] c #F1F1F1",
+"^ c #F0F0F0",
+"/ c #EFEFEF",
+"( c #EDEDED",
+"_ c #AEAEAE",
+": c #E4E4E4",
+"< c #434343",
+"[ c #ACACAC",
+"} c #C8C8C8",
+"| c #A0A0A0",
+"1 c #D4D4D4",
+"2 c #ECECEC",
+"3 c #959595",
+"4 c #3E3E3E",
+"5 c #4D4D4D",
+"6 c #818181",
+"7 c #C6C6C6",
+"8 c #3D1A13",
+"9 c #6A6A6A",
+"0 c #636363",
+"a c #B9B9B9",
+"b c #737373",
+"c c #EAC0BA",
+"d c #7C7C7C",
+"e c #DF9E95",
+"f c #E0A198",
+"g c #E1A59D",
+"h c #E2A79E",
+"i c #E3ABA3",
+"j c #E3AAA2",
+"k c #CC6253",
+"l c #DD978D",
+"m c #DF9F97",
+"n c #DE9A90",
+"o c #DD968C",
+"p c #DD948A",
+"q c #B14334",
+"r c #BCBCBC",
+"s c #431913",
+"t c #EAC2BC",
+"u c #DF9C92",
+"v c #DD998F",
+"w c #B54535",
+"x c #65261D",
+"y c #983A2C",
+"z c #7C2F24",
+"A c #63251D",
+"B c #6C291F",
+" ",
+" ",
+" ",
+" ................. ",
+" .+@@@@#$%&*=-;>,'+. ",
+" .)!@>,~{{]^^/)('!_. ",
+" .@:<$~{{]^/))('![}. ",
+" .@>:!&]^^/)(('<|1}. ",
+" .@&>:<=^/)(2'!31:}. ",
+" .@>>>:4>)(2'567::}. ",
+" .@&8>:9<~2'!977>:}. ",
+" .@..:0@a!^!37b7>:}. ",
+" ..c.0@>:1![7::d::}. ",
+" .ce.......:>>>:d:}. ",
+" .cfghihjek.::::::d}. ",
+" .clmenoonpq.rrrrrrr0. ",
+"stnuvvlnnnnw.......... ",
+" .xyyyyyyyyz. ",
+" .xyyAAAAAB. ",
+" .xy....... ",
+" .x. ",
+" .. ",
+" . ",
+" "};
--- /dev/null
+/* XPM */
+static char * stock_mail_handling_xpm[] = {
+"24 24 72 1",
+" c None",
+". c #000000",
+"+ c #BCBCBC",
+"@ c #FFFFFF",
+"# c #535353",
+"$ c #EEEEEE",
+"% c #4F4F4F",
+"& c #F5F5F5",
+"* c #FBFBFB",
+"= c #F7F7F7",
+"- c #FAFAFA",
+"; c #AEAEAE",
+"> c #E4E4E4",
+", c #434343",
+"' c #ACACAC",
+") c #C8C8C8",
+"! c #A0A0A0",
+"~ c #D4D4D4",
+"{ c #959595",
+"] c #3E3E3E",
+"^ c #4D4D4D",
+"/ c #818181",
+"( c #C6C6C6",
+"_ c #6A6A6A",
+": c #636363",
+"< c #B9B9B9",
+"[ c #737373",
+"} c #010101",
+"| c #AAAAAA",
+"1 c #0B0B0B",
+"2 c #0C0C0C",
+"3 c #060606",
+"4 c #E4E3E1",
+"5 c #050505",
+"6 c #B3B3B1",
+"7 c #484641",
+"8 c #9F9D96",
+"9 c #888781",
+"0 c #7C7C7C",
+"a c #B0AFAD",
+"b c #A8A7A1",
+"c c #908E86",
+"d c #97958E",
+"e c #807D74",
+"f c #969696",
+"g c #090909",
+"h c #595854",
+"i c #605E57",
+"j c #898883",
+"k c #76746B",
+"l c #43423F",
+"m c #282724",
+"n c #363430",
+"o c #6D6B63",
+"p c #E2E2E1",
+"q c #B6B5AF",
+"r c #21201E",
+"s c #0A0908",
+"t c #181816",
+"u c #E6E6E4",
+"v c #65635C",
+"w c #161614",
+"x c #8C8B89",
+"y c #DFDEDC",
+"z c #B0AFA9",
+"A c #D5D4D1",
+"B c #93918B",
+"C c #D6D5D2",
+"D c #ABA9A3",
+"E c #5D5C55",
+"F c #494943",
+"G c #42413C",
+" ",
+" ................. ",
+" .+@@@@@@@@@@@@@@@#. ",
+" .$%&*&*=*&*&*=-&%;. ",
+" .@>,&&&&&&&&&&&%'). ",
+" .@&>%&&&&&&&&&,!~). ",
+" .@*&>,&&&&&&&%{~>). ",
+" .@&&&>]&&&&&^/(>>). ",
+" .@*&&&_,&&&%_!>&>). ",
+" .@&&&:<<%&%{([(}}}. ",
+" .@*&:(&>~%'|12:345... ",
+" .@&[~&&&&>>2>62787.9.. ",
+" .@0~>>>>>>>1ab888cde7. ",
+" .[+++++++++fg88hijek. ",
+" ...........78ilmn8o7..",
+" .pq8hrstuevi.",
+" ..78jnwxyv7..",
+" .zequABv. ",
+" .CD8eekkE7. ",
+" ..h.7k7.F.. ",
+" .. .G. .. ",
+" ... ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char * mail_save_xpm[] = {
+"24 24 264 2",
+" c None",
+". c #000000",
+"+ c #141414",
+"@ c #262626",
+"# c #212121",
+"$ c #1F1F1F",
+"% c #1E1E1E",
+"& c #1D1D1D",
+"* c #202020",
+"= c #232323",
+"- c #292929",
+"; c #171717",
+"> c #121212",
+", c #B8B8B8",
+"' c #FFFFFF",
+") c #A8A8A8",
+"! c #0E0E0E",
+"~ c #595959",
+"{ c #444444",
+"] c #4F4F4F",
+"^ c #050505",
+"/ c #222222",
+"( c #3D3D3D",
+"_ c #FEFEFE",
+": c #FCFCFC",
+"< c #FDFDFD",
+"[ c #CACACA",
+"} c #191919",
+"| c #B3B1B0",
+"1 c #EEECEB",
+"2 c #F0DCAA",
+"3 c #E5C470",
+"4 c #DFB84F",
+"5 c #8A681F",
+"6 c #100E09",
+"7 c #FBFBFB",
+"8 c #515151",
+"9 c #F0F0F0",
+"0 c #D6D6D6",
+"a c #EEECE9",
+"b c #E6D498",
+"c c #EED682",
+"d c #EED680",
+"e c #E3C15E",
+"f c #D29815",
+"g c #976E15",
+"h c #7F5B0A",
+"i c #1C190F",
+"j c #D9D9D9",
+"k c #424242",
+"l c #F1F1F1",
+"m c #F3F3F3",
+"n c #EBE9E5",
+"o c #CBB771",
+"p c #735817",
+"q c #C6A546",
+"r c #E3C05D",
+"s c #BC8710",
+"t c #AD7C10",
+"u c #6B6B6B",
+"v c #A0A0A0",
+"w c #535353",
+"x c #505050",
+"y c #AE9C5C",
+"z c #292928",
+"A c #CECDCA",
+"B c #CAC9C7",
+"C c #1A1917",
+"D c #9C7E2B",
+"E c #AB7C12",
+"F c #242012",
+"G c #555555",
+"H c #DEDEDE",
+"I c #E8E8E8",
+"J c #3B3B3B",
+"K c #D7D6D6",
+"L c #656462",
+"M c #DAD9D7",
+"N c #E1E0DF",
+"O c #1A1A19",
+"P c #3D351F",
+"Q c #A37819",
+"R c #231F13",
+"S c #282828",
+"T c #898989",
+"U c #EFEFEF",
+"V c #FAFAFA",
+"W c #E8E7E6",
+"X c #8B8B8A",
+"Y c #0B0B06",
+"Z c #A97C1A",
+"` c #1B1B1B",
+" . c #C9C9C9",
+".. c #DFDFDF",
+"+. c #EBEBEB",
+"@. c #ECECEC",
+"#. c #E1E1E1",
+"$. c #221E11",
+"%. c #EAE8E3",
+"&. c #C58F13",
+"*. c #B68411",
+"=. c #826321",
+"-. c #302C19",
+";. c #131313",
+">. c #1A1A1A",
+",. c #161616",
+"'. c #151515",
+"). c #181818",
+"!. c #1B1B1A",
+"~. c #141413",
+"{. c #363220",
+"]. c #916F25",
+"^. c #322F1E",
+"/. c #98B4C8",
+"(. c #25313B",
+"_. c #A9CCE0",
+":. c #545A68",
+"<. c #BC6A60",
+"[. c #AD5A51",
+"}. c #A4574D",
+"|. c #2B2719",
+"1. c #353120",
+"2. c #5A4D51",
+"3. c #6E8DA2",
+"4. c #0C1820",
+"5. c #BAE5FF",
+"6. c #696E6F",
+"7. c #F9F9F9",
+"8. c #EBEBEA",
+"9. c #937025",
+"0. c #CDCAC1",
+"a. c #73726E",
+"b. c #7496AF",
+"c. c #0A131A",
+"d. c #BAE0FD",
+"e. c #6A6E71",
+"f. c #ECEDEC",
+"g. c #DEDFDF",
+"h. c #DBDDDD",
+"i. c #D8DBDB",
+"j. c #CDCFCF",
+"k. c #312E1B",
+"l. c #2F2C19",
+"m. c #B2B3B0",
+"n. c #C0C0BE",
+"o. c #6F6D6B",
+"p. c #7C9FBB",
+"q. c #050F15",
+"r. c #B7DDFC",
+"s. c #54575A",
+"t. c #F4F4F3",
+"u. c #ECECEB",
+"v. c #F3F3F2",
+"w. c #7F7D7A",
+"x. c #7EA0BB",
+"y. c #020A10",
+"z. c #B1D7F7",
+"A. c #FDFCFB",
+"B. c #EFEFEE",
+"C. c #EDEDEC",
+"D. c #EBECEB",
+"E. c #EBECEC",
+"F. c #F7F7F6",
+"G. c #7D7977",
+"H. c #7F9FB9",
+"I. c #050B0E",
+"J. c #B3DDF7",
+"K. c #685050",
+"L. c #847F7C",
+"M. c #7E9DB7",
+"N. c #0A0B0C",
+"O. c #A9D3F0",
+"P. c #7B99AB",
+"Q. c #6B6E70",
+"R. c #63696C",
+"S. c #60666B",
+"T. c #5E6569",
+"U. c #555E67",
+"V. c #5D6267",
+"W. c #61676B",
+"X. c #64696D",
+"Y. c #62666A",
+"Z. c #6B747E",
+"`. c #7D9CB4",
+" + c #000508",
+".+ c #A8CBED",
+"++ c #7498B7",
+"@+ c #6F92B0",
+"#+ c #3F5160",
+"$+ c #4A5E70",
+"%+ c #566E82",
+"&+ c #4D6779",
+"*+ c #52697C",
+"=+ c #52697A",
+"-+ c #54687A",
+";+ c #455E70",
+">+ c #7697B4",
+",+ c #92A9BC",
+"'+ c #000205",
+")+ c #A8CEEB",
+"!+ c #7196B3",
+"~+ c #4D5152",
+"{+ c #D7D2CB",
+"]+ c #F1EEEA",
+"^+ c #FAF8F5",
+"/+ c #F9F8F5",
+"(+ c #E8E4DF",
+"_+ c #D8D4CD",
+":+ c #9D968B",
+"<+ c #425563",
+"[+ c #446783",
+"}+ c #A7C4DA",
+"|+ c #000101",
+"1+ c #A5CDEA",
+"2+ c #7196B1",
+"3+ c #57595C",
+"4+ c #534F46",
+"5+ c #2E281F",
+"6+ c #CAC7C2",
+"7+ c #C9C4BD",
+"8+ c #C2BBB1",
+"9+ c #E3E0DC",
+"0+ c #314353",
+"a+ c #40647C",
+"b+ c #B6C9DA",
+"c+ c #A3CDEB",
+"d+ c #7695B1",
+"e+ c #525455",
+"f+ c #474239",
+"g+ c #3B372D",
+"h+ c #C0BCB5",
+"i+ c #C7C2BA",
+"j+ c #E2DFD9",
+"k+ c #F8F6F3",
+"l+ c #344652",
+"m+ c #406479",
+"n+ c #A6C3DA",
+"o+ c #010000",
+"p+ c #708798",
+"q+ c #6A8DA7",
+"r+ c #4F5052",
+"s+ c #F7F2EC",
+"t+ c #59534B",
+"u+ c #57524A",
+"v+ c #C1BCB4",
+"w+ c #EBE9E4",
+"x+ c #FFFFFD",
+"y+ c #30414E",
+"z+ c #415C6F",
+"A+ c #A2C4DC",
+"B+ c #020000",
+"C+ c #030406",
+"D+ c #141A1F",
+"E+ c #151718",
+"F+ c #35332F",
+"G+ c #393634",
+"H+ c #41403E",
+"I+ c #3F3E3D",
+"J+ c #454344",
+"K+ c #434241",
+"L+ c #312F2C",
+"M+ c #02070A",
+"N+ c #070E12",
+"O+ c #465A69",
+". + @ # $ % & & & % * = - ; . ",
+"> , ' ' ' ' ' ' ' ' ' ' ' ) ! ",
+"@ ' ~ ' ' ' ' ' ' ' ' ' { ] ^ . . . ",
+"/ ' ' ( ' _ : < < ' [ } | 1 2 3 4 5 . 6 ",
+"* ' ' 7 8 9 < 7 _ 0 @ a b c d d e f g h i ",
+"$ ' ' ' j k l : m $ n o . . . p q r s t i ",
+"* ' ' ' u v w ' x . y z A B C D d f E F ",
+"/ ' ' G H 7 I J , K > L M N O P d f Q R ",
+"S ' T U ' ' ' _ V ' < W X Y . . . d f Z . . . ",
+"` ...U +.+.+.@.@.+.@.+.#.$.%.d d d f &.*.=.-.. ",
+". ;.>.; ,.'.'.'.'.'.,.).!.~.{.%.d d f f ].^./.(.",
+" . _.:.<.[.}.|.%.d f ].1.2.3.4.",
+" . 5.6.' ' 7.8.-.%.9.^.0.a.b.c.",
+" . d.e.f.g.h.i.j.k.l.m.n.o.p.q.",
+" . r.s.' ' ' ' ' ' t.u.v.w.x.y.",
+" . z.6.A.B.C.D.+.E.C.U F.G.H.I.",
+" . J.K.' ' ' ' ' ' ' ' ' L.M.N.",
+" . O.P.Q.R.S.T.U.V.W.X.Y.Z.`. +",
+" . .+++@+#+$+%+&+*+=+-+;+>+,+'+",
+" . )+!+~+{+]+^+/+(+_+:+<+[+}+|+",
+" . 1+2+3+' 4+5+6+7+8+9+0+a+b+. ",
+" . c+d+e+' f+g+h+i+j+k+l+m+n+o+",
+" . p+q+r+s+t+u+v+w+x+]+y+z+A+B+",
+" C+D+E+F+G+H+I+J+K+L+M+N+O+. "};
--- /dev/null
+/* XPM */
+static char * stock_mail_send_xpm[] = {
+"24 24 58 1",
+" c None",
+". c #4F3F0A",
+"+ c #000000",
+"@ c #F4E6B5",
+"# c #F4E5B3",
+"$ c #EDD684",
+"% c #755F10",
+"& c #EDD580",
+"* c #EED685",
+"= c #AF8D18",
+"- c #EFD98C",
+"; c #EED88B",
+"> c #EDD582",
+", c #EED889",
+"' c #EFDA92",
+") c #F0DB93",
+"! c #735D10",
+"~ c #535353",
+"{ c #FFFFFF",
+"] c #F0DC97",
+"^ c #F6F6F6",
+"/ c #F5F5F5",
+"( c #F4F4F4",
+"_ c #E3E3E3",
+": c #EEEEEE",
+"< c #4F4F4F",
+"[ c #EDD37C",
+"} c #EDEDED",
+"| c #AEAEAE",
+"1 c #E4E4E4",
+"2 c #434343",
+"3 c #FDFDFD",
+"4 c #F3F3F3",
+"5 c #E4BF3D",
+"6 c #CBA41C",
+"7 c #D1A81C",
+"8 c #907413",
+"9 c #7C6411",
+"0 c #ACACAC",
+"a c #C8C8C8",
+"b c #FBFBFB",
+"c c #A0A0A0",
+"d c #D4D4D4",
+"e c #F8F8F8",
+"f c #F0F0F0",
+"g c #EFEFEF",
+"h c #ECECEC",
+"i c #959595",
+"j c #3E3E3E",
+"k c #4D4D4D",
+"l c #818181",
+"m c #C6C6C6",
+"n c #6A6A6A",
+"o c #636363",
+"p c #B9B9B9",
+"q c #737373",
+"r c #7C7C7C",
+"s c #BCBCBC",
+" ",
+" . ",
+" +@+ ",
+" +#$%+ ",
+" +#&*=%+ ",
+" +#-;>==%+ ",
+" +#,',>===%+ ",
+" ++++++)$&=!++++++ ",
+" +~{{{{+]$$=!+^/(_~+ ",
+" +:<{/(+,[$=!+:}_<|+ ",
+" +{1234+56789+}_<0a+ ",
+" +{/1<b+++++++_2cda+ ",
+" +{b/12efg:}h_<id1a+ ",
+" +{///1j/:}h_klm11a+ ",
+" +{b//1n24h_<nmm/1a+ ",
+" +{//1o{p<f<imqm/1a+ ",
+" +{b1o{/1d<0m11r11a+ ",
+" +{1q{////11///1r1a+ ",
+" +{r{111111111111ra+ ",
+" +qssssssssssssssso+ ",
+" ++++++++++++++++++ ",
+" ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char * stock_spam_xpm[] = {
+"24 24 190 2",
+" c None",
+". c #1D1E1E",
+"+ c #333839",
+"@ c #393F40",
+"# c #171819",
+"$ c #B2B8B9",
+"% c #D5E3E7",
+"& c #AABABD",
+"* c #64696A",
+"= c #0C0D0D",
+"- c #929C9E",
+"; c #E7F0F3",
+"> c #EDF0F1",
+", c #E5EDEF",
+"' c #C5D9DD",
+") c #2E3132",
+"! c #3F4343",
+"~ c #1F2121",
+"{ c #DFEBEE",
+"] c #B7C4C8",
+"^ c #D2D9DA",
+"/ c #E1EFF2",
+"( c #B6CBCF",
+"_ c #3C4547",
+": c #1E2223",
+"< c #191E1F",
+"[ c #2D2E2F",
+"} c #191A1A",
+"| c #252829",
+"1 c #7E8E92",
+"2 c #B7C2C3",
+"3 c #C3D9DD",
+"4 c #9CACB0",
+"5 c #C3CDCE",
+"6 c #C7E1E7",
+"7 c #668F97",
+"8 c #90ACB2",
+"9 c #CDDDE1",
+"0 c #485559",
+"a c #88A6AC",
+"b c #1F2223",
+"c c #3F4545",
+"d c #242728",
+"e c #313B3E",
+"f c #A8C2C8",
+"g c #B2BDC0",
+"h c #CFE5E9",
+"i c #C2D9DE",
+"j c #81989C",
+"k c #A2C0C5",
+"l c #85A9B1",
+"m c #E5ECEE",
+"n c #E7F2F4",
+"o c #9BAEB3",
+"p c #C8E1E7",
+"q c #3A3E3F",
+"r c #0C0E0E",
+"s c #000000",
+"t c #333737",
+"u c #B3C2C5",
+"v c #DDEDF0",
+"w c #D8E4E6",
+"x c #DAECEF",
+"y c #D5E9ED",
+"z c #D2E7EC",
+"A c #95ADB2",
+"B c #DBE2E2",
+"C c #EDEFF0",
+"D c #A2B1B3",
+"E c #8FA4A8",
+"F c #D7E2E5",
+"G c #798F94",
+"H c #151819",
+"I c #F3B5A7",
+"J c #865E55",
+"K c #AFB9BB",
+"L c #F1F8F9",
+"M c #F7FBFB",
+"N c #D9EBEF",
+"O c #ECF4F6",
+"P c #F3F7F7",
+"Q c #E9F2F4",
+"R c #EEF2F3",
+"S c #E9EDEE",
+"T c #C5C8C9",
+"U c #C2C6C8",
+"V c #E0E7E7",
+"W c #DDEAED",
+"X c #7A9DA5",
+"Y c #EB8169",
+"Z c #B83618",
+"` c #924E3C",
+" . c #9FA5A6",
+".. c #E3EEF0",
+"+. c #ECF5F7",
+"@. c #D6EAED",
+"#. c #CBE4E9",
+"$. c #D9E7E9",
+"%. c #E1EBED",
+"&. c #B8CBD0",
+"*. c #BDCBCF",
+"=. c #ABB3B5",
+"-. c #E3E5E5",
+";. c #DCEBEF",
+">. c #6A979F",
+",. c #131819",
+"'. c #B43518",
+"). c #E76A4D",
+"!. c #B53F24",
+"~. c #CB705A",
+"{. c #C4D8DB",
+"]. c #D2E6E9",
+"^. c #CAE3E8",
+"/. c #A9C8CF",
+"(. c #7FA4AA",
+"_. c #82B4BE",
+":. c #E2EFF0",
+"<. c #D3E7EA",
+"[. c #AFD5DE",
+"}. c #C7E2E7",
+"|. c #E7F1F2",
+"1. c #97C3CB",
+"2. c #637F86",
+"3. c #191311",
+"4. c #EF9985",
+"5. c #F1A897",
+"6. c #E76547",
+"7. c #C58B7D",
+"8. c #A8ABAC",
+"9. c #70A1AB",
+"0. c #88B5BE",
+"a. c #95C7D1",
+"b. c #ADD4DC",
+"c. c #DCEAEF",
+"d. c #B5D8E0",
+"e. c #CAE4E9",
+"f. c #95BEC6",
+"g. c #6696A0",
+"h. c #585857",
+"i. c #51190C",
+"j. c #D9401D",
+"k. c #EC8A74",
+"l. c #E17055",
+"m. c #DD8D7A",
+"n. c #D8E7EA",
+"o. c #D8E9ED",
+"p. c #D6EAEE",
+"q. c #D9EBEE",
+"r. c #E4F0F3",
+"s. c #CFE3E8",
+"t. c #5B94A0",
+"u. c #5C7E85",
+"v. c #3D221D",
+"w. c #782310",
+"x. c #EA7A60",
+"y. c #E5A293",
+"z. c #EBD9D5",
+"A. c #C6D3D6",
+"B. c #799FA8",
+"C. c #558C98",
+"D. c #45686E",
+"E. c #27201F",
+"F. c #5D3228",
+"G. c #B86F5D",
+"H. c #F1A593",
+"I. c #E58D78",
+"J. c #C0C0C1",
+"K. c #32464B",
+"L. c #4A6E75",
+"M. c #282121",
+"N. c #4A2E27",
+"O. c #C6968B",
+"P. c #DDA89B",
+"Q. c #5F1C0D",
+"R. c #F2AFA0",
+"S. c #A36F63",
+"T. c #341C17",
+"U. c #301A15",
+"V. c #674C45",
+"W. c #E4AEA1",
+"X. c #8D2A13",
+"Y. c #030505",
+"Z. c #A2432E",
+"`. c #E4A799",
+" + c #D97C67",
+".+ c #B66A59",
+"++ c #B26C5C",
+"@+ c #882812",
+"#+ c #DB411D",
+"$+ c #F4BAAC",
+" ",
+" ",
+" ",
+" ",
+" . + @ ",
+" # $ % & * . ",
+" = - ; > , ' ) ! ",
+" ~ { ] ^ / ( _ : < [ } ",
+" | 1 2 3 4 5 6 7 8 9 0 a b ",
+" c d e f g h i j k l m n o p q r ",
+" s t u v w / x y z A B C D E F G H ",
+" s s I J K L M N O P Q R S T U V W X < ",
+"s I Y Z ` ...+.@.#.$.%.h &.*.=.-.;.>.,.s ",
+"s '.).Y !.~.{.].^./.(._.:.<.[.}.|.1.2.3.4.s ",
+"s '.'.'.).5.6.7.8.9.0.a.b.c.d.e.f.g.h.i.j.k.s ",
+"s '.'.'.'.'.).5.l.m.n.o.p.q.r.s.t.u.v.w.j.x.s ",
+" s s '.'.'.'.'.).5.6.y.z.A.B.C.D.E.F.G.H.4.s ",
+" s s '.'.'.'.'.).5.I.J.K.L.M.N.O.P.Q.s ",
+" s s '.'.'.'.'.R.S.T.U.V.W.X.s s ",
+" Y.s s Z.'.'.`. +.+++@+s s ",
+" s s s '.#+$+s s s ",
+" s s s s s ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char * new_xpm[] = {
+"24 24 127 2",
+" c None",
+". c #000000",
+"+ c #D3D3D3",
+"@ c #F6F6F6",
+"# c #FFFFFF",
+"$ c #F9F9F9",
+"% c #DADADA",
+"& c #585858",
+"* c #C7C7C7",
+"= c #D1D1D1",
+"- c #D6D6D6",
+"; c #FEFEFE",
+"> c #FDFDFD",
+", c #C0C0C0",
+"' c #E1E1E1",
+") c #F0F0F0",
+"! c #9B9B9B",
+"~ c #FCFCFB",
+"{ c #FBFBFB",
+"] c #AFAFAE",
+"^ c #E9E9E9",
+"/ c #DFDFDF",
+"( c #8F8F8F",
+"_ c #FAFAF9",
+": c #F9F9F8",
+"< c #A4A4A3",
+"[ c #F4F4F4",
+"} c #CFCFCF",
+"| c #A2A2A2",
+"1 c #F8F8F7",
+"2 c #F8F7F6",
+"3 c #9E9E9E",
+"4 c #F7F6F5",
+"5 c #F6F6F4",
+"6 c #F4F3F2",
+"7 c #DEDDDC",
+"8 c #D3D2D0",
+"9 c #B7B7B5",
+"0 c #9F9E9D",
+"a c #706F6F",
+"b c #65625A",
+"c c #F5F4F3",
+"d c #F2F2F0",
+"e c #E4E4E2",
+"f c #DAD9D7",
+"g c #D8D8D6",
+"h c #CDCCCA",
+"i c #AFAEAC",
+"j c #88847B",
+"k c #F3F3F1",
+"l c #EFEFED",
+"m c #EEEDEB",
+"n c #EDECEA",
+"o c #E9E8E6",
+"p c #D5D4D3",
+"q c #C4C3C2",
+"r c #8F8A81",
+"s c #F6F5F4",
+"t c #F5F5F3",
+"u c #F1F1EF",
+"v c #F1F0EE",
+"w c #ECEBE9",
+"x c #EAE9E7",
+"y c #E5E4E2",
+"z c #E4E3E0",
+"A c #D2D1CE",
+"B c #8D887E",
+"C c #F3F2F1",
+"D c #F0F0EE",
+"E c #F0EFED",
+"F c #EFEEEC",
+"G c #E8E7E5",
+"H c #E5E4E1",
+"I c #E2E1DE",
+"J c #E1DFDC",
+"K c #979288",
+"L c #A49E93",
+"M c #E8E7E4",
+"N c #E7E6E3",
+"O c #E3E2DF",
+"P c #E2E0DD",
+"Q c #E1E0DC",
+"R c #E0DFDB",
+"S c #A19C90",
+"T c #EDEDEB",
+"U c #EBEAE8",
+"V c #E9E8E5",
+"W c #E6E4E1",
+"X c #E3E2DE",
+"Y c #DFDEDA",
+"Z c #DEDDD9",
+"` c #DDDCD8",
+" . c #A19B90",
+".. c #E7E5E2",
+"+. c #E4E3DF",
+"@. c #DCDBD7",
+"#. c #E6E5E2",
+"$. c #E5E4E0",
+"%. c #E2E1DD",
+"&. c #DBD9D5",
+"*. c #D9D7D3",
+"=. c #9F998D",
+"-. c #E4E2DF",
+";. c #DDDBD7",
+">. c #DCDAD6",
+",. c #D8D6D2",
+"'. c #9E988D",
+"). c #EDEDED",
+"!. c #E1E0DD",
+"~. c #E0DEDA",
+"{. c #D8D6D1",
+"]. c #D7D5D1",
+"^. c #9D978B",
+"/. c #E1DFDB",
+"(. c #DEDCD8",
+"_. c #D7D6D1",
+":. c #D5D3CE",
+"<. c #9B958A",
+"[. c #999891",
+"}. c #A39E92",
+"|. c #A39D92",
+"1. c #A39D91",
+"2. c #A29C90",
+"3. c #A19B8F",
+"4. c #9D978C",
+"5. c #9B968A",
+"6. c #676359",
+" ",
+" . . . . . . . . . . . . . ",
+" . + @ # # # # # # # # $ % & . ",
+" . @ # # # # # # # # # # * = - . ",
+" . # # # # # # # ; # ; > , ' ) ! . ",
+" . # # # # # ; > ~ > ~ { ] ^ # / ( . ",
+" . # # # ; > ~ { _ { _ : < ) # [ } | . ",
+" . # ; > ~ { _ : 1 : 1 2 3 . . . . . . . ",
+" . # ~ { _ : 1 2 4 2 4 5 6 7 8 9 0 a b . ",
+" . # _ : 1 2 4 5 c 5 c 6 d e f g h i j . ",
+" . # 1 2 4 5 c 6 k 6 k d l m n o p q r . ",
+" . # s t 6 6 k d u d u v m w x y z A B . ",
+" . # 6 C d D l v E v E F w G H z I J K . ",
+" . # 6 C d D l v E v E F w G H z I J L . ",
+" . # D l l F m n n n n w M N O P Q R S . ",
+" . # T n w w w U V U V V H W X Y Z ` .. ",
+" . # U o o G M M N M N ..+.X R Z ` @. .. ",
+" . # N #.#.#.H W $.W $.+.%.R Z @.&.*.=.. ",
+" . $ z O X -.+.%.X %.X Q Q Z ;.>.*.,.'.. ",
+" . ).!.J Q R %.R Q R Q Y ~.;.>.*.{.].^.. ",
+" . = /.~.Y Z R Z ~.Z ~.(.(.>.>.,._.:.<.. ",
+" . [.}.L |.1.|.S 2.S 2.3. .=.=.4.4.5.6.. ",
+" . . . . . . . . . . . . . . . . . . ",
+" "};
--- /dev/null
+/* XPM */
+static char * next_node2_xpm[] = {
+"24 24 18 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+"@ c #DADAD6",
+"# c #BCBCB8",
+"$ c #506B46",
+"% c #778E6F",
+"& c #0F1308",
+"* c #77A16E",
+"= c #C2D7BE",
+"- c #6B9060",
+"; c #A9C7A6",
+"> c #C1D6BD",
+", c #BDD3B8",
+"' c #B0CAAD",
+") c #A4C3A2",
+"! c #445B2C",
+"~ c #8CA782",
+" .................. ",
+" .+++++++++++++++@#. ",
+" .+++++++++++++++#+#. ",
+" .+++$#++++++++++#%$&. ",
+" .+++..#@++++++++@%$&. ",
+" .+++.*.#@@+@++++++@#. ",
+" .+@@.=-.#@@++@@@@@@#. ",
+".......=;-.#@@@+@@@@@#. ",
+".=>>>>>,;;-.#@@@@@@@@#. ",
+".=;;;;';;;;-.##@@@@@@#. ",
+".@>,,,>,,,,;-.#@@@@@@#. ",
+".)----------!.%#@@@@@#. ",
+".~---------!.%##@@@@##. ",
+".*--------!.$%##@@@@@#. ",
+".......--!.%####@@@@@#. ",
+" .##%.-!.$%####@@@@##. ",
+" .@##.!.%####@####@##. ",
+" .+##..%%#####@@@@@@#. ",
+" .+@#.#####@@@####@@#. ",
+" .+@@#####@@@@####@##. ",
+" .+##################. ",
+" ..................... ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char * stock_next_page_xpm[] = {
+"24 24 92 2",
+" c None",
+". c #000000",
+"+ c #5B7289",
+"@ c #FFFFFF",
+"# c #F2F2F2",
+"$ c #E5E5E5",
+"% c #D8D8D8",
+"& c #CCCCCC",
+"* c #B0B0B0",
+"= c #8B8B8B",
+"- c #6A6A6A",
+"; c #494949",
+"> c #888888",
+", c #C9C9C9",
+"' c #E3E3E3",
+") c #EEEEEE",
+"! c #E6E6E6",
+"~ c #DEDEDE",
+"{ c #D6D6D6",
+"] c #ADADAD",
+"^ c #556D85",
+"/ c #47617B",
+"( c #BFBFBF",
+"_ c #B2B2B2",
+": c #ACACAC",
+"< c #A6A6A6",
+"[ c #F6F6F6",
+"} c #384F66",
+"| c #3A5067",
+"1 c #DADADA",
+"2 c #3A5168",
+"3 c #D3D3D3",
+"4 c #3B5269",
+"5 c #47617C",
+"6 c #3D526A",
+"7 c #48627D",
+"8 c #B6B6B6",
+"9 c #959595",
+"0 c #7C7C7C",
+"a c #616161",
+"b c #464646",
+"c c #262626",
+"d c #C5C5C5",
+"e c #3E546A",
+"f c #49637D",
+"g c #3F556B",
+"h c #4B647E",
+"i c #40566C",
+"j c #4C647F",
+"k c #41576D",
+"l c #4C657F",
+"m c #42586E",
+"n c #4E6780",
+"o c #44586F",
+"p c #4F6881",
+"q c #B5B5B5",
+"r c #45596F",
+"s c #506982",
+"t c #77838F",
+"u c #9C9FA1",
+"v c #91969C",
+"w c #91979C",
+"x c #92979C",
+"y c #92979D",
+"z c #A2A3A4",
+"A c #9D9FA2",
+"B c #8F9296",
+"C c #8F9396",
+"D c #8F9397",
+"E c #909397",
+"F c #868788",
+"G c #465B70",
+"H c #526A83",
+"I c #3E5975",
+"J c #3F5A76",
+"K c #415B77",
+"L c #425C78",
+"M c #435E79",
+"N c #445F7A",
+"O c #46607B",
+"P c #68727D",
+"Q c #7D8185",
+"R c #616A73",
+"S c #3B4F63",
+"T c #3C5064",
+"U c #3C5065",
+"V c #3E5166",
+"W c #3F5266",
+"X c #405367",
+"Y c #405468",
+"Z c #344353",
+"` c #2F4050",
+" ",
+" ",
+" . . . . . . . . . . . . . . . . ",
+" . + @ # $ % & * = - ; > , ' ) ! ~ { ] ^ . ",
+" . / @ # $ % & ( _ : < @ @ [ ) ! ~ { _ } . ",
+" . / @ # $ % & ( _ : < @ ' [ ) ! ~ { _ | . ",
+" . / @ # $ % & ( _ : < @ . 1 ) ! ~ { * 2 . ",
+" . / @ # $ % & ( _ : < @ . . 3 ! ~ { * 4 . ",
+" . 5 @ # $ % & ( _ : < @ . . . & ~ { * 6 . ",
+" . 7 @ # $ 8 9 0 a b c . . . . . d { * e . ",
+" . f @ # $ % & ( _ : < @ . . . & ~ { * g . ",
+" . h @ # $ % & ( _ : < @ . . 3 ! ~ { * i . ",
+" . j @ # $ % & ( _ : < @ . 1 ) ! ~ { * k . ",
+" . l @ # $ % & ( _ : < @ ' [ ) ! ~ { * m . ",
+" . n @ # $ % & ( _ : < @ @ [ ) ! ~ { * o . ",
+" . p @ # $ % & ( _ : < @ @ [ ) ! ~ { q r . ",
+" . s t u v w x y y z < A B C C D D E F G . ",
+" . H I J K L M N O P Q R S T U V W X Y Z . ",
+" . . . . . . . . . ` . . . . . . . . . . ",
+" . . . ",
+" ",
+" ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char * open_xpm[] = {
+"24 24 173 2",
+" c None",
+". c #000000",
+"+ c #010100",
+"@ c #B5B8A5",
+"# c #E4E7D2",
+"$ c #878A76",
+"% c #33342B",
+"& c #0B0B0B",
+"* c #E2E5CF",
+"= c #CFD4AF",
+"- c #CED3AE",
+"; c #B2B696",
+"> c #2D2D25",
+", c #23241D",
+"' c #9D9F90",
+") c #C6CAA6",
+"! c #C4C9A5",
+"~ c #C6CBA7",
+"{ c #C7CCA8",
+"] c #C9CEA9",
+"^ c #555847",
+"/ c #1A1B15",
+"( c #20201A",
+"_ c #D4D6C2",
+": c #BEC2A0",
+"< c #B3B896",
+"[ c #B0B595",
+"} c #B3B797",
+"| c #B6BB99",
+"1 c #BBC09E",
+"2 c #BCC19F",
+"3 c #81856C",
+"4 c #3E3F32",
+"5 c #010101",
+"6 c #DADDC8",
+"7 c #AFB494",
+"8 c #AAAF8F",
+"9 c #A3A789",
+"0 c #A6AA8B",
+"a c #A9AD8E",
+"b c #A7AB8D",
+"c c #A4A88A",
+"d c #A1A588",
+"e c #AAAD96",
+"f c #B3B5A5",
+"g c #B8BBAA",
+"h c #BABCAB",
+"i c #C1C3B2",
+"j c #C7CAB7",
+"k c #CACDBB",
+"l c #BABDA8",
+"m c #0C0C09",
+"n c #DDDFCB",
+"o c #969B7E",
+"p c #9DA286",
+"q c #95987C",
+"r c #96997E",
+"s c #9A9D81",
+"t c #999D80",
+"u c #9DA184",
+"v c #A5AA8B",
+"w c #A4A98A",
+"x c #A3A889",
+"y c #A2A588",
+"z c #A2A587",
+"A c #9FA386",
+"B c #9B9E83",
+"C c #898D74",
+"D c #D8DBC9",
+"E c #84866E",
+"F c #7D8169",
+"G c #151612",
+"H c #D7DAC9",
+"I c #797D67",
+"J c #3D3F34",
+"K c #E0E0D9",
+"L c #EBEDDD",
+"M c #E8EBD9",
+"N c #E7EAD8",
+"O c #E3E6D4",
+"P c #DEE1D0",
+"Q c #DADCCC",
+"R c #DADCD1",
+"S c #2B2C28",
+"T c #D7DAC6",
+"U c #6F735E",
+"V c #0D0D0D",
+"W c #F4F4EC",
+"X c #CACFAB",
+"Y c #C6CBA8",
+"Z c #C2C6A4",
+"` c #ABB091",
+" . c #23251E",
+".. c #494B3D",
+"+. c #DCDCD4",
+"@. c #EAECDD",
+"#. c #CDD2AD",
+"$. c #CCD1AC",
+"%. c #CACFAA",
+"&. c #BABF9D",
+"*. c #B5B999",
+"=. c #81836C",
+"-. c #070806",
+";. c #D5D8C4",
+">. c #161616",
+",. c #F2F2EA",
+"'. c #C9CEAA",
+"). c #C8CDA9",
+"!. c #C4C9A6",
+"~. c #C1C5A3",
+"{. c #BCC09F",
+"]. c #B6BB9A",
+"^. c #B0B494",
+"/. c #9DA185",
+"(. c #535445",
+"_. c #B6B8A7",
+":. c #747470",
+"<. c #ECECE2",
+"[. c #C3C8A5",
+"}. c #C2C7A4",
+"|. c #C0C5A2",
+"1. c #BFC4A1",
+"2. c #BDC2A0",
+"3. c #B9BD9C",
+"4. c #B9BE9D",
+"5. c #A9AD8F",
+"6. c #A3A78A",
+"7. c #80836D",
+"8. c #020201",
+"9. c #A6A998",
+"0. c #B8BC9B",
+"a. c #AFB394",
+"b. c #ACB091",
+"c. c #A8AC8E",
+"d. c #A6AA8C",
+"e. c #9FA286",
+"f. c #9B9F83",
+"g. c #9A9D82",
+"h. c #8A8D75",
+"i. c #4F5243",
+"j. c #070705",
+"k. c #9E9F91",
+"l. c #E5E6DA",
+"m. c #ADB192",
+"n. c #A5A98C",
+"o. c #9FA387",
+"p. c #999D81",
+"q. c #95987E",
+"r. c #92957B",
+"s. c #8C8F76",
+"t. c #8A8D74",
+"u. c #71735F",
+"v. c #080908",
+"w. c #E3E5D9",
+"x. c #C0C3AF",
+"y. c #94987C",
+"z. c #8F9379",
+"A. c #8B8F75",
+"B. c #8A8E74",
+"C. c #888C73",
+"D. c #858970",
+"E. c #868971",
+"F. c #82866E",
+"G. c #80836C",
+"H. c #7D8069",
+"I. c #797C66",
+"J. c #727560",
+"K. c #717460",
+"L. c #71745F",
+"M. c #6A6D59",
+"N. c #434538",
+"O. c #080907",
+"P. c #050504",
+" ",
+" ",
+" ",
+" . . . . . . . ",
+" + @ # # # # # $ % ",
+" & * = = = - - ; > ",
+", ' * ) ! ~ { ] ] ^ / ",
+"( _ : < [ } | 1 2 3 4 5 . . . . . . . ",
+", 6 7 8 9 0 8 a b c d e f g h i j k l . ",
+"m n o p q r s t r u v w x y 9 z A B C . ",
+". D E F G . . . . . . . . . . . . . . . 5 5 ",
+". H I J K L M M M M M M M M M M M N O P Q R S ",
+". T U V W = = = = = = = = = - - - X Y Z 1 ` . ",
+". T ..+.@.#.- - #.- #.#.#.#.#.$.%.Y Z &.*.=.-. ",
+". ;.>.,.X %.X %.'.%.'.{ ).).Y !.~.{.].^./.(.m ",
+". _.:.<.[.}.}.Z |.Z 1.2.|.2.3.4.} [ 5.6.7.8. ",
+". 9.+.0.0.*.} } [ [ a.a.a.b.c.d.e.f.g.h.i.j. ",
+". k.l.m.5.d.n.6.6.d o.e.f.p.q.r.s.t.t.u.v. ",
+". w.x.y.z.A.B.C.C.D.E.F.G.H.I.J.K.L.M.N.O. ",
+" . . . . . . . . . . . . . . . . . . P. ",
+" ",
+" ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char * paste_xpm[] = {
+"24 24 89 1",
+" c None",
+". c #000000",
+"+ c #B9B9B9",
+"@ c #FEFEFE",
+"# c #F9F9F9",
+"$ c #757575",
+"% c #F5F5E8",
+"& c #565651",
+"* c #FFFFFF",
+"= c #A0A0A0",
+"- c #939393",
+"; c #7C7C7C",
+"> c #C5C5BB",
+", c #CFC6A0",
+"' c #D7CEAA",
+") c #ADA689",
+"! c #4B483C",
+"~ c #6D6D6D",
+"{ c #6C6C6C",
+"] c #A9A9A9",
+"^ c #3D3A30",
+"/ c #979178",
+"( c #C1B898",
+"_ c #8A793D",
+": c #C3BB9A",
+"< c #AFA78A",
+"[ c #444236",
+"} c #FAFAFA",
+"| c #EFEFEF",
+"1 c #C7C7C7",
+"2 c #D8D8D8",
+"3 c #D2D2D2",
+"4 c #7B7B7B",
+"5 c #302E26",
+"6 c #89846C",
+"7 c #C4BC9A",
+"8 c #847235",
+"9 c #C5C5C5",
+"0 c #A7A7A7",
+"a c #ADADAD",
+"b c #9A9A9A",
+"c c #9B9B9B",
+"d c #868686",
+"e c #424242",
+"f c #847033",
+"g c #C9C09E",
+"h c #464337",
+"i c #35332A",
+"j c #2D2B23",
+"k c #C6BE9D",
+"l c #826F33",
+"m c #7F7964",
+"n c #4C493C",
+"o c #171612",
+"p c #13120F",
+"q c #3E3B31",
+"r c #282210",
+"s c #474438",
+"t c #B3B3B3",
+"u c #D6D6D6",
+"v c #B7AE90",
+"w c #B1AA8C",
+"x c #37352B",
+"y c #151410",
+"z c #8F8F8F",
+"A c #989898",
+"B c #C6C6C6",
+"C c #B9B293",
+"D c #11100D",
+"E c #434035",
+"F c #636363",
+"G c #767676",
+"H c #AAA48B",
+"I c #A5A086",
+"J c #A19A7F",
+"K c #312F26",
+"L c #AFA88C",
+"M c #050403",
+"N c #12110E",
+"O c #A9A489",
+"P c #A39E85",
+"Q c #EBE7D0",
+"R c #D2C9A5",
+"S c #A29053",
+"T c #8E7C3D",
+"U c #88793B",
+"V c #806C2F",
+"W c #78652B",
+"X c #251F0C",
+" .... ",
+" ......+@#$...... ",
+".%%%%%&*=-;&>%%%,. ",
+".%''')!*~{]^/(''_. ",
+".%::<[}|123456<78. ",
+".%''!900abcde!)'f. ",
+".%g:6hijjjjj56<kl. ",
+".%'''////////(''l. ",
+".%g::::mnopppp^qr.... ",
+".%'''''st***********u. ",
+".%vwwwwx*************. ",
+".%'''''y*0zzA**Bz*zB*. ",
+".%CwwwwD*************. ",
+".%'''''E*~F*GzzB*Bz**. ",
+".%HIJJJK*************. ",
+".%'''''E*0zz*zzzB*Az*. ",
+".%LIJJJM*************. ",
+".%'''''N*~F*GzzB*Bz**. ",
+".%OPJJJK*************. ",
+".Q'''''E*0zz*zzzB*Az*. ",
+".RSTUVWX*************. ",
+" .......u***********u. ",
+" ............. ",
+" "};
--- /dev/null
+/* XPM */
+static char * preferences_xpm[] = {
+"24 24 87 1",
+" c None",
+". c #000000",
+"+ c #BAB5AB",
+"@ c #D0CDC6",
+"# c #88857D",
+"$ c #C9C6BE",
+"% c #CCC8C1",
+"& c #E5E3E0",
+"* c #FFFFFF",
+"= c #757575",
+"- c #2E2E2E",
+"; c #F6F5F5",
+"> c #CCCCCC",
+", c #AFAFAF",
+"' c #D3D1CB",
+") c #C1C0BF",
+"! c #F0EFED",
+"~ c #797772",
+"{ c #DCDCDC",
+"] c #A5A19C",
+"^ c #EAE9E5",
+"/ c #F3F1F0",
+"( c #EDEDED",
+"_ c #A19D96",
+": c #C1BDB4",
+"< c #DBD8D3",
+"[ c #D9D6D1",
+"} c #89857E",
+"| c #FCFCFC",
+"1 c #EAE9E6",
+"2 c #F5F4F3",
+"3 c #C6C2BA",
+"4 c #F0EFEE",
+"5 c #F4F4F3",
+"6 c #CBC7C0",
+"7 c #ECECEB",
+"8 c #676560",
+"9 c #54524D",
+"0 c #777676",
+"a c #797978",
+"b c #85827E",
+"c c #79756F",
+"d c #7590AE",
+"e c #A4BAD0",
+"f c #90A6BE",
+"g c #9F9F9E",
+"h c #BEBDBC",
+"i c #B8B4AD",
+"j c #87837C",
+"k c #D3DFEA",
+"l c #A2AEBC",
+"m c #9DB6CE",
+"n c #637B95",
+"o c #E2E2E2",
+"p c #EEEEED",
+"q c #849CB6",
+"r c #D7E2ED",
+"s c #8D98A5",
+"t c #9DB8D2",
+"u c #607791",
+"v c #EDEDEC",
+"w c #99ADC3",
+"x c #DFE7F0",
+"y c #8193A9",
+"z c #586D84",
+"A c #5B7189",
+"B c #F1F1F1",
+"C c #EEEDEB",
+"D c #A7A6A5",
+"E c #726F6A",
+"F c #A1B4C8",
+"G c #EEF3F6",
+"H c #60768F",
+"I c #DEDDDC",
+"J c #787776",
+"K c #4E4E4D",
+"L c #91A6BE",
+"M c #F0F4F7",
+"N c #97A5B6",
+"O c #BFBEBD",
+"P c #AAAAA9",
+"Q c #ACACAB",
+"R c #B0C6DB",
+"S c #EDF2F6",
+"T c #818A95",
+"U c #6C85A1",
+"V c #C0D1E2",
+" .. ",
+" .+@#. ",
+" .$%+. .. ",
+" .&$. .*=. ",
+" .. -;$. .*>,. ",
+" .' ..)!+~. .{,. ",
+" .]%%^/+++. .(.. ",
+" ._:%$<[+}. .|. ",
+" .....123}..>. ",
+" .456.,. ",
+" .7.,.. ",
+" .,.89. ",
+" ....,.0abc. ",
+" .def.. .ghij. ",
+" .dklmn. .op6}. ",
+" .qrsntu. .v/$}. ",
+" .wxyztdA. .BCDE..",
+" .FGyHtdA. .IJK,.",
+" .LMNHtdA. .OPQ.",
+" .RSTtdA.. ... ",
+" .UtVLA.. ",
+" .UUn.. ",
+" ... ",
+" "};
--- /dev/null
+/* XPM */
+static char * prev_node3_xpm[] = {
+"24 24 17 1",
+" c None",
+". c #000000",
+"+ c #0F1308",
+"@ c #FFFFFF",
+"# c #BCBCB8",
+"$ c #DADAD6",
+"% c #778E6F",
+"& c #C2D7BE",
+"* c #A6BFA0",
+"= c #A9C7A6",
+"- c #BDD3B8",
+"; c #B0CAAD",
+"> c #C1D6BD",
+", c #8CA782",
+"' c #5B7950",
+") c #6B9060",
+"! c #445B2C",
+" .................. ",
+" +@#@@@@@@@@@@@@@@$. ",
+" +@@%$@@@@@@@@@@@@@$. ",
+" .$#%%$@@@@@@@@@$.$$$. ",
+" .%$##$@@@@@@@@#..$$$. ",
+" .#@@@@@@@@@$$#.&.#$$. ",
+" .$@@@@@@@@@@#.$*.##$. ",
+" .@@@@@@@@$$#.$=*.......",
+" .@@@@@@@$$#.$==-&&&&&*.",
+" .@@@@@@@$#.@====;====%.",
+" .@$@$$$$#.$>>>>>>>>>>,.",
+" .@$@$$$$#.'))))))))))!.",
+" .@$$$$$$##.')))))))))!.",
+" .@$$$$$$##%.')))'!!!!!.",
+" .@$$$$$##$#%.')!.......",
+" .@$$$$$$$###%.'!.%%%. ",
+" .@$$#####$$##%.!.%##. ",
+" .@$$$$$$$#####%..###. ",
+" .@$$#####$$$###%.###. ",
+" .@$$$$$$$$$$$#######. ",
+" .@##################. ",
+" ..................... ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char * print_xpm[] = {
+"24 24 175 2",
+" c None",
+". c #000000",
+"+ c #C7C7C7",
+"@ c #FAFAFA",
+"# c #FCFCFC",
+"$ c #FBFBFB",
+"% c #F8F8F8",
+"& c #AFAFAF",
+"* c #F9F9F9",
+"= c #E5E5E5",
+"- c #E3E3E3",
+"; c #E2E2E2",
+"> c #E0E0E0",
+", c #DFDFDF",
+"' c #DCDCDC",
+") c #DBDBDB",
+"! c #B6B6B6",
+"~ c #6B6B6B",
+"{ c #676767",
+"] c #818181",
+"^ c #E7E7E7",
+"/ c #606060",
+"( c #A0A0A0",
+"_ c #DADADA",
+": c #E1E1E1",
+"< c #B7B7B7",
+"[ c #FDFDFD",
+"} c #EFEFEF",
+"| c #EEEEEE",
+"1 c #EDEDED",
+"2 c #ECECEC",
+"3 c #EBEBEB",
+"4 c #E9E9E9",
+"5 c #E8E8E8",
+"6 c #BFBFBF",
+"7 c #8A8A8A",
+"8 c #6A6A6A",
+"9 c #9E9E9E",
+"0 c #F6F6F6",
+"a c #909090",
+"b c #A2A2A2",
+"c c #AAAAAA",
+"d c #F4F4F4",
+"e c #CECECE",
+"f c #ADADAD",
+"g c #AEAEAE",
+"h c #BEBEBE",
+"i c #A6A6A6",
+"j c #CDCDCD",
+"k c #F5F5F5",
+"l c #DEDEDE",
+"m c #DDDDDD",
+"n c #C9C9C9",
+"o c #878787",
+"p c #888888",
+"q c #D0D0D0",
+"r c #6E6E6E",
+"s c #797979",
+"t c #D1D1D1",
+"u c #A1A1A1",
+"v c #B3B3B3",
+"w c #FFFFFF",
+"x c #CACACA",
+"y c #A7A7A7",
+"z c #A5A5A5",
+"A c #A4A4A4",
+"B c #A3A3A3",
+"C c #87847C",
+"D c #EAE8E3",
+"E c #8D8982",
+"F c #53524C",
+"G c #807D74",
+"H c #AAA9A5",
+"I c #BAB5AB",
+"J c #F3F3F3",
+"K c #C3C1BD",
+"L c #8B8B89",
+"M c #E6E5E1",
+"N c #F9F9F8",
+"O c #FAFAF9",
+"P c #F9F9F7",
+"Q c #F7F6F5",
+"R c #F7F7F4",
+"S c #F6F5F4",
+"T c #F2F1EE",
+"U c #F0EFEC",
+"V c #E5E5E4",
+"W c #9F9F9F",
+"X c #DFDED9",
+"Y c #A4A3A1",
+"Z c #6C6B6A",
+"` c #F5F4F3",
+" . c #D5D5D5",
+".. c #D3D3D3",
+"+. c #D4D4D3",
+"@. c #D4D4D4",
+"#. c #A9A9A9",
+"$. c #B5B5B5",
+"%. c #CDCDCB",
+"&. c #B5B5B4",
+"*. c #DCDAD3",
+"=. c #6B6B6A",
+"-. c #999896",
+";. c #918F87",
+">. c #999895",
+",. c #E6E4E1",
+"'. c #F0EEEC",
+"). c #FAF9F9",
+"!. c #F9F8F7",
+"~. c #F8F7F6",
+"{. c #F8F8F7",
+"]. c #F4F3F1",
+"^. c #F2F1EF",
+"/. c #565655",
+"(. c #858482",
+"_. c #9C9B99",
+":. c #6B6A68",
+"<. c #585858",
+"[. c #5E5C57",
+"}. c #524F4B",
+"|. c #4A4845",
+"1. c #4B4A46",
+"2. c #4B4946",
+"3. c #4A4844",
+"4. c #494743",
+"5. c #484642",
+"6. c #474541",
+"7. c #464440",
+"8. c #514F4B",
+"9. c #53514E",
+"0. c #7B7A77",
+"a. c #797771",
+"b. c #949391",
+"c. c #989694",
+"d. c #868480",
+"e. c #6E6C66",
+"f. c #706D67",
+"g. c #5C5955",
+"h. c #67645F",
+"i. c #5B5954",
+"j. c #585651",
+"k. c #5D5B56",
+"l. c #595652",
+"m. c #53504C",
+"n. c #575450",
+"o. c #595752",
+"p. c #5C5956",
+"q. c #5B5956",
+"r. c #61615E",
+"s. c #696861",
+"t. c #77756F",
+"u. c #7E7B77",
+"v. c #979690",
+"w. c #96938D",
+"x. c #807E77",
+"y. c #7D7A74",
+"z. c #787770",
+"A. c #716F6A",
+"B. c #6E6C67",
+"C. c #595753",
+"D. c #63615C",
+"E. c #686661",
+"F. c #6F6E68",
+"G. c #6D6C66",
+"H. c #72716B",
+"I. c #76746F",
+"J. c #6A6963",
+"K. c #8B8880",
+"L. c #B2AFA8",
+"M. c #B6B3AD",
+"N. c #BFBDB6",
+"O. c #BDBBB4",
+"P. c #B0AEA6",
+"Q. c #ABA8A2",
+"R. c #9C9991",
+" ",
+" . . . . . . . . . . . . ",
+" . + @ # # # # # # # $ % & . ",
+" . * = - - - ; > , , ' ) ! . ",
+" . # ~ { ] ^ / ( _ : > > < . ",
+" . [ } | 1 1 | 2 2 3 4 5 6 . ",
+" . [ 7 8 9 0 a b 4 c a d + . ",
+" . [ # # # # $ $ # # $ $ e . ",
+" . [ f g = h % h i j 3 # j . ",
+" . k l l l m l l , l 5 : n . ",
+" . . @ o ~ p q r s t p u q v . . ",
+" . w . x y z A z z i B b u u 9 . C . ",
+" . w D E F . . . . . . . . . . G C H I . ",
+" . w w J w w w w w w w w w w w w w w w w D . ",
+" . K L M N O N P Q R O O S T T U V D W X I . ",
+" . Y Z ` h .! ..! +.< @.#...$.%.&.*.=.-.;.. ",
+" . >.=.,.'.Q N @ ).N !.~.{.{.].].].^./.(.;.. ",
+" . _.:.<.[.}.|.1.2.2.2.3.4.5.6.4.7.8.9.0.a.. ",
+" . b.c.d.e.f.g.h.i.j.i.k.l.m.n.o.p.q.r.s.t.. ",
+" . u.v.w.;.x.y.z.t.A.t.A.B.C.D.E.F.G.H.I.J.. ",
+" . . . . . . . . . . . . . . . . . . . . ",
+" . K.L.M.N.N.N.N.N.O.P.L.Q.P.R.R.R.G G . ",
+" . . . . . . . . . . . . . . . . . . ",
+" "};
--- /dev/null
+/* XPM */
+static char * stock_redo_xpm[] = {
+"24 24 42 1",
+" c None",
+". c #000000",
+"+ c #939A8D",
+"@ c #BAD09D",
+"# c #92998C",
+"$ c #818F71",
+"% c #ADBDA0",
+"& c #C2D5AA",
+"* c #D1DFBE",
+"= c #BED2A3",
+"- c #99A28F",
+"; c #A8BCA6",
+"> c #D5E1C6",
+", c #CDDCBC",
+"' c #D2E0BF",
+") c #C5D7AE",
+"! c #919889",
+"~ c #8C9A7F",
+"{ c #D4E0C5",
+"] c #D3E0C1",
+"^ c #BFD3A6",
+"/ c #9BAA87",
+"( c #B5C3A9",
+"_ c #92AD62",
+": c #7C9B40",
+"< c #59702D",
+"[ c #7F8E6B",
+"} c #C8D9B2",
+"| c #85A24D",
+"1 c #53692A",
+"2 c #A4B690",
+"3 c #9BB572",
+"4 c #6D8839",
+"5 c #95A77E",
+"6 c #8BA859",
+"7 c #657255",
+"8 c #98AF74",
+"9 c #AFC394",
+"0 c #6D7A5B",
+"a c #9CAF84",
+"b c #748261",
+"c c #879772",
+" ",
+" ",
+" ",
+" . ",
+" .. ",
+" .+. ",
+" ....@#. ",
+" .$%&*=@-. ",
+" .;>,')@@@!. ",
+" .~{]*^@@@@@/. ",
+" .(>_::::::<. ",
+" .[}|::::::1. ",
+" .23:<...:1. ",
+" .@:4. .<. ",
+" .@:.. .. ",
+" .56. . ",
+" .78. ",
+" .9. ",
+" .0a. ",
+" .bc. ",
+" ... ",
+" ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char * stock_refresh_xpm[] = {
+"24 24 86 1",
+" c None",
+". c #000000",
+"+ c #F3F6F8",
+"@ c #C8D4DF",
+"# c #F7F9FA",
+"$ c #0D110C",
+"% c #6286A5",
+"& c #A0B6C9",
+"* c #C9D5E0",
+"= c #F2F5F7",
+"- c #172116",
+"; c #819EB6",
+"> c #CAD6E1",
+", c #CCD7E1",
+"' c #CED9E3",
+") c #F6F8F9",
+"! c #7192AE",
+"~ c #587B99",
+"{ c #CDD8E2",
+"] c #CFDAE4",
+"^ c #D3DDE6",
+"/ c #D5DEE6",
+"( c #ADC0D0",
+"_ c #90A9BF",
+": c #537490",
+"< c #23323E",
+"[ c #85A1B8",
+"} c #5E83A3",
+"| c #6084A3",
+"1 c #6689A7",
+"2 c #678AA8",
+"3 c #48657D",
+"4 c #A8BCCD",
+"5 c #7393AE",
+"6 c #6B8DAA",
+"7 c #5C81A1",
+"8 c #5D82A2",
+"9 c #6588A6",
+"0 c #435F76",
+"a c #B1C3D2",
+"b c #50718D",
+"c c #9FB5C8",
+"d c #94ACC1",
+"e c #425D73",
+"f c #435E74",
+"g c #B4C5D3",
+"h c #6C8EAB",
+"i c #C4D2DD",
+"j c #5B80A0",
+"k c #456178",
+"l c #7595B0",
+"m c #BFCEDA",
+"n c #597D9C",
+"o c #A3B8CA",
+"p c #B0C2D1",
+"q c #86A2B9",
+"r c #6E8FAB",
+"s c #E1E8EE",
+"t c #B9C9D6",
+"u c #6387A6",
+"v c #4C6B85",
+"w c #7F9DB6",
+"x c #BCCCD9",
+"y c #DDE5EC",
+"z c #E4EAEF",
+"A c #D8E1E9",
+"B c #D1DBE4",
+"C c #C7D3DE",
+"D c #B7C8D6",
+"E c #7091AD",
+"F c #537592",
+"G c #9DB3C6",
+"H c #8CA7BD",
+"I c #304353",
+"J c #4E6E89",
+"K c #829FB7",
+"L c #92ABC0",
+"M c #C5D3DE",
+"N c #7C9AB3",
+"O c #5A7E9D",
+"P c #47647C",
+"Q c #6185A4",
+"R c #5B7F9E",
+"S c #4F6F8A",
+"T c #405A71",
+"U c #283926",
+" . ",
+" .. ",
+" .+. ",
+" ....@#. ",
+" $%&@@**=. .. ",
+" -;@@**>,'). .!~. ",
+" .%@**>,{]^/(. ._:. ",
+" <&@[}}|%123. .4. ",
+".5@678|%920. .ab. ",
+".cd7e...1f. . .gh. ",
+".ijb. .k. .. .al. ",
+".mn. .. .'. .op5. ",
+".qr. . .*s...at4u. ",
+".vw. .xyzyABCDEF. ",
+" .G. .p'B,@ixaH2I. ",
+" .JK. .LM@,>>MmNOP. ",
+" .F9. .9|%Q|}7RS.. ",
+" .. .|R~~nJT.. ",
+" .j~.... ",
+" UO. ",
+" .. ",
+" . ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char * right_arrow_xpm[] = {
+"24 24 41 1",
+" c None",
+". c #000000",
+"+ c #8CA782",
+"@ c #B1CDAE",
+"# c #77A16E",
+"$ c #B4CEB1",
+"% c #ACC8A9",
+"& c #709867",
+"* c #C1D6BD",
+"= c #BDD3B8",
+"- c #BFD4BB",
+"; c #C2D7BE",
+"> c #B0CAAD",
+", c #B2CBB0",
+"' c #AAC7A8",
+") c #0F1308",
+"! c #AEC5A8",
+"~ c #AEC8AD",
+"{ c #ABC7A8",
+"] c #AAC6A7",
+"^ c #A8C6A5",
+"/ c #ADC8AD",
+"( c #A8C7A8",
+"_ c #A5C4A3",
+": c #7F9F76",
+"< c #A6BFA0",
+"[ c #ABC7AA",
+"} c #A7C5A4",
+"| c #A9C7A6",
+"1 c #AFC8AD",
+"2 c #A4C3A2",
+"3 c #6B9060",
+"4 c #778E6F",
+"5 c #698D60",
+"6 c #6B9063",
+"7 c #445B2C",
+"8 c #6B8661",
+"9 c #5B7950",
+"0 c #6C8562",
+"a c #65815C",
+"b c #506B46",
+" ",
+" ",
+" ",
+" . ",
+" .. ",
+" .+. ",
+" .@#. ",
+" ........$%&. ",
+" .*=-;;;;>,'&) ",
+" .!~{{{]^'/(_:. ",
+" .<[^}^|{%'{123. ",
+" .45666666666657. ",
+" .8999999999997. ",
+" .099999999997. ",
+" .abbbbbb9997. ",
+" ........b97. ",
+" .b7. ",
+" .7. ",
+" .. ",
+" . ",
+" ",
+" ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char * save_xpm[] = {
+"24 24 220 2",
+" c None",
+". c #000000",
+"+ c #C3D7F4",
+"@ c #A9CDE5",
+"# c #75757A",
+"$ c #EFC5BB",
+"% c #F1C8BE",
+"& c #F0C6BC",
+"* c #EEBCB2",
+"= c #EEBEB5",
+"- c #EEC1B8",
+"; c #EDBFB6",
+"> c #E9B7AD",
+", c #E9B8AF",
+"' c #E9B9B1",
+") c #E5BFBA",
+"! c #737277",
+"~ c #B3CDE3",
+"{ c #A1BED6",
+"] c #BBD6E8",
+"^ c #8AAAC5",
+"/ c #605F68",
+"( c #E08D7E",
+"_ c #E0826E",
+": c #E0806E",
+"< c #DC7A68",
+"[ c #DC8171",
+"} c #DA7868",
+"| c #D48173",
+"1 c #D47D6E",
+"2 c #CE7265",
+"3 c #CF7264",
+"4 c #CE7567",
+"5 c #C4675B",
+"6 c #C36558",
+"7 c #626169",
+"8 c #87A3B7",
+"9 c #567187",
+"0 c #BAD5E9",
+"a c #88A7C3",
+"b c #686670",
+"c c #C8817B",
+"d c #CB7C74",
+"e c #CB7A73",
+"f c #CB7B73",
+"g c #CC7C72",
+"h c #CB7D73",
+"i c #BF6B64",
+"j c #CC7A70",
+"k c #C16A62",
+"l c #CC7C73",
+"m c #C2655B",
+"n c #C36459",
+"o c #BA6C6A",
+"p c #819EB6",
+"q c #547086",
+"r c #B6D3E7",
+"s c #87ABC1",
+"t c #737373",
+"u c #FFFFFF",
+"v c #83A0B8",
+"w c #526C80",
+"x c #B9D3E7",
+"y c #85A4BF",
+"z c #4F697C",
+"A c #B9D3E6",
+"B c #84A3BF",
+"C c #CECECE",
+"D c #CDCDCD",
+"E c #BFBFBF",
+"F c #88A4BB",
+"G c #486276",
+"H c #B7D2E7",
+"I c #82A0BB",
+"J c #636363",
+"K c #465E70",
+"L c #B5CAE5",
+"M c #7FA2B9",
+"N c #87A3BA",
+"O c #455C6D",
+"P c #AECCE5",
+"Q c #7DA0B6",
+"R c #C5C5C5",
+"S c #546069",
+"T c #B0D1E4",
+"U c #83A1B6",
+"V c #735B5B",
+"W c #515C64",
+"X c #AACEE3",
+"Y c #7B9BB2",
+"Z c #7A8E9A",
+"` c #7A7A7A",
+" . c #6B6F72",
+".. c #6F6F6F",
+"+. c #696969",
+"@. c #6F777E",
+"#. c #86A2B9",
+"$. c #3A515D",
+"%. c #A9C9E2",
+"&. c #7494AF",
+"*. c #829FB7",
+"=. c #7F9DB6",
+"-. c #7E9CB5",
+";. c #7998B2",
+">. c #85A1B8",
+",. c #8CA7BD",
+"'. c #8AA5BB",
+"). c #364A59",
+"!. c #ABC4E2",
+"~. c #7294AD",
+"{. c #6F90AC",
+"]. c #7192AE",
+"^. c #414A4E",
+"/. c #424A51",
+"(. c #525B63",
+"_. c #626F79",
+":. c #5F6C76",
+"<. c #5C6971",
+"[. c #5A666F",
+"}. c #58636B",
+"|. c #57636A",
+"1. c #3B5360",
+"2. c #39424B",
+"3. c #7897B3",
+"4. c #A4B9CB",
+"5. c #364853",
+"6. c #AAC9E2",
+"7. c #7091AA",
+"8. c #6F8FA7",
+"9. c #4A5359",
+"0. c #97938C",
+"a. c #DFDDDA",
+"b. c #E3E1DE",
+"c. c #EBEAE8",
+"d. c #EAE9E7",
+"e. c #CFCEC9",
+"f. c #C9C6C0",
+"g. c #9B968E",
+"h. c #566168",
+"i. c #4B657A",
+"j. c #54738C",
+"k. c #AAC6DD",
+"l. c #34464E",
+"m. c #AAC9E1",
+"n. c #6C8EA6",
+"o. c #6C8CA4",
+"p. c #40474D",
+"q. c #DAD8D3",
+"r. c #E7E6E2",
+"s. c #67655E",
+"t. c #524F47",
+"u. c #D9D7D4",
+"v. c #C7C5BF",
+"w. c #C0BCB5",
+"x. c #B8B3AB",
+"y. c #434C54",
+"z. c #4D697F",
+"A. c #4F6F84",
+"B. c #B3CADC",
+"C. c #313E49",
+"D. c #A8C8E1",
+"E. c #6B8DA6",
+"F. c #728FA4",
+"G. c #E2E1DD",
+"H. c #F0EFEC",
+"I. c #CDCAC6",
+"J. c #C2BFB9",
+"K. c #CAC6C0",
+"L. c #DCDAD7",
+"M. c #4B555D",
+"N. c #4E697F",
+"O. c #BACCDC",
+"P. c #A4C4DE",
+"Q. c #698BA3",
+"R. c #708AA1",
+"S. c #383E43",
+"T. c #E0DEDA",
+"U. c #514E46",
+"V. c #4F4C44",
+"W. c #C7C4BE",
+"X. c #CBC8C2",
+"Y. c #E1E0DC",
+"Z. c #E9E8E6",
+"`. c #475158",
+" + c #4E6879",
+".+ c #4D6C80",
+"++ c #A3C3DB",
+"@+ c #383F43",
+"#+ c #778999",
+"$+ c #6E899E",
+"%+ c #65859C",
+"&+ c #33383C",
+"*+ c #D7D4D0",
+"=+ c #D6D4D0",
+"-+ c #4E4A43",
+";+ c #4D4942",
+">+ c #D1CEC9",
+",+ c #E6E5E2",
+"'+ c #EDECEA",
+")+ c #454F55",
+"!+ c #486173",
+"~+ c #4D6678",
+"{+ c #A1C1DA",
+"]+ c #373C40",
+"^+ c #0C0D0F",
+"/+ c #4E5E6A",
+"(+ c #5B6E7C",
+"_+ c #4F5B62",
+":+ c #A4A099",
+"<+ c #CCC9C3",
+"[+ c #D7D5D1",
+"}+ c #E4E2E0",
+"|+ c #DDDBD7",
+"1+ c #B8B5B0",
+"2+ c #3E474D",
+"3+ c #4A6176",
+"4+ c #4A6070",
+"5+ c #9BC3D8",
+"6+ c #363C41",
+"7+ c #28323E",
+" ",
+" ",
+" . . . . . . . . . . . . . . . . . . . ",
+" . + @ # $ % & * = - ; > , > , ' ) ! ~ { . ",
+" . ] ^ / ( _ : < [ } | 1 2 3 4 5 6 7 8 9 . ",
+" . 0 a b c d e f g h i j k l m n o b p q . ",
+" . r s t u u u u u u u u u u u u u t v w . ",
+" . x y t u u u u u u u u u u u u u t v z . ",
+" . A B t C D D D D D D D D D D D E t F G . ",
+" . H I J u u u u u u u u u u u u u t F K . ",
+" . L M t u u u u u u u u u u u u u t N O . ",
+" . P Q t C D D D D D D D D D D D R t N S . ",
+" . T U V u u u u u u u u u u u u u t v W . ",
+" . X Y Z ` t t t t t ...t t t t +.@.#.$.. ",
+" . %.&.p v #.*.=.-.*.;.#.>.>.N *.,.v '.).. ",
+" . !.~.{.].^./.(._.:.<.[.}.|.(.1.2.3.4.5.. ",
+" . 6.7.8.9.0.a.b.c.c.d.a.e.f.g.h.i.j.k.l.. ",
+" . m.n.o.p.q.r.s.t.t.u.v.w.x.e.y.z.A.B.C.. ",
+" . D.E.F.p.G.H.s.t.t.I.J.w.K.L.M.N.A.O.C.. ",
+" . P.Q.R.S.T.c.U.V.V.W.w.X.Y.Z.`. +.+++@+. ",
+" . #+$+%+&+*+=+-+;+;+w.>+,+'+,+)+!+~+{+]+. ",
+" ^+/+(+_+:+w.x.<+<+[+}+d.|+1+2+3+4+5+6+. ",
+" . . . . . . . . . . . . . . . . 7+. ",
+" "};
--- /dev/null
+/* XPM */
+static char * saveas_xpm[] = {
+"24 24 262 2",
+" c None",
+". c #000000",
+"+ c #FBE73B",
+"@ c #F2B64D",
+"# c #FCEB3D",
+"$ c #F7B544",
+"% c #5D502C",
+"& c #C3D7F4",
+"* c #A9CDE5",
+"= c #75757A",
+"- c #EFC5BB",
+"; c #F1C8BE",
+"> c #F0C6BC",
+", c #EEBCB2",
+"' c #EEBEB5",
+") c #EEC1B8",
+"! c #EDBFB6",
+"~ c #E8B6AC",
+"{ c #FCE93B",
+"] c #F7B545",
+"^ c #6C5F34",
+"/ c #434345",
+"( c #92A7B9",
+"_ c #96B1C7",
+": c #BBD6E8",
+"< c #8AAAC5",
+"[ c #605F68",
+"} c #E08D7E",
+"| c #E0826E",
+"1 c #E0806E",
+"2 c #DC7A68",
+"3 c #DC8171",
+"4 c #DA7868",
+"5 c #D38072",
+"6 c #FAE43A",
+"7 c #F4B244",
+"8 c #615030",
+"9 c #783E35",
+"0 c #4D4C52",
+"a c #7790A2",
+"b c #526D82",
+"c c #BAD5E9",
+"d c #88A7C3",
+"e c #686670",
+"f c #C8817B",
+"g c #CB7C74",
+"h c #CB7A73",
+"i c #CB7B73",
+"j c #CC7C72",
+"k c #CA7C72",
+"l c #F9DF39",
+"m c #F3AF42",
+"n c #614F2F",
+"o c #8F4941",
+"p c #945554",
+"q c #5B5A62",
+"r c #7B97AE",
+"s c #536F84",
+"t c #B6D3E7",
+"u c #87ABC1",
+"v c #737373",
+"w c #FFFFFF",
+"x c #FEFEFE",
+"y c #F9DC38",
+"z c #EFB44D",
+"A c #665A32",
+"B c #BBBBBB",
+"C c #CDCDCD",
+"D c #E4E4E4",
+"E c #6E6E6E",
+"F c #819EB6",
+"G c #526C80",
+"H c #B9D3E7",
+"I c #85A4BF",
+"J c #F8D837",
+"K c #F0A93F",
+"L c #655930",
+"M c #BABABA",
+"N c #CCCCCC",
+"O c #E5E5E5",
+"P c #F7F7F7",
+"Q c #727272",
+"R c #83A0B8",
+"S c #4F697C",
+"T c #B9D3E6",
+"U c #84A3BF",
+"V c #CECECE",
+"W c #F6D236",
+"X c #EDA43E",
+"Y c #5C5130",
+"Z c #949494",
+"` c #A3A3A3",
+" . c #B7B7B7",
+".. c #C6C6C6",
+"+. c #BDBDBD",
+"@. c #88A4BB",
+"#. c #486276",
+"$. c #B7D2E7",
+"%. c #82A0BB",
+"&. c #636363",
+"*. c #FDFDFD",
+"=. c #D7AE74",
+"-. c #61562F",
+";. c #465E70",
+">. c #B5CAE5",
+",. c #7FA2B9",
+"'. c #4F4115",
+"). c #87A3BA",
+"!. c #455C6D",
+"~. c #AECCE5",
+"{. c #7DA0B6",
+"]. c #CBCBCB",
+"^. c #9B9B9B",
+"/. c #9C9C9C",
+"(. c #A7A7A7",
+"_. c #B8B8B8",
+":. c #C5C5C5",
+"<. c #546069",
+"[. c #B0D1E4",
+"}. c #83A1B6",
+"|. c #735B5B",
+"1. c #F0F0F0",
+"2. c #D9D9D9",
+"3. c #D3D3D3",
+"4. c #E1E1E1",
+"5. c #EDEDED",
+"6. c #F8F8F8",
+"7. c #515C64",
+"8. c #AACEE3",
+"9. c #7B9BB2",
+"0. c #7A8E9A",
+"a. c #7A7A7A",
+"b. c #707070",
+"c. c #6C6C6C",
+"d. c #6F6F6F",
+"e. c #6A6E71",
+"f. c #696969",
+"g. c #6F777E",
+"h. c #86A2B9",
+"i. c #3A515D",
+"j. c #A9C9E2",
+"k. c #7494AF",
+"l. c #7E9BB4",
+"m. c #7D9AB3",
+"n. c #7998B2",
+"o. c #85A1B8",
+"p. c #829FB7",
+"q. c #8CA7BD",
+"r. c #8AA5BB",
+"s. c #364A59",
+"t. c #ABC4E2",
+"u. c #7294AD",
+"v. c #6F90AC",
+"w. c #7192AE",
+"x. c #414A4E",
+"y. c #424A51",
+"z. c #525B63",
+"A. c #626F79",
+"B. c #5F6C76",
+"C. c #5C6971",
+"D. c #5A666F",
+"E. c #58636B",
+"F. c #57636A",
+"G. c #3B5360",
+"H. c #39424B",
+"I. c #7897B3",
+"J. c #A4B9CB",
+"K. c #364853",
+"L. c #AAC9E2",
+"M. c #7091AA",
+"N. c #6F8FA7",
+"O. c #4A5359",
+"P. c #97938C",
+"Q. c #DFDDDA",
+"R. c #E3E1DE",
+"S. c #EBEAE8",
+"T. c #EAE9E7",
+"U. c #CFCEC9",
+"V. c #C9C6C0",
+"W. c #9B968E",
+"X. c #566168",
+"Y. c #4B657A",
+"Z. c #54738C",
+"`. c #AAC6DD",
+" + c #34464E",
+".+ c #AAC9E1",
+"++ c #6C8EA6",
+"@+ c #6C8CA4",
+"#+ c #40474D",
+"$+ c #DAD8D3",
+"%+ c #E7E6E2",
+"&+ c #67655E",
+"*+ c #524F47",
+"=+ c #D9D7D4",
+"-+ c #C7C5BF",
+";+ c #C0BCB5",
+">+ c #B8B3AB",
+",+ c #434C54",
+"'+ c #4D697F",
+")+ c #4F6F84",
+"!+ c #B3CADC",
+"~+ c #313E49",
+"{+ c #A8C8E1",
+"]+ c #6B8DA6",
+"^+ c #728FA4",
+"/+ c #E2E1DD",
+"(+ c #F0EFEC",
+"_+ c #CDCAC6",
+":+ c #C2BFB9",
+"<+ c #CAC6C0",
+"[+ c #DCDAD7",
+"}+ c #4B555D",
+"|+ c #4E697F",
+"1+ c #BACCDC",
+"2+ c #A4C4DE",
+"3+ c #698BA3",
+"4+ c #708AA1",
+"5+ c #383E43",
+"6+ c #E0DEDA",
+"7+ c #514E46",
+"8+ c #4F4C44",
+"9+ c #C7C4BE",
+"0+ c #CBC8C2",
+"a+ c #E1E0DC",
+"b+ c #E9E8E6",
+"c+ c #475158",
+"d+ c #4E6879",
+"e+ c #4D6C80",
+"f+ c #A3C3DB",
+"g+ c #383F43",
+"h+ c #778999",
+"i+ c #6E899E",
+"j+ c #65859C",
+"k+ c #33383C",
+"l+ c #D7D4D0",
+"m+ c #D6D4D0",
+"n+ c #4E4A43",
+"o+ c #4D4942",
+"p+ c #D1CEC9",
+"q+ c #E6E5E2",
+"r+ c #EDECEA",
+"s+ c #454F55",
+"t+ c #486173",
+"u+ c #4D6678",
+"v+ c #A1C1DA",
+"w+ c #373C40",
+"x+ c #0C0D0F",
+"y+ c #4E5E6A",
+"z+ c #5B6E7C",
+"A+ c #4F5B62",
+"B+ c #A4A099",
+"C+ c #CCC9C3",
+"D+ c #D7D5D1",
+"E+ c #E4E2E0",
+"F+ c #DDDBD7",
+"G+ c #B8B5B0",
+"H+ c #3E474D",
+"I+ c #4A6176",
+"J+ c #4A6070",
+"K+ c #9BC3D8",
+"L+ c #363C41",
+"M+ c #28323E",
+" . . ",
+" . + @ . ",
+" . . . . . . . . . . . . . # $ % . . . ",
+" . & * = - ; > , ' ) ! ~ . { ] ^ . / ( _ . ",
+" . : < [ } | 1 2 3 4 5 . 6 7 8 . 9 0 a b . ",
+" . c d e f g h i j k . l m n . o p q r s . ",
+" . t u v w w w w x . y z A . B C D E F G . ",
+" . H I v w w w x . J K L . M N O P Q R S . ",
+" . T U v V C N . W X Y . Z ` ...+.v @.#.. ",
+" . $.%.&.w w *.. =.-.. M N D P *.w v @.;.. ",
+" . >.,.v w x . '.. . M N D P *.w w v ).!.. ",
+" . ~.{.v V ].. . ^./.(._...].C C :.v ).<.. ",
+" . [.}.|.w *.1.2.3.4.5.6.x w w w w v R 7.. ",
+" . 8.9.0.a.Q b.c.c.d.e.E v v v v f.g.h.i.. ",
+" . j.k.F R h.F l.m.F n.h.o.o.).p.q.R r.s.. ",
+" . t.u.v.w.x.y.z.A.B.C.D.E.F.z.G.H.I.J.K.. ",
+" . L.M.N.O.P.Q.R.S.S.T.Q.U.V.W.X.Y.Z.`. +. ",
+" . .+++@+#+$+%+&+*+*+=+-+;+>+U.,+'+)+!+~+. ",
+" . {+]+^+#+/+(+&+*+*+_+:+;+<+[+}+|+)+1+~+. ",
+" . 2+3+4+5+6+S.7+8+8+9+;+0+a+b+c+d+e+f+g+. ",
+" . h+i+j+k+l+m+n+o+o+;+p+q+r+q+s+t+u+v+w+. ",
+" x+y+z+A+B+;+>+C+C+D+E+T.F+G+H+I+J+K+L+. ",
+" . . . . . . . . . . . . . . . . M+. ",
+" "};
--- /dev/null
+/* XPM */
+static char * search_xpm[] = {
+"24 24 207 2",
+" c None",
+". c #000000",
+"+ c #D3D3D3",
+"@ c #F6F6F6",
+"# c #FFFFFF",
+"$ c #F9F9F9",
+"% c #DADADA",
+"& c #585858",
+"* c #C7C7C7",
+"= c #D1D1D1",
+"- c #D6D6D6",
+"; c #FEFEFE",
+"> c #FDFDFD",
+", c #C0C0C0",
+"' c #E1E1E1",
+") c #F0F0F0",
+"! c #9B9B9B",
+"~ c #FCFCFB",
+"{ c #FBFBFB",
+"] c #AFAFAE",
+"^ c #E9E9E9",
+"/ c #DFDFDF",
+"( c #8F8F8F",
+"_ c #FAFAF9",
+": c #F9F9F8",
+"< c #A4A4A3",
+"[ c #F4F4F4",
+"} c #CFCFCF",
+"| c #A2A2A2",
+"1 c #B8B8B8",
+"2 c #47473F",
+"3 c #0A0A09",
+"4 c #4B4B43",
+"5 c #B4B4B3",
+"6 c #F7F6F5",
+"7 c #9E9E9E",
+"8 c #A9A9A8",
+"9 c #34342E",
+"0 c #9D9D8D",
+"a c #CFCFB9",
+"b c #C4C4AF",
+"c c #8D8D7F",
+"d c #353530",
+"e c #ACACAA",
+"f c #F1F0EF",
+"g c #DEDDDC",
+"h c #D3D2D0",
+"i c #B7B7B5",
+"j c #9F9E9D",
+"k c #706F6F",
+"l c #65625A",
+"m c #46463F",
+"n c #9C9C8C",
+"o c #E2E2D0",
+"p c #EDEDE7",
+"q c #C0C0AC",
+"r c #B2B29F",
+"s c #828274",
+"t c #4C4C44",
+"u c #E4E4E2",
+"v c #E1E1DF",
+"w c #DAD9D7",
+"x c #D8D8D6",
+"y c #CDCCCA",
+"z c #AFAEAC",
+"A c #88847B",
+"B c #F8F8F7",
+"C c #090908",
+"D c #D5D5BF",
+"E c #FBFBFA",
+"F c #C3C3AE",
+"G c #B5B5A2",
+"H c #A6A695",
+"I c #9C9C8F",
+"J c #080807",
+"K c #CFCFCD",
+"L c #E3E2E0",
+"M c #ECEBE9",
+"N c #E9E8E6",
+"O c #D5D4D3",
+"P c #C4C3C2",
+"Q c #8F8A81",
+"R c #F6F5F4",
+"S c #F3F3F1",
+"T c #090909",
+"U c #CACAB5",
+"V c #DDDDD0",
+"W c #B7B7A4",
+"X c #AAAA98",
+"Y c #9B9B8B",
+"Z c #AEAEA3",
+"` c #BBBAB9",
+" . c #E8E7E5",
+".. c #E5E4E2",
+"+. c #E4E3E0",
+"@. c #D2D1CE",
+"#. c #8D887E",
+"$. c #F4F3F2",
+"%. c #F0EFEE",
+"&. c #474740",
+"*. c #929283",
+"=. c #BABAA7",
+"-. c #ADAD9B",
+";. c #9F9F8E",
+">. c #ACACA1",
+",. c #CFCFCB",
+"'. c #4C4C45",
+"). c #B3B2B1",
+"!. c #E2E1DE",
+"~. c #E1DFDC",
+"{. c #979288",
+"]. c #949493",
+"^. c #34342F",
+"/. c #878779",
+"(. c #A0A090",
+"_. c #AEAEA2",
+":. c #C3C3BE",
+"<. c #010101",
+"[. c #B1B0AF",
+"}. c #D2D1CF",
+"|. c #A49E93",
+"1. c #F0F0EE",
+"2. c #EDEDEB",
+"3. c #DDDDDB",
+"4. c #898988",
+"5. c #414141",
+"6. c #737271",
+"7. c #A4A3A1",
+"8. c #DFDEDB",
+"9. c #E2E0DD",
+"0. c #E1E0DC",
+"a. c #E0DFDB",
+"b. c #A19C90",
+"c. c #E1E0DE",
+"d. c #CBCAC9",
+"e. c #B2B1B0",
+"f. c #A3A2A1",
+"g. c #9D9C9A",
+"h. c #9E9D9C",
+"i. c #9F9F9D",
+"j. c #ABAAA7",
+"k. c #DCDBD7",
+"l. c #DEDDD9",
+"m. c #DDDCD8",
+"n. c #A19B90",
+"o. c #EBEAE8",
+"p. c #E6E5E3",
+"q. c #C8C7C4",
+"r. c #B6B6B3",
+"s. c #B0AFAD",
+"t. c #B3B2B0",
+"u. c #747371",
+"v. c #9D9C99",
+"w. c #DAD9D5",
+"x. c #E7E6E3",
+"y. c #E6E5E2",
+"z. c #E3E2DF",
+"A. c #DBDAD7",
+"B. c #D4D3D0",
+"C. c #D0CFCB",
+"D. c #D1CFCC",
+"E. c #D1D0CC",
+"F. c #C9C8C4",
+"G. c #6B6B69",
+"H. c #CECDC9",
+"I. c #D6D4D0",
+"J. c #9F998D",
+"K. c #E3E2DE",
+"L. c #E4E2DF",
+"M. c #DFDEDA",
+"N. c #D5D4D0",
+"O. c #C0BFBC",
+"P. c #7B7A78",
+"Q. c #BCBAB6",
+"R. c #CECCC8",
+"S. c #9D978C",
+"T. c #EDEDED",
+"U. c #E1E0DD",
+"V. c #E2E1DD",
+"W. c #DBDAD6",
+"X. c #BBB9B6",
+"Y. c #A6A4A1",
+"Z. c #9E9C99",
+"`. c #ACABA7",
+" + c #C7C5C2",
+".+ c #9B9589",
+"++ c #E1DFDB",
+"@+ c #E0DEDA",
+"#+ c #DEDCD8",
+"$+ c #DAD8D4",
+"%+ c #BDBCB8",
+"&+ c #ACABA8",
+"*+ c #B2B1AD",
+"=+ c #C6C4C0",
+"-+ c #999388",
+";+ c #999891",
+">+ c #A39E92",
+",+ c #A39D92",
+"'+ c #A39D91",
+")+ c #A29C90",
+"!+ c #A19B8F",
+"~+ c #9D978B",
+"{+ c #989286",
+"]+ c #918C82",
+"^+ c #938D83",
+"/+ c #979286",
+"(+ c #666258",
+" ",
+" . . . . . . . . . . . . . ",
+" . + @ # # # # # # # # $ % & . ",
+" . @ # # # # # # # # # # * = - . ",
+" . # # # # # # # ; # ; > , ' ) ! . ",
+" . # # # # # ; > ~ > ~ { ] ^ # / ( . ",
+" . # # # ; > ~ { _ { _ : < ) # [ } | . ",
+" . # ; > ~ 1 2 3 3 4 5 6 7 . . . . . . . ",
+" . # ~ { 8 9 0 a b c d e f g h i j k l . ",
+" . # _ : m n o p q r s t u v w x y z A . ",
+" . # B 6 C D E F G H I J K L M N O P Q . ",
+" . # R S T U V W X Y Z 3 ` w ...+.@.#.. ",
+" . # $.%.&.*.=.-.;.>.,.'.).h !.+.!.~.{.. ",
+" . # $.%.].^./.(._.:.<.<.[.}.!.+.!.~.|.. ",
+" . # 1.2.3.4.4 3 3 5.6.<.<.7.8.9.0.a.b.. ",
+" . # 2.M c.d.e.f.g.h.i.<.<.<.j.k.l.m.n.. ",
+" . # o.N p.w q.r.z s.t.u.. <.<.v.w.k.n.. ",
+" . # x.y.y.z.A.B.C.D.E.F.G.<.<.<.H.I.J.. ",
+" . $ +.z.K.L.K.a.a.M.M.N.O.P.<.<.Q.R.S.. ",
+" . T.U.~.0.a.V.a.0.a.0.W.E.X.Y.Z.`. +.+. ",
+" . = ++@+M.l.a.l.@+l.@+#+$+R.%+&+*+=+-+. ",
+" . ;+>+|.,+'+,+b.)+b.)+!+n.~+{+]+^+/+(+. ",
+" . . . . . . . . . . . . . . . . . . ",
+" "};
--- /dev/null
+/* XPM */
+static char * separator_xpm[] = {
+"2 24 3 1",
+" c None",
+". c #DBD3CB",
+"+ c #FCFBFA",
+" ",
+" ",
+" ",
+".+",
+".+",
+".+",
+".+",
+".+",
+".+",
+".+",
+".+",
+".+",
+".+",
+".+",
+".+",
+".+",
+".+",
+".+",
+".+",
+".+",
+".+",
+" ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char * stock_sort_ascending_xpm[] = {
+"23 23 7 1",
+" c None",
+". c #314E6C",
+"+ c #000000",
+"@ c #D1DECF",
+"# c #7DA377",
+"$ c #E4ECE3",
+"% c #B3C9AF",
+" ",
+" .... ",
+" .. .. ",
+" .. .. ",
+" ...... ",
+" .. .. ",
+" .. .. ",
+" ",
+" + ",
+" ",
+" + ",
+" ",
+" + + ",
+" +@+ + ",
+" +@##+ ++ ++++++ ",
+" +###+$+ +++ ",
+" +##%#+ +++ ",
+" +%##+ +++ ",
+" +$###+ +++ ",
+" +++++++ ++++++ ",
+" ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char * stock_sort_column_ascending_xpm[] = {
+"24 24 2 1",
+" c None",
+". c #000000",
+" ",
+" ",
+" ... ",
+" . .. ",
+" .. ",
+" .. ",
+" .. ",
+" .. ",
+" .. ",
+" ..... . ",
+" ",
+" . ",
+" ",
+" . ",
+" .... ",
+" .. .. ",
+" .. .. ",
+" .. .. ",
+" ..... ",
+" .. ",
+" . ... ",
+" ..... ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char * stock_sort_criteria_xpm[] = {
+"24 24 28 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+"@ c #D3D3D3",
+"# c #F2ECE1",
+"$ c #F4EFE5",
+"% c #DFDAD2",
+"& c #C9C4BD",
+"* c #74716E",
+"= c #FAFAFA",
+"- c #EADFC9",
+"; c #ECE2CF",
+"> c #EEE5D4",
+", c #4C4B48",
+"' c #F5F5F5",
+") c #C9C9C9",
+"! c #E2D2B1",
+"~ c #CFC4B1",
+"{ c #BFBFBF",
+"] c #C0C0C0",
+"^ c #C7B99C",
+"/ c #F0F0F0",
+"( c #B7B7B7",
+"_ c #9A8F78",
+": c #877E69",
+"< c #AFA389",
+"[ c #A09889",
+"} c #314E6C",
+" ",
+" ",
+" ...... ",
+" ... ",
+" ... ",
+" ... ",
+" ......... ... ",
+" .+@.#$%&*. ...... ",
+" .=@.-;;;>, ",
+" .').!!!!.~. ",
+" .{].^^!.^.~. ",
+" ./(.._.^.:.~. ",
+" .....<.:...[. ",
+" .:.. .. ",
+" .. ",
+" ",
+" }}}} ",
+" }} }} ",
+" }} }} ",
+" }}}}}} ",
+" }} }} ",
+" }} }} ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char * stock_sort_descending_xpm[] = {
+"24 23 7 1",
+" c None",
+". c #000000",
+"+ c #D1DECF",
+"@ c #7DA377",
+"# c #314E6C",
+"$ c #E4ECE3",
+"% c #B3C9AF",
+" ",
+" ",
+" ...... ",
+" ... ",
+" ... ",
+" ... ",
+" ... ",
+" ...... ",
+" . ",
+" ",
+" . ",
+" ",
+" . . ",
+" .+. . ",
+" .+@@. .. #### ",
+" .@@@.$. ## ## ",
+" .@@%@. ## ## ",
+" .%@@. ###### ",
+" .$@@@. ## ## ",
+" ....... ## ## ",
+" ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char * stock_sort_row_ascending_xpm[] = {
+"21 17 2 1",
+" c None",
+". c #000000",
+" ",
+" ",
+" ",
+" ",
+" ... .... ",
+" . .. .. .. ",
+" .. .. .. ",
+" .. .. .. ",
+" .. ..... ",
+" .. .. ",
+" .. . .. ",
+" ..... . . . ..... ",
+" ",
+" ",
+" ",
+" ",
+" "};
--- /dev/null
+/* XPM */
+static char * spell_xpm[] = {
+"24 24 37 1",
+" c None",
+". c #000000",
+"+ c #8BBB8C",
+"@ c #ABD0AC",
+"# c #1A3B1A",
+"$ c #8ABA88",
+"% c #B4D5B4",
+"& c #70A770",
+"* c #132C13",
+"= c #77A676",
+"- c #2D2D2D",
+"; c #CBDFCB",
+"> c #6FAE6E",
+", c #A8CBA6",
+"' c #6D9D6C",
+") c #D0E4D0",
+"! c #6FAF6F",
+"~ c #587055",
+"{ c #B8D6B8",
+"] c #5B9159",
+"^ c #D4E4D4",
+"/ c #67AF67",
+"( c #5D905B",
+"_ c #9FC59D",
+": c #93BE92",
+"< c #B5D1B5",
+"[ c #67AF68",
+"} c #63A261",
+"| c #BBD6BA",
+"1 c #82B881",
+"2 c #75AF74",
+"3 c #6B8868",
+"4 c #9DC39D",
+"5 c #7DB17B",
+"6 c #6BA368",
+"7 c #485C46",
+"8 c #89BA88",
+" ",
+" ",
+" ",
+" ",
+" ... .... ... ",
+" .. . .. . .. . ",
+" .. . .... .. ",
+" ..... .. . .. ",
+" .. . .. . .. . . ",
+" .. . .... ... ... ",
+" .+. ",
+" .. .@# ",
+" .$. .%&. ",
+" *=. -;>. ",
+" .,'. .)!~. ",
+" .{].^/(. ",
+" ._:<[}~. ",
+" .|123. ",
+" .4567. ",
+" .83. ",
+" .37. ",
+" .. ",
+" ",
+" "};
+2006-04-11 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus.el: No Gnus v0.4 is released.
+
+2006-04-11 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnslashdot.el (nnslashdot-retrieve-headers-1): Fix up to new
+ layout.
+
+ * rfc2047.el (rfc2047-decode-encoded-words): Don't message about
+ unknown charset.
+
+ * message.el (message-header-synonyms): Add Original-To to the
+ default.
+
+ * gnus-sum.el (gnus-get-newsgroup-headers-xover): group is an
+ optional parameter.
+
+2006-04-06 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-fun.el (gnus): Require it for gnus-directory.
+
+2006-04-06 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-fun.el (gnus-face-properties-alist): Add :version.
+
+2006-04-05 Daiki Ueno <ueno@unixuser.org>
+
+ * pgg-gpg.el (pgg-gpg-process-filter): Fix.
+
+2006-04-05 Simon Josefsson <jas@extundo.com>
+
+ * password.el (password-reset): New function.
+
+2006-04-05 Daiki Ueno <ueno@unixuser.org>
+
+ * pgg-gpg.el (pgg-gpg-encrypt-region, pgg-gpg-sign-region): Wait
+ for BEGIN_SIGNING too, new in GnuPG 1.4.3.
+
+2006-04-04 Andreas Seltenreich <uwi7@rz.uni-karlsruhe.de>
+
+ * nnweb.el (nnweb-google-create-mapping): Update regexp. Some
+ whitespace was matched into the url, which broke browsing hits
+ > 100 when mm-url-use-external was nil.
+
+2006-04-04 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-sum.el (gnus-summary-from-or-to-or-newsgroups): Check
+ gnus-extra-headers for 'Newsgroups.
+
+ * message.el (message-tool-bar-gnome): Check if `flyspell-mode' is
+ bound.
+
+2006-04-04 Daiki Ueno <ueno@unixuser.org>
+
+ * pgg-gpg.el: Clean up process buffers every time gpg processes
+ complete.
+
+2006-04-03 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-fun.el (gnus-convert-image-to-face-command): Fix typo in
+ doc string.
+
+2006-04-03 Daiki Ueno <ueno@unixuser.org>
+
+ * pgg-gpg.el (pgg-gpg-process-filter)
+ (pgg-gpg-wait-for-completion): Check if buffer is alive.
+
+ * pgg-gpg.el (pgg-gpg-process-sentinel): Don't remove GNUPG:
+ lines, temporary fix.
+
+2006-03-31 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-group.el (gnus-group-update-tool-bar): Add :initialize and
+ :set.
+
+2006-03-29 Daiki Ueno <ueno@unixuser.org>
+
+ * pgg-gpg.el (pgg-gpg-start-process): Don't bind
+ default-enable-multibyte-characters. This reverts the change from
+ revision 6.17 which is no longer necessary because the passphrase
+ is sent separately now. GnuPG messages are unreadable under
+ multibyte locales with default-enable-multibyte-characters set to
+ nil.
+
+2006-03-28 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * message.el (message-tool-bar-gnome): Move "spell".
+
+2006-03-27 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-sum.el (gnus-summary-from-or-to-or-newsgroups): Don't use
+ XEmacs-only `replace-in-string'. Use `gnus-group-real-name'
+ instead.
+
+2006-03-27 Karl Kleinpaste <karl@charcoal.com>
+
+ * gnus-sum.el (gnus-summary-from-or-to-or-newsgroups): Improve
+ newsgroups handling for NNTP overviews which don't include
+ Newsgroups.
+
+2006-03-26 Andreas Seltenreich <uwi7@rz.uni-karlsruhe.de>
+
+ * message.el (message-resend): Bind message-generate-hashcash to
+ to nil.
+
+2006-03-26 Andreas Seltenreich <uwi7@rz.uni-karlsruhe.de>
+
+ * hashcash.el (hashcash-already-paid-p): Bind case-fold-search
+ when searching for already-paid recipients.
+
+2006-03-27 Daiki Ueno <ueno@unixuser.org>
+
+ * pgg-gpg.el: Invoke gpg asynchronous, to avoid querying for
+ passphrases when it is not needed.
+ (pgg-gpg-use-agent): Add, to hard code that pgg shouldn't wait for
+ passphrase stuff from gpg, should only be necessary when you use
+ gpg with a smartcard.
+
+2006-03-23 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * mml.el (mml-insert-mime): Ignore cached contents of
+ message/external-body part.
+
+ * mm-decode.el (mm-get-part): Add optional 'no-cache' argument.
+ (mm-insert-part): Ditto.
+
+2006-03-23 Simon Josefsson <jas@extundo.com>
+
+ * pgg-gpg.el (pgg-gpg-update-agent): Add again, with fixes from
+ Reiner.
+ (pgg-gpg-use-agent-p): Use it again.
+
+2006-03-23 Simon Josefsson <jas@extundo.com>
+
+ * pgg-gpg.el (pgg-gpg-update-agent): Remove, doesn't work with
+ older emacsen.
+ (pgg-gpg-use-agent-p): Don't use it.
+
+2006-03-23 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * pgg-gpg.el (pgg-gpg-update-agent): Only use make-network-process
+ if we can.
+
+2006-03-22 Sascha Wilde <wilde@sha-bang.de>
+
+ * pgg-gpg.el (pgg-gpg-use-agent): Disable by default.
+ (pgg-gpg-update-agent): New function.
+ (pgg-gpg-use-agent-p): New function.
+ (pgg-gpg-process-region, pgg-gpg-encrypt-region)
+ (pgg-gpg-encrypt-symmetric-region, pgg-gpg-decrypt-region)
+ (pgg-gpg-sign-region): Use it.
+
+2006-03-22 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-sum.el (gnus-map-articles): Don't funcall symbol macro.
+ Reported by Ralf Wachinger <rwachinger@gmx.de>.
+
+2006-03-21 Simon Josefsson <jas@extundo.com>
+
+ * pgg-gpg.el: Ideas below based on patch from Sascha Wilde
+ <wilde@sha-bang.de>.
+ (pgg-gpg-use-agent): New variable.
+ (pgg-gpg-process-region): Use it.
+ (pgg-gpg-encrypt-region): Likewise.
+ (pgg-gpg-encrypt-symmetric-region): Likewise.
+ (pgg-gpg-decrypt-region): Likewise.
+ (pgg-gpg-sign-region): Likewise.
+ (pgg-gpg-possibly-cache-passphrase): Don't cache a nil password.
+
+2006-03-21 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-agent.el (gnus-agent-queue-mail): Fix custom tag for `t'.
+
+ * spam.el (spam-mark-new-messages-in-spam-group-as-spam): Add
+ comment on version.
+
+2006-03-20 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * smiley.el: Add missing test smiley.
+
+2006-03-17 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * mm-decode.el (mm-with-part): New macro.
+ (mm-get-part): Use it; work with message/external-body as well.
+ (mm-save-part): Treat name and filename equally.
+
+ * mm-extern.el (mm-extern-cache-contents): New function.
+ (mm-inline-external-body): Use it; force the part to be displayed;
+ move undisplayer added to the cached handle to the parent.
+
+ * gnus-art.el (gnus-mime-save-part-and-strip): Add name parameter.
+ (gnus-mime-view-part-as-type): Work with message/external-body.
+
+ * gnus-util.el (gnus-tool-bar-update): Bind tool-bar-mode.
+
+2006-03-16 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gmm-utils.el (gmm-image-load-path-for-library): Prefer user's
+ images in image-load-path. [Sync with image.el, revision 1.60, in
+ Emacs.]
+
+2006-03-15 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gmm-utils.el (gmm-image-load-path-for-library): Pass value of
+ path rather than symbol. Always return list of directories.
+ Guarantee that image directory comes first. [Sync with image.el,
+ revision 1.59, in Emacs.]
+
+ * message.el (message-make-tool-bar): Adjust to new API of
+ `gmm-image-load-path-for-library'.
+
+ * gnus-sum.el (gnus-summary-make-tool-bar): Ditto.
+
+ * gnus-group.el (gnus-group-make-tool-bar): Ditto.
+
+2006-03-15 Andreas Seltenreich <uwi7@rz.uni-karlsruhe.de>
+
+ * gnus-art.el (gnus-article-only-boring-p): Bind
+ inhibit-point-motion-hooks to avoid infinite loop when entering
+ intangible text. Reported by Ralf Wachinger
+ <rwnewsmampfer@geekmail.de>.
+
+2006-03-14 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gmm-utils.el (gmm-image-load-path-for-library): Fix typo. Use
+ `defun' instead of `gmm-defun-compat'.
+
+2006-03-14 Simon Josefsson <jas@extundo.com>
+
+ * message.el (message-unique-id): Don't use message-number-base36
+ if (user-uid) is a float. Reported by Bjorn Solberg
+ <bjorn_ding1@hekneby.org>.
+
+2006-03-13 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * mm-uu.el (mm-uu-dissect): Dissect all parts correctly.
+
+ * gnus-art.el (gnus-mime-display-single): Make sure there is an
+ empty line between a part and a message part.
+
+2006-03-10 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * smiley.el: Add more test smileys.
+ (smiley-data-directory, smiley-regexp-alist)
+ (gnus-smiley-file-types): Fix doc strings.
+ (smiley-update-cache): Clear smiley-cached-regexp-alist before
+ adding new elements.
+ (smiley-mouse-map): Unused code. Make it a comment.
+
+2006-03-10 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-nocem.el (gnus-nocem-scan-groups): Add autoload cookie;
+ scan latest NoCeM messages instead of old ones.
+ (gnus-nocem-check-article): Fix regexps so as to match to PGP
+ delimiters that are recently used.
+ (gnus-nocem-load-cache): Add autoload cookie.
+
+ * gnus.el (gnus-use-nocem): Enable it to be set to also a number.
+
+ * gnus-start.el (gnus-setup-news): Scan NoCeM messages if a group
+ level which is larger than gnus-use-nocem is specified.
+
+ * gnus-group.el (gnus-group-get-new-news): Ditto.
+
+2006-03-08 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-util.el (gnus-tool-bar-update): New function.
+
+ * gnus-group.el (gnus-group-update-tool-bar): New variable.
+ (gnus-group-insert-group-line): Add gnus-tool-bar-update.
+
+ * gnus-topic.el (gnus-topic-prepare-topic): Add gnus-tool-bar-update.
+
+ * gnus-group.el (gnus-group-redraw-when-idle)
+ (gnus-group-redraw-check): Remove.
+ (gnus-group-make-tool-bar): Remove gnus-group-redraw-check.
+
+2006-03-08 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * nnmail.el (nnmail-split-it): Invert match-partial-words behavior
+ if optional last element is specified in splits (FIELD VALUE...).
+
+2006-03-07 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * message.el (message-make-tool-bar): Rename gmm-image-load-path
+ to gmm-image-load-path-for-library. Call with no-error argument.
+ (message-tool-bar-gnome): Rename "mail/attach" to "attach".
+
+ * gnus-sum.el (gnus-summary-make-tool-bar): Ditto.
+
+ * gnus-group.el (gnus-group-make-tool-bar): Ditto.
+
+ * gmm-utils.el (gmm-image-load-path): Remove alias.
+
+2006-03-06 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gmm-utils.el (gmm-image-load-path): Add alias.
+
+ * nnml.el (nnml-generate-nov-databases-directory): Rename from
+ nnml-generate-nov-databases-1.
+ (nnml-generate-nov-databases): Use it.
+ (nnml-generate-nov-databases-directory): Document no-active
+ argument.
+
+ * gmm-utils.el (gmm-image-load-path-for-library): Return single
+ directory if path is t. Add no-error.
+
+ * gnus-group.el (gnus-group-make-tool-bar): Use add-hook.
+ Suggested by Stefan Monnier <monnier@iro.umontreal.ca>.
+
+ * gnus-art.el (gnus-article-browse-delete-temp-files): Simplify
+ resetting gnus-article-browse-html-temp-list.
+
+ * gmm-utils.el (gmm-image-load-path-for-library): Sync with
+ mh-compat.el revision 1.9 in Emacs. Rename `gmm-image-load-path'.
+ Add example to docstring. Rename local variables. Move error
+ checks to default case in cond and simplify.
+
+2006-03-06 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * mm-view.el (mm-w3m-cid-retrieve-1): Check carefully whether
+ handle is multipart when calling it recursively.
+ (mm-w3m-cid-retrieve): Display warning if retrieving fails.
+
+2006-03-03 Daniel Pittman <daniel@rimspace.net>
+
+ * nnimap.el (nnimap-request-update-info-internal): Optimize.
+ Don't `gnus-uncompress-range' to avoid excessive memory usage.
+
+2006-03-03 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-group.el (gnus-group-tool-bar-gnome): Check if gnus-topic.el
+ is loaded.
+
+ * gnus-sum.el (gnus-summary-tool-bar-gnome): Check if spam.el is
+ loaded.
+
+2006-03-03 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * mm-util.el (mm-with-unibyte-current-buffer): Change "Emacs 23"
+ to "Emacs 23 (unicode)" in doc string.
+
+ * gnus-sum.el (gnus-summary-set-display-table): Change "Emacs 23" to
+ "Emacs 23 (unicode)" in comment.
+
+2006-03-03 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * mm-decode.el (mm-get-part): Don't use
+ mm-with-unibyte-current-buffer.
+
+ * gnus-sum.el (gnus-summary-set-display-table): Don't nix out
+ characters 160 through 255 in Emacs 23.
+
+2006-03-02 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-art.el (gnus-article-browse-html-temp-list): Rename from
+ gnus-article-browse-html-temp.
+ (gnus-article-browse-delete-temp): Make it customizable. Add
+ `file'. Adjust doc string.
+ (gnus-article-browse-delete-temp-files): Add argument. Allow
+ query for each file. Adjust doc string.
+ (gnus-article-browse-html-parts): Add
+ `gnus-article-browse-delete-temp-files' to
+ `gnus-summary-prepare-exit-hook' and `gnus-exit-gnus-hook'.
+
+2006-03-02 Hynek Schlawack <hynek@ularx.de>
+
+ * gnus-art.el (gnus-article-browse-html-temp)
+ (gnus-article-browse-delete-temp): New variables.
+ (gnus-article-browse-delete-temp-files): New function.
+ (gnus-article-browse-html-parts): Use it.
+
+2006-03-02 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-group.el (gnus-group-redraw-check): Remove redundant tests.
+
+ * gmm-utils.el (gmm-image-load-path): Mention ../etc search in doc
+ string.
+
+ * gnus-sum.el (gnus-summary-tool-bar-gnome): Don't use
+ gnus-summary-insert-new-articles when unplugged. Remove
+ gnus-summary-search-article-forward.
+
+ * gmm-utils.el (gmm-tool-bar-style): Test tool-bar-mode and
+ display-visual-class instead of display-color-cells.
+
+2006-03-02 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * dgnushack.el: Autoload customize-group for XEmacs.
+
+ * mml.el (mml-generate-mime-1): Encode parts other than text/* or
+ message/* containing non-ASCII text properly.
+
+2006-03-01 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * message.el: Require gmm-utils, remove autoloads.
+ (message-tool-bar): Set default based on
+ gmm-tool-bar-style.
+ (message-tool-bar-gnome): Add gmm-customize-mode.
+
+ * gnus-sum.el (gnus-summary-tool-bar): Set default based on
+ gmm-tool-bar-style.
+ (gnus-summary-tool-bar-gnome): Add gmm-customize-mode.
+
+ * gnus-group.el (gnus-group-tool-bar): Set default based on
+ gmm-tool-bar-style.
+ (gnus-group-tool-bar-gnome): Add gmm-customize-mode.
+
+ * gmm-utils.el (gmm-image-directory): Rename variable from
+ gmm-image-load-path.
+ (gmm-image-load-path): Use gmm-image-directory.
+ (gmm-customize-mode): New function.
+ (gmm-tool-bar-style): New variable.
+
+ * gnus-group.el (gnus-group-redraw-when-idle): Rename from
+ gnus-group-redraw-line-number.
+ (gnus-group-redraw-check): Simplify.
+ (gnus-group-tool-bar-update): Remove redraw check.
+ (gnus-group-make-tool-bar): Add redraw check.
+
+2006-03-01 Michael Piotrowski <mxp@dynalabs.de> (tiny change)
+
+ * gnus-art.el (gnus-button): Add missing parentheses.
+
+2006-03-01 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * lpath.el: Fbind line-number-at-pos.
+
+2006-02-28 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * mm-util.el (mm-with-unibyte-current-buffer): Add note.
+
+2006-02-28 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-art.el (gnus-button): New face.
+ (gnus-article-button-face): Use it.
+
+ * gnus-sum.el (gnus-summary-tool-bar-gnome): Add
+ gnus-summary-next-page. Re-order.
+
+ * gnus-group.el (gnus-group-tool-bar-gnome): prev-node and
+ next-node are now included.
+ (gnus-group-redraw-line-number): New internal variable.
+ (gnus-group-redraw-check): Helper function for updating the tool
+ bar.
+ (gnus-group-tool-bar-update): Add gnus-group-redraw-check.
+
+ * gmm-utils.el (gmm-tool-bar-item): Add TODO about modifiers.
+
+ * spam.el (spam-spamassassin-score-regexp): New internal variable.
+ (spam-extra-header-to-number, spam-check-spamassassin-headers):
+ Use it to match format of Spamassassin 3.0 and later. Reported by
+ IRIE Tetsuya <irie@t.email.ne.jp>.
+ (spam-check-bogofilter)
+ (spam-bogofilter-register-with-bogofilter): Fix args of
+ `gnus-error' calls.
+
+2006-02-28 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-draft.el (gnus-draft-send): Bind message-signature to avoid
+ unnecessary interaction when sending queued mails. Reported by
+ TAKAHASHI Yoshio <tkh@jp.fujitsu.com>.
+
+2006-02-27 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-sum.el (gnus-sequence-of-unread-articles): Return nil if
+ first or last are nil.
+
+2006-02-24 Andreas Seltenreich <uwi7@rz.uni-karlsruhe.de>
+
+ * nnweb.el (nnweb-gmane-create-mapping): Don't choke on ^M.
+
+2006-02-24 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-int.el (gnus-open-server): Respect gnus-batch-mode.
+
+2006-02-24 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * dns.el (query-dns): Protect more against buggy tcp output.
+
+2006-02-24 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * nnweb.el (nnweb-type-definition, nnweb-gmane-search): Use new
+ nov.php.
+
+2006-02-24 Andreas Seltenreich <uwi7@stud.uni-karlsruhe.de>
+
+ * nnweb.el (nnweb-type-definition, nnweb-gmane-create-mapping)
+ (nnweb-gmane-wash-article, nnweb-gmane-search): Fix Gmane web
+ groups. Kudos to Olly Betts <olly@survex.com> for providing NOV
+ output on the server side.
+ (nnweb-google-create-mapping): Update regexps and add some
+ progress indication.
+
+2006-02-23 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-group.el (gnus-group-tool-bar-gnome): Fix
+ gnus-agent-toggle-plugged. Re-order icons.
+ (gnus-group-tool-bar-gnome): Add
+ gnus-group-{prev,next}-unread-group.
+ (gnus-group-tool-bar-gnome): Re-order icons.
+
+ * gnus-sum.el (gnus-summary-tool-bar-gnome): Move
+ gnus-summary-insert-new-articles.
+
+ * message.el (message-tool-bar-gnome, message-tool-bar-retro): Fix
+ comments.
+
+ * utf7.el (utf7-utf-16-coding-system): Fix comment. utf-16-be is
+ also available in Emacs 21.3.
+
+ * message.el (message-fix-before-sending): Change "Emacs 22" to
+ "Emacs 23 (unicode)" in comment.
+
+ * qp.el (quoted-printable-encode-region): Change "Emacs 22" to
+ "Emacs 23 (unicode)" in comment.
+
+ * mm-util.el: Change "Emacs 22" to "Emacs 23 (unicode)" in
+ comment.
+ (mm-coding-system-p): Add comment about no-MULE XEmacs.
+
+ * mm-view.el (mm-fill-flowed): Add :version.
+
+2006-02-23 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gmm-utils.el (gmm-image-load-path): Don't modify image-load-path
+ and load-path.
+
+2006-02-22 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * message.el: Autoload gmm-image-load-path.
+ (message-tool-bar-retro): Prepend "gnus/" subdirectory to some
+ icon file names. Use old Emacs 21 "mail_send.xpm" icon for
+ consitency.
+
+ * gmm-utils.el (gmm-image-load-path): Also search in
+ "../etc/images". Don't set gmm-image-load-path if we don't find
+ the image.
+
+2006-02-22 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gmm-utils.el (gmm-image-load-path): Don't make
+ `gmm-image-load-path' include subdirectories which the second arg
+ `image' might specify.
+
+ * gnus-group.el (gnus-group-tool-bar-retro): Prepend the "gnus/"
+ subdirectory to icon file names.
+
+ * gnus-sum.el (gnus-summary-tool-bar-retro): Ditto.
+
+2006-02-21 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-group.el (gnus-group-make-tool-bar): Add IMAGE argument to
+ gmm-image-load-path calls.
+
+ * gnus-sum.el (gnus-summary-make-tool-bar): Ditto.
+
+ * message.el (message-make-tool-bar): Ditto.
+
+ * mml.el (mml-preview): Added comment concerning tool bar icons.
+
+ * gnus-group.el (gnus-group-tool-bar-gnome): Use new icon names.
+ (gnus-group-make-tool-bar): Use `gmm-image-load-path'.
+
+ * gnus-sum.el (gnus-summary-tool-bar-gnome): Use new icon names.
+ (gnus-summary-make-tool-bar): Use `gmm-image-load-path'.
+
+ * message.el (message-tool-bar-gnome): Use new icon names.
+ (message-make-tool-bar): Use `gmm-image-load-path'.
+
+ * gmm-utils.el (gmm-defun-compat, gmm-image-search-load-path): New
+ functions from MH-E.
+ (gmm-image-load-path): New variable from MH-E.
+ (gmm-image-load-path): New function from MH-E. Added arguments
+ LIBRARY, IMAGE and PATH. Don't modify paths. Don't use
+ *-image-load-path-called-flag.
+
+2006-02-21 Milan Zamazal <pdm@brailcom.org>
+
+ * mm-view.el (mm-view-pkcs7-verify): Implement using smime.el.
+
+2006-02-21 Wolfram Fenske <wolfram.fenske@student.uni-magdeburg.de>
+ (tiny change)
+
+ * nnimap.el (nnimap-request-move-article): Change folder back to
+ source group before deleting.
+
+2006-02-20 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * mm-util.el (mm-charset-override-alist): Fix type in doc string.
+
+ * gnus-art.el (mm-url-insert-file-contents-external): Autoload
+ mm-url.
+
+ * mm-uu.el (mm-uu-type-alist): Improve `LaTeX'.
+
+2006-02-20 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * rfc2047.el (rfc2047-charset-to-coding-system): Don't check the
+ coding system which mm-charset-to-coding-system returns for a
+ given charset is valid.
+
+2006-02-16 Juanma Barranquero <lekktu@gmail.com>
+
+ * html2text.el (html2text-remove-tag-list):
+ * spam-stat.el (spam-stat-buffer-words): Fix typo in docstring.
+
+2006-02-14 Chong Yidong <cyd@stupidchicken.com>
+
+ * gnus-cus.el: Revert 2005-10-17 change.
+
+2006-02-17 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-art.el (article-strip-banner): Call
+ article-really-strip-banner only when the regexp match is made.
+
+2006-02-16 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-art.el (article-strip-banner): Use
+ gnus-extract-address-components instead of
+ mail-header-parse-addresses to make it work with non-ASCII text;
+ remove mail-encode-encoded-word-string.
+
+ * rfc2231.el (rfc2231-parse-string): Attempt to parse parameter
+ values which are surrounded with \"...\"; make it never cause a
+ Lisp error; give up parsing of parameters if it failed in
+ extracting type.
+
+2006-02-14 Arne J\e,Ax\e(Brgensen <arne@arnested.dk>
+
+ * smime.el (smime-cert-by-ldap-1): Fix bug where
+ `smime-ldap-search' returns results without userCertificates.
+
+2006-02-15 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * mm-util.el (mm-make-temp-file): Don't catch file-error in Emacs.
+
+2006-02-14 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * spam.el (spam-check-spamassassin-headers): Adapt format for
+ Spamassassin 3.0 or later. Reported by ARISAWA Akihiro
+ <ari@mbf.ocn.ne.jp>.
+ (spam-list-of-processors): Add spam-use-gmane.
+
+2006-02-14 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * mm-util.el (mm-make-temp-file): Import the Emacs 22 version of
+ make-temp-file; make it work with XEmacs as well.
+
+ * gnus-art.el (gnus-article-browse-html-parts): Use the 3rd arg of
+ mm-make-temp-file.
+
+ * mm-decode.el (mm-display-external): Use the 3rd arg of
+ mm-make-temp-file.
+ (mm-create-image-xemacs): Ditto.
+
+2006-02-14 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-draft.el (gnus-draft-send): Replace message-narrow-to-head
+ with message-narrow-to-headers.
+ (gnus-draft-setup): Narrow to header to run message-fetch-field.
+ (gnus-draft-check-draft-articles): New function.
+ (gnus-draft-edit-message, gnus-draft-send-message): Use it.
+
+2006-02-13 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-art.el (gnus-article-browse-html-parts):
+ `hs-show-html-list' should read `gnus-article-browse-html-parts'.
+ Don't use suffix argument for mm-make-temp-file for Emacs 21
+ compatibility. Remove useless `format'.
+
+2006-02-13 Andreas Seltenreich <uwi7@stud.uni-karlsruhe.de>
+
+ * nnweb.el (nnweb-google-wash-article): Update regexps.
+ (nnweb-group-alist): Use defvoo instead of defvar.
+
+2006-02-13 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * nnoo.el (nnoo-declare): Don't generate duplicate entries when
+ re-loading nn* modules.
+
+2006-02-10 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-group.el (gnus-group-make-tool-bar): Remove duplicate check
+ for `tool-bar-mode' and don't check it's default-value.
+
+ * gnus-sum.el (gnus-summary-make-tool-bar): Ditto.
+
+ * message.el (message-make-tool-bar): Ditto.
+
+ * gnus-art.el (gnus-article-browse-html-parts): Remove useless
+ `substring'. Shorten tmp-file name.
+
+ * gnus.el: Remove bogus comment.
+
+2006-02-10 Hynek Schlawack <hynek@ularx.de>
+
+ * gnus-art.el (gnus-article-browse-html-parts): New function.
+ (gnus-article-browse-html-article): New function for viewing html
+ articles with a browser.
+
+2006-02-09 Daiki Ueno <ueno@unixuser.org>
+
+ * pgg-gpg.el (pgg-gpg-encrypt-region): Don't convert line-endings
+ in elisp.
+ (pgg-gpg-encrypt-symmetric-region): Ditto.
+ (pgg-gpg-sign-region): Ditto.
+
+ * pgg-def.el (pgg-text-mode): New variable.
+
+ * mml2015.el (mml2015-pgg-sign): Enable pgg-text-mode.
+ (mml2015-pgg-encrypt): Ditto.
+
+ * mml1991.el (mml1991-pgg-sign): Enable pgg-text-mode.
+ (mml1991-pgg-encrypt): Ditto.
+
+2006-02-08 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * nnfolder.el (nnfolder-insert-newsgroup-line): Use
+ message-make-date instead of current-time-string.
+
+ * mm-view.el (mm-inline-message): Don't set gnus-newsgroup-charset
+ to gnus-decoded which mm-uu might set.
+
+2006-02-08 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * rfc2231.el (rfc2231-parse-string): Sort segmented parameters;
+ don't decode quoted parameters; remove misimported Emacs code.
+ Suggested by ARISAWA Akihiro <ari@mbf.ocn.ne.jp>.
+ (rfc2231-decode-encoded-string): Don't use split-string which
+ behaves differently according to Emacs version; use
+ mm-decode-coding-region to convert charset to coding-system.
+ Suggested by ARISAWA Akihiro <ari@mbf.ocn.ne.jp>.
+ (rfc2231-encode-string): Remove misimported Emacs code.
+
+2006-02-07 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-art.el (article-decode-charset): Don't use ignore-errors
+ when calling mail-header-parse-content-type.
+ (article-de-quoted-unreadable): Ditto.
+ (article-de-base64-unreadable): Ditto.
+ (article-wash-html): Ditto.
+
+ * mm-decode.el (mm-dissect-buffer): Don't use ignore-errors when
+ calling mail-header-parse-content-type and
+ mail-header-parse-content-disposition.
+ (mm-find-raw-part-by-type): Don't use ignore-errors when calling
+ mail-header-parse-content-type.
+
+ * mml.el (mml-insert-mime-headers): Use mml-insert-parameter to
+ insert charset and format parameters; encode description after
+ inserting it to buffer.
+ (mml-insert-parameter): Fold lines properly even if a parameter is
+ segmented into two or more lines; change the max column to 76.
+
+ * rfc1843.el (rfc1843-decode-article-body): Don't use
+ ignore-errors when calling mail-header-parse-content-type.
+
+ * rfc2231.el (rfc2231-parse-string): Return at least type if
+ possible; don't cause an error even if it fails in parsing of
+ parameters. Suggested by ARISAWA Akihiro <ari@mbf.ocn.ne.jp>.
+ (rfc2231-encode-string): Don't break lines at the beginning, leave
+ it to mml-insert-parameter.
+
+ * webmail.el (webmail-yahoo-article): Don't use ignore-errors when
+ calling mail-header-parse-content-type.
+
+2006-02-06 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * spam-report.el (spam-report-gmane-use-article-number): Improve
+ doc string.
+ (spam-report-gmane-internal): Check if a suitable header was found
+ in the article.
+
+2006-02-04 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * rfc2231.el (rfc2231-parse-string): Revert 2006-02-03 change.
+ (rfc2231-encode-string): Make param*=value always begin with LWSP.
+
+2006-02-05 Romain Francoise <romain@orebokech.com>
+
+ Update copyright notices of all files in the gnus directory.
+
+2006-02-03 Andreas Seltenreich <uwi7@stud.uni-karlsruhe.de>
+
+ * nnweb.el (nnweb-request-group): Avoid growing overview files.
+
+2006-02-03 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * rfc2231.el (rfc2231-parse-string): Add missing semicolons to
+ segmented lines of parameter value to cope with Thunderbird 1.5
+ bug (cf. https://bugzilla.mozilla.org/show_bug.cgi?id=323318).
+ Suggested by ARISAWA Akihiro <ari@mbf.ocn.ne.jp>.
+ (rfc2231-encode-string): Don't make lines exceeding 76 column.
+
+2006-02-01 Max Froumentin <max@lapin-bleu.net> (tiny change)
+
+ * mml.el (mml-generate-mime-1): Correct the order of inline signed
+ parts.
+
+2006-01-31 Andreas Seltenreich <uwi7@stud.uni-karlsruhe.de>
+
+ * nnweb.el (nnweb-group-alist): Use defvar instead of defvoo,
+ there's only one active file for all servers.
+ (nnweb-request-scan): Make sure nnweb-articles is initialized on
+ solid groups. Gnus might have used a FAST request to select the
+ group.
+ (nnweb-request-group, nnweb-google-parse-1): Don't keep nnweb-type
+ and nnweb-search redundantly in the active file.
+ (nnweb-request-list): Don't list bogus groups. There can only be
+ one.
+ (nnweb-request-create-group): Don't use ARGS.
+ (nnweb-possibly-change-server, nnweb-request-group): Remove some
+ initialisations. Let nnoo do the work.
+
+2006-01-31 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * mm-uu.el (mm-uu-emacs-sources-extract): Say the part has been
+ decoded.
+ (mm-uu-diff-extract): Ditto.
+
+ * mm-view.el (mm-display-inline-fontify): Get decoded part rightly.
+
+2006-01-31 Kevin Ryde <user42@zip.com.au>
+
+ * mailcap.el (mailcap-viewer-passes-test): Don't put "(nil t)" into
+ mailcap-viewer-test-cache when there's no 'test clause, since that
+ will invert the meaning of a "nil" test previously determined by
+ mailcap-mailcap-entry-passes-test.
+
+2006-01-30 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-group.el: Bind tool-bar-mode instead of tool-bar-map when
+ compiling.
+
+ * gnus-sum.el: Ditto.
+
+ * message.el: Don't bind tool-bar-map when compiling.
+
+2006-01-30 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * nnweb.el (nnweb-google-parse-1): Clarify some comments.
+
+2006-01-30 Andreas Seltenreich <uwi7@stud.uni-karlsruhe.de>
+
+ * nnweb.el (nnweb-type-definition, nnweb-google-parse-1)
+ (nnweb-google-create-mapping, nnweb-google-search): Adapt to
+ current Google Groups.
+
+2006-01-26 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-sum.el (gnus-summary-make-tool-bar): Add checks for XEmacs
+ and tool-bar-mode.
+
+ * gnus-group.el (gnus-group-make-tool-bar): Add checks for XEmacs
+ and tool-bar-mode.
+
+ * message.el (message-tool-bar-update): Simplify.
+ (message-make-tool-bar): Add checks for XEmacs and tool-bar-mode.
+
+ * gnus-sum.el (gnus-summary-tool-bar-update): Check for
+ gnus-summary-buffer.
+ (gnus-summary-tool-bar-gnome): Use "reply-author" icon for
+ gnus-summary-reply.
+
+ * gmm-utils.el (gmm): Add :version.
+
+2006-01-26 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * Makefile.in (clean): New rule.
+ (distclean): Use it.
+
+2006-01-26 Steve Youngs <steve@sxemacs.org>
+
+ * gmm-utils.el (gmm-tool-bar-item, gmm-tool-bar-zap-list): Don't
+ autoload.
+
+2006-01-26 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gmm-utils.el (gmm-verbose): Add :group.
+
+2006-01-25 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * message.el: Change some comments WRT tool-bars.
+
+ * gnus-sum.el (gnus-summary-tool-bar)
+ (gnus-summary-tool-bar-gnome, gnus-summary-tool-bar-retro)
+ (gnus-summary-tool-bar-zap-list): New variables.
+ (gnus-summary-make-tool-bar): Complete rewrite using
+ `gmm-tool-bar-from-list'.
+
+ * gnus-group.el (gnus-group-tool-bar, gnus-group-tool-bar-gnome)
+ (gnus-group-tool-bar-retro, gnus-group-tool-bar-zap-list): New
+ variables.
+ (gnus-group-make-tool-bar): Complete rewrite using
+ `gmm-tool-bar-from-list'.
+ (gnus-group-tool-bar-update): New function.
+
+ * message.el (message-mode-field-menu): Add "Show hidden Headers".
+
+2006-01-25 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * mm-uu.el (mm-uu-dissect-text-parts): Ignore it if a given part
+ is dissected into a single part of which the type is the same as
+ the given one; decode charset.
+
+2006-01-21 Kevin Ryde <user42@zip.com.au>
+
+ * mailcap.el (mailcap-parse-mailcap-extras): "test" key must go
+ into alists as symbol not string, since that's what
+ mailcap-viewer-passes-test and mailcap-mailcap-entry-passes-test
+ look for.
+
+2006-01-24 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gmm-utils.el (gmm-tool-bar-item): Add "Separator".
+ (gmm-tool-bar-from-list): Suppress tooltip for `gmm-ignore'.
+
+ * message.el (message-tool-bar-gnome): Use gmm-ignore.
+
+2006-01-24 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-xmas.el (gnus-mime-security-button-menu): New alias.
+ (gnus-xmas-mime-security-button-menu): New function.
+
+ * gnus-art.el (gnus-mime-security-button-commands): New variable.
+ (gnus-mime-security-button-menu): New definition.
+ (gnus-mime-security-button-map): Use them.
+ (gnus-mime-security-button-menu): New function.
+ (gnus-insert-mime-security-button): Addition to help echo.
+ (gnus-mime-security-run-function, gnus-mime-security-save-part)
+ (gnus-mime-security-pipe-part): New functions.
+
+ * mm-uu.el (mm-uu-buttonize-original-text-parts): Remove.
+ (mm-uu-dissect-text-parts): Revert a part of 2006-01-23 change.
+
+ * mm-decode.el (mm-handle-set-disposition): Remove.
+ (mm-handle-set-description): Remove.
+
+2006-01-24 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * mm-view.el (mm-w3m-standalone-supports-m17n-p): New variable.
+ (mm-w3m-standalone-supports-m17n-p): New function.
+ (mm-inline-text-html-render-with-w3m-standalone): Use it to alter
+ w3m usage.
+
+ * gnus-art.el (gnus-article-wash-html-with-w3m-standalone): Use
+ mm-w3m-standalone-supports-m17n-p to alter w3m usage.
+
+2006-01-23 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * message.el (message-tool-bar-zap-list): Use
+ gmm-tool-bar-zap-list as custom type.
+ (message-tool-bar-update): New function.
+ (message-tool-bar, message-tool-bar-gnome)
+ (message-tool-bar-retro): Add message-tool-bar-update.
+ (message-tool-bar-gnome): Add flyspell-buffer.
+
+ * gnus-util.el (gnus-error): Describe `args'.
+
+ * gmm-utils.el (gmm-error): Describe `args'.
+ (gmm-tool-bar-zap-list): New widget.
+ (gmm-tool-bar-from-list): Improve description of `zap-list'.
+
+2006-01-23 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * mm-uu.el (mm-uu-buttonize-original-text-parts): New variable.
+ (mm-uu-dissect-text-parts): Buttonize original text parts; reduce
+ the number of recursive calls.
+
+ * mm-decode.el (mm-handle-set-disposition): New macro.
+ (mm-handle-set-description): New macro.
+
+2006-01-23 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * mm-uu.el (mm-uu-dissect-text-parts): Decode content transfer
+ encoding.
+
+2006-01-20 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * message.el (message-tool-bar-zap-list, message-tool-bar)
+ (message-tool-bar-gnome, message-tool-bar-retro): New variables.
+ (message-tool-bar-local-item-from-menu): Remove.
+ (message-tool-bar-map): Replace by `message-make-tool-bar'.
+ (message-make-tool-bar): New function.
+ (message-mode): Use `message-make-tool-bar'.
+
+ * gmm-utils.el: New file.
+ (gmm-verbose, gmm-message, gmm-error): From gnus-utils.el.
+ (gmm-lazy): New widget copied from `nnmail.el'.
+ (gmm-tool-bar-from-list): New function for creating customizable
+ tool bars.
+ (gmm-tool-bar-from-list): Fix typos in doc string. Remove debug
+ output.
+ (gmm): Add :prefix to defgroup.
+
+2006-01-20 Per Abrahamsen <abraham@dina.kvl.dk>
+
+ * gmm-utils.el (gmm-widget-p): New function.
+
+2006-01-20 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * mml.el (mml-attach-file): Describe `description' in doc string.
+ (mml-menu): Add Emacs MIME manual and PGG manual.
+
+2006-01-20 Richard M. Stallman <rms@gnu.org>
+
+ * mm-url.el (mm-url-load-url): Require url-parse and url-vars.
+
+2006-01-20 Kevin Greiner <kevin.greiner@compsol.cc>
+
+ * nntp.el (nntp-end-of-line): Doc fix.
+
+2006-01-20 Chong Yidong <cyd@stupidchicken.com>
+
+ * imap.el (imap-open): Handle case where buffer is a buffer
+ object.
+
+2005-01-20 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * gnus-delay.el (gnus-delay): Don't autoload.
+ It's useless and could trigger a bug in cus-dep.el causing ldefs-boot
+ to be re-loaded when customizing the `gnus-delay' group.
+
+2005-01-20 Chong Yidong <cyd@stupidchicken.com>
+
+ * message.el (message-insert-citation-line): Use newlines.
+
+2006-01-19 Ken Manheimer <ken.manheimer@gmail.com>
+
+ * pgg-pgp.el (pgg-pgp-encrypt-region, pgg-pgp-decrypt-region)
+ (pgg-pgp-sign-region): Add optional 'passphrase' argument to all
+ these routines, so the passphrase can be managed externally and
+ passed in to the system.
+ (pgg-pgp-decrypt-region, pgg-pgp-sign-region): Use new name for
+ pgg-add-passphrase-to-cache function.
+
+ * pgg-pgp5.el (pgg-pgp5-encrypt-region, pgg-pgp5-decrypt-region)
+ (pgg-pgp5-sign-region): Add optional 'passphrase' argument to all
+ these routines, so the passphrase can be managed externally and
+ passed in to the system.
+ (pgg-pgp5-sign-region): Use new name of
+ pgg-add-passphrase-to-cache function.
+
+2006-01-19 Ken Manheimer <ken.manheimer@gmail.com>
+
+ * pgg-gpg.el (pgg-gpg-select-matching-key): Fix: look at the right
+ part of the decoded armor to find the key-identifier.
+ (pgg-gpg-lookup-key-owner): New function to return the
+ human-readable identifier of a key owner.
+ (pgg-gpg-key-id-from-key-owner): Make it easy to identify the key
+ itself.
+ (pgg-gpg-decrypt-region): Prompt with the key owner (rather than
+ the key value) if we have a key and can match it against a secret
+ key. Also, added a note pointing out fact that the prompt only
+ indicates the first matching key.
+
+ * pgg.el (pgg-decrypt): Passing along 'passphrase' in call to
+ pgg-decrypt-region.
+ (pgg-add-passphrase-to-cache): Rename from
+ `pgg-add-passphrase-cache' to reduce confusion (all callers
+ changed).
+ (pgg-remove-passphrase-from-cache): Rename from
+ `pgg-remove-passphrase-cache' to reduce confusion (all callers
+ changed).
+ (pgg-read-passphrase, pgg-add-passphrase-cache)
+ (pgg-remove-passphrase-cache): Add informative docstrings.
+ (pgg-decrypt): Convey provided passphrase in subordinate call to
+ pgg-decrypt-region.
+
+2006-01-19 Ken Manheimer <ken.manheimer+emacs@gmail.com>
+
+ * pgg.el (pgg-encrypt-region, pgg-encrypt-symmetric-region)
+ (pgg-encrypt-symmetric, pgg-encrypt, pgg-decrypt-region)
+ (pgg-decrypt, pgg-sign-region, pgg-sign): Add optional
+ 'passphrase' argument, so the passphrase can be managed externally
+ and then passed in to the system.
+
+ * pgg.el (pgg-read-passphrase, pgg-add-passphrase-cache)
+ (pgg-remove-passphrase-cache): Add optional 'notruncate' argument,
+ so the passphrase cache can be used reliably with identifiers
+ besides a pgp packet's key id.
+
+ * pgg-gpg.el (pgg-gpg-encrypt-region)
+ (pgg-gpg-encrypt-symmetric-region, pgg-gpg-decrypt-region)
+ (pgg-gpg-sign-region): Add optional 'passphrase' argument to all
+ these routines, so the passphrase can be managed externally and
+ passed in to the system.
+
+ * pgg-gpg.el (pgg-gpg-possibly-cache-passphrase): Add optional
+ 'notruncate' argument, so the passphrase cache can be used
+ reliably with identifiers besides a pgp packet's key id.
+
+2006-01-19 Sascha Wilde <swilde@sha-bang.de>
+
+ * pgg-gpg.el (pgg-gpg-encrypt-symmetric-region): New function for
+ symmetric encryption.
+ (pgg-gpg-symmetric-key-p): New function to check for an symmetric
+ encrypted session key.
+ (pgg-gpg-decrypt-region): When decrypting a symmetric encrypted
+ message ask for the passphrase in a proper way.
+
+ * pgg.el (pgg-encrypt-symmetric, pgg-encrypt-symmetric-region):
+ New user commands for symmetric encryption.
+
+2006-01-19 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * mm-bodies.el (mm-decode-body): Don't decode decoded body.
+
+ * mm-uu.el (mm-uu-dissect-text-parts): Dissect dissected parts.
+
+2006-01-19 Mark D. Baushke <mdb@gnu.org>
+
+ * pgg-gpg.el (pgg-gpg-encrypt-region): Add --textmode to gpg args.
+
+2006-01-17 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * mm-decode.el (mm-inlined-types): Add application/pgp.
+ (mm-automatic-display): Ditto.
+
+ * mm-uu.el (mm-uu-dissect-text-parts): Recognize application/pgp
+ part as text.
+
+2006-01-16 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * nnrss.el: Update copyright.
+ (nnrss-opml-import): Query whether to subscribe to each entry.
+
+ * gnus-art.el:
+ * gnus-sum.el:
+ * gnus-xmas.el:
+ * messagexmas.el:
+ * mm-uu.el:
+ * mm-view.el: Update copyright.
+
+2006-01-16 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * message.el (message-info): New function.
+ (message-mode-menu): Add it.
+ Update copyright.
+
+ * ChangeLog: Fix and update copyright.
+
+2006-01-13 Romain Francoise <romain@orebokech.com>
+
+ * message.el (message-forward-subject-name-subject): Prefer the
+ address to 'nowhere' if the sender has no name.
+ Fix typo. Update copyright year.
+
+2006-01-13 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-art.el (article-wash-html): Use
+ gnus-summary-show-article-charset-alist if a numeric arg is given.
+ (gnus-article-wash-html-with-w3m-standalone): New function.
+
+ * mm-view.el (mm-text-html-renderer-alist): Map w3m-standalone to
+ mm-inline-text-html-render-with-w3m-standalone.
+ (mm-text-html-washer-alist): Map w3m-standalone to
+ gnus-article-wash-html-with-w3m-standalone.
+ (mm-inline-text-html-render-with-w3m-standalone): New function.
+
+2006-01-12 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * mm-uu.el (mm-uu-type-alist): Fix previous message-marks commit.
+ Improve LaTeX.
+
+2006-01-10 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * nnrss.el (nnrss-wash-html-in-text-plain-parts): New variable.
+ (nnrss-request-article): Render text/plain parts as HTML.
+
+ * gnus-art.el (gnus-article-wash-html-with-w3m): No need to narrow
+ the buffer.
+
+2006-01-08 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-cus.el (gnus-group-parameters): Sync posting-style with
+ custom definition of `gnus-posting-styles'.
+
+ * gnus-start.el (gnus-gnus-to-quick-newsrc-format): Bind
+ print-circle. Suggested by Kalle Olavi Niemitalo <kon@iki.fi>.
+
+2006-01-05 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-group.el (gnus-useful-groups): Use Gmane for ding.
+ Use nntp for bug archive.
+
+2006-01-05 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * nnrss.el (nnrss-request-article): Fix the way to fill text/plain
+ parts.
+ (nnrss-normalize-date): New function converts ISO 8601 date into
+ RFC822 style. Suggested by Mark Plaksin <happy@mcplaksin.org>.
+ (nnrss-check-group): Use it.
+
+2006-01-01 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-sum.el (gnus-summary-work-articles): Remove useless `min'.
+
+ * nnrss.el (nnrss-fetch): Make it fail gracefully when it can't
+ fetch a feed. Suggested by Mark Plaksin <happy@mcplaksin.org>.
+ (nnrss-insert-w3): Ditto.
+
+2005-12-22 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-uu.el (gnus-uu-digest-mail-forward): Reverse the order of
+ the articles to be forwarded including the case where neither a
+ number of articles nor a region is specified.
+
+2005-12-21 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * nnrss.el (nnrss-request-article): Fix last change; fill
+ text/plain parts.
+
+2005-12-20 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * nnrss.el (nnrss-request-article): Replace <br />s with newlines
+ in text/plain part.
+ (nnrss-check-group): Don't add excessive newline to dc:subject.
+
+2005-12-19 Mark Plaksin <happy@mcplaksin.org> (tiny change)
+
+ * nnrss.el (nnrss-check-group): Put the RSS dc:subject in the
+ article.
+
+2005-12-18 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * nnml.el: Don't require gnus-bcklg. Autoload it.
+ (nnml-use-compressed-files, nnml-save-mail): Support other
+ comression programs such as bzip2.
+
+2005-12-17 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * dns.el (query-dns): Make sure we check the buffer size before
+ removing tcp headers.
+
+2005-12-16 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-art.el (gnus-article-delete-text-of-type): Enable it to
+ remove MIME buttons associated with multipart/alternative parts.
+ (gnus-mime-display-alternative): Tag buttons using `article-type'
+ text property.
+
+ * gnus-msg.el (gnus-copy-article-buffer): Remove MIME buttons
+ associated with multipart/alternative parts.
+
+ * gnus-art.el (gnus-signature-separator): Fix custom type.
+
+ * mm-decode.el (mm-inlined-types): Fix custom type.
+ (mm-keep-viewer-alive-types): Ditto.
+ (mm-automatic-display): Ditto.
+ (mm-attachment-override-types): Ditto.
+ (mm-inline-override-types): Ditto.
+ (mm-automatic-external-display): Ditto.
+
+2005-12-15 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * spam-report.el (spam-report-user-mail-address)
+ (spam-report-user-agent): New variables.
+ (spam-report-url-ping-plain): Use spam-report-user-agent.
+
+2005-12-14 Ralf Angeli <angeli@iwi.uni-sb.de>
+
+ * gnus-art.el (gnus-button-handle-custom): Do not just use
+ `customize-apropos' for any "M-x customize-*" button but the
+ function called for. Accept both the function name and its
+ argument in order to achieve this.
+ (gnus-button-alist): Remove support for "custom:" URL's. Pass
+ function name to `gnus-button-handle-custom' in case of "M-x
+ customize-*" buttons.
+
+2005-12-12 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-art.el (gnus-buttonized-mime-types): Mention addition of
+ multipart/alternative and add xref to mm-discouraged-alternatives
+ in doc string.
+
+ * mm-decode.el (mm-discouraged-alternatives): Add xref to
+ gnus-buttonized-mime-types in doc string.
+
+2005-12-08 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * mm-decode.el (mm-discouraged-alternatives): Fix custom type.
+ Suggest image/.* in the doc string.
+
+2005-12-12 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * mm-uu.el (mm-uu-type-alist): Don't depend on message.el for
+ message-marks (Debian bug #342521).
+
+2005-12-12 Simon Josefsson <jas@extundo.com>
+
+ * password.el (password-read-from-cache): Add.
+ (password-read): Use it.
+
+2005-12-12 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * rfc2047.el (rfc2047-charset-to-coding-system): Recognize
+ us-ascii as a MIME charset.
+
+ * mm-bodies.el (mm-decode-content-transfer-encoding): Protect
+ against the case where the 2nd arg TYPE is nil.
+
+2005-12-09 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * pop3.el (pop3-stream-type): Fix custom version.
+
+ * mm-uu.el (mm-uu-type-alist): Simplify uu regexp.
+
+2005-12-09 ARISAWA Akihiro <ari@mbf.ocn.ne.jp> (tiny change)
+
+ * mm-decode.el (mm-display-external): Add missing cdr.
+
+2005-12-07 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * mm-decode.el (mm-display-external): Use nametemplate (defined in
+ RFC1524) if it is in mailcap or add a suffix according to
+ mailcap-mime-extensions when generating a temp filename; postpone
+ deleting a temp file for 2 seconds for some wrappers, shell
+ scripts, and so on, which might exit right after having started a
+ viewer command as a background job.
+
+2005-12-06 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * nntp.el (nntp-marks-directory): Fix custom group.
+
+ * gnus-fun.el (gnus-face-from-file): Decrease quant in smaller
+ steps when < 10.
+
+ * gnus-start.el (gnus-no-server-1): Mention
+ `gnus-level-default-subscribed' in doc string.
+
+2005-12-02 ARISAWA Akihiro <ari@mbf.ocn.ne.jp> (tiny change)
+
+ * mm-view.el (mm-inline-text-html-render-with-w3m): Fix misplaced
+ parens.
+
+2005-12-01 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-xmas.el (gnus-use-toolbar): Revert.
+ (gnus-xmas-setup-toolbar): Use global default-toolbar if
+ gnus-use-toolbar is default.
+
+ * messagexmas.el (message-use-toolbar): Revert.
+ (message-setup-toolbar): Use global default-toolbar if
+ message-use-toolbar is default.
+
+2005-11-30 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-xmas.el (gnus-use-toolbar): Determine the default value
+ according to default-toolbar-visible-p.
+
+ * messagexmas.el (message-use-toolbar): Ditto.
+
+2005-11-26 Dave Love <fx@gnu.org>
+
+ * tls.el (open-tls-stream): Rename arg SERVICE to PORT.
+ (tls-program, tls-success): Provide openssl alternative.
+
+ * starttls.el: Doc fixes.
+ (starttls-open-stream-gnutls, starttls-open-stream): Rename arg
+ SERVICE to PORT.
+
+ * pop3.el (pop3-open-server) <ssl>: Clarify a loop. Deal with
+ port null or service name.
+ (starttls-negotiate): Autoload.
+
+2005-11-25 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * message.el (message-kill-to-signature): Fix interactive spec.
+
+2005-11-24 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * pop3.el (pop3-open-server): Recognize a string as a service name.
+
+2005-11-24 Pascal Rigaux <pixel@mandriva.com> (tiny change)
+
+ * rfc2231.el (rfc2231-parse-string): Support non-ascii chars.
+
+2005-11-23 Dave Love <fx@gnu.org>
+
+ Add pop3s, pop3/starttls.
+
+ * pop3.el (pop3-authentication-scheme): Clarify doc.
+ (open-tls-stream, starttls-open-stream): Autoload.
+ (pop3-stream-type): New.
+ (pop3-open-server): Use it.
+
+ * mail-source.el (mail-sources): Fix some :types. Add stream type
+ for POP.
+ (mail-source-keyword-map): Add :stream for POP.
+ (mail-source-fetch-pop): Use pop3-stream-type.
+
+2005-11-22 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * nnmail.el (nnmail-fancy-expiry-target): Use current-time instead
+ of current-time-string.
+
+2005-11-20 Stefan Schimanski <schimmi@debian.org> (tiny change)
+
+ * nnmail.el (nnmail-fancy-expiry-target): Protect against invalid
+ date header.
+
+2005-11-19 Kevin Greiner <kevin.greiner@compsol.cc>
+
+ * gnus-sum.el (gnus-fetch-old-headers): Updated docs to warn that
+ it can seriously impact performance as it bypasses the agent's
+ local caches.
+
+2005-11-19 Kevin Greiner <kevin.greiner@compsol.cc>
+
+ * gnus-agent.el (gnus-agent-possibly-synchronize-flags): A server
+ must be explicitly online rather than "not explicitly offline" for
+ its flags to be synchronized.
+
+ * gnus-sum.el (gnus-summary-remove-process-mark): Always return t so
+ that gnus-uu-unmark-thread will function correctly.
+
+ * gnus-group.el (gnus-total-fetched-for): Reduced cutoff so that
+ 1024K is instead displayed as 1M.
+
+2005-11-17 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * flow-fill.el (fill-flowed): Bind adaptive-fill-mode to nil.
+
+2005-11-16 Boris Samorodov <bsam@ipt.ru> (tiny patch)
+
+ * imap.el (imap-kerberos4-open): Ignore SSL stuff.
+
+2005-11-13 Kevin Greiner <kevin.greiner@compsol.cc>
+
+ * gnus-agent.el (gnus-agent-read-local): Trivial fix to format of
+ error message to display actual error condition.
+ (gnus-agent-save-local): Avoid saving symbols that are bound to
+ nil as they simply result in a warning message in
+ gnus-agent-read-local.
+
+2005-11-13 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-start.el (gnus-dribble-read-file): Use make-local-variable
+ rather than make-variable-buffer-local for file-precious-flag.
+
+2005-11-12 Kevin Greiner <kevin.greiner@compsol.cc>
+
+ * gnus-agent.el (gnus-agent-braid-nov): Now tests new nov entries
+ for duplicates which are removed. The invalid sort check then
+ triggers a rescan after the sort as sorting may have moved
+ duplicate entries such that they can be cheaply detected.
+
+2005-11-13 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-start.el (gnus-dribble-read-file): Quote file-precious-flag.
+
+2005-11-12 Kevin Greiner <kevin.greiner@compsol.cc>
+
+ * gnus-agent.el (gnus-agent-article-alist-save-format): Changed
+ internal variable to a custom variable. Changed default value
+ from compressed(2) to uncompressed(1).
+ (gnus-agent-read-agentview): Reversed revision 7.8 to restore
+ support for uncompressed agentview files. Taken together, reading
+ the agentview file should now be 6-7 times faster.
+
+2005-11-11 Jan Nieuwenhuizen <janneke@gnu.org>
+
+ * gnus-start.el (gnus-dribble-read-file): Set file-precious-flag,
+ as a buffer-local variable. This avoids creating truncated
+ dribble files as a result of a hang up, eg.
+
+2006-01-03 Rodrigo Ventura <yoda@isr.ist.utl.pt> (tiny change)
+
+ * gnus-xmas.el (gnus-xmas-group-startup-message): Typo
+ gnus-splash-face -> gnus-splash. Fixes starting from a TTY in
+ XEmacs.
+
+2005-12-09 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-start.el (gnus-start-draft-setup): Enforce
+ `gnus-draft-mode' for nndraft:drafts at startup.
+
+ * gnus.el (gnus-splash): Change custom group.
+ (gnus-group-get-parameter, gnus-group-parameter-value): Describe
+ allow-list argument.
+
+ * gnus-agent.el (gnus-agent-article-alist-save-format): Format doc
+ string.
+
+2005-12-06 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-art.el (gnus-default-article-saver): Add user-defined
+ `function' to custom type.
+
+2005-10-30 Chong Yidong <cyd@stupidchicken.com>
+
+ * imap.el (imap-open): Handle case where buffer is a buffer
+ object.
+
+2005-11-29 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-cache.el (gnus-cache-rename-group): Wrap doc strings and
+ long lines.
+ (gnus-cache-delete-group): Wrap doc strings.
+
+ * gnus-agent.el (gnus-agent-rename-group)
+ (gnus-agent-delete-group): Wrap doc strings.
+
+
+2005-11-10 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * messagexmas.el (message-use-toolbar): Change the valid values
+ into default, top, bottom, left, and right.
+ (message-toolbar-thickness): New variable.
+ (message-xmas-setup-toolbar): Locate gnus-xmas-glyph-directory as
+ well.
+ (message-setup-toolbar): Make it work.
+
+ * gnus-xmas.el (gnus-xmas-update-toolbars): New function.
+ (gnus-use-toolbar): Change the valid values into default, top,
+ bottom, left, and right.
+ (gnus-toolbar-thickness): New variable.
+ (gnus-xmas-setup-toolbar): New function.
+ (gnus-xmas-setup-group-toolbar): Use it.
+ (gnus-xmas-setup-summary-toolbar): Use it.
+
+2005-11-10 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-start.el (gnus-1): Add "native" to
+ gnus-predefined-server-alist.
+
+ * gnus.el (gnus-method-to-server): Don't add "native" to the
+ lists here, because that leads to problems when
+ gnus-select-method is bound.
+
+2005-11-09 Simon Josefsson <jas@extundo.com>
+
+ * gnus-sum.el (gnus-article-sort-by-date-reverse): Remove,
+ use (not sort-by-date) instead.
+
+2005-11-30 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * gnus-delay.el (gnus-delay-group): Don't autoload.
+ It's useless and could trigger a bug in cus-dep.el causing ldefs-boot
+ to be re-loaded when customizing the `gnus-delay' group.
+
+2005-11-19 Chong Yidong <cyd@stupidchicken.com>
+
+ * message.el: Revert last changes.
+ (message-insert-citation-line): Use newlines.
+
+2005-11-17 Chong Yidong <cyd@stupidchicken.com>
+
+ * message.el (message-courtesy-message)
+ (message-mark-insert-begin, message-mark-insert-end)
+ (message-elide-ellipsis, message-cancel-message)
+ (message-add-header, message-change-subject)
+ (message-cross-post-followup-to-header)
+ (message-cross-post-insert-note, message-reduce-to-to-cc)
+ (message-widen-reply, message-delete-not-region)
+ (message-kill-to-signature, message-insert-signature)
+ (message-insert-importance-high, message-insert-importance-low)
+ (message-insert-or-toggle-importance)
+ (message-insert-disposition-notification-to)
+ (message-indent-citation, message-yank-original)
+ (message-cite-original-without-signature, message-cite-original)
+ (message-insert-citation-line, message-position-on-field)
+ (message-fix-before-sending, message-send-mail-partially)
+ (message-send-mail, message-send-mail-with-sendmail)
+ (message-send-mail-with-qmail, message-send-news)
+ (message-check-news-header-syntax, message-generate-headers)
+ (message-insert-courtesy-copy, message-fill-address)
+ (message-fill-header, message-shorten-references)
+ (message-setup-1, message-cancel-news)
+ (message-forward-make-body-plain, message-forward-make-body-mime)
+ (message-forward-make-body-mml, message-encode-message-body)
+ (message-forward-make-body-digest-plain)
+ (message-forward-make-body-digest-mime)
+ (message-use-alternative-email-as-from): Insert `hard-newline'
+ instead of ordinary newlines.
+
+2005-11-09 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * message.el (message-generate-headers): Downcase the argument
+ given to message-check-element.
+
+2005-11-08 Kevin Greiner <kevin.greiner@compsol.cc>
+
+ * nntp.el (nntp-authinfo-rejected): New error condition.
+ (nntp-wait-for): Use new error condition to signal authentication
+ error.
+ (nntp-retrieve-data): Rethrow new error condition to break out of
+ recursive call to nntp-send-authinfo.
+
+2005-11-08 Romain Francoise <romain@orebokech.com>
+
+ * gnus-sum.el (gnus-summary-catchup-and-goto-prev-group): New function.
+ (gnus-summary-exit-map): Bind to `Z p'.
+ (gnus-summary-make-menu-bar): Add menu item.
+
+2005-11-02 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-art.el (gnus-article-treat-custom): Add `first'.
+ (gnus-treat-*): Add `first' in all doc strings.
+
+ * gnus-group.el (gnus-group-compact-group): Fix typo.
+
+2005-11-01 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.el (gnus-parameters-case-fold-search): New variable.
+ (gnus-parameters-get-parameter): Use it.
+
+ * gnus-score.el (gnus-home-score-file): Doc fix.
+
+2005-11-01 Xavier Maillard <zedek@gnu-rox.org> (tiny change)
+
+ * gnus-score.el (gnus-update-score-entry-dates): Doc fix.
+
+2005-10-31 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * mm-util.el (mm-special-display-p): New function.
+
+ * mml.el (mml-preview): Use it; doc fix.
+
+2005-10-29 Romain Francoise <romain@orebokech.com>
+
+ * message.el (message-fix-before-sending): Fix comment.
+
+2005-10-29 Jari Aalto <jari.aalto@cante.net>
+
+ * gnus-sum.el (gnus-article-sort-by-date-reverse): New function.
+
+2005-10-29 Jari Aalto <jari.aalto@cante.net>
+
+ * score-mode.el (gnus-score-edit-done-hook): Introduce variable.
+ Used in gnus-score.el.
+
+2005-10-28 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * mm-util.el (mm-codepage-setup): Remove bogus alias test.
+
+2005-10-27 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * flow-fill.el (fill-flowed-encode-tests): Restore trailing
+ whitespace removed in revision 7.8. Use concatenated string to
+ protect trailing whitespace.
+
+2005-10-27 Jouni K Seppanen <jks@iki.fi> (tiny change)
+
+ * nnimap.el (nnimap-search-uids-not-since-is-evil): Add variable.
+ (nnimap-request-expire-articles): Use it to avoid sending 'UID
+ SEARCH UID ... NOT SINCE' queries, for inefficient servers like
+ Courier IMAP ("some version from 2004"). Mostly based on similar
+ code in the same function.
+
+2005-10-26 Didier Verna <didier@xemacs.org>
+
+ * gnus-group.el (gnus-group-compact-group): invalidate original
+ article buffer.
+ * gnus-srvr.el (gnus-server-compact-server): ditto.
+ * nnml.el (nnml-request-compact-group): handle self Xref: field in
+ NOV database and in article itself.
+ Invalidate article backlog.
+
+2005-10-26 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * mm-uu.el (mm-uu-hide-markers): Fix XEmacs case.
+
+2005-10-26 Simon Josefsson <jas@extundo.com>
+
+ * flow-fill.el (fill-flowed): Flow-fill unquoted lines too, revert
+ part of 2004-07-25 change.
+
+2005-10-26 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * message.el (message-display-completion-list): New function.
+ (message-expand-group): Use it; make sure the Completions buffer
+ is modifiable.
+
+2005-10-23 Chong Yidong <cyd@stupidchicken.com>
+
+ * gnus-sum.el (gnus-ignored-from-addresses): Handle case where
+ user-mail-name is an empty string.
+
+2005-10-25 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-score.el (gnus-default-adaptive-score-alist): Set defaults
+ depending on gnus-score-decay-constant.
+
+ * encrypt.el (encrypt-insert-file-contents)
+ (encrypt-write-file-contents): Don't use `gnus-message'.
+
+ * mm-uu.el (mm-uu-verbatim-marks-extract): Add four start and end
+ arguments.
+ (mm-uu-type-alist): Add message-marks and insert-marks. Pass
+ arguments to mm-uu-verbatim-marks-extract.
+ (mm-uu-hide-markers): New variable.
+ (mm-uu-extract): Use face similar to `gnus-cite-3'.
+
+ * gnus-fun.el (gnus-convert-image-to-x-face-command)
+ (gnus-convert-image-to-face-command): Use "convert" by default to
+ allow other input image formats.
+ (gnus-x-face-from-file, gnus-face-from-file): Adjust doc strings
+ accordingly.
+
+2005-10-23 Simon Josefsson <jas@extundo.com>
+
+ * imap.el (imap-gssapi-program): Align command line parameters
+ with latest GNU SASL.
+ (imap-gssapi-open): Ignore 'Trying ...' messages from GNU SASL.
+
+2005-10-21 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnslashdot.el (nnslashdot-retrieve-headers-1): Update to new
+ HTML.
+ (nnslashdot-request-article): Ditto.
+
+ * lpath.el (featurep): Add nobreak-char-display.
+
+2005-10-20 Hiroshi Fujishima <hiroshi.fujishima@gmail.com> (tiny change)
+
+ * mail-source.el (mail-source-fetch-pop): Require pop3.
+ (mail-source-check-pop): Ditto.
+
+2005-10-20 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * rfc2047.el (rfc2047-decode-encoded-words): Fix the handling of
+ errors.
+
+2005-10-19 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-art.el (gnus-treat-strip-trailing-blank-lines)
+ (gnus-treat-strip-leading-blank-lines): Improve doc string.
+
+ * message.el (message-tool-bar-local-item-from-menu): Fix comment.
+
+ * mm-bodies.el (mm-decode-string): Call
+ `mm-charset-to-coding-system' with allow-override argument.
+
+2005-10-19 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * rfc2047.el (rfc2047-allow-incomplete-encoded-text): New variable.
+ (rfc2047-charset-to-coding-system): New function.
+ (rfc2047-decode-encoded-words): New function.
+ (rfc2047-decode-region): Use them.
+ (rfc2047-decode-cte): Remove.
+ (rfc2047-parse-and-decode): Remove.
+ (rfc2047-decode): Remove.
+
+2005-10-15 Kenichi Handa <handa@m17n.org>
+
+ * rfc2047.el (rfc2047-decode-cte): New function.
+ (rfc2047-decode-region): Change the way to decode successive
+ encoded-words: decode B- or Q-encoding in each encoded-word,
+ concatenate them, and decode it as charset.
+
+2005-10-14 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * lpath.el: Fbind codepage-setup for XEmacs.
+
+2005-10-17 Chong Yidong <cyd@stupidchicken.com>
+
+ * gnus-cus.el (gnus-custom-map): New variable. Bind mouse-1 to
+ widget-move-and-invoke.
+ (gnus-custom-mode): Use gnus-custom-map.
+
+2005-10-15 Bill Wohler <wohler@newt.com>
+
+ * message.el (message-tool-bar-map): Renamed image file from
+ mail_send to mail/send.
+
+2005-10-16 Masatake YAMATO <jet@gyve.org>
+
+ * message.el (message-expand-group): Pass the common
+ prefix substring of completion to `display-completion-list'.
+
+2005-10-13 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * mml-sec.el (mml-secure-method): New internal variable.
+ (mml-secure-sign, mml-secure-encrypt, mml-secure-message-sign)
+ (mml-secure-message-sign-encrypt, mml-secure-message-encrypt): New
+ functions using mml-secure-method.
+
+ * mml.el (mml-mode-map): Add key bindings for those functions.
+ (mml-menu): Simplify security menu entries. Suggested by Jesper
+ Harder <harder@myrealbox.com>.
+ (mml-attach-file, mml-attach-buffer, mml-attach-external): Goto
+ end of message if point is the headers of the message.
+
+ * message.el (message-in-body-p): New function.
+
+ * assistant.el: Autoload gnus-util and netrc.
+
+ * mm-util.el (mm-charset-to-coding-system): Add allow-override.
+ Use `mm-charset-override-alist' only when decoding.
+
+ * mm-bodies.el (mm-decode-body): Call
+ `mm-charset-to-coding-system' with allow-override argument.
+
+ * gnus-art.el (gnus-mime-view-part-as-type-internal): Try to fetch
+ `filename' from Content-Disposition if Content-Type doesn't
+ provide `name'.
+ (gnus-mime-view-part-as-type): Set default instead of
+ initial-input.
+
+2005-10-09 Daniel Brockman <daniel@brockman.se>
+
+ * format-spec.el (format-spec): Propagate text properties of % spec.
+
+2005-10-12 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-art.el (gnus-treat-predicate): Add `first'.
+
+2005-10-11 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * mm-util.el (mm-charset-synonym-alist): Improve doc string.
+ (mm-charset-override-alist): New variable.
+ (mm-charset-to-coding-system): Use it.
+ (mm-codepage-setup): New helper function.
+ (mm-charset-eval-alist): New variable.
+ (mm-charset-to-coding-system): Use mm-charset-eval-alist. Warn
+ about unknown charsets.
+
+ * dgnushack.el (with-syntax-table): Add some URLs WRT the XEmacs bug.
+
+2005-10-04 David Hansen <david.hansen@gmx.net>
+
+ * nnrss.el (nnrss-request-article): Add support for the comments tag.
+ (nnrss-check-group): Ditto.
+
+2005-10-04 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * mm-uu.el (mm-uu-verbatim-marks-extract, mm-uu-latex-extract):
+ Rename x-gnus-verbatim to x-verbatim.
+ (mm-uu-type-alist): Fix regexp for verbatim-marks.
+
+ * mm-decode.el (mm-automatic-display): Rename x-gnus-verbatim to
+ x-verbatim.
+
+ * mm-url.el (mm-url-predefined-programs): Add switches for curl.
+
+ * gnus-util.el (gnus-remove-duplicates): Remove.
+
+ * nnmail.el (nnmail-article-group): Use mm-delete-duplicates
+ instead of gnus-remove-duplicates.
+
+ * message.el (message-remove-duplicates): Remove.
+ (message-idna-to-ascii-rhs-1): Use mm-delete-duplicates instead of
+ message-remove-duplicates.
+
+ * mm-util.el (mm-delete-duplicates): Use `delete-dups' if
+ available, else use implementation from `delete-dups'.
+
+ * message.el (message-insert-expires): New function.
+ (message-mode-map): Add key binding.
+ (message-mode-field-menu): Add menu entry.
+ (message-mode): Document it.
+ (message-make-expires-date): Use `message-make-date'.
+
+2005-10-04 Josh Huber <huber@alum.wpi.edu>
+
+ * message.el (message-make-expires-date): New function.
+
+2005-10-04 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * Makefile.in (list-installed-shadows): New entry.
+ (install): Use it.
+ (remove-installed-shadows): New entry.
+
+ * dgnushack.el (dgnushack-default-load-path): New variable.
+ (dgnushack-find-lisp-shadows): New function.
+ (dgnushack-remove-lisp-shadows): New function.
+
+2005-10-02 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * Makefile.in (install-el-elc): New entry.
+ (install): Use it so that .el files are necessarily installed.
+
+2005-09-30 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * time-date.el: Autoload parse-time-string, XEmacs needs it.
+
+2005-09-30 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * mm-decode.el (mm-inline-media-tests): Check presence of the diff-mode
+ function rather than the diff-mode.el package.
+ (mm-display-external): Use with-current-buffer.
+ (mm-viewer-completion-map, mm-viewer-completion-map):
+ Move initialization inside declaration.
+
+2005-09-29 Simon Josefsson <jas@extundo.com>
+
+ * spam.el: Load hashcash when compiling, to avoid warnings. Don't
+ autoload mail-check-payment.
+ (spam-check-hashcash): Define unconditionally, since hashcash.el
+ is part of Gnus now. Ignore errors from payment checking.
+
+2005-09-28 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * message.el (message-bold-region, message-unbold-region): Rename
+ from `bold-region' and `unbold-region'.
+
+ * message.el: Remove useless autoloads.
+
+2005-09-28 Simon Josefsson <jas@extundo.com>
+
+ * message.el (message-use-idna): Default to t.
+ (message-use-idna): Test whether encoding works too. Doc fix.
+
+2005-09-28 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * nntp.el (nntp-warn-about-losing-connection): Remove.
+
+2005-09-27 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * mm-uu.el (mm-uu-emacs-sources-regexp): Make variable
+ customizable. Change default value.
+ (mm-uu-diff-groups-regexp): Change default value.
+ (mm-uu-type-alist): Add doc string.
+ (mm-uu-configure): Add doc string. Make it interactive.
+ (mm-uu-tex-groups-regexp): New variable.
+ (mm-uu-latex-extract, mm-uu-latex-test): New functions.
+ (mm-uu-type-alist): Add LaTeX documents.
+ (mm-uu-verbatim-marks-extract): Use "text/x-gnus-verbatim" instead
+ of "text/verbatim".
+ (mm-uu-diff-groups-regexp): Fix missing quotes from previous commit.
+
+ * mm-decode.el (mm-automatic-display): Use "text/x-gnus-verbatim"
+ instead of "text/verbatim".
+
+ * message.el (message-mark-inserted-region)
+ (message-mark-insert-file): Use slrn style marks when called with
+ prefix argument.
+
+2005-09-27 Simon Josefsson <jas@extundo.com>
+
+ * message.el (message-idna-to-ascii-rhs-1): Reformat.
+
+2005-09-27 Arne J\e,Ax\e(Brgensen <arne@arnested.dk>
+
+ * message.el (message-remove-duplicates): New function.
+ Implementation borrowed from `gnus-remove-duplicates'.
+ (message-idna-to-ascii-rhs): Also encode idna addresses in
+ Reply-To:, Mail-Reply-To: and Mail-Followup-To:.
+ (message-idna-to-ascii-rhs-1): When `message-use-idna' is 'ask
+ only ask about the same idna domain once per header and also tell
+ in what header to replace the idna domain.
+
+ * gnus-art.el (article-decode-idna-rhs): Also decode idna
+ addresses in Reply-To:, Mail-Reply-To: and Mail-Followup-To:.
+ (article-decode-idna-rhs): Fix regexp so that all idna-address in
+ a header is decoded and not just the last one.
+
+2005-09-27 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-art.el (gnus-mime-display-single): Don't modify text if it
+ has been decoded.
+
+ * mm-decode.el (mm-automatic-display): Add text/verbatim.
+ (mm-insert-part): Don't modify text if it has been decoded.
+
+ * mm-uu.el (mm-uu-verbatim-marks-extract): Say text has been
+ decoded.
+
+ * mm-view.el (mm-inline-text): Don't strip text props unless
+ decoding enriched or richtext parts.
+
+2005-09-25 Romain Francoise <romain@orebokech.com>
+
+ * gnus-agent.el (gnus-agent-expire-group, gnus-agent-expire):
+ * gnus-start.el (gnus-subscribe-interactively):
+ * gnus-uu.el (gnus-uu-grab-articles):
+ End `yes-or-no-p' and `y-or-n-p' prompts with question mark and
+ space.
+
+2005-09-24 Emilio C. Lopes <eclig@gmx.net>
+
+ * smime.el (smime-sign-buffer, smime-decrypt-buffer):
+ * mm-view.el (mm-view-pkcs7-decrypt):
+ * gnus-sum.el (gnus-summary-limit-to-extra)
+ (gnus-summary-respool-article, gnus-read-move-group-name):
+ * gnus-score.el (gnus-summary-increase-score):
+ * gnus-util.el (gnus-completing-read-with-default):
+ * gnus-art.el (gnus-read-save-file-name)
+ (gnus-summary-save-in-rmail, gnus-summary-save-in-mail)
+ (gnus-summary-save-in-file, gnus-summary-save-body-in-file):
+ * message.el (message-check-news-header-syntax):
+ Follow convention for reading with the minibuffer.
+
+2005-09-22 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * spam-report.el (spam-report-url-ping-plain):
+ Use gnus-extended-version as User-Agent.
+
+ * gnus-agent.el (gnus-agent-synchronize-flags): Explain why the
+ default value is nil.
+
+ * mm-uu.el (mm-uu-type-alist): Added slrn style verbatim-marks.
+ (mm-uu-verbatim-marks-extract): New function.
+ (mm-uu-extract): New face.
+ (mm-uu-copy-to-buffer): Use it.
+
+ * spam-report.el (spam-report-gmane-ham): Renamed from
+ `spam-report-gmane-unspam'.
+ (spam-report-gmane-internal): Renamed from `spam-report-gmane'.
+ Simplify use of UNSPAM argument. Fetch "X-Report-Unspam" header.
+
+ * spam.el (spam-report-gmane-spam, spam-report-gmane-ham):
+ Autoload.
+ (spam-report-gmane-unregister-routine): Renamed
+ `spam-report-gmane-unspam' to `spam-report-gmane-ham'.
+
+2005-09-21 Teodor Zlatanov <tzz@lifelogs.com>
+
+ * spam.el (spam-use-gmane, spam-report-gmane-register-routine)
+ (spam-report-gmane-unregister-routine): added support for gmane
+ unregistration
+
+ * spam-report.el (spam-report-gmane-unspam)
+ (spam-report-gmane-spam): new wrappers around spam-report-gmane
+ (spam-report-gmane): changed to take a single article and do
+ unspam registration
+
+2005-09-19 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * mm-url.el (mm-url-decode-entities): Fix regexp.
+
+2005-09-20 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-agent.el (gnus-agent-synchronize-flags): Switch the
+ default to nil, to be able to use Gnus at all. If the default
+ switches to something else, then the function should be fixed not
+ be exceedingly slow.
+
+2005-09-20 Teodor Zlatanov <tzz@lifelogs.com>
+
+ * gnus-start.el (gnus-activate-group): if the server is nil, don't
+ fail hard
+
+ * spam-report.el: better Keywords line
+
+ * spam.el: added Maintainer and better Keywords line
+
+2005-09-19 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-art.el (gnus-article-replace-part)
+ (gnus-mime-replace-part): New functions.
+ (gnus-mime-action-alist, gnus-mime-button-commands)
+ (gnus-mime-save-part-and-strip): Added file argument.
+ (gnus-article-part-wrapper): Added interactive argument.
+
+ * gnus-sum.el (gnus-summary-mime-map): Add
+ `gnus-article-replace-part'.
+
+2005-09-19 Didier Verna <didier@xemacs.org>
+
+ The nnml compaction feature:
+ * nnml.el (nnml-request-compact-group): New function.
+ * nnml.el (nnml-request-compact): New function.
+ * gnus-int.el (gnus-request-compact-group): New function.
+ * gnus-int.el (gnus-request-compact): New function.
+ * gnus-group.el (gnus-group-compact-group): New function.
+ * gnus-group.el (gnus-group-group-map): Bind it to 'G z'.
+ * gnus-group.el (gnus-group-make-menu-bar): Add an entry for it.
+ * gnus-srvr.el (gnus-server-compact-server): New function.
+ * gnus-srvr.el (gnus-server-mode-map): Bind it to 'z'.
+ * gnus-srvr.el (gnus-server-make-menu-bar): Add an entry for it.
+
+2005-09-18 Deepak Goel <deego@gnufans.org>
+
+ * sieve.el (sieve-help): Fix `message' call: first arg should be a
+ format spec.
+
+2005-09-16 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.el (gnus-group-startup-message): Bind image-load-path.
+
+2005-09-15 Romain Francoise <romain@orebokech.com>
+
+ * message.el (message-fill-paragraph): Clarify docstring.
+
+2005-09-14 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-art.el (gnus-mime-display-part): Protect against broken
+ MIME messages.
+
+2005-09-13 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-sum.el (gnus-summary-edit-article-done): Remove text props
+ before parsing header.
+
+2005-09-11 Jari Aalto <jari.aalto@cante.net>
+
+ * html2text.el: (html2text-replace-list): Add new entities.
+
+2005-09-11 Romain Francoise <romain@orebokech.com>
+
+ * message.el (message-alternative-emails): Improve docstring.
+ (message-setup-1): Call `message-use-alternative-email-as-from'
+ after `message-setup-hook' to give it precedence over posting
+ styles, etc.
+ (message-use-alternative-email-as-from): Add docstring. Remove
+ the original From header if present.
+
+ * nnml.el (nnml-compressed-files-size-threshold): New variable.
+ (nnml-save-mail): Use it.
+
+ * gnus-uu.el (gnus-uu-mark-series): Return number of marked
+ articles. Add new argument `silent'.
+ (gnus-uu-mark-all): Report the total number of marked articles.
+
+2005-09-10 Romain Francoise <romain@orebokech.com>
+
+ * gnus-uu.el (gnus-message-process-mark): Use gnus-message.
+ (gnus-uu-mark-series): Likewise.
+
+2005-09-10 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * spam-report.el (spam-report-gmane): Fix generation of spam
+ report URL.
+
+2005-09-10 Simon Josefsson <jas@extundo.com>
+
+ * gnus-agent.el (gnus-agent-synchronize-flags): Make the default
+ t, based on discussion on the ding list with Robert Epprecht
+ <epprecht@solnet.ch>.
+
+2005-09-07 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * spam-report.el (spam-report-gmane): Make it work without
+ X-Report-Spam header. Gmane now only provides Archived-At.
+ This is only used if `spam-report-gmane-use-article-number' is nil.
+ (spam-report-gmane-spam-header): Remove. Not used anymore.
+
+ * gnus-sum.el (gnus-thread-sort-by-recipient): New function to
+ make `gnus-summary-sort-by-recipient' work with threading.
+
+ * nnweb.el (nnweb-google-wash-article): Print a message if article
+ is not available.
+
+2005-09-07 TSUCHIYA Masatoshi <tsuchiya@namazu.org>
+
+ * gnus-art.el (gnus-mime-display-single): Revert 2004-10-07
+ change. Decode text/* parts content before displaying.
+
+2005-09-06 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * mml-smime.el: Remove defvar of gnus-extract-address-components.
+
+2005-09-06 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * mm-view.el (mm-display-inline-fontify): Disable support modes.
+
+ * lpath.el: Don't bind mc-pgp-always-sign, url-current-object,
+ url-package-name, url-package-version,
+ w3m-cid-retrieve-function-alist, w3m-current-buffer,
+ w3m-display-inline-images, and w3m-minor-mode-map.
+
+2005-09-05 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * message.el (message-tab-body-function): Fixed mismatched custom
+ type.
+
+ * gnus.el (gnus-group-change-level-function): Ditto.
+
+ * gnus-msg.el (gnus-outgoing-message-group): Ditto.
+
+ * gnus-art.el (gnus-signature-limit)
+ (gnus-article-mime-part-function): Ditto.
+
+2005-09-05 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * mml.el (mml-mode): Silence the byte compiler.
+
+ * gnus-art.el (gnus-article-jump-to-part): Redisplay the article
+ using `(sit-for 0)' before moving the point to the specified part;
+ skip unbuttonized parts.
+ (gnus-article-part-wrapper): Don't use save-window-excursion; don't
+ return to the summary window if gnus-auto-select-part is non-nil.
+
+2005-09-04 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * mml.el (mml-dnd-protocol-alist, mml-dnd-attach-options): New
+ variables.
+ (mml-dnd-attach-file, mml-mode): Use them.
+
+ * nnweb.el (nnweb-type-definition, nnweb-google-wash-article):
+ Make fetching article by MID work again for Google Groups. Added
+ FIXME concerning gnus-group-make-web-group.
+
+ * mml-smime.el (mml-smime-sign-query, mml-smime-get-dns-cert):
+ Don't depend on Gnus by using mail-extract-address-components if
+ gnus-extract-address-components is not bound.
+
+2005-09-04 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (gnus-mime-display-security): Don't display the
+ signature, but only the signed part.
+
+2005-09-02 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-sum.el (gnus-thread-hide-subtree): Doc fix.
+
+ * gnus-msg.el (gnus-inews-insert-gcc): Fix the mistake of using
+ list, not listp.
+
+2005-09-02 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * mm-encode.el (mm-encode-content-transfer-encoding): Likewise
+ when encoding.
+
+ * mm-bodies.el (mm-decode-content-transfer-encoding):
+ De-canonicalize CRLF for all text content types, not just
+ text/plain.
+
+2005-09-01 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-art.el (gnus-article-part-wrapper): Error if there's no
+ valid article; point arrow and cursor at the MIME button.
+
+2005-08-30 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-art.el (gnus-mime-save-part-and-strip): Clarify prompt.
+ Suggested by Dan Christensen <jdc@uwo.ca>.
+
+ * mm-decode.el (mm-save-part): Enable change of prompt.
+
+2005-08-29 Jari Aalto <jari.aalto@cante.net>
+
+ * gnus-msg.el (gnus-inews-add-send-actions): Made
+ `message-post-method' lambda parameter ARG `&optional'.
+
+2005-08-29 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-sum.el (gnus-summary-mime-map): Added
+ gnus-article-save-part-and-strip, gnus-article-delete-part and
+ gnus-article-jump-to-part.
+
+ * gnus-art.el (gnus-article-edit-article): Added quiet argument.
+ (gnus-article-edit-part): Use it.
+ (gnus-article-part-wrapper): Added no-handle argument.
+ (gnus-article-save-part-and-strip, gnus-article-delete-part): New
+ functions.
+
+2005-08-29 Romain Francoise <romain@orebokech.com>
+
+ * gnus-fun.el (gnus-convert-image-to-face-command): Fix typo in
+ docstring.
+ (gnus-face-from-file): Likewise.
+
+2005-08-29 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-art.el (gnus-mime-save-part-and-strip): Don't prompt.
+ (gnus-mime-delete-part): Don't prompt if `gnus-expert-user' is
+ non-nil.
+ (gnus-auto-select-part): New variable.
+ (gnus-article-jump-to-part): New function.
+ (gnus-article-edit-part, gnus-mime-save-part-and-strip)
+ (gnus-mime-delete-part): Allow selecting specified part after
+ deleting or stripping parts.
+ (gnus-article-jump-to-part): Don't use `read-number'. Use last
+ part if argument is bogus.
+
+2005-08-31 Juanma Barranquero <lekktu@gmail.com>
+
+ * gnus-art.el (w3m-minor-mode-map):
+ * gnus-spec.el (gnus-newsrc-file-version):
+ * gnus-util.el (nnmail-active-file-coding-system)
+ (gnus-original-article-buffer, gnus-user-agent):
+ * gnus.el (gnus-ham-process-destinations)
+ (gnus-parameter-ham-marks-alist)
+ (gnus-parameter-spam-marks-alist, gnus-spam-autodetect)
+ (gnus-spam-autodetect-methods, gnus-spam-newsgroup-contents)
+ (gnus-spam-process-destinations, gnus-spam-process-newsgroups):
+ * mm-decode.el (gnus-current-window-configuration):
+ * mm-extern.el (gnus-article-mime-handles):
+ * mm-url.el (url-current-object, url-package-name)
+ (url-package-version):
+ * mm-view.el (gnus-article-mime-handles, gnus-newsgroup-charset)
+ (smime-keys, w3m-cid-retrieve-function-alist)
+ (w3m-current-buffer, w3m-display-inline-images)
+ (w3m-minor-mode-map):
+ * mml-smime.el (gnus-extract-address-components):
+ * mml.el (gnus-article-mime-handles, gnus-mouse-2)
+ (gnus-newsrc-hashtb, message-default-charset)
+ (message-deletable-headers, message-options)
+ (message-posting-charset, message-required-mail-headers)
+ (message-required-news-headers):
+ * mml1991.el (mc-pgp-always-sign):
+ * mml2015.el (mc-pgp-always-sign):
+ * nnheader.el (nnmail-extra-headers):
+ * rfc1843.el (gnus-decode-encoded-word-function)
+ (gnus-decode-header-function, gnus-newsgroup-name):
+ * spam-stat.el (gnus-original-article-buffer): Add defvars.
+
+2005-08-22 Karl Chen <quarl@cs.berkeley.edu> (tiny change)
+
+ * gnus-art.el (gnus-treatment-function-alist): Move date-lapsed to
+ the end of the date treatments.
+
+2005-08-15 Simon Josefsson <jas@extundo.com>
+
+ * pgg.el (url-insert-file-contents): Don't autoload it, Emacs has
+ it in url-handlers.el and XEmacs in url.el. Reported by Luca
+ Capello and Romain Francoise.
+ (pgg-fetch-key-function): Removed, not used?
+ (pgg-insert-url-with-w3): Require url, to get
+ url-insert-file-contents regardless of where it is defined.
+
+2005-08-13 Romain Francoise <romain@orebokech.com>
+
+ * message.el (message-cite-original-1): New function.
+ (message-cite-original): Use it.
+ (message-cite-original-without-signature): Ditto.
+
+2005-08-08 Romain Francoise <romain@orebokech.com>
+
+ * message.el (message-yank-empty-prefix): New variable.
+ (message-indent-citation): Use it.
+ (message-cite-original-without-signature): Respect X-No-Archive.
+
+2005-08-08 Simon Josefsson <jas@extundo.com>
+
+ * pgg.el: Autoload url-insert-file-contents instead of loading
+ w3/url.
+ (pgg-insert-url-with-w3): Don't load url here.
+
+2005-08-07 Jesper Harder <harder@phys.au.dk>
+
+ * message.el (message-kill-to-signature): Don't insert newline at
+ bol.
+ (message-newline-and-reformat): Bind fill-paragraph-function to nil.
+
+2005-08-06 Romain Francoise <romain@orebokech.com>
+
+ * message.el (message-user-fqdn): Fix typo in docstring.
+
+2005-08-05 Daiki Ueno <ueno@unixuser.org>
+
+ * mml2015.el (mml2015-pgg-sign): Make sure micalg is correct.
+
+ * pgg-parse.el (pgg-parse-hash-algorithm-alist): Add SHA-2.
+
+2005-08-05 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * mm-bodies.el (mm-encode-body): Use coding system rather than
+ charset to encode text.
+
+ * mm-util.el (mm-find-mime-charset-region): Attempt to reduce the
+ number of charsets if utf-8 is available (XEmacs).
+
+2005-08-04 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-art.el (gnus-button-valid-localpart-regexp): New variable
+ taken from `gnus-button-mid-or-mail-regexp'.
+ (gnus-button-mid-or-mail-regexp, gnus-button-alist): Use it.
+ (gnus-button-alist): Improve regexp for domain part of the MIDs
+ for news:localpart@domain buttons.
+ (gnus-button-ctan-directory-regexp): Update.
+
+2005-08-02 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * sieve-manage.el (sieve-manage-interactive-login): Use
+ make-local-variable rather than make-variable-buffer-local.
+ (sieve-manage-open): Ditto.
+ (sieve-manage-authenticate): Ditto.
+
+ * mml.el (mml-generate-mime-1): Make the content type default to
+ text/plain if the filename is not specified.
+
+2005-08-01 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-uu.el (gnus-uu-save-article): Use insert-buffer-substring
+ instead of insert-buffer.
+
+ * message.el (message-yank-original): Ditto; set the mark at the
+ end of the yanked message.
+
+2005-07-29 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-art.el (gnus-article-next-page-1): Reduce the number of
+ lines to scroll rather than to stop it.
+
+ * mml.el (mml-generate-default-type): Add doc string.
+ (mml-generate-mime-1): Use mm-default-file-encoding or make it
+ default to application/octet-stream when determining the content
+ type if it is not specified for the part or the mml contents; add
+ a comment about mml-generate-default-type.
+
+2005-07-29 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * mml.el (mml-generate-mime-1): Use mm-default-file-encoding or
+ make it default to application/octet-stream when determining the
+ content type if it is not specified for the external contents.
+
+2005-07-28 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * rfc2231.el (rfc2231-parse-string): Take care that not only a
+ segmented parameter but also other parameters might be there.
+
+2005-07-27 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * mm-decode.el (mm-display-external): Delete temp file, directory
+ and buffer immediately if the external process is exited.
+
+2005-07-26 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-art.el (gnus-article-next-page-1): Don't scroll if there're
+ fewer lines than that of scroll-margin.
+ (gnus-article-prev-page): Narrow the range to bind scroll-in-place.
+
+2005-07-25 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-art.el (gnus-article-next-page): Revert.
+ (gnus-article-beginning-of-window): New macro.
+ (gnus-article-next-page-1): Use it.
+ (gnus-article-prev-page): Ditto.
+ (gnus-article-edit-part): Use insert-buffer-substring instead of
+ insert-buffer.
+ (gnus-article-edit-exit): Ditto.
+
+ * gnus-util.el (gnus-beginning-of-window): Remove.
+ (gnus-end-of-window): Remove.
+
+ * lpath.el: Don't bind header-line-format and scroll-margin.
+
+2005-07-25 Simon Josefsson <jas@extundo.com>
+
+ * pgg.el (pgg-insert-url-with-w3): Don't load w3, it is possible
+ to have the url package without w3. Reported by Daiki Ueno
+ <ueno@unixuser.org> and Luigi Panzeri <matley@muppetslab.org>.
+
+2005-07-20 Didier Verna <didier@xemacs.org>
+
+ * gnus-diary.el: Remove the description comment (nndiary is now
+ properly documented in the Gnus manual).
+ Fix the spelling of "Back End".
+ * nndiary.el: Ditto.
+ Fix the copyright notice.
+
+2005-07-18 Romain Francoise <romain@orebokech.com>
+
+ * gnus-sum.el (gnus-summary-to-prefix,
+ gnus-summary-newsgroup-prefix): New variables.
+ (gnus-summary-from-or-to-or-newsgroups): Use them.
+
+2005-07-17 Romain Francoise <romain@orebokech.com>
+
+ * mml2015.el (mml2015-clean-buffer): Prefix buffer name with a
+ space as it's generally not especially interesting to the user.
+
+2005-07-16 Romain Francoise <romain@orebokech.com>
+
+ * nnfolder.el (nnfolder-save-buffer): Bind `copyright-update' to
+ nil to avoid prompting and file modification if one of the
+ messages at the top of the nnfolder file contains a copyright
+ notice.
+ Update copyright notice.
+
+ * gnus-uu.el (gnus-uu-save-article): Use `message-make-date'
+ instead of `current-time-string' as the latter creates a time
+ string that is not RFC 2822 compliant (it lacks the zone).
+ Update copyright notice.
+
+2005-07-21 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * mml.el (mml-minibuffer-read-disposition): Don't use inline by default
+ for text/rtf. Display default in prompt. Pass default for M-n.
+
+ * mm-uu.el (mm-uu-copy-to-buffer): Use with-current-buffer.
+
+2005-07-16 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-msg.el (gnus-button-mailto): Remove
+ save-selected-window-window hackery because it relies on
+ save-selected-window internals.
+
+2005-07-15 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-art.el (gnus-article-next-page): Use gnus-end-of-window.
+ (gnus-article-next-page-1): Use gnus-beginning-of-window.
+ (gnus-article-prev-page): Ditto.
+
+ * gnus-util.el (gnus-beginning-of-window): New function.
+ (gnus-end-of-window): New function.
+
+ * lpath.el: Bind header-line-format and scroll-margin for XEmacs.
+
+2005-07-14 Hiroshi Fujishima <hiroshi.fujishima@gmail.com> (tiny change)
+
+ * gnus-score.el (gnus-score-edit-all-score): Set
+ gnus-score-edit-exit-function to gnus-score-edit-done and call
+ gnus-message.
+
+2005-07-14 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-msg.el (gnus-button-mailto): Remove
+ save-selected-window-window hackery because it relies on
+ save-selected-window internals.
+
+2005-07-13 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-salt.el (gnus-pick-mode): Remove the 5th arg of
+ add-minor-mode.
+ (gnus-binary-mode): Ditto.
+
+ * gnus-topic.el (gnus-topic-mode): Ditto.
+
+2005-07-08 Ralf Angeli <angeli@iwi.uni-sb.de>
+
+ * gnus-art.el (gnus-article-next-page, gnus-article-next-page-1)
+ (gnus-article-prev-page): Take scroll-margin into consideration.
+
+2005-07-04 Lute Kamstra <lute@gnu.org>
+
+ Update FSF's address in GPL notices.
+
+2005-07-04 Juanma Barranquero <lekktu@gmail.com>
+
+ * gnus.el (gnus-exit):
+ * gnus-group.el (gnus-group-icons):
+ * nnmail.el (nnmail-prepare): Fix typos in docstrings.
+
+ * gnus-nocem.el (gnus-nocem):
+ * message.el (message-various, message-buffers, message-sending)
+ (message-interface, message-forwarding, message-insertion)
+ (message-headers, message-news, message-mail):
+ * pgg-gpg.el (pgg-gpg):
+ * pgg-parse.el (pgg-parse):
+ * pgg-pgp.el (pgg-pgp):
+ * pgg-pgp5.el (pgg-pgp5):
+ * pop3.el (pop3): Finish `defgroup' description with period.
+
+2005-07-01 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-art.el (article-display-face): Improve the efficiency.
+ (article-display-x-face): Ditto; remove grey x-face stuff.
+
+2005-06-30 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-art.el (article-display-face): Correct the position in
+ which Faces are inserted.
+
+2005-06-29 Didier Verna <didier@xemacs.org>
+
+ * gnus-art.el (article-display-face): Display faces in correct
+ order.
+
+2005-06-29 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-nocem.el (gnus-nocem-verifyer): Default to pgg-verify.
+ (gnus-fill-real-hashtb): Use hash table instead of obarray.
+ (gnus-nocem-check-article): Fetch the Type header.
+ (gnus-nocem-message-wanted-p): Fix the way to examine types.
+ (gnus-nocem-verify-issuer): Use functionp instead of fboundp.
+ (gnus-nocem-enter-article): Use hash tables rather than obarrays;
+ make sure gnus-nocem-hashtb is initialized.
+ (gnus-nocem-alist-to-hashtb): Use hash table instead of obarray.
+ (gnus-nocem-unwanted-article-p): Ditto.
+
+ * pgg.el (pgg-verify): Return the verification result.
+
+2005-06-27 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (gnus-mime-copy-part): Check whether coding-system
+ is ascii.
+
+2005-06-24 Juanma Barranquero <lekktu@gmail.com>
+
+ * gnus-art.el (gnus-article-mode): Set `nobreak-char-display', not
+ `show-nonbreak-escape'.
+
+2005-06-23 Lute Kamstra <lute@gnu.org>
+
+ * gnus-art.el (gnus-article-mode): Use kill-all-local-variables.
+
+ * dig.el (dig-mode):
+ * smime.el (smime-mode): Use gnus-run-mode-hooks.
+
+2005-06-21 Juanma Barranquero <lekktu@gmail.com>
+
+ * nnimap.el (nnimap-split-download-body): Fix spellings.
+
+2005-06-16 Juanma Barranquero <lekktu@gmail.com>
+
+ * gnus-art.el (gnus-article-encrypt-body):
+ * gnus-cus.el (gnus-score-customize):
+ * mm-extern.el (mm-extern-local-file, mm-inline-external-body):
+ * pop3.el (pop3-user): Don't use `format' on `error' arguments.
+
+2005-06-16 Arne J\e,Ax\e(Brgensen <arne@arnested.dk>
+
+ * smime.el (smime-cert-by-ldap-1): Detect PEM format without
+ header by looking for magic "MII" at the beginnig.
+
+2005-06-16 Miles Bader <miles@gnu.org>
+
+ * gnus-xmas.el (gnus-xmas-group-startup-message):
+ Use renamed gnus-splash face.
+
+ * assistant.el (assistant-field): Remove "-face" suffix from face name.
+ (assistant-field-face): New backward-compatibility alias for renamed
+ face.
+ (assistant-render-text): Use renamed assistant-field face.
+
+ * spam.el (spam): Remove "-face" suffix from face name.
+ (spam-face): New backward-compatibility alias for renamed face.
+ (spam-face, spam-initialize): Use renamed spam face.
+
+ * message.el (message-header-to, message-header-cc)
+ (message-header-subject, message-header-newsgroups)
+ (message-header-other, message-header-name)
+ (message-header-xheader, message-separator, message-cited-text)
+ (message-mml): Remove "-face" suffix from face names.
+ (message-header-to-face, message-header-cc-face)
+ (message-header-subject-face, message-header-newsgroups-face)
+ (message-header-other-face, message-header-name-face)
+ (message-header-xheader-face, message-separator-face)
+ (message-cited-text-face, message-mml-face):
+ New backward-compatibility aliases for renamed faces.
+ (message-font-lock-keywords): Use renamed message faces.
+
+ * sieve-mode.el (sieve-control-commands, sieve-action-commands)
+ (sieve-test-commands, sieve-tagged-arguments):
+ Remove "-face" suffix from face names.
+ (sieve-control-commands-face, sieve-action-commands-face)
+ (sieve-test-commands-face, sieve-tagged-arguments-face):
+ New backward-compatibility aliases for renamed faces.
+ (sieve-control-commands-face, sieve-action-commands-face)
+ (sieve-test-commands-face, sieve-tagged-arguments-face):
+ Use renamed sieve faces.
+
+ * gnus.el (gnus-group-news-1, gnus-group-news-1-empty)
+ (gnus-group-news-2, gnus-group-news-2-empty, gnus-group-news-3)
+ (gnus-group-news-3-empty, gnus-group-news-4)
+ (gnus-group-news-4-empty, gnus-group-news-5)
+ (gnus-group-news-5-empty, gnus-group-news-6)
+ (gnus-group-news-6-empty, gnus-group-news-low)
+ (gnus-group-news-low-empty, gnus-group-mail-1)
+ (gnus-group-mail-1-empty, gnus-group-mail-2)
+ (gnus-group-mail-2-empty, gnus-group-mail-3)
+ (gnus-group-mail-3-empty, gnus-group-mail-low)
+ (gnus-group-mail-low-empty, gnus-summary-selected)
+ (gnus-summary-cancelled, gnus-summary-high-ticked)
+ (gnus-summary-low-ticked, gnus-summary-normal-ticked)
+ (gnus-summary-high-ancient, gnus-summary-low-ancient)
+ (gnus-summary-normal-ancient, gnus-summary-high-undownloaded)
+ (gnus-summary-low-undownloaded)
+ (gnus-summary-normal-undownloaded, gnus-summary-high-unread)
+ (gnus-summary-low-unread, gnus-summary-normal-unread)
+ (gnus-summary-high-read, gnus-summary-low-read)
+ (gnus-summary-normal-read, gnus-splash):
+ Remove "-face" suffix from face names.
+ (gnus-group-news-1-face, gnus-group-news-1-empty-face)
+ (gnus-group-news-2-face, gnus-group-news-2-empty-face)
+ (gnus-group-news-3-face, gnus-group-news-3-empty-face)
+ (gnus-group-news-4-face, gnus-group-news-4-empty-face)
+ (gnus-group-news-5-face, gnus-group-news-5-empty-face)
+ (gnus-group-news-6-face, gnus-group-news-6-empty-face)
+ (gnus-group-news-low-face, gnus-group-news-low-empty-face)
+ (gnus-group-mail-1-face, gnus-group-mail-1-empty-face)
+ (gnus-group-mail-2-face, gnus-group-mail-2-empty-face)
+ (gnus-group-mail-3-face, gnus-group-mail-3-empty-face)
+ (gnus-group-mail-low-face, gnus-group-mail-low-empty-face)
+ (gnus-summary-selected-face, gnus-summary-cancelled-face)
+ (gnus-summary-high-ticked-face, gnus-summary-low-ticked-face)
+ (gnus-summary-normal-ticked-face)
+ (gnus-summary-high-ancient-face, gnus-summary-low-ancient-face)
+ (gnus-summary-normal-ancient-face)
+ (gnus-summary-high-undownloaded-face)
+ (gnus-summary-low-undownloaded-face)
+ (gnus-summary-normal-undownloaded-face)
+ (gnus-summary-high-unread-face, gnus-summary-low-unread-face)
+ (gnus-summary-normal-unread-face, gnus-summary-high-read-face)
+ (gnus-summary-low-read-face, gnus-summary-normal-read-face)
+ (gnus-splash-face):
+ New backward-compatibility aliases for renamed faces.
+ (gnus-group-startup-message): Use renamed gnus faces.
+
+ * gnus-srvr.el (gnus-server-agent, gnus-server-opened)
+ (gnus-server-closed, gnus-server-denied, gnus-server-offline)
+ (gnus-server-agent): Remove "-face" suffix from face names.
+ (gnus-server-agent-face, gnus-server-opened-face)
+ (gnus-server-closed-face, gnus-server-denied-face)
+ (gnus-server-offline-face):
+ New backward-compatibility aliases for renamed faces.
+ (gnus-server-agent-face, gnus-server-opened-face)
+ (gnus-server-closed-face, gnus-server-denied-face)
+ (gnus-server-offline-face): Use renamed gnus faces.
+
+ * gnus-picon.el (gnus-picon-xbm, gnus-picon):
+ Remove "-face" suffix from face names.
+ (gnus-picon-xbm-face, gnus-picon-face):
+ New backward-compatibility aliases for renamed faces.
+
+ * gnus-cite.el (gnus-cite-attribution, gnus-cite-1, gnus-cite-2)
+ (gnus-cite-3, gnus-cite-4, gnus-cite-5, gnus-cite-6)
+ (gnus-cite-7, gnus-cite-8, gnus-cite-9, gnus-cite-10)
+ (gnus-cite-11): Remove "-face" suffix from face names.
+ (gnus-cite-attribution-face, gnus-cite-face-1, gnus-cite-face-2)
+ (gnus-cite-face-3, gnus-cite-face-4, gnus-cite-face-5)
+ (gnus-cite-face-6, gnus-cite-face-7, gnus-cite-face-8)
+ (gnus-cite-face-9, gnus-cite-face-10, gnus-cite-face-11):
+ New backward-compatibility aliases for renamed faces.
+ (gnus-cite-attribution-face, gnus-cite-face-list)
+ (gnus-article-boring-faces): Use renamed gnus faces.
+
+ * gnus-art.el (gnus-signature, gnus-header-from)
+ (gnus-header-subject, gnus-header-newsgroups, gnus-header-name)
+ (gnus-header-content): Remove "-face" suffix from face names.
+ (gnus-signature-face, gnus-header-from-face)
+ (gnus-header-subject-face, gnus-header-newsgroups-face)
+ (gnus-header-name-face, gnus-header-content-face):
+ New backward-compatibility aliases for renamed faces.
+ (gnus-signature-face, gnus-header-face-alist): Use renamed gnus faces.
+
+ * gnus-sum.el (gnus-summary-selected-face)
+ (gnus-summary-highlight): Use renamed gnus faces.
+ * gnus-group.el (gnus-group-highlight): Likewise.
+
+2005-06-14 Juanma Barranquero <lekktu@gmail.com>
+
+ * gnus-sieve.el (gnus-sieve-article-add-rule):
+ * legacy-gnus-agent.el (gnus-agent-unlist-expire-days):
+ * spam-stat.el (spam-stat-buffer-change-to-spam)
+ (spam-stat-buffer-change-to-non-spam): Follow error conventions.
+
+ * message.el (message-is-yours-p):
+ * gnus-sum.el (gnus-auto-select-subject): Fix quoting in docstring.
+
+2005-06-14 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * mm-view.el (mm-inline-text): Withdraw the last change.
+
+2005-06-09 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * mm-view.el (mm-inline-text): Turn off adaptive-fill-mode while
+ executing enriched-decode.
+
+2005-06-07 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * mm-util.el (mm-find-buffer-file-coding-system): Don't examine
+ charset of tar files.
+
+2005-06-04 Luc Teirlinck <teirllm@auburn.edu>
+
+ * gnus-art.el (article-update-date-lapsed): Use `save-match-data'.
+
+2005-06-04 Lute Kamstra <lute@gnu.org>
+
+ * nnfolder.el (nnfolder-read-folder): Make sure that undo
+ information is never recorded.
+
+2005-06-03 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * gnus-art.el (gnus-emphasis-alist): Disable the strikethru thingy.
+
+2005-06-02 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * pop3.el (pop3-apop): Run md5 in the binary mode.
+
+ * starttls.el (starttls-set-process-query-on-exit-flag):
+ Use eval-and-compile.
+
+2005-05-31 Simon Josefsson <jas@extundo.com>
+
+ * smime.el (smime-replace-in-string): Define.
+ (smime-cert-by-ldap-1): Use it.
+
+2005-05-31 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-art.el (article-display-x-face): Replace
+ process-kill-without-query by gnus-set-process-query-on-exit-flag.
+
+ * gnus-util.el (gnus-set-process-query-on-exit-flag): Alias to
+ set-process-query-on-exit-flag or process-kill-without-query.
+
+ * html2text.el (html2text-fix-paragraphs): Use `while - re-search'
+ loop instead of replace-regexp.
+
+ * imap.el (imap-ssl-open): Use set-process-query-on-exit-flag
+ instead of process-kill-without-query if it is available.
+
+ * lpath.el: Fbind ldap-search-entries.
+
+ * mm-util.el (mm-insert-file-contents): Bind find-file-hook
+ instead of find-file-hooks if it is available.
+
+ * mml1991.el: Bind pgg-default-user-id when compiling.
+
+ * mml2015.el: Bind pgg-default-user-id when compiling.
+
+ * nndraft.el (nndraft-request-associate-buffer):
+ Use write-contents-functions instead of write-contents-hooks if it is
+ available.
+
+ * nnheader.el (nnheader-find-file-noselect): Bind find-file-hook
+ instead of find-file-hooks if it is available.
+
+ * nntp.el (nntp-open-connection): Replace
+ process-kill-without-query by gnus-set-process-query-on-exit-flag.
+ (nntp-open-ssl-stream): Ditto.
+ (nntp-open-tls-stream): Ditto.
+
+ * starttls.el (starttls-set-process-query-on-exit-flag): Alias to
+ set-process-query-on-exit-flag or process-kill-without-query.
+ (starttls-open-stream-gnutls): Use it instead of
+ process-kill-without-query.
+ (starttls-open-stream): Ditto.
+
+2005-05-31 Ulf Stegemann <ulf@zeitform.de> (tiny change)
+
+ * smime.el (smime-cert-by-ldap-1): Don't use
+ replace-regexp-in-string.
+
+2005-05-31 Arne J\e,Ax\e(Brgensen <arne@arnested.dk>
+
+ * smime-ldap.el (smime-ldap-search): Add compatibility for XEmacs.
+
+ * smime.el (smime-cert-by-ldap-1): Handle certificates distributed
+ in PEM format. Adjust to the XEmacs compability.
+
+2005-05-30 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * encrypt.el (encrypt-xor-process-buffer): Replace `string-to-int'
+ by `string-to-number'.
+ * gnus-agent.el (gnus-agent-regenerate-group)
+ (gnus-agent-fetch-articles): Ditto.
+ * gnus-art.el (gnus-button-fetch-group): Ditto.
+ * gnus-cache.el (gnus-cache-generate-active)
+ (gnus-cache-articles-in-group): Ditto.
+ * gnus-group.el (gnus-group-set-current-level)
+ (gnus-group-insert-group-line): Ditto.
+ * gnus-score.el (gnus-score-set-expunge-below)
+ (gnus-score-set-mark-below, gnus-summary-score-effect)
+ (gnus-summary-score-entry): Ditto.
+ * gnus-soup.el (gnus-soup-send-packet, gnus-soup-parse-areas)
+ (gnus-soup-pack): Ditto.
+ * gnus-spec.el (gnus-xmas-format): Ditto.
+ * gnus-start.el (gnus-newsrc-to-gnus-format): Ditto.
+ * gnus-sum.el (gnus-create-xref-hashtb): Ditto.
+ * gnus-uu.el (gnus-uu-expand-numbers): Ditto.
+ * nnbabyl.el (nnbabyl-article-group-number): Ditto.
+ * nndb.el (nndb-get-remote-expire-response): Ditto.
+ * nndiary.el (nndiary-parse-schedule-value)
+ (nndiary-string-to-number, nndiary-request-replace-article)
+ (nndiary-request-article): Ditto.
+ * nndoc.el (nndoc-rnews-body-end, nndoc-mbox-body-end): Ditto.
+ * nndraft.el (nndraft-articles, nndraft-request-group): Ditto.
+ * nneething.el (nneething-make-head): Ditto.
+ * nnfolder.el (nnfolder-request-article)
+ (nnfolder-retrieve-headers): Ditto.
+ * nnheader.el (nnheader-file-to-number): Ditto.
+ * nnkiboze.el (nnkiboze-request-article): Ditto.
+ * nnmail.el (nnmail-process-unix-mail-format)
+ (nnmail-process-babyl-mail-format): Ditto.
+ * nnmbox.el (nnmbox-read-mbox, nnmbox-article-group-number): Ditto.
+ * nnmh.el (nnmh-update-gnus-unreads, nnmh-active-number)
+ (nnmh-request-create-group, nnmh-request-list-1)
+ (nnmh-request-group, nnmh-request-article): Ditto.
+ * nnml.el (nnml-request-replace-article, nnml-request-article): Ditto.
+ * nnrss.el (nnrss-find-rss-via-syndic8): Ditto.
+ * nnsoup.el (nnsoup-make-active): Ditto.
+ * nnspool.el (nnspool-find-id, nnspool-request-group): Ditto.
+ * nntp.el (nntp-find-group-and-number)
+ (nntp-retrieve-headers-with-xover): Ditto.
+ * pgg-gpg.el (pgg-gpg-snarf-keys-region): Ditto.
+ * pgg-parse.el (pgg-read-body, pgg-read-bytes)
+ (pgg-format-key-identifier): Ditto.
+ * pop3.el (pop3-last, pop3-stat): Ditto.
+ * qp.el (quoted-printable-decode-region): Ditto.
+
+ * spam-report.el (spam-report-url-ping-mm-url): Use format instead
+ of concat.
+
+2005-05-30 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-agent.el (gnus-category-mode): Use gnus-run-mode-hooks.
+
+ * gnus-art.el (gnus-article-mode): Use gnus-run-mode-hooks.
+
+ * gnus-cus.el (gnus-custom-mode): Use gnus-run-mode-hooks.
+
+ * gnus-eform.el (gnus-edit-form-mode): Use gnus-run-mode-hooks.
+
+ * gnus-group.el (gnus-group-mode): Use gnus-run-mode-hooks.
+
+ * gnus-kill.el (gnus-kill-file-mode): Use gnus-run-mode-hooks.
+
+ * gnus-salt.el (gnus-tree-mode): Use gnus-run-mode-hooks.
+ (gnus-carpal-mode): Ditto.
+
+ * gnus-srvr.el (gnus-server-mode): Use gnus-run-mode-hooks.
+ (gnus-browse-mode): Ditto.
+
+ * gnus-sum.el (gnus-summary-mode): Use gnus-run-mode-hooks.
+
+ * gnus-util.el (gnus-run-mode-hooks): Save current buffer.
+
+2005-05-29 Richard M. Stallman <rms@gnu.org>
+
+ * gnus-cite.el (gnus-cite-add-face): Set overlay's evaporate property.
+
+2005-05-27 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-util.el (gnus-run-mode-hooks): New function.
+
+ * score-mode.el (gnus-score-mode): Use gnus-run-mode-hooks.
+
+ * dgnushack.el: Advise byte-optimize-form-code-walker to avoid the
+ ``...called for effect'' warnings for Emacs 21.4 as well as 21.3.
+
+2005-05-26 Luc Teirlinck <teirllm@auburn.edu>
+
+ * gnus-agent.el (gnus-agent-make-mode-line-string):
+ Use mode-line-highlight as mouse-face.
+
+2005-05-17 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * canlock.el (canlock): Change the parent group to news.
+
+ * deuglify.el (gnus-outlook-deuglify): Add :group.
+
+ * dig.el (dig): Add :group.
+
+ * dns-mode.el (dns-mode): Add :group.
+
+ * encrypt.el (encrypt): Add :group.
+
+ * gnus-cite.el (gnus-cite-attribution-face): Add :group.
+ (gnus-cite-face-1, gnus-cite-face-2, gnus-cite-face-3): Ditto.
+ (gnus-cite-face-4, gnus-cite-face-5, gnus-cite-face-6): Ditto.
+ (gnus-cite-face-7, gnus-cite-face-8, gnus-cite-face-9): Ditto.
+ (gnus-cite-face-10, gnus-cite-face-11): Ditto.
+
+ * gnus-diary.el (gnus-diary): Add :group.
+
+ * gnus.el (gnus-group-news-1-face): Add :group.
+ (gnus-group-news-1-empty-face): Ditto.
+ (gnus-group-news-2-face, gnus-group-news-2-empty-face): Ditto.
+ (gnus-group-news-3-face, gnus-group-news-3-empty-face): Ditto.
+ (gnus-group-news-4-face, gnus-group-news-4-empty-face): Ditto.
+ (gnus-group-news-5-face, gnus-group-news-5-empty-face): Ditto.
+ (gnus-group-news-6-face, gnus-group-news-6-empty-face): Ditto.
+ (gnus-group-news-low-face, gnus-group-news-low-empty-face): Ditto.
+ (gnus-group-mail-1-face, gnus-group-mail-1-empty-face): Ditto.
+ (gnus-group-mail-2-face, gnus-group-mail-2-empty-face): Ditto.
+ (gnus-group-mail-3-face, gnus-group-mail-3-empty-face): Ditto.
+ (gnus-group-mail-low-face, gnus-group-mail-low-empty-face): Ditto.
+ (gnus-summary-selected-face, gnus-summary-cancelled-face): Ditto.
+ (gnus-summary-high-ticked-face): Ditto.
+ (gnus-summary-low-ticked-face): Ditto.
+ (gnus-summary-normal-ticked-face): Ditto.
+ (gnus-summary-high-ancient-face): Ditto.
+ (gnus-summary-low-ancient-face): Ditto.
+ (gnus-summary-normal-ancient-face): Ditto.
+ (gnus-summary-high-undownloaded-face): Ditto.
+ (gnus-summary-low-undownloaded-face): Ditto.
+ (gnus-summary-normal-undownloaded-face): Ditto.
+ (gnus-summary-high-unread-face): Ditto.
+ (gnus-summary-low-unread-face): Ditto.
+ (gnus-summary-normal-unread-face): Ditto.
+ (gnus-summary-high-read-face, gnus-summary-low-read-face): Ditto.
+ (gnus-summary-normal-read-face, gnus-splash-face): Ditto.
+
+ * hashcash.el (hashcash): New custom group.
+ (hashcash-default-payment): Add :group.
+ (hashcash-payment-alist): Ditto.
+ (hashcash-default-accept-payment): Ditto.
+ (hashcash-accept-resources): Ditto.
+ (hashcash-path): Ditto.
+ (hashcash-extra-generate-parameters): Ditto.
+ (hashcash-double-spend-database): Ditto.
+ (hashcash-in-news): Ditto.
+
+ * message.el (message-minibuffer-local-map): Add :group.
+
+ * netrc.el (netrc): Add :group.
+
+ * sieve-manage.el (sieve-manage-log): Add :group.
+ (sieve-manage-default-user): Diito.
+ (sieve-manage-server-eol, sieve-manage-client-eol): Ditto.
+ (sieve-manage-streams, sieve-manage-stream-alist): Ditto.
+ (sieve-manage-authenticators): Ditto.
+ (sieve-manage-authenticator-alist): Ditto.
+ (sieve-manage-default-port): Ditto.
+
+ * sieve-mode.el (sieve-control-commands-face): Add :group.
+ (sieve-action-commands-face): Ditto.
+ (sieve-test-commands-face): Ditto.
+ (sieve-tagged-arguments-face): Ditto.
+
+ * smime.el (smime): Add :group.
+
+ * spam-report.el (spam-report): Add :group.
+
+ * spam.el (spam, spam-face): Add :group.
+
+2005-05-16 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nntp.el (nntp-next-result-arrived-p): Some news servers may
+ return \n.\n.\n at the end of articles. Protect against that.
+ (nntp-with-open-group): Allow debugging.
+
+ * nnheader.el (mail-header-set-extra): Make into a function
+ because I just could't understand how to quote the list properly.
+
+ * dns.el (query-dns-cached): New function.
+
+2005-05-26 Lute Kamstra <lute@gnu.org>
+
+ * score-mode.el (gnus-score-mode): Use run-mode-hooks.
+
+2005-05-16 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * dgnushack.el: Autoload mail-extract-address-components for XEmacs.
+
+ * gnus-art.el: Don't autoload mail-extract-address-components.
+
+ * gnus.el: Remove duplicated autoload for message-y-or-n-p; use
+ eval-and-compile to evaluate it.
+
+ * hashcash.el: Don't autoload executable-find.
+
+ * nndb.el: Don't declare the nndb back end two or more times; don't
+ autoload news-reply-mode, news-setup, cancel-timer and telnet.
+
+ * nntp.el: Autoload format-spec instead of format; use
+ eval-and-compile to evaluate autoload forms.
+
+2005-05-09 Georg C. F. Greve <greve@gnu.org> (tiny change)
+
+ * pgg-gpg.el (pgg-gpg-possibly-cache-passphrase): Fix PIN caching.
+
+2005-05-01 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus.el (gnus-version-number): Bump version.
+
2005-05-01 Lars Magne Ingebrigtsen <lars@ingebrigtsen.no>
* gnus.el: No Gnus v0.3 is released.
* nnimap.el (nnimap-date-days-ago): Add defvars in order to
silence the byte compiler inside the defun
- * gnus-demon.el (parse-time-string): Added autoload.
+ * gnus-demon.el (parse-time-string): Add autoload.
- * gnus-delay.el (parse-time-string): Added autoload.
+ * gnus-delay.el (parse-time-string): Add autoload.
- * gnus-art.el (parse-time-string): Added autoload.
+ * gnus-art.el (parse-time-string): Add autoload.
* nnultimate.el (parse-time): Require for `parse-time-string'.
* nnmaildir.el (nnmaildir-request-accept-article):
Use `nnheader-cancel-timer' for compatibility with current XEmacs.
-2005-03-13 Steve Youngs <steve@sxemacs.org>
+2005-03-13 Andrey Slusar <anrays@gmail.com> (tiny change)
* gnus-async.el: Require timer-funcs at compile time when in
XEmacs for `run-with-idle-timer'.
-2005-03-13 Steve Youngs <steve@sxemacs.org>
+2005-03-13 Andrey Slusar <anrays@gmail.com> (tiny change)
* gnus.el: Don't try and mark `gnus-agent-save-groups' as an
autoloaded function.
- From: Andrey Slusar <anrays@gmail.com>.
2005-03-10 Stefan Monnier <monnier@iro.umontreal.ca>
* nnimap.el (nnimap-retrieve-headers-from-server): Fix last change.
-2005-03-10 Arne J\e,Ax\e(Brgensen <arne@arnested.dk> (tiny change)
+2005-03-10 Arne J\e,Ax\e(Brgensen <arne@arnested.dk> (tiny change)
* nnimap.el (nnimap-retrieve-headers-from-server): Fix off-by-one flaw.
* gnus-msg.el (gnus-confirm-mail-reply-to-news): Add
gnus-expert-user to default.
-2005-03-08 Juergen Kreileder <jk@blackdown.de> (tiny change)
+2005-03-08 Juergen Kreileder <jk@blackdown.de> (tiny change)
* nnimap.el (nnimap-open-server): Ditto.
* imap.el (imap-authenticate): Fix typo.
-2005-03-08 Bjorn Solberg <bjorn_ding@hekneby.org> (tiny change)
+2005-03-08 Bjorn Solberg <bjorn_ding@hekneby.org> (tiny change)
* nnimap.el (nnimap-retrieve-headers-from-server): Sort NOV
buffer (since IMAP server might return FETCH response out of
gnus-agent-synchronize-group-flags to reset read status in both
gnus and server.
(gnus-agent-update-files-total-fetched-for): Fixed initial size.
-
+
2005-03-04 Reiner Steib <Reiner.Steib@gmx.de>
* message.el: Don't autoload former message-utils variables.
* mml.el (mml-parse-1): Use them.
-2005-02-21 Arne J\e,Ax\e(Brgensen <arne@arnested.dk>
+2005-02-21 Arne J\e,Ax\e(Brgensen <arne@arnested.dk>
* nnrss.el (nnrss-verbose): Removed.
(nnrss-request-group): Use `nnheader-message' instead.
mml-smime-get-dns-ldap.
(mml-smime-encrypt-query): Use new function. Default to ldap.
-2005-02-14 Arne J\e,Ax\e(Brgensen <arne@arnested.dk>
+2005-02-14 Arne J\e,Ax\e(Brgensen <arne@arnested.dk>
* smime.el: Require smime-ldap.
(smime-ldap-host-list): New variable.
(mm-display-inline-fontify): Rewrite for decoding and decompressing
parts.
-2004-10-15 TSUCHIYA Masatoshi <tsuchiya@namazu.org>
+2005-02-07 TSUCHIYA Masatoshi <tsuchiya@namazu.org>
* mm-view.el (mm-display-inline-fontify): Decode a part according
to the charset parameter.
* nntp.el (nntp-marks-changed-p): Use time-less-p to compare the
timestamps.
-2005-01-29 Jari Aalto <jari.aalto@cante.net>
+2005-02-02 Jari Aalto <jari.aalto@cante.net>
* gnus-sum.el (gnus-list-of-unread-articles): Improve active
groups error checking and notify user.
-2004-09-04 Jari Aalto <jari.aalto@poboxes.com>
+2005-02-02 Jari Aalto <jari.aalto@poboxes.com>
* message.el (message-send-mail-function): Check existence of
sendmail-program first before using default value
XEmacs.
Remove `password-run-at-time' macro.
(password-cache-add): Use `run-at-time' instead of
- `password-run-at-time'.
+ `password-run-at-time'.
* nnheaderxm.el: Require timer-funcs instead of run-at-time.
Remove `nnheader-cancel-function-timers' alias,
- `cancel-function-timers' exists in XEmacs in timer-funcs.
+ `cancel-function-timers' exists in XEmacs in timer-funcs.
* mail-source.el: Require timer-funcs instead of itimer in XEmacs
- for `run-with-idle-timer'.
+ for `run-with-idle-timer'.
* gnus-demon.el: Require timer-funcs instead of itimer in XEmacs
for `run-at-time'.
* mm-url.el: Require timer-funcs at compile time when in XEmacs
- for `with-timeout'.
+ for `with-timeout'.
* dgnushack.el: Autoload the correct `setenv' for SXEmacs which is
the same as for XEmacs 21.4.
* mml.el (mml-generate-mime-1): Convert string into unibyte when
inserting " *mml*" buffer's contents into a unibyte temp buffer.
-2005-01-24 Harald Meland <harald.meland@usit.uio.no> (tiny change)
+2005-01-24 Harald Meland <harald.meland@usit.uio.no> (tiny change)
* mail-source.el (mail-source-fetch-imap): Search for ^From case
sensitively.
-2005-01-21 Derek Atkins <warlord@MIT.EDU> (tiny change)
+2005-01-21 Derek Atkins <warlord@MIT.EDU> (tiny change)
* pgg-pgp.el (pgg-pgp-decrypt-region): Use passphrase cache.
* dns.el (query-dns): Use sit-for to time instead of
accept-process-output, since that doesn't seem to work on udp
- sockets.
+ sockets.
2004-11-17 Katsumi Yamaoka <yamaoka@jpl.org>
* deuglify.el (gnus-outlook-deuglify): Add :version.
- * html2text.el: Beautify code. Improve doc strings. Some checkdoc
- cleanup.
+ * html2text.el: Beautify code. Improve doc strings. Some
+ checkdoc cleanup.
(html2text-get-attr, html2text-fix-paragraph): Simplify code.
- (html2text-format-tag-list): Add "strong" and "em".
- From "Alfred M. Szmidt" <ams@kemisten.nu> (tiny change).
+
+2004-11-01 Alfred M. Szmidt <ams@kemisten.nu> (tiny change)
+
+ * html2text.el (html2text-format-tag-list): Add "strong" and "em".
2004-10-29 Teodor Zlatanov <tzz@lifelogs.com>
2004-10-17 Richard M. Stallman <rms@gnu.org>
- * gnus-registry.el (gnus-registry-unload-hook):
+ * gnus-registry.el (gnus-registry-unload-hook):
Set as a variable with add-hook.
* nnspool.el (nnspool-spool-directory): Use news-directory instead
* gnus-agent.el (gnus-agent-synchronize-group-flags): When
necessary, pass full group name to gnus-request-set-marks.
-
+
2004-10-01 Simon Josefsson <jas@extundo.com>
* mailcap.el (mailcap-mime-data): Add pdf. Remove non-free
* spam-report.el (spam-report-gmane): Fix interactive.
- * gnus-art.el (gnus-treat-body-boundary): Only do stuff under X.
+ * gnus-art.el (gnus-treat-body-boundary): Only do stuff under X.
* gnus-agent.el (gnus-agent-synchronize-flags-server): Be silent
when writing file.
(gnus-agent-synchronize-flags): Don't default to being
- interactive.
+ interactive.
2004-09-30 Simon Josefsson <jas@extundo.com>
info read flags with the marks being sync'd to the backend.
*gnus-util.el (gnus-pp): Added optional stream to match pp API.
-
+
2004-09-28 Teodor Zlatanov <tzz@lifelogs.com>
* spam.el (spam-verify-bogofilter): new function
* gnus-dup.el (gnus-dup-open): Use mapc.
(gnus-dup-enter-articles, gnus-dup-suppress-articles): Use dolist.
-
+
(gnus-dup-enter-articles): Remove excess ID's from gnus-dup-hashtb.
Reported by Stefan Wiens <s.wi@gmx.net>.
* gnus-agent.el (gnus-agent-check-overview-buffer): Fixed range of
deletion to remove entire duplicate line. Fixes merged article
number bug.
-
+
2004-09-25 Kevin Greiner <kgreiner@compsol.cc>
* gnus-agent.el (gnus-agent-possibly-synchronize-flags): Ignore
gnus-agent-synchronize-group-flags, not backend's request-set-mark
method, to ensure that synchronization updates marks in the
backend and in the info (in memory) structure.
-
+
2004-09-24 Katsumi Yamaoka <yamaoka@jpl.org>
* gnus-uu.el (gnus-uu-digest-mail-forward): Obey the process/prefix
* nnimap.el (nnimap-authinfo-file, nnimap-prune-cache):
Add :group 'nnimap.
-2004-08-30 Simon Josefsson <jas@extundo.com>
+2004-08-30 Andreas Schwab <schwab@suse.de>
* rfc2231.el (rfc2231-parse-string): Restore whitespace syntax for
- ?* and ?\; (tiny patch). From Andreas Schwab <schwab@suse.de>.
-
-2004-08-30 Simon Josefsson <jas@extundo.com>
+ ?* and ?\;.
* ietf-drums.el (ietf-drums-syntax-table): Set syntax of ?* ?\;
- and ?\' to symbol instead of whitespace (tiny patch). From
- Andreas Schwab <schwab@suse.de>.
+ and ?\' to symbol instead of whitespace.
2004-08-30 Katsumi Yamaoka <yamaoka@jpl.org>
* gnus-sum.el (gnus-summary-make-menu-bar): Avoid the
"Unrecognized menu descriptor" error in XEmacs.
+2004-08-26 Stefan Wiens <s.wi@gmx.net> (tiny change)
+
+ * gnus-sum.el (gnus-read-header): Don't remove a header for the
+ parent article of a sparse article in the thread hashtb.
+
+2004-08-26 David Hedbor <dhedbor@real.com> (tiny change)
+
+ * nnmail.el (nnmail-split-lowercase-expanded): New user option.
+ (nnmail-expand-newtext): Lowercase expanded entries if
+ nnmail-split-lowercase-expanded is non-nil.
+
2004-08-26 Katsumi Yamaoka <yamaoka@jpl.org>
* nndoc.el (nndoc-type-alist): Fix regexp in the rfc822-forward
* flow-fill.el (fill-flowed): Remove space stuffing, and only do
quotes that actually start with ">" at the beginning of the
- lines.
+ lines.
2004-07-23 Katsumi Yamaoka <yamaoka@jpl.org>
* rfc2047.el (rfc2047-encode-region): Fix last change.
2004-07-12 Katsumi Yamaoka <yamaoka@jpl.org>
- From David Hedbor <dhedbor@real.com>.
-
- * nnmail.el (nnmail-split-lowercase-expanded): New user option.
- (nnmail-expand-newtext): Lowercase expanded entries if
- nnmail-split-lowercase-expanded is non-nil.
-
-2004-07-12 Katsumi Yamaoka <yamaoka@jpl.org>
* rfc2047.el (rfc2047-encode-region): Treat backslash-quoted
characters as non-special.
2004-07-03 Lars Magne Ingebrigtsen <larsi@gnus.org>
* nnheader.el (nnheader-uniquify-message-id): New experimental
- variable.
+ variable.
(nnheader-nov-read-message-id): Use it.
* spam-report.el (spam-report-gmane): Add interactive.
* mm-encode.el (mm-content-transfer-encoding-defaults): Use
qp-or-base64 for the application/* types.
-2004-07-02 Jesper Harder <harder@ifa.au.dk>
+2004-07-02 Joakim Verona <joakim@verona.se> (tiny change)
- * nnrss.el (nnrss-read-group-data): Fix off-by-one error. From
- Joakim Verona <joakim@verona.se>.
+ * nnrss.el (nnrss-read-group-data): Fix off-by-one error.
2004-06-30 Teodor Zlatanov <tzz@lifelogs.com>
* gnus-group.el (gnus-group-get-new-news-this-group): Don't
update info that isn't there.
+2004-06-29 Ilya N. Golubev <gin@mo.msk.ru>.
+
+ * mm-util.el (mm-mime-mule-charset-alist): Add the windows-1251
+ entry.
+
2004-06-29 Katsumi Yamaoka <yamaoka@jpl.org>
* mm-view.el (mm-inline-render-with-function): Use multibyte
* mm-encode.el (mm-content-transfer-encoding-defaults): Doc fix.
- * mm-util.el (mm-mime-mule-charset-alist): Add the windows-1251
- entry. From Ilya N. Golubev <gin@mo.msk.ru>.
- (mm-enrich-utf-8-by-mule-ucs): New function run when Mule-UCS is
- loaded under XEmacs.
- (): Don't make duplicated entries in mm-mime-mule-charset-alist.
+ * mm-util.el (mm-enrich-utf-8-by-mule-ucs): New function run when
+ Mule-UCS is loaded under XEmacs.
+ (mm-mime-mule-charset-alist): Avoid duplicated entries.
2004-06-28 Jesper Harder <harder@ifa.au.dk>
2004-06-12 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * message.el (message-ignored-supersedes-headers): Add Approved.
+ * message.el (message-ignored-supersedes-headers): Add Approved.
2004-06-11 Katsumi Yamaoka <yamaoka@jpl.org>
* rfc2047.el (rfc2047-encode-message-header): Disabled header
folding -- not all headers can be folded, and this should be done
- by the message composition mode. Probably. I think.
+ by the message composition mode. Probably. I think.
2004-06-10 Katsumi Yamaoka <yamaoka@jpl.org>
2004-06-06 Lars Magne Ingebrigtsen <larsi@gnus.org>
* message.el (message-cite-articles-with-x-no-archive): New
- variable.
+ variable.
(message-cite-original): Use it.
2004-06-04 Lars Magne Ingebrigtsen <larsi@gnus.org>
- * message.el (message-cite-original): Respect X-No-Archive.
+ * message.el (message-cite-original): Respect X-No-Archive.
2004-06-04 Katsumi Yamaoka <yamaoka@jpl.org>
* spam.el (spam-group-spam-contents-p): handle empty groupname
strings
(spam-report-articles-resend)
- (spam-report-resend-register-routine): allow spam-report-resend-to
- to be a group parameter or a global value
- (tiny change). From Daniel Pittman <daniel@rimspace.net>.
(spam-register-routine): do registration iff any articles warrant
it.
(spam-summary-prepare-exit): changed log message for nil group
- destinations
+ destinations
+
+2004-05-27 Daniel Pittman <daniel@rimspace.net>
+
+ * spam.el (spam-report-resend-register-routine): allow
+ spam-report-resend-to to be a group parameter or a global value
2004-05-26 Simon Josefsson <jas@extundo.com>
2004-05-26 Teodor Zlatanov <tzz@lifelogs.com>
- * spam.el (spam-mark-junk-as-spam-routine)
- (spam-mark-new-messages-in-spam-group-as-spam): allow user to
- disable assigning the spam-mark to new messages
- (spam-ham-copy-or-move-routine): todo decleared twice (tiny
- change). From Adam Sj\e,Ax\e(Bgren <asjo@koldfront.dk>.
+ * spam.el (spam-mark-new-messages-in-spam-group-as-spam): New
+ variable.
+ (spam-mark-junk-as-spam-routine): Use it. Allow to disable
+ assigning the spam-mark to new messages.
+
+2004-05-26 Adam Sj\e,Ax\e(Bgren <asjo@koldfront.dk> (tiny change)
+
+ (spam-ham-copy-or-move-routine): Don't declare `todo' twice.
2004-05-26 Katsumi Yamaoka <yamaoka@jpl.org>
(rfc2047-decode): Treat the ascii coding-system as raw-text by
default.
-2004-05-25 Teodor Zlatanov <tzz@lifelogs.com>
+2004-05-25 Anand Mitra <mitramc@yahoo.com> (tiny change)
* gnus-sum.el (gnus-summary-delete-article): invoke hook with
- correct data (tiny change). From Anand Mitra <mitramc@yahoo.com>.
+ correct data.
2004-05-24 Teodor Zlatanov <tzz@lifelogs.com>
* nnimap.el (nnimap-open-connection): Use netrc.
* gnus-util.el (gnus-netrc-get): Remove aliases.
-
+
* gnus-sum.el (gnus-auto-center-summary): Change default to 2.
* assistant.el (wid-edit): Fix compilation.
- * gnus-util.el (gnus-set-file-modes): Just ignore errors.
+ * gnus-util.el (gnus-set-file-modes): Just ignore errors.
2004-05-23 Paul Stodghill <stodghil@cs.cornell.edu>
* gnus-util.el (gnus-set-file-modes): New function. (small
- patch).
+ patch).
2004-05-23 Lars Magne Ingebrigtsen <larsi@gnus.org>
* gnus-topic.el (gnus-topic-jump-to-topic): Goto missing topic.
* assistant.el (assistant-render-node): Fix up rendering and
- read-only text.
+ read-only text.
(assistant-render-node): Reset.
(assistant-make-read-only): Not sticky.
2004-05-19 Lars Magne Ingebrigtsen <larsi@gnus.org>
* gnus-msg.el (gnus-inews-make-draft-meta-information): Fix quote
- stuff.
+ stuff.
* gnus-start.el (gnus-subscribe-hierarchical-interactive): Match
on real group name.
* pgg-pgp.el (pgg-pgp-verify-region): Clean up.
-2004-05-19 Michael Schierl <schierlm-usenet@gmx.de>
+2004-05-19 Michael Schierl <schierlm-usenet@gmx.de> (tiny change)
* pgg-pgp.el (pgg-pgp-verify-region): Default when signature
isn't a string.
* gnus-draft.el (gnus-draft-send): Bind
rfc2047-encode-encoded-words.
- * rfc2047.el (rfc2047-encode-region): Encode =? strings.
+ * rfc2047.el (rfc2047-encode-region): Encode =? strings.
(rfc2047-encodable-p): Say that =? needs encoding.
(rfc2047-encode-encoded-words): New variable.
* gnus-group.el (gnus-group-select-group): Doc fix.
- * gnus-draft.el (gnus-draft-setup): Mark all replied as replied.
+ * gnus-draft.el (gnus-draft-setup): Mark all replied as replied.
* gnus-group.el (gnus-group-mode): Set show-trailing-whitespace
to nil.
-
+
* gnus-cache.el (gnus-cache-possibly-enter-article): Use it.
* nnheader.el (nnheader-get-lines-and-char): New function.
* gnus-msg.el (gnus-inews-do-gcc): Don't use read-only-p to see
whether backend can accept message.
- * message.el (message-idna-to-ascii-rhs-1): Don't use equalp.
+ * message.el (message-idna-to-ascii-rhs-1): Don't use equalp.
2004-05-18 Kai Grossjohann <kgrossjo@eu.uu.net>
* mail-source.el (mail-source-delete-crash-box): Refactor.
(mail-source-fetch): Use it.
(mail-source-fetch-file): Ditto.
- (mail-source-fetch-directory): Run postscript in loop.
+ (mail-source-fetch-directory): Run postscript in loop.
(mail-source-fetch-pop): Delete.
(mail-source-fetch-maildir): Ditto.
(mail-source-fetch-imap): Ditto.
(message-delete-address): Use it.
(message-fill-header-general): Refactor.
(message-fill-field-address): Rename.
- (message-narrow-to-field): Find the start of the header.
+ (message-narrow-to-field): Find the start of the header.
(message-header-format-alist): Don't pre-fill.
(message-fill-header): Removed.
(message-insert-header): New function.
* imap.el: Add compiler directives.
- * gnus-score.el (gnus-score-edit-done): run-hook->run-hooks.
+ * gnus-score.el (gnus-score-edit-done): run-hook->run-hooks.
* gnus-art.el (article-decode-idna-rhs): Don't use
- message-idna-inside-rhs-p.
+ message-idna-inside-rhs-p.
2004-05-16 Lars Magne Ingebrigtsen <larsi@gnus.org>
2004-05-16 Kim Minh Kaplan <kmkaplan-AwwS6Bc0PDVoiYX5Tdu9fQ@public.gmane.org>
- * imap.el (imap-sasl-make-mechanisms): Use sasl.
+ * imap.el (imap-sasl-make-mechanisms): Use sasl.
2004-05-16 Lars Magne Ingebrigtsen <larsi@gnus.org>
* nneething.el (nneething-file-name): Don't create spurions
- files.
+ files.
- * gnus-msg.el (gnus-inews-do-gcc): Ignore read-only groups.
+ * gnus-msg.el (gnus-inews-do-gcc): Ignore read-only groups.
(gnus-inews-do-gcc): Remove sleep.
* gnus-art.el (gnus-mime-delete-part): Error message when no MIME
part under point.
- * gnus-agent.el (gnus-agent-synchronize-flags): Default to nil.
- (gnus-agent-regenerate-group): Using nil messages aren't valid.
+ * gnus-agent.el (gnus-agent-synchronize-flags): Default to nil.
+ (gnus-agent-regenerate-group): Using nil messages aren't valid.
2004-05-15 Teodor Zlatanov <tzz@lifelogs.com>
2004-05-14 Teodor Zlatanov <tzz@lifelogs.com>
- * gnus-dup.el (gnus-dup-unsuppress-article): don't assume the mail
- header is not nil (tiny change). From Nelson Ferreira
- <nelson.ferreira@verizon.net>.
-
* spam.el (spam-summary-prepare-exit): only produce "marking spam
as expired without moving it" message when there are spam
messages left
+2004-05-14 Nelson Ferreira <nelson.ferreira@verizon.net> (tiny change)
+
+ * gnus-dup.el (gnus-dup-unsuppress-article): don't assume the mail
+ header is not nil.
+
2004-05-14 Kai Grossjohann <kgrossjo@eu.uu.net>
* nntp.el (nntp-request-set-mark, nntp-request-update-info): Call
From Dan Christensen <jdc@uwo.ca>, asjo@koldfront.dk (Adam
Sj\e,Ax\e(Bgren), Wes Hardaker <wes@hardakers.net>, and Michael Shields
<shields@msrl.com>:
-
+
* spam.el (spam-necessary-extra-headers): get the extra headers we
may need for spam sorting and scoring
(spam-user-format-function-S): a user format function suitable for
hasn't worked for a while.
2004-04-15 Kevin Greiner <kgreiner@xpediantsolutions.com>
-
+
* gnus-agent.el (gnus-agentize):
gnus-agent-send-mail-real-function no longer set to current value
of message-send-mail-function but rather a lambda that calls
responsive to user changes to message-send-mail-function.
2004-04-15 Kevin Greiner <kgreiner@xpediantsolutions.com>
-
+
* legacy-gnus-agent.el
(gnus-agent-convert-to-compressed-agentview): Fixed typos with
help from Florian Weimer <fw@deneb.enyo.de>
(gnus-agent-need-update-total-fetched-for): New variable.
(gnus-agent-update-files-total-fetched-for): New function.
(gnus-agent-update-view-total-fetched-for): New function.
- (gnus-agent-total-fetched-for): New function.
+ (gnus-agent-total-fetched-for): New function.
* gnus-cache.el (gnus-cache-save-buffers): Use
gnus-cache-update-overview-total-fetched-for to change disk space
(gnus-cache-delete-group-total-fetched-for): New function.
(gnus-cache-total-fetched-for): New function.
- * gnus-group.el (): Require gnus-sum and autoload functions to
+ * gnus-group.el: Require gnus-sum and autoload functions to
resolve warnings when gnus-group.el compiled alone.
(gnus-group-line-format): Documented new %F
(size of Fetched data) group line format; identifies disk space
* gnus-util.el (gnus-rename-file): New function.
+2004-04-07 Christian Neukirchen <chneukirchen@yahoo.de> (tiny change)
+
+ * mm-util.el (mm-image-load-path): Handle nil in load-path.
+
2004-04-07 Jesper Harder <harder@ifa.au.dk>
* rfc2047.el (rfc2047-encoded-word-regexp): Remove unnecessary
'+'. Reported by Stefan Wiens <s.wi@gmx.net>.
- * mm-util.el (mm-image-load-path): Handle nil in load-path.
- From Christian Neukirchen <chneukirchen@yahoo.de>.
-
2004-04-06 Jesper Harder <harder@ifa.au.dk>
* gnus-cache.el (gnus-cache-save-buffers): Check if buffer is
* gnus-agent.el (gnus-agent-read-agentview): Add a missing arg to
error.
- * gnus-sum.el (gnus-read-header): Don't remove a header for the
- parent article of a sparse article in the thread hashtb. From
- Stefan Wiens <s.wi@gmx.net>.
-
2004-03-12 Reiner Steib <Reiner.Steib@gmx.de>
* imap.el (imap-store-password): New variable.
* gnus-art.el (gnus-article-read-summary-keys): Restore new
window-start and hscroll to summary window.
-2004-03-12 Kevin Greiner <kgreiner@xpediantsolutions.com>
+2004-03-12 Kevin Greiner <kgreiner@xpediantsolutions.com>
* gnus-start.el (gnus-convert-old-newsrc): Only write the
conversion message to newsrc-dribble when an actual conversion is
performed.
-2004-03-10 Malcolm Purvis <malcolmpurvis@optushome.com.au> (tiny change)
+2004-03-10 Malcolm Purvis <malcolmpurvis@optushome.com.au> (tiny change)
* spam-stat.el (spam-stat-coding-system): Use mm-coding-system-p.
* gnus-art.el (gnus-mime-save-part-and-strip): Use it.
(gnus-mime-delete-part): Use it.
-2004-03-09 Kevin Greiner <kgreiner@xpediantsolutions.com>
+2004-03-09 Kevin Greiner <kgreiner@xpediantsolutions.com>
* gnus-agent.el (gnus-agent-read-local): Bind
nnheader-file-coding-system to gnus-agent-file-coding-system to
signaling an error; don't use mm-multiple-handles.
(gnus-mime-delete-part): Ditto.
-2004-03-08 Kevin Greiner <kgreiner@xpediantsolutions.com>
+2004-03-08 Kevin Greiner <kgreiner@xpediantsolutions.com>
* gnus-agent.el (gnus-agent-read-agentview): Removed support for
old file versions.
* legacy-gnus-agent.el (): New. Provides converters that are only
loaded when gnus-convert-old-newsrc needs to call them.
-
+
2004-03-08 Katsumi Yamaoka <yamaoka@jpl.org>
* mail-source.el (mail-source-touch-pop): Doc fix.
2004-03-05 Per Abrahamsen <abraham@dina.kvl.dk>
- * gnus-sum.el (gnus-widget-reversible-match)
- (gnus-widget-reversible-to-internal)
+ * gnus-sum.el (gnus-widget-reversible-match)
+ (gnus-widget-reversible-to-internal)
(gnus-widget-reversible-to-external): New functions.
(gnus-widget-reversible): New widget.
(gnus-article-sort-functions, gnus-thread-sort-functions): Use it.
* gnus.el (spam-autodetect-methods): add spam-use-gmane-xref as
an autodetect method
-2004-03-04 Kevin Greiner <kgreiner@xpediantsolutions.com>
+2004-03-04 Kevin Greiner <kgreiner@xpediantsolutions.com>
* gnus-int.el (gnus-request-accept-article): Inform the agent that
articles are being added to a group.
(gnus-request-replace-article): Inform the agent that articles
need to be uncached as the cached contents are no longer valid.
-
+
2004-03-04 Katsumi Yamaoka <yamaoka@jpl.org>
* binhex.el: Don't autoload executable-find.
* uudecode.el: Don't autoload executable-find.
-2004-03-04 Kevin Greiner <kgreiner@xpediantsolutions.com>
+2004-03-04 Kevin Greiner <kgreiner@xpediantsolutions.com>
* gnus-agent.el (gnus-agent-file-header-cache): Removed.
(gnus-agent-possibly-alter-active): Avoid null in numeric
* gnus-cus.el (gnus-agent-customize-category): Mismatched paren.
-2004-03-02 Kevin Greiner <kgreiner@xpediantsolutions.com>
+2004-03-02 Kevin Greiner <kgreiner@xpediantsolutions.com>
* gnus-cus.el (gnus-agent-customize-category): Removed
ignore-errors macro reference that required cl to be loaded at
* flow-fill.el: Typo.
-2004-02-26 Andrew Cohen <cohen@andy.bu.edu>
+2004-02-26 Andrew Cohen <cohen@andy.bu.edu>
* spam-wash.el: New file.
-2004-02-26 Mark A. Hershberger <mah@everybody.org>
+2004-02-26 Mark A. Hershberger <mah@everybody.org>
* nnrss.el (nnrss-opml-import, nnrss-opml-export): New functions.
* nnlistserv.el (nnlistserv-kk-wash-article): do.
- * nnml.el (nnml-request-set-mark, nnml-save-marks): do.
+ * nnml.el (nnml-request-set-mark, nnml-save-marks): do.
* mm-bodies.el (mm-7bit-chars): Don't include \r.
* rfc2047.el (rfc2047-pad-base64): Deal with more cases of invalid
padding.
-2004-01-27 Simon Josefsson <jas@extundo.com>
+2004-01-27 Ralf Angeli <angeli@iwi.uni-sb.de>
- * mm-view.el (mm-fill-flowed): Add.
- (mm-inline-text): Use it. Tiny patch from Ralf Angeli
- <angeli@iwi.uni-sb.de>.
+ * mm-view.el (mm-fill-flowed): New variable.
+ (mm-inline-text): Use it.
2004-01-27 Teodor Zlatanov <tzz@lifelogs.com>
2004-01-27 Steve Youngs <sryoungs@bigpond.net.au>
* gnus-spec.el (gnus-parse-simple-format): Fix setq value
- omission.
+ omission.
From Jerry James <james@xemacs.org>
2004-01-26 Katsumi Yamaoka <yamaoka@jpl.org>
* spam-stat.el (spam-stat-process-directory-age): New option.
(spam-stat-process-directory): Use it.
-2004-01-24 Hiroshi Fujishima <pooh@nature.tsukuba.ac.jp> (tiny change)
+2004-01-24 Hiroshi Fujishima <pooh@nature.tsukuba.ac.jp> (tiny change)
* spam-stat.el (spam-stat-reduce-size): Set spam-stat-dirty.
(spam-stat-save): Accept prefix argument.
* gnus-gl.el: Remove.
-2004-01-23 Kevin Greiner <kgreiner@xpediantsolutions.com>
+2004-01-23 Kevin Greiner <kgreiner@xpediantsolutions.com>
* gnus-sum.el (gnus-adjust-marks): Now correctly handles a list of
marks consisting of a single range {for example, (3 . 5)} rather
* mm-util.el (mm-charset-synonym-alist): Add ks_c_5601-1987.
Remove obsolete entries for big5 and gb2312.
-2004-01-22 Kevin Greiner <kgreiner@xpediantsolutions.com>
+2004-01-22 Kevin Greiner <kgreiner@xpediantsolutions.com>
* gnus-sum.el (gnus-adjust-marks): Avoid splicing null INTO the
uncompressed list.
* gnus-util.el (gnus-fetch-field): Don't bind case-fold-search
here -- it's done in message-fetch-field.
-2004-01-21 Kevin Greiner <kgreiner@xpediantsolutions.com>
+2004-01-21 Kevin Greiner <kgreiner@xpediantsolutions.com>
* gnus-agent.el (gnus-agent-queue-mail,
gnus-agent-prompt-send-queue): New variables.
* gnus-sum.el (gnus-select-newgroup): Replaced inline code with
gnus-agent-possibly-alter-active.
(gnus-adjust-marked-articles): Faster handling of simple lists
-
+
2004-01-21 Jesper Harder <harder@ifa.au.dk>
* spam-stat.el (spam-stat-test-directory): New optional argument
(spam-stat-buffer-words-with-scores): Don't narrow and change
syntax table here. Reported by Andrew Cohen <cohen@andy.bu.edu>.
-2004-01-20 Teodor Zlatanov <tzz@lifelogs.com>
+2004-01-20 Teodor Zlatanov <tzz@lifelogs.com>
* spam.el (gnus-summary-mode-map): make spam-generic-score the
default scoring function
* rfc2047.el (rfc2047-parse-and-decode, rfc2047-decode): Use a
character for the encoding to avoid consing a string.
-
+
* rfc2047.el (rfc2047-decode-string): Don't cons a string
unnecessarily.
* gnus.sum.el (gnus-remove-odd-characters): Don't cons two new
strings.
- * mm-util.el (mm-subst-char-in-string): Support inplace.
+ * mm-util.el (mm-subst-char-in-string): Support inplace.
* gnus-sum.el (gnus-summary-remove-list-identifiers): Don't cons
a new string in every iteration. Use shy groups.
* gnus-topic.el (gnus-topic-find-groups, gnus-topic-clean-alist)
(gnus-group-prepare-topics, gnus-topic-check-topology): do.
-
+
* gnus-sum.el (gnus-update-read-articles, gnus-select-newsgroup)
(gnus-mark-xrefs-as-read, gnus-compute-read-articles)
(gnus-summary-walk-group-buffer, gnus-summary-move-article)
(gnus-group-make-articles-read): do.
-
+
2004-01-09 Jesper Harder <harder@ifa.au.dk>
* gnus-art.el (article-decode-mime-words, article-babel)
(gnus-article-highlight-signature, gnus-article-add-buttons)
(gnus-signature-toggle): Use gnus-with-article-buffer.
-
+
* gnus-art.el (gnus-article-highlight-headers)
(gnus-article-add-buttons-to-head): Use gnus-with-article-headers.
-
+
* gnus-art.el (gnus-mm-display-part, gnus-article-wash-status)
(gnus-article-set-globals, gnus-request-article-this-buffer)
(gnus-button-message-id, gnus-article-maybe-hide-headers)
* nnheaderxm.el: Remove definition of run-at-time.
-2004-01-05 Karl Pfl\e,Ad\e(Bsterer <sigurd@12move.de>
+2004-01-05 Karl Pfl\e,Ad\e(Bsterer <sigurd@12move.de> (tiny change)
* mml.el (mml-minibuffer-read-disposition): Show attachment type
- in prompt (tiny change)
+ in prompt.
2004-01-06 Steve Youngs <sryoungs@bigpond.net.au>
(gnus-xmas-define): Don't alias `gnus-set-text-properties' to
`gnus-xmas-set-text-properties'.
(gnus-xmas-redefine): Don't alias `gnus-completing-read' to
- `gnus-xmas-completing-read'.
+ `gnus-xmas-completing-read'.
(gnus-xmas-completing-read): Removed.
(gnus-xmas-open-network-stream): Removed.
* gnus-group.el (gnus-no-groups-message): Update.
- * gnus-sum.el (gnus-summary-insert-new-articles): Remove .
+ * gnus-sum.el (gnus-summary-insert-new-articles): Remove .
2003-11-09 Simon Josefsson <jas@extundo.com>
See ChangeLog.2 for earlier changes.
- Copyright (C) 2000, 2001, 2002, 2004 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
Copying and distribution of this file, with or without modification,
are permitted provided the copyright notice and this notice are preserved.
instead of mm-auto-save-coding-system for the draft or delayed
group.
-2002-10-28 Josh <huber@alum.wpi.edu>
+2002-10-28 Josh Huber <huber@alum.wpi.edu>
* mml.el (mml-mode-map): Fixed keybindings for mml-secure-*
functions.
* spam.el: more compilation fixes for BBDB
- * spam-stat.el added code from Alex Schroeder <alex@gnu.org>
+ * spam-stat.el: added code from Alex Schroeder <alex@gnu.org>
(spam-stat-reduce-size): Interactive.
(spam-stat-reset): New function.
(spam-stat-save): Interactive.
2001-12-05 Katsumi Yamaoka <yamaoka@jpl.org>
- * mm-view.wl (mm-inline-text): Decode a charset-encoded rich text.
+ * mm-view.el (mm-inline-text): Decode a charset-encoded rich text.
2001-12-04 08:00:00 ShengHuo ZHU <zsh@cs.rochester.edu>
clever some l: gnus-load.el
$(EMACS_COMP) -f dgnushack-compile
-install: install-el install-elc
+install: install-el-elc list-installed-shadows
+# This entry will never install .el files if there are no .elc files.
install-el: gnus-load.el
$(SHELL) $(top_srcdir)/mkinstalldirs $(lispdir)
echo " $(INSTALL_DATA) gnus-load.el $(lispdir)/gnus-load.el"
$(INSTALL_DATA) $$p $(lispdir)/$$p; \
done
+install-el-elc: clever
+ rm -f dgnushack.elc
+ $(SHELL) $(top_srcdir)/mkinstalldirs $(lispdir)
+ echo " $(INSTALL_DATA) gnus-load.el $(lispdir)/gnus-load.el"
+ $(INSTALL_DATA) gnus-load.el $(lispdir)/gnus-load.el
+ for p in *.elc; do \
+ q=`basename $$p c`; \
+ if [ -f "$(srcdir)/$$q" ]; then \
+ echo " $(INSTALL_DATA) $$q $(lispdir)/$$q"; \
+ $(INSTALL_DATA) $(srcdir)/$$q $(lispdir)/$$q; \
+ fi; \
+ echo " $(INSTALL_DATA) $$p $(lispdir)/$$p"; \
+ $(INSTALL_DATA) $$p $(lispdir)/$$p; \
+ done
+
+list-installed-shadows:
+ $(EMACS_COMP) -f dgnushack-find-lisp-shadows
+
+remove-installed-shadows:
+ $(EMACS_COMP) -f dgnushack-remove-lisp-shadows
+
uninstall:
for p in *.elc; do \
rm -f "$(lispdir)/$$p"; \
$(EMACS_COMP) -f dgnushack-make-auto-load $(srcdir)
$(EMACS_COMP) -f dgnushack-make-load
-distclean:
- rm -f *.orig *.rej *.elc auto-autoloads.* custom-load.* *~ Makefile
+clean:
+ rm -f *.elc *.orig *.rej *~ auto-autoloads.* custom-load.* gnus-load.el
+
+distclean: clean
+ rm -f Makefile
Makefile: $(srcdir)/Makefile.in ../config.status
cd .. \
;;; assistant.el --- guiding users through Emacs setup
-;; Copyright (C) 2004 Free Software Foundation, Inc.
+;; Copyright (C) 2004, 2005 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: util
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(require 'widget)
(require 'wid-edit)
+(autoload 'gnus-error "gnus-util")
+(autoload 'netrc-get "netrc")
+(autoload 'netrc-machine "netrc")
+(autoload 'netrc-parse "netrc")
+
(defvar assistant-readers
'(("variable" assistant-variable-reader)
("validate" assistant-sexp-reader)
("next" assistant-list-reader)
("text" assistant-text-reader)))
-(defface assistant-field-face '((t (:bold t)))
+(defface assistant-field '((t (:bold t)))
"Face used for editable fields."
:group 'gnus-article-emphasis)
+;; backward-compatibility alias
+(put 'assistant-field-face 'face-alias 'assistant-field)
;;; Internal variables
(push
(widget-create
'editable-field
- :value-face 'assistant-field-face
+ :value-face 'assistant-field
:assistant-variable variable
(assistant-get-variable node variable))
assistant-widgets)
(add-text-properties start (point)
(list
'bold t
- 'face 'assistant-field-face
+ 'face 'assistant-field
'not-read-only t))))))))
(defun assistant-render-node (node-name)
;;; binhex.el --- elisp native binhex decode
-;; Copyright (c) 1998, 1999, 2000, 2001, 2002, 2004
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
;; Keywords: binhex news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; canlock.el --- functions for Cancel-Lock feature
-;; Copyright (C) 1998, 1999, 2001, 2002, 2003, 2004
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1998, 1999, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Katsumi Yamaoka <yamaoka@jpl.org>
;; Keywords: news, cancel-lock, hmac, sha1, rfc2104
;; You should have received a copy of the GNU General Public License
;; along with this program; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(defgroup canlock nil
"The Cancel-Lock feature."
- :group 'applications)
+ :group 'news)
(defcustom canlock-password nil
"Password to use when signing a Cancel-Lock or a Cancel-Key header."
;;; compface.el --- functions for converting X-Face headers
-;; Copyright (C) 2002 Free Software Foundation, Inc.
+
+;; Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; deuglify.el --- deuglify broken Outlook (Express) articles
-;; Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
+;; Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
;; Copyright (C) 2001, 2002 Raymond Scholz
;; Author: Raymond Scholz <rscholz@zonix.de>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(defgroup gnus-outlook-deuglify nil
"Deuglify articles generated by broken user agents like MS Outlook (Express)."
- :version "22.1")
+ :version "22.1"
+ :group 'gnus)
;;;###autoload
(defcustom gnus-outlook-deuglify-unwrap-min 45
;;; dgnushack.el --- a hack to set the load path for byte-compiling
-;; Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2003
+;; Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2003,
+;; 2004, 2005
;; Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; Code:
+(defvar dgnushack-default-load-path (copy-sequence load-path))
+
(defalias 'facep 'ignore)
(require 'cl)
(when (and (not (featurep 'xemacs))
(= emacs-major-version 21)
- (= emacs-minor-version 3)
+ (>= emacs-minor-version 3)
(condition-case code
(let ((byte-compile-error-on-warn t))
(byte-optimize-form (quote (pop x)) t)
(setq ad-return-value (cons fn (nreverse backwards))))
ad-do-it)))
+;; Work around for an incompatibility (XEmacs 21.4 vs. 21.5), see the
+;; following threads:
+;;
+;; http://thread.gmane.org/gmane.emacs.gnus.general/56414
+;; Subject: attachment problems found but not fixed
+;;
+;; http://thread.gmane.org/gmane.emacs.gnus.general/56459
+;; Subject: Splitting mail -- XEmacs 21.4 vs 21.5
+;;
+;; http://thread.gmane.org/gmane.emacs.xemacs.beta/20519
+;; Subject: XEmacs 21.5 and Gnus fancy splitting.
(when (and (featurep 'xemacs)
(let ((table (copy-syntax-table emacs-lisp-mode-syntax-table)))
(modify-syntax-entry ?= " " table)
(autoload 'browse-url "browse-url" nil t)
(autoload 'c-mode "cc-mode" nil t)
(autoload 'customize-apropos "cus-edit" nil t)
+ (autoload 'customize-group "cus-edit" nil t)
(autoload 'customize-save-variable "cus-edit" nil t)
(autoload 'customize-set-variable "cus-edit" nil t)
(autoload 'customize-variable "cus-edit" nil t)
(autoload 'executable-find "executable")
(autoload 'font-lock-fontify-buffer "font-lock" nil t)
(autoload 'info "info" nil t)
+ (autoload 'mail-extract-address-components "mail-extr")
(autoload 'mail-fetch-field "mail-utils")
(autoload 'make-annotation "annotations")
(autoload 'make-display-table "disp-table")
;;; End:
;;; gnus-load.el ends here"))))
+(defun dgnushack-find-lisp-shadows (&optional lispdir)
+ "Return a list of directories in which other Gnus installations exist.
+This function looks for the other Gnus installations which will shadow
+the new Gnus Lisp modules which have been installed in LISPDIR, using
+the default `load-path'. The return value will make sense only when
+LISPDIR is existent and is listed in the default `load-path'. Assume
+LISPDIR will be prepended to `load-path' by a user if the default
+`load-path' does not contain it."
+ (unless lispdir
+ (setq lispdir (getenv "lispdir")))
+ (when (and lispdir (file-directory-p lispdir))
+ (setq lispdir (file-truename (directory-file-name lispdir)))
+ (let ((indices '("gnus.elc" "gnus.el" "gnus.el.bz2" "gnus.el.gz"
+ "message.elc" "message.el" "message.el.bz2"
+ "message.el.gz"))
+ (path (delq nil (mapcar
+ (lambda (p)
+ (condition-case nil
+ (when (and p (file-directory-p p))
+ (file-truename (directory-file-name p)))
+ (error nil)))
+ dgnushack-default-load-path)))
+ rest elcs)
+ (while path
+ (setq rest (cons (car path) rest)
+ path (delete (car rest) (cdr path))))
+ (setq path (nreverse (cdr (member lispdir rest)))
+ rest nil)
+ (while path
+ (setq elcs indices)
+ (while elcs
+ (when (file-exists-p (expand-file-name (pop elcs) (car path)))
+ (setq rest (cons (car path) rest)
+ elcs nil)))
+ (setq path (cdr path)))
+ (prog1
+ (setq path (nreverse rest))
+ (when path
+ (let (print-level print-length)
+ (princ (concat "\n\
+WARNING: The other Gnus installation" (if (cdr path) "s have" " has") "\
+ been detected in:\n\n " (mapconcat 'identity path "\n ") "\n\n\
+You will need to modify the run-time `load-path', remove them manually,
+or remove them using `make remove-installed-shadows'.\n\n"))))))))
+
+(defun dgnushack-remove-lisp-shadows (&optional lispdir)
+ "Remove the other Gnus installations which shadow the recent one."
+ (let ((path (with-temp-buffer
+ (let ((standard-output (current-buffer)))
+ (dgnushack-find-lisp-shadows lispdir))))
+ elcs files shadows file)
+ (when path
+ (unless (setq elcs (directory-files srcdir nil "\\.elc\\'"))
+ (error "You should build .elc files first."))
+ (setq files
+ (apply
+ 'append
+ (mapcar
+ (lambda (el)
+ (list (concat el "c") el (concat el ".bz2") (concat el ".gz")))
+ (append
+ (list (file-name-nondirectory dgnushack-gnus-load-file)
+ (file-name-nondirectory dgnushack-cus-load-file))
+ (mapcar (lambda (elc) (substring elc 0 -1)) elcs)))))
+ (while path
+ (setq shadows files)
+ (while shadows
+ (setq file (expand-file-name (pop shadows) (car path)))
+ (when (file-exists-p file)
+ (princ (concat " Removing " file "..."))
+ (condition-case nil
+ (progn
+ (delete-file file)
+ (princ "done\n"))
+ (error (princ "failed\n")))))
+ (setq path (cdr path))))))
+
;;; dgnushack.el ends here
;;; arch-tag: 579f585a-24eb-4e1c-8d34-4808e11b68f2
;;; dig.el --- Domain Name System dig interface
-;; Copyright (c) 2000, 2001, 2003 Free Software Foundation, Inc.
+
+;; Copyright (C) 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Simon Josefsson <simon@josefsson.org>
;; Keywords: DNS BIND dig
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(eval-when-compile (require 'cl))
(defgroup dig nil
- "Dig configuration.")
+ "Dig configuration."
+ :group 'comm)
(defcustom dig-program "dig"
"Name of dig (domain information groper) binary."
(set (make-local-variable 'font-lock-defaults)
'(dig-font-lock-keywords t)))
(when (featurep 'font-lock)
- (font-lock-set-defaults)))
+ (font-lock-set-defaults))
+ (gnus-run-mode-hooks 'dig-mode-hook))
(defun dig-exit ()
"Quit dig output buffer."
;;; dns-mode.el --- a mode for viewing/editing Domain Name System master files
-;; Copyright (c) 2000, 2001, 2003, 2004 Free Software Foundation, Inc.
+;; Copyright (c) 2000, 2001, 2003, 2004, 2005 Free Software Foundation, Inc.
;; Author: Simon Josefsson <simon@josefsson.org>
;; Keywords: DNS master zone file SOA
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; Code:
(defgroup dns-mode nil
- "DNS master file mode configuration.")
+ "DNS master file mode configuration."
+ :group 'comm)
(defconst dns-mode-classes '("IN" "CS" "CH" "HS")
"List of strings with known DNS classes.")
;;; dns.el --- Domain Name Service lookups
-;; Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
+
+;; Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: network
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;; connection to the DNS server.
(open-network-stream "dns" (current-buffer) server "domain")))))
+(defvar dns-cache (make-vector 4096 0))
+
+(defun query-dns-cached (name &optional type fullp reversep)
+ (let* ((key (format "%s:%s:%s:%s" name type fullp reversep))
+ (sym (intern-soft key dns-cache)))
+ (if (and sym
+ (boundp sym))
+ (symbol-value sym)
+ (let ((result (query-dns name type fullp reversep)))
+ (set (intern key dns-cache) result)
+ result))))
+
(defun query-dns (name &optional type fullp reversep)
"Query a DNS server for NAME of TYPE.
If FULLP, return the entire record returned.
(decf times step))
(ignore-errors
(delete-process process))
- (when tcp-p
+ (when (and tcp-p
+ (>= (buffer-size) 2))
(goto-char (point-min))
(delete-region (point) (+ (point) 2)))
- (unless (zerop (buffer-size))
+ (when (>= (buffer-size) 2)
(let ((result (dns-read (buffer-string))))
(if fullp
result
;;; earcon.el --- Sound effects for messages
-;; Copyright (C) 1996, 2000, 2001, 2003 Free Software Foundation
+;; Copyright (C) 1996, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Steven L. Baur <steve@miranova.com>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;; This file provides access to sound effects in Gnus.
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(defgroup encrypt '((password-cache custom-variable)
(password-cache-expiry custom-variable))
- "File encryption configuration.")
+ "File encryption configuration."
+ :group 'applications)
(defcustom encrypt-file-alist nil
"List of file names or regexes matched with encryptions.
(if outdata
(progn
- (gnus-message 9 "%s was decrypted with %s (cipher %s)"
- file (symbol-name method) cipher)
+ (message "%s was decrypted with %s (cipher %s)"
+ file (symbol-name method) cipher)
(delete-region (point-min) (point-max))
(goto-char (point-min))
(insert outdata))
(if outdata
(progn
- (gnus-message 9 "%s was encrypted with %s (cipher %s)"
- file (symbol-name method) cipher)
+ (message "%s was encrypted with %s (cipher %s)"
+ file (symbol-name method) cipher)
(delete-region (point-min) (point-max))
(goto-char (point-min))
(insert outdata)
(progn
(setq new-list (reverse (split-string bs)))
(dolist (x new-list)
- (setq x (string-to-int x))
+ (setq x (string-to-number x))
(insert (format "%c" (logxor x passphrase-sum))))))
(buffer-substring-no-properties (point-min) (point-max)))))
;;; flow-fill.el --- interpret RFC2646 "flowed" text
-;; Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+;; Copyright (C) 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Simon Josefsson <jas@pdc.kth.se>
;; Keywords: mail
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(while (re-search-forward " $" nil t)
(when (save-excursion
(beginning-of-line)
- (looking-at "^\\(>+\\)\\( ?\\)"))
+ (looking-at "^\\(>*\\)\\( ?\\)"))
(let ((quote (match-string 1))
sig)
(if (string= quote "")
(condition-case nil
(let ((fill-prefix (when quote (concat quote " ")))
(fill-column (eval fill-flowed-display-column))
- filladapt-mode)
+ filladapt-mode
+ adaptive-fill-mode)
(fill-region (point-at-bol)
(min (1+ (point-at-eol))
(point-max))
(defvar show-trailing-whitespace))
(defvar fill-flowed-encode-tests
- '(
+ `(
;; The syntax of each list element is:
;; (INPUT . EXPECTED-OUTPUT)
- ("> Thou villainous ill-breeding spongy dizzy-eyed
-> reeky elf-skinned pigeon-egg!
->> Thou artless swag-bellied milk-livered
->> dismal-dreaming idle-headed scut!
->>> Thou errant folly-fallen spleeny reeling-ripe
->>> unmuzzled ratsbane!
->>>> Henceforth, the coding style is to be strictly
->>>> enforced, including the use of only upper case.
->>>>> I've noticed a lack of adherence to the coding
->>>>> styles, of late.
->>>>>> Any complaints?
-" . "> Thou villainous ill-breeding spongy dizzy-eyed reeky elf-skinned
-> pigeon-egg!
->> Thou artless swag-bellied milk-livered dismal-dreaming idle-headed
->> scut!
->>> Thou errant folly-fallen spleeny reeling-ripe unmuzzled ratsbane!
->>>> Henceforth, the coding style is to be strictly enforced,
->>>> including the use of only upper case.
->>>>> I've noticed a lack of adherence to the coding styles, of late.
->>>>>> Any complaints?
-")
-; ("
-;> foo
-;>
-;>
-;> bar
-;" . "
-;> foo bar
-;")
+ (,(concat
+ "> Thou villainous ill-breeding spongy dizzy-eyed \n"
+ "> reeky elf-skinned pigeon-egg! \n"
+ ">> Thou artless swag-bellied milk-livered \n"
+ ">> dismal-dreaming idle-headed scut!\n"
+ ">>> Thou errant folly-fallen spleeny reeling-ripe \n"
+ ">>> unmuzzled ratsbane!\n"
+ ">>>> Henceforth, the coding style is to be strictly \n"
+ ">>>> enforced, including the use of only upper case.\n"
+ ">>>>> I've noticed a lack of adherence to the coding \n"
+ ">>>>> styles, of late.\n"
+ ">>>>>> Any complaints?")
+ .
+ ,(concat
+ "> Thou villainous ill-breeding spongy dizzy-eyed reeky elf-skinned\n"
+ "> pigeon-egg! \n"
+ ">> Thou artless swag-bellied milk-livered dismal-dreaming idle-headed\n"
+ ">> scut!\n"
+ ">>> Thou errant folly-fallen spleeny reeling-ripe unmuzzled ratsbane!\n"
+ ">>>> Henceforth, the coding style is to be strictly enforced,\n"
+ ">>>> including the use of only upper case.\n"
+ ">>>>> I've noticed a lack of adherence to the coding styles, of late.\n"
+ ">>>>>> Any complaints?\n"
+ ))
+ ;; (,(concat
+ ;; "\n"
+ ;; "> foo\n"
+ ;; "> \n"
+ ;; "> \n"
+ ;; "> bar\n")
+ ;; .
+ ;; ,(concat
+ ;; "\n"
+ ;; "> foo bar\n"))
))
(defun fill-flowed-test ()
;;; format-spec.el --- functions for formatting arbitrary formatting strings
-;; Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+
+;; Copyright (C) 1999, 2000, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: tools
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
"Return a string based on FORMAT and SPECIFICATION.
FORMAT is a string containing `format'-like specs like \"bash %u %k\",
while SPECIFICATION is an alist mapping from format spec characters
-to values."
+to values. Any text properties on a %-spec itself are propagated to
+the text that it generates."
(with-temp-buffer
(insert format)
(goto-char (point-min))
(let* ((num (match-string 1))
(spec (string-to-char (match-string 2)))
(val (cdr (assq spec specification))))
- (delete-region (1- (match-beginning 0)) (match-end 0))
(unless val
- (error "Invalid format character: `%%%c'" spec))
- (insert (format (concat "%" num "s") val))))
+ (error "Invalid format character: `%%%c'" spec))
+ ;; Pad result to desired length.
+ (let ((text (format (concat "%" num "s") val)))
+ ;; Insert first, to preserve text properties.
+ (insert-and-inherit text)
+ ;; Delete the specifier body.
+ (delete-region (+ (match-beginning 0) (length text))
+ (+ (match-end 0) (length text)))
+ ;; Delete the percent sign.
+ (delete-region (1- (match-beginning 0)) (match-beginning 0)))))
;; Signal an error on bogus format strings.
(t
(error "Invalid format string"))))
--- /dev/null
+;;; gmm-utils.el --- Utility functions for Gnus, Message and MML
+
+;; Copyright (C) 2006 Free Software Foundation, Inc.
+
+;; Author: Reiner Steib <reiner.steib@gmx.de>
+;; Keywords: news
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; This library provides self-contained utility functions. The functions are
+;; used in Gnus, Message and MML, but within this library there are no
+;; dependencies on Gnus, Message, or MML or Gnus.
+
+;;; Code:
+
+(defgroup gmm nil
+ "Utility functions for Gnus, Message and MML"
+ :prefix "gmm-"
+ :version "23.0" ;; No Gnus
+ :group 'lisp)
+
+;; Helper functions from `gnus-utils.el': gmm-verbose, gmm-message, gmm-error
+
+(defcustom gmm-verbose 7
+ "Integer that says how verbose gmm should be.
+The higher the number, the more messages will flash to say what
+it done. At zero, it will be totally mute; at five, it will
+display most important messages; and at ten, it will keep on
+jabbering all the time."
+ :type 'integer
+ :group 'gmm)
+
+;;;###autoload
+(defun gmm-message (level &rest args)
+ "If LEVEL is lower than `gmm-verbose' print ARGS using `message'.
+
+Guideline for numbers:
+1 - error messages, 3 - non-serious error messages, 5 - messages for things
+that take a long time, 7 - not very important messages on stuff, 9 - messages
+inside loops."
+ (if (<= level gmm-verbose)
+ (apply 'message args)
+ ;; We have to do this format thingy here even if the result isn't
+ ;; shown - the return value has to be the same as the return value
+ ;; from `message'.
+ (apply 'format args)))
+
+;;;###autoload
+(defun gmm-error (level &rest args)
+ "Beep an error if LEVEL is equal to or less than `gmm-verbose'.
+ARGS are passed to `message'."
+ (when (<= (floor level) gmm-verbose)
+ (apply 'message args)
+ (ding)
+ (let (duration)
+ (when (and (floatp level)
+ (not (zerop (setq duration (* 10 (- level (floor level)))))))
+ (sit-for duration))))
+ nil)
+
+;;;###autoload
+(defun gmm-widget-p (symbol)
+ "Non-nil iff SYMBOL is a widget."
+ (get symbol 'widget-type))
+
+;; Copy of the `nnmail-lazy' code from `nnmail.el':
+(define-widget 'gmm-lazy 'default
+ "Base widget for recursive datastructures.
+
+This is copy of the `lazy' widget in Emacs 22.1 provided for compatibility."
+ :format "%{%t%}: %v"
+ :convert-widget 'widget-value-convert-widget
+ :value-create (lambda (widget)
+ (let ((value (widget-get widget :value))
+ (type (widget-get widget :type)))
+ (widget-put widget :children
+ (list (widget-create-child-value
+ widget (widget-convert type) value)))))
+ :value-delete 'widget-children-value-delete
+ :value-get (lambda (widget)
+ (widget-value (car (widget-get widget :children))))
+ :value-inline (lambda (widget)
+ (widget-apply (car (widget-get widget :children))
+ :value-inline))
+ :default-get (lambda (widget)
+ (widget-default-get
+ (widget-convert (widget-get widget :type))))
+ :match (lambda (widget value)
+ (widget-apply (widget-convert (widget-get widget :type))
+ :match value))
+ :validate (lambda (widget)
+ (widget-apply (car (widget-get widget :children)) :validate)))
+
+;; Note: The format of `gmm-tool-bar-item' may change if some future Emacs
+;; version will provide customizable tool bar buttons using a different
+;; interface.
+
+;; TODO: Extend API so that the "Command" entry can be a function or a plist.
+;; In case of a list it should have the format...
+;;
+;; (:none command-without-modifier
+;; :shift command-with-shift-pressed
+;; :control command-with-ctrl-pressed
+;; :control-shift command-with-control-and-shift-pressed
+;; ;; mouse-2 and mouse-3 can't be used in Emacs yet.
+;; :mouse-2 command-on-mouse-2-press
+;; :mouse-3 command-on-mouse-3-press) ;; typically a menu of related commands
+;;
+;; Combinations of mouse-[23] plus shift and/or controll might be overkill.
+;;
+;; Then use (plist-get rs-command :none), (plist-get rs-command :shift)
+
+(define-widget 'gmm-tool-bar-item (if (gmm-widget-p 'lazy) 'lazy 'gmm-lazy)
+ "Tool bar list item."
+ :tag "Tool bar item"
+ :type '(choice
+ (list :tag "Command and Icon"
+ (function :tag "Command")
+ (string :tag "Icon file")
+ (choice
+ (const :tag "Default map" nil)
+ ;; Note: Usually we need non-nil attributes if map is t.
+ (const :tag "No menu" t)
+ (sexp :tag "Other map"))
+ (plist :inline t :tag "Properties"))
+ (list :tag "Separator"
+ (const :tag "No command" gmm-ignore)
+ (string :tag "Icon file")
+ (const :tag "No map")
+ (plist :inline t :tag "Properties"))))
+
+(define-widget 'gmm-tool-bar-zap-list (if (gmm-widget-p 'lazy) 'lazy 'gmm-lazy)
+ "Tool bar zap list."
+ :tag "Tool bar zap list"
+ :type '(choice (const :tag "Zap all" t)
+ (const :tag "Keep all" nil)
+ (list
+ ;; :value
+ ;; Work around (bug in customize?), see
+ ;; <news:v9is48jrj1.fsf@marauder.physik.uni-ulm.de>
+ ;; (new-file open-file dired kill-buffer write-file
+ ;; print-buffer customize help)
+ (set :inline t
+ (const new-file)
+ (const open-file)
+ (const dired)
+ (const kill-buffer)
+ (const save-buffer)
+ (const write-file)
+ (const undo)
+ (const cut)
+ (const copy)
+ (const paste)
+ (const search-forward)
+ (const print-buffer)
+ (const customize)
+ (const help))
+ (repeat :inline t
+ :tag "Other"
+ (symbol :tag "Icon item")))))
+
+;; (defun gmm-color-cells (&optional display)
+;; "Return the number of color cells supported by DISPLAY.
+;; Compatibility function."
+;; ;; `display-color-cells' doesn't return more than 256 even if color depth is
+;; ;; > 8 in Emacs 21.
+;; ;;
+;; ;; Feel free to add proper XEmacs support.
+;; (let* ((cells (and (fboundp 'display-color-cells)
+;; (display-color-cells display)))
+;; (plane (and (fboundp 'x-display-planes)
+;; (ash 1 (x-display-planes))))
+;; (none -1))
+;; (max (if (integerp cells) cells none)
+;; (if (integerp plane) plane none))))
+
+(defcustom gmm-tool-bar-style
+ (if (and (boundp 'tool-bar-mode)
+ tool-bar-mode
+ (and (fboundp 'display-visual-class)
+ (not (memq (display-visual-class)
+ (list 'static-gray 'gray-scale
+ 'static-color 'pseudo-color)))))
+ 'gnome
+ 'retro)
+ "Prefered tool bar style."
+ :type '(choice (const :tag "GNOME style" 'gnome)
+ (const :tag "Retro look" 'retro))
+ :group 'gmm)
+
+(defvar tool-bar-map)
+
+;;;###autoload
+(defun gmm-tool-bar-from-list (icon-list zap-list default-map)
+ "Make a tool bar from ICON-LIST.
+
+Within each entry of ICON-LIST, the first element is a menu
+command, the second element is an icon file name and the third
+element is a test function. You can use \\[describe-key]
+<menu-entry> to find out the name of a menu command. The fourth
+and all following elements are passed a the PROPS argument to the
+function `tool-bar-local-item'.
+
+If ZAP-LIST is a list, remove those item from the default
+`tool-bar-map'. If it is t, start with a new sparse map. You
+can use \\[describe-key] <icon> to find out the name of an icon
+item. When \\[describe-key] <icon> shows \"<tool-bar> <new-file>
+runs the command find-file\", then use `new-file' in ZAP-LIST.
+
+DEFAULT-MAP specifies the default key map for ICON-LIST."
+ (let (;; For Emacs 21, we must let-bind `tool-bar-map'. In Emacs 22, we
+ ;; could use some other local variable.
+ (tool-bar-map (if (eq zap-list t)
+ (make-sparse-keymap)
+ (copy-keymap tool-bar-map))))
+ (when (listp zap-list)
+ ;; Zap some items which aren't relevant for this mode and take up space.
+ (dolist (key zap-list)
+ (define-key tool-bar-map (vector key) nil)))
+ (mapc (lambda (el)
+ (let ((command (car el))
+ (icon (nth 1 el))
+ (fmap (or (nth 2 el) default-map))
+ (props (cdr (cdr (cdr el)))) )
+ ;; command may stem from different from-maps:
+ (cond ((eq command 'gmm-ignore)
+ ;; The dummy `gmm-ignore', see `gmm-tool-bar-item'
+ ;; widget. Suppress tooltip by adding `:enable nil'.
+ (if (fboundp 'tool-bar-local-item)
+ (apply 'tool-bar-local-item icon nil nil
+ tool-bar-map :enable nil props)
+ ;; (tool-bar-local-item ICON DEF KEY MAP &rest PROPS)
+ ;; (tool-bar-add-item ICON DEF KEY &rest PROPS)
+ (apply 'tool-bar-add-item icon nil nil :enable nil props)))
+ ((equal fmap t) ;; Not a menu command
+ (if (fboundp 'tool-bar-local-item)
+ (apply 'tool-bar-local-item
+ icon command
+ (intern icon) ;; reuse icon or fmap here?
+ tool-bar-map props)
+ ;; Emacs 21 compatibility:
+ (apply 'tool-bar-add-item
+ icon command
+ (intern icon)
+ props)))
+ (t ;; A menu command
+ (if (fboundp 'tool-bar-local-item-from-menu)
+ (apply 'tool-bar-local-item-from-menu
+ ;; (apply 'tool-bar-local-item icon def key
+ ;; tool-bar-map props)
+ command icon tool-bar-map (symbol-value fmap)
+ props)
+ ;; Emacs 21 compatibility:
+ (apply 'tool-bar-add-item-from-menu
+ command icon (symbol-value fmap)
+ props))))
+ t))
+ (if (symbolp icon-list)
+ (eval icon-list)
+ icon-list))
+ tool-bar-map))
+
+;; WARNING: The following is subject to change. Don't rely on it yet.
+
+;; From MH-E without modifications:
+
+(defmacro gmm-defun-compat (name function arg-list &rest body)
+ "Create function NAME.
+If FUNCTION exists, then NAME becomes an alias for FUNCTION.
+Otherwise, create function NAME with ARG-LIST and BODY."
+ (let ((defined-p (fboundp function)))
+ (if defined-p
+ `(defalias ',name ',function)
+ `(defun ,name ,arg-list ,@body))))
+
+(gmm-defun-compat gmm-image-search-load-path
+ image-search-load-path (file &optional path)
+ "Emacs 21 and XEmacs don't have `image-search-load-path'.
+This function returns nil on those systems."
+ nil)
+
+;; From MH-E with modifications:
+
+;; Don't use `gmm-defun-compat' until API changes in
+;; `image-load-path-for-library' in Emacs CVS are completed.
+
+(defun gmm-image-load-path-for-library (library image &optional path no-error)
+ "Return a suitable search path for images relative to LIBRARY.
+
+First it searches for IMAGE in `image-load-path' (excluding
+\"`data-directory'/images\") and `load-path', followed by a path
+suitable for LIBRARY, which includes \"../../etc/images\" and
+\"../etc/images\" relative to the library file itself, and then
+in \"`data-directory'/images\".
+
+Then this function returns a list of directories which contains
+first the directory in which IMAGE was found, followed by the
+value of `load-path'. If PATH is given, it is used instead of
+`load-path'.
+
+If NO-ERROR is non-nil and a suitable path can't be found, don't
+signal an error. Instead, return a list of directories as before,
+except that nil appears in place of the image directory.
+
+Here is an example that uses a common idiom to provide
+compatibility with versions of Emacs that lack the variable
+`image-load-path':
+
+ ;; Shush compiler.
+ (defvar image-load-path)
+
+ (let* ((load-path (image-load-path-for-library \"mh-e\" \"mh-logo.xpm\"))
+ (image-load-path (cons (car load-path)
+ (when (boundp 'image-load-path)
+ image-load-path))))
+ (mh-tool-bar-folder-buttons-init))"
+ (unless library (error "No library specified"))
+ (unless image (error "No image specified"))
+ (let (image-directory image-directory-load-path)
+ ;; Check for images in image-load-path or load-path.
+ (let ((img image)
+ (dir (or
+ ;; Images in image-load-path.
+ (gmm-image-search-load-path image) ;; "gmm-" prefix!
+ ;; Images in load-path.
+ (locate-library image)))
+ parent)
+ ;; Since the image might be in a nested directory (for
+ ;; example, mail/attach.pbm), adjust `image-directory'
+ ;; accordingly.
+ (when dir
+ (setq dir (file-name-directory dir))
+ (while (setq parent (file-name-directory img))
+ (setq img (directory-file-name parent)
+ dir (expand-file-name "../" dir))))
+ (setq image-directory-load-path dir))
+
+ ;; If `image-directory-load-path' isn't Emacs' image directory,
+ ;; it's probably a user preference, so use it. Then use a
+ ;; relative setting if possible; otherwise, use
+ ;; `image-directory-load-path'.
+ (cond
+ ;; User-modified image-load-path?
+ ((and image-directory-load-path
+ (not (equal image-directory-load-path
+ (file-name-as-directory
+ (expand-file-name "images" data-directory)))))
+ (setq image-directory image-directory-load-path))
+ ;; Try relative setting.
+ ((let (library-name d1ei d2ei)
+ ;; First, find library in the load-path.
+ (setq library-name (locate-library library))
+ (if (not library-name)
+ (error "Cannot find library %s in load-path" library))
+ ;; And then set image-directory relative to that.
+ (setq
+ ;; Go down 2 levels.
+ d2ei (file-name-as-directory
+ (expand-file-name
+ (concat (file-name-directory library-name) "../../etc/images")))
+ ;; Go down 1 level.
+ d1ei (file-name-as-directory
+ (expand-file-name
+ (concat (file-name-directory library-name) "../etc/images"))))
+ (setq image-directory
+ ;; Set it to nil if image is not found.
+ (cond ((file-exists-p (expand-file-name image d2ei)) d2ei)
+ ((file-exists-p (expand-file-name image d1ei)) d1ei)))))
+ ;; Use Emacs' image directory.
+ (image-directory-load-path
+ (setq image-directory image-directory-load-path))
+ (no-error
+ (message "Could not find image %s for library %s" image library))
+ (t
+ (error "Could not find image %s for library %s" image library)))
+
+ ;; Return an augmented `path' or `load-path'.
+ (nconc (list image-directory)
+ (delete image-directory (copy-sequence (or path load-path))))))
+
+(defun gmm-customize-mode (&optional mode)
+ "Customize customization group for MODE.
+If mode is nil, use `major-mode' of the curent buffer."
+ (interactive)
+ (customize-group
+ (or mode
+ (intern (let ((mode (symbol-name major-mode)))
+ (string-match "^\\(.+\\)-mode$" mode)
+ (match-string 1 mode))))))
+
+(provide 'gmm-utils)
+
+;; arch-tag: e0b60920-2ce6-40c1-bfc0-cadbbe26b602
+;;; gmm-utils.el ends here
;;; gnus-agent.el --- unplugged support for Gnus
-;; Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; This file is part of GNU Emacs.
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(defcustom gnus-agent-synchronize-flags nil
"Indicate if flags are synchronized when you plug in.
If this is `ask' the hook will query the user."
+ ;; If the default switches to something else than nil, then the function
+ ;; should be fixed not be exceedingly slow. See 2005-09-20 ChangeLog entry.
:version "21.1"
:type '(choice (const :tag "Always" t)
(const :tag "Never" nil)
:group 'gnus-agent
:type '(radio (const :format "Always" always)
(const :format "Never" nil)
- (const :format "When plugged" t)))
+ (const :format "When unplugged" t)))
(defcustom gnus-agent-prompt-send-queue nil
"If non-nil, `gnus-group-send-queue' will prompt if called when
:group 'gnus-agent
:type 'boolean)
+(defcustom gnus-agent-article-alist-save-format 1
+ "Indicates whether to use compression(2), versus no
+compression(1), when writing agentview files. The compressed
+files do save space but load times are 6-7 times higher. A group
+must be opened then closed for the agentview to be updated using
+the new format."
+ ;; Wouldn't symbols instead numbers be nicer? --rsteib
+ :version "22.1"
+ :group 'gnus-agent
+ :type '(radio (const :format "Compressed" 2)
+ (const :format "Uncompressed" 1)))
+
;;; Internal variables
(defvar gnus-agent-history-buffers nil)
(if (and (fboundp 'propertize)
(fboundp 'make-mode-line-mouse-map))
(propertize string 'local-map
- (make-mode-line-mouse-map mouse-button mouse-func))
+ (make-mode-line-mouse-map mouse-button mouse-func)
+ 'mouse-face 'mode-line-highlight)
string))
(defun gnus-agent-toggle-plugged (set-to)
(save-excursion
(dolist (gnus-command-method (gnus-agent-covered-methods))
(when (and (file-exists-p (gnus-agent-lib-file "flags"))
- (not (eq (gnus-server-status gnus-command-method) 'offline)))
+ (eq (gnus-server-status gnus-command-method) 'ok))
(gnus-agent-possibly-synchronize-flags-server gnus-command-method)))))
(defun gnus-agent-synchronize-flags-server (method)
;;;###autoload
(defun gnus-agent-rename-group (old-group new-group)
- "Rename fully-qualified OLD-GROUP as NEW-GROUP. Always updates the agent, even when
-disabled, as the old agent files would corrupt gnus when the agent was
-next enabled. Depends upon the caller to determine whether group renaming is supported."
+ "Rename fully-qualified OLD-GROUP as NEW-GROUP.
+Always updates the agent, even when disabled, as the old agent
+files would corrupt gnus when the agent was next enabled.
+Depends upon the caller to determine whether group renaming is
+supported."
(let* ((old-command-method (gnus-find-method-for-group old-group))
(old-path (directory-file-name
(let (gnus-command-method old-command-method)
;;;###autoload
(defun gnus-agent-delete-group (group)
- "Delete fully-qualified GROUP. Always updates the agent, even when
-disabled, as the old agent files would corrupt gnus when the agent was
-next enabled. Depends upon the caller to determine whether group deletion is supported."
+ "Delete fully-qualified GROUP.
+Always updates the agent, even when disabled, as the old agent
+files would corrupt gnus when the agent was next enabled.
+Depends upon the caller to determine whether group deletion is
+supported."
(let* ((command-method (gnus-find-method-for-group group))
(path (directory-file-name
(let (gnus-command-method command-method)
(while (looking-at "\\([^: \n]+\\):\\([0-9]+\\) *")
(push (cons (buffer-substring (match-beginning 1)
(match-end 1))
- (string-to-int
+ (string-to-number
(buffer-substring (match-beginning 2)
(match-end 2))))
crosses)
(defsubst gnus-agent-read-article-number ()
"Reads the article number at point. Returns nil when a valid article number can not be read."
- ;; It is unfortunite but the read function quietly overflows
+ ;; It is unfortunate but the read function quietly overflows
;; integer. As a result, I have to use string operations to test
;; for overflow BEFORE calling read.
(when (looking-at "[0-9]+\t")
(gnus-agent-copy-nov-line (pop articles))
(ignore-errors
- (while articles
- (while (let ((art (read (current-buffer))))
- (cond ((< art (car articles))
- (forward-line 1)
- t)
- ((= art (car articles))
- (beginning-of-line)
- (delete-region
- (point) (progn (forward-line 1) (point)))
- nil)
- (t
- (beginning-of-line)
- nil))))
-
- (gnus-agent-copy-nov-line (pop articles)))))
+ (while articles
+ (while (let ((art (read (current-buffer))))
+ (cond ((< art (car articles))
+ (forward-line 1)
+ t)
+ ((= art (car articles))
+ (beginning-of-line)
+ (delete-region
+ (point) (progn (forward-line 1) (point)))
+ nil)
+ (t
+ (beginning-of-line)
+ nil))))
+
+ (gnus-agent-copy-nov-line (pop articles)))))
(goto-char (point-max))
(goto-char p))
(setq last (or last -134217728))
- (let (sort art)
- (while (not (eobp))
- (setq art (gnus-agent-read-article-number))
- (cond ((not art)
- ;; Bad art num - delete this line
- (beginning-of-line)
- (delete-region (point) (progn (forward-line 1) (point))))
- ((< art last)
- ;; Art num out of order - enable sort
- (setq sort t)
- (forward-line 1))
- (t
- ;; Good art num
- (setq last art)
- (forward-line 1))))
- (when sort
- (sort-numeric-fields 1 (point-min) (point-max)))))))
+ (while (catch 'problems
+ (let (sort art)
+ (while (not (eobp))
+ (setq art (gnus-agent-read-article-number))
+ (cond ((not art)
+ ;; Bad art num - delete this line
+ (beginning-of-line)
+ (delete-region (point) (progn (forward-line 1) (point))))
+ ((< art last)
+ ;; Art num out of order - enable sort
+ (setq sort t)
+ (forward-line 1))
+ ((= art last)
+ ;; Bad repeat of art number - delete this line
+ (beginning-of-line)
+ (delete-region (point) (progn (forward-line 1) (point))))
+ (t
+ ;; Good art num
+ (setq last art)
+ (forward-line 1))))
+ (when sort
+ ;; something is seriously wrong as we simply shouldn't see out-of-order data.
+ ;; First, we'll fix the sort.
+ (sort-numeric-fields 1 (point-min) (point-max))
+
+ ;; but now we have to consider that we may have duplicate rows...
+ ;; so reset to beginning of file
+ (goto-char (point-min))
+ (setq last -134217728)
+
+ ;; and throw a code that restarts this scan
+ (throw 'problems t))
+ nil))))))
;; Keeps the compiler from warning about the free variable in
;; gnus-agent-read-agentview.
'gnus-agent-file-loading-cache
'gnus-agent-read-agentview))))
-;; Save format may be either 1 or 2. Two is the new, compressed
-;; format that is still being tested. Format 1 is uncompressed but
-;; known to be reliable.
-(defconst gnus-agent-article-alist-save-format 2)
-
(defun gnus-agent-read-agentview (file)
"Load FILE and do a `read' there."
(with-temp-buffer
(condition-case nil
- (progn
- (nnheader-insert-file-contents file)
- (goto-char (point-min))
- (let ((alist (read (current-buffer)))
- (version (condition-case nil (read (current-buffer))
- (end-of-file 0)))
- changed-version)
-
- (cond
- ((< version 2)
- (error "gnus-agent-read-agentview no longer supports version %d. Stop gnus, manually evaluate gnus-agent-convert-to-compressed-agentview, then restart gnus." version))
- ((= version 0)
- (let ((inhibit-quit t)
- entry)
- (gnus-agent-open-history)
- (set-buffer (gnus-agent-history-buffer))
- (goto-char (point-min))
- (while (not (eobp))
- (if (and (looking-at
- "[^\t\n]+\t\\([0-9]+\\)\t\\([^ \n]+\\) \\([0-9]+\\)")
- (string= (match-string 2)
- gnus-agent-read-agentview)
- (setq entry (assoc (string-to-number (match-string 3)) alist)))
- (setcdr entry (string-to-number (match-string 1))))
- (forward-line 1))
- (gnus-agent-close-history)
- (setq changed-version t)))
- ((= version 1)
- (setq changed-version (not (= 1 gnus-agent-article-alist-save-format))))
- ((= version 2)
- (let (uncomp)
- (mapcar
- (lambda (comp-list)
- (let ((state (car comp-list))
- (sequence (inline
- (gnus-uncompress-range
- (cdr comp-list)))))
- (mapcar (lambda (article-id)
- (setq uncomp (cons (cons article-id state) uncomp)))
- sequence)))
- alist)
- (setq alist (sort uncomp 'car-less-than-car)))))
- (when changed-version
- (let ((gnus-agent-article-alist alist))
- (gnus-agent-save-alist gnus-agent-read-agentview)))
- alist))
+ (progn
+ (nnheader-insert-file-contents file)
+ (goto-char (point-min))
+ (let ((alist (read (current-buffer)))
+ (version (condition-case nil (read (current-buffer))
+ (end-of-file 0)))
+ changed-version)
+
+ (cond
+ ((= version 0)
+ (let ((inhibit-quit t)
+ entry)
+ (gnus-agent-open-history)
+ (set-buffer (gnus-agent-history-buffer))
+ (goto-char (point-min))
+ (while (not (eobp))
+ (if (and (looking-at
+ "[^\t\n]+\t\\([0-9]+\\)\t\\([^ \n]+\\) \\([0-9]+\\)")
+ (string= (match-string 2)
+ gnus-agent-read-agentview)
+ (setq entry (assoc (string-to-number (match-string 3)) alist)))
+ (setcdr entry (string-to-number (match-string 1))))
+ (forward-line 1))
+ (gnus-agent-close-history)
+ (setq changed-version t)))
+ ((= version 1)
+ (setq changed-version (not (= 1 gnus-agent-article-alist-save-format))))
+ ((= version 2)
+ (let (uncomp)
+ (mapcar
+ (lambda (comp-list)
+ (let ((state (car comp-list))
+ (sequence (inline
+ (gnus-uncompress-range
+ (cdr comp-list)))))
+ (mapcar (lambda (article-id)
+ (setq uncomp (cons (cons article-id state) uncomp)))
+ sequence)))
+ alist)
+ (setq alist (sort uncomp 'car-less-than-car)))
+ (setq changed-version (not (= 2 gnus-agent-article-alist-save-format)))))
+ (when changed-version
+ (let ((gnus-agent-article-alist alist))
+ (gnus-agent-save-alist gnus-agent-read-agentview)))
+ alist))
(file-error nil))))
(defun gnus-agent-save-alist (group &optional articles state)
;; NOTE: The '+ 0' ensure that min and max are both numerics.
(set group (cons (+ 0 min) (+ 0 max))))
(error
- (gnus-message 3 "Warning - invalid agent local: %s on line %d: "
+ (gnus-message 3 "Warning - invalid agent local: %s on line %d: %s"
file line (error-message-string err))))
(forward-line 1)
(setq line (1+ line))))
((member (symbol-name symbol) '("+dirty" "+method"))
nil)
(t
- (prin1 symbol)
(let ((range (symbol-value symbol)))
- (princ " ")
- (princ (car range))
- (princ " ")
- (princ (cdr range))
- (princ "\n")))))
+ (when range
+ (prin1 symbol)
+ (princ " ")
+ (princ (car range))
+ (princ " ")
+ (princ (cdr range))
+ (princ "\n"))))))
my-obarray))))))))
(defun gnus-agent-get-local (group &optional gmane method)
(buffer-disable-undo)
(setq truncate-lines t)
(setq buffer-read-only t)
- (gnus-run-hooks 'gnus-category-mode-hook))
+ (gnus-run-mode-hooks 'gnus-category-mode-hook))
(defalias 'gnus-category-position-point 'gnus-goto-colon)
(if (or (not (eq articles t))
(yes-or-no-p
(concat "Are you sure that you want to "
- "expire all articles in " group ".")))
+ "expire all articles in " group "? ")))
(let ((gnus-command-method (gnus-find-method-for-group group))
(overview (gnus-get-buffer-create " *expire overview*"))
orig)
(gnus-agent-expire-group group articles force)
(if (or (not (eq articles t))
(yes-or-no-p "Are you sure that you want to expire all \
-articles in every agentized group."))
+articles in every agentized group? "))
(let ((methods (gnus-agent-covered-methods))
;; Bind gnus-agent-expire-current-dirs to enable tracking
;; of agent directories.
(dir (file-name-directory file))
point
(downloaded (if (file-exists-p dir)
- (sort (mapcar (lambda (name) (string-to-int name))
+ (sort (mapcar (lambda (name) (string-to-number name))
(directory-files dir nil "^[0-9]+$" t))
'>)
(progn (gnus-make-directory dir) nil)))
;;; gnus-art.el --- article mode commands for Gnus
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(eval-when-compile
(require 'cl)
- (defvar tool-bar-map))
+ (defvar tool-bar-map)
+ (defvar w3m-minor-mode-map))
(require 'gnus)
;; Avoid the "Recursive load suspected" error in Emacs 21.1.
(autoload 'gnus-button-reply "gnus-msg" nil t)
(autoload 'parse-time-string "parse-time" nil nil)
(autoload 'ansi-color-apply-on-region "ansi-color")
+(autoload 'mm-url-insert-file-contents-external "mm-url")
+(autoload 'mm-extern-cache-contents "mm-extern")
(defgroup gnus-article nil
"Article display."
This can also be a list of regexps. In that case, it will be checked
from head to tail looking for a separator. Searches will be done from
the end of the buffer."
- :type '(repeat string)
+ :type '(choice :format "%{%t%}: %[Value Menu%]\n%v"
+ (regexp)
+ (repeat :tag "List of regexp" regexp))
:group 'gnus-article-signature)
(defcustom gnus-signature-limit nil
regexp. If it matches, the text in question is not a signature.
This can also be a list of the above values."
- :type '(choice (integer :value 200)
+ :type '(choice (const nil)
+ (integer :value 200)
(number :value 4.0)
(function :value fun)
(regexp :value ".*"))
(or (nth 4 spec) 3)
(intern (format "gnus-emphasis-%s" (nth 2 spec)))))
types))
- '(("\\(\\s-\\|^\\)\\(_\\(\\(\\w\\|_[^_]\\)+\\)_\\)\\(\\s-\\|[?!.,;]\\)"
+ '(;; I've never seen anyone use this strikethru convention whereas I've
+ ;; several times seen it triggered by normal text. --Stef
+ ;; Miles suggests that this form is sometimes used but for italics,
+ ;; so maybe we should map it to `italic'.
+ ;; ("\\(\\s-\\|^\\)\\(-\\(\\(\\w\\|-[^-]\\)+\\)-\\)\\(\\s-\\|[?!.,;]\\)"
+ ;; 2 3 gnus-emphasis-strikethru)
+ ("\\(\\s-\\|^\\)\\(_\\(\\(\\w\\|_[^_]\\)+\\)_\\)\\(\\s-\\|[?!.,;]\\)"
2 3 gnus-emphasis-underline))))
"*Alist that says how to fontify certain phrases.
Each item looks like this:
:link '(custom-manual "(gnus)Article Date")
:group 'gnus-article-washing)
-(eval-and-compile
- (autoload 'mail-extract-address-components "mail-extr"))
-
(defcustom gnus-save-all-headers t
"*If non-nil, don't remove any headers before saving."
:group 'gnus-article-saving
(function-item gnus-summary-save-in-file)
(function-item gnus-summary-save-body-in-file)
(function-item gnus-summary-save-in-vm)
- (function-item gnus-summary-write-to-file)))
+ (function-item gnus-summary-write-to-file)
+ (function)))
(defcustom gnus-rmail-save-name 'gnus-plain-save-name
"A function generating a file name to save articles in Rmail format.
(make-obsolete-variable 'gnus-article-hide-pgp-hook
"This variable is obsolete in Gnus 5.10.")
-(defcustom gnus-article-button-face 'bold
+(defface gnus-button
+ '((t (:weight bold)))
+ "Face used for highlighting a button in the article buffer."
+ :group 'gnus-article-buttons)
+
+(defcustom gnus-article-button-face 'gnus-button
"Face used for highlighting buttons in the article buffer.
An article button is a piece of text that you can activate by pressing
:type 'face
:group 'gnus-article-buttons)
-(defcustom gnus-signature-face 'gnus-signature-face
+(defcustom gnus-signature-face 'gnus-signature
"Face used for highlighting a signature in the article buffer.
-Obsolete; use the face `gnus-signature-face' for customizations instead."
+Obsolete; use the face `gnus-signature' for customizations instead."
:type 'face
:group 'gnus-article-highlight
:group 'gnus-article-signature)
-(defface gnus-signature-face
+(defface gnus-signature
'((t
(:italic t)))
"Face used for highlighting a signature in the article buffer."
:group 'gnus-article-highlight
:group 'gnus-article-signature)
+;; backward-compatibility alias
+(put 'gnus-signature-face 'face-alias 'gnus-signature)
-(defface gnus-header-from-face
+(defface gnus-header-from
'((((class color)
(background dark))
(:foreground "spring green"))
"Face used for displaying from headers."
:group 'gnus-article-headers
:group 'gnus-article-highlight)
+;; backward-compatibility alias
+(put 'gnus-header-from-face 'face-alias 'gnus-header-from)
-(defface gnus-header-subject-face
+(defface gnus-header-subject
'((((class color)
(background dark))
(:foreground "SeaGreen3"))
"Face used for displaying subject headers."
:group 'gnus-article-headers
:group 'gnus-article-highlight)
+;; backward-compatibility alias
+(put 'gnus-header-subject-face 'face-alias 'gnus-header-subject)
-(defface gnus-header-newsgroups-face
+(defface gnus-header-newsgroups
'((((class color)
(background dark))
(:foreground "yellow" :italic t))
articles."
:group 'gnus-article-headers
:group 'gnus-article-highlight)
+;; backward-compatibility alias
+(put 'gnus-header-newsgroups-face 'face-alias 'gnus-header-newsgroups)
-(defface gnus-header-name-face
+(defface gnus-header-name
'((((class color)
(background dark))
(:foreground "SeaGreen"))
"Face used for displaying header names."
:group 'gnus-article-headers
:group 'gnus-article-highlight)
+;; backward-compatibility alias
+(put 'gnus-header-name-face 'face-alias 'gnus-header-name)
-(defface gnus-header-content-face
+(defface gnus-header-content
'((((class color)
(background dark))
(:foreground "forest green" :italic t))
(:italic t))) "Face used for displaying header content."
:group 'gnus-article-headers
:group 'gnus-article-highlight)
+;; backward-compatibility alias
+(put 'gnus-header-content-face 'face-alias 'gnus-header-content)
(defcustom gnus-header-face-alist
- '(("From" nil gnus-header-from-face)
- ("Subject" nil gnus-header-subject-face)
- ("Newsgroups:.*," nil gnus-header-newsgroups-face)
- ("" gnus-header-name-face gnus-header-content-face))
+ '(("From" nil gnus-header-from)
+ ("Subject" nil gnus-header-subject)
+ ("Newsgroups:.*," nil gnus-header-newsgroups)
+ ("" gnus-header-name gnus-header-content))
"*Controls highlighting of article headers.
An alist of the form (HEADER NAME CONTENT).
"List of MIME types that should be given buttons when rendered inline.
If set, this variable overrides `gnus-unbuttonized-mime-types'.
To see e.g. security buttons you could set this to
-`(\"multipart/signed\")'.
+`(\"multipart/signed\")'. You could also add \"multipart/alternative\" to
+this list to display radio buttons that allow you to choose one of two
+media types those mails include. See also `mm-discouraged-alternatives'.
This variable is only used when `gnus-inhibit-mime-unbuttonizing' is nil."
:version "22.1"
:group 'gnus-article-mime
This is meant for people who want to do something automatic based
on parts -- for instance, adding Vcard info to a database."
:group 'gnus-article-mime
- :type 'function)
+ :type '(choice (const nil)
+ function))
(defcustom gnus-mime-multipart-functions nil
"An alist of MIME types to functions to display them."
(defcustom gnus-mime-action-alist
'(("save to file" . gnus-mime-save-part)
("save and strip" . gnus-mime-save-part-and-strip)
+ ("replace with file" . gnus-mime-replace-part)
("delete part" . gnus-mime-delete-part)
("display as text" . gnus-mime-inline-part)
("view the part" . gnus-mime-view-part)
:type '(repeat (cons (string :tag "name")
(function))))
+(defcustom gnus-auto-select-part 1
+ "Advance to next MIME part when deleting or stripping parts.
+
+When 0, point will be placed on the same part as before. When
+positive (negative), move point forward (backwards) this many
+parts. When nil, redisplay article."
+ :version "23.0" ;; No Gnus
+ :group 'gnus-article-mime
+ :type '(choice (const nil :tag "Redisplay article.")
+ (const 1 :tag "Next part.")
+ (const 0 :tag "Current part.")
+ integer))
+
;;;
;;; The treatment variables
;;;
'(choice (const :tag "Off" nil)
(const :tag "On" t)
(const :tag "Header" head)
+ (const :tag "First" first)
(const :tag "Last" last)
(integer :tag "Less")
(repeat :tag "Groups" regexp)
(defcustom gnus-treat-highlight-signature '(or t (typep "text/x-vcard"))
"Highlight the signature.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles'."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
:type gnus-article-treat-custom)
(defcustom gnus-treat-buttonize 100000
"Add buttons.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles'."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
:type gnus-article-treat-custom)
(defcustom gnus-treat-buttonize-head 'head
"Add buttons to the head.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
:type gnus-article-treat-head-custom)
(featurep 'xemacs))
50000)
"Emphasize text.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
:type gnus-article-treat-custom)
(defcustom gnus-treat-strip-cr nil
"Remove carriage returns.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:version "22.1"
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
(defcustom gnus-treat-unsplit-urls nil
"Remove newlines from within URLs.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:version "22.1"
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
(defcustom gnus-treat-leading-whitespace nil
"Remove leading whitespace in headers.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:version "22.1"
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
(defcustom gnus-treat-hide-headers 'head
"Hide headers.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
:type gnus-article-treat-head-custom)
(defcustom gnus-treat-hide-boring-headers nil
"Hide boring headers.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
:type gnus-article-treat-head-custom)
(defcustom gnus-treat-hide-signature nil
"Hide the signature.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
:type gnus-article-treat-custom)
(defcustom gnus-treat-fill-article nil
"Fill the article.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
:type gnus-article-treat-custom)
(defcustom gnus-treat-hide-citation nil
"Hide cited text.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
:type gnus-article-treat-custom)
(defcustom gnus-treat-hide-citation-maybe nil
"Hide cited text.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
:type gnus-article-treat-custom)
(defcustom gnus-treat-strip-list-identifiers 'head
"Strip list identifiers from `gnus-list-identifiers`.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:version "21.1"
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
(defcustom gnus-treat-strip-pem nil
"Strip PEM signatures.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
:type gnus-article-treat-custom)
(defcustom gnus-treat-strip-banner t
"Strip banners from articles.
The banner to be stripped is specified in the `banner' group parameter.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
:type gnus-article-treat-custom)
(defcustom gnus-treat-highlight-headers 'head
"Highlight the headers.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
:type gnus-article-treat-head-custom)
(defcustom gnus-treat-highlight-citation t
"Highlight cited text.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
:type gnus-article-treat-custom)
(defcustom gnus-treat-date-ut nil
"Display the Date in UT (GMT).
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
:type gnus-article-treat-head-custom)
(defcustom gnus-treat-date-local nil
"Display the Date in the local timezone.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
:type gnus-article-treat-head-custom)
(defcustom gnus-treat-date-english nil
"Display the Date in a format that can be read aloud in English.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:version "22.1"
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
(defcustom gnus-treat-date-lapsed nil
"Display the Date header in a way that says how much time has elapsed.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
:type gnus-article-treat-head-custom)
(defcustom gnus-treat-date-original nil
"Display the date in the original timezone.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
:type gnus-article-treat-head-custom)
(defcustom gnus-treat-date-iso8601 nil
"Display the date in the ISO8601 format.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:version "21.1"
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
(defcustom gnus-treat-date-user-defined nil
"Display the date in a user-defined format.
The format is defined by the `gnus-article-time-format' variable.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
:type gnus-article-treat-head-custom)
(defcustom gnus-treat-strip-headers-in-body t
"Strip the X-No-Archive header line from the beginning of the body.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:version "21.1"
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
(defcustom gnus-treat-strip-trailing-blank-lines nil
"Strip trailing blank lines.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'.
+
+When set to t, it also strips trailing blanks in all MIME parts.
+Consider to use `last' instead."
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
:type gnus-article-treat-custom)
(defcustom gnus-treat-strip-leading-blank-lines nil
"Strip leading blank lines.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'.
+
+When set to t, it also strips trailing blanks in all MIME parts."
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
:type gnus-article-treat-custom)
(defcustom gnus-treat-strip-multiple-blank-lines nil
"Strip multiple blank lines.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
:type gnus-article-treat-custom)
(defcustom gnus-treat-unfold-headers 'head
"Unfold folded header lines.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:version "22.1"
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
(defcustom gnus-treat-fold-headers nil
"Fold headers.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:version "22.1"
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
(defcustom gnus-treat-fold-newsgroups 'head
"Fold the Newsgroups and Followup-To headers.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:version "22.1"
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
(defcustom gnus-treat-overstrike t
"Treat overstrike highlighting.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
:type gnus-article-treat-custom)
(defcustom gnus-treat-ansi-sequences (if (locate-library "ansi-color") t)
"Treat ANSI SGR control sequences.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
:type gnus-article-treat-custom)
(featurep 'xface)))
'head)
"Display X-Face headers.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' and Info node
-`(gnus)X-Face' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles' and Info
+node `(gnus)X-Face' for details."
:group 'gnus-article-treat
:version "21.1"
:link '(custom-manual "(gnus)Customizing Articles")
(featurep 'png)))
'head)
"Display Face headers.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' and Info node
-`(gnus)X-Face' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles' and Info
+node `(gnus)X-Face' for details."
:group 'gnus-article-treat
:version "22.1"
:link '(custom-manual "(gnus)Customizing Articles")
(image-type-available-p 'pbm)))
t nil)
"Display smileys.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' and Info node
-`(gnus)Smileys' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles' and Info
+node `(gnus)Smileys' for details."
:group 'gnus-article-treat
:version "21.1"
:link '(custom-manual "(gnus)Customizing Articles")
(gnus-picons-installed-p))
'head nil)
"Display picons in the From header.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' and Info node
-`(gnus)Picons' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles' and Info
+node `(gnus)Picons' for details."
:version "22.1"
:group 'gnus-article-treat
:group 'gnus-picon
(gnus-picons-installed-p))
'head nil)
"Display picons in To and Cc headers.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' and Info node
-`(gnus)Picons' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles' and Info
+node `(gnus)Picons' for details."
:version "22.1"
:group 'gnus-article-treat
:group 'gnus-picon
(gnus-picons-installed-p))
'head nil)
"Display picons in the Newsgroups and Followup-To headers.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' and Info node
-`(gnus)Picons' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles' and Info
+node `(gnus)Picons' for details."
:version "22.1"
:group 'gnus-article-treat
:group 'gnus-picon
(defcustom gnus-treat-capitalize-sentences nil
"Capitalize sentence-starting words.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:version "21.1"
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
(defcustom gnus-treat-wash-html nil
"Format as HTML.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:version "22.1"
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
(defcustom gnus-treat-fill-long-lines nil
"Fill long lines.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
:type gnus-article-treat-custom)
(defcustom gnus-treat-play-sounds nil
"Play sounds.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:version "21.1"
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
(defcustom gnus-treat-translate nil
"Translate articles from one language to another.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:version "21.1"
:group 'gnus-article-treat
:link '(custom-manual "(gnus)Customizing Articles")
(defcustom gnus-treat-x-pgp-sig nil
"Verify X-PGP-Sig.
To automatically treat X-PGP-Sig, set it to head.
-Valid values are nil, t, `head', `last', an integer or a predicate.
-See Info node `(gnus)Customizing Articles' for details."
+Valid values are nil, t, `head', `first', `last', an integer or a
+predicate. See Info node `(gnus)Customizing Articles'."
:version "22.1"
:group 'gnus-article-treat
:group 'mime-security
(gnus-treat-date-ut gnus-article-date-ut)
(gnus-treat-date-local gnus-article-date-local)
(gnus-treat-date-english gnus-article-date-english)
- (gnus-treat-date-lapsed gnus-article-date-lapsed)
(gnus-treat-date-original gnus-article-date-original)
(gnus-treat-date-user-defined gnus-article-date-user)
(gnus-treat-date-iso8601 gnus-article-date-iso8601)
+ (gnus-treat-date-lapsed gnus-article-date-lapsed)
(gnus-treat-display-x-face gnus-article-display-x-face)
(gnus-treat-display-face gnus-article-display-face)
(gnus-treat-hide-headers gnus-article-maybe-hide-headers)
"Delete text of TYPE in the current buffer."
(save-excursion
(let ((b (point-min)))
- (while (setq b (text-property-any b (point-max) 'article-type type))
- (delete-region
- b (or (text-property-not-all b (point-max) 'article-type type)
- (point-max)))))))
+ (if (eq type 'multipart)
+ ;; Remove MIME buttons associated with multipart/alternative parts.
+ (progn
+ (goto-char b)
+ (while (if (get-text-property (point) 'gnus-part)
+ (setq b (point))
+ (when (setq b (next-single-property-change (point)
+ 'gnus-part))
+ (goto-char b)
+ t))
+ (end-of-line)
+ (skip-chars-forward "\n")
+ (when (eq (get-text-property b 'article-type) 'multipart)
+ (delete-region b (point)))))
+ (while (setq b (text-property-any b (point-max) 'article-type type))
+ (delete-region
+ b (or (text-property-not-all b (point-max) 'article-type type)
+ (point-max))))))))
(defun gnus-article-delete-invisible-text ()
"Delete all invisible text in the current buffer."
;; read-only.
(if (and wash-face-p (memq 'face gnus-article-wash-types))
(gnus-delete-images 'face)
- (let (face faces)
- (save-excursion
+ (let (face faces from)
+ (save-current-buffer
(when (and wash-face-p
- (progn
- (goto-char (point-min))
- (not (re-search-forward "^Face:[\t ]*" nil t)))
- (gnus-buffer-live-p gnus-original-article-buffer))
+ (gnus-buffer-live-p gnus-original-article-buffer)
+ (not (re-search-forward "^Face:[\t ]*" nil t)))
(set-buffer gnus-original-article-buffer))
(save-restriction
(mail-narrow-to-head)
(while (gnus-article-goto-header "Face")
- (setq faces (nconc faces (list (mail-header-field-value)))))))
- (dolist (face faces)
- (let ((png (gnus-convert-face-to-png face))
- image)
- (when png
- (setq image
- (apply 'gnus-create-image png 'png t
- (cdr (assq 'png gnus-face-properties-alist))))
- (gnus-article-goto-header "from")
- (when (bobp)
- (insert "From: [no `from' set]\n")
- (forward-char -17))
- (gnus-add-wash-type 'face)
- (gnus-add-image 'face image)
- (gnus-put-image image nil 'face))))))
- )))
+ (push (mail-header-field-value) faces))))
+ (when faces
+ (goto-char (point-min))
+ (let ((from (gnus-article-goto-header "from"))
+ png image)
+ (unless from
+ (insert "From:")
+ (setq from (point))
+ (insert "[no `from' set]\n"))
+ (while faces
+ (when (setq png (gnus-convert-face-to-png (pop faces)))
+ (setq image
+ (apply 'gnus-create-image png 'png t
+ (cdr (assq 'png gnus-face-properties-alist))))
+ (goto-char from)
+ (gnus-add-wash-type 'face)
+ (gnus-add-image 'face image)
+ (gnus-put-image image nil 'face))))))))))
(defun article-display-x-face (&optional force)
"Look for an X-Face header and display it if present."
(gnus-delete-images 'xface)
;; Display X-Faces.
(let (x-faces from face)
- (save-excursion
+ (save-current-buffer
(when (and wash-face-p
- (progn
- (goto-char (point-min))
- (not (re-search-forward
- "^X-Face\\(-[0-9]+\\)?:[\t ]*" nil t)))
- (gnus-buffer-live-p gnus-original-article-buffer))
+ (gnus-buffer-live-p gnus-original-article-buffer)
+ (not (re-search-forward "^X-Face:[\t ]*" nil t)))
;; If type `W f', use gnus-original-article-buffer,
;; otherwise use the current buffer because displaying
;; RFC822 parts calls this function too.
;; single external face.
(when (stringp gnus-article-x-face-command)
(setq x-faces (list (car x-faces))))
- (while (and (setq face (pop x-faces))
- gnus-article-x-face-command
- (or force
- ;; Check whether this face is censored.
- (not gnus-article-x-face-too-ugly)
- (and gnus-article-x-face-too-ugly from
- (not (string-match gnus-article-x-face-too-ugly
- from)))))
- ;; We display the face.
- (cond ((stringp gnus-article-x-face-command)
- ;; The command is a string, so we interpret the command
- ;; as a, well, command, and fork it off.
- (let ((process-connection-type nil))
- (process-kill-without-query
- (start-process
- "article-x-face" nil shell-file-name
- shell-command-switch gnus-article-x-face-command))
- (with-temp-buffer
- (insert face)
- (process-send-region "article-x-face"
- (point-min) (point-max)))
- (process-send-eof "article-x-face")))
- ((functionp gnus-article-x-face-command)
- ;; The command is a lisp function, so we call it.
- (funcall gnus-article-x-face-command face))
- (t
- (error "%s is not a function"
- gnus-article-x-face-command)))))))))
+ (when (and x-faces
+ gnus-article-x-face-command
+ (or force
+ ;; Check whether this face is censored.
+ (not gnus-article-x-face-too-ugly)
+ (and from
+ (not (string-match gnus-article-x-face-too-ugly
+ from)))))
+ (while (setq face (pop x-faces))
+ ;; We display the face.
+ (cond ((stringp gnus-article-x-face-command)
+ ;; The command is a string, so we interpret the command
+ ;; as a, well, command, and fork it off.
+ (let ((process-connection-type nil))
+ (gnus-set-process-query-on-exit-flag
+ (start-process
+ "article-x-face" nil shell-file-name
+ shell-command-switch gnus-article-x-face-command)
+ nil)
+ (with-temp-buffer
+ (insert face)
+ (process-send-region "article-x-face"
+ (point-min) (point-max)))
+ (process-send-eof "article-x-face")))
+ ((functionp gnus-article-x-face-command)
+ ;; The command is a lisp function, so we call it.
+ (funcall gnus-article-x-face-command face))
+ (t
+ (error "%s is not a function"
+ gnus-article-x-face-command))))))))))
(defun article-decode-mime-words ()
"Decode all MIME-encoded words in the article."
(error))
gnus-newsgroup-ignored-charsets))
ct cte ctl charset format)
- (save-excursion
- (save-restriction
- (article-narrow-to-head)
- (setq ct (message-fetch-field "Content-Type" t)
- cte (message-fetch-field "Content-Transfer-Encoding" t)
- ctl (and ct (ignore-errors
- (mail-header-parse-content-type ct)))
- charset (cond
- (prompt
- (mm-read-coding-system "Charset to decode: "))
- (ctl
- (mail-content-type-get ctl 'charset)))
- format (and ctl (mail-content-type-get ctl 'format)))
- (when cte
- (setq cte (mail-header-strip cte)))
- (if (and ctl (not (string-match "/" (car ctl))))
- (setq ctl nil))
- (goto-char (point-max)))
- (forward-line 1)
- (save-restriction
- (narrow-to-region (point) (point-max))
- (when (and (eq mail-parse-charset 'gnus-decoded)
- (eq (mm-body-7-or-8) '8bit))
- ;; The text code could have been decoded.
- (setq charset mail-parse-charset))
- (when (and (or (not ctl)
- (equal (car ctl) "text/plain"))
- (not format)) ;; article with format will decode later.
- (mm-decode-body
- charset (and cte (intern (downcase
- (gnus-strip-whitespace cte))))
- (car ctl)))))))
+ (save-excursion
+ (save-restriction
+ (article-narrow-to-head)
+ (setq ct (message-fetch-field "Content-Type" t)
+ cte (message-fetch-field "Content-Transfer-Encoding" t)
+ ctl (and ct (mail-header-parse-content-type ct))
+ charset (cond
+ (prompt
+ (mm-read-coding-system "Charset to decode: "))
+ (ctl
+ (mail-content-type-get ctl 'charset)))
+ format (and ctl (mail-content-type-get ctl 'format)))
+ (when cte
+ (setq cte (mail-header-strip cte)))
+ (if (and ctl (not (string-match "/" (car ctl))))
+ (setq ctl nil))
+ (goto-char (point-max)))
+ (forward-line 1)
+ (save-restriction
+ (narrow-to-region (point) (point-max))
+ (when (and (eq mail-parse-charset 'gnus-decoded)
+ (eq (mm-body-7-or-8) '8bit))
+ ;; The text code could have been decoded.
+ (setq charset mail-parse-charset))
+ (when (and (or (not ctl)
+ (equal (car ctl) "text/plain"))
+ (not format)) ;; article with format will decode later.
+ (mm-decode-body
+ charset (and cte (intern (downcase
+ (gnus-strip-whitespace cte))))
+ (car ctl)))))))
(defun article-decode-encoded-words ()
"Remove encoded-word encoding from headers."
(autoload 'idna-to-unicode "idna")
(defun article-decode-idna-rhs ()
- "Decode IDNA strings in RHS in From:, To: and Cc: headers in current buffer."
+ "Decode IDNA strings in RHS in various headers in current buffer.
+The following headers are decoded: From:, To:, Cc:, Reply-To:,
+Mail-Reply-To: and Mail-Followup-To:."
(when gnus-use-idna
(save-restriction
(let ((inhibit-point-motion-hooks t)
(inhibit-read-only t))
(article-narrow-to-head)
(goto-char (point-min))
- (while (re-search-forward "@.*\\(xn--[-A-Za-z0-9.]*\\)[ \t\n\r,>]" nil t)
+ (while (re-search-forward "@[^ \t\n\r,>]*\\(xn--[-A-Za-z0-9.]*\\)[ \t\n\r,>]" nil t)
(let (ace unicode)
(when (save-match-data
(and (setq ace (match-string 1))
(save-excursion
(and (re-search-backward "^[^ \t]" nil t)
- (looking-at "From\\|To\\|Cc")))
+ (looking-at "From\\|To\\|Cc\\|Reply-To\\|Mail-Reply-To\\|Mail-Followup-To")))
(setq unicode (idna-to-unicode ace))))
(unless (string= ace unicode)
(replace-match unicode nil nil nil 1)))))))))
(setq type
(gnus-fetch-field "content-transfer-encoding"))
(let* ((ct (gnus-fetch-field "content-type"))
- (ctl (and ct
- (ignore-errors
- (mail-header-parse-content-type ct)))))
+ (ctl (and ct (mail-header-parse-content-type ct))))
(setq charset (and ctl
(mail-content-type-get ctl 'charset)))
(if (stringp charset)
(setq type
(gnus-fetch-field "content-transfer-encoding"))
(let* ((ct (gnus-fetch-field "content-type"))
- (ctl (and ct
- (ignore-errors
- (mail-header-parse-content-type ct)))))
+ (ctl (and ct (mail-header-parse-content-type ct))))
(setq charset (and ctl
(mail-content-type-get ctl 'charset)))
(if (stringp charset)
(defun article-wash-html (&optional read-charset)
"Format an HTML article.
-If READ-CHARSET, ask for a coding system."
+If READ-CHARSET, ask for a coding system. If it is a number, the
+charset defined in `gnus-summary-show-article-charset-alist' is used."
(interactive "P")
(save-excursion
(let ((inhibit-read-only t)
charset)
- (when (gnus-buffer-live-p gnus-original-article-buffer)
- (with-current-buffer gnus-original-article-buffer
- (let* ((ct (gnus-fetch-field "content-type"))
- (ctl (and ct
- (ignore-errors
- (mail-header-parse-content-type ct)))))
- (setq charset (and ctl
- (mail-content-type-get ctl 'charset)))
- (when (stringp charset)
- (setq charset (intern (downcase charset)))))))
- (when read-charset
- (setq charset (mm-read-coding-system "Charset: " charset)))
- (unless charset
- (setq charset gnus-newsgroup-charset))
+ (if read-charset
+ (if (or (and (numberp read-charset)
+ (setq charset
+ (cdr
+ (assq read-charset
+ gnus-summary-show-article-charset-alist))))
+ (setq charset (mm-read-coding-system "Charset: ")))
+ (let ((gnus-summary-show-article-charset-alist
+ (list (cons 1 charset))))
+ (with-current-buffer gnus-summary-buffer
+ (gnus-summary-show-article 1)))
+ (error "No charset is given"))
+ (when (gnus-buffer-live-p gnus-original-article-buffer)
+ (with-current-buffer gnus-original-article-buffer
+ (let* ((ct (gnus-fetch-field "content-type"))
+ (ctl (and ct (mail-header-parse-content-type ct))))
+ (setq charset (and ctl
+ (mail-content-type-get ctl 'charset)))
+ (when (stringp charset)
+ (setq charset (intern (downcase charset)))))))
+ (unless charset
+ (setq charset gnus-newsgroup-charset)))
(article-goto-body)
(save-window-excursion
(save-restriction
(defun gnus-article-wash-html-with-w3m ()
"Wash the current buffer with emacs-w3m."
(mm-setup-w3m)
- (save-restriction
- (narrow-to-region (point) (point-max))
- (let ((w3m-safe-url-regexp mm-w3m-safe-url-regexp)
- w3m-force-redisplay)
- (w3m-region (point-min) (point-max)))
- (when (and mm-inline-text-html-with-w3m-keymap
- (boundp 'w3m-minor-mode-map)
- w3m-minor-mode-map)
- (add-text-properties
- (point-min) (point-max)
- (list 'keymap w3m-minor-mode-map
- ;; Put the mark meaning this part was rendered by emacs-w3m.
- 'mm-inline-text-html-with-w3m t)))))
+ (let ((w3m-safe-url-regexp mm-w3m-safe-url-regexp)
+ w3m-force-redisplay)
+ (w3m-region (point-min) (point-max)))
+ (when (and mm-inline-text-html-with-w3m-keymap
+ (boundp 'w3m-minor-mode-map)
+ w3m-minor-mode-map)
+ (add-text-properties
+ (point-min) (point-max)
+ (list 'keymap w3m-minor-mode-map
+ ;; Put the mark meaning this part was rendered by emacs-w3m.
+ 'mm-inline-text-html-with-w3m t))))
+
+(eval-when-compile (defvar charset)) ;; Bound by `article-wash-html'.
+
+(defun gnus-article-wash-html-with-w3m-standalone ()
+ "Wash the current buffer with w3m."
+ (if (mm-w3m-standalone-supports-m17n-p)
+ (progn
+ (unless (mm-coding-system-p charset) ;; Bound by `article-wash-html'.
+ ;; The default.
+ (setq charset 'iso-8859-1))
+ (let ((coding-system-for-write charset)
+ (coding-system-for-read charset))
+ (call-process-region
+ (point-min) (point-max)
+ "w3m" t t nil "-dump" "-T" "text/html"
+ "-I" (symbol-name charset) "-O" (symbol-name charset))))
+ (mm-inline-wash-with-stdin nil "w3m" "-dump" "-T" "text/html")))
+
+(defvar gnus-article-browse-html-temp-list nil
+ "List of temporary files created by `gnus-article-browse-html-parts'.
+Internal variable.")
+
+(defcustom gnus-article-browse-delete-temp 'ask
+ "What to do with temporary files from `gnus-article-browse-html-parts'.
+If nil, don't delete temporary files. If it is t, delete them on
+exit from the summary buffer. If it is the symbol `file', query
+on each file, if it is `ask' ask once when exiting from the
+summary buffer."
+ :group 'gnus-article
+ :type '(choice (const :tag "Don't delete" nil)
+ (const :tag "Don't ask" t)
+ (const :tag "Ask" ask)
+ (const :tag "Ask for each file" file)))
+
+;; Cf. mm-postponed-undisplay-list / mm-destroy-postponed-undisplay-list.
+
+(defun gnus-article-browse-delete-temp-files (&optional how)
+ "Delete temp-files created by `gnus-article-browse-html-parts'."
+ (when (and gnus-article-browse-html-temp-list
+ (or how
+ (setq how gnus-article-browse-delete-temp)))
+ (when (and (eq how 'ask)
+ (y-or-n-p (format
+ "Delete all %s temporary HTML file(s)? "
+ (length gnus-article-browse-html-temp-list)))
+ (setq how t)))
+ (dolist (file gnus-article-browse-html-temp-list)
+ (when (and (file-exists-p file)
+ (or (eq how t)
+ ;; `how' is neither `nil', `ask' nor `t' (i.e. `file'):
+ (gnus-y-or-n-p
+ (format "Delete temporary HTML file `%s'? " file))))
+ (delete-file file)))
+ ;; Also remove file from the list when not deleted or if file doesn't
+ ;; exist anymore.
+ (setq gnus-article-browse-html-temp-list nil))
+ gnus-article-browse-html-temp-list)
+
+(defun gnus-article-browse-html-parts (list)
+ "View all \"text/html\" parts from LIST.
+Recurse into multiparts."
+ ;; Internal function used by `gnus-article-browse-html-article'.
+ (let ((showed))
+ ;; Find and show the html-parts.
+ (dolist (handle list)
+ ;; If HTML, show it:
+ (when (listp handle)
+ (cond ((and (bufferp (car handle))
+ (string-match "text/html" (car (mm-handle-type handle))))
+ (let ((tmp-file (mm-make-temp-file
+ ;; Do we need to care for 8.3 filenames?
+ "mm-" nil ".html")))
+ (mm-save-part-to-file handle tmp-file)
+ (add-to-list 'gnus-article-browse-html-temp-list tmp-file)
+ (add-hook 'gnus-summary-prepare-exit-hook
+ 'gnus-article-browse-delete-temp-files)
+ (add-hook 'gnus-exit-gnus-hook
+ (lambda ()
+ (gnus-article-browse-delete-temp-files t)))
+ (browse-url tmp-file)
+ (setq showed t)))
+ ;; If multipart, recurse
+ ((and (stringp (car handle))
+ (string-match "^multipart/" (car handle))
+ (setq showed
+ (or showed
+ (gnus-article-browse-html-parts handle))))))))
+ showed))
+
+;; TODO: Key binding
+(defun gnus-article-browse-html-article ()
+ "View \"text/html\" parts of the current article with a WWW browser."
+ (interactive)
+ (save-window-excursion
+ ;; Open raw article and select the buffer
+ (gnus-summary-show-article t)
+ (gnus-summary-select-article-buffer)
+ (let ((parts (mm-dissect-buffer t t)))
+ ;; If singlepart, enforce a list.
+ (when (and (bufferp (car parts))
+ (stringp (car (mm-handle-type parts))))
+ (setq parts (list parts)))
+ ;; Process the list
+ (unless (gnus-article-browse-html-parts parts)
+ (gnus-error 3 "Mail doesn't contain a \"text/html\" part!"))
+ (gnus-summary-show-article))))
(defun article-hide-list-identifiers ()
"Remove list identifies from the Subject header.
(article-really-strip-banner
(gnus-parameter-banner gnus-newsgroup-name)))
(when gnus-article-address-banner-alist
- ;; It is necessary to encode from fields before checking,
- ;; because `mail-header-parse-addresses' does not work
- ;; (reliably) on decoded headers. And more, it is
- ;; impossible to use `gnus-fetch-original-field' here,
- ;; because `article-strip-banner' may be called in draft
- ;; buffers to preview them.
+ ;; Note that the From header is decoded here, so it is
+ ;; required that the *-extract-address-components function
+ ;; supports non-ASCII text.
(let ((from (save-restriction
(widen)
(article-narrow-to-head)
(mail-fetch-field "from"))))
(when (and from
(setq from
- (caar (mail-header-parse-addresses
- (mail-encode-encoded-word-string from)))))
+ (cadr (funcall gnus-extract-address-components
+ from))))
(catch 'found
(dolist (pair gnus-article-address-banner-alist)
(when (string-match (car pair) from)
(defun article-update-date-lapsed ()
"Function to be run from a timer to update the lapsed time line."
- (let (deactivate-mark)
- (save-excursion
- (ignore-errors
- (walk-windows
- (lambda (w)
- (set-buffer (window-buffer w))
- (when (eq major-mode 'gnus-article-mode)
- (let ((mark (point-marker)))
- (goto-char (point-min))
- (when (re-search-forward "^X-Sent:" nil t)
- (article-date-lapsed t))
- (goto-char (marker-position mark))
- (move-marker mark nil))))
- nil 'visible)))))
+ (save-match-data
+ (let (deactivate-mark)
+ (save-excursion
+ (ignore-errors
+ (walk-windows
+ (lambda (w)
+ (set-buffer (window-buffer w))
+ (when (eq major-mode 'gnus-article-mode)
+ (let ((mark (point-marker)))
+ (goto-char (point-min))
+ (when (re-search-forward "^X-Sent:" nil t)
+ (article-date-lapsed t))
+ (goto-char (marker-position mark))
+ (move-marker mark nil))))
+ nil 'visible))))))
(defun gnus-start-date-timer (&optional n)
"Start a timer to update the X-Sent header in the article buffers.
((null split-name)
(read-file-name
(concat prompt " (default "
- (file-name-nondirectory default-name) ") ")
+ (file-name-nondirectory default-name) "): ")
(file-name-directory default-name)
default-name))
;; A single group name is returned.
(symbol-value variable)))
(read-file-name
(concat prompt " (default "
- (file-name-nondirectory default-name) ") ")
+ (file-name-nondirectory default-name) "): ")
(file-name-directory default-name)
default-name))
;; A single split name was found
((file-exists-p name) name)
(t gnus-article-save-directory))))
(read-file-name
- (concat prompt " (default " name ") ")
+ (concat prompt " (default " name "): ")
dir name)))
;; A list of splits was found.
(t
(setq result
(expand-file-name
(read-file-name
- (concat prompt " (`M-p' for defaults) ")
+ (concat prompt " (`M-p' for defaults): ")
gnus-article-save-directory
(car split-name))
gnus-article-save-directory)))
Optional argument FILENAME specifies file name.
Directory to save to is default to `gnus-article-save-directory'."
(setq filename (gnus-read-save-file-name
- "Save %s in rmail file:" filename
+ "Save %s in rmail file" filename
gnus-rmail-save-name gnus-newsgroup-name
gnus-current-headers 'gnus-newsgroup-last-rmail))
(gnus-eval-in-buffer-window gnus-save-article-buffer
Optional argument FILENAME specifies file name.
Directory to save to is default to `gnus-article-save-directory'."
(setq filename (gnus-read-save-file-name
- "Save %s in Unix mail file:" filename
+ "Save %s in Unix mail file" filename
gnus-mail-save-name gnus-newsgroup-name
gnus-current-headers 'gnus-newsgroup-last-mail))
(gnus-eval-in-buffer-window gnus-save-article-buffer
Optional argument FILENAME specifies file name.
Directory to save to is default to `gnus-article-save-directory'."
(setq filename (gnus-read-save-file-name
- "Save %s in file:" filename
+ "Save %s in file" filename
gnus-file-save-name gnus-newsgroup-name
gnus-current-headers 'gnus-newsgroup-last-file))
(gnus-eval-in-buffer-window gnus-save-article-buffer
Optional argument FILENAME specifies file name.
The directory to save in defaults to `gnus-article-save-directory'."
(setq filename (gnus-read-save-file-name
- "Save %s body in file:" filename
+ "Save %s body in file" filename
gnus-file-save-name gnus-newsgroup-name
gnus-current-headers 'gnus-newsgroup-last-file))
(gnus-eval-in-buffer-window gnus-save-article-buffer
\\[gnus-article-describe-briefly]\t Describe the current mode briefly
\\[gnus-info-find-node]\t Go to the Gnus info node"
(interactive)
+ (kill-all-local-variables)
(gnus-simplify-mode-line)
(setq mode-name "Article")
(setq major-mode 'gnus-article-mode)
(make-local-variable 'gnus-article-charset)
(make-local-variable 'gnus-article-ignored-charsets)
;; Prevent recent Emacsen from displaying non-break space as "\ ".
- (set (make-local-variable 'show-nonbreak-escape) nil)
+ (set (make-local-variable 'nobreak-char-display) nil)
(gnus-set-default-directory)
(buffer-disable-undo)
(setq buffer-read-only t
show-trailing-whitespace nil)
(set-syntax-table gnus-article-mode-syntax-table)
(mm-enable-multibyte)
- (gnus-run-hooks 'gnus-article-mode-hook))
+ (gnus-run-mode-hooks 'gnus-article-mode-hook))
(defun gnus-article-setup-buffer ()
"Initialize the article buffer."
(gnus-mime-view-part-as-charset "C" "View As charset...")
(gnus-mime-save-part "o" "Save...")
(gnus-mime-save-part-and-strip "\C-o" "Save and Strip")
+ (gnus-mime-replace-part "r" "Replace part")
(gnus-mime-delete-part "d" "Delete part")
(gnus-mime-copy-part "c" "View As Text, In Other Buffer")
(gnus-mime-inline-part "i" "View As Text, In This Buffer")
- (gnus-mime-view-part-internally "E" "View Internally")
+ (gnus-mime-view-part-internally "E" "View Internally") ;; Why `E'?
(gnus-mime-view-part-externally "e" "View Externally")
(gnus-mime-print-part "p" "Print")
(gnus-mime-pipe-part "|" "Pipe To Command...")
(delete-region (point) (point-max))
(mm-display-parts handles))))))
+(defun gnus-article-jump-to-part (n)
+ "Jump to MIME part N."
+ (interactive "P")
+ (pop-to-buffer gnus-article-buffer)
+ ;; FIXME: why is it necessary?
+ (sit-for 0)
+ (let ((parts (length gnus-article-mime-handle-alist)))
+ (or n (setq n
+ (string-to-number
+ (read-string ;; Emacs 21 doesn't have `read-number'.
+ (format "Jump to part (2..%s): " parts)))))
+ (unless (and (integerp n) (<= n parts) (>= n 1))
+ (setq n
+ (progn
+ (gnus-message 7 "Invalid part `%s', using %s instead."
+ n parts)
+ parts)))
+ (gnus-message 9 "Jumping to part %s." n)
+ (cond ((>= gnus-auto-select-part 1)
+ (while (and (<= n parts)
+ (not (gnus-article-goto-part n)))
+ (setq n (1+ n))))
+ ((< gnus-auto-select-part 0)
+ (while (and (>= n 1)
+ (not (gnus-article-goto-part n)))
+ (setq n (1- n))))
+ (t
+ (gnus-article-goto-part n)))))
+
(eval-when-compile
- (defsubst gnus-article-edit-part (handles)
+ (defsubst gnus-article-edit-part (handles &optional current-id)
"Edit an article in order to delete a mime part.
This function is exclusively used by `gnus-mime-save-part-and-strip'
and `gnus-mime-delete-part', and not provided at run-time normally."
',gnus-newsgroup-ignored-charsets))
(mbl mml-buffer-list))
(setq mml-buffer-list nil)
- (insert-buffer gnus-original-article-buffer)
+ (insert-buffer-substring gnus-original-article-buffer)
(mime-to-mml ',handles)
(setq gnus-article-mime-handles nil)
(let ((mbl1 mml-buffer-list))
(gnus-summary-edit-article-done
,(or (mail-header-references gnus-current-headers) "")
,(gnus-group-read-only-p)
- ,gnus-summary-buffer no-highlight)))
+ ,gnus-summary-buffer no-highlight))
+ t)
(gnus-article-edit-done)
(gnus-summary-expand-window)
- (gnus-summary-show-article)))
-
-(defun gnus-mime-save-part-and-strip ()
- "Save the MIME part under point then replace it with an external body."
+ (gnus-summary-show-article)
+ (when (and current-id (integerp gnus-auto-select-part))
+ (gnus-article-jump-to-part
+ (+ current-id gnus-auto-select-part)))))
+
+(defun gnus-mime-replace-part (file)
+ "Replace MIME part under point with an external body."
+ ;; Useful if file has already been saved to disk
+ (interactive
+ (list
+ (mm-with-multibyte
+ (read-file-name "Replace MIME part with file: "
+ (or mm-default-directory default-directory)
+ nil nil))))
+ (gnus-mime-save-part-and-strip file))
+
+(defun gnus-mime-save-part-and-strip (&optional file)
+ "Save the MIME part under point then replace it with an external body.
+If FILE is given, use it for the external part."
(interactive)
(gnus-article-check-buffer)
(when (gnus-group-read-only-p)
(when (mm-complicated-handles gnus-article-mime-handles)
(error "\
The current article has a complicated MIME structure, giving up..."))
- (when (gnus-yes-or-no-p "\
-Deleting parts may malfunction or destroy the article; continue? ")
- (let* ((data (get-text-property (point) 'gnus-data))
- file param
- (handles gnus-article-mime-handles))
- (setq file (and data (mm-save-part data)))
- (when file
- (with-current-buffer (mm-handle-buffer data)
- (erase-buffer)
- (insert "Content-Type: " (mm-handle-media-type data))
- (mml-insert-parameter-string (cdr (mm-handle-type data))
- '(charset))
- (insert "\n")
- (insert "Content-ID: " (message-make-message-id) "\n")
- (insert "Content-Transfer-Encoding: binary\n")
- (insert "\n"))
- (setcdr data
- (cdr (mm-make-handle nil
- `("message/external-body"
- (access-type . "LOCAL-FILE")
- (name . ,file)))))
- (set-buffer gnus-summary-buffer)
- (gnus-article-edit-part handles)))))
+ (let* ((data (get-text-property (point) 'gnus-data))
+ (id (get-text-property (point) 'gnus-part))
+ param
+ (handles gnus-article-mime-handles))
+ (unless file
+ (setq file
+ (and data (mm-save-part data "Delete MIME part and save to: "))))
+ (when file
+ (with-current-buffer (mm-handle-buffer data)
+ (erase-buffer)
+ (insert "Content-Type: " (mm-handle-media-type data))
+ (mml-insert-parameter-string (cdr (mm-handle-type data))
+ '(charset))
+ ;; Add a filename for the sake of saving the part again.
+ (mml-insert-parameter
+ (mail-header-encode-parameter "name" (file-name-nondirectory file)))
+ (insert "\n")
+ (insert "Content-ID: " (message-make-message-id) "\n")
+ (insert "Content-Transfer-Encoding: binary\n")
+ (insert "\n"))
+ (setcdr data
+ (cdr (mm-make-handle nil
+ `("message/external-body"
+ (access-type . "LOCAL-FILE")
+ (name . ,file)))))
+ ;; (set-buffer gnus-summary-buffer)
+ (gnus-article-edit-part handles id))))
+
+;; A function like `gnus-summary-save-parts' (`X m', `<MIME> <Extract all
+;; parts...>') but with stripping would be nice.
(defun gnus-mime-delete-part ()
"Delete the MIME part under point.
(when (mm-complicated-handles gnus-article-mime-handles)
(error "\
The current article has a complicated MIME structure, giving up..."))
- (when (gnus-yes-or-no-p "\
-Deleting parts may malfunction or destroy the article; continue? ")
+ (when (or gnus-expert-user
+ (gnus-yes-or-no-p "\
+Deleting parts may malfunction or destroy the article; continue? "))
(let* ((data (get-text-property (point) 'gnus-data))
+ (id (get-text-property (point) 'gnus-part))
(handles gnus-article-mime-handles)
(none "(none)")
(description
nil `("text/plain") nil nil
(list "attachment")
(format "Deleted attachment (%s bytes)" bsize))))))
- (set-buffer gnus-summary-buffer)
- (gnus-article-edit-part handles))))
+ ;; (set-buffer gnus-summary-buffer)
+ (gnus-article-edit-part handles id))))
(defun gnus-mime-save-part ()
"Save the MIME part under point."
(defun gnus-mime-view-part-as-type-internal ()
(gnus-article-check-buffer)
- (let* ((name (mail-content-type-get
- (mm-handle-type (get-text-property (point) 'gnus-data))
- 'name))
+ (let* ((handle (get-text-property (point) 'gnus-data))
+ (name (or
+ ;; Content-Type: foo/bar; name=...
+ (mail-content-type-get (mm-handle-type handle) 'name)
+ ;; Content-Disposition: attachment; filename=...
+ (cdr (assq 'filename (cdr (mm-handle-disposition handle))))))
(def-type (and name (mm-default-file-encoding name))))
(and def-type (cons def-type 0))))
"Choose a MIME media type, and view the part as such."
(interactive)
(unless mime-type
- (setq mime-type (completing-read
- "View as MIME type: "
- (mapcar #'list (mailcap-mime-types))
- nil nil
- (gnus-mime-view-part-as-type-internal))))
+ (setq mime-type
+ (let ((default (gnus-mime-view-part-as-type-internal)))
+ (completing-read
+ (format "View as MIME type (default %s): "
+ (car default))
+ (mapcar #'list (mailcap-mime-types))
+ nil nil nil nil
+ (car default)))))
(gnus-article-check-buffer)
(let ((handle (get-text-property (point) 'gnus-data)))
(when handle
+ (when (equal (mm-handle-media-type handle) "message/external-body")
+ (unless (mm-handle-cache handle)
+ (mm-extern-cache-contents handle))
+ (setq handle (mm-handle-cache handle)))
(setq handle
(mm-make-handle (mm-handle-buffer handle)
(cons mime-type (cdr (mm-handle-type handle)))
(and charset
(setq coding-system
(mm-charset-to-coding-system charset))
- (not (eq charset 'ascii))))
+ (not (eq coding-system 'ascii))))
(mm-decode-coding-string contents coding-system)
(mm-string-to-multibyte contents)))
(goto-char b)))))
(if action-pair
(funcall (cdr action-pair)))))
-(defun gnus-article-part-wrapper (n function)
- (with-current-buffer gnus-article-buffer
- (when (> n (length gnus-article-mime-handle-alist))
- (error "No such part"))
- (gnus-article-goto-part n)
- (let ((handle (cdr (assq n gnus-article-mime-handle-alist))))
- (funcall function handle))))
+(defun gnus-article-part-wrapper (n function &optional no-handle interactive)
+ "Call FUNCTION on MIME part N.
+Unless NO-HANDLE, call FUNCTION with N-th MIME handle as it's only argument.
+If INTERACTIVE, call FUNCTION interactivly."
+ (let (window frame)
+ ;; Check whether the article is displayed.
+ (unless (and (gnus-buffer-live-p gnus-article-buffer)
+ (setq window (get-buffer-window gnus-article-buffer t))
+ (frame-visible-p (setq frame (window-frame window))))
+ (error "No article is displayed"))
+ (with-current-buffer gnus-article-buffer
+ ;; Check whether the article displays the right contents.
+ (unless (with-current-buffer gnus-summary-buffer
+ (eq gnus-current-article (gnus-summary-article-number)))
+ (error "You should select the right article first"))
+ ;; Check whether the specified part exists.
+ (when (> n (length gnus-article-mime-handle-alist))
+ (error "No such part")))
+ (unless
+ (progn
+ ;; To select the window is needed so that the cursor
+ ;; might be visible on the MIME button.
+ (select-window (prog1
+ window
+ (setq window (selected-window))
+ ;; Article may be displayed in the other frame.
+ (gnus-select-frame-set-input-focus
+ (prog1
+ frame
+ (setq frame (selected-frame))))))
+ (when (gnus-article-goto-part n)
+ ;; We point the cursor and the arrow at the MIME button
+ ;; when the `function' prompt the user for something.
+ (let ((cursor-in-non-selected-windows t)
+ (overlay-arrow-string "=>")
+ (overlay-arrow-position (point-marker)))
+ (unwind-protect
+ (cond
+ ((and no-handle interactive)
+ (call-interactively function))
+ (no-handle
+ (funcall function))
+ (interactive
+ (call-interactively
+ function
+ (cdr (assq n gnus-article-mime-handle-alist))))
+ (t
+ (funcall function
+ (cdr (assq n gnus-article-mime-handle-alist)))))
+ (set-marker overlay-arrow-position nil)
+ (unless gnus-auto-select-part
+ (gnus-select-frame-set-input-focus frame)
+ (select-window window))))
+ t))
+ (if gnus-inhibit-mime-unbuttonizing
+ ;; This is the default though the program shouldn't reach here.
+ (error "No such part")
+ ;; The part which doesn't have the MIME button is selected.
+ ;; So, we display all the buttons and redo it.
+ (let ((gnus-inhibit-mime-unbuttonizing t))
+ (gnus-summary-show-article)
+ (gnus-article-part-wrapper n function no-handle))))))
(defun gnus-article-pipe-part (n)
"Pipe MIME part N, which is the numerical prefix."
(interactive "p")
(gnus-article-part-wrapper n 'gnus-mime-inline-part))
+(defun gnus-article-save-part-and-strip (n)
+ "Save MIME part N and replace it with an external body.
+N is the numerical prefix."
+ (interactive "p")
+ (gnus-article-part-wrapper n 'gnus-mime-save-part-and-strip t))
+
+(defun gnus-article-replace-part (n)
+ "Replace MIME part N with an external body.
+N is the numerical prefix."
+ (interactive "p")
+ (gnus-article-part-wrapper n 'gnus-mime-replace-part t t))
+
+(defun gnus-article-delete-part (n)
+ "Delete MIME part N and add some information about the removed part.
+N is the numerical prefix."
+ (interactive "p")
+ (gnus-article-part-wrapper n 'gnus-mime-delete-part t))
+
(defun gnus-article-mime-match-handle-first (condition)
(if condition
(let (n)
(defun gnus-mime-display-part (handle)
(cond
+ ;; Maybe a broken MIME message.
+ ((null handle))
;; Single part.
((not (stringp (car handle)))
(gnus-mime-display-single handle))
(let ((id (1+ (length gnus-article-mime-handle-alist)))
beg)
(push (cons id handle) gnus-article-mime-handle-alist)
+ (when (and display
+ (equal (mm-handle-media-supertype handle) "message"))
+ (insert-char
+ ?\n
+ (cond ((not (bolp)) 2)
+ ((or (bobp) (eq (char-before (1- (point))) ?\n)) 0)
+ (t 1))))
(when (or (not display)
(not (gnus-unbuttonized-mime-type-p type)))
(gnus-insert-mime-button
(forward-line -1)
(setq beg (point)))
(gnus-article-insert-newline)
- (mm-display-inline handle)
+ (mm-insert-inline
+ handle
+ (let ((charset (mail-content-type-get (mm-handle-type handle)
+ 'charset)))
+ (cond ((not charset)
+ (mm-string-as-multibyte (mm-get-part handle)))
+ ((eq charset 'gnus-decoded)
+ (with-current-buffer (mm-handle-buffer handle)
+ (buffer-string)))
+ (t
+ (mm-decode-string (mm-get-part handle) charset)))))
(goto-char (point-max))))
;; Do highlighting.
(save-excursion
,gnus-mouse-face-prop ,gnus-article-mouse-face
face ,gnus-article-button-face
gnus-part ,id
- gnus-data ,handle))
+ article-type multipart))
(widget-convert-button 'link from (point)
:action 'gnus-widget-press-button
:button-keymap gnus-widget-button-keymap)
(gnus-article-next-page-1 lines)
nil))
+(defmacro gnus-article-beginning-of-window ()
+ "Move point to the beginning of the window.
+In Emacs, the point is placed at the line number which `scroll-margin'
+specifies."
+ (if (featurep 'xemacs)
+ '(move-to-window-line 0)
+ '(move-to-window-line
+ (min (max 0 scroll-margin)
+ (max 1 (- (window-height)
+ (if mode-line-format 1 0)
+ (if header-line-format 1 0)))))))
+
(defun gnus-article-next-page-1 (lines)
- (let ((scroll-in-place nil))
- (condition-case ()
- (scroll-up lines)
- (end-of-buffer
- ;; Long lines may cause an end-of-buffer error.
- (goto-char (point-max)))))
- (move-to-window-line 0))
+ (when (and (not (featurep 'xemacs))
+ (numberp lines)
+ (> lines 0)
+ (numberp (symbol-value 'scroll-margin))
+ (> (symbol-value 'scroll-margin) 0))
+ ;; Protect against the bug that Emacs 21.x hangs up when scrolling up for
+ ;; too many number of lines if `scroll-margin' is set as two or greater.
+ (setq lines (min lines
+ (max 0 (- (count-lines (window-start) (point-max))
+ (symbol-value 'scroll-margin))))))
+ (condition-case ()
+ (let ((scroll-in-place nil))
+ (scroll-up lines))
+ (end-of-buffer
+ ;; Long lines may cause an end-of-buffer error.
+ (goto-char (point-max))))
+ (gnus-article-beginning-of-window))
(defun gnus-article-prev-page (&optional lines)
"Show previous page of current article.
(gnus-narrow-to-page -1) ;Go to previous page.
(goto-char (point-max))
(recenter -1))
- (let ((scroll-in-place nil))
- (prog1
- (condition-case ()
- (scroll-down lines)
- (beginning-of-buffer
- (goto-char (point-min))))
- (move-to-window-line 0)))))
+ (prog1
+ (condition-case ()
+ (let ((scroll-in-place nil))
+ (scroll-down lines))
+ (beginning-of-buffer
+ (goto-char (point-min))))
+ (gnus-article-beginning-of-window))))
(defun gnus-article-only-boring-p ()
"Decide whether there is only boring text remaining in the article.
(boundp 'gnus-article-boring-faces)
(symbol-value 'gnus-article-boring-faces))
(save-excursion
- (catch 'only-boring
- (while (re-search-forward "\\b\\w\\w" nil t)
- (forward-char -1)
- (when (not (gnus-intersection
- (gnus-faces-at (point))
- (symbol-value 'gnus-article-boring-faces)))
- (throw 'only-boring nil)))
- (throw 'only-boring t)))))
+ (let ((inhibit-point-motion-hooks t))
+ (catch 'only-boring
+ (while (re-search-forward "\\b\\w\\w" nil t)
+ (forward-char -1)
+ (when (not (gnus-intersection
+ (gnus-faces-at (point))
+ (symbol-value 'gnus-article-boring-faces)))
+ (throw 'only-boring nil)))
+ (throw 'only-boring t))))))
(defun gnus-article-refer-article ()
"Read article specified by message-id around point."
,(or (mail-header-references gnus-current-headers) "")
,(gnus-group-read-only-p) ,gnus-summary-buffer no-highlight))))
-(defun gnus-article-edit-article (start-func exit-func)
+(defun gnus-article-edit-article (start-func exit-func &optional quiet)
"Start editing the contents of the current article buffer."
(let ((winconf (current-window-configuration)))
(set-buffer gnus-article-buffer)
(gnus-configure-windows 'edit-article)
(setq gnus-article-edit-done-function exit-func)
(setq gnus-prev-winconf winconf)
- (gnus-message 6 "C-c C-c to end edits")))
+ (unless quiet
+ (gnus-message 6 "C-c C-c to end edits"))))
(defun gnus-article-edit-done (&optional arg)
"Update the article edits and exit."
(window-start (window-start)))
(erase-buffer)
(if (gnus-buffer-live-p gnus-original-article-buffer)
- (insert-buffer gnus-original-article-buffer))
+ (insert-buffer-substring gnus-original-article-buffer))
(let ((winconf gnus-prev-winconf))
(kill-all-local-variables)
(gnus-article-mode)
:group 'gnus-article-buttons
:type 'regexp)
+;; Regexp suggested by Felix Wiemann in <87oeuomcz9.fsf@news2.ososo.de>
+(defcustom gnus-button-valid-localpart-regexp
+ "[a-z0-9$%(*-=?[_][^<>\")!;:,{}\n\t ]*"
+ "Regular expression that matches a localpart of mail addresses or MIDs."
+ :version "22.1"
+ :group 'gnus-article-buttons
+ :type 'regexp)
+
(defcustom gnus-button-man-handler 'manual-entry
"Function to use for displaying man pages.
The function must take at least one argument with a string naming the
(regexp :tag "Other")))
(defcustom gnus-button-ctan-directory-regexp
- (concat
- "\\(?:"
- "biblio\\|digests\\|dviware\\|fonts\\|graphics\\|help\\|"
- "indexing\\|info\\|language\\|macros\\|support\\|systems\\|"
- "tds\\|tools\\|usergrps\\|web\\|nonfree\\|obsolete"
- "\\)")
+ (regexp-opt
+ (list "archive-tools" "biblio" "bibliography" "digests" "documentation"
+ "dviware" "fonts" "graphics" "help" "indexing" "info" "language"
+ "languages" "macros" "nonfree" "obsolete" "support" "systems"
+ "tds" "tools" "usergrps" "web") t)
"Regular expression for ctan directories.
It should match all directories in the top level of `gnus-ctan-url'."
:version "22.1"
:type 'regexp)
(defcustom gnus-button-mid-or-mail-regexp
- (concat "\\b\\(<?[a-z0-9$%(*-=?[_][^<>\")!;:,{}\n\t ]*@"
- ;; Felix Wiemann in <87oeuomcz9.fsf@news2.ososo.de>
+ (concat "\\b\\(<?" gnus-button-valid-localpart-regexp "@"
gnus-button-valid-fqdn-regexp
">?\\)\\b")
"Regular expression that matches a message ID or a mail address."
(gnus-url-mailto url-mailto))
(t (gnus-message 3 "Invalid string.")))))
-(defun gnus-button-handle-custom (url)
- "Follow a Custom URL."
- (customize-apropos (gnus-url-unhex-string url)))
+(defun gnus-button-handle-custom (fun arg)
+ "Call function FUN on argument ARG.
+Both FUN and ARG are supposed to be strings. ARG will be passed
+as a symbol to FUN."
+ (funcall (intern fun) (intern arg)))
(defvar gnus-button-handle-describe-prefix "^\\(C-h\\|<?[Ff]1>?\\)")
(defcustom gnus-button-alist
'(("<\\(url:[>\n\t ]*?\\)?\\(nntp\\|news\\):[>\n\t ]*\\([^>\n\t ]*@[^>\n\t ]*\\)>"
0 (>= gnus-button-message-level 0) gnus-button-handle-news 3)
- ("\\b\\(nntp\\|news\\):\\([^>\n\t ]*@[^>)!;:,\n\t ]*\\)" 0 t
- gnus-button-handle-news 2)
+ ((concat "\\b\\(nntp\\|news\\):\\("
+ gnus-button-valid-localpart-regexp "@[a-z0-9.-]+[a-z]\\)")
+ 0 t gnus-button-handle-news 2)
("\\(\\b<\\(url:[>\n\t ]*\\)?\\(nntp\\|news\\):[>\n\t ]*\\(//\\)?\\([^>\n\t ]*\\)>\\)"
1 (>= gnus-button-message-level 0) gnus-button-fetch-group 5)
("\\b\\(nntp\\|news\\):\\(//\\)?\\([^'\">\n\t ]+\\)"
;; Info links like `C-h i d m CC Mode RET'
0 (>= gnus-button-emacs-level 1) gnus-button-handle-info-keystrokes 2)
;; This is custom
- ("\\bcustom:\\(//\\)?\\([^'\">\n\t ]+\\)"
- 0 (>= gnus-button-emacs-level 5) gnus-button-handle-custom 2)
- ("M-x[ \t\n]customize-[^ ]+[ \t\n]RET[ \t\n]\\([^ ]+\\)[ \t\n]RET" 0
- (>= gnus-button-emacs-level 1) gnus-button-handle-custom 1)
+ ("M-x[ \t\n]\\(customize-[^ ]+\\)[ \t\n]RET[ \t\n]\\([^ ]+\\)[ \t\n]RET" 0
+ (>= gnus-button-emacs-level 1) gnus-button-handle-custom 1 2)
;; Emacs help commands
("M-x[ \t\n]+apropos[ \t\n]+RET[ \t\n]+\\([^ \t\n]+\\)[ \t\n]+RET"
;; regexp doesn't match arguments containing ` '.
(defun gnus-article-highlight-signature ()
"Highlight the signature in an article.
It does this by highlighting everything after
-`gnus-signature-separator' using `gnus-signature-face'."
+`gnus-signature-separator' using the face `gnus-signature'."
(interactive)
(gnus-with-article-buffer
(let ((inhibit-point-motion-hooks t))
(match-string 3 address)
"nntp")))
nil nil nil
- (and (match-end 6) (list (string-to-int (match-string 6 address))))))))
+ (and (match-end 6) (list (string-to-number (match-string 6 address))))))))
(defun gnus-url-parse-query-string (query &optional downcase)
(let (retval pairs cur key val)
t)
((eq val 'head)
nil)
+ ((eq val 'first)
+ (eq part-number 1))
((eq val 'last)
(eq part-number total-parts))
((numberp val)
current-prefix-arg))
(let ((func (cdr (assoc protocol gnus-article-encrypt-protocol-alist))))
(unless func
- (error (format "Can't find the encrypt protocol %s" protocol)))
+ (error "Can't find the encrypt protocol %s" protocol))
(if (member gnus-newsgroup-name '("nndraft:delayed"
"nndraft:drafts"
"nndraft:queue"))
(?d gnus-tmp-details ?s)
(?D gnus-tmp-pressed-details ?s)))
+(defvar gnus-mime-security-button-commands
+ '((gnus-article-press-button "\r" "Show Detail")
+ (undefined "v")
+ (undefined "t")
+ (undefined "C")
+ (gnus-mime-security-save-part "o" "Save...")
+ (undefined "\C-o")
+ (undefined "r")
+ (undefined "d")
+ (undefined "c")
+ (undefined "i")
+ (undefined "E")
+ (undefined "e")
+ (undefined "p")
+ (gnus-mime-security-pipe-part "|" "Pipe To Command...")
+ (undefined ".")))
+
(defvar gnus-mime-security-button-map
(let ((map (make-sparse-keymap)))
(define-key map gnus-mouse-2 'gnus-article-push-button)
- (define-key map "\r" 'gnus-article-press-button)
+ (define-key map gnus-down-mouse-3 'gnus-mime-security-button-menu)
+ (dolist (c gnus-mime-security-button-commands)
+ (define-key map (cadr c) (car c)))
map))
+(easy-menu-define
+ gnus-mime-security-button-menu gnus-mime-security-button-map
+ "Security button menu."
+ `("Security Part"
+ ,@(delq nil
+ (mapcar (lambda (c)
+ (unless (eq (car c) 'undefined)
+ (vector (caddr c) (car c) :enable t)))
+ gnus-mime-security-button-commands))))
+
+(defun gnus-mime-security-button-menu (event prefix)
+ "Construct a context-sensitive menu of security commands."
+ (interactive "e\nP")
+ (save-window-excursion
+ (let ((pos (event-start event)))
+ (select-window (posn-window pos))
+ (goto-char (posn-point pos))
+ (gnus-article-check-buffer)
+ (popup-menu gnus-mime-security-button-menu nil prefix))))
+
(defvar gnus-mime-security-details-buffer nil)
(defvar gnus-mime-security-button-pressed nil)
(when (boundp 'help-echo-owns-message)
(setq help-echo-owns-message t))
(format
- "%S: show detail"
- (aref gnus-mouse-2 0))))))
+ "%S: show detail; %S: more options"
+ (aref gnus-mouse-2 0)
+ (aref gnus-down-mouse-3 0))))))
(defun gnus-mime-display-security (handle)
(save-restriction
(narrow-to-region (point) (point))
(unless (gnus-unbuttonized-mime-type-p (car handle))
(gnus-insert-mime-security-button handle))
- (gnus-mime-display-mixed (cdr handle))
+ (gnus-mime-display-part (cadr handle))
(unless (bolp)
(insert "\n"))
(unless (gnus-unbuttonized-mime-type-p (car handle))
(cons (set-marker (make-marker) (point-min))
(set-marker (make-marker) (point-max))))))
+(defun gnus-mime-security-run-function (function)
+ "Run FUNCTION with the security part under point."
+ (gnus-article-check-buffer)
+ (let ((data (get-text-property (point) 'gnus-data))
+ buffer handle)
+ (when (and (stringp (car-safe data))
+ (setq buffer (mm-handle-multipart-original-buffer data))
+ (setq handle (cadr data)))
+ (if (bufferp (mm-handle-buffer handle))
+ (progn
+ (setq handle (cons buffer (copy-sequence (cdr handle))))
+ (mm-handle-set-undisplayer handle nil))
+ (setq handle (mm-make-handle
+ buffer
+ (mm-handle-multipart-ctl-parameter handle 'protocol)
+ nil nil nil nil nil nil)))
+ (funcall function handle))))
+
+(defun gnus-mime-security-save-part ()
+ "Save the security part under point."
+ (interactive)
+ (gnus-mime-security-run-function 'mm-save-part))
+
+(defun gnus-mime-security-pipe-part ()
+ "Pipe the security part under point to a process."
+ (interactive)
+ (gnus-mime-security-run-function 'mm-pipe-part))
+
(gnus-ems-redefine)
(provide 'gnus-art)
;;; gnus-async.el --- asynchronous support for Gnus
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2003
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; gnus-audio.el --- Sound effects for Gnus
-;; Copyright (C) 1996, 2000, 2003 Free Software Foundation
+
+;; Copyright (C) 1996, 2000, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Steven L. Baur <steve@miranova.com>
;; Keywords: news, mail, multimedia
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; gnus-bcklg.el --- backlog functions for Gnus
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; gnus-cache.el --- cache interface for Gnus
+
;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
-;; 2004, 2005 Free Software Foundation, Inc.
+;; 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(let ((alist (gnus-agent-load-alist gnus-newsgroup-name)))
(unless (cdr (assoc article alist))
(setq gnus-newsgroup-undownloaded
- (gnus-add-to-sorted-list
+ (gnus-add-to-sorted-list
gnus-newsgroup-undownloaded article)))))
(push article out))
(gnus-summary-update-download-mark article)
articles)
(when (file-exists-p dir)
(setq articles
- (sort (mapcar (lambda (name) (string-to-int name))
+ (sort (mapcar (lambda (name) (string-to-number name))
(directory-files dir nil "^[0-9]+$" t))
'<))
;; Update the cache active file, just to synch more.
;; Separate articles from all other files and directories.
(while files
(if (string-match "^[0-9]+$" (file-name-nondirectory (car files)))
- (push (string-to-int (file-name-nondirectory (pop files))) nums)
+ (push (string-to-number (file-name-nondirectory (pop files))) nums)
(push (pop files) alphs)))
;; If we have nums, then this is probably a valid group.
(when (setq nums (sort nums '<))
;;;###autoload
(defun gnus-cache-rename-group (old-group new-group)
- "Rename OLD-GROUP as NEW-GROUP. Always updates the cache, even when
-disabled, as the old cache files would corrupt gnus when the cache was
-next enabled. Depends upon the caller to determine whether group renaming is supported."
+ "Rename OLD-GROUP as NEW-GROUP.
+Always updates the cache, even when disabled, as the old cache
+files would corrupt Gnus when the cache was next enabled. It
+depends on the caller to determine whether group renaming is
+supported."
(let ((old-dir (gnus-cache-file-name old-group ""))
(new-dir (gnus-cache-file-name new-group "")))
(gnus-rename-file old-dir new-dir t))
(let ((no-save gnus-cache-active-hashtb))
(unless gnus-cache-active-hashtb
(gnus-cache-read-active))
- (let* ((old-group-hash-value (gnus-gethash old-group gnus-cache-active-hashtb))
- (new-group-hash-value (gnus-gethash new-group gnus-cache-active-hashtb))
- (delta (or old-group-hash-value new-group-hash-value)))
+ (let* ((old-group-hash-value
+ (gnus-gethash old-group gnus-cache-active-hashtb))
+ (new-group-hash-value
+ (gnus-gethash new-group gnus-cache-active-hashtb))
+ (delta
+ (or old-group-hash-value new-group-hash-value)))
(gnus-sethash new-group old-group-hash-value gnus-cache-active-hashtb)
(gnus-sethash old-group nil gnus-cache-active-hashtb)
;;;###autoload
(defun gnus-cache-delete-group (group)
- "Delete GROUP. Always updates the cache, even when
-disabled, as the old cache files would corrupt gnus when the cache was
-next enabled. Depends upon the caller to determine whether group deletion is supported."
+ "Delete GROUP from the cache.
+Always updates the cache, even when disabled, as the old cache
+files would corrupt gnus when the cache was next enabled.
+Depends upon the caller to determine whether group deletion is
+supported."
(let ((dir (gnus-cache-file-name group "")))
(gnus-delete-directory dir))
;;; gnus-cite.el --- parse citations in articles for Gnus
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+;; 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Per Abhiddenware
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
:group 'gnus-cite
:type 'boolean)
-(defface gnus-cite-attribution-face '((t
- (:italic t)))
- "Face used for attribution lines.")
+(defface gnus-cite-attribution '((t (:italic t)))
+ "Face used for attribution lines."
+ :group 'gnus-cite)
+;; backward-compatibility alias
+(put 'gnus-cite-attribution-face 'face-alias 'gnus-cite-attribution)
-(defcustom gnus-cite-attribution-face 'gnus-cite-attribution-face
+(defcustom gnus-cite-attribution-face 'gnus-cite-attribution
"Face used for attribution lines.
It is merged with the face for the cited text belonging to the attribution."
:version "22.1"
:group 'gnus-cite
:type 'face)
-(defface gnus-cite-face-1 '((((class color)
- (background dark))
- (:foreground "light blue"))
- (((class color)
- (background light))
- (:foreground "MidnightBlue"))
- (t
- (:italic t)))
- "Citation face.")
-
-(defface gnus-cite-face-2 '((((class color)
- (background dark))
- (:foreground "light cyan"))
- (((class color)
- (background light))
- (:foreground "firebrick"))
- (t
- (:italic t)))
- "Citation face.")
-
-(defface gnus-cite-face-3 '((((class color)
- (background dark))
- (:foreground "light yellow"))
- (((class color)
- (background light))
- (:foreground "dark green"))
- (t
- (:italic t)))
- "Citation face.")
-
-(defface gnus-cite-face-4 '((((class color)
- (background dark))
- (:foreground "light pink"))
- (((class color)
- (background light))
- (:foreground "OrangeRed"))
- (t
- (:italic t)))
- "Citation face.")
-
-(defface gnus-cite-face-5 '((((class color)
- (background dark))
- (:foreground "pale green"))
- (((class color)
- (background light))
- (:foreground "dark khaki"))
- (t
- (:italic t)))
- "Citation face.")
-
-(defface gnus-cite-face-6 '((((class color)
- (background dark))
- (:foreground "beige"))
- (((class color)
- (background light))
- (:foreground "dark violet"))
- (t
- (:italic t)))
- "Citation face.")
-
-(defface gnus-cite-face-7 '((((class color)
- (background dark))
- (:foreground "orange"))
- (((class color)
- (background light))
- (:foreground "SteelBlue4"))
- (t
- (:italic t)))
- "Citation face.")
-
-(defface gnus-cite-face-8 '((((class color)
- (background dark))
- (:foreground "magenta"))
- (((class color)
- (background light))
- (:foreground "magenta"))
- (t
- (:italic t)))
- "Citation face.")
-
-(defface gnus-cite-face-9 '((((class color)
- (background dark))
- (:foreground "violet"))
- (((class color)
- (background light))
- (:foreground "violet"))
- (t
- (:italic t)))
- "Citation face.")
-
-(defface gnus-cite-face-10 '((((class color)
- (background dark))
- (:foreground "medium purple"))
- (((class color)
- (background light))
- (:foreground "medium purple"))
- (t
- (:italic t)))
- "Citation face.")
-
-(defface gnus-cite-face-11 '((((class color)
- (background dark))
- (:foreground "turquoise"))
- (((class color)
- (background light))
- (:foreground "turquoise"))
- (t
- (:italic t)))
- "Citation face.")
+(defface gnus-cite-1 '((((class color)
+ (background dark))
+ (:foreground "light blue"))
+ (((class color)
+ (background light))
+ (:foreground "MidnightBlue"))
+ (t
+ (:italic t)))
+ "Citation face."
+ :group 'gnus-cite)
+;; backward-compatibility alias
+(put 'gnus-cite-face-1 'face-alias 'gnus-cite-1)
+
+(defface gnus-cite-2 '((((class color)
+ (background dark))
+ (:foreground "light cyan"))
+ (((class color)
+ (background light))
+ (:foreground "firebrick"))
+ (t
+ (:italic t)))
+ "Citation face."
+ :group 'gnus-cite)
+;; backward-compatibility alias
+(put 'gnus-cite-face-2 'face-alias 'gnus-cite-2)
+
+(defface gnus-cite-3 '((((class color)
+ (background dark))
+ (:foreground "light yellow"))
+ (((class color)
+ (background light))
+ (:foreground "dark green"))
+ (t
+ (:italic t)))
+ "Citation face."
+ :group 'gnus-cite)
+;; backward-compatibility alias
+(put 'gnus-cite-face-3 'face-alias 'gnus-cite-3)
+
+(defface gnus-cite-4 '((((class color)
+ (background dark))
+ (:foreground "light pink"))
+ (((class color)
+ (background light))
+ (:foreground "OrangeRed"))
+ (t
+ (:italic t)))
+ "Citation face."
+ :group 'gnus-cite)
+;; backward-compatibility alias
+(put 'gnus-cite-face-4 'face-alias 'gnus-cite-4)
+
+(defface gnus-cite-5 '((((class color)
+ (background dark))
+ (:foreground "pale green"))
+ (((class color)
+ (background light))
+ (:foreground "dark khaki"))
+ (t
+ (:italic t)))
+ "Citation face."
+ :group 'gnus-cite)
+;; backward-compatibility alias
+(put 'gnus-cite-face-5 'face-alias 'gnus-cite-5)
+
+(defface gnus-cite-6 '((((class color)
+ (background dark))
+ (:foreground "beige"))
+ (((class color)
+ (background light))
+ (:foreground "dark violet"))
+ (t
+ (:italic t)))
+ "Citation face."
+ :group 'gnus-cite)
+;; backward-compatibility alias
+(put 'gnus-cite-face-6 'face-alias 'gnus-cite-6)
+
+(defface gnus-cite-7 '((((class color)
+ (background dark))
+ (:foreground "orange"))
+ (((class color)
+ (background light))
+ (:foreground "SteelBlue4"))
+ (t
+ (:italic t)))
+ "Citation face."
+ :group 'gnus-cite)
+;; backward-compatibility alias
+(put 'gnus-cite-face-7 'face-alias 'gnus-cite-7)
+
+(defface gnus-cite-8 '((((class color)
+ (background dark))
+ (:foreground "magenta"))
+ (((class color)
+ (background light))
+ (:foreground "magenta"))
+ (t
+ (:italic t)))
+ "Citation face."
+ :group 'gnus-cite)
+;; backward-compatibility alias
+(put 'gnus-cite-face-8 'face-alias 'gnus-cite-8)
+
+(defface gnus-cite-9 '((((class color)
+ (background dark))
+ (:foreground "violet"))
+ (((class color)
+ (background light))
+ (:foreground "violet"))
+ (t
+ (:italic t)))
+ "Citation face."
+ :group 'gnus-cite)
+;; backward-compatibility alias
+(put 'gnus-cite-face-9 'face-alias 'gnus-cite-9)
+
+(defface gnus-cite-10 '((((class color)
+ (background dark))
+ (:foreground "medium purple"))
+ (((class color)
+ (background light))
+ (:foreground "medium purple"))
+ (t
+ (:italic t)))
+ "Citation face."
+ :group 'gnus-cite)
+;; backward-compatibility alias
+(put 'gnus-cite-face-10 'face-alias 'gnus-cite-10)
+
+(defface gnus-cite-11 '((((class color)
+ (background dark))
+ (:foreground "turquoise"))
+ (((class color)
+ (background light))
+ (:foreground "turquoise"))
+ (t
+ (:italic t)))
+ "Citation face."
+ :group 'gnus-cite)
+;; backward-compatibility alias
+(put 'gnus-cite-face-11 'face-alias 'gnus-cite-11)
(defcustom gnus-cite-face-list
- '(gnus-cite-face-1 gnus-cite-face-2 gnus-cite-face-3 gnus-cite-face-4
- gnus-cite-face-5 gnus-cite-face-6 gnus-cite-face-7 gnus-cite-face-8
- gnus-cite-face-9 gnus-cite-face-10 gnus-cite-face-11)
+ '(gnus-cite-1 gnus-cite-2 gnus-cite-3 gnus-cite-4 gnus-cite-5 gnus-cite-6
+ gnus-cite-7 gnus-cite-8 gnus-cite-9 gnus-cite-10 gnus-cite-11)
"*List of faces used for highlighting citations.
When there are citations from multiple articles in the same message,
;; This has to go here because its default value depends on
;; gnus-cite-face-list.
-(defcustom gnus-article-boring-faces (cons 'gnus-signature-face
- gnus-cite-face-list)
+(defcustom gnus-article-boring-faces (cons 'gnus-signature gnus-cite-face-list)
"List of faces that are not worth reading.
If an article has more pages below the one you are looking at, but
nothing on those pages is a word of at least three letters that is not
Each citation in the article will be highlighted with a different face.
The faces are taken from `gnus-cite-face-list'.
Attribution lines are highlighted with the same face as the
-corresponding citation merged with `gnus-cite-attribution-face'.
+corresponding citation merged with the face `gnus-cite-attribution'.
Text is considered cited if at least `gnus-cite-minimum-match-count'
lines matches `message-cite-prefix-regexp' with the same prefix.
(when (< from to)
(push (setq overlay (gnus-make-overlay from to))
gnus-cite-overlay-list)
+ (gnus-overlay-put overlay 'evaporate t)
(gnus-overlay-put overlay 'face face))))))
(defun gnus-cite-toggle (prefix)
;;; gnus-cus.el --- customization commands for Gnus
-;;
-;; Copyright (C) 1996, 1999, 2000, 2001, 2002, 2003, 2004
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1996, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(set (make-local-variable 'widget-push-button-suffix) "")
(set (make-local-variable 'widget-link-prefix) "")
(set (make-local-variable 'widget-link-suffix) ""))
- (gnus-run-hooks 'gnus-custom-mode-hook))
+ (gnus-run-mode-hooks 'gnus-custom-mode-hook))
;;; Group Customization:
(const signature-file)
(const organization)
(const address)
+ (const x-face-file)
(const name)
- (const body))
+ (const body)
+ (symbol)
+ (string :tag "Header"))
(string :format "%v"))))
"post style.
See `gnus-posting-styles'."))
This can be changed using the `\\[gnus-score-change-score-file]' command."
(interactive (list gnus-current-score-file))
(unless file
- (error (format "No score file for %s"
- (gnus-group-decoded-name gnus-newsgroup-name))))
+ (error "No score file for %s"
+ (gnus-group-decoded-name gnus-newsgroup-name)))
(let ((scores (gnus-score-load file))
(types (mapcar (lambda (entry)
`(group :format "%v%h\n"
;; gnus-agent-cat-prepare-category-field as I don't want the
;; group list to appear when customizing a topic.
(widget-insert "\n")
-
- (let ((symb
- (set
+
+ (let ((symb
+ (set
(make-local-variable 'gnus-agent-cat-groups)
(widget-create
`(choice
;;; gnus-delay.el --- Delayed posting of articles
-;; Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
+;; Copyright (C) 2001, 2002, 2003, 2004, 2005,
+;; 2006 Free Software Foundation, Inc.
;; Author: Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
;; Keywords: mail, news, extensions
;; 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.
+;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(require 'gnus-draft)
(autoload 'parse-time-string "parse-time" nil nil)
-;;;###autoload
(defgroup gnus-delay nil
"Arrange for sending postings later."
:version "22.1"
;; coding: iso-8859-1
;; End:
-;;; arch-tag: fb2ad634-a897-4142-a503-f5991ec2349d
+;; arch-tag: fb2ad634-a897-4142-a503-f5991ec2349d
;;; gnus-delay.el ends here
;;; gnus-demon.el --- daemonic Gnus behaviour
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2003
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
-;;; gnus-diary.el --- Wrapper around the NNDiary Gnus backend
+;;; gnus-diary.el --- Wrapper around the NNDiary Gnus back end
-;; Copyright (c) 2001, 2002, 2003 Free Software Foundation, Inc.
+;; Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
;; Copyright (C) 1999, 2000, 2001 Didier Verna.
;; Author: Didier Verna <didier@xemacs.org>
;; You should have received a copy of the GNU General Public License
;; along with this program; if not, write to the Free Software
-;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+;; MA 02110-1301, USA.
;;; Commentary:
;; Description:
;; ===========
-;; Gnus-Diary is a wrapper around the NNDiary Gnus backend. It is here to
-;; make your nndiary-user life easier in different ways. So, you don't have
-;; to use it if you don't want to. But, really, you should.
-
-;; Gnus-Diary offers the following features on top of the NNDiary backend:
-
-;; - A nice summary line format:
-;; Displaying diary messages in standard summary line format (usually
-;; something like "<From Joe>: <Subject>") is pretty useless. Most of the
-;; time, you're the one who wrote the message, and you mostly want to see
-;; the event's date. Gnus-Diary offers you a nice summary line format
-;; which will do this. By default, a summary line will appear like this:
-;;
-;; <Event Date>: <Subject> <Remaining time>
-;;
-;; for example, here's how Joe's birthday is displayed in my
-;; "nndiary:birhdays" summary buffer (the message is expirable, but will
-;; never be deleted, as it specifies a regular event):
-;;
-;; E Sat, Sep 22 01, 12:00: Joe's birthday (in 6 months, 1 week)
-
-;; - More article sorting functions:
-;; Gnus-Diary adds a new sorting function called
-;; `gnus-summary-sort-by-schedule'. This function lets you organize your
-;; diary summary buffers from the closest event to the farthest one.
-
-;; - Automatic generation of diary group parameters:
-;; When you create a new diary group, or visit one, Gnus-Diary checks your
-;; group parameters, and if needed, sets the summary line format to the
-;; diary-specific value, adds the diary-specific sorting functions, and
-;; also adds the different `X-Diary-*' headers to the group's
-;; posting-style. It is then easier to send a diary message, because if
-;; you use `C-u a' or `C-u m' on a diary group to prepare a message, these
-;; headers will be inserted automatically (but not filled with proper
-;; values yet).
-
-;; - An interactive mail-to-diary convertion function:
-;; The function `gnus-diary-check-message' ensures that the current message
-;; contains all the required diary headers, and prompts you for values /
-;; correction if needed. This function is hooked in the nndiary backend so
-;; that moving an article to an nndiary group will trigger it
-;; automatically. It is also bound to `C-c D c' in message-mode and
-;; article-edit-mode in order to ease the process of converting a usual
-;; mail to a diary one. This function takes a prefix argument which will
-;; force prompting of all diary headers, regardless of their
-;; presence/validity. That way, you can very easily reschedule a diary
-;; message for instance.
-
-
-;; Usage:
-;; =====
-
-;; 0/ Don't use any `gnus-user-format-function-[d|D]'. Gnus-Diary provides
-;; both of these (sorry if you used them before).
-;; 1/ Add '(require 'gnus-diary) to your gnusrc file.
-;; 2/ Customize your gnus-diary options to suit your needs.
-
+;; gnus-diary is a utility toolkit used on top of the nndiary back end. It is
+;; now fully documented in the Gnus manual.
;; Bugs / Todo:
(require 'gnus-art)
(defgroup gnus-diary nil
- "Utilities on top of the nndiary backend for Gnus."
- :version "22.1")
+ "Utilities on top of the nndiary back end for Gnus."
+ :version "22.1"
+ :group 'gnus)
(defcustom gnus-diary-summary-line-format "%U%R%z %uD: %(%s%) (%ud)\n"
"*Summary line format for nndiary groups."
:group 'gnus-diary)
(defconst gnus-diary-version nndiary-version
- "Current Diary backend version.")
+ "Current Diary back end version.")
;; Compatibility functions ==================================================
))
;; Called when a group is subscribed. This is needed because groups created
-;; because of mail splitting are *not* created with the backend function.
+;; because of mail splitting are *not* created with the back end function.
;; Thus, `nndiary-request-create-group-hooks' is inoperative.
(defun gnus-diary-maybe-update-group-parameters (group)
(when (eq (car (gnus-find-method-for-group group)) 'nndiary)
;; The end ==================================================================
(defun gnus-diary-version ()
- "Current Diary backend version."
+ "Current Diary back end version."
(interactive)
(message "NNDiary version %s" nndiary-version))
;;; gnus-dired.el --- utility functions where gnus and dired meet
-;; Copyright (C) 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Authors: Benjamin Rutt <brutt@bloomington.in.us>,
;; Shenghuo Zhu <zsh@cs.rochester.edu>
;; 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.
+;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; gnus-draft.el --- draft message support for Gnus
-;; Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(interactive)
(let ((article (gnus-summary-article-number))
(group gnus-newsgroup-name))
+ (gnus-draft-check-draft-articles (list article))
(gnus-summary-mark-as-read article gnus-canceled-mark)
(gnus-draft-setup article group t)
(set-buffer-modified-p t)
(let* ((articles (gnus-summary-work-articles n))
(total (length articles))
article)
+ (gnus-draft-check-draft-articles articles)
(while (setq article (pop articles))
(gnus-summary-remove-process-mark article)
(unless (memq article gnus-newsgroup-unsendable)
message-send-hook))
(message-setup-hook (and (not is-queue)
message-setup-hook))
+ (message-signature (and (not is-queue)
+ message-signature))
(gnus-agent-queue-mail (and (not is-queue)
gnus-agent-queue-mail))
(rfc2047-encode-encoded-words nil)
;; We read the meta-information that says how and where
;; this message is to be sent.
(save-restriction
- (message-narrow-to-head)
+ (message-narrow-to-headers)
(when (re-search-forward
(concat "^" (regexp-quote gnus-agent-target-move-group-header)
":") nil t)
(goto-char (point-min))
(search-forward "\n\n")
(forward-char -1)
+ (save-restriction
+ (narrow-to-region (point-min) (point))
+ (setq ga
+ (message-fetch-field gnus-draft-meta-information-header)))
(insert mail-header-separator)
(forward-line 1)
- (setq ga (message-fetch-field gnus-draft-meta-information-header))
(message-set-auto-save-file-name))))
(gnus-backlog-remove-article group narticle)
(when (and ga
"Say whether ARTICLE is sendable."
(not (memq article gnus-newsgroup-unsendable)))
+(defun gnus-draft-check-draft-articles (articles)
+ "Check whether the draft articles ARTICLES are under edit."
+ (when (equal gnus-newsgroup-name "nndraft:drafts")
+ (let ((buffers (buffer-list))
+ file buffs buff)
+ (save-current-buffer
+ (while (and articles
+ (not buff))
+ (setq file (nndraft-article-filename (pop articles))
+ buffs buffers)
+ (while buffs
+ (set-buffer (setq buff (pop buffs)))
+ (if (and buffer-file-name
+ (string-equal (file-truename buffer-file-name)
+ (file-truename file))
+ (buffer-modified-p))
+ (setq buffs nil)
+ (setq buff nil)))))
+ (when buff
+ (let* ((window (get-buffer-window buff t))
+ (frame (and window (window-frame window))))
+ (if frame
+ (gnus-select-frame-set-input-focus frame)
+ (pop-to-buffer buff t)))
+ (error "The draft %s is under edit" file)))))
+
(provide 'gnus-draft)
;;; arch-tag: 3d92af58-8c97-4a5c-9db4-a98e85198022
;;; gnus-dup.el --- suppression of duplicate articles in Gnus
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; gnus-eform.el --- a mode for editing forms for Gnus
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2004
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(use-local-map gnus-edit-form-mode-map)
(make-local-variable 'gnus-edit-form-done-function)
(make-local-variable 'gnus-prev-winconf)
- (gnus-run-hooks 'gnus-edit-form-mode-hook))
+ (gnus-run-mode-hooks 'gnus-edit-form-mode-hook))
(defun gnus-edit-form (form documentation exit-func)
"Edit FORM in a new buffer.
;;; gnus-ems.el --- functions for making Gnus work under different Emacsen
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+;; 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; gnus-fun.el --- various frivolous extension functions to Gnus
-;; Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+
+;; Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(require 'mm-util)
(require 'gnus-ems)
(require 'gnus-util)
+(require 'gnus)
(defcustom gnus-x-face-directory (expand-file-name "x-faces" gnus-directory)
"*Directory where X-Face PBM files are stored."
:group 'gnus-fun
:type 'string)
-(defcustom gnus-convert-image-to-x-face-command "giftopnm %s | ppmnorm | pnmscale -width 48 -height 48 | ppmtopgm | pgmtopbm | pbmtoxbm | compface"
+(defcustom gnus-convert-image-to-x-face-command
+ "convert -scale 48x48! %s xbm:- | xbm2xface.pl"
"Command for converting an image to an X-Face.
+The command must take a image filename (use \"%s\") as input.
+The output must be the Face header data on stdout in PNG format.
+
By default it takes a GIF filename and output the X-Face header data
on stdout."
:version "22.1"
:group 'gnus-fun
- :type 'string)
-
-(defcustom gnus-convert-image-to-face-command "djpeg %s | ppmnorm | pnmscale -width 48 -height 48 | ppmquant %d | pnmtopng"
- "Command for converting an image to an Face.
-By default it takes a JPEG filename and output the Face header data
-on stdout."
+ :type '(choice (const :tag "giftopnm, netpbm (GIF input only)"
+ "giftopnm %s | ppmnorm | pnmscale -width 48 -height 48 | ppmtopgm | pgmtopbm | pbmtoxbm | compface")
+ (const :tag "convert"
+ "convert -scale 48x48! %s xbm:- | xbm2xface.pl")
+ (string)))
+
+(defcustom gnus-convert-image-to-face-command
+ "convert -scale 48x48! %s -colors %d png:-"
+ "Command for converting an image to a Face.
+
+The command must take an image filename (first format argument
+\"%s\") and the number of colors (second format argument: \"%d\")
+as input. The output must be the Face header data on stdout in
+PNG format."
:version "22.1"
:group 'gnus-fun
- :type 'string)
+ :type '(choice (const :tag "djpeg, netpbm (JPG input only)"
+ "djpeg %s | ppmnorm | pnmscale -width 48 -height 48 | ppmquant %d | pnmtopng")
+ (const :tag "convert"
+ "convert -scale 48x48! %s -colors %d png:-")
+ (string)))
(defcustom gnus-face-properties-alist (if (featurep 'xemacs)
'((xface . (:face gnus-x-face)))
Currently, `pbm' is used for X-Face images and `png' is used for Face
images in Emacs. Only the `:face' property is effective on the `xface'
image type in XEmacs if it is built with the libcompface library."
+ :version "23.0" ;; No Gnus
:group 'gnus-fun
:type '(repeat (cons :format "%v" (symbol :tag "Image type") plist)))
;;;###autoload
(defun gnus-x-face-from-file (file)
- "Insert an X-Face header based on an image file."
- (interactive "fImage file name (by default GIF): ")
+ "Insert an X-Face header based on an image file.
+
+Depending on `gnus-convert-image-to-x-face-command' it may accept
+different input formats."
+ (interactive "fImage file name: ")
(when (file-exists-p file)
(gnus-shell-command-to-string
(format gnus-convert-image-to-x-face-command
;;;###autoload
(defun gnus-face-from-file (file)
- "Return an Face header based on an image file."
- (interactive "fImage file name (by default JPEG): ")
+ "Return a Face header based on an image file.
+
+Depending on `gnus-convert-image-to-face-command' it may accept
+different input formats."
+ (interactive "fImage file name: ")
(when (file-exists-p file)
(let ((done nil)
(attempt "")
quant))))
(if (> (length attempt) 726)
(progn
- (setq quant (- quant 2))
+ (setq quant (- quant (if (< quant 10) 1 2)))
(gnus-message 9 "Length %d; trying quant %d"
(length attempt) quant))
(setq done t)))
;;; gnus-group.el --- group mode commands for Gnus
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(eval-when-compile
(require 'cl)
- (defvar tool-bar-map))
+ (defvar tool-bar-mode))
(require 'gnus)
(require 'gnus-start)
(require 'gnus-range)
(require 'gnus-win)
(require 'gnus-undo)
+(require 'gmm-utils)
(require 'time-date)
(require 'gnus-ems)
-(eval-when-compile
+(eval-when-compile
(require 'mm-url)
(let ((features (cons 'gnus-group features)))
(require 'gnus-sum))
:type 'hook)
(defcustom gnus-useful-groups
- '(("(ding) mailing list mirrored at sunsite.auc.dk"
- "emacs.ding"
- (nntp "sunsite.auc.dk"
- (nntp-address "sunsite.auc.dk")))
- ("gnus-bug archive"
- "gnus-bug"
- (nndir "/ftp@ftp.ifi.uio.no:/pub/emacs/gnus/gnus-bug/"))
- ("Gnus help group"
+ '(("(ding) mailing list mirrored at gmane.org"
+ "gmane.emacs.gnus.general"
+ (nntp "Gmane"
+ (nntp-address "news.gmane.org")))
+ ("Gnus bug archive"
+ "gnus.gnus-bug"
+ (nntp "news.gnus.org"
+ (nntp-address "news.gnus.org")))
+ ("Local Gnus help group"
"gnus-help"
(nndoc "gnus-help"
(nndoc-article-type mbox)
(defcustom gnus-group-highlight
'(;; Mail.
((and mailp (= unread 0) (eq level 1)) .
- gnus-group-mail-1-empty-face)
+ gnus-group-mail-1-empty)
((and mailp (eq level 1)) .
- gnus-group-mail-1-face)
+ gnus-group-mail-1)
((and mailp (= unread 0) (eq level 2)) .
- gnus-group-mail-2-empty-face)
+ gnus-group-mail-2-empty)
((and mailp (eq level 2)) .
- gnus-group-mail-2-face)
+ gnus-group-mail-2)
((and mailp (= unread 0) (eq level 3)) .
- gnus-group-mail-3-empty-face)
+ gnus-group-mail-3-empty)
((and mailp (eq level 3)) .
- gnus-group-mail-3-face)
+ gnus-group-mail-3)
((and mailp (= unread 0)) .
- gnus-group-mail-low-empty-face)
+ gnus-group-mail-low-empty)
((and mailp) .
- gnus-group-mail-low-face)
+ gnus-group-mail-low)
;; News.
((and (= unread 0) (eq level 1)) .
- gnus-group-news-1-empty-face)
+ gnus-group-news-1-empty)
((and (eq level 1)) .
- gnus-group-news-1-face)
+ gnus-group-news-1)
((and (= unread 0) (eq level 2)) .
- gnus-group-news-2-empty-face)
+ gnus-group-news-2-empty)
((and (eq level 2)) .
- gnus-group-news-2-face)
+ gnus-group-news-2)
((and (= unread 0) (eq level 3)) .
- gnus-group-news-3-empty-face)
+ gnus-group-news-3-empty)
((and (eq level 3)) .
- gnus-group-news-3-face)
+ gnus-group-news-3)
((and (= unread 0) (eq level 4)) .
- gnus-group-news-4-empty-face)
+ gnus-group-news-4-empty)
((and (eq level 4)) .
- gnus-group-news-4-face)
+ gnus-group-news-4)
((and (= unread 0) (eq level 5)) .
- gnus-group-news-5-empty-face)
+ gnus-group-news-5-empty)
((and (eq level 5)) .
- gnus-group-news-5-face)
+ gnus-group-news-5)
((and (= unread 0) (eq level 6)) .
- gnus-group-news-6-empty-face)
+ gnus-group-news-6-empty)
((and (eq level 6)) .
- gnus-group-news-6-face)
+ gnus-group-news-6)
((and (= unread 0)) .
- gnus-group-news-low-empty-face)
+ gnus-group-news-low-empty)
(t .
- gnus-group-news-low-face))
+ gnus-group-news-low))
"*Controls the highlighting of group buffer lines.
Below is a list of `Form'/`Face' pairs. When deciding how a a
:type 'character)
(defgroup gnus-group-icons nil
- "Add Icons to your group buffer. "
+ "Add Icons to your group buffer."
:group 'gnus-group-visual)
(defcustom gnus-group-icon-list
"r" gnus-group-rename-group
"R" gnus-group-make-rss-group
"c" gnus-group-customize
+ "z" gnus-group-compact-group
"x" gnus-group-nnimap-expunge
"\177" gnus-group-delete-group
[delete] gnus-group-delete-group)
(gnus-group-group-name)]
["Select quick" gnus-group-quick-select-group (gnus-group-group-name)]
["Customize" gnus-group-customize (gnus-group-group-name)]
+ ["Compact" gnus-group-compact-group
+ :active (gnus-group-group-name)]
("Edit"
["Parameters" gnus-group-edit-group-parameters
:included (not (gnus-topic-mode-p))
(gnus-run-hooks 'gnus-group-menu-hook)))
-(defvar gnus-group-toolbar-map nil)
-
-;; Emacs 21 tool bar. Should be no-op otherwise.
-(defun gnus-group-make-tool-bar ()
- (if (and
- (condition-case nil (require 'tool-bar) (error nil))
- (fboundp 'tool-bar-add-item-from-menu)
- (default-value 'tool-bar-mode)
- (not gnus-group-toolbar-map))
- (setq gnus-group-toolbar-map
- (let ((tool-bar-map (make-sparse-keymap))
- (load-path (mm-image-load-path)))
- (tool-bar-add-item-from-menu
- 'gnus-group-get-new-news "get-news" gnus-group-mode-map)
- (tool-bar-add-item-from-menu
- 'gnus-group-get-new-news-this-group "gnntg" gnus-group-mode-map)
- (tool-bar-add-item-from-menu
- 'gnus-group-catchup-current "catchup" gnus-group-mode-map)
- (tool-bar-add-item-from-menu
- 'gnus-group-describe-group "describe-group" gnus-group-mode-map)
- (tool-bar-add-item "subscribe" 'gnus-group-subscribe 'subscribe
- :help "Subscribe to the current group")
- (tool-bar-add-item "unsubscribe" 'gnus-group-unsubscribe
- 'unsubscribe
- :help "Unsubscribe from the current group")
- (tool-bar-add-item-from-menu
- 'gnus-group-exit "exit-gnus" gnus-group-mode-map)
- tool-bar-map)))
- (if gnus-group-toolbar-map
- (set (make-local-variable 'tool-bar-map) gnus-group-toolbar-map)))
+
+(defvar gnus-group-tool-bar-map nil)
+
+(defun gnus-group-tool-bar-update (&optional symbol value)
+ "Update group buffer toolbar.
+Setter function for custom variables."
+ (when symbol
+ (set-default symbol value))
+ ;; (setq-default gnus-group-tool-bar-map nil)
+ ;; (use-local-map gnus-group-mode-map)
+ (when (gnus-alive-p)
+ (with-current-buffer gnus-group-buffer
+ (gnus-group-make-tool-bar t))))
+
+(defcustom gnus-group-tool-bar (if (eq gmm-tool-bar-style 'gnome)
+ 'gnus-group-tool-bar-gnome
+ 'gnus-group-tool-bar-retro)
+ "Specifies the Gnus group tool bar.
+
+It can be either a list or a symbol refering to a list. See
+`gmm-tool-bar-from-list' for the format of the list. The
+default key map is `gnus-group-mode-map'.
+
+Pre-defined symbols include `gnus-group-tool-bar-gnome' and
+`gnus-group-tool-bar-retro'."
+ :type '(choice (const :tag "GNOME style" gnus-group-tool-bar-gnome)
+ (const :tag "Retro look" gnus-group-tool-bar-retro)
+ (repeat :tag "User defined list" gmm-tool-bar-item)
+ (symbol))
+ :version "23.0" ;; No Gnus
+ :initialize 'custom-initialize-default
+ :set 'gnus-group-tool-bar-update
+ :group 'gnus-group)
+
+(defcustom gnus-group-tool-bar-gnome
+ '((gnus-group-post-news "mail/compose")
+ ;; Some useful agent icons? I don't use the agent so agent users should
+ ;; suggest useful commands:
+ (gnus-agent-toggle-plugged "connect" t
+ :visible (and gnus-agent (not gnus-plugged)))
+ (gnus-agent-toggle-plugged "disconnect" t
+ :visible (and gnus-agent gnus-plugged))
+ ;; FIXME: gnus-agent-toggle-plugged (in gnus-agent-group-make-menu-bar)
+ ;; should have a better help text.
+ (gnus-group-send-queue "mail/outbox" t
+ :visible (and gnus-agent gnus-plugged)
+ :help "Send articles from the queue group")
+ (gnus-group-get-new-news "mail/inbox" nil
+ :visible (or (not gnus-agent)
+ gnus-plugged))
+ ;; FIXME: gnus-*-read-group should have a better help text.
+ (gnus-topic-read-group "open" nil
+ :visible (and (boundp 'gnus-topic-mode)
+ gnus-topic-mode))
+ (gnus-group-read-group "open" nil
+ :visible (not (and (boundp 'gnus-topic-mode)
+ gnus-topic-mode)))
+ ;; (gnus-group-find-new-groups "???" nil)
+ (gnus-group-save-newsrc "save")
+ (gnus-group-describe-group "describe")
+ (gnus-group-unsubscribe-current-group "gnus/toggle-subscription")
+ (gnus-group-prev-unread-group "left-arrow")
+ (gnus-group-next-unread-group "right-arrow")
+ (gnus-group-exit "exit")
+ (gmm-customize-mode "preferences" t :help "Edit mode preferences")
+ (gnus-info-find-node "help"))
+ "List of functions for the group tool bar (GNOME style).
+
+See `gmm-tool-bar-from-list' for the format of the list."
+ :type '(repeat gmm-tool-bar-item)
+ :version "23.0" ;; No Gnus
+ :initialize 'custom-initialize-default
+ :set 'gnus-group-tool-bar-update
+ :group 'gnus-group)
+
+(defcustom gnus-group-tool-bar-retro
+ '((gnus-group-get-new-news "gnus/get-news")
+ (gnus-group-get-new-news-this-group "gnus/gnntg")
+ (gnus-group-catchup-current "gnus/catchup")
+ (gnus-group-describe-group "gnus/describe-group")
+ (gnus-group-subscribe "gnus/subscribe" t
+ :help "Subscribe to the current group")
+ (gnus-group-unsubscribe "gnus/unsubscribe" t
+ :help "Unsubscribe from the current group")
+ (gnus-group-exit "gnus/exit-gnus" gnus-group-mode-map))
+ "List of functions for the group tool bar (retro look).
+
+See `gmm-tool-bar-from-list' for the format of the list."
+ :type '(repeat gmm-tool-bar-item)
+ :version "23.0" ;; No Gnus
+ :initialize 'custom-initialize-default
+ :set 'gnus-group-tool-bar-update
+ :group 'gnus-group)
+
+;; FIXME: Moving through the Group buffer (in topic mode) e.g. with C-n
+;; doesn't update the state (enabled/disabled) of the icon
+;; `gnus-group-describe-group'. After `C-l' the state is correct.
+;; See the following report on emacs-devel
+;; <http://thread.gmane.org/v9acdmrcse.fsf@marauder.physik.uni-ulm.de>:
+;; From: Reiner Steib
+;; Subject: tool bar icons not updated according to :active condition
+;; Newsgroups: gmane.emacs.devel
+;; Date: Mon, 23 Jan 2006 19:59:13 +0100
+;; Message-ID: <v9acdmrcse.fsf@marauder.physik.uni-ulm.de>
+
+(defcustom gnus-group-tool-bar-zap-list t
+ "List of icon items from the global tool bar.
+These items are not displayed in the Gnus group mode tool bar.
+
+See `gmm-tool-bar-from-list' for the format of the list."
+ :type 'gmm-tool-bar-zap-list
+ :version "23.0" ;; No Gnus
+ :initialize 'custom-initialize-default
+ :set 'gnus-group-tool-bar-update
+ :group 'gnus-group)
+
+(defvar image-load-path)
+
+(defun gnus-group-make-tool-bar (&optional force)
+ "Make a group mode tool bar from `gnus-group-tool-bar'.
+When FORCE, rebuild the tool bar."
+ (when (and (not (featurep 'xemacs))
+ (boundp 'tool-bar-mode)
+ tool-bar-mode
+ ;; The Gnus 5.10.6 code checked (default-value 'tool-bar-mode).
+ ;; Why? --rsteib
+ (or (not gnus-group-tool-bar-map) force))
+ (let* ((load-path
+ (gmm-image-load-path-for-library "gnus"
+ "gnus/toggle-subscription.xpm"
+ nil t))
+ (image-load-path (cons (car load-path)
+ (when (boundp 'image-load-path)
+ image-load-path)))
+ (map (gmm-tool-bar-from-list gnus-group-tool-bar
+ gnus-group-tool-bar-zap-list
+ 'gnus-group-mode-map)))
+ (if map
+ (set (make-local-variable 'tool-bar-map) map))))
+ gnus-group-tool-bar-map)
(defun gnus-group-mode ()
"Major mode for reading news.
(gnus-undo-mode 1))
(when gnus-slave
(gnus-slave-mode))
- (gnus-run-hooks 'gnus-group-mode-hook))
+ (gnus-run-mode-hooks 'gnus-group-mode-hook))
(defun gnus-update-group-mark-positions ()
(save-excursion
(gnus-range-difference (list active) (gnus-info-read info))
seen))))))
+(defcustom gnus-group-update-tool-bar
+ (and (not (featurep 'xemacs))
+ (boundp 'tool-bar-mode)
+ tool-bar-mode
+ ;; Using `redraw-frame' (see `gnus-tool-bar-update') in Emacs 21 might
+ ;; be confusing, so maybe we shouldn't call it by default.
+ (fboundp 'force-window-update))
+ "Force updating the group buffer tool bar."
+ :group 'gnus-group
+ :version "22.1"
+ :initialize 'custom-initialize-default
+ :set (lambda (symbol value)
+ (set-default symbol value)
+ (when (gnus-alive-p)
+ (with-current-buffer gnus-group-buffer
+ ;; FIXME: Is there a better way to redraw the group buffer?
+ (gnus-group-get-new-news 0))))
+ :type 'boolean)
+
(defun gnus-group-insert-group-line (gnus-tmp-group gnus-tmp-level
gnus-tmp-marked number
gnus-tmp-method)
(if (member gnus-tmp-group gnus-group-marked)
gnus-process-mark ? ))
(buffer-read-only nil)
+ beg end
header gnus-tmp-header) ; passed as parameter to user-funcs.
(beginning-of-line)
+ (setq beg (point))
(gnus-add-text-properties
(point)
(prog1 (1+ (point))
(eval gnus-group-line-format-spec)))
`(gnus-group ,(gnus-intern-safe gnus-tmp-group gnus-active-hashtb)
gnus-unread ,(if (numberp number)
- (string-to-int gnus-tmp-number-of-unread)
+ (string-to-number gnus-tmp-number-of-unread)
t)
gnus-marked ,gnus-tmp-marked-mark
gnus-indentation ,gnus-group-indentation
gnus-level ,gnus-tmp-level))
+ (setq end (point))
+ (when gnus-group-update-tool-bar
+ (gnus-put-text-property beg end 'point-entered
+ 'gnus-tool-bar-update)
+ (gnus-put-text-property beg end 'point-left
+ 'gnus-tool-bar-update))
(forward-line -1)
(when (inline (gnus-visual-p 'group-highlight 'highlight))
(gnus-run-hooks 'gnus-group-update-hook))
(size (+ size-in-cache size-in-agent))
(suffix '("B" "K" "M" "G"))
(scale 1024.0)
- (cutoff (* 10 scale)))
+ (cutoff scale))
(while (> size cutoff)
(setq size (/ size scale)
suffix (cdr suffix)))
(gnus-group-position-point)
(and best-point (gnus-group-group-name))))
+;; Is there something like an after-point-motion-hook?
+;; (inhibit-point-motion-hooks?). Is there a tool-bar-update function?
+
+;; (defun gnus-group-menu-bar-update ()
+;; (let* ((buf (list (with-current-buffer gnus-group-buffer
+;; (current-buffer))))
+;; (name (buffer-name (car buf))))
+;; (setcdr buf
+;; (if (> (length name) 27)
+;; (concat (substring name 0 12)
+;; "..."
+;; (substring name -12))
+;; name))
+;; (menu-bar-update-buffers-1 buf)))
+
+;; (defun gnus-group-position-point ()
+;; (gnus-goto-colon)
+;; (gnus-group-menu-bar-update))
+
(defun gnus-group-first-unread-group ()
"Go to the first group with unread articles."
(interactive)
(progn
(unless (gnus-group-process-prefix current-prefix-arg)
(error "No group on the current line"))
- (string-to-int
+ (string-to-number
(let ((s (read-string
(format "Level (default %s): "
(or (gnus-group-group-level)
;; We might read in new NoCeM messages here.
(when (and gnus-use-nocem
- (null arg))
+ (or (and (numberp gnus-use-nocem)
+ (numberp arg)
+ (>= arg gnus-use-nocem))
+ (not arg)))
(gnus-nocem-scan-groups))
;; If ARG is not a number, then we read the active file.
(when (and arg (not (numberp arg)))
(gnus-add-marked-articles
group 'expire (list article))))))
+
+;;;
+;;; Group compaction. -- dvl
+;;;
+
+(defun gnus-group-compact-group (group)
+ "Compact the current group.
+Compaction means removing gaps between article numbers. Hence, this
+operation is only meaningful for back ends using one file per article
+\(e.g. nnml).
+
+Note: currently only implemented in nnml."
+ (interactive (list (gnus-group-group-name)))
+ (unless group
+ (error "No group to compact"))
+ (unless (gnus-check-backend-function 'request-compact-group group)
+ (error "This back end does not support group compaction"))
+ (let ((group-decoded (gnus-group-decoded-name group)))
+ (gnus-message 6 "\
+Compacting group %s... (this may take a long time)"
+ group-decoded)
+ (prog1
+ (if (not (gnus-request-compact-group group))
+ (gnus-error 3 "Couldn't compact group %s" group-decoded)
+ (gnus-message 6 "Compacting group %s...done" group-decoded)
+ t)
+ ;; Invalidate the "original article" buffer which might be out of date.
+ ;; #### NOTE: Yes, this might be a bit rude, but since compaction
+ ;; #### will not happen very often, I think this is acceptable.
+ (let ((original (get-buffer gnus-original-article-buffer)))
+ (and original (gnus-kill-buffer original)))
+ ;; Update the group line to reflect new information (art number etc).
+ (gnus-group-update-group-line))))
+
(provide 'gnus-group)
;;; arch-tag: 2eb5440f-0bca-4091-814c-e37817536af6
;;; gnus-int.el --- backend interface functions for Gnus
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;; recurse to open the agent's backend.
(setq open-offline (eq gnus-server-unopen-status 'offline))
gnus-server-unopen-status)
- ((gnus-y-or-n-p
- (format "Unable to open %s:%s, go offline? "
- (car gnus-command-method)
- (cadr gnus-command-method)))
+ ((and
+ (not gnus-batch-mode)
+ (gnus-y-or-n-p
+ (format "Unable to open %s:%s, go offline? "
+ (car gnus-command-method)
+ (cadr gnus-command-method))))
(setq open-offline t)
'offline)
(t
(funcall (gnus-get-function gnus-command-method 'request-regenerate)
(nth 1 gnus-command-method)))
+(defun gnus-request-compact-group (group)
+ (let* ((method (gnus-find-method-for-group group))
+ (gnus-command-method method)
+ (result
+ (funcall (gnus-get-function gnus-command-method
+ 'request-compact-group)
+ (gnus-group-real-name group)
+ (nth 1 gnus-command-method) t)))
+ result))
+
+(defun gnus-request-compact (gnus-command-method)
+ "Request groups compaction from GNUS-COMMAND-METHOD."
+ (when (stringp gnus-command-method)
+ (setq gnus-command-method (gnus-server-to-method gnus-command-method)))
+ (funcall (gnus-get-function gnus-command-method 'request-compact)
+ (nth 1 gnus-command-method)))
+
(defun gnus-request-group (group &optional dont-check gnus-command-method)
"Request GROUP. If DONT-CHECK, no information is required."
(let ((gnus-command-method
;;; gnus-kill.el --- kill commands for Gnus
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2003
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
;; Lars Magne Ingebrigtsen <larsi@gnus.org>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(setq major-mode 'gnus-kill-file-mode)
(setq mode-name "Kill")
(lisp-mode-variables nil)
- (gnus-run-hooks 'emacs-lisp-mode-hook 'gnus-kill-file-mode-hook))
+ (gnus-run-mode-hooks 'emacs-lisp-mode-hook 'gnus-kill-file-mode-hook))
(defun gnus-kill-file-edit-file (newsgroup)
"Begin editing a kill file for NEWSGROUP.
;;; gnus-logic.el --- advanced scoring code for Gnus
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; gnus-mh.el --- mh-e interface for Gnus
-;; Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003,
+;; 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
;; Lars Magne Ingebrigtsen <larsi@gnus.org>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; gnus-ml.el --- Mailing list minor mode for Gnus
-;; Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+;; Copyright (C) 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Julien Gilles <jgilles@free.fr>
;; Keywords: news, mail
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; gnus-mlspl.el --- a group params-based mail splitting mechanism
-;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Alexandre Oliva <oliva@lsd.ic.unicamp.br>
;; Keywords: news, mail
;; You should have received a copy of the GNU General Public License
;; along with this program; see the file COPYING. If not, write to
-;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; gnus-move.el --- commands for moving Gnus from one server to another
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; gnus-msg.el --- mail and post interface for Gnus
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-;; 2005 Free Software Foundation, Inc.
+
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+;; 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
;; Lars Magne Ingebrigtsen <larsi@gnus.org>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
current newsgroup name and then returns a suitable group name (or list
of names)."
:group 'gnus-message
- :type '(choice (string :tag "Group")
- (function)))
+ :type '(choice (const nil)
+ (function)
+ (string :tag "Group")
+ (repeat :tag "List of groups" (string :tag "Group"))))
(defcustom gnus-mailing-list-groups nil
"*If non-nil a regexp matching groups that are really mailing lists.
;; COMPOSEFUNC should return t if succeed. Undocumented ???
t)
-(defvar save-selected-window-window)
-
;;;###autoload
(defun gnus-button-mailto (address)
"Mail to ADDRESS."
(set-buffer (gnus-copy-article-buffer))
(gnus-setup-message 'message
- (message-reply address))
- (and (boundp 'save-selected-window-window)
- (not (window-live-p save-selected-window-window))
- (setq save-selected-window-window (selected-window))))
+ (message-reply address)))
;;;###autoload
(defun gnus-button-reply (&optional to-address wide)
"Like `message-reply'."
(interactive)
(gnus-setup-message 'message
- (message-reply to-address wide))
- (and (boundp 'save-selected-window-window)
- (not (window-live-p save-selected-window-window))
- (setq save-selected-window-window (selected-window))))
+ (message-reply to-address wide)))
;;;###autoload
(define-mail-user-agent 'gnus-user-agent
(gnus-make-local-hook 'message-header-hook)
(add-hook 'message-header-hook 'gnus-agent-possibly-save-gcc nil t))
(setq message-post-method
- `(lambda (arg)
+ `(lambda (&optional arg)
(gnus-post-method arg ,gnus-newsgroup-name)))
(setq message-newsreader (setq message-mailer (gnus-extended-version)))
(message-add-action
(delete-region (point) (point-max))
(insert yank-string))
(gnus-article-delete-text-of-type 'annotation)
+ (gnus-article-delete-text-of-type 'multipart)
(gnus-remove-text-with-property 'gnus-prev)
(gnus-remove-text-with-property 'gnus-next)
(gnus-remove-text-with-property 'gnus-decoration)
(gcc (cond
((functionp group)
(funcall group))
- ((or (stringp group) (list group))
+ ((or (stringp group) (listp group))
group))))
(when gcc
(insert "Gcc: "
;;; gnus-nocem.el --- NoCeM pseudo-cancellation treatment
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2004
-;; Free Software Foundation, Inc.
-
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(require 'gnus-range)
(defgroup gnus-nocem nil
- "NoCeM pseudo-cancellation treatment"
+ "NoCeM pseudo-cancellation treatment."
:group 'gnus-score)
(defcustom gnus-nocem-groups
:group 'gnus-nocem
:type 'integer)
-(defcustom gnus-nocem-verifyer 'mc-verify
+(defcustom gnus-nocem-verifyer 'pgg-verify
"*Function called to verify that the NoCeM message is valid.
-One likely value is `mc-verify'. If the function in this variable
+One likely value is `pgg-verify'. If the function in this variable
isn't bound, the message will be used unconditionally."
:group 'gnus-nocem
- :type '(radio (function-item mc-verify)
+ :type '(radio (function-item pgg-verify)
+ (function-item mc-verify)
(function :tag "other")))
(defcustom gnus-nocem-liberal-fetch nil
(defun gnus-fill-real-hashtb ()
"Fill up a hash table with the real-name mappings from the user's active file."
- (setq gnus-nocem-real-group-hashtb (gnus-make-hashtable
- (length gnus-newsrc-alist)))
+ (if (hash-table-p gnus-nocem-real-group-hashtb)
+ (clrhash gnus-nocem-real-group-hashtb)
+ (setq gnus-nocem-real-group-hashtb (make-hash-table :test 'equal)))
(mapcar (lambda (group)
(setq group (gnus-group-real-name (car group)))
- (gnus-sethash group t gnus-nocem-real-group-hashtb))
+ (puthash group t gnus-nocem-real-group-hashtb))
gnus-newsrc-alist))
+;;;###autoload
(defun gnus-nocem-scan-groups ()
"Scan all NoCeM groups for new NoCeM messages."
(interactive)
(not (member (mail-header-message-id header)
gnus-nocem-seen-message-ids))))
(push header check-headers)))
- (let* ((i 0)
- (check-headers
- (last check-headers gnus-nocem-check-article-limit))
- (len (length check-headers)))
+ (setq check-headers (last (nreverse check-headers)
+ gnus-nocem-check-article-limit))
+ (let ((i 0)
+ (len (length check-headers)))
(dolist (h check-headers)
(gnus-message
7 "Checking article %d in %s for NoCeM (%d of %d)..."
(days-to-time gnus-nocem-expiry-wait)))
(gnus-request-article-this-buffer (mail-header-number header) group)
(goto-char (point-min))
- (when (re-search-forward "-----BEGIN PGP MESSAGE-----" nil t)
+ (when (re-search-forward
+ "-----BEGIN PGP\\(?: SIGNED\\)? MESSAGE-----"
+ nil t)
(delete-region (point-min) (match-beginning 0)))
- (when (re-search-forward "-----END PGP MESSAGE-----\n?" nil t)
+ (when (re-search-forward
+ "-----END PGP \\(?:MESSAGE\\|SIGNATURE\\)-----\n?"
+ nil t)
(delete-region (match-end 0) (point-max)))
(goto-char (point-min))
;; The article has to have proper NoCeM headers.
;; We get the name of the issuer.
(narrow-to-region b e)
(setq issuer (mail-fetch-field "issuer")
- type (mail-fetch-field "issuer"))
+ type (mail-fetch-field "type"))
(widen)
(if (not (gnus-nocem-message-wanted-p issuer type))
(message "invalid NoCeM issuer: %s" issuer)
(while (setq condition (pop conditions))
(cond
((stringp condition)
- (setq wanted (string-match condition type)))
+ (when (string-match condition type)
+ (setq wanted t)))
((and (consp condition)
(eq (car condition) 'not)
(stringp (cadr condition)))
- (setq wanted (not (string-match (cadr condition) type))))
+ (when (string-match (cadr condition) type)
+ (setq wanted nil)))
(t
(error "Invalid NoCeM condition: %S" condition))))
wanted))))
(defun gnus-nocem-verify-issuer (person)
"Verify using PGP that the canceler is who she says she is."
- (if (fboundp gnus-nocem-verifyer)
+ (if (functionp gnus-nocem-verifyer)
(ignore-errors
(funcall gnus-nocem-verifyer))
;; If we don't have Mailcrypt, then we use the message anyway.
(while (search-forward "\t" nil t)
(cond
((not (ignore-errors
- (setq group (let ((obarray gnus-nocem-real-group-hashtb))
- (read buf)))))
+ (setq group (gnus-group-real-name (symbol-name (read buf))))
+ (gethash group gnus-nocem-real-group-hashtb)))
;; An error.
)
- ((not (symbolp group))
- ;; Ignore invalid entries.
- )
- ((not (boundp group))
- ;; Make sure all entries in the hashtb are bound.
- (set group nil))
(t
- (when (gnus-gethash (gnus-group-real-name (symbol-name group))
- gnus-nocem-real-group-hashtb)
- ;; Valid group.
- (beginning-of-line)
- (while (eq (char-after) ?\t)
- (forward-line -1))
- (setq id (buffer-substring (point) (1- (search-forward "\t"))))
- (unless (gnus-gethash id gnus-nocem-hashtb)
- ;; only store if not already present
- (gnus-sethash id t gnus-nocem-hashtb)
- (push id ncm))
- (forward-line 1)
- (while (eq (char-after) ?\t)
- (forward-line 1))))))
+ ;; Valid group.
+ (beginning-of-line)
+ (while (eq (char-after) ?\t)
+ (forward-line -1))
+ (setq id (buffer-substring (point) (1- (search-forward "\t"))))
+ (unless (if (hash-table-p gnus-nocem-hashtb)
+ (gethash id gnus-nocem-hashtb)
+ (setq gnus-nocem-hashtb (make-hash-table :test 'equal))
+ nil)
+ ;; only store if not already present
+ (puthash id t gnus-nocem-hashtb)
+ (push id ncm))
+ (forward-line 1)
+ (while (eq (char-after) ?\t)
+ (forward-line 1)))))
(when ncm
(setq gnus-nocem-touched-alist t)
(push (cons (let ((time (current-time))) (setcdr (cdr time) nil) time)
gnus-nocem-alist))
t)))
+;;;###autoload
(defun gnus-nocem-load-cache ()
"Load the NoCeM cache."
(interactive)
(prev pprev)
(expiry (days-to-time gnus-nocem-expiry-wait))
entry)
- (setq gnus-nocem-hashtb (gnus-make-hashtable (* (length alist) 51)))
+ (if (hash-table-p gnus-nocem-hashtb)
+ (clrhash gnus-nocem-hashtb)
+ (setq gnus-nocem-hashtb (make-hash-table :test 'equal)))
(while (setq entry (car alist))
(if (not (time-less-p (time-since (car entry)) expiry))
;; This entry has expired, so we remove it.
;; This is ok, so we enter it into the hashtable.
(setq entry (cdr entry))
(while entry
- (gnus-sethash (car entry) t gnus-nocem-hashtb)
+ (puthash (car entry) t gnus-nocem-hashtb)
(setq entry (cdr entry))))
(setq alist (cdr alist)))))
(defun gnus-nocem-unwanted-article-p (id)
"Say whether article ID in the current group is wanted."
(and gnus-nocem-hashtb
- (gnus-gethash id gnus-nocem-hashtb)))
+ (gethash id gnus-nocem-hashtb)))
(provide 'gnus-nocem)
;;; gnus-picon.el --- displaying pretty icons in Gnus
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news xpm annotation glyph faces
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(const right))
:group 'gnus-picon)
-(defface gnus-picon-xbm-face '((t (:foreground "black" :background "white")))
+(defface gnus-picon-xbm '((t (:foreground "black" :background "white")))
"Face to show xbm picon in."
:group 'gnus-picon)
+;; backward-compatibility alias
+(put 'gnus-picon-xbm-face 'face-alias 'gnus-picon-xbm)
-(defface gnus-picon-face '((t (:foreground "black" :background "white")))
+(defface gnus-picon '((t (:foreground "black" :background "white")))
"Face to show picon in."
:group 'gnus-picon)
+;; backward-compatibility alias
+(put 'gnus-picon-face 'face-alias 'gnus-picon)
;;; Internal variables:
;;; gnus-range.el --- range and sequence functions for Gnus
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2004
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; gnus-registry.el --- article registry for Gnus
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Ted Zlatanov <tzz@lifelogs.com>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; gnus-salt.el --- alternate summary mode interfaces for Gnus
-;; Copyright (C) 1996, 1997, 1998, 1999, 2001
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;; Set up the menu.
(when (gnus-visual-p 'pick-menu 'menu)
(gnus-pick-make-menu-bar))
- (add-minor-mode 'gnus-pick-mode " Pick" gnus-pick-mode-map
- nil 'gnus-pick-mode)
+ (add-minor-mode 'gnus-pick-mode " Pick" gnus-pick-mode-map)
(gnus-run-hooks 'gnus-pick-mode-hook))))
(defun gnus-pick-setup-message ()
;; Set up the menu.
(when (gnus-visual-p 'binary-menu 'menu)
(gnus-binary-make-menu-bar))
- (add-minor-mode 'gnus-binary-mode " Binary"
- gnus-binary-mode-map nil 'gnus-binary-mode)
+ (add-minor-mode 'gnus-binary-mode " Binary" gnus-binary-mode-map)
(gnus-run-hooks 'gnus-binary-mode-hook))))
(defun gnus-binary-display-article (article &optional all-header)
(gnus-set-work-buffer)
(gnus-tree-node-insert (make-mail-header "") nil)
(setq gnus-tree-node-length (1- (point))))
- (gnus-run-hooks 'gnus-tree-mode-hook))
+ (gnus-run-mode-hooks 'gnus-tree-mode-hook))
(defun gnus-tree-read-summary-keys (&optional arg)
"Read a summary buffer key sequence and execute it."
(buffer-disable-undo)
(setq buffer-read-only t)
(make-local-variable 'gnus-carpal-attached-buffer)
- (gnus-run-hooks 'gnus-carpal-mode-hook))
+ (gnus-run-mode-hooks 'gnus-carpal-mode-hook))
(defun gnus-carpal-setup-buffer (type)
(let ((buffer (symbol-value (intern (format "gnus-carpal-%s-buffer" type)))))
;;; gnus-score.el --- scoring code for Gnus
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+;; 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Per Abrahamsen <amanda@iesd.auc.dk>
;; Lars Magne Ingebrigtsen <larsi@gnus.org>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
number))
(defcustom gnus-update-score-entry-dates t
- "*In non-nil, update matching score entry dates.
+ "*If non-nil, update matching score entry dates.
If this variable is nil, then score entries that provide matches
will be expired along with non-matching score entries."
:group 'gnus-score-expire
It can be:
* A string
- This file file will be used as the home score file.
+ This file will be used as the home score file.
* A function
The result of this function will be used as the home score file.
The elements in this list can be:
* `(regexp file-name ...)'
- If the `regexp' matches the group name, the first `file-name' will
+ If the `regexp' matches the group name, the first `file-name'
will be used as the home score file. (Multiple filenames are
allowed so that one may use gnus-score-file-single-match-alist to
set this variable.)
(function :value fun)))
(defcustom gnus-default-adaptive-score-alist
- '((gnus-kill-file-mark)
+ `((gnus-kill-file-mark)
(gnus-unread-mark)
- (gnus-read-mark (from 3) (subject 30))
- (gnus-catchup-mark (subject -10))
- (gnus-killed-mark (from -1) (subject -20))
- (gnus-del-mark (from -2) (subject -15)))
- "*Alist of marks and scores."
+ (gnus-read-mark
+ (from , (+ 2 gnus-score-decay-constant))
+ (subject , (+ 27 gnus-score-decay-constant)))
+ (gnus-catchup-mark
+ (subject , (+ -7 (* -1 gnus-score-decay-constant))))
+ (gnus-killed-mark
+ (from , (- -1 gnus-score-decay-constant))
+ (subject , (+ -17 (* -1 gnus-score-decay-constant))))
+ (gnus-del-mark
+ (from , (- -1 gnus-score-decay-constant))
+ (subject , (+ -12 (* -1 gnus-score-decay-constant)))))
+ "Alist of marks and scores.
+If you use score decays, you might want to set values higher than
+`gnus-score-decay-constant'."
:group 'gnus-score-adapt
:type '(repeat (cons (symbol :tag "Mark")
(repeat (list (choice :tag "Header"
(intern ; need symbol
(gnus-completing-read-with-default
(symbol-name (car gnus-extra-headers)) ; default response
- "Score extra header:" ; prompt
+ "Score extra header" ; prompt
(mapcar (lambda (x) ; completion list
(cons (symbol-name x) x))
gnus-extra-headers)
;; If this is an integer comparison, we transform from string to int.
(if (eq (nth 2 (assoc header gnus-header-index)) 'gnus-score-integer)
(if (stringp match)
- (setq match (string-to-int match)))
+ (setq match (string-to-number match)))
(set-text-properties 0 (length match) nil match))
(unless (eq date 'now)
t)
(read-string "Match: ")
(if (y-or-n-p "Use regexp match? ") 'r 's)
- (string-to-int (read-string "Score: "))))
+ (string-to-number (read-string "Score: "))))
(save-excursion
(unless (and (stringp match) (> (length match) 0))
(error "No match"))
"Automatically mark articles with score below SCORE as read."
(interactive
(list (or (and current-prefix-arg (prefix-numeric-value current-prefix-arg))
- (string-to-int (read-string "Mark below: ")))))
+ (string-to-number (read-string "Mark below: ")))))
(setq score (or score gnus-summary-default-score 0))
(gnus-score-set 'mark (list score))
(gnus-score-set 'touched '(t))
"Automatically expunge articles with score below SCORE."
(interactive
(list (or (and current-prefix-arg (prefix-numeric-value current-prefix-arg))
- (string-to-int (read-string "Set expunge below: ")))))
+ (string-to-number (read-string "Set expunge below: ")))))
(setq score (or score gnus-summary-default-score 0))
(gnus-score-set 'expunge (list score))
(gnus-score-set 'touched '(t)))
"Edit the all.SCORE file."
(interactive)
(find-file (gnus-score-file-name "all"))
- (gnus-score-mode))
+ (gnus-score-mode)
+ (setq gnus-score-edit-exit-function 'gnus-score-edit-done)
+ (gnus-message
+ 4 (substitute-command-keys
+ "\\<gnus-score-mode-map>\\[gnus-score-edit-exit] to save edits")))
(defun gnus-score-edit-file (file)
"Edit a score file."
;;; gnus-setup.el --- Initialization & Setup for Gnus 5
-;; Copyright (C) 1995, 1996, 2000, 2001, 2004
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1995, 1996, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Steven L. Baur <steve@miranova.com>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;; My head is starting to spin with all the different mail/news packages.
;;; gnus-sieve.el --- Utilities to manage sieve scripts for Gnus
-;; Copyright (C) 2001, 2003 Free Software Foundation, Inc.
+
+;; Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: NAGY Andras <nagya@inf.elte.hu>,
;; Simon Josefsson <simon@josefsson.org>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(let ((rule (gnus-sieve-guess-rule-for-article))
(info (gnus-get-info gnus-newsgroup-name)))
(if (null rule)
- (error "Could not guess rule for article.")
+ (error "Could not guess rule for article")
(gnus-info-set-params info (cons rule (gnus-info-params info)))
(message "Added rule in group %s for article: %s" gnus-newsgroup-name
rule)))))
;;; gnus-soup.el --- SOUP packet writing support for Gnus
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2002
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Per Abrahamsen <abraham@iesd.auc.dk>
;; Lars Magne Ingebrigtsen <larsi@gnus.org>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(packer (if (< (string-match "%s" packer)
(string-match "%d" packer))
(format packer files
- (string-to-int (gnus-soup-unique-prefix dir)))
+ (string-to-number (gnus-soup-unique-prefix dir)))
(format packer
- (string-to-int (gnus-soup-unique-prefix dir))
+ (string-to-number (gnus-soup-unique-prefix dir))
files)))
(dir (expand-file-name dir)))
(gnus-make-directory dir)
(and (eq (preceding-char) ?\t)
(gnus-soup-field))
(and (eq (preceding-char) ?\t)
- (string-to-int (gnus-soup-field))))
+ (string-to-number (gnus-soup-field))))
areas)
(when (eq (preceding-char) ?\t)
(beginning-of-line 2)))
(error "Bad header"))
(forward-line 1)
(setq beg (point)
- end (+ (point) (string-to-int
+ end (+ (point) (string-to-number
(buffer-substring
(match-beginning 1) (match-end 1)))))
(switch-to-buffer tmp-buf)
;;; gnus-spec.el --- format spec functions for Gnus
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; Code:
(eval-when-compile (require 'cl))
+(defvar gnus-newsrc-file-version)
(require 'gnus)
(t
(if (null args)
(error 'wrong-number-of-arguments #'my-format n fstring))
- (let* ((minlen (string-to-int (or (match-string 2) "")))
+ (let* ((minlen (string-to-number (or (match-string 2) "")))
(arg (car args))
(str (if (stringp arg) arg (format "%s" arg)))
(lpad (null (match-string 1)))
;;; gnus-srvr.el --- virtual server support for Gnus
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+;; 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
["Copy" gnus-server-copy-server t]
["Edit" gnus-server-edit-server t]
["Regenerate" gnus-server-regenerate-server t]
+ ["Compact" gnus-server-compact-server t]
["Exit" gnus-server-exit t]))
(easy-menu-define
"g" gnus-server-regenerate-server
+ "z" gnus-server-compact-server
+
"\C-c\C-i" gnus-info-find-node
"\C-c\C-b" gnus-bug))
-(defface gnus-server-agent-face
+(defface gnus-server-agent
'((((class color) (background light)) (:foreground "PaleTurquoise" :bold t))
(((class color) (background dark)) (:foreground "PaleTurquoise" :bold t))
(t (:bold t)))
"Face used for displaying AGENTIZED servers"
:group 'gnus-server-visual)
+;; backward-compatibility alias
+(put 'gnus-server-agent-face 'face-alias 'gnus-server-agent)
-(defface gnus-server-opened-face
+(defface gnus-server-opened
'((((class color) (background light)) (:foreground "Green3" :bold t))
(((class color) (background dark)) (:foreground "Green1" :bold t))
(t (:bold t)))
"Face used for displaying OPENED servers"
:group 'gnus-server-visual)
+;; backward-compatibility alias
+(put 'gnus-server-opened-face 'face-alias 'gnus-server-opened)
-(defface gnus-server-closed-face
+(defface gnus-server-closed
'((((class color) (background light)) (:foreground "Steel Blue" :italic t))
(((class color) (background dark))
(:foreground "Light Steel Blue" :italic t))
(t (:italic t)))
"Face used for displaying CLOSED servers"
:group 'gnus-server-visual)
+;; backward-compatibility alias
+(put 'gnus-server-closed-face 'face-alias 'gnus-server-closed)
-(defface gnus-server-denied-face
+(defface gnus-server-denied
'((((class color) (background light)) (:foreground "Red" :bold t))
(((class color) (background dark)) (:foreground "Pink" :bold t))
(t (:inverse-video t :bold t)))
"Face used for displaying DENIED servers"
:group 'gnus-server-visual)
+;; backward-compatibility alias
+(put 'gnus-server-denied-face 'face-alias 'gnus-server-denied)
-(defface gnus-server-offline-face
+(defface gnus-server-offline
'((((class color) (background light)) (:foreground "Orange" :bold t))
(((class color) (background dark)) (:foreground "Yellow" :bold t))
(t (:inverse-video t :bold t)))
"Face used for displaying OFFLINE servers"
:group 'gnus-server-visual)
+;; backward-compatibility alias
+(put 'gnus-server-offline-face 'face-alias 'gnus-server-offline)
-(defcustom gnus-server-agent-face 'gnus-server-agent-face
+(defcustom gnus-server-agent-face 'gnus-server-agent
"Face name to use on AGENTIZED servers."
:version "22.1"
:group 'gnus-server-visual
:type 'face)
-(defcustom gnus-server-opened-face 'gnus-server-opened-face
+(defcustom gnus-server-opened-face 'gnus-server-opened
"Face name to use on OPENED servers."
:version "22.1"
:group 'gnus-server-visual
:type 'face)
-(defcustom gnus-server-closed-face 'gnus-server-closed-face
+(defcustom gnus-server-closed-face 'gnus-server-closed
"Face name to use on CLOSED servers."
:version "22.1"
:group 'gnus-server-visual
:type 'face)
-(defcustom gnus-server-denied-face 'gnus-server-denied-face
+(defcustom gnus-server-denied-face 'gnus-server-denied
"Face name to use on DENIED servers."
:version "22.1"
:group 'gnus-server-visual
:type 'face)
-(defcustom gnus-server-offline-face 'gnus-server-offline-face
+(defcustom gnus-server-offline-face 'gnus-server-offline
"Face name to use on OFFLINE servers."
:version "22.1"
:group 'gnus-server-visual
(put 'gnus-server-mode 'font-lock-defaults '(gnus-server-font-lock-keywords t))
(set (make-local-variable 'font-lock-defaults)
'(gnus-server-font-lock-keywords t)))
- (gnus-run-hooks 'gnus-server-mode-hook))
+ (gnus-run-mode-hooks 'gnus-server-mode-hook))
(defun gnus-server-insert-server-line (gnus-tmp-name method)
(let* ((gnus-tmp-how (car method))
(setq truncate-lines t)
(gnus-set-default-directory)
(setq buffer-read-only t)
- (gnus-run-hooks 'gnus-browse-mode-hook))
+ (gnus-run-mode-hooks 'gnus-browse-mode-hook))
(defun gnus-browse-read-group (&optional no-article number)
"Enter the group at the current line.
(gnus-message 5 "Requesting regeneration of %s...done" server)
(gnus-message 5 "Couldn't regenerate %s" server))))
+
+;;;
+;;; Server compaction. -- dvl
+;;;
+
+;; #### FIXME: this function currently fails to update the Group buffer's
+;; #### appearance.
+(defun gnus-server-compact-server ()
+ "Issue a command to the server to compact all its groups.
+
+Note: currently only implemented in nnml."
+ (interactive)
+ (let ((server (gnus-server-server-name)))
+ (unless server
+ (error "No server on the current line"))
+ (condition-case ()
+ (gnus-get-function (gnus-server-to-method server)
+ 'request-compact)
+ (error
+ (error "This back end doesn't support compaction")))
+ (gnus-message 5 "\
+Requesting compaction of %s... (this may take a long time)"
+ server)
+ (unless (gnus-open-server server)
+ (error "Couldn't open server"))
+ (if (not (gnus-request-compact server))
+ (gnus-message 5 "Couldn't compact %s" server)
+ (gnus-message 5 "Requesting compaction of %s...done" server)
+ ;; Invalidate the original article buffer which might be out of date.
+ ;; #### NOTE: Yes, this might be a bit rude, but since compaction
+ ;; #### will not happen very often, I think this is acceptable.
+ (let ((original (get-buffer gnus-original-article-buffer)))
+ (and original (gnus-kill-buffer original))))))
+
(provide 'gnus-srvr)
;;; arch-tag: c0117f64-27ca-475d-9406-8da6854c7a25
;;; gnus-start.el --- startup functions for Gnus
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
"Subscribe the new GROUP interactively.
It is inserted in hierarchical newsgroup order if subscribed. If not,
it is killed."
- (if (gnus-y-or-n-p (format "Subscribe new newsgroup: %s " group))
+ (if (gnus-y-or-n-p (format "Subscribe new newsgroup %s? " group))
(gnus-subscribe-hierarchically group)
(push group gnus-killed-list)))
(defun gnus-no-server-1 (&optional arg slave)
"Read network news.
-If ARG is a positive number, Gnus will use that as the
-startup level. If ARG is nil, Gnus will be started at level 2.
-If ARG is non-nil and not a positive number, Gnus will
-prompt the user for the name of an NNTP server to use.
-As opposed to `gnus', this command will not connect to the local server."
+If ARG is a positive number, Gnus will use that as the startup
+level. If ARG is nil, Gnus will be started at level 2
+\(`gnus-level-default-subscribed' minus one). If ARG is non-nil
+and not a positive number, Gnus will prompt the user for the name
+of an NNTP server to use. As opposed to \\[gnus], this command
+will not connect to the local server."
(interactive "P")
(let ((val (or arg (1- gnus-level-default-subscribed))))
(gnus val t slave)
(nnheader-init-server-buffer)
(setq gnus-slave slave)
(gnus-read-init-file)
+
+ ;; Add "native" to gnus-predefined-server-alist just to have a
+ ;; name for the native select method.
+ (when gnus-select-method
+ (push (cons "native" gnus-select-method)
+ gnus-predefined-server-alist))
+
(if gnus-agent
(gnus-agentize))
(gnus-request-create-group "drafts" '(nndraft ""))
(unless (gnus-group-entry "nndraft:drafts")
(let ((gnus-level-default-subscribed 1))
- (gnus-subscribe-group "nndraft:drafts" nil '(nndraft "")))
+ (gnus-subscribe-group "nndraft:drafts" nil '(nndraft ""))))
+ (unless (equal (gnus-group-get-parameter "nndraft:drafts" 'gnus-dummy t)
+ '((gnus-draft-mode)))
+ (gnus-message 3 "Setting up drafts group")
(gnus-group-set-parameter
"nndraft:drafts" 'gnus-dummy '((gnus-draft-mode)))))
(set-buffer (setq gnus-dribble-buffer
(gnus-get-buffer-create
(file-name-nondirectory dribble-file))))
+ (set (make-local-variable 'file-precious-flag) t)
(erase-buffer)
(setq buffer-file-name dribble-file)
(auto-save-mode t)
(gnus-check-bogus-newsgroups))
;; We might read in new NoCeM messages here.
- (when (and gnus-use-nocem
- (not level)
- (not dont-connect))
+ (when (and (not dont-connect)
+ gnus-use-nocem
+ (or (and (numberp gnus-use-nocem)
+ (numberp level)
+ (>= level gnus-use-nocem))
+ (not level)))
(gnus-nocem-scan-groups))
;; Read any slave files.
;; command may have responded with the `(0 . 0)'. We
;; ignore this if we already have an active entry
;; for the group.
- (if (and (zerop (car active))
- (zerop (cdr active))
+ (if (and (zerop (or (car active) 0))
+ (zerop (or (cdr active) 0))
(gnus-active group))
(gnus-active group)
(cond
((looking-at "[0-9]+")
;; We narrow and read a number instead of buffer-substring/
- ;; string-to-int because it's faster. narrow/widen is
+ ;; string-to-number because it's faster. narrow/widen is
;; faster than save-restriction/narrow, and save-restriction
;; produces a garbage object.
(setq num1 (progn
(print-escape-nonascii t)
(print-length nil)
(print-level nil)
+ (print-circle nil)
(print-escape-newlines t)
(gnus-killed-list
(if (and gnus-save-killed-list
;;; gnus-sum.el --- summary mode commands for Gnus
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(eval-when-compile
(require 'cl)
- (defvar tool-bar-map))
+ (defvar tool-bar-mode))
(require 'gnus)
(require 'gnus-group)
(require 'gnus-int)
(require 'gnus-undo)
(require 'gnus-util)
+(require 'gmm-utils)
(require 'mm-decode)
(require 'nnoo)
(defcustom gnus-fetch-old-headers nil
"*Non-nil means that Gnus will try to build threads by grabbing old headers.
-If an unread article in the group refers to an older, already read (or
-just marked as read) article, the old article will not normally be
-displayed in the Summary buffer. If this variable is t, Gnus
-will attempt to grab the headers to the old articles, and thereby
-build complete threads. If it has the value `some', only enough
-headers to connect otherwise loose threads will be displayed. This
-variable can also be a number. In that case, no more than that number
-of old headers will be fetched. If it has the value `invisible', all
+If an unread article in the group refers to an older, already
+read (or just marked as read) article, the old article will not
+normally be displayed in the Summary buffer. If this variable is
+t, Gnus will attempt to grab the headers to the old articles, and
+thereby build complete threads. If it has the value `some', all
+old headers will be fetched but only enough headers to connect
+otherwise loose threads will be displayed. This variable can
+also be a number. In that case, no more than that number of old
+headers will be fetched. If it has the value `invisible', all
old headers will be fetched, but none will be displayed.
-The server has to support NOV for any of this to work."
+The server has to support NOV for any of this to work.
+
+This feature can seriously impact performance it ignores all
+locally cached header entries."
:group 'gnus-thread
:type '(choice (const :tag "off" nil)
(const :tag "on" t)
"*If non-nil, hide all threads initially.
This can be a predicate specifier which says which threads to hide.
If threads are hidden, you have to run the command
-`gnus-summary-show-thread' by hand or use `gnus-select-article-hook'
-to expose hidden threads."
+`gnus-summary-show-thread' by hand or select an article."
:group 'gnus-thread
:type '(radio (sexp :format "Non-nil\n"
:match (lambda (widget value)
first subject), `unread' (place point on the subject line of the first
unread article), `best' (place point on the subject line of the
higest-scored article), `unseen' (place point on the subject line of
-the first unseen article), 'unseen-or-unread' (place point on the subject
+the first unseen article), `unseen-or-unread' (place point on the subject
line of the first unseen article or, if all article have been seen, on the
subject line of the first unread article), or a function to be called to
place point on some subject line."
function; this specifies reversed sort order.
Ready-made functions include `gnus-thread-sort-by-number',
-`gnus-thread-sort-by-author', `gnus-thread-sort-by-subject',
-`gnus-thread-sort-by-date', `gnus-thread-sort-by-score',
-`gnus-thread-sort-by-most-recent-number',
-`gnus-thread-sort-by-most-recent-date',
-`gnus-thread-sort-by-random', and
-`gnus-thread-sort-by-total-score' (see `gnus-thread-score-function').
+`gnus-thread-sort-by-author', `gnus-thread-sort-by-recipient'
+`gnus-thread-sort-by-subject', `gnus-thread-sort-by-date',
+`gnus-thread-sort-by-score', `gnus-thread-sort-by-most-recent-number',
+`gnus-thread-sort-by-most-recent-date', `gnus-thread-sort-by-random',
+and `gnus-thread-sort-by-total-score' (see
+`gnus-thread-score-function').
When threading is turned off, the variable
`gnus-article-sort-functions' controls how articles are sorted."
:group 'gnus-summary-sort
- :type '(repeat
+ :type '(repeat
(gnus-widget-reversible
(choice (function-item gnus-thread-sort-by-number)
(function-item gnus-thread-sort-by-author)
+ (function-item gnus-thread-sort-by-recipient)
(function-item gnus-thread-sort-by-subject)
(function-item gnus-thread-sort-by-date)
(function-item gnus-thread-sort-by-score)
:group 'gnus-summary
:type 'boolean)
-(defcustom gnus-summary-selected-face 'gnus-summary-selected-face
+(defcustom gnus-summary-selected-face 'gnus-summary-selected
"Face used for highlighting the current article in the summary buffer."
:group 'gnus-summary-visual
:type 'face)
(defcustom gnus-summary-highlight
'(((eq mark gnus-canceled-mark)
- . gnus-summary-cancelled-face)
+ . gnus-summary-cancelled)
((and uncached (> score default-high))
- . gnus-summary-high-undownloaded-face)
+ . gnus-summary-high-undownloaded)
((and uncached (< score default-low))
- . gnus-summary-low-undownloaded-face)
+ . gnus-summary-low-undownloaded)
(uncached
- . gnus-summary-normal-undownloaded-face)
+ . gnus-summary-normal-undownloaded)
((and (> score default-high)
(or (eq mark gnus-dormant-mark)
(eq mark gnus-ticked-mark)))
- . gnus-summary-high-ticked-face)
+ . gnus-summary-high-ticked)
((and (< score default-low)
(or (eq mark gnus-dormant-mark)
(eq mark gnus-ticked-mark)))
- . gnus-summary-low-ticked-face)
+ . gnus-summary-low-ticked)
((or (eq mark gnus-dormant-mark)
(eq mark gnus-ticked-mark))
- . gnus-summary-normal-ticked-face)
+ . gnus-summary-normal-ticked)
((and (> score default-high) (eq mark gnus-ancient-mark))
- . gnus-summary-high-ancient-face)
+ . gnus-summary-high-ancient)
((and (< score default-low) (eq mark gnus-ancient-mark))
- . gnus-summary-low-ancient-face)
+ . gnus-summary-low-ancient)
((eq mark gnus-ancient-mark)
- . gnus-summary-normal-ancient-face)
+ . gnus-summary-normal-ancient)
((and (> score default-high) (eq mark gnus-unread-mark))
- . gnus-summary-high-unread-face)
+ . gnus-summary-high-unread)
((and (< score default-low) (eq mark gnus-unread-mark))
- . gnus-summary-low-unread-face)
+ . gnus-summary-low-unread)
((eq mark gnus-unread-mark)
- . gnus-summary-normal-unread-face)
+ . gnus-summary-normal-unread)
((> score default-high)
- . gnus-summary-high-read-face)
+ . gnus-summary-high-read)
((< score default-low)
- . gnus-summary-low-read-face)
+ . gnus-summary-low-read)
(t
- . gnus-summary-normal-read-face))
+ . gnus-summary-normal-read))
"*Controls the highlighting of summary buffer lines.
A list of (FORM . FACE) pairs. When deciding how a a particular
:type '(repeat symbol))
(defcustom gnus-ignored-from-addresses
- (and user-mail-address (regexp-quote user-mail-address))
+ (and user-mail-address
+ (not (string= user-mail-address ""))
+ (regexp-quote user-mail-address))
"*Regexp of From headers that may be suppressed in favor of To headers."
:version "21.1"
:group 'gnus-summary
:type 'regexp)
+(defcustom gnus-summary-to-prefix "-> "
+ "*String prefixed to the To field in the summary line when
+using `gnus-ignored-from-addresses'."
+ :version "22.1"
+ :group 'gnus-summary
+ :type 'string)
+
+(defcustom gnus-summary-newsgroup-prefix "=> "
+ "*String prefixed to the Newsgroup field in the summary
+line when using `gnus-ignored-from-addresses'."
+ :version "22.1"
+ :group 'gnus-summary
+ :type 'string)
+
(defcustom gnus-newsgroup-ignored-charsets '(unknown-8bit x-unknown)
"List of charsets that should be ignored.
When these charsets are used in the \"charset\" parameter, the
"Q" gnus-summary-exit
"Z" gnus-summary-exit
"n" gnus-summary-catchup-and-goto-next-group
+ "p" gnus-summary-catchup-and-goto-prev-group
"R" gnus-summary-reselect-current-group
"G" gnus-summary-rescan-group
"N" gnus-summary-next-group
"m" gnus-summary-repair-multipart
"v" gnus-article-view-part
"o" gnus-article-save-part
+ "O" gnus-article-save-part-and-strip
+ "r" gnus-article-replace-part
+ "d" gnus-article-delete-part
+ "j" gnus-article-jump-to-part
"c" gnus-article-copy-part
"C" gnus-article-view-part-as-charset
"e" gnus-article-view-part-externally
'(:help "Mark unread articles in this group as read, then exit"))]
["Catchup all and exit" gnus-summary-catchup-all-and-exit t]
["Catchup and goto next" gnus-summary-catchup-and-goto-next-group t]
+ ["Catchup and goto prev" gnus-summary-catchup-and-goto-prev-group t]
["Exit group" gnus-summary-exit
,@(if (featurep 'xemacs) '(t)
'(:help "Exit current group, return to group selection mode"))]
(defvar gnus-summary-tool-bar-map nil)
-;; Emacs 21 tool bar. Should be no-op otherwise.
-(defun gnus-summary-make-tool-bar ()
- (if (and (fboundp 'tool-bar-add-item-from-menu)
- (default-value 'tool-bar-mode)
- (not gnus-summary-tool-bar-map))
- (setq gnus-summary-tool-bar-map
- (let ((tool-bar-map (make-sparse-keymap))
- (load-path (mm-image-load-path)))
- (tool-bar-add-item-from-menu
- 'gnus-summary-prev-unread "prev-ur" gnus-summary-mode-map)
- (tool-bar-add-item-from-menu
- 'gnus-summary-next-unread "next-ur" gnus-summary-mode-map)
- (tool-bar-add-item-from-menu
- 'gnus-summary-post-news "post" gnus-summary-mode-map)
- (tool-bar-add-item-from-menu
- 'gnus-summary-followup-with-original "fuwo" gnus-summary-mode-map)
- (tool-bar-add-item-from-menu
- 'gnus-summary-followup "followup" gnus-summary-mode-map)
- (tool-bar-add-item-from-menu
- 'gnus-summary-reply-with-original "reply-wo" gnus-summary-mode-map)
- (tool-bar-add-item-from-menu
- 'gnus-summary-reply "reply" gnus-summary-mode-map)
- (tool-bar-add-item-from-menu
- 'gnus-summary-caesar-message "rot13" gnus-summary-mode-map)
- (tool-bar-add-item-from-menu
- 'gnus-uu-decode-uu "uu-decode" gnus-summary-mode-map)
- (tool-bar-add-item-from-menu
- 'gnus-summary-save-article-file "save-aif" gnus-summary-mode-map)
- (tool-bar-add-item-from-menu
- 'gnus-summary-save-article "save-art" gnus-summary-mode-map)
- (tool-bar-add-item-from-menu
- 'gnus-uu-post-news "uu-post" gnus-summary-mode-map)
- (tool-bar-add-item-from-menu
- 'gnus-uu-post-news "uu-post" gnus-summary-mode-map)
- (tool-bar-add-item-from-menu
- 'gnus-summary-catchup "catchup" gnus-summary-mode-map)
- (tool-bar-add-item-from-menu
- 'gnus-summary-catchup-and-exit "cu-exit" gnus-summary-mode-map)
- (tool-bar-add-item-from-menu
- 'gnus-summary-exit "exit-summ" gnus-summary-mode-map)
- tool-bar-map)))
- (if gnus-summary-tool-bar-map
- (set (make-local-variable 'tool-bar-map) gnus-summary-tool-bar-map)))
+;; Note: The :set function in the `gnus-summary-tool-bar*' variables will only
+;; affect _new_ message buffers. We might add a function that walks thru all
+;; summary-mode buffers and force the update.
+(defun gnus-summary-tool-bar-update (&optional symbol value)
+ "Update summary mode toolbar.
+Setter function for custom variables."
+ (setq-default gnus-summary-tool-bar-map nil)
+ (when symbol
+ ;; When used as ":set" function:
+ (set-default symbol value))
+ (when (gnus-buffer-live-p gnus-summary-buffer)
+ (with-current-buffer gnus-summary-buffer
+ (gnus-summary-make-tool-bar))))
+
+(defcustom gnus-summary-tool-bar (if (eq gmm-tool-bar-style 'gnome)
+ 'gnus-summary-tool-bar-gnome
+ 'gnus-summary-tool-bar-retro)
+ "Specifies the Gnus summary tool bar.
+
+It can be either a list or a symbol refering to a list. See
+`gmm-tool-bar-from-list' for the format of the list. The
+default key map is `gnus-summary-mode-map'.
+
+Pre-defined symbols include `gnus-summary-tool-bar-gnome' and
+`gnus-summary-tool-bar-retro'."
+ :type '(choice (const :tag "GNOME style" gnus-summary-tool-bar-gnome)
+ (const :tag "Retro look" gnus-summary-tool-bar-retro)
+ (repeat :tag "User defined list" gmm-tool-bar-item)
+ (symbol))
+ :version "23.0" ;; No Gnus
+ :initialize 'custom-initialize-default
+ :set 'gnus-summary-tool-bar-update
+ :group 'gnus-summary)
+
+(defcustom gnus-summary-tool-bar-gnome
+ '((gnus-summary-post-news "mail/compose" nil)
+ (gnus-summary-insert-new-articles "mail/inbox" nil
+ :visible (or (not gnus-agent)
+ gnus-plugged))
+ (gnus-summary-reply-with-original "mail/reply")
+ (gnus-summary-reply "mail/reply" nil :visible nil)
+ (gnus-summary-followup-with-original "mail/reply-all")
+ (gnus-summary-followup "mail/reply-all" nil :visible nil)
+ (gnus-summary-mail-forward "mail/forward")
+ (gnus-summary-save-article "mail/save")
+ (gnus-summary-search-article-forward "search" nil :visible nil)
+ (gnus-summary-print-article "print")
+ (gnus-summary-tick-article-forward "flag-followup" nil :visible nil)
+ ;; Some new commands that may need more suitable icons:
+ (gnus-summary-save-newsrc "save" nil :visible nil)
+ ;; (gnus-summary-show-article "stock_message-display" nil :visible nil)
+ (gnus-summary-prev-article "left-arrow")
+ (gnus-summary-next-article "right-arrow")
+ (gnus-summary-next-page "next-page")
+ ;; (gnus-summary-enter-digest-group "right_arrow" nil :visible nil)
+ ;;
+ ;; Maybe some sort-by-... could be added:
+ ;; (gnus-summary-sort-by-author "sort-a-z" nil :visible nil)
+ ;; (gnus-summary-sort-by-date "sort-1-9" nil :visible nil)
+ (gnus-summary-mark-as-expirable
+ "delete" nil
+ :visible (gnus-check-backend-function 'request-expire-articles
+ gnus-newsgroup-name))
+ (gnus-summary-mark-as-spam
+ "mail/spam" t
+ :visible (and (fboundp 'spam-group-ham-contents-p)
+ (spam-group-ham-contents-p gnus-newsgroup-name))
+ :help "Mark as spam")
+ (gnus-summary-mark-as-read-forward
+ "mail/not-spam" nil
+ :visible (and (fboundp 'spam-group-spam-contents-p)
+ (spam-group-spam-contents-p gnus-newsgroup-name)))
+ ;;
+ (gnus-summary-exit "exit")
+ (gmm-customize-mode "preferences" t :help "Edit mode preferences")
+ (gnus-info-find-node "help"))
+ "List of functions for the summary tool bar (GNOME style).
+
+See `gmm-tool-bar-from-list' for the format of the list."
+ :type '(repeat gmm-tool-bar-item)
+ :version "23.0" ;; No Gnus
+ :initialize 'custom-initialize-default
+ :set 'gnus-summary-tool-bar-update
+ :group 'gnus-summary)
+
+(defcustom gnus-summary-tool-bar-retro
+ '((gnus-summary-prev-unread-article "gnus/prev-ur")
+ (gnus-summary-next-unread-article "gnus/next-ur")
+ (gnus-summary-post-news "gnus/post")
+ (gnus-summary-followup-with-original "gnus/fuwo")
+ (gnus-summary-followup "gnus/followup")
+ (gnus-summary-reply-with-original "gnus/reply-wo")
+ (gnus-summary-reply "gnus/reply")
+ (gnus-summary-caesar-message "gnus/rot13")
+ (gnus-uu-decode-uu "gnus/uu-decode")
+ (gnus-summary-save-article-file "gnus/save-aif")
+ (gnus-summary-save-article "gnus/save-art")
+ (gnus-uu-post-news "gnus/uu-post")
+ (gnus-summary-catchup "gnus/catchup")
+ (gnus-summary-catchup-and-exit "gnus/cu-exit")
+ (gnus-summary-exit "gnus/exit-summ")
+ ;; Some new command that may need more suitable icons:
+ (gnus-summary-print-article "gnus/print" nil :visible nil)
+ (gnus-summary-mark-as-expirable "gnus/close" nil :visible nil)
+ (gnus-summary-save-newsrc "gnus/save" nil :visible nil)
+ ;; (gnus-summary-enter-digest-group "gnus/right_arrow" nil :visible nil)
+ (gnus-summary-search-article-forward "gnus/search" nil :visible nil)
+ ;; (gnus-summary-insert-new-articles "gnus/paste" nil :visible nil)
+ ;; (gnus-summary-toggle-threads "gnus/open" nil :visible nil)
+ ;;
+ (gnus-info-find-node "gnus/help" nil :visible nil))
+ "List of functions for the summary tool bar (retro look).
+
+See `gmm-tool-bar-from-list' for the format of the list."
+ :type '(repeat gmm-tool-bar-item)
+ :version "23.0" ;; No Gnus
+ :initialize 'custom-initialize-default
+ :set 'gnus-summary-tool-bar-update
+ :group 'gnus-summary)
+
+(defcustom gnus-summary-tool-bar-zap-list t
+ "List of icon items from the global tool bar.
+These items are not displayed in the Gnus summary mode tool bar.
+
+See `gmm-tool-bar-from-list' for the format of the list."
+ :type 'gmm-tool-bar-zap-list
+ :version "23.0" ;; No Gnus
+ :initialize 'custom-initialize-default
+ :set 'gnus-summary-tool-bar-update
+ :group 'gnus-summary)
+
+(defvar image-load-path)
+
+(defun gnus-summary-make-tool-bar (&optional force)
+ "Make a summary mode tool bar from `gnus-summary-tool-bar'.
+When FORCE, rebuild the tool bar."
+ (when (and (not (featurep 'xemacs))
+ (boundp 'tool-bar-mode)
+ tool-bar-mode
+ (or (not gnus-summary-tool-bar-map) force))
+ (let* ((load-path
+ (gmm-image-load-path-for-library "gnus"
+ "mail/save.xpm"
+ nil t))
+ (image-load-path (cons (car load-path)
+ (when (boundp 'image-load-path)
+ image-load-path)))
+ (map (gmm-tool-bar-from-list gnus-summary-tool-bar
+ gnus-summary-tool-bar-zap-list
+ 'gnus-summary-mode-map)))
+ (when map
+ ;; Need to set `gnus-summary-tool-bar-map' because `gnus-article-mode'
+ ;; uses it's value.
+ (setq gnus-summary-tool-bar-map map))))
+ (set (make-local-variable 'tool-bar-map) gnus-summary-tool-bar-map))
(defun gnus-score-set-default (var value)
"A version of set that updates the GNU Emacs menu-bar."
\\{gnus-summary-mode-map}"
(interactive)
(kill-all-local-variables)
+ (let ((gnus-summary-local-variables gnus-newsgroup-variables))
+ (gnus-summary-make-local-variables))
+ (gnus-summary-make-local-variables)
+ (setq gnus-newsgroup-name group)
(when (gnus-visual-p 'summary-menu 'menu)
(gnus-summary-make-menu-bar)
(gnus-summary-make-tool-bar))
- (gnus-summary-make-local-variables)
- (let ((gnus-summary-local-variables gnus-newsgroup-variables))
- (gnus-summary-make-local-variables))
(gnus-make-thread-indent-array)
(gnus-simplify-mode-line)
(setq major-mode 'gnus-summary-mode)
(setq selective-display-ellipses t) ;Display `...'
(gnus-summary-set-display-table)
(gnus-set-default-directory)
- (setq gnus-newsgroup-name group)
(make-local-variable 'gnus-summary-line-format)
(make-local-variable 'gnus-summary-line-format-spec)
(make-local-variable 'gnus-summary-dummy-line-format)
(make-local-variable 'gnus-summary-mark-positions)
(gnus-make-local-hook 'pre-command-hook)
(add-hook 'pre-command-hook 'gnus-set-global-variables nil t)
- (gnus-run-hooks 'gnus-summary-mode-hook)
+ (gnus-run-mode-hooks 'gnus-summary-mode-hook)
(turn-on-gnus-mailing-list-mode)
(mm-enable-multibyte)
(gnus-update-format-specifications nil 'summary 'summary-mode 'summary-dummy)
(aset table ?\r nil)
;; We keep TAB as well.
(aset table ?\t nil)
- ;; We nix out any glyphs over 126 that are not set already.
- (let ((i 256))
+ ;; We nix out any glyphs 127 through 255, or 127 through 159 in
+ ;; Emacs 23 (unicode), that are not set already.
+ (let ((i (if (ignore-errors (= (make-char 'latin-iso8859-1 160) 160))
+ 160
+ 256)))
(while (>= (setq i (1- i)) 127)
;; Only modify if the entry is nil.
(unless (aref table i)
newsgroups)
(cond
((setq to (cdr (assq 'To extra-headers)))
- (concat "-> "
+ (concat gnus-summary-to-prefix
(inline
(gnus-summary-extract-address-component
(funcall gnus-decode-encoded-word-function to)))))
- ((setq newsgroups (cdr (assq 'Newsgroups extra-headers)))
- (concat "=> " newsgroups)))))
+ ((setq newsgroups
+ (or
+ (cdr (assq 'Newsgroups extra-headers))
+ (and
+ (memq 'Newsgroups gnus-extra-headers)
+ (eq (car (gnus-find-method-for-group
+ gnus-newsgroup-name)) 'nntp)
+ (gnus-group-real-name gnus-newsgroup-name))))
+ (concat gnus-summary-newsgroup-prefix newsgroups)))))
(inline (gnus-summary-extract-address-component gnus-tmp-from)))))
(defun gnus-summary-insert-line (gnus-tmp-header
(or (cdr (assq 'To (mail-header-extra h2))) ""))))
(or (car extract) (cadr extract)))))
+(defun gnus-thread-sort-by-recipient (h1 h2)
+ "Sort threads by root recipient."
+ (gnus-article-sort-by-recipient
+ (gnus-thread-header h1) (gnus-thread-header h2)))
+
(defsubst gnus-article-sort-by-subject (h1 h2)
"Sort articles by root subject."
(string-lessp
:version "22.1"
:type '(radio (const :format "%v " nil) string)
:group 'gnus-thread)
+
(defcustom gnus-sum-thread-tree-false-root "> "
"With %B spec, used for a false root of a thread.
If nil, use subject instead."
:version "22.1"
:type '(radio (const :format "%v " nil) string)
:group 'gnus-thread)
+
(defcustom gnus-sum-thread-tree-single-indent ""
"With %B spec, used for a thread with just one message.
If nil, use subject instead."
:version "22.1"
:type '(radio (const :format "%v " nil) string)
:group 'gnus-thread)
+
(defcustom gnus-sum-thread-tree-vertical "| "
"With %B spec, used for drawing a vertical line."
:version "22.1"
:type 'string
:group 'gnus-thread)
+
(defcustom gnus-sum-thread-tree-indent " "
"With %B spec, used for indenting."
:version "22.1"
:type 'string
:group 'gnus-thread)
+
(defcustom gnus-sum-thread-tree-leaf-with-other "+-> "
"With %B spec, used for a leaf with brothers."
:version "22.1"
:type 'string
:group 'gnus-thread)
+
(defcustom gnus-sum-thread-tree-single-leaf "\\-> "
"With %B spec, used for a leaf without brothers."
:version "22.1"
(match-end 1)))
(substring xrefs (match-beginning 1) (match-end 1))))
(setq number
- (string-to-int (substring xrefs (match-beginning 2)
+ (string-to-number (substring xrefs (match-beginning 2)
(match-end 2))))
(if (setq entry (gnus-gethash group xref-hashtb))
(setcdr entry (cons number (cdr entry)))
(allp (cond
((eq gnus-read-all-available-headers t)
t)
- ((stringp gnus-read-all-available-headers)
+ ((and (stringp gnus-read-all-available-headers)
+ group)
(string-match gnus-read-all-available-headers group))
(t
nil)))
(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)
(setq nlast (if (atom (cadr read)) (cadr read) (caadr read)))
(setq read (cdr read)))))
;; And add the last unread articles.
- (cond ((< first last)
- (push (cons first last) unread))
- ((= first last)
- (push first unread)))
+ (cond ((not (and first last))
+ nil)
+ ((< first last)
+ (push (cons first last) unread))
+ ((= first last)
+ (push first unread)))
;; Return the sequence of unread articles.
(delq 0 (nreverse unread))))
(gnus-completing-read-with-default
(symbol-name (car gnus-extra-headers))
(if current-prefix-arg
- "Exclude extra header:"
- "Limit extra header:")
+ "Exclude extra header"
+ "Limit extra header")
(mapcar (lambda (x)
(cons (symbol-name x) x))
gnus-extra-headers)
gnus-newsgroup-name)))))
(method
(gnus-completing-read-with-default
- methname "What backend do you want to use when respooling?"
+ methname "Backend to use when respooling"
methods nil t nil 'gnus-mail-method-history))
ms)
(cond
(save-excursion
(save-restriction
(message-narrow-to-head)
- (let ((head (buffer-string))
+ (let ((head (buffer-substring-no-properties
+ (point-min) (point-max)))
header)
(with-temp-buffer
(insert (format "211 %d Article retrieved.\n"
(when (gnus-summary-goto-subject article)
(gnus-summary-show-thread)
(gnus-summary-goto-subject article)
- (gnus-summary-update-secondary-mark article))))
+ (gnus-summary-update-secondary-mark article)))
+ t)
(defun gnus-summary-set-saved-mark (article)
"Set the process mark on ARTICLE and update the summary line."
(gnus-summary-catchup all))
(gnus-summary-next-group))
+(defun gnus-summary-catchup-and-goto-prev-group (&optional all)
+ "Mark all articles in this group as read and select the previous group.
+If given a prefix, mark all articles, unread as well as ticked, as
+read."
+ (interactive "P")
+ (save-excursion
+ (gnus-summary-catchup all))
+ (gnus-summary-next-group nil nil t))
+
;;;
;;; with article
;;;
(defun gnus-map-articles (predicate articles)
"Map PREDICATE over ARTICLES and return non-nil if any predicate is non-nil."
(apply 'gnus-or (mapcar predicate
- (mapcar 'gnus-summary-article-header articles))))
+ (mapcar (lambda (number)
+ (gnus-summary-article-header number))
+ articles))))
(defun gnus-summary-hide-all-threads (&optional predicate)
"Hide all thread subtrees.
(let* ((split-name (gnus-get-split-value gnus-move-split-methods))
(minibuffer-confirm-incomplete nil) ; XEmacs
(prom
- (format "%s %s to:"
+ (format "%s %s to"
prompt
(if (> (length articles) 1)
(format "these %d articles" (length articles))
;;; gnus-topic.el --- a folding minor mode for Gnus group buffers
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+;; 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Ilja Weis <kult@uni-paderborn.de>
;; Lars Magne Ingebrigtsen <larsi@gnus.org>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(copy-sequence gnus-group-listed-groups))))
(gnus-update-format-specifications nil 'topic)
-
+
(when (or (not gnus-topic-alist)
(not gnus-topology-checked-p))
(gnus-topic-check-topology))
(not (eq (nth 2 type) 'hidden))
level all-entries unread))
(gnus-topic-update-unreads (car type) unread)
+ (when gnus-group-update-tool-bar
+ (gnus-put-text-property beg end 'point-entered
+ 'gnus-tool-bar-update)
+ (gnus-put-text-property beg end 'point-left
+ 'gnus-tool-bar-update))
(goto-char end)
unread))
(when (gnus-visual-p 'topic-menu 'menu)
(gnus-topic-make-menu-bar))
(gnus-set-format 'topic t)
- (add-minor-mode 'gnus-topic-mode " Topic"
- gnus-topic-mode-map nil (lambda (&rest junk)
- (interactive)
- (gnus-topic-mode nil t)))
+ (add-minor-mode 'gnus-topic-mode " Topic" gnus-topic-mode-map)
(add-hook 'gnus-group-catchup-group-hook 'gnus-topic-update-topic)
(set (make-local-variable 'gnus-group-prepare-function)
'gnus-group-prepare-topics)
;;; gnus-undo.el --- minor mode for undoing in Gnus
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2003
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; gnus-util.el --- utility functions for Gnus
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(require 'cl)
;; Fixme: this should be a gnus variable, not nnmail-.
(defvar nnmail-pathname-coding-system)
+ (defvar nnmail-active-file-coding-system)
;; Inappropriate references to other parts of Gnus.
(defvar gnus-emphasize-whitespace-regexp)
+ (defvar gnus-original-article-buffer)
+ (defvar gnus-user-agent)
)
(require 'time-date)
(require 'netrc)
(defun gnus-completing-read-with-default (default prompt &rest args)
;; Like `completing-read', except that DEFAULT is the default argument.
(let* ((prompt (if default
- (concat prompt " (default " default ") ")
- (concat prompt " ")))
+ (concat prompt " (default " default "): ")
+ (concat prompt ": ")))
(answer (apply 'completing-read prompt args)))
(if (or (null answer) (zerop (length answer)))
default
(apply 'format args)))
(defun gnus-error (level &rest args)
- "Beep an error if LEVEL is equal to or less than `gnus-verbose'."
+ "Beep an error if LEVEL is equal to or less than `gnus-verbose'.
+ARGS are passed to `message'."
(when (<= (floor level) gnus-verbose)
(apply 'message args)
(ding)
(save-current-buffer
(apply 'run-hooks funcs)))
+(defun gnus-run-mode-hooks (&rest funcs)
+ "Run `run-mode-hooks' if it is available, otherwise `run-hooks'.
+This function saves the current buffer."
+ (if (fboundp 'run-mode-hooks)
+ (save-current-buffer (apply 'run-mode-hooks funcs))
+ (save-current-buffer (apply 'run-hooks funcs))))
+
;;; Various
(defvar gnus-group-buffer) ; Compiler directive
(set-buffer gnus-group-buffer)
(eq major-mode 'gnus-group-mode))))
-(defun gnus-remove-duplicates (list)
- (let (new)
- (while list
- (or (member (car list) new)
- (setq new (cons (car list) new)))
- (setq list (cdr list)))
- (nreverse new)))
-
(defun gnus-remove-if (predicate list)
"Return a copy of LIST with all items satisfying PREDICATE removed."
(let (out)
display))
display)))))
+(eval-when-compile
+ (defvar tool-bar-mode))
+
+(defun gnus-tool-bar-update (&rest ignore)
+ "Update the tool bar."
+ (when (and (boundp 'tool-bar-mode)
+ tool-bar-mode)
+ (let* ((args nil)
+ (func (cond ((featurep 'xemacs)
+ 'ignore)
+ ((fboundp 'tool-bar-update)
+ 'tool-bar-update)
+ ((fboundp 'force-window-update)
+ 'force-window-update)
+ ((fboundp 'redraw-frame)
+ (setq args (list (selected-frame)))
+ 'redraw-frame)
+ (t 'ignore))))
+ (apply func args))))
+
;; Fixme: This has only one use (in gnus-agent), which isn't worthwhile.
(defmacro gnus-mapcar (function seq1 &rest seqs2_n)
"Apply FUNCTION to each element of the sequences, and make a list of the results.
(ignore-errors
(set-file-modes filename mode)))
+(if (fboundp 'set-process-query-on-exit-flag)
+ (defalias 'gnus-set-process-query-on-exit-flag
+ 'set-process-query-on-exit-flag)
+ (defalias 'gnus-set-process-query-on-exit-flag
+ 'process-kill-without-query))
+
(provide 'gnus-util)
;;; arch-tag: f94991af-d32b-4c97-8c26-ca12a934de49
;;; gnus-uu.el --- extract (uu)encoded files in Gnus
-;; Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1996, 1997, 1998, 2000,
-;; 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+
+;; Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1996, 1997, 1998,
+;; 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Created: 2 Oct 1993
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;; The case where neither a number of articles nor a region is
;; specified.
(gnus-summary-top-thread)
- (setq gnus-article-reply (gnus-uu-get-list-of-articles nil)))
- ;; Specify articles to be forwarded.
- (setq gnus-newsgroup-processable (copy-sequence gnus-article-reply))
+ (setq gnus-article-reply (nreverse (gnus-uu-find-articles-matching))))
+ ;; Specify articles to be forwarded. Note that they should be
+ ;; reversed; see `gnus-uu-get-list-of-articles'.
+ (setq gnus-newsgroup-processable (reverse gnus-article-reply))
(gnus-setup-message 'forward
(setq gnus-uu-digest-from-subject nil)
(setq gnus-uu-digest-buffer
(defun gnus-message-process-mark (unmarkp new-marked)
(let ((old (- (length gnus-newsgroup-processable) (length new-marked))))
- (message "%d mark%s %s%s"
- (length new-marked)
- (if (= (length new-marked) 1) "" "s")
- (if unmarkp "removed" "added")
- (cond
- ((and (zerop old)
- (not unmarkp))
- "")
- (unmarkp
- (format ", %d remain marked"
- (length gnus-newsgroup-processable)))
- (t
- (format ", %d already marked" old))))))
+ (gnus-message 6 "%d mark%s %s%s"
+ (length new-marked)
+ (if (= (length new-marked) 1) "" "s")
+ (if unmarkp "removed" "added")
+ (cond
+ ((and (zerop old)
+ (not unmarkp))
+ "")
+ (unmarkp
+ (format ", %d remain marked"
+ (length gnus-newsgroup-processable)))
+ (t
+ (format ", %d already marked" old))))))
(defun gnus-new-processable (unmarkp articles)
(if unmarkp
(interactive "sUnmark (regexp): ")
(gnus-uu-mark-by-regexp regexp t))
-(defun gnus-uu-mark-series ()
+(defun gnus-uu-mark-series (&optional silent)
"Mark the current series with the process mark."
(interactive)
(let* ((articles (gnus-uu-find-articles-matching))
- (l (length articles)))
+ (l (length articles)))
(while articles
(gnus-summary-set-process-mark (car articles))
(setq articles (cdr articles)))
- (message "Marked %d articles" l))
- (gnus-summary-position-point))
+ (unless silent
+ (gnus-message 6 "Marked %d articles" l))
+ (gnus-summary-position-point)
+ l))
(defun gnus-uu-mark-region (beg end &optional unmark)
"Set the process mark on all articles between point and mark."
(setq gnus-newsgroup-processable nil)
(save-excursion
(let ((data gnus-newsgroup-data)
+ (count 0)
number)
(while data
(when (and (not (memq (setq number (gnus-data-number (car data)))
gnus-newsgroup-processable))
(vectorp (gnus-data-header (car data))))
(gnus-summary-goto-subject number)
- (gnus-uu-mark-series))
- (setq data (cdr data)))))
+ (setq count (+ count (gnus-uu-mark-series t))))
+ (setq data (cdr data)))
+ (gnus-message 6 "Marked %d articles" count)))
(gnus-summary-position-point))
;; All PostScript functions written by Erik Selberg <speed@cs.washington.edu>.
(erase-buffer)
(insert (format
"Date: %s\nFrom: %s\nSubject: %s Digest\n\n"
- (current-time-string) name name))
+ (message-make-date) name name))
(when (and message-forward-as-mime gnus-uu-digest-buffer)
(insert "<#part type=message/rfc822>\nSubject: Topics\n\n"))
(insert "Topics:\n")))
(if (and message-forward-as-mime gnus-uu-digest-buffer)
(with-current-buffer gnus-uu-digest-buffer
(erase-buffer)
- (insert-buffer "*gnus-uu-pre*")
+ (insert-buffer-substring "*gnus-uu-pre*")
(goto-char (point-max))
- (insert-buffer "*gnus-uu-body*"))
+ (insert-buffer-substring "*gnus-uu-body*"))
(save-excursion
(set-buffer "*gnus-uu-pre*")
(insert (format "\n\n%s\n\n" (make-string 70 ?-)))
(if gnus-uu-digest-buffer
(with-current-buffer gnus-uu-digest-buffer
(erase-buffer)
- (insert-buffer "*gnus-uu-pre*"))
+ (insert-buffer-substring "*gnus-uu-pre*"))
(let ((coding-system-for-write mm-text-coding-system))
(gnus-write-buffer gnus-uu-saved-article-name))))
(save-excursion
(if gnus-uu-digest-buffer
(with-current-buffer gnus-uu-digest-buffer
(goto-char (point-max))
- (insert-buffer "*gnus-uu-body*"))
+ (insert-buffer-substring "*gnus-uu-body*"))
(let ((coding-system-for-write mm-text-coding-system)
(file-name-coding-system nnmail-pathname-coding-system))
(write-region
(ignore-errors
(replace-match
(format "%06d"
- (string-to-int (buffer-substring
+ (string-to-number (buffer-substring
(match-beginning 0) (match-end 0)))))))
(setq string (buffer-substring 1 (point-max)))
(setcar (car string-list) string)
(not gnus-uu-be-dangerous)
(or (eq gnus-uu-be-dangerous t)
(gnus-y-or-n-p
- (format "Delete unsuccessfully decoded file %s"
+ (format "Delete unsuccessfully decoded file %s? "
result-file))))
(delete-file result-file)))
(when (memq 'begin process-state)
(gnus-message 2 "No begin part at the beginning")
(sleep-for 2))
(setq state 'middle))))
-
+
;; When there are no result-files, then something must be wrong.
(if result-files
(message "")
;; We replace certain characters that could make things messy.
(setq gnus-uu-file-name
(gnus-map-function
- mm-file-name-rewrite-functions
+ mm-file-name-rewrite-functions
(file-name-nondirectory (match-string 1))))
(replace-match (concat "begin 644 " gnus-uu-file-name) t t)
;;; gnus-vm.el --- vm interface for Gnus
-;; Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+;; 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Per Persson <pp@gnu.ai.mit.edu>
;; Keywords: news, mail
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; gnus-win.el --- window configuration functions for Gnus
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; gnus-xmas.el --- Gnus functions for XEmacs
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(defalias 'gnus-mark-active-p 'region-exists-p)
(defalias 'gnus-annotation-in-region-p 'gnus-xmas-annotation-in-region-p)
(defalias 'gnus-mime-button-menu 'gnus-xmas-mime-button-menu)
+ (defalias 'gnus-mime-security-button-menu
+ 'gnus-xmas-mime-security-button-menu)
(defalias 'gnus-image-type-available-p 'gnus-xmas-image-type-available-p)
(defalias 'gnus-put-image 'gnus-xmas-put-image)
(defalias 'gnus-create-image 'gnus-xmas-create-image)
(rest (- wheight pheight)))
(insert (make-string (max 0 (* 2 (/ rest 3))) ?\n)))
;; Paint it.
- (put-text-property (point-min) (point-max) 'face 'gnus-splash-face)))
+ (put-text-property (point-min) (point-max) 'face 'gnus-splash)))
(setq modeline-buffer-identification
(list (concat gnus-version ": *Group*")))
(set-buffer-modified-p t))
;;; The toolbar.
-(defcustom gnus-use-toolbar (if (featurep 'toolbar)
- 'default-toolbar
- nil)
- "*If nil, do not use a toolbar.
-If it is non-nil, it must be a toolbar. The five valid values are
-`default-toolbar', `top-toolbar', `bottom-toolbar',
-`right-toolbar', and `left-toolbar'."
- :type '(choice (const default-toolbar)
- (const top-toolbar) (const bottom-toolbar)
- (const left-toolbar) (const right-toolbar)
+(defun gnus-xmas-update-toolbars ()
+ "Update the toolbars' appearance."
+ (when (and (not noninteractive)
+ (featurep 'gnus-xmas))
+ (save-excursion
+ (dolist (buffer (buffer-list))
+ (set-buffer buffer)
+ (cond ((eq major-mode 'gnus-group-mode)
+ (gnus-xmas-setup-group-toolbar))
+ ((eq major-mode 'gnus-summary-mode)
+ (gnus-xmas-setup-summary-toolbar)))))))
+
+(defcustom gnus-use-toolbar (if (featurep 'toolbar) 'default)
+ "*Position to display the toolbar. Nil means do not use a toolbar.
+If it is non-nil, it should be one of the symbols `default', `top',
+`bottom', `right', and `left'. `default' means to use the default
+toolbar, the rest mean to display the toolbar on the place which those
+names show."
+ :type '(choice (const default)
+ (const top) (const bottom) (const left) (const right)
(const :tag "no toolbar" nil))
+ :set (lambda (symbol value)
+ (set-default
+ symbol
+ (if (or (not value)
+ (memq value (list 'default 'top 'bottom 'right 'left)))
+ value
+ 'default))
+ (gnus-xmas-update-toolbars))
+ :group 'gnus-xmas)
+
+(defcustom gnus-toolbar-thickness
+ (if (featurep 'toolbar)
+ (cons (specifier-instance default-toolbar-height)
+ (specifier-instance default-toolbar-width)))
+ "*Cons of the height and the width specifying the thickness of a toolbar.
+The height is used for the toolbar displayed on the top or the bottom,
+the width is used for the toolbar displayed on the right or the left."
+ :type '(cons :tag "height & width"
+ (integer :tag "height") (integer :tag "width"))
+ :set (lambda (symbol value)
+ (set-default
+ symbol
+ (if (and (consp value) (natnump (car value)) (natnump (cdr value)))
+ value
+ '(37 . 40)))
+ (gnus-xmas-update-toolbars))
:group 'gnus-xmas)
(defvar gnus-group-toolbar
[gnus-summary-exit gnus-summary-exit t "Exit this summary"])
"The summary buffer mail toolbar.")
+(defun gnus-xmas-setup-toolbar (toolbar)
+ (when (featurep 'toolbar)
+ (if (and gnus-use-toolbar
+ (message-xmas-setup-toolbar toolbar nil "gnus"))
+ (let ((bar (or (intern-soft (format "%s-toolbar" gnus-use-toolbar))
+ 'default-toolbar))
+ (height (car gnus-toolbar-thickness))
+ (width (cdr gnus-toolbar-thickness))
+ (cur (current-buffer))
+ bars)
+ (set-specifier (symbol-value bar) toolbar cur)
+ (set-specifier default-toolbar-height height cur)
+ (set-specifier default-toolbar-width width cur)
+ (set-specifier top-toolbar-height height cur)
+ (set-specifier bottom-toolbar-height height cur)
+ (set-specifier right-toolbar-width width cur)
+ (set-specifier left-toolbar-width width cur)
+ (if (eq bar 'default-toolbar)
+ (progn
+ (remove-specifier default-toolbar-visible-p cur)
+ (remove-specifier top-toolbar cur)
+ (remove-specifier top-toolbar-visible-p cur)
+ (remove-specifier bottom-toolbar cur)
+ (remove-specifier bottom-toolbar-visible-p cur)
+ (remove-specifier right-toolbar cur)
+ (remove-specifier right-toolbar-visible-p cur)
+ (remove-specifier left-toolbar cur)
+ (remove-specifier left-toolbar-visible-p cur))
+ (set-specifier (symbol-value (intern (format "%s-visible-p" bar)))
+ t cur)
+ (setq bars (delq bar (list 'default-toolbar
+ 'bottom-toolbar 'top-toolbar
+ 'right-toolbar 'left-toolbar)))
+ (while bars
+ (set-specifier (symbol-value (intern (format "%s-visible-p"
+ (pop bars))))
+ nil cur))))
+ (let ((cur (current-buffer)))
+ (set-specifier default-toolbar-visible-p nil cur)
+ (set-specifier top-toolbar-visible-p nil cur)
+ (set-specifier bottom-toolbar-visible-p nil cur)
+ (set-specifier right-toolbar-visible-p nil cur)
+ (set-specifier left-toolbar-visible-p nil cur)))))
+
(defun gnus-xmas-setup-group-toolbar ()
- (and gnus-use-toolbar
- (message-xmas-setup-toolbar gnus-group-toolbar nil "gnus")
- (set-specifier (symbol-value gnus-use-toolbar)
- (cons (current-buffer) gnus-group-toolbar))))
+ (gnus-xmas-setup-toolbar gnus-group-toolbar))
(defun gnus-xmas-setup-summary-toolbar ()
- (let ((bar (if (gnus-news-group-p gnus-newsgroup-name)
- gnus-summary-toolbar gnus-summary-mail-toolbar)))
- (and gnus-use-toolbar
- (message-xmas-setup-toolbar bar nil "gnus")
- (set-specifier (symbol-value gnus-use-toolbar)
- (cons (current-buffer) bar)))))
+ (gnus-xmas-setup-toolbar (if (gnus-news-group-p gnus-newsgroup-name)
+ gnus-summary-toolbar
+ gnus-summary-mail-toolbar)))
(defun gnus-xmas-mail-strip-quoted-names (address)
"Protect mail-strip-quoted-names from nil input.
(goto-char (event-point event))
(funcall (event-function response) (event-object response))))
+(defun gnus-xmas-mime-security-button-menu (event prefix)
+ "Construct a context-sensitive menu of security commands."
+ (interactive "e\nP")
+ (let ((response
+ (get-popup-menu-response
+ `("Security Part"
+ ,@(delq nil
+ (mapcar (lambda (c)
+ (unless (eq (car c) 'undefined)
+ `[,(caddr c) ,(car c) t]))
+ gnus-mime-security-button-commands))))))
+ (set-buffer (event-buffer event))
+ (goto-char (event-point event))
+ (funcall (event-function response) (event-object response))))
+
(defun gnus-group-add-icon ()
"Add an icon to the current line according to `gnus-group-icon-list'."
(let* ((p (point))
;;; gnus.el --- a newsreader for GNU Emacs
-;; Copyright (C) 1987, 1988, 1989, 1990, 1993, 1994, 1995, 1996, 1997,
-;; 1998, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+;; Copyright (C) 1987, 1988, 1989, 1990, 1993, 1994, 1995, 1996, 1997, 1998,
+;; 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
;; Lars Magne Ingebrigtsen <larsi@gnus.org>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(require 'wid-edit)
(require 'mm-util)
(require 'nnheader)
-(autoload 'message-y-or-n-p "message" nil nil 'macro)
+
+;; These are defined afterwards with gnus-define-group-parameter
+(defvar gnus-ham-process-destinations)
+(defvar gnus-parameter-ham-marks-alist)
+(defvar gnus-parameter-spam-marks-alist)
+(defvar gnus-spam-autodetect)
+(defvar gnus-spam-autodetect-methods)
+(defvar gnus-spam-newsgroup-contents)
+(defvar gnus-spam-process-destinations)
+(defvar gnus-spam-process-newsgroups)
+
(defgroup gnus nil
"The coffee-brewing, all singing, all dancing, kitchen sink newsreader."
:group 'gnus)
(defgroup gnus-exit nil
- "Exiting gnus."
+ "Exiting Gnus."
:link '(custom-manual "(gnus)Exiting Gnus")
:group 'gnus)
:link '(custom-manual "(gnus)Exiting Gnus")
:group 'gnus)
-(defconst gnus-version-number "0.3"
+(defconst gnus-version-number "0.4"
"Version number for this version of Gnus.")
(defconst gnus-version (format "No Gnus v%s" gnus-version-number)
;; We define these group faces here to avoid the display
;; update forced when creating new faces.
-(defface gnus-group-news-1-face
+(defface gnus-group-news-1
'((((class color)
(background dark))
(:foreground "PaleTurquoise" :bold t))
(:foreground "ForestGreen" :bold t))
(t
()))
- "Level 1 newsgroup face.")
+ "Level 1 newsgroup face."
+ :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-news-1-face 'face-alias 'gnus-group-news-1)
-(defface gnus-group-news-1-empty-face
+(defface gnus-group-news-1-empty
'((((class color)
(background dark))
(:foreground "PaleTurquoise"))
(:foreground "ForestGreen"))
(t
()))
- "Level 1 empty newsgroup face.")
+ "Level 1 empty newsgroup face."
+ :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-news-1-empty-face 'face-alias 'gnus-group-news-1-empty)
-(defface gnus-group-news-2-face
+(defface gnus-group-news-2
'((((class color)
(background dark))
(:foreground "turquoise" :bold t))
(:foreground "CadetBlue4" :bold t))
(t
()))
- "Level 2 newsgroup face.")
+ "Level 2 newsgroup face."
+ :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-news-2-face 'face-alias 'gnus-group-news-2)
-(defface gnus-group-news-2-empty-face
+(defface gnus-group-news-2-empty
'((((class color)
(background dark))
(:foreground "turquoise"))
(:foreground "CadetBlue4"))
(t
()))
- "Level 2 empty newsgroup face.")
+ "Level 2 empty newsgroup face."
+ :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-news-2-empty-face 'face-alias 'gnus-group-news-2-empty)
-(defface gnus-group-news-3-face
+(defface gnus-group-news-3
'((((class color)
(background dark))
(:bold t))
(:bold t))
(t
()))
- "Level 3 newsgroup face.")
+ "Level 3 newsgroup face."
+ :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-news-3-face 'face-alias 'gnus-group-news-3)
-(defface gnus-group-news-3-empty-face
+(defface gnus-group-news-3-empty
'((((class color)
(background dark))
())
())
(t
()))
- "Level 3 empty newsgroup face.")
+ "Level 3 empty newsgroup face."
+ :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-news-3-empty-face 'face-alias 'gnus-group-news-3-empty)
-(defface gnus-group-news-4-face
+(defface gnus-group-news-4
'((((class color)
(background dark))
(:bold t))
(:bold t))
(t
()))
- "Level 4 newsgroup face.")
+ "Level 4 newsgroup face."
+ :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-news-4-face 'face-alias 'gnus-group-news-4)
-(defface gnus-group-news-4-empty-face
+(defface gnus-group-news-4-empty
'((((class color)
(background dark))
())
())
(t
()))
- "Level 4 empty newsgroup face.")
+ "Level 4 empty newsgroup face."
+ :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-news-4-empty-face 'face-alias 'gnus-group-news-4-empty)
-(defface gnus-group-news-5-face
+(defface gnus-group-news-5
'((((class color)
(background dark))
(:bold t))
(:bold t))
(t
()))
- "Level 5 newsgroup face.")
+ "Level 5 newsgroup face."
+ :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-news-5-face 'face-alias 'gnus-group-news-5)
-(defface gnus-group-news-5-empty-face
+(defface gnus-group-news-5-empty
'((((class color)
(background dark))
())
())
(t
()))
- "Level 5 empty newsgroup face.")
+ "Level 5 empty newsgroup face."
+ :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-news-5-empty-face 'face-alias 'gnus-group-news-5-empty)
-(defface gnus-group-news-6-face
+(defface gnus-group-news-6
'((((class color)
(background dark))
(:bold t))
(:bold t))
(t
()))
- "Level 6 newsgroup face.")
+ "Level 6 newsgroup face."
+ :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-news-6-face 'face-alias 'gnus-group-news-6)
-(defface gnus-group-news-6-empty-face
+(defface gnus-group-news-6-empty
'((((class color)
(background dark))
())
())
(t
()))
- "Level 6 empty newsgroup face.")
+ "Level 6 empty newsgroup face."
+ :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-news-6-empty-face 'face-alias 'gnus-group-news-6-empty)
-(defface gnus-group-news-low-face
+(defface gnus-group-news-low
'((((class color)
(background dark))
(:foreground "DarkTurquoise" :bold t))
(:foreground "DarkGreen" :bold t))
(t
()))
- "Low level newsgroup face.")
+ "Low level newsgroup face."
+ :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-news-low-face 'face-alias 'gnus-group-news-low)
-(defface gnus-group-news-low-empty-face
+(defface gnus-group-news-low-empty
'((((class color)
(background dark))
(:foreground "DarkTurquoise"))
(:foreground "DarkGreen"))
(t
()))
- "Low level empty newsgroup face.")
+ "Low level empty newsgroup face."
+ :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-news-low-empty-face 'face-alias 'gnus-group-news-low-empty)
-(defface gnus-group-mail-1-face
+(defface gnus-group-mail-1
'((((class color)
(background dark))
(:foreground "aquamarine1" :bold t))
(:foreground "DeepPink3" :bold t))
(t
(:bold t)))
- "Level 1 mailgroup face.")
+ "Level 1 mailgroup face."
+ :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-mail-1-face 'face-alias 'gnus-group-mail-1)
-(defface gnus-group-mail-1-empty-face
+(defface gnus-group-mail-1-empty
'((((class color)
(background dark))
(:foreground "aquamarine1"))
(:foreground "DeepPink3"))
(t
(:italic t :bold t)))
- "Level 1 empty mailgroup face.")
+ "Level 1 empty mailgroup face."
+ :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-mail-1-empty-face 'face-alias 'gnus-group-mail-1-empty)
-(defface gnus-group-mail-2-face
+(defface gnus-group-mail-2
'((((class color)
(background dark))
(:foreground "aquamarine2" :bold t))
(:foreground "HotPink3" :bold t))
(t
(:bold t)))
- "Level 2 mailgroup face.")
+ "Level 2 mailgroup face."
+ :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-mail-2-face 'face-alias 'gnus-group-mail-2)
-(defface gnus-group-mail-2-empty-face
+(defface gnus-group-mail-2-empty
'((((class color)
(background dark))
(:foreground "aquamarine2"))
(:foreground "HotPink3"))
(t
(:bold t)))
- "Level 2 empty mailgroup face.")
+ "Level 2 empty mailgroup face."
+ :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-mail-2-empty-face 'face-alias 'gnus-group-mail-2-empty)
-(defface gnus-group-mail-3-face
+(defface gnus-group-mail-3
'((((class color)
(background dark))
(:foreground "aquamarine3" :bold t))
(:foreground "magenta4" :bold t))
(t
(:bold t)))
- "Level 3 mailgroup face.")
+ "Level 3 mailgroup face."
+ :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-mail-3-face 'face-alias 'gnus-group-mail-3)
-(defface gnus-group-mail-3-empty-face
+(defface gnus-group-mail-3-empty
'((((class color)
(background dark))
(:foreground "aquamarine3"))
(:foreground "magenta4"))
(t
()))
- "Level 3 empty mailgroup face.")
+ "Level 3 empty mailgroup face."
+ :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-mail-3-empty-face 'face-alias 'gnus-group-mail-3-empty)
-(defface gnus-group-mail-low-face
+(defface gnus-group-mail-low
'((((class color)
(background dark))
(:foreground "aquamarine4" :bold t))
(:foreground "DeepPink4" :bold t))
(t
(:bold t)))
- "Low level mailgroup face.")
+ "Low level mailgroup face."
+ :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-mail-low-face 'face-alias 'gnus-group-mail-low)
-(defface gnus-group-mail-low-empty-face
+(defface gnus-group-mail-low-empty
'((((class color)
(background dark))
(:foreground "aquamarine4"))
(:foreground "DeepPink4"))
(t
(:bold t)))
- "Low level empty mailgroup face.")
+ "Low level empty mailgroup face."
+ :group 'gnus-group)
+;; backward-compatibility alias
+(put 'gnus-group-mail-low-empty-face 'face-alias 'gnus-group-mail-low-empty)
;; Summary mode faces.
-(defface gnus-summary-selected-face '((t
- (:underline t)))
- "Face used for selected articles.")
+(defface gnus-summary-selected '((t (:underline t)))
+ "Face used for selected articles."
+ :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-selected-face 'face-alias 'gnus-summary-selected)
-(defface gnus-summary-cancelled-face
+(defface gnus-summary-cancelled
'((((class color))
(:foreground "yellow" :background "black")))
- "Face used for cancelled articles.")
+ "Face used for cancelled articles."
+ :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-cancelled-face 'face-alias 'gnus-summary-cancelled)
-(defface gnus-summary-high-ticked-face
+(defface gnus-summary-high-ticked
'((((class color)
(background dark))
(:foreground "pink" :bold t))
(:foreground "firebrick" :bold t))
(t
(:bold t)))
- "Face used for high interest ticked articles.")
+ "Face used for high interest ticked articles."
+ :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-high-ticked-face 'face-alias 'gnus-summary-high-ticked)
-(defface gnus-summary-low-ticked-face
+(defface gnus-summary-low-ticked
'((((class color)
(background dark))
(:foreground "pink" :italic t))
(:foreground "firebrick" :italic t))
(t
(:italic t)))
- "Face used for low interest ticked articles.")
+ "Face used for low interest ticked articles."
+ :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-low-ticked-face 'face-alias 'gnus-summary-low-ticked)
-(defface gnus-summary-normal-ticked-face
+(defface gnus-summary-normal-ticked
'((((class color)
(background dark))
(:foreground "pink"))
(:foreground "firebrick"))
(t
()))
- "Face used for normal interest ticked articles.")
+ "Face used for normal interest ticked articles."
+ :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-normal-ticked-face 'face-alias 'gnus-summary-normal-ticked)
-(defface gnus-summary-high-ancient-face
+(defface gnus-summary-high-ancient
'((((class color)
(background dark))
(:foreground "SkyBlue" :bold t))
(:foreground "RoyalBlue" :bold t))
(t
(:bold t)))
- "Face used for high interest ancient articles.")
+ "Face used for high interest ancient articles."
+ :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-high-ancient-face 'face-alias 'gnus-summary-high-ancient)
-(defface gnus-summary-low-ancient-face
+(defface gnus-summary-low-ancient
'((((class color)
(background dark))
(:foreground "SkyBlue" :italic t))
(:foreground "RoyalBlue" :italic t))
(t
(:italic t)))
- "Face used for low interest ancient articles.")
+ "Face used for low interest ancient articles."
+ :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-low-ancient-face 'face-alias 'gnus-summary-low-ancient)
-(defface gnus-summary-normal-ancient-face
+(defface gnus-summary-normal-ancient
'((((class color)
(background dark))
(:foreground "SkyBlue"))
(:foreground "RoyalBlue"))
(t
()))
- "Face used for normal interest ancient articles.")
+ "Face used for normal interest ancient articles."
+ :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-normal-ancient-face 'face-alias 'gnus-summary-normal-ancient)
-(defface gnus-summary-high-undownloaded-face
+(defface gnus-summary-high-undownloaded
'((((class color)
(background light))
(:bold t :foreground "cyan4"))
(((class color) (background dark))
(:bold t :foreground "LightGray"))
(t (:inverse-video t :bold t)))
- "Face used for high interest uncached articles.")
+ "Face used for high interest uncached articles."
+ :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-high-undownloaded-face 'face-alias 'gnus-summary-high-undownloaded)
-(defface gnus-summary-low-undownloaded-face
+(defface gnus-summary-low-undownloaded
'((((class color)
(background light))
(:italic t :foreground "cyan4" :bold nil))
(((class color) (background dark))
(:italic t :foreground "LightGray" :bold nil))
(t (:inverse-video t :italic t)))
- "Face used for low interest uncached articles.")
+ "Face used for low interest uncached articles."
+ :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-low-undownloaded-face 'face-alias 'gnus-summary-low-undownloaded)
-(defface gnus-summary-normal-undownloaded-face
+(defface gnus-summary-normal-undownloaded
'((((class color)
(background light))
(:foreground "cyan4" :bold nil))
(((class color) (background dark))
(:foreground "LightGray" :bold nil))
(t (:inverse-video t)))
- "Face used for normal interest uncached articles.")
+ "Face used for normal interest uncached articles."
+ :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-normal-undownloaded-face 'face-alias 'gnus-summary-normal-undownloaded)
-(defface gnus-summary-high-unread-face
+(defface gnus-summary-high-unread
'((t
(:bold t)))
- "Face used for high interest unread articles.")
+ "Face used for high interest unread articles."
+ :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-high-unread-face 'face-alias 'gnus-summary-high-unread)
-(defface gnus-summary-low-unread-face
+(defface gnus-summary-low-unread
'((t
(:italic t)))
- "Face used for low interest unread articles.")
+ "Face used for low interest unread articles."
+ :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-low-unread-face 'face-alias 'gnus-summary-low-unread)
-(defface gnus-summary-normal-unread-face
+(defface gnus-summary-normal-unread
'((t
()))
- "Face used for normal interest unread articles.")
+ "Face used for normal interest unread articles."
+ :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-normal-unread-face 'face-alias 'gnus-summary-normal-unread)
-(defface gnus-summary-high-read-face
+(defface gnus-summary-high-read
'((((class color)
(background dark))
(:foreground "PaleGreen"
:bold t))
(t
(:bold t)))
- "Face used for high interest read articles.")
+ "Face used for high interest read articles."
+ :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-high-read-face 'face-alias 'gnus-summary-high-read)
-(defface gnus-summary-low-read-face
+(defface gnus-summary-low-read
'((((class color)
(background dark))
(:foreground "PaleGreen"
:italic t))
(t
(:italic t)))
- "Face used for low interest read articles.")
+ "Face used for low interest read articles."
+ :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-low-read-face 'face-alias 'gnus-summary-low-read)
-(defface gnus-summary-normal-read-face
+(defface gnus-summary-normal-read
'((((class color)
(background dark))
(:foreground "PaleGreen"))
(:foreground "DarkGreen"))
(t
()))
- "Face used for normal interest read articles.")
+ "Face used for normal interest read articles."
+ :group 'gnus-summary)
+;; backward-compatibility alias
+(put 'gnus-summary-normal-read-face 'face-alias 'gnus-summary-normal-read)
;;;
(eval-and-compile
(autoload 'gnus-play-jingle "gnus-audio"))
-(defface gnus-splash-face
+(defface gnus-splash
'((((class color)
(background dark))
(:foreground "#888888"))
(:foreground "#888888"))
(t
()))
- "Face for the splash screen.")
+ "Face for the splash screen."
+ :group 'gnus-start)
+;; backward-compatibility alias
+(put 'gnus-splash-face 'face-alias 'gnus-splash)
(defun gnus-splash ()
(save-excursion
(fboundp 'find-image)
(display-graphic-p)
(let* ((data-directory (nnheader-find-etc-directory "images/gnus"))
+ (image-load-path (cond (data-directory
+ (list data-directory))
+ ((boundp 'image-load-path)
+ (symbol-value 'image-load-path))
+ (t load-path)))
(image (find-image
`((:type xpm :file "gnus.xpm"
:color-symbols
("background" . ,(face-background 'default))))
(:type pbm :file "gnus.pbm"
;; Account for the pbm's blackground.
- :background ,(face-foreground 'gnus-splash-face)
+ :background ,(face-foreground 'gnus-splash)
:foreground ,(face-background 'default))
(:type xbm :file "gnus.xbm"
;; Account for the xbm's blackground.
- :background ,(face-foreground 'gnus-splash-face)
+ :background ,(face-foreground 'gnus-splash)
:foreground ,(face-background 'default))))))
(when image
(let ((size (image-size image)))
(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)
+ (put-text-property (point-min) (point-max) 'face 'gnus-splash)
(setq gnus-simple-splash t)))
(goto-char (point-min))
(setq mode-line-buffer-identification (concat " " gnus-version))
:type '(repeat (cons regexp
(repeat sexp))))
+(defcustom gnus-parameters-case-fold-search 'default
+ "If it is t, ignore case of group names specified in `gnus-parameters'.
+If it is nil, don't ignore case. If it is `default', which is for the
+backward compatibility, use the value of `case-fold-search'."
+ :version "22.1"
+ :group 'gnus-group-various
+ :type '(choice :format "%{%t%}:\n %[Value Menu%] %v"
+ (const :tag "Use `case-fold-search'" default)
+ (const nil)
+ (const t)))
+
(defvar gnus-group-parameters-more nil)
(defmacro gnus-define-group-parameter (param &rest rest)
:value t)))
(defcustom gnus-use-nocem nil
- "*If non-nil, Gnus will read NoCeM cancel messages."
+ "*If non-nil, Gnus will read NoCeM cancel messages.
+You can also set this variable to a positive number as a group level.
+In that case, Gnus scans NoCeM messages when checking new news if this
+value is not exceeding a group level that you specify as the prefix
+argument to some commands, e.g. `gnus', `gnus-group-get-new-news', etc.
+Otherwise, Gnus does not scan NoCeM messages if you specify a group
+level to those commands."
:group 'gnus-meta
- :type 'boolean)
+ :type '(choice
+ (const :tag "off" nil)
+ (const :tag "on" t)
+ (list :convert-widget
+ (lambda (widget)
+ (list 'integer :tag "group level"
+ :value (if (boundp 'gnus-level-default-subscribed)
+ gnus-level-default-subscribed
+ 3))))))
(defcustom gnus-suppress-duplicates nil
"*If non-nil, Gnus will mark duplicate copies of the same article as read."
"Function run when a group level is changed.
It is called with three parameters -- GROUP, LEVEL and OLDLEVEL."
:group 'gnus-group-levels
- :type 'function)
+ :type '(choice (const nil)
+ function))
;;; Face thingies.
(push name-method gnus-server-method-cache))
(throw 'server-name (car name-method))))
server-alist))
- (let ((alists (list gnus-server-alist
- gnus-predefined-server-alist)))
- (if gnus-select-method
- (push (list (cons "native" gnus-select-method)) alists))
- alists))
+ (list gnus-server-alist
+ gnus-predefined-server-alist))
(let* ((name (if (member (cadr method) '(nil ""))
(format "%s" (car method))
(defun gnus-parameters-get-parameter (group)
"Return the group parameters for GROUP from `gnus-parameters'."
- (let (params-list)
+ (let ((case-fold-search (if (eq gnus-parameters-case-fold-search 'default)
+ case-fold-search
+ gnus-parameters-case-fold-search))
+ params-list)
(dolist (elem gnus-parameters)
(when (string-match (car elem) group)
(setq params-list
(defun gnus-group-get-parameter (group &optional symbol allow-list)
"Return the group parameters for GROUP.
If SYMBOL, return the value of that symbol in the group parameters.
+If ALLOW-LIST, also allow list as a result.
Most functions should use `gnus-group-find-parameter', which
also examines the topic parameters."
(let ((params (gnus-info-params (gnus-get-info group))))
(defun gnus-group-parameter-value (params symbol &optional
allow-list present-p)
- "Return the value of SYMBOL in group PARAMS."
+ "Return the value of SYMBOL in group PARAMS.
+If ALLOW-LIST, also allow list as a result."
;; We only wish to return group parameters (dotted lists) and
;; not local variables, which may have the same names.
;; But first we handle single elements...
(setq valids (cdr valids)))
outs))
-(eval-when-compile
+(eval-and-compile
(autoload 'message-y-or-n-p "message" nil nil 'macro))
(defun gnus-read-group (prompt &optional default)
(delete-frame gnus-other-frame-object))
(setq gnus-other-frame-object nil)))))))
-;;(setq thing ? ; this is a comment
-;; more 'yes)
-
;;;###autoload
(defun gnus (&optional arg dont-connect slave)
"Read network news.
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; Code:
-(eval-and-compile
- (autoload 'executable-find "executable"))
+(defgroup hashcash nil
+ "Hashcash configuration."
+ :group 'mail)
(defcustom hashcash-default-payment 20
"*The default number of bits to pay to unknown users.
If this is zero, no payment header will be generated.
See `hashcash-payment-alist'."
- :type 'integer)
+ :type 'integer
+ :group 'hashcash)
(defcustom hashcash-payment-alist '()
"*An association list mapping email addresses to payment amounts.
(list :tag "Replace hash input"
(string :name "Address")
(string :name "Hash input")
- (integer :name "Amount")))))
+ (integer :name "Amount"))))
+ :group 'hashcash)
(defcustom hashcash-default-accept-payment 20
"*The default minimum number of bits to accept on incoming payments."
- :type 'integer)
+ :type 'integer
+ :group 'hashcash)
(defcustom hashcash-accept-resources `((,user-mail-address nil))
"*An association list mapping hashcash resources to payment amounts.
Resources named here are to be accepted in incoming payments. If the
corresponding AMOUNT is NIL, the value of `hashcash-default-accept-payment'
-is used instead.")
+is used instead."
+ :group 'hashcash)
(defcustom hashcash-path (executable-find "hashcash")
- "*The path to the hashcash binary.")
+ "*The path to the hashcash binary."
+ :group 'hashcash)
(defcustom hashcash-extra-generate-parameters nil
"*A list of parameter strings passed to `hashcash-path' when minting.
For example, you may want to set this to '(\"-Z2\") to reduce header length."
- :type '(repeat string))
+ :type '(repeat string)
+ :group 'hashcash)
(defcustom hashcash-double-spend-database "hashcash.db"
- "*The path to the double-spending database.")
+ "*The path to the double-spending database."
+ :group 'hashcash)
(defcustom hashcash-in-news nil
"*Specifies whether or not hashcash payments should be made to newsgroups."
- :type 'boolean)
+ :type 'boolean
+ :group 'hashcash)
(defvar hashcash-process-alist nil
"Alist of asynchronous hashcash processes and buffers.")
(save-excursion
(save-restriction
(message-narrow-to-headers-or-head)
- (let ((token (message-fetch-field "x-hashcash")))
+ (let ((token (message-fetch-field "x-hashcash"))
+ (case-fold-search t))
(and (stringp token)
(string-match (regexp-quote recipient) token))))))
;;; hex-util.el --- Functions to encode/decode hexadecimal string.
-;; Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+;; Copyright (C) 1999, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Shuhei KOBAYASHI <shuhei@aqua.ocn.ne.jp>
;; Keywords: data
;; You should have received a copy of the GNU General Public License
;; along with this program; see the file COPYING. If not, write to
-;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;; You should have received a copy of the GNU General Public License
;; along with this program; see the file COPYING. If not, write to
-;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;; You should have received a copy of the GNU General Public License
;; along with this program; see the file COPYING. If not, write to
-;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; html2text.el --- a simple html to plain text converter
-;; Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
+
+;; Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Joakim Hove <hove@phys.ntnu.no>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(defvar html2text-format-single-element-list '(("hr" . html2text-clean-hr)))
(defvar html2text-replace-list
- '((" " . " ") (">" . ">") ("<" . "<") (""" . "\"")
- ("&" . "&") ("'" . "'"))
+ '(("´" . "`")
+ ("&" . "&")
+ ("'" . "'")
+ ("¦" . "|")
+ ("¢" . "c")
+ ("ˆ" . "^")
+ ("©" . "(C)")
+ ("¤" . "(#)")
+ ("°" . "degree")
+ ("÷" . "/")
+ ("€" . "e")
+ ("½" . "1/2")
+ (">" . ">")
+ ("¿" . "?")
+ ("«" . "<<")
+ ("&ldquo" . "\"")
+ ("‹" . "(")
+ ("‘" . "`")
+ ("<" . "<")
+ ("—" . "--")
+ (" " . " ")
+ ("–" . "-")
+ ("‰" . "%%")
+ ("±" . "+-")
+ ("£" . "£")
+ (""" . "\"")
+ ("»" . ">>")
+ ("&rdquo" . "\"")
+ ("®" . "(R)")
+ ("›" . ")")
+ ("’" . "'")
+ ("§" . "§")
+ ("¹" . "^1")
+ ("²" . "^2")
+ ("³" . "^3")
+ ("˜" . "~"))
"The map of entity to text.
This is an alist were each element is a dotted pair consisting of an
This is a list of tags which should be removed, without any
formatting. Note that tags in the list are presented *without*
-any \"<\" or \">\". All occurences of a tag appearing in this
+any \"<\" or \">\". All occurrences of a tag appearing in this
list are removed, irrespective of whether it is a closing or
opening tag, or if the tag has additional attributes. The
deletion is done by the function `html2text-remove-tags'.
fashion, quite close to pure guess-work. It does work in some cases though."
(interactive)
(goto-char (point-min))
- (replace-regexp "^<br>$" "")
+ (while (re-search-forward "^<br>$" nil t)
+ (delete-region (match-beginning 0) (match-end 0)))
;; Removing lonely <br> on a single line, if they are left intact we
;; dont have any paragraphs at all.
(goto-char (point-min))
;;; ietf-drums.el --- Functions for parsing RFC822bis headers
-;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; This file is part of GNU Emacs.
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; imap.el --- imap library
-;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Simon Josefsson <jas@pdc.kth.se>
;; Keywords: mail
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
:type '(repeat string))
(defcustom imap-gssapi-program (list
- (concat "gsasl --client --connect %s:%p "
- "--imap --application-data "
+ (concat "gsasl %s %p "
"--mechanism GSSAPI "
"--authentication-id %l")
"imtest -m gssapi -u %l -p %p %s")
(while (and (memq (process-status process) '(open run))
(set-buffer buffer) ;; XXX "blue moon" nntp.el bug
(goto-char (point-min))
+ ;; Athena IMTEST can output SSL verify errors
+ (or (while (looking-at "^verify error:num=")
+ (forward-line))
+ t)
+ (or (while (looking-at "^TLS connection established")
+ (forward-line))
+ t)
;; cyrus 1.6.x (13? < x <= 22) queries capabilities
(or (while (looking-at "^C:")
(forward-line))
(or (not (looking-at "S: "))
(forward-char 3)
t)
+ ;; GNU SASL may print 'Trying ...' first.
+ (or (not (looking-at "Trying "))
+ (forward-line)
+ t)
(not (and (imap-parse-greeting)
;; success in imtest 1.6:
(re-search-forward
(coding-system-for-read imap-coding-system-for-read)
(coding-system-for-write imap-coding-system-for-write)
(process-connection-type imap-process-connection-type)
+ (set-process-query-on-exit-flag
+ (if (fboundp 'set-process-query-on-exit-flag)
+ 'set-process-query-on-exit-flag
+ 'process-kill-without-query))
process)
(when (progn
(setq process (start-process
(format-spec-make
?s server
?p (number-to-string port)))))
- (process-kill-without-query process)
+ (funcall set-process-query-on-exit-flag process nil)
process)
(with-current-buffer buffer
(goto-char (point-min))
stream))
;; We're done, kill the first connection
(imap-close buffer)
- (kill-buffer buffer)
- (rename-buffer buffer)
+ (let ((name (if (stringp buffer)
+ buffer
+ (buffer-name buffer))))
+ (kill-buffer buffer)
+ (rename-buffer name))
(message "imap: Reconnecting with stream `%s'...done"
stream)
(setq imap-stream stream)
((file-directory-p member)
(push member search-in))
((equal (file-name-nondirectory member) ".agentview")
- (setq converted-something
+ (setq converted-something
(or (gnus-agent-convert-agentview member)
converted-something))))))
(t
t))))))
(kill-buffer buffer))
- (error "Change gnus-agent-expire-days to an integer for gnus to start."))))
+ (error "Change gnus-agent-expire-days to an integer for gnus to start"))))
;; The gnus-agent-unlist-expire-days has its own conversion prompt.
;; Therefore, hide the default prompt.
(when (cond ((eq (type-of func) 'compiled-function)
;; Search def. of compiled function for gnus-agent-do-once string
- (let* (definition
- print-level
+ (let* (definition
+ print-level
print-length
(standard-output
(lambda (char)
Info-menu create-image display-graphic-p
display-time-event-handler find-coding-system find-image
image-size image-type-available-p insert-image
- make-mode-line-mouse-map make-temp-file propertize put-image
- replace-regexp-in-string rmail-msg-is-pruned
- rmail-msg-restore-non-pruned-header sort-coding-systems
- tool-bar-add-item tool-bar-add-item-from-menu
- tool-bar-local-item-from-menu url-generic-parse-url
- url-http-file-exists-p url-insert-file-contents
- vcard-pretty-print w32-focus-frame w3m-detect-meta-charset
- w3m-region x-focus-frame))
+ line-number-at-pos make-mode-line-mouse-map make-temp-file
+ propertize put-image replace-regexp-in-string
+ rmail-msg-is-pruned rmail-msg-restore-non-pruned-header
+ sort-coding-systems tool-bar-add-item
+ tool-bar-add-item-from-menu tool-bar-local-item-from-menu
+ url-generic-parse-url url-http-file-exists-p
+ url-insert-file-contents vcard-pretty-print w32-focus-frame
+ w3m-detect-meta-charset w3m-region x-focus-frame))
(maybe-bind '(eudc-protocol
- filladapt-mode mc-pgp-always-sign
- rmail-insert-mime-forwarded-message-function url-current-object
- url-package-name url-package-version
+ filladapt-mode rmail-insert-mime-forwarded-message-function
w3-meta-charset-content-type-regexp
- w3-meta-content-type-charset-regexp
- w3m-cid-retrieve-function-alist w3m-current-buffer
- w3m-display-inline-images w3m-minor-mode-map))
+ w3-meta-content-type-charset-regexp))
(if (featurep 'xemacs)
(progn
- (maybe-fbind '(delete-overlay
- detect-coding-string eudc-expand-inline event-click-count
- event-end event-start find-coding-systems-for-charsets
+ (maybe-fbind '(codepage-setup
+ delete-overlay detect-coding-string eudc-expand-inline
+ event-click-count event-end event-start
+ find-coding-systems-for-charsets
find-coding-systems-region find-coding-systems-string
- mail-abbrevs-setup mouse-minibuffer-check
- mouse-movement-p mouse-scroll-subr overlay-lists
- posn-point posn-window read-event set-buffer-multibyte
- track-mouse window-edges))
+ mail-abbrevs-setup mouse-minibuffer-check mouse-movement-p
+ mouse-scroll-subr overlay-lists posn-point posn-window
+ read-event set-buffer-multibyte track-mouse window-edges))
(maybe-bind '(adaptive-fill-first-line-regexp
buffer-display-table buffer-file-coding-system
current-language-environment
(maybe-fbind '(bbdb-complete-name
delete-annotation delete-extent device-connection dfw-device
events-to-keys font-lock-set-defaults frame-device
- get-char-table glyph-height glyph-width mail-aliases-setup
- make-annotation make-event make-glyph make-network-process
- map-extents message-xmas-redefine put-char-table
- set-extent-property temp-directory
+ get-char-table glyph-height glyph-width ldap-search-entries
+ mail-aliases-setup make-annotation make-event make-glyph
+ make-network-process map-extents message-xmas-redefine
+ put-char-table set-extent-property temp-directory
valid-image-instantiator-format-p
w3-coding-system-for-mime-charset w3-do-setup
w3-prepare-buffer w3-region window-pixel-height
window-pixel-width))
(maybe-bind '(help-echo-owns-message mail-mode-hook mm-w3m-mode-map
- show-nonbreak-escape)))
+ show-nonbreak-escape
+ nobreak-char-display)))
(when (and (featurep 'xemacs)
(not (featurep 'mule)))
;;; mail-parse.el --- Interface functions for parsing mail
-;; Copyright (C) 1998, 1999, 2000
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; This file is part of GNU Emacs.
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; mail-prsvr.el --- Interface variables for parsing mail
-;; Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+
+;; Copyright (C) 1999, 2000, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; This file is part of GNU Emacs.
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; mail-source.el --- functions for fetching mail
-;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news, mail
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(const :format "" :value :port)
(choice :tag "Port"
:value "pop3"
- (number :format "%v")
+ (integer :format "%v")
(string :format "%v")))
(group :inline t
(const :format "" :value :user)
(choice :tag "Prescript"
:value nil
(string :format "%v")
- (function :format "%v")))
+ (function :format "%v")
+ (const :tag "None" nil)))
(group :inline t
(const :format "" :value :postscript)
(choice :tag "Postscript"
:value nil
(string :format "%v")
- (function :format "%v")))
+ (function :format "%v")
+ (const :tag "None" nil)))
(group :inline t
(const :format "" :value :function)
(function :tag "Function"))
(const apop)))
(group :inline t
(const :format "" :value :plugged)
- (boolean :tag "Plugged"))))
+ (boolean :tag "Plugged"))
+ (group :inline t
+ (const :format "" :value :stream)
+ (choice :tag "Stream"
+ :value nil
+ (const :tag "Clear" nil)
+ (const starttls)
+ (const :tag "SSL/TLS" ssl)))))
(cons :tag "Maildir (qmail, postfix...)"
(const :format "" maildir)
(checklist :tag "Options" :greedy t
(const :format "" :value :port)
(choice :tag "Port"
:value 143
- number string))
+ integer string))
(group :inline t
(const :format "" :value :user)
(string :tag "User"))
(:program)
(:function)
(:password)
- (:authentication password))
+ (:authentication password)
+ (:stream nil))
(maildir
(:path (or (getenv "MAILDIR") "~/Maildir/"))
(:subdirs ("cur" "new"))
(defun mail-source-fetch-pop (source callback)
"Fetcher for single-file sources."
(mail-source-bind (pop source)
+ ;; fixme: deal with stream type in format specs
(mail-source-run-script
prescript
(format-spec-make ?p password ?t mail-source-crash-box
(funcall function mail-source-crash-box))
;; The default is to use pop3.el.
(t
+ (require 'pop3)
(let ((pop3-password password)
(pop3-maildrop user)
(pop3-mailhost server)
(pop3-port port)
(pop3-authentication-scheme
- (if (eq authentication 'apop) 'apop 'pass)))
+ (if (eq authentication 'apop) 'apop 'pass))
+ (pop3-stream-type stream))
(if (or debug-on-quit debug-on-error)
(save-excursion (pop3-movemail mail-source-crash-box))
(condition-case err
(function)
;; The default is to use pop3.el.
(t
+ (require 'pop3)
(let ((pop3-password password)
(pop3-maildrop user)
(pop3-mailhost server)
;;; mailcap.el --- MIME media types configuration
-;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: William M. Perry <wmperry@aventail.com>
;; Lars Magne Ingebrigtsen <larsi@gnus.org>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(skip-chars-forward ";"))
(setq done t))))
(setq value (buffer-substring val-pos (point))))
- (setq results (cons (cons name value) results))
+ ;; `test' as symbol, others like "copiousoutput" and "needsx11" as
+ ;; strings
+ (setq results (cons (cons (if (string-equal name "test")
+ 'test
+ name)
+ value) results))
(skip-chars-forward " \";\n\t"))
results)))
(viewer (cdr (assoc 'viewer viewer-info)))
(default-directory (expand-file-name "~/"))
status parsed-test cache result)
- (if (setq cache (assoc test mailcap-viewer-test-cache))
- (cadr cache)
- (setq
- result
- (cond
- ((not test-info) t) ; No test clause
- ((not test) nil) ; Already failed test
- ((eq test t) t) ; Already passed test
- ((functionp test) ; Lisp function as test
- (funcall test type-info))
- ((and (symbolp test) ; Lisp variable as test
- (boundp test))
- (symbol-value test))
- ((and (listp test) ; List to be eval'd
- (symbolp (car test)))
- (eval test))
- (t
- (setq test (mailcap-unescape-mime-test test type-info)
- test (list shell-file-name nil nil nil
- shell-command-switch test)
- status (apply 'call-process test))
- (eq 0 status))))
- (push (list otest result) mailcap-viewer-test-cache)
- result)))
+ (cond ((setq cache (assoc test mailcap-viewer-test-cache))
+ (cadr cache))
+ ((not test-info) t) ; No test clause
+ (t
+ (setq
+ result
+ (cond
+ ((not test) nil) ; Already failed test
+ ((eq test t) t) ; Already passed test
+ ((functionp test) ; Lisp function as test
+ (funcall test type-info))
+ ((and (symbolp test) ; Lisp variable as test
+ (boundp test))
+ (symbol-value test))
+ ((and (listp test) ; List to be eval'd
+ (symbolp (car test)))
+ (eval test))
+ (t
+ (setq test (mailcap-unescape-mime-test test type-info)
+ test (list shell-file-name nil nil nil
+ shell-command-switch test)
+ status (apply 'call-process test))
+ (eq 0 status))))
+ (push (list otest result) mailcap-viewer-test-cache)
+ result))))
(defun mailcap-add-mailcap-entry (major minor info)
(let ((old-major (assoc major mailcap-mime-data)))
;;
;; You should have received a copy of the GNU General Public License
;; along with this program; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Code:
;;; message.el --- composing mail and news messages
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: mail, news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(require 'canlock)
(require 'mailheader)
(require 'nnheader)
+(require 'gmm-utils)
;; This is apparently necessary even though things are autoloaded.
;; Because we dynamically bind mail-abbrev-mode-regexp, we'd better
;; require mailabbrev here.
(put 'user-full-name 'custom-type 'string)
(defgroup message-various nil
- "Various Message Variables"
+ "Various Message Variables."
:link '(custom-manual "(message)Various Message Variables")
:group 'message)
(defgroup message-buffers nil
- "Message Buffers"
+ "Message Buffers."
:link '(custom-manual "(message)Message Buffers")
:group 'message)
(defgroup message-sending nil
- "Message Sending"
+ "Message Sending."
:link '(custom-manual "(message)Sending Variables")
:group 'message)
(defgroup message-interface nil
- "Message Interface"
+ "Message Interface."
:link '(custom-manual "(message)Interface")
:group 'message)
(defgroup message-forwarding nil
- "Message Forwarding"
+ "Message Forwarding."
:link '(custom-manual "(message)Forwarding")
:group 'message-interface)
(defgroup message-insertion nil
- "Message Insertion"
+ "Message Insertion."
:link '(custom-manual "(message)Insertion")
:group 'message)
(defgroup message-headers nil
- "Message Headers"
+ "Message Headers."
:link '(custom-manual "(message)Message Headers")
:group 'message)
(defgroup message-news nil
- "Composing News Messages"
+ "Composing News Messages."
:group 'message)
(defgroup message-mail nil
- "Composing Mail Messages"
+ "Composing Mail Messages."
:group 'message)
(defgroup message-faces nil
(set-keymap-parent map minibuffer-local-map)
map)
"Keymap for `message-read-from-minibuffer'."
- :version "22.1")
+ :version "22.1"
+ :group 'message-various)
;;;###autoload
(defcustom message-citation-line-function 'message-insert-citation-line
(defcustom message-yank-prefix "> "
"*Prefix inserted on the lines of yanked messages.
Fix `message-cite-prefix-regexp' if it is set to an abnormal value.
-See also `message-yank-cited-prefix'."
+See also `message-yank-cited-prefix' and `message-yank-empty-prefix'."
:type 'string
:link '(custom-manual "(message)Insertion Variables")
:group 'message-insertion)
(defcustom message-yank-cited-prefix ">"
- "*Prefix inserted on cited or empty lines of yanked messages.
+ "*Prefix inserted on cited lines of yanked messages.
Fix `message-cite-prefix-regexp' if it is set to an abnormal value.
-See also `message-yank-prefix'."
+See also `message-yank-prefix' and `message-yank-empty-prefix'."
+ :version "22.1"
+ :type 'string
+ :link '(custom-manual "(message)Insertion Variables")
+ :group 'message-insertion)
+
+(defcustom message-yank-empty-prefix ">"
+ "*Prefix inserted on empty lines of yanked messages.
+See also `message-yank-prefix' and `message-yank-cited-prefix'."
:version "22.1"
:type 'string
:link '(custom-manual "(message)Insertion Variables")
"*Function for citing an original message.
Predefined functions include `message-cite-original' and
`message-cite-original-without-signature'.
-Note that `message-cite-original' uses `mail-citation-hook' if that is non-nil."
+Note that these functions use `mail-citation-hook' if that is non-nil."
:type '(radio (function-item message-cite-original)
(function-item message-cite-original-without-signature)
(function-item sc-cite-original)
table)
"Syntax table used while in Message mode.")
-(defface message-header-to-face
+(defface message-header-to
'((((class color)
(background dark))
(:foreground "green2" :bold t))
(:bold t :italic t)))
"Face used for displaying From headers."
:group 'message-faces)
+;; backward-compatibility alias
+(put 'message-header-to-face 'face-alias 'message-header-to)
-(defface message-header-cc-face
+(defface message-header-cc
'((((class color)
(background dark))
(:foreground "green4" :bold t))
(:bold t)))
"Face used for displaying Cc headers."
:group 'message-faces)
+;; backward-compatibility alias
+(put 'message-header-cc-face 'face-alias 'message-header-cc)
-(defface message-header-subject-face
+(defface message-header-subject
'((((class color)
(background dark))
(:foreground "green3"))
(:bold t)))
"Face used for displaying subject headers."
:group 'message-faces)
+;; backward-compatibility alias
+(put 'message-header-subject-face 'face-alias 'message-header-subject)
-(defface message-header-newsgroups-face
+(defface message-header-newsgroups
'((((class color)
(background dark))
(:foreground "yellow" :bold t :italic t))
(:bold t :italic t)))
"Face used for displaying newsgroups headers."
:group 'message-faces)
+;; backward-compatibility alias
+(put 'message-header-newsgroups-face 'face-alias 'message-header-newsgroups)
-(defface message-header-other-face
+(defface message-header-other
'((((class color)
(background dark))
(:foreground "#b00000"))
(:bold t :italic t)))
"Face used for displaying newsgroups headers."
:group 'message-faces)
+;; backward-compatibility alias
+(put 'message-header-other-face 'face-alias 'message-header-other)
-(defface message-header-name-face
+(defface message-header-name
'((((class color)
(background dark))
(:foreground "DarkGreen"))
(:bold t)))
"Face used for displaying header names."
:group 'message-faces)
+;; backward-compatibility alias
+(put 'message-header-name-face 'face-alias 'message-header-name)
-(defface message-header-xheader-face
+(defface message-header-xheader
'((((class color)
(background dark))
(:foreground "blue"))
(:bold t)))
"Face used for displaying X-Header headers."
:group 'message-faces)
+;; backward-compatibility alias
+(put 'message-header-xheader-face 'face-alias 'message-header-xheader)
-(defface message-separator-face
+(defface message-separator
'((((class color)
(background dark))
(:foreground "blue3"))
(:bold t)))
"Face used for displaying the separator."
:group 'message-faces)
+;; backward-compatibility alias
+(put 'message-separator-face 'face-alias 'message-separator)
-(defface message-cited-text-face
+(defface message-cited-text
'((((class color)
(background dark))
(:foreground "red"))
(:bold t)))
"Face used for displaying cited text names."
:group 'message-faces)
+;; backward-compatibility alias
+(put 'message-cited-text-face 'face-alias 'message-cited-text)
-(defface message-mml-face
+(defface message-mml
'((((class color)
(background dark))
(:foreground "ForestGreen"))
(:bold t)))
"Face used for displaying MML."
:group 'message-faces)
+;; backward-compatibility alias
+(put 'message-mml-face 'face-alias 'message-mml)
(defun message-font-lock-make-header-matcher (regexp)
(let ((form
(let ((content "[ \t]*\\(.+\\(\n[ \t].*\\)*\\)\n?"))
`((,(message-font-lock-make-header-matcher
(concat "^\\([Tt]o:\\)" content))
- (1 'message-header-name-face)
- (2 'message-header-to-face nil t))
+ (1 'message-header-name)
+ (2 'message-header-to nil t))
(,(message-font-lock-make-header-matcher
(concat "^\\(^[GBF]?[Cc][Cc]:\\|^[Rr]eply-[Tt]o:\\)" content))
- (1 'message-header-name-face)
- (2 'message-header-cc-face nil t))
+ (1 'message-header-name)
+ (2 'message-header-cc nil t))
(,(message-font-lock-make-header-matcher
(concat "^\\([Ss]ubject:\\)" content))
- (1 'message-header-name-face)
- (2 'message-header-subject-face nil t))
+ (1 'message-header-name)
+ (2 'message-header-subject nil t))
(,(message-font-lock-make-header-matcher
(concat "^\\([Nn]ewsgroups:\\|Followup-[Tt]o:\\)" content))
- (1 'message-header-name-face)
- (2 'message-header-newsgroups-face nil t))
+ (1 'message-header-name)
+ (2 'message-header-newsgroups nil t))
(,(message-font-lock-make-header-matcher
(concat "^\\([A-Z][^: \n\t]+:\\)" content))
- (1 'message-header-name-face)
- (2 'message-header-other-face nil t))
+ (1 'message-header-name)
+ (2 'message-header-other nil t))
(,(message-font-lock-make-header-matcher
(concat "^\\(X-[A-Za-z0-9-]+:\\|In-Reply-To:\\)" content))
- (1 'message-header-name-face)
- (2 'message-header-name-face))
+ (1 'message-header-name)
+ (2 'message-header-name))
,@(if (and mail-header-separator
(not (equal mail-header-separator "")))
`((,(concat "^\\(" (regexp-quote mail-header-separator) "\\)$")
- 1 'message-separator-face))
+ 1 'message-separator))
nil)
((lambda (limit)
(re-search-forward (concat "^\\("
message-cite-prefix-regexp
"\\).*")
limit t))
- (0 'message-cited-text-face))
+ (0 'message-cited-text))
("<#/?\\(multipart\\|part\\|external\\|mml\\|secure\\)[^>]*>"
- (0 'message-mml-face))))
+ (0 'message-mml))))
"Additional expressions to highlight in Message mode.")
(put 'message-mode 'font-lock-defaults '(message-font-lock-keywords t))
(defvar message-face-alist
- '((bold . bold-region)
+ '((bold . message-bold-region)
(underline . underline-region)
(default . (lambda (b e)
- (unbold-region b e)
+ (message-unbold-region b e)
(ununderline-region b e))))
"Alist of mail and news faces for facemenu.
The cdr of each entry is a function for applying the face to a region.")
(integer 1000000)))
(defcustom message-alternative-emails nil
- "A regexp to match the alternative email addresses.
-The first matched address (not primary one) is used in the From field."
+ "*Regexp matching alternative email addresses.
+The first address in the To, Cc or From headers of the original
+article matching this variable is used as the From field of
+outgoing messages.
+
+This variable has precedence over posting styles and anything that runs
+off `message-setup-hook'."
:group 'message-headers
:link '(custom-manual "(message)Message Headers")
:type '(choice (const :tag "Always use primary" nil)
:type 'boolean)
(defcustom message-user-fqdn nil
- "*Domain part of Messsage-Ids."
+ "*Domain part of Message-Ids."
:version "22.1"
:group 'message-headers
:link '(custom-manual "(message)News Headers")
(file-error))
(mm-coding-system-p 'utf-8)
(executable-find idna-program)
- 'ask)
- "Whether to encode non-ASCII in domain names into ASCII according to IDNA."
+ (string= (idna-to-ascii "räksmörgås")
+ "xn--rksmrgs-5wao1o")
+ t)
+ "Whether to encode non-ASCII in domain names into ASCII according to IDNA.
+GNU Libidn, and in particular the elisp package \"idna.el\" and
+the external program \"idn\", must be installed for this
+functionality to work."
:version "22.1"
:group 'message-headers
:link '(custom-manual "(message)IDNA")
;;; Suggested by Jonas Steverud @ www.dtek.chalmers.se/~d4jonas/
-;;;###autoload
(defun message-change-subject (new-subject)
"Ask for NEW-SUBJECT header, append (was: <Old Subject>)."
;; <URL:http://www.landfield.com/usefor/drafts/draft-ietf-usefor-useage--1.02.unpaged>
" (was: "
old-subject ")\n")))))))))
-;;;###autoload
-(defun message-mark-inserted-region (beg end)
+(defun message-mark-inserted-region (beg end &optional verbatim)
"Mark some region in the current article with enclosing tags.
-See `message-mark-insert-begin' and `message-mark-insert-end'."
- (interactive "r")
+See `message-mark-insert-begin' and `message-mark-insert-end'.
+If VERBATIM, use slrn style verbatim marks (\"#v+\" and \"#v-\")."
+ (interactive "r\nP")
(save-excursion
;; add to the end of the region first, otherwise end would be invalid
(goto-char end)
- (insert message-mark-insert-end)
+ (insert (if verbatim "#v-\n" message-mark-insert-end))
(goto-char beg)
- (insert message-mark-insert-begin)))
+ (insert (if verbatim "#v+\n" message-mark-insert-begin))))
-;;;###autoload
-(defun message-mark-insert-file (file)
+(defun message-mark-insert-file (file &optional verbatim)
"Insert FILE at point, marking it with enclosing tags.
-See `message-mark-insert-begin' and `message-mark-insert-end'."
- (interactive "fFile to insert: ")
+See `message-mark-insert-begin' and `message-mark-insert-end'.
+If VERBATIM, use slrn style verbatim marks (\"#v+\" and \"#v-\")."
+ (interactive "fFile to insert: \nP")
;; reverse insertion to get correct result.
(let ((p (point)))
- (insert message-mark-insert-end)
+ (insert (if verbatim "#v-\n" message-mark-insert-end))
(goto-char p)
(insert-file-contents file)
(goto-char p)
- (insert message-mark-insert-begin)))
+ (insert (if verbatim "#v+\n" message-mark-insert-begin))))
-;;;###autoload
(defun message-add-archive-header ()
"Insert \"X-No-Archive: Yes\" in the header and a note in the body.
The note can be customized using `message-archive-note'. When called with a
(message-add-header message-archive-header)
(message-sort-headers)))
-;;;###autoload
(defun message-cross-post-followup-to-header (target-group)
"Mangles FollowUp-To and Newsgroups header to point to TARGET-GROUP.
With prefix-argument just set Follow-Up, don't cross-post."
(insert (concat "\nFollowup-To: " target-group)))
(setq message-cross-post-old-target target-group))
-;;;###autoload
(defun message-cross-post-insert-note (target-group cross-post in-old
old-groups)
"Insert a in message body note about a set Followup or Crosspost.
(insert (concat message-followup-to-note target-group "\n"))
(insert (concat message-cross-post-note target-group "\n")))))
-;;;###autoload
(defun message-cross-post-followup-to (target-group)
"Crossposts message and set Followup-To to TARGET-GROUP.
With prefix-argument just set Follow-Up, don't cross-post."
;;; Reduce To: to Cc: or Bcc: header
-;;;###autoload
(defun message-reduce-to-to-cc ()
"Replace contents of To: header with contents of Cc: or Bcc: header."
(interactive)
(message-skip-to-next-address)
(kill-region start (point))))
+
+(defun message-info (&optional arg)
+ "Display the Message manual.
+
+Prefixed with one \\[universal-argument], display the Emacs MIME manual.
+Prefixed with two \\[universal-argument]'s, display the PGG manual."
+ (interactive "p")
+ (cond ((eq arg 16) (Info-goto-node "(pgg)Top"))
+ ((eq arg 4) (Info-goto-node "(emacs-mime)Top"))
+ (t (Info-goto-node "(message)Top"))))
+
\f
;;;
(define-key message-mode-map "\C-c\C-fw" 'message-insert-wide-reply)
(define-key message-mode-map "\C-c\C-n" 'message-insert-newsgroups)
(define-key message-mode-map "\C-c\C-l" 'message-to-list-only)
+ (define-key message-mode-map "\C-c\C-f\C-e" 'message-insert-expires)
(define-key message-mode-map "\C-c\C-u" 'message-insert-or-toggle-importance)
(define-key message-mode-map "\C-c\M-n"
'(:help "Ask, then arrange to send message at that time"))]
["Kill Message" message-kill-buffer
,@(if (featurep 'xemacs) '(t)
- '(:help "Delete this message without sending"))]))
+ '(:help "Delete this message without sending"))]
+ "----"
+ ["Message manual" message-info
+ ,@(if (featurep 'xemacs) '(t)
+ '(:help "Display the Message manual"))]))
(easy-menu-define
message-mode-field-menu message-mode-map ""
;; ["Followup-To (with note in body)" message-cross-post-followup-to t]
["Crosspost / Followup-To..." message-cross-post-followup-to t]
["Distribution" message-goto-distribution t]
- ["X-No-Archive:" message-add-archive-header t ]
+ ["Expires" message-insert-expires t ]
+ ["X-No-Archive" message-add-archive-header t ]
"----"
;; (typical) mailing-lists stuff
["Fetch To" message-insert-to
"----"
["Sort Headers" message-sort-headers t]
["Encode non-ASCII domain names" message-idna-to-ascii-rhs t]
+ ;; We hide `message-hidden-headers' by narrowing the buffer.
+ ["Show Hidden Headers" widen t]
["Goto Body" message-goto-body t]
["Goto Signature" message-goto-signature t]))
C-c C-f C-o move to From (\"Originator\")
C-c C-f C-f move to Followup-To
C-c C-f C-m move to Mail-Followup-To
+ C-c C-f C-e move to Expires
C-c C-f C-i cycle through Importance values
C-c C-f s change subject and append \"(was: <Old Subject>)\"
C-c C-f x crossposting with FollowUp-To header and note in body
(set (make-local-variable 'font-lock-defaults)
'(message-font-lock-keywords t))
(if (boundp 'tool-bar-map)
- (set (make-local-variable 'tool-bar-map) (message-tool-bar-map))))
+ (set (make-local-variable 'tool-bar-map) (message-make-tool-bar))))
(easy-menu-add message-mode-menu message-mode-map)
(easy-menu-add message-mode-field-menu message-mode-map)
(gnus-make-local-hook 'after-change-functions)
(message-goto-body)
(forward-line -1))
+(defun message-in-body-p ()
+ "Return t if point is in the message body."
+ (let ((body (save-excursion (message-goto-body) (point))))
+ (>= (point) body)))
+
(defun message-goto-signature ()
"Move point to the beginning of the message signature.
If there is no signature in the article, go to the end and
(message-carefully-insert-headers headers)))
(defcustom message-header-synonyms
- '((To Cc Bcc))
+ '((To Cc Bcc)
+ (Original-To))
"List of lists of header synonyms.
E.g., if this list contains a member list with elements `Cc' and `To',
then `message-carefully-insert-headers' will not insert a `To' header
"Kill all text up to the signature.
If a numberic argument or prefix arg is given, leave that number
of lines before the signature intact."
- (interactive "p")
+ (interactive "P")
(save-excursion
(save-restriction
(let ((point (point)))
(end-of-line -1)))
(unless (= point (point))
(kill-region point (point))
- (insert "\n"))))))
+ (unless (bolp)
+ (insert "\n")))))))
(defun message-newline-and-reformat (&optional arg not-break)
"Insert four newlines, and then reformat if inside quoted text.
Prefix arg means justify as well."
(interactive (list (if current-prefix-arg 'full)))
- (let (quoted point beg end leading-space bolp)
+ (let (quoted point beg end leading-space bolp fill-paragraph-function)
(setq point (point))
(beginning-of-line)
(setq beg (point))
(if point (goto-char point)))))
(defun message-fill-paragraph (&optional arg)
- "Like `fill-paragraph'."
+ "Message specific function to fill a paragraph.
+This function is used as the value of `fill-paragraph-function' in
+Message buffers and is not meant to be called directly."
(interactive (list (if current-prefix-arg 'full)))
(if (if (boundp 'filladapt-mode) filladapt-mode)
nil
(save-excursion
(goto-char start)
(while (< (point) (mark t))
- (if (or (looking-at ">") (looking-at "^$"))
- (insert message-yank-cited-prefix)
- (insert message-yank-prefix))
+ (cond ((looking-at ">")
+ (insert message-yank-cited-prefix))
+ ((looking-at "^$")
+ (insert message-yank-empty-prefix))
+ (t
+ (insert message-yank-prefix)))
(forward-line 1))))
(goto-char start)))
(when (and message-reply-buffer
message-cite-function)
(delete-windows-on message-reply-buffer t)
- (insert-buffer message-reply-buffer)
+ (push-mark (save-excursion
+ (insert-buffer-substring message-reply-buffer)
+ (point)))
(unless arg
(funcall message-cite-function))
(message-exchange-point-and-mark)
(push (buffer-name buffer) buffers))))
(nreverse buffers)))
-(defun message-cite-original-without-signature ()
- "Cite function in the standard Message manner."
- (let* ((start (point))
- (end (mark t))
- (functions
- (when message-indent-citation-function
- (if (listp message-indent-citation-function)
- message-indent-citation-function
- (list message-indent-citation-function))))
- ;; This function may be called by `gnus-summary-yank-message' and
- ;; may insert a different article from the original. So, we will
- ;; modify the value of `message-reply-headers' with that article.
- (message-reply-headers
- (save-restriction
- (narrow-to-region start end)
- (message-narrow-to-head-1)
- (vector 0
- (or (message-fetch-field "subject") "none")
- (message-fetch-field "from")
- (message-fetch-field "date")
- (message-fetch-field "message-id" t)
- (message-fetch-field "references")
- 0 0 ""))))
- (mml-quote-region start end)
- ;; Allow undoing.
- (undo-boundary)
- (goto-char end)
- (when (re-search-backward message-signature-separator start t)
- ;; Also peel off any blank lines before the signature.
- (forward-line -1)
- (while (looking-at "^[ \t]*$")
- (forward-line -1))
- (forward-line 1)
- (delete-region (point) end)
- (unless (search-backward "\n\n" start t)
- ;; Insert a blank line if it is peeled off.
- (insert "\n")))
- (goto-char start)
- (mapc 'funcall functions)
- (when message-citation-line-function
- (unless (bolp)
- (insert "\n"))
- (funcall message-citation-line-function))))
+(eval-when-compile (defvar mail-citation-hook)) ; Compiler directive
-(eval-when-compile (defvar mail-citation-hook)) ;Compiler directive
-(defun message-cite-original ()
- "Cite function in the standard Message manner."
+(defun message-cite-original-1 (strip-signature)
+ "Cite an original message.
+If STRIP-SIGNATURE is non-nil, strips off the signature from the
+original message.
+
+This function uses `mail-citation-hook' if that is non-nil."
(if (and (boundp 'mail-citation-hook)
mail-citation-hook)
(run-hooks 'mail-citation-hook)
(message-fetch-field "references")
0 0 ""))))
(mml-quote-region start end)
+ (when strip-signature
+ ;; Allow undoing.
+ (undo-boundary)
+ (goto-char end)
+ (when (re-search-backward message-signature-separator start t)
+ ;; Also peel off any blank lines before the signature.
+ (forward-line -1)
+ (while (looking-at "^[ \t]*$")
+ (forward-line -1))
+ (forward-line 1)
+ (delete-region (point) end)
+ (unless (search-backward "\n\n" start t)
+ ;; Insert a blank line if it is peeled off.
+ (insert "\n"))))
(goto-char start)
(mapc 'funcall functions)
(when message-citation-line-function
(insert "> [Quoted text removed due to X-No-Archive]\n")
(forward-line -1)))))
+(defun message-cite-original ()
+ "Cite function in the standard Message manner."
+ (message-cite-original-1 nil))
+
+(defun message-cite-original-without-signature ()
+ "Cite function in the standard Message manner.
+This function strips off the signature from the original message."
+ (message-cite-original-1 t))
+
(defun message-insert-citation-line ()
"Insert a simple citation line."
(when message-reply-headers
- (insert (mail-header-from message-reply-headers) " writes:\n\n")))
+ (insert (mail-header-from message-reply-headers) " writes:")
+ (newline)
+ (newline)))
(defun message-position-on-field (header &rest afters)
(let ((case-fold-search t))
(when (let ((char (char-after)))
(or (< (mm-char-int char) 128)
(and (mm-multibyte-p)
- ;; Fixme: Wrong for Emacs 22 and for things
- ;; like undecable utf-8. Should at least
+ ;; FIXME: Wrong for Emacs 23 (unicode) and for
+ ;; things like undecable utf-8. Should at least
;; use find-coding-systems-region.
(memq (char-charset char)
'(eight-bit-control eight-bit-graphic
(zerop
(length
(setq to (completing-read
- "Followups to (default: no Followup-To header) "
+ "Followups to (default no Followup-To header): "
(mapcar #'list
(cons "poster"
(message-tokenize-header
(let ((system-time-locale "C"))
(format-time-string "%a, %d %b %Y %T %z" now)))
+(defun message-insert-expires (days)
+ "Insert the Expires header. Expiry in DAYS days."
+ (interactive "NExpire article in how many days? ")
+ (save-excursion
+ (message-position-on-field "Expires" "X-Draft-From")
+ (insert (message-make-expires-date days))))
+
+(defun message-make-expires-date (days)
+ "Make date string for the Expires header. Expiry in DAYS days.
+
+In posting styles use `(\"Expires\" (make-expires-date 30))'."
+ (let* ((cur (decode-time (current-time)))
+ (nday (+ days (nth 3 cur))))
+ (setf (nth 3 cur) nday)
+ (message-make-date (apply 'encode-time cur))))
+
(defun message-make-message-id ()
"Make a unique Message-ID."
(concat "<" (message-unique-id)
(* 25 25)))
(let ((tm (current-time)))
(concat
- (if (memq system-type '(ms-dos emx vax-vms))
+ (if (or (memq system-type '(ms-dos emx vax-vms))
+ ;; message-number-base36 doesn't handle bigints.
+ (floatp (user-uid)))
(let ((user (downcase (user-login-name))))
(while (string-match "[^a-z0-9_]" user)
(aset user (match-beginning 0) ?_))
(let ((field (message-fetch-field header))
rhs ace address)
(when field
- (dolist (address (mail-header-parse-addresses field))
- (setq address (car address)
- rhs (downcase (or (cadr (split-string address "@")) ""))
- ace (downcase (idna-to-ascii rhs)))
+ (dolist (rhs
+ (mm-delete-duplicates
+ (mapcar (lambda (rhs) (or (cadr (split-string rhs "@")) ""))
+ (mapcar 'downcase
+ (mapcar
+ 'car (mail-header-parse-addresses field))))))
+ (setq ace (downcase (idna-to-ascii rhs)))
(when (and (not (equal rhs ace))
(or (not (eq message-use-idna 'ask))
- (y-or-n-p (format "Replace %s with %s? " rhs ace))))
+ (y-or-n-p (format "Replace %s with %s in %s:? "
+ rhs ace header))))
(goto-char (point-min))
(while (re-search-forward (concat "^" header ":") nil t)
(message-narrow-to-field)
(message-idna-to-ascii-rhs-1 "From")
(message-idna-to-ascii-rhs-1 "To")
(message-idna-to-ascii-rhs-1 "Reply-To")
+ (message-idna-to-ascii-rhs-1 "Mail-Reply-To")
+ (message-idna-to-ascii-rhs-1 "Mail-Followup-To")
(message-idna-to-ascii-rhs-1 "Cc")))))
(defun message-generate-headers (headers)
;; The element is a symbol. We insert the value
;; of this symbol, if any.
(symbol-value header))
- ((not (message-check-element header))
+ ((not (message-check-element
+ (intern (downcase (symbol-name header)))))
;; We couldn't generate a value for this header,
;; so we just ask the user.
(read-from-minibuffer
;; totally and insert the new value.
(delete-region (point) (point-at-eol))
;; If the header is optional, and the header was
- ;; empty, we con't insert it anyway.
+ ;; empty, we can't insert it anyway.
(unless optionalp
(push header-string message-inserted-headers)
(insert value)
(when message-default-mail-headers
(insert message-default-mail-headers)
(or (bolp) (insert ?\n)))
- (save-restriction
- (message-narrow-to-headers)
- (if message-alternative-emails
- (message-use-alternative-email-as-from)))
(when message-generate-headers-first
(message-generate-headers
(message-headers-to-generate
;; Generate hashcash headers for recipients already known
(mail-add-payment-async))
(run-hooks 'message-setup-hook)
+ ;; Do this last to give it precedence over posting styles, etc.
+ (when (message-mail-p)
+ (save-restriction
+ (message-narrow-to-headers)
+ (if message-alternative-emails
+ (message-use-alternative-email-as-from))))
(message-position-point)
(undo-boundary))
(defun message-is-yours-p ()
"Non-nil means current article is yours.
-If you have added 'cancel-messages to 'message-shoot-gnksa-feet', all articles
+If you have added 'cancel-messages to `message-shoot-gnksa-feet', all articles
are yours except those that have Cancel-Lock header not belonging to you.
-Instead of shooting GNKSA feet, you should modify 'message-alternative-emails'
+Instead of shooting GNKSA feet, you should modify `message-alternative-emails'
regexp to match all of yours addresses."
;; Canlock-logic as suggested by Per Abrahamsen
;; <abraham@dina.kvl.dk>
(prefix
(if group
(gnus-group-decoded-name group)
- (or (and from (car (gnus-extract-address-components from)))
+ (or (and from (or
+ (car (gnus-extract-address-components from))
+ (cadr (gnus-extract-address-components from))))
"(nowhere)"))))
(concat "["
(if message-forward-decoded-p
(set-buffer (get-buffer-create " *message resend*"))
(erase-buffer))
(let ((message-this-is-mail t)
+ message-generate-hashcash
message-setup-hook)
(message-setup `((To . ,address))))
;; Insert our usual headers.
;; Send it.
(let ((message-inhibit-body-encoding t)
message-required-mail-headers
+ message-generate-hashcash
rfc2047-encode-encoded-words)
(message-send-mail))
(kill-buffer (current-buffer)))
;; This code should be moved to underline.el (from which it is stolen).
;;;###autoload
-(defun bold-region (start end)
+(defun message-bold-region (start end)
"Bold all nonblank characters in the region.
Works by overstriking characters.
Called from program, takes two arguments START and END
(forward-char 1)))))
;;;###autoload
-(defun unbold-region (start end)
+(defun message-unbold-region (start end)
"Remove all boldness (overstruck characters) in the region.
Called from program, takes two arguments START and END
which specify the range to operate on."
;; Support for toolbar
(eval-when-compile
- (defvar tool-bar-map)
(defvar tool-bar-mode))
-(defun message-tool-bar-local-item-from-menu (command icon in-map &optional from-map &rest props)
- ;; We need to make tool bar entries in local keymaps with
- ;; `tool-bar-local-item-from-menu' in Emacs > 21.3
- (if (fboundp 'tool-bar-local-item-from-menu)
- ;; This is for Emacs 21.3
- (tool-bar-local-item-from-menu command icon in-map from-map props)
- (tool-bar-add-item-from-menu command icon from-map props)))
-
-(defun message-tool-bar-map ()
- (or message-tool-bar-map
- (setq message-tool-bar-map
- (and
- (condition-case nil (require 'tool-bar) (error nil))
- (fboundp 'tool-bar-add-item-from-menu)
+;; Note: The :set function in the `message-tool-bar*' variables will only
+;; affect _new_ message buffers. We might add a function that walks thru all
+;; message-mode buffers and force the update.
+(defun message-tool-bar-update (&optional symbol value)
+ "Update message mode toolbar.
+Setter function for custom variables."
+ (setq-default message-tool-bar-map nil)
+ (when symbol
+ ;; When used as ":set" function:
+ (set-default symbol value)))
+
+(defcustom message-tool-bar (if (eq gmm-tool-bar-style 'gnome)
+ 'message-tool-bar-gnome
+ 'message-tool-bar-retro)
+ "Specifies the message mode tool bar.
+
+It can be either a list or a symbol refering to a list. See
+`gmm-tool-bar-from-list' for the format of the list. The
+default key map is `message-mode-map'.
+
+Pre-defined symbols include `message-tool-bar-gnome' and
+`message-tool-bar-retro'."
+ :type '(repeat gmm-tool-bar-list-item)
+ :type '(choice (const :tag "GNOME style" message-tool-bar-gnome)
+ (const :tag "Retro look" message-tool-bar-retro)
+ (repeat :tag "User defined list" gmm-tool-bar-item)
+ (symbol))
+ :version "23.0" ;; No Gnus
+ :initialize 'custom-initialize-default
+ :set 'message-tool-bar-update
+ :group 'message)
+
+(defcustom message-tool-bar-gnome
+ '((ispell-message "spell" nil
+ :visible (or (not (boundp 'flyspell-mode))
+ (not flyspell-mode)))
+ (flyspell-buffer "spell" t
+ :visible (and (boundp 'flyspell-mode)
+ flyspell-mode)
+ :help "Flyspell whole buffer")
+ (gmm-ignore "separator")
+ (message-send-and-exit "mail/send")
+ (message-dont-send "mail/save-draft")
+ (message-kill-buffer "close") ;; stock_cancel
+ (mml-attach-file "attach" mml-mode-map)
+ (mml-preview "mail/preview" mml-mode-map)
+ (mml-secure-message-sign-encrypt "lock" mml-mode-map :visible nil)
+ (message-insert-importance-high "important" nil :visible nil)
+ (message-insert-importance-low "unimportant" nil :visible nil)
+ (message-insert-disposition-notification-to "receipt" nil :visible nil)
+ (gmm-customize-mode "preferences" t :help "Edit mode preferences")
+ (message-info "help" t :help "Message manual"))
+ "List of items for the message tool bar (GNOME style).
+
+See `gmm-tool-bar-from-list' for details on the format of the list."
+ :type '(repeat gmm-tool-bar-item)
+ :version "23.0" ;; No Gnus
+ :initialize 'custom-initialize-default
+ :set 'message-tool-bar-update
+ :group 'message)
+
+(defcustom message-tool-bar-retro
+ '(;; Old Emacs 21 icon for consistency.
+ (message-send-and-exit "gnus/mail_send")
+ (message-kill-buffer "close")
+ (message-dont-send "cancel")
+ (mml-attach-file "attach" mml-mode-map)
+ (ispell-message "spell")
+ (mml-preview "preview" mml-mode-map)
+ (message-insert-importance-high "gnus/important")
+ (message-insert-importance-low "gnus/unimportant")
+ (message-insert-disposition-notification-to "gnus/receipt"))
+ "List of items for the message tool bar (retro style).
+
+See `gmm-tool-bar-from-list' for details on the format of the list."
+ :type '(repeat gmm-tool-bar-item)
+ :version "23.0" ;; No Gnus
+ :initialize 'custom-initialize-default
+ :set 'message-tool-bar-update
+ :group 'message)
+
+(defcustom message-tool-bar-zap-list
+ '(new-file open-file dired kill-buffer write-file
+ print-buffer customize help)
+ "List of icon items from the global tool bar.
+These items are not displayed on the message mode tool bar.
+
+See `gmm-tool-bar-from-list' for the format of the list."
+ :type 'gmm-tool-bar-zap-list
+ :version "23.0" ;; No Gnus
+ :initialize 'custom-initialize-default
+ :set 'message-tool-bar-update
+ :group 'message)
+
+(defvar image-load-path)
+
+(defun message-make-tool-bar (&optional force)
+ "Make a message mode tool bar from `message-tool-bar-list'.
+When FORCE, rebuild the tool bar."
+ (when (and (not (featurep 'xemacs))
+ (boundp 'tool-bar-mode)
tool-bar-mode
- (let ((tool-bar-map (copy-keymap tool-bar-map))
- (load-path (mm-image-load-path)))
- ;; Zap some items which aren't so relevant and take
- ;; up space.
- (dolist (key '(print-buffer kill-buffer save-buffer
- write-file dired open-file))
- (define-key tool-bar-map (vector key) nil))
- (message-tool-bar-local-item-from-menu
- 'message-send-and-exit "mail_send" tool-bar-map message-mode-map)
- (message-tool-bar-local-item-from-menu
- 'message-kill-buffer "close" tool-bar-map message-mode-map)
- (message-tool-bar-local-item-from-menu
- 'message-dont-send "cancel" tool-bar-map message-mode-map)
- (message-tool-bar-local-item-from-menu
- 'mml-attach-file "attach" tool-bar-map mml-mode-map)
- (message-tool-bar-local-item-from-menu
- 'ispell-message "spell" tool-bar-map message-mode-map)
- (message-tool-bar-local-item-from-menu
- 'mml-preview "preview"
- tool-bar-map mml-mode-map)
- (message-tool-bar-local-item-from-menu
- 'message-insert-importance-high "important"
- tool-bar-map message-mode-map)
- (message-tool-bar-local-item-from-menu
- 'message-insert-importance-low "unimportant"
- tool-bar-map message-mode-map)
- (message-tool-bar-local-item-from-menu
- 'message-insert-disposition-notification-to "receipt"
- tool-bar-map message-mode-map)
- tool-bar-map)))))
+ (or (not message-tool-bar-map) force))
+ (setq message-tool-bar-map
+ (let* ((load-path
+ (gmm-image-load-path-for-library "message"
+ "mail/save-draft.xpm"
+ nil t))
+ (image-load-path (cons (car load-path)
+ (when (boundp 'image-load-path)
+ image-load-path))))
+ (gmm-tool-bar-from-list message-tool-bar
+ message-tool-bar-zap-list
+ 'message-mode-map))))
+ message-tool-bar-map)
;;; Group name completion.
:version "22.1"
:group 'message
:link '(custom-manual "(message)Various Commands")
- :type 'function)
+ :type '(choice (const nil)
+ function))
(defun message-tab ()
"Complete names according to `message-completion-alist'.
(lookup-key global-map "\t")
'indent-relative))))
+(eval-and-compile
+ (condition-case nil
+ (with-temp-buffer
+ (let ((standard-output (current-buffer)))
+ (eval '(display-completion-list nil "")))
+ (defalias 'message-display-completion-list 'display-completion-list))
+ (error ;; Don't use `wrong-number-of-arguments' here because of XEmacs.
+ (defun message-display-completion-list (completions &optional ignore)
+ "Display the list of completions, COMPLETIONS, using `standard-output'."
+ (display-completion-list completions)))))
+
(defun message-expand-group ()
"Expand the group name under point."
(let* ((b (save-excursion
(let ((buffer-read-only nil))
(erase-buffer)
(let ((standard-output (current-buffer)))
- (display-completion-list (sort completions 'string<)))
+ (message-display-completion-list (sort completions 'string<)
+ string))
+ (setq buffer-read-only nil)
(goto-char (point-min))
(delete-region (point) (progn (forward-line 3) (point))))))))))
(read-string prompt initial-contents))))
(defun message-use-alternative-email-as-from ()
+ "Set From field of the outgoing message to the first matching
+address in `message-alternative-emails', looking at To, Cc and
+From headers in the original article."
(require 'mail-utils)
(let* ((fields '("To" "Cc" "From"))
(emails
emails nil))
(pop emails))
(unless (or (not email) (equal email user-mail-address))
+ (message-remove-header "From")
(goto-char (point-max))
(insert "From: " (let ((user-mail-address email)) (message-make-from))
"\n"))))
;;; messagexmas.el --- XEmacs extensions to message
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2003, 2004
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2003, 2004,
+;; 2005 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: mail, news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
If this variable is nil, Message will try to locate the directory
automatically.")
-(defvar message-use-toolbar (if (featurep 'toolbar)
- 'default-toolbar
- nil)
- "*If nil, do not use a toolbar.
-If it is non-nil, it must be a toolbar. The five valid values are
-`default-toolbar', `top-toolbar', `bottom-toolbar',
-`right-toolbar', and `left-toolbar'.")
+(defvar message-use-toolbar (if (featurep 'toolbar) 'default)
+ "*Position to display the toolbar. Nil means do not use a toolbar.
+If it is non-nil, it should be one of the symbols `default', `top',
+`bottom', `right', and `left'. `default' means to use the default
+toolbar, the rest mean to display the toolbar on the place which those
+names show.")
+
+(defvar message-toolbar-thickness
+ (if (featurep 'toolbar)
+ (cons (specifier-instance default-toolbar-height)
+ (specifier-instance default-toolbar-width)))
+ "*Cons of the height and the width specifying the thickness of a toolbar.
+The height is used for the toolbar displayed on the top or the bottom,
+the width is used for the toolbar displayed on the right or the left.")
(defvar message-toolbar
'([message-spell ispell-message t "Spell"]
(nnheader-find-etc-directory package))))
(defun message-xmas-setup-toolbar (bar &optional force package)
- (let ((dir (message-xmas-find-glyph-directory package))
+ (let ((dir (or (message-xmas-find-glyph-directory package)
+ (message-xmas-find-glyph-directory "gnus")))
(xpm (if (featurep 'xpm) "xpm" "xbm"))
icon up down disabled name)
(unless package
dir))
(defun message-setup-toolbar ()
- (and message-use-toolbar
- (message-xmas-setup-toolbar message-toolbar)
- (set-specifier (symbol-value message-use-toolbar)
- (cons (current-buffer) message-toolbar))))
+ (when (featurep 'toolbar)
+ (if (and message-use-toolbar
+ (message-xmas-setup-toolbar message-toolbar))
+ (let ((bar (or (intern-soft (format "%s-toolbar" message-use-toolbar))
+ 'default-toolbar))
+ (height (car message-toolbar-thickness))
+ (width (cdr message-toolbar-thickness))
+ (cur (current-buffer))
+ bars)
+ (set-specifier (symbol-value bar) message-toolbar cur)
+ (set-specifier default-toolbar-height height cur)
+ (set-specifier default-toolbar-width width cur)
+ (set-specifier top-toolbar-height height cur)
+ (set-specifier bottom-toolbar-height height cur)
+ (set-specifier right-toolbar-width width cur)
+ (set-specifier left-toolbar-width width cur)
+ (if (eq bar 'default-toolbar)
+ (progn
+ (remove-specifier default-toolbar-visible-p cur)
+ (remove-specifier top-toolbar cur)
+ (remove-specifier top-toolbar-visible-p cur)
+ (remove-specifier bottom-toolbar cur)
+ (remove-specifier bottom-toolbar-visible-p cur)
+ (remove-specifier right-toolbar cur)
+ (remove-specifier right-toolbar-visible-p cur)
+ (remove-specifier left-toolbar cur)
+ (remove-specifier left-toolbar-visible-p cur))
+ (set-specifier (symbol-value (intern (format "%s-visible-p" bar)))
+ t cur)
+ (setq bars (delq bar (list 'default-toolbar
+ 'bottom-toolbar 'top-toolbar
+ 'right-toolbar 'left-toolbar)))
+ (while bars
+ (set-specifier (symbol-value (intern (format "%s-visible-p"
+ (pop bars))))
+ nil cur))))
+ (let ((cur (current-buffer)))
+ (set-specifier default-toolbar-visible-p nil cur)
+ (set-specifier top-toolbar-visible-p nil cur)
+ (set-specifier bottom-toolbar-visible-p nil cur)
+ (set-specifier right-toolbar-visible-p nil cur)
+ (set-specifier left-toolbar-visible-p nil cur)))))
(defun message-xmas-exchange-point-and-mark ()
"Exchange point and mark, but allow for XEmacs' optional argument."
;;; messcompat.el --- making message mode compatible with mail mode
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2002, 2003
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: mail, news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; mm-bodies.el --- Functions for decoding MIME things
-;; Copyright (C) 1998, 1999, 2000, 2001, 2003, 2004
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; MORIOKA Tomohiko <morioka@jaist.ac.jp>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(save-excursion
(if charset
(progn
- (mm-encode-coding-region (point-min) (point-max) charset)
+ (mm-encode-coding-region (point-min) (point-max)
+ (mm-charset-to-coding-system charset))
charset)
(goto-char (point-min))
(let ((charsets (mm-find-mime-charset-region (point-min) (point-max)
(message "Error while decoding: %s" error)
nil))
(when (and
+ type
(memq encoding '(base64 x-uuencode x-uue x-binhex x-yenc))
- (equal type "text/plain"))
+ (string-match "\\`text/" type))
(goto-char (point-min))
(while (search-forward "\r\n" nil t)
(replace-match "\n" t t)))))
(save-excursion
(when encoding
(mm-decode-content-transfer-encoding encoding type))
- (when (featurep 'mule) ; Fixme: Wrong test for unibyte session.
- (let ((coding-system (mm-charset-to-coding-system charset)))
+ (when (and (featurep 'mule) ;; Fixme: Wrong test for unibyte session.
+ (not (eq charset 'gnus-decoded)))
+ (let ((coding-system (mm-charset-to-coding-system
+ ;; Allow overwrite using
+ ;; `mm-charset-override-alist'.
+ charset nil t)))
(if (and (not coding-system)
(listp mail-parse-ignored-charsets)
(memq 'gnus-unknown mail-parse-ignored-charsets))
;;in XEmacs
(mm-multibyte-p)
(or (not (eq coding-system 'ascii))
- (setq coding-system mail-parse-charset))
- (not (eq coding-system 'gnus-decoded)))
+ (setq coding-system mail-parse-charset)))
(mm-decode-coding-region (point-min) (point-max)
coding-system))
(setq buffer-file-coding-system
(setq charset mail-parse-charset))
(or
(when (featurep 'mule)
- (let ((coding-system (mm-charset-to-coding-system charset)))
+ (let ((coding-system (mm-charset-to-coding-system
+ charset
+ ;; Allow overwrite using
+ ;; `mm-charset-override-alist'.
+ nil t)))
(if (and (not coding-system)
(listp mail-parse-ignored-charsets)
(memq 'gnus-unknown mail-parse-ignored-charsets))
;;; mm-decode.el --- Functions for decoding MIME things
-;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; MORIOKA Tomohiko <morioka@jaist.ac.jp>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(eval-and-compile
(autoload 'mm-inline-partial "mm-partial")
(autoload 'mm-inline-external-body "mm-extern")
+ (autoload 'mm-extern-cache-contents "mm-extern")
(autoload 'mm-insert-inline "mm-view"))
+(defvar gnus-current-window-configuration)
+
(add-hook 'gnus-exit-gnus-hook 'mm-destroy-postponed-undisplay-list)
(defgroup mime-display ()
("text/richtext" mm-inline-text identity)
("text/x-patch" mm-display-patch-inline
(lambda (handle)
- (locate-library "diff-mode")))
+ ;; If the diff-mode.el package is installed, the function is
+ ;; autoloaded. Checking (locate-library "diff-mode") would be trying
+ ;; to cater to broken installations. OTOH checking the function
+ ;; makes it possible to install another package which provides an
+ ;; alternative implementation of diff-mode. --Stef
+ (fboundp 'diff-mode)))
("application/emacs-lisp" mm-display-elisp-inline identity)
("application/x-emacs-lisp" mm-display-elisp-inline identity)
("text/dns" mm-display-dns-inline identity)
"application/x-emacs-lisp"
"application/pgp-signature" "application/x-pkcs7-signature"
"application/pkcs7-signature" "application/x-pkcs7-mime"
- "application/pkcs7-mime")
+ "application/pkcs7-mime"
+ ;; Mutt still uses this even though it has already been withdrawn.
+ "application/pgp")
"List of media types that are to be displayed inline.
See also `mm-inline-media-tests', which says how to display a media
type inline."
- :type '(repeat string)
+ :type '(repeat regexp)
:group 'mime-display)
(defcustom mm-keep-viewer-alive-types
"List of media types for which the external viewer will not be killed
when selecting a different article."
:version "22.1"
- :type '(repeat string)
+ :type '(repeat regexp)
:group 'mime-display)
(defcustom mm-automatic-display
- '("text/plain" "text/enriched" "text/richtext" "text/html"
+ '("text/plain" "text/enriched" "text/richtext" "text/html" "text/x-verbatim"
"text/x-vcard" "image/.*" "message/delivery-status" "multipart/.*"
"message/rfc822" "text/x-patch" "text/dns" "application/pgp-signature"
"application/emacs-lisp" "application/x-emacs-lisp"
"application/x-pkcs7-signature"
"application/pkcs7-signature" "application/x-pkcs7-mime"
- "application/pkcs7-mime")
+ "application/pkcs7-mime"
+ ;; Mutt still uses this even though it has already been withdrawn.
+ "application/pgp")
"A list of MIME types to be displayed automatically."
- :type '(repeat string)
+ :type '(repeat regexp)
:group 'mime-display)
(defcustom mm-attachment-override-types '("text/x-vcard"
"application/pkcs7-signature"
"application/x-pkcs7-signature")
"Types to have \"attachment\" ignored if they can be displayed inline."
- :type '(repeat string)
+ :type '(repeat regexp)
:group 'mime-display)
(defcustom mm-inline-override-types nil
"Types to be treated as attachments even if they can be displayed inline."
- :type '(repeat string)
+ :type '(repeat regexp)
:group 'mime-display)
(defcustom mm-automatic-external-display nil
"List of MIME type regexps that will be displayed externally automatically."
- :type '(repeat string)
+ :type '(repeat regexp)
:group 'mime-display)
(defcustom mm-discouraged-alternatives nil
somewhat unwanted, then the value of this variable should be set
to:
- (\"text/html\" \"text/richtext\")"
- :type '(repeat string)
+ (\"text/html\" \"text/richtext\")
+
+Adding \"image/.*\" might also be useful. Spammers use it as the
+prefered part of multipart/alternative messages. See also
+`gnus-buttonized-mime-types', to which adding \"multipart/alternative\"
+enables you to choose manually one of two types those mails include."
+ :type '(repeat regexp) ;; See `mm-preferred-alternative-precedence'.
:group 'mime-display)
(defcustom mm-tmp-directory
(defvar mm-viewer-completion-map
(let ((map (make-sparse-keymap 'mm-viewer-completion-map)))
(set-keymap-parent map minibuffer-local-completion-map)
+ ;; Should we bind other key to minibuffer-complete-word?
+ (define-key map " " 'self-insert-command)
map)
"Keymap for input viewer with completion.")
-;; Should we bind other key to minibuffer-complete-word?
-(define-key mm-viewer-completion-map " " 'self-insert-command)
-
(defvar mm-viewer-completion-map
(let ((map (make-sparse-keymap 'mm-viewer-completion-map)))
(set-keymap-parent map minibuffer-local-completion-map)
+ ;; Should we bind other key to minibuffer-complete-word?
+ (define-key map " " 'self-insert-command)
map)
"Keymap for input viewer with completion.")
-;; Should we bind other key to minibuffer-complete-word?
-(define-key mm-viewer-completion-map " " 'self-insert-command)
-
;;; The functions.
(defun mm-alist-to-plist (alist)
loose-mime
(mail-fetch-field "mime-version"))
(setq ct (mail-fetch-field "content-type")
- ctl (ignore-errors (mail-header-parse-content-type ct))
+ ctl (and ct (mail-header-parse-content-type ct))
cte (mail-fetch-field "content-transfer-encoding")
cd (mail-fetch-field "content-disposition")
description (mail-fetch-field "content-description")
id (mail-fetch-field "content-id"))
(unless from
- (setq from (mail-fetch-field "from")))
+ (setq from (mail-fetch-field "from")))
;; FIXME: In some circumstances, this code is running within
;; an unibyte macro. mail-extract-address-components
;; creates unibyte buffers. This `if', though not a perfect
(list mm-dissect-default-type)
(and cte (intern (downcase (mail-header-strip cte))))
no-strict-mime
- (and cd (ignore-errors (mail-header-parse-content-disposition cd)))
+ (and cd (mail-header-parse-content-disposition cd))
description)
(setq type (split-string (car ctl) "/"))
(setq subtype (cadr type)
;; what really needs to be done here is a way to link a
;; MIME handle back to it's parent MIME handle (in a multilevel
;; MIME article). That would probably require changing
- ;; the mm-handle API so we simply store the multipart buffert
+ ;; the mm-handle API so we simply store the multipart buffer
;; name as a text property of the "multipart/whatever" string.
(add-text-properties 0 (length (car ctl))
(list 'buffer (mm-copy-to-buffer)
ctl
(and cte (intern (downcase (mail-header-strip cte))))
no-strict-mime
- (and cd (ignore-errors
- (mail-header-parse-content-disposition cd)))
+ (and cd (mail-header-parse-content-disposition cd))
description id)
ctl))))
(when id
(gnus-map-function mm-file-name-rewrite-functions
(file-name-nondirectory filename))
dir))
- (setq file (mm-make-temp-file (expand-file-name "mm." dir))))
+ ;; Use nametemplate (defined in RFC1524) if it is specified
+ ;; in mailcap.
+ (let ((suffix (cdr (assoc "nametemplate" mime-info))))
+ (if (and suffix
+ (string-match "\\`%s\\(\\..+\\)\\'" suffix))
+ (setq suffix (match-string 1 suffix))
+ ;; Otherwise, use a suffix according to
+ ;; `mailcap-mime-extensions'.
+ (setq suffix (car (rassoc (mm-handle-media-type handle)
+ mailcap-mime-extensions))))
+ (setq file (mm-make-temp-file (expand-file-name "mm." dir)
+ nil suffix))))
(let ((coding-system-for-write mm-binary-coding-system))
(write-region (point-min) (point-max) file nil 'nomesg))
(message "Viewing with %s" method)
(mm-mailcap-command
method file (mm-handle-type handle)))
(if (buffer-live-p buffer)
- (save-excursion
- (set-buffer buffer)
+ (with-current-buffer buffer
(buffer-string))))
(progn
(ignore-errors (delete-file file))
(ignore-errors (kill-buffer buffer))))))
'inline)
(t
+ ;; Deleting the temp file should be postponed for some wrappers,
+ ;; shell scripts, and so on, which might exit right after having
+ ;; started a viewer command as a background job.
(let ((command (mm-mailcap-command
method file (mm-handle-type handle))))
(unwind-protect
- (start-process "*display*"
- (setq buffer
- (generate-new-buffer " *mm*"))
- shell-file-name
- shell-command-switch command)
+ (progn
+ (start-process "*display*"
+ (setq buffer
+ (generate-new-buffer " *mm*"))
+ shell-file-name
+ shell-command-switch command)
+ (set-process-sentinel
+ (get-buffer-process buffer)
+ (lexical-let ;; Don't use `let'.
+ ;; Function used to remove temp file and directory.
+ ((fn `(lambda nil
+ ;; Don't use `ignore-errors'.
+ (condition-case nil
+ (delete-file ,file)
+ (error))
+ (condition-case nil
+ (delete-directory
+ ,(file-name-directory file))
+ (error))))
+ ;; Form uses to kill the process buffer and
+ ;; remove the undisplayer.
+ (fm `(progn
+ (kill-buffer ,buffer)
+ ,(macroexpand
+ (list 'mm-handle-set-undisplayer
+ (list 'quote handle)
+ nil))))
+ ;; Message to be issued when the process exits.
+ (done (format "Displaying %s...done" command))
+ ;; In particular, the timer object (which is
+ ;; a vector in Emacs but is a list in XEmacs)
+ ;; requires that it is lexically scoped.
+ (timer (run-at-time 2.0 nil 'ignore)))
+ (lambda (process state)
+ (when (eq 'exit (process-status process))
+ (if (memq timer timer-list)
+ (timer-set-function timer fn)
+ (funcall fn))
+ (ignore-errors (eval fm))
+ (message "%s" done))))))
(mm-handle-set-external-undisplayer
handle (cons file buffer)))
(message "Displaying %s..." command))
;;; Functions for outputting parts
;;;
-(defun mm-get-part (handle)
- "Return the contents of HANDLE as a string."
- (mm-with-unibyte-buffer
- (insert (with-current-buffer (mm-handle-buffer handle)
- (mm-with-unibyte-current-buffer
- (buffer-string))))
- (mm-decode-content-transfer-encoding
- (mm-handle-encoding handle)
- (mm-handle-media-type handle))
- (buffer-string)))
-
-(defun mm-insert-part (handle)
- "Insert the contents of HANDLE in the current buffer."
+(defmacro mm-with-part (handle &rest forms)
+ "Run FORMS in the temp buffer containing the contents of HANDLE."
+ `(let* ((handle ,handle)
+ ;; The multibyteness of the temp buffer should be turned on
+ ;; if inserting a multibyte string. Contrarily, the buffer's
+ ;; multibyteness should be off if inserting a unibyte string,
+ ;; especially if a string contains 8bit data.
+ (default-enable-multibyte-characters
+ (with-current-buffer (mm-handle-buffer handle)
+ (mm-multibyte-p))))
+ (with-temp-buffer
+ (insert-buffer-substring (mm-handle-buffer handle))
+ (mm-disable-multibyte)
+ (mm-decode-content-transfer-encoding
+ (mm-handle-encoding handle)
+ (mm-handle-media-type handle))
+ ,@forms)))
+(put 'mm-with-part 'lisp-indent-function 1)
+(put 'mm-with-part 'edebug-form-spec '(body))
+
+(defun mm-get-part (handle &optional no-cache)
+ "Return the contents of HANDLE as a string.
+If NO-CACHE is non-nil, cached contents of a message/external-body part
+are ignored."
+ (if (and (not no-cache)
+ (equal (mm-handle-media-type handle) "message/external-body"))
+ (progn
+ (unless (mm-handle-cache handle)
+ (mm-extern-cache-contents handle))
+ (with-current-buffer (mm-handle-buffer (mm-handle-cache handle))
+ (buffer-string)))
+ (mm-with-part handle
+ (buffer-string))))
+
+(defun mm-insert-part (handle &optional no-cache)
+ "Insert the contents of HANDLE in the current buffer.
+If NO-CACHE is non-nil, cached contents of a message/external-body part
+are ignored."
(save-excursion
- (insert (if (mm-multibyte-p)
- (mm-string-as-multibyte (mm-get-part handle))
- (mm-get-part handle)))))
+ (insert
+ (cond ((eq (mail-content-type-get (mm-handle-type handle) 'charset)
+ 'gnus-decoded)
+ (with-current-buffer (mm-handle-buffer handle)
+ (buffer-string)))
+ ((mm-multibyte-p)
+ (mm-string-as-multibyte (mm-get-part handle no-cache)))
+ (t
+ (mm-get-part handle no-cache))))))
(defun mm-file-name-delete-whitespace (file-name)
"Remove all whitespace characters from FILE-NAME."
(setq filename (gnus-replace-in-string filename "[<>|]" ""))
(gnus-replace-in-string filename "^[.-]+" ""))
-(defun mm-save-part (handle)
- "Write HANDLE to a file."
- (let* ((name (mail-content-type-get (mm-handle-type handle) 'name))
- (filename (mail-content-type-get
- (mm-handle-disposition handle) 'filename))
- file)
+(defun mm-save-part (handle &optional prompt)
+ "Write HANDLE to a file.
+PROMPT overrides the default one used to ask user for a file name."
+ (let ((filename (or (mail-content-type-get
+ (mm-handle-disposition handle) 'filename)
+ (mail-content-type-get
+ (mm-handle-type handle) 'name)))
+ file)
(when filename
(setq filename (gnus-map-function mm-file-name-rewrite-functions
(file-name-nondirectory filename))))
(setq file
(mm-with-multibyte
- (read-file-name "Save MIME part to: "
- (or mm-default-directory default-directory)
- nil nil (or filename name ""))))
+ (read-file-name (or prompt "Save MIME part to: ")
+ (or mm-default-directory default-directory)
+ nil nil (or filename ""))))
(setq mm-default-directory (file-name-directory file))
(and (or (not (file-exists-p file))
(yes-or-no-p (format "File %s already exists; overwrite? "
;; out to a file, and then create a file
;; specifier.
(let ((file (mm-make-temp-file
- (expand-file-name "emm.xbm"
- mm-tmp-directory))))
+ (expand-file-name "emm" mm-tmp-directory)
+ nil ".xbm")))
(unwind-protect
(progn
(write-region (point-min) (point-max) file)
(save-excursion
(save-restriction
(narrow-to-region start (1- (point)))
- (when (let ((ctl (ignore-errors
- (mail-header-parse-content-type
- (mail-fetch-field "content-type")))))
+ (when (let* ((ct (mail-fetch-field "content-type"))
+ (ctl (and ct (mail-header-parse-content-type ct))))
(if notp
(not (equal (car ctl) type))
(equal (car ctl) type)))
(save-excursion
(save-restriction
(narrow-to-region start end)
- (when (let ((ctl (ignore-errors
- (mail-header-parse-content-type
- (mail-fetch-field "content-type")))))
+ (when (let* ((ct (mail-fetch-field "content-type"))
+ (ctl (and ct (mail-header-parse-content-type ct))))
(if notp
(not (equal (car ctl) type))
(equal (car ctl) type)))
;;; mm-encode.el --- Functions for encoding MIME things
-;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; MORIOKA Tomohiko <morioka@jaist.ac.jp>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;; Likewise base64 below.
(quoted-printable-encode-region (point-min) (point-max) t))
((eq encoding 'base64)
- (when (equal type "text/plain")
+ (when (string-match "\\`text/" type)
(goto-char (point-min))
(while (search-forward "\n" nil t)
(replace-match "\r\n" t t)))
;;; mm-extern.el --- showing message/external-body
-;; Copyright (C) 2000, 2001, 2003 Free Software Foundation, Inc.
+
+;; Copyright (C) 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
;; Keywords: message external-body
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(require 'mm-decode)
(require 'mm-url)
+(defvar gnus-article-mime-handles)
+
(defvar mm-extern-function-alist
'((local-file . mm-extern-local-file)
(url . mm-extern-url)
(mm-disable-multibyte)
(if (file-exists-p name)
(mm-insert-file-contents name nil nil nil nil t)
- (error (format "File %s is gone" name)))))
+ (error "File %s is gone" name))))
(defun mm-extern-url (handle)
(erase-buffer)
(insert "[" info "]\n\n")))
;;;###autoload
-(defun mm-inline-external-body (handle &optional no-display)
- "Show the external-body part of HANDLE.
-This function replaces the buffer of HANDLE with a buffer contains
-the entire message.
-If NO-DISPLAY is nil, display it. Otherwise, do nothing after replacing."
+(defun mm-extern-cache-contents (handle)
+ "Put the external-body part of HANDLE into its cache."
(let* ((access-type (cdr (assq 'access-type
(cdr (mm-handle-type handle)))))
(func (cdr (assq (intern
(or access-type
(error "Couldn't find access type"))))
mm-extern-function-alist)))
- gnus-displaying-mime buf
- handles)
- (unless (mm-handle-cache handle)
- (unless func
- (error (format "Access type (%s) is not supported" access-type)))
- (with-temp-buffer
- (mm-insert-part handle)
- (goto-char (point-max))
- (insert "\n\n")
- (setq handles (mm-dissect-buffer t)))
- (unless (bufferp (car handles))
- (mm-destroy-parts handles)
- (error "Multipart external body is not supported"))
- (save-excursion ;; single part
- (set-buffer (setq buf (mm-handle-buffer handles)))
- (let (good)
- (unwind-protect
- (progn
- (funcall func handle)
- (setq good t))
- (unless good
- (mm-destroy-parts handles))))
- (mm-handle-set-cache handle handles))
- (setq gnus-article-mime-handles
- (mm-merge-handles gnus-article-mime-handles handles)))
- (unless no-display
- (save-excursion
- (save-restriction
- (narrow-to-region (point) (point))
- (gnus-display-mime (mm-handle-cache handle))
- (mm-handle-set-undisplayer
- handle
- `(lambda ()
- (let (buffer-read-only)
- (condition-case nil
- ;; This is only valid on XEmacs.
- (mapcar (lambda (prop)
- (remove-specifier
- (face-property 'default prop) (current-buffer)))
- '(background background-pixmap foreground))
- (error nil))
- (delete-region ,(point-min-marker) ,(point-max-marker))))))))))
+ buf handles)
+ (unless func
+ (error "Access type (%s) is not supported" access-type))
+ (mm-with-part handle
+ (goto-char (point-max))
+ (insert "\n\n")
+ ;; It should be just a single MIME handle.
+ (setq handles (mm-dissect-buffer t)))
+ (unless (bufferp (car handles))
+ (mm-destroy-parts handles)
+ (error "Multipart external body is not supported"))
+ (save-excursion
+ (set-buffer (setq buf (mm-handle-buffer handles)))
+ (let (good)
+ (unwind-protect
+ (progn
+ (funcall func handle)
+ (setq good t))
+ (unless good
+ (mm-destroy-parts handles))))
+ (mm-handle-set-cache handle handles))
+ (setq gnus-article-mime-handles
+ (mm-merge-handles gnus-article-mime-handles handles))))
+
+;;;###autoload
+(defun mm-inline-external-body (handle &optional no-display)
+ "Show the external-body part of HANDLE.
+This function replaces the buffer of HANDLE with a buffer contains
+the entire message.
+If NO-DISPLAY is nil, display it. Otherwise, do nothing after replacing."
+ (unless (mm-handle-cache handle)
+ (mm-extern-cache-contents handle))
+ (unless no-display
+ (save-excursion
+ (save-restriction
+ (narrow-to-region (point) (point))
+ (let* ((type (regexp-quote
+ (mm-handle-media-type (mm-handle-cache handle))))
+ ;; Force the part to be displayed (but if there is no
+ ;; method to display, a user will be prompted to save).
+ ;; See `gnus-mime-display-single'.
+ (mm-inline-override-types nil)
+ (mm-attachment-override-types
+ (cons type mm-attachment-override-types))
+ (mm-automatic-display (cons type mm-automatic-display))
+ (mm-automatic-external-display
+ (cons type mm-automatic-external-display))
+ ;; Suppress adding of button to the cached part.
+ (gnus-inhibit-mime-unbuttonizing nil))
+ (gnus-display-mime (mm-handle-cache handle)))
+ ;; Move undisplayer added to the cached handle to the parent.
+ (mm-handle-set-undisplayer
+ handle
+ (mm-handle-undisplayer (mm-handle-cache handle)))
+ (mm-handle-set-undisplayer (mm-handle-cache handle) nil)))))
(provide 'mm-extern)
;;; mm-partial.el --- showing message/partial
-;; Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
+
+;; Copyright (C) 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
;; Keywords: message partial
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; mm-url.el --- a wrapper of url functions/commands for Gnus
-;; Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+
+;; Copyright (C) 2001, 2002, 2003, 2004, 2005,
+;; 2006 Free Software Foundation, Inc.
;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(require 'timer-funcs)
(require 'timer)))
+(defvar url-current-object)
+(defvar url-package-name)
+(defvar url-package-version)
+
(defgroup mm-url nil
"A wrapper of url package and external url command for Gnus."
:group 'gnus)
'((wget "wget" "--user-agent=mm-url" "-q" "-O" "-")
(w3m "w3m" "-dump_source")
(lynx "lynx" "-source")
- (curl "curl" "--silent")))
+ (curl "curl" "--silent" "--user-agent mm-url" "--location")))
(defcustom mm-url-program
(cond
(defun mm-url-load-url ()
"Load `url-insert-file-contents'."
(unless (condition-case ()
- (require 'url-handlers)
+ (progn
+ (require 'url-handlers)
+ (require 'url-parse)
+ (require 'url-vars))
(error nil))
;; w3-4.0pre0.46 or earlier version.
(require 'w3-vars)
(defun mm-url-decode-entities ()
"Decode all HTML entities."
(goto-char (point-min))
- (while (re-search-forward "&\\(#[0-9]+\\|[a-z]+\\);" nil t)
+ (while (re-search-forward "&\\(#[0-9]+\\|[a-z]+[0-9]*\\);" nil t)
(let ((elem (if (eq (aref (match-string 1) 0) ?\#)
(let ((c
(string-to-number (substring
;;; mm-util.el --- Utility functions for Mule and low level things
-;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; MORIOKA Tomohiko <morioka@jaist.ac.jp>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(lambda (ch) (mm-string-as-multibyte (char-to-string ch)))
string "")))
(multibyte-string-p . ignore)
- ;; It is not a MIME function, but some MIME functions use it.
- (make-temp-file . (lambda (prefix &optional dir-flag)
- (let ((file (expand-file-name
- (make-temp-name prefix)
- (if (fboundp 'temp-directory)
- (temp-directory)
- temporary-file-directory))))
- (if dir-flag
- (make-directory file))
- file)))
(insert-byte . insert-char)
- (multibyte-char-to-unibyte . identity))))
+ (multibyte-char-to-unibyte . identity)
+ (special-display-p
+ . (lambda (buffer-name)
+ "Returns non-nil if a buffer named BUFFER-NAME gets a special frame."
+ (and special-display-function
+ (or (and (member buffer-name special-display-buffer-names) t)
+ (cdr (assoc buffer-name special-display-buffer-names))
+ (catch 'return
+ (dolist (elem special-display-regexps)
+ (and (stringp elem)
+ (string-match elem buffer-name)
+ (throw 'return t))
+ (and (consp elem)
+ (stringp (car elem))
+ (string-match (car elem) buffer-name)
+ (throw 'return (cdr elem))))))))))))
(eval-and-compile
(defalias 'mm-char-or-char-int-p
(if (fboundp 'coding-system-p)
(when (coding-system-p cs)
cs)
- ;; Is this branch ever actually useful?
+ ;; no-MULE XEmacs:
(car (memq cs (mm-get-coding-system-list))))))
+(defun mm-codepage-setup (number &optional alias)
+ "Create a coding system cpNUMBER.
+The coding system is created using `codepage-setup'. If ALIAS is
+non-nil, an alias is created and added to
+`mm-charset-synonym-alist'. If ALIAS is a string, it's used as
+the alias. Else windows-NUMBER is used."
+ (interactive
+ (let ((completion-ignore-case t)
+ (candidates (cp-supported-codepages)))
+ (list (completing-read "Setup DOS Codepage: (default 437) " candidates
+ nil t nil nil "437"))))
+ (when alias
+ (setq alias (if (stringp alias)
+ (intern alias)
+ (intern (format "windows-%s" number)))))
+ (let* ((cp (intern (format "cp%s" number))))
+ (unless (mm-coding-system-p cp)
+ (codepage-setup number))
+ (when (and alias
+ ;; Don't add alias if setup of cp failed.
+ (mm-coding-system-p cp))
+ (add-to-list 'mm-charset-synonym-alist (cons alias cp)))))
+
(defvar mm-charset-synonym-alist
`(
;; Not in XEmacs, but it's not a proper MIME charset anyhow.
'((ks_c_5601-1987 . cp949))
'((ks_c_5601-1987 . euc-kr))))
)
- "A mapping from invalid charset names to the real charset names.")
+ "A mapping from unknown or invalid charset names to the real charset names.")
+
+(defcustom mm-charset-override-alist
+ `((iso-8859-1 . windows-1252))
+ "A mapping from undesired charset names to their replacement.
+
+You may add pairs like (iso-8859-1 . windows-1252) here,
+i.e. treat iso-8859-1 as windows-1252. windows-1252 is a
+superset of iso-8859-1."
+ :type '(list (set :inline t
+ (const (iso-8859-1 . windows-1252))
+ (const (undecided . windows-1252)))
+ (repeat :inline t
+ :tag "Other options"
+ (cons (symbol :tag "From charset")
+ (symbol :tag "To charset"))))
+ :version "23.0" ;; No Gnus
+ :group 'mime)
+
+(defcustom mm-charset-eval-alist
+ (if (featurep 'xemacs)
+ nil ;; I don't know what would be useful for XEmacs.
+ '(;; Emacs 21 offers 1250 1251 1253 1257. Emacs 22 provides autoloads for
+ ;; 1250-1258 (i.e. `mm-codepage-setup' does nothing).
+ (windows-1250 . (mm-codepage-setup 1250 t))
+ (windows-1251 . (mm-codepage-setup 1251 t))
+ (windows-1253 . (mm-codepage-setup 1253 t))
+ (windows-1257 . (mm-codepage-setup 1257 t))))
+ "An alist of (CHARSET . FORM) pairs.
+If an article is encoded in an unknown CHARSET, FORM is
+evaluated. This allows to load additional libraries providing
+charsets on demand. If supported by your Emacs version, you
+could use `autoload-coding-system' here."
+ :version "23.0" ;; No Gnus
+ :type '(list (set :inline t
+ (const (windows-1250 . (mm-codepage-setup 1250 t)))
+ (const (windows-1251 . (mm-codepage-setup 1251 t)))
+ (const (windows-1253 . (mm-codepage-setup 1253 t)))
+ (const (windows-1257 . (mm-codepage-setup 1257 t)))
+ (const (cp850 . (mm-codepage-setup 850 nil))))
+ (repeat :inline t
+ :tag "Other options"
+ (cons (symbol :tag "charset")
+ (symbol :tag "form"))))
+ :group 'mime)
(defvar mm-binary-coding-system
(cond
cs mime mule alist)
(while css
(setq cs (pop css)
- mime (or (coding-system-get cs :mime-charset) ; Emacs 22
+ mime (or (coding-system-get cs :mime-charset) ; Emacs 23 (unicode)
(coding-system-get cs 'mime-charset)))
(when (and mime
(not (eq t (setq mule
(pop alist))
out)))
-(defun mm-charset-to-coding-system (charset &optional lbt)
+(defun mm-charset-to-coding-system (charset &optional lbt
+ allow-override)
"Return coding-system corresponding to CHARSET.
CHARSET is a symbol naming a MIME charset.
If optional argument LBT (`unix', `dos' or `mac') is specified, it is
-used as the line break code type of the coding system."
+used as the line break code type of the coding system.
+
+If ALLOW-OVERRIDE is given, use `mm-charset-override-alist' to
+map undesired charset names to their replacement. This should
+only be used for decoding, not for encoding."
+ ;; OVERRIDE is used (only) in `mm-decode-body'.
(when (stringp charset)
(setq charset (intern (downcase charset))))
(when lbt
((or (null (mm-get-coding-system-list))
(not (fboundp 'coding-system-get)))
charset)
+ ;; Check override list quite early. Should only used for decoding, not for
+ ;; encoding!
+ ((and allow-override
+ (let ((cs (cdr (assq charset mm-charset-override-alist))))
+ (and cs (mm-coding-system-p cs) cs))))
;; ascii
((eq charset 'us-ascii)
'ascii)
;;; (eq charset (coding-system-get charset 'mime-charset))
)
charset)
+ ;; Eval expressions from `mm-charset-eval-alist'
+ ((let* ((el (assq charset mm-charset-eval-alist))
+ (cs (car el))
+ (form (cdr el)))
+ (and cs
+ form
+ (prog2
+ ;; Avoid errors...
+ (condition-case nil (eval form) (error nil))
+ ;; (message "Failed to eval `%s'" form))
+ (mm-coding-system-p cs)
+ (message "Added charset `%s' via `mm-charset-eval-alist'" cs))
+ cs)))
;; Translate invalid charsets.
((let ((cs (cdr (assq charset mm-charset-synonym-alist))))
- (and cs (mm-coding-system-p cs) cs)))
+ (and cs
+ (mm-coding-system-p cs)
+ ;; (message
+ ;; "Using synonym `%s' from `mm-charset-synonym-alist' for `%s'"
+ ;; cs charset)
+ cs)))
;; Last resort: search the coding system list for entries which
;; have the right mime-charset in case the canonical name isn't
;; defined (though it should be).
(eq charset (or (coding-system-get c :mime-charset)
(coding-system-get c 'mime-charset))))
(setq cs c)))
+ (unless cs
+ ;; Warn the user about unknown charset:
+ (if (fboundp 'gnus-message)
+ (gnus-message 7 "Unknown charset: %s" charset)
+ (message "Unknown charset: %s" charset)))
cs))))
(eval-and-compile
;; This is for XEmacs.
(mm-mule-charset-to-mime-charset charset)))
-(defun mm-delete-duplicates (list)
- "Simple substitute for CL `delete-duplicates', testing with `equal'."
- (let (result head)
- (while list
- (setq head (car list))
- (setq list (delete head list))
- (setq result (cons head result)))
- (nreverse result)))
+(if (fboundp 'delete-dups)
+ (defalias 'mm-delete-duplicates 'delete-dups)
+ (defun mm-delete-duplicates (list)
+ "Destructively remove `equal' duplicates from LIST.
+Store the result in LIST and return it. LIST must be a proper list.
+Of several `equal' occurrences of an element in LIST, the first
+one is kept.
+
+This is a compatibility function for Emacsen without `delete-dups'."
+ ;; Code from `subr.el' in Emacs 22:
+ (let ((tail list))
+ (while tail
+ (setcdr tail (delete (car tail) (cdr tail)))
+ (setq tail (cdr tail))))
+ list))
;; Fixme: This is used in places when it should be testing the
;; default multibyteness. See mm-default-multibyte-p.
(if (and (memq 'iso-2022-jp-2 charsets)
(memq 'iso-2022-jp-2 hack-charsets))
(setq charsets (delq 'iso-2022-jp charsets)))
+ ;; Attempt to reduce the number of charsets if utf-8 is available.
+ (if (and (featurep 'xemacs)
+ (> (length charsets) 1)
+ (mm-coding-system-p 'utf-8))
+ (let ((mm-coding-system-priorities
+ (cons 'utf-8 mm-coding-system-priorities)))
+ (setq charsets
+ (mm-delete-duplicates
+ (mapcar 'mm-mime-charset
+ (delq 'ascii
+ (mm-find-charset-region b e)))))))
charsets))
(defmacro mm-with-unibyte-buffer (&rest forms)
(defmacro mm-with-unibyte-current-buffer (&rest forms)
"Evaluate FORMS with current buffer temporarily made unibyte.
Also bind `default-enable-multibyte-characters' to nil.
-Equivalent to `progn' in XEmacs"
+Equivalent to `progn' in XEmacs
+
+NOTE: Use this macro with caution in multibyte buffers (it is not
+worth using this macro in unibyte buffers of course). Use of
+`(set-buffer-multibyte t)', which is run finally, is generally
+harmful since it is likely to modify existing data in the buffer.
+For instance, it converts \"\\300\\255\" into \"\\255\" in
+Emacs 23 (unicode)."
(let ((multibyte (make-symbol "multibyte"))
(buffer (make-symbol "buffer")))
`(if mm-emacs-mule
- (let ((,multibyte enable-multibyte-characters)
+ (let ((,multibyte enable-multibyte-characters)
(,buffer (current-buffer)))
(unwind-protect
(let (default-enable-multibyte-characters)
`find-file-hooks', etc.
If INHIBIT is non-nil, inhibit `mm-inhibit-file-name-handlers'.
This function ensures that none of these modifications will take place."
- (let ((format-alist nil)
- (auto-mode-alist (if inhibit nil (mm-auto-mode-alist)))
- (default-major-mode 'fundamental-mode)
- (enable-local-variables nil)
- (after-insert-file-functions nil)
- (enable-local-eval nil)
- (find-file-hooks nil)
- (inhibit-file-name-operation (if inhibit
- 'insert-file-contents
- inhibit-file-name-operation))
- (inhibit-file-name-handlers
- (if inhibit
- (append mm-inhibit-file-name-handlers
- inhibit-file-name-handlers)
- inhibit-file-name-handlers)))
- (insert-file-contents filename visit beg end replace)))
+ (let* ((format-alist nil)
+ (auto-mode-alist (if inhibit nil (mm-auto-mode-alist)))
+ (default-major-mode 'fundamental-mode)
+ (enable-local-variables nil)
+ (after-insert-file-functions nil)
+ (enable-local-eval nil)
+ (inhibit-file-name-operation (if inhibit
+ 'insert-file-contents
+ inhibit-file-name-operation))
+ (inhibit-file-name-handlers
+ (if inhibit
+ (append mm-inhibit-file-name-handlers
+ inhibit-file-name-handlers)
+ inhibit-file-name-handlers))
+ (ffh (if (boundp 'find-file-hook)
+ 'find-file-hook
+ 'find-file-hooks))
+ (val (symbol-value ffh)))
+ (set ffh nil)
+ (unwind-protect
+ (insert-file-contents filename visit beg end replace)
+ (set ffh val))))
(defun mm-append-to-file (start end filename &optional codesys inhibit)
"Append the contents of the region to the end of file FILENAME.
inhibit-file-name-handlers)))
(write-region start end filename append visit lockname)))
+;; It is not a MIME function, but some MIME functions use it.
+(if (and (fboundp 'make-temp-file)
+ (ignore-errors
+ (let ((def (symbol-function 'make-temp-file)))
+ (and (byte-code-function-p def)
+ (setq def (if (fboundp 'compiled-function-arglist)
+ ;; XEmacs
+ (eval (list 'compiled-function-arglist def))
+ (aref def 0)))
+ (>= (length def) 4)
+ (eq (nth 3 def) 'suffix)))))
+ (defalias 'mm-make-temp-file 'make-temp-file)
+ ;; Stolen (and modified for XEmacs) from Emacs 22.
+ (defun mm-make-temp-file (prefix &optional dir-flag suffix)
+ "Create a temporary file.
+The returned file name (created by appending some random characters at the end
+of PREFIX, and expanding against `temporary-file-directory' if necessary),
+is guaranteed to point to a newly created empty file.
+You can then use `write-region' to write new data into the file.
+
+If DIR-FLAG is non-nil, create a new empty directory instead of a file.
+
+If SUFFIX is non-nil, add that at the end of the file name."
+ (let ((umask (default-file-modes))
+ file)
+ (unwind-protect
+ (progn
+ ;; Create temp files with strict access rights. It's easy to
+ ;; loosen them later, whereas it's impossible to close the
+ ;; time-window of loose permissions otherwise.
+ (set-default-file-modes 448)
+ (while (condition-case err
+ (progn
+ (setq file
+ (make-temp-name
+ (expand-file-name
+ prefix
+ (if (fboundp 'temp-directory)
+ ;; XEmacs
+ (temp-directory)
+ temporary-file-directory))))
+ (if suffix
+ (setq file (concat file suffix)))
+ (if dir-flag
+ (make-directory file)
+ (if (featurep 'xemacs)
+ ;; NOTE: This is unsafe if XEmacs users
+ ;; don't use a secure temp directory.
+ (if (file-exists-p file)
+ (signal 'file-already-exists
+ (list "File exists" file))
+ (write-region "" nil file nil 'silent))
+ (write-region "" nil file nil 'silent
+ nil 'excl)))
+ nil)
+ (file-already-exists t)
+ ;; The XEmacs version of `make-directory' issues
+ ;; `file-error'.
+ (file-error (or (and (featurep 'xemacs)
+ (file-exists-p file))
+ (signal (car err) (cdr err)))))
+ ;; the file was somehow created by someone else between
+ ;; `make-temp-name' and `write-region', let's try again.
+ nil)
+ file)
+ ;; Reset the umask.
+ (set-default-file-modes umask)))))
+
(defun mm-image-load-path (&optional package)
(let (dir result)
(dolist (path load-path (nreverse result))
(unless filename
(setq filename buffer-file-name))
(save-excursion
- (let ((decomp (mm-decompress-buffer filename nil t)))
+ (let ((decomp (unless ;; No worth to examine charset of tar files.
+ (and filename
+ (string-match
+ "\\.\\(?:tar\\.[^.]+\\|tbz\\|tgz\\)\\'"
+ filename))
+ (mm-decompress-buffer filename nil t))))
(when decomp
(set-buffer (let (default-enable-multibyte-characters)
(generate-new-buffer " *temp*")))
;;; mm-uu.el --- Return uu stuff as mm handles
-;; Copyright (c) 1998, 1999, 2000, 2001, 2002, 2003, 2004
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
;; Keywords: postscript uudecode binhex shar forward gnatsweb pgp
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
"The default disposition of uu parts.
This can be either \"inline\" or \"attachment\".")
-(defvar mm-uu-emacs-sources-regexp "gnu\\.emacs\\.sources"
- "The regexp of Emacs sources groups.")
+(defcustom mm-uu-emacs-sources-regexp "\\.emacs\\.sources"
+ "The regexp of Emacs sources groups."
+ :version "22.1"
+ :type 'regexp
+ :group 'gnus-article-mime)
-(defcustom mm-uu-diff-groups-regexp "gnus\\.commits"
- "*Regexp matching diff groups."
+(defcustom mm-uu-diff-groups-regexp
+ "\\(gmane\\|gnu\\)\\..*\\(diff\\|commit\\|cvs\\|bug\\|devel\\)"
+ "Regexp matching diff groups."
:version "22.1"
:type 'regexp
:group 'gnus-article-mime)
+(defcustom mm-uu-tex-groups-regexp "\\.tex\\>"
+ "*Regexp matching TeX groups."
+ :version "23.0"
+ :type 'regexp
+ :group 'gnus-article-mime)
+
(defvar mm-uu-type-alist
'((postscript
"^%!PS-"
"^%%EOF$"
mm-uu-postscript-extract
nil)
- (uu
+ (uu ;; Maybe we should have a more strict test here.
"^begin[ \t]+0?[0-7][0-7][0-7][ \t]+"
"^end[ \t]*$"
mm-uu-uu-extract
mm-uu-uu-filename)
(binhex
- "^:...............................................................$"
+ "^:.\\{63,63\\}$"
":$"
mm-uu-binhex-extract
nil
"^exit 0$"
mm-uu-shar-extract)
(forward
-;;; Thanks to Edward J. Sabol <sabol@alderaan.gsfc.nasa.gov> and
-;;; Peter von der Ah\'e <pahe@daimi.au.dk>
+ ;; Thanks to Edward J. Sabol <sabol@alderaan.gsfc.nasa.gov> and
+ ;; Peter von der Ah\'e <pahe@daimi.au.dk>
"^-+ \\(Start of \\)?Forwarded message"
"^-+ End \\(of \\)?forwarded message"
mm-uu-forward-extract
nil
mm-uu-diff-extract
nil
- mm-uu-diff-test)))
+ mm-uu-diff-test)
+ (message-marks
+ ;; Text enclosed with tags similar to `message-mark-insert-begin' and
+ ;; `message-mark-insert-end'. Don't use those variables to avoid
+ ;; dependency on `message.el'.
+ "^-+[8<>]*-\\{9,\\}[a-z ]+-\\{9,\\}[a-z ]+-\\{9,\\}[8<>]*-+$"
+ "^-+[8<>]*-\\{9,\\}[a-z ]+-\\{9,\\}[a-z ]+-\\{9,\\}[8<>]*-+$"
+ (lambda () (mm-uu-verbatim-marks-extract 0 -1 1 -1))
+ nil)
+ ;; Omitting [a-z8<] leads to false positives (bogus signature separators
+ ;; and mailing list banners).
+ (insert-marks
+ "^ *\\(-\\|_\\)\\{30,\\}.*[a-z8<].*\\(-\\|_\\)\\{30,\\} *$"
+ "^ *\\(-\\|_\\)\\{30,\\}.*[a-z8<].*\\(-\\|_\\)\\{30,\\} *$"
+ (lambda () (mm-uu-verbatim-marks-extract 0 0 1 -1))
+ nil)
+ (verbatim-marks
+ ;; slrn-style verbatim marks, see
+ ;; http://www.slrn.org/manual/slrn-manual-6.html#ss6.81
+ "^#v\\+"
+ "^#v\\-$"
+ (lambda () (mm-uu-verbatim-marks-extract 0 0 1 -1))
+ nil)
+ (LaTeX
+ "^\\([\\\\%][^\n]+\n\\)*\\\\documentclass.*[[{%]"
+ "^\\\\end{document}"
+ mm-uu-latex-extract
+ nil
+ mm-uu-latex-test))
+ "A list of specifications for non-MIME attachments.
+Each element consist of the following entries: label,
+start-regexp, end-regexp, extract-function, test-function.
+
+After modifying this list you must run \\[mm-uu-configure].")
(defcustom mm-uu-configure-list '((shar . disabled))
"A list of mm-uu configuration.
(defsubst mm-uu-function-2 (entry)
(nth 5 entry))
-(defun mm-uu-copy-to-buffer (&optional from to)
+;; In Emacs 22, we could use `min-colors' in the face definition. But Emacs
+;; 21 and XEmacs don't support it.
+(defcustom mm-uu-hide-markers
+ (< 16 (or (and (fboundp 'defined-colors)
+ (length (defined-colors)))
+ (and (fboundp 'device-color-cells)
+ (device-color-cells))
+ 0))
+ "If non-nil, hide verbatim markers.
+The value should be nil on displays where the face
+`mm-uu-extract' isn't distinguishable to the face `default'."
+ :type '(choice (const :tag "Hide" t)
+ (const :tag "Don't hide" nil))
+ :version "23.0" ;; No Gnus
+ :group 'gnus-article-mime)
+
+(defface mm-uu-extract '(;; Colors from `gnus-cite-3' plus background:
+ (((class color)
+ (background dark))
+ (:foreground "light yellow"
+ :background "dark green"))
+ (((class color)
+ (background light))
+ (:foreground "dark green"
+ :background "light yellow"))
+ (t
+ ()))
+ "Face for extracted buffers."
+ ;; See `mm-uu-verbatim-marks-extract'.
+ :version "23.0" ;; No Gnus
+ :group 'gnus-article-mime)
+
+(defun mm-uu-copy-to-buffer (&optional from to properties)
"Copy the contents of the current buffer to a fresh buffer.
-Return that buffer."
- (save-excursion
- (let ((obuf (current-buffer))
- (coding-system
- ;; Might not exist in non-MULE XEmacs
- (when (boundp 'buffer-file-coding-system)
- buffer-file-coding-system)))
- (set-buffer (generate-new-buffer " *mm-uu*"))
+Return that buffer.
+
+If PROPERTIES is non-nil, PROPERTIES are applied to the buffer,
+see `set-text-properties'. If PROPERTIES equals t, this means to
+apply the face `mm-uu-extract'."
+ (let ((obuf (current-buffer))
+ (coding-system
+ ;; Might not exist in non-MULE XEmacs
+ (when (boundp 'buffer-file-coding-system)
+ buffer-file-coding-system)))
+ (with-current-buffer (generate-new-buffer " *mm-uu*")
(setq buffer-file-coding-system coding-system)
(insert-buffer-substring obuf from to)
+ (cond ((eq properties t)
+ (set-text-properties (point-min) (point-max)
+ '(face mm-uu-extract)))
+ (properties
+ (set-text-properties (point-min) (point-max) properties)))
(current-buffer))))
(defun mm-uu-configure-p (key val)
(member (cons key val) mm-uu-configure-list))
(defun mm-uu-configure (&optional symbol value)
+ "Configure detection of non-MIME attachments."
+ (interactive)
(if symbol (set-default symbol value))
(setq mm-uu-beginning-regexp nil)
(mapcar (lambda (entry)
(mm-make-handle (mm-uu-copy-to-buffer start-point end-point)
'("application/postscript")))
+(defun mm-uu-verbatim-marks-extract (start-offset end-offset
+ &optional
+ start-hide
+ end-hide)
+ (let ((start (or (and mm-uu-hide-markers
+ start-hide)
+ start-offset
+ 1))
+ (end (or (and mm-uu-hide-markers
+ end-hide)
+ end-offset
+ -1)))
+ (mm-make-handle
+ (mm-uu-copy-to-buffer
+ (progn (goto-char start-point)
+ (forward-line start)
+ (point))
+ (progn (goto-char end-point)
+ (forward-line end)
+ (point))
+ t)
+ '("text/x-verbatim" (charset . gnus-decoded)))))
+
+(defun mm-uu-latex-extract ()
+ (mm-make-handle
+ (mm-uu-copy-to-buffer start-point end-point t)
+ ;; application/x-tex?
+ '("text/x-verbatim" (charset . gnus-decoded))))
+
(defun mm-uu-emacs-sources-extract ()
(mm-make-handle (mm-uu-copy-to-buffer start-point end-point)
- '("application/emacs-lisp")
+ '("application/emacs-lisp" (charset . gnus-decoded))
nil nil
(list mm-dissect-disposition
(cons 'filename file-name))))
(defun mm-uu-diff-extract ()
(mm-make-handle (mm-uu-copy-to-buffer start-point end-point)
- '("text/x-patch")))
+ '("text/x-patch" (charset . gnus-decoded))))
(defun mm-uu-diff-test ()
(and gnus-newsgroup-name
mm-uu-diff-groups-regexp
(string-match mm-uu-diff-groups-regexp gnus-newsgroup-name)))
+(defun mm-uu-latex-test ()
+ (and gnus-newsgroup-name
+ mm-uu-tex-groups-regexp
+ (string-match mm-uu-tex-groups-regexp gnus-newsgroup-name)))
+
(defun mm-uu-forward-extract ()
(mm-make-handle (mm-uu-copy-to-buffer
(progn (goto-char start-point) (forward-line) (point))
(t (goto-char (point-max))))
(setq text-start (point))
(while (re-search-forward mm-uu-beginning-regexp nil t)
- (setq start-point (match-beginning 0))
+ (setq start-point (match-beginning 0)
+ entry nil)
(let ((alist mm-uu-type-alist)
(beginning-regexp (match-string 0)))
(while (not entry)
(setq result (cons "multipart/mixed" (nreverse result))))
result)))
-(defun mm-uu-dissect-text-parts (handle)
- "Dissect text parts and put uu handles into HANDLE."
- (let ((buffer (mm-handle-buffer handle))
- type children)
+;;;###autoload
+(defun mm-uu-dissect-text-parts (handle &optional decoded)
+ "Dissect text parts and put uu handles into HANDLE.
+Assume text has been decoded if DECODED is non-nil."
+ (let ((buffer (mm-handle-buffer handle)))
(cond ((stringp buffer)
- (mapc 'mm-uu-dissect-text-parts (cdr handle)))
+ (dolist (elem (cdr handle))
+ (mm-uu-dissect-text-parts elem decoded)))
((bufferp buffer)
- (when (and (setq type (mm-handle-media-type handle))
- (stringp type)
- (string-match "\\`text/" type)
- (with-current-buffer buffer
- (setq children
- (mm-uu-dissect t (mm-handle-type handle)))))
- (kill-buffer buffer)
- (setcar handle (car children))
- (setcdr handle (cdr children))))
+ (let ((type (mm-handle-media-type handle))
+ (case-fold-search t) ;; string-match
+ children charset encoding)
+ (when (and
+ (stringp type)
+ ;; Mutt still uses application/pgp even though
+ ;; it has already been withdrawn.
+ (string-match "\\`text/\\|\\`application/pgp\\'" type)
+ (setq
+ children
+ (with-current-buffer buffer
+ (cond
+ ((or decoded
+ (eq (setq charset (mail-content-type-get
+ (mm-handle-type handle)
+ 'charset))
+ 'gnus-decoded))
+ (setq decoded t)
+ (mm-uu-dissect
+ t (cons type '((charset . gnus-decoded)))))
+ (charset
+ (setq decoded t)
+ (mm-with-multibyte-buffer
+ (insert (mm-decode-string (mm-get-part handle)
+ charset))
+ (mm-uu-dissect
+ t (cons type '((charset . gnus-decoded))))))
+ ((setq encoding (mm-handle-encoding handle))
+ (setq decoded nil)
+ ;; Inherit the multibyteness of the `buffer'.
+ (with-temp-buffer
+ (insert-buffer-substring buffer)
+ (mm-decode-content-transfer-encoding
+ encoding type)
+ (mm-uu-dissect t (list type))))
+ (t
+ (setq decoded nil)
+ (mm-uu-dissect t (list type)))))))
+ ;; Ignore it if a given part is dissected into a single
+ ;; part of which the type is the same as the given one.
+ (if (and (<= (length children) 2)
+ (string-equal (mm-handle-media-type (cadr children))
+ type))
+ (kill-buffer (mm-handle-buffer (cadr children)))
+ (kill-buffer buffer)
+ (setcdr handle (cdr children))
+ (setcar handle (car children)) ;; "multipart/mixed"
+ (dolist (elem (cdr children))
+ (mm-uu-dissect-text-parts elem decoded))))))
(t
- (mapc 'mm-uu-dissect-text-parts handle)))))
+ (dolist (elem handle)
+ (mm-uu-dissect-text-parts elem decoded))))))
(provide 'mm-uu)
-;;; arch-tag: 7db076bf-53db-4320-aa19-ca76a1d2ab2c
+;; arch-tag: 7db076bf-53db-4320-aa19-ca76a1d2ab2c
;;; mm-uu.el ends here
;;; mm-view.el --- functions for viewing MIME objects
-;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; This file is part of GNU Emacs.
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(autoload 'fill-flowed "flow-fill")
(autoload 'html2text "html2text"))
+(defvar gnus-article-mime-handles)
+(defvar gnus-newsgroup-charset)
+(defvar smime-keys)
+(defvar w3m-cid-retrieve-function-alist)
+(defvar w3m-current-buffer)
+(defvar w3m-display-inline-images)
+(defvar w3m-minor-mode-map)
+
(defvar mm-text-html-renderer-alist
'((w3 . mm-inline-text-html-render-with-w3)
(w3m . mm-inline-text-html-render-with-w3m)
- (w3m-standalone mm-inline-render-with-stdin nil
- "w3m" "-dump" "-T" "text/html")
+ (w3m-standalone . mm-inline-text-html-render-with-w3m-standalone)
(links mm-inline-render-with-file
mm-links-remove-leading-blank
"links" "-dump" file)
(defvar mm-text-html-washer-alist
'((w3 . gnus-article-wash-html-with-w3)
(w3m . gnus-article-wash-html-with-w3m)
- (w3m-standalone mm-inline-wash-with-stdin nil
- "w3m" "-dump" "-T" "text/html")
+ (w3m-standalone . gnus-article-wash-html-with-w3m-standalone)
(links mm-inline-wash-with-file
mm-links-remove-leading-blank
"links" "-dump" file)
(defcustom mm-fill-flowed t
"If non-nil a format=flowed article will be displayed flowed."
:type 'boolean
+ :version "22.1"
:group 'mime-display)
;;; Internal variables.
(defun mm-w3m-cid-retrieve-1 (url handle)
(dolist (elem handle)
- (when (listp elem)
- (if (equal url (mm-handle-id elem))
- (progn
- (mm-insert-part elem)
- (throw 'found-handle (mm-handle-media-type elem))))
- (if (equal "multipart" (mm-handle-media-supertype elem))
- (mm-w3m-cid-retrieve-1 url elem)))))
+ (when (consp elem)
+ (when (equal url (mm-handle-id elem))
+ (mm-insert-part elem)
+ (throw 'found-handle (mm-handle-media-type elem)))
+ (when (and (stringp (car elem))
+ (equal "multipart" (mm-handle-media-supertype elem)))
+ (mm-w3m-cid-retrieve-1 url elem)))))
(defun mm-w3m-cid-retrieve (url &rest args)
"Insert a content pointed by URL if it has the cid: scheme."
(when (string-match "\\`cid:" url)
- (catch 'found-handle
- (mm-w3m-cid-retrieve-1 (concat "<" (substring url (match-end 0)) ">")
- (with-current-buffer w3m-current-buffer
- gnus-article-mime-handles)))))
+ (or (catch 'found-handle
+ (mm-w3m-cid-retrieve-1
+ (setq url (concat "<" (substring url (match-end 0)) ">"))
+ (with-current-buffer w3m-current-buffer
+ gnus-article-mime-handles)))
+ (prog1
+ nil
+ (message "Failed to find \"Content-ID: %s\"" url)))))
(defun mm-inline-text-html-render-with-w3m (handle)
"Render a text/html part using emacs-w3m."
(point-min) (point-max)
(list 'keymap w3m-minor-mode-map
;; Put the mark meaning this part was rendered by emacs-w3m.
- 'mm-inline-text-html-with-w3m t))))
- (mm-handle-set-undisplayer
- handle
- `(lambda ()
- (let (buffer-read-only)
- (if (functionp 'remove-specifier)
- (mapcar (lambda (prop)
- (remove-specifier
- (face-property 'default prop)
- (current-buffer)))
- '(background background-pixmap foreground)))
- (delete-region ,(point-min-marker)
- ,(point-max-marker))))))))
+ 'mm-inline-text-html-with-w3m t)))
+ (mm-handle-set-undisplayer
+ handle
+ `(lambda ()
+ (let (buffer-read-only)
+ (if (functionp 'remove-specifier)
+ (mapcar (lambda (prop)
+ (remove-specifier
+ (face-property 'default prop)
+ (current-buffer)))
+ '(background background-pixmap foreground)))
+ (delete-region ,(point-min-marker)
+ ,(point-max-marker)))))))))
+
+(defvar mm-w3m-standalone-supports-m17n-p (if (featurep 'mule) 'undecided)
+ "*T means the w3m command supports the m17n feature.")
+
+(defun mm-w3m-standalone-supports-m17n-p ()
+ "Say whether the w3m command supports the m17n feature."
+ (cond ((eq mm-w3m-standalone-supports-m17n-p t) t)
+ ((eq mm-w3m-standalone-supports-m17n-p nil) nil)
+ ((not (featurep 'mule)) (setq mm-w3m-standalone-supports-m17n-p nil))
+ ((condition-case nil
+ (let ((coding-system-for-write 'iso-2022-jp)
+ (coding-system-for-read 'iso-2022-jp)
+ (str (mm-decode-coding-string "\
+\e$B#D#o#e#s!!#w#3#m!!#s#u#p#p#o#r#t#s!!#m#1#7#n!)\e(B" 'iso-2022-jp)))
+ (mm-with-multibyte-buffer
+ (insert str)
+ (call-process-region
+ (point-min) (point-max) "w3m" t t nil "-dump"
+ "-T" "text/html" "-I" "iso-2022-jp" "-O" "iso-2022-jp")
+ (goto-char (point-min))
+ (search-forward str nil t)))
+ (error nil))
+ (setq mm-w3m-standalone-supports-m17n-p t))
+ (t
+ ;;(message "You had better upgrade your w3m command")
+ (setq mm-w3m-standalone-supports-m17n-p nil))))
+
+(defun mm-inline-text-html-render-with-w3m-standalone (handle)
+ "Render a text/html part using w3m."
+ (if (mm-w3m-standalone-supports-m17n-p)
+ (let ((source (mm-get-part handle))
+ (charset (mail-content-type-get (mm-handle-type handle) 'charset))
+ cs)
+ (unless (and charset
+ (setq cs (mm-charset-to-coding-system charset))
+ (not (eq cs 'ascii)))
+ ;; The default.
+ (setq charset "iso-8859-1"
+ cs 'iso-8859-1))
+ (mm-insert-inline
+ handle
+ (mm-with-unibyte-buffer
+ (insert source)
+ (mm-enable-multibyte)
+ (let ((coding-system-for-write 'binary)
+ (coding-system-for-read cs))
+ (call-process-region
+ (point-min) (point-max)
+ "w3m" t t nil "-dump" "-T" "text/html"
+ "-I" charset "-O" charset))
+ (buffer-string))))
+ (mm-inline-render-with-stdin handle nil "w3m" "-dump" "-T" "text/html")))
(defun mm-links-remove-leading-blank ()
;; Delete the annoying three spaces preceding each line of links
(goto-char (point-max))))
(save-restriction
(narrow-to-region b (point))
- (set-text-properties (point-min) (point-max) nil)
(when (or (equal type "enriched")
(equal type "richtext"))
+ (set-text-properties (point-min) (point-max) nil)
(ignore-errors
(enriched-decode (point-min) (point-max))))
(mm-handle-set-undisplayer
;; disable prepare hook
gnus-article-prepare-hook
(gnus-newsgroup-charset
- (or charset gnus-newsgroup-charset)))
+ (unless (eq charset 'gnus-decoded) ;; mm-uu might set it.
+ (or charset gnus-newsgroup-charset))))
(let ((gnus-original-article-buffer (mm-handle-buffer handle)))
(run-hooks 'gnus-article-decode-hook))
(gnus-article-prepare-display)
(buffer-disable-undo)
(mm-enable-multibyte)
(insert (cond ((eq charset 'gnus-decoded)
- (mm-insert-part handle))
+ (with-current-buffer (mm-handle-buffer handle)
+ (buffer-string)))
(coding-system
(mm-decode-coding-string text coding-system))
(charset
(t
text)))
(require 'font-lock)
- ;; Inhibit font-lock this time (*-mode-hook might run
- ;; `turn-on-font-lock') so that jit-lock may not turn off
- ;; font-lock immediately after this.
- (let ((font-lock-mode t))
- (funcall mode))
- (let ((font-lock-verbose nil))
- ;; I find font-lock a bit too verbose.
- (font-lock-fontify-buffer))
+ (let ((font-lock-maximum-size nil)
+ ;; Disable support modes, e.g., jit-lock, lazy-lock, etc.
+ (font-lock-mode-hook nil)
+ (font-lock-support-mode nil)
+ ;; I find font-lock a bit too verbose.
+ (font-lock-verbose nil))
+ (funcall mode)
+ ;; The mode function might have already turned on font-lock.
+ (unless (symbol-value 'font-lock-mode)
+ (font-lock-fontify-buffer)))
;; By default, XEmacs font-lock uses non-duplicable text
;; properties. This code forces all the text properties
;; to be copied along with the text.
(otherwise (error "Unknown or unimplemented PKCS#7 type"))))
(defun mm-view-pkcs7-verify (handle)
- ;; A bogus implementation of PKCS#7. FIXME::
- (mm-insert-part handle)
- (goto-char (point-min))
- (if (search-forward "Content-Type: " nil t)
- (delete-region (point-min) (match-beginning 0)))
- (goto-char (point-max))
- (if (re-search-backward "--\r?\n?" nil t)
- (delete-region (match-end 0) (point-max)))
+ (let ((verified nil))
+ (with-temp-buffer
+ (insert "MIME-Version: 1.0\n")
+ (mm-insert-headers "application/pkcs7-mime" "base64" "smime.p7m")
+ (insert-buffer-substring (mm-handle-buffer handle))
+ (setq verified (smime-verify-region (point-min) (point-max))))
+ (goto-char (point-min))
+ (mm-insert-part handle)
+ (if (search-forward "Content-Type: " nil t)
+ (delete-region (point-min) (match-beginning 0)))
+ (goto-char (point-max))
+ (if (re-search-backward "--\r?\n?" nil t)
+ (delete-region (match-end 0) (point-max)))
+ (unless verified
+ (insert-buffer-substring smime-details-buffer)))
(goto-char (point-min))
(while (search-forward "\r\n" nil t)
(replace-match "\n"))
- (message "Verify signed PKCS#7 message is unimplemented.")
- (sit-for 1)
t)
(defun mm-view-pkcs7-decrypt (handle)
(cadar smime-keys)
(smime-get-key-by-email
(completing-read
- (concat "Decipher using which key? "
- (if smime-keys (concat "(default " (caar smime-keys) ") ")
- ""))
+ (concat "Decipher using key"
+ (if smime-keys (concat "(default " (caar smime-keys) "): ")
+ ": "))
smime-keys nil nil nil nil (car-safe (car-safe smime-keys))))))
(goto-char (point-min))
(while (search-forward "\r\n" nil t)
;;; mml-sec.el --- A package with security functions for MML documents
-;; Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+
+;; Copyright (C) 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Simon Josefsson <simon@josefsson.org>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(cons method tags))))
(t (error "The message is corrupted. No mail header separator"))))))
+(defvar mml-secure-method
+ (if (equal mml-default-encrypt-method mml-default-sign-method)
+ mml-default-sign-method
+ "pgpmime")
+ "Current security method. Internal variable.")
+
+(defun mml-secure-sign (&optional method)
+ "Add MML tags to sign this MML part.
+Use METHOD if given. Else use `mml-secure-method' or
+`mml-default-sign-method'."
+ (interactive)
+ (mml-secure-part
+ (or method mml-secure-method mml-default-sign-method)
+ 'sign))
+
+(defun mml-secure-encrypt (&optional method)
+ "Add MML tags to encrypt this MML part.
+Use METHOD if given. Else use `mml-secure-method' or
+`mml-default-sign-method'."
+ (interactive)
+ (mml-secure-part
+ (or method mml-secure-method mml-default-sign-method)))
+
(defun mml-secure-sign-pgp ()
"Add MML tags to PGP sign this MML part."
(interactive)
(when (re-search-backward "^<#secure.*>\n" nil t)
(delete-region (match-beginning 0) (match-end 0)))))
+
+(defun mml-secure-message-sign (&optional method)
+ "Add MML tags to sign this MML part.
+Use METHOD if given. Else use `mml-secure-method' or
+`mml-default-sign-method'."
+ (interactive)
+ (mml-secure-part
+ (or method mml-secure-method mml-default-sign-method)
+ 'sign))
+
+(defun mml-secure-message-sign-encrypt (&optional method)
+ "Add MML tag to sign and encrypt the entire message.
+Use METHOD if given. Else use `mml-secure-method' or
+`mml-default-sign-method'."
+ (interactive)
+ (mml-secure-message
+ (or method mml-secure-method mml-default-sign-method)
+ 'signencrypt))
+
+(defun mml-secure-message-encrypt (&optional method)
+ "Add MML tag to encrypt the entire message.
+Use METHOD if given. Else use `mml-secure-method' or
+`mml-default-sign-method'."
+ (interactive)
+ (mml-secure-message
+ (or method mml-secure-method mml-default-sign-method)
+ 'encrypt))
+
(defun mml-secure-message-sign-smime ()
"Add MML tag to encrypt/sign the entire message."
(interactive)
;;; mml-smime.el --- S/MIME support for MML
-;; Copyright (c) 2000, 2001, 2003, 2005 Free Software Foundation, Inc.
+
+;; Copyright (C) 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Simon Josefsson <simon@josefsson.org>
;; Keywords: Gnus, MIME, S/MIME, MML
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(if (not (and (not (file-exists-p tmp))
(get-buffer tmp)))
(push tmp certfiles)
- (setq file (mm-make-temp-file (expand-file-name "mml."
+ (setq file (mm-make-temp-file (expand-file-name "mml."
mm-tmp-directory)))
(with-current-buffer tmp
(write-region (point-min) (point-max) file))
(list 'keyfile
(if (= (length smime-keys) 1)
(cadar smime-keys)
- (or (let ((from (cadr (funcall gnus-extract-address-components
+ (or (let ((from (cadr (funcall (if (boundp
+ 'gnus-extract-address-components)
+ gnus-extract-address-components
+ 'mail-extract-address-components)
(or (save-excursion
(save-restriction
(message-narrow-to-headers)
(while (not result)
(setq who (read-from-minibuffer
(format "%sLookup certificate for: " (or bad ""))
- (cadr (funcall gnus-extract-address-components
+ (cadr (funcall (if (boundp
+ 'gnus-extract-address-components)
+ gnus-extract-address-components
+ 'mail-extract-address-components)
(or (save-excursion
(save-restriction
(message-narrow-to-headers)
;;; mml.el --- A package for parsing and validating MML documents
-;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; This file is part of GNU Emacs.
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(autoload 'gnus-make-local-hook "gnus-util")
(autoload 'message-fetch-field "message")
(autoload 'message-mark-active-p "message")
+ (autoload 'message-info "message")
(autoload 'fill-flowed-encode "flow-fill")
(autoload 'message-posting-charset "message"))
(eval-when-compile
(autoload 'dnd-get-local-file-name "dnd"))
+(defvar gnus-article-mime-handles)
+(defvar gnus-mouse-2)
+(defvar gnus-newsrc-hashtb)
+(defvar message-default-charset)
+(defvar message-deletable-headers)
+(defvar message-options)
+(defvar message-posting-charset)
+(defvar message-required-mail-headers)
+(defvar message-required-news-headers)
+
(defcustom mml-content-type-parameters
'(name access-type expiration size permission format)
"*A list of acceptable parameters in MML tag.
with unknown encoding; `multipart': always send messages with more than
one charsets.")
-(defvar mml-generate-default-type "text/plain")
+(defvar mml-generate-default-type "text/plain"
+ "Content type by which the Content-Type header can be omitted.
+The Content-Type header will not be put in the MIME part if the type
+equals the value and there's no parameter (e.g. charset, format, etc.)
+and `mml-insert-mime-headers-always' is nil. The value will be bound
+to \"message/rfc822\" when encoding an article to be forwarded as a MIME
+part. This is for the internal use, you should never modify the value.")
(defvar mml-buffer-list nil)
(mml-tweak-part cont)
(cond
((or (eq (car cont) 'part) (eq (car cont) 'mml))
- (let ((raw (cdr (assq 'raw cont)))
- type charset coding filename encoding flowed coded)
- (setq type (or (cdr (assq 'type cont)) "text/plain")
- charset (cdr (assq 'charset cont))
- coding (mm-charset-to-coding-system charset))
+ (let* ((raw (cdr (assq 'raw cont)))
+ (filename (cdr (assq 'filename cont)))
+ (type (or (cdr (assq 'type cont))
+ (if filename
+ (or (mm-default-file-encoding filename)
+ "application/octet-stream")
+ "text/plain")))
+ (charset (cdr (assq 'charset cont)))
+ (coding (mm-charset-to-coding-system charset))
+ encoding flowed coded)
(cond ((eq coding 'ascii)
(setq charset nil
coding nil))
(cond
((cdr (assq 'buffer cont))
(insert-buffer-substring (cdr (assq 'buffer cont))))
- ((and (setq filename (cdr (assq 'filename cont)))
+ ((and filename
(not (equal (cdr (assq 'nofile cont)) "yes")))
(let ((coding-system-for-read coding))
(mm-insert-file-contents filename)))
(cond
((eq (car cont) 'mml)
(let ((mml-boundary (mml-compute-boundary cont))
+ ;; It is necessary for the case where this
+ ;; function is called recursively since
+ ;; `m-g-d-t' will be bound to "message/rfc822"
+ ;; when encoding an article to be forwarded.
(mml-generate-default-type "text/plain"))
(mml-to-mime))
(let ((mm-7bit-chars (concat mm-7bit-chars "\x1b")))
(insert (with-current-buffer (cdr (assq 'buffer cont))
(mm-with-unibyte-current-buffer
(buffer-string)))))
- ((and (setq filename (cdr (assq 'filename cont)))
+ ((and filename
(not (equal (cdr (assq 'nofile cont)) "yes")))
(let ((coding-system-for-read mm-binary-coding-system))
(mm-insert-file-contents filename nil nil nil nil t))
(mm-find-buffer-file-coding-system
filename)))))
(t
- (insert (cdr (assq 'contents cont)))))
+ (let ((contents (cdr (assq 'contents cont))))
+ (if (if (featurep 'xemacs)
+ (string-match "[^\000-\377]" contents)
+ (mm-multibyte-string-p contents))
+ (progn
+ (mm-enable-multibyte)
+ (insert contents)
+ (setq charset (mm-encode-body charset)))
+ (insert contents)))))
(setq encoding (mm-encode-buffer type)
coded (mm-string-as-multibyte (buffer-string))))
(mml-insert-mime-headers cont type charset encoding nil)
"access-type=url"))
(when parameters
(mml-insert-parameter-string
- cont '(expiration size permission))))
- (insert "\n\n")
- (insert "Content-Type: " (cdr (assq 'type cont)) "\n")
- (insert "Content-ID: " (message-make-message-id) "\n")
- (insert "Content-Transfer-Encoding: "
- (or (cdr (assq 'encoding cont)) "binary"))
- (insert "\n\n")
- (insert (or (cdr (assq 'contents cont))))
- (insert "\n"))
+ cont '(expiration size permission)))
+ (insert "\n\n")
+ (insert "Content-Type: "
+ (or (cdr (assq 'type cont))
+ (if name
+ (or (mm-default-file-encoding name)
+ "application/octet-stream")
+ "text/plain"))
+ "\n")
+ (insert "Content-ID: " (message-make-message-id) "\n")
+ (insert "Content-Transfer-Encoding: "
+ (or (cdr (assq 'encoding cont)) "binary"))
+ (insert "\n\n")
+ (insert (or (cdr (assq 'contents cont))))
+ (insert "\n")))
((eq (car cont) 'multipart)
(let* ((type (or (cdr (assq 'type cont)) "mixed"))
(mml-generate-default-type (if (equal type "digest")
;; Skip `multipart' and attributes.
(when (and (consp part) (consp (cdr part)))
(insert "\n--" mml-boundary "\n")
- (mml-generate-mime-1 part))))
+ (mml-generate-mime-1 part)
+ (goto-char (point-max)))))
(insert "\n--" mml-boundary "--\n")))))
(t
(error "Invalid element: %S" cont)))
"Can't encode a part with several charsets"))
(insert "Content-Type: " type)
(when charset
- (insert "; " (mail-header-encode-parameter
- "charset" (symbol-name charset))))
+ (mml-insert-parameter
+ (mail-header-encode-parameter "charset" (symbol-name charset))))
(when flowed
- (insert "; format=flowed"))
+ (mml-insert-parameter "format=flowed"))
(when parameters
(mml-insert-parameter-string
cont mml-content-type-parameters))
(unless (eq encoding '7bit)
(insert (format "Content-Transfer-Encoding: %s\n" encoding)))
(when (setq description (cdr (assq 'description cont)))
- (insert "Content-Description: "
- (mail-encode-encoded-word-string description) "\n"))))
+ (insert "Content-Description: ")
+ (setq description (prog1
+ (point)
+ (insert description "\n")))
+ (mail-encode-encoded-word-region description (point)))))
(defun mml-parameter-string (cont types)
(let ((string "")
(unless (setq textp (equal (mm-handle-media-supertype handle) "text"))
(save-excursion
(set-buffer (setq buffer (mml-generate-new-buffer " *mml*")))
- (mm-insert-part handle)
+ (mm-insert-part handle 'no-cache)
(if (setq mmlp (equal (mm-handle-media-type handle)
"message/rfc822"))
(mime-to-mml)))))
(defun mml-insert-parameter (&rest parameters)
"Insert PARAMETERS in a nice way."
- (dolist (param parameters)
- (insert ";")
- (let ((point (point)))
+ (let (start end)
+ (dolist (param parameters)
+ (insert ";")
+ (setq start (point))
(insert " " param)
- (when (> (current-column) 71)
- (goto-char point)
- (insert "\n")
- (end-of-line)))))
+ (setq end (point))
+ (goto-char start)
+ (end-of-line)
+ (if (> (current-column) 76)
+ (progn
+ (goto-char start)
+ (insert "\n")
+ (goto-char (1+ end)))
+ (goto-char end)))))
;;;
;;; Mode for inserting and editing MML forms
(encryptpart (make-sparse-keymap))
(map (make-sparse-keymap))
(main (make-sparse-keymap)))
+ (define-key map "\C-s" 'mml-secure-message-sign)
+ (define-key map "\C-c" 'mml-secure-message-encrypt)
+ (define-key map "\C-e" 'mml-secure-message-sign-encrypt)
+ (define-key map "\C-p\C-s" 'mml-secure-sign)
+ (define-key map "\C-p\C-c" 'mml-secure-encrypt)
(define-key sign "p" 'mml-secure-message-sign-pgpmime)
(define-key sign "o" 'mml-secure-message-sign-pgp)
(define-key sign "s" 'mml-secure-message-sign-smime)
["Attach File..." mml-attach-file
,@(if (featurep 'xemacs) '(t)
'(:help "Attach a file at point"))]
- ["Attach Buffer..." mml-attach-buffer t]
- ["Attach External..." mml-attach-external t]
- ["Insert Part..." mml-insert-part t]
- ["Insert Multipart..." mml-insert-multipart t]
- ["PGP/MIME Sign" mml-secure-message-sign-pgpmime t]
- ["PGP/MIME Encrypt" mml-secure-message-encrypt-pgpmime t]
- ["PGP Sign" mml-secure-message-sign-pgp t]
- ["PGP Encrypt" mml-secure-message-encrypt-pgp t]
- ["S/MIME Sign" mml-secure-message-sign-smime t]
- ["S/MIME Encrypt" mml-secure-message-encrypt-smime t]
- ("Secure MIME part"
- ["PGP/MIME Sign Part" mml-secure-sign-pgpmime t]
- ["PGP/MIME Encrypt Part" mml-secure-encrypt-pgpmime t]
- ["PGP Sign Part" mml-secure-sign-pgp t]
- ["PGP Encrypt Part" mml-secure-encrypt-pgp t]
- ["S/MIME Sign Part" mml-secure-sign-smime t]
- ["S/MIME Encrypt Part" mml-secure-encrypt-smime t])
- ["Encrypt/Sign off" mml-unsecure-message t]
+ ["Attach Buffer..." mml-attach-buffer
+ ,@(if (featurep 'xemacs) '(t)
+ '(:help "Attach a buffer to the outgoing MIME message"))]
+ ["Attach External..." mml-attach-external
+ ,@(if (featurep 'xemacs) '(t)
+ '(:help "Attach reference to file"))]
+ ;;
+ ("Change Security Method"
+ ["PGP/MIME"
+ (lambda () (interactive) (setq mml-secure-method "pgpmime"))
+ ,@(if (featurep 'xemacs) nil
+ '(:help "Set Security Method to PGP/MIME"))
+ :style radio
+ :selected (equal mml-secure-method "pgpmime") ]
+ ["S/MIME"
+ (lambda () (interactive) (setq mml-secure-method "smime"))
+ ,@(if (featurep 'xemacs) nil
+ '(:help "Set Security Method to S/MIME"))
+ :style radio
+ :selected (equal mml-secure-method "smime") ]
+ ["Inline PGP"
+ (lambda () (interactive) (setq mml-secure-method "pgp"))
+ ,@(if (featurep 'xemacs) nil
+ '(:help "Set Security Method to inline PGP"))
+ :style radio
+ :selected (equal mml-secure-method "pgp") ] )
+ ;;
+ ["Sign Message" mml-secure-message-sign t]
+ ["Encrypt Message" mml-secure-message-encrypt t]
+ ["Sign and Encrypt Message" mml-secure-message-sign-encrypt t]
+ ["Encrypt/Sign off" mml-unsecure-message
+ ,@(if (featurep 'xemacs) '(t)
+ '(:help "Don't Encrypt/Sign Message"))]
+ ;; Maybe we could remove these, because people who write MML most probably
+ ;; don't use the menu:
+ ["Insert Part..." mml-insert-part
+ :active (message-in-body-p)]
+ ["Insert Multipart..." mml-insert-multipart
+ :active (message-in-body-p)]
+ ;;
+ ;; Do we have separate encrypt and encrypt/sign commands for parts?
+ ["Sign Part" mml-secure-sign t]
+ ["Encrypt Part" mml-secure-encrypt t]
;;["Narrow" mml-narrow-to-part t]
- ["Quote MML" mml-quote-region
+ ["Quote MML in region" mml-quote-region
:active (message-mark-active-p)
,@(if (featurep 'xemacs) nil
'(:help "Quote MML tags in region"))]
["Validate MML" mml-validate t]
- ["Preview" mml-preview t]))
+ ["Preview" mml-preview t]
+ "----"
+ ["Emacs MIME manual" (lambda () (interactive) (message-info 4))
+ ,@(if (featurep 'xemacs) '(t)
+ '(:help "Display the Emacs MIME manual"))]
+ ["PGG manual" (lambda () (interactive) (message-info 16))
+ ,@(if (featurep 'xemacs) '(t)
+ '(:help "Display the PGG manual"))]))
(defvar mml-mode nil
"Minor mode for editing MML.")
(easy-menu-add mml-menu mml-mode-map)
(when (boundp 'dnd-protocol-alist)
(set (make-local-variable 'dnd-protocol-alist)
- '(("^file:///" . mml-dnd-attach-file)
- ("^file://" . dnd-open-file)
- ("^file:" . mml-dnd-attach-file))))
+ (append mml-dnd-protocol-alist
+ (symbol-value 'dnd-protocol-alist))))
(run-hooks 'mml-mode-hook)))
;;;
description))
(defun mml-minibuffer-read-disposition (type &optional default)
- (let* ((default (or default
- (if (string-match "^text/.*" type)
- "inline"
- "attachment")))
- (disposition (completing-read "Disposition: "
- '(("attachment") ("inline") (""))
- nil t)))
+ (unless default (setq default
+ (if (and (string-match "\\`text/" type)
+ (not (string-match "\\`text/rtf\\'" type)))
+ "inline"
+ "attachment")))
+ (let ((disposition (completing-read
+ (format "Disposition (default %s): " default)
+ '(("attachment") ("inline") (""))
+ nil t nil nil default)))
(if (not (equal disposition ""))
disposition
default)))
;;; Attachment functions.
+(defcustom mml-dnd-protocol-alist
+ '(("^file:///" . mml-dnd-attach-file)
+ ("^file://" . dnd-open-file)
+ ("^file:" . mml-dnd-attach-file))
+ "The functions to call when a drop in `mml-mode' is made.
+See `dnd-protocol-alist' for more information. When nil, behave
+as in other buffers."
+ :type '(choice (repeat (cons (regexp) (function)))
+ (const :tag "Behave as in other buffers" nil))
+ :version "23.0" ;; No Gnus
+ :group 'message)
+
+(defcustom mml-dnd-attach-options nil
+ "Which options should be queried when attaching a file via drag and drop.
+
+If it is a list, valid members are `type', `description' and
+`disposition'. `disposition' implies `type'. If it is nil,
+don't ask for options. If it is t, ask the user whether or not
+to specify options."
+ :type '(choice
+ (const :tag "Non" nil)
+ (const :tag "Query" t)
+ (list :value (type description disposition)
+ (set :inline t
+ (const type)
+ (const description)
+ (const disposition))))
+ :version "23.0" ;; No Gnus
+ :group 'message)
+
(defun mml-attach-file (file &optional type description disposition)
"Attach a file to the outgoing MIME message.
The file is not inserted or encoded until you send the message with
`\\[message-send-and-exit]' or `\\[message-send]'.
-FILE is the name of the file to attach. TYPE is its content-type, a
-string of the form \"type/subtype\". DESCRIPTION is a one-line
-description of the attachment."
+FILE is the name of the file to attach. TYPE is its
+content-type, a string of the form \"type/subtype\". DESCRIPTION
+is a one-line description of the attachment. The DISPOSITION
+specifies how the attachment is intended to be displayed. It can
+be either \"inline\" (displayed automatically within the message
+body) or \"attachment\" (separate from the body)."
(interactive
(let* ((file (mml-minibuffer-read-file "Attach file: "))
(type (mml-minibuffer-read-type file))
(description (mml-minibuffer-read-description))
(disposition (mml-minibuffer-read-disposition type)))
(list file type description disposition)))
- (mml-insert-empty-tag 'part
- 'type type
- 'filename file
- 'disposition (or disposition "attachment")
- 'description description))
+ (save-excursion
+ (unless (message-in-body-p) (goto-char (point-max)))
+ (mml-insert-empty-tag 'part
+ 'type type
+ 'filename file
+ 'disposition (or disposition "attachment")
+ 'description description)))
(defun mml-dnd-attach-file (uri action)
- "Attach a drag and drop file."
+ "Attach a drag and drop file.
+
+Ask for type, description or disposition according to
+`mml-dnd-attach-options'."
(let ((file (dnd-get-local-file-name uri t)))
(when (and file (file-regular-p file))
- (let* ((type (mml-minibuffer-read-type file))
- (description (mml-minibuffer-read-description))
- (disposition (mml-minibuffer-read-disposition type)))
+ (let ((mml-dnd-attach-options mml-dnd-attach-options)
+ type description disposition)
+ (setq mml-dnd-attach-options
+ (when (and (eq mml-dnd-attach-options t)
+ (not
+ (y-or-n-p
+ "Use default type, disposition and description? ")))
+ '(type description disposition)))
+ (when (or (memq 'type mml-dnd-attach-options)
+ (memq 'disposition mml-dnd-attach-options))
+ (setq type (mml-minibuffer-read-type file)))
+ (when (memq 'description mml-dnd-attach-options)
+ (setq description (mml-minibuffer-read-description)))
+ (when (memq 'disposition mml-dnd-attach-options)
+ (setq disposition (mml-minibuffer-read-disposition type)))
(mml-attach-file file type description disposition)))))
(defun mml-attach-buffer (buffer &optional type description)
(type (mml-minibuffer-read-type buffer "text/plain"))
(description (mml-minibuffer-read-description)))
(list buffer type description)))
- (mml-insert-empty-tag 'part 'type type 'buffer buffer
- 'disposition "attachment" 'description description))
+ (save-excursion
+ (unless (message-in-body-p) (goto-char (point-max)))
+ (mml-insert-empty-tag 'part 'type type 'buffer buffer
+ 'disposition "attachment"
+ 'description description)))
(defun mml-attach-external (file &optional type description)
"Attach an external file into the buffer.
(type (mml-minibuffer-read-type file))
(description (mml-minibuffer-read-description)))
(list file type description)))
- (mml-insert-empty-tag 'external 'type type 'name file
- 'disposition "attachment" 'description description))
+ (save-excursion
+ (unless (message-in-body-p) (goto-char (point-max)))
+ (mml-insert-empty-tag 'external 'type type 'name file
+ 'disposition "attachment" 'description description)))
(defun mml-insert-multipart (&optional type)
(interactive (list (completing-read "Multipart type (default mixed): "
(defun mml-preview (&optional raw)
"Display current buffer with Gnus, in a new buffer.
-If RAW, don't highlight the article."
+If RAW, display a raw encoded MIME message.
+
+The window layout for the preview buffer is controled by the variables
+`special-display-buffer-names', `special-display-regexps', or
+`gnus-buffer-configuration' (the first match made will be used),
+or the `pop-to-buffer' function."
(interactive "P")
(setq mml-preview-buffer (generate-new-buffer
(concat (if raw "*Raw MIME preview of "
(lambda (event)
(interactive "@e")
(widget-button-press (widget-event-point event) event)))
+ ;; FIXME: Buffer is in article mode, but most tool bar commands won't
+ ;; work. Maybe only keep the following icons: search, print, quit
(goto-char (point-min))))
- (if (and (boundp 'gnus-buffer-configuration)
+ (if (and (not (mm-special-display-p (buffer-name mml-preview-buffer)))
+ (boundp 'gnus-buffer-configuration)
(assq 'mml-preview gnus-buffer-configuration))
(let ((gnus-message-buffer (current-buffer)))
(gnus-configure-windows 'mml-preview))
;;; mml1991.el --- Old PGP message format (RFC 1991) support for MML
-;; Copyright (C) 1998, 1999, 2000, 2001, 2003 Free Software Foundation, Inc.
+
+;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Sascha Lüdecke <sascha@meta-x.de>,
;; Simon Josefsson <simon@josefsson.org> (Mailcrypt interface, Gnus glue)
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(require 'cl)
(require 'mm-util))
+(defvar mc-pgp-always-sign)
+
(autoload 'quoted-printable-decode-region "qp")
(autoload 'quoted-printable-encode-region "qp")
(delete-region (point-min) (point)))
(mm-with-unibyte-current-buffer
(with-temp-buffer
- (flet ((gpg-encrypt-func
+ (flet ((gpg-encrypt-func
(sign plaintext ciphertext result recipients &optional
passphrase sign-with-key armor textmode)
(if sign
;; pgg wrapper
-(defvar pgg-output-buffer)
-(defvar pgg-errors-buffer)
+(eval-when-compile
+ (defvar pgg-default-user-id)
+ (defvar pgg-errors-buffer)
+ (defvar pgg-output-buffer))
(defun mml1991-pgg-sign (cont)
- (let (headers cte)
+ (let ((pgg-text-mode t)
+ headers cte)
;; Don't sign headers.
(goto-char (point-min))
(while (not (looking-at "^$"))
t))
(defun mml1991-pgg-encrypt (cont &optional sign)
- (let (cte)
+ (let ((pgg-text-mode t)
+ cte)
;; Strip MIME Content[^ ]: headers since it will be ASCII ARMOURED
(goto-char (point-min))
(while (looking-at "^Content[^ ]+:")
(delete-region (point-min) (point)))
(mm-decode-content-transfer-encoding cte)
(unless (pgg-encrypt-region
- (point-min) (point-max)
+ (point-min) (point-max)
(split-string
(or
(message-options-get 'message-recipients)
;;; mml2015.el --- MIME Security with Pretty Good Privacy (PGP)
-;; Copyright (C) 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+
+;; Copyright (C) 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
;; Keywords: PGP MIME MML
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(require 'mm-util)
(require 'mml)
+(defvar mc-pgp-always-sign)
+
(defvar mml2015-use (or
(progn
(ignore-errors
;;; pgg wrapper
(eval-when-compile
+ (defvar pgg-default-user-id)
(defvar pgg-errors-buffer)
(defvar pgg-output-buffer))
(autoload 'pgg-decrypt-region "pgg")
(autoload 'pgg-verify-region "pgg")
(autoload 'pgg-sign-region "pgg")
- (autoload 'pgg-encrypt-region "pgg"))
+ (autoload 'pgg-encrypt-region "pgg")
+ (autoload 'pgg-parse-armor "pgg-parse"))
(defun mml2015-pgg-decrypt (handle ctl)
(catch 'error
(let ((pgg-errors-buffer mml2015-result-buffer)
(boundary (mml-compute-boundary cont))
(pgg-default-user-id (or (message-options-get 'mml-sender)
- pgg-default-user-id)))
+ pgg-default-user-id))
+ (pgg-text-mode t)
+ entry)
(unless (pgg-sign-region (point-min) (point-max))
(pop-to-buffer mml2015-result-buffer)
(error "Sign error"))
(goto-char (point-min))
(insert (format "Content-Type: multipart/signed; boundary=\"%s\";\n"
boundary))
- ;;; FIXME: what is the micalg?
- (insert "\tmicalg=pgp-sha1; protocol=\"application/pgp-signature\"\n")
+ (if (setq entry (assq 2 (pgg-parse-armor
+ (with-current-buffer pgg-output-buffer
+ (buffer-string)))))
+ (setq entry (assq 'hash-algorithm (cdr entry))))
+ (insert (format "\tmicalg=%s; "
+ (if (cdr entry)
+ (downcase (format "pgp-%s" (cdr entry)))
+ "pgp-sha1")))
+ (insert "protocol=\"application/pgp-signature\"\n")
(insert (format "\n--%s\n" boundary))
(goto-char (point-max))
(insert (format "\n--%s\n" boundary))
(defun mml2015-pgg-encrypt (cont &optional sign)
(let ((pgg-errors-buffer mml2015-result-buffer)
+ (pgg-text-mode t)
(boundary (mml-compute-boundary cont)))
(unless (pgg-encrypt-region (point-min) (point-max)
(split-string
(erase-buffer)
t)
(setq mml2015-result-buffer
- (gnus-get-buffer-create "*MML2015 Result*"))
+ (gnus-get-buffer-create " *MML2015 Result*"))
nil))
(defsubst mml2015-clear-decrypt-function ()
;;; netrc.el --- .netrc parsing functionality
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Modularizer: Ted Zlatanov <tzz@lifelogs.com>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(autoload 'encrypt-insert-file-contents "encrypt"))
(defgroup netrc nil
- "Netrc configuration.")
+ "Netrc configuration."
+ :group 'comm)
(defvar netrc-services-file "/etc/services"
"The name of the services file.")
;;; nnagent.el --- offline backend for Gnus
-;; Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news, mail
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; nnbabyl.el --- rmail mbox access for Gnus
-;; Copyright (C) 1995, 1996, 1997, 1998, 1099, 2000, 2001
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1995, 1996, 1997, 1998, 1099, 2000, 2001, 2002, 2003,
+;; 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(when (re-search-forward "^X-Gnus-Newsgroup: +\\([^:]+\\):\\([0-9]+\\) "
nil t)
(cons (buffer-substring (match-beginning 1) (match-end 1))
- (string-to-int
+ (string-to-number
(buffer-substring (match-beginning 2) (match-end 2)))))))
(defun nnbabyl-insert-lines ()
;;; nndb.el --- nndb access for Gnus
-;; Copyright (C) 1997, 1998, 2000, 2003, 2004 Free Software Foundation, Inc.
+;; Copyright (C) 1997, 1998, 2000, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
;; Kai Grossjohann <grossjohann@ls6.informatik.uni-dortmund.de>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;-
;; Register nndb with known select methods.
-(gnus-declare-backend "nndb" 'mail 'respool 'address 'prompt-address)
+(require 'gnus-start)
+(unless (assoc "nndb" gnus-valid-select-methods)
+ (gnus-declare-backend "nndb" 'mail 'respool 'address 'prompt-address))
;;; Code:
(require 'nntp)
(eval-when-compile (require 'cl))
-(eval-and-compile
- (autoload 'news-setup "rnewspost")
- (autoload 'news-reply-mode "rnewspost")
- (autoload 'cancel-timer "timer")
- (autoload 'telnet "telnet" nil t)
- (autoload 'telnet-send-input "telnet" nil t)
- (autoload 'gnus-declare-backend "gnus-start"))
-
;; Declare nndb as derived from nntp
(nnoo-declare nndb nntp)
;; otherwise, pull all of the following numbers into the list
(re-search-forward "follows\r?\n?" nil t)
(while (re-search-forward "^[0-9]+$" nil t)
- (push (string-to-int (match-string 0)) list)))
+ (push (string-to-number (match-string 0)) list)))
list))
(defun nndb-request-expire-articles-remote
-;;; nndiary.el --- A diary backend for Gnus
+;;; nndiary.el --- A diary back end for Gnus
-;; Copyright (C) 1999, 2000, 2001, 2003
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Didier Verna <didier@xemacs.org>
;; Maintainer: Didier Verna <didier@xemacs.org>
;; You should have received a copy of the GNU General Public License
;; along with this program; if not, write to the Free Software
-;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+;; MA 02110-1301, USA.
;;; Commentary:
;; Description:
;; ===========
-;; This package implements NNDiary, a diary backend for Gnus. NNDiary is a
-;; mail backend, pretty similar to nnml in its functionnning (it has all the
-;; features of nnml, actually), but in which messages are treated as event
-;; reminders.
-
-;; Here is a typical scenario:
-;; - You've got a date with Andy Mc Dowell or Bruce Willis (select according
-;; to your sexual preference) in one month. You don't want to forget it.
-;; - Send a (special) diary message to yourself (see below).
-;; - Forget all about it and keep on getting and reading new mail, as usual.
-;; - From time to time, as you type `g' in the group buffer and as the date
-;; is getting closer, the message will pop up again, just like if it were
-;; new and unread.
-;; - Read your "new" messages, this one included, and start dreaming of the
-;; night you're gonna have.
-;; - Once the date is over (you actually fell asleep just after dinner), the
-;; message will be automatically deleted if it is marked as expirable.
-
-;; Some more notes on the diary backend:
-;; - NNDiary is a *real* mail backend. You *really* send real diary
-;; messsages. This means for instance that you can give appointements to
-;; anybody (provided they use Gnus and NNDiary) by sending the diary message
-;; to them as well.
-;; - However, since NNDiary also has a 'request-post method, you can also
-;; `C-u a' instead of `C-u m' on a diary group and the message won't actually
-;; be sent; just stored in the group.
-;; - The events you want to remember need not be punctual. You can set up
-;; reminders for regular dates (like once each week, each monday at 13:30
-;; and so on). Diary messages of this kind will never be deleted (unless
-;; you do it explicitely). But that, you guessed.
-
-
-;; Usage:
-;; =====
-
-;; 1/ NNDiary has two modes of operation: traditional (the default) and
-;; autonomous.
-;; a/ In traditional mode, NNDiary does not get new mail by itself. You
-;; have to move mails from your primary mail backend to nndiary
-;; groups.
-;; b/ In autonomous mode, NNDiary retrieves its own mail and handles it
-;; independantly of your primary mail backend. To use NNDiary in
-;; autonomous mode, you have several things to do:
-;; i/ Put (setq nndiary-get-new-mail t) in your gnusrc file.
-;; ii/ Diary messages contain several `X-Diary-*' special headers.
-;; You *must* arrange that these messages be split in a private
-;; folder *before* Gnus treat them. You need this because Gnus
-;; is not able yet to manage multiple backends for mail
-;; retrieval. Getting them from a separate source will
-;; compensate this misfeature to some extent, as we will see.
-;; As an example, here's my procmailrc entry to store diary files
-;; in ~/.nndiary (the default nndiary mail source file):
-;;
-;; :0 HD :
-;; * ^X-Diary
-;; .nndiary
-;; iii/ Customize the variables `nndiary-mail-sources' and
-;; `nndiary-split-methods'. These are replacements for the usual
-;; mail sources and split methods which, and will be used in
-;; autonomous mode. `nndiary-mail-sources' defaults to
-;; '(file :path "~/.nndiary").
-;; 2/ Install nndiary somewhere Emacs / Gnus can find it. Normally, you
-;; *don't* have to '(require 'nndiary) anywhere. Gnus will do so when
-;; appropriate as long as nndiary is somewhere in the load path.
-;; 3/ Now, customize the rest of nndiary. In particular, you should
-;; customize `nndiary-reminders', the list of times when you want to be
-;; reminded of your appointements (e.g. 3 weeks before, then 2 days
-;; before, then 1 hour before and that's it).
-;; 4/ You *must* use the group timestamp feature of Gnus. This adds a
-;; timestamp to each groups' parameters (please refer to the Gnus
-;; documentation ("Group Timestamp" info node) to see how it's done.
-;; 5/ Once you have done this, you may add a permanent nndiary virtual server
-;; (something like '(nndiary "")) to your `gnus-secondary-select-methods'.
-;; Yes, this server will be able to retrieve mails and split them when you
-;; type `g' in the group buffer, just as if it were your only mail backend.
-;; This is the benefit of using a private folder.
-;; 6/ Hopefully, almost everything (see the TODO section below) will work as
-;; expected when you restart Gnus: in the group buffer, `g' and `M-g' will
-;; also get your new diary mails, `F' will find your new diary groups etc.
-
-
-;; How to send diary messages:
-;; ==========================
-
-;; There are 7 special headers in diary messages. These headers are of the
-;; form `X-Diary-<something>', the <something> being one of `Minute', `Hour',
-;; `Dom', `Month', `Year', `Time-Zone' and `Dow'. `Dom' means "Day of Month",
-;; and `dow' means "Day of Week". These headers actually behave like crontab
-;; specifications and define the event date(s).
-
-;; For all headers but the `Time-Zone' one, a header value is either a
-;; star (meaning all possible values), or a list of fields (separated by a
-;; comma). A field is either an integer, or a range. A range is two integers
-;; separated by a dash. Possible integer values are 0-59 for `Minute', 0-23
-;; for `Hour', 1-31 for `Dom', `1-12' for Month, above 1971 for `Year' and 0-6
-;; for `Dow' (0 = sunday). As a special case, a star in either `Dom' or `Dow'
-;; doesn't mean "all possible values", but "use only the other field". Note
-;; that if both are star'ed, the use of either one gives the same result :-),
-
-;; The `Time-Zone' header is special in that it can have only one value (you
-;; bet ;-).
-;; A star doesn't mean "all possible values" (because it has no sense), but
-;; "the current local time zone".
-
-;; As an example, here's how you would say "Each Monday and each 1st of month,
-;; at 12:00, 20:00, 21:00, 22:00, 23:00 and 24:00, from 1999 to 2010" (I let
-;; you find what to do then):
-;;
-;; X-Diary-Minute: 0
-;; X-Diary-Hour: 12, 20-24
-;; X-Diary-Dom: 1
-;; X-Diary-Month: *
-;; X-Diary-Year: 1999-2010
-;; X-Diary-Dow: 1
-;; X-Diary-Time-Zone: *
-;;
-;;
-;; Sending a diary message is not different from sending any other kind of
-;; mail, except that such messages are identified by the presence of these
-;; special headers.
-
+;; nndiary is a mail back end designed to handle mails as diary event
+;; reminders. It is now fully documented in the Gnus manual.
;; Bugs / Todo:
;; * Respooling doesn't work because contrary to the request-scan function,
;; Gnus won't allow me to override the split methods when calling the
-;; respooling backend functions.
+;; respooling back end functions.
;; * There's a bug in the time zone mechanism with variable TZ locations.
;; * We could allow a keyword like `ask' in X-Diary-* headers, that would mean
;; "ask for value upon reception of the message".
;; * We could add an optional header X-Diary-Reminders to specify a special
;; reminders value for this message. Suggested by Jody Klymak.
;; * We should check messages validity in other circumstances than just
-;; moving an article from sonwhere else (request-accept). For instance, when
-;; editing / saving and so on.
+;; moving an article from somewhere else (request-accept). For instance,
+;; when editing / saving and so on.
;; Remarks:
;; =======
-;; * nnoo.
-;; NNDiary is very similar to nnml. This makes the idea of using nnoo (to
-;; derive nndiary from nnml) natural. However, my experience with nnoo is
-;; that for reasonably complex backends like this one, noo is a burden
-;; rather than an help. It's tricky to use, not everything can be
-;; inherited, what can be inherited and when is not very clear, and you've
-;; got to be very careful because a little mistake can fuck up your your
-;; other backends, especially because their variables will be use instead of
-;; your real ones. Finally, I found it easier to just clone the needed
-;; parts of nnml, and tracking nnml updates is not a big deal.
+;; * nnoo. NNDiary is very similar to nnml. This makes the idea of using nnoo
+;; (to derive nndiary from nnml) natural. However, my experience with nnoo
+;; is that for reasonably complex back ends like this one, noo is a burden
+;; rather than an help. It's tricky to use, not everything can be inherited,
+;; what can be inherited and when is not very clear, and you've got to be
+;; very careful because a little mistake can fuck up your other back ends,
+;; especially because their variables will be use instead of your real ones.
+;; Finally, I found it easier to just clone the needed parts of nnml, and
+;; tracking nnml updates is not a big deal.
;; IMHO, nnoo is actually badly designed. A much simpler, and yet more
;; powerful one would be to make *real* functions and variables for a new
-;; backend based on another. Lisp is a reflexive language so that's a very
+;; back end based on another. Lisp is a reflexive language so that's a very
;; easy thing to do: inspect the function's form, replace occurences of
;; <nnfrom> (even in strings) with <nnto>, and you're done.
;; * nndiary-get-new-mail, nndiary-mail-source and nndiary-split-methods:
;; NNDiary has some experimental parts, in the sense Gnus normally uses only
-;; one mail backends for mail retreival and splitting. This backend is also
-;; an attempt to make it behave differently. For Gnus developpers: as you
-;; can see if you snarf into the code, that was not a very difficult thing
-;; to do. Something should be done about the respooling breakage though.
+;; one mail back ends for mail retreival and splitting. This back end is
+;; also an attempt to make it behave differently. For Gnus developpers: as
+;; you can see if you snarf into the code, that was not a very difficult
+;; thing to do. Something should be done about the respooling breakage
+;; though.
;;; Code:
(apply #'error args))))
-;; Backend behavior customization ===========================================
+;; Back End behavior customization ===========================================
(defgroup nndiary nil
- "The Gnus Diary backend."
+ "The Gnus Diary back end."
:version "22.1"
:group 'gnus-diary)
:type 'boolean)
-;; Backend declaration ======================================================
+;; Back End declaration ======================================================
;; Well, most of this is nnml clonage.
(nnoo-declare nndiary)
(defvoo nndiary-directory (nnheader-concat gnus-directory "diary/")
- "Spool directory for the nndiary backend.")
+ "Spool directory for the nndiary back end.")
(defvoo nndiary-active-file
(expand-file-name "active" nndiary-directory)
- "Active file for the nndiary backend.")
+ "Active file for the nndiary back end.")
(defvoo nndiary-newsgroups-file
(expand-file-name "newsgroups" nndiary-directory)
- "Newsgroups description file for the nndiary backend.")
+ "Newsgroups description file for the nndiary back end.")
(defvoo nndiary-get-new-mail nil
"Whether nndiary gets new mail and split it.
-Contrary to traditional mail backends, this variable can be set to t
-even if your primary mail backend also retreives mail. In such a case,
+Contrary to traditional mail back ends, this variable can be set to t
+even if your primary mail back end also retreives mail. In such a case,
NDiary uses its own mail-sources and split-methods.")
(defvoo nndiary-nov-is-evil nil
\f
(defconst nndiary-version "0.2-b14"
- "Current Diary backend version.")
+ "Current Diary back end version.")
(defun nndiary-version ()
- "Current Diary backend version."
+ "Current Diary back end version."
(interactive)
(message "NNDiary version %s" nndiary-version))
(nnheader-report 'nndiary "Article %s retrieved" id)
;; We return the article number.
(cons (if group-num (car group-num) group)
- (string-to-int (file-name-nondirectory path)))))))
+ (string-to-number (file-name-nondirectory path)))))))
(deffoo nndiary-request-group (group &optional server dont-check)
(let ((file-name-coding-system nnmail-pathname-coding-system))
(deffoo nndiary-request-scan (&optional group server)
;; Use our own mail sources and split methods while Gnus doesn't let us have
- ;; multiple backends for retrieving mail.
+ ;; multiple back ends for retrieving mail.
(let ((mail-sources nndiary-mail-sources)
(nnmail-split-methods nndiary-split-methods))
(setq nndiary-article-file-alist nil)
;; we should insert it. (This situation should never
;; occur, but one likes to make sure...)
(while (and (looking-at "[0-9]+\t")
- (< (string-to-int
+ (< (string-to-number
(buffer-substring
(match-beginning 0) (match-end 0)))
article)
(nnheader-article-to-file-alist nndiary-current-directory))))
-(defun nndiary-string-to-int (str min &optional max)
- ;; Like `string-to-int' but barf if STR is not exactly an integer, and not
+(defun nndiary-string-to-number (str min &optional max)
+ ;; Like `string-to-number' but barf if STR is not exactly an integer, and not
;; within the specified bounds.
;; Signals are caught by `nndiary-schedule'.
(if (not (string-match "^[ \t]*[0-9]+[ \t]*$" str))
(nndiary-error "not an integer value")
;; else
- (let ((val (string-to-int str)))
+ (let ((val (string-to-number str)))
(and (or (< val min)
(and max (> val max)))
(nndiary-error "value out of range"))
(let ((res (split-string val "-")))
(cond
((= (length res) 1)
- (nndiary-string-to-int (car res) min-or-values max))
+ (nndiary-string-to-number (car res) min-or-values max))
((= (length res) 2)
;; don't know if crontab accepts this, but ensure
;; that BEG is <= END
- (let ((beg (nndiary-string-to-int (car res) min-or-values max))
- (end (nndiary-string-to-int (cadr res) min-or-values max)))
+ (let ((beg (nndiary-string-to-number (car res) min-or-values max))
+ (end (nndiary-string-to-number (cadr res) min-or-values max)))
(cond ((< beg end)
(cons beg end))
((= beg end)
;;; nndir.el --- single directory newsgroup access for Gnus
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; nndoc.el --- single file access for Gnus
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+;; 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(search-forward "\n\n" beg t)
(re-search-backward
"^Content-Length:[ \t]*\\([0-9]+\\) *$" end t)
- (setq len (string-to-int (match-string 1)))
+ (setq len (string-to-number (match-string 1)))
(search-forward "\n\n" beg t)
(unless (= (setq len (+ (point) len)) (point-max))
(and (< len (point-max))
(defun nndoc-rnews-body-end ()
(and (re-search-backward nndoc-article-begin nil t)
(forward-line 1)
- (goto-char (+ (point) (string-to-int (match-string 1))))))
+ (goto-char (+ (point) (string-to-number (match-string 1))))))
(defun nndoc-babyl-type-p ()
(when (re-search-forward "\^_\^L *\n" nil t)
;;; nndraft.el --- draft article access for Gnus
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2003
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+;; 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(setq buffer-file-name (expand-file-name file)
buffer-auto-save-file-name (make-auto-save-file-name))
(clear-visited-file-modtime)
- (make-local-variable 'write-contents-hooks)
- (push 'nndraft-generate-headers write-contents-hooks)
+ (let ((hook (if (boundp 'write-contents-functions)
+ 'write-contents-functions
+ 'write-contents-hooks)))
+ (gnus-make-local-hook hook)
+ (add-hook hook 'nndraft-generate-headers nil t))
article))
(deffoo nndraft-request-group (group &optional server dont-check)
(file-name-coding-system nnmail-pathname-coding-system)
dir file)
(nnheader-re-read-dir pathname)
- (setq dir (mapcar (lambda (name) (string-to-int (substring name 1)))
+ (setq dir (mapcar (lambda (name) (string-to-number (substring name 1)))
(ignore-errors (directory-files
pathname nil "^#[0-9]+#$" t))))
(dolist (n dir)
"Return the list of messages in the group."
(gnus-make-directory nndraft-current-directory)
(sort
- (mapcar 'string-to-int
+ (mapcar 'string-to-number
(directory-files nndraft-current-directory nil "\\`[0-9]+\\'" t))
'<))
;;; nneething.el --- arbitrary file access for Gnus
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+;; 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(when (re-search-forward "<[a-zA-Z0-9_]@[-a-zA-Z0-9_]>" 1000 t)
(concat "From: " (match-string 0) "\n"))))
(nneething-from-line (nth 2 atts) file))
- (if (> (string-to-int (int-to-string (nth 7 atts))) 0)
+ (if (> (string-to-number (int-to-string (nth 7 atts))) 0)
(concat "Chars: " (int-to-string (nth 7 atts)) "\n")
"")
(if buffer
;;; nnfolder.el --- mail folder access for Gnus
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Simon Josefsson <simon@josefsson.org> (adding MARKS)
;; ShengHuo Zhu <zsh@cs.rochester.edu> (adding NOV)
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
((search-backward (concat "\n" nnfolder-article-marker)
nil t)
(goto-char (match-end 0))
- (setq num (string-to-int
+ (setq num (string-to-number
(buffer-substring
(point) (point-at-eol))))
(goto-char start)
(search-forward (concat "\n" nnfolder-article-marker)
nil t)
(progn
- (setq num (string-to-int
+ (setq num (string-to-number
(buffer-substring
(point) (point-at-eol))))
(> num article))
(cons nnfolder-current-group
(if (search-forward (concat "\n" nnfolder-article-marker)
nil t)
- (string-to-int (buffer-substring
+ (string-to-number (buffer-substring
(point) (point-at-eol)))
-1))))))))
(insert "\n"))
(forward-char -1)
(insert (format (concat nnfolder-article-marker "%d %s\n")
- (cdr group-art) (current-time-string)))))
+ (cdr group-art) (message-make-date)))))
(defun nnfolder-active-number (group)
;; Find the next article number in GROUP.
nnfolder-file-coding-system))
(nnheader-find-file-noselect file t)))))
(mm-enable-multibyte) ;; Use multibyte buffer for future copying.
+ (buffer-disable-undo)
(if (equal (cadr (assoc group nnfolder-scantime-alist))
(nth 5 (file-attributes file)))
;; This looks up-to-date, so we don't do any scanning.
maxid start end newscantime
novbuf articles newnum
buffer-read-only)
- (buffer-disable-undo)
(setq maxid (cdr active))
(unless (or gnus-nov-is-evil nnfolder-nov-is-evil
(gnus-make-directory (file-name-directory (buffer-file-name)))
(let ((coding-system-for-write
(or nnfolder-file-coding-system-for-write
- nnfolder-file-coding-system)))
+ nnfolder-file-coding-system))
+ (copyright-update nil))
(save-buffer)))
(unless (or gnus-nov-is-evil nnfolder-nov-is-evil)
(nnfolder-save-nov)))
;;; nngateway.el --- posting news via mail gateways
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news, mail
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; nnheader.el --- header access macros for Gnus and its backends
-;; Copyright (C) 1987, 1988, 1989, 1990, 1993, 1994, 1995, 1996,
-;; 1997, 1998, 2000, 2001, 2002, 2003, 2004
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1987, 1988, 1989, 1990, 1993, 1994,
+;; 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003,
+;; 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
;; Lars Magne Ingebrigtsen <larsi@gnus.org>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(eval-when-compile (require 'cl))
+(defvar nnmail-extra-headers)
+
;; Requiring `gnus-util' at compile time creates a circular
;; dependency between nnheader.el and gnus-util.el.
;;(eval-when-compile (require 'gnus-util))
"Return the extra headers in HEADER."
`(aref ,header 9))
-(defmacro mail-header-set-extra (header extra)
+(defun mail-header-set-extra (header extra)
"Set the extra headers in HEADER to EXTRA."
- `(aset ,header 9 ',extra))
+ (aset header 9 extra))
(defsubst make-mail-header (&optional init)
"Create a new mail header structure initialized with INIT."
(defsubst nnheader-file-to-number (file)
"Take a FILE name and return the article number."
(if (string= nnheader-numerical-short-files "^[0-9]+$")
- (string-to-int file)
+ (string-to-number file)
(string-match nnheader-numerical-short-files file)
- (string-to-int (match-string 0 file))))
+ (string-to-number (match-string 0 file))))
(defvar nnheader-directory-files-is-safe
(or (eq system-type 'windows-nt)
(defun nnheader-find-file-noselect (&rest args)
"Open a file with some variables bound.
See `find-file-noselect' for the arguments."
- (let ((format-alist nil)
- (auto-mode-alist (mm-auto-mode-alist))
- (default-major-mode 'fundamental-mode)
- (enable-local-variables nil)
- (after-insert-file-functions nil)
- (enable-local-eval nil)
- (find-file-hooks nil)
- (coding-system-for-read nnheader-file-coding-system))
- (apply 'find-file-noselect args)))
+ (let* ((format-alist nil)
+ (auto-mode-alist (mm-auto-mode-alist))
+ (default-major-mode 'fundamental-mode)
+ (enable-local-variables nil)
+ (after-insert-file-functions nil)
+ (enable-local-eval nil)
+ (coding-system-for-read nnheader-file-coding-system)
+ (ffh (if (boundp 'find-file-hook)
+ 'find-file-hook
+ 'find-file-hooks))
+ (val (symbol-value ffh)))
+ (set ffh nil)
+ (unwind-protect
+ (apply 'find-file-noselect args)
+ (set ffh val))))
(defun nnheader-directory-regular-files (dir)
"Return a list of all regular files in DIR."
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; nnimap.el --- imap backend for Gnus
-;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Simon Josefsson <jas@pdc.kth.se>
;; Jim Radford <radford@robby.caltech.edu>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
"Whether to download entire articles during splitting.
This is generally not required, and will slow things down considerably.
You may need it if you want to use an advanced splitting function that
-analyses the body before splitting the article.
+analyzes the body before splitting the article.
If this variable is nil, bodies will not be downloaded; if this
variable is the symbol `default' the default behaviour is
used (which currently is nil, unless you use a statistical
Unlike other backends, you do not need to take special care if you
flip this variable.")
+(defvoo nnimap-search-uids-not-since-is-evil nil
+ "If non-nil, avoid \"UID SEARCH UID ... NOT SINCE\" queries when expiring.
+Instead, use \"UID SEARCH SINCE\" to prune the list of expirable
+articles within Gnus. This seems to be faster on Courier in some cases.")
+
(defvoo nnimap-expunge-on-close 'always ; 'ask, 'never
"Whether to expunge a group when it is closed.
When a IMAP group with articles marked for deletion is closed, this
(port (if nnimap-server-port
(int-to-string nnimap-server-port)
"imap"))
- (user (netrc-machine-user-or-password
+ (user (netrc-machine-user-or-password
"login"
list
(list server
nnimap-address))
(list port)
(list "imap" "imaps")))
- (passwd (netrc-machine-user-or-password
+ (passwd (netrc-machine-user-or-password
"password"
list
(list server
(if (imap-authenticate user passwd nnimap-server-buffer)
(prog2
(setq nnimap-server-buffer-alist
- (nnimap-remove-server-from-buffer-alist
+ (nnimap-remove-server-from-buffer-alist
server
nnimap-server-buffer-alist))
(push (list server nnimap-server-buffer)
(setq nnimap-server-buffer nil
nnimap-current-server nil
nnimap-server-buffer-alist
- (nnimap-remove-server-from-buffer-alist
+ (nnimap-remove-server-from-buffer-alist
server
nnimap-server-buffer-alist)))
(nnoo-close-server 'nnimap server)))
(let (seen unseen)
;; read info could contain articles marked unread by other
;; imap clients! we correct this
- (setq seen (gnus-uncompress-range (gnus-info-read info))
- unseen (imap-search "UNSEEN UNDELETED")
- seen (gnus-set-difference seen unseen)
- ;; seen might lack articles marked as read by other
- ;; imap clients! we correct this
- seen (append seen (imap-search "SEEN"))
- ;; remove dupes
- seen (sort seen '<)
- seen (gnus-compress-sequence seen t)
- ;; we can't return '(1) since this isn't a "list of ranges",
- ;; and we can't return '((1)) since g-list-of-unread-articles
- ;; is buggy so we return '((1 . 1)).
+ (setq unseen (gnus-compress-sequence
+ (imap-search "UNSEEN UNDELETED"))
+ seen (gnus-range-difference (gnus-info-read info) unseen)
+ seen (gnus-range-add seen
+ (gnus-compress-sequence
+ (imap-search "SEEN")))
seen (if (and (integerp (car seen))
(null (cdr seen)))
(list (cons (car seen) (car seen)))
(gnus-compress-sequence oldarts)) "\\Deleted")
(setq articles (gnus-set-difference
articles oldarts))))))
+ ((and nnimap-search-uids-not-since-is-evil (numberp days))
+ (let* ((all-new-articles
+ (gnus-compress-sequence
+ (imap-search (format "SINCE %s"
+ (nnimap-date-days-ago days)))))
+ (oldartseq
+ (gnus-range-difference artseq all-new-articles))
+ (oldarts (gnus-uncompress-range oldartseq)))
+ (when oldarts
+ (nnimap-expiry-target oldarts group server)
+ (when (imap-message-flags-add
+ (imap-range-to-message-set oldartseq)
+ "\\Deleted")
+ (setq articles (gnus-set-difference
+ articles oldarts))))))
((numberp days)
(let ((oldarts (imap-search
(format nnimap-expunge-search-string
;; return articles not deleted
articles)
-(deffoo nnimap-request-move-article (article group server accept-form
+(deffoo nnimap-request-move-article (article group server accept-form
&optional last move-is-internal)
(when (nnimap-possibly-change-server server)
(save-excursion
(setq result (eval accept-form))
(kill-buffer buf)
result)
+ (nnimap-possibly-change-group group server)
(imap-message-flags-add
(imap-range-to-message-set (list article))
"\\Deleted" 'silent nnimap-server-buffer))
;;; nnkiboze.el --- select virtual news access for Gnus
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(error "nnkiboze: No xref"))
(unless (string-match " \\([^ ]+\\):\\([0-9]+\\)" xref)
(error "nnkiboze: Malformed xref"))
- (setq num (string-to-int (match-string 2 xref))
+ (setq num (string-to-number (match-string 2 xref))
group (match-string 1 xref))
(or (with-current-buffer buffer
(or (and gnus-use-cache (gnus-cache-request-article num group))
;;; nnlistserv.el --- retrieving articles via web mailing list archives
-;; Copyright (C) 1997, 1998, 1999, 2000, 2004 Free Software Foundation, Inc.
+;; Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news, mail
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; nnmail.el --- mail support functions for the Gnus mail backends
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+;; 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news, mail
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
:group 'nnmail)
(defgroup nnmail-prepare nil
- "Preparing (or mangling) new mail after retrival."
+ "Preparing (or mangling) new mail after retrieval."
:group 'nnmail)
(defgroup nnmail-duplicate nil
(if (not (save-excursion
(and (re-search-backward
"^Content-Length:[ \t]*\\([0-9]+\\)" start t)
- (setq content-length (string-to-int
+ (setq content-length (string-to-number
(buffer-substring
(match-beginning 1)
(match-end 1))))
(if (not (re-search-forward
"^Content-Length:[ \t]*\\([0-9]+\\)" nil t))
(setq content-length nil)
- (setq content-length (string-to-int (match-string 1)))
+ (setq content-length (string-to-number (match-string 1)))
;; We destroy the header, since none of the backends ever
;; use it, and we do not want to confuse other mailers by
;; having a (possibly) faulty header.
5 "Error in `nnmail-split-methods'; using `bogus' mail group")
(sit-for 1)
'("bogus")))))
- (setq split (gnus-remove-duplicates split))
+ (setq split (mm-delete-duplicates split))
;; The article may be "cross-posted" to `junk'. What
;; to do? Just remove the `junk' spec. Don't really
;; see anything else to do...
;; Not in cache, compute a regexp for the field/value pair.
(t
- (let* ((field (nth 0 split))
- (value (nth 1 split))
- partial-front
- partial-rear
- regexp)
+ (let ((field (nth 0 split))
+ (value (nth 1 split))
+ (split-rest (cddr split))
+ partial-front
+ partial-rear
+ regexp)
(if (symbolp value)
(setq value (cdr (assq value nnmail-split-abbrev-alist))))
(if (and (>= (length value) 2)
(string= ".*" (substring value -2)))
(setq value (substring value 0 -2)
partial-rear ""))
- (when nnmail-split-fancy-match-partial-words
+ ;; Invert the match-partial-words behavior if the optional
+ ;; last element is specified.
+ (while (eq (car split-rest) '-)
+ (setq split-rest (cddr split-rest)))
+ (when (if (cadr split-rest)
+ (not nnmail-split-fancy-match-partial-words)
+ nnmail-split-fancy-match-partial-words)
(setq partial-front ""
partial-rear ""))
(setq regexp (concat "^\\(\\("
(or partial-rear "\\>")))
(push (cons split regexp) nnmail-split-cache)
;; Now that it's in the cache, just call nnmail-split-it again
- ;; on the same split, which will find it immediately in the cache.
+ ;; on the same split, which will find it immediately in the cache.
(nnmail-split-it split))))))
(defun nnmail-expand-newtext (newtext)
(case-fold-search nil)
(from (or (message-fetch-field "from") ""))
(to (or (message-fetch-field "to") ""))
- (date (date-to-time
- (or (message-fetch-field "date") (current-time-string))))
+ (date (message-fetch-field "date"))
(target 'delete))
+ (setq date (if date
+ (condition-case err
+ (date-to-time date)
+ (error
+ (message "%s" (error-message-string err))
+ (current-time)))
+ (current-time)))
(dolist (regexp-target-pair (reverse nnmail-fancy-expiry-targets) target)
(setq header (car regexp-target-pair))
(cond
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; nnmbox.el --- mail mbox access for Gnus
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+;; 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(when (re-search-forward "^X-Gnus-Newsgroup: +\\([^:]+\\):\\([0-9]+\\) "
nil t)
(cons (buffer-substring (match-beginning 1) (match-end 1))
- (string-to-int
+ (string-to-number
(buffer-substring (match-beginning 2) (match-end 2)))))))
(defun nnmbox-in-header-p (pos)
(let (alist)
(while (re-search-forward " \\([^:]+\\):\\([0-9]+\\)" end-header t)
(push (cons (match-string 1)
- (string-to-int (match-string 2))) alist))
+ (string-to-number (match-string 2))) alist))
(nnmbox-insert-newsgroup-line alist))
;; this is really a new article
(nnmbox-save-mail
;;; nnmh.el --- mhspool access for Gnus
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2003
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+;; 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(file-exists-p file)
(not (file-directory-p file))
(save-excursion (nnmail-find-file file))
- (string-to-int (file-name-nondirectory file)))))
+ (string-to-number (file-name-nondirectory file)))))
(deffoo nnmh-request-group (group &optional server dont-check)
(nnheader-init-server-buffer)
(nnheader-re-read-dir pathname)
(setq dir
(sort
- (mapcar 'string-to-int
+ (mapcar 'string-to-number
(directory-files pathname nil "^[0-9]+$" t))
'<))
(cond
(nnmh-request-list-1 rdir))))
;; For each directory, generate an active file line.
(unless (string= (expand-file-name nnmh-toplev) dir)
- (let ((files (mapcar 'string-to-int
+ (let ((files (mapcar 'string-to-number
(directory-files dir nil "^[0-9]+$" t))))
(when files
(save-excursion
nnmh-group-alist)
(nnmh-possibly-create-directory group)
(nnmh-possibly-change-directory group server)
- (let ((articles (mapcar 'string-to-int
+ (let ((articles (mapcar 'string-to-number
(directory-files
nnmh-current-directory nil "^[0-9]+$"))))
(when articles
(gnus-make-directory dir))
;; Find the highest number in the group.
(let ((files (sort
- (mapcar 'string-to-int
+ (mapcar 'string-to-number
(directory-files dir nil "^[0-9]+$"))
'>)))
(when files
;; articles in this folder. The articles that are "new" will be
;; marked as unread by Gnus.
(let* ((dir nnmh-current-directory)
- (files (sort (mapcar 'string-to-int
+ (files (sort (mapcar 'string-to-number
(directory-files nnmh-current-directory
nil "^[0-9]+$" t))
'<))
;;; nnml.el --- mail spool access for Gnus
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2003
-;; Free Software Foundation, Inc.
-;; Author: Simon Josefsson <simon@josefsson.org> (adding MARKS)
-;; Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+;; 2004, 2005, 2006 Free Software Foundation, Inc.
+
+;; Authors: Didier Verna <didier@xemacs.org> (adding compaction)
+;; Simon Josefsson <simon@josefsson.org> (adding MARKS)
+;; Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
;; Keywords: news, mail
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(eval-when-compile (require 'cl))
(eval-and-compile
- (autoload 'gnus-article-unpropagatable-p "gnus-sum"))
+ (autoload 'gnus-article-unpropagatable-p "gnus-sum")
+ (autoload 'gnus-backlog-remove-article "gnus-bcklg"))
(nnoo-declare nnml)
"If non-nil, inhibit expiry.")
(defvoo nnml-use-compressed-files nil
- "If non-nil, allow using compressed message files.")
+ "If non-nil, allow using compressed message files.
+
+If it is a string, use it as the file extension which specifies
+the comression program. You can set it to \".bz2\" if your Emacs
+supports auto-compression using the bzip2 program. A value of t
+is equivalent to \".gz\".")
+
+(defvoo nnml-compressed-files-size-threshold 1000
+ "Default size threshold for compressed message files.
+Message files with bodies larger than that many characters will
+be automatically compressed if `nnml-use-compressed-files' is
+non-nil.")
\f
(nnheader-report 'nnml "Article %s retrieved" id)
;; We return the article number.
(cons (if group-num (car group-num) group)
- (string-to-int (file-name-nondirectory path)))))))
+ (string-to-number (file-name-nondirectory path)))))))
(deffoo nnml-request-group (group &optional server dont-check)
(let ((file-name-coding-system nnmail-pathname-coding-system))
(nnmail-check-syntax)
(let (result)
(when nnmail-cache-accepted-message-ids
- (nnmail-cache-insert (nnmail-fetch-field "message-id")
+ (nnmail-cache-insert (nnmail-fetch-field "message-id")
group
(nnmail-fetch-field "subject")
(nnmail-fetch-field "from")))
;; we should insert it. (This situation should never
;; occur, but one likes to make sure...)
(while (and (looking-at "[0-9]+\t")
- (< (string-to-int
+ (< (string-to-number
(buffer-substring
(match-beginning 0) (match-end 0)))
article)
(setq chars (nnmail-insert-lines))
(setq extension
(and nnml-use-compressed-files
- (> chars 1000)
- ".gz"))
+ (> chars nnml-compressed-files-size-threshold)
+ (if (stringp nnml-use-compressed-files)
+ nnml-use-compressed-files
+ ".gz")))
(nnmail-insert-xref group-art)
(run-hooks 'nnmail-prepare-save-mail-hook)
(run-hooks 'nnml-prepare-save-mail-hook)
(nnml-open-server server))
(setq nnml-directory (expand-file-name nnml-directory))
;; Recurse down the directories.
- (nnml-generate-nov-databases-1 nnml-directory nil t)
+ (nnml-generate-nov-databases-directory nnml-directory nil t)
;; Save the active file.
(nnmail-save-active nnml-group-alist nnml-active-file))
-(defun nnml-generate-nov-databases-1 (dir &optional seen no-active)
- "Regenerate the NOV database in DIR."
+(defun nnml-generate-nov-databases-directory (dir &optional seen no-active)
+ "Regenerate the NOV database in DIR.
+
+Unless no-active is non-nil, update the active file too."
(interactive "DRegenerate NOV in: ")
(setq dir (file-name-as-directory dir))
;; Only scan this sub-tree if we haven't been here yet.
(dolist (dir (directory-files dir t nil t))
(when (and (not (string-match "^\\." (file-name-nondirectory dir)))
(file-directory-p dir))
- (nnml-generate-nov-databases-1 dir seen)))
+ (nnml-generate-nov-databases-directory dir seen)))
;; Do this directory.
(let ((files (sort (nnheader-article-to-file-alist dir)
'car-less-than-car)))
(nnml-save-marks group server)
(nnheader-message 7 "Bootstrapping marks for %s...done" group)))))
+
+;;;
+;;; Group and server compaction. -- dvl
+;;;
+
+;; #### FIXME: this function handles self Xref: entry correctly, but I don't
+;; #### know how to handle external cross-references. I actually don't know if
+;; #### this is handled correctly elsewhere. For instance, what happens if you
+;; #### move all articles to a new group (that's what people do for manual
+;; #### compaction) ?
+
+;; #### NOTE: the function below handles the article backlog. This is
+;; #### conceptually the wrong place to do it because the backend is at a
+;; #### lower level. However, this is the only place where we have the needed
+;; #### information to do the job. Ideally, this function should not handle
+;; #### the backlog by itself, but return a list of moved groups / articles to
+;; #### the caller. This will become important to avoid code duplication when
+;; #### other backends get a compaction feature. Also, note that invalidating
+;; #### the "original article buffer" is already done at an upper level.
+
+;; Shouldn't `nnml-request-compact-group' be interactive? --rsteib
+
+(defun nnml-request-compact-group (group &optional server save)
+ (nnml-possibly-change-directory group server)
+ (unless nnml-article-file-alist
+ (setq nnml-article-file-alist
+ (sort (nnml-current-group-article-to-file-alist)
+ 'car-less-than-car)))
+ (if (not nnml-article-file-alist)
+ ;; The group is empty: do nothing but return t
+ t
+ ;; The group is not empty:
+ (let* ((group-full-name
+ (gnus-group-prefixed-name
+ group
+ (gnus-server-to-method (format "nnml:%s" server))))
+ (info (gnus-get-info group-full-name))
+ (new-number 1)
+ compacted)
+ (let ((articles nnml-article-file-alist)
+ article)
+ (while (setq article (pop articles))
+ (let ((old-number (car article)))
+ (when (> old-number new-number)
+ ;; There is a gap here:
+ (let ((old-number-string (int-to-string old-number))
+ (new-number-string (int-to-string new-number)))
+ (setq compacted t)
+ ;; #### NOTE: `nnml-article-to-file' calls
+ ;; #### `nnml-update-file-alist' (which in turn calls
+ ;; #### `nnml-current-group-article-to-file-alist', which
+ ;; #### might use the NOV database). This might turn out to be
+ ;; #### inefficient. In that case, we will do the work
+ ;; #### manually.
+ ;; 1/ Move the article to a new file:
+ (let* ((oldfile (nnml-article-to-file old-number))
+ (newfile
+ (gnus-replace-in-string
+ oldfile (concat "\\("
+ old-number-string
+ "\\)\\(\\(\\.gz\\)?\\)$")
+ (concat new-number-string "\\2"))))
+ (with-current-buffer nntp-server-buffer
+ (nnmail-find-file oldfile)
+ ;; Update the Xref header in the article itself:
+ (when (and (re-search-forward "^Xref: [^ ]+ " nil t)
+ (re-search-forward
+ (concat "\\<"
+ (regexp-quote
+ (concat group ":" old-number-string))
+ "\\>")
+ (point-at-eol) t))
+ (replace-match
+ (concat group ":" new-number-string)))
+ ;; Save to the new file:
+ (nnmail-write-region (point-min) (point-max) newfile))
+ (funcall nnmail-delete-file-function oldfile))
+ ;; 2/ Update all marks for this article:
+ ;; #### NOTE: it is possible that the new article number
+ ;; #### already belongs to a range, whereas the corresponding
+ ;; #### article doesn't exist (for example, if you delete an
+ ;; #### article). For that reason, it is important to update
+ ;; #### the ranges (meaning remove inexistant articles) before
+ ;; #### doing anything on them.
+ ;; 2 a/ read articles:
+ (let ((read (gnus-info-read info)))
+ (setq read (gnus-remove-from-range read (list new-number)))
+ (when (gnus-member-of-range old-number read)
+ (setq read (gnus-remove-from-range read (list old-number)))
+ (setq read (gnus-add-to-range read (list new-number))))
+ (gnus-info-set-read info read))
+ ;; 2 b/ marked articles:
+ (let ((oldmarks (gnus-info-marks info))
+ mark newmarks)
+ (while (setq mark (pop oldmarks))
+ (setcdr mark (gnus-remove-from-range (cdr mark)
+ (list new-number)))
+ (when (gnus-member-of-range old-number (cdr mark))
+ (setcdr mark (gnus-remove-from-range (cdr mark)
+ (list old-number)))
+ (setcdr mark (gnus-add-to-range (cdr mark)
+ (list new-number))))
+ (push mark newmarks))
+ (gnus-info-set-marks info newmarks))
+ ;; 3/ Update the NOV entry for this article:
+ (unless nnml-nov-is-evil
+ (save-excursion
+ (set-buffer (nnml-open-nov group))
+ (when (nnheader-find-nov-line old-number)
+ ;; Replace the article number:
+ (looking-at old-number-string)
+ (replace-match new-number-string nil t)
+ ;; Update the Xref header:
+ (when (re-search-forward
+ (concat "\\(Xref:[^\t\n]* \\)\\<"
+ (regexp-quote
+ (concat group ":" old-number-string))
+ "\\>")
+ (point-at-eol) t)
+ (replace-match
+ (concat "\\1" group ":" new-number-string))))))
+ ;; 4/ Possibly remove the article from the backlog:
+ (when gnus-keep-backlog
+ ;; #### NOTE: instead of removing the article, we could
+ ;; #### modify the backlog to reflect the numbering change,
+ ;; #### but I don't think it's worth it.
+ (gnus-backlog-remove-article group-full-name old-number)
+ (gnus-backlog-remove-article group-full-name new-number))))
+ (setq new-number (1+ new-number)))))
+ (if (not compacted)
+ ;; No compaction had to be done:
+ t
+ ;; Some articles have actually been renamed:
+ ;; 1/ Rebuild active information:
+ (let ((entry (assoc group nnml-group-alist))
+ (active (cons 1 (1- new-number))))
+ (setq nnml-group-alist (delq entry nnml-group-alist))
+ (push (list group active) nnml-group-alist)
+ ;; Update the active hashtable to let the *Group* buffer display
+ ;; up-to-date lines. I don't think that either gnus-newsrc-hashtb or
+ ;; gnus-newwrc-alist are out of date, since all we did is to modify
+ ;; the info of the group internally.
+ (gnus-set-active group-full-name active))
+ ;; 1 bis/
+ ;; #### NOTE: normally, we should save the overview (NOV) file
+ ;; #### here, just like we save the marks file. However, there is no
+ ;; #### such function as nnml-save-nov for a single group. Only for
+ ;; #### all groups. Gnus inconsistency is getting worse every day...
+ ;; 2/ Rebuild marks file:
+ (unless nnml-marks-is-evil
+ ;; #### NOTE: this constant use of global variables everywhere is
+ ;; #### truly disgusting. Gnus really needs a *major* cleanup.
+ (setq nnml-marks (gnus-info-marks info))
+ (push (cons 'read (gnus-info-read info)) nnml-marks)
+ (dolist (el gnus-article-unpropagated-mark-lists)
+ (setq nnml-marks (gnus-remassoc el nnml-marks)))
+ (nnml-save-marks group server))
+ ;; 3/ Save everything if this was not part of a bigger operation:
+ (if (not save)
+ ;; Nothing to save (yet):
+ t
+ ;; Something to save:
+ ;; a/ Save the NOV databases:
+ ;; #### NOTE: this should be done directory per directory in 1bis
+ ;; #### above. See comment there.
+ (nnml-save-nov)
+ ;; b/ Save the active file:
+ (nnmail-save-active nnml-group-alist nnml-active-file)
+ t)))))
+
+(defun nnml-request-compact (&optional server)
+ "Request compaction of all SERVER nnml groups."
+ (interactive (list (or (nnoo-current-server 'nnml) "")))
+ (nnmail-activate 'nnml)
+ (unless (nnml-server-opened server)
+ (nnml-open-server server))
+ (setq nnml-directory (expand-file-name nnml-directory))
+ (let* ((groups (gnus-groups-from-server
+ (gnus-server-to-method (format "nnml:%s" server))))
+ (first (pop groups))
+ group)
+ (when first
+ (while (setq group (pop groups))
+ (nnml-request-compact-group (gnus-group-real-name group) server))
+ (nnml-request-compact-group (gnus-group-real-name first) server t))))
+
+
(provide 'nnml)
;;; arch-tag: 52c97dc3-9735-45de-b439-9e4d23b52004
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; nnoo.el --- OO Gnus Backends
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+;; 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(defmacro nnoo-declare (backend &rest parents)
`(eval-and-compile
- (push (list ',backend
- (mapcar (lambda (p) (list p)) ',parents)
- nil nil)
- nnoo-definition-alist)
- (push (list ',backend "*internal-non-initialized-backend*")
- nnoo-state-alist)))
+ (if (assq ',backend nnoo-definition-alist)
+ (setcar (cdr (assq ',backend nnoo-definition-alist))
+ (mapcar 'list ',parents))
+ (push (list ',backend
+ (mapcar 'list ',parents)
+ nil nil)
+ nnoo-definition-alist))
+ (unless (assq ',backend nnoo-state-alist)
+ (push (list ',backend "*internal-non-initialized-backend*")
+ nnoo-state-alist))))
(put 'nnoo-declare 'lisp-indent-function 1)
(defun nnoo-parents (backend)
(setcdr bstate (delq defs (cdr bstate)))
(pop defs)
(while defs
- (set (car (pop defs)) nil)))))
+ (set (car (pop defs)) nil)))))
t)
(defun nnoo-close (backend)
;;; nnrss.el --- interfacing with RSS
-;; Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+
+;; Copyright (C) 2001, 2002, 2003, 2004, 2005,
+;; 2006 Free Software Foundation, Inc.
;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
;; Keywords: RSS
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(defvar nnrss-compatible-encoding-alist '((iso-8859-1 . windows-1252))
"Alist of encodings and those supersets.
The cdr of each element is used to decode data if it is available when
-the car is what the data specify as the encoding. Or, the car is used
+the car is what the data specify as the encoding. Or, the car is used
for decoding when the cdr that the data specify is not available.")
+(defvar nnrss-wash-html-in-text-plain-parts nil
+ "*Non-nil means render text in text/plain parts as HTML.
+The function specified by the `mm-text-html-renderer' variable will be
+used to render text. If it is nil, text will simply be folded.")
+
(nnoo-define-basics nnrss)
;;; Interface functions
(deffoo nnrss-close-group (group &optional server)
t)
+(eval-when-compile
+ (defvar mm-text-html-renderer)
+ (defvar mm-text-html-washer-alist))
+
(deffoo nnrss-request-article (article &optional group server buffer)
(setq group (nnrss-decode-group-name group))
(when (stringp article)
(if (nth 5 e)
(insert "Date: " (nnrss-format-string (nth 5 e)) "\n"))
(let ((header (buffer-string))
- (text (if (nth 6 e)
- (mapconcat 'identity
- (delete "" (split-string (nth 6 e) "\n+"))
- " ")))
+ (text (nth 6 e))
(link (nth 2 e))
(enclosure (nth 7 e))
+ (comments (nth 8 e))
;; Enable encoding of Newsgroups header in XEmacs.
(default-enable-multibyte-characters t)
(rfc2047-header-encoding-alist
(cons '("Newsgroups" . utf-8)
rfc2047-header-encoding-alist)
rfc2047-header-encoding-alist))
- rfc2047-encode-encoded-words body)
- (when (or text link enclosure)
+ rfc2047-encode-encoded-words body fn)
+ (when (or text link enclosure comments)
(insert "\n")
(insert "<#multipart type=alternative>\n"
"<#part type=\"text/plain\">\n")
(setq body (point))
(when text
- (insert text "\n")
+ (insert text)
+ (goto-char body)
+ (if (and nnrss-wash-html-in-text-plain-parts
+ (progn
+ (require 'mm-view)
+ (setq fn (or (cdr (assq mm-text-html-renderer
+ mm-text-html-washer-alist))
+ mm-text-html-renderer))))
+ (progn
+ (narrow-to-region body (point-max))
+ (if (functionp fn)
+ (funcall fn)
+ (apply (car fn) (cdr fn)))
+ (widen)
+ (goto-char body)
+ (re-search-forward "[^\t\n ]" nil t)
+ (beginning-of-line)
+ (delete-region body (point))
+ (goto-char (point-max))
+ (skip-chars-backward "\t\n ")
+ (end-of-line)
+ (delete-region (point) (point-max))
+ (insert "\n"))
+ (while (re-search-forward "\n+" nil t)
+ (replace-match " "))
+ (goto-char body)
+ ;; See `nnrss-check-group', which inserts "<br /><br />".
+ (when (search-forward "<br /><br />" nil t)
+ (if (eobp)
+ (replace-match "\n")
+ (replace-match "\n\n")))
+ (unless (eobp)
+ (let ((fill-column default-fill-column)
+ (window (get-buffer-window nntp-server-buffer)))
+ (when window
+ (setq fill-column
+ (max 1 (/ (* (window-width window) 7) 8))))
+ (fill-region (point) (point-max))
+ (goto-char (point-max))
+ ;; XEmacs version of `fill-region' inserts newline.
+ (unless (bolp)
+ (insert "\n")))))
(when (or link enclosure)
(insert "\n")))
(when link
(insert (car enclosure) " "
(nth 2 enclosure) " "
(nth 3 enclosure) "\n"))
+ (when comments
+ (insert comments "\n"))
(setq body (buffer-substring body (point)))
(insert "<#/part>\n"
"<#part type=\"text/html\">\n"
(insert "<p><a href=\"" (car enclosure) "\">"
(cadr enclosure) "</a> " (nth 2 enclosure)
" " (nth 3 enclosure) "</p>\n"))
+ (when comments
+ (insert "<p><a href=\"" comments "\">comments</a></p>\n"))
(insert "</body></html>\n"
"<#/part>\n"
"<#/multipart>\n"))
;; FIXME: shouldn't binding `coding-system-for-read' be moved
;; to `mm-url-insert'?
(let ((coding-system-for-read 'binary))
- (mm-url-insert url)))
+ (condition-case err
+ (mm-url-insert url)
+ (error (if (or debug-on-quit debug-on-error)
+ (signal (car err) (cdr err))
+ (message "nnrss: Failed to fetch %s" url))))))
(nnheader-remove-cr-followed-by-lf)
;; Decode text according to the encoding attribute.
(when (setq cs (nnrss-get-encoding))
(unless (assoc (car elem) nnrss-group-alist)
(insert (prin1-to-string (car elem)) " 0 1 y\n")))))
+(eval-and-compile (autoload 'timezone-parse-date "timezone"))
+
+(defun nnrss-normalize-date (date)
+ "Return a date string of DATE in the RFC822 style.
+This function handles the ISO 8601 date format described in
+<URL:http://www.w3.org/TR/NOTE-datetime>, and also the RFC822 style
+which RSS 2.0 allows."
+ (let (case-fold-search vector year month day time zone cts)
+ (cond ((null date))
+ ;; RFC822
+ ((string-match " [0-9]+ " date)
+ (setq vector (timezone-parse-date date)
+ year (string-to-number (aref vector 0)))
+ (when (>= year 1969)
+ (setq month (string-to-number (aref vector 1))
+ day (string-to-number (aref vector 2)))
+ (unless (>= (length (setq time (aref vector 3))) 3)
+ (setq time "00:00:00"))
+ (when (and (setq zone (aref vector 4))
+ (not (string-match "\\`[A-Z+-]" zone)))
+ (setq zone nil))))
+ ;; ISO 8601
+ ((string-match
+ (eval-when-compile
+ (concat
+ ;; 1. year
+ "\\(199[0-9]\\|20[0-9][0-9]\\)"
+ "\\(?:-"
+ ;; 2. month
+ "\\([01][0-9]\\)"
+ "\\(?:-"
+ ;; 3. day
+ "\\([0-3][0-9]\\)"
+ "\\)?\\)?\\(?:T"
+ ;; 4. hh:mm
+ "\\([012][0-9]:[0-5][0-9]\\)"
+ "\\(?:"
+ ;; 5. :ss
+ "\\(:[0-5][0-9]\\)"
+ "\\(?:\\.[0-9]+\\)?\\)?\\)?"
+ ;; 6+7,8,9. zone
+ "\\(?:\\(?:\\([+-][012][0-9]\\):\\([0-5][0-9]\\)\\)"
+ "\\|\\([+-][012][0-9][0-5][0-9]\\)"
+ "\\|\\(Z\\)\\)?"))
+ date)
+ (setq year (string-to-number (match-string 1 date))
+ month (string-to-number (or (match-string 2 date) "1"))
+ day (string-to-number (or (match-string 3 date) "1"))
+ time (if (match-beginning 5)
+ (substring date (match-beginning 4) (match-end 5))
+ (concat (or (match-string 4 date) "00:00") ":00"))
+ zone (cond ((match-beginning 6)
+ (concat (match-string 6 date)
+ (match-string 7 date)))
+ ((match-beginning 9) ;; Z
+ "+0000")
+ (t ;; nil if zone is not provided.
+ (match-string 8 date))))))
+ (if month
+ (progn
+ (setq cts (current-time-string (encode-time 0 0 0 day month year)))
+ (format "%s, %02d %s %04d %s%s"
+ (substring cts 0 3) day (substring cts 4 7) year time
+ (if zone
+ (concat " " zone)
+ "")))
+ (message-make-date))))
+
;;; data functions
(defun nnrss-read-server-data (server)
(defun nnrss-insert-w3 (url)
(mm-with-unibyte-current-buffer
- (mm-url-insert url)))
+ (condition-case err
+ (mm-url-insert url)
+ (error (if (or debug-on-quit debug-on-error)
+ (signal (car err) (cdr err))
+ (message "nnrss: Failed to fetch %s" url))))))
(defun nnrss-decode-entities-string (string)
(if string
;;; Snarf functions
(defun nnrss-check-group (group server)
- (let (file xml subject url extra changed author date
- enclosure rss-ns rdf-ns content-ns dc-ns)
+ (let (file xml subject url extra changed author date feed-subject
+ enclosure comments rss-ns rdf-ns content-ns dc-ns)
(if (and nnrss-use-local
(file-exists-p (setq file (expand-file-name
(nnrss-translate-file-chars
(setq extra (or extra
(nnrss-node-text content-ns 'encoded item)
(nnrss-node-text rss-ns 'description item)))
+ (if (setq feed-subject (nnrss-node-text dc-ns 'subject item))
+ (setq extra (concat feed-subject "<br /><br />" extra)))
(setq author (or (nnrss-node-text rss-ns 'author item)
(nnrss-node-text dc-ns 'creator item)
(nnrss-node-text dc-ns 'contributor item)))
- (setq date (or (nnrss-node-text dc-ns 'date item)
- (nnrss-node-text rss-ns 'pubDate item)
- (message-make-date)))
+ (setq date (nnrss-normalize-date
+ (or (nnrss-node-text dc-ns 'date item)
+ (nnrss-node-text rss-ns 'pubDate item))))
+ (setq comments (nnrss-node-text rss-ns 'comments item))
(when (setq enclosure (cadr (assq (intern (concat rss-ns "enclosure")) item)))
(let ((url (cdr (assq 'url enclosure)))
(len (cdr (assq 'length enclosure)))
(and author (nnrss-mime-encode-string author))
date
(and extra (nnrss-decode-entities-string extra))
- enclosure)
+ enclosure
+ comments)
nnrss-group-data)
(puthash (or url extra) t nnrss-group-hashtb)
(setq changed t))
"OPML subscriptions import.
Read the file and attempt to subscribe to each Feed in the file."
(interactive "fImport file: ")
- (mapcar
- (lambda (node) (gnus-group-make-rss-group
- (cdr (assq 'xmlUrl (cadr node)))))
+ (mapc
+ (lambda (node)
+ (let ((xmlurl (cdr (assq 'xmlUrl (cadr node)))))
+ (when (and xmlurl
+ (not (string-match "\\`[\t ]*\\'" xmlurl))
+ (prog1
+ (y-or-n-p (format "Subscribe to %s " xmlurl))
+ (message "")))
+ (condition-case err
+ (progn
+ (gnus-group-make-rss-group xmlurl)
+ (forward-line 1))
+ (error
+ (message
+ "Failed to subscribe to %s (%s); type any key to continue: "
+ xmlurl
+ (error-message-string err))
+ (let ((echo-keystrokes 0))
+ (read-char)))))))
(nnrss-find-el 'outline
- (progn
- (find-file opml-file)
- (xml-parse-region (point-min)
- (point-max))))))
+ (mm-with-multibyte-buffer
+ (insert-file-contents opml-file)
+ (xml-parse-region (point-min) (point-max))))))
(defun nnrss-opml-export ()
"OPML subscription export.
(selection
(mapcar (lambda (listinfo)
(cons (cdr (assoc "sitename" listinfo))
- (string-to-int
+ (string-to-number
(cdr (assoc "feedid" listinfo)))))
feedinfo)))
(cdr (assoc
;;; nnslashdot.el --- interfacing with Slashdot
-;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(nnslashdot-possibly-change-server group server)
(condition-case why
(unless gnus-nov-is-evil
- (nnslashdot-retrieve-headers-1 articles group))
+ (nnslashdot-retrieve-headers-1 articles group))
(search-failed (nnslashdot-lose why))))
(deffoo nnslashdot-retrieve-headers-1 (articles group)
(setq article (if (and article (< start article)) article start))
(goto-char point)
(while (re-search-forward
- "<a name=\"\\([0-9]+\\)\"><\\(b\\|H4\\)>\\([^<]+\\)</\\(b\\|H4\\)>.*score:\\([^)]+\\))"
+ "<a name=\"\\([0-9]+\\)\">\\([^<]+\\)</a>.*\n.*\n.*score:\\([^)]+\\))"
nil t)
(setq cid (match-string 1)
- subject (match-string 3)
- score (match-string 5))
+ subject (match-string 2)
+ score (match-string 3))
(unless (assq article (nth 4 entry))
(setcar (nthcdr 4 entry) (cons (cons article cid) (nth 4 entry)))
(setq changed t))
(when (string-match "^Re: *" subject)
(setq subject (concat "Re: " (substring subject (match-end 0)))))
- (setq subject (mm-url-decode-entities-string subject))
- (search-forward "<BR>")
- (cond
- ((looking-at
- "by[ \t\n]+<a[^>]+>\\([^<]+\\)</a>[ \t\n]*(\\(<[^>]+>\\)*\\([^<>)]+\\))")
- (goto-char (- (match-end 0) 5))
- (setq from (concat
- (mm-url-decode-entities-string (match-string 1))
- " <" (match-string 3) ">")))
- ((looking-at "by[ \t\n]+<a[^>]+>\\([^<(]+\\) (\\([0-9]+\\))</a>")
- (goto-char (- (match-end 0) 5))
- (setq from (concat
- (mm-url-decode-entities-string (match-string 1))
- " <" (match-string 2) ">")))
- ((looking-at "by \\([^<>]*\\)[\t\n\r ]+on ")
- (goto-char (- (match-end 0) 5))
- (setq from (mm-url-decode-entities-string (match-string 1))))
- (t
- (setq from "")))
+ (setq subject (mm-url-decode-entities-string subject)
+ from "")
+ (when (re-search-forward "by[ \t\n]+<[^>]+>\\([^<(]+\\)" nil t)
+ (setq from
+ (concat
+ (mm-url-decode-entities-string (match-string 1))
+ " <nobody@slashdot.org>")))
(search-forward "on ")
(setq date
(nnslashdot-date-to-date
- (buffer-substring (point) (progn (skip-chars-forward "^()<>\n\r") (point)))))
- (setq lines (/ (abs (- (search-forward "<td")
- (search-forward "</td>")))
+ (buffer-substring
+ (point) (progn (skip-chars-forward "^()<>\n\r") (point)))))
+ (setq lines (/ (abs (- (search-forward "<div")
+ (search-forward "</div>")))
70))
(if (not
(re-search-forward ".*cid=\\([0-9]+\\)\">Parent</A>" nil t))
(if (= article 1)
(progn
(search-forward "Posted by")
- (search-forward "<BR>")
+ (search-forward "<div class=\"intro\">")
(setq contents
(buffer-substring
(point)
(progn
- (re-search-forward
- "<IFRAME\\|<SCRIPT LANGUAGE=\"JAVASCRIPT\">\\|<!-- no ad 6 -->\\|< [ \t\r\n]*<A HREF=\"\\(\\(http:\\)?//slashdot\\.org\\)?/article")
+ (search-forward "commentwrap")
(match-beginning 0)))))
(setq cid (cdr (assq article
(nth 4 (assoc group nnslashdot-groups)))))
(search-forward (format "<a name=\"%s\">" cid))
(setq contents
(buffer-substring
- (re-search-forward "<td[^>]*>")
- (search-forward "</td>")))))))
+ (search-forward "<div class=\"commentBody\">")
+ (search-forward "</div>")))))))
(search-failed (nnslashdot-lose why)))
(when contents
;;; nnsoup.el --- SOUP access for Gnus
-;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+;; 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(let ((files (sort (directory-files nnsoup-directory t "IDX$")
(lambda (f1 f2)
(< (progn (string-match "/\\([0-9]+\\)\\." f1)
- (string-to-int (match-string 1 f1)))
+ (string-to-number (match-string 1 f1)))
(progn (string-match "/\\([0-9]+\\)\\." f2)
- (string-to-int (match-string 1 f2)))))))
+ (string-to-number (match-string 1 f2)))))))
active group lines ident elem min)
(set-buffer (get-buffer-create " *nnsoup work*"))
(dolist (file files)
;;; nnspool.el --- spool access for GNU Emacs
;; Copyright (C) 1988, 1989, 1990, 1993, 1994, 1995, 1996, 1997, 1998,
-;; 2000, 2002, 2003
-;; Free Software Foundation, Inc.
+;; 2000, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
;; Lars Magne Ingebrigtsen <larsi@gnus.org>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;; Yes, completely empty spool directories *are* possible.
;; Fix by Sudish Joseph <joseph@cis.ohio-state.edu>
(when (setq dir (directory-files pathname nil "^[0-9]+$" t))
- (setq dir (sort (mapcar 'string-to-int dir) '<)))
+ (setq dir (sort (mapcar 'string-to-number dir) '<)))
(if dir
(nnheader-insert
"211 %d %d %d %s\n" (length dir) (car dir)
(call-process "grep" nil t nil (regexp-quote id) nnspool-history-file))
(goto-char (point-min))
(when (looking-at "<[^>]+>[ \t]+[-0-9~]+[ \t]+\\([^ /\t\n]+\\)/\\([0-9]+\\)[ \t\n]")
- (cons (match-string 1) (string-to-int (match-string 2))))))
+ (cons (match-string 1) (string-to-number (match-string 2))))))
(defun nnspool-find-file (file)
"Insert FILE in server buffer safely."
;;; nntp.el --- nntp access for Gnus
-;; Copyright (C) 1987, 1988, 1989, 1990, 1992, 1993, 1994, 1995, 1996,
-;; 1997, 1998, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+;; Copyright (C) 1987, 1988, 1989, 1990, 1992, 1993,
+;; 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002,
+;; 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+;; Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+;; MA 02110-1301, USA.
;;; Commentary:
(defvoo nntp-end-of-line "\r\n"
"*String to use on the end of lines when talking to the NNTP server.
-This is \"\\r\\n\" by default, but should be \"\\n\" when using and
-indirect telnet connection method (nntp-open-via-*-and-telnet).")
+This is \"\\r\\n\" by default, but should be \"\\n\" when using an indirect
+connection method (nntp-open-via-*).")
(defvoo nntp-via-rlogin-command "rsh"
"*Rlogin command used to connect to an intermediate host.
server there that you can connect to. See also
`nntp-open-connection-function'")
-(defvoo nntp-warn-about-losing-connection t
- "*If non-nil, beep when a server closes connection.")
-
(defvoo nntp-coding-system-for-read 'binary
"*Coding system to read from NNTP.")
(defcustom nntp-marks-directory
(nnheader-concat gnus-directory "marks/")
"*The directory where marks for nntp groups will be stored."
- :group 'gnus
+ :group 'nntp
:type 'directory)
(defcustom nntp-authinfo-file "~/.authinfo"
(defvar nntp-async-timer nil)
(defvar nntp-async-process-list nil)
-(defvar nntp-ssl-program
+(defvar nntp-ssl-program
"openssl s_client -quiet -ssl3 -connect %s:%p"
"A string containing commands for SSL connections.
Within a string, %s is replaced with the server address and %p with
port number on server. The program should accept IMAP commands on
stdin and return responses to stdout.")
+(defvar nntp-authinfo-rejected nil
+"A custom error condition used to report 'Authentication Rejected' errors.
+Condition handlers that match just this condition ensure that the nntp
+backend doesn't catch this error.")
+(put 'nntp-authinfo-rejected 'error-conditions '(error nntp-authinfo-rejected))
+(put 'nntp-authinfo-rejected 'error-message "Authorization Rejected")
+
\f
;;; Internal functions.
(defsubst nntp-wait-for (process wait-for buffer &optional decode discard)
"Wait for WAIT-FOR to arrive from PROCESS."
+
(save-excursion
(set-buffer (process-buffer process))
(goto-char (point-min))
+
(while (and (or (not (memq (char-after (point)) '(?2 ?3 ?4 ?5)))
- (looking-at "480"))
+ (looking-at "48[02]"))
(memq (process-status process) '(open run)))
- (when (looking-at "480")
- (nntp-handle-authinfo process))
- (when (looking-at "^.*\n")
- (delete-region (point) (progn (forward-line 1) (point))))
+ (cond ((looking-at "480")
+ (nntp-handle-authinfo process))
+ ((looking-at "482")
+ (nnheader-report 'nntp (get 'nntp-authinfo-rejected 'error-message))
+ (signal 'nntp-authinfo-rejected nil))
+ ((looking-at "^.*\n")
+ (delete-region (point) (progn (forward-line 1) (point)))))
(nntp-accept-process-output process)
(goto-char (point-min)))
(prog1
(wait-for
(nntp-wait-for process wait-for buffer decode))
(t t)))
+ (nntp-authinfo-rejected
+ (signal 'nntp-authinfo-rejected (cdr err)))
(error
(nnheader-report 'nntp "Couldn't open connection to %s: %s"
address err))
;; a line with only a "." on it.
((eq (char-after) ?2)
(if (re-search-forward "\n\\.\r?\n" nil t)
- t
+ (progn
+ ;; Some broken news servers add another dot at the end.
+ ;; Protect against inflooping there.
+ (while (looking-at "^\\.\r?\n")
+ (forward-line 1))
+ t)
nil))
;; A result that starts with a 3xx or 4xx code is terminated
;; by a newline.
(condition-case nil
(progn ,@forms)
(quit
- (nntp-close-server)
+ (unless debug-on-quit
+ (nntp-close-server))
(signal 'quit nil))))
(when timer
(nnheader-cancel-timer timer)))
(if (numberp article) (int-to-string article) article))))
(deffoo nntp-request-group (group &optional server dont-check)
- (nntp-with-open-group
+ (nntp-with-open-group
nil server
(when (nntp-send-command "^[245].*\n" "GROUP" group)
(let ((entry (nntp-find-connection-entry nntp-server-buffer)))
(nntp-kill-buffer pbuffer))
(when (and (buffer-name pbuffer)
process)
- (process-kill-without-query process)
+ (gnus-set-process-query-on-exit-flag process nil)
(if (and (nntp-wait-for process "^2.*\n" buffer nil t)
(memq (process-status process) '(open run)))
(prog1
(defun nntp-open-network-stream (buffer)
(open-network-stream "nntpd" buffer nntp-address nntp-port-number))
-(autoload 'format-spec "format")
-(autoload 'format-spec-make "format")
-(autoload 'open-tls-stream "tls")
+(eval-and-compile
+ (autoload 'format-spec "format-spec")
+ (autoload 'format-spec-make "format-spec")
+ (autoload 'open-tls-stream "tls"))
(defun nntp-open-ssl-stream (buffer)
(let* ((process-connection-type nil)
- (proc (start-process "nntpd" buffer
+ (proc (start-process "nntpd" buffer
shell-file-name
shell-command-switch
- (format-spec nntp-ssl-program
+ (format-spec nntp-ssl-program
(format-spec-make
?s nntp-address
?p nntp-port-number)))))
- (process-kill-without-query proc)
+ (gnus-set-process-query-on-exit-flag proc nil)
(save-excursion
(set-buffer buffer)
(let ((nntp-connection-alist (list proc buffer nil)))
(defun nntp-open-tls-stream (buffer)
(let ((proc (open-tls-stream "nntpd" buffer nntp-address nntp-port-number)))
- (process-kill-without-query proc)
+ (gnus-set-process-query-on-exit-flag proc nil)
(save-excursion
(set-buffer buffer)
(let ((nntp-connection-alist (list proc buffer nil)))
;; that the server has closed the connection. This MUST be
;; handled here as the buffer restored by the save-excursion may
;; be the process's former output buffer (i.e. now killed)
- (or (and process
+ (or (and process
(memq (process-status process) '(open run)))
(nntp-report "Server closed connection"))))
(when (<= count 1)
(goto-char (point-min))
(when (re-search-forward "^[0-9][0-9][0-9] .*\n\\([0-9]+\\)" nil t)
- (let ((low-limit (string-to-int
- (buffer-substring (match-beginning 1)
+ (let ((low-limit (string-to-number
+ (buffer-substring (match-beginning 1)
(match-end 1)))))
(while (and articles (<= (car articles) low-limit))
(setq articles (cdr articles))))))
(goto-char (point-min))
;; We first find the number by looking at the status line.
(let ((number (and (looking-at "2[0-9][0-9] +\\([0-9]+\\) ")
- (string-to-int
+ (string-to-number
(buffer-substring (match-beginning 1)
(match-end 1)))))
newsgroups xref)
"\\([^ :]+\\):\\([0-9]+\\)")
xref))
(setq group (match-string 1 xref)
- number (string-to-int (match-string 2 xref))))
+ number (string-to-number (match-string 2 xref))))
((and (setq newsgroups
(mail-fetch-field "newsgroups"))
(not (string-match "," newsgroups)))
(make-directory (directory-file-name dir) t)
(nnheader-message 5 "Creating nntp marks directory %s" dir))))
-(autoload 'time-less-p "time-date")
+(eval-and-compile
+ (autoload 'time-less-p "time-date"))
(defun nntp-marks-changed-p (group server)
(let ((file (expand-file-name
;;; nnultimate.el --- interfacing with the Ultimate Bulletin Board system
-;; Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
+;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; nnvirtual.el --- virtual newsgroups access for Gnus
-;; Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+;; 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: David Moore <dmoore@ucsd.edu>
;; Lars Magne Ingebrigtsen <larsi@gnus.org>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; nnwarchive.el --- interfacing with web archives
-;; Copyright (C) 1999, 2000, 2003 Free Software Foundation, Inc.
+
+;; Copyright (C) 1999, 2000, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
;; Keywords: news egroups mail-archive
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; nnweb.el --- retrieving articles via web search engines
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+;; 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(defvar nnweb-type-definition
'((google
- (article . ignore)
- (id . "http://groups.google.de/groups?selm=%s&output=gplain")
+ (id . "http://www.google.com/groups?as_umsgid=%s&hl=en&dmode=source")
+ (result . "http://groups.google.com/group/%s/msg/%s?dmode=source")
+ (article . nnweb-google-wash-article)
(reference . identity)
(map . nnweb-google-create-mapping)
(search . nnweb-google-search)
- (address . "http://groups.google.de/groups")
- (base . "http://groups.google.de")
+ (address . "http://groups.google.com/groups")
+ (base . "http://groups.google.com")
(identifier . nnweb-google-identity))
(dejanews ;; alias of google
- (article . ignore)
- (id . "http://groups.google.com/groups?selm=%s&output=gplain")
+ (id . "http://www.google.com/groups?as_umsgid=%s&hl=en&dmode=source")
+ (result . "http://groups.google.com/group/%s/msg/%s?dmode=source")
+ (article . nnweb-google-wash-article)
(reference . identity)
(map . nnweb-google-create-mapping)
(search . nnweb-google-search)
(reference . identity)
(map . nnweb-gmane-create-mapping)
(search . nnweb-gmane-search)
- (address . "http://gmane.org/")
+ (address . "http://search.gmane.org/nov.php")
(identifier . nnweb-gmane-identity)))
"Type-definition alist.")
(deffoo nnweb-request-scan (&optional group server)
(nnweb-possibly-change-server group server)
(if nnweb-ephemeral-p
- (setq nnweb-hashtb (gnus-make-hashtable 4095)))
+ (setq nnweb-hashtb (gnus-make-hashtable 4095))
+ (unless nnweb-articles
+ (nnweb-read-overview group)))
(funcall (nnweb-definition 'map))
(unless nnweb-ephemeral-p
(nnweb-write-active)
(nnweb-write-overview group)))
(deffoo nnweb-request-group (group &optional server dont-check)
- (nnweb-possibly-change-server nil server)
- (when (and group
- (not (equal group nnweb-group))
- (not nnweb-ephemeral-p))
- (setq nnweb-group group
- nnweb-articles nil)
- (let ((info (assoc group nnweb-group-alist)))
- (when info
- (setq nnweb-type (nth 2 info))
- (setq nnweb-search (nth 3 info))
- (unless dont-check
- (nnweb-read-overview group)))))
+ (nnweb-possibly-change-server group server)
+ (unless (or nnweb-ephemeral-p
+ dont-check
+ nnweb-articles)
+ (nnweb-read-overview group))
(cond
((not nnweb-articles)
(nnheader-report 'nnweb "No matching articles"))
(nnweb-possibly-change-server nil server)
(save-excursion
(set-buffer nntp-server-buffer)
- (nnmail-generate-active nnweb-group-alist)
+ (nnmail-generate-active (list (assoc server nnweb-group-alist)))
t))
(deffoo nnweb-request-update-info (group info &optional server)
(deffoo nnweb-request-create-group (group &optional server args)
(nnweb-possibly-change-server nil server)
(nnweb-request-delete-group group)
- (push `(,group ,(cons 1 0) ,@args) nnweb-group-alist)
+ (push `(,group ,(cons 1 0)) nnweb-group-alist)
(nnweb-write-active)
t)
def))
(defun nnweb-possibly-change-server (&optional group server)
- (nnweb-init server)
(when server
(unless (nnweb-server-opened server)
- (nnweb-open-server server)))
+ (nnweb-open-server server))
+ (nnweb-init server))
(unless nnweb-group-alist
(nnweb-read-active))
(unless nnweb-hashtb
(setq nnweb-hashtb (gnus-make-hashtable 4095)))
(when group
- (when (and (not nnweb-ephemeral-p)
- (equal group nnweb-group))
- (nnweb-request-group group nil t))))
+ (setq nnweb-group group)))
(defun nnweb-init (server)
"Initialize buffers and such."
(current-buffer))))))
;;;
-;;; Deja bought by google.com
+;;; groups.google.com
;;;
(defun nnweb-google-wash-article ()
- (let ((case-fold-search t) url)
+ ;; We have Google's masked e-mail addresses here. :-/
+ (let ((case-fold-search t)
+ (start-re "<pre>\n *")
+ (end-re "\n *</pre>"))
(goto-char (point-min))
- (re-search-forward "^<pre>" nil t)
- (narrow-to-region (point-min) (point))
- (search-backward "<table " nil t 2)
- (delete-region (point-min) (point))
- (if (re-search-forward "Search Result [0-9]+" nil t)
- (replace-match ""))
- (if (re-search-forward "View complete thread ([0-9]+ articles?)" nil t)
- (replace-match ""))
- (goto-char (point-min))
- (while (search-forward "<br>" nil t)
- (replace-match "\n"))
- (mm-url-remove-markup)
- (goto-char (point-min))
- (while (re-search-forward "^[ \t]*\n" nil t)
- (replace-match ""))
- (goto-char (point-max))
- (insert "\n")
- (widen)
- (narrow-to-region (point) (point-max))
- (search-forward "</pre>" nil t)
- (delete-region (point) (point-max))
- (mm-url-remove-markup)
- (widen)))
+ (if (save-excursion
+ (or (re-search-forward "The requested message.*could not be found."
+ nil t)
+ (not (and (re-search-forward start-re nil t)
+ (re-search-forward end-re nil t)))))
+ ;; FIXME: Don't know how to indicate "not found".
+ ;; Should this function throw an error? --rsteib
+ (progn
+ (gnus-message 3 "Requested article not found")
+ (erase-buffer))
+ (delete-region (point-min)
+ (re-search-forward start-re))
+ (goto-char (point-min))
+ (delete-region (progn
+ (re-search-forward end-re)
+ (match-beginning 0))
+ (point-max))
+ (mm-url-decode-entities))))
(defun nnweb-google-parse-1 (&optional Message-ID)
+ "Parse search result in current buffer."
(let ((i 0)
(case-fold-search t)
(active (cadr (assoc nnweb-group nnweb-group-alist)))
Subject Score Date Newsgroups From
map url mid)
(unless active
- (push (list nnweb-group (setq active (cons 1 0))
- nnweb-type nnweb-search)
+ (push (list nnweb-group (setq active (cons 1 0)))
nnweb-group-alist))
;; Go through all the article hits on this page.
(goto-char (point-min))
- (while (re-search-forward
- "a href=/groups\\(\\?[^ \">]*selm=\\([^ &\">]+\\)\\)" nil t)
- (setq mid (match-string 2)
+ (while
+ (re-search-forward
+ "a +href=\"/group/\\([^>\"]+\\)/browse_thread/[^>]+#\\([0-9a-f]+\\)"
+ nil t)
+ (setq Newsgroups (match-string-no-properties 1)
+ ;; Note: Starting with Google Groups 2, `mid' is a Google-internal
+ ;; ID, not a proper Message-ID.
+ mid (match-string-no-properties 2)
url (format
- (nnweb-definition 'id) mid))
+ (nnweb-definition 'result) Newsgroups mid))
(narrow-to-region (search-forward ">" nil t)
(search-forward "</a>" nil t))
(mm-url-remove-markup)
(setq Subject (buffer-string))
(goto-char (point-max))
(widen)
- (forward-line 2)
- (when (looking-at "<br><font[^>]+>")
- (goto-char (match-end 0)))
- (if (not (looking-at "<a[^>]+>"))
- (skip-chars-forward " \t")
- (narrow-to-region (point)
- (search-forward "</a>" nil t))
- (mm-url-remove-markup)
- (mm-url-decode-entities)
- (setq Newsgroups (buffer-string))
- (goto-char (point-max))
- (widen)
- (skip-chars-forward "- \t"))
+ (narrow-to-region (point)
+ (search-forward "</td" nil t))
+
+ (mm-url-remove-markup)
+ (mm-url-decode-entities)
+ (search-backward " - ")
(when (looking-at
- "\\([0-9]+\\)[/ ]\\([A-Za-z]+\\)[/ ]\\([0-9]+\\)[ \t]*by[ \t]*\\([^<]*\\) - <a")
+ " - \\([a-zA-Z]+\\) \\([0-9]+\\)\\(?: \\([0-9]\\{4\\}\\)\\)?, [^\n]+by \\([^<\n]+\\)\n")
(setq From (match-string 4)
Date (format "%s %s 00:00:00 %s"
- (match-string 2) (match-string 1)
- (match-string 3))))
+ (match-string 1)
+ (match-string 2)
+ (or (match-string 3)
+ (substring (current-time-string) -4)))))
+
+ (widen)
(forward-line 1)
(incf i)
(unless (nnweb-get-hashtb url)
(save-excursion
(set-buffer nnweb-buffer)
(erase-buffer)
+ (nnheader-message 7 "Searching google...")
(when (funcall (nnweb-definition 'search) nnweb-search)
(let ((more t)
(i 0))
(goto-char (point-min))
(incf i 100)
(if (or (not (re-search-forward
- "<td nowrap><a href=\\([^>]+\\).*<span class=b>Next</span>" nil t))
+ "<a href=\"\n\\([^>\" \n\t]+\\)[^<]*<img src=[^>]+next"
+ nil t))
(>= i nnweb-max-hits))
(setq more nil)
;; Yup, there are more articles
(setq more (concat (nnweb-definition 'base) (match-string 1)))
(when more
(erase-buffer)
+ (nnheader-message 7 "Searching google...(%d)" i)
(mm-url-insert more))))
;; Return the articles in the right order.
+ (nnheader-message 7 "Searching google...done")
(setq nnweb-articles
(sort nnweb-articles 'car-less-than-car))))))
("hl" . "en")
("lr" . "")
("safe" . "off")
- ("sites" . "groups")))))
+ ("sites" . "groups")
+ ("filter" . "0")))))
t)
(defun nnweb-google-identity (url)
"Perform the search and create a number-to-url alist."
(save-excursion
(set-buffer nnweb-buffer)
- (erase-buffer)
- (when (funcall (nnweb-definition 'search) nnweb-search)
- (let ((more t)
- (case-fold-search t)
- (active (or (cadr (assoc nnweb-group nnweb-group-alist))
- (cons 1 0)))
- subject group url
- map)
- ;; Remove stuff from the beginning of results
+ (let ((case-fold-search t)
+ (active (or (cadr (assoc nnweb-group nnweb-group-alist))
+ (cons 1 0)))
+ map)
+ (erase-buffer)
+ (nnheader-message 7 "Searching Gmane..." )
+ (when (funcall (nnweb-definition 'search) nnweb-search)
(goto-char (point-min))
- (search-forward "Search Results</h1><ul>" nil t)
- (delete-region (point-min) (point))
- (goto-char (point-min))
- ;; Iterate over the actual hits
- (while (re-search-forward ".*href=\"\\([^\"]+\\)\">\\(.*\\)" nil t)
- (setq url (concat "http://gmane.org/" (match-string 1)))
- (setq subject (match-string 2))
- (unless (nnweb-get-hashtb url)
- (push
- (list
- (incf (cdr active))
- (make-full-mail-header
- (cdr active) (concat "(" group ") " subject) nil nil
- nil nil 0 0 url))
- map)
- (nnweb-set-hashtb (cadar map) (car map))))
- ;; Return the articles in the right order.
- (setq nnweb-articles
- (sort (nconc nnweb-articles map) 'car-less-than-car))))))
+ ;; Skip the status line
+ (forward-line 1)
+ ;; Thanks to Olly Betts we now have NOV lines in our buffer!
+ (while (not (eobp))
+ (unless (or (eolp) (looking-at "\x0d"))
+ (let ((header (nnheader-parse-nov)))
+ (let ((xref (mail-header-xref header))
+ (from (mail-header-from header))
+ (subject (mail-header-subject header))
+ (rfc2047-encoding-type 'mime))
+ (when (string-match " \\([^:]+\\):\\([0-9]+\\)" xref)
+ (mail-header-set-xref
+ header
+ (format "http://article.gmane.org/%s/%s/raw"
+ (match-string 1 xref)
+ (match-string 2 xref))))
+
+ ;; Add host part to gmane-encrypted addresses
+ (when (string-match "@$" from)
+ (mail-header-set-from header
+ (concat from "public.gmane.org")))
+
+ (mail-header-set-subject header
+ (rfc2047-encode-string subject))
+
+ (unless (nnweb-get-hashtb (mail-header-xref header))
+ (push
+ (list
+ (incf (cdr active))
+ header)
+ map)
+ (nnweb-set-hashtb (cadar map) (car map))))))
+ (forward-line 1)))
+ (nnheader-message 7 "Searching Gmane...done")
+ (setq nnweb-articles
+ (sort (nconc nnweb-articles map) 'car-less-than-car)))))
(defun nnweb-gmane-wash-article ()
(let ((case-fold-search t))
(goto-char (point-min))
- (search-forward "<!--X-Head-of-Message-->" nil t)
- (delete-region (point-min) (point))
- (goto-char (point-min))
- (while (looking-at "^<li><em>\\([^ ]+\\)</em>.*</li>")
- (replace-match "\\1\\2" t)
- (forward-line 1))
- (mm-url-remove-markup)))
+ (when (search-forward "<!--X-Head-of-Message-->" nil t)
+ (delete-region (point-min) (point))
+ (goto-char (point-min))
+ (while (looking-at "^<li><em>\\([^ ]+\\)</em>.*</li>")
+ (replace-match "\\1\\2" t)
+ (forward-line 1))
+ (mm-url-remove-markup))))
(defun nnweb-gmane-search (search)
(mm-url-insert
(nnweb-definition 'address)
"?"
(mm-url-encode-www-form-urlencoded
- `(("query" . ,search)))))
+ `(("query" . ,search)
+ ("HITSPERPAGE" . ,(number-to-string nnweb-max-hits))))))
(setq buffer-file-name nil)
+ (set-buffer-multibyte t)
+ (mm-decode-coding-region (point-min) (point-max) 'utf-8)
t)
-
(defun nnweb-gmane-identity (url)
"Return a unique identifier based on URL."
(if (string-match "group=\\(.+\\)" url)
;;; nnwfm.el --- interfacing with a web forum
-;; Copyright (C) 2000 Free Software Foundation, Inc.
+
+;; Copyright (C) 2000, 2002, 2003, 2004, 2005,
+;; 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;
;; You should have received a copy of the GNU General Public License
;; along with this program; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; parse-time.el --- Parsing time strings
-;; Copyright (C) 1996, 2000, 2002 by Free Software Foundation, Inc.
+;; Copyright (C) 1996, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+;; Free Software Foundation, Inc.
;; Author: Erik Naggum <erik@naggum.no>
;; Keywords: util
;; 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.
+;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; password.el --- Read passwords from user, possibly using a password cache.
-;; Copyright (C) 1999, 2000, 2003, 2004 Free Software Foundation, Inc.
+;; Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Simon Josefsson <simon@josefsson.org>
;; Created: 2003-12-21
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(defvar password-data (make-vector 7 0))
+(defun password-read-from-cache (key)
+ "Obtain passphrase for KEY from time-limited passphrase cache.
+Custom variables `password-cache' and `password-cache-expiry'
+regulate cache behavior."
+ (and password-cache
+ key
+ (symbol-value (intern-soft key password-data))))
+
(defun password-read (prompt &optional key)
"Read password, for use with KEY, from user, or from cache if wanted.
KEY indicate the purpose of the password, so the cache can
separate passwords. The cache is not used if KEY is nil. It is
typically a string.
The variable `password-cache' control whether the cache is used."
- (or (and password-cache
- key
- (symbol-value (intern-soft key password-data)))
+ (or (password-read-from-cache key)
(read-passwd prompt)))
(defun password-read-and-add (prompt &optional key)
"Read password, for use with KEY, from user, or from cache if wanted.
Then store the password in the cache. Uses `password-read' and
-`password-cache-add'."
+`password-cache-add'.
+Custom variables `password-cache' and `password-cache-expiry'
+regulate cache behavior."
(let ((password (password-read prompt key)))
(when (and password key)
(password-cache-add key password))
(set (intern key password-data) password)
nil)
+(defun password-reset ()
+ "Clear the password cache."
+ (interactive)
+ (fillarray password-data 0))
+
(provide 'password)
;;; arch-tag: ab160494-16c8-4c68-a4a1-73eebf6686e5
;;; pgg-def.el --- functions/macros for defining PGG functions
-;; Copyright (C) 1999, 2003 Free Software Foundation, Inc.
+;; Copyright (C) 1999, 2002, 2003, 2004, 2005,
+;; 2006 Free Software Foundation, Inc.
;; Author: Daiki Ueno <ueno@unixuser.org>
;; Created: 1999/11/02
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Code:
(defvar pgg-scheme nil
"Current scheme of PGP implementation.")
+(defvar pgg-text-mode nil
+ "If t, inform the recipient that the input is text.")
+
(defmacro pgg-truncate-key-identifier (key)
`(if (> (length ,key) 8) (substring ,key 8) ,key))
;;; pgg-gpg.el --- GnuPG support for PGG.
-;; Copyright (C) 1999, 2000, 2003, 2004 Free Software Foundation, Inc.
+;; Copyright (C) 1999, 2000, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Daiki Ueno <ueno@unixuser.org>
+;; Symmetric encryption support added by: Sascha Wilde <wilde@sha-bang.de>
;; Created: 1999/10/28
;; Keywords: PGP, OpenPGP, GnuPG
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Code:
(eval-when-compile
- (require 'cl) ; for gpg macros
(require 'pgg))
(defgroup pgg-gpg ()
- "GnuPG interface"
+ "GnuPG interface."
:group 'pgg)
(defcustom pgg-gpg-program "gpg"
:type '(choice (const :tag "New `--recipient' option" "--recipient")
(const :tag "Old `--remote-user' option" "--remote-user")))
+(defcustom pgg-gpg-use-agent nil
+ "Whether to use gnupg agent for key caching."
+ :group 'pgg-gpg
+ :type 'boolean)
+
(defvar pgg-gpg-user-id nil
"GnuPG ID of your default identity.")
-(defun pgg-gpg-process-region (start end passphrase program args)
+(defvar pgg-gpg-user-id-alist nil
+ "An alist mapping from key ID to user ID.")
+
+(defvar pgg-gpg-read-point nil)
+(defvar pgg-gpg-output-file-name nil)
+(defvar pgg-gpg-pending-status-list nil)
+(defvar pgg-gpg-key-id nil)
+(defvar pgg-gpg-passphrase nil)
+(defvar pgg-gpg-debug nil)
+
+(defun pgg-gpg-start-process (args)
(let* ((output-file-name (pgg-make-temp-file "pgg-output"))
(args
- `("--status-fd" "2"
- ,@(if passphrase '("--passphrase-fd" "0"))
- "--yes" ; overwrite
- "--output" ,output-file-name
- ,@pgg-gpg-extra-args ,@args))
- (output-buffer pgg-output-buffer)
- (errors-buffer pgg-errors-buffer)
- (orig-mode (default-file-modes))
+ (append (list "--no-tty"
+ "--status-fd" "1"
+ "--command-fd" "0"
+ "--yes" ; overwrite
+ "--output" output-file-name)
+ (if pgg-gpg-use-agent '("--use-agent"))
+ pgg-gpg-extra-args
+ args))
+ (coding-system-for-write 'binary)
(process-connection-type nil)
- exit-status)
- (with-current-buffer (get-buffer-create errors-buffer)
- (buffer-disable-undo)
- (erase-buffer))
+ (orig-mode (default-file-modes))
+ (buffer (generate-new-buffer " *pgg-gpg*"))
+ process)
+ (with-current-buffer buffer
+ (make-local-variable 'pgg-gpg-read-point)
+ (setq pgg-gpg-read-point (point-min))
+ (make-local-variable 'pgg-gpg-output-file-name)
+ (setq pgg-gpg-output-file-name output-file-name)
+ (make-local-variable 'pgg-gpg-pending-status-list)
+ (setq pgg-gpg-pending-status-list nil)
+ (make-local-variable 'pgg-gpg-key-id)
+ (setq pgg-gpg-key-id nil)
+ (make-local-variable 'pgg-gpg-passphrase)
+ (setq pgg-gpg-passphrase nil))
(unwind-protect
(progn
(set-default-file-modes 448)
- (let ((coding-system-for-write 'binary)
- (input (buffer-substring-no-properties start end))
- (default-enable-multibyte-characters nil))
- (with-temp-buffer
- (when passphrase
- (insert passphrase "\n"))
- (insert input)
- (setq exit-status
- (apply #'call-process-region (point-min) (point-max) program
- nil errors-buffer nil args))))
- (with-current-buffer (get-buffer-create output-buffer)
- (buffer-disable-undo)
- (erase-buffer)
- (if (file-exists-p output-file-name)
- (let ((coding-system-for-read 'raw-text-dos))
- (insert-file-contents output-file-name)))
- (set-buffer errors-buffer)
- (if (not (equal exit-status 0))
- (insert (format "\n%s exited abnormally: '%s'\n"
- program exit-status)))))
- (if (file-exists-p output-file-name)
- (delete-file output-file-name))
- (set-default-file-modes orig-mode))))
-
-(defun pgg-gpg-possibly-cache-passphrase (passphrase &optional key)
- (if (and pgg-cache-passphrase
- (progn
- (goto-char (point-min))
- (re-search-forward "^\\[GNUPG:] GOOD_PASSPHRASE\\>" nil t)))
- (pgg-add-passphrase-cache
- (or key
- (progn
- (goto-char (point-min))
- (if (re-search-forward
- "^\\[GNUPG:] NEED_PASSPHRASE \\w+ ?\\w*" nil t)
- (substring (match-string 0) -8))))
- passphrase)))
-
-(defvar pgg-gpg-all-secret-keys 'unknown)
-
-(defun pgg-gpg-lookup-all-secret-keys ()
- "Return all secret keys present in secret key ring."
- (when (eq pgg-gpg-all-secret-keys 'unknown)
- (setq pgg-gpg-all-secret-keys '())
- (let ((args (list "--with-colons" "--no-greeting" "--batch"
- "--list-secret-keys")))
- (with-temp-buffer
- (apply #'call-process pgg-gpg-program nil t nil args)
- (goto-char (point-min))
- (while (re-search-forward
- "^\\(sec\\|pub\\):[^:]*:[^:]*:[^:]*:\\([^:]*\\)" nil t)
- (push (substring (match-string 2) 8)
- pgg-gpg-all-secret-keys)))))
- pgg-gpg-all-secret-keys)
+ (setq process
+ (apply #'start-process "pgg-gpg" buffer pgg-gpg-program args)))
+ (set-default-file-modes orig-mode))
+ (set-process-filter process #'pgg-gpg-process-filter)
+ (set-process-sentinel process #'pgg-gpg-process-sentinel)
+ process))
+
+(defun pgg-gpg-process-filter (process input)
+ (if pgg-gpg-debug
+ (save-excursion
+ (set-buffer (get-buffer-create " *pgg-gpg-debug*"))
+ (goto-char (point-max))
+ (insert input)))
+ (if (buffer-live-p (process-buffer process))
+ (save-excursion
+ (set-buffer (process-buffer process))
+ (goto-char (point-max))
+ (insert input)
+ (goto-char pgg-gpg-read-point)
+ (beginning-of-line)
+ (while (looking-at ".*\n") ;the input line is finished
+ (save-excursion
+ (if (looking-at "\\[GNUPG:] \\([A-Z_]+\\)\\>.*")
+ (let* ((status (match-string 1))
+ (symbol (intern-soft (concat "pgg-gpg-status-"
+ status))))
+ (if (member status pgg-gpg-pending-status-list)
+ (setq pgg-gpg-pending-status-list nil))
+ (if (and symbol
+ (fboundp symbol))
+ (funcall symbol process (buffer-substring
+ (match-beginning 1)
+ (match-end 0)))))))
+ (forward-line))
+ (setq pgg-gpg-read-point (point)))))
+
+(defun pgg-gpg-process-sentinel (process status)
+ (if (buffer-live-p (process-buffer process))
+ (save-excursion
+ (set-buffer (process-buffer process))
+ (when pgg-gpg-passphrase
+ (fillarray pgg-gpg-passphrase 0)
+ (setq pgg-gpg-passphrase nil))
+ ;; Copy the contents of process-buffer to pgg-errors-buffer.
+ (set-buffer (get-buffer-create pgg-errors-buffer))
+ (buffer-disable-undo)
+ (erase-buffer)
+ (insert-buffer-substring (process-buffer process))
+ ;; Read the contents of the output file to pgg-output-buffer.
+ (set-buffer (get-buffer-create pgg-output-buffer))
+ (buffer-disable-undo)
+ (erase-buffer)
+ (if (equal status "finished\n")
+ (let ((output-file-name
+ (with-current-buffer (process-buffer process)
+ pgg-gpg-output-file-name)))
+ (when (file-exists-p output-file-name)
+ (let ((coding-system-for-read (if pgg-text-mode
+ 'raw-text
+ 'binary)))
+ (insert-file-contents output-file-name))
+ (delete-file output-file-name))))
+ (kill-buffer (process-buffer process)))))
+
+(defun pgg-gpg-wait-for-status (process status-list)
+ (with-current-buffer (process-buffer process)
+ (setq pgg-gpg-pending-status-list status-list)
+ (while (and (eq (process-status process) 'run)
+ pgg-gpg-pending-status-list)
+ (accept-process-output process 1))))
+
+(defun pgg-gpg-wait-for-completion (process)
+ (process-send-eof process)
+ (while (eq (process-status process) 'run)
+ ;; We can't use accept-process-output instead of sit-for here
+ ;; because it may cause an interrupt during the sentinel execution.
+ (sit-for 0.1)))
+
+(defun pgg-gpg-status-USERID_HINT (process line)
+ (if (string-match "\\`USERID_HINT \\([^ ]+\\) \\(.*\\)" line)
+ (let* ((key-id (match-string 1 line))
+ (user-id (match-string 2 line))
+ (entry (assoc key-id pgg-gpg-user-id-alist)))
+ (if entry
+ (setcdr entry user-id)
+ (setq pgg-gpg-user-id-alist (cons (cons key-id user-id)
+ pgg-gpg-user-id-alist))))))
+
+(defun pgg-gpg-status-NEED_PASSPHRASE (process line)
+ (if (string-match "\\`NEED_PASSPHRASE \\([^ ]+\\)" line)
+ (setq pgg-gpg-key-id (match-string 1 line))))
+
+(defun pgg-gpg-status-NEED_PASSPHRASE_SYM (process line)
+ (setq pgg-gpg-key-id 'SYM))
+
+(defun pgg-gpg-status-NEED_PASSPHRASE_PIN (process line)
+ (setq pgg-gpg-key-id 'PIN))
+
+(defun pgg-gpg-status-GET_HIDDEN (process line)
+ (let ((entry (assoc pgg-gpg-key-id pgg-gpg-user-id-alist)))
+ (if (setq pgg-gpg-passphrase
+ (if (eq pgg-gpg-key-id 'SYM)
+ (pgg-read-passphrase
+ "GnuPG passphrase for symmetric encryption: ")
+ (pgg-read-passphrase
+ (format "GnuPG passphrase for %s: "
+ (if entry
+ (cdr entry)
+ pgg-gpg-key-id))
+ (if (eq pgg-gpg-key-id 'PIN)
+ "PIN"
+ pgg-gpg-key-id))))
+ (process-send-string process (concat pgg-gpg-passphrase "\n")))))
+
+(defun pgg-gpg-status-GOOD_PASSPHRASE (process line)
+ (when (and pgg-gpg-passphrase
+ (stringp pgg-gpg-key-id))
+ (pgg-add-passphrase-to-cache pgg-gpg-key-id pgg-gpg-passphrase)
+ (setq pgg-gpg-passphrase nil)))
+
+(defun pgg-gpg-status-BAD_PASSPHRASE (process line)
+ (when pgg-gpg-passphrase
+ (fillarray pgg-gpg-passphrase 0)
+ (setq pgg-gpg-passphrase nil)))
(defun pgg-gpg-lookup-key (string &optional type)
"Search keys associated with STRING."
nil t)
(substring (match-string 2) 8)))))
-(defun pgg-gpg-encrypt-region (start end recipients &optional sign)
+(defun pgg-gpg-encrypt-region (start end recipients &optional sign passphrase)
"Encrypt the current region between START and END.
+
If optional argument SIGN is non-nil, do a combined sign and encrypt."
(let* ((pgg-gpg-user-id (or pgg-gpg-user-id pgg-default-user-id))
- (passphrase
- (when sign
- (pgg-read-passphrase
- (format "GnuPG passphrase for %s: " pgg-gpg-user-id)
- pgg-gpg-user-id)))
(args
(append
- (list "--batch" "--armor" "--always-trust" "--encrypt")
+ '("--armor" "--always-trust" "--encrypt")
+ (if pgg-text-mode '("--textmode"))
(if sign (list "--sign" "--local-user" pgg-gpg-user-id))
(if recipients
(apply #'nconc
(list pgg-gpg-recipient-argument rcpt))
(append recipients
(if pgg-encrypt-for-me
- (list pgg-gpg-user-id)))))))))
- (pgg-as-lbt start end 'CRLF
- (pgg-gpg-process-region start end passphrase pgg-gpg-program args))
- (when sign
- (with-current-buffer pgg-errors-buffer
- ;; Possibly cache passphrase under, e.g. "jas", for future sign.
- (pgg-gpg-possibly-cache-passphrase passphrase pgg-gpg-user-id)
- ;; Possibly cache passphrase under, e.g. B565716F, for future decrypt.
- (pgg-gpg-possibly-cache-passphrase passphrase)))
- (pgg-process-when-success)))
-
-(defun pgg-gpg-decrypt-region (start end)
- "Decrypt the current region between START and END."
- (let* ((current-buffer (current-buffer))
- (message-keys (with-temp-buffer
- (insert-buffer-substring current-buffer)
- (pgg-decode-armor-region (point-min) (point-max))))
- (secret-keys (pgg-gpg-lookup-all-secret-keys))
- (key (pgg-gpg-select-matching-key message-keys secret-keys))
- (pgg-gpg-user-id (or key pgg-gpg-user-id pgg-default-user-id))
- (passphrase
- (pgg-read-passphrase
- (format "GnuPG passphrase for %s: " pgg-gpg-user-id)
- pgg-gpg-user-id))
- (args '("--batch" "--decrypt")))
- (pgg-gpg-process-region start end passphrase pgg-gpg-program args)
- (with-current-buffer pgg-errors-buffer
- (pgg-gpg-possibly-cache-passphrase passphrase pgg-gpg-user-id)
- (goto-char (point-min))
- (re-search-forward "^\\[GNUPG:] DECRYPTION_OKAY\\>" nil t))))
+ (list pgg-gpg-user-id))))))))
+ (process (pgg-gpg-start-process args)))
+ (if (and sign (not pgg-gpg-use-agent))
+ (pgg-gpg-wait-for-status process '("BEGIN_SIGNING" "GOOD_PASSPHRASE")))
+ (process-send-region process start end)
+ (pgg-gpg-wait-for-completion process)
+ (save-excursion
+ (set-buffer (get-buffer-create pgg-errors-buffer))
+ (goto-char (point-max))
+ (not (null (re-search-backward "^\\[GNUPG:] END_ENCRYPTION\\>"
+ nil t))))))
+
+(defun pgg-gpg-encrypt-symmetric-region (start end &optional passphrase)
+ "Encrypt the current region between START and END with symmetric cipher."
+ (let* ((args
+ (append '("--armor" "--symmetric")
+ (if pgg-text-mode '("--textmode"))))
+ (process (pgg-gpg-start-process args)))
+ (pgg-gpg-wait-for-status process '("BEGIN_ENCRYPTION"))
+ (process-send-region process start end)
+ (pgg-gpg-wait-for-completion process)
+ (save-excursion
+ (set-buffer (get-buffer-create pgg-errors-buffer))
+ (goto-char (point-max))
+ (not (null (re-search-backward "^\\[GNUPG:] END_ENCRYPTION\\>"
+ nil t))))))
-(defun pgg-gpg-select-matching-key (message-keys secret-keys)
- "Choose a key from MESSAGE-KEYS that matches one of the keys in SECRET-KEYS."
- (loop for message-key in message-keys
- for message-key-id = (and (equal (car message-key) 1)
- (cdr (assq 'key-identifier message-key)))
- for key = (and message-key-id (pgg-lookup-key message-key-id 'encrypt))
- when (and key (member key secret-keys)) return key))
+(defun pgg-gpg-decrypt-region (start end &optional passphrase)
+ "Decrypt the current region between START and END."
+ (let* ((args '("--decrypt"))
+ (process (pgg-gpg-start-process args)))
+ (process-send-region process start end)
+ (pgg-gpg-wait-for-status process '("BEGIN_DECRYPTION"))
+ (pgg-gpg-wait-for-completion process)
+ (save-excursion
+ (set-buffer (get-buffer-create pgg-errors-buffer))
+ (goto-char (point-max))
+ (not (null (re-search-backward "^\\[GNUPG:] DECRYPTION_OKAY\\>"
+ nil t))))))
-(defun pgg-gpg-sign-region (start end &optional cleartext)
+(defun pgg-gpg-sign-region (start end &optional cleartext passphrase)
"Make detached signature from text between START and END."
(let* ((pgg-gpg-user-id (or pgg-gpg-user-id pgg-default-user-id))
- (passphrase
- (pgg-read-passphrase
- (format "GnuPG passphrase for %s: " pgg-gpg-user-id)
- pgg-gpg-user-id))
(args
- (list (if cleartext "--clearsign" "--detach-sign")
- "--armor" "--batch" "--verbose"
- "--local-user" pgg-gpg-user-id))
- (inhibit-read-only t)
- buffer-read-only)
- (pgg-as-lbt start end 'CRLF
- (pgg-gpg-process-region start end passphrase pgg-gpg-program args))
- (with-current-buffer pgg-errors-buffer
- ;; Possibly cache passphrase under, e.g. "jas", for future sign.
- (pgg-gpg-possibly-cache-passphrase passphrase pgg-gpg-user-id)
- ;; Possibly cache passphrase under, e.g. B565716F, for future decrypt.
- (pgg-gpg-possibly-cache-passphrase passphrase))
- (pgg-process-when-success)))
+ (append (list (if cleartext "--clearsign" "--detach-sign")
+ "--armor" "--verbose"
+ "--local-user" pgg-gpg-user-id)
+ (if pgg-text-mode '("--textmode"))))
+ (process (pgg-gpg-start-process args)))
+ (unless pgg-gpg-use-agent
+ (pgg-gpg-wait-for-status process '("BEGIN_SIGNING" "GOOD_PASSPHRASE")))
+ (process-send-region process start end)
+ (pgg-gpg-wait-for-completion process)
+ (save-excursion
+ (set-buffer (get-buffer-create pgg-errors-buffer))
+ (goto-char (point-max))
+ (not (null (re-search-backward "^\\[GNUPG:] SIG_CREATED\\>"
+ nil t))))))
(defun pgg-gpg-verify-region (start end &optional signature)
"Verify region between START and END as the detached signature SIGNATURE."
- (let ((args '("--batch" "--verify")))
+ (let ((args '("--verify"))
+ process)
(when (stringp signature)
(setq args (append args (list signature))))
- (setq args (append args '("-")))
- (pgg-gpg-process-region start end nil pgg-gpg-program args)
- (with-current-buffer pgg-errors-buffer
- (goto-char (point-min))
- (while (re-search-forward "^gpg: \\(.*\\)\n" nil t)
- (with-current-buffer pgg-output-buffer
- (insert-buffer-substring pgg-errors-buffer
- (match-beginning 1) (match-end 0)))
- (delete-region (match-beginning 0) (match-end 0)))
- (goto-char (point-min))
- (re-search-forward "^\\[GNUPG:] GOODSIG\\>" nil t))))
+ (setq process (pgg-gpg-start-process (append args '("-"))))
+ (process-send-region process start end)
+ (pgg-gpg-wait-for-completion process)
+ (save-excursion
+ (set-buffer (get-buffer-create pgg-errors-buffer))
+ (goto-char (point-max))
+ (not (null (re-search-backward "^\\[GNUPG:] GOODSIG\\>"
+ nil t))))))
(defun pgg-gpg-insert-key ()
"Insert public key at point."
(let* ((pgg-gpg-user-id (or pgg-gpg-user-id pgg-default-user-id))
- (args (list "--batch" "--export" "--armor"
- pgg-gpg-user-id)))
- (pgg-gpg-process-region (point)(point) nil pgg-gpg-program args)
+ (args (list "--export" "--armor"
+ pgg-gpg-user-id))
+ (process (pgg-gpg-start-process args)))
+ (pgg-gpg-wait-for-completion process)
(insert-buffer-substring pgg-output-buffer)))
(defun pgg-gpg-snarf-keys-region (start end)
"Add all public keys in region between START and END to the keyring."
- (let ((args '("--import" "--batch" "-")) status)
- (pgg-gpg-process-region start end nil pgg-gpg-program args)
- (set-buffer pgg-errors-buffer)
- (goto-char (point-min))
- (when (re-search-forward "^\\[GNUPG:] IMPORT_RES\\>" nil t)
- (setq status (buffer-substring (match-end 0)
- (progn (end-of-line)(point)))
- status (vconcat (mapcar #'string-to-int (split-string status))))
- (erase-buffer)
- (insert (format "Imported %d key(s).
-\tArmor contains %d key(s) [%d bad, %d old].\n"
- (+ (aref status 2)
- (aref status 10))
- (aref status 0)
- (aref status 1)
- (+ (aref status 4)
- (aref status 11)))
- (if (zerop (aref status 9))
- ""
- "\tSecret keys are imported.\n")))
- (append-to-buffer pgg-output-buffer (point-min)(point-max))
- (pgg-process-when-success)))
+ (let* ((args '("--import" "-"))
+ (process (pgg-gpg-start-process args))
+ status)
+ (process-send-region process start end)
+ (pgg-gpg-wait-for-completion process)
+ (save-excursion
+ (set-buffer (get-buffer-create pgg-errors-buffer))
+ (goto-char (point-max))
+ (not (null (re-search-backward "^\\[GNUPG:] IMPORT_RES\\>"
+ nil t))))))
(provide 'pgg-gpg)
;;; pgg-parse.el --- OpenPGP packet parsing
-;; Copyright (C) 1999, 2003 Free Software Foundation, Inc.
+;; Copyright (C) 1999, 2002, 2003, 2004, 2005,
+;; 2006 Free Software Foundation, Inc.
;; Author: Daiki Ueno <ueno@unixuser.org>
;; Created: 1999/10/28
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(eval-when-compile (require 'cl))
(defgroup pgg-parse ()
- "OpenPGP packet parsing"
+ "OpenPGP packet parsing."
:group 'pgg)
(defcustom pgg-parse-public-key-algorithm-alist
(cons (sexp :tag "Number") (sexp :tag "Type"))))
(defcustom pgg-parse-hash-algorithm-alist
- '((1 . MD5) (2 . SHA1) (3 . RIPEMD160) (5 . MD2))
+ '((1 . MD5) (2 . SHA1) (3 . RIPEMD160) (5 . MD2) (8 . SHA256) (9 . SHA384)
+ (10 . SHA512))
"Alist of the assigned number to the cryptographic hash algorithm."
:group 'pgg-parse
:type '(repeat
`(mapconcat (lambda (c) (format "%02X" (pgg-char-int c)))
,string "")
;; `(upcase (apply #'format "%02x%02x%02x%02x%02x%02x%02x%02x"
- ;; (string-to-int-list ,string)))
+ ;; (string-to-number-list ,string)))
)
(defmacro pgg-parse-time-field (bytes)
(defmacro pgg-read-bytes (nbytes)
`(mapcar #'pgg-char-int (pgg-read-bytes-string ,nbytes))
- ;; `(string-to-int-list (pgg-read-bytes-string ,nbytes))
+ ;; `(string-to-number-list (pgg-read-bytes-string ,nbytes))
)
(defmacro pgg-read-body-string (ptag)
(defmacro pgg-read-body (ptag)
`(mapcar #'pgg-char-int (pgg-read-body-string ,ptag))
- ;; `(string-to-int-list (pgg-read-body-string ,ptag))
+ ;; `(string-to-number-list (pgg-read-body-string ,ptag))
)
(defalias 'pgg-skip-bytes 'forward-char)
;;; pgg-pgp.el --- PGP 2.* and 6.* support for PGG.
-;; Copyright (C) 1999, 2000, 2003 Free Software Foundation, Inc.
+;; Copyright (C) 1999, 2000, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Daiki Ueno <ueno@unixuser.org>
;; Created: 1999/11/02
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Code:
(require 'pgg))
(defgroup pgg-pgp ()
- "PGP 2.* and 6.* interface"
+ "PGP 2.* and 6.* interface."
:group 'pgg)
(defcustom pgg-pgp-program "pgp"
(buffer-substring (point)(progn (end-of-line) (point)))))
2))))))
-(defun pgg-pgp-encrypt-region (start end recipients)
+(defun pgg-pgp-encrypt-region (start end recipients &optional sign passphrase)
"Encrypt the current region between START and END."
(let* ((pgg-pgp-user-id (or pgg-pgp-user-id pgg-default-user-id))
+ (passphrase (or passphrase
+ (when sign
+ (pgg-read-passphrase
+ (format "PGP passphrase for %s: "
+ pgg-pgp-user-id)
+ pgg-pgp-user-id))))
(args
- `("+encrypttoself=off +verbose=1" "+batchmode"
- "+language=us" "-fate"
- ,@(if recipients
- (mapcar (lambda (rcpt) (concat "\"" rcpt "\""))
- (append recipients
- (if pgg-encrypt-for-me
- (list pgg-pgp-user-id))))))))
+ (append
+ `("+encrypttoself=off +verbose=1" "+batchmode"
+ "+language=us" "-fate"
+ ,@(if recipients
+ (mapcar (lambda (rcpt) (concat "\"" rcpt "\""))
+ (append recipients
+ (if pgg-encrypt-for-me
+ (list pgg-pgp-user-id))))))
+ (if sign '("-s" "-u" pgg-pgp-user-id)))))
(pgg-pgp-process-region start end nil pgg-pgp-program args)
(pgg-process-when-success nil)))
-(defun pgg-pgp-decrypt-region (start end)
- "Decrypt the current region between START and END."
+(defun pgg-pgp-decrypt-region (start end &optional passphrase)
+ "Decrypt the current region between START and END.
+
+If optional PASSPHRASE is not specified, it will be obtained from the
+passphrase cache or user."
(let* ((pgg-pgp-user-id (or pgg-pgp-user-id pgg-default-user-id))
(key (pgg-pgp-lookup-key pgg-pgp-user-id 'encrypt))
(passphrase
- (pgg-read-passphrase
- (format "PGP passphrase for %s: " pgg-pgp-user-id) key))
+ (or passphrase
+ (pgg-read-passphrase
+ (format "PGP passphrase for %s: " pgg-pgp-user-id) key)))
(args
- '("+verbose=1" "+batchmode" "+language=us" "-f")))
+ '("+verbose=1" "+batchmode" "+language=us" "-f")))
(pgg-pgp-process-region start end passphrase pgg-pgp-program args)
(pgg-process-when-success
(if pgg-cache-passphrase
- (pgg-add-passphrase-cache key passphrase)))))
+ (pgg-add-passphrase-to-cache key passphrase)))))
+
+(defun pgg-pgp-sign-region (start end &optional clearsign passphrase)
+ "Make detached signature from text between START and END.
-(defun pgg-pgp-sign-region (start end &optional clearsign)
- "Make detached signature from text between START and END."
+If optional PASSPHRASE is not specified, it will be obtained from the
+passphrase cache or user."
(let* ((pgg-pgp-user-id (or pgg-pgp-user-id pgg-default-user-id))
(passphrase
- (pgg-read-passphrase
- (format "PGP passphrase for %s: " pgg-pgp-user-id)
- (pgg-pgp-lookup-key pgg-pgp-user-id 'sign)))
+ (or passphrase
+ (pgg-read-passphrase
+ (format "PGP passphrase for %s: " pgg-pgp-user-id)
+ (pgg-pgp-lookup-key pgg-pgp-user-id 'sign))))
(args
(list (if clearsign "-fast" "-fbast")
"+verbose=1" "+language=us" "+batchmode"
(point))
(point-max))))))
(if pgg-cache-passphrase
- (pgg-add-passphrase-cache
+ (pgg-add-passphrase-to-cache
(cdr (assq 'key-identifier packet))
passphrase)))))))
;;; pgg-pgp5.el --- PGP 5.* support for PGG.
-;; Copyright (C) 1999, 2000, 2003, 2004 Free Software Foundation, Inc.
+;; Copyright (C) 1999, 2000, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Daiki Ueno <ueno@unixuser.org>
;; Created: 1999/11/02
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Code:
(require 'pgg))
(defgroup pgg-pgp5 ()
- "PGP 5.* interface"
+ "PGP 5.* interface."
:group 'pgg)
(defcustom pgg-pgp5-pgpe-program "pgpe"
(buffer-substring (match-end 0)(progn (end-of-line)(point)))))
2)))))
-(defun pgg-pgp5-encrypt-region (start end recipients &optional sign)
+(defun pgg-pgp5-encrypt-region (start end recipients &optional sign passphrase)
"Encrypt the current region between START and END."
(let* ((pgg-pgp5-user-id (or pgg-pgp5-user-id pgg-default-user-id))
+ (passphrase (or passphrase
+ (when sign
+ (pgg-read-passphrase
+ (format "PGP passphrase for %s: "
+ pgg-pgp5-user-id)
+ pgg-pgp5-user-id))))
(args
- `("+NoBatchInvalidKeys=off" "-fat" "+batchmode=1"
- ,@(if recipients
- (apply #'append
- (mapcar (lambda (rcpt)
- (list "-r"
- (concat "\"" rcpt "\"")))
- (append recipients
- (if pgg-encrypt-for-me
- (list pgg-pgp5-user-id)))))))))
+ (append
+ `("+NoBatchInvalidKeys=off" "-fat" "+batchmode=1"
+ ,@(if recipients
+ (apply #'append
+ (mapcar (lambda (rcpt)
+ (list "-r"
+ (concat "\"" rcpt "\"")))
+ (append recipients
+ (if pgg-encrypt-for-me
+ (list pgg-pgp5-user-id)))))))
+ (if sign '("-s" "-u" pgg-pgp5-user-id)))))
(pgg-pgp5-process-region start end nil pgg-pgp5-pgpe-program args)
(pgg-process-when-success nil)))
-(defun pgg-pgp5-decrypt-region (start end)
+(defun pgg-pgp5-decrypt-region (start end &optional passphrase)
"Decrypt the current region between START and END."
(let* ((pgg-pgp5-user-id (or pgg-pgp5-user-id pgg-default-user-id))
(passphrase
- (pgg-read-passphrase
- (format "PGP passphrase for %s: " pgg-pgp5-user-id)
- (pgg-pgp5-lookup-key pgg-pgp5-user-id 'encrypt)))
+ (or passphrase
+ (pgg-read-passphrase
+ (format "PGP passphrase for %s: " pgg-pgp5-user-id)
+ (pgg-pgp5-lookup-key pgg-pgp5-user-id 'encrypt))))
(args
'("+verbose=1" "+batchmode=1" "+language=us" "-f")))
(pgg-pgp5-process-region start end passphrase pgg-pgp5-pgpv-program args)
(pgg-process-when-success nil)))
-(defun pgg-pgp5-sign-region (start end &optional clearsign)
+(defun pgg-pgp5-sign-region (start end &optional clearsign passphrase)
"Make detached signature from text between START and END."
(let* ((pgg-pgp5-user-id (or pgg-pgp5-user-id pgg-default-user-id))
(passphrase
- (pgg-read-passphrase
- (format "PGP passphrase for %s: " pgg-pgp5-user-id)
- (pgg-pgp5-lookup-key pgg-pgp5-user-id 'sign)))
+ (or passphrase
+ (pgg-read-passphrase
+ (format "PGP passphrase for %s: " pgg-pgp5-user-id)
+ (pgg-pgp5-lookup-key pgg-pgp5-user-id 'sign))))
(args
(list (if clearsign "-fat" "-fbat")
"+verbose=1" "+language=us" "+batchmode=1"
(point))
(point-max))))))
(if pgg-cache-passphrase
- (pgg-add-passphrase-cache
+ (pgg-add-passphrase-to-cache
(cdr (assq 'key-identifier packet))
passphrase)))))))
;;; pgg.el --- glue for the various PGP implementations.
-;; Copyright (C) 1999, 2000, 2003, 2004 Free Software Foundation, Inc.
+;; Copyright (C) 1999, 2000, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Daiki Ueno <ueno@unixuser.org>
+;; Symmetric encryption added by: Sascha Wilde <wilde@sha-bang.de>
;; Created: 1999/10/28
;; Keywords: PGP
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;; Don't merge these two `eval-when-compile's.
(eval-when-compile
(require 'cl))
-;; Fixme: This would be better done with an autoload for
-;; `url-insert-file-contents', and the url stuff rationalized.
-;; (`locate-library' can say whether the url code is available.)
-(eval-when-compile
- (ignore-errors
- (require 'w3)
- (require 'url)))
;;; @ utility functions
;;;
-(defvar pgg-fetch-key-function (if (fboundp 'url-insert-file-contents)
- (function pgg-fetch-key-with-w3)))
-
(defun pgg-invoke (func scheme &rest args)
(progn
(require (intern (format "pgg-%s" scheme)))
(set-window-buffer window buffer)
(shrink-window-if-larger-than-buffer window)))
+;; XXX `pgg-display-output-buffer' is a horrible name for this function.
+;; It should be something like `pgg-situate-output-or-display-error'.
(defun pgg-display-output-buffer (start end status)
+ "Situate en/decryption results or pop up an error buffer.
+
+Text from START to END is replaced by contents of output buffer if STATUS
+is true, or else the output buffer is displayed."
(if status
- (progn
- (delete-region start end)
- (insert-buffer-substring pgg-output-buffer)
- (decode-coding-region start (point) buffer-file-coding-system))
- (let ((temp-buffer-show-function
- (function pgg-temp-buffer-show-function)))
- (with-output-to-temp-buffer pgg-echo-buffer
- (set-buffer standard-output)
- (insert-buffer-substring pgg-errors-buffer)))))
-
-(defun pgg-read-passphrase (prompt &optional key)
- (when pgg-cache-passphrase
- (password-read prompt (setq key (pgg-truncate-key-identifier key)))))
-
-(defun pgg-add-passphrase-cache (key passphrase)
+ (pgg-situate-output start end)
+ (pgg-display-error-buffer)))
+
+(defun pgg-situate-output (start end)
+ "Place en/decryption result in place of current text from START to END."
+ (delete-region start end)
+ (insert-buffer-substring pgg-output-buffer)
+ (decode-coding-region start (point) buffer-file-coding-system))
+
+(defun pgg-display-error-buffer ()
+ "Pop up an error buffer indicating the reason for an en/decryption failure."
+ (let ((temp-buffer-show-function
+ (function pgg-temp-buffer-show-function)))
+ (with-output-to-temp-buffer pgg-echo-buffer
+ (set-buffer standard-output)
+ (insert-buffer-substring pgg-errors-buffer))))
+
+(defun pgg-read-passphrase (prompt &optional key notruncate)
+ "Using PROMPT, obtain passphrase for KEY from cache or user.
+
+Truncate the key to 8 trailing characters unless NOTRUNCATE is true
+\(default false).
+
+Custom variables `pgg-cache-passphrase' and `pgg-passphrase-cache-expiry'
+regulate cache behavior."
+ (password-read prompt (if notruncate
+ key
+ (pgg-truncate-key-identifier key))))
+
+(defun pgg-add-passphrase-to-cache (key passphrase &optional notruncate)
+ "Associate KEY with PASSPHRASE in time-limited passphrase cache.
+
+Truncate the key to 8 trailing characters unless NOTRUNCATE is true
+\(default false).
+
+Custom variables `pgg-cache-passphrase' and `pgg-passphrase-cache-expiry'
+regulate cache behavior."
(let ((password-cache-expiry pgg-passphrase-cache-expiry))
- (password-cache-add (setq key (pgg-truncate-key-identifier key))
+ (password-cache-add (if notruncate
+ key
+ (pgg-truncate-key-identifier key))
passphrase)))
-(defun pgg-remove-passphrase-cache (key)
- (password-cache-remove key))
+(defun pgg-remove-passphrase-from-cache (key &optional notruncate)
+ "Omit passphrase associated with KEY in time-limited passphrase cache.
+
+Truncate the key to 8 trailing characters unless NOTRUNCATE is true
+\(default false).
+
+This is a no-op if there is not entry for KEY (eg, it's already expired.
+
+The memory for the passphrase is filled with underscores to clear any
+references to it.
+
+Custom variables `pgg-cache-passphrase' and `pgg-passphrase-cache-expiry'
+regulate cache behavior."
+ (password-cache-remove (if notruncate
+ key
+ (pgg-truncate-key-identifier key))))
(defmacro pgg-convert-lbt-region (start end lbt)
`(let ((pgg-conversion-end (set-marker (make-marker) ,end)))
;;;
;;;###autoload
-(defun pgg-encrypt-region (start end rcpts &optional sign)
+(defun pgg-encrypt-region (start end rcpts &optional sign passphrase)
"Encrypt the current region between START and END for RCPTS.
-If optional argument SIGN is non-nil, do a combined sign and encrypt."
+
+If optional argument SIGN is non-nil, do a combined sign and encrypt.
+
+If optional PASSPHRASE is not specified, it will be obtained from the
+passphrase cache or user."
(interactive
(list (region-beginning)(region-end)
(split-string (read-string "Recipients: ") "[ \t,]+")))
(let ((status
(pgg-save-coding-system start end
(pgg-invoke "encrypt-region" (or pgg-scheme pgg-default-scheme)
- (point-min) (point-max) rcpts sign))))
+ (point-min) (point-max) rcpts sign passphrase))))
+ (when (interactive-p)
+ (pgg-display-output-buffer start end status))
+ status))
+
+;;;###autoload
+(defun pgg-encrypt-symmetric-region (start end &optional passphrase)
+ "Encrypt the current region between START and END symmetric with passphrase.
+
+If optional PASSPHRASE is not specified, it will be obtained from the
+cache or user."
+ (interactive "r")
+ (let ((status
+ (pgg-save-coding-system start end
+ (pgg-invoke "encrypt-symmetric-region"
+ (or pgg-scheme pgg-default-scheme)
+ (point-min) (point-max) passphrase))))
(when (interactive-p)
(pgg-display-output-buffer start end status))
status))
;;;###autoload
-(defun pgg-encrypt (rcpts &optional sign start end)
+(defun pgg-encrypt-symmetric (&optional start end passphrase)
+ "Encrypt the current buffer using a symmetric, rather than key-pair, cipher.
+
+If optional arguments START and END are specified, only encrypt within
+the region.
+
+If optional PASSPHRASE is not specified, it will be obtained from the
+passphrase cache or user."
+ (interactive)
+ (let* ((start (or start (point-min)))
+ (end (or end (point-max)))
+ (status (pgg-encrypt-symmetric-region start end passphrase)))
+ (when (interactive-p)
+ (pgg-display-output-buffer start end status))
+ status))
+
+;;;###autoload
+(defun pgg-encrypt (rcpts &optional sign start end passphrase)
"Encrypt the current buffer for RCPTS.
+
If optional argument SIGN is non-nil, do a combined sign and encrypt.
+
If optional arguments START and END are specified, only encrypt within
-the region."
+the region.
+
+If optional PASSPHRASE is not specified, it will be obtained from the
+passphrase cache or user."
(interactive (list (split-string (read-string "Recipients: ") "[ \t,]+")))
(let* ((start (or start (point-min)))
(end (or end (point-max)))
- (status (pgg-encrypt-region start end rcpts sign)))
+ (status (pgg-encrypt-region start end rcpts sign passphrase)))
(when (interactive-p)
(pgg-display-output-buffer start end status))
status))
;;;###autoload
-(defun pgg-decrypt-region (start end)
- "Decrypt the current region between START and END."
+(defun pgg-decrypt-region (start end &optional passphrase)
+ "Decrypt the current region between START and END.
+
+If optional PASSPHRASE is not specified, it will be obtained from the
+passphrase cache or user."
(interactive "r")
(let* ((buf (current-buffer))
(status
(pgg-save-coding-system start end
(pgg-invoke "decrypt-region" (or pgg-scheme pgg-default-scheme)
- (point-min) (point-max)))))
+ (point-min) (point-max) passphrase))))
(when (interactive-p)
(pgg-display-output-buffer start end status))
status))
;;;###autoload
-(defun pgg-decrypt (&optional start end)
+(defun pgg-decrypt (&optional start end passphrase)
"Decrypt the current buffer.
+
If optional arguments START and END are specified, only decrypt within
-the region."
+the region.
+
+If optional PASSPHRASE is not specified, it will be obtained from the
+passphrase cache or user."
(interactive "")
(let* ((start (or start (point-min)))
(end (or end (point-max)))
- (status (pgg-decrypt-region start end)))
+ (status (pgg-decrypt-region start end passphrase)))
(when (interactive-p)
(pgg-display-output-buffer start end status))
status))
;;;###autoload
-(defun pgg-sign-region (start end &optional cleartext)
+(defun pgg-sign-region (start end &optional cleartext passphrase)
"Make the signature from text between START and END.
+
If the optional 3rd argument CLEARTEXT is non-nil, it does not create
a detached signature.
+
If this function is called interactively, CLEARTEXT is enabled
-and the the output is displayed."
+and the the output is displayed.
+
+If optional PASSPHRASE is not specified, it will be obtained from the
+passphrase cache or user."
(interactive "r")
(let ((status (pgg-save-coding-system start end
(pgg-invoke "sign-region" (or pgg-scheme pgg-default-scheme)
(point-min) (point-max)
- (or (interactive-p) cleartext)))))
+ (or (interactive-p) cleartext)
+ passphrase))))
(when (interactive-p)
(pgg-display-output-buffer start end status))
status))
;;;###autoload
-(defun pgg-sign (&optional cleartext start end)
+(defun pgg-sign (&optional cleartext start end passphrase)
"Sign the current buffer.
+
If the optional argument CLEARTEXT is non-nil, it does not create a
detached signature.
+
If optional arguments START and END are specified, only sign data
within the region.
+
If this function is called interactively, CLEARTEXT is enabled
-and the the output is displayed."
+and the the output is displayed.
+
+If optional PASSPHRASE is not specified, it will be obtained from the
+passphrase cache or user."
(interactive "")
(let* ((start (or start (point-min)))
(end (or end (point-max)))
- (status (pgg-sign-region start end (or (interactive-p) cleartext))))
+ (status (pgg-sign-region start end
+ (or (interactive-p) cleartext)
+ passphrase)))
(when (interactive-p)
(pgg-display-output-buffer start end status))
status))
-
+
;;;###autoload
(defun pgg-verify-region (start end &optional signature fetch)
"Verify the current region between START and END.
(or (cdr (assq 'preferred-key-server packet))
pgg-default-keyserver-address))
(pgg-fetch-key keyserver key))
- (setq status
+ (setq status
(pgg-save-coding-system start end
(pgg-invoke "verify-region" (or pgg-scheme pgg-default-scheme)
(point-min) (point-max) signature)))
(with-output-to-temp-buffer pgg-echo-buffer
(set-buffer standard-output)
(insert-buffer-substring (if status pgg-output-buffer
- pgg-errors-buffer)))))))
+ pgg-errors-buffer)))))
+ status))
;;;###autoload
(defun pgg-insert-key ()
(defun pgg-insert-url-with-w3 (url)
(ignore-errors
- (require 'w3)
(require 'url)
(let (buffer-file-name)
(url-insert-file-contents url))))
;;; pop3.el --- Post Office Protocol (RFC 1460) interface
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+;; 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Richard L. Pieri <ratinox@peorth.gweep.net>
;; Maintainer: FSF
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(require 'mail-utils)
(defgroup pop3 nil
- "Post Office Protocol"
+ "Post Office Protocol."
:group 'mail
:group 'mail-source)
(defcustom pop3-authentication-scheme 'pass
"*POP3 authentication scheme.
-Defaults to 'pass, for the standard USER/PASS authentication. Other valid
-values are 'apop."
- :version "22.1" ;; Oort Gnus
- :type '(choice (const :tag "USER/PASS" pass)
+Defaults to `pass', for the standard USER/PASS authentication. The other
+valid value is 'apop'."
+ :type '(choice (const :tag "Normal user/password" pass)
(const :tag "APOP" apop))
+ :version "22.1" ;; Oort Gnus
:group 'pop3)
(defcustom pop3-leave-mail-on-server nil
(unless pop3-leave-mail-on-server
(pop3-dele process n))
(setq n (+ 1 n))
- (if pop3-debug (sit-for 1) (sit-for 0.1))
- )
+ (if pop3-debug (sit-for 1) (sit-for 0.1))) ; why?
(pop3-quit process))
- (kill-buffer crashbuf)
- )
+ (kill-buffer crashbuf))
t)
(defun pop3-get-message-count ()
(pop3-quit process)
message-count))
+(autoload 'open-tls-stream "tls")
+(autoload 'starttls-open-stream "starttls")
+(autoload 'starttls-negotiate "starttls") ; avoid warning
+
+(defcustom pop3-stream-type nil
+ "*Transport security type for POP3 connexions.
+This may be either nil (plain connexion), `ssl' (use an
+SSL/TSL-secured stream) or `starttls' (use the starttls mechanism
+to turn on TLS security after opening the stream). However, if
+this is nil, `ssl' is assumed for connexions to port
+995 (pop3s)."
+ :version "23.0" ;; No Gnus
+ :group 'pop3
+ :type '(choice (const :tag "Plain" nil)
+ (const :tag "SSL/TLS" ssl)
+ (const starttls)))
+
(defun pop3-open-server (mailhost port)
"Open TCP connection to MAILHOST on PORT.
Returns the process associated with the connection."
mailhost)))
(erase-buffer)
(setq pop3-read-point (point-min))
- (setq process (open-network-stream "POP" (current-buffer) mailhost port))
+ (setq process
+ (cond
+ ((or (eq pop3-stream-type 'ssl)
+ (and (not pop3-stream-type) (member port '(995 "pop3s"))))
+ ;; gnutls-cli, openssl don't accept service names
+ (if (or (equal port "pop3s")
+ (null port))
+ (setq port 995))
+ (let ((process (open-tls-stream "POP" (current-buffer)
+ mailhost port)))
+ (when process
+ ;; There's a load of info printed that needs deleting.
+ (while (when (memq (process-status process) '(open run))
+ (pop3-accept-process-output process)
+ (goto-char (point-max))
+ (forward-line -1)
+ (if (looking-at "\\+OK")
+ (progn
+ (delete-region (point-min) (point))
+ nil)
+ (pop3-quit process)
+ (error "POP SSL connexion failed"))))
+ process)))
+ ((eq pop3-stream-type 'starttls)
+ ;; gnutls-cli, openssl don't accept service names
+ (if (equal port "pop3")
+ (setq port 110))
+ (let ((process (starttls-open-stream "POP" (current-buffer)
+ mailhost (or port 110))))
+ (pop3-send-command process "STLS")
+ (let ((response (pop3-read-response process t)))
+ (if (and response (string-match "+OK" response))
+ (starttls-negotiate process)
+ (pop3-quit process)
+ (error "POP server doesn't support starttls")))
+ process))
+ (t
+ (open-network-stream "POP" (current-buffer) mailhost port))))
(let ((response (pop3-read-response process t)))
(setq pop3-timestamp
(substring response (or (string-match "<" response) 0)
;; Date: 08 Jul 1996 23:22:24 -0400
;; should be
;; Tue Jul 9 09:04:21 1996
+
+ ;; Fixme: This should use timezone on the date field contents.
(setq date
(cond ((not date)
"Tue Jan 1 00:00:0 1900")
(pop3-send-command process (format "USER %s" user))
(let ((response (pop3-read-response process t)))
(if (not (and response (string-match "+OK" response)))
- (error (format "USER %s not valid" user)))))
+ (error "USER %s not valid" user))))
(defun pop3-pass (process)
"Send authentication information to the server."
(setq pass
(read-passwd (format "Password for %s: " pop3-maildrop))))
(if pass
- (let ((hash (md5 (concat pop3-timestamp pass))))
+ (let ((hash (md5 (concat pop3-timestamp pass) nil nil 'binary)))
(pop3-send-command process (format "APOP %s %s" user hash))
(let ((response (pop3-read-response process t)))
(if (not (and response (string-match "+OK" response)))
"Return the number of messages in the maildrop and the maildrop's size."
(pop3-send-command process "STAT")
(let ((response (pop3-read-response process t)))
- (list (string-to-int (nth 1 (split-string response " ")))
- (string-to-int (nth 2 (split-string response " "))))
+ (list (string-to-number (nth 1 (split-string response " ")))
+ (string-to-number (nth 2 (split-string response " "))))
))
(defun pop3-list (process &optional msg)
"Return highest accessed message-id number for the session."
(pop3-send-command process "LAST")
(let ((response (pop3-read-response process t)))
- (string-to-int (nth 1 (split-string response " ")))
+ (string-to-number (nth 1 (split-string response " ")))
))
(defun pop3-rset (process)
;; -ERR [invalid password]
;; -ERR [unable to lock maildrop]
+;; STLS (RFC 2595)
+;; Arguments: none
+;; Restrictions: Only permitted in AUTHORIZATION state.
+;; Possible responses:
+;; +OK
+;; -ERR
+
;;; TRANSACTION STATE
;; STAT
;;; qp.el --- Quoted-Printable functions
-;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2005
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: mail, extensions
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(cond ((eq (char-after (1+ (point))) ?\n)
(delete-char 2))
((looking-at "=[0-9A-F][0-9A-F]")
- (let ((byte (string-to-int (buffer-substring (1+ (point))
+ (let ((byte (string-to-number (buffer-substring (1+ (point))
(+ 3 (point)))
16)))
(mm-insert-byte byte 1)
(not (eobp)))
(insert
(prog1
- ;; To unibyte in case of Emacs 22 eight-bit.
+ ;; To unibyte in case of Emacs 23 (unicode) eight-bit.
(format "=%02X" (mm-multibyte-char-to-unibyte (char-after)))
(delete-char 1))))
;; Encode white space at the end of lines.
;;; rfc1843.el --- HZ (rfc1843) decoding
-;; Copyright (c) 1998, 1999, 2000, 2003 Free Software Foundation, Inc.
+
+;; Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
;; Keywords: news HZ HZ+ mail i18n
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(eval-when-compile (require 'cl))
(require 'mm-util)
+(defvar gnus-decode-encoded-word-function)
+(defvar gnus-decode-header-function)
+(defvar gnus-newsgroup-name)
+
(defvar rfc1843-word-regexp
"~\\({\\([\041-\167][\041-\176]\\| \\)+\\)\\(~}\\|$\\)")
(let* ((inhibit-point-motion-hooks t)
(case-fold-search t)
(ct (message-fetch-field "Content-Type" t))
- (ctl (and ct (ignore-errors
- (mail-header-parse-content-type ct)))))
+ (ctl (and ct (mail-header-parse-content-type ct))))
(if (and ctl (not (string-match "/" (car ctl))))
(setq ctl nil))
(goto-char (point-max))
;;; rfc2045.el --- Functions for decoding rfc2045 headers
-;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
+;; Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; This file is part of GNU Emacs.
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;; RFC 2045 is: "Multipurpose Internet Mail Extensions (MIME) Part
;; One: Format of Internet Message Bodies".
;;; rfc2047.el --- functions for encoding and decoding rfc2047 messages
-;; Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004, 2005
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; MORIOKA Tomohiko <morioka@jaist.ac.jp>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(defvar rfc2047-quote-decoded-words-containing-tspecials nil
"If non-nil, quote decoded words containing special characters.")
+(defvar rfc2047-allow-incomplete-encoded-text t
+ "*Non-nil means allow incomplete encoded-text in successive encoded-words.
+Dividing of encoded-text in the place other than character boundaries
+violates RFC2047 section 5, while we have a capability to decode it.
+If it is non-nil, the decoder will decode B- or Q-encoding in each
+encoded-word, concatenate them, and decode it by charset. Otherwise,
+the decoder will fully decode each encoded-word before concatenating
+them.")
+
+(defun rfc2047-charset-to-coding-system (charset)
+ "Return coding-system corresponding to MIME CHARSET.
+If your Emacs implementation can't decode CHARSET, return nil."
+ (when (stringp charset)
+ (setq charset (intern (downcase charset))))
+ (when (or (not charset)
+ (eq 'gnus-all mail-parse-ignored-charsets)
+ (memq 'gnus-all mail-parse-ignored-charsets)
+ (memq charset mail-parse-ignored-charsets))
+ (setq charset mail-parse-charset))
+ (let ((cs (mm-charset-to-coding-system charset)))
+ (cond ((eq cs 'ascii)
+ (setq cs (or (mm-charset-to-coding-system mail-parse-charset)
+ 'raw-text)))
+ ((mm-coding-system-p cs))
+ ((and charset
+ (listp mail-parse-ignored-charsets)
+ (memq 'gnus-unknown mail-parse-ignored-charsets))
+ (setq cs (mm-charset-to-coding-system mail-parse-charset))))
+ (if (eq cs 'ascii)
+ 'raw-text
+ cs)))
+
+(defun rfc2047-decode-encoded-words (words)
+ "Decode successive encoded-words in WORDS and return a decoded string.
+Each element of WORDS looks like (CHARSET ENCODING ENCODED-TEXT
+ENCODED-WORD)."
+ (let (word charset cs encoding text rest)
+ (while words
+ (setq word (pop words))
+ (if (and (setq cs (rfc2047-charset-to-coding-system
+ (setq charset (car word))))
+ (condition-case code
+ (cond ((char-equal ?B (nth 1 word))
+ (setq text (base64-decode-string
+ (rfc2047-pad-base64 (nth 2 word)))))
+ ((char-equal ?Q (nth 1 word))
+ (setq text (quoted-printable-decode-string
+ (mm-subst-char-in-string
+ ?_ ? (nth 2 word) t)))))
+ (error
+ (message "%s" (error-message-string code))
+ nil)))
+ (if (and rfc2047-allow-incomplete-encoded-text
+ (eq cs (caar rest)))
+ ;; Concatenate text of which the charset is the same.
+ (setcdr (car rest) (concat (cdar rest) text))
+ (push (cons cs text) rest))
+ ;; Don't decode encoded-word.
+ (push (cons nil (nth 3 word)) rest)))
+ (while rest
+ (setq words (concat
+ (or (and (setq cs (caar rest))
+ (condition-case code
+ (mm-decode-coding-string (cdar rest) cs)
+ (error
+ (message "%s" (error-message-string code))
+ nil)))
+ (concat (when (cdr rest) " ")
+ (cdar rest)
+ (when (and words
+ (not (eq (string-to-char words) ? )))
+ " ")))
+ words)
+ rest (cdr rest)))
+ words))
+
;; Fixme: This should decode in place, not cons intermediate strings.
;; Also check whether it needs to worry about delimiting fields like
;; encoding.
"Decode MIME-encoded words in region between START and END."
(interactive "r")
(let ((case-fold-search t)
- b e)
+ (eword-regexp (eval-when-compile
+ ;; Ignore whitespace between encoded-words.
+ (concat "[\n\t ]*\\(" rfc2047-encoded-word-regexp
+ "\\)")))
+ b e match words)
(save-excursion
(save-restriction
(narrow-to-region start end)
- (goto-char (point-min))
- ;; Remove whitespace between encoded words.
- (while (re-search-forward
- (eval-when-compile
- (concat "\\(" rfc2047-encoded-word-regexp "\\)"
- "\\(\n?[ \t]\\)+"
- "\\(" rfc2047-encoded-word-regexp "\\)"))
- nil t)
- (delete-region (goto-char (match-end 1)) (match-beginning 6)))
- ;; Decode the encoded words.
- (setq b (goto-char (point-min)))
- (while (re-search-forward rfc2047-encoded-word-regexp nil t)
- (setq e (match-beginning 0))
- (insert (rfc2047-parse-and-decode
- (prog1
- (match-string 0)
- (delete-region e (match-end 0)))))
- (while (looking-at rfc2047-encoded-word-regexp)
- (insert (rfc2047-parse-and-decode
- (prog1
- (match-string 0)
- (delete-region (point) (match-end 0))))))
+ (goto-char (setq b start))
+ ;; Look for the encoded-words.
+ (while (setq match (re-search-forward eword-regexp nil t))
+ (setq e (match-beginning 1)
+ end (match-end 0)
+ words nil)
+ (while match
+ (push (list (match-string 2) ;; charset
+ (char-after (match-beginning 3)) ;; encoding
+ (match-string 4) ;; encoded-text
+ (match-string 1)) ;; encoded-word
+ words)
+ ;; Look for the subsequent encoded-words.
+ (when (setq match (looking-at eword-regexp))
+ (goto-char (setq end (match-end 0)))))
+ ;; Replace the encoded-words with the decoded one.
+ (delete-region e end)
+ (insert (rfc2047-decode-encoded-words (nreverse words)))
(save-restriction
(narrow-to-region e (point))
(goto-char e)
(mm-decode-coding-string string mail-parse-charset))
(mm-string-as-multibyte string)))))
-(defun rfc2047-parse-and-decode (word)
- "Decode WORD and return it if it is an encoded word.
-Return WORD if it is not not an encoded word or if the charset isn't
-decodable."
- (if (not (string-match rfc2047-encoded-word-regexp word))
- word
- (or
- (condition-case nil
- (rfc2047-decode
- (match-string 1 word)
- (string-to-char (match-string 2 word))
- (match-string 3 word))
- (error word))
- word))) ; un-decodable
-
(defun rfc2047-pad-base64 (string)
"Pad STRING to quartets."
;; Be more liberal to accept buggy base64 strings. If
(2 (concat string "=="))
(3 (concat string "=")))))
-(defun rfc2047-decode (charset encoding string)
- "Decode STRING from the given MIME CHARSET in the given ENCODING.
-Valid ENCODINGs are the characters \"B\" and \"Q\".
-If your Emacs implementation can't decode CHARSET, return nil."
- (if (stringp charset)
- (setq charset (intern (downcase charset))))
- (if (or (not charset)
- (eq 'gnus-all mail-parse-ignored-charsets)
- (memq 'gnus-all mail-parse-ignored-charsets)
- (memq charset mail-parse-ignored-charsets))
- (setq charset mail-parse-charset))
- (let ((cs (mm-charset-to-coding-system charset)))
- (if (and (not cs) charset
- (listp mail-parse-ignored-charsets)
- (memq 'gnus-unknown mail-parse-ignored-charsets))
- (setq cs (mm-charset-to-coding-system mail-parse-charset)))
- (when cs
- (when (eq cs 'ascii)
- (setq cs (or mail-parse-charset 'raw-text)))
- (mm-decode-coding-string
- (cond
- ((char-equal ?B encoding)
- (base64-decode-string
- (rfc2047-pad-base64 string)))
- ((char-equal ?Q encoding)
- (quoted-printable-decode-string
- (mm-subst-char-in-string ?_ ? string t)))
- (t (error "Invalid encoding: %c" encoding)))
- cs))))
-
(provide 'rfc2047)
;;; arch-tag: a07fe3d4-22b5-4c4a-bd89-b1f82d5d36f6
;;; rfc2104.el --- RFC2104 Hashed Message Authentication Codes
-;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
+
+;; Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Simon Josefsson <jas@pdc.kth.se>
;; Keywords: mail
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; rfc2231.el --- Functions for decoding rfc2231 headers
-;; Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004, 2005,
+;; 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; This file is part of GNU Emacs.
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
N.B. This is in violation with RFC2047, but it seem to be in common use."
(rfc2231-parse-string (rfc2047-decode-string string)))
-(defun rfc2231-parse-string (string)
+(defun rfc2231-parse-string (string &optional signal-error)
"Parse STRING and return a list.
The list will be on the form
- `(name (attribute . value) (attribute . value)...)"
+ `(name (attribute . value) (attribute . value)...)'.
+
+If the optional SIGNAL-ERROR is non-nil, signal an error when this
+function fails in parsing of parameters. Otherwise, this function
+must never cause a Lisp error."
(with-temp-buffer
(let ((ttoken (ietf-drums-token-to-list ietf-drums-text-token))
(stoken (ietf-drums-token-to-list ietf-drums-tspecials))
(ntoken (ietf-drums-token-to-list "0-9"))
- (prev-value "")
- display-name mailbox c display-string parameters
- attribute value type subtype number encoded
- prev-attribute)
- (ietf-drums-init (mail-header-remove-whitespace
- (mail-header-remove-comments string)))
+ c type attribute encoded number prev-attribute vals
+ prev-encoded parameters value)
+ (ietf-drums-init
+ (condition-case nil
+ (mail-header-remove-whitespace
+ (mail-header-remove-comments string))
+ ;; The most likely cause of an error is unbalanced parentheses
+ ;; or double-quotes. If all parentheses and double-quotes are
+ ;; quoted meaninglessly with backslashes, removing them might
+ ;; make it parseable. Let's try...
+ (error
+ (let (mod)
+ (when (and (string-match "\\\\\"" string)
+ (not (string-match "\\`\"\\|[^\\]\"" string)))
+ (setq string (mm-replace-in-string string "\\\\\"" "\"")
+ mod t))
+ (when (and (string-match "\\\\(" string)
+ (string-match "\\\\)" string)
+ (not (string-match "\\`(\\|[^\\][()]" string)))
+ (setq string (mm-replace-in-string string "\\\\\\([()]\\)" "\\1")
+ mod t))
+ (or (and mod
+ (ignore-errors
+ (mail-header-remove-whitespace
+ (mail-header-remove-comments string))))
+ ;; Finally, attempt to extract only type.
+ (if (string-match
+ (concat "\\`[\t\n ]*\\([^" ietf-drums-tspecials "\t\n ]+"
+ "\\(?:/[^" ietf-drums-tspecials
+ "\t\n ]+\\)?\\)\\(?:[\t\n ;]\\|\\'\\)")
+ string)
+ (match-string 1 string)
+ ""))))))
(let ((table (copy-syntax-table ietf-drums-syntax-table)))
(modify-syntax-entry ?\' "w" table)
(modify-syntax-entry ?* " " table)
(set-syntax-table table))
(setq c (char-after))
(when (and (memq c ttoken)
- (not (memq c stoken)))
- (setq type (downcase (buffer-substring
- (point) (progn (forward-sexp 1) (point)))))
+ (not (memq c stoken))
+ (setq type (ignore-errors
+ (downcase
+ (buffer-substring (point) (progn
+ (forward-sexp 1)
+ (point)))))))
;; Do the params
- (while (not (eobp))
- (setq c (char-after))
- (unless (eq c ?\;)
- (error "Invalid header: %s" string))
- (forward-char 1)
- ;; If c in nil, then this is an invalid header, but
- ;; since elm generates invalid headers on this form,
- ;; we allow it.
- (when (setq c (char-after))
- (if (and (memq c ttoken)
- (not (memq c stoken)))
- (setq attribute
- (intern
- (downcase
- (buffer-substring
- (point) (progn (forward-sexp 1) (point))))))
- (error "Invalid header: %s" string))
- (setq c (char-after))
- (when (eq c ?*)
- (forward-char 1)
- (setq c (char-after))
- (if (not (memq c ntoken))
- (setq encoded t
- number nil)
- (setq number
- (string-to-number
- (buffer-substring
- (point) (progn (forward-sexp 1) (point)))))
+ (condition-case err
+ (progn
+ (while (not (eobp))
(setq c (char-after))
- (when (eq c ?*)
- (setq encoded t)
+ (unless (eq c ?\;)
+ (error "Invalid header: %s" string))
+ (forward-char 1)
+ ;; If c in nil, then this is an invalid header, but
+ ;; since elm generates invalid headers on this form,
+ ;; we allow it.
+ (when (setq c (char-after))
+ (if (and (memq c ttoken)
+ (not (memq c stoken)))
+ (setq attribute
+ (intern
+ (downcase
+ (buffer-substring
+ (point) (progn (forward-sexp 1) (point))))))
+ (error "Invalid header: %s" string))
+ (setq c (char-after))
+ (if (eq c ?*)
+ (progn
+ (forward-char 1)
+ (setq c (char-after))
+ (if (not (memq c ntoken))
+ (setq encoded t
+ number nil)
+ (setq number
+ (string-to-number
+ (buffer-substring
+ (point) (progn (forward-sexp 1) (point)))))
+ (setq c (char-after))
+ (when (eq c ?*)
+ (setq encoded t)
+ (forward-char 1)
+ (setq c (char-after)))))
+ (setq number nil
+ encoded nil))
+ ;; See if we have any previous continuations.
+ (when (and prev-attribute
+ (not (eq prev-attribute attribute)))
+ (setq vals
+ (mapconcat 'cdr (sort vals 'car-less-than-car) ""))
+ (push (cons prev-attribute
+ (if prev-encoded
+ (rfc2231-decode-encoded-string vals)
+ vals))
+ parameters)
+ (setq prev-attribute nil
+ vals nil
+ prev-encoded nil))
+ (unless (eq c ?=)
+ (error "Invalid header: %s" string))
(forward-char 1)
- (setq c (char-after)))))
- ;; See if we have any previous continuations.
- (when (and prev-attribute
- (not (eq prev-attribute attribute)))
- (push (cons prev-attribute prev-value) parameters)
- (setq prev-attribute nil
- prev-value ""))
- (unless (eq c ?=)
- (error "Invalid header: %s" string))
- (forward-char 1)
- (setq c (char-after))
- (cond
- ((eq c ?\")
- (setq value
- (buffer-substring (1+ (point))
- (progn (forward-sexp 1) (1- (point))))))
- ((and (or (memq c ttoken)
- (> c ?\177)) ;; EXTENSION: Support non-ascii chars.
- (not (memq c stoken)))
- (setq value (buffer-substring
- (point) (progn (forward-sexp) (point)))))
- (t
- (error "Invalid header: %s" string)))
- (if number
- (setq prev-attribute attribute
- prev-value (concat prev-value value))
- (push (cons attribute
- (if encoded
- (rfc2231-decode-encoded-string value)
- value))
- parameters))))
-
- ;; Take care of any final continuations.
- (when prev-attribute
- (push (cons prev-attribute
- (if encoded
- (rfc2231-decode-encoded-string prev-value)
- prev-value))
- parameters))
-
- (when type
- `(,type ,@(nreverse parameters)))))))
+ (setq c (char-after))
+ (cond
+ ((eq c ?\")
+ (setq value (buffer-substring (1+ (point))
+ (progn
+ (forward-sexp 1)
+ (1- (point)))))
+ (when encoded
+ (setq value (mapconcat (lambda (c) (format "%%%02x" c))
+ value ""))))
+ ((and (or (memq c ttoken)
+ ;; EXTENSION: Support non-ascii chars.
+ (> c ?\177))
+ (not (memq c stoken)))
+ (setq value
+ (buffer-substring
+ (point)
+ (progn
+ (forward-sexp)
+ ;; We might not have reached at the end of
+ ;; the value because of non-ascii chars,
+ ;; so we should jump over them if any.
+ (while (and (not (eobp))
+ (> (char-after) ?\177))
+ (forward-char 1)
+ (forward-sexp))
+ (point)))))
+ (t
+ (error "Invalid header: %s" string)))
+ (if number
+ (progn
+ (push (cons number value) vals)
+ (setq prev-attribute attribute
+ prev-encoded encoded))
+ (push (cons attribute
+ (if encoded
+ (rfc2231-decode-encoded-string value)
+ value))
+ parameters))))
+
+ ;; Take care of any final continuations.
+ (when prev-attribute
+ (setq vals (mapconcat 'cdr (sort vals 'car-less-than-car) ""))
+ (push (cons prev-attribute
+ (if prev-encoded
+ (rfc2231-decode-encoded-string vals)
+ vals))
+ parameters)))
+ (error
+ (setq parameters nil)
+ (if signal-error
+ (signal (car err) (cdr err))
+ ;;(message "%s" (error-message-string err))
+ )))
+
+ (cons type (nreverse parameters))))))
(defun rfc2231-decode-encoded-string (string)
"Decode an RFC2231-encoded string.
-These look like \"us-ascii'en-us'This%20is%20%2A%2A%2Afun%2A%2A%2A\"."
- (with-temp-buffer
- (let ((elems (split-string string "'")))
- ;; The encoded string may contain zero to two single-quote
- ;; marks. This should give us the encoded word stripped
- ;; of any preceding values.
- (insert (car (last elems)))
+These look like:
+ \"us-ascii'en-us'This%20is%20%2A%2A%2Afun%2A%2A%2A\",
+ \"us-ascii''This%20is%20%2A%2A%2Afun%2A%2A%2A\",
+ \"'en-us'This%20is%20%2A%2A%2Afun%2A%2A%2A\",
+ \"''This%20is%20%2A%2A%2Afun%2A%2A%2A\", or
+ \"This is ***fun***\"."
+ (string-match "\\`\\(?:\\([^']+\\)?'\\([^']+\\)?'\\)?\\(.+\\)" string)
+ (let ((coding-system (mm-charset-to-coding-system (match-string 1 string)))
+ ;;(language (match-string 2 string))
+ (value (match-string 3 string)))
+ (mm-with-multibyte-buffer
+ (insert value)
(goto-char (point-min))
(while (search-forward "%" nil t)
(insert
(prog1
(string-to-number (buffer-substring (point) (+ (point) 2)) 16)
(delete-region (1- (point)) (+ (point) 2)))))
- ;; Encode using the charset, if any.
- (when (and (mm-multibyte-p)
- (> (length elems) 1)
- (not (equal (intern (downcase (car elems))) 'us-ascii)))
- (mm-decode-coding-region (point-min) (point-max)
- (intern (downcase (car elems)))))
+ ;; Decode using the charset, if any.
+ (unless (memq coding-system '(nil ascii))
+ (mm-decode-coding-region (point-min) (point-max) coding-system))
(buffer-string))))
(defun rfc2231-encode-string (param value)
- "Return and PARAM=VALUE string encoded according to RFC2231."
+ "Return and PARAM=VALUE string encoded according to RFC2231.
+Use `mml-insert-parameter' or `mml-insert-parameter-string' to insert
+the result of this function."
(let ((control (ietf-drums-token-to-list ietf-drums-no-ws-ctl-token))
(tspecial (ietf-drums-token-to-list ietf-drums-tspecials))
(special (ietf-drums-token-to-list "*'%\n\t"))
(ascii (ietf-drums-token-to-list ietf-drums-text-token))
(num -1)
+ ;; Don't make lines exceeding 76 column.
+ (limit (- 74 (length param)))
spacep encodep charsetp charset broken)
(with-temp-buffer
(insert value)
(when charsetp
(setq charset (mm-encode-body)))
(cond
- ((or encodep charsetp)
+ ((or encodep charsetp
+ (progn
+ (end-of-line)
+ (> (current-column) (if spacep (- limit 2) limit))))
+ (setq limit (- limit 6))
(goto-char (point-min))
+ (insert (symbol-name (or charset 'us-ascii)) "''")
(while (not (eobp))
- (when (> (current-column) 60)
- (insert ";\n")
- (setq broken t))
(if (or (not (memq (following-char) ascii))
(memq (following-char) control)
(memq (following-char) tspecial)
(memq (following-char) special)
(eq (following-char) ? ))
(progn
+ (when (>= (current-column) (1- limit))
+ (insert ";\n")
+ (setq broken t))
(insert "%" (format "%02x" (following-char)))
(delete-char 1))
+ (when (> (current-column) limit)
+ (insert ";\n")
+ (setq broken t))
(forward-char 1)))
(goto-char (point-min))
- (insert (symbol-name (or charset 'us-ascii)) "''")
- (goto-char (point-min))
(if (not broken)
(insert param "*=")
(while (not (eobp))
- (insert (if (>= num 0) " " "\n ")
+ (insert (if (>= num 0) " " "")
param "*" (format "%d" (incf num)) "*=")
(forward-line 1))))
(spacep
;; You should have received a copy of the GNU General Public License
;; along with this program; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;; You should have received a copy of the GNU General Public License
;; along with this program; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;; This program is implemented from draft-leach-digest-sasl-05.txt.
;;
;;
;; You should have received a copy of the GNU General Public License
;; along with this program; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;; You should have received a copy of the GNU General Public License
;; along with this program; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; score-mode.el --- mode for editing Gnus score files
-;; Copyright (C) 1996, 2001, 2004 Free Software Foundation, Inc.
+;; Copyright (C) 1996, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: news, mail
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(eval-when-compile (require 'cl))
(require 'mm-util) ; for mm-universal-coding-system
-(require 'gnus-util) ; for gnus-pp
+(require 'gnus-util) ; for gnus-pp, gnus-run-mode-hooks
+
+(defvar gnus-score-edit-done-hook nil
+ "*Hook run at the end of closing the score buffer.")
(defvar gnus-score-mode-hook nil
"*Hook run in score mode buffers.")
(setq mode-name "Score")
(lisp-mode-variables nil)
(make-local-variable 'gnus-score-edit-exit-function)
- (run-hooks 'emacs-lisp-mode-hook 'gnus-score-mode-hook))
+ (gnus-run-mode-hooks 'emacs-lisp-mode-hook 'gnus-score-mode-hook))
(defun gnus-score-make-menu-bar ()
(unless (boundp 'gnus-score-menu)
;;; sha1.el --- SHA1 Secure Hash Algorithm in Emacs-Lisp
-;; Copyright (C) 1999, 2001, 2003, 2004 Free Software Foundation, Inc.
+;; Copyright (C) 1999, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Shuhei KOBAYASHI <shuhei@aqua.ocn.ne.jp>
;; Keywords: SHA1, FIPS 180-1
;; You should have received a copy of the GNU General Public License
;; along with this program; see the file COPYING. If not, write to
-;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; sieve-manage.el --- Implementation of the managesive protocol in elisp
-;; Copyright (C) 2001, 2003, 2004 Free Software Foundation, Inc.
+
+;; Copyright (C) 2001, 2002, 2003, 2004, 2005,
+;; 2006 Free Software Foundation, Inc.
;; Author: Simon Josefsson <simon@josefsson.org>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(defcustom sieve-manage-log "*sieve-manage-log*"
"Name of buffer for managesieve session trace."
- :type 'string)
+ :type 'string
+ :group 'sieve-manage)
(defcustom sieve-manage-default-user (user-login-name)
"Default username to use."
- :type 'string)
+ :type 'string
+ :group 'sieve-manage)
(defcustom sieve-manage-server-eol "\r\n"
"The EOL string sent from the server."
- :type 'string)
+ :type 'string
+ :group 'sieve-manage)
(defcustom sieve-manage-client-eol "\r\n"
"The EOL string we send to the server."
- :type 'string)
+ :type 'string
+ :group 'sieve-manage)
(defcustom sieve-manage-streams '(network starttls shell)
- "Priority of streams to consider when opening connection to server.")
+ "Priority of streams to consider when opening connection to server."
+ :group 'sieve-manage)
(defcustom sieve-manage-stream-alist
'((network sieve-manage-network-p sieve-manage-network-open)
NAME names the stream, CHECK is a function returning non-nil if the
server support the stream and OPEN is a function for opening the
-stream.")
+stream."
+ :group 'sieve-manage)
(defcustom sieve-manage-authenticators '(digest-md5
cram-md5
ntlm
plain
login)
- "Priority of authenticators to consider when authenticating to server.")
+ "Priority of authenticators to consider when authenticating to server."
+ :group 'sieve-manage)
(defcustom sieve-manage-authenticator-alist
'((cram-md5 sieve-manage-cram-md5-p sieve-manage-cram-md5-auth)
NAME names the authenticator. CHECK is a function returning non-nil if
the server support the authenticator and AUTHENTICATE is a function
-for doing the actual authentication.")
+for doing the actual authentication."
+ :group 'sieve-manage)
(defcustom sieve-manage-default-port 2000
"Default port number for managesieve protocol."
- :type 'integer)
+ :type 'integer
+ :group 'sieve-manage)
;; Internal variables:
it where sucessful authenticating itself to the server, nil otherwise.
Returns t if login was successful, nil otherwise."
(with-current-buffer buffer
- (make-variable-buffer-local 'sieve-manage-username)
- (make-variable-buffer-local 'sieve-manage-password)
+ (make-local-variable 'sieve-manage-username)
+ (make-local-variable 'sieve-manage-password)
(let (user passwd ret reason passwd-key)
(condition-case ()
(while (or (not user) (not passwd))
to work in."
(setq buffer (or buffer (format " *sieve* %s:%d" server (or port 2000))))
(with-current-buffer (get-buffer-create buffer)
- (mapc 'make-variable-buffer-local sieve-manage-local-variables)
+ (mapc 'make-local-variable sieve-manage-local-variables)
(sieve-manage-disable-multibyte)
(buffer-disable-undo)
(setq sieve-manage-server (or server sieve-manage-server))
(with-current-buffer (or buffer (current-buffer))
(if (not (eq sieve-manage-state 'nonauth))
(eq sieve-manage-state 'auth)
- (make-variable-buffer-local 'sieve-manage-username)
- (make-variable-buffer-local 'sieve-manage-password)
+ (make-local-variable 'sieve-manage-username)
+ (make-local-variable 'sieve-manage-password)
(if user (setq sieve-manage-username user))
(if passwd (setq sieve-manage-password passwd))
(if (funcall (nth 2 (assq sieve-manage-auth
;;; sieve-mode.el --- Sieve code editing commands for Emacs
-;; Copyright (C) 2001, 2003, 2004 Free Software Foundation, Inc.
+
+;; Copyright (C) 2001, 2002, 2003, 2004, 2005,
+;; 2006 Free Software Foundation, Inc.
;; Author: Simon Josefsson <simon@josefsson.org>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;; Font-lock
-(defvar sieve-control-commands-face 'sieve-control-commands-face
+(defvar sieve-control-commands-face 'sieve-control-commands
"Face name used for Sieve Control Commands.")
-(defface sieve-control-commands-face
+(defface sieve-control-commands
'((((type tty) (class color)) (:foreground "blue" :weight light))
(((class grayscale) (background light)) (:foreground "LightGray" :bold t))
(((class grayscale) (background dark)) (:foreground "DimGray" :bold t))
(((class color) (background light)) (:foreground "Orchid"))
(((class color) (background dark)) (:foreground "LightSteelBlue"))
(t (:bold t)))
- "Face used for Sieve Control Commands.")
+ "Face used for Sieve Control Commands."
+ :group 'sieve)
+;; backward-compatibility alias
+(put 'sieve-control-commands-face 'face-alias 'sieve-control-commands)
-(defvar sieve-action-commands-face 'sieve-action-commands-face
+(defvar sieve-action-commands-face 'sieve-action-commands
"Face name used for Sieve Action Commands.")
-(defface sieve-action-commands-face
+(defface sieve-action-commands
'((((type tty) (class color)) (:foreground "blue" :weight bold))
(((class color) (background light)) (:foreground "Blue"))
(((class color) (background dark)) (:foreground "LightSkyBlue"))
(t (:inverse-video t :bold t)))
- "Face used for Sieve Action Commands.")
+ "Face used for Sieve Action Commands."
+ :group 'sieve)
+;; backward-compatibility alias
+(put 'sieve-action-commands-face 'face-alias 'sieve-action-commands)
-(defvar sieve-test-commands-face 'sieve-test-commands-face
+(defvar sieve-test-commands-face 'sieve-test-commands
"Face name used for Sieve Test Commands.")
-(defface sieve-test-commands-face
+(defface sieve-test-commands
'((((type tty) (class color)) (:foreground "magenta"))
(((class grayscale) (background light))
(:foreground "LightGray" :bold t :underline t))
(((class color) (background light)) (:foreground "CadetBlue"))
(((class color) (background dark)) (:foreground "Aquamarine"))
(t (:bold t :underline t)))
- "Face used for Sieve Test Commands.")
+ "Face used for Sieve Test Commands."
+ :group 'sieve)
+;; backward-compatibility alias
+(put 'sieve-test-commands-face 'face-alias 'sieve-test-commands)
-(defvar sieve-tagged-arguments-face 'sieve-tagged-arguments-face
+(defvar sieve-tagged-arguments-face 'sieve-tagged-arguments
"Face name used for Sieve Tagged Arguments.")
-(defface sieve-tagged-arguments-face
+(defface sieve-tagged-arguments
'((((type tty) (class color)) (:foreground "cyan" :weight bold))
(((class grayscale) (background light)) (:foreground "LightGray" :bold t))
(((class grayscale) (background dark)) (:foreground "DimGray" :bold t))
(((class color) (background light)) (:foreground "Purple"))
(((class color) (background dark)) (:foreground "Cyan"))
(t (:bold t)))
- "Face used for Sieve Tagged Arguments.")
+ "Face used for Sieve Tagged Arguments."
+ :group 'sieve)
+;; backward-compatibility alias
+(put 'sieve-tagged-arguments-face 'face-alias 'sieve-tagged-arguments)
(defconst sieve-font-lock-keywords
;;; sieve.el --- Utilities to manage sieve scripts
-;; Copyright (C) 2001, 2003, 2004 Free Software Foundation, Inc.
+
+;; Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Simon Josefsson <simon@josefsson.org>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(if (eq last-command 'sieve-help)
;; would need minor-mode for log-edit-mode
(describe-function 'sieve-mode)
- (message (substitute-command-keys
+ (message "%s" (substitute-command-keys
"`\\[sieve-edit-script]':edit `\\[sieve-activate]':activate `\\[sieve-deactivate]':deactivate `\\[sieve-remove]':remove"))))
(defun sieve-bury-buffer (buf &optional mainbuf)
;;; smiley.el --- displaying smiley faces
-;; Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+;; Copyright (C) 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Dave Love <fx@gnu.org>
;; Keywords: news mail multimedia
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;; I'm not sure we need that degree of rococoness and defaults like a
;; yellow background. Also, using PBM means we can display the images
;; more generally. -- fx
-
-;;; Test smileys: :-) :-\ :-( :-/
+;; `smiley.el' was replaced by `smiley-ems.el' on 2002-01-26 (after fx'
+;; comment).
+
+;; Test smileys:
+;; smile ^:-) ^:)
+;; blink ;-) ;)
+;; forced :-]
+;; braindamaged 8-)
+;; indifferent :-|
+;; wry :-/ :-\
+;; sad :-(
+;; frown :-{
+;; evil >:-)
+;; cry ;-(
+;; dead X-)
+;; grin :-D
;;; Code:
:group 'gnus-visual)
;; Maybe this should go.
-(defcustom smiley-data-directory (nnheader-find-etc-directory "images/smilies")
- "*Location of the smiley faces files."
+(defcustom smiley-data-directory
+ (nnheader-find-etc-directory "images/smilies")
+ "Location of the smiley faces files."
:type 'directory
:group 'smiley)
("\\(:-(\\)\\W" 1 "sad")
("\\(:-{\\)\\W" 1 "frown"))
"*A list of regexps to map smilies to images.
-The elements are (REGEXP MATCH FILE), where MATCH is the submatch in
-regexp to replace with IMAGE. IMAGE is the name of a PBM file in
+The elements are (REGEXP MATCH IMAGE), where MATCH is the submatch in
+regexp to replace with IMAGE. IMAGE is the name of an image file in
`smiley-data-directory'."
:type '(repeat (list regexp
(integer :tag "Regexp match number")
(when (gnus-image-type-available-p 'xpm)
(push "xpm" types))
types)
- "*List of suffixes on picon file names to try."
+ "*List of suffixes on smiley file names to try."
:version "22.1"
:type '(repeat string)
:group 'smiley)
(defvar smiley-cached-regexp-alist nil)
(defun smiley-update-cache ()
+ (setq smiley-cached-regexp-alist nil)
(dolist (elt (if (symbolp smiley-regexp-alist)
(symbol-value smiley-regexp-alist)
smiley-regexp-alist))
(push (list (car elt) (cadr elt) image)
smiley-cached-regexp-alist)))))))
-(defvar smiley-mouse-map
- (let ((map (make-sparse-keymap)))
- (define-key map [down-mouse-2] 'ignore) ; override widget
- (define-key map [mouse-2]
- 'smiley-mouse-toggle-buffer)
- map))
+;; Not implemented:
+;; (defvar smiley-mouse-map
+;; (let ((map (make-sparse-keymap)))
+;; (define-key map [down-mouse-2] 'ignore) ; override widget
+;; (define-key map [mouse-2]
+;; 'smiley-mouse-toggle-buffer)
+;; map))
;;;###autoload
(defun smiley-region (start end)
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;; made to achieve compatibility with OpenLDAP v2 and to make it
;; possible to retrieve LDAP attributes that are tagged ie ";binary".
-;; When Gnus drops support for Emacs 21.x this file can be removed and
-;; smime.el changed to
-
-;; - (require 'smime-ldap) => (require 'ldap)
-;; - (smime-ldap-search ...) => (ldap-search ...)
-
-;; If we are running in Emacs 22 or newer it just uses the build-in
-;; version of ldap-search.
+;; The file also adds a compatibility layer for Emacs and XEmacs.
;;; Code:
Additional search parameters can be specified through
`ldap-host-parameters-alist', which see."
(interactive "sFilter:")
- (if (>= emacs-major-version 22)
- (ldap-search filter host attributes attrsonly)
- (or host
- (setq host ldap-default-host)
- (error "No LDAP host specified"))
- (let ((host-plist (cdr (assoc host ldap-host-parameters-alist)))
- result)
- (setq result (smime-ldap-search-internal
- (append host-plist
- (list 'host host
- 'filter filter
- 'attributes attributes
- 'attrsonly attrsonly
- 'withdn withdn))))
- (if ldap-ignore-attribute-codings
- result
- (mapcar (function
- (lambda (record)
- (mapcar 'ldap-decode-attribute record)))
- result)))))
+ ;; for XEmacs
+ (if (fboundp 'ldap-search-entries)
+ (ldap-search-entries filter host attributes attrsonly)
+ ;; for Emacs 22
+ (if (>= emacs-major-version 22)
+ (cdr (ldap-search filter host attributes attrsonly))
+ ;; for Emacs 21.x
+ (or host
+ (setq host ldap-default-host)
+ (error "No LDAP host specified"))
+ (let ((host-plist (cdr (assoc host ldap-host-parameters-alist)))
+ result)
+ (setq result (smime-ldap-search-internal
+ (append host-plist
+ (list 'host host
+ 'filter filter
+ 'attributes attributes
+ 'attrsonly attrsonly
+ 'withdn withdn))))
+ (cdr (if ldap-ignore-attribute-codings
+ result
+ (mapcar (function
+ (lambda (record)
+ (mapcar 'ldap-decode-attribute record)))
+ result)))))))
(defun smime-ldap-search-internal (search-plist)
"Perform a search on a LDAP server.
;;; smime.el --- S/MIME support library
-;; Copyright (c) 2000, 2001, 2003, 2005 Free Software Foundation, Inc.
+
+;; Copyright (C) 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Simon Josefsson <simon@josefsson.org>
;; Keywords: SMIME X.509 PEM OpenSSL
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(require 'password)
(eval-when-compile (require 'cl))
+(eval-and-compile
+ (cond
+ ((fboundp 'replace-in-string)
+ (defalias 'smime-replace-in-string 'replace-in-string))
+ ((fboundp 'replace-regexp-in-string)
+ (defun smime-replace-in-string (string regexp newtext &optional literal)
+ "Replace all matches for REGEXP with NEWTEXT in STRING.
+If LITERAL is non-nil, insert NEWTEXT literally. Return a new
+string containing the replacements.
+
+This is a compatibility function for different Emacsen."
+ (replace-regexp-in-string regexp newtext string nil literal)))))
+
(defgroup smime nil
- "S/MIME configuration.")
+ "S/MIME configuration."
+ :group 'mime)
(defcustom smime-keys nil
"*Map mail addresses to a file containing Certificate (and private key).
keyfile
(smime-get-key-with-certs-by-email
(completing-read
- (concat "Sign using which key? "
- (if smime-keys (concat "(default " (caar smime-keys) ") ")
- ""))
+ (concat "Sign using key"
+ (if smime-keys
+ (concat " (default " (caar smime-keys) "): ")
+ ": "))
smime-keys nil nil (car-safe (car-safe smime-keys))))))
(error "Signing failed"))))
(or keyfile
(smime-get-key-by-email
(completing-read
- (concat "Decipher using which key? "
- (if smime-keys (concat "(default " (caar smime-keys) ") ")
- ""))
+ (concat "Decipher using key"
+ (if smime-keys (concat " (default " (caar smime-keys) "): ")
+ ": "))
smime-keys nil nil (car-safe (car-safe smime-keys)))))))))
;; Various operations
host '("userCertificate") nil))
(retbuf (generate-new-buffer (format "*certificate for %s*" mail)))
cert)
- (if (> (length ldapresult) 1)
+ (if (and (>= (length ldapresult) 1)
+ (> (length (cadaar ldapresult)) 0))
(with-current-buffer retbuf
- (setq cert (base64-encode-string (nth 1 (car (nth 1 ldapresult))) t))
+ ;; Certificates on LDAP servers _should_ be in DER format,
+ ;; but there are some servers out there that distributes the
+ ;; certificates in PEM format (with or without
+ ;; header/footer) so we try to handle them anyway.
+ (if (or (string= (substring (cadaar ldapresult) 0 27)
+ "-----BEGIN CERTIFICATE-----")
+ (string= (substring (cadaar ldapresult) 0 3)
+ "MII"))
+ (setq cert
+ (smime-replace-in-string
+ (cadaar ldapresult)
+ (concat "\\(\n\\|\r\\|-----BEGIN CERTIFICATE-----\\|"
+ "-----END CERTIFICATE-----\\)")
+ "" t))
+ (setq cert (base64-encode-string (cadaar ldapresult) t)))
(insert "-----BEGIN CERTIFICATE-----\n")
(let ((i 0) (len (length cert)))
(while (> (- len 64) i)
(use-local-map smime-mode-map)
(buffer-disable-undo)
(setq truncate-lines t)
- (setq buffer-read-only t))
+ (setq buffer-read-only t)
+ (gnus-run-mode-hooks 'smime-mode-hook))
(defun smime-certificate-info (certfile)
(interactive "fCertificate file: ")
;;; spam-report.el --- Reporting spam
-;; Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
-;; Author: Teodor Zlatanov <tzz@lifelogs.com>
-;; Keywords: network
+;; Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+
+;; Author: Ted Zlatanov <tzz@lifelogs.com>
+;; Keywords: network, spam, mail, gmane, report
;; This file is part of GNU Emacs.
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(autoload 'mm-url-insert "mm-url"))
(defgroup spam-report nil
- "Spam reporting configuration.")
+ "Spam reporting configuration."
+ :group 'mail
+ :group 'news)
(defcustom spam-report-gmane-regex nil
"Regexp matching Gmane newsgroups, e.g. \"^nntp\\+.*:gmane\\.\"
(regexp :value "^nntp\+.*:gmane\."))
:group 'spam-report)
-(defcustom spam-report-gmane-spam-header
- "^X-Report-Spam: http://\\([^/]+\\)\\(.*\\)$"
- "String matching Gmane spam-reporting header. Two match groups are needed."
- :type 'regexp
- :group 'spam-report)
-
(defcustom spam-report-gmane-use-article-number t
- "Whether the article number (faster!) or the header should be used."
+ "Whether the article number (faster!) or the header should be used.
+
+You must set this to nil if you don't read Gmane groups directly
+from news.gmane.org, e.g. when using local newsserver such as
+leafnode."
:type 'boolean
:group 'spam-report)
"Report an article as ham by resending via email."
(spam-report-resend articles t))
-(defun spam-report-gmane (&rest articles)
- "Report an article as spam through Gmane."
+(defun spam-report-gmane-ham (&rest articles)
+ "Report ARTICLES as ham (unregister) through Gmane."
(interactive (gnus-summary-work-articles current-prefix-arg))
(dolist (article articles)
- (when (and gnus-newsgroup-name
- (or (null spam-report-gmane-regex)
- (string-match spam-report-gmane-regex gnus-newsgroup-name)))
- (gnus-message 6 "Reporting spam article %d to spam.gmane.org..." article)
+ (spam-report-gmane-internal t article)))
+
+(defun spam-report-gmane-spam (&rest articles)
+ "Report ARTICLES as spam through Gmane."
+ (interactive (gnus-summary-work-articles current-prefix-arg))
+ (dolist (article articles)
+ (spam-report-gmane-internal nil article)))
+
+;; `spam-report-gmane' was an interactive entry point, so we should provide an
+;; alias.
+(defalias 'spam-report-gmane 'spam-report-gmane-spam)
+
+(defun spam-report-gmane-internal (unspam article)
+ "Report ARTICLE as spam or not-spam through Gmane, depending on UNSPAM."
+ (when (and gnus-newsgroup-name
+ (or (null spam-report-gmane-regex)
+ (string-match spam-report-gmane-regex gnus-newsgroup-name)))
+ (let ((rpt-host (if unspam "unspam.gmane.org" "spam.gmane.org")))
+ (gnus-message 6 "Reporting article %d to %s..." article rpt-host)
(if spam-report-gmane-use-article-number
- (spam-report-url-ping
- "spam.gmane.org"
+ (spam-report-url-ping
+ rpt-host
(format "/%s:%d"
(gnus-group-real-name gnus-newsgroup-name)
article))
(with-current-buffer nntp-server-buffer
(gnus-request-head article gnus-newsgroup-name)
- (goto-char (point-min))
- (if (re-search-forward spam-report-gmane-spam-header nil t)
- (let* ((host (match-string 1))
- (report (match-string 2))
- (url (format "http://%s%s" host report)))
- (gnus-message 7 "Reporting spam through URL %s..." url)
- (spam-report-url-ping host report))
- (gnus-message 3 "Could not find X-Report-Spam in article %d..."
- article)))))))
-
+ (let ((case-fold-search t)
+ field host report url)
+ ;; First check for X-Report-Spam because it's more specific to
+ ;; spam reporting than Archived-At. OTOH, all new articles on
+ ;; Gmane don't have X-Report-Spam anymore (unless Lars changes his
+ ;; mind :-)).
+ ;;
+ ;; There might be more than one Archived-At header so we need to
+ ;; find (and transform) the one related to Gmane.
+ (setq field (or (gnus-fetch-field "X-Report-Spam")
+ (gnus-fetch-field "X-Report-Unspam")
+ (gnus-fetch-field "Archived-At")))
+ (when (stringp field)
+ (setq host
+ (progn
+ (string-match
+ (concat "http://\\([a-z]+\\.gmane\\.org\\)"
+ "\\(/[^:/]+[:/][0-9]+\\)")
+ field)
+ (match-string 1 field)))
+ (setq report (match-string 2 field))
+ (when (string-equal "permalink.gmane.org" host)
+ (setq host rpt-host)
+ (setq report (gnus-replace-in-string
+ report "/\\([0-9]+\\)$" ":\\1")))
+ (setq url (format "http://%s%s" host report)))
+ (if (not (and host report url))
+ (gnus-message
+ 3 "Could not find a spam report header in article %d..."
+ article)
+ (gnus-message 7 "Reporting article through URL %s..." url)
+ (spam-report-url-ping host report))))))))
(defun spam-report-url-ping (host report)
"Ping a host through HTTP, addressing a specific GET resource using
the function specified by `spam-report-url-ping-function'."
+ ;; Example:
+ ;; host: "spam.gmane.org"
+ ;; report: "/gmane.some.group:123456"
(funcall spam-report-url-ping-function host report))
+(defcustom spam-report-user-mail-address
+ (and (stringp user-mail-address)
+ (gnus-replace-in-string user-mail-address "@" "<at>"))
+ "Mail address of this user used for spam reports to Gmane.
+This is initialized based on `user-mail-address'."
+ :type '(choice string
+ (const :tag "Don't expose address" nil))
+ :version "23.0" ;; No Gnus
+ :group 'spam-report)
+
+(defvar spam-report-user-agent
+ (if spam-report-user-mail-address
+ (format "%s (%s) %s" "spam-report.el"
+ spam-report-user-mail-address
+ (gnus-extended-version))
+ (format "%s %s" "spam-report.el"
+ (gnus-extended-version))))
+
(defun spam-report-url-ping-plain (host report)
"Ping a host through HTTP, addressing a specific GET resource."
(let ((tcp-connection))
(set-marker (process-mark tcp-connection) (point-min))
(process-send-string
tcp-connection
- (format "GET %s HTTP/1.1\nUser-Agent: %s (spam-report.el)\nHost: %s\n\n"
- report (gnus-emacs-version) host)))))
+ (format "GET %s HTTP/1.1\nUser-Agent: %s\nHost: %s\n\n"
+ report spam-report-user-agent host)))))
;;;###autoload
(defun spam-report-process-queue (&optional file keep)
the external program specified in `mm-url-program' to connect to
server."
(with-temp-buffer
- (let ((url (concat "http://" host report)))
+ (let ((url (format "http://%s%s" host report)))
(mm-url-insert url t))))
;;;###autoload
(defun spam-report-url-to-file (host report)
"Collect spam report requests in `spam-report-requests-file'.
Customize `spam-report-url-ping-function' to use this function."
- (let ((url (concat "http://" host report))
+ (let ((url (format "http://%s%s" host report))
(file spam-report-requests-file))
(gnus-make-directory (file-name-directory file))
(gnus-message 9 "Writing URL `%s' to file `%s'" url file)
;;; spam-stat.el --- detecting spam based on statistics
-;; Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
+;; Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Alex Schroeder <alex@gnu.org>
;; Keywords: network
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; Code:
(require 'mail-parse)
+(defvar gnus-original-article-buffer)
+
(defgroup spam-stat nil
"Statistical spam detection for Emacs.
Use the functions to build a dictionary of words and their statistical
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; spam.el --- Identifying spam
-;; Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
+
+;; Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
-;; Keywords: network
+;; Maintainer: Ted Zlatanov <tzz@lifelogs.com>
+;; Keywords: network, spam, mail, bogofilter, BBDB, dspam, dig, whitelist, blacklist, gmane, hashcash, spamassassin, bsfilter, ifile, stat, crm114, spamoracle
;; This file is part of GNU Emacs.
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(eval-when-compile (require 'cl))
(eval-when-compile (require 'spam-report))
+(eval-when-compile (require 'hashcash))
(require 'gnus-sum)
;; autoload spam-report
(eval-and-compile
(autoload 'spam-report-gmane "spam-report")
+ (autoload 'spam-report-gmane-spam "spam-report")
+ (autoload 'spam-report-gmane-ham "spam-report")
(autoload 'spam-report-resend "spam-report"))
;; autoload gnus-registry
(defgroup spam nil
"Spam configuration."
- :version "22.1")
+ :version "22.1"
+ :group 'mail
+ :group 'news)
(defcustom spam-summary-exit-behavior 'default
"Exit behavior at the time of summary exit.
(defcustom spam-mark-new-messages-in-spam-group-as-spam t
"Whether new messages in a spam group should get the spam-mark."
:type 'boolean
+ ;; :version "22.1" ;; Gnus 5.10.8 / No Gnus 0.3
:group 'spam)
(defcustom spam-log-to-registry nil
:type '(radio (const nil) regexp)
:group 'spam)
-(defface spam-face
+(defface spam
'((((class color) (type tty) (background dark))
(:foreground "gray80" :background "gray50"))
(((class color) (type tty) (background light))
(((class color) (background light))
(:foreground "ivory4"))
(t :inverse-video t))
- "Face for spam-marked articles.")
+ "Face for spam-marked articles."
+ :group 'spam)
+;; backward-compatibility alias
+(put 'spam-face 'face-alias 'spam)
-(defcustom spam-face 'spam-face
+(defcustom spam-face 'spam
"Face for spam-marked articles."
:type 'face
:group 'spam)
nil)
(spam-install-nocheck-backend 'spam-use-gmane
- nil
+ 'spam-report-gmane-unregister-routine
'spam-report-gmane-register-routine
- ;; does Gmane support unregistration?
- nil
- nil)
+ 'spam-report-gmane-register-routine
+ 'spam-report-gmane-unregister-routine)
(spam-install-nocheck-backend 'spam-use-resend
'spam-report-resend-register-ham-routine
(return))))
result))
+(defvar spam-spamassassin-score-regexp
+ ".*\\b\\(?:score\\|hits\\)=\\(-?[0-9.]+\\)"
+ "Regexp matching SpamAssassin score header.
+The first group must match the number.")
+;; "score" for Spamassassin 3.0 or later:
+;; X-Spam-Status: Yes, score=13.1 required=5.0 tests=DNS_FROM_RFC_ABUSE,
+;; [...],UNDISC_RECIPS autolearn=disabled version=3.0.3
+
+
(defun spam-extra-header-to-number (header headers)
"Transform an extra HEADER to a number, using list of HEADERS.
Note this has to be fast."
((eq header 'X-Spam-Status)
(string-to-number (gnus-replace-in-string
(gnus-extra-header header headers)
- ".*hits=" "")))
+ spam-spamassassin-score-regexp
+ "\\1")))
;; for CRM checking, it's probably faster to just do the string match
((and spam-use-crm114 (string-match "( pR: \\([0-9.-]+\\)" header))
(match-string 1 header))
(gnus-group-spam-exit-processor-stat spam spam-use-stat)
(gnus-group-spam-exit-processor-spamoracle spam spam-use-spamoracle)
(gnus-group-spam-exit-processor-spamassassin spam spam-use-spamassassin)
+ (gnus-group-spam-exit-processor-report-gmane spam spam-use-gmane) ;; Buggy?
(gnus-group-ham-exit-processor-ifile ham spam-use-ifile)
(gnus-group-ham-exit-processor-bogofilter ham spam-use-bogofilter)
(gnus-group-ham-exit-processor-bsfilter ham spam-use-bsfilter)
;;{{{ Hashcash.
-(eval-when-compile
- (autoload 'mail-check-payment "hashcash"))
-
-(condition-case nil
- (progn
- (require 'hashcash)
+(defun spam-check-hashcash ()
+ "Check the headers for hashcash payments."
+ (ignore-errors (mail-check-payment))) ;mail-check-payment returns a boolean
- (defun spam-check-hashcash ()
- "Check the headers for hashcash payments."
- (mail-check-payment))) ;mail-check-payment returns a boolean
-
- (file-error))
;;}}}
;;{{{ BBDB
;;{{{ Spam-report glue (gmane and resend reporting)
(defun spam-report-gmane-register-routine (articles)
(when articles
- (apply 'spam-report-gmane articles)))
+ (apply 'spam-report-gmane-spam articles)))
+
+(defun spam-report-gmane-unregister-routine (articles)
+ (when articles
+ (apply 'spam-report-gmane-ham articles)))
(defun spam-report-resend-register-ham-routine (articles)
(spam-report-resend-register-routine articles t))
(if db `("-d" ,db "-v") `("-v"))))
(setq return (spam-check-bogofilter-headers score))))
return)
- (gnus-error "`spam.el' doesnt support obsolete bogofilter versions")))
+ (gnus-error 5 "`spam.el' doesn't support obsolete bogofilter versions")))
(defun spam-bogofilter-register-with-bogofilter (articles
spam
spam-bogofilter-path
nil nil nil switch
(if db `("-d" ,db "-v") `("-v")))))))
- (gnus-error "`spam.el' doesnt support obsolete bogofilter versions")))
+ (gnus-error 5 "`spam.el' doesn't support obsolete bogofilter versions")))
(defun spam-bogofilter-register-spam-routine (articles &optional unregister)
(spam-bogofilter-register-with-bogofilter articles t unregister))
(if score ; scoring mode
(let ((header (message-fetch-field spam-spamassassin-spam-status-header)))
(when header
- (if (string-match "hits=\\(-?[0-9.]+\\)" header)
+ (if (string-match spam-spamassassin-score-regexp header)
(match-string 1 header)
"0")))
;; spam detection mode
(add-to-list 'gnus-extra-headers header))
(setq spam-install-hooks t)
- ;; TODO: How do we redo this every time spam-face is customized?
- (push '((eq mark gnus-spam-mark) . spam-face)
+ ;; TODO: How do we redo this every time the `spam' face is customized?
+ (push '((eq mark gnus-spam-mark) . spam)
gnus-summary-highlight)
;; Add hooks for loading and saving the spam stats
(add-hook 'gnus-save-newsrc-hook 'spam-maybe-spam-stat-save)
;;; starttls.el --- STARTTLS functions
-;; Copyright (C) 1999, 2000, 2003, 2004 Free Software Foundation, Inc.
+;; Copyright (C) 1999, 2000, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Daiki Ueno <ueno@unixuser.org>
;; Author: Simon Josefsson <simon@josefsson.org>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;; [RFC 2595] "Using TLS with IMAP, POP3 and ACAP"
;; by Chris Newman <chris.newman@innosoft.com> (1999/06)
-;; This file now contain a combination of the two previous
+;; This file now contains a combination of the two previous
;; implementations both called "starttls.el". The first one is Daiki
;; Ueno's starttls.el which uses his own "starttls" command line tool,
;; and the second one is Simon Josefsson's starttls.el which uses
;; both tools installed. It is recommended to use GNUTLS, though, as
;; it performs more verification of the certificates.
-;; The GNUTLS support require GNUTLS 0.9.90 (released 2003-10-08) or
+;; The GNUTLS support requires GNUTLS 0.9.90 (released 2003-10-08) or
;; later, from <http://www.gnu.org/software/gnutls/>, or "starttls"
;; from <ftp://ftp.opaopa.org/pub/elisp/>.
;; (message "STARTTLS output:\n%s" (starttls-negotiate tmp))
;; (process-send-string tmp "EHLO foo\n"))
-;; An example run yield the following output:
+;; An example run yields the following output:
;;
;; 220 yxa.extundo.com ESMTP Sendmail 8.12.11/8.12.11/Debian-3; Wed, 26 May 2004 19:12:29 +0200; (No UCE/UBE) logging access from: c494102a.s-bi.bostream.se(OK)-c494102a.s-bi.bostream.se [217.215.27.65]
;; 220 2.0.0 Ready to start TLS
(defcustom starttls-extra-args nil
"Extra arguments to `starttls-program'.
-This program is used when the `starttls' command is used,
-i.e. when `starttls-use-gnutls' is nil."
+These apply when the `starttls' command is used, i.e. when
+`starttls-use-gnutls' is nil."
:type '(repeat string)
:group 'starttls)
(defcustom starttls-extra-arguments nil
"Extra arguments to `starttls-program'.
-This program is used when GNUTLS is used, i.e. when
-`starttls-use-gnutls' is non-nil.
+These apply when GNUTLS is used, i.e. when `starttls-use-gnutls' is non-nil.
For example, non-TLS compliant servers may require
'(\"--protocols\" \"ssl3\"). Invoke \"gnutls-cli --help\" to
(defcustom starttls-connect "- Simple Client Mode:\n\n"
"*Regular expression indicating successful connection.
The default is what GNUTLS's \"gnutls-cli\" outputs."
- ;; GNUTLS cli.c:main() print this string when it is starting to run
+ ;; GNUTLS cli.c:main() prints this string when it is starting to run
;; in the application read/write phase. If the logic, or the string
;; itself, is modified, this must be updated.
:version "22.1"
(defcustom starttls-failure "\\*\\*\\* Handshake has failed"
"*Regular expression indicating failed TLS handshake.
The default is what GNUTLS's \"gnutls-cli\" outputs."
- ;; GNUTLS cli.c:do_handshake() print this string on failure. If the
+ ;; GNUTLS cli.c:do_handshake() prints this string on failure. If the
;; logic, or the string itself, is modified, this must be updated.
:version "22.1"
:type 'regexp
:group 'starttls)
(defun starttls-negotiate-gnutls (process)
- "Negotiate TLS on process opened by `open-starttls-stream'.
-This should typically only be done once. It typically return a
+ "Negotiate TLS on PROCESS opened by `open-starttls-stream'.
+This should typically only be done once. It typically returns a
multi-line informational message with information about the
-handshake, or NIL on failure."
+handshake, or nil on failure."
(let (buffer info old-max done-ok done-bad)
(if (null (setq buffer (process-buffer process)))
;; XXX How to remove/extract the TLS negotiation junk?
(starttls-negotiate-gnutls process)
(signal-process (process-id process) 'SIGALRM)))
-(defun starttls-open-stream-gnutls (name buffer host service)
+(eval-and-compile
+ (if (fboundp 'set-process-query-on-exit-flag)
+ (defalias 'starttls-set-process-query-on-exit-flag
+ 'set-process-query-on-exit-flag)
+ (defalias 'starttls-set-process-query-on-exit-flag
+ 'process-kill-without-query)))
+
+(defun starttls-open-stream-gnutls (name buffer host port)
(message "Opening STARTTLS connection to `%s'..." host)
(let* (done
(old-max (with-current-buffer buffer (point-max)))
(process-connection-type starttls-process-connection-type)
(process (apply #'start-process name buffer
starttls-gnutls-program "-s" host
- "-p" (if (integerp service)
- (int-to-string service)
- service)
+ "-p" (if (integerp port)
+ (int-to-string port)
+ port)
starttls-extra-arguments)))
- (process-kill-without-query process)
+ (starttls-set-process-query-on-exit-flag process nil)
(while (and (processp process)
(eq (process-status process) 'run)
(save-excursion
host (if done "done" "failed"))
process))
-(defun starttls-open-stream (name buffer host service)
- "Open a TLS connection for a service to a host.
-Returns a subprocess-object to represent the connection.
+(defun starttls-open-stream (name buffer host port)
+ "Open a TLS connection for a port to a host.
+Returns a subprocess object to represent the connection.
Input and output work as for subprocesses; `delete-process' closes it.
-Args are NAME BUFFER HOST SERVICE.
+Args are NAME BUFFER HOST PORT.
NAME is name for process. It is modified if necessary to make it unique.
BUFFER is the buffer (or `buffer-name') to associate with the process.
Process output goes at end of that buffer, unless you specify
BUFFER may be also nil, meaning that this process is not associated
with any buffer
Third arg is name of the host to connect to, or its IP address.
-Fourth arg SERVICE is name of the service desired, or an integer
-specifying a port number to connect to."
+Fourth arg PORT is an integer specifying a port to connect to.
+If `starttls-use-gnutls' is nil, this may also be a service name, but
+GNUTLS requires a port number."
(if starttls-use-gnutls
- (starttls-open-stream-gnutls name buffer host service)
+ (starttls-open-stream-gnutls name buffer host port)
(let* ((process-connection-type starttls-process-connection-type)
(process (apply #'start-process
name buffer starttls-program
- host (format "%s" service)
+ host (format "%s" port)
starttls-extra-args)))
- (process-kill-without-query process)
+ (starttls-set-process-query-on-exit-flag process nil)
process)))
(provide 'starttls)
;;; time-date.el --- Date and time handling functions
-;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005
-;; Free Software Foundation, Inc.
+
+;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+;; Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Masanobu Umeda <umerin@mse.kyutech.ac.jp>
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
((eq type 1) (list high low))
((eq type 2) (list high low micro))))
+(autoload 'parse-time-string "parse-time")
(autoload 'timezone-make-date-arpa-standard "timezone")
;;;###autoload
;;; tls.el --- TLS/SSL support via wrapper around GnuTLS
-;; Copyright (C) 1996-1999, 2003, 2004 Free Software Foundation, Inc.
+;; Copyright (C) 1996, 1997, 1998, 1999, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Simon Josefsson <simon@josefsson.org>
;; Keywords: comm, tls, gnutls, ssl
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
:group 'comm)
(defcustom tls-program '("gnutls-cli -p %p %h"
- "gnutls-cli -p %p %h --protocols ssl3")
+ "gnutls-cli -p %p %h --protocols ssl3"
+ "openssl s_client -connect %h:%p -no_ssl2")
"List of strings containing commands to start TLS stream to a host.
Each entry in the list is tried until a connection is successful.
%s is replaced with server hostname, %p with port to connect to.
stdout. Also see `tls-success' for what the program should output
after successful negotiation."
:type '(repeat string)
+ :version "22.1"
:group 'tls)
(defcustom tls-process-connection-type nil
:type 'boolean
:group 'tls)
-(defcustom tls-success "- Handshake was completed"
+(defcustom tls-success "- Handshake was completed\\|SSL handshake has read "
"*Regular expression indicating completed TLS handshakes.
-The default is what GNUTLS's \"gnutls-cli\" outputs."
+The default is what GNUTLS's \"gnutls-cli\" or OpenSSL's
+\"openssl s_client\" outputs."
:version "22.1"
:type 'regexp
:group 'tls)
(push (cons (match-string 1) (match-string 2)) vals))
(nreverse vals))))))
-(defun open-tls-stream (name buffer host service)
- "Open a TLS connection for a service to a host.
+(defun open-tls-stream (name buffer host port)
+ "Open a TLS connection for a port to a host.
Returns a subprocess-object to represent the connection.
Input and output work as for subprocesses; `delete-process' closes it.
-Args are NAME BUFFER HOST SERVICE.
+Args are NAME BUFFER HOST PORT.
NAME is name for process. It is modified if necessary to make it unique.
BUFFER is the buffer (or buffer-name) to associate with the process.
Process output goes at end of that buffer, unless you specify
BUFFER may be also nil, meaning that this process is not associated
with any buffer
Third arg is name of the host to connect to, or its IP address.
-Fourth arg SERVICE is name of the service desired, or an integer
-specifying a port number to connect to."
+Fourth arg PORT is an integer specifying a port to connect to."
(let ((cmds tls-program) cmd done)
(message "Opening TLS connection to `%s'..." host)
(while (and (not done) (setq cmd (pop cmds)))
cmd
(format-spec-make
?h host
- ?p (if (integerp service)
- (int-to-string service)
- service)))))
+ ?p (if (integerp port)
+ (int-to-string port)
+ port)))))
response)
(while (and process
(memq (process-status process) '(open run))
;;; utf7.el --- UTF-7 encoding/decoding for Emacs -*-coding: iso-8859-1;-*-
-;; Copyright (C) 1999, 2000, 2003 Free Software Foundation, Inc.
+
+;; Copyright (C) 1999, 2000, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Jon K Hellan <hellan@acm.org>
;; Maintainer: bugs@gnus.org
;; 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.
+;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(defconst utf7-utf-16-coding-system
(cond ((mm-coding-system-p 'utf-16-be-no-signature) ; Mule-UCS
'utf-16-be-no-signature)
- ((and (mm-coding-system-p 'utf-16-be) ; Emacs 22.1
+ ((and (mm-coding-system-p 'utf-16-be) ; Emacs 21.3, Emacs 22
;; Avoid versions with BOM.
(= 2 (length (encode-coding-string "a" 'utf-16-be))))
'utf-16-be)
;;; uudecode.el -- elisp native uudecode
-;; Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004
-;; Free Software Foundation, Inc.
+;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
;; Keywords: uudecode news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;; webmail.el --- interface of web mail
-;; Copyright (C) 1999, 2000, 2001, 2004 Free Software Foundation, Inc.
+
+;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006 Free Software Foundation, Inc.
;; Author: Shenghuo Zhu <zsh@cs.rochester.edu>
;; Keywords: hotmail netaddress my-deja netscape
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(goto-char (point-min))
(delete-blank-lines)
(setq ct (mail-fetch-field "content-type")
- ctl (ignore-errors (mail-header-parse-content-type ct))
+ ctl (and ct (mail-header-parse-content-type ct))
;;cte (mail-fetch-field "content-transfer-encoding")
cd (mail-fetch-field "content-disposition")
description (mail-fetch-field "content-description")
;;; yenc.el --- elisp native yenc decoder
-;; Copyright (c) 2002 Free Software Foundation, Inc.
+
+;; Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Jesper Harder <harder@ifa.au.dk>
;; Keywords: yenc news
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
rem Written by Frank Schmitt (ich@frank-schmitt.net)\r
rem based on the work by David Charlap (shamino@writeme.com)\r
rem .\r
+rem .\r
+rem From http://my.gnus.org/node/343:\r
+rem A comment on installing Gnus on Windows 98 SE that might help others: When\r
+rem I ran the "make.bat" file in the 5.10.6 tarball I got a bunch of "Out of\r
+rem environment space" messages. The solution was to (1) make a shortcut to\r
+rem the make.bat file, and (2) right-click on the shortcut, setting "Cmd line"\r
+rem in the "Program" tab in "properties" to include the parameters make.bat\r
+rem requires, and "initial environment" in the "memories" tab, to the maximum\r
+rem (in my case, anyway, 2560).\r
+rem .\r
rem Clear PWD so emacs doesn't get confused\r
set GNUS_PWD_SAVE=%PWD%\r
set PWD=\r
set EMACS=emacs.bat\r
echo.\r
echo ***************************************************************************\r
-echo * Using emacs.bat (If you've got en Emacs >= 20.3 please remove Emacs.bat,\r
-echo * it isn't needed anymore.\r
+echo * Using emacs.bat (If you've got Emacs 20.3 or higher please remove\r
+echo * Emacs.bat, it isn't needed anymore.)\r
echo ***************************************************************************\r
echo.\r
goto emacs\r
xcopy /R /Q /Y .\gnus\* %GNUS_ETC_DIR%\gnus\\r
if ErrorLevel 1 set ERROR=%ERROR%,copy-etc-gnus-*\r
if not exist %GNUS_ETC_DIR%\images\nul mkdir %GNUS_ETC_DIR%\images\r
+xcopy /R /Q /Y .\images\*.??? %GNUS_ETC_DIR%\images\r
+if ErrorLevel 1 set ERROR=%ERROR%,copy-etc-images-*\r
if not exist %GNUS_ETC_DIR%\images\gnus\nul mkdir %GNUS_ETC_DIR%\images\gnus\r
xcopy /R /Q /Y .\images\gnus\* %GNUS_ETC_DIR%\images\gnus\\r
if ErrorLevel 1 set ERROR=%ERROR%,copy-etc-images-gnus-*\r
+if not exist %GNUS_ETC_DIR%\images\mail\nul mkdir %GNUS_ETC_DIR%\images\mail\r
+xcopy /R /Q /Y .\images\mail\* %GNUS_ETC_DIR%\images\mail\\r
+if ErrorLevel 1 set ERROR=%ERROR%,copy-etc-images-mail-*\r
if not exist %GNUS_ETC_DIR%\images\smilies\nul mkdir %GNUS_ETC_DIR%\images\smilies\r
xcopy /R /Q /Y .\images\smilies\* %GNUS_ETC_DIR%\images\smilies\\r
if ErrorLevel 1 set ERROR=%ERROR%,copy-etc-images-smilies-*\r
+2006-04-11 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus.texi, gnus-faq.texi, message.texi: No Gnus v0.4 is released.
+
+2006-04-10 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus.texi (Misc Group Stuff, Summary Buffer, Article Keymap)
+ (Server Commands): Key `v' is reserved for users.
+
+2006-04-07 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus.texi (Summary Buffer Lines): Add `*'.
+
+2006-04-07 Jochen K\e,A|\e(Bpper <jochen@fhi-berlin.mpg.de>
+
+ * gnus.texi (Group Parameters): Mention
+ gnus-permanently-visible-groups.
+
+2006-04-06 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.texi (Face): Restore xref to gnus-face-properties-alist;
+ fix typo.
+
+2006-04-05 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus.texi (X-Face): Clarify.
+ (Face): Need Emacs with PNG support.
+
+2006-04-04 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus.texi, message.texi: Bump version.
+
+2006-04-04 Simon Josefsson <jas@extundo.com>
+
+ * gnus.texi (Security): Improve.
+
+2006-03-31 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-news.texi: Restore customizable tool bar item. Markup
+ fixes. Minor rewording. Add "New packages and libraries",
+ "summary and article", "Appearance" and "Miscellaneous". Remove
+ "Major new features" and "Other changes". Add some @xref-s.
+
+2006-03-31 Romain Francoise <romain@orebokech.com>
+
+ * gnus.texi (Virtual Groups): `nnvirtual-always-rescan' defaults
+ to t, not nil (and has for the past eight years).
+
+2006-03-30 Romain Francoise <romain@orebokech.com>
+
+ * gnus-news.texi: Reorder entries in sections. Fix typos.
+ Add local variables section.
+
+ * gnus-news.el (gnus-news-header-disclaimer): Delete top section.
+ (gnus-news-fill-column): Increment to 80.
+ (gnus-news-translate-file): Support nested list items.
+
+2006-03-30 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-news.texi: Add gnus-group-update-tool-bar.
+
+2006-03-29 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus.texi (Top): Add comment about version line.
+
+ * message.texi (Top): Ditto. Change to take named versions into
+ account.
+
+ * gnus-news.texi: Add customizable tool bar.
+
+2006-03-28 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus.texi (Posting Styles): Add x-face-file to example.
+ (X-Face): Refer to posting styles.
+
+ * gnus-faq.texi ([5.8]): Add x-face-file.
+ ([8.4]): Add links to gmane.emacs.gnus.user and
+ gmane.emacs.gnus.general.
+
+2006-03-27 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * sasl.texi: Use @copyright{} instead of (C). Update copyright.
+
+2006-03-27 Karl Berry <karl@gnu.org>
+
+ * gnus.texi, message.texi, emacs-mime.texi, sieve.texi, pgg.texi:
+ Do not indent copyright year list.
+
+2006-03-27 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-faq.texi: Use .invalid.
+ ([5.4]): Fix gnus-posting-styles example.
+
+2006-03-20 Romain Francoise <romain@orebokech.com>
+
+ * gnus.texi (Mail Folders, Mail Spool): Grammar fixes.
+
+2006-03-10 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.texi (NoCeM): Mention gnus-use-nocem can also be a number.
+
+2006-03-10 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus.texi (Fancy Mail Splitting): Improve sentences so as to be
+ easy to understand.
+
+2006-03-09 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.texi: Markup fix.
+ (Fancy Mail Splitting): Specify new feature.
+
+2006-03-08 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.texi (Fancy Mail Splitting): Improve descriptions about
+ partial-words matching.
+
+2006-03-07 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * emacs-mime.texi (Display Customization): Reword image/.* stuff.
+
+ * gnus.texi (Oort Gnus): Add note about `gnus-load'.
+ (MIME Commands): Fix mm-discouraged-alternatives.
+
+2006-03-06 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-news.el, gnus-news.texi: Update copyright.
+
+2006-03-03 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * xemacs.mak: Remove outdated file. Use make.bat instead.
+
+ * gnus.texi (Oort Gnus): Add `mm-fill-flowed'.
+
+2006-02-09 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus.texi (Mail Spool): nnml-use-compressed-files can be a
+ string.
+ (Gnus Versions): Add history beyond start of Oort.
+
+ * gnus-news.texi: Add nnml-use-compressed-files.
+
+2006-01-31 Romain Francoise <romain@orebokech.com>
+
+ * message.texi: Update copyright year.
+
+2006-01-26 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * ps/Makefile.in (distclean): Remove Makefile.
+
+ * Makefile.in (almost-clean): Rename from clean.
+ (clean): Rename from veryclean.
+ (distclean): Use clean.
+ (pspackage): Use almost-clean.
+
+2006-01-16 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.texi: Update copyright.
+
+2006-01-13 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.texi (Article Washing): Additions.
+
+2006-01-08 Alex Schroeder <alex@gnu.org>
+
+ * pgg.texi (Caching passphrase): Rewording.
+
+2006-01-10 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.texi (RSS): Document nnrss-wash-html-in-text-plain-parts.
+
+2006-01-06 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.texi (Group Parameters): Fix description.
+ (RSS): Addition.
+
+2005-12-22 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.texi (Summary Post Commands): Fix function bound to `S O p'.
+
+2005-12-19 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * emacs-mime.texi (Display Customization): Add setting example to
+ mm-discouraged-alternatives.
+
+2005-12-15 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus.texi (Gmane Spam Reporting): Fix
+ spam-report-gmane-use-article-number. Add
+ spam-report-user-mail-address.
+
+2005-12-13 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-news.el (gnus-news-translate-file): Fix previous commit.
+
+ * gnus-coding.texi (Gnus Coding Style): Add `uudecode.el'.
+ (Gnus Maintainance Guide): Add ref to "Gnus Development". Add
+ conventions about custom versions.
+
+2005-12-12 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.texi (MIME Commands): Mention addition of
+ multipart/alternative to gnus-buttonized-mime-types and add xref
+ to mm-discouraged-alternatives.
+
+ * emacs-mime.texi (Display Customization): Mention addition of
+ "image/.*" and add xref to gnus-buttonized-mime-types in the
+ mm-discouraged-alternatives section.
+
+2005-12-06 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-news.el: Markup and description fixes and additions.
+
+2005-12-05 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * pgg.texi (User Commands): Fix description of pgg-verify-region.
+ (Selecting an implementation): Fix descriptions.
+
+2005-12-02 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-news.el: Update Copyright.
+ (gnus-news-translate-file): Avoid "*Note" at beginning of line.
+
+2005-12-01 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * emacs-mime.texi (Non-MIME): x-gnus-verbatim -> x-verbatim.
+
+2005-11-30 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * message.texi (Various Message Variables): Addition.
+
+2005-11-29 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * message.texi: Fix default values.
+
+2005-11-25 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * message.texi (Header Commands): Clarify descriptions of
+ message-cross-post-followup-to, message-reduce-to-to-cc, and
+ message-insert-wide-reply.
+ (Various Commands): Fix kindex for message-kill-to-signature;
+ clarify description of message-tab.
+
+2005-11-22 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * message.texi (Mailing Lists): Fix description about MFT.
+
+ * gnus.texi (Emacs Lisp): Use ~/.gnus.el instead of ~/.emacs.
+
+2005-11-17 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.texi (Slow Terminal Connection): Replace old description
+ with new one.
+
+2005-11-16 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.texi (Oort Gnus): Use ~/.gnus.el instead of ~/.emacs;
+ replace X-Draft-Headers with X-Draft-From.
+
+2005-11-14 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.texi (Various Various): Fix the default value of
+ nnheader-max-head-length.
+ (Gnus Versions): Fix typo.
+
+2005-11-10 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-coding.texi (Gnus Coding Style): Add MIME subsection.
+ (Gnus Maintainance Guide): Improvements.
+
+ * gnus.texi (Sorting the Summary Buffer): Replace 2005-10-29
+ change by a reference to `Group Parameters'. Use `(not ...)' in
+ example instead of `lambda' expression.
+ (Group Parameters): Add simplified sorting example based on
+ example for `Sorting the Summary Buffer' from Jari Aalto
+ <jari.aalto@cante.net>.
+ (Example Methods): Add example for an indirect connection.
+
+2005-11-10 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.texi (XVarious): Fix description of gnus-use-toolbar; add
+ new variable gnus-toolbar-thickness.
+
+2005-11-09 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.texi (Agent and flags): Add it to the detailmenu.
+
+2005-11-08 Kevin Greiner <kevin.greiner@compsol.cc>
+
+ * gnus.texi (nntp-open-via-telnet-and-telnet): Fixed grammar.
+ (Agent Parameters): Updated parameter names to match code.
+ (Group Agent Commands): Corrected 'gnus-agent-fetch-series' as
+ 'gnus-agent-summary-fetch-series'.
+ (Agent and flags): New section providing a generalized discussion
+ of flag handling.
+ (Agent and IMAP): Removed flag discussion.
+ (Agent Variables): Added 'gnus-agent-synchronize-flags'
+
+2005-11-08 Romain Francoise <romain@orebokech.com>
+
+ * gnus.texi (Exiting the Summary Buffer): Add new function
+ `gnus-summary-catchup-and-goto-prev-group', bound to `Z p'.
+
+2005-11-08 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.texi (XVarious): Revert description of gnus-use-toolbar.
+
+2005-11-07 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.texi (X-Face): Fix description.
+ (XVarious): Remove gnus-xmas-logo-color-alist and
+ gnus-xmas-logo-color-style; fix description of gnus-use-toolbar.
+
+2005-11-04 Ken Manheimer <ken.manheimer@gmail.com>
+
+ * pgg.texi (User Commands): Document additional passphrase
+ argument for pgg-encrypt-*, pgg-decrypt-*, and pgg-sign-* functions.
+ (Backend methods): Likewise for corresponding pgg-scheme-* functions.
+
+2005-11-02 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus.texi (Conformity): Fix typo.
+ (Customizing Articles): Document `first'.
+
+2005-11-01 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.texi (Group Parameters): Mention new variable
+ gnus-parameters-case-fold-search.
+ (Home Score File): Addition.
+
+2005-10-29 Sascha Wilde <wilde@sha-bang.de>
+
+ * pgg.texi (How to use): Update the example to add autoload of
+ pgg-encrypt-symmetric-region.
+ (User Commands): Document pgg-encrypt-symmetric-region.
+ (Backend methods): Document pgg-scheme-encrypt-symmetric-region.
+
+2005-10-29 Jari Aalto <jari.aalto@cante.net>
+
+ * gnus.texi (Sorting the Summary Buffer):
+ Add `gnus-thread-sort-by-date-reverse'. Add example
+ host to different sorting in NNTP and RSS groups.
+
+2005-10-28 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-coding.texi: Split into nodes.
+ (Gnus Coding Style): Add flow-fill.el.
+
+2005-10-25 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-coding.texi (Dependencies): Add some text.
+ (Dependencies): Update encrypt.el.
+
+2005-10-17 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.texi (Document Groups): Remove duplicate item.
+
+2005-10-14 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.texi (Document Server Internals): Addition.
+
+2005-10-13 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.texi (A note on namespaces): Fix RFC reference.
+
+2005-10-12 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.texi (RSS): Fix key description.
+
+2005-10-11 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.texi: Emacs/w3 -> Emacs/W3.
+ (Browsing the Web): Fix description.
+ (Web Searches): Ditto.
+ (Customizing W3): Ditto.
+
+2005-10-07 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.texi (Maildir): Clarify expire-age and expire-group.
+
+2005-10-04 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-news.texi: Mention that the Lisp files are now installed in
+ .../site-lisp/gnus/ by default.
+
+2005-10-03 Simon Josefsson <jas@extundo.com>
+
+ * gnus-news.texi: Fix typo.
+
+2005-09-28 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus-coding.texi: Added some comments.
+
+ * message.texi (Insertion): Describe prefix for
+ message-mark-inserted-region and message-mark-insert-file.
+
+2005-09-28 Simon Josefsson <jas@extundo.com>
+
+ * message.texi (IDNA): Fix.
+
+2005-09-28 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.texi (NNTP): Remove nntp-buggy-select, nntp-read-timeout,
+ nntp-server-hook, and nntp-warn-about-losing-connection; fix
+ description of nntp-open-connection-function.
+ (Common Variables): Fix descriptions.
+
+2005-09-27 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * emacs-mime.texi (Non-MIME): Add Slrn-style verbatim marks and
+ LaTeX documents. Describe "text/x-gnus-verbatim".
+
+2005-09-26 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.texi (Server Buffer Format): Document the %a format spec.
+
+2005-09-22 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.texi (Mail): Fix gnus-confirm-mail-reply-to-news entry.
+
+2005-09-21 Teodor Zlatanov <tzz@lifelogs.com>
+
+ * gnus.texi (Blacklists and Whitelists)
+ (Blacklists and Whitelists, BBDB Whitelists)
+ (Gmane Spam Reporting, Bogofilter, spam-stat spam filtering)
+ (spam-stat spam filtering, SpamOracle)
+ (Extending the Spam ELisp package): Removed extra quote symbol for
+ clarity.
+
+2005-09-20 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus.texi (MIME Commands): Add gnus-article-save-part-and-strip,
+ gnus-article-delete-part and gnus-article-replace-part.
+ (Using MIME): Add gnus-mime-replace-part.
+
+ * gnus-news.texi: Add gnus-mime-replace-part and
+ gnus-article-replace-part. Use @xref.
+
+2005-09-20 Simon Josefsson <jas@extundo.com>
+
+ * gnus-coding.texi: New file, from Reiner Steib
+ <reiner.steib@gmx.de>.
+
+2005-09-17 Romain Francoise <romain@orebokech.com>
+
+ Update all files to specify GFDL version 1.2.
+
+ * doclicense.texi (GNU Free Documentation License): Update to
+ version 1.2.
+
+2005-09-15 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.texi (Finding the Parent): Fix description of how Gnus
+ finds article.
+
+2005-09-14 Jari Aalto <jari.aalto@cante.net>
+
+ * gnus.texi (Advanced Scoring Examples): New exmples to teach how
+ to drop off non-answered articles.
+
+2005-09-11 Romain Francoise <romain@orebokech.com>
+
+ * message.texi (Message Headers): Explain what
+ `message-alternative-emails' does in more detail.
+
+ * gnus.texi (Mail Spool): Mention that `nnml-use-compressed-files'
+ requires `auto-compression-mode' to be enabled. Add new nnml
+ variable `nnml-compressed-files-size-threshold'.
+
+2005-09-07 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus.texi (Sorting the Summary Buffer): Added
+ gnus-thread-sort-by-recipient.
+
+2005-09-05 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-news.texi: Fix reference.
+
+2005-09-04 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus.texi (Mail Source Customization): Fix descriptions of
+ mail-source-incoming-file-prefix.
+
+ * message.texi (MIME): Describe mml-dnd-protocol-alist and
+ mml-dnd-attach-options.
+
+ * gnus-news.texi: Added reference.
+
+2005-09-02 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.texi (Choosing Variables): Fix descriptions.
+
+2005-08-19 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * emacs-mime.texi (time-date): Fix description of safe-date-to-time.
+
+2005-08-18 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * emacs-mime.texi (Handles): Remove duplicate item.
+ (Encoding Customization): Fix the default value for
+ mm-coding-system-priorities.
+ (Charset Translation): Emacs doesn't use mm-mime-mule-charset-alist.
+ (Basic Functions): Fix reference.
+
+2005-08-10 Romain Francoise <romain@orebokech.com>
+
+ * gnus-news.texi: Mention new variable `message-yank-empty-prefix'.
+
+2005-08-09 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.texi (Charsets): Fj hierarchy uses iso-2022-jp.
+
+2005-08-08 Romain Francoise <romain@orebokech.com>
+
+ * message.texi (Insertion Variables): Mention new variable
+ `message-yank-empty-prefix'. Change `message-yank-cited-prefix'
+ documentation accordingly.
+
+2005-07-27 Reiner Steib <Reiner.Steib@gmx.de>
+
+ * gnus.texi (Startup Files): Fix name of gnus-site-init-file.
+ Mention that gnus-init-file is not read when Emacs is invoked with
+ --no-init-file or -q.
+
+2005-07-20 Didier Verna <didier@xemacs.org>
+
+ * gnus.texi (Email Based Diary): New. Proper documentation for the
+ nndiary back end and the gnus-diary library.
+
+2005-07-18 Romain Francoise <romain@orebokech.com>
+
+ * gnus.texi (To From Newsgroups): Mention new variables
+ `gnus-summary-to-prefix' and `gnus-summary-newsgroup-prefix'.
+
+ * gnus-news.texi: Ditto.
+
+2005-06-29 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus.texi (NoCeM): gnus-nocem-verifyer defaults to pgg-verify.
+
+2005-06-23 Juanma Barranquero <lekktu@gmail.com>
+
+ * gnus.texi (MIME Commands, Fancy Mail Splitting, Agent Visuals)
+ (Agent Variables):
+ * message.texi (Message Headers):
+ Texinfo usage fix.
+
2005-03-30 Reiner Steib <Reiner.Steib@gmx.de>
* Makefile.in (gnus-booklet.dvi, gnus-booklet.pdf): Simplify.
* gnus-news.texi: Ditto.
-2005-01-16 Xavier Maillard <zedek@gnu-rox.org> (tiny change)
+2005-01-16 Xavier Maillard <zedek@gnu-rox.org> (tiny change)
* gnus-faq.texi ([4.1]): Typo.
2004-12-08 Reiner Steib <Reiner.Steib@gmx.de>
- * gnusref.tex: Mention `gnus-summary-limit-to-recipient' and
+ * gnusref.tex: Mention `gnus-summary-limit-to-recipient' and
`gnus-summary-sort-by-recipient'.
2004-12-08 Reiner Steib <Reiner.Steib@gmx.de>
2004-12-06 Reiner Steib <Reiner.Steib@gmx.de>
- * gnus-news.texi: Mention `gnus-summary-limit-to-recipient' and
+ * gnus-news.texi: Mention `gnus-summary-limit-to-recipient' and
`gnus-summary-sort-by-recipient'.
* gnus.texi (Filtering Spam Using The Spam ELisp Package): Index
2004-08-31 Reiner Steib <Reiner.Steib@gmx.de>
* emacs-mime.texi, gnus-faq.texi, gnus.texi, message.texi,
- pgg.texi, sieve.texi: Use @copying and @insertcopying.
+ * pgg.texi, sieve.texi: Use @copying and @insertcopying.
2004-08-22 Reiner Steib <Reiner.Steib@gmx.de>
2004-08-17 Teodor Zlatanov <tzz@lifelogs.com>
- * gnus.texi (IMAP): add comments about imaps synonym to imap in
- netrc syntax
+ * gnus.texi (IMAP): Add comments about imaps synonym to imap in
+ netrc syntax.
2004-08-15 Simon Josefsson <jas@extundo.com>
2004-05-28 Reiner Steib <Reiner.Steib@gmx.de>
* gnus-faq.texi: Untabify.
- ([6.3]): nnir.el is in contrib directory.
+ ([6.3]): nnir.el is in contrib directory.
* message.texi (News Headers): Clarify how a unique ID is created.
2004-05-19 Andre Srinivasan <andre@e2open.com>
* gnus.texi (Group Parameters): Added more on hooks. (Small
- change.)
+ change.)
2004-05-19 Reiner Steib <Reiner.Steib@gmx.de>
* gnus.texi (Charsets): Point to relevant section in emacs-mime.
-2004-04-14 Kevin Greiner <kgreiner@xpediantsolutions.com>
+2004-04-14 Kevin Greiner <kgreiner@xpediantsolutions.com>
* gnus.texi (Agent Visuals): Referenced new F(etched) group line
format.
2004-03-29 Teodor Zlatanov <tzz@lifelogs.com>
- * gnus.texi (Spam ELisp Package Sequence of Events): some clarifications
- (Spam ELisp Package Global Variables)
- (Spam ELisp Package Global Variables): more clarifications
+ * gnus.texi (Spam ELisp Package Sequence of Events): Some clarifications.
+ (Spam ELisp Package Global Variables): More clarifications.
2004-03-18 Helmut Waitzmann <Helmut.Waitzmann@web.de> (tiny change)
* emacs-mime.texi: Enclose the iflatex section with iftex.
-2004-03-02 Kevin Greiner <kgreiner@xpediantsolutions.com>
+2004-03-02 Kevin Greiner <kgreiner@xpediantsolutions.com>
* emacs-mime.texi: Wrapped documentencoding inside of iflatex as
documentencoding is not supported by infohack.
characters that can not be encoded using iso-8859-1.
(Gnus Unplugged): Reference gnus-agent variable.
(Agent Variables): Added gnus-agent.
-
+
2004-02-17 Katsumi Yamaoka <yamaoka@jpl.org>
2004-01-23 Teodor Zlatanov <tzz@lifelogs.com>
* gnus.texi (Spam ELisp Package Filtering of Incoming Mail):
- mention spam-split does not modify incoming mail
+ Mention spam-split does not modify incoming mail.
2004-01-23 Jesper Harder <harder@ifa.au.dk>
2004-01-22 Teodor Zlatanov <tzz@lifelogs.com>
- * gnus.texi (Spam ELisp Package Sequence of Events): fix typo
+ * gnus.texi (Spam ELisp Package Sequence of Events): Fix typo.
-2004-01-21 Kevin Greiner <kgreiner@xpediantsolutions.com>
+2004-01-21 Kevin Greiner <kgreiner@xpediantsolutions.com>
* gnus.texi (Outgoing Messages, Agent Variables): Add
gnus-agent-queue-mail and gnus-agent-prompt-send-queue.
* gnus.texi (The problem of spam): Fix, reported by Cheng Gao
<chenggao@cyberhut.org> and suggested by Richard Hoskins
- <rmh@apk.net> (tiny change).
+ <rmh@apk.net> (tiny change).
2004-01-07 Jesper Harder <harder@ifa.au.dk>
(Blacklists and Whitelists, BBDB Whitelists)
(Gmane Spam Reporting, Bogofilter, spam-stat spam filtering)
(SpamOracle): mention that spam/ham processor variables are being
- obsoleted
+ obsoleted
(Extending the Spam ELisp package): add some new documentation
for adding a new backend to spam.el
2003-12-31 Steve Youngs <sryoungs@bigpond.net.au>
* gnus.texi (XEmacs): Update list of Gnus XEmacs package
- requirements.
+ requirements.
2003-12-30 Reiner Steib <Reiner.Steib@gmx.de>
* gnus.texi (Group Parameters): Clarify.
-2003-12-11 Kevin Greiner <kgreiner@xpediantsolutions.com>
+2003-12-11 Kevin Greiner <kgreiner@xpediantsolutions.com>
* gnus.texi (Agent Parameters): Added references in Topic and
Group Parameters. Added gnus-agent-cat-disable-undownloaded-faces
* gnus.texi (Filtering Spam Using The Spam ELisp Package):
mentioned the spam-install-hooks mess
+2003-07-11 Matthias Andree <ma@dt.e-technik.uni-dortmund.de> (tiny change)
+
+ * gnus.texi (Splitting in IMAP): Typos.
+
2003-07-11 Simon Josefsson <jas@extundo.com>
- * gnus.texi (Splitting in IMAP): Typos, tiny patch from Matthias
- Andree <ma@dt.e-technik.uni-dortmund.de>.
- (Splitting in IMAP): Mention Sieve.
+ * gnus.texi (Splitting in IMAP): Mention Sieve.
2003-07-10 Simon Josefsson <jas@extundo.com>
2003-06-24 Lars Magne Ingebrigtsen <larsi@gnus.org>
* gnus.texi (Summary Mail Commands): Make note of
- Mail-Followup-To.
+ Mail-Followup-To.
2003-06-23 Jesper Harder <harder@ifa.au.dk>
* message.texi (Insertion Variables): do.
-2003-05-13 Simon Josefsson <jas@extundo.com>
+2003-05-13 Niklas Morberg <niklas.morberg@axis.com> (tiny change)
- * gnus.texi (IMAP, Agent and IMAP, Oort Gnus): s/a/an/. Tiny
- patch from Niklas Morberg <niklas.morberg@axis.com>.
+ * gnus.texi (IMAP, Agent and IMAP, Oort Gnus): s/a/an/.
-2003-05-12 Kevin Greiner <kgreiner@xpediantsolutions.com>
+2003-05-12 Kevin Greiner <kgreiner@xpediantsolutions.com>
* gnus.texi (Agent Visuals): Add.
* message.texi (IDNA): New.
-2003-03-18 Kevin Greiner <kgreiner@xpediantsolutions.com>
+2003-03-18 Kevin Greiner <kgreiner@xpediantsolutions.com>
* gnus.texi (Gnus Unplugged): Refer to new agent Group/Topic
parameters.
* gnus.texi (Required Back End Functions): Add.
-2003-03-17 Simon Josefsson <jas@extundo.com>
+2003-03-17 Frank Haun <pille3003@fhaun.de> (tiny change)
- * pgg.texi: Fix setfilename. Tiny patch by Frank Haun
- <pille3003@fhaun.de>.
+ * pgg.texi: Fix setfilename.
2003-03-09 Paul Jarc <prj@po.cwru.edu>
(Document Server Internals, Score Variables, Adaptive Scoring)
(X-Face, Hashcash): do.
-2003-02-28 Vasily Korytov <deskpot@myrealbox.com>
+2003-02-28 Vasily Korytov <deskpot@myrealbox.com>
* gnus.texi: New values, 'to-list and 'cc-list, for
gnus-boring-article-headers.
* gnus.texi (Mail Spool): Add cindex for marks.
(Mail Folders): Add cindex for marks.
-2002-03-24 Raymond Scholz <rscholz@zonix.de>
+2002-03-24 Raymond Scholz <rscholz@zonix.de>
* gnus.texi (Summary Buffer Lines): Fix doc.
* Makefile.in (booklet.dvi, booklet.pdf): Support booklet.
-2002-03-24 Felix Natter <fnatter@gmx.net>
+2002-03-24 Felix Natter <fnatter@gmx.net>
* booklet.tex, bk-at.tex, bk-lt.tex, gnuslog-booklet.eps: New file.
* gnusref.tex, refcard.tex: Support booklet.
* message.texi (Security): Add mml-unsecure-message.
(Mailing Lists): Index message-goto-mail-followup-to.
-2002-03-23 Jesper Harder <harder@ifa.au.dk>
+2002-03-23 Jesper Harder <harder@ifa.au.dk>
* gnusref.tex, refcard.tex: Addition.
* gnus.texi (Mail Source Specifiers): Use @uref.
-2002-02-13 Jesper Harder <harder@ifa.au.dk>
+2002-02-13 Jesper Harder <harder@ifa.au.dk>
* message.texi, gnus.texi, emacs-mime.texi: Use small caps
consistently. MIME, NOV, NNTP, HTML, IMAP are written with @sc
* gnus.texi (Sorting Groups): Note `C-k' and `C-y' for manually
moving groups around.
-2001-04-07 Ryan Yeske <rcyeske@vcn.bc.ca>
+2001-04-07 Ryan Yeske <rcyeske@vcn.bc.ca>
* gnus.texi (Splitting in IMAP): Fix.
-2001-04-07 Jesper Harder <harder@ifa.au.dk>
+2001-04-07 Jesper Harder <harder@ifa.au.dk>
* gnus.texi (More Threading): Fix.
* gnus.texi (Top): Add Using GPG.
-2001-02-02 David Masterson <dmasters@Rational.Com>
+2001-02-02 David Masterson <dmasters@Rational.Com>
* gnus.texi (The Server is Down): Add link to Group Levels.
* message.texi (message-ignored-news-headers): Add "X-Draft-From:".
(message-ignored-mail-headers): Ditto.
-2001-01-21 Raymond Scholz <ray-2001@zonix.de>
+2001-01-21 Raymond Scholz <ray-2001@zonix.de>
* message.texi: Rename X-Mailer and X-Newsreader to User-Agent.
* emacs-mime.texi: Set dircategory to Emacs.
-2001-01-16 Jesper Harder <harder@ifa.au.dk>
+2001-01-16 Jesper Harder <harder@ifa.au.dk>
* gnus.texi (Group Line Specification): Add.
group names as target, where `gnus-split-methods' uses file
names. Suggested by Nevin Kapur.
-2000-11-07 Martin Buchholz <martin@xemacs.org>
+2000-11-07 Martin Buchholz <martin@xemacs.org>
* gnus.texi: Doc fix.
* gnus.texi (Finding the News): @env is not supported in texinfo 3.12.
-2000-10-31 Jorge Godoy <godoy@conectiva.com>
+2000-10-31 Jorge Godoy <godoy@conectiva.com>
* gnus.texi: gnus-gpg document.
Explain interaction between these. Add Lisp example for setting
`nnmail-expiry-target'.
-2000-08-04 Andreas Oeldenberger <andreas.oeldenberger@gmx.net>
+2000-08-04 Andreas Oeldenberger <andreas.oeldenberger@gmx.net>
* message.texi (Forwarding): Fix.
* gnus.texi (MIME Commands): Fix.
-2000-01-03 Karl Kleinpaste <karl@justresearch.com>
+2000-01-03 Karl Kleinpaste <karl@justresearch.com>
* gnus.texi (Splitting in IMAP): Add '.' after @xref.
pdf: gnus.pdf message.pdf $(REFCARD).pdf emacs-mime.pdf sieve.pdf pgg.pdf sasl.pdf
.texi.dvi :
- sed -e '/@iflatex/,/@end iflatex/d' $< > gnustmp.texi
+ sed -e '/@iflatex/,/@end iflatex/d' $< > gnustmp.texi
$(TEXI2DVI) -I $(srcdir) gnustmp.texi
cp gnustmp.dvi $*.dvi
rm -f gnustmp.*
TEXPICTS=$(srcdir) $(DVIPS) -t $(PAPERTYPE) -f $< > $@
.texi.pdf :
- sed -e '/@iflatex/,/@end iflatex/d' $< > gnustmp.texi
+ sed -e '/@iflatex/,/@end iflatex/d' $< > gnustmp.texi
$(TEXI2PDF) -I $(srcdir) gnustmp.texi
cp gnustmp.pdf $*.pdf
rm -f gnustmp.*
TEXINPUTS=$(srcdir):$$TEXINPUTS:: \
$(PDFLATEX) '\def\booklettrue{}\def\letterpapertrue{}\input{$(REFCARD)}' ;\
fi
- mv $(REFCARD).pdf $@
+ mv $(REFCARD).pdf $@
-gnus-faq-full-update: gnus-faq-clean gnus-faq-texi
+gnus-faq-full-update: gnus-faq-clean gnus-faq-texi
gnus-faq.xml:
cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/gnus \
gnus-faq-clean:
rm -f gnus-faq.xml gnus-faq.*.tmp gnus-faq.texi
-clean:
+almost-clean:
rm -f *.[cgk]idx *.aux *.cp *.cps *.dvi *.dvi-x *.fn *.ky \
*.kys *.latexi *.log *.orig *.pdf *.pdf-x *.pg *.rej \
*.tmplatexi *.toc *.tp *.vr gnus.*.bak gnus.[cgk]ind gnus.idx \
out:
scp gnus-manual-*.ps.gz gnus-manual-*.pdf www@quimby:html/gnus/documents
-veryclean: clean
+clean: almost-clean
rm -f gnus.dvi gnus.ps texi2latex.elc
rm -f gnus-manual-a4.* gnus-manual-standard.*
-distclean: veryclean
+distclean: clean
rm -f *.orig *.rej *.elc *~ gnus-[0-9] gnus-[0-9][0-9] Makefile
rm -f message-[0-9]
rm -f $(INFO_DEPS)
done; \
else : ; fi
-tmps:
+tmps:
cd ps; make all
for j in ps/picons-*.ps; do \
i=ps/`basename $$j .ps`; \
a="h"; echo -n "\\gnussmiley{$$i}"; fi done > smiley.tex; \
if [ -n "$$a" ]; then echo "{$$i}" >> smiley.tex; fi
pspackage:
- cd ps; make clean
+ cd ps; make almost-clean
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
Makefile: $(srcdir)/Makefile.in ../config.status
@node GNU Free Documentation License, Intro, Copying, Top
@appendix GNU Free Documentation License
-@center Version 1.1, March 2000
+@center Version 1.2, November 2002
@display
-Copyright (C) 2000 Free Software Foundation, Inc.
-59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
PREAMBLE
The purpose of this License is to make a manual, textbook, or other
-written document ``free'' in the sense of freedom: to assure everyone
-the effective freedom to copy and redistribute it, with or without
-modifying it, either commercially or noncommercially. Secondarily,
-this License preserves for the author and publisher a way to get
-credit for their work, while not being considered responsible for
-modifications made by others.
+functional and useful document ``free'' in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
This License is a kind of ``copyleft'', which means that derivative
works of the document must themselves be free in the same sense. It
@item
APPLICABILITY AND DEFINITIONS
-This License applies to any manual or other work that contains a
-notice placed by the copyright holder saying it can be distributed
-under the terms of this License. The ``Document'', below, refers to any
-such manual or work. Any member of the public is a licensee, and is
-addressed as ``you''.
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License. Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein. The ``Document'', below,
+refers to any such manual or work. Any member of the public is a
+licensee, and is addressed as ``you''. You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
A ``Modified Version'' of the Document means any work containing the
Document or a portion of it, either copied verbatim, or with
the Document that deals exclusively with the relationship of the
publishers or authors of the Document to the Document's overall subject
(or to related matters) and contains nothing that could fall directly
-within that overall subject. (For example, if the Document is in part a
+within that overall subject. (Thus, if the Document is in part a
textbook of mathematics, a Secondary Section may not explain any
mathematics.) The relationship could be a matter of historical
connection with the subject or with related matters, or of legal,
The ``Invariant Sections'' are certain Secondary Sections whose titles
are designated, as being those of Invariant Sections, in the notice
-that says that the Document is released under this License.
+that says that the Document is released under this License. If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant. The Document may contain zero
+Invariant Sections. If the Document does not identify any Invariant
+Sections then there are none.
The ``Cover Texts'' are certain short passages of text that are listed,
as Front-Cover Texts or Back-Cover Texts, in the notice that says that
-the Document is released under this License.
+the Document is released under this License. A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
A ``Transparent'' copy of the Document means a machine-readable copy,
represented in a format whose specification is available to the
-general public, whose contents can be viewed and edited directly and
+general public, that is suitable for revising the document
straightforwardly with generic text editors or (for images composed of
pixels) generic paint programs or (for drawings) some widely available
drawing editor, and that is suitable for input to text formatters or
for automatic translation to a variety of formats suitable for input
to text formatters. A copy made in an otherwise Transparent file
-format whose markup has been designed to thwart or discourage
-subsequent modification by readers is not Transparent. A copy that is
-not ``Transparent'' is called ``Opaque''.
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text. A copy that is not ``Transparent'' is called ``Opaque.''
+
Examples of suitable formats for Transparent copies include plain
ASCII without markup, Texinfo input format, LaTeX input format, SGML
or XML using a publicly available DTD, and standard-conforming simple
-HTML designed for human modification. Opaque formats include
-PostScript, PDF, proprietary formats that can be read and edited only
-by proprietary word processors, SGML or XML for which the DTD and/or
+HTML, PostScript or PDF designed for human modification. Examples of
+transparent image formats include PNG, XCF and JPG. Opaque formats
+include proprietary formats that can be read and edited only by
+proprietary word processors, SGML or XML for which the DTD and/or
processing tools are not generally available, and the
-machine-generated HTML produced by some word processors for output
-purposes only.
+machine-generated HTML, PostScript or PDF produced by some word
+processors for output purposes only.
The ``Title Page'' means, for a printed book, the title page itself,
plus such following pages as are needed to hold, legibly, the material
formats which do not have any title page as such, ``Title Page'' means
the text near the most prominent appearance of the work's title,
preceding the beginning of the body of the text.
+
+A section ``Entitled XYZ'' means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language. (Here XYZ stands for a
+specific section name mentioned below, such as ``Acknowledgements'',
+``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title''
+of such a section when you modify the Document means that it remains a
+section ``Entitled XYZ'' according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document. These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
@sp 1
@item
VERBATIM COPYING
@item
COPYING IN QUANTITY
-If you publish printed copies of the Document numbering more than 100,
-and the Document's license notice requires Cover Texts, you must enclose
-the copies in covers that carry, clearly and legibly, all these Cover
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
the back cover. Both covers must also clearly and legibly identify
you as the publisher of these copies. The front cover must present
If you publish or distribute Opaque copies of the Document numbering
more than 100, you must either include a machine-readable Transparent
copy along with each Opaque copy, or state in or with each Opaque copy
-a publicly-accessible computer-network location containing a complete
-Transparent copy of the Document, free of added material, which the
-general network-using public has access to download anonymously at no
-charge using public-standard network protocols. If you use the latter
-option, you must take reasonably prudent steps, when you begin
-distribution of Opaque copies in quantity, to ensure that this
-Transparent copy will remain thus accessible at the stated location
-until at least one year after the last time you distribute an Opaque
-copy (directly or through your agents or retailers) of that edition to
-the public.
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
It is requested, but not required, that you contact the authors of the
Document well before redistributing any large number of copies, to give
B. List on the Title Page, as authors, one or more persons or entities
responsible for authorship of the modifications in the Modified
Version, together with at least five of the principal authors of the
- Document (all of its principal authors, if it has less than five).@*
+ Document (all of its principal authors, if it has fewer than five),
+ unless they release you from this requirement.@*
C. State on the Title page the name of the publisher of the
Modified Version, as the publisher.@*
D. Preserve all the copyright notices of the Document.@*
G. Preserve in that license notice the full lists of Invariant Sections
and required Cover Texts given in the Document's license notice.@*
H. Include an unaltered copy of this License.@*
-I. Preserve the section entitled ``History'', and its title, and add to
- it an item stating at least the title, year, new authors, and
+I. Preserve the section Entitled ``History'', Preserve its Title, and add
+ to it an item stating at least the title, year, new authors, and
publisher of the Modified Version as given on the Title Page. If
- there is no section entitled ``History'' in the Document, create one
+ there is no section Entitled ``History'' in the Document, create one
stating the title, year, authors, and publisher of the Document as
given on its Title Page, then add an item describing the Modified
Version as stated in the previous sentence.@*
You may omit a network location for a work that was published at
least four years before the Document itself, or if the original
publisher of the version it refers to gives permission.@*
-K. In any section entitled ``Acknowledgements'' or ``Dedications'',
- preserve the section's title, and preserve in the section all the
- substance and tone of each of the contributor acknowledgements
+K. For any section Entitled ``Acknowledgements'' or ``Dedications'',
+ Preserve the Title of the section, and preserve in the section all
+ the substance and tone of each of the contributor acknowledgements
and/or dedications given therein.@*
L. Preserve all the Invariant Sections of the Document,
unaltered in their text and in their titles. Section numbers
or the equivalent are not considered part of the section titles.@*
-M. Delete any section entitled ``Endorsements''. Such a section
+M. Delete any section Entitled ``Endorsements.'' Such a section
may not be included in the Modified Version.@*
-N. Do not retitle any existing section as ``Endorsements''
+N. Do not retitle any existing section to be Entitled ``Endorsements''
or to conflict in title with any Invariant Section.@*
+O. Preserve any Warranty Disclaimers.@*
@sp 1
If the Modified Version includes new front-matter sections or
appendices that qualify as Secondary Sections and contain no material
list of Invariant Sections in the Modified Version's license notice.
These titles must be distinct from any other section titles.
-You may add a section entitled ``Endorsements'', provided it contains
+You may add a section Entitled ``Endorsements'', provided it contains
nothing but endorsements of your Modified Version by various
parties--for example, statements of peer review or that the text has
been approved by an organization as the authoritative definition of a
versions, provided that you include in the combination all of the
Invariant Sections of all of the original documents, unmodified, and
list them all as Invariant Sections of your combined work in its
-license notice.
+license notice, and that you preserve all their Warranty Disclaimers.
The combined work need only contain one copy of this License, and
multiple identical Invariant Sections may be replaced with a single
Make the same adjustment to the section titles in the list of
Invariant Sections in the license notice of the combined work.
-In the combination, you must combine any sections entitled ``History''
-in the various original documents, forming one section entitled
-``History''; likewise combine any sections entitled ``Acknowledgements'',
-and any sections entitled ``Dedications''. You must delete all sections
-entitled ``Endorsements.''
+In the combination, you must combine any sections Entitled ``History''
+in the various original documents, forming one section Entitled
+``History''; likewise combine any sections Entitled ``Acknowledgements'',
+and any sections Entitled ``Dedications.'' You must delete all sections
+Entitled ``Endorsements.''
@sp 1
@item
COLLECTIONS OF DOCUMENTS
A compilation of the Document or its derivatives with other separate
and independent documents or works, in or on a volume of a storage or
-distribution medium, does not as a whole count as a Modified Version
-of the Document, provided no compilation copyright is claimed for the
-compilation. Such a compilation is called an ``aggregate'', and this
-License does not apply to the other self-contained works thus compiled
-with the Document, on account of their being thus compiled, if they
-are not themselves derivative works of the Document.
+distribution medium, is called an ``aggregate'' if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
If the Cover Text requirement of section 3 is applicable to these
-copies of the Document, then if the Document is less than one quarter
-of the entire aggregate, the Document's Cover Texts may be placed on
-covers that surround only the Document within the aggregate.
-Otherwise they must appear on covers around the whole aggregate.
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
@sp 1
@item
TRANSLATION
permission from their copyright holders, but you may include
translations of some or all Invariant Sections in addition to the
original versions of these Invariant Sections. You may include a
-translation of this License provided that you also include the
-original English version of this License. In case of a disagreement
-between the translation and the original English version of this
-License, the original English version will prevail.
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers. In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled ``Acknowledgements'',
+``Dedications'', or ``History'', the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
@sp 1
@item
TERMINATION
@smallexample
@group
+Copyright (C) @var{year} @var{your name}.
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2
+or any later version published by the Free Software Foundation;
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+A copy of the license is included in the section entitled ``GNU
+Free Documentation License''.
+@end group
+@end smallexample
- Copyright (C) @var{year} @var{your name}.
- Permission is granted to copy, distribute and/or modify this document
- under the terms of the GNU Free Documentation License, Version 1.1
- or any later version published by the Free Software Foundation;
- with the Invariant Sections being @var{list their titles}, with the
- Front-Cover Texts being @var{list}, and with the Back-Cover Texts being @var{list}.
- A copy of the license is included in the section entitled ``GNU
- Free Documentation License''.
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the ``with...Texts.'' line with this:
+
+@smallexample
+@group
+with the Invariant Sections being @var{list their titles}, with the
+Front-Cover Texts being @var{list}, and with the Back-Cover Texts being
+@var{list}.
@end group
@end smallexample
-If you have no Invariant Sections, write ``with no Invariant Sections''
-instead of saying which ones are invariant. If you have no
-Front-Cover Texts, write ``no Front-Cover Texts'' instead of
-``Front-Cover Texts being @var{list}''; likewise for Back-Cover Texts.
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
If your document contains nontrivial examples of program code, we
recommend releasing these examples in parallel under your choice of
@copying
This file documents the Emacs MIME interface functionality.
-Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003
- Free Software Foundation, Inc.
+Copyright @copyright{} 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+2006 Free Software Foundation, Inc.
@quotation
Permission is granted to copy, distribute and/or modify this document
-under the terms of the GNU Free Documentation License, Version 1.1 or
+under the terms of the GNU Free Documentation License, Version 1.2 or
any later version published by the Free Software Foundation; with no
Invariant Sections, with the Front-Cover texts being ``A GNU
Manual'', and with the Back-Cover Texts as in (a) below. A copy of the
This manual documents the libraries used to compose and display
@acronym{MIME} messages.
-This manual is directed at users who want to modify the behaviour of
+This manual is directed at users who want to modify the behavior of
the @acronym{MIME} encoding/decoding process or want a more detailed
picture of how the Emacs @acronym{MIME} library works, and people who want
to write functions and commands that manipulate @acronym{MIME} elements.
are automatically sent to. It only works in groups matching
@code{mm-uu-diff-groups-regexp}.
+@item verbatim-marks
+@cindex verbatim-marks
+Slrn-style verbatim marks.
+
+@item LaTeX
+@cindex LaTeX
+LaTeX documents. It only works in groups matching
+@code{mm-uu-tex-groups-regexp}.
+
@end table
+@cindex text/x-verbatim
+@c Is @vindex suitable for a face?
+@vindex mm-uu-extract
+Some inlined non-@acronym{MIME} attachments are displayed using the face
+@code{mm-uu-extract}. By default, no @acronym{MIME} button for these
+parts is displayed. You can force displaying a button using @kbd{K b}
+(@code{gnus-summary-display-buttonized}) or add @code{text/x-verbatim}
+to @code{gnus-buttonized-mime-types}, @xref{MIME Commands, ,MIME
+Commands, gnus, Gnus Manual}.
+
@node Handles
@section Handles
@findex mm-handle-disposition
Return the parsed @code{Content-Disposition} of the part.
-@item mm-handle-disposition
-@findex mm-handle-disposition
-Return the description of the part.
-
@item mm-get-content-id
Returns the handle(s) referred to by @code{Content-ID}.
(remove "text/html" mm-automatic-display))
@end lisp
+Adding @code{"image/.*"} might also be useful. Spammers use images as
+the prefered part of @samp{multipart/alternative} messages, so you might
+not notice there are other parts. See also
+@code{gnus-buttonized-mime-types}, @ref{MIME Commands, ,MIME Commands,
+gnus, Gnus Manual}. After adding @code{"multipart/alternative"} to
+@code{gnus-buttonized-mime-types} you can choose manually which
+alternative you'd like to view. For example, you can set those
+variables like:
+
+@lisp
+(setq gnus-buttonized-mime-types
+ '("multipart/alternative" "multipart/signed")
+ mm-discouraged-alternatives
+ '("text/html" "image/.*"))
+@end lisp
+
+In this case, Gnus will display radio buttons for such a kind of spam
+message as follows:
+
+@example
+1. (*) multipart/alternative ( ) image/gif
+
+2. (*) text/plain ( ) text/html
+@end example
+
@item mm-inline-large-images
@vindex mm-inline-large-images
When displaying inline images that are larger than the window, Emacs
Mapping from @acronym{MIME} charset to encoding to use. This variable is
usually used except, e.g., when other requirements force a specific
encoding (digitally signed messages require 7bit encodings). The
-default is
+default is
@lisp
((iso-2022-jp . 7bit)
@item mm-coding-system-priorities
@vindex mm-coding-system-priorities
Prioritize coding systems to use for outgoing messages. The default
-is @code{nil}, which means to use the defaults in Emacs. It is a list of
+is @code{nil}, which means to use the defaults in Emacs, but is
+@code{(iso-8859-1 iso-2022-jp iso-2022-jp-2 shift_jis utf-8)} when
+running Emacs in the Japanese language environment. It is a list of
coding system symbols (aliases of coding systems are also allowed, use
@kbd{M-x describe-coding-system} to make sure you are specifying correct
coding system names). For example, if you have configured Emacs
@vindex mm-mime-mule-charset-alist
Things are slightly more complicated when running Emacs with @sc{mule}
support. In this case, a list of the @sc{mule} charsets used in the
-part is obtained, and the @sc{mule} charsets are translated to @acronym{MIME}
-charsets by consulting the variable @code{mm-mime-mule-charset-alist}.
+part is obtained, and the @sc{mule} charsets are translated to
+@acronym{MIME} charsets by consulting the table provided by Emacs itself
+or the variable @code{mm-mime-mule-charset-alist} for XEmacs.
If this results in a single @acronym{MIME} charset, this is used to encode
the part. But if the resulting list of @acronym{MIME} charsets contains more
than one element, two things can happen: If it is possible to encode the
This chapter describes the basic, ground-level functions for parsing and
handling. Covered here is parsing @code{From} lines, removing comments
from header lines, decoding encoded words, parsing date headers and so
-on. High-level functionality is dealt with in the next chapter
+on. High-level functionality is dealt with in the first chapter
(@pxref{Decoding and Viewing}).
@menu
@item safe-date-to-time
Take a date and return a time. If the date is not syntactically valid,
-return a ``zero'' date.
+return a ``zero'' time.
@item time-less-p
Take two times and say whether the first time is less (i. e., earlier)
--- /dev/null
+\input texinfo
+
+@setfilename gnus-coding
+@settitle Gnus Coding Style and Maintainance Guide
+@syncodeindex fn cp
+@syncodeindex vr cp
+@syncodeindex pg cp
+
+@copying
+Copyright (c) 2004, 2005 Free Software Foundation, Inc.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.1 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with the Front-Cover texts being ``A GNU
+Manual'', and with the Back-Cover Texts as in (a) below. A copy of the
+license is included in the section entitled ``GNU Free Documentation
+License'' in the Emacs manual.
+
+(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
+this GNU Manual, like GNU software. Copies published by the Free
+Software Foundation raise funds for GNU development.''
+
+This document is part of a collection distributed under the GNU Free
+Documentation License. If you want to distribute this document
+separately from the collection, you can do so by adding a copy of the
+license to the document, as described in section 6 of the license.
+@end quotation
+@end copying
+
+
+@titlepage
+@title Gnus Coding Style and Maintainance Guide
+
+@author by Reiner Steib <Reiner.Steib@@gmx.de>
+
+@insertcopying
+@end titlepage
+
+@c Obviously this is only a very rudimentary draft. We put it in CVS
+@c anyway hoping that it might annoy someone enough to fix it. ;-)
+@c Fixing only a paragraph also is appreciated.
+
+@node Top
+@top Gnus Coding Style and Maintainance Guide
+This manual describes @dots{}
+@menu
+* Gnus Coding Style:: Gnus Coding Style
+* Gnus Maintainance Guide:: Gnus Maintainance Guide
+@end menu
+
+@c @ref{Gnus Reference Guide, ,Gnus Reference Guide, gnus, The Gnus Newsreader}
+
+@node Gnus Coding Style
+@chapter Gnus Coding Style
+@section Dependencies
+
+The Gnus distribution contains a lot of libraries that have been written
+for Gnus and used intensively for Gnus. But many of those libraries are
+useful on their own. E.g. other Emacs Lisp packages might use the
+@acronym{MIME} library @xref{Top, ,Top, emacs-mime, The Emacs MIME
+Manual}.
+
+@subsection General purpose libraries
+
+@table @file
+
+@item netrc.el
+@file{.netrc} parsing functionality.
+@c As of 2005-10-21...
+There are no Gnus dependencies in this file.
+
+@item format-spec.el
+Functions for formatting arbitrary formatting strings.
+@c As of 2005-10-21...
+There are no Gnus dependencies in this file.
+
+@end table
+
+@subsection Encryption and security
+
+@table @file
+@item encrypt.el
+File encryption routines
+@c As of 2005-10-25...
+There are no Gnus dependencies in this file.
+
+@item password.el
+Read passwords from user, possibly using a password cache.
+@c As of 2005-10-21...
+There are no Gnus dependencies in this file.
+
+@item tls.el
+TLS/SSL support via wrapper around GnuTLS
+@c As of 2005-10-21...
+There are no Gnus dependencies in this file.
+
+@item pgg*.el
+Glue for the various PGP implementations.
+@c As of 2005-10-21...
+There are no Gnus dependencies in these files.
+
+@end table
+
+@subsection Networking
+
+@table @file
+@item dig.el
+Domain Name System dig interface.
+@c As of 2005-10-21...
+There are no serious Gnus dependencies in this file. Uses
+@code{gnus-run-mode-hooks} (a wrapper function).
+
+@item dns*.el
+Domain Name Service lookups.
+@c As of 2005-10-21...
+There are no Gnus dependencies in these files.
+@end table
+
+@subsection Mail and News related RFCs
+
+@table @file
+@item pop3.el
+Post Office Protocol (RFC 1460) interface.
+@c As of 2005-10-21...
+There are no Gnus dependencies in this file.
+
+@item imap.el
+@acronym{IMAP} library.
+@c As of 2005-10-21...
+There are no Gnus dependencies in this file.
+
+@item ietf-drums.el
+Functions for parsing RFC822bis headers.
+@c As of 2005-10-21...
+There are no Gnus dependencies in this file.
+
+@item rfc1843.el
+HZ (rfc1843) decoding. HZ is a data format for exchanging files of
+arbitrarily mixed Chinese and @acronym{ASCII} characters.
+@c As of 2005-10-21...
+@code{rfc1843-gnus-setup} seem to be useful only for Gnus. Maybe this
+function should be relocated to remove dependencies on Gnus. Other
+minor dependencies: @code{gnus-newsgroup-name} could be eliminated by
+using an optional argument to @code{rfc1843-decode-article-body}.
+
+@item rfc2045.el
+Functions for decoding rfc2045 headers
+
+@item rfc2047.el
+Functions for encoding and decoding rfc2047 messages
+
+@item rfc2104.el
+RFC2104 Hashed Message Authentication Codes
+
+@item rfc2231.el
+Functions for decoding rfc2231 headers
+
+@item flow-fill.el
+Interpret RFC2646 "flowed" text.
+@c As of 2005-10-27...
+There are no Gnus dependencies in this file.
+
+@item uudecode.el
+Elisp native uudecode.
+@c As of 2005-12-06...
+There are no Gnus dependencies in this file.
+@c ... but the custom group is gnus-extract.
+@end table
+
+@subsection message
+
+All message composition from Gnus (both mail and news) takes place in
+Message mode buffers. Message mode is intended to be a replacement for
+Emacs mail mode. There should be no Gnus dependencies in
+@file{message.el}.
+
+@subsection Emacs @acronym{MIME}
+
+The files @file{mml*.el} and @file{mm-*.el} provide @acronym{MIME}
+functionality for Emacs.
+
+@acronym{MML} (@acronym{MIME} Meta Language) is supposed to be
+independent from Gnus. Alas it is not anymore.
+
+
+@subsection Gnus backends
+
+The files @file{nn*.el} provide functionality for accessing NNTP
+(@file{nntp.el}), IMAP (@file{nnimap.el}) and several other Mail back
+ends (probably @file{nnml.el}, @file{nnfolder.el} and
+@file{nnmaildir.el} are the most widely used mail back ends).
+
+
+
+@c mm-uu requires nnheader which requires gnus-util. message.el also
+@c requires nnheader.
+
+@c message / gnus
+@c
+@c nn*
+@c
+@c mm*
+@c
+@c rfc*
+@c
+@c pgg*
+@c tla netrc pop3 dig dns ...
+@c format-spec.el
+
+
+@section Compatibility
+
+No Gnus should work on:
+@itemize @bullet
+@item
+Emacs 21.1 and up.
+@item
+XEmacs 21.4 and up.
+@end itemize
+
+Gnus 5.10 should work on:
+@itemize @bullet
+@item
+Emacs 20.7 and up.
+@item
+XEmacs 21.1 and up.
+@end itemize
+
+@node Gnus Maintainance Guide
+@chapter Gnus Maintainance Guide
+
+@section Stable and development versions
+
+The development of Gnus normally is done on the CVS trunk, i.e. there
+are no separate branches to develop and test new features. Most of the
+time, the trunk is developed quite actively with more or less daily
+changes. Only after a new major release, e.g. 5.10.1, there's usually a
+feature period of several months. After the release of Gnus 5.10.6 the
+development of new features started again on the trunk while the 5.10
+series is continued on the stable branch (v5-10) from which more stable
+releases will be done when needed (5.10.7, @dots{}).
+@ref{Gnus Development, ,Gnus Development, gnus, The Gnus Newsreader}
+
+Stable releases of Gnus finally become part of Emacs. E.g. Gnus 5.8
+became a part of Emacs 21 (relabeled to Gnus 5.9). The 5.10 series will
+become part of Emacs 22 (as Gnus 5.11).
+
+@section Syncing
+
+@c Some MIDs related to this follow. Use http://thread.gmane.org/MID
+@c (and click on the subject) to get the thread on Gmane.
+
+@c Some quotes from Miles Bader follow...
+
+@c <v9eklyke6b.fsf@marauder.physik.uni-ulm.de>
+@c <buovfd71nkk.fsf@mctpc71.ucom.lsi.nec.co.jp>
+
+In the past, the inclusion of Gnus into Emacs was quite cumbersome. For
+each change made to Gnus in Emacs repository, it had to be checked that
+it was applied to the new Gnus version, too. Else, bug fixes done in
+Emacs repository might have been lost.
+
+With the inclusion of Gnus 5.10, Miles Bader has set up an Emacs-Gnus
+gateway to ensure the bug fixes from Emacs CVS are propagated to Gnus
+CVS semi-automatically. These bug fixes are installed on the stable
+branch and on the trunk. Basically the idea is that the gateway will
+cause all common files in Emacs and Gnus v5-10 to be identical except
+when there's a very good reason (e.g., the Gnus version string in Emacs
+says @samp{5.11}, but the v5-10 version string remains @samp{5.10.x}).
+Furthermore, all changes in these files in either Emacs or the v5-10
+branch will be installed into the Gnus CVS trunk, again except where
+there's a good reason.
+@c (typically so far the only exception has been that the changes
+@c already exist in the trunk in modified form).
+Because of this, when the next major version of Gnus will be included in
+Emacs, it should be very easy -- just plonk in the files from the Gnus
+trunk without worrying about lost changes from the Emacs tree.
+
+The effect of this is that as hacker, you should generally only have to
+make changes in one place:
+
+@itemize
+@item
+If it's a file which is thought of as being outside of Gnus (e.g., the
+new @file{encrypt.el}), you should probably make the change in the Emacs
+tree, and it will show up in the Gnus tree a few days later.
+
+If you don't have Emacs CVS access (or it's inconvenient), you can
+change such a file in the v5-10 branch, and it should propagate to Emacs
+CVS -- however, it will get some extra scrutiny (by Miles) to see if the
+changes are possibly controversial and need discussion on the mailing
+list. Many changes are obvious bug-fixes however, so often there won't
+be any problem.
+
+@item
+If it's to a Gnus file, and it's important enough that it should be part
+of Emacs and the v5-10 branch, then you can make the change on the v5-10
+branch, and it will go into Emacs CVS and the Gnus CVS trunk (a few days
+later). The most prominent examples for such changes are bug-fixed
+including improvements on the documentation.
+
+If you know that there will be conflicts (perhaps because the affected
+source code is different in v5-10 and the Gnus CVS trunk), then you can
+install your change in both places, and when I try to sync them, there
+will be a conflict -- however, since in most such cases there would be a
+conflict @emph{anyway}, it's often easier for me to resolve it simply if
+I see two @samp{identical} changes, and can just choose the proper one,
+rather than having to actually fix the code.
+
+@item
+For general Gnus development changes, of course you just make the
+change on the Gnus CVS trunk and it goes into Emacs a few years
+later... :-)
+@end itemize
+
+Of course in any case, if you just can't wait for me to sync your
+change, you can commit it in more than one place and probably there will
+be no problem; usually the changes are textually identical anyway, so
+can be easily resolved automatically (sometimes I notice silly things in
+such multiple commits, like whitespace differences, and unify those ;-).
+
+
+@c I do Emacs->Gnus less often (than Gnus->Emacs) because it tends to
+@c require more manual work.
+
+@c By default I sync about once a week. I also try to follow any Gnus
+@c threads on the mailing lists and make sure any changes being discussed
+@c are kept more up-to-date (so say 1-2 days delay for "topical" changes).
+
+@c <buovfd71nkk.fsf@mctpc71.ucom.lsi.nec.co.jp>
+
+@c BTW, just to add even more verbose explanation about the syncing thing:
+
+@section Miscellanea
+
+@heading @file{GNUS-NEWS}
+
+Starting from No Gnus, the @file{GNUS-NEWS} is created from
+@file{texi/gnus-news.texi}. Don't edit @file{GNUS-NEWS}. Edit
+@file{texi/gnus-news.texi}, type @command{make GNUS-NEWS} in the
+@file{texi} directory and commit @file{GNUS-NEWS} and
+@file{texi/gnus-news.texi}.
+
+@heading Conventions for version information in defcustoms
+
+For new customizable variables introduced in Oort Gnus (including the
+v5-10 branch) use @code{:version "22.1" ;; Oort Gnus} including the
+comment.
+@c
+If the variable is new in No Gnus use @code{:version "23.0" ;; No Gnus}.
+
+@c Local Variables:
+@c mode: texinfo
+@c coding: iso-8859-1
+@c End:
+
+@ignore
+ arch-tag: ab15234c-2c8a-4cbd-8111-1811bcc6f931
+@end ignore
also subscribe to the list by sending a blank email to
@email{faq-discuss-subscribe@@my.gnus.org, faq-discuss-subscribe@@my.gnus.org}
and @uref{http://mail1.kens.com/cgi-bin/ezmlm-browse?command=monthbythread%26list=faq-discuss, browse
-the archive}.
+the archive (BROKEN)}.
@node FAQ - Changes
@subheading Changes
@subsubheading Answer
-Gnus 5.10 requires an Emacs version that is greater
-than or equal to Emacs 20.7 or XEmacs 21.1. The
-development versions of Gnus (aka No Gnus) require Emacs
-21 or XEmacs 21.4.
+Gnus 5.10 requires an Emacs version that is greater than or equal
+to Emacs 20.7 or XEmacs 21.1.
+The development versions of Gnus (aka No Gnus) requires Emacs 21
+or XEmacs 21.4.
@node [1.7]
@subsubheading Question 1.7
@example
(setq nnmail-split-methods
'(("duplicates" "^Gnus-Warning:.*duplicate")
- ("XEmacs-NT" "^\\(To:\\|CC:\\).*localpart@@xemacs.bla.*")
- ("Gnus-Tut" "^\\(To:\\|CC:\\).*localpart@@socha.bla.*")
- ("tcsh" "^\\(To:\\|CC:\\).*localpart@@mx.gw.bla.*")
- ("BAfH" "^\\(To:\\|CC:\\).*localpart@@.*uni-muenchen.bla.*")
+ ("XEmacs-NT" "^\\(To:\\|CC:\\).*localpart@@xemacs.invalid.*")
+ ("Gnus-Tut" "^\\(To:\\|CC:\\).*localpart@@socha.invalid.*")
+ ("tcsh" "^\\(To:\\|CC:\\).*localpart@@mx.gw.invalid.*")
+ ("BAfH" "^\\(To:\\|CC:\\).*localpart@@.*uni-muenchen.invalid.*")
("Hamster-src" "^\\(CC:\\|To:\\).*hamster-sourcen@@yahoogroups.\\(de\\|com\\).*")
- ("Tagesschau" "^From: tagesschau <localpart@@www.tagesschau.bla>$")
- ("Replies" "^\\(CC:\\|To:\\).*localpart@@Frank-Schmitt.bla.*")
- ("EK" "^From:.*\\(localpart@@privateprovider.bla\\|localpart@@workplace.bla\\).*")
+ ("Tagesschau" "^From: tagesschau <localpart@@www.tagesschau.invalid>$")
+ ("Replies" "^\\(CC:\\|To:\\).*localpart@@Frank-Schmitt.invalid.*")
+ ("EK" "^From:.*\\(localpart@@privateprovider.invalid\\|localpart@@workplace.invalid\\).*")
("Spam" "^Content-Type:.*\\(ks_c_5601-1987\\|EUC-KR\\|big5\\|iso-2022-jp\\).*")
("Spam" "^Subject:.*\\(This really work\\|XINGA\\|ADV:\\|XXX\\|adult\\|sex\\).*")
("Spam" "^Subject:.*\\(\=\?ks_c_5601-1987\?\\|\=\?euc-kr\?\\|\=\?big5\?\\).*")
("Spam" "^X-Mailer:\\(.*BulkMailer.*\\|.*MIME::Lite.*\\|\\)")
("Spam" "^X-Mailer:\\(.*CyberCreek Avalanche\\|.*http\:\/\/GetResponse\.com\\)")
("Spam" "^From:.*\\(verizon\.net\\|prontomail\.com\\|money\\|ConsumerDirect\\).*")
- ("Spam" "^Delivered-To: GMX delivery to spamtrap@@gmx.bla$")
+ ("Spam" "^Delivered-To: GMX delivery to spamtrap@@gmx.invalid$")
("Spam" "^Received: from link2buy.com")
- ("Spam" "^CC: .*azzrael@@t-online.bla")
+ ("Spam" "^CC: .*azzrael@@t-online.invalid")
("Spam" "^X-Mailer-Version: 1.50 BETA")
- ("Uni" "^\\(CC:\\|To:\\).*localpart@@uni-koblenz.bla.*")
- ("Inbox" "^\\(CC:\\|To:\\).*\\(my\ name\\|address@@one.bla\\|adress@@two.bla\\)")
+ ("Uni" "^\\(CC:\\|To:\\).*localpart@@uni-koblenz.invalid.*")
+ ("Inbox" "^\\(CC:\\|To:\\).*\\(my\ name\\|address@@one.invalid\\|adress@@two.invalid\\)")
("Spam" "")))
@end example
@noindent
(setq gnus-posting-styles
'((".*"
(name "Frank Schmitt")
- (address "me@@there.bla")
+ (address "me@@there.invalid")
(organization "Hamme net, kren mer och nimmi")
(signature-file "~/.signature")
("X-SampleHeader" "foobar")
@example
(setq gnus-posting-styles
- '((".*" ;;default
- (name "Frank Schmitt")
- (organization "Hamme net, kren mer och nimmi")
- (signature-file "~/.signature") )
- ((message-news-p) ;;Usenet news?
- (address "mySpamTrap@@Frank-Schmitt.bla")
- ("Reply-To" "hereRealRepliesOnlyPlease@@Frank-Schmitt.bla") )
- ((message-mail-p) ;;mail?
- (address "usedForMails@@Frank-Schmitt.bla") )
- ("^gmane" ;;this is mail, too in fact
- (address "usedForMails@@Frank-Schmitt.net")
- ("Reply-To" nil) )
- ("^gmane.mail.spam.spamassassin.general$"
- (eval (setq mail-envelope-from "Azzrael@@rz-online.de"))
- (address "Azzrael@@rz-online.de")) ))
+ '((".*" ;;default
+ (name "Frank Schmitt")
+ (organization "Hamme net, kren mer och nimmi")
+ (signature-file "~/.signature"))
+ ((message-news-p) ;;Usenet news?
+ (address "mySpamTrap@@Frank-Schmitt.invalid")
+ (reply-to "hereRealRepliesOnlyPlease@@Frank-Schmitt.invalid"))
+ ((message-mail-p) ;;mail?
+ (address "usedForMails@@Frank-Schmitt.invalid"))
+ ("^gmane" ;;this is mail, too in fact
+ (address "usedForMails@@Frank-Schmitt.invalid")
+ (reply-to nil))
+ ("^gmane\\.mail\\.spam\\.spamassassin\\.general$"
+ (eval (set (make-local-variable 'message-sendmail-envelope-from)
+ "Azzrael@@rz-online.de")))))
@end example
@noindent
alias syntax:
@example
-alias al "Al <al@@english-heritage.bla>"
+alias al "Al <al@@english-heritage.invalid>"
@end example
@noindent
(setq bbdb-north-american-phone-numbers-p nil)
;;Tell bbdb about your email address:
(setq bbdb-user-mail-names
- (regexp-opt '("Your.Email@@here.bla"
- "Your.other@@mail.there.bla")))
+ (regexp-opt '("Your.Email@@here.invalid"
+ "Your.other@@mail.there.invalid")))
;;cycling while completing email addresses
(setq bbdb-complete-name-allow-cycling t)
;;No popup-buffers
(setq message-default-headers
(with-temp-buffer
(insert "X-Face: ")
- (insert-file-contents "~/.xemacs/xface")
+ (insert-file-contents "~/.xface")
(buffer-string)))
@end example
@noindent
-in ~/.gnus.el.
+in ~/.gnus.el. If you use Gnus 5.10, you can simply add an entry
+
+@example
+(x-face-file "~/.xface")
+@end example
+@noindent
+
+to gnus-posting-styles.
@node [5.9]
@subsubheading Question 5.9
@subsubheading Answer
-There's the newsgroup gnu.emacs.gnus (pull it from
-e.g. news.gnus.org) which deals with general questions and the
-ding mailing list (ding@@gnus.org) dealing with development of
+There's the newsgroup gnu.emacs.gnus
+(also available as
+@uref{http://dir.gmane.org/gmane.emacs.gnus.user,
+gmane.emacs.gnus.user})
+which deals with general Gnus questions.
+The ding mailing list (ding@@gnus.org) deals with development of
Gnus. You can read the ding list via NNTP, too under the name
-gmane.emacs.gnus.general from news.gmane.org.
+@uref{http://dir.gmane.org/gmane.emacs.gnus.general,
+gmane.emacs.gnus.general} from news.gmane.org.
If you want to stay in the big8,
news.software.newssreaders is also read by some Gnus
;;; gnus-news.el --- a hack to create GNUS-NEWS from texinfo source
-;; Copyright (C) 2004 Free Software Foundation, Inc.
+;; Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
;; Author: Reiner Steib <Reiner.Steib@gmx.de>
;; Keywords: tools
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
(defvar gnus-news-header-disclaimer
"GNUS NEWS -- history of user-visible changes.
-Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ 2006 Free Software Foundation, Inc.
See the end for copying conditions.
Please send Gnus bug reports to bugs\@gnus.org.
For older news, see Gnus info node \"New Features\".
-
-\f
-* Changes in No Gnus
-
")
(defvar gnus-news-trailer
----------------------------------------------------------------------
Copyright information:
-Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ 2006 Free Software Foundation, Inc.
Permission is granted to anyone to make or distribute verbatim copies
of this document as received, in any medium, provided that the
(defvar gnus-news-makeinfo-command "makeinfo")
-(defvar gnus-news-fill-column 72)
+(defvar gnus-news-fill-column 80)
(defvar gnus-news-makeinfo-switches
(concat " --no-headers --paragraph-indent=0"
(goto-char (point-min))
(save-excursion
(while (re-search-forward "^ \\* " nil t)
+ (replace-match "\f\n* ")))
+ (save-excursion
+ (while (re-search-forward "^ \\* " nil t)
(replace-match "** ")))
(save-excursion
(while (re-search-forward "^ " nil t)
(replace-match "")))
+ ;; Avoid `*' from @ref at beginning of line:
+ (save-excursion
+ (while (re-search-forward "^\\*Note" nil t)
+ (replace-match " \\&")))
(goto-char (point-min))
(insert gnus-news-header-disclaimer)
(goto-char (point-max))
@c -*-texinfo-*-
-@c Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+@c Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
@c Permission is granted to anyone to make or distribute verbatim copies
@c of this document as received, in any medium, provided that the
@itemize @bullet
+@item Installation changes
+
+@itemize @bullet
@item Upgrading from previous (stable) version if you have used No Gnus.
If you have tried No Gnus (the unstable Gnus branch leading to this
for more information about nntp marks. Note that downgrading isn't
safe in general.
-@item The nntp back end store article marks in @file{~/News/marks}.
+@item Lisp files are now installed in @file{.../site-lisp/gnus/} by default.
+It defaulted to @file{.../site-lisp/} formerly. In addition to this,
+the new installer issues a warning if other Gnus installations which
+will shadow the latest one are detected. You can then remove those
+shadows manually or remove them using @code{make
+remove-installed-shadows}.
+@end itemize
-The directory can be changed using the (customizable) variable
-@code{nntp-marks-directory}, and marks can be disabled using the
-(back end) variable @code{nntp-marks-is-evil}. The advantage of this
-is that you can copy @file{~/News/marks} (using rsync, scp or
-whatever) to another Gnus installation, and it will realize what
-articles you have read and marked. The data in @file{~/News/marks}
-has priority over the same data in @file{~/.newsrc.eld}.
+@item New packages and libraries within Gnus
+
+@itemize @bullet
+
+@item Gnus includes the Emacs Lisp @acronym{SASL} library.
+
+This provides a clean @acronym{API} to @acronym{SASL} mechanisms from
+within Emacs. The user visible aspects of this, compared to the earlier
+situation, include support for @acronym{DIGEST}-@acronym{MD5} and
+@acronym{NTLM}. @xref{Top, ,Emacs SASL, sasl, Emacs SASL}.
+
+@item ManageSieve connections uses the @acronym{SASL} library by default.
+
+The primary change this brings is support for @acronym{DIGEST-MD5} and
+@acronym{NTLM}, when the server supports it.
+
+@item Gnus includes a password cache mechanism in password.el.
+
+It is enabled by default (see @code{password-cache}), with a short
+timeout of 16 seconds (see @code{password-cache-expiry}). If
+@acronym{PGG} is used as the @acronym{PGP} back end, the @acronym{PGP}
+passphrase is managed by this mechanism. Passwords for ManageSieve
+connections are managed by this mechanism, after querying the user
+about whether to do so.
+@end itemize
+
+@item Changes in summary and article mode
+
+@itemize @bullet
+@item International host names (@acronym{IDNA}) can now be decoded
+inside article bodies using @kbd{W i}
+(@code{gnus-summary-idna-message}). This requires that GNU Libidn
+(@url{http://www.gnu.org/software/libidn/}) has been installed.
+@c FIXME: Also mention @code{message-use-idna}?
+
+@item Gnus now displays @acronym{DNS} master files sent as text/dns
+using dns-mode.
+
+@item Gnus supports new limiting commands in the Summary buffer:
+@kbd{/ r} (@code{gnus-summary-limit-to-replied}) and @kbd{/ R}
+(@code{gnus-summary-limit-to-recipient}). @xref{Limiting}.
+
+@item Gnus supports a new sort command in the Summary buffer:
+@kbd{C-c C-s C-t} (@code{gnus-summary-sort-by-recipient}). @xref{Summary
+Sorting}.
+
+@item @acronym{S/MIME} now features @acronym{LDAP} user certificate searches.
+You need to configure the server in @code{smime-ldap-host-list}.
+
+@item URLs inside Open@acronym{PGP} headers are retrieved and imported
+to your PGP key ring when you click on them.
@item
Picons can be displayed right from the textual address, see
-@code{gnus-picon-style}. @ref{Picons}.
+@code{gnus-picon-style}. @xref{Picons}.
-@item
-You can import and export your @acronym{RSS} subscriptions from
-@acronym{OPML} files. @xref{RSS}.
+@item @acronym{ANSI} @acronym{SGR} control sequences can be transformed
+using @kbd{W A}.
+
+@acronym{ANSI} sequences are used in some Chinese hierarchies for
+highlighting articles (@code{gnus-article-treat-ansi-sequences}).
+
+@item Gnus now MIME decodes articles even when they lack "MIME-Version" header.
+This changes the default of @code{gnus-article-loose-mime}.
+
+@item @code{gnus-decay-scores} can be a regexp matching score files.
+For example, set it to @samp{\\.ADAPT\\'} and only adaptive score files
+will be decayed. @xref{Score Decays}.
+
+@item Strings prefixing to the @code{To} and @code{Newsgroup} headers in
+summary lines when using @code{gnus-ignored-from-addresses} can be
+customized with @code{gnus-summary-to-prefix} and
+@code{gnus-summary-newsgroup-prefix}. @xref{To From Newsgroups}.
+
+@item You can replace @acronym{MIME} parts with external bodies.
+See @code{gnus-mime-replace-part} and @code{gnus-article-replace-part}.
+@xref{MIME Commands}, @ref{Using MIME}.
@item
The option @code{mm-fill-flowed} can be used to disable treatment of
format=flowed messages. Also, flowed text is disabled when sending
inline @acronym{PGP} signed messages.
+@xref{Flowed text, ,Flowed text, emacs-mime, The Emacs MIME Manual}.
-@item You can now drag and drop attachments to the Message buffer.
+@end itemize
-@item @acronym{ANSI} @acronym{SGR} control sequences can be transformed
-using @kbd{W A}.
+@item Changes in Message mode
-@acronym{ANSI} sequences are used in some Chinese hierarchies for
-highlighting articles (@code{gnus-article-treat-ansi-sequences}).
+@itemize @bullet
+@item Gnus now supports the ``hashcash'' client puzzle anti-spam mechanism.
+Use @code{(setq message-generate-hashcash t)} to enable.
+@xref{Hashcash}.
-@item International host names (@acronym{IDNA}) can now be decoded
-inside article bodies using @kbd{W i}
-(@code{gnus-summary-idna-message}). This require that GNU Libidn
-(@url{http://www.gnu.org/software/libidn/}) has been installed.
+@item You can now drag and drop attachments to the Message buffer.
+See @code{mml-dnd-protocol-alist} and @code{mml-dnd-attach-options}.
+@xref{MIME, ,MIME, message, Message Manual}.
-@item Gnus includes an Emacs Lisp @acronym{SASL} library.
+@item The option @code{message-yank-empty-prefix} now controls how
+empty lines are prefixed in cited text. @xref{Insertion Variables,
+,Insertion Variables, message, Message Manual}.
-This provide a clean @acronym{API} to @acronym{SASL} mechanisms from
-within Emacs. The user visible aspects of this, compared to the earlier
-situation, include support for @acronym{DIGEST}-@acronym{MD5} and
-@acronym{NTLM}.
+@item Gnus uses narrowing to hide headers in Message buffers.
+The @code{References} header is hidden by default. To make all
+headers visible, use @code{(setq message-hidden-headers nil)}.
+@xref{Message Headers, ,Message Headers, message, Message Manual}.
+@end itemize
-@item ManageSieve connections uses the @acronym{SASL} library by default.
+@item Changes in back ends
-The primary change this brings is support for @acronym{DIGEST-MD5} and
-@acronym{NTLM}, when the server support it.
+@itemize @bullet
+@item The nntp back end stores article marks in @file{~/News/marks}.
-@item Gnus include a password cache mechanism in password.el.
+The directory can be changed using the (customizable) variable
+@code{nntp-marks-directory}, and marks can be disabled using the
+(back end) variable @code{nntp-marks-is-evil}. The advantage of this
+is that you can copy @file{~/News/marks} (using rsync, scp or
+whatever) to another Gnus installation, and it will realize what
+articles you have read and marked. The data in @file{~/News/marks}
+has priority over the same data in @file{~/.newsrc.eld}.
-It is enabled by default (see @code{password-cache}), with a short
-timeout of 16 seconds (see @code{password-cache-expiry}). If
-@acronym{PGG} is used as the @acronym{PGP} back end, the @acronym{PGP}
-passphrase is managed by this mechanism. Passwords for ManageSieve
-connections are managed by this mechanism, after quering the user about
-whether to do so.
+@item
+You can import and export your @acronym{RSS} subscriptions from
+@acronym{OPML} files. @xref{RSS}.
@item @acronym{IMAP} identity (@acronym{RFC} 2971) is supported.
-By default, Gnus do not send any information about itself, but you can
+By default, Gnus does not send any information about itself, but you can
customize it using the variable @code{nnimap-id}.
-@item The @file{all.SCORE} file can be edited from the group buffer
-using @kbd{W e}.
+@item The @code{nnrss} back end now supports multilingual text.
+Non-@acronym{ASCII} group names for the @code{nnrss} groups are also
+supported. @xref{RSS}.
-@item Gnus now MIME decode articles even when they lack "MIME-Version" header.
-This changes the default of @code{gnus-article-loose-mime}.
+@item Retrieving mail with @acronym{POP3} is supported over @acronym{SSL}/@acronym{TLS} and with StartTLS.
-@item Gnus now view DNS master files sent as text/dns using dns-mode.
+@item The nnml back end allows other compression programs beside @file{gzip}
+for compressed message files. @xref{Mail Spool}.
+@end itemize
-@item Gnus now support the ``hashcash'' client puzzle anti-spam idea.
-See the Gnus manual, section Hashcash, for more information. Use
-@code{(setq message-generate-hashcash t)} to enable.
+@item Appearance
+@c Maybe it's not worth to separate this from "Miscellaneous"?
-@item Gnus supports new limiting commands in the Summary buffer:
-@kbd{/ r} (@code{gnus-summary-limit-to-replied}) and @kbd{/ R}
-(@code{gnus-summary-limit-to-recipient}). @ref{Limiting}.
+@itemize @bullet
-@item Gnus supports a new sort command in the Summary buffer:
-@kbd{C-c C-s C-t} (@code{gnus-summary-sort-by-recipient}). @ref{Summary
-Sorting}
+@item The tool bar has been updated to use GNOME icons.
+You can also customize the tool bar. There's no documentation in the
+manual yet, but @kbd{M-x customize-apropos RET -tool-bar$} should get
+you started. (Only for Emacs, not in XEmacs.)
+@c FIXME: Document this in the manual
-@item The @code{nnrss} back end now supports multilingual text.
-Non-@acronym{ASCII} group names for the @code{nnrss} groups are also
-supported. @xref{RSS}.
+@item The tool bar icons are now (de)activated correctly
+in the group buffer, see the variable @code{gnus-group-update-tool-bar}.
+Its default value depends on your Emacs version.
+@c FIXME: Document this in the manual
-@item URLs inside OpenPGP: headers are retrieved and imported to your
-PGP key ring when you click on them.
+@item You can change the location of XEmacs' toolbars in Gnus buffers.
+See @code{gnus-use-toolbar} and @code{message-use-toolbar}.
-@item Gnus uses narrowing to hide headers in Message buffers.
-The @code{References} header is hidden by default. To make all
-headers visible, use @code{(setq message-hidden-headers nil)}.
+@end itemize
-@item @code{gnus-decay-scores} can be a regexp matching score files.
-This allows to decay only adaptive score files. @ref{Score Decays}.
+@item Miscellaneous changes
-@item @acronym{S/MIME} now feature @acronym{LDAP} user certificate searches.
-You need to configure the server in @code{smime-ldap-host-list}.
+@itemize @bullet
+@item Having edited the select-method for the foreign server in the
+server buffer is immediately reflected to the subscription of the groups
+which use the server in question. For instance, if you change
+@code{nntp-via-address} into @samp{bar.example.com} from
+@samp{foo.example.com}, Gnus will connect to the news host by way of the
+intermediate host @samp{bar.example.com} from next time.
+
+@item The @file{all.SCORE} file can be edited from the group buffer
+using @kbd{W e}.
@end itemize
+
+@end itemize
+
@c gnus-news.texi ends here.
@ignore
\newcommand{\Copyright}{%
\begin{center}
- Copyright \copyright\ 1995 Free Software Foundation, Inc.\\*
+ Copyright \copyright\ 1995, 2002, 2003, 2004,
+ 2005, 2006 Free Software Foundation, Inc.\\*
Copyright \copyright\ 1995 Vladimir Alexiev
$<$vladimir@cs.ualberta.ca$>$.\\*
Copyright \copyright\ 2000 Felix Natter $<$fnatter@gmx.net$>$.\\*
@documentencoding ISO-8859-1
@copying
-Copyright (c) 1995, 1996, 1997, 1998, 1999, 2000, 2001,
-2002, 2003, 2004, 2005
-Free Software Foundation, Inc.
+Copyright @copyright{} 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
@quotation
Permission is granted to copy, distribute and/or modify this document
-under the terms of the GNU Free Documentation License, Version 1.1 or
+under the terms of the GNU Free Documentation License, Version 1.2 or
any later version published by the Free Software Foundation; with no
Invariant Sections, with the Front-Cover texts being ``A GNU
Manual'', and with the Back-Cover Texts as in (a) below. A copy of the
\makeindex
\begin{document}
-\newcommand{\gnusversionname}{No Gnus v0.3}
+% Adjust ../Makefile.in if you change the following line:
+\newcommand{\gnusversionname}{No Gnus v0.4}
\newcommand{\gnuschaptername}{}
\newcommand{\gnussectionname}{}
spool or your mbox file. All at the same time, if you want to push your
luck.
-This manual corresponds to No Gnus v0.3.
+@c Adjust ../Makefile.in if you change the following line:
+This manual corresponds to No Gnus v0.4.
@end ifinfo
* IMAP:: Using Gnus as a @acronym{IMAP} client.
* Other Sources:: Reading directories, files, SOUP packets.
* Combined Groups:: Combining groups into one group.
+* Email Based Diary:: Using mails to manage diary events in Gnus.
* Gnus Unplugged:: Reading news and mail offline.
Server Buffer
* Ultimate:: The Ultimate Bulletin Board systems.
* Web Archive:: Reading mailing list archived on web.
* RSS:: Reading RDF site summary.
-* Customizing w3:: Doing stuff to Emacs/w3 from Gnus.
+* Customizing W3:: Doing stuff to Emacs/W3 from Gnus.
@acronym{IMAP}
* Virtual Groups:: Combining articles from many groups.
* Kibozed Groups:: Looking through parts of the newsfeed for articles.
+Email Based Diary
+
+* The NNDiary Back End:: Basic setup and usage.
+* The Gnus Diary Library:: Utility toolkit on top of nndiary.
+* Sending or Not Sending:: A final note on sending diary messages.
+
+The NNDiary Back End
+
+* Diary Messages:: What makes a message valid for nndiary.
+* Running NNDiary:: NNDiary has two modes of operation.
+* Customizing NNDiary:: Bells and whistles.
+
+The Gnus Diary Library
+
+* Diary Summary Line Format:: A nicer summary buffer line format.
+* Diary Articles Sorting:: A nicer way to sort messages.
+* Diary Headers Generation:: Not doing it manually.
+* Diary Group Parameters:: Not handling them manually.
+
Gnus Unplugged
* Agent Basics:: How it all is supposed to work.
* Agent as Cache:: The Agent is a big cache too.
* Agent Expiry:: How to make old articles go away.
* Agent Regeneration:: How to recover from lost connections and other accidents.
+* Agent and flags:: How the Agent maintains flags.
* Agent and IMAP:: How to use the Agent with @acronym{IMAP}.
* Outgoing Messages:: What happens when you post/mail something?
* Agent Variables:: Customizing is fun.
Filtering Spam Using The Spam ELisp Package
-* Spam ELisp Package Sequence of Events::
-* Spam ELisp Package Filtering of Incoming Mail::
-* Spam ELisp Package Global Variables::
-* Spam ELisp Package Configuration Examples::
-* Blacklists and Whitelists::
-* BBDB Whitelists::
-* Gmane Spam Reporting::
-* Anti-spam Hashcash Payments::
-* Blackholes::
-* Regular Expressions Header Matching::
-* Bogofilter::
-* SpamAssassin back end::
-* ifile spam filtering::
-* spam-stat spam filtering::
-* SpamOracle::
-* Extending the Spam ELisp package::
+* Spam ELisp Package Sequence of Events::
+* Spam ELisp Package Filtering of Incoming Mail::
+* Spam ELisp Package Global Variables::
+* Spam ELisp Package Configuration Examples::
+* Blacklists and Whitelists::
+* BBDB Whitelists::
+* Gmane Spam Reporting::
+* Anti-spam Hashcash Payments::
+* Blackholes::
+* Regular Expressions Header Matching::
+* Bogofilter::
+* SpamAssassin back end::
+* ifile spam filtering::
+* spam-stat spam filtering::
+* SpamOracle::
+* Extending the Spam ELisp package::
Filtering Spam Using Statistics with spam-stat
* Quassia Gnus:: Two times two is four, or Gnus 5.6/5.7.
* Pterodactyl Gnus:: Pentad also starts with P, AKA Gnus 5.8/5.9.
* Oort Gnus:: It's big. It's far out. Gnus 5.10/5.11.
-* No Gnus:: Lars, FIXME!
+* No Gnus:: Very punny.
Customization
Most common Unix news readers use a shared startup file called
@file{.newsrc}. This file contains all the information about what
groups are subscribed, and which articles in these groups have been
-read.
+read.
Things got a bit more complicated with @sc{gnus}. In addition to
keeping the @file{.newsrc} file updated, it also used a file called
@vindex gnus-init-file
@vindex gnus-site-init-file
When Gnus starts, it will read the @code{gnus-site-init-file}
-(@file{.../site-lisp/gnus} by default) and @code{gnus-init-file}
+(@file{.../site-lisp/gnus-init} by default) and @code{gnus-init-file}
(@file{~/.gnus} by default) files. These are normal Emacs Lisp files
and can be used to avoid cluttering your @file{~/.emacs} and
@file{site-init} files with Gnus stuff. Gnus will also check for files
with the same names as these, but with @file{.elc} and @file{.el}
suffixes. In other words, if you have set @code{gnus-init-file} to
@file{~/.gnus}, it will look for @file{~/.gnus.elc}, @file{~/.gnus.el},
-and finally @file{~/.gnus} (in this order).
-
+and finally @file{~/.gnus} (in this order). If Emacs was invoked with
+the @option{-q} or @option{--no-init-file} options (@pxref{Initial
+Options, ,Initial Options, emacs, The Emacs Manual}), Gnus doesn't read
+@code{gnus-init-file}.
@node Auto Save
that group will always be visible in the Group buffer, regardless
of whether it has any unread articles.
+This parameter cannot be set via @code{gnus-parameters}. See
+@code{gnus-permanently-visible-groups} as an alternative.
+
@item broken-reply-to
@cindex broken-reply-to
Elements like @code{(broken-reply-to . t)} signals that @code{Reply-To}
hear a beep when you enter a group, you could put something like
@code{(dummy-variable (ding))} in the parameters of that group.
@code{dummy-variable} will be set to the (meaningless) result of the
-@code{(ding)} form.
+@code{(ding)} form.
Alternatively, since the VARIABLE becomes local to the group, this
pattern can be used to temporarily change a hook. For example, if the
@vindex gnus-parameters
Group parameters can be set via the @code{gnus-parameters} variable too.
-But some variables, such as @code{visible}, have no effect. For
-example:
+But some variables, such as @code{visible}, have no effect (For this
+case see @code{gnus-permanently-visible-groups} as an alternative.).
+For example:
@lisp
(setq gnus-parameters
String value of parameters will be subjected to regexp substitution, as
the @code{to-group} example shows.
+@vindex gnus-parameters-case-fold-search
+By default, whether comparing the group name and one of those regexps
+specified in @code{gnus-parameters} is done in a case-sensitive manner
+or a case-insensitive manner depends on the value of
+@code{case-fold-search} at the time when the comparison is done. The
+value of @code{case-fold-search} is typically @code{t}; it means, for
+example, the element @code{("INBOX\\.FOO" (total-expire . t))} might be
+applied to both the @samp{INBOX.FOO} group and the @samp{INBOX.foo}
+group. If you want to make those regexps always case-sensitive, set the
+value of the @code{gnus-parameters-case-fold-search} variable to
+@code{nil}. Otherwise, set it to @code{t} if you want to compare them
+always in a case-insensitive manner.
+
+You can define different sorting to different groups via
+@code{gnus-parameters}. Here is an example to sort an @acronym{NNTP}
+group by reverse date to see the latest news at the top and an
+@acronym{RSS} group by subject. In this example, the first group is the
+Debian daily news group @code{gmane.linux.debian.user.news} from
+news.gmane.org. The @acronym{RSS} group corresponds to the Debian
+weekly news RSS feed
+@url{http://packages.debian.org/unstable/newpkg_main.en.rdf},
+@xref{RSS}.
+
+@lisp
+(setq
+ gnus-parameters
+ '(("nntp.*gmane\\.debian\\.user\\.news"
+ (gnus-show-threads nil)
+ (gnus-article-sort-functions '((not gnus-article-sort-by-date)))
+ (gnus-use-adaptive-scoring nil)
+ (gnus-use-scoring nil))
+ ("nnrss.*debian"
+ (gnus-show-threads nil)
+ (gnus-article-sort-functions 'gnus-article-sort-by-subject)
+ (gnus-use-adaptive-scoring nil)
+ (gnus-use-scoring t)
+ (gnus-score-find-score-files-function 'gnus-score-find-single)
+ (gnus-summary-line-format "%U%R%z%d %I%(%[ %s %]%)\n"))))
+@end lisp
+
@node Listing Groups
@section Listing Groups
8: comp.binaries.fractals
13: comp.sources.unix
452: alt.sex.emacs
-@end group
+@end group
@end example
The @samp{Emacs} topic has the topic parameter @code{(score-file
@table @kbd
+@item v
+@kindex v (Group)
+@cindex keys, reserved for users (Group)
+The key @kbd{v} is reserved for users. You can bind it key to some
+function or better use it as a prefix key. For example:
+
+@lisp
+(define-key gnus-group-mode-map (kbd "v j d")
+ (lambda ()
+ (interactive)
+ (gnus-group-jump-to-group "nndraft:drafts")))
+@end lisp
+
+On keys reserved for users in Emacs and on keybindings in general
+@xref{Keymaps, Keymaps, , emacs, The Emacs Editor}.
+
@item ^
@kindex ^ (Group)
@findex gnus-group-enter-server-mode
You can have as many summary buffers open as you wish.
+@kindex v (Summary)
+@cindex keys, reserved for users (Summary)
+The key @kbd{v} is reserved for users. You can bind it key to some
+function or better use it as a prefix key. For example:
+@lisp
+(define-key gnus-summary-mode-map (kbd "v -") "LrS") ;; lower subthread
+@end lisp
+
@menu
* Summary Buffer Format:: Deciding how the summary buffer is to look.
* Summary Maneuvering:: Moving around the summary buffer.
The line number.
@item O
Download mark.
+@item *
+Desired cursor position (instead of after first colon).
@item &user-date;
Age sensitive date format. Various date format is defined in
@code{gnus-user-date-format-alist}.
@code{From} header, the value of the @code{To} or @code{Newsreader}
headers are used instead.
+To distinguish regular articles from those where the @code{From} field
+has been swapped, a string is prefixed to the @code{To} or
+@code{Newsgroups} header in the summary line. By default the string is
+@samp{-> } for @code{To} and @samp{=> } for @code{Newsgroups}, you can
+customize these strings with @code{gnus-summary-to-prefix} and
+@code{gnus-summary-newsgroup-prefix}.
+
@end enumerate
@vindex nnmail-extra-headers
@item gnus-select-article-hook
@vindex gnus-select-article-hook
-This hook is called whenever an article is selected. By default it
-exposes any threads hidden under the selected article. If you would
-like each article to be saved in the Agent as you read it, putting
-@code{gnus-agent-fetch-selected-article} on this hook will do so.
+This hook is called whenever an article is selected. The default is
+@code{nil}. If you would like each article to be saved in the Agent as
+you read it, putting @code{gnus-agent-fetch-selected-article} on this
+hook will do so.
@item gnus-mark-article-hook
@vindex gnus-mark-article-hook
This hook is called whenever an article is selected. It is intended to
be used for marking articles as read. The default value is
@code{gnus-summary-mark-read-and-unread-as-read}, and will change the
-mark of almost any article you read to @code{gnus-unread-mark}. The
-only articles not affected by this function are ticked, dormant, and
+mark of almost any article you read to @code{gnus-read-mark}. The only
+articles not affected by this function are ticked, dormant, and
expirable articles. If you'd instead like to just have unread articles
marked as read, you can use @code{gnus-summary-mark-unread-as-read}
instead. It will leave marks like @code{gnus-low-score-mark},
@cindex digests
@cindex making digests
Digest the current series and forward the result to a newsgroup
-(@code{gnus-uu-digest-mail-forward}). This command uses the
+(@code{gnus-uu-digest-post-forward}). This command uses the
process/prefix convention.
@item S u
@findex gnus-thread-sort-by-total-score
@findex gnus-thread-sort-by-date
+@findex gnus-thread-sort-by-date-reverse
@findex gnus-thread-sort-by-score
@findex gnus-thread-sort-by-subject
@findex gnus-thread-sort-by-author
-@c @findex gnus-thread-sort-by-recipient
+@findex gnus-thread-sort-by-recipient
@findex gnus-thread-sort-by-number
@findex gnus-thread-sort-by-random
@vindex gnus-thread-sort-functions
By default, sorting is done on article numbers. Ready-made sorting
predicate functions include @code{gnus-thread-sort-by-number},
-@code{gnus-thread-sort-by-author}, @code{gnus-thread-sort-by-subject},
-@code{gnus-thread-sort-by-date}, @code{gnus-thread-sort-by-score},
+@code{gnus-thread-sort-by-author}, @code{gnus-thread-sort-by-recipient},
+@code{gnus-thread-sort-by-subject},
+@code{gnus-thread-sort-by-date}, @code{gnus-thread-sort-by-date-reverse},
+@code{gnus-thread-sort-by-score},
@code{gnus-thread-sort-by-most-recent-number},
@code{gnus-thread-sort-by-most-recent-date},
@code{gnus-thread-sort-by-random} and
@lisp
(setq gnus-thread-sort-functions
- '((lambda (t1 t2)
- (not (gnus-thread-sort-by-number t1 t2)))
+ '((not gnus-thread-sort-by-number)
gnus-thread-sort-by-score))
@end lisp
gnus-article-sort-by-subject))
@end lisp
+You can define group specific sorting via @code{gnus-parameters},
+@xref{Group Parameters}.
@node Asynchronous Fetching
usually done automatically by Gnus if the message in question has a
@code{Content-Type} header that says that the message is @acronym{HTML}.
-If a prefix is given, a charset will be asked for.
+If a prefix is given, a charset will be asked for. If it is a number,
+the charset defined in @code{gnus-summary-show-article-charset-alist}
+(@pxref{Paging the Article}) will be used.
@vindex gnus-article-wash-function
The default is to use the function specified by
@table @code
@item w3
-Use Emacs/w3.
+Use Emacs/W3.
@item w3m
Use @uref{http://emacs-w3m.namazu.org/, emacs-w3m}.
+@item w3m-standalone
+Use @uref{http://w3m.sourceforge.net/, w3m}.
+
@item links
Use @uref{http://links.sf.net/, Links}.
@cindex viewing attachments
The following commands all understand the numerical prefix. For
-instance, @kbd{3 b} means ``view the third @acronym{MIME} part''.
+instance, @kbd{3 K v} means ``view the third @acronym{MIME} part''.
@table @kbd
@item b
@kindex K o (Summary)
Save the @acronym{MIME} part.
+@item K O
+@kindex K O (Summary)
+Prompt for a file name, then save the @acronym{MIME} part and strip it
+from the article. The stripped @acronym{MIME} object will be referred
+via the message/external-body @acronym{MIME} type.
+
+@item K r
+@kindex K r (Summary)
+Replace the @acronym{MIME} part with an external body.
+
+@item K d
+@kindex K d (Summary)
+Delete the @acronym{MIME} part and add some information about the
+removed part.
+
@item K c
@kindex K c (Summary)
Copy the @acronym{MIME} part.
variable to @code{("multipart/signed")} and leave
@code{gnus-unbuttonized-mime-types} at the default value.
+You could also add @code{"multipart/alternative"} to this list to
+display radio buttons that allow you to choose one of two media types
+those mails include. See also @code{mm-discouraged-alternatives}
+(@pxref{Display Customization, ,Display Customization, emacs-mime, The
+Emacs MIME Manual}).
+
@item gnus-inhibit-mime-unbuttonizing
@vindex gnus-inhibit-mime-unbuttonizing
If this is non-@code{nil}, then all @acronym{MIME} parts get buttons. The
Display "multipart/related" parts as "multipart/mixed".
If displaying "text/html" is discouraged, see
-@code{mm-discouraged-alternatives} in @ref{Display Customization,
-Display Customization, , emacs-mime, Emacs-Mime Manual}. Images or
-other material inside a "multipart/related" part might be overlooked
-when this variable is @code{nil}.
+@code{mm-discouraged-alternatives}, images or other material inside a
+"multipart/related" part might be overlooked when this variable is
+@code{nil}. @ref{Display Customization, Display Customization, ,
+emacs-mime, Emacs-Mime Manual}.
@vindex gnus-mime-display-multipart-as-mixed
@item gnus-mime-display-multipart-as-mixed
just send out messages without saying what character sets they use. To
help a bit with this, some local news hierarchies have policies that say
what character set is the default. For instance, the @samp{fj}
-hierarchy uses @code{iso-2022-jp-2}.
+hierarchy uses @code{iso-2022-jp}.
@vindex gnus-group-charset-alist
This knowledge is encoded in the @code{gnus-group-charset-alist}
@kindex M-^ (Summary)
@cindex Message-ID
@cindex fetching by Message-ID
-You can also ask the @acronym{NNTP} server for an arbitrary article, no
-matter what group it belongs to. @kbd{M-^}
-(@code{gnus-summary-refer-article}) will ask you for a
-@code{Message-ID}, which is one of those long, hard-to-read thingies
-that look something like @samp{<38o6up$6f2@@hymir.ifi.uio.no>}. You
-have to get it all exactly right. No fuzzy searches, I'm afraid.
-@end table
+You can also ask Gnus for an arbitrary article, no matter what group it
+belongs to. @kbd{M-^} (@code{gnus-summary-refer-article}) will ask you
+for a @code{Message-ID}, which is one of those long, hard-to-read
+thingies that look something like @samp{<38o6up$6f2@@hymir.ifi.uio.no>}.
+You have to get it all exactly right. No fuzzy searches, I'm afraid.
-The current select method will be used when fetching by
-@code{Message-ID} from non-news select method, but you can override this
-by giving this command a prefix.
+Gnus looks for the @code{Message-ID} in the headers that have already
+been fetched, but also tries all the select methods specified by
+@code{gnus-refer-article-method} if it is not found.
+@end table
@vindex gnus-refer-article-method
If the group you are reading is located on a back end that does not
Mark all articles as read and go to the next group
(@code{gnus-summary-catchup-and-goto-next-group}).
+@item Z p
+@kindex Z p (Summary)
+@findex gnus-summary-catchup-and-goto-prev-group
+Mark all articles as read and go to the previous group
+(@code{gnus-summary-catchup-and-goto-prev-group}).
+
@item Z R
@itemx C-x C-s
@kindex Z R (Summary)
@end enumerate
-More information on how to set things up can be found in the message
-manual (@pxref{Security, ,Security, message, Message Manual}).
+The variables that control security functionality on reading messages
+include:
@table @code
@item mm-verify-option
@end table
+By default the buttons that display security information are not
+shown, because they clutter reading the actual e-mail. You can type
+@kbd{K b} manually to display the information. Use the
+@code{gnus-buttonized-mime-types} and
+@code{gnus-unbuttonized-mime-types} variables to control this
+permanently. @ref{MIME Commands} for further details, and hints on
+how to customize these variables to always display security
+information.
+
@cindex snarfing keys
@cindex importing PGP keys
@cindex PGP key ring import
This happens to also be the default action defined in
@code{mailcap-mime-data}.
+More information on how to set things for sending outgoing signed and
+encrypted messages up can be found in the message manual
+(@pxref{Security, ,Security, message, Message Manual}).
+
@node Mailing List
@section Mailing List
@cindex mailing list
message/external-body @acronym{MIME} type.
(@code{gnus-mime-save-part-and-strip}).
+@findex gnus-mime-replace-part
+@item r (Article)
+@kindex r (Article)
+Prompt for a file name, replace the @acronym{MIME} object with an
+external body refering to the file via the message/external-body
+@acronym{MIME} type. (@code{gnus-mime-replace-part}).
+
@findex gnus-mime-delete-part
@item d (Article)
@kindex d (Article)
information about the removed @acronym{MIME} object
(@code{gnus-mime-delete-part}).
+@c FIXME: gnus-auto-select-part should be documented here
+
@findex gnus-mime-copy-part
@item c (Article)
@kindex c (Article)
@code{head}: Do the treatment on the headers.
@item
-@code{last}: Do this treatment on the last part.
+@code{first}: Do this treatment on the first body part.
+
+@item
+@code{last}: Do this treatment on the last body part.
@item
An integer: Do this treatment on all body parts that have a length less
@item gnus-treat-overstrike (t, integer)
@item gnus-treat-strip-cr (t, integer)
@item gnus-treat-strip-headers-in-body (t, integer)
-@item gnus-treat-strip-leading-blank-lines (t, integer)
+@item gnus-treat-strip-leading-blank-lines (t, first, integer)
@item gnus-treat-strip-multiple-blank-lines (t, integer)
@item gnus-treat-strip-pem (t, last, integer)
@item gnus-treat-strip-trailing-blank-lines (t, last, integer)
buffer displayed while reading. You can do it all from the article
buffer.
+@kindex v (Article)
+@cindex keys, reserved for users (Article)
+The key @kbd{v} is reserved for users. You can bind it key to some
+function or better use it as a prefix key.
+
A few additional keystrokes are available:
@table @kbd
@item gnus-confirm-mail-reply-to-news
@vindex gnus-confirm-mail-reply-to-news
-This can also be a function receiving the group name as the only
-parameter which should return non-@code{nil} if a confirmation is
-needed, or a regular expression matching group names, where
-confirmation is should be asked for.
+If non-@code{nil}, Gnus will ask you for a confirmation when you are
+about to reply to news articles by mail. If it is @code{nil}, nothing
+interferes in what you want to do. This can also be a function
+receiving the group name as the only parameter which should return
+non-@code{nil} if a confirmation is needed, or a regular expression
+matching group names, where confirmation should be asked for.
If you find yourself never wanting to reply to mail, but occasionally
-press R anyway, this variable might be for you.
+press @kbd{R} anyway, this variable might be for you.
@item gnus-confirm-treat-mail-like-news
@vindex gnus-confirm-treat-mail-like-news
'((".*"
(signature-file "~/.signature")
(name "User Name")
- ("X-Home-Page" (getenv "WWW_HOME"))
+ (x-face-file "~/.xface")
+ (x-url (getenv "WWW_HOME"))
(organization "People's Front Against MWM"))
("^rec.humor"
(signature my-funny-signature-randomizer))
* IMAP:: Using Gnus as a @acronym{IMAP} client.
* Other Sources:: Reading directories, files, SOUP packets.
* Combined Groups:: Combining groups into one group.
+* Email Based Diary:: Using mails to manage diary events in Gnus.
* Gnus Unplugged:: Reading news and mail offline.
@end menu
@item s
The opened/closed/denied status of the server.
+
+@item a
+Whether this server is agentized.
@end table
@vindex gnus-server-mode-line-format
@table @kbd
+@item v
+@kindex v (Server)
+@cindex keys, reserved for users (Server)
+The key @kbd{v} is reserved for users. You can bind it key to some
+function or better use it as a prefix key.
+
@item a
@kindex a (Server)
@findex gnus-server-add-server
(nntp-via-rlogin-command "ssh")
@end lisp
-See also @code{nntp-via-rlogin-command-switches}.
+See also @code{nntp-via-rlogin-command-switches}. Here's an example for
+an indirect connection:
+@lisp
+(setq gnus-select-method
+ '(nntp "indirect"
+ (nntp-address "news.server.example")
+ (nntp-via-user-name "intermediate_user_name")
+ (nntp-via-address "intermediate.host.example")
+ (nntp-via-rlogin-command "ssh")
+ (nntp-end-of-line "\n")
+ (nntp-via-rlogin-command-switches ("-C" "-t" "-e" "none"))
+ (nntp-open-connection-function nntp-open-via-rlogin-and-telnet)))
+@end lisp
If you're behind a firewall, but have direct access to the outside world
through a wrapper command like "runsocks", you could open a socksified
connection before giving up. If it is @code{nil}, which is the default,
no timeouts are done.
-@c @item nntp-command-timeout
-@c @vindex nntp-command-timeout
-@c @cindex PPP connections
-@c @cindex dynamic IP addresses
-@c If you're running Gnus on a machine that has a dynamically assigned
-@c address, Gnus may become confused. If the address of your machine
-@c changes after connecting to the @acronym{NNTP} server, Gnus will simply sit
-@c waiting forever for replies from the server. To help with this
-@c unfortunate problem, you can set this command to a number. Gnus will
-@c then, if it sits waiting for a reply from the server longer than that
-@c number of seconds, shut down the connection, start a new one, and resend
-@c the command. This should hopefully be transparent to the user. A
-@c likely number is 30 seconds.
-@c
-@c @item nntp-retry-on-break
-@c @vindex nntp-retry-on-break
-@c If this variable is non-@code{nil}, you can also @kbd{C-g} if Gnus
-@c hangs. This will have much the same effect as the command timeout
-@c described above.
-
-@item nntp-server-hook
-@vindex nntp-server-hook
-This hook is run as the last step when connecting to an @acronym{NNTP}
-server.
-
-@item nntp-buggy-select
-@vindex nntp-buggy-select
-Set this to non-@code{nil} if your select routine is buggy.
-
@item nntp-nov-is-evil
@vindex nntp-nov-is-evil
If the @acronym{NNTP} server does not support @acronym{NOV}, you could set this
@vindex nntp-prepare-server-hook
A hook run before attempting to connect to an @acronym{NNTP} server.
-@item nntp-warn-about-losing-connection
-@vindex nntp-warn-about-losing-connection
-If this variable is non-@code{nil}, some noise will be made when a
-server closes connection.
-
@item nntp-record-commands
@vindex nntp-record-commands
If non-@code{nil}, @code{nntp} will log all commands it sends to the
It is possible to customize how the connection to the nntp server will
be opened. If you specify an @code{nntp-open-connection-function}
parameter, Gnus will use that function to establish the connection.
-Five pre-made functions are supplied. These functions can be grouped in
-two categories: direct connection functions (three pre-made), and
-indirect ones (two pre-made).
+Seven pre-made functions are supplied. These functions can be grouped
+in two categories: direct connection functions (four pre-made), and
+indirect ones (three pre-made).
@item nntp-prepare-post-hook
@vindex nntp-prepare-post-hook
Note that not all servers support the recommended ID. This works for
INN versions 2.3.0 and later, for instance.
-@item nntp-read-timeout
-@vindex nntp-read-timeout
-How long nntp should wait between checking for the end of output.
-Shorter values mean quicker response, but is more CPU intensive. The
-default is 0.1 seconds. If you have a slow line to the server (and
-don't like to see Emacs eat your available CPU power), you might set
-this to, say, 1.
-
@end table
@menu
@item nntp-open-via-telnet-and-telnet
@findex nntp-open-via-telnet-and-telnet
-Does essentially also the same, but uses @samp{telnet} instead of
+Does essentially the same, but uses @samp{telnet} instead of
@samp{rlogin} to connect to the intermediate host.
@code{nntp-open-via-telnet-and-telnet}-specific variables:
The following variables affect the behavior of all, or several of the
pre-made connection functions. When not specified, all functions are
-affected.
+affected (the values of the following variables will be used as the
+default if each virtual @code{nntp} server doesn't specify those server
+variables individually).
@table @code
@vindex nntp-pre-command
A command wrapper to use when connecting through a non native
connection function (all except @code{nntp-open-network-stream},
-@code{nntp-open-tls-stream}, and @code{nntp-open-ssl-stream}. This is
+@code{nntp-open-tls-stream}, and @code{nntp-open-ssl-stream}). This is
where you would put a @samp{SOCKS} wrapper for instance.
@item nntp-address
@vindex nntp-port-number
Port number to connect to the @acronym{NNTP} server. The default is
@samp{nntp}. If you use @acronym{NNTP} over
-@acronym{tls}/@acronym{ssl}, you may want to use integer ports rather
+@acronym{TLS}/@acronym{SSL}, you may want to use integer ports rather
than named ports (i.e, use @samp{563} instead of @samp{snews} or
@samp{nntps}), because external @acronym{TLS}/@acronym{SSL} tools may
not work with named ports.
By default the splitting codes @acronym{MIME} decodes headers so you
can match on non-@acronym{ASCII} strings. The
@code{nnmail-mail-splitting-charset} variable specifies the default
-charset for decoding. The behaviour can be turned off completely by
+charset for decoding. The behavior can be turned off completely by
binding @code{nnmail-mail-splitting-decodes} to @code{nil}, which is
useful if you want to match articles based on the raw header data.
Prefix for file name for storing incoming mail. The default is
@file{Incoming}, in which case files will end up with names like
@file{Incoming30630D_} or @file{Incoming298602ZD}. This is really only
-relevant if @code{mail-source-delete-incoming} is @code{nil}.
+relevant if @code{mail-source-delete-incoming} is @code{nil} or a
+number.
@item mail-source-default-file-modes
@vindex mail-source-default-file-modes
@table @code
-@item group
+@item group
If the split is a string, that will be taken as a group name. Normal
regexp match expansion will be done. See below for examples.
-@item (@var{field} @var{value} [- @var{restrict} [@dots{}] ] @var{split})
-If the split is a list, the first element of which is a string, then
-store the message as specified by @var{split}, if header @var{field}
-(a regexp) contains @var{value} (also a regexp). If @var{restrict}
-(yet another regexp) matches some string after @var{field} and before
-the end of the matched @var{value}, the @var{split} is ignored. If
-none of the @var{restrict} clauses match, @var{split} is processed.
+@c Don't fold this line.
+@item (@var{field} @var{value} [- @var{restrict} [@dots{}] ] @var{split} [@var{invert-partial}])
+The split can be a list containing at least three elements. If the
+first element @var{field} (a regexp matching a header) contains
+@var{value} (also a regexp) then store the message as specified by
+@var{split}.
+
+If @var{restrict} (yet another regexp) matches some string after
+@var{field} and before the end of the matched @var{value}, the
+@var{split} is ignored. If none of the @var{restrict} clauses match,
+@var{split} is processed.
+
+The last element @var{invert-partial} is optional. If it is
+non-@code{nil}, the match-partial-words behavior controlled by the
+variable @code{nnmail-split-fancy-match-partial-words} (see below) is
+be inverted. (New in Gnus 5.10.7)
@item (| @var{split} @dots{})
If the split is a list, and the first element is @code{|} (vertical
@end table
In these splits, @var{field} must match a complete field name.
-@var{value} must match a complete word according to the fundamental mode
-syntax table. You can use @code{.*} in the regexps to match partial
-field names or words. In other words, all @var{value}'s are wrapped in
-@samp{\<} and @samp{\>} pairs.
+
+Normally, @var{value} in these splits must match a complete @emph{word}
+according to the fundamental mode syntax table. In other words, all
+@var{value}'s will be implicitly surrounded by @code{\<...\>} markers,
+which are word delimiters. Therefore, if you use the following split,
+for example,
+
+@example
+(any "joe" "joemail")
+@end example
+
+@noindent
+messages sent from @samp{joedavis@@foo.org} will normally not be filed
+in @samp{joemail}. If you want to alter this behavior, you can use any
+of the following three ways:
+
+@enumerate
+@item
+@vindex nnmail-split-fancy-match-partial-words
+You can set the @code{nnmail-split-fancy-match-partial-words} variable
+to non-@code{nil} in order to ignore word boundaries and instead the
+match becomes more like a grep. This variable controls whether partial
+words are matched during fancy splitting. The default value is
+@code{nil}.
+
+Note that it influences all @var{value}'s in your split rules.
+
+@item
+@var{value} beginning with @code{.*} ignores word boundaries in front of
+a word. Similarly, if @var{value} ends with @code{.*}, word boundaries
+in the rear of a word will be ignored. For example, the @var{value}
+@code{"@@example\\.com"} does not match @samp{foo@@example.com} but
+@code{".*@@example\\.com"} does.
+
+@item
+You can set the @var{invert-partial} flag in your split rules of the
+@samp{(@var{field} @var{value} @dots{})} types, aforementioned in this
+section. If the flag is set, word boundaries on both sides of a word
+are ignored even if @code{nnmail-split-fancy-match-partial-words} is
+@code{nil}. Contrarily, if the flag is set, word boundaries are not
+ignored even if @code{nnmail-split-fancy-match-partial-words} is
+non-@code{nil}. (New in Gnus 5.10.7)
+@end enumerate
@vindex nnmail-split-abbrev-alist
@var{field} and @var{value} can also be Lisp symbols, in that case
(i.e. mailing-list@@domain vs Mailing-List@@Domain). The default value
is @code{t}.
-@vindex nnmail-split-fancy-match-partial-words
-@code{nnmail-split-fancy-match-partial-words} controls whether partial
-words are matched during fancy splitting.
-
-Normally, regular expressions given in @code{nnmail-split-fancy} are
-implicitly surrounded by @code{\<...\>} markers, which are word
-delimiters. If this variable is true, they are not implicitly
-surrounded by anything.
-
-@example
-(any "joe" "joemail")
-@end example
-
-In this example, messages sent from @samp{joedavis@@foo.org} will
-normally not be filed in @samp{joemail}. With
-@code{nnmail-split-fancy-match-partial-words} set to t, however, the
-match will happen. In effect, the requirement of a word boundary is
-removed and instead the match becomes more like a grep.
-
@findex nnmail-split-fancy-with-parent
@code{nnmail-split-fancy-with-parent} is a function which allows you to
split followups into the same groups their parents are in. Sometimes
servers have the property that you may backup them using @code{tar} or
similar, and later be able to restore them into Gnus (by adding the
proper @code{nnml} server) and have all your marks be preserved. Marks
-for a group is usually stored in the @code{.marks} file (but see
+for a group are usually stored in the @code{.marks} file (but see
@code{nnml-marks-file-name}) within each @code{nnml} group's directory.
Individual @code{nnml} groups are also possible to backup, use @kbd{G m}
to restore the group (after restoring the backup into the nnml
@item nnml-use-compressed-files
@vindex nnml-use-compressed-files
If non-@code{nil}, @code{nnml} will allow using compressed message
-files.
+files. This requires @code{auto-compression-mode} to be enabled
+(@pxref{Compressed Files, ,Compressed Files, emacs, The Emacs Manual}).
+If the value of @code{nnml-use-compressed-files} is a string, it is used
+as the file extension specifying the comression program. You can set it
+to @samp{.bz2} if your Emacs supports it. A value of @code{t} is
+equivalent to @samp{.gz}.
+
+@item nnml-compressed-files-size-threshold
+@vindex nnml-compressed-files-size-threshold
+Default size threshold for compressed message files. Message files with
+bodies larger than that many characters will be automatically compressed
+if @code{nnml-use-compressed-files} is non-@code{nil}.
@end table
before it will be expired, or the symbol @code{never} to specify that
articles should never be expired. If this parameter is not set,
@code{nnmaildir} falls back to the usual
-@code{nnmail-expiry-wait}(@code{-function}) variables (overrideable by
-the @code{expiry-wait}(@code{-function}) group parameters. If you
+@code{nnmail-expiry-wait}(@code{-function}) variables (the
+@code{expiry-wait} group parameter overrides @code{nnmail-expiry-wait}
+and makes @code{nnmail-expiry-wait-function} ineffective). If you
wanted a value of 3 days, you could use something like @code{[(* 3 24
60 60)]}; @code{nnmaildir} will evaluate the form and use the result.
An article's age is measured starting from the article file's
you use the vector form, the first element is evaluated once for each
article. So that form can refer to
@code{nnmaildir-article-file-name}, etc., to decide where to put the
-article. @emph{If this parameter is not set, @code{nnmaildir} does
-not fall back to the @code{expiry-target} group parameter or the
+article. @emph{Even if this parameter is not set, @code{nnmaildir}
+does not fall back to the @code{expiry-target} group parameter or the
@code{nnmail-expiry-target} variable.}
@item read-only
servers have the property that you may backup them using @code{tar} or
similar, and later be able to restore them into Gnus (by adding the
proper @code{nnfolder} server) and have all your marks be preserved.
-Marks for a group is usually stored in a file named as the mbox file
+Marks for a group are usually stored in a file named as the mbox file
with @code{.mrk} concatenated to it (but see
@code{nnfolder-marks-file-suffix}) within the @code{nnfolder}
directory. Individual @code{nnfolder} groups are also possible to
* Ultimate:: The Ultimate Bulletin Board systems.
* Web Archive:: Reading mailing list archived on web.
* RSS:: Reading RDF site summary.
-* Customizing w3:: Doing stuff to Emacs/w3 from Gnus.
+* Customizing W3:: Doing stuff to Emacs/W3 from Gnus.
@end menu
-All the web sources require Emacs/w3 and the url library to work.
+All the web sources require Emacs/W3 and the url library or those
+alternatives to work.
The main caveat with all these web sources is that they probably won't
work for a very long time. Gleaning information from the @acronym{HTML} data
community. Since @code{nnweb} washes the ads off all the articles, one
might think that the providers might be somewhat miffed. We'll see.
-You must have the @code{url} and @code{w3} package installed to be able
-to use @code{nnweb}.
+You must have the @code{url} and @code{W3} package or those alternatives
+(try @code{customize-group} on the @samp{mm-url} variable group)
+installed to be able to use @code{nnweb}.
Virtual server variables:
text by default. It is also used by default for non-@acronym{ASCII}
group names.
-@kindex G R (Summary)
-Use @kbd{G R} from the summary buffer to subscribe to a feed---you will
-be prompted for the location, the title and the description of the feed.
+@kindex G R (Group)
+Use @kbd{G R} from the group buffer to subscribe to a feed---you will be
+prompted for the location, the title and the description of the feed.
The title, which allows any characters, will be used for the group name
and the name of the group data file. The description can be omitted.
XEmacs and want to use non-@acronym{ASCII} group names, you should set
the value for the @code{nnmail-pathname-coding-system} variable properly.
+The @code{nnrss} back end generates @samp{multipart/alternative}
+@acronym{MIME} articles in which each contains a @samp{text/plain} part
+and a @samp{text/html} part.
+
@cindex OPML
You can also use the following commands to import and export your
subscriptions from a file in @acronym{OPML} format (Outline Processor
the feeds from local files in @code{nnrss-directory}. You can use
the command @code{nnrss-generate-download-script} to generate a
download script using @command{wget}.
+
+@item nnrss-wash-html-in-text-plain-parts
+Non-@code{nil} means that @code{nnrss} renders text in @samp{text/plain}
+parts as @acronym{HTML}. The function specified by the
+@code{mm-text-html-renderer} variable (@pxref{Display Customization,
+,Display Customization, emacs-mime, The Emacs MIME Manual}) will be used
+to render text. If it is @code{nil}, which is the default, text will
+simply be folded. Leave it @code{nil} if you prefer to see
+@samp{text/html} parts.
@end table
The following code may be helpful, if you want to show the description in
The following code may be useful to open an nnrss url directly from the
summary buffer.
+
@lisp
(require 'browse-url)
(add-to-list 'nnmail-extra-headers nnrss-url-field)
@end lisp
-@node Customizing w3
-@subsection Customizing w3
-@cindex w3
+Even if you have added @code{"text/html"} to the
+@code{mm-discouraged-alternatives} variable (@pxref{Display
+Customization, ,Display Customization, emacs-mime, The Emacs MIME
+Manual}) since you don't want to see @acronym{HTML} parts, it might be
+more useful especially in @code{nnrss} groups to display
+@samp{text/html} parts. Here's an example of setting
+@code{mm-discouraged-alternatives} as a group parameter (@pxref{Group
+Parameters}) in order to display @samp{text/html} parts only in
+@code{nnrss} groups:
+
+@lisp
+;; @r{Set the default value of @code{mm-discouraged-alternatives}.}
+(eval-after-load "gnus-sum"
+ '(add-to-list
+ 'gnus-newsgroup-variables
+ '(mm-discouraged-alternatives
+ . '("text/html" "image/.*"))))
+
+;; @r{Display @samp{text/html} parts in @code{nnrss} groups.}
+(add-to-list
+ 'gnus-parameters
+ '("\\`nnrss:" (mm-discouraged-alternatives nil)))
+@end lisp
+
+
+@node Customizing W3
+@subsection Customizing W3
+@cindex W3
@cindex html
@cindex url
@cindex Netscape
-Gnus uses the url library to fetch web pages and Emacs/w3 to display web
-pages. Emacs/w3 is documented in its own manual, but there are some
-things that may be more relevant for Gnus users.
+Gnus uses the url library to fetch web pages and Emacs/W3 (or those
+alternatives) to display web pages. Emacs/W3 is documented in its own
+manual, but there are some things that may be more relevant for Gnus
+users.
-For instance, a common question is how to make Emacs/w3 follow links
+For instance, a common question is how to make Emacs/W3 follow links
using the @code{browse-url} functions (which will call some external web
browser like Netscape). Here's one way:
(w3-fetch-orig url target)))))
@end lisp
-Put that in your @file{.emacs} file, and hitting links in w3-rendered
+Put that in your @file{.emacs} file, and hitting links in W3-rendered
@acronym{HTML} in the Gnus article buffers will use @code{browse-url} to
follow the link.
A file containing credentials used to log in on servers. The format is
(almost) the same as the @code{ftp} @file{~/.netrc} file. See the
variable @code{nntp-authinfo-file} for exact syntax; also see
-@ref{NNTP}. An example of an .authinfo line for an IMAP server, is:
+@ref{NNTP}. An example of an .authinfo line for an IMAP server, is:
@example
machine students.uio.no login larsi password geheimnis port imap
Set to non-@code{nil} to download entire articles during splitting.
This is generally not required, and will slow things down
considerably. You may need it if you want to use an advanced
-splitting function that analyses the body to split the article.
+splitting function that analyzes the body to split the article.
@end table
@cindex namespaces
The @acronym{IMAP} protocol has a concept called namespaces, described
-by the following text in the RFC:
+by the following text in the RFC2060:
@display
5.1.2. Mailbox Namespace Naming Convention
@acronym{IMAP} is a complex protocol, more so than @acronym{NNTP} or
@acronym{POP3}. Implementation bugs are not unlikely, and we do our
-best to fix them right away. If you encounter odd behaviour, chances
+best to fix them right away. If you encounter odd behavior, chances
are that either the server or Gnus is buggy.
If you are familiar with network protocols in general, you will
@vindex imap-log
Because the protocol dump, when enabled, generates lots of data, it is
disabled by default. You can enable it by setting @code{imap-log} as
-follows:
+follows:
@lisp
(setq imap-log t)
@table @code
@cindex Babyl
@cindex Rmail mbox
-
@item babyl
The Babyl (Rmail) mail box.
+
@cindex mbox
@cindex Unix mbox
-
@item mbox
The standard Unix mbox file.
@item news
Several news articles appended into a file.
-@item rnews
@cindex rnews batch files
+@item rnews
The rnews batch transport format.
-@cindex forwarded messages
-
-@item forward
-Forwarded articles.
@item nsmail
Netscape mail boxes.
@item lanl-gov-announce
Announcement messages from LANL Gov Announce.
+@cindex forwarded messages
@item rfc822-forward
A message forwarded according to RFC822.
@item article-begin
This setting has to be present in all document type definitions. It
-says what the beginning of each article looks like.
+says what the beginning of each article looks like. To do more
+complicated things that cannot be dealt with a simple regexp, you can
+use @code{article-begin-function} instead of this.
-@item head-begin-function
-If present, this should be a function that moves point to the head of
-the article.
+@item article-begin-function
+If present, this should be a function that moves point to the beginning
+of each article. This setting overrides @code{article-begin}.
-@item nndoc-head-begin
+@item head-begin
If present, this should be a regexp that matches the head of the
-article.
+article. To do more complicated things that cannot be dealt with a
+simple regexp, you can use @code{head-begin-function} instead of this.
-@item nndoc-head-end
+@item head-begin-function
+If present, this should be a function that moves point to the head of
+the article. This setting overrides @code{head-begin}.
+
+@item head-end
This should match the end of the head of the article. It defaults to
@samp{^$}---the empty line.
+@item body-begin
+This should match the beginning of the body of the article. It defaults
+to @samp{^\n}. To do more complicated things that cannot be dealt with
+a simple regexp, you can use @code{body-begin-function} instead of this.
+
@item body-begin-function
If present, this function should move point to the beginning of the body
-of the article.
+of the article. This setting overrides @code{body-begin}.
-@item body-begin
-This should match the beginning of the body of the article. It defaults
-to @samp{^\n}.
+@item body-end
+If present, this should match the end of the body of the article. To do
+more complicated things that cannot be dealt with a simple regexp, you
+can use @code{body-end-function} instead of this.
@item body-end-function
If present, this function should move point to the end of the body of
-the article.
+the article. This setting overrides @code{body-end}.
-@item body-end
-If present, this should match the end of the body of the article.
+@item file-begin
+If present, this should match the beginning of the file. All text
+before this regexp will be totally ignored.
@item file-end
If present, this should match the end of the file. All text after this
expected to generate a nice head for the article in question. It is
called when requesting the headers of all articles.
+@item generate-article-function
+If present, this function is called to generate an entire article that
+Gnus can understand. It is called with the article number as a
+parameter when requesting all articles.
+
+@item dissection-function
+If present, this function is called to dissect a document by itself,
+overriding @code{first-article}, @code{article-begin},
+@code{article-begin-function}, @code{head-begin},
+@code{head-begin-function}, @code{head-end}, @code{body-begin},
+@code{body-begin-function}, @code{body-end}, @code{body-end-function},
+@code{file-begin}, and @code{file-end}.
+
@end table
Let's look at the most complicated example I can come up with---standard
zombie groups can't be component groups for @code{nnvirtual} groups.
@vindex nnvirtual-always-rescan
-If the @code{nnvirtual-always-rescan} is non-@code{nil},
-@code{nnvirtual} will always scan groups for unread articles when
-entering a virtual group. If this variable is @code{nil} (which is the
-default) and you read articles in a component group after the virtual
-group has been activated, the read articles from the component group
-will show up when you enter the virtual group. You'll also see this
-effect if you have two virtual groups that have a component group in
-common. If that's the case, you should set this variable to @code{t}.
-Or you can just tap @code{M-g} on the virtual group every time before
-you enter it---it'll have much the same effect.
+If the @code{nnvirtual-always-rescan} variable is non-@code{nil} (which
+is the default), @code{nnvirtual} will always scan groups for unread
+articles when entering a virtual group. If this variable is @code{nil}
+and you read articles in a component group after the virtual group has
+been activated, the read articles from the component group will show up
+when you enter the virtual group. You'll also see this effect if you
+have two virtual groups that have a component group in common. If
+that's the case, you should set this variable to @code{t}. Or you can
+just tap @code{M-g} on the virtual group every time before you enter
+it---it'll have much the same effect.
@code{nnvirtual} can have both mail and news groups as component groups.
When responding to articles in @code{nnvirtual} groups, @code{nnvirtual}
their @acronym{NOV} lines removed from the @acronym{NOV} file.
+@node Email Based Diary
+@section Email Based Diary
+@cindex diary
+@cindex email based diary
+@cindex calendar
+
+This section describes a special mail back end called @code{nndiary},
+and its companion library @code{gnus-diary}. It is ``special'' in the
+sense that it is not meant to be one of the standard alternatives for
+reading mail with Gnus. See @ref{Choosing a Mail Back End} for that.
+Instead, it is used to treat @emph{some} of your mails in a special way,
+namely, as event reminders.
+
+Here is a typical scenario:
+
+@itemize @bullet
+@item
+You've got a date with Andy Mc Dowell or Bruce Willis (select according
+to your sexual preference) in one month. You don't want to forget it.
+@item
+So you send a ``reminder'' message (actually, a diary one) to yourself.
+@item
+You forget all about it and keep on getting and reading new mail, as usual.
+@item
+From time to time, as you type `g' in the group buffer and as the date
+is getting closer, the message will pop up again to remind you of your
+appointment, just as if it were new and unread.
+@item
+Read your ``new'' messages, this one included, and start dreaming again
+of the night you're gonna have.
+@item
+Once the date is over (you actually fell asleep just after dinner), the
+message will be automatically deleted if it is marked as expirable.
+@end itemize
+
+The Gnus Diary back end has the ability to handle regular appointments
+(that wouldn't ever be deleted) as well as punctual ones, operates as a
+real mail back end and is configurable in many ways. All of this is
+explained in the sections below.
+
+@menu
+* The NNDiary Back End:: Basic setup and usage.
+* The Gnus Diary Library:: Utility toolkit on top of nndiary.
+* Sending or Not Sending:: A final note on sending diary messages.
+@end menu
+
+
+@node The NNDiary Back End
+@subsection The NNDiary Back End
+@cindex nndiary
+@cindex the nndiary back end
+
+@code{nndiary} is a back end very similar to @code{nnml} (@pxref{Mail
+Spool}). Actually, it could appear as a mix of @code{nnml} and
+@code{nndraft}. If you know @code{nnml}, you're already familiar with
+the message storing scheme of @code{nndiary}: one file per message, one
+directory per group.
+
+ Before anything, there is one requirement to be able to run
+@code{nndiary} properly: you @emph{must} use the group timestamp feature
+of Gnus. This adds a timestamp to each group's parameters. @ref{Group
+Timestamp} to see how it's done.
+
+@menu
+* Diary Messages:: What makes a message valid for nndiary.
+* Running NNDiary:: NNDiary has two modes of operation.
+* Customizing NNDiary:: Bells and whistles.
+@end menu
+
+@node Diary Messages
+@subsubsection Diary Messages
+@cindex nndiary messages
+@cindex nndiary mails
+
+@code{nndiary} messages are just normal ones, except for the mandatory
+presence of 7 special headers. These headers are of the form
+@code{X-Diary-<something>}, @code{<something>} being one of
+@code{Minute}, @code{Hour}, @code{Dom}, @code{Month}, @code{Year},
+@code{Time-Zone} and @code{Dow}. @code{Dom} means ``Day of Month'', and
+@code{dow} means ``Day of Week''. These headers actually behave like
+crontab specifications and define the event date(s):
+
+@itemize @bullet
+@item
+For all headers except the @code{Time-Zone} one, a header value is
+either a star (meaning all possible values), or a list of fields
+(separated by a comma).
+@item
+A field is either an integer, or a range.
+@item
+A range is two integers separated by a dash.
+@item
+Possible integer values are 0--59 for @code{Minute}, 0--23 for
+@code{Hour}, 1--31 for @code{Dom}, 1--12 for @code{Month}, above 1971
+for @code{Year} and 0--6 for @code{Dow} (0 meaning Sunday).
+@item
+As a special case, a star in either @code{Dom} or @code{Dow} doesn't
+mean ``all possible values'', but ``use only the other field''. Note
+that if both are star'ed, the use of either one gives the same result.
+@item
+The @code{Time-Zone} header is special in that it can only have one
+value (@code{GMT}, for instance). A star doesn't mean ``all possible
+values'' (because it makes no sense), but ``the current local time
+zone''. Most of the time, you'll be using a star here. However, for a
+list of available time zone values, see the variable
+@code{nndiary-headers}.
+@end itemize
+
+As a concrete example, here are the diary headers to add to your message
+for specifying ``Each Monday and each 1st of month, at 12:00, 20:00,
+21:00, 22:00, 23:00 and 24:00, from 1999 to 2010'' (I'll let you find
+what to do then):
+
+@example
+X-Diary-Minute: 0
+X-Diary-Hour: 12, 20-24
+X-Diary-Dom: 1
+X-Diary-Month: *
+X-Diary-Year: 1999-2010
+X-Diary-Dow: 1
+X-Diary-Time-Zone: *
+@end example
+
+@node Running NNDiary
+@subsubsection Running NNDiary
+@cindex running nndiary
+@cindex nndiary operation modes
+
+@code{nndiary} has two modes of operation: ``traditional'' (the default)
+and ``autonomous''. In traditional mode, @code{nndiary} does not get new
+mail by itself. You have to move (@kbd{B m}) or copy (@kbd{B c}) mails
+from your primary mail back end to nndiary groups in order to handle them
+as diary messages. In autonomous mode, @code{nndiary} retrieves its own
+mail and handles it independently from your primary mail back end.
+
+One should note that Gnus is not inherently designed to allow several
+``master'' mail back ends at the same time. However, this does make
+sense with @code{nndiary}: you really want to send and receive diary
+messages to your diary groups directly. So, @code{nndiary} supports
+being sort of a ``second primary mail back end'' (to my knowledge, it is
+the only back end offering this feature). However, there is a limitation
+(which I hope to fix some day): respooling doesn't work in autonomous
+mode.
+
+In order to use @code{nndiary} in autonomous mode, you have several
+things to do:
+
+@itemize @bullet
+@item
+Allow @code{nndiary} to retrieve new mail by itself. Put the following
+line in your @file{gnusrc} file:
+
+@lisp
+(setq nndiary-get-new-mail t)
+@end lisp
+@item
+You must arrange for diary messages (those containing @code{X-Diary-*}
+headers) to be split in a private folder @emph{before} Gnus treat them.
+Again, this is needed because Gnus cannot (yet ?) properly handle
+multiple primary mail back ends. Getting those messages from a separate
+source will compensate this misfeature to some extent.
+
+As an example, here's my procmailrc entry to store diary files in
+@file{~/.nndiary} (the default @code{nndiary} mail source file):
+
+@example
+:0 HD :
+* ^X-Diary
+.nndiary
+@end example
+@end itemize
+
+Once this is done, you might want to customize the following two options
+that affect the diary mail retrieval and splitting processes:
+
+@defvar nndiary-mail-sources
+This is the diary-specific replacement for the standard
+@code{mail-sources} variable. It obeys the same syntax, and defaults to
+@code{(file :path "~/.nndiary")}.
+@end defvar
+
+@defvar nndiary-split-methods
+This is the diary-specific replacement for the standard
+@code{nnmail-split-methods} variable. It obeys the same syntax.
+@end defvar
+
+ Finally, you may add a permanent @code{nndiary} virtual server
+(something like @code{(nndiary "diary")} should do) to your
+@code{gnus-secondary-select-methods}.
+
+ Hopefully, almost everything (see the TODO section in
+@file{nndiary.el}) will work as expected when you restart Gnus: in
+autonomous mode, typing @kbd{g} and @kbd{M-g} in the group buffer, will
+also get your new diary mails and split them according to your
+diary-specific rules, @kbd{F} will find your new diary groups etc.
+
+@node Customizing NNDiary
+@subsubsection Customizing NNDiary
+@cindex customizing nndiary
+@cindex nndiary customization
+
+Now that @code{nndiary} is up and running, it's time to customize it.
+The custom group is called @code{nndiary} (no, really ?!). You should
+browse it to figure out which options you'd like to tweak. The following
+two variables are probably the only ones you will want to change:
+
+@defvar nndiary-reminders
+This is the list of times when you want to be reminded of your
+appointements (e.g. 3 weeks before, then 2 days before, then 1 hour
+before and that's it). Remember that ``being reminded'' means that the
+diary message will pop up as brand new and unread again when you get new
+mail.
+@end defvar
+
+@defvar nndiary-week-starts-on-monday
+Rather self-explanatory. Otherwise, Sunday is assumed (this is the
+default).
+@end defvar
+
+
+@node The Gnus Diary Library
+@subsection The Gnus Diary Library
+@cindex gnus-diary
+@cindex the gnus diary library
+
+Using @code{nndiary} manually (I mean, writing the headers by hand and
+so on) would be rather boring. Fortunately, there is a library called
+@code{gnus-diary} written on top of @code{nndiary}, that does many
+useful things for you.
+
+ In order to use it, add the following line to your @file{gnusrc} file:
+
+@lisp
+(require 'gnus-diary)
+@end lisp
+
+ Also, you shouldn't use any @code{gnus-user-format-function-[d|D]}
+(@pxref{Summary Buffer Lines}). @code{gnus-diary} provides both of these
+(sorry if you used them before).
+
+
+@menu
+* Diary Summary Line Format:: A nicer summary buffer line format.
+* Diary Articles Sorting:: A nicer way to sort messages.
+* Diary Headers Generation:: Not doing it manually.
+* Diary Group Parameters:: Not handling them manually.
+@end menu
+
+@node Diary Summary Line Format
+@subsubsection Diary Summary Line Format
+@cindex diary summary buffer line
+@cindex diary summary line format
+
+Displaying diary messages in standard summary line format (usually
+something like @samp{From Joe: Subject}) is pretty useless. Most of
+the time, you're the one who wrote the message, and you mostly want to
+see the event's date.
+
+ @code{gnus-diary} provides two supplemental user formats to be used in
+summary line formats. @code{D} corresponds to a formatted time string
+for the next occurrence of the event (e.g. ``Sat, Sep 22 01, 12:00''),
+while @code{d} corresponds to an approximative remaining time until the
+next occurrence of the event (e.g. ``in 6 months, 1 week'').
+
+ For example, here's how Joe's birthday is displayed in my
+@code{nndiary+diary:birthdays} summary buffer (note that the message is
+expirable, but will never be deleted, as it specifies a periodic event):
+
+@example
+ E Sat, Sep 22 01, 12:00: Joe's birthday (in 6 months, 1 week)
+@end example
+
+In order to get something like the above, you would normally add the
+following line to your diary groups'parameters:
+
+@lisp
+(gnus-summary-line-format "%U%R%z %uD: %(%s%) (%ud)\n")
+@end lisp
+
+However, @code{gnus-diary} does it automatically (@pxref{Diary Group
+Parameters}). You can however customize the provided summary line format
+with the following user options:
+
+@defvar gnus-diary-summary-line-format
+Defines the summary line format used for diary groups (@pxref{Summary
+Buffer Lines}). @code{gnus-diary} uses it to automatically update the
+diary groups'parameters.
+@end defvar
+
+@defvar gnus-diary-time-format
+Defines the format to display dates in diary summary buffers. This is
+used by the @code{D} user format. See the docstring for details.
+@end defvar
+
+@defvar gnus-diary-delay-format-function
+Defines the format function to use for displaying delays (remaining
+times) in diary summary buffers. This is used by the @code{d} user
+format. There are currently built-in functions for English and French;
+you can also define your own. See the docstring for details.
+@end defvar
+
+@node Diary Articles Sorting
+@subsubsection Diary Articles Sorting
+@cindex diary articles sorting
+@cindex diary summary lines sorting
+@findex gnus-summary-sort-by-schedule
+@findex gnus-thread-sort-by-schedule
+@findex gnus-article-sort-by-schedule
+
+@code{gnus-diary} provides new sorting functions (@pxref{Sorting the
+Summary Buffer} ) called @code{gnus-summary-sort-by-schedule},
+@code{gnus-thread-sort-by-schedule} and
+@code{gnus-article-sort-by-schedule}. These functions let you organize
+your diary summary buffers from the closest event to the farthest one.
+
+@code{gnus-diary} automatically installs
+@code{gnus-summary-sort-by-schedule} as a menu item in the summary
+buffer's ``sort'' menu, and the two others as the primary (hence
+default) sorting functions in the group parameters (@pxref{Diary Group
+Parameters}).
+
+@node Diary Headers Generation
+@subsubsection Diary Headers Generation
+@cindex diary headers generation
+@findex gnus-diary-check-message
+
+@code{gnus-diary} provides a function called
+@code{gnus-diary-check-message} to help you handle the @code{X-Diary-*}
+headers. This function ensures that the current message contains all the
+required diary headers, and prompts you for values or corrections if
+needed.
+
+ This function is hooked into the @code{nndiary} back end, so that
+moving or copying an article to a diary group will trigger it
+automatically. It is also bound to @kbd{C-c D c} in @code{message-mode}
+and @code{article-edit-mode} in order to ease the process of converting
+a usual mail to a diary one.
+
+ This function takes a prefix argument which will force prompting of
+all diary headers, regardless of their presence or validity. That way,
+you can very easily reschedule an already valid diary message, for
+instance.
+
+@node Diary Group Parameters
+@subsubsection Diary Group Parameters
+@cindex diary group parameters
+
+When you create a new diary group, or visit one, @code{gnus-diary}
+automatically checks your group parameters and if needed, sets the
+summary line format to the diary-specific value, installs the
+diary-specific sorting functions, and also adds the different
+@code{X-Diary-*} headers to the group's posting-style. It is then easier
+to send a diary message, because if you use @kbd{C-u a} or @kbd{C-u m}
+on a diary group to prepare a message, these headers will be inserted
+automatically (although not filled with proper values yet).
+
+@node Sending or Not Sending
+@subsection Sending or Not Sending
+
+Well, assuming you've read of of the above, here are two final notes on
+mail sending with @code{nndiary}:
+
+@itemize @bullet
+@item
+@code{nndiary} is a @emph{real} mail back end. You really send real diary
+messsages for real. This means for instance that you can give
+appointements to anybody (provided they use Gnus and @code{nndiary}) by
+sending the diary message to them as well.
+@item
+However, since @code{nndiary} also has a @code{request-post} method, you
+can also use @kbd{C-u a} instead of @kbd{C-u m} on a diary group and the
+message won't actually be sent; just stored locally in the group. This
+comes in very handy for private appointments.
+@end itemize
+
@node Gnus Unplugged
@section Gnus Unplugged
@cindex offline
* Agent as Cache:: The Agent is a big cache too.
* Agent Expiry:: How to make old articles go away.
* Agent Regeneration:: How to recover from lost connections and other accidents.
+* Agent and flags:: How the Agent maintains flags.
* Agent and IMAP:: How to use the Agent with @acronym{IMAP}.
* Outgoing Messages:: What happens when you post/mail something?
* Agent Variables:: Customizing is fun.
@cindex Agent Parameters
@table @code
-@item agent-cat-name
-The name of the category.
-
@item agent-groups
The list of groups that are in this category.
A predicate which (generally) gives a rough outline of which articles
are eligible for downloading; and
-@item agent-score-file
+@item agent-score
a score rule which (generally) gives you a finer granularity when
deciding what articles to download. (Note that this @dfn{download
score} is not necessarily related to normal scores.)
@item agent-high-score
an integer that overrides the value of @code{gnus-agent-high-score}.
-@item agent-length-when-short
+@item agent-short-article
an integer that overrides the value of
@code{gnus-agent-short-article}.
-@item agent-length-when-long
+@item agent-long-article
an integer that overrides the value of @code{gnus-agent-long-article}.
@item agent-enable-undownloaded-faces
@item J s
@kindex J s (Agent Summary)
-@findex gnus-agent-fetch-series
+@findex gnus-agent-summary-fetch-series
Download all processable articles in this group.
-(@code{gnus-agent-fetch-series}).
+(@code{gnus-agent-summary-fetch-series}).
@item J u
@kindex J u (Agent Summary)
If you would like to use the undownloaded faces, you must enable the
undownloaded faces by setting the @code{agent-enable-undownloaded-faces}
-group parameter to t. This parameter, like all other agent
-parameters, may be set on an Agent Category (@pxref{Agent
-Categories}), a Group Topic (@pxref{Topic Parameters}), or an
-individual group (@pxref{Group Parameters}).
+group parameter to @code{t}. This parameter, like all other agent
+parameters, may be set on an Agent Category (@pxref{Agent Categories}),
+a Group Topic (@pxref{Topic Parameters}), or an individual group
+(@pxref{Group Parameters}).
The one problem common to all users using the agent is how quickly it
can consume disk space. If you using the agent on many groups, it is
are stored locally. An optional argument will mark articles in the
agent as unread.
-@node Agent and IMAP
-@subsection Agent and IMAP
+@node Agent and flags
+@subsection Agent and flags
-The Agent works with any Gnus back end, including nnimap. However,
-since there are some conceptual differences between @acronym{NNTP} and
-@acronym{IMAP}, this section (should) provide you with some information to
-make Gnus Agent work smoother as a @acronym{IMAP} Disconnected Mode client.
+The Agent works with any Gnus back end including those, such as
+nnimap, that store flags (read, ticked, etc) on the server. Sadly,
+the Agent does not actually know which backends keep their flags in
+the backend server rather than in @file{.newsrc}. This means that the
+Agent, while unplugged or disconnected, will always record all changes
+to the flags in its own files.
-The first thing to keep in mind is that all flags (read, ticked, etc)
-are kept on the @acronym{IMAP} server, rather than in @file{.newsrc} as is the
-case for nntp. Thus Gnus need to remember flag changes when
-disconnected, and synchronize these flags when you plug back in.
-
-Gnus keeps track of flag changes when reading nnimap groups under the
-Agent. When you plug back in, Gnus will check if you have any changed
-any flags and ask if you wish to synchronize these with the server.
-The behavior is customizable by @code{gnus-agent-synchronize-flags}.
+When you plug back in, Gnus will then check to see if you have any
+changed any flags and ask if you wish to synchronize these with the
+server. This behavior is customizable by @code{gnus-agent-synchronize-flags}.
@vindex gnus-agent-synchronize-flags
If @code{gnus-agent-synchronize-flags} is @code{nil}, the Agent will
@code{gnus-agent-synchronize-flags} command that is bound to @kbd{J Y}
in the group buffer.
+Technical note: the synchronization algorithm does not work by ``pushing''
+all local flags to the server, but rather by incrementally updated the
+server view of flags by changing only those flags that were changed by
+the user. Thus, if you set one flag on an article, quit the group then
+re-select the group and remove the flag; the flag will be set and
+removed from the server when you ``synchronize''. The queued flag
+operations can be found in the per-server @code{flags} file in the Agent
+directory. It's emptied when you synchronize flags.
+
+@node Agent and IMAP
+@subsection Agent and IMAP
+
+The Agent works with any Gnus back end, including nnimap. However,
+since there are some conceptual differences between @acronym{NNTP} and
+@acronym{IMAP}, this section (should) provide you with some information to
+make Gnus Agent work smoother as a @acronym{IMAP} Disconnected Mode client.
+
Some things are currently not implemented in the Agent that you'd might
expect from a disconnected @acronym{IMAP} client, including:
@end itemize
-Technical note: the synchronization algorithm does not work by ``pushing''
-all local flags to the server, but rather incrementally update the
-server view of flags by changing only those flags that were changed by
-the user. Thus, if you set one flag on an article, quit the group and
-re-select the group and remove the flag; the flag will be set and
-removed from the server when you ``synchronize''. The queued flag
-operations can be found in the per-server @code{flags} file in the Agent
-directory. It's emptied when you synchronize flags.
-
-
@node Outgoing Messages
@subsection Outgoing Messages
If @code{gnus-agent-mark-unread-after-downloaded} is non-@code{nil},
mark articles as unread after downloading. This is usually a safe
thing to do as the newly downloaded article has obviously not been
-read. The default is t.
+read. The default is @code{t}.
+
+@item gnus-agent-synchronize-flags
+@vindex gnus-agent-synchronize-flags
+If @code{gnus-agent-synchronize-flags} is @code{nil}, the Agent will
+never automatically synchronize flags. If it is @code{ask}, which is
+the default, the Agent will check if you made any changes and if so
+ask if you wish to synchronize these when you re-connect. If it has
+any other value, all flags will be synchronized automatically.
@item gnus-agent-consider-all-articles
@vindex gnus-agent-consider-all-articles
@table @dfn
@item If I read an article while plugged, do they get entered into the Agent?
-@strong{No}. If you want this behaviour, add
+@strong{No}. If you want this behavior, add
@code{gnus-agent-fetch-selected-article} to
@code{gnus-select-article-hook}.
@item
A function. If the function returns non-@code{nil}, the result will
-be used as the home score file.
+be used as the home score file. The function will be called with the
+name of the group as the parameter.
@item
A string. Use the string as the home score file.
1000)
@end example
-The possibilities are endless.
+Suppose you're reading a high volume group and you're only interested
+in replies. The plan is to score down all articles that don't have
+subject that begin with "Re:", "Fw:" or "Fwd:" and then score up all
+parents of articles that have subjects that begin with reply marks.
+@example
+((! ("subject" "re:\\|fwd?:" r))
+ -200)
+((1- ("subject" "re:\\|fwd?:" r))
+ 200)
+@end example
+
+The possibilities are endless.
@node Advanced Scoring Tips
@subsection Advanced Scoring Tips
Gnus usually moves point to a pre-defined place on each line in most
buffers. By default, point move to the first colon character on the
-line. You can customize this behaviour in three different ways.
+line. You can customize this behavior in three different ways.
You can move the colon character to somewhere else on the line.
Set this variable to @code{t} to set the ball rolling. It is @code{nil}
by default.
+You can also set this variable to a positive number as a group level.
+In that case, Gnus scans NoCeM messages when checking new news if this
+value is not exceeding a group level that you specify as the prefix
+argument to some commands, e.g. @code{gnus},
+@code{gnus-group-get-new-news}, etc. Otherwise, Gnus does not scan
+NoCeM messages if you specify a group level to those commands. For
+example, if you use 1 or 2 on the mail groups and the levels on the news
+groups remain the default, 3 is the best choice.
+
@item gnus-nocem-groups
@vindex gnus-nocem-groups
Gnus will look for NoCeM messages in the groups in this list. The
@item gnus-nocem-verifyer
@vindex gnus-nocem-verifyer
-@findex mc-verify
+@findex pgg-verify
This should be a function for verifying that the NoCeM issuer is who she
-says she is. The default is @code{mc-verify}, which is a Mailcrypt
-function. If this is too slow and you don't care for verification
-(which may be dangerous), you can set this variable to @code{nil}.
+says she is. The default is @code{pgg-verify}, which returns
+non-@code{nil} if the verification is successful, otherwise (including
+the case the NoCeM message was not signed) returns @code{nil}. If this
+is too slow and you don't care for verification (which may be dangerous),
+you can set this variable to @code{nil}.
-If you want signed NoCeM messages to be verified and unsigned messages
-not to be verified (but used anyway), you could do something like:
-
-@lisp
-(setq gnus-nocem-verifyer 'my-gnus-mc-verify)
-
-(defun my-gnus-mc-verify ()
- (not (eq 'forged
- (ignore-errors
- (if (mc-verify)
- t
- 'forged)))))
-@end lisp
-
-This might be dangerous, though.
+Formerly the default was @code{mc-verify}, which is a Mailcrypt
+function. While you can still use it, you can change it into
+@code{pgg-verify} running with GnuPG if you are willing to add the
+@acronym{PGP} public keys to GnuPG's keyring.
@item gnus-nocem-directory
@vindex gnus-nocem-directory
@end iftex
@c @anchor{X-Face}
-Decoding an @code{X-Face} header either requires an Emacs that has
+Viewing an @code{X-Face} header either requires an Emacs that has
@samp{compface} support (which most XEmacs versions has), or that you
-have @samp{compface} installed on your system. If either is true,
-Gnus will default to displaying @code{X-Face} headers.
+have suitable conversion or display programs installed. If your Emacs
+has image support the default action is to display the face before the
+@code{From} header. If there's no native @code{X-Face} support, Gnus
+will try to convert the @code{X-Face} header using external programs
+from the @code{pbmplus} package and friends. For XEmacs it's faster if
+XEmacs has been compiled with @code{X-Face} support. The default action
+under Emacs without image support is to fork off the @code{display}
+program.
+
+On a GNU/Linux system, the @code{display} program is from the
+ImageMagick package. For external conversion programs look for packages
+with names like @code{netpbm}, @code{libgr-progs} and @code{compface}.
The variable that controls this is the
@code{gnus-article-x-face-command} variable. If this variable is a
If the @code{gnus-article-x-face-too-ugly} (which is a regexp) matches
the @code{From} header, the face will not be shown.
-The default action under Emacs 20 is to fork off the @code{display}
-program@footnote{@code{display} is from the ImageMagick package. For
-the @code{uncompface} and @code{icontopbm} programs look for a package
-like @code{compface} or @code{faces-xface} on a GNU/Linux system.} to
-view the face.
-
-Under XEmacs or Emacs 21+ with suitable image support, the default
-action is to display the face before the @code{From} header. (It's
-nicer if XEmacs has been compiled with @code{X-Face} support---that
-will make display somewhat faster. If there's no native @code{X-Face}
-support, Gnus will try to convert the @code{X-Face} header using
-external programs from the @code{pbmplus} package and
-friends.@footnote{On a GNU/Linux system look for packages with names
-like @code{netpbm}, @code{libgr-progs} and @code{compface}.})
-
(Note: @code{x-face} is used in the variable/function names, not
@code{xface}).
@samp{libcompface} library.
@end table
-Gnus provides a few convenience functions and variables to allow
-easier insertion of X-Face headers in outgoing messages.
+If you use posting styles, you can use an @code{x-face-file} entry in
+@code{gnus-posting-styles}, @xref{Posting Styles}. If you don't, Gnus
+provides a few convenience functions and variables to allow easier
+insertion of X-Face headers in outgoing messages. You also need the
+above mentioned ImageMagick, netpbm or other image conversion packages
+(depending the values of the variables below) for these functions.
@findex gnus-random-x-face
@vindex gnus-convert-pbm-to-x-face-command
@subsection Face
@cindex face
-@c #### FIXME: faces and x-faces'implementations should really be harmonized.
+@c #### FIXME: faces and x-faces' implementations should really be harmonized.
@code{Face} headers are essentially a funkier version of @code{X-Face}
ones. They describe a 48x48 pixel colored image that's supposed to
The @code{gnus-face-properties-alist} variable affects the appearance of
displayed Face images. @xref{X-Face}.
+Viewing an @code{Face} header requires an Emacs that is able to display
+PNG images.
+@c Maybe add this:
+@c (if (featurep 'xemacs)
+@c (featurep 'png)
+@c (image-type-available-p 'png))
+
Gnus provides a few convenience functions and variables to allow
easier insertion of Face headers in outgoing messages.
auto-detect this directory, but you may set it manually if you have an
unusual directory structure.
-@item gnus-xmas-logo-color-alist
-@vindex gnus-xmas-logo-color-alist
-This is an alist where the key is a type symbol and the values are the
-foreground and background color of the splash page glyph.
-
-@item gnus-xmas-logo-color-style
-@vindex gnus-xmas-logo-color-style
-This is the key used to look up the color in the alist described above.
-Valid values include @code{flame}, @code{pine}, @code{moss},
-@code{irish}, @code{sky}, @code{tin}, @code{velvet}, @code{grape},
-@code{labia}, @code{berry}, @code{neutral}, and @code{september}.
-
@item gnus-xmas-modeline-glyph
@vindex gnus-xmas-modeline-glyph
A glyph displayed in all Gnus mode lines. It is a tiny gnu head by
@item gnus-use-toolbar
@vindex gnus-use-toolbar
-If @code{nil}, don't display toolbars. If non-@code{nil}, it should be
-one of @code{default-toolbar}, @code{top-toolbar}, @code{bottom-toolbar},
-@code{right-toolbar}, or @code{left-toolbar}.
+This variable specifies the position to display the toolbar. If
+@code{nil}, don't display toolbars. If it is non-@code{nil}, it should
+be one of the symbols @code{default}, @code{top}, @code{bottom},
+@code{right}, and @code{left}. @code{default} means to use the default
+toolbar, the rest mean to display the toolbar on the place which those
+names show. The default is @code{default}.
+
+@item gnus-toolbar-thickness
+@vindex gnus-toolbar-thickness
+Cons of the height and the width specifying the thickness of a toolbar.
+The height is used for the toolbar displayed on the top or the bottom,
+the width is used for the toolbar displayed on the right or the left.
+The default is that of the default toolbar.
@item gnus-group-toolbar
@vindex gnus-group-toolbar
@samp{vmadmin.com}. If you get 200 messages about @samp{VIAGRA}, you
discard all messages with @samp{VIAGRA} in the message. If you get
lots of spam from Bulgaria, for example, you try to filter all mail
-from Bulgarian IPs.
+from Bulgarian IPs.
This, unfortunately, is a great way to discard legitimate e-mail. The
risks of blocking a whole country (Bulgaria, Norway, Nigeria, China,
group.
@menu
-* Spam ELisp Package Sequence of Events::
-* Spam ELisp Package Filtering of Incoming Mail::
-* Spam ELisp Package Global Variables::
-* Spam ELisp Package Sorting and Score Display in Summary Buffer::
-* Spam ELisp Package Configuration Examples::
-* Blacklists and Whitelists::
-* BBDB Whitelists::
-* Gmane Spam Reporting::
-* Anti-spam Hashcash Payments::
-* Blackholes::
-* Regular Expressions Header Matching::
-* Bogofilter::
-* SpamAssassin back end::
-* ifile spam filtering::
-* spam-stat spam filtering::
-* SpamOracle::
-* Extending the Spam ELisp package::
-@end menu
+* Spam ELisp Package Sequence of Events::
+* Spam ELisp Package Filtering of Incoming Mail::
+* Spam ELisp Package Global Variables::
+* Spam ELisp Package Sorting and Score Display in Summary Buffer::
+* Spam ELisp Package Configuration Examples::
+* Blacklists and Whitelists::
+* BBDB Whitelists::
+* Gmane Spam Reporting::
+* Anti-spam Hashcash Payments::
+* Blackholes::
+* Regular Expressions Header Matching::
+* Bogofilter::
+* SpamAssassin back end::
+* ifile spam filtering::
+* spam-stat spam filtering::
+* SpamOracle::
+* Extending the Spam ELisp package::
+@end menu
@node Spam ELisp Package Sequence of Events
@subsubsection Spam ELisp Package Sequence of Events
example that formats the spam score in a 5-character field:
@lisp
-(setq gnus-summary-line-format
+(setq gnus-summary-line-format
"%U%R %10&user-date; $%5uS %6k %B %(%4L: %*%-25,25a%) %s \n")
@end lisp
;; @r{any ham goes to my @samp{nnimap+mail.lifelogs.com:mail} folder, but}
;; @r{also to my @samp{nnimap+mail.lifelogs.com:trainham} folder for training}
- (ham-process-destination "nnimap+mail.lifelogs.com:mail"
+ (ham-process-destination "nnimap+mail.lifelogs.com:mail"
"nnimap+mail.lifelogs.com:trainham")
;; @r{in this group, only @samp{!} marks are ham}
(ham-marks
(spam-contents gnus-group-spam-classification-ham))
@end lisp
-@itemize
+@itemize
@item @b{The Spam folder:}
added to a group's @code{spam-process} parameter, the senders of
spam-marked articles will be added to the blacklist.
-@emph{WARNING}
+@emph{WARNING}
Instead of the obsolete
@code{gnus-group-spam-exit-processor-blacklist}, it is recommended
-that you use @code{'(spam spam-use-blacklist)}. Everything will work
+that you use @code{(spam spam-use-blacklist)}. Everything will work
the same way, we promise.
@end defvar
ham-marked articles in @emph{ham} groups will be added to the
whitelist.
-@emph{WARNING}
+@emph{WARNING}
Instead of the obsolete
@code{gnus-group-ham-exit-processor-whitelist}, it is recommended
-that you use @code{'(ham spam-use-whitelist)}. Everything will work
+that you use @code{(ham spam-use-whitelist)}. Everything will work
the same way, we promise.
@end defvar
ham-marked articles in @emph{ham} groups will be added to the
BBDB.
-@emph{WARNING}
+@emph{WARNING}
Instead of the obsolete
@code{gnus-group-ham-exit-processor-BBDB}, it is recommended
-that you use @code{'(ham spam-use-BBDB)}. Everything will work
+that you use @code{(ham spam-use-BBDB)}. Everything will work
the same way, we promise.
@end defvar
Gmane can be found at @uref{http://gmane.org}.
-@emph{WARNING}
+@emph{WARNING}
Instead of the obsolete
@code{gnus-group-spam-exit-processor-report-gmane}, it is recommended
-that you use @code{'(spam spam-use-gmane)}. Everything will work the
+that you use @code{(spam spam-use-gmane)}. Everything will work the
same way, we promise.
@end defvar
running your own news server, for instance, and the local article
numbers don't correspond to the Gmane article numbers. When
@code{spam-report-gmane-use-article-number} is @code{nil},
-@code{spam-report.el} will use the @code{X-Report-Spam} header that
-Gmane provides.
+@code{spam-report.el} will fetch the number from the article headers.
+
+@end defvar
+
+@defvar spam-report-user-mail-address
+
+Mail address exposed in the User-Agent spam reports to Gmane. It allows
+the Gmane administrators to contact you in case of misreports. The
+default is @code{user-mail-address}.
@end defvar
added to a group's @code{spam-process} parameter, spam-marked articles
will be added to the Bogofilter spam database.
-@emph{WARNING}
+@emph{WARNING}
Instead of the obsolete
@code{gnus-group-spam-exit-processor-bogofilter}, it is recommended
-that you use @code{'(spam spam-use-bogofilter)}. Everything will work
+that you use @code{(spam spam-use-bogofilter)}. Everything will work
the same way, we promise.
@end defvar
articles in @emph{ham} groups will be added to the Bogofilter database
of non-spam messages.
-@emph{WARNING}
+@emph{WARNING}
Instead of the obsolete
@code{gnus-group-ham-exit-processor-bogofilter}, it is recommended
-that you use @code{'(ham spam-use-bogofilter)}. Everything will work
+that you use @code{(ham spam-use-bogofilter)}. Everything will work
the same way, we promise.
@end defvar
added to a group's @code{spam-process} parameter, the spam-marked
articles will be added to the spam-stat database of spam messages.
-@emph{WARNING}
+@emph{WARNING}
Instead of the obsolete
@code{gnus-group-spam-exit-processor-stat}, it is recommended
-that you use @code{'(spam spam-use-stat)}. Everything will work
+that you use @code{(spam spam-use-stat)}. Everything will work
the same way, we promise.
@end defvar
articles in @emph{ham} groups will be added to the spam-stat database
of non-spam messages.
-@emph{WARNING}
+@emph{WARNING}
Instead of the obsolete
@code{gnus-group-ham-exit-processor-stat}, it is recommended
-that you use @code{'(ham spam-use-stat)}. Everything will work
+that you use @code{(ham spam-use-stat)}. Everything will work
the same way, we promise.
@end defvar
to a group's @code{spam-process} parameter, spam-marked articles will be
sent to SpamOracle as spam samples.
-@emph{WARNING}
+@emph{WARNING}
Instead of the obsolete
@code{gnus-group-spam-exit-processor-spamoracle}, it is recommended
-that you use @code{'(spam spam-use-spamoracle)}. Everything will work
+that you use @code{(spam spam-use-spamoracle)}. Everything will work
the same way, we promise.
@end defvar
@emph{ham} groups will be sent to the SpamOracle as samples of ham
messages.
-@emph{WARNING}
+@emph{WARNING}
Instead of the obsolete
@code{gnus-group-ham-exit-processor-spamoracle}, it is recommended
-that you use @code{'(ham spam-use-spamoracle)}. Everything will work
+that you use @code{(ham spam-use-spamoracle)}. Everything will work
the same way, we promise.
@end defvar
provide them if Blackbox supports spam or ham processing.
Also, ham and spam processors are being phased out as single
-variables. Instead the form @code{'(spam spam-use-blackbox)} or
-@code{'(ham spam-use-blackbox)} is favored. For now, spam/ham
+variables. Instead the form @code{(spam spam-use-blackbox)} or
+@code{(ham spam-use-blackbox)} is favored. For now, spam/ham
processor variables are still around but they won't be for long.
@lisp
@item nnheader-max-head-length
@vindex nnheader-max-head-length
When the back ends read straight heads of articles, they all try to read
-as little as possible. This variable (default 4096) specifies
+as little as possible. This variable (default 8192) specifies
the absolute max length the back ends will try to read before giving up
on finding a separator line between the head and the body. If this
variable is @code{nil}, there is no upper read bound. If it is
whatever packages the Gnus XEmacs package requires. The current
requirements are @samp{gnus}, @samp{mail-lib}, @samp{xemacs-base},
@samp{eterm}, @samp{sh-script}, @samp{net-utils}, @samp{os-utils},
-@samp{dired}, @samp{mh-e}, @samp{sieve}, @samp{ps-print}, @samp{w3},
+@samp{dired}, @samp{mh-e}, @samp{sieve}, @samp{ps-print}, @samp{W3},
@samp{pgg}, @samp{mailcrypt}, @samp{ecrypto}, and @samp{sasl}.
January 25th 1997 (after 84 releases) as ``Gnus 5.4'' (67 releases).
On September 13th 1997, Quassia Gnus was started and lasted 37 releases.
-If was released as ``Gnus 5.6'' on March 8th 1998 (46 releases).
+It was released as ``Gnus 5.6'' on March 8th 1998 (46 releases).
Gnus 5.6 begat Pterodactyl Gnus on August 29th 1998 and was released as
``Gnus 5.8'' (after 99 releases and a CVS repository) on December 3rd
1999.
-On the 26th of October 2000, Oort Gnus was begun.
+On the 26th of October 2000, Oort Gnus was begun and was released as
+Gnus 5.10 on May 1st 2003 (24 releases).
+
+On the January 4th 2004, No Gnus was begun.
If you happen upon a version of Gnus that has a prefixed name --
``(ding) Gnus'', ``September Gnus'', ``Red Gnus'', ``Quassia Gnus'',
-``Pterodactyl Gnus'', ``Oort Gnus'' -- don't panic. Don't let it know
-that you're frightened. Back away. Slowly. Whatever you do, don't
-run. Walk away, calmly, until you're out of its reach. Find a proper
-released version of Gnus and snuggle up to that instead.
+``Pterodactyl Gnus'', ``Oort Gnus'', ``No Gnus'' -- don't panic.
+Don't let it know that you're frightened. Back away. Slowly. Whatever
+you do, don't run. Walk away, calmly, until you're out of its reach.
+Find a proper released version of Gnus and snuggle up to that instead.
@node Other Gnus Versions
@item PGP/MIME - RFC 2015/3156
RFC 2015 (superseded by 3156 which references RFC 2440 instead of RFC
-1991) describes the @acronym{MIME}-wrapping around the RF 1991/2440 format.
+1991) describes the @acronym{MIME}-wrapping around the RFC 1991/2440 format.
Gnus supports both encoding and decoding.
@item S/MIME - RFC 2633
* Quassia Gnus:: Two times two is four, or Gnus 5.6/5.7.
* Pterodactyl Gnus:: Pentad also starts with P, AKA Gnus 5.8/5.9.
* Oort Gnus:: It's big. It's far out. Gnus 5.10/5.11.
-* No Gnus:: Lars, FIXME!
+* No Gnus:: Very punny.
@end menu
These lists are, of course, just @emph{short} overviews of the
Earlier this was done only via @kbd{G p} (or @kbd{G c}), which stored
the parameters in @file{~/.newsrc.eld}, but via this variable you can
enjoy the powers of customize, and simplified backups since you set the
-variable in @file{~/.emacs} instead of @file{~/.newsrc.eld}. The
+variable in @file{~/.gnus.el} instead of @file{~/.newsrc.eld}. The
variable maps regular expressions matching group names to group
parameters, a'la:
@lisp
@item
Smileys (@samp{:-)}, @samp{;-)} etc) are now iconized for Emacs too.
-Put @code{(setq gnus-treat-display-smileys nil)} in @file{~/.emacs} to
+Put @code{(setq gnus-treat-display-smileys nil)} in @file{~/.gnus.el} to
disable it.
@item
followups (see the variables @code{message-cross-post-@var{*}}).
@item
-References and X-Draft-Headers are no longer generated when you start
-composing messages and @code{message-generate-headers-first} is
+References and X-Draft-From headers are no longer generated when you
+start composing messages and @code{message-generate-headers-first} is
@code{nil}.
@item
@kbd{J r} in the server buffer. Gnus will not download articles into
the Agent cache, unless you instruct it to do so, though, by using
@kbd{J u} or @kbd{J s} from the Group buffer. You revert to the old
-behaviour of having the Agent disabled with @code{(setq gnus-agent
+behavior of having the Agent disabled with @code{(setq gnus-agent
nil)}. Note that putting @code{(gnus-agentize)} in @file{~/.gnus.el}
is not needed any more.
A new file from Raymond Scholz @email{rscholz@@zonix.de} for deuglifying
broken Outlook (Express) articles.
+@c FIXME: `gnus-load' is mentioned in README, which is not included in
+@c CVS. We should find a better place for this item.
@item
@code{(require 'gnus-load)}
versions.
@item
+The option @code{mm-fill-flowed} can be used to disable treatment of
+``format=flowed'' messages. Also, flowed text is disabled when sending
+inline PGP signed messages. (New in Gnus 5.10.7)
+
+@item
Gnus supports the generation of RFC 2298 Disposition Notification requests.
This is invoked with the @kbd{C-c M-n} key binding from message mode.
system. While the variable is called @code{canlock-password}, it is not
security sensitive data. Publishing your canlock string on the web
will not allow anyone to be able to anything she could not already do.
-The behaviour can be changed by customizing @code{message-insert-canlock}.
+The behavior can be changed by customizing @code{message-insert-canlock}.
@item
Gnus supports server-side mail filtering using Sieve.
(@code{gnus-summary-insert-cached-articles}). The new function filters
out other articles.
-@item Some limiting commands accept a @kbd{C-u} prefix to negate the match.
+@item
+Some limiting commands accept a @kbd{C-u} prefix to negate the match.
If @kbd{C-u} is used on subject, author or extra headers, i.e., @kbd{/
s}, @kbd{/ a}, and @kbd{/ x}
@item
The default for @code{message-forward-show-mml} changed to symbol @code{best}.
-The behaviour for the @code{best} value is to show @acronym{MML} (i.e.,
+The behavior for the @code{best} value is to show @acronym{MML} (i.e.,
convert to @acronym{MIME}) when appropriate. @acronym{MML} will not be
used when forwarding signed or encrypted messages, as the conversion
invalidate the digital signature.
useful data is in the summary buffer, anyway. Set this variable to
@samp{^NEVVVVER} or @samp{From:}, or whatever you feel you need.
-Set this hook to all the available hiding commands:
+Use the following to enable all the available hiding features:
@lisp
(setq gnus-treat-hide-headers 'head
gnus-treat-hide-signature t
edebug. Debugging Lisp code is documented in the Elisp manual
(@pxref{Debugging, , Debugging Lisp Programs, elisp, The GNU Emacs
Lisp Reference Manual}). To get you started with edebug, consider if
-you discover some weird behaviour when pressing @kbd{c}, the first
+you discover some weird behavior when pressing @kbd{c}, the first
step is to do @kbd{C-h k c} and click on the hyperlink (Emacs only) in
the documentation buffer that leads you to the function definition,
then press @kbd{M-x edebug-defun RET} with point inside that function,
certain things, it's trivial to have it do something a different way.
(Well, at least if you know how to write Lisp code.) However, that's
beyond the scope of this manual, so we are simply going to talk about
-some common constructs that you normally use in your @file{.emacs} file
-to customize Gnus.
+some common constructs that you normally use in your @file{~/.gnus.el}
+file to customize Gnus. (You can also use the @file{~/.emacs} file, but
+in order to set things of Gnus up, it is much better to use the
+@file{~/.gnus.el} file, @xref{Startup Files}.)
If you want to set the variable @code{gnus-florgbnize} to four (4), you
write the following:
This function (really ``special form'') @code{setq} is the one that can
set a variable to some value. This is really all you need to know. Now
-you can go and fill your @file{.emacs} file with lots of these to change
-how Gnus works.
+you can go and fill your @file{~/.gnus.el} file with lots of these to
+change how Gnus works.
-If you have put that thing in your @file{.emacs} file, it will be read
-and @code{eval}ed (which is lisp-ese for ``run'') the next time you
-start Emacs. If you want to change the variable right away, simply say
+If you have put that thing in your @file{~/.gnus.el} file, it will be
+read and @code{eval}ed (which is Lisp-ese for ``run'') the next time you
+start Gnus. If you want to change the variable right away, simply say
@kbd{C-x C-e} after the closing parenthesis. That will @code{eval} the
previous ``form'', which is a simple @code{setq} statement here.
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
@copying
This file documents Message, the Emacs message composition mode.
-Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-Free Software Foundation, Inc.
+Copyright @copyright{} 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+2004, 2005, 2006 Free Software Foundation, Inc.
@quotation
Permission is granted to copy, distribute and/or modify this document
-under the terms of the GNU Free Documentation License, Version 1.1 or
+under the terms of the GNU Free Documentation License, Version 1.2 or
any later version published by the Free Software Foundation; with no
Invariant Sections, with the Front-Cover texts being ``A GNU
Manual'', and with the Back-Cover Texts as in (a) below. A copy of the
* Key Index:: List of Message mode keys.
@end menu
-This manual corresponds to Message v5.10.6. Message is distributed
-with the Gnus distribution bearing the same version number as this
-manual.
+@c Adjust ../Makefile.in if you change the following lines:
+Message is distributed with Gnus. The Gnus distribution
+@c
+corresponding to this manual is No Gnus v0.4.
@node Interface
Headers matching the @code{message-ignored-supersedes-headers} are
removed before popping up the new message buffer. The default is@*
@samp{^Path:\\|^Date\\|^NNTP-Posting-Host:\\|^Xref:\\|^Lines:\\|@*
-^Received:\\|^X-From-Line:\\|Return-Path:\\|^Supersedes:}.
+^Received:\\|^X-From-Line:\\|^X-Trace:\\|^X-Complaints-To:\\|@*
+Return-Path:\\|^Supersedes:\\|^NNTP-Posting-Date:\\|^X-Trace:\\|@*
+^X-Complaints-To:\\|^Cancel-Lock:\\|^Cancel-Key:\\|^X-Hashcash:\\|@*
+^X-Payment:\\|^Approved:}.
@vindex message-ignored-bounced-headers
Headers that match the @code{message-ignored-bounced-headers} regexp
will be removed before popping up the buffer. The default is
-@samp{^\\(Received\\|Return-Path\\):}.
+@samp{^\\(Received\\|Return-Path\\|Delivered-To\\):}.
@node Mailing Lists
@cindex Mail-Followup-To
Sometimes while posting to mailing lists, the poster needs to direct
followups to the post to specific places. The Mail-Followup-To (MFT)
-was created to enable just this. Two example scenarios where this is
+was created to enable just this. Three example scenarios where this is
useful:
@itemize @bullet
@vindex message-subscribed-address-file
@item message-subscribed-address-file
-You might be one organised human freak and have a list of addresses of
+You might be one organized human freak and have a list of addresses of
all subscribed mailing lists in a separate file! Then you can just
set this variable to the name of the file and life would be good.
@kindex C-c C-f x
@findex message-cross-post-followup-to
@vindex message-cross-post-default
+@vindex message-cross-post-note-function
@cindex X-Post
@cindex cross-post
-Ask for an additional @samp{Newsgroups} and @samp{FollowUp-To} for a
-cross-post. @code{message-cross-post-followup-to} mangles
-@samp{FollowUp-To} and @samp{Newsgroups} header to point to group.
-If @code{message-cross-post-default} is @code{nil} or if called with a
-prefix-argument @samp{Follow-Up} is set, but the message is not
-cross-posted.
+Set up the @samp{FollowUp-To} header with a target newsgroup for a
+cross-post, add that target newsgroup to the @samp{Newsgroups} header if
+it is not a member of @samp{Newsgroups}, and insert a note in the body.
+If @code{message-cross-post-default} is @code{nil} or if this command is
+called with a prefix-argument, only the @samp{FollowUp-To} header will
+be set but the the target newsgroup will not be added to the
+@samp{Newsgroups} header. The function to insert a note is controlled
+by the @code{message-cross-post-note-function} variable.
@item C-c C-f t
@kindex C-c C-f t
@findex message-reduce-to-to-cc
Replace contents of @samp{To} header with contents of @samp{Cc} or
-@samp{Bcc} header.
+@samp{Bcc} header. (Iff @samp{Cc} header is not present, @samp{Bcc}
+header will be used instead.)
@item C-c C-f w
@kindex C-c C-f w
@findex message-insert-wide-reply
Insert @samp{To} and @samp{Cc} headers as if you were doing a wide
-reply.
+reply even if the message was not made for a wide reply first.
@item C-c C-f a
@kindex C-c C-f a
@vindex message-beginning-of-line
If at beginning of header value, go to beginning of line, else go to
beginning of header value. (The header value comes after the header
-name and the colon.) This behaviour can be disabled by toggling
+name and the colon.) This behavior can be disabled by toggling
the variable @code{message-beginning-of-line}.
@end table
@item C-c M-m
@kindex C-c M-m
@findex message-mark-inserted-region
-Mark some region in the current article with enclosing tags.
-See @code{message-mark-insert-begin} and @code{message-mark-insert-end}.
+Mark some region in the current article with enclosing tags. See
+@code{message-mark-insert-begin} and @code{message-mark-insert-end}.
+When called with a prefix argument, use slrn style verbatim marks
+(@samp{#v+} and @samp{#v-}).
@item C-c M-f
@kindex C-c M-f
@findex message-mark-insert-file
Insert a file in the current article with enclosing tags.
See @code{message-mark-insert-begin} and @code{message-mark-insert-end}.
+When called with a prefix argument, use slrn style verbatim marks
+(@samp{#v+} and @samp{#v-}).
@end table
The most typical thing users want to use the multipart things in
@acronym{MIME} for is to add ``attachments'' to mail they send out.
This can be done with the @kbd{C-c C-a} command, which will prompt for
-a file name and a @acronym{MIME} type. If your Emacs supports drag
-and drop, you can also drop the file in the Message buffer.
+a file name and a @acronym{MIME} type.
+
+@vindex mml-dnd-protocol-alist
+@vindex mml-dnd-attach-options
+If your Emacs supports drag and drop, you can also drop the file in the
+Message buffer. The variable @code{mml-dnd-protocol-alist} specifies
+what kind of action is done when you drop a file into the Message
+buffer. The variable @code{mml-dnd-attach-options} controls which
+@acronym{MIME} options you want to specify when dropping a file. If it
+is a list, valid members are @code{type}, @code{description} and
+@code{disposition}. @code{disposition} implies @code{type}. If it is
+@code{nil}, don't ask for options. If it is @code{t}, ask the user
+whether or not to specify options.
You can also create arbitrarily complex multiparts using the @acronym{MML}
language (@pxref{Composing, , Composing, emacs-mime, The Emacs MIME
The @code{message-use-idna} variable control whether @acronym{IDNA} is
used. If the variable is @code{nil} no @acronym{IDNA} encoding will
ever happen, if it is set to the symbol @code{ask} the user will be
-queried (the default), and if set to @code{t} @acronym{IDNA} encoding
-happens automatically.
+queried, and if set to @code{t} (which is the default if @acronym{IDNA}
+is fully available) @acronym{IDNA} encoding happens automatically.
@findex message-idna-to-ascii-rhs
If you want to experiment with the @acronym{IDNA} encoding, you can
invoke @kbd{M-x message-idna-to-ascii-rhs RET} in the message buffer
-to have the non-@acronym{ASCII} domain names encoded while you edit the message.
+to have the non-@acronym{ASCII} domain names encoded while you edit
+the message.
Note that you must have @uref{http://www.gnu.org/software/libidn/, GNU
Libidn} installed in order to use this functionality.
Kill the address under point.
@item C-c C-z
-@kindex C-c C-x
+@kindex C-c C-z
@findex message-kill-to-signature
Kill all the text up to the signature, or if that's missing, up to the
end of the message (@code{message-kill-to-signature}).
@kindex TAB
@findex message-tab
@vindex message-tab-body-function
-If non-@code{nil} execute the function specified in
-@code{message-tab-body-function}. Otherwise use the function bound to
-@kbd{TAB} in @code{text-mode-map} or @code{global-map}.
+If @code{message-tab-body-function} is non-@code{nil}, execute the
+function it specifies. Otherwise use the function bound to @kbd{TAB} in
+@code{text-mode-map} or @code{global-map}.
@end table
lines. If @code{nil}, leave the subject unchanged. If it is the symbol
@code{ask}, query the user what do do. In this case, the subject is
matched against @code{message-subject-trailing-was-ask-regexp}. If
-@code{message-subject-trailing-was-query} is t, always strip the
+@code{message-subject-trailing-was-query} is @code{t}, always strip the
trailing old subject. In this case,
@code{message-subject-trailing-was-regexp} is used.
@item message-alternative-emails
@vindex message-alternative-emails
-A regexp to match the alternative email addresses. The first matched
-address (not primary one) is used in the @code{From} field.
+Regexp matching alternative email addresses. The first address in the
+To, Cc or From headers of the original article matching this variable is
+used as the From field of outgoing messages, replacing the default From
+value.
+
+For example, if you have two secondary email addresses john@@home.net
+and john.doe@@work.com and want to use them in the From field when
+composing a reply to a message addressed to one of them, you could set
+this variable like this:
+
+@lisp
+(setq message-alternative-emails
+ (regexp-opt '("john@@home.net" "john.doe@@work.com")))
+@end lisp
+
+This variable has precedence over posting styles and anything that runs
+off @code{message-setup-hook}.
@item message-allow-no-recipients
@vindex message-allow-no-recipients
@item message-required-mail-headers
@vindex message-required-mail-headers
@xref{News Headers}, for the syntax of this variable. It is
-@code{(From Date Subject (optional . In-Reply-To) Message-ID Lines
+@code{(From Subject Date (optional . In-Reply-To) Message-ID
(optional . User-Agent))} by default.
@item message-ignored-mail-headers
@vindex message-ignored-mail-headers
-Regexp of headers to be removed before mailing. The default is
-@samp{^[GF]cc:\\|^Resent-Fcc:\\|^Xref:\\|^X-Draft-From:}.
+Regexp of headers to be removed before mailing. The default is@*
+@samp{^[GF]cc:\\|^Resent-Fcc:\\|^Xref:\\|^X-Draft-From:\\|@*
+^X-Gnus-Agent-Meta-Information:}.
@item message-default-mail-headers
@vindex message-default-mail-headers
@item message-ignored-news-headers
@vindex message-ignored-news-headers
Regexp of headers to be removed before posting. The default is@*
-@samp{^NNTP-Posting-Host:\\|^Xref:\\|^[BGF]cc:\\|^Resent-Fcc:\\|^X-Draft-From:}.
+@samp{^NNTP-Posting-Host:\\|^Xref:\\|^[BGF]cc:\\|^Resent-Fcc:\\|@*
+^X-Draft-From:\\|^X-Gnus-Agent-Meta-Information:}.
@item message-default-news-headers
@vindex message-default-news-headers
@cindex yanking
@cindex quoting
When you are replying to or following up an article, you normally want
-to quote the person you are answering. Inserting quoted text is done
-by @dfn{yanking}, and each line you yank will have
-@code{message-yank-prefix} prepended to it (except for quoted and
-empty lines which uses @code{message-yank-cited-prefix}). The default
-is @samp{> }.
+to quote the person you are answering. Inserting quoted text is done by
+@dfn{yanking}, and each line you yank will have
+@code{message-yank-prefix} prepended to it (except for quoted lines
+which use @code{message-yank-cited-prefix} and empty lines which use
+@code{message-yank-empty-prefix}). The default is @samp{> }.
@item message-yank-cited-prefix
@vindex message-yank-cited-prefix
@cindex yanking
@cindex cited
@cindex quoting
-When yanking text from an article which contains no text or already
-cited text, each line will be prefixed with the contents of this
-variable. The default is @samp{>}. See also
-@code{message-yank-prefix}.
+When yanking text from an article which contains already cited text,
+each line will be prefixed with the contents of this variable. The
+default is @samp{>}. See also @code{message-yank-prefix}.
+
+@item message-yank-empty-prefix
+@vindex message-yank-empty-prefix
+@cindex yanking
+@cindex quoting
+When yanking text from an article, each empty line will be prefixed with
+the contents of this variable. The default is @samp{>}. You can set
+this variable to an empty string to split the cited text into paragraphs
+automatically. See also @code{message-yank-prefix}.
@item message-indentation-spaces
@vindex message-indentation-spaces
@item message-default-charset
@vindex message-default-charset
@cindex charset
-Symbol naming a @acronym{MIME} charset. Non-@acronym{ASCII}
-characters in messages are assumed to be encoded using this charset.
-The default is @code{nil}, which means ask the user. (This variable
-is used only on non-@sc{mule} Emacsen. @xref{Charset Translation, ,
-Charset Translation, emacs-mime, Emacs MIME Manual}, for details on
-the @sc{mule}-to-@acronym{MIME} translation process.
+Symbol naming a @acronym{MIME} charset. Non-@acronym{ASCII} characters
+in messages are assumed to be encoded using this charset. The default
+is @code{iso-8859-1} on non-@sc{mule} Emacsen; otherwise @code{nil},
+which means ask the user. (This variable is used only on non-@sc{mule}
+Emacsen.) @xref{Charset Translation, , Charset Translation, emacs-mime,
+Emacs MIME Manual}, for details on the @sc{mule}-to-@acronym{MIME}
+translation process.
@item message-signature-separator
@vindex message-signature-separator
@item message-send-method-alist
@vindex message-send-method-alist
-
-Alist of ways to send outgoing messages. Each element has the form
+@findex message-mail-p
+@findex message-news-p
+@findex message-send-via-mail
+@findex message-send-via-news
+Alist of ways to send outgoing messages. Each element has the form:
@lisp
(@var{type} @var{predicate} @var{function})
@item predicate
A function called without any parameters to determine whether the
-message is a message of type @var{type}.
+message is a message of type @var{type}. The function will be called in
+the buffer where the message is.
@item function
A function to be called if @var{predicate} returns non-@code{nil}.
@var{function} is called with one parameter---the prefix.
@end table
+The default is:
+
@lisp
((news message-news-p message-send-via-news)
(mail message-mail-p message-send-via-mail))
@end lisp
-
+The @code{message-news-p} function returns non-@code{nil} if the message
+looks like news, and the @code{message-send-via-news} function sends the
+message according to the @code{message-send-news-function} variable
+(@pxref{News Variables}). The @code{message-mail-p} function returns
+non-@code{nil} if the message looks like mail, and the
+@code{message-send-via-mail} function sends the message according to the
+@code{message-send-mail-function} variable (@pxref{Mail Variables}).
+
+All the elements in this alist will be tried in order, so a message
+containing both a valid @samp{Newsgroups} header and a valid @samp{To}
+header, for example, will be sent as news, and then as mail.
@end table
@copying
-This file describes the PGG.
+This file describes PGG, an Emacs interface to various PGP implementations.
-Copyright (C) 2003 Free Software Foundation, Inc.
-Copyright (C) 2001 Daiki Ueno.
+Copyright @copyright{} 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+Copyright @copyright{} 2001 Daiki Ueno.
@quotation
Permission is granted to copy, distribute and/or modify this document
-under the terms of the GNU Free Documentation License, Version 1.1 or
+under the terms of the GNU Free Documentation License, Version 1.2 or
any later version published by the Free Software Foundation; with no
Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
Texts. A copy of the license is included in the section entitled ``GNU
@lisp
(autoload 'pgg-encrypt-region "pgg"
"Encrypt the current region." t)
+(autoload 'pgg-encrypt-symmetric-region "pgg"
+ "Encrypt the current region with symmetric algorithm." t)
(autoload 'pgg-decrypt-region "pgg"
"Decrypt the current region." t)
(autoload 'pgg-sign-region "pgg"
fails immediately, but if the function had been called interactively, it
would ask you to retrieve the signer's public key from the server.
-@deffn Command pgg-encrypt-region start end recipients &optional sign
+@deffn Command pgg-encrypt-region start end recipients &optional sign passphrase
Encrypt the current region between @var{start} and @var{end} for
@var{recipients}. When the function were called interactively, you
would be asked about the recipients.
the accessible portion) with the resulting data.
If optional argument @var{sign} is non-@code{nil}, the function is
-request to do a combined sign and encrypt. This currently only work
-with GnuPG.
+request to do a combined sign and encrypt. This currently is
+confirmed to work with GnuPG, but might not work with PGP or PGP5.
+
+If optional @var{passphrase} is @code{nil}, the passphrase will be
+obtained from the passphrase cache or user.
+@end deffn
+
+@deffn Command pgg-encrypt-symmetric-region &optional start end passphrase
+Encrypt the current region between @var{start} and @var{end} using a
+symmetric cipher. After invocation you are asked for a passphrase.
+
+If optional @var{passphrase} is @code{nil}, the passphrase will be
+obtained from the passphrase cache or user.
+
+symmetric-cipher encryption is currently only implemented for GnuPG.
@end deffn
-@deffn Command pgg-decrypt-region start end
+@deffn Command pgg-decrypt-region start end &optional passphrase
Decrypt the current region between @var{start} and @var{end}. If
decryption is successful, it replaces the current region contents (in
the accessible portion) with the resulting data.
+
+If optional @var{passphrase} is @code{nil}, the passphrase will be
+obtained from the passphrase cache or user.
@end deffn
-@deffn Command pgg-sign-region start end &optional cleartext
+@deffn Command pgg-sign-region start end &optional cleartext passphrase
Make the signature from text between @var{start} and @var{end}. If the
optional third argument @var{cleartext} is non-@code{nil}, or the
function is called interactively, it does not create a detached
signature. In such a case, it replaces the current region contents (in
the accessible portion) with the resulting data.
+
+If optional @var{passphrase} is @code{nil}, the passphrase will be
+obtained from the passphrase cache or user.
@end deffn
@deffn Command pgg-verify-region start end &optional signature fetch
Verify the current region between @var{start} and @var{end}. If the
-optional third argument @var{signature} is non-@code{nil}, or the function
-is called interactively, it is treated as the detached signature of the
-current region.
+optional third argument @var{signature} is non-@code{nil}, it is treated
+as the detached signature file of the current region.
If the optional 4th argument @var{fetch} is non-@code{nil}, or the
function is called interactively, we attempt to fetch the signer's
select cipher algorithm from 3DES, CAST5, BLOWFISH, and so on, but on
the other hand the version 2 of PGP only supports IDEA.
-By default, if the variable @code{pgg-scheme} is not set, PGG searches the
-registered scheme for an implementation of the requested service
-associated with the named algorithm. If there are no match, PGG uses
-@code{pgg-default-scheme}. In other words, there are two options to
-control which command is used to process the incoming PGP armors. One
-is for encrypting and signing, the other is for decrypting and
-verifying.
+Which implementation is used is controlled by the @code{pgg-scheme}
+variable. If it is @code{nil} (the default), the value of the
+@code{pgg-default-scheme} variable will be used instead.
@defvar pgg-scheme
-Force specify the scheme of PGP implementation for decrypting and verifying.
-The value can be @code{gpg}, @code{pgp}, and @code{pgp5}.
+Force specify the scheme of PGP implementation. The value can be set to
+@code{gpg}, @code{pgp}, and @code{pgp5}. The default is @code{nil}.
@end defvar
@defvar pgg-default-scheme
-Force specify the scheme of PGP implementation for encrypting and signing.
-The value can be @code{gpg}, @code{pgp}, and @code{pgp5}.
+The default scheme of PGP implementation. The value should be one of
+@code{gpg}, @code{pgp}, and @code{pgp5}. The default is @code{gpg}.
@end defvar
@node Caching passphrase
@defvar pgg-cache-passphrase
If non-@code{nil}, store passphrases. The default value of this
-variable is @code{t}. If you were worry about security issue, however,
-you could stop caching with setting it @code{nil}.
+variable is @code{t}. If you are worried about security issues,
+however, you could stop the caching of passphrases by setting this
+variable to @code{nil}.
@end defvar
@defvar pgg-passphrase-cache-expiry
keyrings.
@end deffn
-@deffn Method pgg-scheme-encrypt-region scheme start end recipients &optional sign
+@deffn Method pgg-scheme-encrypt-region scheme start end recipients &optional sign passphrase
Encrypt the current region between @var{start} and @var{end} for
@var{recipients}. If @var{sign} is non-@code{nil}, do a combined sign
and encrypt. If encryption is successful, it returns @code{t},
otherwise @code{nil}.
@end deffn
-@deffn Method pgg-scheme-decrypt-region scheme start end
+@deffn Method pgg-scheme-encrypt-symmetric-region scheme start end &optional passphrase
+Encrypt the current region between @var{start} and @var{end} using a
+symmetric cipher and a passphrases. If encryption is successful, it
+returns @code{t}, otherwise @code{nil}. This function is currently only
+implemented for GnuPG.
+@end deffn
+
+@deffn Method pgg-scheme-decrypt-region scheme start end &optional passphrase
Decrypt the current region between @var{start} and @var{end}. If
decryption is successful, it returns @code{t}, otherwise @code{nil}.
@end deffn
-@deffn Method pgg-scheme-sign-region scheme start end &optional cleartext
+@deffn Method pgg-scheme-sign-region scheme start end &optional cleartext passphrase
Make the signature from text between @var{start} and @var{end}. If the
optional third argument @var{cleartext} is non-@code{nil}, it does not
create a detached signature. If signing is successful, it returns
.ps.pdf:
epstopdf $<
-.SUFFIXES: .pdf .ps .eps .xbm .xpm .png .tif .gif
+.SUFFIXES: .pdf .ps .eps .xbm .xpm .png .tif .gif
clean:
rm -f $(PSFILES)
veryclean: clean
distclean: clean
+ rm -f Makefile
install:
@ifinfo
This file describes the Emacs SASL library.
-Copyright (C) 2000 Daiki Ueno.
+Copyright @copyright{} 2004, 2005, 2006 Free Software Foundation, Inc.
+Copyright @copyright{} 2000 Daiki Ueno.
Permission is granted to copy, distribute and/or modify this document
-under the terms of the GNU Free Documentation License, Version 1.1 or
+under the terms of the GNU Free Documentation License, Version 1.2 or
any later version published by the Free Software Foundation; with no
Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
Texts. A copy of the license is included in the section entitled "GNU
Copyright @copyright{} 2000 Daiki Ueno.
Permission is granted to copy, distribute and/or modify this document
-under the terms of the GNU Free Documentation License, Version 1.1 or
+under the terms of the GNU Free Documentation License, Version 1.2 or
any later version published by the Free Software Foundation; with no
Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
Texts. A copy of the license is included in the section entitled "GNU
@synindex pg cp
@copying
-This file documents the Emacs Sieve package.
+This file documents the Emacs Sieve package, for server-side mail filtering.
-Copyright (C) 2001 Free Software Foundation, Inc.
+Copyright @copyright{} 2001, 2002, 2003, 2004, 2005, 2006 Free
+Software Foundation, Inc.
@quotation
Permission is granted to copy, distribute and/or modify this document
-under the terms of the GNU Free Documentation License, Version 1.1 or
+under the terms of the GNU Free Documentation License, Version 1.2 or
any later version published by the Free Software Foundation; with no
Invariant Sections, with the Front-Cover texts being ``A GNU
Manual'', and with the Back-Cover Texts as in (a) below. A copy of the
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;
;;
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
;;
;; Also know as the "wish list". Some are done. For the others, no
;; promise when to be implemented.
+* Go through the todo list and remove items already done.
+
+* Use a new custom type (`define-widget') for posting-style in `gnus-cus.el'
+ (G c) and for `gnus-posting-styles'. Maybe some allowed types are still
+ missing.
+
+* Add proper doc strings to functions and variables explained in the manual
+ (info "(gnus)Gnus Utility Functions")
+
+* Add Message-IDs or URLs refering to relevant discussions on lists and
+ newsgroups.
+
+* Use nicer tool bar icons from GNOME
+
+ Done for Emacs (The GNOME icons won't fit into standard XEmacs icons,
+ IMHO. -- rsteib) in group, summary and message mode.
+
+ Some modes might also deserve improved tool bars:
+
+ - gnus-draft-mode
+
+ - mml-preview buffer:
+
+ . zap most buttons; except print, customize (?) and help
+
+ . "exit" should just kill the buffer
+
+ - gnus-server-mode: Add some commands from the Connections and Server
+ menu.
+
+ - gnus-browse-mode (could borrow some icons from gnus-group-mode)
+
+ (See http://article.gmane.org/gmane.emacs.gnus.general/62147).
+
+* Maybe Gnus should support the LIST SUBSCRIPTIONS, see RFC 2980.
+
+* Merge `message-extra-wide-headers' and ` message-header-synonyms'?
+
+* Maybe texi/emacs-mime.texi could be divided into user-visible stuff and
+ reference manual for the MIME library.
+
+ Related: Bill Wohler's article on mh-e-user.
+ http://thread.gmane.org/29067.1138078896@olgas.newt.com
+
+* Fix `change servers' command, see David Kastrup's message.
+ http://thread.gmane.org/x54qewqxz4.fsf@lola.goethe.zz
+
+* texi/gnus-coding.texi should be fixed.
+
* gnus-topic-kill-region
From Colin Marquardt <colin.marquardt@usa.alcatel.com>
Implement NOV caching with Gnus Agent.
-* Multiple charsets for topic names.
-
- [Done]
-
* Allow specification of server in Newsgroups header
[Kai wrote]
Thanks for Micha Wiedenmann for this suggestion.
-* Understand mail-user-agent. Maybe gnus-mail-user-agent.
-
- [Done]
-
-* Emphasis delimiters show when `W W c'.
-
- [Fixed]
-
* Parsing of the common list confirmation requests so that Gnus can
prepare the response with a single command. Including LISTSERV
periodic ping messages and the like.
-* Parsing of the various List-* headers to enable automatic commands
- like "send help message," "send unsubscribe message," and the like.
-
- [done, see gnus-ml.el]
-
* Parsing of the subscription notice to stash away details like what
address you're subscribed to the list under (and automatically send
mail to the list using that address, when you send mail inside the list
Most likely using jka-compr. (It has been suggested that this do
work but I think it should be verified for all backends.)
-* Support for RFC2015, PGP-MIME. Probably has to involve the people in
- the Mailcrypt project.
-
- [done]
-
* Agent (Can someone write some subtopics here? I don't use it myself
so I don't know what is lacking.)
posted on gnu.emacs.gnus does this.
Also, gnus-article-encrypt `K E' encrypts the article body.]
-* The stuff on "Newest Features" in the manual should be implemented
- and the node updated (it maybe is?).
-
* Splitting .newsrc.eld so the history is in one file and the
configuration is in another. To help those that reads at two
locations (e.g. work and home) and want to have the same
you want to instantiate, and what mail should land in each?
[/viz./ problem of nnmail-split-methods interface.]
+ [Probably `assistant.el' will provide this. But it's development is
+ stalled.]
+
* Full integration of nnir into Gnus. Generic hooks for adding new
external nnir sources. I use a couple experimental, in-house tools
(JPRC is a research lab, occupied with document analysis and machine
* A possibility to add notes to messages. If thouse could include links
to other (stored) messages this would be very practical.
-* A nnfolder like backend with .overview files.
- This would not only speed up things, but also allow nnir to work on it.
-
- [done]
-
* Allow article editing in groups which do not support it, but
emulating it via deleting the old article and entering the new one
into the group. This would be very useful to support `T ^' (say) in
cached-but-unticked ones.) This would become even more important
when we allow labels.
-* Go through the todo list and remove items already done.
-
* Create new data type `article identifier' and use that instead of
article numbers. A first implementation could offer something like
(num . 4711) but this could be extended. This would be useful for
thread should always be hidden (as in `T h') by default, while most
other threads are not hidden by default. Hm.
-* New backend between nnfolder and nnml: have more than one article
- per file, but more than one file per group. With .overview files.
-
- [done. nnfolder has .overview. Backward- and forward-compatible
- between 1.0 and 2.0. (setq nnfolder-nov-is-evil t) disables the
- feature]
-
-* .overview files for nnfolder?
-
- [done]
-
* New backend nnbabylfolder. There is also nnbabyl which is like
nnmbox but uses babyl format, but there is no babyl format
equivalent of nnfolder.
* nndir doesn't read gzipped files.
-* FAQ doesn't have an up node?
-
* when moving mail from a procmail spool to the crash-box, the
crash-box is only appropriate to one specific group.
-* `t' `t' makes X-Faces disappear.
-
* nnmh-be-safe means that crossposted articles will be marked as
unread.
* move nnmail-split-history out to the backends.
-* nnweb doesn't work properly.
-
* using a virtual server name as `gnus-select-method' doesn't work?
* when killing/yanking a group from one topic to another in a
* stop using invisible text properties and start using overlays
instead
-* C-c C-f C-e to add an Expires header.
-
* go from one group to the next; everything is expunged; go to the
next group instead of going to the group buffer.
* support ProleText:
<URL:http://proletext.clari.net/prole/proletext.html>
-* when browsing a foreign server, the groups that are already
- subscribed should be listed as such and not as "K".
-
- [done]
-
* generate font names dynamically.
* score file mode auto-alist.
* `gnus-summary-find-matching' should accept pseudo-"headers" like
"body", "head" and "all"
-* When buttifying <URL: > things, all white space (including
- newlines) should be ignored.
+* When buttifying <URL: > things, all white space (including newlines) should
+ be ignored.
+
+ [Done]
+
+ But not for cited URLs.
* Process-marking all groups in a topic should process-mark groups
in subtopics as well.
* nnmbox should support a newsgroups file for descriptions.
-* allow fetching mail from several pop servers.
-
- [done]
-
* Be able to specify whether the saving commands save the original
or the formatted article.
* more limiting functions - date, etc.
+ We have `gnus-summary-limit-to-age'. What's missing? Maybe enter a date?
+
* be able to limit on a random header; on body; using reverse
matches.
* a group parameter (`absofucking-total-expiry') that will make
Gnus expire even unread articles.
-* a command to print the article buffer as postscript.
-
* variable to disable password fetching when opening by
nntp-open-telnet.
then you could run the relevant function to complete the
information in the header
+ [Done using `message-completion-alist'?]
+
* cache the newsgroups file locally to avoid reloading it all the
time.
* nnweb should allow fetching by Message-ID from servers.
+ [Done?]
+
* point in the article buffer doesn't always go to the beginning of
the buffer when selecting new articles.
default server if it fails on the current server? (controlled by a
user variable, (nil, t, 'ask)).
+ [Done by `gnus-refer-article-method'?]
+
* make it possible to cancel articles using the select method for
the current group.
* a function for selecting a particular group which will contain
the articles listed in a list of article numbers/id's.
-* a battery of character translation functions to translate common
- Mac, MS (etc) characters into ISO 8859-1.
-
- (defun article-fix-m$word ()
- "Fix M$Word smartquotes in an article."
- (interactive)
- (save-excursion
- (let ((buffer-read-only nil))
- (goto-char (point-min))
- (while (search-forward "\221" nil t)
- (replace-match "`" t t))
- (goto-char (point-min))
- (while (search-forward "\222" nil t)
- (replace-match "'" t t))
- (goto-char (point-min))
- (while (search-forward "\223" nil t)
- (replace-match "\"" t t))
- (goto-char (point-min))
- (while (search-forward "\224" nil t)
- (replace-match "\"" t t)))))
-
- [done]
-
* (add-hook 'gnus-exit-query-functions
'(lambda ()
(if (and (file-exists-p nnmail-spool-file)
* The jingle is only played on the second invocation of Gnus.
-* Bouncing articles should do MIME.
-
- [done]
-
* Crossposted articles should "inherit" the % or mark from the other
groups it has been crossposted to, or something. (Agent.)
(body "whatever.text")
-* Be able to run `J u' from summary buffers.
-
- [Done]
-
* Solve the halting problem.
\f