pax_global_header00006660000000000000000000000064140666136350014524gustar00rootroot0000000000000052 comment=769699d60aa033049804083b459ee562b82db77e wanderlust-wanderlust-769699d/000077500000000000000000000000001406661363500164055ustar00rootroot00000000000000wanderlust-wanderlust-769699d/.gitignore000066400000000000000000000001241406661363500203720ustar00rootroot00000000000000# byte-compiled emacs code *.elc # auto-generated elisp version of NEWS wl-news.el wanderlust-wanderlust-769699d/.gitmodules000066400000000000000000000000001406661363500205500ustar00rootroot00000000000000wanderlust-wanderlust-769699d/BUGS000066400000000000000000000003551406661363500170730ustar00rootroot00000000000000* Cannot communicate with UW imapd with qmail patch. * Biff of the POP3 folders do not work correctly (c.f. [wl: 08937]). * IMAP STATUS command MUST NOT be used as a "check for new messages in the selected mailbox" operation (RFC3501) wanderlust-wanderlust-769699d/BUGS.ja000066400000000000000000000003571406661363500174660ustar00rootroot00000000000000* qmail 対応の UW imapd のメッセージを扱えない。 * POP3 フォルダの biff がうまく動かない (c.f. [wl: 08937])。 * IMAP STATUS コマンドをselectされた mailbox に対して使ってはならない(RFC3501) wanderlust-wanderlust-769699d/COPYING000066400000000000000000000014171406661363500174430ustar00rootroot00000000000000Copyright (C) 1998-2001 Yuuichi Teranishi This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs; see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. wanderlust-wanderlust-769699d/ChangeLog.1000066400000000000000000001073101406661363500203200ustar00rootroot000000000000002020-08-20 Kazuhiro Ito Change non-ASCII text files's coding-system to UTF-8 * BUGS.ja: Likewise. * INSTALL.ja: Likewise. * NEWS.ja: Likewise. * README.ja: Likewise. * WL-MK: Likewise. * doc/TODO.ja: Likewise. * etc/ChangeLog.1.ja: Likewise. * etc/ChangeLog.2: Likewise. * etc/ChangeLog.2.ja: Likewise. * etc/ChangeLog.3.ja: Likewise. * etc/ja.Emacs: Likewise. * samples/ja/dot.addresses: Likewise. * samples/ja/dot.folders: Likewise. * samples/ja/dot.wl: Likewise. 2020-08-05 Naoya Yamashita Fix closing parens position (cosmetic change only). Cf. https://github.com/wanderlust/wanderlust/pull/180 2020-07-16 Kazuhiro Ito * doc/wl-ja.texi (Score File Format): Use @multitable for table. Do not use MULTIPLICATION SIGN directly. * doc/wl.texi (Score File Format): Use @multitable for table. 2020-07-15 Kazuhiro Ito * doc/texinfo.tex: Replaced with the latest master branch's one in texinfo repository. * doc/txi-en.tex: Likewise. * doc/txi-ja.tex: Likewise. Furthermore, partially merged with Shoichi Fukusaka's modified version. * doc/wl-ja.texi: Encode in utf-8. Assume LuaTeX. * doc/wl-refcard-ja.tex: Encode in utf-8. Assume LuaTeX. * doc/wl-refcard.tex: Assume LuaTeX or pdfTeX. 2020-07-14 Kazuhiro Ito * doc/wl.texi: Updated to adapt recent changes. * doc/wl-ja.texi: Likewise. 2020-06-27 Kazuhiro Ito * samples/en/dot.wl: wl-folder-check-entity-hook is now called with argument ENTITY. * samples/ja/dot.wl: Ditto. 2020-06-05 Kazuhiro Ito * WL-MK: More dropping old platforms support. 2020-05-24 Kazuhiro Ito Drop old platforms support. Now supported Emacsen are version 24 and later. * WL-ELS: Assuse Emacs 24 or later. * WL-MK: Likewise. 2020-01-24 Kazuhiro Ito * doc/wl.texi (wl-expire-archive-number2): Add notice for `elmo-localdir-folder-path' and `elmo-archive-folder-path' variable. * doc/wl-ja.texi (wl-expire-archive-number2): Likewise. 2019-08-12 Kazuhiro Ito * doc/wl.texi (Selecting Folder, Sticky Summary): Update key bindings. * doc/wl-ja.texi (Selecting Folder, Sticky Summary): Likewise. 2018-11-17 Kazuhiro Ito * doc/wl.texi (Variables of Draft Mode): Update descriptions of wl-draft-buffer-style and wl-draft-reply-buffer-style. * doc/wl-ja.texi (Variables of Draft Mode): Likewise. 2018-04-03 Kazuhiro Ito * doc/wl.texi (Download): Update STARTTLS connection requirements. * doc/wl-ja.texi (Download): Likewise. 2017-12-09 Kazuhiro Ito * doc/wl-ja.texi, doc/wl.texi (Summary View): Change example for number prefix. Refer to wl-summary-default-number-column and wl-summary-number-column-alist. 2017-12-04 Kazuhiro Ito * doc/wl-ja.texi (Cache): Descibe newly introduced variables. * doc/wl.texi (Cache): Likewise. 2017-12-02 Kazuhiro Ito * doc/wl-ja.texi (Mailing List): Update ML information. Only ML members can post. * doc/wl.texi (Mailing List): Likewise. 2017-09-30 Kazuhiro Ito * WL-ELS (modules-alist): Exclude bbdb-wl.el for the case that BBDB 3.x is installed. 2017-03-24 Kazuhiro Ito * doc/wl-ja.texi (Password Management): Updated for recent chage. (Auth-source): New node. * doc/wl.texi (Password Management, Auth-source): Ditto. 2017-03-23 Kazuhiro Ito * WL-ELS (ELMO-MODULES): Add elmo-passwd.el. 2017-03-10 Kazuhiro Ito * doc/wl-ja.texi (rgrep): New node. (grep): Add tips for too many file searching. * doc/wl.texi (rgrep): Likewise. 2016-11-09 Piotr Trojanek * doc/wl.texi: fix of minor grammar issues and a typo in reference to a doc-variable. 2016-08-30 Piotr Trojanek * doc/wl.texi: remove trailing periods in section headers. 2016-08-21 Piotr Trojanek * .gitignore: Added. * INSTALL: Typografic fixes. * doc/wl.texi: Fix typos and grammar in folder and address manager documentation. 2016-08-11 Piotr Trojanek * doc/wl.texi (Password Management): Fix typo. 2016-07-28 Kazuhiro Ito * doc/wl.texi (Biff): Adapt to recent change. * doc/wl-ja.texi (Biff): Ditto. 2016-07-04 Piotr Trojanek * doc/wl.texi (Sticky Summary, Customizable Variables): Fix typo. 2016-04-09 Kazuhiro Ito * doc/wl.texi (Editing Message Body and Sending) (Key Bindings of Draft): Move comment on re-editing to `Editing Message Body and Sending' node. Cf. https://github.com/wanderlust/wanderlust/issues/97 * doc/wl-ja.texi: Likewise. 2016-04-09 Kazuhiro Ito * doc/wl.texi: Update @xref for external documents. * doc/wl-ja.texi: Likewise. 2016-02-24 Erik Hetzner * wl-draft.wl (wl-draft-mimic-kill-buffer): Provide default to `read-buffer' * wl-folder.wl (wl-folder-mimic-kill-buffer): Provide default to `read-buffer' 2015-12-28 Kazuhiro Ito * doc/wl.texi, doc/wl-ja.texi: Describe wl-summary-target-mark-threads. 2015-10-03 Kazuhiro Ito * doc/wl.texi: Minor fix. * doc/wl-ja.texi (Quick Search): Sync with wl.texi. 2015-10-03 Kazuhiro Ito * WL-ELS: Add wl-qs.el. 2015-09-13 Erik Hetzner * doc/wl.texi (Quick Search): Document wl-qs. 2015-08-09 Kazuhiro Ito * doc/wl.texi, doc/wl-ja.texi: Wrap URLs with @uref. 2015-08-09 Kazuhiro Ito * doc/wl-ja.texi (MIME Modules, Download, Install, IMAP Folder, BBDB) (mime-w3m): Reflect current status. * doc/wl.texi (MIME Modules, Download, Install, IMAP Folder, BBDB) (mime-w3m): Likewise. 2015-08-09 Kazuhiro Ito * doc/wl-ja.texi (POP Folder, IMAP Folder): Remove description of additional packages for SSL/STARTTLS connection. 2015-05-17 Kazuhiro Ito * WL-ELS: Install elmo-rss.el only when required libraries are available. 2015-05-17 Juliusz Chroboczek * WL-ELS: Add elmo-rss.el. 2014-11-09 Erik Hetzner * wanderlust-pkg.el: New file. 2014-11-09 Erik Hetzner * doc/wl-ja.texi: Define @documentencoding. 2014-11-09 Erik Hetzner * etc/icons/wl-draft-insert-signature-up.xpm: Fix transparency for GNU Emacs. Cf. https://github.com/wanderlust/wanderlust/issues/26 * etc/icons/wl-draft-kill-up.xpm: Likewise. * etc/icons/wl-draft-save-and-exit-up.xpm: Likewise. * etc/icons/wl-draft-send-from-toolbar-down.xpm: Likewise. * etc/icons/wl-draft-send-from-toolbar-up.xpm: Likewise. * etc/icons/wl-draft-up.xpm: Likewise. * etc/icons/wl-draft-yank-original-up.xpm: Likewise. * etc/icons/wl-exit-up.xpm: Likewise. * etc/icons/wl-folder-check-current-entity-up.xpm: Likewise. * etc/icons/wl-folder-empty-trash-up.xpm: Likewise. * etc/icons/wl-folder-goto-draft-folder-up.xpm: Likewise. * etc/icons/wl-folder-jump-to-current-entity-no-sync-up.xpm: Likewise. * etc/icons/wl-folder-jump-to-current-entity-up.xpm: Likewise. * etc/icons/wl-folder-next-entity-up.xpm: Likewise. * etc/icons/wl-folder-prev-entity-up.xpm: Likewise. * etc/icons/wl-folder-read-up.xpm: Likewise. * etc/icons/wl-folder-sync-current-entity-up.xpm: Likewise. * etc/icons/wl-folder-zoom-entity-up.xpm: Likewise. * etc/icons/wl-message-extract-content-up.xpm: Likewise. * etc/icons/wl-message-next-content-up.xpm: Likewise. * etc/icons/wl-message-play-content-up.xpm: Likewise. * etc/icons/wl-message-prev-content-up.xpm: Likewise. * etc/icons/wl-message-quit-up.xpm: Likewise. * etc/icons/wl-message-read-up.xpm: Likewise. * etc/icons/wl-summary-delete-up.xpm: Likewise. * etc/icons/wl-summary-dispose-up.xpm: Likewise. * etc/icons/wl-summary-exit-up.xpm: Likewise. * etc/icons/wl-summary-forward-up.xpm: Likewise. * etc/icons/wl-summary-jump-to-current-message-up.xpm: Likewise. * etc/icons/wl-summary-next-page-up.xpm: Likewise. * etc/icons/wl-summary-next-up.xpm: Likewise. * etc/icons/wl-summary-prev-page-up.xpm: Likewise. * etc/icons/wl-summary-prev-up.xpm: Likewise. * etc/icons/wl-summary-read-up.xpm: Likewise. * etc/icons/wl-summary-reply-up.xpm: Likewise. * etc/icons/wl-summary-reply-with-citation-up.xpm: Likewise. * etc/icons/wl-summary-set-flags-up.xpm: Likewise. * etc/icons/wl-summary-sync-force-update-up.xpm: Likewise. * etc/icons/wl-write-current-folder-up.xpm: Likewise. 2014-10-22 Kazuhiro Ito * doc/wl-ja.texi (Mailing List): Obey RFC 5538. * doc/wl.texi (Mailing List): Likewise. 2014-10-22 Kazuhiro Ito * doc/wl-ja.texi (mu, notmuch, grep): Sync with English document. 2014-10-22 Kazuhiro Ito * doc/wl.texi: Add coding cookie. (mu, notmuch, grep): Replace non-ascii character with ascii characters. Update node information. 2014-10-18 Erik Hetzner / Kazuhiro Ito Cf. https://github.com/wanderlust/wanderlust/pull/73 * doc/wl-ja.texi (Folder Manager, Mailing List): Fix for makeinfo. * doc/wl.texi (Folder Manager, Mailing List): Likewise. 2014-10-15 Erik Hetzner * doc/wl.texi (mu, notmuch): Add support for mu, notmuch search. 2014-03-29 Kazuhiro Ito * WL-MK (compile-wl-package, compile-wl-package-xmas): Set mime-situation-examples-file to nil. 2012-09-23 David Maus * README.md (See): Remove markdown link to INSTALL. 2012-09-09 David Maus * README.md (See): Fix reference to IMAP specs, add small section about development. * Makefile: Add EMACS_FLAGS environment variable. 2012-08-28 Felix E. Klee * README.md: New file. * README: Removed. 2012-08-19 David Maus * samples/en/dot.wl: Update mailing list address. * samples/ja/dot.wl: Dto. 2012-08-04 Kazuhiro Ito * WL-ELS (ELMO-MODULES): Do not include utf7.el when Emacs has utf-7-imap coding system. 2011-09-23 Kazuhiro Ito * doc/texinfo.tex, doc/txi-ja.tex: Replaced with 2010-05.22.17 modified version by Shoichi Fukusaka . 2011-09-12 Kazuhiro Ito * README: Update ML's address. * README.ja: Ditto * doc/wl.texi (Mailing List): Ditto. * doc/wl-ja.texi (Mailing List): Ditto. 2011-02-01 Tetsurou Okazaki * WL-MK (wl-scan-path): New function. (wl-scan-source): Use `wl-scan-path'. (wl-scan-icons): New function. (uninstall-wl-icons): Use `wl-scan-icons'. Check existence of `PIXMAPDIR'. 2010-07-19 TAKAHASHI Kaoru * INSTALL: Update recommended version of APEL. * INSTALL.ja: Ditto. 2010-07-11 David Maus * doc/wl.texi (Variables of Summary): Replace unicode character. 2010-04-29 Tetsurou Okazaki * WL-MK (uninstall-wl-icons): New function. Uninstall *.img files as well. (uninstall-wl-package): Use `uninstall-wl-icons'. 2010-03-03 TAKAHASHI Kaoru * etc/icons/unplugged.xpm: Change design. Use `unplugged' style instead of `prohibition sign' style. 2010-01-04 TAKAHASHI Kaoru * WL-MK (wl-scan-source, wl-uninstall) (compile-wl-package, install-wl-package) (compile-wl-package-xmas, install-wl-package-xmas) (wl-texinfo-format, wl-texinfo-install) : Use `mapc' instead of `mapcar'. Don't quote `lambda'. 2008-11-25 TAKAHASHI Kaoru * INSTALL: Updated recommended version of FLIM. * INSTALL.ja: Ditto. 2008-02-19 TAKAHASHI Kaoru * Makefile (clean-elc): Remove *.elx for compile-strict. 2008-02-17 TAKAHASHI Kaoru * INSTALL: Updated recommended version of APEL and FLIM. * INSTALL.ja: Updated recommended version of APEL and FLIM. 2008-02-15 TAKAHASHI Kaoru * WL-MK (wl-news-parse-news-subr): Use `string-to-number' instead of `string-to-int'. 2008-02-11 TAKAHASHI Kaoru * WL-MK: New backquote style. 2006-12-21 Hiroya Murata * WL-MK (config-wl-package-xmas): Use `install-get-default-package-directory'. 2005-11-04 Yoichi NAKAYAMA * README, README.ja: Update stable branch. Update information on viewcvs and cvs commit mail. 2005-09-17 Hiroya Murata * WL-ELS (ELMO-MODULES): Removed elmo-nmz. 2005-09-10 Hiroya Murata * WL-ELS (ELMO-MODULES): Added elmo-search. 2005-02-19 Yoichi NAKAYAMA * WL-MK (wl-news-search-regexp): Allow ".x" at the end of version number. 2005-02-18 Hiroya Murata * WL-ELS (ELMO-MODULES): Added elmo-signal. 2005-01-23 Hiroya Murata * Makefile (compile-strict): New target. * WL-MK (wl-examine-modules): New function. 2005-01-10 Hiroya Murata * etc/icons/access.xpm: New file. * WL-ELS (ELMO-MODULES): Added elmo-access and elmo-null. 2005-01-01 TAKAHASHI Kaoru * README, README.ja: Update stable branch. 2004-12-23 Katsumi Yamaoka * WL-MK (wl-texinfo-format-file): Revert. 2004-12-22 Katsumi Yamaoka * WL-MK (wl-texinfo-format-file): Bind undo-outer-limit. 2004-12-07 TAKAHASHI Kaoru * INSTALL, INSTALL.ja: Updated recommended version of FLIM to 1.14.7. 2004-11-23 Yuuichi Teranishi * WL-ELS (ELMO-MODULES): Added elsp-spamoracle. 2004-09-05 Yuuichi Teranishi * doc/TODO, doc/TODO.ja: Updated. 2004-08-21 Yoichi NAKAYAMA * WL-MK (install-wl-icons): Use install-files to set file mode. 2004-08-09 Yuuichi Teranishi * INSTALL, INSTALL.ja: Updated recommended version of APEL, FLIM and SEMI. 2004-05-08 Yoichi NAKAYAMA * WL-ELS (UTILS-MODULES): Undo last two changes. 2004-05-06 Yoichi NAKAYAMA * WL-ELS (UTILS-MODULES): Fix the last change, test mail/rfc2368. 2004-04-11 Yoichi NAKAYAMA * WL-ELS (UTILS-MODULES): If rfc2368 found, not to install it. 2004-02-12 Yuuichi Teranishi * etc/icons/wl-summary-set-flags-up.xpm: Re-draw. 2004-02-09 Yuuichi Teranishi * etc/icons/file.xpm: New file. * etc/icons/wl-summary-set-flags-up.xpm: Renamed from wl-summary-mark-as-important-up.xpm. * WL-ELS (ELMO-MODULES): Added elmo-file. 2004-01-18 TAKAHASHI Kaoru * WL-ELS (UTILS-MODULES): Add im-wl. (modules-alist): Remove im-wl conditional. 2004-01-11 Hiroya Murata * WL-ELS (ELMO-MODULES): Added elsp-bsfilter. 2004-01-11 Yuuichi Teranishi * WL-ELS (ELMO-MODULES): Added elsp-sa. 2003-11-09 Yuuichi Teranishi * WL-ELS (WL-MODULES): Added wl-batch. 2003-10-21 Hiroya Murata * WL-ELS (ELMO-MODULES): Added elsp-spamfilter only if spamfilter is installed. 2003-10-20 Hiroya Murata * WL-ELS (WL-MODULES): Added wl-spam. (ELMO-MODULES): Added elmo-spam and elsp-bogofilter. 2003-09-22 Yuuichi Teranishi * WL-ELS (ELMO-MODULES): Added modb-entity (again). 2003-09-21 Yuuichi Teranishi * WL-ELS (ELMO-MODULES): Removed modb-entity. 2003-09-19 Hiroya Murata * WL-ELS (ELMO-MODULES): Added modb-standard. 2003-09-18 Yuuichi Teranishi * WL-ELS (ELMO-MODULES): Removed elmo-mark and added elmo-flag. 2003-09-17 TAKAHASHI Kaoru * doc/.cvsignore: Added makeinfo stuff. 2003-09-15 Hiroya Murata * WL-ELS (ELMO-MODULES): Added `modb', `modb-entity' and `modb-legacy'. 2003-09-14 Hiroya Murata * WL-MK (update-version): Bind `coding-system-for-write' to iso-latin-1-unix. 2003-08-26 Tetsurou Okazaki * WL-MK (wl-texinfo-info-file, wl-texinfo-texi-file, wl-texinfo-check-newer): New functions. (wl-texinfo-install-file): Use `wl-texifo-info-file'. (wl-primary-info-file): Likewise. (wl-texinfo-format-file): Use `wl-texinfo-check-newer' and `wl-texinfo-texi-file'. Remove unused local variable `beg'. 2003-07-26 Hiroya Murata * doc/.cvsignore: New file. 2003-07-19 Hiroya Murata * etc/icons/wl-summary-dispose-up.xpm: New file. 2003-07-15 Yuuichi Teranishi * WL-ELS (WL-MODULES): Added wl-action. 2003-06-05 TAKAHASHI Kaoru * WL-MK: Remove comment out code. Fix indent. 2003-04-08 Yoichi NAKAYAMA * WL-MK: Nil for wl-info-lang means do nothing on info. 2003-02-05 Yoichi NAKAYAMA * WL-MK (make-wl-news): Replace "^(" by "\\\\(" to avoid font-lock confusion. 2003-01-17 TAKAHASHI Kaoru * WL-MK (test-wl): Added `make-wl-news'. (check-wl): Added (provide 'wl-news) before load wl-news.el.in. 2003-01-13 Yoichi NAKAYAMA * WL-MK (wl-info-lang): Skip "ja" for non-mule. (wl-news-lang): Ditto. 2002-12-28 TAKAHASHI Kaoru * WL-MK (test-wl, check-wl): Load wl-news.el.in. 2002-12-27 TAKAHASHI Kaoru * INSTALL, INSTALL.ja: Updated recommended version of FLIM to 1.14.5. 2002-12-21 Yoichi NAKAYAMA * WL-MK (make-wl-news): Don't add wl-news-lang setting into wl-news.el here. 2002-12-20 Kenichi OKADA * WL-MK (make-wl-news): Fix coding system. 2002-12-20 Kenichi OKADA * WL-MK (wl-news-parse-news-subr): Decide coding-system. 2002-12-20 Kenichi OKADA * WL-MK (wl-news-lang): New variable. (wl-news-news-file): Merge `wl-news-news-file' and `wl-news-news-file-ja'. (wl-news-search-regexp): New variable. (wl-news-news-file): New function. (wl-news-parse-news): Merge `wl-news-parse-news' and `wl-news-parse-news-ja'. (wl-news-parse-news-subr): New function. 2002-12-20 Kenichi OKADA * WL-CFG (wl-news-lang): New variable. 2002-12-20 Kenichi OKADA * WL-MK (make-wl-news): New function. (wl-news-parse-news): New function. (wl-news-parse-news-ja): New function. (compile-wl-package): Do `make-wl-news'. (wl-news-news-file): New variable. (wl-news-news-file-ja): New variable. (wl-news-filename: New variable. 2002-12-11 Yuuichi Teranishi * 2.10.0 - "Venus" 2002-11-15 TAKAHASHI Kaoru * INSTALL, INSTALL.ja: Update Recommended combination of MIME module package. 2002-10-27 TAKAHASHI Kaoru * README, README.ja: Update stable branch. 2002-10-24 TAKAHASHI Kaoru * INSTALL, INSTALL.ja: Update Recommended combination of MIME module package. 2002-10-02 Yoichi NAKAYAMA * doc/wl-refcard.tex: Fix * doc/wl-refcard-ja.tex: New file 2002-09-30 Koichiro Ohba * etc/icons/wl-folder-goto-draft-folder-up.xpm: Add missing comma. 2002-07-12 Yuuichi Teranishi * WL-ELS (ELMO-MODULES): Added elmo-split. 2002-06-22 Yoichi NAKAYAMA * WL-MK (wl-texinfo-format): Move condition for INFODIR into wl-detect-info-directory. (wl-detect-info-directory): Check INFODIR after WL-CFG is loaded. 2002-06-17 Yuuichi Teranishi * WL-MK (wl-texinfo-install-file): Overwrite existing info. 2002-06-16 Katsumi Yamaoka * WL-MK (install-wl-icons): Simplified the messaging form. 2002-03-11 Yuuichi Teranishi * etc/icons/wl-folder-goto-draft-folder-up.xpm: Modified. * etc/icons/wl-draft-save-and-exit-up.xpm: Ditto. 2002-03-09 Yoichi NAKAYAMA * etc/icons/wl-folder-goto-draft-folder-up.xpm: New file. 2002-03-08 Yoichi NAKAYAMA * etc/icons/wl-draft-save-and-exit-up.xpm: New file. 2002-03-06 Yoichi NAKAYAMA * etc/icons/wl-write-current-folder-up.xpm: New file. 2002-02-20 Yoichi NAKAYAMA * README, README.ja: Add information of the Mailing List in English. 2001-12-26 Yuuichi Teranishi * NEWS, NEWS.ja: Added description about `elmo-enable-disconnected-operation'; Added description about "$" mark. * WL-MK (update-version): New function. * Makefile (update-version): Added. 2001-12-18 Yuuichi Teranishi * samples/ja/dot.wl,samples/en/dot.wl (my-wl-summary-subject-func-ml): Ignore error. 2001-12-16 TAKAHASHI Kaoru * WL-MK (config-wl-package-subr): Added APEL version check. Changed check order; APEL, FLIM, SEMI. 2001-12-15 TAKAHASHI Kaoru * INSTALL, INSTALL.ja: Added System Requirements. * README, README.ja: Removed System Requirements. * NEWS, NEWS.ja: Added description about X-Face utility support. Added description about 'sendlog. * WL-MK (toplevel): Use = instead of `eq' for numeric value. (config-wl-package-subr, config-wl-package-xmas): Removed last period from error messages. 2001-12-12 Yuuichi Teranishi * NEWS, NEWS.ja: Changed order. 2001-12-12 Katsumi Yamaoka * WL-MK (install-wl-icons): Install *.img files for Emacs 21. 2001-12-11 Yuuichi Teranishi * NEWS.ja: Added description about xxx-directory, elmo-cache-dirname. 2001-12-11 Katsumi Yamaoka * WL-MK (config-wl-package-subr): Don't set `wl-icon-dir'. 2001-12-11 Yuuichi Teranishi * NEWS.ja: Fixed indent; Added description about obsolete variable warnings and `elmo-obsolete-variable-show-warnings'. 2001-12-11 Katsumi Yamaoka * WL-MK (install-wl-icons): Don't install *.img files for Emacs 21. 2001-12-11 Katsumi Yamaoka * WL-MK (config-wl-pixmap-dir): Set a value to `PIXMAPDIR' even if Emacs version is less than 21. (install-wl-icons): Install icon files which might be used for the running version of Emacs. * etc/icons/*.xbm: Replaced "-" with "_" to make them can be handled by Emacs 21. 2001-12-10 Katsumi Yamaoka * etc/icons/wl-alpha-logo.img: New file. * etc/icons/wl-alpha-xmas-logo.img: New file. * etc/icons/wl-beta-logo.img: New file. * etc/icons/wl-beta-xmas-logo.img: New file. * etc/icons/wl-stable-logo.img: New file. * etc/icons/wl-stable-xmas-logo.img: New file. 2001-12-10 Katsumi Yamaoka * etc/icons/wl-alpha-xmas-logo.xbm: New file. * etc/icons/wl-beta-xmas-logo.xbm: New file. * etc/icons/wl-stable-xmas-logo.xbm: New file. 2001-12-07 Katsumi Yamaoka * etc/icons/wl-alpha-xmas-logo.xpm: New file. * etc/icons/wl-beta-xmas-logo.xpm: New file. * etc/icons/wl-stable-xmas-logo.xpm: New file. 2001-12-02 Yoichi NAKAYAMA * doc/wl-refcard.tex: New file. 2001-12-02 Kenichi OKADA * WL-ELS (ELMO-MODULES): Added 'elmo-sendlog' 2001-10-23 Yoichi NAKAYAMA * WL-MK (wl-info-lang): Change default value to ("ja" "en"). * WL-CFG: Ditto. * INSTALL: Remove note on how to install English manual. 2001-10-01 Yuuichi Teranishi * NEWS.ja: Added ACAP description. 2001-09-04 TAKAHASHI Kaoru * WL-MK (toplevel): Ignore Nemacs. (compile-wl-package, wl-detect-info-directory): Ditto. * WL-MK (config-wl-package-subr): Fixed error message. Ignore tm. Add refer to INSTALL and INSTALL.ja. * WL-ELS (toplevel): Likewise. * WL-MK (test-wl, check-wl): Add docstring. 2001-09-03 TAKAHASHI Kaoru * INSTALL.ja (Sample configration file): Added comment ~/.addresses was optional. * INSTALL: Ditto. 2001-08-30 Yuuichi Teranishi * WL-MK (test-wl): Renamed from check-wl. (check-wl): New function. * Makefile (check): Don't use `-q -no-site-file'. (BATCHFLAG): New variable. (check): Use it. (test): New rule. 2001-08-29 Yuuichi Teranishi * WL-ELS (WL-MODULES): Added wl-acap. 2001-08-28 Katsumi Yamaoka * WL-MK: Byte-optimize the function `char-after' for old Emacsen. 2001-08-28 TAKAHASHI Kaoru * Makefile (check): New rule * WL-MK (check-wl): New function. * tests: New directory. * tests/ChangeLog: New file. * utils/ChangeLog: New file. 2001-08-28 Yuuichi Teranishi * WL-ELS (ELMO-MODULES): Added `acap' and `slp'. 2001-08-21 Yuuichi Teranishi * WL-CFG: Removed nemacs setting example. * WL-MK (config-wl-package-subr): Ignore nemacs. * WL-ELS: Ignore tm and nemacs. (WL-MODULES): Added wl-addrmgr. 2001-07-12 Yuuichi Teranishi * WL-MK (config-wl-package-subr): Check smtp.el version. 2001-05-24 Yoichi NAKAYAMA * WL-MK (wl-detect-info-directory): Call `info-initialize' for Emacs21. 2001-05-22 Hiroya Murata * utils/bbdb-wl.el (bbdb-wl-get-update-record): Use function `wl-summary-buffer-folder-name' instead of same name variable. 2001-05-08 Kenichi OKADA * utils/bbdb-wl.el (bbdb-wl-folder-regexp): New variable. (bbdb-wl-get-update-record): Use `bbdb-wl-folder-regexp'. 2001-04-16 Yuuichi Teranishi * utils/bbdb-wl.el (bbdb-wl-get-update-record): Use `with-current-buffer'. 2001-04-04 Yuuichi Teranishi * WL-ELS (ELMO-MODULES): Removed shimbun related modules; Add elmo-shimbun only if shimbun is installed. 2001-04-03 Yuuichi Teranishi * WL-ELS (ELMO-MODULES): Added sb-tcup. 2001-04-02 Yuuichi Teranishi * utils/bbdb-wl.el: Applied patch from Hiroya Murata for bbdb 2.33 (X-Mail-Count: 07190, 07195 in the ML); Added workaround for older version of bbdb. * WL-ELS (ELMO-MODULES): Added shimbun related modules. 2001-02-06 Yuuichi Teranishi * WL-ELS (ELMO-MODULES): Added elmo-mark. 2001-01-30 Yuuichi Teranishi * etc/icons/nmz.xpm: New file. * WL-ELS (ELMO-MODULES): Added elmo-nmz. 2000-12-18 Yuuichi Teranishi * WL-ELS (ELMO-MODULES): Changed order. Added mmimap, elmo, elmo-mime. Removed mmelmo-imap4, mmelmo. 2001-02-01 Yuuichi Teranishi * 2.4.1 - "Stand By Me" 2001-01-30 Yuuichi Teranishi * utils/bbdb-wl.el (toplevel): Require 'bbdb at toplevel. (Advised by YAMASHITA Junji ) 2001-01-23 YAMASHITA Junji * utils/bbdb-wl.el (toplevel): commented out dummy function. (bbdb-wl-extract-field-value-internal): Renamed from `bbdb-extract-field-value-internal'. (toplevel): Fixed load order of bbdb-hooks.el for recent bbdb. 2001-01-22 YAMASHITA Junji * utils/bbdb-wl.el (bbdb-wl-get-petname): New function. 2001-01-16 Yuuichi Teranishi * samples/en/dot.wl (wl-template-alist): file-bottom -> bottom-file. (Pointed out by Tsuyoshi Kitamoto ) * samples/ja/dot.wl (wl-template-alist): Ditto. 2001-01-23 TAKAHASHI Kaoru * utils/ptexinfmt.el: Support @letterpaper and @afivepaper. 2000-12-30 TAKAHASHI Kaoru * WL-MK (config-wl-package-subr): Don't try load `WL-ELS.el'. And permit `WL-CFG.el' override for committer. * WL-MK (toplevel): `file-executable-p' check use `if' instead of `or'. 2000-11-20 Kenichi OKADA * WL-ELS: Remove sasl. * WL-CFG: Ditto. 2000-11-20 Kenichi OKADA * WL-MK: Remove sasl. 2000-11-20 Kenichi OKADA * utils/sasl: Remove. 2000-11-20 Kenichi OKADA * utils/sasl/sasl.el: sync up to flim-1_14. * utils/sasl/sasl-cram.el: New file. * utils/sasl/sasl-digest.el: New file. * utils/sasl/digest-md5.el: Delete. 2000-11-30 Yuuichi Teranishi * 2.4.0 - "Rio" 2000-10-31 Tetsuo Tsukamoto * WL-MK: Require "backquote" before dealing with the custom issue. 2000-10-31 TAKAHASHI Kaoru * utils/ptexinfmt.el (texinfo-format-direntry): Fixed broken direntry generate probrem. (Advised by Tetsuo Tsukamoto ) * utils/bbdb-wl.el (toplevel): Fixed copyright notice. * utils/rfc2368.el (toplevel): Ditto. 2000-10-30 TAKAHASHI Kaoru * utils/ptexinfmt.el (ptexinfmt-disable-broken-notice-flag): Renamed from `ptexinfmt-disable-broken-notice'. 2000-10-27 TAKAHASHI Kaoru * utils/ptexinfmt.el (texinfo-format-printindex): Mule for Windows detection fixed. 2000-10-25 TAKAHASHI Kaoru * Makefile (mostlyclean-dvi, clean-dvi): New target. (mostlyclean, distclean, maintainer-clean): New target. (clean): Use mostlyclean target. * doc/texinfo.tex, doc/txi-en.tex, doc/txi-ja.tex: New file imported. 2000-10-22 TAKAHASHI Kaoru * Makefile (clean-info, mostlyclean-info): New target. (clean-elc): Added `wl/*~'. 2000-10-20 TAKAHASHI Kaoru * INSTALL (Installation): Add notify for tm-8 with old APEL user. * INSTALL.ja: Ditto. * etc/VERSION: New file. 2000-10-20 Yuuichi Teranishi * WL-MK (config-wl-package-subr): Changed message. * WL-ELS: Abolished FLIM 1.12 support. Notify tm-8 requires APEL 10.2 or later. 2000-10-18 Yuuichi Teranishi * etc/icons/wl-logo.xbm: Removed. * etc/icons/wl-logo.xpm: Ditto. * etc/icons/wl-stable-logo.xbm: New file. * etc/icons/wl-stable-logo.xpm: Ditto. * etc/icons/wl-beta-logo.xbm: Ditto. * etc/icons/wl-beta-logo.xpm: Ditto. 2000-10-17 Katsumi Yamaoka * WL-MK: Since `bytecomp' is not provided in Nemacs, use `load' instead of `require' for it. 2000-10-13 Katsumi Yamaoka * WL-MK: (byte-compile-file-form-custom-declare-variable): Define function if bytecomp doesn't have it; warn if "new custom" isn't detected; don't require `backquote' because it's always autoloaded. 2000-10-10 TAKAHASHI Kaoru * WL-ELS (WL-MODULES): Added `wl-version'. (ELMO-MODULES): Added `elmo-version'. 2000-10-03 Katsumi Yamaoka * WL-MK: Set `recursive-load-depth-limit' to nil. It is currently needed to byte-compile with Emacs 21. FIXME! 2000-10-02 Katsumi Yamaoka * Makefile (PIXMAPDIR): New variable. (elc, install-elc, uninstall-elc, package, install-package): Use it. * WL-MK (config-wl-pixmap-dir): New function. (config-wl-package, config-wl-package-xmas): Use it. (install-wl-icons): New function. (install-wl-package, install-wl-package-xmas): Use it. (uninstall-wl-package): Uninstall icons as well. 2000-09-27 TAKAHASHI Kaoru * utils/ptexinfmt.el (texinfo-multitable-widths): Fix broken-facility probrem when use multitable unsupported texinfmt.el. 2000-09-26 TAKAHASHI Kaoru * utils/ptexinfmt.el (texinfo-format-printindex): Use (featurep 'meadow) instead of `texinfmt-version'. 2000-09-22 TAKAHASHI Kaoru * utils/ptexinfmt.el (texinfo-format-printindex): Add broken-facility check, for Mule for Windows. (texinfo-format-printindex): New function. 2000-09-18 Katsumi Yamaoka * etc/icons/letter.xpm, etc/icons/no-letter.xpm: New files. 2000-09-15 TAKAHASHI Kaoru * utils/ptexinfmt.el (texinfo-multitable-widths): Add broken-facility check. (texinfo-multitable-item): Use it, when broken-facility check. 2000-09-14 Katsumi Yamaoka * doc/wl.texi, doc/wl-ja.texi: Replace `wl-highlight-group-folder-by-numbers' with `wl-highlight-folder-by-numbers'; add description about `wl-highlight-folder-by-numbers'; update for Emacs 21. * WL-ELS (WL-MODULES): Add `wl-e21'. 2000-08-31 TAKAHASHI Kaoru * utils/ptexinfmt.el (texinfo-multitable-widths, texinfo-multitable-item): Apply char-width probrem fix patch (by KOIE Hidetaka ). Newsgroups: fj.editor.emacs Message-ID: <5dzom3nxq7.fsf@skipjack.koie.org> * utils/ptexinfmt.el (ptexinfmt-disable-broken-notice): New variable. 2000-08-29 Yuuichi Teranishi * doc/TODO.ja: Updated. 2000-08-23 Yuuichi Teranishi * WL-ELS (ELMO-MODULES): Added elmo-net. 2000-07-28 TAKAHASHI Kaoru * utils/ptexinfmt.el: Disable broken check notice. * utils/ptexinfmt.el (texinfo-format-uref): Fixed. 2000-07-20 TAKAHASHI Kaoru * utils/ptexinfmt.el: Support @multitable. (texinfo-multitable, texinfo-end-multitable, texinfo-multitable-widths, texinfo-multitable-extract-row, texinfo-multitable-item): New function. 2000-07-18 TAKAHASHI Kaoru * utils/ptexinfmt.el: Use fmakunbound, when broken-function replace. 2000-07-17 Yuuichi Teranishi * WL-ELS: Deleted time-stamp line. 2000-07-16 TAKAHASHI Kaoru * utils/ptexinfmt.el: Support @image. Fix broken @uref. (texinfo-format-image): New function. (texinfo-format-uref): Fixed 2times parse probrem. 2000-07-14 TAKAHASHI Kaoru * WL-MK (wl-texinfo-format-file): require ptexinfmt. * utils/ptexinfmt.el: provide feature. (documentlanguage, documentencoding): Fixed probrem. 2000-07-13 TAKAHASHI Kaoru * utils/ptexinfmt.el: New file. 2000-07-09 TAKAHASHI Kaoru * README: Remove CVS keyword. * README.ja: Ditto. * INSTALL: Ditto. * INSTALL.ja: Ditto. * doc/wl.texi: Ditto. * doc/wl-ja.texi: Ditto. 2000-06-28 TAKAHASHI Kaoru * README: CVS keyword instaed of time-stamp. * README.ja: Ditto. * INSTALL: Ditto. * INSTALL.ja: Ditto. * doc/wl.texi: Ditto. * doc/wl-ja.texi: Ditto. 2000-06-15 Yuuichi Teranishi * WL-ELS (ELMO-MODULES): Added `pldap'. 2000-06-12 Yasushi ABE * utils/bbdb-wl.el (bbdb-extract-field-value): Decode with multibyte-buffer. 2000-05-15 Katsumi Yamaoka * etc/icons/wl-logo.xpm: Reduced color. 2000-05-10 Yuuichi Teranishi * 1.1.1 - "Purple Rain" 2000-05-09 Yuuichi Teranishi * NEWS.ja: Added description about progress gauge. * NEWS: Ditto. 2000-04-10 Yuuichi Teranishi * NEWS.ja: Added description about CVS. * NEWS: Ditto. 2000-04-07 Yuuichi Teranishi * README.ja (CVS): New section. * README (CVS): Ditto. 2000-03-30 Yuuichi Teranishi * wl/ChangeLog: New file. * elmo/ChangeLog: New file. * etc/ChangeLog.1.ja: Renamed from etc/ChangeLog.alpha.ja. * etc/ChangeLog.2: Renamed from etc/ChangeLog.beta. * etc/ChangeLog.2.ja: Renamed from etc/ChangeLog.beta.ja. * etc/ChangeLog.3: Renamed from ChangeLog. * etc/ChangeLog.3.ja: Renamed from ChangeLog.ja. * WL-MK (WLDIR): Changed to "./wl". (ICONDIR): New variable. (config-wl-package-subr): set wl-icon-dir as ICONDIR. (compile-wl-package-xmas): refer WLDIR. * README.ja: Renamed from 00README.ja. * README: Renamed from 00README. * wl: New directory. All wl-related files are moved to this directory. wanderlust-wanderlust-769699d/INSTALL000066400000000000000000000100051406661363500174320ustar00rootroot00000000000000 How to install Wanderlust Kaoru Takahashi, Yuuichi Teranishi, Tsunehiko Baba System Requirements =================== Wanderlust supports following Emacsen: Emacs 24.5 or later Before installing Wanderlust, please install the following MIME modules. SEMI-EPG FLIM-LB Wanderlust and MIME modules require APEL-LB. Before installing MIME modules, please install APEL-LB. Install MIME Module =================== You can download these packages from following URLs. APEL-LB: https://github.com/wanderlust/apel FLIM-LB: https://github.com/wanderlust/flim SEMI-EPG: https://github.com/wanderlust/semi Please install APEL-LB, FLIM-LB, and SEMI-EPG, in that order. Generally, 'make install' will do the job. To get full information, please refer to the README.en within each package. You have to re-install Wanderlust if you upgraded APEL-LB, FLIM-LB, or SEMI-EPG. Check Environment ================= Before going to the next step, we recommend you to run tests by % make check or % make EMACS=xemacs check to check running environment including the version of APEL, FLIM, and SEMI. Note that even if you have installed new APEL/FLIM/SEMI, old ones in load-path may cause trouble. To find duplicated files in the load-path, M-x list-load-path-shadows will help you. Installation ============ (a) Edit Makefile, WL-CFG Edit EMACS, LISPDIR, and so on in Makefile. EMACS Emacs command name. LISPDIR site-lisp directory. If LISPDIR is not specified (or NONE by default), it is automatically detected. Edit WL-CFG if you need. You can specify language for INFO, etc. (b) Bytecompile and Install Please do following. % make % make install If you use Emacs without subdirs.el, the following error message occasionally appears. Cannot open load file: mime-setup In this case, add directories of custom, APEL, FLIM, SEMI to EMACSLOADPATH (environment variable), or add those directories to load-path in WL-CFG. Install as a XEmacs package =========================== Wanderlust is able to be installed as one of XEmacs (21.0 or later) packages. After installation as a XEmacs package, you do not need configurations of autoload, icon path in your own .emacs file. (a) Edit Makefile, WL-CFG Edit XEMACS, PACKAGEDIR, and so on in Makefile. XEMACS XEmacs command name. PACKAGEDIR package directory. If PACKAGEDIR is not specified (NONE by default) and the SEMI modules have been installed, it is automatically detected. Edit WL-CFG if you need. You can specify language for INFO, etc. (b) Bytecompile and Install Please do following. % make package % make install-package Install with Info file. load-path ========= If you are using Emacs 20.3 or later, or XEmacs, there is no need to set load-path. If you are using Emacs 20.2 or earlier, please add the directory of Wanderlust to load-path. If you install by default setting, with Emacs 19.29 or later, Emacs 20.1, or Emacs 20.2, you can write subdirs.el for example: -------------------------------------------------------------------- (normal-top-level-add-to-load-path '("apel" "flim" "semi" "wl")) -------------------------------------------------------------------- Manual ====== Manual is described in Info format. Please do following. % make info % make install-info If you install Wanderlust as a XEmacs package, Info file is already installed too, so there are no need of these commands. Manual directory is automatically detected. Of course, it can be configured by INFODIR in Makefile. Sample configuration file ========================= Wanderlust requires the following three configuration files: ~/.wl Wanderlust Configuration (loaded at startup) ~/.folders Folder Book ~/.addresses Address Book (optional) Each sample file (dot.addresses, dot.folders, dot.wl) exists on samples/en/ directory. Please refer to them. To get full information, please read Info file. Local Variables: fill-column: 72 End: wanderlust-wanderlust-769699d/INSTALL.ja000066400000000000000000000132441406661363500200330ustar00rootroot00000000000000 Wanderlust のインストール方法 Kaoru Takahashi 高橋郁, Yuuichi Teranishi 寺西裕一, Tsunehiko Baba 馬場恒彦 必要条件 ======== Wanderlust がサポートする Emacsen を以下に示します。 Emacs 24.5 以降 Wanderlust を使うためには、以下に示すMIME用モジュールをインストールし ておく必要があります。 SEMI-EPG FLIM-LB Wanderlust および MIME用モジュールを使うためには APEL-LB をインストールし ておく必要があります。 MIME用モジュールのインストール ============================== パッケージはそれぞれ以下の URL で入手可能です。 APEL-LB: https://github.com/wanderlust/apel FLIM-LB: https://github.com/wanderlust/flim SEMI-EPG: https://github.com/wanderlust/semi APEL-LB, FLIM-LB, SEMI-EPG の順にインストールしてください。基本的にすべて make install の実行で済むはずです。 詳しいインストールの方法は各パッケージに添付されているドキュメント (README.ja, README.en) を参照してください。 APEL-LB, FLIM-LB, SEMI-EPG のバージョンアップを行った場合は、 Wanderlust をインストールし直してください。 環境の確認 ========== Wanderlust のインストールの前に環境の確認をすることを推奨します。 % make check または % make EMACS=xemacs check で APEL, FLIM, SEMI のチェックを含んだ環境テストが行えます。 新しい APEL, FLIM, SEMI がインストールされていても、load-path 上に古い ものが残っている場合にはトラブルの原因となります。load-path 上で重複し たファイルを探すには M-x list-load-path-shadows が便利です。 通常のインストール ================== (a)Makefile, WL-CFG の編集 Makefile は、EMACS, LISPDIR の部分を編集してください。 EMACS 使用している Emacs のコマンド名を指定 LISPDIR インストール先を指定 LISPDIR は特に指定しなくても (NONE のままでも) 自動的にインストール 先を検出します。 必要なら WL-CFG を編集してください。 INFO の言語の指定などができます。 (b)バイトコンパイル・インストール 以下を実行してください。 % make % make install このとき、subdirs.el のない Emacs では、 Cannot open load file: mime-setup というエラーが出ることがあります。 この場合は、custom, APEL, FLIM, SEMI のインストール先を環境変数 EMACSLOADPATH に加えるか、展開ディレクトリの WL-CFG というファイル中 で load-path を通しておくとよいでしょう。 XEmacs のパッケージとしてインストール ===================================== Wanderlust は XEmacs (21.0 以降) のパッケージのひとつとしてインストー ルすることも可能です。パッケージとしてインストールすると、autoload の設定、アイコンのパス設定を個人の .emacs に記述しなくても Wanderlust を正常に起動できるようになります。 (a)Makefile, WL-CFG の編集 Makefile は、XEMACS, PACKAGEDIR の部分を編集してください。 XEMACS 使用している XEmacs のコマンド名を指定 PACKAGEDIR package のディレクトリを指定 PACKAGEDIR は特に指定しなくても (NONE のままでも)、SEMI がインストー ルされていれば自動的に検出されます。 必要なら WL-CFG を編集してください。 INFO の言語の指定などができます。 (b)バイトコンパイル・インストール 以下を実行してください。 % make package % make install-package Info ファイルも同時にインストールされます。 load-path の設定 ================ Emacs 20.3 以降もしくは XEmacs を使って普通にインストールした場合は、 load-path を設定する必要はありません。 Emacs 20.2 以前をお使いなら、Wanderlust を install した場所を load-path に設定してください。 もし Emacs 19.29 以降または Emacs 20.1, Emacs 20.2 を使って初期設定 でインストールしたのなら、次のように subdirs.el を書くことができます。 -------------------------------------------------------------------- (normal-top-level-add-to-load-path '("apel" "flim" "semi" "wl")) -------------------------------------------------------------------- マニュアルのインストール ======================== マニュアルは Info 形式です。インストールするには以下のことを実行して ください。 % make info % make install-info XEmacs の package としてインストールした場合は自動的に Info ファイル もインストールされるのでこれらの操作は必要ありません。 マニュアルのインストール先は自動検出されます。(Makefile 中の INFODIR でも設定可能です) サンプル設定 ============ Wanderlust の設定ファイルには、 ~/.wl Wanderlust の設定 (起動時に読み込まれる) ~/.folders フォルダ設定 ~/.addresses アドレス帳 (無くても起動できる) の三つがあります。 それぞれ、samples/ja/ ディレクトリの下にサンプル設定 (dot.addresses, dot.folders, dot.wl) がありますので、 各自でホームディレクトリにコピーして編集するなどしてください。 詳しい設定は Info を御覧ください。 Local Variables: fill-column: 72 End: wanderlust-wanderlust-769699d/Makefile000066400000000000000000000062721406661363500200540ustar00rootroot00000000000000# # Please specify your Emacs here. # EMACS = emacs # To install Wanderlust for XEmacs 21 or later, # running 'make install-package' is recommended. # 'make install-package' refers $XEMACS instead of $EMACS. XEMACS = xemacs # # Target directory to install the Wanderlust package. # (Automatically detected if this line is unchanged.) # LISPDIR = NONE #LISPDIR = /usr/local/lib/mule/site-lisp INFODIR = NONE #INFODIR = /usr/local/share/info # For XEmacs package. PACKAGEDIR = NONE # For XEmacs or Emacs 21: directory where icon files should go. PIXMAPDIR = NONE ################# No need to modify following lines #################### BATCHFLAG = -batch FLAGS = $(BATCHFLAG) -q -no-site-file $(EMACS_FLAGS) elc: $(EMACS) $(FLAGS) -l WL-MK -f compile-wl-package \ $(LISPDIR) $(PIXMAPDIR) check: $(EMACS) $(BATCHFLAG) -l WL-MK -f check-wl \ $(LISPDIR) $(PIXMAPDIR) test: $(EMACS) $(FLAGS) -l WL-MK -f test-wl \ $(LISPDIR) $(PIXMAPDIR) update-version: $(EMACS) $(FLAGS) -l WL-MK -f update-version \ $(LISPDIR) $(PIXMAPDIR) compile-strict: clean-elc @args="$(FLAGS)";\ args="$$args -L elmo -L wl";\ echo "=============================================";\ echo "Compiling the 1st stage-----without elc files";\ echo "=============================================";\ for i in `$(EMACS) $(FLAGS) -l WL-MK -f wl-examine-modules 2>/dev/null`;\ do\ j=`echo $$i| sed 's/elc$$/el/g'`;\ echo "$(EMACS) ARGS -f batch-byte-compile $$j";\ $(EMACS) $$args -f batch-byte-compile $$j;\ mv $$i $$j"x";\ done;\ for i in `echo elmo/*.elx wl/*.elx utils/*.elx`; do\ j=`echo $$i| sed 's/elx$$/elc/g'`;\ mv $$i $$j;\ done;\ echo "==============================================";\ echo "Compiling the 2nd stage-----with all elc files";\ echo "==============================================";\ for i in `$(EMACS) $(FLAGS) -l WL-MK -f wl-examine-modules 2>/dev/null`;\ do\ j=`echo $$i| sed 's/elc$$/el/g'`;\ echo "$(EMACS) ARGS -f batch-byte-compile $$j";\ $(EMACS) $$args -f batch-byte-compile $$j;\ done install-elc: $(EMACS) $(FLAGS) -l WL-MK -f install-wl-package \ $(LISPDIR) $(PIXMAPDIR) uninstall-elc: $(EMACS) $(FLAGS) -l WL-MK -f uninstall-wl-package \ $(LISPDIR) $(PIXMAPDIR) clean-elc: rm -f wl/*.elc wl/*~ wl/auto-autoloads.el wl/custom-load.el \ wl/wl-news.el elmo/*.elc utils/*.elc \ wl/*.elx elmo/*.elx utils/*.elx package: $(XEMACS) $(FLAGS) -l WL-MK -f compile-wl-package-xmas \ $(PACKAGEDIR) $(PIXMAPDIR) install-package: $(XEMACS) $(FLAGS) -l WL-MK -f install-wl-package-xmas \ $(PACKAGEDIR) $(PIXMAPDIR) info: $(EMACS) $(FLAGS) -l WL-MK -f wl-texinfo-format $(INFODIR) install-info: $(EMACS) $(FLAGS) -l WL-MK -f install-wl-info $(INFODIR) mostlyclean-info: rm -f doc/*~ doc/*.cp doc/*.fn doc/*.ky doc/*.pg doc/*.tp doc/*.vr \ doc/*.cps doc/*.fns doc/*.kys doc/*.pgs doc/*.tps doc/*.vrs clean-info: mostlyclean-info rm -f doc/*.info doc/*.info-* mostlyclean-dvi: rm -f doc/*~ doc/*.aux doc/*.log doc/*.toc clean-dvi: mostlyclean-dvi rm -f doc/*.dvi all: elc install: install-elc uninstall: uninstall-elc mostlyclean: clean-elc mostlyclean-info mostlyclean-dvi clean: mostlyclean clean-dvi distclean: maintainer-clean maintainer-clean: clean clean-info wanderlust-wanderlust-769699d/NEWS000066400000000000000000000724621406661363500171170ustar00rootroot00000000000000Wanderlust NEWS -- User-visible changes in Wanderlust. * Changes in 2.16.0 from 2.14.x ** This is not official release, developed by volunteers at github. ( https://github.com/wanderlust ) ** Addresses of mailing lists have been changed. ** Added new type of folders: rss folder ** Fix accidental loss of messages related with moving in offline. After messages were moved in offline state and you became online, some operations possibly made messages lost. Such messages will be moved into elmo-lost+found-folder folder (default is "+lost+found"). ** Use built-in GnuTLS or tls.el for SSL/TLS connection if available. ** Use jit-lock-mode for real-time draft highlighting. Using idle-timer is also supported. ** Use utf-7-imap coding system for IMAP4 if available. In this case, the default value of elmo-imap4-use-modified-utf7 is `t' and utf7.el is not installed. ** Searching via wl-summary-pick and so on by `body' searches only decoded text parts if possible. If you need old `body' search, search by `raw-body'. ** Added support for sending mail with sendmail package ** Prevent accidental loss of messages when renaming IMAP folder ** Put spam mark on the message registered as spam. ** Remove spam mark from the message registered as non-spam. ** Added support for ESEARCH feature (RFC4731). ** New option `elmo-imap4-set-seen-flag-explicitly'. ** Fixed copying new messsages via pipe folder. ** Multiple condition can be indicated for summary sorting. Indicate multiple condition separated by ",". ** Analyze network folder name more strictly. ** Optimize refiling. Interpret filter, pipe and multi folder and select the most suitable method. ** Speed up bsfilter processing. ** Speed up handling of maildir folder. ** Use IMAP4 non-synchronizing literals (RFC 2088) if it is available. ** Open following thread when you put mark on message in summary buffer. ** Add new command wl-summary-display-raw. ** Use EasyPG (http://www.easypg.org) if it is available. ** A folder type `namazu' is abolished. New folder type `search' is added instead. Not only namazu but also external search programs (grep, mu and notmuch) are supported. ** Fixed against overwriting existing messages in archive folders. There was a bug on appending messages. * Changes in 2.14.1 from 2.14.0 Version 2.14.1 is a bug fix version of 2.14.0. ** Fixed message order of Maildir. ** Icon for the access folder is displayed. * Changes in 2.14.0 from 2.12.2 ** New folder type `access' is added. In `access' folder, sub-folders of the specified folder can be treated as one folder. ** Synchronization speed of the folder is improved. The function which calculates list diff is re-wrote and is faster than previous implementation, especially in the folders with large number of the messages. ** New event handling mechanism is incorporated. ** Improved the disconnected operations for IMAP draft saving. There was a bug of message numbering in the disconnected imap draft. It is fixed using new event handling mechanism. ** `Shimbun' summary buffers are updated dynamically. Some shimbun folder does not have correct information. In this version, they are corrected using the message body after retrieval. It is implemented with new event handling mechanism. ** Many bug fixes. * Changes in 2.12.1 from 2.12.0 Version 2.12.1 is a bug fix version of 2.12.0. ** Now Maildir is usable on Windows systems. Note that it does not conform to the Maildir standard. ** Fixed the problem of the cache flag inconsistency on the filter folder etc. There was a problem that the summary buffer displays cached messages as uncached in some folders. ** Fixed the bug that the new flag cannot be changed in some cases. ** Fixed the bug that flag are not taken over correctly from Maildir. Only the flag of the first message was taken over in earlier versions. ** Fixed the problem in display module for IMAP messages. Now partially fetched messages are displayed correctly. If a message included child messages, their headers were not displayed. ** Fixed the problem that %INBOX is not appeared as a subfolder of %INBOX. In cyrus-imapd, this problem occurred. ** Now user defined flags are appeared in the completions for search conditions. ** Fixed the problem that a wrong flag folders are created by some flag names. If a flag contains a character other than [a-z], the problem occurred. ** Now expansion of the access group "@/" works correctly. ** Fixed the problem to cause an error on automatic draft saving. ** Fixed the problem to cause an error on invoking address manager. A message which includes a string "To:" etc. caused an error. ** Fixed the problem in the flag inheritance function of the filter folder. ** New option `wl-summary-resend-use-cache'. You can resend messages using cache in the offline status. ** New option `elmo-network-session-idle-timeout'. Network sessions which are not used longer than this value (in seconds) are thrown away and new session is created. ** Improved redisplay functions for "H" and "M" key. MIME structure and buffer is reused for redisplay. ** Now attributes for netnews are displayed in the draft preview. * Changes in 2.12.0 from 2.10.1 ** The structure of the message database is improved. Following setting is to convert legacy msgdb to the new one when you select a folder. (setq elmo-msgdb-default-type 'standard elmo-msgdb-convert-type 'auto) (which is initial setting.) ** The temporary mark and corresponding action is now customizable. By default, following mark-and-actions are defined. mark-and-actions which are defined as before. "o" refile (same as before) "O" copy (same as before) "d" dispose (formerly delete, 'D' mark. Messages are moved to wl-trash-folder. Its behavior is decided by wl-dispose-folder-alist.) New mark-and-actions which are newly introduced. "D" delete (remove message immediately) "i" prefetch (prefetch message) "~" resend (resend message) Press 'x' to execute actions which corresponds to the mark. mark-and-actions can be define by the new variable, 'wl-summary-mark-action-list'. See its docstring for more in detail. ** SPAM filter module is added. Following spam filter libraries are supported. bogofilter spamfilter bsfilter SpamAssassin SpamOracle Regular Expressions Header Matching ** 'mark folder is renamed to 'flag folder. Related to this, original message location is displayed as help-echo on summary line in the 'flag folder (you can control the behavior by wl-highlight-summary-line-help-echo-alist). ** Now you can put arbitrary user defined flag on message. You can specify its flag by "F" in the summary mode. ** New marks, 'A' and 'a' are added for answered messages. Now answered messages have its own mark in the summary mode. 'A' is displayed for uncached messages and 'a' is for cached messages. ** New mark,s 'F' and 'f' are added for forwarded messages. Now forwarded messages have its own mark in the summary mode. 'F' is displayed for uncached messages and 'f' is for cached messages. ** New search condition 'Flag' (Status of the message) is added. There are flags 'unread', 'important', 'answered', 'digest' (unread or important) and 'any' (any of the flag). For example, following filter folder contains only unread or important messages in the %inbox folder. /flag:digest/%inbox ** Draft save function is improved. Now you can set wl-draft-folder to IMAP folder, Maildir folder, and so on. ** Automatically save draft buffers by using idle-timer. You can control behavior by the variable `wl-auto-save-drafts-interval'. ** 'H' key(display all header) and 'M' key(display without MIME analysis) are now toggle key. Now you can cite messages displayed by 'M'. ** Now you can sort summary lines into descending order. ** Abbreviate too long header extended to lines in message buffer. ** Persistent mark string in summary buffer is changed. Default setting indicates cached state by its upper/lower case. ** It displays draft preview on sending confirmation. ** Sending parameters are displayed on draft preview. See description of the variable wl-draft-preview-attribute for detail. ** You can run biff with idle-timer by setting wl-biff-use-idle-timer. ** Now wl-draft-kill confirms with yes-or-no-p. ** Summary thread will be divided if its depth is larger than certain amount. The limit is controlled by the variable wl-summary-max-thread-depth. ** Emacs multi-tty support is supported. (http://lorentey.hu/project/emacs.html) ** New sort spec 'size' is added in the summary mode. Now you can sort the summary by message size. ** The variable wl-refile-policy-alist is abolished. ** Batch processing module is added. ** In the multi-folder, status of messages are synchronized with original folder. For example, unread status of '+inbox' is updated to '*+inbox,+outbox'. ** The function wl-summary-resend-message is abolished. you can put mark for resending by wl-summary-resend instead. ** Variables renamed wl-delete-folder-alist is renamed to wl-dispose-folder-alist. ** POP3 folder existence check is simplified (by default). The default value for elmo-pop3-exists-exactly is changed to nil. ** POP3 response code extension defined in the RFC2449 is supported. If a login failure occurred because of user's another POP3 session, entered password is not cleared and used in the future login. ** IMAP4 commands EXPUNGE and CHECK are now send asynchronously. ** Default value of wl-folder-hierarchy-access-folders has been changed. ** Access group "@/" of shimbun folders can be used now. ** Show contents of NEWS(.ja) when you start Wanderlust newer than the one you used previously. ** Default values of wl-draft-reply-*-list are changed. See samples/en/dot.wl for old values. ** wl-draft-reply-myself-*-list are abolished and integrated into wl-draft-reply-*-list. ** You can control initial cursor position for replying draft. Set variable wl-draft-reply-default-position appropriately. ** Changed the way to specify configuration of draft buffer window. You can choose keep, full or split as values of wl-draft-buffer-style and wl-draft-reply-buffer-style. ** Commands to verify/decrypt non-MIME PGP message are added. C-c:v, C-c:d in message buffer to verify or decrypt respectively. ** New hooks wl-draft-reply-hook wl-summary-reply-hook wl-draft-forward-hook wl-summary-forward-hook wl-draft-kill-pre-hook wl-summary-resend-hook ** Abolished hook wl-reply-hook ** New face wl-highlight-summary-disposed-face wl-highlight-summary-prefetch-face wl-highlight-summary-resend-face wl-highlight-summary-answered-face wl-highlight-action-argument-face ** Abolished face wl-highlight-refile-destination-face (renamed to wl-highlight-action-argument-face) * Changes in 2.10.1 from 2.10.0 Version 2.10.1 is a bug fix version of 2.10.0. ** Fixed the problem that msgdb be destroyed when print-length or print-level has Non-nil value. ** wl-summary-pack-number in pipe folder is disabled temporarily since it didn't work. Invoke it in destination folder instead. ** Fixed a problem that wl-folder-move-cur-folder doesn't work. ** Fixed a problem that wl-draft-reedit doesn't work properly on Meadow. ** Fixed a problem that wl-summary-pack-number doesn't work on Maildir and shimbun folders. ** Fixed a problem that cache file is not protected even if it is marked as important. ** Fixed a problem that %# in wl-summary-line-format cannot handle large number. ** Fixed a problem to remove password even if SMTP AUTH failed at non-auth phase. ** Default value of wl-message-buffer-prefetch-folder-type-list, wl-message-buffer-prefetch-idle-time, and wl-message-buffer-prefetch-depth are changed. ** Fixed to compile on XEmacs without mule feature. * Changes in 2.10.0 from 2.8.1 ** You can alter the format of summary lines. Specify format by wl-summary-line-format. If you want to change ones according to folder names, use wl-folder-summary-line-format-alist. ** Save format for the draft folder has been changed. Messages are encoded before saved by wl-draft-save. ** elmo-split is newly established. It provides a way to split messages according to some rule a la procmail. ** Buffer prefetch works fine now. Messages of the number specified by wl-message-buffer-prefetch-depth are loaded into buffer in advance. ** elmo-dop-queue-flush flushes queue that concerns plugged folder. ** Starting Wanderlust on the new frame is possible now. Set as (autoload 'wl-other-frame "wl" "Wanderlust on new frame." t) ** In Folder mode, you can go into virtual folder which consists of messages with some specified condition (wl-folder-virtual). It is binded to "V". ** In Folder mode, you can search folders containing messages with some specified condition (wl-folder-pick). It is binded to "?". ** Now you can rename access group folders. ** You can specify ON/OFF of thread view for newly created summary. Set wl-summary-default-view, wl-summary-default-view-alist. ** Temporary marks are kept when you exit from sticky summary by q or g. ** Key bindings concerning the sticky summary have been changed. By C-u g, the sticky summary is destroyed as well as C-u q. In summary or folder mode, G opens the sticky summary. ** You can go round summary buffers by C-cC-n and C-cC-p. ** Members of the list wl-folder-hierarchy-access-folders is now some REGEXP for access group names instead of exact group names. ** In header part of the draft buffer C-a brings cursor to the beginning of the line or the beginning of the header body. ** You can send encapsulated blind carbon copies. Its default field name is "Ecc:". ** C-c C-y (Draft) can cite region of the message. It affects if transient-mark-mode (Emacs) or zmacs-regions (XEmacs) is Non-nil and the region is active. ** You can delete a part from multipart message. It is binded as "D" in message buffer. ** You can easily configure server settings to post news article. Set wl-nntp-posting-config-alist appropriately. See Info for an example. ** You can specify some function in wl-draft-reply-with-argument-list etc. for setting the recipients in draft by the return value of it. ** The interface of the function wl-draft has been changed. The initial set of headers are handed as an association list. ** The uses of wl-generate-mailer-string-function has been changed. Specify a function which returns some string to appear in User-Agent header. ** The Reference Card (doc/wl-refcard.tex) describes important key bindings. ** Many bug fixes. * Changes in 2.8.0 from 2.6.1 ** Nemacs, Mule 2.3 based on Emacs 19.28 are not supported any longer. ** Wanderlust might not work with FLIM 1.14.2 and older. It is recommended to use FLIM 1.14.3 or newer and associated SEMI. ** Now available `make check' environment test for user. ** If you set obsolete variables (e.g. renamed ones) in .wl etc, Wanderlust shows warning messages and urge you to change settings. Change your settings according to the messages, please. If you want to suppress warnings, set elmo-obsolete-variable-show-warnings to nil. ** Added new internal folders: 'sendlog folder ** Added new type of folders: shimbun folder Format: '@' 'virtual server name' '.' 'group name' ** Added new type of folders: namazu folder Format: '[' 'search condition' ']' [ 'absolute path of namazu index' ] ** With pipe folder, now you can preserve messages on the server. At the next time you access it, only new messages will be copied. Format: '|' 'source folder' '|:' 'destination folder' ** Address manager is now available (start by C-c C-a). You can edit address book and import recipients to draft from it. ** ACAP (RFC2244) is supported(experimental). ** Now you can preserve IMAP4 message by part as a cache. If you skipped enormous part, you can read other than skipped part when you are off line. ** Wanderlust also creates message view through prefetching. Displaying of prefetched messages speeded up because of this. ** Truncation of lines in message buffer or draft buffer is now controllable. Non-nil value of wl-message-truncate-lines or wl-draft-truncate-lines means truncating long lines at window width. ** Bitmap image for opening demo is removed from wl-demo.elc and now loaded from wl-icon-directory. Special logo is displayed through the Christmas season :) ** Overall elmo module is rewritten. ** Variables depending on elmo backends are renamed to "elmo-backend-*". e.g. elmo-default-imap4-server is renamed to elmo-imap4-default-server. ** Variables named xxx-func are renamed to xxx-function. ** X-Face utility 1.3.6.12 or older is not supported any longer. Please install X-Face utility 1.3.6.13 or later, if necessary. ** Wanderlust distinguishes stream-type on plugged mode. They are treated as different entries. ** msgdb path for archive and multi folders are changed. No problem for running wanderlust even if you do not deal with them. But if you don't want to leave useless data on the disk, delete under .elmo/multi and .elmo/archive in advance. ** Variables named xxx-dir are renamed to xxx-directory. e.g. wl-icon-dir is renamed to wl-icon-directory. Take attention if you set for display of startup logo, etc. ** elmo-cache-dirname is abolished and elmo-cache-directory is newly created. You can put cache directory to another place by setting elmo-cache-directory. ** Default value of elmo-enable-disconnected-operation is now `t'. When the relevant messages are cached, you can do some operations even in the off-line state. ** Now messages with "$" mark is not remained in the summary buffer when the actual message itself is deleted. Please visit the 'mark folder to review the messages with the "$" mark. * Changes in 2.6.1 from 2.6.0 Version 2.6.1 is basically a bug fix version of 2.6.0. ** Fixed a problem that Emacs 21 causes `Recursive load...' error. ** Fixed a problem that thread character is broken in XEmacs 21.1. ** Fixed a problem that in IMAP4 folder, progress bar is remained in XEmacs . ** Fixed a problem that searching is failed for the header fields that begins with X-. ** Some other fixes. * Changes in 2.6.0 from 2.4.1 ** FLIM 1.13.x is not supported any longer. Please install FLIM 1.14.1 or later. ** Now folder and summary buffer can be opened in a separate frame. If `wl-folder-use-frame' is set as t, `M-x wl' creates a new frame for folder mode. If `wl-summary-use-frame' is set as t, new frames are created for each summary window. ** Cursor moving speed ('N' or 'P' in summary) is greatly improved. ** Folder checking speed for filter folder of localdir folder using `last' or `first' (Ex. /last:100/+inbox) is improved. ** Retrieval progress of each message is displayed in POP and IMAP folder. ** Coloring of summary buffer is processed on demand (only on Emacs). If `wl-summary-lazy-highlight' is non-nil, only visible portion of the buffer is colored. ** Customizable biff notify. New hook `wl-biff-notify-hook' and `wl-biff-unnotify-hook' is now available. e.g. (add-hook wl-biff-notify-hook 'ding) ** Many bug fixes. * Changes in 2.4.1 from 2.4.0 Version 2.4.1 is basically a bug fix version of 2.4.0. ** Wanderlust 2.4.1 now works on FLIM 1.14.x. ** Fixed a problem that POP connection remains after POP before SMTP. ** The specification of IMAP4 authentication method for clear password is changed. In 2.4.0, To use clear password authentication method in IMAP4 (Logging in with LOGIN command), you have to set the variable `elmo-default-imap4-authenticate-type' as 'plain (or nil). But in 2.4.1, it is changed to 'clear (or nil). Example: (setq elmo-default-imap4-authenticate-type 'plain) should be changed to (setq elmo-default-imap4-authenticate-type 'clear) * Changes in 2.4.0 from 1.1.1 ** Version Number The version numbering convention for Wanderlust is changed. In earlier versions, 1.x were stable version and from 2.0.x to 2.2.x were beta version. But since version 2.3.0, the second (minor) version number implies the stability of the Wanderlust. Even minor number corresponds to a stable version, and an odd minor number corresponds to a development version. This version numbering is based on the widespread convention of open source development. On the open CVS server cvs.m17n.org, main trunk contains the current beta (newest experimental) version, and branches contain the stable version. (If the version is 2.4.x, the branch name is wl-2_4) ** Install *** FLIM 1.12 is not supported anymore. See the file INSTALL for details. *** APEL 10.2 or later is required. tm-8 users should check the version of APEL (tm-8.8 contains old APEL). ** New feature *** LDAP support Complete e-mail address in draft by searching LDAP server. If the variable wl-use-ldap is non-nil, LDAP feature is enabled (Initial setting is nil). *** UIDL support in POP3 folder POP3 folder now saves the status of summary and it improves summary update speed. If the variable elmo-pop3-use-uidl is non-nil, UIDL is used (Initial setting is t). *** Emacs 21 support Wanderlust has started on supporting Standard Emacs 21. Toolbars and icon images can be shown in almost Wanderlust frames like XEmacs. *** biff feature Server mailbox is checked periodically. If new mail is arrived, Wanderlust changes the biff (icon) on the modeline and updates folder mode content. *** expire-hide Now expire mechanism has new feature `hide', it does not remove messages actually from folder but hides messages from summary. It improves processing speed for large folders. *** Message thread restoring feature Automatic correction of broken threads by subject matching is now available. Thread modification by hand (M-w (copy) and C-y (paste) in summary mode) is also available. *** Password expiration timer Password cache expires after elmo-passwd-life-time is passed. (nil means no expiration. Initial setting is nil) *** killed-list Deleted messages in the NNTP folder are saved to `killed-list'. The messages in the killed-list are treated as if it were not exist on the server. Non-nil value for elmo-use-killed-list enables this feature (Initial setting is t). By this feature, NNTP pipe folder works correctly. *** Maildir pack is now available M-x wl-summary-pack-number in the summary mode of Maildir folder re-numbers the messages. ** Searching *** Complex condition can be specified for filter folder AND condition, OR condition, NOT condition, and their combination can be specified. Syntax of the condition part is changed. See Info for details. Caution for those who upgrade from 1.1.1: By this change, saving directory for the msgdb of filter folder is altered. Former msgdbs are not needed anymore. It does not cause any problem but if you don't want to keep useless disk, you should remove files under the directory '.elmo/filter/' beforehand. *** Searching of the NNTP folder is available Now you can make NNTP filter folder. (If only your NNTP server responds to XHDR command.) *** Pick, Virtual in summary mode now accepts complex condition. You can set AND condition and OR condition by typing 'AND' or 'OR' instead of field name. ** Session, Authentication *** elmo-default-*-authenticate-type only accepts symbol(used be a string) Example: (setq elmo-default-imap4-authenticate-type "cram-md5") should be changed to (setq elmo-default-imap4-authenticate-type 'cram-md5) *** stream-type can be defined. You can define stream type by elmo-network-{imap4-,pop3-,nntp-,}stream-type-alist. Some SSL related variables are abolished(renamed). You can access to the networked folders (IMAP4, NNTP, POP3) via SOCKS if you specify the folder name end with "!socks". ** Draft *** group-list is now available You can specify address like 'Group: foo@gohome.org, bar@gohome.org;'. If wl-draft-remove-group-list-contents is non-nil, the contents of group-list is removed before sending. *** The draft preview displays recipient addresses on minibuffer You can confirm the group-list recipients by this. *** Initial setting considers Reply-To:. Default setting of wl-draft-reply-without-argument-list considers Reply-To: field (Set to To: field). *** Replying rules for the messages sent from yourself. You can define replying rules for the messages sent from yourself by setting wl-draft-reply-myself-with-argument-list and wl-draft-reply-myself-without-argument-list. *** Full name is used in the reply address. If wl-draft-reply-use-address-with-full-name is non-nil, then full name is inserted in with e-mail addresses on the replied message (Initial setting is t). *** In-Reply-To: format is changed. In-Reply-To: format is changed to simple one. It is based on draft-ietf-drums-msg-fmt-09.txt. ** misc *** Message thread processing is improved. *** Renamed variables wl-refile-guess-func-list => wl-refile-guess-functions wl-summary-temp-above => wl-summary-target-above *** You can set function to wl-fcc. You can change fcc folder name dynamically. For example, change folder name by month. *** elmo-search-mime-charset is abolished. Charset is guessed from the string you typed. *** Useless headers are removed when you forward the message. You can specify removed headers by wl-ignored-forwarded-headers. *** wl-highlight-group-folder-by-numbers is abolished. It is renamed to wl-highlight-folder-by-numbers and has following meaning. `t' : Whole line is colored by message number. `nil' : Whole line is colored by folder status. Number (ex. `1') : Line is colored by message number and folder status. *** Header visibility control is changed. Header visibility is controlled by Wanderlust (was controlled by SEMI). You can change header visibility by wl-message-ignored-field-list and wl-message-visible-field-list. *** DEMO is changed. Less colors are used by DEMO pixmap. Emacsen on character based terminal also display suitable DEMO. * Changes in 1.1.1 from 1.1.0 Version 1.1.1 is a bug fix version of 1.1.0 with minor user-visible changes. ** Development on the CVS server is started. ** Flush operation and sending queues if Wanderlust is started in plugged status. ** Directory structure is changed. *** 00README, 00README.ja is renamed to README, README.ja. *** All wl-* files are moved to the directory 'wl'. ** Syntax of wl-refile-rule-alist is extended (compatible with older one). ** progress gauge Progress gauge is displayed while processing in the Emacsen with progress gauge feature. * Changes in 1.1.0 from 1.0.3 ** Install *** tm7 is not supported anymore. see the file INSTALL for details. *** WL_PREFIX and ELMO_PREFIX default as "wl" (defvar WL_PREFIX "wl") (defvar ELMO_PREFIX "wl") e.g. install directory is 1.0.3 /usr/local/share/emacs/site-lisp/ 1.1.0 /usr/local/share/emacs/site-lisp/wl/ *** Change default macro in Makefile. EMACS = emacs XEMACS = xemacs use $(XEMACS), `package' and `install-package' target. *** Install not only *.elc, but also *.el. *** English document (wl.texi). ** New feature *** Modified UTF7 support. Now international mailbox name can be used in IMAP4 in the Emacsen with unicode feature. *** Scoring support. *** New plugged system. *** IMAP4 support became more generic. Many IMAP4 servers are supported. *** New authentication type IMAP4: CRAM-MD5, DIGEST-MD5, STARTTLS POP3: CRAM-MD5, DIGEST-MD5, SCRAM-MD5, STARTTLS NNTP: STARTTLS SMTP: STARTTLS *** New folder type | Pipe Folder Incorporate message. . Maildir Folder Now Maildir is one of the folder type. 'cache Cache Folder View internal cache. *** Message buffer cache Next message is prefetched while idle time. *** Sticky summary is enhanced. Now message buffer is also sticky. You can specify always-sticky summary. ** misc *** Eliminated wl-draft-prepared-config-alist unified with wl-draft-config-alist. *** POP-before-SMTP variables are re-arranged. *** Ask non-existing folder. When FCC: contains new folder. When auto-refile specified new folder. *** Change fetch threshold and confirm settings. wl-prefetch-confirm-threshold, wl-cache-fetch-threshold. *** Can use petname for completion. *** Change Message-ID generator. *** wl-demo.el support bitmap-mule. *** Allow function type `smtp-server' value. *** Make sendlog when `wl-draft-sendlog' is non-nil. *** `wl-summary-incorporate-marks' *** Reserve prefetching while off-line status. *** Draft use new frame when `wl-draft-use-frame' is non-nil. *** New variable `wl-user-mail-address-list' . *** New variable `wl-local-domain' for set FQDN. *** Server side unread status is used in IMAP4 folder. *** Change defaults wl-mime-charset iso-2022-jp => x-ctext wl-summary-move-order 'new => 'unread wl-tmp-dir TMPDIR => ~/tmp/ *** New hooks wl-draft-send-hook wl-draft-reedit-hook wl-mime-edit-preview-message-hook wl-folder-suspend-hook wl-summary-toggle-disp-folder-message-resumed-hook wl-summary-line-inserted-hook wl-thread-update-children-number-hook mmelmo-header-inserted-hook mmelmo-entity-content-inserted-hook *** New function wl-save wl-summary-write wl-summary-supersedes-message wl-fldmgr-delete wl-refile-guess-by-msgid wl-address-user-mail-address-p wl-summary-jump-to-msg-by-message-id-via-nntp wl-summary-temp-mark-pick * For details of changes, see the file ChangeLog. Local variables: mode: outline paragraph-separate: "[ ]*$" end: wanderlust-wanderlust-769699d/NEWS.ja000066400000000000000000001170731406661363500175060ustar00rootroot00000000000000Wanderlust NEWS (日本語版) -- User-visible changes in Wanderlust. * 2.14.x から 2.16.0 への変更点 ** このリリースは公式のものではありません。有志により、github の リポジトリで開発されているものです。 ( https://github.com/wanderlust ) ** メーリングリストのアドレスが変更されました。 ** 新規フォルダ rss フォルダが追加されました。 ** オフライン時にメッセージの移動を行った後にオンラインになった際に、 操作によっては意図せずにメッセージが失われる事があるのを修正しまし た。この条件に当てはまったメッセージは、elmo-lost+found-folder (デ フォルトでは"+lost+found") に収納されます。 ** SSL/TLS 接続に、組み込み GnuTLS や tls.el を使用するようになりました。 ** ドラフトバッファのハイライトに jit-lock-mode を使用するようになりました。 idle-timer を使用したハイライトもサポートされています。 ** IMAP4で、使用できる場合は utf-7-imap コーディングシステムを使用します。 この時、elmo-imap4-use-modified-utf7 のデフォルト値は t になり、 utf7.el はインストールされません。 ** wl-summary-pick 等で `body' に対して検索をかけると、テキストパート に対してデコードを行ってから検索するようになりました。従来通りの検 索は `raw-body' に対して検索を行ってください。 ** sendmail パッケージによるメール送信がサポートされました。 ** IMAP フォルダの改名時にメッセージが失われる事があるバグを修正しました。 ** spam として登録したメッセージに spam マークを付けます。 ** non-spam として登録したメッセージから spam マークを取り除きます。 ** ESEARCH (RFC4731) がサポートされました。 ** 新規オプション elmo-imap4-set-seen-flag-explicitly が追加されました。 ** pipe でのコピーで新規メッセージが取り込めなくなるバグが修正されました。 ** サマリのソート順に複数の条件を指定出来るようになりました。 "," 区切りで条件を並べて下さい。 ** ネットワークフォルダ名の解析を厳密に行うようになりました。 ** リファイル処理の最適化 filter, pipe, multi フォルダを解釈し、最適な方法を選択します。 ** bsfilter 処理の高速化 ** maildir フォルダの処理の高速化 ** IMAP4 非同期リテラル(RFC 2088)に対応 ** サマリバッファでメッセージにマークをつけた時にスレッドを開きます。 ** wl-summary-display-raw が追加されました。 ** EasyPG (http://www.easypg.org) が利用可能であれば使います。 ** namazu フォルダは機能を拡張した search フォルダに置き換えられました。 namazu 以外の外部プログラム (grep, mu, notmuch) を使った検索が出来 るようになりました。 ** archive フォルダの既存のメッセージを上書きしてしまう問題が修正されました。 メッセージを追加する処理にバグが存在していました。 * 2.14.0 から 2.14.1 への変更点 2.14.1 は、2.14.0 のバグ修正版です。 ** Maildir で表示順序が正しくないバグが修正されました。 ** アクセスフォルダのアイコンが表示されます。 * 2.12.2 から 2.14.0 への変更点 ** 新しいフォルダ型 access フォルダが追加されました。 指定されたフォルダの配下のサブフォルダを仮想的に一つのフォルダとして扱え るようにするフォルダです。 ** フォルダのアップデートが高速化されました。 リストの差分を計算する関数が書き直され、特に多くのメッセージを含むフォ ルダでの動作が高速になりました。 ** 新しいイベントハンドリング機能が追加されました。 ** ドラフトフォルダに IMAP フォルダを指定している場合の不具合が改善されました。 オフライン状態でドラフトを保存するときの挙動にバグがありましたが、新しい イベントハンドリング機能を用いて修正されました。 ** `Shimbun' のサマリが動的に更新されます。 いくつかの shimbun フォルダは、サマリの情報が正しくありません。 このバージョンから、メッセージを取りよせたときの情報を用いてサマリが 自動的に修正されるようになりました。この実装には、新しいイベントハンド リング機能が用いられています。 ** その他多くのバグ修正。 * 2.12.0 から 2.12.1 への変更点 2.12.1 は、2.12.0 のバグ修正版です。 ** Windows で Maildir が使えるようになりました。 ただし、規格に則っていませんので、UNIX 上の Maildir と互換性がありません。 ** フィルタフォルダ等でのキャッシュマーク不整合の不具合が解消されました。 キャッシュされてもキャッシュされていない表示となる場合がありましたが 修正されました。 ** フラグが新規のまま変更されなくなる場合があるバグの修正。 ** Maildir で複数メッセージ移動時、フラグが正しく引き継がれないバグの修正。 最初のメッセージしかフラグが引き継がれませんでしたが、修正されました。 ** 入れ子になったメッセージの IMAP による表示時の不具合が解消されました。 入れ子になったメッセージをパートフェッチした場合、ヘッダが表示されない 場合がありましたが、正しく表示されるようになりました。 ** %INBOX のサブフォルダに %INBOX 自体が含まれない場合がある問題に対処しました。 cyrus-imapd で、当該の問題が出ていましたが修正されました。 ** フラグが、検索時等の補完候補として現れるようになりました。 ** Folder mode でアクセスグループ "@/" の展開が正しく動作します。 ** フラグ名によっては間違ったフラグフォルダが作成される問題が修正されました。 フラグに [a-z]以外の文字を使ったときの問題に対処しました。 ** ドラフトの自動保存時にエラーになってしまう問題が修正されました。 ** アドレスマネージャを起動した際にエラーになる問題が修正されました。 本文に To: 等の文字列があるとエラーが発生していましたが、修正されました。 ** フィルタフォルダからのコピー等でフラグが保存されない問題が修正されました。 ** 新規オプション wl-summary-resend-use-cache が追加されました。 オフライン状態でもキャッシュを用いた再送(resend)ができます。 ** 新規オプション elmo-network-session-idle-timeout が追加されました。 指定した時間以上アイドル状態となったセッションを再利用しません。 ** 'H' や 'M' でのメッセージ再表示が効率化されました。 再表示時に MIME の構造、バッファを再利用するようになりました。 ** ドラフトのプレビュー時に表示される属性表示が netnews に対応しました。 * 2.10.1 から 2.12.0 への変更点 ** メッセージデータベースの構造が改善されました。 以下の設定をすれば、フォルダ選択時に自動的に旧来のタイプの msgdb を 新しいタイプのものに変換します。 (setq elmo-msgdb-default-type 'standard elmo-msgdb-convert-type 'auto) 初期値は、上記の通りとなっています。 ** 一時マークと、それに対するアクションを自由に定義できるようになりました。 デフォルトでは以下のマークとアクションを定義しています。 従来から引き継がれたマークとアクション "o" refile (従来のリファイルと同じ) "O" copy (従来のコピーと同じ) "d" dispose (旧 delete, D マーク。wl-trash-folder に移動。 wl-dispose-folder-alist の値により挙動が決まる。) 新たに追加されたマークとアクション "D" delete (いきなり消去) "i" prefetch (プリフェッチ) "~" resend (再送) サマリで x キーを押すとマークに対応したアクションがすべて実行されます。 マークとアクションは、新規変数 wl-summary-mark-action-list によって定義 できます。詳しくは同変数の docstring を参照してください。 ** スパムフィルタモジュールが新たに追加されました。 以下のスパムフィルタに対応しています。 bogofilter spamfilter bsfilter SpamAssassin SpamOracle 正規表現によるヘッダ検査 ** 'mark フォルダは改名され、'flag フォルダになりました。 これに関連して、'flag フォルダのサマリで元メッセージがどこにあるかを help-echo として表示するようになりました(これのふるまいは wl-highlight-summary-line-help-echo-alist で制御できます)。 ** メッセージに対して任意のユーザ定義のフラグを付けられるようになりました。 サマリにおいて "F" でフラグの指定ができます。 ** 返信済みマーク A,a が追加されました。 サマリにおいて、返信したメッセージに A マーク(キャッシュなしの場合) もしくは a マーク(キャッシュありの場合) が表示されます。 ** 転送済みマーク F,f が追加されました。 サマリにおいて、転送したメッセージに F マーク(キャッシュなしの場合) もしくは f マーク(キャッシュありの場合) が表示されます。 ** フォルダの検索条件に、'フラグ' (メッセージの状態) が追加されました。 フラグには、unread(未読), important(重要), answered(返信済み), digest (未読または重要), any (未読または重要または返信済み)があります。 例えば、次のフィルタフォルダは、%inbox のうち、未読または重要な メッセージのみが出現します。 /flag:digest/%inbox ** ドラフトの保存機能が改善されました。 IMAP フォルダや、Maildir フォルダを wl-draft-folder に指定できるように なりました。 ** idle-timer を利用してドラフトバッファの自動保存を実行します。 変数 `wl-auto-save-drafts-interval' で挙動を変えられます。 ** 'H' キー(ヘッダ全表示) および 'M' キー(MIMEなし表示)がトグルになりました。 また、'M' で表示したメッセージを引用できるようになりました。 ** non-MIME PGP メッセージの検証、復号化のためのコマンドが追加されました。 メッセージバッファにおいて C-c:v, C-c:d でそれぞれ検証、復号化します。 ** サマリを並べ替え条件の逆順でソートできるようになりました。 ** メッセージバッファで複数行にわたる長いヘッダを省略表示します。 ** サマリバッファの永続マークの文字列が変更されました。 デフォルトの設定ではキャッシュの有無を大文字小文字で示します。 ** 送信確認の際にドラフトのプレビューを表示するようになりました。 ** ドラフトのプレビューの際に送信パラメータを表示するようになりました。 詳しくは変数 wl-draft-preview-attributes の説明を見て下さい。 ** wl-biff-use-idle-timer を設定すると biff が idle-timer で走ります。 ** wl-draft-kill は yes-or-no-p で確認を求めるようになりました。 ** サマリで一定以上深いスレッドは分割されます。 変数 wl-summary-max-thread-depth で限界を変更できます。 ** Emacs multi-tty support に対応しました。 (http://lorentey.hu/project/emacs.html) ** サマリの並べ替え条件に 'size' が追加されました。 メッセージサイズによるサマリの並べ替えが可能になりました。 ** 変数 wl-refile-policy-alist は廃止されました。 ** バッチ処理用のモジュールが新たに追加されました。 ** マルチフォルダとオリジナルフォルダの状態が同期されるようになりました。 例えば、+inbox の未読情報が、*+inbox,+outbox にも反映されます。 ** 関数 wl-summary-resend-message は廃止されました。 その代わりに wl-summary-resend を使えば再送マークを付けることができます。 ** 変数 wl-delete-folder-alist は wl-dispose-folder-alist に 名前が変更されました。 ** POP3 フォルダの存在チェックのデフォルト挙動を簡略化 elmo-pop3-exists-exactly のデフォルト値を nil にしました。 ** RFC2449 の POP3 拡張のレスポンスコードに対応しました。 他のセッションが使用中であるために認証に失敗したときには、パスワード がクリアされなくなりました。 ** IMAP4 において、EXPUNGE, CHECK コマンドを非同期で送信するようにしました。 ** wl-folder-hierarchy-access-folders の初期値が変更されました。 ** 新聞フォルダのアクセスグループ "@/" が使えるようになりました。 ** 前に使っていたものより新しい Wanderlust を起動すると NEWS(.ja) の内容を 表示します。 ** wl-draft-reply-*-list の初期値が変更されました。 以前の設定は、samples/ja/dot.wl を参照して下さい。 ** wl-draft-reply-myself-*-list は廃止され、wl-draft-reply-*-list に統合 されました。 ** 返信用ドラフトのカーソルの初期位置を指定できます。 変数 wl-draft-reply-default-position を設定して下さい。 ** ドラフトバッファウィンドウの配置の指定の仕方が変更されました。 wl-draft-buffer-style と wl-draft-reply-buffer-style に keep,full,split のいずれかを指定します。 ** 新規 hook wl-draft-reply-hook wl-summary-reply-hook wl-draft-forward-hook wl-summary-forward-hook wl-draft-kill-pre-hook wl-summary-resend-hook ** 廃止された hook wl-reply-hook ** 新規 face wl-highlight-summary-disposed-face wl-highlight-summary-prefetch-face wl-highlight-summary-resend-face wl-highlight-summary-answered-face wl-highlight-action-argument-face ** 廃止された face wl-highlight-refile-destination-face (wl-highlight-action-argument-face に変名) * 2.10.0 から 2.10.1 への変更点 2.10.1 は 2.10.0 のバグ修正版です。 ** print-length や print-level が Non-nil のときに msgdb が壊れる問題が 修正されました。 ** パイプフォルダにおいて wl-summary-pack-number がうまく動かなかった ため効かなくしてあります。必要であれば取り込み先フォルダの方で実行 して下さい。 ** wl-folder-move-cur-folder が効いていなかった問題が修正されました。 ** Meadow 上で wl-draft-reedit がうまく動かない問題が修正されました。 ** wl-summary-pack-number が Maildir や shimbun フォルダで動かない 問題が修正されました。 ** 重要マークつきメッセージのキャッシュに対する保護機能が働かない 不具合が修正されました。 ** wl-summary-line-format の %# で大きな数値を正しく扱えない不具合 が修正されました。 ** SMTP AUTH で認証以外のエラーでもパスワード消去される不具合が修 正されました。 ** wl-message-buffer-prefetch-folder-type-list, wl-message-buffer-prefetch-idle-time, wl-message-buffer-prefetch-depth のデフォルト値が変更されました。 ** XEmacs without mule でコンパイルできない問題が修正されました。 * 2.8.1 から 2.10.0 への変更点 ** サマリ行の表示形式を変更できるようになりました。 wl-summary-line-format で書式を設定できます。フォルダ毎に書式を変えたい 場合は wl-folder-summary-line-format-alist を用いて下さい。 ** ドラフトフォルダへの保存形式が変更されました。wl-draft-save の際には エンコードして保存されます。 ** elmo-split が新設されました。与えたルールに沿って procmail 風にメッセ ージを振り分けることができます。 ** バッファプリフェッチが実装されました。wl-message-buffer-prefetch-depth の数だけ、メッセージをバッファに先読みします。 ** elmo-dop-queue-flush は繋がっているポートに関するキューを flush します。 ** 新しいフレームを開いて Wanderlust を起動できるようになりました。 (autoload 'wl-other-frame "wl" "Wanderlust on new frame." t) のように設定して下さい。 ** フォルダモードから、与えられた条件を満たすメッセージからなる仮想フォルダ へ移動できます (wl-folder-virtual)。"V" にバインドされています。 ** フォルダモードで、与えられた条件を満たすメッセージを含むフォルダを探せる ようになりました (wl-folder-pick)。"?" にバインドされています。 ** アクセスグループフォルダの改名が出来るようになりました。 ** 新規サマリに対するスレッド表示の ON/OFF を指定できるようになりました。 wl-summary-default-view, wl-summary-default-view-alist を設定して下さい。 ** スティッキーサマリを q や g で抜ける際に、一時的マークを保持するように なりました。 ** スティッキーサマリに関するキーバインドが変更になりました。 サマリで C-u g すると C-u q と同様にサマリを破棄します。サマリやフォルダ モードから G でサマリに移動すると、新規サマリがスティッキーになります。 ** C-cC-n や C-cC-p でサマリバッファ間を巡回できます。 ** リスト wl-folder-hierarchy-access-folders の各要素は、アクセスグループに ついての正規表現になりました(これまでは正確なグループ名でした)。 ** ドラフトのヘッダ部分で C-a すると、行頭もしくはヘッダの先頭にカーソルが 移動します。 ** カプセル化 Blind Carbon Copy を送れるようになりました。 デフォルトのフィールド名は "Ecc:" です。 ** ドラフトの C-c C-y でリージョンを引用できるようになりました。 transient-mark-mode (Emacs) もしくは zmacs-regions (XEmacs) が Non-nil で、リージョンが有効のときに作用します。 ** マルチパートのメッセージからパートを削除できるようになりました。 メッセージバッファで "D" にバインドされています。 ** ニュース記事を投稿するサーバを簡単に設定できるようになりました。 Info の例に習って wl-nntp-posting-config-alist を設定して下さい。 ** 変数 wl-draft-reply-with-argument-list 等で、関数の返り値から宛先を 決められるようになりました。 ** 関数 wl-draft のインターフェースが変更されました。 最初に用意するヘッダを関連リストの形で渡すようになりました。 ** wl-generate-mailer-string-function の使用法が変更になりました。 User-Agent フィールドに入る文字列を返す関数を指定して下さい。 ** Reference Card (doc/wl-refcard-ja.tex) に主なキー操作を列挙しました。 ** その他いくつかの修正。 * 2.6.1 から 2.8.0 への変更点 ** Nemacs, Mule 2.3 based on Emacs 19.28 はサポートされなくなりました。 ** FLIM 1.14.2 以前の FLIM ではうまく動かない場合があります。 FLIM 1.14.3 以降および対応した SEMI をインストールしてください。 ** make check で簡単な環境テストができるようになりました。 ** 名前変更等で使われなくなった変数を .wl 等で設定していると、警告が表示され ます。メッセージを参考にして、設定を変更してください。 もし何らかの理由で警告の表示を抑制したい場合には、変数 elmo-obsolete-variable-show-warnings を nil にしてください。 ** 新規内部フォルダ 'sendlog が追加されました。 ** 新規フォルダ shimbun フォルダが追加されました。 書式: '@' '仮想サーバ名' '.' 'グループ名' ** 新規フォルダ namazu フォルダが追加されました。 書式: '[' 'namazu 検索式' ']' [ 'namazu index のパス(絶対パス)' ] ** パイプフォルダでサーバにメッセージを残すことができるようになりました 次のアクセス時には、新しいメッセージのみコピーします。 書式: '|' '取り込み元' '|:' '取り込み先' ** アドレスマネージャが新設されました(C-c C-a で起動)。 アドレス帳の編集をしたり、そこからドラフトに宛先を入力することができます。 ** ACAP (RFC2244) に対応しました(実験的)。 ** IMAP4 のメッセージをパート毎にキャッシュとして保存できるようになりました。 巨大なパートをスキップした場合でも、スキップしたパート以外は オフライン状態で読み返すことができるようになりました。 ** メッセージのプリフェッチでメッセージビューまで作成するようになりました。 プリフェッチされたメッセージの表示が高速化されました。 ** メッセージバッファ、ドラフトバッファで長い行の折り返しを設定できるように なりました。変数 wl-message-truncate-lines, wl-draft-truncate-lines が non-nil なら、それぞれについて長い行を window 幅で切り縮めます。 ** オープニングデモに使われるビットマップ画像は wl-demo.elc から取り除かれ、 wl-icon-directory から読み込むようになりました。 クリスマスの時期には特別な画像が表示されます :) ** elmo モジュールが全体的に書き直されました。 ** elmo のバックエンドに依存した変数は "elmo-バックエンド名-*" という名前に変更されました。 例えば、 elmo-default-imap4-server が elmo-imap4-default-server に 変更されています。 ** xxx-func という名前の変数は xxx-function という名前に変更 されました。 ** X-Face utility 1.3.6.12 以前はサポートされなくなりました。 必要なら X-Face utility 1.3.6.13 以降をインストールしてください。 ** plugged モードで、stream-type が違うものは別エントリとして扱われるように なりました。 ** アーカイブ, マルチフォルダ用の msgdb path が変更されました。 そのままでも問題ありませんが、ディスクに無駄なデータを残したくない方は .elmo/multi, .elmo/archive 以下をあらかじめ削除しておいてください。 ** xxx-dir という名前の変数は xxx-directory という名前に変更されました。 例えば、wl-icon-dir は wl-icon-directory に変更されています。 Emacs21 で logo 表示などの設定をしている方は特に注意してください。 ** elmo-cache-dirname を廃止して elmo-cache-directory を新設しました。 elmo-cache-directory を設定することによってキャッシュだけを全く別の ディレクトリに置くことができます。 ** elmo-enable-disconnected-operation のデフォルト値が t になりました。 オフライン状態でもメッセージがキャッシュされていれば、ある程度の メッセージ操作が可能です。 ** "$" マークの付いたメッセージは、メッセージの実体が消えた場合にはサマリから も消えるようになりました。 "$" マークの付いたメッセージを見直したい場合は 'mark フォルダを参照して ください。 * 2.6.0 から 2.6.1 への変更点 2.6.1 は 2.6.0 の修正版です。 ** Emacs 21 で Recursive load... と出る不具合が修正されました。 ** XEmacs 21.1 で文字化けする問題が修正されました。 ** XEmacs で IMAP4 を用いるとプログレスバーが出っぱなしになる問題が 修正されました。 ** X- で始まるフィールドの検索ができない問題が修正されました。 ** その他いくつかの修正。 * 2.4.1 から 2.6.0 への変更点 ** FLIM 1.13.x はサポートされなくなりました。 FLIM 1.14.1 以降をインストールしてください。 ** フォルダ、サマリを別フレームで起動できるようになりました。 新規変数 wl-folder-use-frame、wl-summary-use-frame が non-nil なら それぞれフォルダ、サマリを別フレームに開きます(デフォルトは nil)。 ** サマリでの 'N' や 'P' によるカーソル移動が高速化されました。 ** ローカルフォルダを対象とした、last および first 条件のフィルタフォルダ (例えば、/last:100/+inbox のようなフォルダ) のチェックが高速化されました。 ** POP, IMAP で大きなメッセージを取り寄せるときに、 進捗が表示されるようになりました。 ** サマリの色づけがオンデマンドになりました(Emacs のみ)。 新規変数 wl-summary-lazy-highlight が non-nil ならサマリの表示部分のみを 自動的に色付けします (Emacs のみ)。 ** biff の通知方法がカスタマイズ可能になりました。 新規フック wl-biff-notify-hook, wl-biff-unnotify-hook で設定できます。 例: (add-hook wl-biff-notify-hook 'ding) ** 多くのバグフィックス * 2.4.0 から 2.4.1 への変更点 2.4.1 は 2.4.0 の修正版です。 ** FLIM 1.14.x 上でも動作するようになりました。 ** POP before SMTP で POP コネクションが切れない不具合が修正されました。 ** IMAP4 での生パスワードによる認証の指定方法が変更になりました。 これまで、IMAP4 で生パスワードの認証(LOGIN コマンドによるログイン)をするには、 変数 elmo-default-imap4-authenticate-type に 'plain (または nil) を設定することになっていましたが、'clear (または nil)に変更されました。 例えば、 (setq elmo-default-imap4-authenticate-type 'plain) という設定は (setq elmo-default-imap4-authenticate-type 'clear) に変更する必要があります。 * 1.1.1 から 2.4.0 への変更点 ** バージョン番号 バージョン番号の付け方が変わりました。 これまで、1.x が安定版、2.0.x〜2.2.x が開発版となっていましたが、2.3.0 以降は、第二番号が偶数なら安定版、奇数なら開発版となりました。このバー ジョン番号の付け方は一般的なオープンソース開発の慣習に基づくものです。 公開 CVS サーバ cvs.m17n.org 上 では、幹が beta (開発)版、 枝が stable (安定)版 (枝名は、2.4.x なら wl-2_4) となります。 ** インストール *** FLIM 1.12 はサポートされなくなりました。 くわしくは INSTALL.ja を御覧下さい。 *** APEL 10.2 以降が必要になりました。 tm-8 を使用する方は特にご注意ください。 ** 新機能 *** LDAP サポート LDAP サーバーと接続し、アドレスの補完を行えます。 変数 wl-use-ldap が non-nil に設定されていると LDAP を利用します (初期設定は nil)。 *** POP3 フォルダで UIDL サポート POP3 フォルダでサマリの状態を保存できるようになり、アクセスが高速化されました。 変数 elmo-pop3-use-uidl が non-nil に設定されていると UIDL を使用します (初期設定は t)。 *** Emacs 21 サポート Standard Emacs 21 のサポートを開始しました。Wanderlust のほとん どのフレームに、XEmacs と同じようにツールバーやアイコン画像を表 示します。 *** biff 機能 一定時間おきにサーバにメールが届いているか確認します。 届いていればモードラインに表示し、フォルダ一覧モードを更新します。 *** expire-hide 記事自体は消すことなく、サマリに見える記事数を一定に保つことがで きるようになりました。ひとつのフォルダに大量に記事を溜めている場 合でも、速度低下を抑えることできます。 *** スレッド修復機能 サブジェクトから推測したスレッドの自動のつなぎ直し、及び 手動でのつなぎ直し(サマリで M-w (コピー)と C-y (ペースト)) が可能になりました。 *** パスワードのタイマ設定 変数 elmo-passwd-life-time で設定できます。 (nil ならタイマなし。初期設定は nil)。 *** killed-list NNTP フォルダで削除したメッセージは killed-list に保存します。 killed-list にあるメッセージはサーバ上にも存在しないかのように扱 います。変数 elmo-use-killed-list が non-nil なら killed-list を 使用します(デフォルトは t)。 これによって NNTP を利用したパイプフォルダも実現できるようになりました。 *** Maildir で pack (番号詰め) ができるようになりました。 Maildir のサマリで M-x wl-summary-pack-number を実行するとメッセージ番号を 1 から順に振り直します。 ** 検索 *** フィルタフォルダに複雑な条件指定を指定できるようになりました。 AND 条件、OR 条件、否定条件、およびそれらの組合せを指定できます。 これにともない、条件指定部分のシンタックスが変更されました。 くわしくは Info を御覧下さい。 注意:1.1.1 から移行される方へ 上記変更に伴い、フィルタフォルダの msgdb の置き場所が変わりました。 このため、従来の msgdb は不要となります。そのままでも問題ありませんが、 ディスクに無駄なデータを残したくない方は .elmo/filter/ 以下を あらかじめ削除しておいてください。 *** NNTP での検索機能が強化されました。 NNTP に対するフィルタフォルダを作れるようになりました。 (NNTP サーバが XHDR コマンドに対応している場合のみ) *** サマリでの Pick、Virtual で複合条件を入力できるようになりました。 AND 条件や OR 条件も入力できます。 入力方法は、フィールド名のかわりに 'AND' や 'OR' を入力するだけです。 ** 接続・認証 *** elmo-default-*-authenticate-type はシンボルで設定するようになりました。 例えば、 (setq elmo-default-imap4-authenticate-type "cram-md5") という設定は、 (setq elmo-default-imap4-authenticate-type 'cram-md5) に変更する必要があります。 *** stream-type の定義方法を変更しました。 変数 elmo-network-{imap4-,pop3-,nntp-,}stream-type-alist で設定可能です。 SSL 関連のいくつかの変数が廃止されました(改名)。 また、新たに "!socks" で終わるネットワーク系フォルダ(IMAP4, NNTP, POP3)は SOCKS 経由でアクセスされるようになりました。 ** ドラフト *** group-list に対応しました。 宛先に Group: foo@gohome.org, bar@gohome.org; のように書けるように なりました。変数 wl-draft-remove-group-list-contents が t なら group-list の内容を削除して送信します。 *** ドラフトのプレビューで受取人のアドレスがミニバッファに表示されます。 group-list にも対応しています。 *** 初期設定で Reply-To: を考慮するようになりました。 wl-draft-reply-without-argument-list の初期設定で、Reply-To: フィールドは To: へ挿入する設定になりました。 *** 自分のメールへの返信ルール 変数 wl-draft-reply-myself-with-argument-list, wl-draft-reply-myself-without-argument-list で自分が出したメール への返信するときのルールが設定できます。 *** 返信アドレスにフルネーム 変数 wl-draft-reply-use-address-with-full-name が non-nil なら返 信アドレスにフルネームが入ります。(デフォルトは t)。 *** In-Reply-To: フィールドの形式を変更しました。 draft-ietf-drums-msg-fmt-09.txt に従うようになりました。 ** その他の変更点 *** スレッドの高速化と多くのバグフィックス。 *** 変数名の変更。 wl-refile-guess-func-list => wl-refile-guess-functions wl-summary-temp-above => wl-summary-target-above *** wl-fcc に関数を設定できます。 月毎にフォルダを変えたい場合などに使用できます。 *** elmo-search-mime-charset は廃止されました。 charset は入力文字列から判定されます。 *** 転送時に余計なヘッダを削除します。 変数 wl-ignored-forwarded-headers で、転送時に削除するヘッダを設 定できます。 *** wl-highlight-group-folder-by-numbers は廃止されました。 wl-highlight-folder-by-numbers に改名され、値に応じて以下の意味を持つように なりました。 `t' :行全体にメッセージ数に応じた色を付けます。 `nil' :フォルダの状態に応じた色を付けます。 数字 (例えば `1') :メッセージ数とフォルダの状態の両方に応じた色を付けます。 *** メッセージバッファでのヘッダ表示を制御できます。 変数 wl-message-ignored-field-list, wl-message-visible-field-list で、Wanderlust レベルで設定が可能 になりました。(今までは SEMI で設定する必要がありました) *** DEMO の表示方法が変わりました。 カラーのピックスマップで利用する色数が削減されました。 また、文字のみしか表示できない環境でもそれなりのデモが表示されるように なりました。 * 1.1.0 から 1.1.1 への変更点 1.1.1 は 1.1.0 のバグ修正版です。いくつかの細かい修正が加わっています。 ** CVS サーバ上での開発が始められました。 ** ディレクトリ構成がかわりました。 *** 00README, 00README.ja は README, README.ja に変更されました。 *** wl-* のファイルは 'wl' ディレクトリに移動しました。 ** wl-refile-rule-alist の記述方法が拡張されました(以前と互換性があります)。 ** progress gauge 表示機能を利用するようになりました。 progress gauge の表示機能をもつ Emacs では、処理の進捗が progress gauge に 表示されるようになりました。 * 1.0.3 から 1.1.0 への変更点 ** インストール *** tm7 はサポートされなくなりました。 くわしくは INSTALL.ja を御覧下さい。 *** WL_PREFIX と ELMO_PREFIX の初期設定が "wl" になりました。 (defvar WL_PREFIX "wl") (defvar ELMO_PREFIX "wl") 例えば、インストールディレクトリは、 1.0.3 /usr/local/share/emacs/site-lisp/ 1.1.0 /usr/local/share/emacs/site-lisp/wl/ となります。 *** Makefile の変数のデフォルト値が変わりました。 EMACS = emacs XEMACS = xemacs $(XEMACS) は、`package' や `install-package' の target で参照されます。 *** *.el ファイルもインストールされるようになりました。 *** 英語版ドキュメント (wl.texi) が付きました。 ** 新機能 *** Modified UTF7 がサポートされました。 ユニコードが扱える Emacs では、IMAP4 で日本語メールボックス名を指定できます。 *** スコア機能が付きました。 *** プラグ管理機能が付きました。 *** IMAP4 がより汎用的になりました。 多くの IMAP4 サーバで動くようになりました。 *** いくつかの認証方式がサポートされました。 IMAP4: CRAM-MD5, DIGEST-MD5, STARTTLS POP3: CRAM-MD5, DIGEST-MD5, SCRAM-MD5, STARTTLS NNTP: STARTTLS SMTP: STARTTLS *** 新しいフォルダ型が加わりました。 | パイプフォルダ メッセージを取り込むフォルダです。 . Maildir フォルダ Maildir がひとつのフォルダ型になりました。 'cache キャッシュフォルダ 内部キャッシュをフォルダとして閲覧できます。 *** メッセージバッファのプリフェッチ機能が付きました。 読んでいる間に次のメッセージを読み込みます。 *** スティッキーサマリ(消えないサマリ)が拡張されました。 メッセージバッファもサマリに対応して用意されるようになりました。 常にスティッキーになるフォルダを設定できるようになりました。 ** その他 *** 変数 wl-draft-prepared-config-alist は廃止されました。 wl-draft-config-alist に統合されました。 *** POP-before-SMTP 関連の変数が整理されました。 *** 存在しないフォルダを作るかどうか確認するようになりました。 FCC: に新しいフォルダ名を指定したときや、auto-refile で 新しいフォルダ名を指定したときにフォルダを作るかどうか確認します。 *** プリフェッチの確認に関する設定の変数が加わりました。 wl-prefetch-confirm-threshold, wl-cache-fetch-threshold. *** フォルダ名のあだ名をフォルダ名入力で補完できるようになりました。 *** Message-ID の生成方法が変わりました。 *** Mule ではビットマップのオープニングデモ画面が出るようになりました。 *** `smtp-server' に関数を指定できます。 *** 送信ログが保存されるようになりました。 `wl-draft-sendlog' が non-nil の場合、'sendlog' ファイルに保存されます。 *** オフライン処理でプリフェッチを予約できるようになりました。 *** `wl-summary-incorporate-marks' *** `wl-draft-use-frame' が non-nil ならフレームを生成します。 *** 新規変数 `wl-user-mail-address-list'。 *** 新規変数 `wl-local-domain'。 *** IMAP4 でサーバ側の未読状態を参照するようになりました。 *** 初期設定が変更された変数 wl-mime-charset iso-2022-jp => x-ctext wl-summary-move-order 'new => 'unread wl-tmp-dir TMPDIR => ~/tmp/ *** 新規 hook wl-draft-send-hook wl-draft-reedit-hook wl-mime-edit-preview-message-hook wl-folder-suspend-hook wl-summary-toggle-disp-folder-message-resumed-hook wl-summary-line-inserted-hook wl-thread-update-children-number-hook mmelmo-header-inserted-hook mmelmo-entity-content-inserted-hook *** 新規コマンド wl-save wl-summary-write wl-summary-supersedes-message wl-fldmgr-delete wl-refile-guess-by-msgid wl-address-user-mail-address-p wl-summary-jump-to-msg-by-message-id-via-nntp wl-summary-temp-mark-pick * 変更点の詳細は ChangeLog を御覧下さい。 Local variables: mode: outline paragraph-separate: "[ ]*$" end: wanderlust-wanderlust-769699d/README.ja.md000066400000000000000000000070221406661363500202560ustar00rootroot00000000000000Wanderlust - Yet Another Message Interface on Emacsen ===================================================== Wanderlust は [Emacs][2] 上で動く [IMAP4rev1][1] 対応のメール/ニュース管理システムです。元々は[寺西裕一][3]さんによって開発されました。 ドキュメントは[付属のドキュメント][16] や [Wanderlust on EmacsWiki][4] を参照下さい。 Features ======== * elisp のみによる実装。 * [IMAP4rev1][5]、[NNTP][6]、POP([POP3][7]/APOP)、MH 形式のサポート。 * [Mew][8] っぽい Folder Specification に基づくメッセージへの統一的アクセス。 * Mew っぽいキーバインドとマーク処理。 * スレッドと未読管理。 * 購読フォルダの一覧を表示するフォルダモード。 * メッセージキャッシュ、 Disconnected Operation。 * MH 的 Fcc。(Fcc: %Backup も可)。 * MIME 対応 (by SEMI)。 * ニュース/メールの送信を統合したドラフト編集。 * フォルダ一覧のアイコン表示。 * 大きなパートを取り寄せずに表示 (IMAP4)。 * メッセージの検索をサーバ側で実行 (IMAP4)。日本語検索も可。 * 仮想フォルダ。 * 多い日も安心の、マルチアーカイバ対応圧縮フォルダ。 * フォルダ中の古い記事を自動的にアーカイブ/削除して整理する expire 機能。 * 自動リファイル。 * 定型メッセージの送信に便利なテンプレート機能。 Installation ============ INSTALL.ja を御覧ください。 メーリングリスト ============ Wanderlust に関する議論はメーリングリストで行われています。 * 日本語版: [wl@ml.gentei.org][11] (過去ログは news://news.gmane.io/gmane.mail.wanderlust.general.japanese ) また、英語専用のリストとして * 英語版: [wl-en@ml.gentei.org][9] (過去ログは news://news.gmane.io/gmane.mail.wanderlust.general ) もあります (英語版のリストに投稿されたメッセージは日本語版にも配送されます)。 購読するには件名と本文を `subscribe YOUR NAME` をしたメールを[wl-ctl@ml.gentei.org][13] (日本語版) もしくは[wl-en-ctl@ml.gentei.org][14] (英語版) に送ってください。購読をやめるには本文を `unsubscribe` としたメールを、ガイドを得るには本文に `# guide` と書いたメールを送って下さい。 Development =========== ソースコードのリポジトリは [Github][15] にあります。バグ報告やパッチの送付はメーリングリストへ送ってください。 [1]: http://en.wikipedia.org/wiki/Internet_Message_Access_Protocol [2]: http://www.gnu.org/software/emacs/ [3]: mailto:teranisi@gohome.org [4]: http://www.emacswiki.org/emacs/WanderLust [5]: http://tools.ietf.org/html/rfc3501 "M. Crispin, 'INTERNET MESSAGE ACCESS PROTOCOL - VERSION 4rev1', RFC 3501, 2003" [6]: http://tools.ietf.org/html/rfc977 "B. Kantor and P. Lapsley, 'Network News Transfer Protocol: A Proposed Standard for the Stream-Based Transmission of News', RFC 977, 1986" [7]: http://tools.ietf.org/html/rfc1939 "J. Myers, M. Rose, 'Post Office Protocol - Version 3', RFC 1939, 1996" [8]: http://www.mew.org/ "'Mew - Messaging in the Emacs World', (Copyright © 1994-2018 山本和彦)" [9]: mailto:wl@ml.gentei.org [11]: wl@ml.gentei.org [13]: mailto:wl-ctl@ml.gentei.org [14]: mailto:wl-en-ctl@ml.gentei.org [15]: https://github.com/wanderlust/wanderlust [16]: http://wanderlust.github.io/wl-docs/ wanderlust-wanderlust-769699d/README.md000066400000000000000000000056571406661363500177010ustar00rootroot00000000000000Wanderlust - Yet Another Message Interface on Emacsen ===================================================== Wanderlust is a mail/news management system with [IMAP4rev1][1] support for [Emacs][2]. It was originally developed by [Yuuichi Teranishi][3]. For documentation, see also: [bundled document][16] and [Wanderlust on EmacsWiki][4] Features ======== * Implementation in elisp only. * Support of [IMAP4rev1][5], [NNTP][6], POP([POP3][7]/APOP), MH and Maildir. * Integrated access to messages based on Folder Specifications like [Mew][8]. * Key bindings and mark processing like Mew. * Management of threads and unread messages. * Folder mode to select and edit subscribed folders. * Message cache, Disconnected Operation. * MH-like Fcc (Fcc: %Backup is possible). * Full support of MIME (by SEMI). * Draft editing of mail and news as a same interface. * Icon based interface for the list of Folder. * Skip fetching of a large message part of MIME(IMAP4). * Server side searching (IMAP4), internationalized searching is available. * Virtual folder. * Compressed folder. * Automatic expiration of old messages. * Automatic refiling. * Draft templates. Installation ============ See: `INSTALL' Mailing List ============ You can get information and help via the mailing list at: * English: [wl-en@ml.gentei.org][9] (news://news.gmane.io/gmane.mail.wanderlust.general for archives) * Japanese: [wl@ml.gentei.org][11] (news://news.gmane.io/gmane.mail.wanderlust.general.japanese for archives) Emails to the English list are forwarded to the Japanese list. To subscribe, send an email to [wl-ctl@ml.gentei.org][13] (Japanese) or [wl-en-ctl@ml.gentei.org][14] (English). Use `subscribe YOUR NAME` as subject and body. To unsubscribe, use `unsubscribe` as body. To get help, use `# guide` as body. Development =========== The source code repository is available at [Github][15]. Patches that fix bugs and improve Wanderlust are welcome and can be sent to the Wanderlust mailing list. [1]: http://en.wikipedia.org/wiki/Internet_Message_Access_Protocol [2]: http://www.gnu.org/software/emacs/ [3]: mailto:teranisi@gohome.org [4]: http://www.emacswiki.org/emacs/WanderLust [5]: http://tools.ietf.org/html/rfc3501 "M. Crispin, 'INTERNET MESSAGE ACCESS PROTOCOL - VERSION 4rev1', RFC 3501, 2003" [6]: http://tools.ietf.org/html/rfc977 "B. Kantor and P. Lapsley, 'Network News Transfer Protocol: A Proposed Standard for the Stream-Based Transmission of News', RFC 977, 1986" [7]: http://tools.ietf.org/html/rfc1939 "J. Myers, M. Rose, 'Post Office Protocol - Version 3', RFC 1939, 1996" [8]: http://www.mew.org/ "'Mew - Messaging in the Emacs World', (Copyright 1994-2018 Kazuhiko Yamamoto)" [9]: mailto:wl-en@ml.gentei.org [11]: wl@ml.gentei.org [13]: mailto:wl-ctl@ml.gentei.org [14]: mailto:wl-en-ctl@ml.gentei.org [15]: https://github.com/wanderlust/wanderlust [16]: http://wanderlust.github.io/wl-docs/ wanderlust-wanderlust-769699d/WL-CFG000066400000000000000000000015671406661363500172600ustar00rootroot00000000000000;;; -*- emacs-lisp -*- ;;; Configuration file for installation. ;; load-path setting example for Mule with SEMI. ;(setq load-path (append ; (list "/usr/local/share/mule/site-lisp/apel" ; "/usr/local/share/mule/site-lisp/flim" ; "/usr/local/share/mule/site-lisp/semi") ; load-path)) ;; If you want to install utils, uncomment following line. ;(setq wl-install-utils t) ;; Set language for info file ("ja" or "en", both in default). ;; If you only need manual in English, uncomment following line. ;(setq wl-info-lang "en") ;; Set language for news file ("ja" or "en", both in default). ;(setq wl-news-lang '("ja" "en")) ; order sensitive ;; if you want to install wl modules to the subdirectory other than "wl" ;; under LISPDIR, set following variables. ;(setq WL_PREFIX "your-path") ; default is "wl" ;(setq ELMO_PREFIX "your-path") ; default is "wl" wanderlust-wanderlust-769699d/WL-ELS000066400000000000000000000046541406661363500173040ustar00rootroot00000000000000;;; WL-ELS -*-Emacs-Lisp-*- ;;;;;;;;;;;;;;;;;;;;; DO NOT EDIT THIS FILE ;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;; INTERNAL USE ONLY ;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; generic modules (defconst WL-MODULES '( wl wl-folder wl-summary wl-action wl-message wl-vars wl-draft wl-util wl-version wl-address wl-addrmgr wl-highlight wl-demo wl-refile wl-thread wl-fldmgr wl-expire wl-template wl-score wl-acap wl-news wl-spam wl-batch wl-qs )) (defconst ELMO-MODULES '( pldap acap slp mmimap elmo-signal elmo-date elmo-util elmo-version elmo-vars elmo elmo-msgdb elmo-passwd elmo-net elmo-imap4 elmo-pop3 elmo-nntp elmo-localdir elmo-localnews elmo-map elmo-maildir elmo-multi elmo-access elmo-filter elmo-archive elmo-pipe elmo-cache elmo-internal elmo-flag elmo-sendlog elmo-null elmo-dop elmo-search elmo-file elmo-split elmo-spam elsp-bogofilter elsp-sa elsp-bsfilter elsp-spamoracle modb modb-entity modb-legacy modb-standard )) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Emacsen ;; (< 20 emacs-major-version) && !(featurep 'mule) (setq WL-MODULES (append WL-MODULES (list 'wl-e21))) (defconst WL-AUTOLOAD-MODULES '( auto-autoloads custom-load )) (if (and (module-installed-p 'xml) (module-installed-p 'url)) (add-to-list 'ELMO-MODULES 'elmo-rss)) (if (module-installed-p 'shimbun) (add-to-list 'ELMO-MODULES 'elmo-shimbun)) (if (module-installed-p 'spamfilter) (add-to-list 'ELMO-MODULES 'elsp-spamfilter)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; SEMI (setq WL-MODULES (append WL-MODULES (list 'wl-mime))) (setq ELMO-MODULES (append ELMO-MODULES (list 'elmo-mime))) (if (not (module-installed-p 'luna)) (error "Use new FLIM & SEMI. See INSTALL or INSTALL.ja")) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Utils (defvar UTILS-MODULES '(rfc2368 im-wl wl-mailto wl-addrbook wl-complete)) ;; OpenSSL/SSLeay package is also needed. (if (module-installed-p 'base64) (add-to-list 'UTILS-MODULES 'ssl)) (defvar modules-alist (list (cons ELMODIR ELMO-MODULES) (cons WLDIR WL-MODULES) (if (and (module-installed-p 'bbdb-whois) (null (module-installed-p 'bbdb-mua))) ;; Excluded for BBDB3. (cons UTILSDIR (list 'bbdb-wl))) (if wl-install-utils (cons UTILSDIR UTILS-MODULES)))) wanderlust-wanderlust-769699d/WL-MK000066400000000000000000000342731406661363500171700ustar00rootroot00000000000000;;; -*- Emacs-Lisp -*- ;;; WL-MK for byte-compile, install, uninstall ;;; ;;; Original by OKUNISHI Fujikazu ;;; Modified by Yuuichi Teranishi ;;;;;;;;;;;;;;;;;;;;; DO NOT EDIT THIS FILE ;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;; INTERNAL USE ONLY ;;;;;;;;;;;;;;;;;;;;; ;;; Code (defvar WLDIR "./wl") (defvar ELMODIR "./elmo") (defvar DOCDIR "./doc") (defvar ICONDIR "./etc/icons") (defvar UTILSDIR "./utils") (defvar WL_PREFIX "wl") (defvar ELMO_PREFIX "wl") (defvar COMPRESS-SUFFIX-LIST '("" ".gz" ".Z" ".bz2")) (defvar wl-install-utils nil "If Non-nil, install `wl-utils-modules'.") ;;; INFO (defconst wl-ja-info "wl-ja.info") (defconst wl-ja-texi "wl-ja.texi") (defconst wl-en-info "wl.info") (defconst wl-en-texi "wl.texi") (defvar wl-info-lang (if (featurep 'mule) '("ja" "en") '("en")) "The language of info file (\"ja\" or \"en\").") ;;; NEWS (defvar wl-news-lang (if (featurep 'mule) '("ja" "en") '("en")) "The language of news file (\"ja\" or \"en\").") (defconst wl-news-news-file '(("en" "NEWS") ("ja" "NEWS.ja"))) (defconst wl-news-search-regexp '(("en" "^\\* Changes in \\([0-9.]*\\) from [0-9.]+x?") ("ja" "^\\* [0-9.]+x? から \\([0-9.]*\\) への変更点"))) (defconst wl-news-filename "wl-news.el") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defvar INFODIR nil) (load "bytecomp" nil t) (setq byte-compile-warnings '(free-vars unresolved callargs redefine)) (condition-case () (require 'easymenu) (error nil)) (defvar config-wl-package-done nil) (defun config-wl-package-subr () (unless config-wl-package-done (setq config-wl-package-done t) (setq load-path (cons (expand-file-name ".") load-path)) (setq load-path (cons (expand-file-name WLDIR) (cons (expand-file-name ELMODIR) load-path))) ;; load custom file if exists. `WL-CFG.el' override for committer. (load "./WL-CFG" t nil nil) ;; load-path (if wl-install-utils (setq load-path (cons (expand-file-name UTILSDIR) load-path))) (require 'install) (load "./WL-ELS" nil nil t) ;; product.el version check (require 'product) (if (not (fboundp 'product-version-as-string)) (error "Please install new APEL. See INSTALL or INSTALL.ja")) ;; smtp.el version check. (require 'smtp) (if (not (fboundp 'smtp-send-buffer)) (error "Please install new FLIM. See INSTALL or INSTALL.ja")) (condition-case () (require 'mime-setup) (error (error "Cannot load `mime-setup'. Please install SEMI"))))) (defun config-wl-pixmap-dir (&optional packagedir) "Examine pixmap directory where icon files should go." (let ((pixmap-dir (car command-line-args-left))) (defvar PIXMAPDIR (if (string= pixmap-dir "NONE") (if packagedir (expand-file-name "etc/wl/" packagedir) (expand-file-name "wl/icons/" data-directory)) pixmap-dir))) (if PIXMAPDIR (princ (format "PIXMAPDIR is %s\n" PIXMAPDIR))) (setq command-line-args-left (cdr command-line-args-left))) (defun config-wl-package () (config-wl-package-subr) ;; LISPDIR check. (let ((elispdir (car command-line-args-left))) (if (string= elispdir "NONE") (defvar LISPDIR (install-detect-elisp-directory)) (defvar LISPDIR elispdir))) (princ (format "LISPDIR is %s\n" LISPDIR)) (setq command-line-args-left (cdr command-line-args-left)) ;; PIXMAPDIR check. (config-wl-pixmap-dir) (princ "\n")) (defun update-version () "Update version number of documents." (config-wl-package) (load-file "elmo/elmo-version.el") (let ((version (mapconcat 'number-to-string (product-version (product-find 'elmo-version)) ".")) (coding-system-for-write 'iso-latin-1-unix)) (princ (concat "Update version number to " version "\n")) ;; generate version.tex (with-temp-buffer (insert "\\def\\versionnumber{" version "}\n") (write-region (point-min) (point-max) (expand-file-name "version.tex" "doc"))) ;; generate version.texi (with-temp-buffer (insert "@set VERSION " version "\n") (write-region (point-min) (point-max) (expand-file-name "version.texi" "doc"))))) (defun test-wl () "Run test suite for developer." (config-wl-package) (make-wl-news) (require 'lunit) (let ((files (directory-files "tests" t "^test-.*\\.el$")) (suite (lunit-make-test-suite))) (while files (if (file-regular-p (car files)) (progn (load-file (car files)) (lunit-test-suite-add-test suite (lunit-make-test-suite-from-class (intern (file-name-sans-extension (file-name-nondirectory (car files)))))))) (setq files (cdr files))) (lunit suite))) (defun check-wl () "Check user environment. Not for developer." (config-wl-package) ;; Avoid load error (provide 'wl-news) (load "wl-news.el.in") (require 'lunit) (let ((files (directory-files "tests" t "^check-.*\\.el$")) (suite (lunit-make-test-suite))) (while files (if (file-regular-p (car files)) (progn (load-file (car files)) (lunit-test-suite-add-test suite (lunit-make-test-suite-from-class (intern (file-name-sans-extension (file-name-nondirectory (car files)))))))) (setq files (cdr files))) (lunit suite))) (defun wl-scan-path (path scanner) (let ((dirs (if (listp path) path (list path)))) (apply 'append (mapcar scanner dirs)))) (defun wl-scan-source (path) (wl-scan-path path (lambda (x) (apply 'append (mapcar (lambda (y) (list y (concat y "c"))) (directory-files x nil "\\(.+\\)\\.el$" t)))))) (defun wl-scan-icons (path) (wl-scan-path path (lambda (x) (let ((case-fold-search t)) (directory-files x nil "\\.x[bp]m$"))))) (defun wl-uninstall (objs path) ;(message (mapconcat 'identity objs " ")) (mapc (lambda (x) (let ((filename (expand-file-name x path))) (if (and (file-exists-p filename) (file-writable-p filename)) (progn (princ (format "%s was uninstalled.\n" filename)) (delete-file filename))))) objs)) (defun wl-examine-modules () "Examine wl modules should be byte-compile'd." (config-wl-package-subr) (make-wl-news) (dolist (module modules-alist) (dolist (filename (cdr module)) (princ (format "%s/%s.elc " (car module) filename))))) (defun compile-wl-package () ;; to avoid to read situation-examples-file at compile time. (setq mime-situation-examples-file nil) (config-wl-package) (make-wl-news) (mapc (lambda (x) (compile-elisp-modules (cdr x) (car x))) modules-alist)) (defun install-wl-icons () (if (not (file-directory-p PIXMAPDIR)) (make-directory PIXMAPDIR t)) (let* ((case-fold-search t) (icons (directory-files ICONDIR nil "\\.x[bp]m$"))) (install-files icons ICONDIR PIXMAPDIR nil 'overwrite))) (defun uninstall-wl-icons () (if (not (file-directory-p PIXMAPDIR)) () (wl-uninstall (wl-scan-icons PIXMAPDIR) PIXMAPDIR))) (defun install-wl-package () (compile-wl-package) (let ((wl-install-dir (expand-file-name WL_PREFIX LISPDIR)) (elmo-install-dir (expand-file-name ELMO_PREFIX LISPDIR))) (mapc (lambda (x) (install-elisp-modules (cdr x) (car x) (if (string= (car x) ELMODIR) elmo-install-dir wl-install-dir))) modules-alist)) (if PIXMAPDIR (install-wl-icons))) (defun uninstall-wl-package () (config-wl-package) (let ((wl-install-dir (expand-file-name WL_PREFIX LISPDIR)) (elmo-install-dir (expand-file-name ELMO_PREFIX LISPDIR))) (wl-uninstall (wl-scan-source (list WLDIR UTILSDIR)) wl-install-dir) (wl-uninstall (wl-scan-source (list ELMODIR)) elmo-install-dir)) (if PIXMAPDIR (uninstall-wl-icons))) (defun config-wl-package-xmas () (error "This directive is only for XEmacs")) ;; from SEMI-MK (defun compile-wl-package-xmas () ;; to avoid to read situation-examples-file at compile time. (setq mime-situation-examples-file nil) (config-wl-package-xmas) (make-wl-news) (setq autoload-package-name "wl") (add-to-list 'command-line-args-left WLDIR) (batch-update-directory) (add-to-list 'command-line-args-left WLDIR) (Custom-make-dependencies) ;; WL-AUTOLOAD-MODULES (compile-elisp-modules WL-AUTOLOAD-MODULES WLDIR) (mapc (lambda (x) (compile-elisp-modules (cdr x) (car x))) modules-alist)) (defun install-wl-package-xmas () (compile-wl-package-xmas) (let ((LISPDIR (expand-file-name "wl" (expand-file-name "lisp" PACKAGEDIR))) (DATADIR (expand-file-name "wl" (expand-file-name "etc" PACKAGEDIR))) (INFODIR (expand-file-name "info" PACKAGEDIR))) (or (file-exists-p DATADIR) (make-directory DATADIR t)) (or (file-exists-p INFODIR) (make-directory INFODIR t)) ;; copy xpm files (install-wl-icons) (mapc (lambda (x) (install-elisp-modules (cdr x) (car x) LISPDIR)) modules-alist) ;; WL-AUTOLOAD-MODULES (install-elisp-modules WL-AUTOLOAD-MODULES WLDIR LISPDIR) ;; (wl-texinfo-format) (wl-texinfo-install))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Texinfo stuff (defun wl-texinfo-info-file (lang) (symbol-value (intern (format "wl-%s-info" lang)))) (defun wl-texinfo-texi-file (lang) (symbol-value (intern (format "wl-%s-texi" lang)))) (defun wl-texinfo-check-newer (lang) (let ((info-file (expand-file-name (wl-texinfo-info-file lang) DOCDIR))) (and (file-newer-than-file-p info-file (expand-file-name "version.texi" DOCDIR)) (file-newer-than-file-p info-file (expand-file-name (wl-texinfo-texi-file lang) DOCDIR))))) (defun wl-texinfo-format-file (lang) (or (wl-texinfo-check-newer lang) (let (obuf) ;; Support old texinfmt.el (require 'ptexinfmt (expand-file-name "ptexinfmt.el" UTILSDIR)) (find-file (expand-file-name (wl-texinfo-texi-file lang) DOCDIR)) (setq obuf (current-buffer)) ;; We can't know file names if splitted. (texinfo-format-buffer t) (set-buffer-file-coding-system 'utf-8) (save-buffer) (kill-buffer (current-buffer)) ;; info (kill-buffer obuf)) ;; texi )) (defun wl-texinfo-format () (wl-detect-info-directory) (cond ((null wl-info-lang)) ((listp wl-info-lang) (mapc 'wl-texinfo-format-file wl-info-lang)) ((stringp wl-info-lang) (wl-texinfo-format-file wl-info-lang)))) (defun wl-texinfo-install-file (lang) (let ((infofile (wl-texinfo-info-file lang))) (install-file infofile DOCDIR INFODIR nil 'overwrite))) (defun wl-texinfo-install () (cond ((null wl-info-lang)) ((listp wl-info-lang) (mapc 'wl-texinfo-install-file wl-info-lang)) ((stringp wl-info-lang) (wl-texinfo-install-file wl-info-lang)))) (defun wl-primary-info-file () "Get primary info file (for wl-detect-info-directory)." (cond ((null wl-info-lang)) ((listp wl-info-lang) (let ((wl-info-lang (car wl-info-lang))) (wl-primary-info-file))) ((stringp wl-info-lang) (wl-texinfo-info-file wl-info-lang)))) (defun wl-detect-info-directory () (config-wl-package-subr) ;; INFODIR check. (when wl-info-lang (require 'info) (if (fboundp 'info-initialize) (info-initialize)) (unless INFODIR (let ((infodir (car command-line-args-left)) (info (wl-primary-info-file)) previous) (setq INFODIR (if (string= infodir "NONE") (if (setq previous (exec-installed-p info Info-directory-list COMPRESS-SUFFIX-LIST)) (directory-file-name (file-name-directory previous)) (car Info-directory-list)) infodir)) (setq command-line-args-left (cdr command-line-args-left)))) (princ (format "INFODIR is %s\n\n" INFODIR)))) (defun install-wl-info () (wl-texinfo-format) (wl-texinfo-install)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; wl-news stuff (defun wl-news-news-file (lang) (cadr (assoc lang wl-news-news-file))) (defun wl-news-check-newer (out-filename news-lang) (let ((lang news-lang) ret) (while (car lang) (if (file-newer-than-file-p (wl-news-news-file (car lang)) out-filename) (setq ret t)) (setq lang (cdr lang))) ret)) (defun make-wl-news () (let ((in-filename (expand-file-name (concat wl-news-filename ".in") WLDIR)) (out-filename (expand-file-name wl-news-filename WLDIR)) (wl-news-lang (if (listp wl-news-lang) wl-news-lang (list wl-news-lang)))) (if (or (file-newer-than-file-p in-filename out-filename) (wl-news-check-newer out-filename wl-news-lang)) (with-temp-buffer (save-excursion (insert-file-contents in-filename) (goto-char (point-min)) (unless (re-search-forward "^;;; -\\*- news-list -\\*-" nil t) (error "Invalid wl-news.el.in")) (forward-line 2) (if wl-news-lang (progn (insert "(defconst wl-news-news-alist\n '") (let ((p (point))) (prin1 (wl-news-parse-news wl-news-lang) (current-buffer)) (save-excursion (narrow-to-region p (point)) (goto-char (1+ p)) (while (re-search-forward "^(" nil t) (replace-match "\\\\(")) ; avoid font-lock confusion (widen))) (insert ")\n")) (insert "(defconst wl-news-news-alist nil)\n\n")) (let ((buffer-file-coding-system (mime-charset-to-coding-system 'x-ctext))) (write-region (point-min) (point-max) out-filename))))))) (defun wl-news-parse-news (lang) (let (news-list) (while (car lang) (setq news-list (cons (cons (car lang) (wl-news-parse-news-subr (car lang))) news-list)) (setq lang (cdr lang))) news-list)) (defun wl-news-parse-news-subr (lang) (let ((filename (wl-news-news-file lang)) (reg (cadr (assoc lang wl-news-search-regexp))) news-list) (if (and filename reg) (with-temp-buffer (insert-file-contents filename) (while (re-search-forward reg nil t) (let ((beg (match-beginning 0)) (version-tmp (split-string (match-string 1) "\\.")) version news-string end) (while version-tmp (setq version (append version (list (string-to-number (car version-tmp))))) (setq version-tmp (cdr version-tmp))) (re-search-forward "^\\(\\* \\| \\)" nil t) (goto-char (- (match-beginning 0) 1)) (setq end (point)) (setq news-string (buffer-substring beg end)) (setq news-list (append news-list (list (cons version news-string)))))))) news-list)) ;;; ToDo ;;; * MORE refine code (^_^; ;;; End wanderlust-wanderlust-769699d/doc/000077500000000000000000000000001406661363500171525ustar00rootroot00000000000000wanderlust-wanderlust-769699d/doc/TODO000066400000000000000000000013001406661363500176340ustar00rootroot00000000000000** asynchronous access to the folders ** improvement of folder mode ** abbreviation of folder names (consider huge number of folders) ** independent cache mark ** History Folder (proposal by Tomotaka SUWA) ** enable to define folder icons in elmo.el ** sorted update in summary mode ** use hash table for entries in .addresses ** mitigate special treatment of NNTP around wl-folder-check-entity-async ** organize variable like wl-summary-other-frame-list so as to open matched summary in the new frame ** organize optional setting for pipe folders to download messages at once when one checks new messages ** support for rfc2192, rfc2193, rfc2221 (managing imap referral) ** putting codes in order wanderlust-wanderlust-769699d/doc/TODO.ja000066400000000000000000000015651406661363500202420ustar00rootroot00000000000000** 非同期化 ** フォルダモードの改善・拡充 ** フォルダ名の省略表示(フォルダ数が多い場合を考慮) ** キャッシュマークの独立 ** History Folder (proposal by Tomotaka SUWA) ** elmo.el でフォルダのアイコンを定義できるようにする ** サマリのソート状態を保持したまま Update ** .addresses エントリについて hash table を使う ** wl-folder-check-entity-async のあたりで NNTP が特別扱いになっているのを どうにかする ** wl-summary-other-frame-list のような変数を設け、マッチしたサマリは 別フレームで開くようにする ** パイプフォルダに、新規メールチェック時にダウンロードまでやってしまう オプションを設ける ** rfc2192, rfc2193, rfc2221 (imap referral の処理) への対応 ** コードの整理 wanderlust-wanderlust-769699d/doc/texinfo.tex000066400000000000000000013455051406661363500213650ustar00rootroot00000000000000% texinfo.tex -- TeX macros to handle Texinfo files. % % Load plain if necessary, i.e., if running under initex. \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi % \def\texinfoversion{2020-06-25.17} % % Copyright 1985, 1986, 1988, 1990-2020 Free Software Foundation, Inc. % % This texinfo.tex file 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 3 of the % License, or (at your option) any later version. % % This texinfo.tex file 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, see . % % As a special exception, when this file is read by TeX when processing % a Texinfo source document, you may use the result without % restriction. This Exception is an additional permission under section 7 % of the GNU General Public License, version 3 ("GPLv3"). % % Please try the latest version of texinfo.tex before submitting bug % reports; you can get the latest version from: % https://ftp.gnu.org/gnu/texinfo/ (the Texinfo release area), or % https://ftpmirror.gnu.org/texinfo/ (same, via a mirror), or % https://www.gnu.org/software/texinfo/ (the Texinfo home page) % The texinfo.tex in any given distribution could well be out % of date, so if that's what you're using, please check. % % Send bug reports to bug-texinfo@gnu.org. Please include a % complete document in each bug report with which we can reproduce the % problem. Patches are, of course, greatly appreciated. % % To process a Texinfo manual with TeX, it's most reliable to use the % texi2dvi shell script that comes with the distribution. For a simple % manual foo.texi, however, you can get away with this: % tex foo.texi % texindex foo.?? % tex foo.texi % tex foo.texi % dvips foo.dvi -o # or whatever; this makes foo.ps. % The extra TeX runs get the cross-reference information correct. % Sometimes one run after texindex suffices, and sometimes you need more % than two; texi2dvi does it as many times as necessary. % % It is possible to adapt texinfo.tex for other languages, to some % extent. You can get the existing language-specific files from the % full Texinfo distribution. % % The GNU Texinfo home page is https://www.gnu.org/software/texinfo. \message{Loading texinfo [version \texinfoversion]:} % If in a .fmt file, print the version number % and turn on active characters that we couldn't do earlier because % they might have appeared in the input file name. \everyjob{\message{[Texinfo version \texinfoversion]}% \catcode`+=\active \catcode`\_=\active} % LaTeX's \typeout. This ensures that the messages it is used for % are identical in format to the corresponding ones from latex/pdflatex. \def\typeout{\immediate\write17}% \chardef\other=12 % We never want plain's \outer definition of \+ in Texinfo. % For @tex, we can use \tabalign. \let\+ = \relax % Save some plain tex macros whose names we will redefine. \let\ptexb=\b \let\ptexbullet=\bullet \let\ptexc=\c \let\ptexcomma=\, \let\ptexdot=\. \let\ptexdots=\dots \let\ptexend=\end \let\ptexequiv=\equiv \let\ptexexclam=\! \let\ptexfootnote=\footnote \let\ptexgtr=> \let\ptexhat=^ \let\ptexi=\i \let\ptexindent=\indent \let\ptexinsert=\insert \let\ptexlbrace=\{ \let\ptexless=< \let\ptexnewwrite\newwrite \let\ptexnoindent=\noindent \let\ptexplus=+ \let\ptexraggedright=\raggedright \let\ptexrbrace=\} \let\ptexslash=\/ \let\ptexsp=\sp \let\ptexstar=\* \let\ptexsup=\sup \let\ptext=\t \let\ptextop=\top {\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode % If this character appears in an error message or help string, it % starts a new line in the output. \newlinechar = `^^J % Use TeX 3.0's \inputlineno to get the line number, for better error % messages, but if we're using an old version of TeX, don't do anything. % \ifx\inputlineno\thisisundefined \let\linenumber = \empty % Pre-3.0. \else \def\linenumber{l.\the\inputlineno:\space} \fi % Set up fixed words for English if not already set. \ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi \ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi \ifx\putworderror\undefined \gdef\putworderror{error}\fi \ifx\putwordfile\undefined \gdef\putwordfile{file}\fi \ifx\putwordin\undefined \gdef\putwordin{in}\fi \ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi \ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi \ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi \ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi \ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi \ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi \ifx\putwordof\undefined \gdef\putwordof{of}\fi \ifx\putwordon\undefined \gdef\putwordon{on}\fi \ifx\putwordpage\undefined \gdef\putwordpage{page}\fi \ifx\putwordsection\undefined \gdef\putwordsection{section}\fi \ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi \ifx\putwordsee\undefined \gdef\putwordsee{see}\fi \ifx\putwordSee\undefined \gdef\putwordSee{See}\fi \ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi \ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi % \ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi \ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi \ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi \ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi \ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi \ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi \ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi \ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi \ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi \ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi \ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi \ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi % \ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi \ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi \ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi \ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi \ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi % Give the space character the catcode for a space. \def\spaceisspace{\catcode`\ =10\relax} % Likewise for ^^M, the end of line character. \def\endlineisspace{\catcode13=10\relax} \chardef\dashChar = `\- \chardef\slashChar = `\/ \chardef\underChar = `\_ % Ignore a token. % \def\gobble#1{} % The following is used inside several \edef's. \def\makecsname#1{\expandafter\noexpand\csname#1\endcsname} % Hyphenation fixes. \hyphenation{ Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script ap-pen-dix bit-map bit-maps data-base data-bases eshell fall-ing half-way long-est man-u-script man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces spell-ing spell-ings stand-alone strong-est time-stamp time-stamps which-ever white-space wide-spread wrap-around } % Sometimes it is convenient to have everything in the transcript file % and nothing on the terminal. We don't just call \tracingall here, % since that produces some useless output on the terminal. We also make % some effort to order the tracing commands to reduce output in the log % file; cf. trace.sty in LaTeX. % \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% \def\loggingall{% \tracingstats2 \tracingpages1 \tracinglostchars2 % 2 gives us more in etex \tracingparagraphs1 \tracingoutput1 \tracingmacros2 \tracingrestores1 \showboxbreadth\maxdimen \showboxdepth\maxdimen \ifx\eTeXversion\thisisundefined\else % etex gives us more logging \tracingscantokens1 \tracingifs1 \tracinggroups1 \tracingnesting2 \tracingassigns1 \fi \tracingcommands3 % 3 gives us more in etex \errorcontextlines16 }% % @errormsg{MSG}. Do the index-like expansions on MSG, but if things % aren't perfect, it's not the end of the world, being an error message, % after all. % \def\errormsg{\begingroup \indexnofonts \doerrormsg} \def\doerrormsg#1{\errmessage{#1}} % add check for \lastpenalty to plain's definitions. If the last thing % we did was a \nobreak, we don't want to insert more space. % \def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount \removelastskip\penalty-50\smallskip\fi\fi} \def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount \removelastskip\penalty-100\medskip\fi\fi} \def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount \removelastskip\penalty-200\bigskip\fi\fi} % Output routine % % For a final copy, take out the rectangles % that mark overfull boxes (in case you have decided % that the text looks ok even though it passes the margin). % \def\finalout{\overfullrule=0pt } \newdimen\outerhsize \newdimen\outervsize % set by the paper size routines \newdimen\topandbottommargin \topandbottommargin=.75in % Output a mark which sets \thischapter, \thissection and \thiscolor. % We dump everything together because we only have one kind of mark. % This works because we only use \botmark / \topmark, not \firstmark. % % A mark contains a subexpression of the \ifcase ... \fi construct. % \get*marks macros below extract the needed part using \ifcase. % % Another complication is to let the user choose whether \thischapter % (\thissection) refers to the chapter (section) in effect at the top % of a page, or that at the bottom of a page. % \domark is called twice inside \chapmacro, to add one % mark before the section break, and one after. % In the second call \prevchapterdefs is the same as \currentchapterdefs, % and \prevsectiondefs is the same as \currentsectiondefs. % Then if the page is not broken at the mark, some of the previous % section appears on the page, and we can get the name of this section % from \firstmark for @everyheadingmarks top. % @everyheadingmarks bottom uses \botmark. % % See page 260 of The TeXbook. \def\domark{% \toks0=\expandafter{\currentchapterdefs}% \toks2=\expandafter{\currentsectiondefs}% \toks4=\expandafter{\prevchapterdefs}% \toks6=\expandafter{\prevsectiondefs}% \toks8=\expandafter{\currentcolordefs}% \mark{% \the\toks0 \the\toks2 % 0: marks for @everyheadingmarks top \noexpand\or \the\toks4 \the\toks6 % 1: for @everyheadingmarks bottom \noexpand\else \the\toks8 % 2: color marks }% } % \gettopheadingmarks, \getbottomheadingmarks, % \getcolormarks - extract needed part of mark. % % \topmark doesn't work for the very first chapter (after the title % page or the contents), so we use \firstmark there -- this gets us % the mark with the chapter defs, unless the user sneaks in, e.g., % @setcolor (or @url, or @link, etc.) between @contents and the very % first @chapter. \def\gettopheadingmarks{% \ifcase0\the\savedtopmark\fi \ifx\thischapter\empty \ifcase0\firstmark\fi \fi } \def\getbottomheadingmarks{\ifcase1\botmark\fi} \def\getcolormarks{\ifcase2\the\savedtopmark\fi} % Avoid "undefined control sequence" errors. \def\currentchapterdefs{} \def\currentsectiondefs{} \def\currentsection{} \def\prevchapterdefs{} \def\prevsectiondefs{} \def\currentcolordefs{} % Margin to add to right of even pages, to left of odd pages. \newdimen\bindingoffset \newdimen\normaloffset \newdimen\txipagewidth \newdimen\txipageheight % Main output routine. % \chardef\PAGE = 255 \newtoks\defaultoutput \defaultoutput = {\savetopmark\onepageout{\pagecontents\PAGE}} \output=\expandafter{\the\defaultoutput} \newbox\headlinebox \newbox\footlinebox % When outputting the double column layout for indices, an output routine % is run several times, which hides the original value of \topmark. This % can lead to a page heading being output and duplicating the chapter heading % of the index. Hence, save the contents of \topmark at the beginning of % the output routine. The saved contents are valid until we actually % \shipout a page. % % (We used to run a short output routine to actually set \topmark and % \firstmark to the right values, but if this was called with an empty page % containing whatsits for writing index entries, the whatsits would be thrown % away and the index auxiliary file would remain empty.) % \newtoks\savedtopmark \newif\iftopmarksaved \topmarksavedtrue \def\savetopmark{% \iftopmarksaved\else \global\savedtopmark=\expandafter{\topmark}% \global\topmarksavedtrue \fi } % \onepageout takes a vbox as an argument. % \shipout a vbox for a single page, adding an optional header, footer % and footnote. This also causes index entries for this page to be written % to the auxiliary files. % \def\onepageout#1{% \hoffset=\normaloffset % \ifodd\pageno \advance\hoffset by \bindingoffset \else \advance\hoffset by -\bindingoffset\fi % \checkchapterpage % % Retrieve the information for the headings from the marks in the page, % and call Plain TeX's \makeheadline and \makefootline, which use the % values in \headline and \footline. % % Common context changes for both heading and footing. % Do this outside of the \shipout so @code etc. will be expanded in % the headline as they should be, not taken literally (outputting ''code). \def\commonheadfootline{\let\hsize=\txipagewidth \texinfochars} % \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi \global\setbox\headlinebox = \vbox{\commonheadfootline \makeheadline}% \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi \global\setbox\footlinebox = \vbox{\commonheadfootline \makefootline}% % {% % Set context for writing to auxiliary files like index files. % Have to do this stuff outside the \shipout because we want it to % take effect in \write's, yet the group defined by the \vbox ends % before the \shipout runs. % \atdummies % don't expand commands in the output. \turnoffactive \shipout\vbox{% % Do this early so pdf references go to the beginning of the page. \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi % \unvbox\headlinebox \pagebody{#1}% \ifdim\ht\footlinebox > 0pt % Only leave this space if the footline is nonempty. % (We lessened \vsize for it in \oddfootingyyy.) % The \baselineskip=24pt in plain's \makefootline has no effect. \vskip 24pt \unvbox\footlinebox \fi % }% }% \global\topmarksavedfalse \advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi } \newinsert\margin \dimen\margin=\maxdimen % Main part of page, including any footnotes \def\pagebody#1{\vbox to\txipageheight{\boxmaxdepth=\maxdepth #1}} {\catcode`\@ =11 \gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi % marginal hacks, juha@viisa.uucp (Juha Takala) \ifvoid\margin\else % marginal info is present \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi \dimen@=\dp#1\relax \unvbox#1\relax \ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi \ifr@ggedbottom \kern-\dimen@ \vfil \fi} } % Check if we are on the first page of a chapter. Used for printing headings. \newif\ifchapterpage \def\checkchapterpage{% % Get the chapter that was current at the end of the last page \ifcase1\the\savedtopmark\fi \let\prevchaptername\thischaptername % \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi \let\curchaptername\thischaptername % \ifx\curchaptername\prevchaptername \chapterpagefalse \else \chapterpagetrue \fi } % Argument parsing % Parse an argument, then pass it to #1. The argument is the rest of % the input line (except we remove a trailing comment). #1 should be a % macro which expects an ordinary undelimited TeX argument. % For example, \def\foo{\parsearg\fooxxx}. % \def\parsearg{\parseargusing{}} \def\parseargusing#1#2{% \def\argtorun{#2}% \begingroup \obeylines \spaceisspace #1% \parseargline\empty% Insert the \empty token, see \finishparsearg below. } {\obeylines % \gdef\parseargline#1^^M{% \endgroup % End of the group started in \parsearg. \argremovecomment #1\comment\ArgTerm% }% } % First remove any @comment, then any @c comment. Pass the result on to % \argcheckspaces. \def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} \def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm} % Each occurrence of `\^^M' or `\^^M' is replaced by a single space. % % \argremovec might leave us with trailing space, e.g., % @end itemize @c foo % This space token undergoes the same procedure and is eventually removed % by \finishparsearg. % \def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M} \def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M} \def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{% \def\temp{#3}% \ifx\temp\empty % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp: \let\temp\finishparsearg \else \let\temp\argcheckspaces \fi % Put the space token in: \temp#1 #3\ArgTerm } % If a _delimited_ argument is enclosed in braces, they get stripped; so % to get _exactly_ the rest of the line, we had to prevent such situation. % We prepended an \empty token at the very beginning and we expand it now, % just before passing the control to \argtorun. % (Similarly, we have to think about #3 of \argcheckspacesY above: it is % either the null string, or it ends with \^^M---thus there is no danger % that a pair of braces would be stripped. % % But first, we have to remove the trailing space token. % \def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}} % \parseargdef - define a command taking an argument on the line % % \parseargdef\foo{...} % is roughly equivalent to % \def\foo{\parsearg\Xfoo} % \def\Xfoo#1{...} \def\parseargdef#1{% \expandafter \doparseargdef \csname\string#1\endcsname #1% } \def\doparseargdef#1#2{% \def#2{\parsearg#1}% \def#1##1% } % Several utility definitions with active space: { \obeyspaces \gdef\obeyedspace{ } % Make each space character in the input produce a normal interword % space in the output. Don't allow a line break at this space, as this % is used only in environments like @example, where each line of input % should produce a line of output anyway. % \gdef\sepspaces{\obeyspaces\let =\tie} % If an index command is used in an @example environment, any spaces % therein should become regular spaces in the raw index file, not the % expansion of \tie (\leavevmode \penalty \@M \ ). \gdef\unsepspaces{\let =\space} } \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} % Define the framework for environments in texinfo.tex. It's used like this: % % \envdef\foo{...} % \def\Efoo{...} % % It's the responsibility of \envdef to insert \begingroup before the % actual body; @end closes the group after calling \Efoo. \envdef also % defines \thisenv, so the current environment is known; @end checks % whether the environment name matches. The \checkenv macro can also be % used to check whether the current environment is the one expected. % % Non-false conditionals (@iftex, @ifset) don't fit into this, so they % are not treated as environments; they don't open a group. (The % implementation of @end takes care not to call \endgroup in this % special case.) % At run-time, environments start with this: \def\startenvironment#1{\begingroup\def\thisenv{#1}} % initialize \let\thisenv\empty % ... but they get defined via ``\envdef\foo{...}'': \long\def\envdef#1#2{\def#1{\startenvironment#1#2}} \def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}} % Check whether we're in the right environment: \def\checkenv#1{% \def\temp{#1}% \ifx\thisenv\temp \else \badenverr \fi } % Environment mismatch, #1 expected: \def\badenverr{% \errhelp = \EMsimple \errmessage{This command can appear only \inenvironment\temp, not \inenvironment\thisenv}% } \def\inenvironment#1{% \ifx#1\empty outside of any environment% \else in environment \expandafter\string#1% \fi } % @end foo executes the definition of \Efoo. % But first, it executes a specialized version of \checkenv % \parseargdef\end{% \if 1\csname iscond.#1\endcsname \else % The general wording of \badenverr may not be ideal. \expandafter\checkenv\csname#1\endcsname \csname E#1\endcsname \endgroup \fi } \newhelp\EMsimple{Press RETURN to continue.} % Be sure we're in horizontal mode when doing a tie, since we make space % equivalent to this in @example-like environments. Otherwise, a space % at the beginning of a line will start with \penalty -- and % since \penalty is valid in vertical mode, we'd end up putting the % penalty on the vertical list instead of in the new paragraph. {\catcode`@ = 11 % Avoid using \@M directly, because that causes trouble % if the definition is written into an index file. \global\let\tiepenalty = \@M \gdef\tie{\leavevmode\penalty\tiepenalty\ } } % @: forces normal size whitespace following. \def\:{\spacefactor=1000 } % @* forces a line break. \def\*{\unskip\hfil\break\hbox{}\ignorespaces} % @/ allows a line break. \let\/=\allowbreak % @. is an end-of-sentence period. \def\.{.\spacefactor=\endofsentencespacefactor\space} % @! is an end-of-sentence bang. \def\!{!\spacefactor=\endofsentencespacefactor\space} % @? is an end-of-sentence query. \def\?{?\spacefactor=\endofsentencespacefactor\space} % @frenchspacing on|off says whether to put extra space after punctuation. % \def\onword{on} \def\offword{off} % \parseargdef\frenchspacing{% \def\temp{#1}% \ifx\temp\onword \plainfrenchspacing \else\ifx\temp\offword \plainnonfrenchspacing \else \errhelp = \EMsimple \errmessage{Unknown @frenchspacing option `\temp', must be on|off}% \fi\fi } % @w prevents a word break. Without the \leavevmode, @w at the % beginning of a paragraph, when TeX is still in vertical mode, would % produce a whole line of output instead of starting the paragraph. \def\w#1{\leavevmode\hbox{#1}} % @group ... @end group forces ... to be all on one page, by enclosing % it in a TeX vbox. We use \vtop instead of \vbox to construct the box % to keep its height that of a normal line. According to the rules for % \topskip (p.114 of the TeXbook), the glue inserted is % max (\topskip - \ht (first item), 0). If that height is large, % therefore, no glue is inserted, and the space between the headline and % the text is small, which looks bad. % % Another complication is that the group might be very large. This can % cause the glue on the previous page to be unduly stretched, because it % does not have much material. In this case, it's better to add an % explicit \vfill so that the extra space is at the bottom. The % threshold for doing this is if the group is more than \vfilllimit % percent of a page (\vfilllimit can be changed inside of @tex). % \newbox\groupbox \def\vfilllimit{0.7} % \envdef\group{% \ifnum\catcode`\^^M=\active \else \errhelp = \groupinvalidhelp \errmessage{@group invalid in context where filling is enabled}% \fi \startsavinginserts % \setbox\groupbox = \vtop\bgroup % Do @comment since we are called inside an environment such as % @example, where each end-of-line in the input causes an % end-of-line in the output. We don't want the end-of-line after % the `@group' to put extra space in the output. Since @group % should appear on a line by itself (according to the Texinfo % manual), we don't worry about eating any user text. \comment } % % The \vtop produces a box with normal height and large depth; thus, TeX puts % \baselineskip glue before it, and (when the next line of text is done) % \lineskip glue after it. Thus, space below is not quite equal to space % above. But it's pretty close. \def\Egroup{% % To get correct interline space between the last line of the group % and the first line afterwards, we have to propagate \prevdepth. \endgraf % Not \par, as it may have been set to \lisppar. \global\dimen1 = \prevdepth \egroup % End the \vtop. \addgroupbox \prevdepth = \dimen1 \checkinserts } \def\addgroupbox{ % \dimen0 is the vertical size of the group's box. \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox % \dimen2 is how much space is left on the page (more or less). \dimen2 = \txipageheight \advance\dimen2 by -\pagetotal % if the group doesn't fit on the current page, and it's a big big % group, force a page break. \ifdim \dimen0 > \dimen2 \ifdim \pagetotal < \vfilllimit\txipageheight \page \fi \fi \box\groupbox } % % TeX puts in an \escapechar (i.e., `@') at the beginning of the help % message, so this ends up printing `@group can only ...'. % \newhelp\groupinvalidhelp{% group can only be used in environments such as @example,^^J% where each line of input produces a line of output.} % @need space-in-mils % forces a page break if there is not space-in-mils remaining. \newdimen\mil \mil=0.001in \parseargdef\need{% % Ensure vertical mode, so we don't make a big box in the middle of a % paragraph. \par % % If the @need value is less than one line space, it's useless. \dimen0 = #1\mil \dimen2 = \ht\strutbox \advance\dimen2 by \dp\strutbox \ifdim\dimen0 > \dimen2 % % Do a \strut just to make the height of this box be normal, so the % normal leading is inserted relative to the preceding line. % And a page break here is fine. \vtop to #1\mil{\strut\vfil}% % % TeX does not even consider page breaks if a penalty added to the % main vertical list is 10000 or more. But in order to see if the % empty box we just added fits on the page, we must make it consider % page breaks. On the other hand, we don't want to actually break the % page after the empty box. So we use a penalty of 9999. % % There is an extremely small chance that TeX will actually break the % page at this \penalty, if there are no other feasible breakpoints in % sight. (If the user is using lots of big @group commands, which % almost-but-not-quite fill up a page, TeX will have a hard time doing % good page breaking, for example.) However, I could not construct an % example where a page broke at this \penalty; if it happens in a real % document, then we can reconsider our strategy. \penalty9999 % % Back up by the size of the box, whether we did a page break or not. \kern -#1\mil % % Do not allow a page break right after this kern. \nobreak \fi } % @br forces paragraph break (and is undocumented). \let\br = \par % @page forces the start of a new page. % \def\page{\par\vfill\supereject} % @exdent text.... % outputs text on separate line in roman font, starting at standard page margin % This records the amount of indent in the innermost environment. % That's how much \exdent should take out. \newskip\exdentamount % This defn is used inside fill environments such as @defun. \parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break} % This defn is used inside nofill environments such as @example. \parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount \leftline{\hskip\leftskip{\rm#1}}}} % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current % paragraph. For more general purposes, use the \margin insertion % class. WHICH is `l' or `r'. Not documented, written for gawk manual. % \newskip\inmarginspacing \inmarginspacing=1cm \def\strutdepth{\dp\strutbox} % \def\doinmargin#1#2{\strut\vadjust{% \nobreak \kern-\strutdepth \vtop to \strutdepth{% \baselineskip=\strutdepth \vss % if you have multiple lines of stuff to put here, you'll need to % make the vbox yourself of the appropriate size. \ifx#1l% \llap{\ignorespaces #2\hskip\inmarginspacing}% \else \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% \fi \null }% }} \def\inleftmargin{\doinmargin l} \def\inrightmargin{\doinmargin r} % % @inmargin{TEXT [, RIGHT-TEXT]} % (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; % else use TEXT for both). % \def\inmargin#1{\parseinmargin #1,,\finish} \def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \def\lefttext{#1}% have both texts \def\righttext{#2}% \else \def\lefttext{#1}% have only one text \def\righttext{#1}% \fi % \ifodd\pageno \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin \else \def\temp{\inleftmargin\lefttext}% \fi \temp } % @include FILE -- \input text of FILE. % \def\include{\parseargusing\filenamecatcodes\includezzz} \def\includezzz#1{% \pushthisfilestack \def\thisfile{#1}% {% \makevalueexpandable % we want to expand any @value in FILE. \turnoffactive % and allow special characters in the expansion \indexnofonts % Allow `@@' and other weird things in file names. \wlog{texinfo.tex: doing @include of #1^^J}% \edef\temp{\noexpand\input #1 }% % % This trickery is to read FILE outside of a group, in case it makes % definitions, etc. \expandafter }\temp \popthisfilestack } \def\filenamecatcodes{% \catcode`\\=\other \catcode`~=\other \catcode`^=\other \catcode`_=\other \catcode`|=\other \catcode`<=\other \catcode`>=\other \catcode`+=\other \catcode`-=\other \catcode`\`=\other \catcode`\'=\other } \def\pushthisfilestack{% \expandafter\pushthisfilestackX\popthisfilestack\StackTerm } \def\pushthisfilestackX{% \expandafter\pushthisfilestackY\thisfile\StackTerm } \def\pushthisfilestackY #1\StackTerm #2\StackTerm {% \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}% } \def\popthisfilestack{\errthisfilestackempty} \def\errthisfilestackempty{\errmessage{Internal error: the stack of filenames is empty.}} % \def\thisfile{} % @center line % outputs that line, centered. % \parseargdef\center{% \ifhmode \let\centersub\centerH \else \let\centersub\centerV \fi \centersub{\hfil \ignorespaces#1\unskip \hfil}% \let\centersub\relax % don't let the definition persist, just in case } \def\centerH#1{{% \hfil\break \advance\hsize by -\leftskip \advance\hsize by -\rightskip \line{#1}% \break }} % \newcount\centerpenalty \def\centerV#1{% % The idea here is the same as in \startdefun, \cartouche, etc.: if % @center is the first thing after a section heading, we need to wipe % out the negative parskip inserted by \sectionheading, but still % prevent a page break here. \centerpenalty = \lastpenalty \ifnum\centerpenalty>10000 \vskip\parskip \fi \ifnum\centerpenalty>9999 \penalty\centerpenalty \fi \line{\kern\leftskip #1\kern\rightskip}% } % @sp n outputs n lines of vertical space % \parseargdef\sp{\vskip #1\baselineskip} % @comment ...line which is ignored... % @c is the same as @comment % @ignore ... @end ignore is another way to write a comment \def\c{\begingroup \catcode`\^^M=\active% \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% \cxxx} {\catcode`\^^M=\active \gdef\cxxx#1^^M{\endgroup}} % \let\comment\c % @paragraphindent NCHARS % We'll use ems for NCHARS, close enough. % NCHARS can also be the word `asis' or `none'. % We cannot feasibly implement @paragraphindent asis, though. % \def\asisword{asis} % no translation, these are keywords \def\noneword{none} % \parseargdef\paragraphindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \defaultparindent = 0pt \else \defaultparindent = #1em \fi \fi \parindent = \defaultparindent } % @exampleindent NCHARS % We'll use ems for NCHARS like @paragraphindent. % It seems @exampleindent asis isn't necessary, but % I preserve it to make it similar to @paragraphindent. \parseargdef\exampleindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \lispnarrowing = 0pt \else \lispnarrowing = #1em \fi \fi } % @firstparagraphindent WORD % If WORD is `none', then suppress indentation of the first paragraph % after a section heading. If WORD is `insert', then do indent at such % paragraphs. % % The paragraph indentation is suppressed or not by calling % \suppressfirstparagraphindent, which the sectioning commands do. % We switch the definition of this back and forth according to WORD. % By default, we suppress indentation. % \def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent} \def\insertword{insert} % \parseargdef\firstparagraphindent{% \def\temp{#1}% \ifx\temp\noneword \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent \else\ifx\temp\insertword \let\suppressfirstparagraphindent = \relax \else \errhelp = \EMsimple \errmessage{Unknown @firstparagraphindent option `\temp'}% \fi\fi } % Here is how we actually suppress indentation. Redefine \everypar to % \kern backwards by \parindent, and then reset itself to empty. % % We also make \indent itself not actually do anything until the next % paragraph. % \gdef\dosuppressfirstparagraphindent{% \gdef\indent {\restorefirstparagraphindent \indent}% \gdef\noindent{\restorefirstparagraphindent \noindent}% \global\everypar = {\kern -\parindent \restorefirstparagraphindent}% } % \gdef\restorefirstparagraphindent{% \global\let\indent = \ptexindent \global\let\noindent = \ptexnoindent \global\everypar = {}% } % @refill is a no-op. \let\refill=\relax % @setfilename INFO-FILENAME - ignored \let\setfilename=\comment % @bye. \outer\def\bye{\chappager\pagelabels\tracingstats=1\ptexend} \message{pdf,} % adobe `portable' document format \newcount\tempnum \newcount\lnkcount \newtoks\filename \newcount\filenamelength \newcount\pgn \newtoks\toksA \newtoks\toksB \newtoks\toksC \newtoks\toksD \newbox\boxA \newbox\boxB \newcount\countA \newif\ifpdf \newif\ifpdfmakepagedest % % For LuaTeX % \newif\iftxiuseunicodedestname \txiuseunicodedestnamefalse % For pdfTeX etc. \ifx\luatexversion\thisisundefined \else % Use Unicode destination names \txiuseunicodedestnametrue % Escape PDF strings with converting UTF-16 from UTF-8 \begingroup \catcode`\%=12 \directlua{ function UTF16oct(str) tex.sprint(string.char(0x5c) .. '376' .. string.char(0x5c) .. '377') for c in string.utfvalues(str) do if c < 0x10000 then tex.sprint( string.format(string.char(0x5c) .. string.char(0x25) .. '03o' .. string.char(0x5c) .. string.char(0x25) .. '03o', math.floor(c / 256), math.floor(c % 256))) else c = c - 0x10000 local c_hi = c / 1024 + 0xd800 local c_lo = c % 1024 + 0xdc00 tex.sprint( string.format(string.char(0x5c) .. string.char(0x25) .. '03o' .. string.char(0x5c) .. string.char(0x25) .. '03o' .. string.char(0x5c) .. string.char(0x25) .. '03o' .. string.char(0x5c) .. string.char(0x25) .. '03o', math.floor(c_hi / 256), math.floor(c_hi % 256), math.floor(c_lo / 256), math.floor(c_lo % 256))) end end end } \endgroup \def\pdfescapestrutfsixteen#1{\directlua{UTF16oct('\luaescapestring{#1}')}} % Escape PDF strings without converting \begingroup \directlua{ function PDFescstr(str) for c in string.bytes(str) do if c <= 0x20 or c >= 0x80 or c == 0x28 or c == 0x29 or c == 0x5c then tex.sprint(-2, string.format(string.char(0x5c) .. string.char(0x25) .. '03o', c)) else tex.sprint(-2, string.char(c)) end end end } % The -2 in the arguments here gives all the input to TeX catcode 12 % (other) or 10 (space), preventing undefined control sequence errors. See % https://lists.gnu.org/archive/html/bug-texinfo/2019-08/msg00031.html % \endgroup \def\pdfescapestring#1{\directlua{PDFescstr('\luaescapestring{#1}')}} \ifnum\luatexversion>84 % For LuaTeX >= 0.85 \def\pdfdest{\pdfextension dest} \let\pdfoutput\outputmode \def\pdfliteral{\pdfextension literal} \def\pdfcatalog{\pdfextension catalog} \def\pdftexversion{\numexpr\pdffeedback version\relax} \let\pdfximage\saveimageresource \let\pdfrefximage\useimageresource \let\pdflastximage\lastsavedimageresourceindex \def\pdfendlink{\pdfextension endlink\relax} \def\pdfoutline{\pdfextension outline} \def\pdfstartlink{\pdfextension startlink} \def\pdffontattr{\pdfextension fontattr} \def\pdfobj{\pdfextension obj} \def\pdflastobj{\numexpr\pdffeedback lastobj\relax} \let\pdfpagewidth\pagewidth \let\pdfpageheight\pageheight \edef\pdfhorigin{\pdfvariable horigin} \edef\pdfvorigin{\pdfvariable vorigin} \fi \fi % when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1 % can be set). So we test for \relax and 0 as well as being undefined. \ifx\pdfoutput\thisisundefined \else \ifx\pdfoutput\relax \else \ifcase\pdfoutput \else \pdftrue \fi \fi \fi \newif\ifpdforxetex \pdforxetexfalse \ifpdf \pdforxetextrue \fi \ifx\XeTeXrevision\thisisundefined\else \pdforxetextrue \fi % Output page labels information. % See PDF reference v.1.7 p.594, section 8.3.1. \ifpdf \def\pagelabels{% \def\title{0 << /P (T-) /S /D >>}% \edef\roman{\the\romancount << /S /r >>}% \edef\arabic{\the\arabiccount << /S /D >>}% % % Page label ranges must be increasing. Remove any duplicates. % (There is a slight chance of this being wrong if e.g. there is % a @contents but no @titlepage, etc.) % \ifnum\romancount=0 \def\roman{}\fi \ifnum\arabiccount=0 \def\title{}% \else \ifnum\romancount=\arabiccount \def\roman{}\fi \fi % \ifnum\romancount<\arabiccount \pdfcatalog{/PageLabels << /Nums [\title \roman \arabic ] >> }\relax \else \pdfcatalog{/PageLabels << /Nums [\title \arabic \roman ] >> }\relax \fi } \else \let\pagelabels\relax \fi \newcount\pagecount \pagecount=0 \newcount\romancount \romancount=0 \newcount\arabiccount \arabiccount=0 \ifpdf \let\ptxadvancepageno\advancepageno \def\advancepageno{% \ptxadvancepageno\global\advance\pagecount by 1 } \fi % PDF uses PostScript string constants for the names of xref targets, % for display in the outlines, and in other places. Thus, we have to % double any backslashes. Otherwise, a name like "\node" will be % interpreted as a newline (\n), followed by o, d, e. Not good. % % See http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html and % related messages. The final outcome is that it is up to the TeX user % to double the backslashes and otherwise make the string valid, so % that's what we do. pdftex 1.30.0 (ca.2005) introduced a primitive to % do this reliably, so we use it. % #1 is a control sequence in which to do the replacements, % which we \xdef. \def\txiescapepdf#1{% \ifx\pdfescapestring\thisisundefined % No primitive available; should we give a warning or log? % Many times it won't matter. \xdef#1{#1}% \else % The expandable \pdfescapestring primitive escapes parentheses, % backslashes, and other special chars. \xdef#1{\pdfescapestring{#1}}% \fi } \def\txiescapepdfutfsixteen#1{% \ifx\pdfescapestrutfsixteen\thisisundefined % No UTF-16 converting macro available. \txiescapepdf{#1}% \else \xdef#1{\pdfescapestrutfsixteen{#1}}% \fi } \newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images with PDF output, and none of those formats could be found. (.eps cannot be supported due to the design of the PDF format; use regular TeX (DVI output) for that.)} \ifpdf % % Color manipulation macros using ideas from pdfcolor.tex, % except using rgb instead of cmyk; the latter is said to render as a % very dark gray on-screen and a very dark halftone in print, instead % of actual black. The dark red here is dark enough to print on paper as % nearly black, but still distinguishable for online viewing. We use % black by default, though. \def\rgbDarkRed{0.50 0.09 0.12} \def\rgbBlack{0 0 0} % % rg sets the color for filling (usual text, etc.); % RG sets the color for stroking (thin rules, e.g., normal _'s). \def\pdfsetcolor#1{\pdfliteral{#1 rg #1 RG}} % % Set color, and create a mark which defines \thiscolor accordingly, % so that \makeheadline knows which color to restore. \def\setcolor#1{% \xdef\currentcolordefs{\gdef\noexpand\thiscolor{#1}}% \domark \pdfsetcolor{#1}% } % \def\maincolor{\rgbBlack} \pdfsetcolor{\maincolor} \edef\thiscolor{\maincolor} \def\currentcolordefs{} % \def\makefootline{% \baselineskip24pt \line{\pdfsetcolor{\maincolor}\the\footline}% } % \def\makeheadline{% \vbox to 0pt{% \vskip-22.5pt \line{% \vbox to8.5pt{}% % Extract \thiscolor definition from the marks. \getcolormarks % Typeset the headline with \maincolor, then restore the color. \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}% }% \vss }% \nointerlineskip } % % \pdfcatalog{/PageMode /UseOutlines} % % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). \def\dopdfimage#1#2#3{% \def\pdfimagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% \def\pdfimageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% % % pdftex (and the PDF format) support .pdf, .png, .jpg (among % others). Let's try in that order, PDF first since if % someone has a scalable image, presumably better to use that than a % bitmap. \let\pdfimgext=\empty \begingroup \openin 1 #1.pdf \ifeof 1 \openin 1 #1.PDF \ifeof 1 \openin 1 #1.png \ifeof 1 \openin 1 #1.jpg \ifeof 1 \openin 1 #1.jpeg \ifeof 1 \openin 1 #1.JPG \ifeof 1 \errhelp = \nopdfimagehelp \errmessage{Could not find image file #1 for pdf}% \else \gdef\pdfimgext{JPG}% \fi \else \gdef\pdfimgext{jpeg}% \fi \else \gdef\pdfimgext{jpg}% \fi \else \gdef\pdfimgext{png}% \fi \else \gdef\pdfimgext{PDF}% \fi \else \gdef\pdfimgext{pdf}% \fi \closein 1 \endgroup % % without \immediate, ancient pdftex seg faults when the same image is % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) \ifnum\pdftexversion < 14 \immediate\pdfimage \else \immediate\pdfximage \fi \ifdim \wd0 >0pt width \pdfimagewidth \fi \ifdim \wd2 >0pt height \pdfimageheight \fi \ifnum\pdftexversion<13 #1.\pdfimgext \else {#1.\pdfimgext}% \fi \ifnum\pdftexversion < 14 \else \pdfrefximage \pdflastximage \fi} % \def\setpdfdestname#1{{% % We have to set dummies so commands such as @code, and characters % such as \, aren't expanded when present in a section title. \indexnofonts \makevalueexpandable \turnoffactive \iftxiuseunicodedestname \ifx \declaredencoding \latone % Pass through Latin-1 characters. % LuaTeX with byte wise I/O converts Latin-1 characters to Unicode. \else \ifx \declaredencoding \utfeight % Pass through Unicode characters. \else % Use ASCII approximations in destination names. \passthroughcharsfalse \fi \fi \else % Use ASCII approximations in destination names. \passthroughcharsfalse \fi \def\pdfdestname{#1}% \txiescapepdf\pdfdestname }} % \def\setpdfoutlinetext#1{{% \indexnofonts \makevalueexpandable \turnoffactive \ifx \declaredencoding \latone % The PDF format can use an extended form of Latin-1 in bookmark % strings. See Appendix D of the PDF Reference, Sixth Edition, for % the "PDFDocEncoding". \passthroughcharstrue % Pass through Latin-1 characters. % LuaTeX: Convert to Unicode % pdfTeX: Use Latin-1 as PDFDocEncoding \def\pdfoutlinetext{#1}% \else \ifx \declaredencoding \utfeight \ifx\luatexversion\thisisundefined % For pdfTeX with UTF-8. % TODO: the PDF format can use UTF-16 in bookmark strings, % but the code for this isn't done yet. % Use ASCII approximations. \passthroughcharsfalse \def\pdfoutlinetext{#1}% \else % For LuaTeX with UTF-8. % Pass through Unicode characters for title texts. \passthroughcharstrue \def\pdfoutlinetext{#1}% \fi \else % For non-Latin-1 or non-UTF-8 encodings. % Use ASCII approximations. \passthroughcharsfalse \def\pdfoutlinetext{#1}% \fi \fi % LuaTeX: Convert to UTF-16 % pdfTeX: Use Latin-1 as PDFDocEncoding \txiescapepdfutfsixteen\pdfoutlinetext }} % \def\pdfmkdest#1{% \setpdfdestname{#1}% \safewhatsit{\pdfdest name{\pdfdestname} xyz}% } % % used to mark target names; must be expandable. \def\pdfmkpgn#1{#1} % % by default, use black for everything. \def\urlcolor{\rgbBlack} \def\linkcolor{\rgbBlack} \def\endlink{\setcolor{\maincolor}\pdfendlink} % % Adding outlines to PDF; macros for calculating structure of outlines % come from Petr Olsak \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% \else \csname#1\endcsname \fi} \def\advancenumber#1{\tempnum=\expnumber{#1}\relax \advance\tempnum by 1 \expandafter\xdef\csname#1\endcsname{\the\tempnum}} % % #1 is the section text, which is what will be displayed in the % outline by the pdf viewer. #2 is the pdf expression for the number % of subentries (or empty, for subsubsections). #3 is the node text, % which might be empty if this toc entry had no corresponding node. % #4 is the page number % \def\dopdfoutline#1#2#3#4{% % Generate a link to the node text if that exists; else, use the % page number. We could generate a destination for the section % text in the case where a section has no node, but it doesn't % seem worth the trouble, since most documents are normally structured. \setpdfoutlinetext{#1} \setpdfdestname{#3} \ifx\pdfdestname\empty \def\pdfdestname{#4}% \fi % \pdfoutline goto name{\pdfmkpgn{\pdfdestname}}#2{\pdfoutlinetext}% } % \def\pdfmakeoutlines{% \begingroup % Read toc silently, to get counts of subentries for \pdfoutline. \def\partentry##1##2##3##4{}% ignore parts in the outlines \def\numchapentry##1##2##3##4{% \def\thischapnum{##2}% \def\thissecnum{0}% \def\thissubsecnum{0}% }% \def\numsecentry##1##2##3##4{% \advancenumber{chap\thischapnum}% \def\thissecnum{##2}% \def\thissubsecnum{0}% }% \def\numsubsecentry##1##2##3##4{% \advancenumber{sec\thissecnum}% \def\thissubsecnum{##2}% }% \def\numsubsubsecentry##1##2##3##4{% \advancenumber{subsec\thissubsecnum}% }% \def\thischapnum{0}% \def\thissecnum{0}% \def\thissubsecnum{0}% % % use \def rather than \let here because we redefine \chapentry et % al. a second time, below. \def\appentry{\numchapentry}% \def\appsecentry{\numsecentry}% \def\appsubsecentry{\numsubsecentry}% \def\appsubsubsecentry{\numsubsubsecentry}% \def\unnchapentry{\numchapentry}% \def\unnsecentry{\numsecentry}% \def\unnsubsecentry{\numsubsecentry}% \def\unnsubsubsecentry{\numsubsubsecentry}% \readdatafile{toc}% % % Read toc second time, this time actually producing the outlines. % The `-' means take the \expnumber as the absolute number of % subentries, which we calculated on our first read of the .toc above. % % We use the node names as the destinations. % % Currently we prefix the section name with the section number % for chapter and appendix headings only in order to avoid too much % horizontal space being required in the PDF viewer. \def\numchapentry##1##2##3##4{% \dopdfoutline{##2 ##1}{count-\expnumber{chap##2}}{##3}{##4}}% \def\unnchapentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}% \def\numsecentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}% \def\numsubsecentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}% \def\numsubsubsecentry##1##2##3##4{% count is always zero \dopdfoutline{##1}{}{##3}{##4}}% % % PDF outlines are displayed using system fonts, instead of % document fonts. Therefore we cannot use special characters, % since the encoding is unknown. For example, the eogonek from % Latin 2 (0xea) gets translated to a | character. Info from % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100. % % TODO this right, we have to translate 8-bit characters to % their "best" equivalent, based on the @documentencoding. Too % much work for too little return. Just use the ASCII equivalents % we use for the index sort strings. % \indexnofonts \setupdatafile % We can have normal brace characters in the PDF outlines, unlike % Texinfo index files. So set that up. \def\{{\lbracecharliteral}% \def\}{\rbracecharliteral}% \catcode`\\=\active \otherbackslash \input \tocreadfilename \endgroup } {\catcode`[=1 \catcode`]=2 \catcode`{=\other \catcode`}=\other \gdef\lbracecharliteral[{]% \gdef\rbracecharliteral[}]% ] % \def\skipspaces#1{\def\PP{#1}\def\D{|}% \ifx\PP\D\let\nextsp\relax \else\let\nextsp\skipspaces \addtokens{\filename}{\PP}% \advance\filenamelength by 1 \fi \nextsp} \def\getfilename#1{% \filenamelength=0 % If we don't expand the argument now, \skipspaces will get % snagged on things like "@value{foo}". \edef\temp{#1}% \expandafter\skipspaces\temp|\relax } \ifnum\pdftexversion < 14 \let \startlink \pdfannotlink \else \let \startlink \pdfstartlink \fi % make a live url in pdf output. \def\pdfurl#1{% \begingroup % it seems we really need yet another set of dummies; have not % tried to figure out what each command should do in the context % of @url. for now, just make @/ a no-op, that's the only one % people have actually reported a problem with. % \normalturnoffactive \def\@{@}% \let\/=\empty \makevalueexpandable % do we want to go so far as to use \indexnofonts instead of just % special-casing \var here? \def\var##1{##1}% % \leavevmode\setcolor{\urlcolor}% \startlink attr{/Border [0 0 0]}% user{/Subtype /Link /A << /S /URI /URI (#1) >>}% \endgroup} % \pdfgettoks - Surround page numbers in #1 with @pdflink. #1 may % be a simple number, or a list of numbers in the case of an index % entry. \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} \def\maketoks{% \expandafter\poptoks\the\toksA|ENDTOKS|\relax \ifx\first0\adn0 \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 \else \ifnum0=\countA\else\makelink\fi \ifx\first.\let\next=\done\else \let\next=\maketoks \addtokens{\toksB}{\the\toksD} \ifx\first,\addtokens{\toksB}{\space}\fi \fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next} \def\makelink{\addtokens{\toksB}% {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} \def\pdflink#1{% \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} \setcolor{\linkcolor}#1\endlink} \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} \else % non-pdf mode \let\pdfmkdest = \gobble \let\pdfurl = \gobble \let\endlink = \relax \let\setcolor = \gobble \let\pdfsetcolor = \gobble \let\pdfmakeoutlines = \relax \fi % \ifx\pdfoutput % % For XeTeX % \ifx\XeTeXrevision\thisisundefined \else % % XeTeX version check % \ifnum\strcmp{\the\XeTeXversion\XeTeXrevision}{0.99996}>-1 % TeX Live 2016 contains XeTeX 0.99996 and xdvipdfmx 20160307. % It can use the `dvipdfmx:config' special (from TeX Live SVN r40941). % For avoiding PDF destination name replacement, we use this special % instead of xdvipdfmx's command line option `-C 0x0010'. \special{dvipdfmx:config C 0x0010} % XeTeX 0.99995+ comes with xdvipdfmx 20160307+. % It can handle Unicode destination names for PDF. \txiuseunicodedestnametrue \else % XeTeX < 0.99996 (TeX Live < 2016) cannot use the % `dvipdfmx:config' special. % So for avoiding PDF destination name replacement, % xdvipdfmx's command line option `-C 0x0010' is necessary. % % XeTeX < 0.99995 can not handle Unicode destination names for PDF % because xdvipdfmx 20150315 has a UTF-16 conversion issue. % It is fixed by xdvipdfmx 20160106 (TeX Live SVN r39753). \txiuseunicodedestnamefalse \fi % % Color support % \def\rgbDarkRed{0.50 0.09 0.12} \def\rgbBlack{0 0 0} % \def\pdfsetcolor#1{\special{pdf:scolor [#1]}} % % Set color, and create a mark which defines \thiscolor accordingly, % so that \makeheadline knows which color to restore. \def\setcolor#1{% \xdef\currentcolordefs{\gdef\noexpand\thiscolor{#1}}% \domark \pdfsetcolor{#1}% } % \def\maincolor{\rgbBlack} \pdfsetcolor{\maincolor} \edef\thiscolor{\maincolor} \def\currentcolordefs{} % \def\makefootline{% \baselineskip24pt \line{\pdfsetcolor{\maincolor}\the\footline}% } % \def\makeheadline{% \vbox to 0pt{% \vskip-22.5pt \line{% \vbox to8.5pt{}% % Extract \thiscolor definition from the marks. \getcolormarks % Typeset the headline with \maincolor, then restore the color. \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}% }% \vss }% \nointerlineskip } % % PDF outline support % % Emulate pdfTeX primitive \def\pdfdest name#1 xyz{% \special{pdf:dest (#1) [@thispage /XYZ @xpos @ypos null]}% } % \def\setpdfdestname#1{{% % We have to set dummies so commands such as @code, and characters % such as \, aren't expanded when present in a section title. \indexnofonts \makevalueexpandable \turnoffactive \iftxiuseunicodedestname % Pass through Unicode characters. \else % Use ASCII approximations in destination names. \passthroughcharsfalse \fi \def\pdfdestname{#1}% \txiescapepdf\pdfdestname }} % \def\setpdfoutlinetext#1{{% \turnoffactive % Always use Unicode characters in title texts. \def\pdfoutlinetext{#1}% % For XeTeX, xdvipdfmx converts to UTF-16. % So we do not convert. \txiescapepdf\pdfoutlinetext }} % \def\pdfmkdest#1{% \setpdfdestname{#1}% \safewhatsit{\pdfdest name{\pdfdestname} xyz}% } % % by default, use black for everything. \def\urlcolor{\rgbBlack} \def\linkcolor{\rgbBlack} \def\endlink{\setcolor{\maincolor}\pdfendlink} % \def\dopdfoutline#1#2#3#4{% \setpdfoutlinetext{#1} \setpdfdestname{#3} \ifx\pdfdestname\empty \def\pdfdestname{#4}% \fi % \special{pdf:out [-] #2 << /Title (\pdfoutlinetext) /A << /S /GoTo /D (\pdfdestname) >> >> }% } % \def\pdfmakeoutlines{% \begingroup % % For XeTeX, counts of subentries are not necessary. % Therefore, we read toc only once. % % We use node names as destinations. % % Currently we prefix the section name with the section number % for chapter and appendix headings only in order to avoid too much % horizontal space being required in the PDF viewer. \def\partentry##1##2##3##4{}% ignore parts in the outlines \def\numchapentry##1##2##3##4{% \dopdfoutline{##2 ##1}{1}{##3}{##4}}% \def\numsecentry##1##2##3##4{% \dopdfoutline{##1}{2}{##3}{##4}}% \def\numsubsecentry##1##2##3##4{% \dopdfoutline{##1}{3}{##3}{##4}}% \def\numsubsubsecentry##1##2##3##4{% \dopdfoutline{##1}{4}{##3}{##4}}% % \let\appentry\numchapentry% \let\appsecentry\numsecentry% \let\appsubsecentry\numsubsecentry% \let\appsubsubsecentry\numsubsubsecentry% \def\unnchapentry##1##2##3##4{% \dopdfoutline{##1}{1}{##3}{##4}}% \let\unnsecentry\numsecentry% \let\unnsubsecentry\numsubsecentry% \let\unnsubsubsecentry\numsubsubsecentry% % % For XeTeX, xdvipdfmx converts strings to UTF-16. % Therefore, the encoding and the language may not be considered. % \indexnofonts \setupdatafile % We can have normal brace characters in the PDF outlines, unlike % Texinfo index files. So set that up. \def\{{\lbracecharliteral}% \def\}{\rbracecharliteral}% \catcode`\\=\active \otherbackslash \input \tocreadfilename \endgroup } {\catcode`[=1 \catcode`]=2 \catcode`{=\other \catcode`}=\other \gdef\lbracecharliteral[{]% \gdef\rbracecharliteral[}]% ] \special{pdf:docview << /PageMode /UseOutlines >> } % ``\special{pdf:tounicode ...}'' is not necessary % because xdvipdfmx converts strings from UTF-8 to UTF-16 without it. % However, due to a UTF-16 conversion issue of xdvipdfmx 20150315, % ``\special{pdf:dest ...}'' cannot handle non-ASCII strings. % It is fixed by xdvipdfmx 20160106 (TeX Live SVN r39753). % \def\skipspaces#1{\def\PP{#1}\def\D{|}% \ifx\PP\D\let\nextsp\relax \else\let\nextsp\skipspaces \addtokens{\filename}{\PP}% \advance\filenamelength by 1 \fi \nextsp} \def\getfilename#1{% \filenamelength=0 % If we don't expand the argument now, \skipspaces will get % snagged on things like "@value{foo}". \edef\temp{#1}% \expandafter\skipspaces\temp|\relax } % make a live url in pdf output. \def\pdfurl#1{% \begingroup % it seems we really need yet another set of dummies; have not % tried to figure out what each command should do in the context % of @url. for now, just make @/ a no-op, that's the only one % people have actually reported a problem with. % \normalturnoffactive \def\@{@}% \let\/=\empty \makevalueexpandable % do we want to go so far as to use \indexnofonts instead of just % special-casing \var here? \def\var##1{##1}% % \leavevmode\setcolor{\urlcolor}% \special{pdf:bann << /Border [0 0 0] /Subtype /Link /A << /S /URI /URI (#1) >> >>}% \endgroup} \def\endlink{\setcolor{\maincolor}\special{pdf:eann}} \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} \def\maketoks{% \expandafter\poptoks\the\toksA|ENDTOKS|\relax \ifx\first0\adn0 \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 \else \ifnum0=\countA\else\makelink\fi \ifx\first.\let\next=\done\else \let\next=\maketoks \addtokens{\toksB}{\the\toksD} \ifx\first,\addtokens{\toksB}{\space}\fi \fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next} \def\makelink{\addtokens{\toksB}% {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} \def\pdflink#1{% \special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A << /S /GoTo /D (#1) >> >>}% \setcolor{\linkcolor}#1\endlink} \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} % % % @image support % % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). \def\doxeteximage#1#2#3{% \def\xeteximagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% \def\xeteximageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% % % XeTeX (and the PDF format) supports .pdf, .png, .jpg (among % others). Let's try in that order, PDF first since if % someone has a scalable image, presumably better to use that than a % bitmap. \let\xeteximgext=\empty \begingroup \openin 1 #1.pdf \ifeof 1 \openin 1 #1.PDF \ifeof 1 \openin 1 #1.png \ifeof 1 \openin 1 #1.jpg \ifeof 1 \openin 1 #1.jpeg \ifeof 1 \openin 1 #1.JPG \ifeof 1 \errmessage{Could not find image file #1 for XeTeX}% \else \gdef\xeteximgext{JPG}% \fi \else \gdef\xeteximgext{jpeg}% \fi \else \gdef\xeteximgext{jpg}% \fi \else \gdef\xeteximgext{png}% \fi \else \gdef\xeteximgext{PDF}% \fi \else \gdef\xeteximgext{pdf}% \fi \closein 1 \endgroup % \def\xetexpdfext{pdf}% \ifx\xeteximgext\xetexpdfext \XeTeXpdffile "#1".\xeteximgext "" \else \def\xetexpdfext{PDF}% \ifx\xeteximgext\xetexpdfext \XeTeXpdffile "#1".\xeteximgext "" \else \XeTeXpicfile "#1".\xeteximgext "" \fi \fi \ifdim \wd0 >0pt width \xeteximagewidth \fi \ifdim \wd2 >0pt height \xeteximageheight \fi \relax } \fi % \message{fonts,} % Set the baselineskip to #1, and the lineskip and strut size % correspondingly. There is no deep meaning behind these magic numbers % used as factors; they just match (closely enough) what Knuth defined. % \def\lineskipfactor{.08333} \def\strutheightpercent{.70833} \def\strutdepthpercent {.29167} % % can get a sort of poor man's double spacing by redefining this. \def\baselinefactor{1} % \newdimen\textleading \def\setleading#1{% \dimen0 = #1\relax \normalbaselineskip = \baselinefactor\dimen0 \normallineskip = \lineskipfactor\normalbaselineskip \normalbaselines \setbox\strutbox =\hbox{% \vrule width0pt height\strutheightpercent\baselineskip depth \strutdepthpercent \baselineskip }% } % PDF CMaps. See also LaTeX's t1.cmap. % % do nothing with this by default. \expandafter\let\csname cmapOT1\endcsname\gobble \expandafter\let\csname cmapOT1IT\endcsname\gobble \expandafter\let\csname cmapOT1TT\endcsname\gobble % if we are producing pdf, and we have \pdffontattr, then define cmaps. % (\pdffontattr was introduced many years ago, but people still run % older pdftex's; it's easy to conditionalize, so we do.) \ifpdf \ifx\pdffontattr\thisisundefined \else \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1-0) %%Title: (TeX-OT1-0 TeX OT1 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1) /Supplement 0 >> def /CMapName /TeX-OT1-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 8 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <23> <26> <0023> <28> <3B> <0028> <3F> <5B> <003F> <5D> <5E> <005D> <61> <7A> <0061> <7B> <7C> <2013> endbfrange 40 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <00660066> <0C> <00660069> <0D> <0066006C> <0E> <006600660069> <0F> <00660066006C> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <21> <0021> <22> <201D> <27> <2019> <3C> <00A1> <3D> <003D> <3E> <00BF> <5C> <201C> <5F> <02D9> <60> <2018> <7D> <02DD> <7E> <007E> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% % % \cmapOT1IT \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1IT-0) %%Title: (TeX-OT1IT-0 TeX OT1IT 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1IT) /Supplement 0 >> def /CMapName /TeX-OT1IT-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 8 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <25> <26> <0025> <28> <3B> <0028> <3F> <5B> <003F> <5D> <5E> <005D> <61> <7A> <0061> <7B> <7C> <2013> endbfrange 42 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <00660066> <0C> <00660069> <0D> <0066006C> <0E> <006600660069> <0F> <00660066006C> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <21> <0021> <22> <201D> <23> <0023> <24> <00A3> <27> <2019> <3C> <00A1> <3D> <003D> <3E> <00BF> <5C> <201C> <5F> <02D9> <60> <2018> <7D> <02DD> <7E> <007E> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1IT\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% % % \cmapOT1TT \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1TT-0) %%Title: (TeX-OT1TT-0 TeX OT1TT 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1TT) /Supplement 0 >> def /CMapName /TeX-OT1TT-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 5 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <21> <26> <0021> <28> <5F> <0028> <61> <7E> <0061> endbfrange 32 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <2191> <0C> <2193> <0D> <0027> <0E> <00A1> <0F> <00BF> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <20> <2423> <27> <2019> <60> <2018> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1TT\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% \fi\fi % Set the font macro #1 to the font named \fontprefix#2. % #3 is the font's design size, #4 is a scale factor, #5 is the CMap % encoding (only OT1, OT1IT and OT1TT are allowed, or empty to omit). % Example: % #1 = \textrm % #2 = \rmshape % #3 = 10 % #4 = \mainmagstep % #5 = OT1 % \def\setfont#1#2#3#4#5{% \font#1=\fontprefix#2#3 scaled #4 \csname cmap#5\endcsname#1% } % This is what gets called when #5 of \setfont is empty. \let\cmap\gobble % % (end of cmaps) % Use cm as the default font prefix. % To specify the font prefix, you must define \fontprefix % before you read in texinfo.tex. \ifx\fontprefix\thisisundefined \def\fontprefix{cm} \fi % Support font families that don't use the same naming scheme as CM. \def\rmshape{r} \def\rmbshape{bx} % where the normal face is bold \def\bfshape{b} \def\bxshape{bx} \def\ttshape{tt} \def\ttbshape{tt} \def\ttslshape{sltt} \def\itshape{ti} \def\itbshape{bxti} \def\slshape{sl} \def\slbshape{bxsl} \def\sfshape{ss} \def\sfbshape{ss} \def\scshape{csc} \def\scbshape{csc} % Definitions for a main text size of 11pt. (The default in Texinfo.) % \def\definetextfontsizexi{% % Text fonts (11.2pt, magstep1). \def\textnominalsize{11pt} \edef\mainmagstep{\magstephalf} \setfont\textrm\rmshape{10}{\mainmagstep}{OT1} \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} \setfont\textbf\bfshape{10}{\mainmagstep}{OT1} \setfont\textit\itshape{10}{\mainmagstep}{OT1IT} \setfont\textsl\slshape{10}{\mainmagstep}{OT1} \setfont\textsf\sfshape{10}{\mainmagstep}{OT1} \setfont\textsc\scshape{10}{\mainmagstep}{OT1} \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep \def\textecsize{1095} % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstep1}{OT1} \setfont\deftt\ttshape{10}{\magstep1}{OT1TT} \setfont\defsl\slshape{10}{\magstep1}{OT1} \setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT} \def\df{\let\ttfont=\deftt \let\bffont = \defbf \let\ttslfont=\defttsl \let\slfont=\defsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} \setfont\smallrm\rmshape{9}{1000}{OT1} \setfont\smalltt\ttshape{9}{1000}{OT1TT} \setfont\smallbf\bfshape{10}{900}{OT1} \setfont\smallit\itshape{9}{1000}{OT1IT} \setfont\smallsl\slshape{9}{1000}{OT1} \setfont\smallsf\sfshape{9}{1000}{OT1} \setfont\smallsc\scshape{10}{900}{OT1} \setfont\smallttsl\ttslshape{10}{900}{OT1TT} \font\smalli=cmmi9 \font\smallsy=cmsy9 \def\smallecsize{0900} % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000}{OT1} \setfont\smallertt\ttshape{8}{1000}{OT1TT} \setfont\smallerbf\bfshape{10}{800}{OT1} \setfont\smallerit\itshape{8}{1000}{OT1IT} \setfont\smallersl\slshape{8}{1000}{OT1} \setfont\smallersf\sfshape{8}{1000}{OT1} \setfont\smallersc\scshape{10}{800}{OT1} \setfont\smallerttsl\ttslshape{10}{800}{OT1TT} \font\smalleri=cmmi8 \font\smallersy=cmsy8 \def\smallerecsize{0800} % Fonts for math mode superscripts (7pt). \def\sevennominalsize{7pt} \setfont\sevenrm\rmshape{7}{1000}{OT1} \setfont\seventt\ttshape{10}{700}{OT1TT} \setfont\sevenbf\bfshape{10}{700}{OT1} \setfont\sevenit\itshape{7}{1000}{OT1IT} \setfont\sevensl\slshape{10}{700}{OT1} \setfont\sevensf\sfshape{10}{700}{OT1} \setfont\sevensc\scshape{10}{700}{OT1} \setfont\seventtsl\ttslshape{10}{700}{OT1TT} \font\seveni=cmmi7 \font\sevensy=cmsy7 \def\sevenecsize{0700} % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3}{OT1} \setfont\titleit\itbshape{10}{\magstep4}{OT1IT} \setfont\titlesl\slbshape{10}{\magstep4}{OT1} \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} \setfont\titlesf\sfbshape{17}{\magstep1}{OT1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4}{OT1} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\titleecsize{2074} % Chapter (and unnumbered) fonts (17.28pt). \def\chapnominalsize{17pt} \setfont\chaprm\rmbshape{12}{\magstep2}{OT1} \setfont\chapit\itbshape{10}{\magstep3}{OT1IT} \setfont\chapsl\slbshape{10}{\magstep3}{OT1} \setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT} \setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT} \setfont\chapsf\sfbshape{17}{1000}{OT1} \let\chapbf=\chaprm \setfont\chapsc\scbshape{10}{\magstep3}{OT1} \font\chapi=cmmi12 scaled \magstep2 \font\chapsy=cmsy10 scaled \magstep3 \def\chapecsize{1728} % Section fonts (14.4pt). \def\secnominalsize{14pt} \setfont\secrm\rmbshape{12}{\magstep1}{OT1} \setfont\secrmnotbold\rmshape{12}{\magstep1}{OT1} \setfont\secit\itbshape{10}{\magstep2}{OT1IT} \setfont\secsl\slbshape{10}{\magstep2}{OT1} \setfont\sectt\ttbshape{12}{\magstep1}{OT1TT} \setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT} \setfont\secsf\sfbshape{12}{\magstep1}{OT1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep2}{OT1} \font\seci=cmmi12 scaled \magstep1 \font\secsy=cmsy10 scaled \magstep2 \def\sececsize{1440} % Subsection fonts (13.15pt). \def\ssecnominalsize{13pt} \setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1} \setfont\ssecit\itbshape{10}{1315}{OT1IT} \setfont\ssecsl\slbshape{10}{1315}{OT1} \setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT} \setfont\ssecttsl\ttslshape{10}{1315}{OT1TT} \setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1315}{OT1} \font\sseci=cmmi12 scaled \magstephalf \font\ssecsy=cmsy10 scaled 1315 \def\ssececsize{1200} % Reduced fonts for @acronym in text (10pt). \def\reducednominalsize{10pt} \setfont\reducedrm\rmshape{10}{1000}{OT1} \setfont\reducedtt\ttshape{10}{1000}{OT1TT} \setfont\reducedbf\bfshape{10}{1000}{OT1} \setfont\reducedit\itshape{10}{1000}{OT1IT} \setfont\reducedsl\slshape{10}{1000}{OT1} \setfont\reducedsf\sfshape{10}{1000}{OT1} \setfont\reducedsc\scshape{10}{1000}{OT1} \setfont\reducedttsl\ttslshape{10}{1000}{OT1TT} \font\reducedi=cmmi10 \font\reducedsy=cmsy10 \def\reducedecsize{1000} \textleading = 13.2pt % line spacing for 11pt CM \textfonts % reset the current fonts \rm } % end of 11pt text font size definitions, \definetextfontsizexi % Definitions to make the main text be 10pt Computer Modern, with % section, chapter, etc., sizes following suit. This is for the GNU % Press printing of the Emacs 22 manual. Maybe other manuals in the % future. Used with @smallbook, which sets the leading to 12pt. % \def\definetextfontsizex{% % Text fonts (10pt). \def\textnominalsize{10pt} \edef\mainmagstep{1000} \setfont\textrm\rmshape{10}{\mainmagstep}{OT1} \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} \setfont\textbf\bfshape{10}{\mainmagstep}{OT1} \setfont\textit\itshape{10}{\mainmagstep}{OT1IT} \setfont\textsl\slshape{10}{\mainmagstep}{OT1} \setfont\textsf\sfshape{10}{\mainmagstep}{OT1} \setfont\textsc\scshape{10}{\mainmagstep}{OT1} \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep \def\textecsize{1000} % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstephalf}{OT1} \setfont\deftt\ttshape{10}{\magstephalf}{OT1TT} \setfont\defsl\slshape{10}{\magstephalf}{OT1} \setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT} \def\df{\let\ttfont=\deftt \let\bffont = \defbf \let\slfont=\defsl \let\ttslfont=\defttsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} \setfont\smallrm\rmshape{9}{1000}{OT1} \setfont\smalltt\ttshape{9}{1000}{OT1TT} \setfont\smallbf\bfshape{10}{900}{OT1} \setfont\smallit\itshape{9}{1000}{OT1IT} \setfont\smallsl\slshape{9}{1000}{OT1} \setfont\smallsf\sfshape{9}{1000}{OT1} \setfont\smallsc\scshape{10}{900}{OT1} \setfont\smallttsl\ttslshape{10}{900}{OT1TT} \font\smalli=cmmi9 \font\smallsy=cmsy9 \def\smallecsize{0900} % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000}{OT1} \setfont\smallertt\ttshape{8}{1000}{OT1TT} \setfont\smallerbf\bfshape{10}{800}{OT1} \setfont\smallerit\itshape{8}{1000}{OT1IT} \setfont\smallersl\slshape{8}{1000}{OT1} \setfont\smallersf\sfshape{8}{1000}{OT1} \setfont\smallersc\scshape{10}{800}{OT1} \setfont\smallerttsl\ttslshape{10}{800}{OT1TT} \font\smalleri=cmmi8 \font\smallersy=cmsy8 \def\smallerecsize{0800} % Fonts for math mode superscripts (7pt). \def\sevennominalsize{7pt} \setfont\sevenrm\rmshape{7}{1000}{OT1} \setfont\seventt\ttshape{10}{700}{OT1TT} \setfont\sevenbf\bfshape{10}{700}{OT1} \setfont\sevenit\itshape{7}{1000}{OT1IT} \setfont\sevensl\slshape{10}{700}{OT1} \setfont\sevensf\sfshape{10}{700}{OT1} \setfont\sevensc\scshape{10}{700}{OT1} \setfont\seventtsl\ttslshape{10}{700}{OT1TT} \font\seveni=cmmi7 \font\sevensy=cmsy7 \def\sevenecsize{0700} % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3}{OT1} \setfont\titleit\itbshape{10}{\magstep4}{OT1IT} \setfont\titlesl\slbshape{10}{\magstep4}{OT1} \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} \setfont\titlesf\sfbshape{17}{\magstep1}{OT1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4}{OT1} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\titleecsize{2074} % Chapter fonts (14.4pt). \def\chapnominalsize{14pt} \setfont\chaprm\rmbshape{12}{\magstep1}{OT1} \setfont\chapit\itbshape{10}{\magstep2}{OT1IT} \setfont\chapsl\slbshape{10}{\magstep2}{OT1} \setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT} \setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT} \setfont\chapsf\sfbshape{12}{\magstep1}{OT1} \let\chapbf\chaprm \setfont\chapsc\scbshape{10}{\magstep2}{OT1} \font\chapi=cmmi12 scaled \magstep1 \font\chapsy=cmsy10 scaled \magstep2 \def\chapecsize{1440} % Section fonts (12pt). \def\secnominalsize{12pt} \setfont\secrm\rmbshape{12}{1000}{OT1} \setfont\secit\itbshape{10}{\magstep1}{OT1IT} \setfont\secsl\slbshape{10}{\magstep1}{OT1} \setfont\sectt\ttbshape{12}{1000}{OT1TT} \setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT} \setfont\secsf\sfbshape{12}{1000}{OT1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep1}{OT1} \font\seci=cmmi12 \font\secsy=cmsy10 scaled \magstep1 \def\sececsize{1200} % Subsection fonts (10pt). \def\ssecnominalsize{10pt} \setfont\ssecrm\rmbshape{10}{1000}{OT1} \setfont\ssecit\itbshape{10}{1000}{OT1IT} \setfont\ssecsl\slbshape{10}{1000}{OT1} \setfont\ssectt\ttbshape{10}{1000}{OT1TT} \setfont\ssecttsl\ttslshape{10}{1000}{OT1TT} \setfont\ssecsf\sfbshape{10}{1000}{OT1} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1000}{OT1} \font\sseci=cmmi10 \font\ssecsy=cmsy10 \def\ssececsize{1000} % Reduced fonts for @acronym in text (9pt). \def\reducednominalsize{9pt} \setfont\reducedrm\rmshape{9}{1000}{OT1} \setfont\reducedtt\ttshape{9}{1000}{OT1TT} \setfont\reducedbf\bfshape{10}{900}{OT1} \setfont\reducedit\itshape{9}{1000}{OT1IT} \setfont\reducedsl\slshape{9}{1000}{OT1} \setfont\reducedsf\sfshape{9}{1000}{OT1} \setfont\reducedsc\scshape{10}{900}{OT1} \setfont\reducedttsl\ttslshape{10}{900}{OT1TT} \font\reducedi=cmmi9 \font\reducedsy=cmsy9 \def\reducedecsize{0900} \divide\parskip by 2 % reduce space between paragraphs \textleading = 12pt % line spacing for 10pt CM \textfonts % reset the current fonts \rm } % end of 10pt text font size definitions, \definetextfontsizex % Fonts for short table of contents. \setfont\shortcontrm\rmshape{12}{1000}{OT1} \setfont\shortcontbf\bfshape{10}{\magstep1}{OT1} % no cmb12 \setfont\shortcontsl\slshape{12}{1000}{OT1} \setfont\shortconttt\ttshape{12}{1000}{OT1TT} % We provide the user-level command % @fonttextsize 10 % (or 11) to redefine the text font size. pt is assumed. % \def\xiword{11} \def\xword{10} \def\xwordpt{10pt} % \parseargdef\fonttextsize{% \def\textsizearg{#1}% %\wlog{doing @fonttextsize \textsizearg}% % % Set \globaldefs so that documents can use this inside @tex, since % makeinfo 4.8 does not support it, but we need it nonetheless. % \begingroup \globaldefs=1 \ifx\textsizearg\xword \definetextfontsizex \else \ifx\textsizearg\xiword \definetextfontsizexi \else \errhelp=\EMsimple \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'} \fi\fi \endgroup } % % Change the current font style to #1, remembering it in \curfontstyle. % For now, we do not accumulate font styles: @b{@i{foo}} prints foo in % italics, not bold italics. % \def\setfontstyle#1{% \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd. \csname #1font\endcsname % change the current font } \def\rm{\fam=0 \setfontstyle{rm}} \def\it{\fam=\itfam \setfontstyle{it}} \def\sl{\fam=\slfam \setfontstyle{sl}} \def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf} \def\tt{\fam=\ttfam \setfontstyle{tt}}\def\ttstylename{tt} % Texinfo sort of supports the sans serif font style, which plain TeX does not. % So we set up a \sf. \newfam\sffam \def\sf{\fam=\sffam \setfontstyle{sf}} % We don't need math for this font style. \def\ttsl{\setfontstyle{ttsl}} % In order for the font changes to affect most math symbols and letters, % we have to define the \textfont of the standard families. % We don't bother to reset \scriptscriptfont; awaiting user need. % \def\resetmathfonts{% \textfont0=\rmfont \textfont1=\ifont \textfont2=\syfont \textfont\itfam=\itfont \textfont\slfam=\slfont \textfont\bffam=\bffont \textfont\ttfam=\ttfont \textfont\sffam=\sffont % % Fonts for superscript. Note that the 7pt fonts are used regardless % of the current font size. \scriptfont0=\sevenrm \scriptfont1=\seveni \scriptfont2=\sevensy \scriptfont\itfam=\sevenit \scriptfont\slfam=\sevensl \scriptfont\bffam=\sevenbf \scriptfont\ttfam=\seventt \scriptfont\sffam=\sevensf } % % The font-changing commands (all called \...fonts) redefine the meanings % of \STYLEfont, instead of just \STYLE. We do this because \STYLE needs % to also set the current \fam for math mode. Our \STYLE (e.g., \rm) % commands hardwire \STYLEfont to set the current font. % % The fonts used for \ifont are for "math italics" (\itfont is for italics % in regular text). \syfont is also used in math mode only. % % Each font-changing command also sets the names \lsize (one size lower) % and \lllsize (three sizes lower). These relative commands are used % in, e.g., the LaTeX logo and acronyms. % % This all needs generalizing, badly. % \def\assignfonts#1{% \expandafter\let\expandafter\rmfont\csname #1rm\endcsname \expandafter\let\expandafter\itfont\csname #1it\endcsname \expandafter\let\expandafter\slfont\csname #1sl\endcsname \expandafter\let\expandafter\bffont\csname #1bf\endcsname \expandafter\let\expandafter\ttfont\csname #1tt\endcsname \expandafter\let\expandafter\smallcaps\csname #1sc\endcsname \expandafter\let\expandafter\sffont \csname #1sf\endcsname \expandafter\let\expandafter\ifont \csname #1i\endcsname \expandafter\let\expandafter\syfont \csname #1sy\endcsname \expandafter\let\expandafter\ttslfont\csname #1ttsl\endcsname } \newif\ifrmisbold % Select smaller font size with the current style. Used to change font size % in, e.g., the LaTeX logo and acronyms. If we are using bold fonts for % normal roman text, also use bold fonts for roman text in the smaller size. \def\switchtolllsize{% \expandafter\assignfonts\expandafter{\lllsize}% \ifrmisbold \let\rmfont\bffont \fi \csname\curfontstyle\endcsname }% \def\switchtolsize{% \expandafter\assignfonts\expandafter{\lsize}% \ifrmisbold \let\rmfont\bffont \fi \csname\curfontstyle\endcsname }% \def\definefontsetatsize#1#2#3#4#5{% \expandafter\def\csname #1fonts\endcsname{% \def\curfontsize{#1}% \def\lsize{#2}\def\lllsize{#3}% \csname rmisbold#5\endcsname \assignfonts{#1}% \resetmathfonts \setleading{#4}% }} \definefontsetatsize{text} {reduced}{smaller}{\textleading}{false} \definefontsetatsize{title} {chap} {subsec} {27pt} {true} \definefontsetatsize{chap} {sec} {text} {19pt} {true} \definefontsetatsize{sec} {subsec} {reduced}{17pt} {true} \definefontsetatsize{ssec} {text} {small} {15pt} {true} \definefontsetatsize{reduced}{small} {smaller}{10.5pt}{false} \definefontsetatsize{small} {smaller}{smaller}{10.5pt}{false} \definefontsetatsize{smaller}{smaller}{smaller}{9.5pt} {false} \def\titlefont#1{{\titlefonts\rm #1}} \let\subsecfonts = \ssecfonts \let\subsubsecfonts = \ssecfonts % Define these just so they can be easily changed for other fonts. \def\angleleft{$\langle$} \def\angleright{$\rangle$} % Set the fonts to use with the @small... environments. \let\smallexamplefonts = \smallfonts % About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample % can fit this many characters: % 8.5x11=86 smallbook=72 a4=90 a5=69 % If we use \scriptfonts (8pt), then we can fit this many characters: % 8.5x11=90+ smallbook=80 a4=90+ a5=77 % For me, subjectively, the few extra characters that fit aren't worth % the additional smallness of 8pt. So I'm making the default 9pt. % % By the way, for comparison, here's what fits with @example (10pt): % 8.5x11=71 smallbook=60 a4=75 a5=58 % --karl, 24jan03. % Set up the default fonts, so we can use them for creating boxes. % \definetextfontsizexi \message{markup,} % Check if we are currently using a typewriter font. Since all the % Computer Modern typewriter fonts have zero interword stretch (and % shrink), and it is reasonable to expect all typewriter fonts to have % this property, we can check that font parameter. % \def\ifmonospace{\ifdim\fontdimen3\font=0pt } % Markup style infrastructure. \defmarkupstylesetup\INITMACRO will % define and register \INITMACRO to be called on markup style changes. % \INITMACRO can check \currentmarkupstyle for the innermost % style. \let\currentmarkupstyle\empty \def\setupmarkupstyle#1{% \def\currentmarkupstyle{#1}% \markupstylesetup } \let\markupstylesetup\empty \def\defmarkupstylesetup#1{% \expandafter\def\expandafter\markupstylesetup \expandafter{\markupstylesetup #1}% \def#1% } % Markup style setup for left and right quotes. \defmarkupstylesetup\markupsetuplq{% \expandafter\let\expandafter \temp \csname markupsetuplq\currentmarkupstyle\endcsname \ifx\temp\relax \markupsetuplqdefault \else \temp \fi } \defmarkupstylesetup\markupsetuprq{% \expandafter\let\expandafter \temp \csname markupsetuprq\currentmarkupstyle\endcsname \ifx\temp\relax \markupsetuprqdefault \else \temp \fi } { \catcode`\'=\active \catcode`\`=\active \gdef\markupsetuplqdefault{\let`\lq} \gdef\markupsetuprqdefault{\let'\rq} \gdef\markupsetcodequoteleft{\let`\codequoteleft} \gdef\markupsetcodequoteright{\let'\codequoteright} } \let\markupsetuplqcode \markupsetcodequoteleft \let\markupsetuprqcode \markupsetcodequoteright % \let\markupsetuplqexample \markupsetcodequoteleft \let\markupsetuprqexample \markupsetcodequoteright % \let\markupsetuplqkbd \markupsetcodequoteleft \let\markupsetuprqkbd \markupsetcodequoteright % \let\markupsetuplqsamp \markupsetcodequoteleft \let\markupsetuprqsamp \markupsetcodequoteright % \let\markupsetuplqverb \markupsetcodequoteleft \let\markupsetuprqverb \markupsetcodequoteright % \let\markupsetuplqverbatim \markupsetcodequoteleft \let\markupsetuprqverbatim \markupsetcodequoteright % Allow an option to not use regular directed right quote/apostrophe % (char 0x27), but instead the undirected quote from cmtt (char 0x0d). % The undirected quote is ugly, so don't make it the default, but it % works for pasting with more pdf viewers (at least evince), the % lilypond developers report. xpdf does work with the regular 0x27. % \def\codequoteright{% \ifmonospace \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax '% \else \char'15 \fi \else \char'15 \fi \else '% \fi } % % and a similar option for the left quote char vs. a grave accent. % Modern fonts display ASCII 0x60 as a grave accent, so some people like % the code environments to do likewise. % \def\codequoteleft{% \ifmonospace \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax % [Knuth] pp. 380,381,391 % \relax disables Spanish ligatures ?` and !` of \tt font. \relax`% \else \char'22 \fi \else \char'22 \fi \else \relax`% \fi } % Commands to set the quote options. % \parseargdef\codequoteundirected{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxicodequoteundirected\endcsname = t% \else\ifx\temp\offword \expandafter\let\csname SETtxicodequoteundirected\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}% \fi\fi } % \parseargdef\codequotebacktick{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxicodequotebacktick\endcsname = t% \else\ifx\temp\offword \expandafter\let\csname SETtxicodequotebacktick\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @codequotebacktick value `\temp', must be on|off}% \fi\fi } % [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font. \def\noligaturesquoteleft{\relax\lq} % Count depth in font-changes, for error checks \newcount\fontdepth \fontdepth=0 % Font commands. % #1 is the font command (\sl or \it), #2 is the text to slant. % If we are in a monospaced environment, however, 1) always use \ttsl, % and 2) do not add an italic correction. \def\dosmartslant#1#2{% \ifusingtt {{\ttsl #2}\let\next=\relax}% {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}% \next } \def\smartslanted{\dosmartslant\sl} \def\smartitalic{\dosmartslant\it} % Output an italic correction unless \next (presumed to be the following % character) is such as not to need one. \def\smartitaliccorrection{% \ifx\next,% \else\ifx\next-% \else\ifx\next.% \else\ifx\next\.% \else\ifx\next\comma% \else\ptexslash \fi\fi\fi\fi\fi \aftersmartic } % Unconditional use \ttsl, and no ic. @var is set to this for defuns. \def\ttslanted#1{{\ttsl #1}} % @cite is like \smartslanted except unconditionally use \sl. We never want % ttsl for book titles, do we? \def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection} \def\aftersmartic{} \def\var#1{% \let\saveaftersmartic = \aftersmartic \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}% \smartslanted{#1}% } \let\i=\smartitalic \let\slanted=\smartslanted \let\dfn=\smartslanted \let\emph=\smartitalic % Explicit font changes: @r, @sc, undocumented @ii. \def\r#1{{\rm #1}} % roman font \def\sc#1{{\smallcaps#1}} % smallcaps font \def\ii#1{{\it #1}} % italic font % @b, explicit bold. Also @strong. \def\b#1{{\bf #1}} \let\strong=\b % @sansserif, explicit sans. \def\sansserif#1{{\sf #1}} % We can't just use \exhyphenpenalty, because that only has effect at % the end of a paragraph. Restore normal hyphenation at the end of the % group within which \nohyphenation is presumably called. % \def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} \def\restorehyphenation{\hyphenchar\font = `- } % Set sfcode to normal for the chars that usually have another value. % Can't use plain's \frenchspacing because it uses the `\x notation, and % sometimes \x has an active definition that messes things up. % \catcode`@=11 \def\plainfrenchspacing{% \sfcode`\.=\@m \sfcode`\?=\@m \sfcode`\!=\@m \sfcode`\:=\@m \sfcode`\;=\@m \sfcode`\,=\@m \def\endofsentencespacefactor{1000}% for @. and friends } \def\plainnonfrenchspacing{% \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000 \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 \def\endofsentencespacefactor{3000}% for @. and friends } \catcode`@=\other \def\endofsentencespacefactor{3000}% default % @t, explicit typewriter. \def\t#1{% {\tt \plainfrenchspacing #1}% \null } % @samp. \def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}} % @indicateurl is \samp, that is, with quotes. \let\indicateurl=\samp % @code (and similar) prints in typewriter, but with spaces the same % size as normal in the surrounding text, without hyphenation, etc. % This is a subroutine for that. \def\tclose#1{% {% % Change normal interword space to be same as for the current font. \spaceskip = \fontdimen2\font % % Switch to typewriter. \tt % % But `\ ' produces the large typewriter interword space. \def\ {{\spaceskip = 0pt{} }}% % % Turn off hyphenation. \nohyphenation % \plainfrenchspacing #1% }% \null % reset spacefactor to 1000 } % We *must* turn on hyphenation at `-' and `_' in @code. % (But see \codedashfinish below.) % Otherwise, it is too hard to avoid overfull hboxes % in the Emacs manual, the Library manual, etc. % % Unfortunately, TeX uses one parameter (\hyphenchar) to control % both hyphenation at - and hyphenation within words. % We must therefore turn them both off (\tclose does that) % and arrange explicitly to hyphenate at a dash. -- rms. { \catcode`\-=\active \catcode`\_=\active \catcode`\'=\active \catcode`\`=\active \global\let'=\rq \global\let`=\lq % default definitions % \global\def\code{\begingroup \setupmarkupstyle{code}% % The following should really be moved into \setupmarkupstyle handlers. \catcode\dashChar=\active \catcode\underChar=\active \ifallowcodebreaks \let-\codedash \let_\codeunder \else \let-\normaldash \let_\realunder \fi % Given -foo (with a single dash), we do not want to allow a break % after the hyphen. \global\let\codedashprev=\codedash % \codex } % \gdef\codedash{\futurelet\next\codedashfinish} \gdef\codedashfinish{% \normaldash % always output the dash character itself. % % Now, output a discretionary to allow a line break, unless % (a) the next character is a -, or % (b) the preceding character is a -. % E.g., given --posix, we do not want to allow a break after either -. % Given --foo-bar, we do want to allow a break between the - and the b. \ifx\next\codedash \else \ifx\codedashprev\codedash \else \discretionary{}{}{}\fi \fi % we need the space after the = for the case when \next itself is a % space token; it would get swallowed otherwise. As in @code{- a}. \global\let\codedashprev= \next } } \def\normaldash{-} % \def\codex #1{\tclose{#1}\endgroup} \def\codeunder{% % this is all so @math{@code{var_name}+1} can work. In math mode, _ % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) % will therefore expand the active definition of _, which is us % (inside @code that is), therefore an endless loop. \ifusingtt{\ifmmode \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. \else\normalunderscore \fi \discretionary{}{}{}}% {\_}% } % An additional complication: the above will allow breaks after, e.g., % each of the four underscores in __typeof__. This is bad. % @allowcodebreaks provides a document-level way to turn breaking at - % and _ on and off. % \newif\ifallowcodebreaks \allowcodebreakstrue \def\keywordtrue{true} \def\keywordfalse{false} \parseargdef\allowcodebreaks{% \def\txiarg{#1}% \ifx\txiarg\keywordtrue \allowcodebreakstrue \else\ifx\txiarg\keywordfalse \allowcodebreaksfalse \else \errhelp = \EMsimple \errmessage{Unknown @allowcodebreaks option `\txiarg', must be true|false}% \fi\fi } % For @command, @env, @file, @option quotes seem unnecessary, % so use \code rather than \samp. \let\command=\code \let\env=\code \let\file=\code \let\option=\code % @uref (abbreviation for `urlref') aka @url takes an optional % (comma-separated) second argument specifying the text to display and % an optional third arg as text to display instead of (rather than in % addition to) the url itself. First (mandatory) arg is the url. % TeX-only option to allow changing PDF output to show only the second % arg (if given), and not the url (which is then just the link target). \newif\ifurefurlonlylink % The main macro is \urefbreak, which allows breaking at expected % places within the url. (There used to be another version, which % didn't support automatic breaking.) \def\urefbreak{\begingroup \urefcatcodes \dourefbreak} \let\uref=\urefbreak % \def\dourefbreak#1{\urefbreakfinish #1,,,\finish} \def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example \unsepspaces \pdfurl{#1}% \setbox0 = \hbox{\ignorespaces #3}% \ifdim\wd0 > 0pt \unhbox0 % third arg given, show only that \else \setbox0 = \hbox{\ignorespaces #2}% look for second arg \ifdim\wd0 > 0pt \ifpdf % For pdfTeX and LuaTeX \ifurefurlonlylink % PDF plus option to not display url, show just arg \unhbox0 \else % PDF, normally display both arg and url for consistency, % visibility, if the pdf is eventually used to print, etc. \unhbox0\ (\urefcode{#1})% \fi \else \ifx\XeTeXrevision\thisisundefined \unhbox0\ (\urefcode{#1})% DVI, always show arg and url \else % For XeTeX \ifurefurlonlylink % PDF plus option to not display url, show just arg \unhbox0 \else % PDF, normally display both arg and url for consistency, % visibility, if the pdf is eventually used to print, etc. \unhbox0\ (\urefcode{#1})% \fi \fi \fi \else \urefcode{#1}% only url given, so show it \fi \fi \endlink \endgroup} % Allow line breaks around only a few characters (only). \def\urefcatcodes{% \catcode`\&=\active \catcode`\.=\active \catcode`\#=\active \catcode`\?=\active \catcode`\/=\active } { \urefcatcodes % \global\def\urefcode{\begingroup \setupmarkupstyle{code}% \urefcatcodes \let&\urefcodeamp \let.\urefcodedot \let#\urefcodehash \let?\urefcodequest \let/\urefcodeslash \codex } % % By default, they are just regular characters. \global\def&{\normalamp} \global\def.{\normaldot} \global\def#{\normalhash} \global\def?{\normalquest} \global\def/{\normalslash} } \def\urefcodeamp{\urefprebreak \&\urefpostbreak} \def\urefcodedot{\urefprebreak .\urefpostbreak} \def\urefcodehash{\urefprebreak \#\urefpostbreak} \def\urefcodequest{\urefprebreak ?\urefpostbreak} \def\urefcodeslash{\futurelet\next\urefcodeslashfinish} { \catcode`\/=\active \global\def\urefcodeslashfinish{% \urefprebreak \slashChar % Allow line break only after the final / in a sequence of % slashes, to avoid line break between the slashes in http://. \ifx\next/\else \urefpostbreak \fi } } % By default we'll break after the special characters, but some people like to % break before the special chars, so allow that. Also allow no breaking at % all, for manual control. % \parseargdef\urefbreakstyle{% \def\txiarg{#1}% \ifx\txiarg\wordnone \def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak} \else\ifx\txiarg\wordbefore \def\urefprebreak{\urefallowbreak}\def\urefpostbreak{\nobreak} \else\ifx\txiarg\wordafter \def\urefprebreak{\nobreak}\def\urefpostbreak{\urefallowbreak} \else \errhelp = \EMsimple \errmessage{Unknown @urefbreakstyle setting `\txiarg'}% \fi\fi\fi } \def\wordafter{after} \def\wordbefore{before} \def\wordnone{none} % Allow a ragged right output to aid breaking long URL's. There can % be a break at the \allowbreak with no extra glue (if the existing stretch in % the line is sufficient), a break at the \penalty100 with extra glue added % at the end of the line, or no break at all here. % Changing the value of the penalty and/or the amount of stretch affects how % preferable one choice is over the other. \def\urefallowbreak{% \allowbreak \hskip 0pt plus 2 em\relax \penalty300 \hskip 0pt plus -2 em\relax } \urefbreakstyle after % @url synonym for @uref, since that's how everyone uses it. % \let\url=\uref % rms does not like angle brackets --karl, 17may97. % So now @email is just like @uref, unless we are pdf. % %\def\email#1{\angleleft{\tt #1}\angleright} \ifpdforxetex \def\email#1{\doemail#1,,\finish} \def\doemail#1,#2,#3\finish{\begingroup \unsepspaces \pdfurl{mailto:#1}% \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi \endlink \endgroup} \else \let\email=\uref \fi % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), % `example' (@kbd uses ttsl only inside of @example and friends), % or `code' (@kbd uses normal tty font always). \parseargdef\kbdinputstyle{% \def\txiarg{#1}% \ifx\txiarg\worddistinct \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% \else\ifx\txiarg\wordexample \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% \else\ifx\txiarg\wordcode \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% \else \errhelp = \EMsimple \errmessage{Unknown @kbdinputstyle setting `\txiarg'}% \fi\fi\fi } \def\worddistinct{distinct} \def\wordexample{example} \def\wordcode{code} % Default is `distinct'. \kbdinputstyle distinct % @kbd is like @code, except that if the argument is just one @key command, % then @kbd has no effect. \def\kbd#1{{\def\look{#1}\expandafter\kbdsub\look??\par}} \def\xkey{\key} \def\kbdsub#1#2#3\par{% \def\one{#1}\def\three{#3}\def\threex{??}% \ifx\one\xkey\ifx\threex\three \key{#2}% \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi } % definition of @key that produces a lozenge. Doesn't adjust to text size. %\setfont\keyrm\rmshape{8}{1000}{OT1} %\font\keysy=cmsy9 %\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% % \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% % \vbox{\hrule\kern-0.4pt % \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% % \kern-0.4pt\hrule}% % \kern-.06em\raise0.4pt\hbox{\angleright}}}} % definition of @key with no lozenge. If the current font is already % monospace, don't change it; that way, we respect @kbdinputstyle. But % if it isn't monospace, then use \tt. % \def\key#1{{\setupmarkupstyle{key}% \nohyphenation \ifmonospace\else\tt\fi #1}\null} % @clicksequence{File @click{} Open ...} \def\clicksequence#1{\begingroup #1\endgroup} % @clickstyle @arrow (by default) \parseargdef\clickstyle{\def\click{#1}} \def\click{\arrow} % Typeset a dimension, e.g., `in' or `pt'. The only reason for the % argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. % \def\dmn#1{\thinspace #1} % @acronym for "FBI", "NATO", and the like. % We print this one point size smaller, since it's intended for % all-uppercase. % \def\acronym#1{\doacronym #1,,\finish} \def\doacronym#1,#2,#3\finish{% {\switchtolsize #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi \null % reset \spacefactor=1000 } % @abbr for "Comput. J." and the like. % No font change, but don't do end-of-sentence spacing. % \def\abbr#1{\doabbr #1,,\finish} \def\doabbr#1,#2,#3\finish{% {\plainfrenchspacing #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi \null % reset \spacefactor=1000 } % @asis just yields its argument. Used with @table, for example. % \def\asis#1{#1} % @math outputs its argument in math mode. % % One complication: _ usually means subscripts, but it could also mean % an actual _ character, as in @math{@var{some_variable} + 1}. So make % _ active, and distinguish by seeing if the current family is \slfam, % which is what @var uses. { \catcode`\_ = \active \gdef\mathunderscore{% \catcode`\_=\active \def_{\ifnum\fam=\slfam \_\else\sb\fi}% } } % Another complication: we want \\ (and @\) to output a math (or tt) \. % FYI, plain.tex uses \\ as a temporary control sequence (for no % particular reason), but this is not advertised and we don't care. % % The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} % \def\math{% \ifmmode\else % only go into math if not in math mode already \tex \mathunderscore \let\\ = \mathbackslash \mathactive % make the texinfo accent commands work in math mode \let\"=\ddot \let\'=\acute \let\==\bar \let\^=\hat \let\`=\grave \let\u=\breve \let\v=\check \let\~=\tilde \let\dotaccent=\dot % have to provide another name for sup operator \let\mathopsup=\sup $\expandafter\finishmath\fi } \def\finishmath#1{#1$\endgroup} % Close the group opened by \tex. % Some active characters (such as <) are spaced differently in math. % We have to reset their definitions in case the @math was an argument % to a command which sets the catcodes (such as @item or @section). % { \catcode`^ = \active \catcode`< = \active \catcode`> = \active \catcode`+ = \active \catcode`' = \active \gdef\mathactive{% \let^ = \ptexhat \let< = \ptexless \let> = \ptexgtr \let+ = \ptexplus \let' = \ptexquoteright } } % for @sub and @sup, if in math mode, just do a normal sub/superscript. % If in text, use math to place as sub/superscript, but switch % into text mode, with smaller fonts. This is a different font than the % one used for real math sub/superscripts (8pt vs. 7pt), but let's not % fix it (significant additions to font machinery) until someone notices. % \def\sub{\ifmmode \expandafter\sb \else \expandafter\finishsub\fi} \def\finishsub#1{$\sb{\hbox{\switchtolllsize #1}}$}% % \def\sup{\ifmmode \expandafter\ptexsp \else \expandafter\finishsup\fi} \def\finishsup#1{$\ptexsp{\hbox{\switchtolllsize #1}}$}% % @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}. % Ignore unless FMTNAME == tex; then it is like @iftex and @tex, % except specified as a normal braced arg, so no newlines to worry about. % \def\outfmtnametex{tex} % \long\def\inlinefmt#1{\doinlinefmt #1,\finish} \long\def\doinlinefmt#1,#2,\finish{% \def\inlinefmtname{#1}% \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi } % % @inlinefmtifelse{FMTNAME,THEN-TEXT,ELSE-TEXT} expands THEN-TEXT if % FMTNAME is tex, else ELSE-TEXT. \long\def\inlinefmtifelse#1{\doinlinefmtifelse #1,,,\finish} \long\def\doinlinefmtifelse#1,#2,#3,#4,\finish{% \def\inlinefmtname{#1}% \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\else \ignorespaces #3\fi } % % For raw, must switch into @tex before parsing the argument, to avoid % setting catcodes prematurely. Doing it this way means that, for % example, @inlineraw{html, foo{bar} gets a parse error instead of being % ignored. But this isn't important because if people want a literal % *right* brace they would have to use a command anyway, so they may as % well use a command to get a left brace too. We could re-use the % delimiter character idea from \verb, but it seems like overkill. % \long\def\inlineraw{\tex \doinlineraw} \long\def\doinlineraw#1{\doinlinerawtwo #1,\finish} \def\doinlinerawtwo#1,#2,\finish{% \def\inlinerawname{#1}% \ifx\inlinerawname\outfmtnametex \ignorespaces #2\fi \endgroup % close group opened by \tex. } % @inlineifset{VAR, TEXT} expands TEXT if VAR is @set. % \long\def\inlineifset#1{\doinlineifset #1,\finish} \long\def\doinlineifset#1,#2,\finish{% \def\inlinevarname{#1}% \expandafter\ifx\csname SET\inlinevarname\endcsname\relax \else\ignorespaces#2\fi } % @inlineifclear{VAR, TEXT} expands TEXT if VAR is not @set. % \long\def\inlineifclear#1{\doinlineifclear #1,\finish} \long\def\doinlineifclear#1,#2,\finish{% \def\inlinevarname{#1}% \expandafter\ifx\csname SET\inlinevarname\endcsname\relax \ignorespaces#2\fi } \message{glyphs,} % and logos. % @@ prints an @, as does @atchar{}. \def\@{\char64 } \let\atchar=\@ % @{ @} @lbracechar{} @rbracechar{} all generate brace characters. \def\lbracechar{{\ifmonospace\char123\else\ensuremath\lbrace\fi}} \def\rbracechar{{\ifmonospace\char125\else\ensuremath\rbrace\fi}} \let\{=\lbracechar \let\}=\rbracechar % @comma{} to avoid , parsing problems. \let\comma = , % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent % Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. \let\, = \ptexc \let\dotaccent = \ptexdot \def\ringaccent#1{{\accent23 #1}} \let\tieaccent = \ptext \let\ubaraccent = \ptexb \let\udotaccent = \d % Other special characters: @questiondown @exclamdown @ordf @ordm % Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. \def\questiondown{?`} \def\exclamdown{!`} \def\ordf{\leavevmode\raise1ex\hbox{\switchtolllsize \underbar{a}}} \def\ordm{\leavevmode\raise1ex\hbox{\switchtolllsize \underbar{o}}} % Dotless i and dotless j, used for accents. \def\imacro{i} \def\jmacro{j} \def\dotless#1{% \def\temp{#1}% \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi \else \errmessage{@dotless can be used only with i or j}% \fi\fi } % The \TeX{} logo, as in plain, but resetting the spacing so that a % period following counts as ending a sentence. (Idea found in latex.) % \edef\TeX{\TeX \spacefactor=1000 } % @LaTeX{} logo. Not quite the same results as the definition in % latex.ltx, since we use a different font for the raised A; it's most % convenient for us to use an explicitly smaller font, rather than using % the \scriptstyle font (since we don't reset \scriptstyle and % \scriptscriptstyle). % \def\LaTeX{% L\kern-.36em {\setbox0=\hbox{T}% \vbox to \ht0{\hbox{% \ifx\textnominalsize\xwordpt % for 10pt running text, lllsize (8pt) is too small for the A in LaTeX. % Revert to plain's \scriptsize, which is 7pt. \count255=\the\fam $\fam\count255 \scriptstyle A$% \else % For 11pt, we can use our lllsize. \switchtolllsize A% \fi }% \vss }}% \kern-.15em \TeX } % Some math mode symbols. Define \ensuremath to switch into math mode % unless we are already there. Expansion tricks may not be needed here, % but safer, and can't hurt. \def\ensuremath{\ifmmode \expandafter\asis \else\expandafter\ensuredmath \fi} \def\ensuredmath#1{$\relax#1$} % \def\bullet{\ensuremath\ptexbullet} \def\geq{\ensuremath\ge} \def\leq{\ensuremath\le} \def\minus{\ensuremath-} % @dots{} outputs an ellipsis using the current font. % We do .5em per period so that it has the same spacing in the cm % typewriter fonts as three actual period characters; on the other hand, % in other typewriter fonts three periods are wider than 1.5em. So do % whichever is larger. % \def\dots{% \leavevmode \setbox0=\hbox{...}% get width of three periods \ifdim\wd0 > 1.5em \dimen0 = \wd0 \else \dimen0 = 1.5em \fi \hbox to \dimen0{% \hskip 0pt plus.25fil .\hskip 0pt plus1fil .\hskip 0pt plus1fil .\hskip 0pt plus.5fil }% } % @enddots{} is an end-of-sentence ellipsis. % \def\enddots{% \dots \spacefactor=\endofsentencespacefactor } % @point{}, @result{}, @expansion{}, @print{}, @equiv{}. % % Since these characters are used in examples, they should be an even number of % \tt widths. Each \tt character is 1en, so two makes it 1em. % \def\point{$\star$} \def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}} \def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} \def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}} \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} \def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}} % The @error{} command. % Adapted from the TeXbook's \boxit. % \newbox\errorbox % {\ttfont \global\dimen0 = 3em}% Width of the box. \dimen2 = .55pt % Thickness of rules % The text. (`r' is open on the right, `e' somewhat less so on the left.) \setbox0 = \hbox{\kern-.75pt \reducedsf \putworderror\kern-1.5pt} % \setbox\errorbox=\hbox to \dimen0{\hfil \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. \advance\hsize by -2\dimen2 % Rules. \vbox{% \hrule height\dimen2 \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. \kern3pt\vrule width\dimen2}% Space to right. \hrule height\dimen2} \hfil} % \def\error{\leavevmode\lower.7ex\copy\errorbox} % @pounds{} is a sterling sign, which Knuth put in the CM italic font. % \def\pounds{\ifmonospace{\ecfont\char"BF}\else{\it\$}\fi} % @euro{} comes from a separate font, depending on the current style. % We use the free feym* fonts from the eurosym package by Henrik % Theiling, which support regular, slanted, bold and bold slanted (and % "outlined" (blackboard board, sort of) versions, which we don't need). % It is available from http://www.ctan.org/tex-archive/fonts/eurosym. % % Although only regular is the truly official Euro symbol, we ignore % that. The Euro is designed to be slightly taller than the regular % font height. % % feymr - regular % feymo - slanted % feybr - bold % feybo - bold slanted % % There is no good (free) typewriter version, to my knowledge. % A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide. % Hmm. % % Also doesn't work in math. Do we need to do math with euro symbols? % Hope not. % % \def\euro{{\eurofont e}} \def\eurofont{% % We set the font at each command, rather than predefining it in % \textfonts and the other font-switching commands, so that % installations which never need the symbol don't have to have the % font installed. % % There is only one designed size (nominal 10pt), so we always scale % that to the current nominal size. % % By the way, simply using "at 1em" works for cmr10 and the like, but % does not work for cmbx10 and other extended/shrunken fonts. % \def\eurosize{\csname\curfontsize nominalsize\endcsname}% % \ifx\curfontstyle\bfstylename % bold: \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize \else % regular: \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize \fi \thiseurofont } % Glyphs from the EC fonts. We don't use \let for the aliases, because % sometimes we redefine the original macro, and the alias should reflect % the redefinition. % % Use LaTeX names for the Icelandic letters. \def\DH{{\ecfont \char"D0}} % Eth \def\dh{{\ecfont \char"F0}} % eth \def\TH{{\ecfont \char"DE}} % Thorn \def\th{{\ecfont \char"FE}} % thorn % \def\guillemetleft{{\ecfont \char"13}} \def\guillemotleft{\guillemetleft} \def\guillemetright{{\ecfont \char"14}} \def\guillemotright{\guillemetright} \def\guilsinglleft{{\ecfont \char"0E}} \def\guilsinglright{{\ecfont \char"0F}} \def\quotedblbase{{\ecfont \char"12}} \def\quotesinglbase{{\ecfont \char"0D}} % % This positioning is not perfect (see the ogonek LaTeX package), but % we have the precomposed glyphs for the most common cases. We put the % tests to use those glyphs in the single \ogonek macro so we have fewer % dummy definitions to worry about for index entries, etc. % % ogonek is also used with other letters in Lithuanian (IOU), but using % the precomposed glyphs for those is not so easy since they aren't in % the same EC font. \def\ogonek#1{{% \def\temp{#1}% \ifx\temp\macrocharA\Aogonek \else\ifx\temp\macrochara\aogonek \else\ifx\temp\macrocharE\Eogonek \else\ifx\temp\macrochare\eogonek \else \ecfont \setbox0=\hbox{#1}% \ifdim\ht0=1ex\accent"0C #1% \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}% \fi \fi\fi\fi\fi }% } \def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A} \def\aogonek{{\ecfont \char"A1}}\def\macrochara{a} \def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E} \def\eogonek{{\ecfont \char"A6}}\def\macrochare{e} % % Use the European Computer Modern fonts (cm-super in outline format) % for non-CM glyphs. That is ec* for regular text and tc* for the text % companion symbols (LaTeX TS1 encoding). Both are part of the ec % package and follow the same conventions. % \def\ecfont{\etcfont{e}} \def\tcfont{\etcfont{t}} % \def\etcfont#1{% % We can't distinguish serif/sans and italic/slanted, but this % is used for crude hacks anyway (like adding French and German % quotes to documents typeset with CM, where we lose kerning), so % hopefully nobody will notice/care. \edef\ecsize{\csname\curfontsize ecsize\endcsname}% \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}% \ifmonospace % typewriter: \font\thisecfont = #1ctt\ecsize \space at \nominalsize \else \ifx\curfontstyle\bfstylename % bold: \font\thisecfont = #1cb\ifusingit{i}{x}\ecsize \space at \nominalsize \else % regular: \font\thisecfont = #1c\ifusingit{ti}{rm}\ecsize \space at \nominalsize \fi \fi \thisecfont } % @registeredsymbol - R in a circle. The font for the R should really % be smaller yet, but lllsize is the best we can do for now. % Adapted from the plain.tex definition of \copyright. % \def\registeredsymbol{% $^{{\ooalign{\hfil\raise.07ex\hbox{\switchtolllsize R}% \hfil\crcr\Orb}}% }$% } % @textdegree - the normal degrees sign. % \def\textdegree{$^\circ$} % Laurent Siebenmann reports \Orb undefined with: % Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38 % so we'll define it if necessary. % \ifx\Orb\thisisundefined \def\Orb{\mathhexbox20D} \fi % Quotes. \chardef\quoteleft=`\` \chardef\quoteright=`\' % only change font for tt for correct kerning and to avoid using % \ecfont unless necessary. \def\quotedblleft{% \ifmonospace{\ecfont\char"10}\else{\char"5C}\fi } \def\quotedblright{% \ifmonospace{\ecfont\char"11}\else{\char`\"}\fi } \message{page headings,} \newskip\titlepagetopglue \titlepagetopglue = 1.5in \newskip\titlepagebottomglue \titlepagebottomglue = 2pc % First the title page. Must do @settitle before @titlepage. \newif\ifseenauthor \newif\iffinishedtitlepage % @setcontentsaftertitlepage used to do an implicit @contents or % @shortcontents after @end titlepage, but it is now obsolete. \def\setcontentsaftertitlepage{% \errmessage{@setcontentsaftertitlepage has been removed as a Texinfo command; move your @contents command if you want the contents after the title page.}}% \def\setshortcontentsaftertitlepage{% \errmessage{@setshortcontentsaftertitlepage has been removed as a Texinfo command; move your @shortcontents and @contents commands if you want the contents after the title page.}}% \parseargdef\shorttitlepage{% \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}% \endgroup\page\hbox{}\page} \envdef\titlepage{% % Open one extra group, as we want to close it in the middle of \Etitlepage. \begingroup \parindent=0pt \textfonts % Leave some space at the very top of the page. \vglue\titlepagetopglue % No rule at page bottom unless we print one at the top with @title. \finishedtitlepagetrue % % Most title ``pages'' are actually two pages long, with space % at the top of the second. We don't want the ragged left on the second. \let\oldpage = \page \def\page{% \iffinishedtitlepage\else \finishtitlepage \fi \let\page = \oldpage \page \null }% } \def\Etitlepage{% \iffinishedtitlepage\else \finishtitlepage \fi % It is important to do the page break before ending the group, % because the headline and footline are only empty inside the group. % If we use the new definition of \page, we always get a blank page % after the title page, which we certainly don't want. \oldpage \endgroup % % Need this before the \...aftertitlepage checks so that if they are % in effect the toc pages will come out with page numbers. \HEADINGSon } \def\finishtitlepage{% \vskip4pt \hrule height 2pt width \hsize \vskip\titlepagebottomglue \finishedtitlepagetrue } % Settings used for typesetting titles: no hyphenation, no indentation, % don't worry much about spacing, ragged right. This should be used % inside a \vbox, and fonts need to be set appropriately first. \par should % be specified before the end of the \vbox, since a vbox is a group. % \def\raggedtitlesettings{% \rm \hyphenpenalty=10000 \parindent=0pt \tolerance=5000 \ptexraggedright } % Macros to be used within @titlepage: \let\subtitlerm=\rmfont \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} \parseargdef\title{% \checkenv\titlepage \vbox{\titlefonts \raggedtitlesettings #1\par}% % print a rule at the page bottom also. \finishedtitlepagefalse \vskip4pt \hrule height 4pt width \hsize \vskip4pt } \parseargdef\subtitle{% \checkenv\titlepage {\subtitlefont \rightline{#1}}% } % @author should come last, but may come many times. % It can also be used inside @quotation. % \parseargdef\author{% \def\temp{\quotation}% \ifx\thisenv\temp \def\quotationauthor{#1}% printed in \Equotation. \else \checkenv\titlepage \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi {\secfonts\rm \leftline{#1}}% \fi } % Set up page headings and footings. \let\thispage=\folio \newtoks\evenheadline % headline on even pages \newtoks\oddheadline % headline on odd pages \newtoks\evenchapheadline% headline on even pages with a new chapter \newtoks\oddchapheadline % headline on odd pages with a new chapter \newtoks\evenfootline % footline on even pages \newtoks\oddfootline % footline on odd pages % Now make \makeheadline and \makefootline in Plain TeX use those variables \headline={{\textfonts\rm \ifchapterpage \ifodd\pageno\the\oddchapheadline\else\the\evenchapheadline\fi \else \ifodd\pageno\the\oddheadline\else\the\evenheadline\fi \fi}} \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline \else \the\evenfootline \fi}\HEADINGShook} \let\HEADINGShook=\relax % Commands to set those variables. % For example, this is what @headings on does % @evenheading @thistitle|@thispage|@thischapter % @oddheading @thischapter|@thispage|@thistitle % @evenfooting @thisfile|| % @oddfooting ||@thisfile \def\evenheading{\parsearg\evenheadingxxx} \def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish} \def\evenheadingyyy #1\|#2\|#3\|#4\finish{% \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}} \global\evenchapheadline=\evenheadline} \def\oddheading{\parsearg\oddheadingxxx} \def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish} \def\oddheadingyyy #1\|#2\|#3\|#4\finish{% \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}% \global\oddchapheadline=\oddheadline} \parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}% \def\evenfooting{\parsearg\evenfootingxxx} \def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish} \def\evenfootingyyy #1\|#2\|#3\|#4\finish{% \global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \def\oddfooting{\parsearg\oddfootingxxx} \def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish} \def\oddfootingyyy #1\|#2\|#3\|#4\finish{% \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% % % Leave some space for the footline. Hopefully ok to assume % @evenfooting will not be used by itself. \global\advance\txipageheight by -12pt \global\advance\vsize by -12pt } \parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}} % @evenheadingmarks top \thischapter <- chapter at the top of a page % @evenheadingmarks bottom \thischapter <- chapter at the bottom of a page % % The same set of arguments for: % % @oddheadingmarks % @evenfootingmarks % @oddfootingmarks % @everyheadingmarks % @everyfootingmarks % These define \getoddheadingmarks, \getevenheadingmarks, % \getoddfootingmarks, and \getevenfootingmarks, each to one of % \gettopheadingmarks, \getbottomheadingmarks. % \def\evenheadingmarks{\headingmarks{even}{heading}} \def\oddheadingmarks{\headingmarks{odd}{heading}} \def\evenfootingmarks{\headingmarks{even}{footing}} \def\oddfootingmarks{\headingmarks{odd}{footing}} \parseargdef\everyheadingmarks{\headingmarks{even}{heading}{#1} \headingmarks{odd}{heading}{#1} } \parseargdef\everyfootingmarks{\headingmarks{even}{footing}{#1} \headingmarks{odd}{footing}{#1} } % #1 = even/odd, #2 = heading/footing, #3 = top/bottom. \def\headingmarks#1#2#3 {% \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname \global\expandafter\let\csname get#1#2marks\endcsname \temp } \everyheadingmarks bottom \everyfootingmarks bottom % @headings double turns headings on for double-sided printing. % @headings single turns headings on for single-sided printing. % @headings off turns them off. % @headings on same as @headings double, retained for compatibility. % @headings after turns on double-sided headings after this page. % @headings doubleafter turns on double-sided headings after this page. % @headings singleafter turns on single-sided headings after this page. % By default, they are off at the start of a document, % and turned `on' after @end titlepage. \parseargdef\headings{\csname HEADINGS#1\endcsname} \def\headingsoff{% non-global headings elimination \evenheadline={\hfil}\evenfootline={\hfil}\evenchapheadline={\hfil}% \oddheadline={\hfil}\oddfootline={\hfil}\oddchapheadline={\hfil}% } \def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting \HEADINGSoff % it's the default % When we turn headings on, set the page number to 1. \def\pageone{ \global\pageno=1 \global\arabiccount = \pagecount } % For double-sided printing, put current file name in lower left corner, % chapter name on inside top of right hand pages, document % title on inside top of left hand pages, and page numbers on outside top % edge of all pages. \def\HEADINGSdouble{% \pageone \HEADINGSdoublex } \let\contentsalignmacro = \chappager % For single-sided printing, chapter title goes across top left of page, % page number on top right. \def\HEADINGSsingle{% \pageone \HEADINGSsinglex } \def\HEADINGSon{\HEADINGSdouble} \def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} \let\HEADINGSdoubleafter=\HEADINGSafter \def\HEADINGSdoublex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\evenchapheadline={\line{\folio\hfil}} \global\oddchapheadline={\line{\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} \def\HEADINGSsinglex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\evenchapheadline={\line{\hfil\folio}} \global\oddchapheadline={\line{\hfil\folio}} \global\let\contentsalignmacro = \chappager } % for @setchapternewpage off \def\HEADINGSsinglechapoff{% \pageone \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\evenchapheadline=\evenheadline \global\oddchapheadline=\oddheadline \global\let\contentsalignmacro = \chappager } % Subroutines used in generating headings % This produces Day Month Year style of output. % Only define if not already defined, in case a txi-??.tex file has set % up a different format (e.g., txi-cs.tex does this). \ifx\today\thisisundefined \def\today{% \number\day\space \ifcase\month \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec \fi \space\number\year} \fi % @settitle line... specifies the title of the document, for headings. % It generates no output of its own. \def\thistitle{\putwordNoTitle} \def\settitle{\parsearg{\gdef\thistitle}} \message{tables,} % Tables -- @table, @ftable, @vtable, @item(x). % default indentation of table text \newdimen\tableindent \tableindent=.8in % default indentation of @itemize and @enumerate text \newdimen\itemindent \itemindent=.3in % margin between end of table item and start of table text. \newdimen\itemmargin \itemmargin=.1in % used internally for \itemindent minus \itemmargin \newdimen\itemmax % Note @table, @ftable, and @vtable define @item, @itemx, etc., with % these defs. % They also define \itemindex % to index the item name in whatever manner is desired (perhaps none). \newif\ifitemxneedsnegativevskip \def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} \def\internalBitem{\smallbreak \parsearg\itemzzz} \def\internalBitemx{\itemxpar \parsearg\itemzzz} \def\itemzzz #1{\begingroup % \advance\hsize by -\rightskip \advance\hsize by -\tableindent \setbox0=\hbox{\itemindicate{#1}}% \itemindex{#1}% \nobreak % This prevents a break before @itemx. % % If the item text does not fit in the space we have, put it on a line % by itself, and do not allow a page break either before or after that % line. We do not start a paragraph here because then if the next % command is, e.g., @kindex, the whatsit would get put into the % horizontal list on a line by itself, resulting in extra blank space. \ifdim \wd0>\itemmax % % Make this a paragraph so we get the \parskip glue and wrapping, % but leave it ragged-right. \begingroup \advance\leftskip by-\tableindent \advance\hsize by\tableindent \advance\rightskip by0pt plus1fil\relax \leavevmode\unhbox0\par \endgroup % % We're going to be starting a paragraph, but we don't want the % \parskip glue -- logically it's part of the @item we just started. \nobreak \vskip-\parskip % % Stop a page break at the \parskip glue coming up. However, if % what follows is an environment such as @example, there will be no % \parskip glue; then the negative vskip we just inserted would % cause the example and the item to crash together. So we use this % bizarre value of 10001 as a signal to \aboveenvbreak to insert % \parskip glue after all. Section titles are handled this way also. % \penalty 10001 \endgroup \itemxneedsnegativevskipfalse \else % The item text fits into the space. Start a paragraph, so that the % following text (if any) will end up on the same line. \noindent % Do this with kerns and \unhbox so that if there is a footnote in % the item text, it can migrate to the main vertical list and % eventually be printed. \nobreak\kern-\tableindent \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0 \unhbox0 \nobreak\kern\dimen0 \endgroup \itemxneedsnegativevskiptrue \fi } \def\item{\errmessage{@item while not in a list environment}} \def\itemx{\errmessage{@itemx while not in a list environment}} % @table, @ftable, @vtable. \envdef\table{% \let\itemindex\gobble \tablecheck{table}% } \envdef\ftable{% \def\itemindex ##1{\doind {fn}{\code{##1}}}% \tablecheck{ftable}% } \envdef\vtable{% \def\itemindex ##1{\doind {vr}{\code{##1}}}% \tablecheck{vtable}% } \def\tablecheck#1{% \ifnum \the\catcode`\^^M=\active \endgroup \errmessage{This command won't work in this context; perhaps the problem is that we are \inenvironment\thisenv}% \def\next{\doignore{#1}}% \else \let\next\tablex \fi \next } \def\tablex#1{% \def\itemindicate{#1}% \parsearg\tabley } \def\tabley#1{% {% \makevalueexpandable \edef\temp{\noexpand\tablez #1\space\space\space}% \expandafter }\temp \endtablez } \def\tablez #1 #2 #3 #4\endtablez{% \aboveenvbreak \ifnum 0#1>0 \advance \leftskip by #1\mil \fi \ifnum 0#2>0 \tableindent=#2\mil \fi \ifnum 0#3>0 \advance \rightskip by #3\mil \fi \itemmax=\tableindent \advance \itemmax by -\itemmargin \advance \leftskip by \tableindent \exdentamount=\tableindent \parindent = 0pt \parskip = \smallskipamount \ifdim \parskip=0pt \parskip=2pt \fi \let\item = \internalBitem \let\itemx = \internalBitemx } \def\Etable{\endgraf\afterenvbreak} \let\Eftable\Etable \let\Evtable\Etable \let\Eitemize\Etable \let\Eenumerate\Etable % This is the counter used by @enumerate, which is really @itemize \newcount \itemno \envdef\itemize{\parsearg\doitemize} \def\doitemize#1{% \aboveenvbreak \itemmax=\itemindent \advance\itemmax by -\itemmargin \advance\leftskip by \itemindent \exdentamount=\itemindent \parindent=0pt \parskip=\smallskipamount \ifdim\parskip=0pt \parskip=2pt \fi % % Try typesetting the item mark so that if the document erroneously says % something like @itemize @samp (intending @table), there's an error % right away at the @itemize. It's not the best error message in the % world, but it's better than leaving it to the @item. This means if % the user wants an empty mark, they have to say @w{} not just @w. \def\itemcontents{#1}% \setbox0 = \hbox{\itemcontents}% % % @itemize with no arg is equivalent to @itemize @bullet. \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi % \let\item=\itemizeitem } % Definition of @item while inside @itemize and @enumerate. % \def\itemizeitem{% \advance\itemno by 1 % for enumerations {\let\par=\endgraf \smallbreak}% reasonable place to break {% % If the document has an @itemize directly after a section title, a % \nobreak will be last on the list, and \sectionheading will have % done a \vskip-\parskip. In that case, we don't want to zero % parskip, or the item text will crash with the heading. On the % other hand, when there is normal text preceding the item (as there % usually is), we do want to zero parskip, or there would be too much % space. In that case, we won't have a \nobreak before. At least % that's the theory. \ifnum\lastpenalty<10000 \parskip=0in \fi \noindent \hbox to 0pt{\hss \itemcontents \kern\itemmargin}% % \ifinner\else \vadjust{\penalty 1200}% not good to break after first line of item. \fi % We can be in inner vertical mode in a footnote, although an % @itemize looks awful there. }% \flushcr } % \splitoff TOKENS\endmark defines \first to be the first token in % TOKENS, and \rest to be the remainder. % \def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% % Allow an optional argument of an uppercase letter, lowercase letter, % or number, to specify the first label in the enumerated list. No % argument is the same as `1'. % \envparseargdef\enumerate{\enumeratey #1 \endenumeratey} \def\enumeratey #1 #2\endenumeratey{% % If we were given no argument, pretend we were given `1'. \def\thearg{#1}% \ifx\thearg\empty \def\thearg{1}\fi % % Detect if the argument is a single token. If so, it might be a % letter. Otherwise, the only valid thing it can be is a number. % (We will always have one token, because of the test we just made. % This is a good thing, since \splitoff doesn't work given nothing at % all -- the first parameter is undelimited.) \expandafter\splitoff\thearg\endmark \ifx\rest\empty % Only one token in the argument. It could still be anything. % A ``lowercase letter'' is one whose \lccode is nonzero. % An ``uppercase letter'' is one whose \lccode is both nonzero, and % not equal to itself. % Otherwise, we assume it's a number. % % We need the \relax at the end of the \ifnum lines to stop TeX from % continuing to look for a . % \ifnum\lccode\expandafter`\thearg=0\relax \numericenumerate % a number (we hope) \else % It's a letter. \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax \lowercaseenumerate % lowercase letter \else \uppercaseenumerate % uppercase letter \fi \fi \else % Multiple tokens in the argument. We hope it's a number. \numericenumerate \fi } % An @enumerate whose labels are integers. The starting integer is % given in \thearg. % \def\numericenumerate{% \itemno = \thearg \startenumeration{\the\itemno}% } % The starting (lowercase) letter is in \thearg. \def\lowercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more lowercase letters in @enumerate; get a bigger alphabet}% \fi \char\lccode\itemno }% } % The starting (uppercase) letter is in \thearg. \def\uppercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more uppercase letters in @enumerate; get a bigger alphabet} \fi \char\uccode\itemno }% } % Call \doitemize, adding a period to the first argument and supplying the % common last two arguments. Also subtract one from the initial value in % \itemno, since @item increments \itemno. % \def\startenumeration#1{% \advance\itemno by -1 \doitemize{#1.}\flushcr } % @alphaenumerate and @capsenumerate are abbreviations for giving an arg % to @enumerate. % \def\alphaenumerate{\enumerate{a}} \def\capsenumerate{\enumerate{A}} \def\Ealphaenumerate{\Eenumerate} \def\Ecapsenumerate{\Eenumerate} % @multitable macros % Amy Hendrickson, 8/18/94, 3/6/96 % % @multitable ... @end multitable will make as many columns as desired. % Contents of each column will wrap at width given in preamble. Width % can be specified either with sample text given in a template line, % or in percent of \hsize, the current width of text on page. % Table can continue over pages but will only break between lines. % To make preamble: % % Either define widths of columns in terms of percent of \hsize: % @multitable @columnfractions .25 .3 .45 % @item ... % % Numbers following @columnfractions are the percent of the total % current hsize to be used for each column. You may use as many % columns as desired. % Or use a template: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item ... % using the widest term desired in each column. % Each new table line starts with @item, each subsequent new column % starts with @tab. Empty columns may be produced by supplying @tab's % with nothing between them for as many times as empty columns are needed, % ie, @tab@tab@tab will produce two empty columns. % @item, @tab do not need to be on their own lines, but it will not hurt % if they are. % Sample multitable: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item first col stuff @tab second col stuff @tab third col % @item % first col stuff % @tab % second col stuff % @tab % third col % @item first col stuff @tab second col stuff % @tab Many paragraphs of text may be used in any column. % % They will wrap at the width determined by the template. % @item@tab@tab This will be in third column. % @end multitable % Default dimensions may be reset by user. % @multitableparskip is vertical space between paragraphs in table. % @multitableparindent is paragraph indent in table. % @multitablecolmargin is horizontal space to be left between columns. % @multitablelinespace is space to leave between table items, baseline % to baseline. % 0pt means it depends on current normal line spacing. % \newskip\multitableparskip \newskip\multitableparindent \newdimen\multitablecolspace \newskip\multitablelinespace \multitableparskip=0pt \multitableparindent=6pt \multitablecolspace=12pt \multitablelinespace=0pt % Macros used to set up halign preamble: % \let\endsetuptable\relax \def\xendsetuptable{\endsetuptable} \let\columnfractions\relax \def\xcolumnfractions{\columnfractions} \newif\ifsetpercent % #1 is the @columnfraction, usually a decimal number like .5, but might % be just 1. We just use it, whatever it is. % \def\pickupwholefraction#1 {% \global\advance\colcount by 1 \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}% \setuptable } \newcount\colcount \def\setuptable#1{% \def\firstarg{#1}% \ifx\firstarg\xendsetuptable \let\go = \relax \else \ifx\firstarg\xcolumnfractions \global\setpercenttrue \else \ifsetpercent \let\go\pickupwholefraction \else \global\advance\colcount by 1 \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a % separator; typically that is always in the input, anyway. \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% \fi \fi \ifx\go\pickupwholefraction % Put the argument back for the \pickupwholefraction call, so % we'll always have a period there to be parsed. \def\go{\pickupwholefraction#1}% \else \let\go = \setuptable \fi% \fi \go } % multitable-only commands. % % @headitem starts a heading row, which we typeset in bold. Assignments % have to be global since we are inside the implicit group of an % alignment entry. \everycr below resets \everytab so we don't have to % undo it ourselves. \def\headitemfont{\b}% for people to use in the template row; not changeable \def\headitem{% \checkenv\multitable \crcr \gdef\headitemcrhook{\nobreak}% attempt to avoid page break after headings \global\everytab={\bf}% can't use \headitemfont since the parsing differs \the\everytab % for the first item }% % % default for tables with no headings. \let\headitemcrhook=\relax % % A \tab used to include \hskip1sp. But then the space in a template % line is not enough. That is bad. So let's go back to just `&' until % we again encounter the problem the 1sp was intended to solve. % --karl, nathan@acm.org, 20apr99. \def\tab{\checkenv\multitable &\the\everytab}% % @multitable ... @end multitable definitions: % \newtoks\everytab % insert after every tab. % \envdef\multitable{% \vskip\parskip \startsavinginserts % % @item within a multitable starts a normal row. % We use \def instead of \let so that if one of the multitable entries % contains an @itemize, we don't choke on the \item (seen as \crcr aka % \endtemplate) expanding \doitemize. \def\item{\crcr}% % \tolerance=9500 \hbadness=9500 \setmultitablespacing \parskip=\multitableparskip \parindent=\multitableparindent \overfullrule=0pt \global\colcount=0 % \everycr = {% \noalign{% \global\everytab={}% Reset from possible headitem. \global\colcount=0 % Reset the column counter. % % Check for saved footnotes, etc.: \checkinserts % % Perhaps a \nobreak, then reset: \headitemcrhook \global\let\headitemcrhook=\relax }% }% % \parsearg\domultitable } \def\domultitable#1{% % To parse everything between @multitable and @item: \setuptable#1 \endsetuptable % % This preamble sets up a generic column definition, which will % be used as many times as user calls for columns. % \vtop will set a single line and will also let text wrap and % continue for many paragraphs if desired. \halign\bgroup &% \global\advance\colcount by 1 \multistrut \vtop{% % Use the current \colcount to find the correct column width: \hsize=\expandafter\csname col\the\colcount\endcsname % % In order to keep entries from bumping into each other % we will add a \leftskip of \multitablecolspace to all columns after % the first one. % % If a template has been used, we will add \multitablecolspace % to the width of each template entry. % % If the user has set preamble in terms of percent of \hsize we will % use that dimension as the width of the column, and the \leftskip % will keep entries from bumping into each other. Table will start at % left margin and final column will justify at right margin. % % Make sure we don't inherit \rightskip from the outer environment. \rightskip=0pt \ifnum\colcount=1 % The first column will be indented with the surrounding text. \advance\hsize by\leftskip \else \ifsetpercent \else % If user has not set preamble in terms of percent of \hsize % we will advance \hsize by \multitablecolspace. \advance\hsize by \multitablecolspace \fi % In either case we will make \leftskip=\multitablecolspace: \leftskip=\multitablecolspace \fi % Ignoring space at the beginning and end avoids an occasional spurious % blank line, when TeX decides to break the line at the space before the % box from the multistrut, so the strut ends up on a line by itself. % For example: % @multitable @columnfractions .11 .89 % @item @code{#} % @tab Legal holiday which is valid in major parts of the whole country. % Is automatically provided with highlighting sequences respectively % marking characters. \noindent\ignorespaces##\unskip\multistrut }\cr } \def\Emultitable{% \crcr \egroup % end the \halign \global\setpercentfalse } \def\setmultitablespacing{% \def\multistrut{\strut}% just use the standard line spacing % % Compute \multitablelinespace (if not defined by user) for use in % \multitableparskip calculation. We used define \multistrut based on % this, but (ironically) that caused the spacing to be off. % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100. \ifdim\multitablelinespace=0pt \setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip \global\advance\multitablelinespace by-\ht0 \fi % Test to see if parskip is larger than space between lines of % table. If not, do nothing. % If so, set to same dimension as multitablelinespace. \ifdim\multitableparskip>\multitablelinespace \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt % to keep parskip somewhat smaller % than skip between lines in the table. \fi% \ifdim\multitableparskip=0pt \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt % to keep parskip somewhat smaller % than skip between lines in the table. \fi} \message{conditionals,} % @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext, % @ifnotxml always succeed. They currently do nothing; we don't % attempt to check whether the conditionals are properly nested. But we % have to remember that they are conditionals, so that @end doesn't % attempt to close an environment group. % \def\makecond#1{% \expandafter\let\csname #1\endcsname = \relax \expandafter\let\csname iscond.#1\endcsname = 1 } \makecond{iftex} \makecond{ifnotdocbook} \makecond{ifnothtml} \makecond{ifnotinfo} \makecond{ifnotplaintext} \makecond{ifnotxml} % Ignore @ignore, @ifhtml, @ifinfo, and the like. % \def\direntry{\doignore{direntry}} \def\documentdescription{\doignore{documentdescription}} \def\docbook{\doignore{docbook}} \def\html{\doignore{html}} \def\ifdocbook{\doignore{ifdocbook}} \def\ifhtml{\doignore{ifhtml}} \def\ifinfo{\doignore{ifinfo}} \def\ifnottex{\doignore{ifnottex}} \def\ifplaintext{\doignore{ifplaintext}} \def\ifxml{\doignore{ifxml}} \def\ignore{\doignore{ignore}} \def\menu{\doignore{menu}} \def\xml{\doignore{xml}} % Ignore text until a line `@end #1', keeping track of nested conditionals. % % A count to remember the depth of nesting. \newcount\doignorecount \def\doignore#1{\begingroup % Scan in ``verbatim'' mode: \obeylines \catcode`\@ = \other \catcode`\{ = \other \catcode`\} = \other % % Make sure that spaces turn into tokens that match what \doignoretext wants. \spaceisspace % % Count number of #1's that we've seen. \doignorecount = 0 % % Swallow text until we reach the matching `@end #1'. \dodoignore{#1}% } { \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source. \obeylines % % \gdef\dodoignore#1{% % #1 contains the command name as a string, e.g., `ifinfo'. % % Define a command to find the next `@end #1'. \long\def\doignoretext##1^^M@end #1{% \doignoretextyyy##1^^M@#1\_STOP_}% % % And this command to find another #1 command, at the beginning of a % line. (Otherwise, we would consider a line `@c @ifset', for % example, to count as an @ifset for nesting.) \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}% % % And now expand that command. \doignoretext ^^M% }% } \def\doignoreyyy#1{% \def\temp{#1}% \ifx\temp\empty % Nothing found. \let\next\doignoretextzzz \else % Found a nested condition, ... \advance\doignorecount by 1 \let\next\doignoretextyyy % ..., look for another. % If we're here, #1 ends with ^^M\ifinfo (for example). \fi \next #1% the token \_STOP_ is present just after this macro. } % We have to swallow the remaining "\_STOP_". % \def\doignoretextzzz#1{% \ifnum\doignorecount = 0 % We have just found the outermost @end. \let\next\enddoignore \else % Still inside a nested condition. \advance\doignorecount by -1 \let\next\doignoretext % Look for the next @end. \fi \next } % Finish off ignored text. { \obeylines% % Ignore anything after the last `@end #1'; this matters in verbatim % environments, where otherwise the newline after an ignored conditional % would result in a blank line in the output. \gdef\enddoignore#1^^M{\endgroup\ignorespaces}% } % @set VAR sets the variable VAR to an empty value. % @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. % % Since we want to separate VAR from REST-OF-LINE (which might be % empty), we can't just use \parsearg; we have to insert a space of our % own to delimit the rest of the line, and then take it out again if we % didn't need it. % We rely on the fact that \parsearg sets \catcode`\ =10. % \parseargdef\set{\setyyy#1 \endsetyyy} \def\setyyy#1 #2\endsetyyy{% {% \makevalueexpandable \def\temp{#2}% \edef\next{\gdef\makecsname{SET#1}}% \ifx\temp\empty \next{}% \else \setzzz#2\endsetzzz \fi }% } % Remove the trailing space \setxxx inserted. \def\setzzz#1 \endsetzzz{\next{#1}} % @clear VAR clears (i.e., unsets) the variable VAR. % \parseargdef\clear{% {% \makevalueexpandable \global\expandafter\let\csname SET#1\endcsname=\relax }% } % @value{foo} gets the text saved in variable foo. \def\value{\begingroup\makevalueexpandable\valuexxx} \def\valuexxx#1{\expandablevalue{#1}\endgroup} { \catcode`\-=\active \catcode`\_=\active % \gdef\makevalueexpandable{% \let\value = \expandablevalue % We don't want these characters active, ... \catcode`\-=\other \catcode`\_=\other % ..., but we might end up with active ones in the argument if % we're called from @code, as @code{@value{foo-bar_}}, though. % So \let them to their normal equivalents. \let-\normaldash \let_\normalunderscore } } \def\expandablevalue#1{% \expandafter\ifx\csname SET#1\endcsname\relax {[No value for ``#1'']}% \message{Variable `#1', used in @value, is not set.}% \else \csname SET#1\endcsname \fi } % Like \expandablevalue, but completely expandable (the \message in the % definition above operates at the execution level of TeX). Used when % writing to auxiliary files, due to the expansion that \write does. % If flag is undefined, pass through an unexpanded @value command: maybe it % will be set by the time it is read back in. % % NB flag names containing - or _ may not work here. \def\dummyvalue#1{% \expandafter\ifx\csname SET#1\endcsname\relax \string\value{#1}% \else \csname SET#1\endcsname \fi } % Used for @value's in index entries to form the sort key: expand the @value % if possible, otherwise sort late. \def\indexnofontsvalue#1{% \expandafter\ifx\csname SET#1\endcsname\relax ZZZZZZZ% \else \csname SET#1\endcsname \fi } % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined % with @set. % % To get the special treatment we need for `@end ifset,' we call % \makecond and then redefine. % \makecond{ifset} \def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}} \def\doifset#1#2{% {% \makevalueexpandable \let\next=\empty \expandafter\ifx\csname SET#2\endcsname\relax #1% If not set, redefine \next. \fi \expandafter }\next } \def\ifsetfail{\doignore{ifset}} % @ifclear VAR ... @end executes the `...' iff VAR has never been % defined with @set, or has been undefined with @clear. % % The `\else' inside the `\doifset' parameter is a trick to reuse the % above code: if the variable is not set, do nothing, if it is set, % then redefine \next to \ifclearfail. % \makecond{ifclear} \def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}} \def\ifclearfail{\doignore{ifclear}} % @ifcommandisdefined CMD ... @end executes the `...' if CMD (written % without the @) is in fact defined. We can only feasibly check at the % TeX level, so something like `mathcode' is going to considered % defined even though it is not a Texinfo command. % \makecond{ifcommanddefined} \def\ifcommanddefined{\parsearg{\doifcmddefined{\let\next=\ifcmddefinedfail}}} % \def\doifcmddefined#1#2{{% \makevalueexpandable \let\next=\empty \expandafter\ifx\csname #2\endcsname\relax #1% If not defined, \let\next as above. \fi \expandafter }\next } \def\ifcmddefinedfail{\doignore{ifcommanddefined}} % @ifcommandnotdefined CMD ... handled similar to @ifclear above. \makecond{ifcommandnotdefined} \def\ifcommandnotdefined{% \parsearg{\doifcmddefined{\else \let\next=\ifcmdnotdefinedfail}}} \def\ifcmdnotdefinedfail{\doignore{ifcommandnotdefined}} % Set the `txicommandconditionals' variable, so documents have a way to % test if the @ifcommand...defined conditionals are available. \set txicommandconditionals % @dircategory CATEGORY -- specify a category of the dir file % which this file should belong to. Ignore this in TeX. \let\dircategory=\comment % @defininfoenclose. \let\definfoenclose=\comment \message{indexing,} % Index generation facilities % Define \newwrite to be identical to plain tex's \newwrite % except not \outer, so it can be used within macros and \if's. \edef\newwrite{\makecsname{ptexnewwrite}} % \newindex {foo} defines an index named IX. % It automatically defines \IXindex such that % \IXindex ...rest of line... puts an entry in the index IX. % It also defines \IXindfile to be the number of the output channel for % the file that accumulates this index. The file's extension is IX. % The name of an index should be no more than 2 characters long % for the sake of vms. % \def\newindex#1{% \expandafter\chardef\csname#1indfile\endcsname=0 \expandafter\xdef\csname#1index\endcsname{% % Define @#1index \noexpand\doindex{#1}} } % @defindex foo == \newindex{foo} % \def\defindex{\parsearg\newindex} % Define @defcodeindex, like @defindex except put all entries in @code. % \def\defcodeindex{\parsearg\newcodeindex} % \def\newcodeindex#1{% \expandafter\chardef\csname#1indfile\endcsname=0 \expandafter\xdef\csname#1index\endcsname{% \noexpand\docodeindex{#1}}% } % The default indices: \newindex{cp}% concepts, \newcodeindex{fn}% functions, \newcodeindex{vr}% variables, \newcodeindex{tp}% types, \newcodeindex{ky}% keys \newcodeindex{pg}% and programs. % @synindex foo bar makes index foo feed into index bar. % Do this instead of @defindex foo if you don't want it as a separate index. % % @syncodeindex foo bar similar, but put all entries made for index foo % inside @code. % \def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} \def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} % #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), % #3 the target index (bar). \def\dosynindex#1#2#3{% \requireopenindexfile{#3}% % redefine \fooindfile: \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname \expandafter\let\csname#2indfile\endcsname=\temp % redefine \fooindex: \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% } % Define \doindex, the driver for all index macros. % Argument #1 is generated by the calling \fooindex macro, % and it is the two-letter name of the index. \def\doindex#1{\edef\indexname{#1}\parsearg\doindexxxx} \def\doindexxxx #1{\doind{\indexname}{#1}} % like the previous two, but they put @code around the argument. \def\docodeindex#1{\edef\indexname{#1}\parsearg\docodeindexxxx} \def\docodeindexxxx #1{\docind{\indexname}{#1}} % Used for the aux, toc and index files to prevent expansion of Texinfo % commands. % \def\atdummies{% \definedummyletter\@% \definedummyletter\ % \definedummyletter\{% \definedummyletter\}% \definedummyletter\&% % % Do the redefinitions. \definedummies \otherbackslash } % \definedummyword defines \#1 as \string\#1\space, thus effectively % preventing its expansion. This is used only for control words, % not control letters, because the \space would be incorrect for % control characters, but is needed to separate the control word % from whatever follows. % % These can be used both for control words that take an argument and % those that do not. If it is followed by {arg} in the input, then % that will dutifully get written to the index (or wherever). % % For control letters, we have \definedummyletter, which omits the % space. % \def\definedummyword #1{\def#1{\string#1\space}}% \def\definedummyletter#1{\def#1{\string#1}}% \let\definedummyaccent\definedummyletter % Called from \atdummies to prevent the expansion of commands. % \def\definedummies{% % \let\commondummyword\definedummyword \let\commondummyletter\definedummyletter \let\commondummyaccent\definedummyaccent \commondummiesnofonts % \definedummyletter\_% \definedummyletter\-% % % Non-English letters. \definedummyword\AA \definedummyword\AE \definedummyword\DH \definedummyword\L \definedummyword\O \definedummyword\OE \definedummyword\TH \definedummyword\aa \definedummyword\ae \definedummyword\dh \definedummyword\exclamdown \definedummyword\l \definedummyword\o \definedummyword\oe \definedummyword\ordf \definedummyword\ordm \definedummyword\questiondown \definedummyword\ss \definedummyword\th % % Although these internal commands shouldn't show up, sometimes they do. \definedummyword\bf \definedummyword\gtr \definedummyword\hat \definedummyword\less \definedummyword\sf \definedummyword\sl \definedummyword\tclose \definedummyword\tt % \definedummyword\LaTeX \definedummyword\TeX % % Assorted special characters. \definedummyword\ampchar \definedummyword\atchar \definedummyword\arrow \definedummyword\backslashchar \definedummyword\bullet \definedummyword\comma \definedummyword\copyright \definedummyword\registeredsymbol \definedummyword\dots \definedummyword\enddots \definedummyword\entrybreak \definedummyword\equiv \definedummyword\error \definedummyword\euro \definedummyword\expansion \definedummyword\geq \definedummyword\guillemetleft \definedummyword\guillemetright \definedummyword\guilsinglleft \definedummyword\guilsinglright \definedummyword\lbracechar \definedummyword\leq \definedummyword\mathopsup \definedummyword\minus \definedummyword\ogonek \definedummyword\pounds \definedummyword\point \definedummyword\print \definedummyword\quotedblbase \definedummyword\quotedblleft \definedummyword\quotedblright \definedummyword\quoteleft \definedummyword\quoteright \definedummyword\quotesinglbase \definedummyword\rbracechar \definedummyword\result \definedummyword\sub \definedummyword\sup \definedummyword\textdegree % \definedummyword\subentry % % We want to disable all macros so that they are not expanded by \write. \macrolist \let\value\dummyvalue % \normalturnoffactive } % \commondummiesnofonts: common to \definedummies and \indexnofonts. % Define \commondummyletter, \commondummyaccent and \commondummyword before % using. Used for accents, font commands, and various control letters. % \def\commondummiesnofonts{% % Control letters and accents. \commondummyletter\!% \commondummyaccent\"% \commondummyaccent\'% \commondummyletter\*% \commondummyaccent\,% \commondummyletter\.% \commondummyletter\/% \commondummyletter\:% \commondummyaccent\=% \commondummyletter\?% \commondummyaccent\^% \commondummyaccent\`% \commondummyaccent\~% \commondummyword\u \commondummyword\v \commondummyword\H \commondummyword\dotaccent \commondummyword\ogonek \commondummyword\ringaccent \commondummyword\tieaccent \commondummyword\ubaraccent \commondummyword\udotaccent \commondummyword\dotless % % Texinfo font commands. \commondummyword\b \commondummyword\i \commondummyword\r \commondummyword\sansserif \commondummyword\sc \commondummyword\slanted \commondummyword\t % % Commands that take arguments. \commondummyword\abbr \commondummyword\acronym \commondummyword\anchor \commondummyword\cite \commondummyword\code \commondummyword\command \commondummyword\dfn \commondummyword\dmn \commondummyword\email \commondummyword\emph \commondummyword\env \commondummyword\file \commondummyword\image \commondummyword\indicateurl \commondummyword\inforef \commondummyword\kbd \commondummyword\key \commondummyword\math \commondummyword\option \commondummyword\pxref \commondummyword\ref \commondummyword\samp \commondummyword\strong \commondummyword\tie \commondummyword\U \commondummyword\uref \commondummyword\url \commondummyword\var \commondummyword\verb \commondummyword\w \commondummyword\xref } \let\indexlbrace\relax \let\indexrbrace\relax \let\indexatchar\relax \let\indexbackslash\relax {\catcode`\@=0 \catcode`\\=13 @gdef@backslashdisappear{@def\{}} } { \catcode`\<=13 \catcode`\-=13 \catcode`\`=13 \gdef\indexnonalnumdisappear{% \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax\else % @set txiindexlquoteignore makes us ignore left quotes in the sort term. % (Introduced for FSFS 2nd ed.) \let`=\empty \fi % \expandafter\ifx\csname SETtxiindexbackslashignore\endcsname\relax\else \backslashdisappear \fi % \expandafter\ifx\csname SETtxiindexhyphenignore\endcsname\relax\else \def-{}% \fi \expandafter\ifx\csname SETtxiindexlessthanignore\endcsname\relax\else \def<{}% \fi \expandafter\ifx\csname SETtxiindexatsignignore\endcsname\relax\else \def\@{}% \fi } \gdef\indexnonalnumreappear{% \let-\normaldash \let<\normalless } } % \indexnofonts is used when outputting the strings to sort the index % by, and when constructing control sequence names. It eliminates all % control sequences and just writes whatever the best ASCII sort string % would be for a given command (usually its argument). % \def\indexnofonts{% % Accent commands should become @asis. \def\commondummyaccent##1{\let##1\asis}% % We can just ignore other control letters. \def\commondummyletter##1{\let##1\empty}% % All control words become @asis by default; overrides below. \let\commondummyword\commondummyaccent \commondummiesnofonts % % Don't no-op \tt, since it isn't a user-level command % and is used in the definitions of the active chars like <, >, |, etc. % Likewise with the other plain tex font commands. %\let\tt=\asis % \def\ { }% \def\@{@}% \def\_{\normalunderscore}% \def\-{}% @- shouldn't affect sorting % \uccode`\1=`\{ \uppercase{\def\{{1}}% \uccode`\1=`\} \uppercase{\def\}{1}}% \let\lbracechar\{% \let\rbracechar\}% % % \let\do\indexnofontsdef % % Non-English letters. \do\AA{AA}% \do\AE{AE}% \do\DH{DZZ}% \do\L{L}% \do\OE{OE}% \do\O{O}% \do\TH{TH}% \do\aa{aa}% \do\ae{ae}% \do\dh{dzz}% \do\exclamdown{!}% \do\l{l}% \do\oe{oe}% \do\ordf{a}% \do\ordm{o}% \do\o{o}% \do\questiondown{?}% \do\ss{ss}% \do\th{th}% % \do\LaTeX{LaTeX}% \do\TeX{TeX}% % % Assorted special characters. \do\atchar{@}% \do\arrow{->}% \do\bullet{bullet}% \do\comma{,}% \do\copyright{copyright}% \do\dots{...}% \do\enddots{...}% \do\equiv{==}% \do\error{error}% \do\euro{euro}% \do\expansion{==>}% \do\geq{>=}% \do\guillemetleft{<<}% \do\guillemetright{>>}% \do\guilsinglleft{<}% \do\guilsinglright{>}% \do\leq{<=}% \do\lbracechar{\{}% \do\minus{-}% \do\point{.}% \do\pounds{pounds}% \do\print{-|}% \do\quotedblbase{"}% \do\quotedblleft{"}% \do\quotedblright{"}% \do\quoteleft{`}% \do\quoteright{'}% \do\quotesinglbase{,}% \do\rbracechar{\}}% \do\registeredsymbol{R}% \do\result{=>}% \do\textdegree{o}% % % We need to get rid of all macros, leaving only the arguments (if present). % Of course this is not nearly correct, but it is the best we can do for now. % makeinfo does not expand macros in the argument to @deffn, which ends up % writing an index entry, and texindex isn't prepared for an index sort entry % that starts with \. % % Since macro invocations are followed by braces, we can just redefine them % to take a single TeX argument. The case of a macro invocation that % goes to end-of-line is not handled. % \macrolist \let\value\indexnofontsvalue } % Give the control sequence a definition that removes the {} that follows % its use, e.g. @AA{} -> AA \def\indexnofontsdef#1#2{\def#1##1{#2}}% % #1 is the index name, #2 is the entry text. \def\doind#1#2{% \iflinks {% % \requireopenindexfile{#1}% \edef\writeto{\csname#1indfile\endcsname}% % \def\indextext{#2}% \safewhatsit\doindwrite }% \fi } % Same as \doind, but for code indices \def\docind#1#2{% \iflinks {% % \requireopenindexfile{#1}% \edef\writeto{\csname#1indfile\endcsname}% % \def\indextext{#2}% \safewhatsit\docindwrite }% \fi } % Check if an index file has been opened, and if not, open it. \def\requireopenindexfile#1{% \ifnum\csname #1indfile\endcsname=0 \expandafter\newwrite \csname#1indfile\endcsname \edef\suffix{#1}% % A .fls suffix would conflict with the file extension for the output % of -recorder, so use .f1s instead. \ifx\suffix\indexisfl\def\suffix{f1}\fi % Open the file \immediate\openout\csname#1indfile\endcsname \jobname.\suffix % Using \immediate above here prevents an object entering into the current % box, which could confound checks such as those in \safewhatsit for % preceding skips. \typeout{Writing index file \jobname.\suffix}% \fi} \def\indexisfl{fl} % Definition for writing index entry sort key. { \catcode`\-=13 \gdef\indexwritesortas{% \begingroup \indexnonalnumreappear \indexwritesortasxxx} \gdef\indexwritesortasxxx#1{% \xdef\indexsortkey{#1}\endgroup} } \def\indexwriteseealso#1{ \gdef\pagenumbertext{\string\seealso{#1}}% } \def\indexwriteseeentry#1{ \gdef\pagenumbertext{\string\seeentry{#1}}% } % The default definitions \def\sortas#1{}% \def\seealso#1{\i{\putwordSeeAlso}\ #1}% for sorted index file only \def\putwordSeeAlso{See also} \def\seeentry#1{\i{\putwordSee}\ #1}% for sorted index file only % Given index entry text like "aaa @subentry bbb @sortas{ZZZ}": % * Set \bracedtext to "{aaa}{bbb}" % * Set \fullindexsortkey to "aaa @subentry ZZZ" % * If @seealso occurs, set \pagenumbertext % \def\splitindexentry#1{% \gdef\fullindexsortkey{}% \xdef\bracedtext{}% \def\sep{}% \def\seealso##1{}% \def\seeentry##1{}% \expandafter\doindexsegment#1\subentry\finish\subentry } % append the results from the next segment \def\doindexsegment#1\subentry{% \def\segment{#1}% \ifx\segment\isfinish \else % % Fully expand the segment, throwing away any @sortas directives, and % trim spaces. \edef\trimmed{\segment}% \edef\trimmed{\expandafter\eatspaces\expandafter{\trimmed}}% \ifincodeindex \edef\trimmed{\noexpand\code{\trimmed}}% \fi % \xdef\bracedtext{\bracedtext{\trimmed}}% % % Get the string to sort by. Process the segment with all % font commands turned off. \bgroup \let\sortas\indexwritesortas \let\seealso\indexwriteseealso \let\seeentry\indexwriteseeentry \indexnofonts % The braces around the commands are recognized by texindex. \def\lbracechar{{\string\indexlbrace}}% \def\rbracechar{{\string\indexrbrace}}% \let\{=\lbracechar \let\}=\rbracechar \def\@{{\string\indexatchar}}% \def\atchar##1{\@}% \def\backslashchar{{\string\indexbackslash}}% \uccode`\~=`\\ \uppercase{\let~\backslashchar}% % \let\indexsortkey\empty \global\let\pagenumbertext\empty % Execute the segment and throw away the typeset output. This executes % any @sortas or @seealso commands in this segment. \setbox\dummybox = \hbox{\segment}% \ifx\indexsortkey\empty{% \indexnonalnumdisappear \xdef\trimmed{\segment}% \xdef\trimmed{\expandafter\eatspaces\expandafter{\trimmed}}% \xdef\indexsortkey{\trimmed}% \ifx\indexsortkey\empty\xdef\indexsortkey{ }\fi }\fi % % Append to \fullindexsortkey. \edef\tmp{\gdef\noexpand\fullindexsortkey{% \fullindexsortkey\sep\indexsortkey}}% \tmp \egroup \def\sep{\subentry}% % \expandafter\doindexsegment \fi } \def\isfinish{\finish}% \newbox\dummybox % used above \let\subentry\relax % Use \ instead of @ in index files. To support old texi2dvi and texindex. % This works without changing the escape character used in the toc or aux % files because the index entries are fully expanded here, and \string uses % the current value of \escapechar. \def\escapeisbackslash{\escapechar=`\\} % Use \ in index files by default. texi2dvi didn't support @ as the escape % character (as it checked for "\entry" in the files, and not "@entry"). When % the new version of texi2dvi has had a chance to become more prevalent, then % the escape character can change back to @ again. This should be an easy % change to make now because both @ and \ are only used as escape characters in % index files, never standing for themselves. % \set txiindexescapeisbackslash % Write the entry in \indextext to the index file. % \newif\ifincodeindex \def\doindwrite{\incodeindexfalse\doindwritex} \def\docindwrite{\incodeindextrue\doindwritex} \def\doindwritex{% \maybemarginindex % \atdummies % \expandafter\ifx\csname SETtxiindexescapeisbackslash\endcsname\relax\else \escapeisbackslash \fi % % For texindex which always views { and } as separators. \def\{{\lbracechar{}}% \def\}{\rbracechar{}}% \uccode`\~=`\\ \uppercase{\def~{\backslashchar{}}}% % % Split the entry into primary entry and any subentries, and get the index % sort key. \splitindexentry\indextext % % Set up the complete index entry, with both the sort key and % the original text, including any font commands. We write % three arguments to \entry to the .?? file (four in the % subentry case), texindex reduces to two when writing the .??s % sorted result. % \edef\temp{% \write\writeto{% \string\entry{\fullindexsortkey}% {\ifx\pagenumbertext\empty\noexpand\folio\else\pagenumbertext\fi}% \bracedtext}% }% \temp } % Put the index entry in the margin if desired (undocumented). \def\maybemarginindex{% \ifx\SETmarginindex\relax\else \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \relax\indextext}}% \fi } \let\SETmarginindex=\relax % Take care of unwanted page breaks/skips around a whatsit: % % If a skip is the last thing on the list now, preserve it % by backing up by \lastskip, doing the \write, then inserting % the skip again. Otherwise, the whatsit generated by the % \write or \pdfdest will make \lastskip zero. The result is that % sequences like this: % @end defun % @tindex whatever % @defun ... % will have extra space inserted, because the \medbreak in the % start of the @defun won't see the skip inserted by the @end of % the previous defun. % % But don't do any of this if we're not in vertical mode. We % don't want to do a \vskip and prematurely end a paragraph. % % Avoid page breaks due to these extra skips, too. % % But wait, there is a catch there: % We'll have to check whether \lastskip is zero skip. \ifdim is not % sufficient for this purpose, as it ignores stretch and shrink parts % of the skip. The only way seems to be to check the textual % representation of the skip. % % The following is almost like \def\zeroskipmacro{0.0pt} except that % the ``p'' and ``t'' characters have catcode \other, not 11 (letter). % \edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname} % \newskip\whatsitskip \newcount\whatsitpenalty % % ..., ready, GO: % \def\safewhatsit#1{\ifhmode #1% \else % \lastskip and \lastpenalty cannot both be nonzero simultaneously. \whatsitskip = \lastskip \edef\lastskipmacro{\the\lastskip}% \whatsitpenalty = \lastpenalty % % If \lastskip is nonzero, that means the last item was a % skip. And since a skip is discardable, that means this % -\whatsitskip glue we're inserting is preceded by a % non-discardable item, therefore it is not a potential % breakpoint, therefore no \nobreak needed. \ifx\lastskipmacro\zeroskipmacro \else \vskip-\whatsitskip \fi % #1% % \ifx\lastskipmacro\zeroskipmacro % If \lastskip was zero, perhaps the last item was a penalty, and % perhaps it was >=10000, e.g., a \nobreak. In that case, we want % to re-insert the same penalty (values >10000 are used for various % signals); since we just inserted a non-discardable item, any % following glue (such as a \parskip) would be a breakpoint. For example: % @deffn deffn-whatever % @vindex index-whatever % Description. % would allow a break between the index-whatever whatsit % and the "Description." paragraph. \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi \else % On the other hand, if we had a nonzero \lastskip, % this make-up glue would be preceded by a non-discardable item % (the whatsit from the \write), so we must insert a \nobreak. \nobreak\vskip\whatsitskip \fi \fi} % The index entry written in the file actually looks like % \entry {sortstring}{page}{topic} % or % \entry {sortstring}{page}{topic}{subtopic} % The texindex program reads in these files and writes files % containing these kinds of lines: % \initial {c} % before the first topic whose initial is c % \entry {topic}{pagelist} % for a topic that is used without subtopics % \primary {topic} % \entry {topic}{} % for the beginning of a topic that is used with subtopics % \secondary {subtopic}{pagelist} % for each subtopic. % \secondary {subtopic}{} % for a subtopic with sub-subtopics % \tertiary {subtopic}{subsubtopic}{pagelist} % for each sub-subtopic. % Define the user-accessible indexing commands % @findex, @vindex, @kindex, @cindex. \def\findex {\fnindex} \def\kindex {\kyindex} \def\cindex {\cpindex} \def\vindex {\vrindex} \def\tindex {\tpindex} \def\pindex {\pgindex} % Define the macros used in formatting output of the sorted index material. % @printindex causes a particular index (the ??s file) to get printed. % It does not print any chapter heading (usually an @unnumbered). % \parseargdef\printindex{\begingroup \dobreak \chapheadingskip{10000}% % \smallfonts \rm \tolerance = 9500 \plainfrenchspacing \everypar = {}% don't want the \kern\-parindent from indentation suppression. % % See comment in \requireopenindexfile. \def\indexname{#1}\ifx\indexname\indexisfl\def\indexname{f1}\fi % % See if the index file exists and is nonempty. \openin 1 \jobname.\indexname s \ifeof 1 % \enddoublecolumns gets confused if there is no text in the index, % and it loses the chapter title and the aux file entries for the % index. The easiest way to prevent this problem is to make sure % there is some text. \putwordIndexNonexistent \typeout{No file \jobname.\indexname s.}% \else % If the index file exists but is empty, then \openin leaves \ifeof % false. We have to make TeX try to read something from the file, so % it can discover if there is anything in it. \read 1 to \thisline \ifeof 1 \putwordIndexIsEmpty \else \expandafter\printindexzz\thisline\relax\relax\finish% \fi \fi \closein 1 \endgroup} % If the index file starts with a backslash, forgo reading the index % file altogether. If somebody upgrades texinfo.tex they may still have % old index files using \ as the escape character. Reading this would % at best lead to typesetting garbage, at worst a TeX syntax error. \def\printindexzz#1#2\finish{% \expandafter\ifx\csname SETtxiindexescapeisbackslash\endcsname\relax \uccode`\~=`\\ \uppercase{\if\noexpand~}\noexpand#1 \expandafter\ifx\csname SETtxiskipindexfileswithbackslash\endcsname\relax \errmessage{% ERROR: A sorted index file in an obsolete format was skipped. To fix this problem, please upgrade your version of 'texi2dvi' or 'texi2pdf' to that at . If you are using an old version of 'texindex' (part of the Texinfo distribution), you may also need to upgrade to a newer version (at least 6.0). You may be able to typeset the index if you run 'texindex \jobname.\indexname' yourself. You could also try setting the 'txiindexescapeisbackslash' flag by running a command like 'texi2dvi -t "@set txiindexescapeisbackslash" \jobname.texi'. If you do this, Texinfo will try to use index files in the old format. If you continue to have problems, deleting the index files and starting again might help (with 'rm \jobname.?? \jobname.??s')% }% \else (Skipped sorted index file in obsolete format) \fi \else \begindoublecolumns \input \jobname.\indexname s \enddoublecolumns \fi \else \begindoublecolumns \catcode`\\=0\relax % % Make @ an escape character to give macros a chance to work. This % should work because we (hopefully) don't otherwise use @ in index files. %\catcode`\@=12\relax \catcode`\@=0\relax \input \jobname.\indexname s \enddoublecolumns \fi } % These macros are used by the sorted index file itself. % Change them to control the appearance of the index. {\catcode`\/=13 \catcode`\-=13 \catcode`\^=13 \catcode`\~=13 \catcode`\_=13 \catcode`\|=13 \catcode`\<=13 \catcode`\>=13 \catcode`\+=13 \catcode`\"=13 \catcode`\$=3 \gdef\initialglyphs{% % special control sequences used in the index sort key \let\indexlbrace\{% \let\indexrbrace\}% \let\indexatchar\@% \def\indexbackslash{\math{\backslash}}% % % Some changes for non-alphabetic characters. Using the glyphs from the % math fonts looks more consistent than the typewriter font used elsewhere % for these characters. \uccode`\~=`\\ \uppercase{\def~{\math{\backslash}}} % % In case @\ is used for backslash \uppercase{\let\\=~} % Can't get bold backslash so don't use bold forward slash \catcode`\/=13 \def/{{\secrmnotbold \normalslash}}% \def-{{\normaldash\normaldash}}% en dash `--' \def^{{\chapbf \normalcaret}}% \def~{{\chapbf \normaltilde}}% \def\_{% \leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }% \def|{$\vert$}% \def<{$\less$}% \def>{$\gtr$}% \def+{$\normalplus$}% }} \def\initial{% \bgroup \initialglyphs \initialx } \def\initialx#1{% % Remove any glue we may have, we'll be inserting our own. \removelastskip % % We like breaks before the index initials, so insert a bonus. % The glue before the bonus allows a little bit of space at the % bottom of a column to reduce an increase in inter-line spacing. \nobreak \vskip 0pt plus 5\baselineskip \penalty -300 \vskip 0pt plus -5\baselineskip % % Typeset the initial. Making this add up to a whole number of % baselineskips increases the chance of the dots lining up from column % to column. It still won't often be perfect, because of the stretch % we need before each entry, but it's better. % % No shrink because it confuses \balancecolumns. \vskip 1.67\baselineskip plus 1\baselineskip \leftline{\secfonts \kern-0.05em \secbf #1}% % \secfonts is inside the argument of \leftline so that the change of % \baselineskip will not affect any glue inserted before the vbox that % \leftline creates. % Do our best not to break after the initial. \nobreak \vskip .33\baselineskip plus .1\baselineskip \egroup % \initialglyphs } \newdimen\entryrightmargin \entryrightmargin=0pt % \entry typesets a paragraph consisting of the text (#1), dot leaders, and % then page number (#2) flushed to the right margin. It is used for index % and table of contents entries. The paragraph is indented by \leftskip. % \def\entry{% \begingroup % % Start a new paragraph if necessary, so our assignments below can't % affect previous text. \par % % No extra space above this paragraph. \parskip = 0in % % When reading the text of entry, convert explicit line breaks % from @* into spaces. The user might give these in long section % titles, for instance. \def\*{\unskip\space\ignorespaces}% \def\entrybreak{\hfil\break}% An undocumented command % % Swallow the left brace of the text (first parameter): \afterassignment\doentry \let\temp = } \def\entrybreak{\unskip\space\ignorespaces}% \def\doentry{% % Save the text of the entry \global\setbox\boxA=\hbox\bgroup \bgroup % Instead of the swallowed brace. \noindent \aftergroup\finishentry % And now comes the text of the entry. % Not absorbing as a macro argument reduces the chance of problems % with catcodes occurring. } {\catcode`\@=11 \gdef\finishentry#1{% \egroup % end box A \dimen@ = \wd\boxA % Length of text of entry \global\setbox\boxA=\hbox\bgroup \unhbox\boxA % #1 is the page number. % % Get the width of the page numbers, and only use % leaders if they are present. \global\setbox\boxB = \hbox{#1}% \ifdim\wd\boxB = 0pt \null\nobreak\hfill\ % \else % \null\nobreak\indexdotfill % Have leaders before the page number. % \ifpdforxetex \pdfgettoks#1.% \hskip\skip\thinshrinkable\the\toksA \else \hskip\skip\thinshrinkable #1% \fi \fi \egroup % end \boxA \ifdim\wd\boxB = 0pt \noindent\unhbox\boxA\par \nobreak \else\bgroup % We want the text of the entries to be aligned to the left, and the % page numbers to be aligned to the right. % \parindent = 0pt \advance\leftskip by 0pt plus 1fil \advance\leftskip by 0pt plus -1fill \rightskip = 0pt plus -1fil \advance\rightskip by 0pt plus 1fill % Cause last line, which could consist of page numbers on their own % if the list of page numbers is long, to be aligned to the right. \parfillskip=0pt plus -1fill % \advance\rightskip by \entryrightmargin % Determine how far we can stretch into the margin. % This allows, e.g., "Appendix H GNU Free Documentation License" to % fit on one line in @letterpaper format. \ifdim\entryrightmargin>2.1em \dimen@i=2.1em \else \dimen@i=0em \fi \advance \parfillskip by 0pt minus 1\dimen@i % \dimen@ii = \hsize \advance\dimen@ii by -1\leftskip \advance\dimen@ii by -1\entryrightmargin \advance\dimen@ii by 1\dimen@i \ifdim\wd\boxA > \dimen@ii % If the entry doesn't fit in one line \ifdim\dimen@ > 0.8\dimen@ii % due to long index text % Try to split the text roughly evenly. \dimen@ will be the length of % the first line. \dimen@ = 0.7\dimen@ \dimen@ii = \hsize \ifnum\dimen@>\dimen@ii % If the entry is too long (for example, if it needs more than % two lines), use all the space in the first line. \dimen@ = \dimen@ii \fi \advance\leftskip by 0pt plus 1fill % ragged right \advance \dimen@ by 1\rightskip \parshape = 2 0pt \dimen@ 0em \dimen@ii % Ideally we'd add a finite glue at the end of the first line only, % instead of using \parshape with explicit line lengths, but TeX % doesn't seem to provide a way to do such a thing. % % Indent all lines but the first one. \advance\leftskip by 1em \advance\parindent by -1em \fi\fi \indent % start paragraph \unhbox\boxA % % Do not prefer a separate line ending with a hyphen to fewer lines. \finalhyphendemerits = 0 % % Word spacing - no stretch \spaceskip=\fontdimen2\font minus \fontdimen4\font % \linepenalty=1000 % Discourage line breaks. \hyphenpenalty=5000 % Discourage hyphenation. % \par % format the paragraph \egroup % The \vbox \fi \endgroup }} \newskip\thinshrinkable \skip\thinshrinkable=.15em minus .15em % Like plain.tex's \dotfill, except uses up at least 1 em. % The filll stretch here overpowers both the fil and fill stretch to push % the page number to the right. \def\indexdotfill{\cleaders \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1filll} \def\primary #1{\line{#1\hfil}} \def\secondary{\indententry{0.5cm}} \def\tertiary{\indententry{1cm}} \def\indententry#1#2#3{% \bgroup \leftskip=#1 \entry{#2}{#3}% \egroup } % Define two-column mode, which we use to typeset indexes. % Adapted from the TeXbook, page 416, which is to say, % the manmac.tex format used to print the TeXbook itself. \catcode`\@=11 % private names \newbox\partialpage \newdimen\doublecolumnhsize \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns % If not much space left on page, start a new page. \ifdim\pagetotal>0.8\vsize\vfill\eject\fi % % Grab any single-column material above us. \output = {% \savetopmark % \global\setbox\partialpage = \vbox{% % Unvbox the main output page. \unvbox\PAGE \kern-\topskip \kern\baselineskip }% }% \eject % run that output routine to set \partialpage % % Use the double-column output routine for subsequent pages. \output = {\doublecolumnout}% % % Change the page size parameters. We could do this once outside this % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 % format, but then we repeat the same computation. Repeating a couple % of assignments once per index is clearly meaningless for the % execution time, so we may as well do it in one place. % % First we halve the line length, less a little for the gutter between % the columns. We compute the gutter based on the line length, so it % changes automatically with the paper format. The magic constant % below is chosen so that the gutter has the same value (well, +-<1pt) % as it did when we hard-coded it. % % We put the result in a separate register, \doublecolumhsize, so we % can restore it in \pagesofar, after \hsize itself has (potentially) % been clobbered. % \doublecolumnhsize = \hsize \advance\doublecolumnhsize by -.04154\hsize \divide\doublecolumnhsize by 2 \hsize = \doublecolumnhsize % % Get the available space for the double columns -- the normal % (undoubled) page height minus any material left over from the % previous page. \advance\vsize by -\ht\partialpage \vsize = 2\vsize % % For the benefit of balancing columns \advance\baselineskip by 0pt plus 0.5pt } % The double-column output routine for all double-column pages except % the last, which is done by \balancecolumns. % \def\doublecolumnout{% % \savetopmark \splittopskip=\topskip \splitmaxdepth=\maxdepth \dimen@ = \vsize \divide\dimen@ by 2 % % box0 will be the left-hand column, box2 the right. \setbox0=\vsplit\PAGE to\dimen@ \setbox2=\vsplit\PAGE to\dimen@ \global\advance\vsize by 2\ht\partialpage \onepageout\pagesofar % empty except for the first time we are called \unvbox\PAGE \penalty\outputpenalty } % % Re-output the contents of the output page -- any previous material, % followed by the two boxes we just split, in box0 and box2. \def\pagesofar{% \unvbox\partialpage % \hsize = \doublecolumnhsize \wd0=\hsize \wd2=\hsize \hbox to\txipagewidth{\box0\hfil\box2}% } % Finished with double columns. \def\enddoublecolumns{% % The following penalty ensures that the page builder is exercised % _before_ we change the output routine. This is necessary in the % following situation: % % The last section of the index consists only of a single entry. % Before this section, \pagetotal is less than \pagegoal, so no % break occurs before the last section starts. However, the last % section, consisting of \initial and the single \entry, does not % fit on the page and has to be broken off. Without the following % penalty the page builder will not be exercised until \eject % below, and by that time we'll already have changed the output % routine to the \balancecolumns version, so the next-to-last % double-column page will be processed with \balancecolumns, which % is wrong: The two columns will go to the main vertical list, with % the broken-off section in the recent contributions. As soon as % the output routine finishes, TeX starts reconsidering the page % break. The two columns and the broken-off section both fit on the % page, because the two columns now take up only half of the page % goal. When TeX sees \eject from below which follows the final % section, it invokes the new output routine that we've set after % \balancecolumns below; \onepageout will try to fit the two columns % and the final section into the vbox of \txipageheight (see % \pagebody), causing an overfull box. % % Note that glue won't work here, because glue does not exercise the % page builder, unlike penalties (see The TeXbook, pp. 280-281). \penalty0 % \output = {% % Split the last of the double-column material. \savetopmark \balancecolumns }% \eject % call the \output just set \ifdim\pagetotal=0pt % Having called \balancecolumns once, we do not % want to call it again. Therefore, reset \output to its normal % definition right away. \global\output=\expandafter{\the\defaultoutput} % \endgroup % started in \begindoublecolumns % Leave the double-column material on the current page, no automatic % page break. \box\balancedcolumns % % \pagegoal was set to the doubled \vsize above, since we restarted % the current page. We're now back to normal single-column % typesetting, so reset \pagegoal to the normal \vsize. \global\vsize = \txipageheight % \pagegoal = \txipageheight % \else % We had some left-over material. This might happen when \doublecolumnout % is called in \balancecolumns. Try again. \expandafter\enddoublecolumns \fi } \newbox\balancedcolumns \setbox\balancedcolumns=\vbox{shouldnt see this}% % % Only called for the last of the double column material. \doublecolumnout % does the others. \def\balancecolumns{% \setbox0 = \vbox{\unvbox\PAGE}% like \box255 but more efficient, see p.120. \dimen@ = \ht0 \ifdim\dimen@<7\baselineskip % Don't split a short final column in two. \setbox2=\vbox{}% \global\setbox\balancedcolumns=\vbox{\pagesofar}% \else % double the leading vertical space \advance\dimen@ by \topskip \advance\dimen@ by-\baselineskip \divide\dimen@ by 2 % target to split to \dimen@ii = \dimen@ \splittopskip = \topskip % Loop until left column is at least as high as the right column. {% \vbadness = 10000 \loop \global\setbox3 = \copy0 \global\setbox1 = \vsplit3 to \dimen@ \ifdim\ht1<\ht3 \global\advance\dimen@ by 1pt \repeat }% % Now the left column is in box 1, and the right column in box 3. % % Check whether the left column has come out higher than the page itself. % (Note that we have doubled \vsize for the double columns, so % the actual height of the page is 0.5\vsize). \ifdim2\ht1>\vsize % It appears that we have been called upon to balance too much material. % Output some of it with \doublecolumnout, leaving the rest on the page. \setbox\PAGE=\box0 \doublecolumnout \else % Compare the heights of the two columns. \ifdim4\ht1>5\ht3 % Column heights are too different, so don't make their bottoms % flush with each other. \setbox2=\vbox to \ht1 {\unvbox3\vfill}% \setbox0=\vbox to \ht1 {\unvbox1\vfill}% \else % Make column bottoms flush with each other. \setbox2=\vbox to\ht1{\unvbox3\unskip}% \setbox0=\vbox to\ht1{\unvbox1\unskip}% \fi \global\setbox\balancedcolumns=\vbox{\pagesofar}% \fi \fi % } \catcode`\@ = \other \message{sectioning,} % Chapters, sections, etc. % Let's start with @part. \outer\parseargdef\part{\partzzz{#1}} \def\partzzz#1{% \chapoddpage \null \vskip.3\vsize % move it down on the page a bit \begingroup \noindent \titlefonts\rm #1\par % the text \let\lastnode=\empty % no node to associate with \writetocentry{part}{#1}{}% but put it in the toc \headingsoff % no headline or footline on the part page % This outputs a mark at the end of the page that clears \thischapter % and \thissection, as is done in \startcontents. \let\pchapsepmacro\relax \chapmacro{}{Yomitfromtoc}{}% \chapoddpage \endgroup } % \unnumberedno is an oxymoron. But we count the unnumbered % sections so that we can refer to them unambiguously in the pdf % outlines by their "section number". We avoid collisions with chapter % numbers by starting them at 10000. (If a document ever has 10000 % chapters, we're in trouble anyway, I'm sure.) \newcount\unnumberedno \unnumberedno = 10000 \newcount\chapno \newcount\secno \secno=0 \newcount\subsecno \subsecno=0 \newcount\subsubsecno \subsubsecno=0 % This counter is funny since it counts through charcodes of letters A, B, ... \newcount\appendixno \appendixno = `\@ % % \def\appendixletter{\char\the\appendixno} % We do the following ugly conditional instead of the above simple % construct for the sake of pdftex, which needs the actual % letter in the expansion, not just typeset. % \def\appendixletter{% \ifnum\appendixno=`A A% \else\ifnum\appendixno=`B B% \else\ifnum\appendixno=`C C% \else\ifnum\appendixno=`D D% \else\ifnum\appendixno=`E E% \else\ifnum\appendixno=`F F% \else\ifnum\appendixno=`G G% \else\ifnum\appendixno=`H H% \else\ifnum\appendixno=`I I% \else\ifnum\appendixno=`J J% \else\ifnum\appendixno=`K K% \else\ifnum\appendixno=`L L% \else\ifnum\appendixno=`M M% \else\ifnum\appendixno=`N N% \else\ifnum\appendixno=`O O% \else\ifnum\appendixno=`P P% \else\ifnum\appendixno=`Q Q% \else\ifnum\appendixno=`R R% \else\ifnum\appendixno=`S S% \else\ifnum\appendixno=`T T% \else\ifnum\appendixno=`U U% \else\ifnum\appendixno=`V V% \else\ifnum\appendixno=`W W% \else\ifnum\appendixno=`X X% \else\ifnum\appendixno=`Y Y% \else\ifnum\appendixno=`Z Z% % The \the is necessary, despite appearances, because \appendixletter is % expanded while writing the .toc file. \char\appendixno is not % expandable, thus it is written literally, thus all appendixes come out % with the same letter (or @) in the toc without it. \else\char\the\appendixno \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} % Each @chapter defines these (using marks) as the number+name, number % and name of the chapter. Page headings and footings can use % these. @section does likewise. \def\thischapter{} \def\thischapternum{} \def\thischaptername{} \def\thissection{} \def\thissectionnum{} \def\thissectionname{} \newcount\absseclevel % used to calculate proper heading level \newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count % @raisesections: treat @section as chapter, @subsection as section, etc. \def\raisesections{\global\advance\secbase by -1} % @lowersections: treat @chapter as section, @section as subsection, etc. \def\lowersections{\global\advance\secbase by 1} % we only have subsub. \chardef\maxseclevel = 3 % % A numbered section within an unnumbered changes to unnumbered too. % To achieve this, remember the "biggest" unnum. sec. we are currently in: \chardef\unnlevel = \maxseclevel % % Trace whether the current chapter is an appendix or not: % \chapheadtype is "N" or "A", unnumbered chapters are ignored. \def\chapheadtype{N} % Choose a heading macro % #1 is heading type % #2 is heading level % #3 is text for heading \def\genhead#1#2#3{% % Compute the abs. sec. level: \absseclevel=#2 \advance\absseclevel by \secbase % Make sure \absseclevel doesn't fall outside the range: \ifnum \absseclevel < 0 \absseclevel = 0 \else \ifnum \absseclevel > 3 \absseclevel = 3 \fi \fi % The heading type: \def\headtype{#1}% \if \headtype U% \ifnum \absseclevel < \unnlevel \chardef\unnlevel = \absseclevel \fi \else % Check for appendix sections: \ifnum \absseclevel = 0 \edef\chapheadtype{\headtype}% \else \if \headtype A\if \chapheadtype N% \errmessage{@appendix... within a non-appendix chapter}% \fi\fi \fi % Check for numbered within unnumbered: \ifnum \absseclevel > \unnlevel \def\headtype{U}% \else \chardef\unnlevel = 3 \fi \fi % Now print the heading: \if \headtype U% \ifcase\absseclevel \unnumberedzzz{#3}% \or \unnumberedseczzz{#3}% \or \unnumberedsubseczzz{#3}% \or \unnumberedsubsubseczzz{#3}% \fi \else \if \headtype A% \ifcase\absseclevel \appendixzzz{#3}% \or \appendixsectionzzz{#3}% \or \appendixsubseczzz{#3}% \or \appendixsubsubseczzz{#3}% \fi \else \ifcase\absseclevel \chapterzzz{#3}% \or \seczzz{#3}% \or \numberedsubseczzz{#3}% \or \numberedsubsubseczzz{#3}% \fi \fi \fi \suppressfirstparagraphindent } % an interface: \def\numhead{\genhead N} \def\apphead{\genhead A} \def\unnmhead{\genhead U} % @chapter, @appendix, @unnumbered. Increment top-level counter, reset % all lower-level sectioning counters to zero. % % Also set \chaplevelprefix, which we prepend to @float sequence numbers % (e.g., figures), q.v. By default (before any chapter), that is empty. \let\chaplevelprefix = \empty % \outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz \def\chapterzzz#1{% % section resetting is \global in case the chapter is in a group, such % as an @include file. \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\chapno by 1 % % Used for \float. \gdef\chaplevelprefix{\the\chapno.}% \resetallfloatnos % % \putwordChapter can contain complex things in translations. \toks0=\expandafter{\putwordChapter}% \message{\the\toks0 \space \the\chapno}% % % Write the actual heading. \chapmacro{#1}{Ynumbered}{\the\chapno}% % % So @section and the like are numbered underneath this chapter. \global\let\section = \numberedsec \global\let\subsection = \numberedsubsec \global\let\subsubsection = \numberedsubsubsec } \outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz % \def\appendixzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\appendixno by 1 \gdef\chaplevelprefix{\appendixletter.}% \resetallfloatnos % % \putwordAppendix can contain complex things in translations. \toks0=\expandafter{\putwordAppendix}% \message{\the\toks0 \space \appendixletter}% % \chapmacro{#1}{Yappendix}{\appendixletter}% % \global\let\section = \appendixsec \global\let\subsection = \appendixsubsec \global\let\subsubsection = \appendixsubsubsec } % normally unnmhead0 calls unnumberedzzz: \outer\parseargdef\unnumbered{\unnmhead0{#1}} \def\unnumberedzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\unnumberedno by 1 % % Since an unnumbered has no number, no prefix for figures. \global\let\chaplevelprefix = \empty \resetallfloatnos % % This used to be simply \message{#1}, but TeX fully expands the % argument to \message. Therefore, if #1 contained @-commands, TeX % expanded them. For example, in `@unnumbered The @cite{Book}', TeX % expanded @cite (which turns out to cause errors because \cite is meant % to be executed, not expanded). % % Anyway, we don't want the fully-expanded definition of @cite to appear % as a result of the \message, we just want `@cite' itself. We use % \the to achieve this: TeX expands \the only once, % simply yielding the contents of . (We also do this for % the toc entries.) \toks0 = {#1}% \message{(\the\toks0)}% % \chapmacro{#1}{Ynothing}{\the\unnumberedno}% % \global\let\section = \unnumberedsec \global\let\subsection = \unnumberedsubsec \global\let\subsubsection = \unnumberedsubsubsec } % @centerchap is like @unnumbered, but the heading is centered. \outer\parseargdef\centerchap{% \let\centerparametersmaybe = \centerparameters \unnmhead0{#1}% \let\centerparametersmaybe = \relax } % @top is like @unnumbered. \let\top\unnumbered % Sections. % \outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz \def\seczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% } % normally calls appendixsectionzzz: \outer\parseargdef\appendixsection{\apphead1{#1}} \def\appendixsectionzzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% } \let\appendixsec\appendixsection % normally calls unnumberedseczzz: \outer\parseargdef\unnumberedsec{\unnmhead1{#1}} \def\unnumberedseczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% } % Subsections. % % normally calls numberedsubseczzz: \outer\parseargdef\numberedsubsec{\numhead2{#1}} \def\numberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% } % normally calls appendixsubseczzz: \outer\parseargdef\appendixsubsec{\apphead2{#1}} \def\appendixsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno}% } % normally calls unnumberedsubseczzz: \outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} \def\unnumberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno}% } % Subsubsections. % % normally numberedsubsubseczzz: \outer\parseargdef\numberedsubsubsec{\numhead3{#1}} \def\numberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynumbered}% {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% } % normally appendixsubsubseczzz: \outer\parseargdef\appendixsubsubsec{\apphead3{#1}} \def\appendixsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% } % normally unnumberedsubsubseczzz: \outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} \def\unnumberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}% } % These macros control what the section commands do, according % to what kind of chapter we are in (ordinary, appendix, or unnumbered). % Define them by default for a numbered chapter. \let\section = \numberedsec \let\subsection = \numberedsubsec \let\subsubsection = \numberedsubsubsec % Define @majorheading, @heading and @subheading \def\majorheading{% {\advance\chapheadingskip by 10pt \chapbreak }% \parsearg\chapheadingzzz } \def\chapheading{\chapbreak \parsearg\chapheadingzzz} \def\chapheadingzzz#1{% \vbox{\chapfonts \raggedtitlesettings #1\par}% \nobreak\bigskip \nobreak \suppressfirstparagraphindent } % @heading, @subheading, @subsubheading. \parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{} \suppressfirstparagraphindent} \parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{} \suppressfirstparagraphindent} \parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{} \suppressfirstparagraphindent} % These macros generate a chapter, section, etc. heading only % (including whitespace, linebreaking, etc. around it), % given all the information in convenient, parsed form. % Args are the skip and penalty (usually negative) \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} % Parameter controlling skip before chapter headings (if needed) \newskip\chapheadingskip % Define plain chapter starts, and page on/off switching for it. \def\chapbreak{\dobreak \chapheadingskip {-4000}} % Start a new page \def\chappager{\par\vfill\supereject} % \chapoddpage - start on an odd page for a new chapter % Because \domark is called before \chapoddpage, the filler page will % get the headings for the next chapter, which is wrong. But we don't % care -- we just disable all headings on the filler page. \def\chapoddpage{% \chappager \ifodd\pageno \else \begingroup \headingsoff \null \chappager \endgroup \fi } \parseargdef\setchapternewpage{\csname CHAPPAG#1\endcsname} \def\CHAPPAGoff{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chapbreak \global\def\HEADINGSon{\HEADINGSsinglechapoff}} \def\CHAPPAGon{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chappager \global\def\HEADINGSon{\HEADINGSsingle}} \def\CHAPPAGodd{% \global\let\contentsalignmacro = \chapoddpage \global\let\pchapsepmacro=\chapoddpage \global\def\HEADINGSon{\HEADINGSdouble}} \CHAPPAGon % \chapmacro - Chapter opening. % % #1 is the text, #2 is the section type (Ynumbered, Ynothing, % Yappendix, Yomitfromtoc), #3 the chapter number. % Not used for @heading series. % % To test against our argument. \def\Ynothingkeyword{Ynothing} \def\Yappendixkeyword{Yappendix} \def\Yomitfromtockeyword{Yomitfromtoc} % \def\chapmacro#1#2#3{% \expandafter\ifx\thisenv\titlepage\else \checkenv{}% chapters, etc., should not start inside an environment. \fi % Insert the first mark before the heading break (see notes for \domark). \let\prevchapterdefs=\currentchapterdefs \let\prevsectiondefs=\currentsectiondefs \gdef\currentsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}% \gdef\thissection{}}% % \def\temptype{#2}% \ifx\temptype\Ynothingkeyword \gdef\currentchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{\thischaptername}}% \else\ifx\temptype\Yomitfromtockeyword \gdef\currentchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{}}% \else\ifx\temptype\Yappendixkeyword \toks0={#1}% \xdef\currentchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\appendixletter}% % \noexpand\putwordAppendix avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thischapter{\noexpand\putwordAppendix{} \noexpand\thischapternum: \noexpand\thischaptername}% }% \else \toks0={#1}% \xdef\currentchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\the\chapno}% % \noexpand\putwordChapter avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thischapter{\noexpand\putwordChapter{} \noexpand\thischapternum: \noexpand\thischaptername}% }% \fi\fi\fi % % Output the mark. Pass it through \safewhatsit, to take care of % the preceding space. \safewhatsit\domark % % Insert the chapter heading break. \pchapsepmacro % % Now the second mark, after the heading break. No break points % between here and the heading. \let\prevchapterdefs=\currentchapterdefs \let\prevsectiondefs=\currentsectiondefs \domark % {% \chapfonts \rm \let\footnote=\errfootnoteheading % give better error message % % Have to define \currentsection before calling \donoderef, because the % xref code eventually uses it. On the other hand, it has to be called % after \pchapsepmacro, or the headline will change too soon. \gdef\currentsection{#1}% % % Only insert the separating space if we have a chapter/appendix % number, and don't print the unnumbered ``number''. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unnchap}% \else\ifx\temptype\Yomitfromtockeyword \setbox0 = \hbox{}% contents like unnumbered, but no toc entry \def\toctype{omit}% \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% \def\toctype{app}% \else \setbox0 = \hbox{#3\enspace}% \def\toctype{numchap}% \fi\fi\fi % % Write the toc entry for this chapter. Must come before the % \donoderef, because we include the current node name in the toc % entry, and \donoderef resets it to empty. \writetocentry{\toctype}{#1}{#3}% % % For pdftex, we have to write out the node definition (aka, make % the pdfdest) after any page break, but before the actual text has % been typeset. If the destination for the pdf outline is after the % text, then jumping from the outline may wind up with the text not % being visible, for instance under high magnification. \donoderef{#2}% % % Typeset the actual heading. \nobreak % Avoid page breaks at the interline glue. \vbox{\raggedtitlesettings \hangindent=\wd0 \centerparametersmaybe \unhbox0 #1\par}% }% \nobreak\bigskip % no page break after a chapter title \nobreak } % @centerchap -- centered and unnumbered. \let\centerparametersmaybe = \relax \def\centerparameters{% \advance\rightskip by 3\rightskip \leftskip = \rightskip \parfillskip = 0pt } % Section titles. These macros combine the section number parts and % call the generic \sectionheading to do the printing. % \newskip\secheadingskip \def\secheadingbreak{\dobreak \secheadingskip{-1000}} % Subsection titles. \newskip\subsecheadingskip \def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}} % Subsubsection titles. \def\subsubsecheadingskip{\subsecheadingskip} \def\subsubsecheadingbreak{\subsecheadingbreak} % Print any size, any type, section title. % % #1 is the text of the title, % #2 is the section level (sec/subsec/subsubsec), % #3 is the section type (Ynumbered, Ynothing, Yappendix, Yomitfromtoc), % #4 is the section number. % \def\seckeyword{sec} % \def\sectionheading#1#2#3#4{% {% \def\sectionlevel{#2}% \def\temptype{#3}% % % It is ok for the @heading series commands to appear inside an % environment (it's been historically allowed, though the logic is % dubious), but not the others. \ifx\temptype\Yomitfromtockeyword\else \checkenv{}% non-@*heading should not be in an environment. \fi \let\footnote=\errfootnoteheading % % Switch to the right set of fonts. \csname #2fonts\endcsname \rm % % Insert first mark before the heading break (see notes for \domark). \let\prevsectiondefs=\currentsectiondefs \ifx\temptype\Ynothingkeyword \ifx\sectionlevel\seckeyword \gdef\currentsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}% \gdef\thissection{\thissectionname}}% \fi \else\ifx\temptype\Yomitfromtockeyword % Don't redefine \thissection. \else\ifx\temptype\Yappendixkeyword \ifx\sectionlevel\seckeyword \toks0={#1}% \xdef\currentsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% % \noexpand\putwordSection avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thissection{\noexpand\putwordSection{} \noexpand\thissectionnum: \noexpand\thissectionname}% }% \fi \else \ifx\sectionlevel\seckeyword \toks0={#1}% \xdef\currentsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% % \noexpand\putwordSection avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thissection{\noexpand\putwordSection{} \noexpand\thissectionnum: \noexpand\thissectionname}% }% \fi \fi\fi\fi % % Go into vertical mode. Usually we'll already be there, but we % don't want the following whatsit to end up in a preceding paragraph % if the document didn't happen to have a blank line. \par % % Output the mark. Pass it through \safewhatsit, to take care of % the preceding space. \safewhatsit\domark % % Insert space above the heading. \csname #2headingbreak\endcsname % % Now the second mark, after the heading break. No break points % between here and the heading. \global\let\prevsectiondefs=\currentsectiondefs \domark % % Only insert the space after the number if we have a section number. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unn}% \gdef\currentsection{#1}% \else\ifx\temptype\Yomitfromtockeyword % for @headings -- no section number, don't include in toc, % and don't redefine \currentsection. \setbox0 = \hbox{}% \def\toctype{omit}% \let\sectionlevel=\empty \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{#4\enspace}% \def\toctype{app}% \gdef\currentsection{#1}% \else \setbox0 = \hbox{#4\enspace}% \def\toctype{num}% \gdef\currentsection{#1}% \fi\fi\fi % % Write the toc entry (before \donoderef). See comments in \chapmacro. \writetocentry{\toctype\sectionlevel}{#1}{#4}% % % Write the node reference (= pdf destination for pdftex). % Again, see comments in \chapmacro. \donoderef{#3}% % % Interline glue will be inserted when the vbox is completed. % That glue will be a valid breakpoint for the page, since it'll be % preceded by a whatsit (usually from the \donoderef, or from the % \writetocentry if there was no node). We don't want to allow that % break, since then the whatsits could end up on page n while the % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000. \nobreak % % Output the actual section heading. \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright \hangindent=\wd0 % zero if no section number \unhbox0 #1}% }% % Add extra space after the heading -- half of whatever came above it. % Don't allow stretch, though. \kern .5 \csname #2headingskip\endcsname % % Do not let the kern be a potential breakpoint, as it would be if it % was followed by glue. \nobreak % % We'll almost certainly start a paragraph next, so don't let that % glue accumulate. (Not a breakpoint because it's preceded by a % discardable item.) However, when a paragraph is not started next % (\startdefun, \cartouche, \center, etc.), this needs to be wiped out % or the negative glue will cause weirdly wrong output, typically % obscuring the section heading with something else. \vskip-\parskip % % This is so the last item on the main vertical list is a known % \penalty > 10000, so \startdefun, etc., can recognize the situation % and do the needful. \penalty 10001 } \message{toc,} % Table of contents. \newwrite\tocfile % Write an entry to the toc file, opening it if necessary. % Called from @chapter, etc. % % Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno} % We append the current node name (if any) and page number as additional % arguments for the \{chap,sec,...}entry macros which will eventually % read this. The node name is used in the pdf outlines as the % destination to jump to. % % We open the .toc file for writing here instead of at @setfilename (or % any other fixed time) so that @contents can be anywhere in the document. % But if #1 is `omit', then we don't do anything. This is used for the % table of contents chapter openings themselves. % \newif\iftocfileopened \def\omitkeyword{omit}% % \def\writetocentry#1#2#3{% \edef\writetoctype{#1}% \ifx\writetoctype\omitkeyword \else \iftocfileopened\else \immediate\openout\tocfile = \jobname.toc \global\tocfileopenedtrue \fi % \iflinks {\atdummies \edef\temp{% \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}% \temp }% \fi \fi % % Tell \shipout to create a pdf destination on each page, if we're % writing pdf. These are used in the table of contents. We can't % just write one on every page because the title pages are numbered % 1 and 2 (the page numbers aren't printed), and so are the first % two pages of the document. Thus, we'd have two destinations named % `1', and two named `2'. \ifpdforxetex \global\pdfmakepagedesttrue \fi } % These characters do not print properly in the Computer Modern roman % fonts, so we must take special care. This is more or less redundant % with the Texinfo input format setup at the end of this file. % \def\activecatcodes{% \catcode`\"=\active \catcode`\$=\active \catcode`\<=\active \catcode`\>=\active \catcode`\\=\active \catcode`\^=\active \catcode`\_=\active \catcode`\|=\active \catcode`\~=\active } % Read the toc file, which is essentially Texinfo input. \def\readtocfile{% \setupdatafile \activecatcodes \input \tocreadfilename } \newskip\contentsrightmargin \contentsrightmargin=1in \newcount\savepageno \newcount\lastnegativepageno \lastnegativepageno = -1 % Prepare to read what we've written to \tocfile. % \def\startcontents#1{% % If @setchapternewpage on, and @headings double, the contents should % start on an odd page, unlike chapters. \contentsalignmacro \immediate\closeout\tocfile % % Don't need to put `Contents' or `Short Contents' in the headline. % It is abundantly clear what they are. \chapmacro{#1}{Yomitfromtoc}{}% % \savepageno = \pageno \begingroup % Set up to handle contents files properly. \raggedbottom % Worry more about breakpoints than the bottom. \entryrightmargin=\contentsrightmargin % Don't use the full line length. % % Roman numerals for page numbers. \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi \def\thistitle{}% no title in double-sided headings % Record where the Roman numerals started. \ifnum\romancount=0 \global\romancount=\pagecount \fi } % redefined for the two-volume lispref. We always output on % \jobname.toc even if this is redefined. % \def\tocreadfilename{\jobname.toc} % Normal (long) toc. % \def\contents{% \startcontents{\putwordTOC}% \openin 1 \tocreadfilename\space \ifeof 1 \else \readtocfile \fi \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \ifeof 1 \else \pdfmakeoutlines \fi \closein 1 \endgroup \contentsendroman } % And just the chapters. \def\summarycontents{% \startcontents{\putwordShortTOC}% % \let\partentry = \shortpartentry \let\numchapentry = \shortchapentry \let\appentry = \shortchapentry \let\unnchapentry = \shortunnchapentry % We want a true roman here for the page numbers. \secfonts \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl \let\tt=\shortconttt \rm \hyphenpenalty = 10000 \advance\baselineskip by 1pt % Open it up a little. \def\numsecentry##1##2##3##4{} \let\appsecentry = \numsecentry \let\unnsecentry = \numsecentry \let\numsubsecentry = \numsecentry \let\appsubsecentry = \numsecentry \let\unnsubsecentry = \numsecentry \let\numsubsubsecentry = \numsecentry \let\appsubsubsecentry = \numsecentry \let\unnsubsubsecentry = \numsecentry \openin 1 \tocreadfilename\space \ifeof 1 \else \readtocfile \fi \closein 1 \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \endgroup \contentsendroman } \let\shortcontents = \summarycontents % Get ready to use Arabic numerals again \def\contentsendroman{% \lastnegativepageno = \pageno \global\pageno = \savepageno % % If \romancount > \arabiccount, the contents are at the end of the % document. Otherwise, advance where the Arabic numerals start for % the page numbers. \ifnum\romancount>\arabiccount\else\global\arabiccount=\pagecount\fi } % Typeset the label for a chapter or appendix for the short contents. % The arg is, e.g., `A' for an appendix, or `3' for a chapter. % \def\shortchaplabel#1{% % This space should be enough, since a single number is .5em, and the % widest letter (M) is 1em, at least in the Computer Modern fonts. % But use \hss just in case. % (This space doesn't include the extra space that gets added after % the label; that gets put in by \shortchapentry above.) % % We'd like to right-justify chapter numbers, but that looks strange % with appendix letters. And right-justifying numbers and % left-justifying letters looks strange when there is less than 10 % chapters. Have to read the whole toc once to know how many chapters % there are before deciding ... \hbox to 1em{#1\hss}% } % These macros generate individual entries in the table of contents. % The first argument is the chapter or section name. % The last argument is the page number. % The arguments in between are the chapter number, section number, ... % Parts, in the main contents. Replace the part number, which doesn't % exist, with an empty box. Let's hope all the numbers have the same width. % Also ignore the page number, which is conventionally not printed. \def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}} \def\partentry#1#2#3#4{% % Add stretch and a bonus for breaking the page before the part heading. % This reduces the chance of the page being broken immediately after the % part heading, before a following chapter heading. \vskip 0pt plus 5\baselineskip \penalty-300 \vskip 0pt plus -5\baselineskip \dochapentry{\numeralbox\labelspace#1}{}% } % % Parts, in the short toc. \def\shortpartentry#1#2#3#4{% \penalty-300 \vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip \shortchapentry{{\bf #1}}{\numeralbox}{}{}% } % Chapters, in the main contents. \def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} % Chapters, in the short toc. % See comments in \dochapentry re vbox and related settings. \def\shortchapentry#1#2#3#4{% \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% } % Appendices, in the main contents. % Need the word Appendix, and a fixed-size box. % \def\appendixbox#1{% % We use M since it's probably the widest letter. \setbox0 = \hbox{\putwordAppendix{} M}% \hbox to \wd0{\putwordAppendix{} #1\hss}} % \def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\hskip.7em#1}{#4}} % Unnumbered chapters. \def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} \def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}} % Sections. \def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}} \let\appsecentry=\numsecentry \def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}} % Subsections. \def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}} \let\appsubsecentry=\numsubsecentry \def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} % And subsubsections. \def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}} \let\appsubsubsecentry=\numsubsubsecentry \def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}} % This parameter controls the indentation of the various levels. % Same as \defaultparindent. \newdimen\tocindent \tocindent = 15pt % Now for the actual typesetting. In all these, #1 is the text and #2 is the % page number. % % If the toc has to be broken over pages, we want it to be at chapters % if at all possible; hence the \penalty. \def\dochapentry#1#2{% \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip \begingroup % Move the page numbers slightly to the right \advance\entryrightmargin by -0.05em \chapentryfonts \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup \nobreak\vskip .25\baselineskip plus.1\baselineskip } \def\dosecentry#1#2{\begingroup \secentryfonts \leftskip=\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsecentry#1#2{\begingroup \subsecentryfonts \leftskip=2\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsubsecentry#1#2{\begingroup \subsubsecentryfonts \leftskip=3\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} % We use the same \entry macro as for the index entries. \let\tocentry = \entry % Space between chapter (or whatever) number and the title. \def\labelspace{\hskip1em \relax} \def\dopageno#1{{\rm #1}} \def\doshortpageno#1{{\rm #1}} \def\chapentryfonts{\secfonts \rm} \def\secentryfonts{\textfonts} \def\subsecentryfonts{\textfonts} \def\subsubsecentryfonts{\textfonts} \message{environments,} % @foo ... @end foo. % @tex ... @end tex escapes into raw TeX temporarily. % One exception: @ is still an escape character, so that @end tex works. % But \@ or @@ will get a plain @ character. \envdef\tex{% \setupmarkupstyle{tex}% \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie \catcode `\%=14 \catcode `\+=\other \catcode `\"=\other \catcode `\|=\other \catcode `\<=\other \catcode `\>=\other \catcode `\`=\other \catcode `\'=\other % % ' is active in math mode (mathcode"8000). So reset it, and all our % other math active characters (just in case), to plain's definitions. \mathactive % % Inverse of the list at the beginning of the file. \let\b=\ptexb \let\bullet=\ptexbullet \let\c=\ptexc \let\,=\ptexcomma \let\.=\ptexdot \let\dots=\ptexdots \let\equiv=\ptexequiv \let\!=\ptexexclam \let\i=\ptexi \let\indent=\ptexindent \let\noindent=\ptexnoindent \let\{=\ptexlbrace \let\+=\tabalign \let\}=\ptexrbrace \let\/=\ptexslash \let\sp=\ptexsp \let\*=\ptexstar %\let\sup=\ptexsup % do not redefine, we want @sup to work in math mode \let\t=\ptext \expandafter \let\csname top\endcsname=\ptextop % we've made it outer \let\frenchspacing=\plainfrenchspacing % \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% \def\@{@}% } % There is no need to define \Etex. % Define @lisp ... @end lisp. % @lisp environment forms a group so it can rebind things, % including the definition of @end lisp (which normally is erroneous). % Amount to narrow the margins by for @lisp. \newskip\lispnarrowing \lispnarrowing=0.4in % This is the definition that ^^M gets inside @lisp, @example, and other % such environments. \null is better than a space, since it doesn't % have any width. \def\lisppar{\null\endgraf} % This space is always present above and below environments. \newskip\envskipamount \envskipamount = 0pt % Make spacing and below environment symmetrical. We use \parskip here % to help in doing that, since in @example-like environments \parskip % is reset to zero; thus the \afterenvbreak inserts no space -- but the % start of the next paragraph will insert \parskip. % \def\aboveenvbreak{{% % =10000 instead of <10000 because of a special case in \itemzzz and % \sectionheading, q.v. \ifnum \lastpenalty=10000 \else \advance\envskipamount by \parskip \endgraf \ifdim\lastskip<\envskipamount \removelastskip \ifnum\lastpenalty<10000 % Penalize breaking before the environment, because preceding text % often leads into it. \penalty100 \fi \vskip\envskipamount \fi \fi }} \def\afterenvbreak{{% % =10000 instead of <10000 because of a special case in \itemzzz and % \sectionheading, q.v. \ifnum \lastpenalty=10000 \else \advance\envskipamount by \parskip \endgraf \ifdim\lastskip<\envskipamount \removelastskip % it's not a good place to break if the last penalty was \nobreak % or better ... \ifnum\lastpenalty<10000 \penalty-50 \fi \vskip\envskipamount \fi \fi }} % \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will % also clear it, so that its embedded environments do the narrowing again. \let\nonarrowing=\relax % @cartouche ... @end cartouche: draw rectangle w/rounded corners around % environment contents. % \def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth \def\ctr{{\hskip 6pt\circle\char'010}} \def\cbl{{\circle\char'012\hskip -6pt}} \def\cbr{{\hskip 6pt\circle\char'011}} \def\carttop{\hbox to \cartouter{\hskip\lskip \ctl\leaders\hrule height\circthick\hfil\ctr \hskip\rskip}} \def\cartbot{\hbox to \cartouter{\hskip\lskip \cbl\leaders\hrule height\circthick\hfil\cbr \hskip\rskip}} % \newskip\lskip\newskip\rskip % only require the font if @cartouche is actually used \def\cartouchefontdefs{% \font\circle=lcircle10\relax \circthick=\fontdimen8\circle } \newdimen\circthick \newdimen\cartouter\newdimen\cartinner \newskip\normbskip\newskip\normpskip\newskip\normlskip \envdef\cartouche{% \cartouchefontdefs \ifhmode\par\fi % can't be in the midst of a paragraph. \startsavinginserts \lskip=\leftskip \rskip=\rightskip \leftskip=0pt\rightskip=0pt % we want these *outside*. \cartinner=\hsize \advance\cartinner by-\lskip \advance\cartinner by-\rskip \cartouter=\hsize \advance\cartouter by 18.4pt % allow for 3pt kerns on either % side, and for 6pt waste from % each corner char, and rule thickness \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip % % If this cartouche directly follows a sectioning command, we need the % \parskip glue (backspaced over by default) or the cartouche can % collide with the section heading. \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi % \setbox\groupbox=\vbox\bgroup \baselineskip=0pt\parskip=0pt\lineskip=0pt \carttop \hbox\bgroup \hskip\lskip \vrule\kern3pt \vbox\bgroup \kern3pt \hsize=\cartinner \baselineskip=\normbskip \lineskip=\normlskip \parskip=\normpskip \vskip -\parskip \comment % For explanation, see the end of def\group. } \def\Ecartouche{% \ifhmode\par\fi \kern3pt \egroup \kern3pt\vrule \hskip\rskip \egroup \cartbot \egroup \addgroupbox \checkinserts } % This macro is called at the beginning of all the @example variants, % inside a group. \newdimen\nonfillparindent \def\nonfillstart{% \aboveenvbreak \ifdim\hfuzz < 12pt \hfuzz = 12pt \fi % Don't be fussy \sepspaces % Make spaces be word-separators rather than space tokens. \let\par = \lisppar % don't ignore blank lines \obeylines % each line of input is a line of output \parskip = 0pt % Turn off paragraph indentation but redefine \indent to emulate % the normal \indent. \nonfillparindent=\parindent \parindent = 0pt \let\indent\nonfillindent % \emergencystretch = 0pt % don't try to avoid overfull boxes \ifx\nonarrowing\relax \advance \leftskip by \lispnarrowing \exdentamount=\lispnarrowing \else \let\nonarrowing = \relax \fi \let\exdent=\nofillexdent } \begingroup \obeyspaces % We want to swallow spaces (but not other tokens) after the fake % @indent in our nonfill-environments, where spaces are normally % active and set to @tie, resulting in them not being ignored after % @indent. \gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}% \gdef\nonfillindentcheck{% \ifx\temp % \expandafter\nonfillindentgobble% \else% \leavevmode\nonfillindentbox% \fi% }% \endgroup \def\nonfillindentgobble#1{\nonfillindent} \def\nonfillindentbox{\hbox to \nonfillparindent{\hss}} % If you want all examples etc. small: @set dispenvsize small. % If you want even small examples the full size: @set dispenvsize nosmall. % This affects the following displayed environments: % @example, @display, @format, @lisp % \def\smallword{small} \def\nosmallword{nosmall} \let\SETdispenvsize\relax \def\setnormaldispenv{% \ifx\SETdispenvsize\smallword % end paragraph for sake of leading, in case document has no blank % line. This is redundant with what happens in \aboveenvbreak, but % we need to do it before changing the fonts, and it's inconvenient % to change the fonts afterward. \ifnum \lastpenalty=10000 \else \endgraf \fi \smallexamplefonts \rm \fi } \def\setsmalldispenv{% \ifx\SETdispenvsize\nosmallword \else \ifnum \lastpenalty=10000 \else \endgraf \fi \smallexamplefonts \rm \fi } % We often define two environments, @foo and @smallfoo. % Let's do it in one command. #1 is the env name, #2 the definition. \def\makedispenvdef#1#2{% \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}% \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}% \expandafter\let\csname E#1\endcsname \afterenvbreak \expandafter\let\csname Esmall#1\endcsname \afterenvbreak } % Define two environment synonyms (#1 and #2) for an environment. \def\maketwodispenvdef#1#2#3{% \makedispenvdef{#1}{#3}% \makedispenvdef{#2}{#3}% } % % @lisp: indented, narrowed, typewriter font; % @example: same as @lisp. % % @smallexample and @smalllisp: use smaller fonts. % Originally contributed by Pavel@xerox. % \maketwodispenvdef{lisp}{example}{% \nonfillstart \tt\setupmarkupstyle{example}% \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. \gobble % eat return } % @display/@smalldisplay: same as @lisp except keep current font. % \makedispenvdef{display}{% \nonfillstart \gobble } % @format/@smallformat: same as @display except don't narrow margins. % \makedispenvdef{format}{% \let\nonarrowing = t% \nonfillstart \gobble } % @flushleft: same as @format, but doesn't obey \SETdispenvsize. \envdef\flushleft{% \let\nonarrowing = t% \nonfillstart \gobble } \let\Eflushleft = \afterenvbreak % @flushright. % \envdef\flushright{% \let\nonarrowing = t% \nonfillstart \advance\leftskip by 0pt plus 1fill\relax \gobble } \let\Eflushright = \afterenvbreak % @raggedright does more-or-less normal line breaking but no right % justification. From plain.tex. \envdef\raggedright{% \rightskip0pt plus2.4em \spaceskip.3333em \xspaceskip.5em\relax } \let\Eraggedright\par \envdef\raggedleft{% \parindent=0pt \leftskip0pt plus2em \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt \hbadness=10000 % Last line will usually be underfull, so turn off % badness reporting. } \let\Eraggedleft\par \envdef\raggedcenter{% \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt \hbadness=10000 % Last line will usually be underfull, so turn off % badness reporting. } \let\Eraggedcenter\par % @quotation does normal linebreaking (hence we can't use \nonfillstart) % and narrows the margins. We keep \parskip nonzero in general, since % we're doing normal filling. So, when using \aboveenvbreak and % \afterenvbreak, temporarily make \parskip 0. % \makedispenvdef{quotation}{\quotationstart} % \def\quotationstart{% \indentedblockstart % same as \indentedblock, but increase right margin too. \ifx\nonarrowing\relax \advance\rightskip by \lispnarrowing \fi \parsearg\quotationlabel } % We have retained a nonzero parskip for the environment, since we're % doing normal filling. % \def\Equotation{% \par \ifx\quotationauthor\thisisundefined\else % indent a bit. \leftline{\kern 2\leftskip \sl ---\quotationauthor}% \fi {\parskip=0pt \afterenvbreak}% } \def\Esmallquotation{\Equotation} % If we're given an argument, typeset it in bold with a colon after. \def\quotationlabel#1{% \def\temp{#1}% \ifx\temp\empty \else {\bf #1: }% \fi } % @indentedblock is like @quotation, but indents only on the left and % has no optional argument. % \makedispenvdef{indentedblock}{\indentedblockstart} % \def\indentedblockstart{% {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip \parindent=0pt % % @cartouche defines \nonarrowing to inhibit narrowing at next level down. \ifx\nonarrowing\relax \advance\leftskip by \lispnarrowing \exdentamount = \lispnarrowing \else \let\nonarrowing = \relax \fi } % Keep a nonzero parskip for the environment, since we're doing normal filling. % \def\Eindentedblock{% \par {\parskip=0pt \afterenvbreak}% } \def\Esmallindentedblock{\Eindentedblock} % LaTeX-like @verbatim...@end verbatim and @verb{...} % If we want to allow any as delimiter, % we need the curly braces so that makeinfo sees the @verb command, eg: % `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org % % [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. % % [Knuth] p.344; only we need to do the other characters Texinfo sets % active too. Otherwise, they get lost as the first character on a % verbatim line. \def\dospecials{% \do\ \do\\\do\{\do\}\do\$\do\&% \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~% \do\<\do\>\do\|\do\@\do+\do\"% % Don't do the quotes -- if we do, @set txicodequoteundirected and % @set txicodequotebacktick will not have effect on @verb and % @verbatim, and ?` and !` ligatures won't get disabled. %\do\`\do\'% } % % [Knuth] p. 380 \def\uncatcodespecials{% \def\do##1{\catcode`##1=\other}\dospecials} % % Setup for the @verb command. % % Eight spaces for a tab \begingroup \catcode`\^^I=\active \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} \endgroup % \def\setupverb{% \tt % easiest (and conventionally used) font for verbatim \def\par{\leavevmode\endgraf}% \setupmarkupstyle{verb}% \tabeightspaces % Respect line breaks, % print special symbols as themselves, and % make each space count % must do in this order: \obeylines \uncatcodespecials \sepspaces } % Setup for the @verbatim environment % % Real tab expansion. \newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount % % We typeset each line of the verbatim in an \hbox, so we can handle % tabs. \newbox\verbbox \def\starttabbox{\setbox\verbbox=\hbox\bgroup} % \begingroup \catcode`\^^I=\active \gdef\tabexpand{% \catcode`\^^I=\active \def^^I{\leavevmode\egroup \dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab \divide\dimen\verbbox by\tabw \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw \advance\dimen\verbbox by\tabw % advance to next multiple of \tabw \wd\verbbox=\dimen\verbbox \leavevmode\box\verbbox \starttabbox }% } \endgroup % start the verbatim environment. \def\setupverbatim{% \let\nonarrowing = t% \nonfillstart \tt % easiest (and conventionally used) font for verbatim \def\par{\egroup\leavevmode\box\verbbox\endgraf\starttabbox}% \tabexpand \setupmarkupstyle{verbatim}% % Respect line breaks, % print special symbols as themselves, and % make each space count. % Must do in this order: \obeylines \uncatcodespecials \sepspaces } % Do the @verb magic: verbatim text is quoted by unique % delimiter characters. Before first delimiter expect a % right brace, after last delimiter expect closing brace: % % \def\doverb'{'#1'}'{#1} % % [Knuth] p. 382; only eat outer {} \begingroup \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] \endgroup % \def\verb{\begingroup\setupverb\doverb} % % % Do the @verbatim magic: define the macro \doverbatim so that % the (first) argument ends when '@end verbatim' is reached, ie: % % \def\doverbatim#1@end verbatim{#1} % % For Texinfo it's a lot easier than for LaTeX, % because texinfo's \verbatim doesn't stop at '\end{verbatim}': % we need not redefine '\', '{' and '}'. % % Inspired by LaTeX's verbatim command set [latex.ltx] % \begingroup \catcode`\ =\active \obeylines % % ignore everything up to the first ^^M, that's the newline at the end % of the @verbatim input line itself. Otherwise we get an extra blank % line in the output. \xdef\doverbatim#1^^M#2@end verbatim{% \starttabbox#2\egroup\noexpand\end\gobble verbatim}% % We really want {...\end verbatim} in the body of the macro, but % without the active space; thus we have to use \xdef and \gobble. % The \egroup ends the \verbbox started at the end of the last line in % the block. \endgroup % \envdef\verbatim{% \setupverbatim\doverbatim } \let\Everbatim = \afterenvbreak % @verbatiminclude FILE - insert text of file in verbatim environment. % \def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude} % \def\doverbatiminclude#1{% {% \makevalueexpandable \setupverbatim {% \indexnofonts % Allow `@@' and other weird things in file names. \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}% \edef\tmp{\noexpand\input #1 } \expandafter }\expandafter\starttabbox\tmp\egroup \afterenvbreak }% } % @copying ... @end copying. % Save the text away for @insertcopying later. % % We save the uninterpreted tokens, rather than creating a box. % Saving the text in a box would be much easier, but then all the % typesetting commands (@smallbook, font changes, etc.) have to be done % beforehand -- and a) we want @copying to be done first in the source % file; b) letting users define the frontmatter in as flexible order as % possible is desirable. % \def\copying{\checkenv{}\begingroup\scanargctxt\docopying} \def\docopying#1@end copying{\endgroup\def\copyingtext{#1}} % \def\insertcopying{% \begingroup \parindent = 0pt % paragraph indentation looks wrong on title page \scanexp\copyingtext \endgroup } \message{defuns,} % @defun etc. \newskip\defbodyindent \defbodyindent=.4in \newskip\defargsindent \defargsindent=50pt \newskip\deflastargmargin \deflastargmargin=18pt \newcount\defunpenalty % Start the processing of @deffn: \def\startdefun{% \ifnum\lastpenalty<10000 \medbreak \defunpenalty=10003 % Will keep this @deffn together with the % following @def command, see below. \else % If there are two @def commands in a row, we'll have a \nobreak, % which is there to keep the function description together with its % header. But if there's nothing but headers, we need to allow a % break somewhere. Check specifically for penalty 10002, inserted % by \printdefunline, instead of 10000, since the sectioning % commands also insert a nobreak penalty, and we don't want to allow % a break between a section heading and a defun. % % As a further refinement, we avoid "club" headers by signalling % with penalty of 10003 after the very first @deffn in the % sequence (see above), and penalty of 10002 after any following % @def command. \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi % % Similarly, after a section heading, do not allow a break. % But do insert the glue. \medskip % preceded by discardable penalty, so not a breakpoint \fi % \parindent=0in \advance\leftskip by \defbodyindent \exdentamount=\defbodyindent } \def\dodefunx#1{% % First, check whether we are in the right environment: \checkenv#1% % % As above, allow line break if we have multiple x headers in a row. % It's not a great place, though. \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi % % And now, it's time to reuse the body of the original defun: \expandafter\gobbledefun#1% } \def\gobbledefun#1\startdefun{} % \printdefunline \deffnheader{text} % \def\printdefunline#1#2{% \begingroup % call \deffnheader: #1#2 \endheader % common ending: \interlinepenalty = 10000 \advance\rightskip by 0pt plus 1fil\relax \endgraf \nobreak\vskip -\parskip \penalty\defunpenalty % signal to \startdefun and \dodefunx % Some of the @defun-type tags do not enable magic parentheses, % rendering the following check redundant. But we don't optimize. \checkparencounts \endgroup } \def\Edefun{\endgraf\medbreak} % \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; % the only thing remaining is to define \deffnheader. % \def\makedefun#1{% \expandafter\let\csname E#1\endcsname = \Edefun \edef\temp{\noexpand\domakedefun \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% \temp } % \domakedefun \deffn \deffnx \deffnheader { (defn. of \deffnheader) } % % Define \deffn and \deffnx, without parameters. % \deffnheader has to be defined explicitly. % \def\domakedefun#1#2#3{% \envdef#1{% \startdefun \doingtypefnfalse % distinguish typed functions from all else \parseargusing\activeparens{\printdefunline#3}% }% \def#2{\dodefunx#1}% \def#3% } \newif\ifdoingtypefn % doing typed function? \newif\ifrettypeownline % typeset return type on its own line? % @deftypefnnewline on|off says whether the return type of typed functions % are printed on their own line. This affects @deftypefn, @deftypefun, % @deftypeop, and @deftypemethod. % \parseargdef\deftypefnnewline{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxideftypefnnl\endcsname = \empty \else\ifx\temp\offword \expandafter\let\csname SETtxideftypefnnl\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @txideftypefnnl value `\temp', must be on|off}% \fi\fi } % \dosubind {index}{topic}{subtopic} % % If SUBTOPIC is present, precede it with a space, and call \doind. % (At some time during the 20th century, this made a two-level entry in an % index such as the operation index. Nobody seemed to notice the change in % behaviour though.) \def\dosubind#1#2#3{% \def\thirdarg{#3}% \ifx\thirdarg\empty \doind{#1}{#2}% \else \doind{#1}{#2\space#3}% \fi } % Untyped functions: % @deffn category name args \makedefun{deffn}{\deffngeneral{}} % @deffn category class name args \makedefun{defop}#1 {\defopon{#1\ \putwordon}} % \defopon {category on}class name args \def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } % \deffngeneral {subind}category name args % \def\deffngeneral#1#2 #3 #4\endheader{% \dosubind{fn}{\code{#3}}{#1}% \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% } % Typed functions: % @deftypefn category type name args \makedefun{deftypefn}{\deftypefngeneral{}} % @deftypeop category class type name args \makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} % \deftypeopon {category on}class type name args \def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } % \deftypefngeneral {subind}category type name args % \def\deftypefngeneral#1#2 #3 #4 #5\endheader{% \dosubind{fn}{\code{#4}}{#1}% \doingtypefntrue \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } % Typed variables: % @deftypevr category type var args \makedefun{deftypevr}{\deftypecvgeneral{}} % @deftypecv category class type var args \makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} % \deftypecvof {category of}class type var args \def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} } % \deftypecvgeneral {subind}category type var args % \def\deftypecvgeneral#1#2 #3 #4 #5\endheader{% \dosubind{vr}{\code{#4}}{#1}% \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } % Untyped variables: % @defvr category var args \makedefun{defvr}#1 {\deftypevrheader{#1} {} } % @defcv category class var args \makedefun{defcv}#1 {\defcvof{#1\ \putwordof}} % \defcvof {category of}class var args \def\defcvof#1#2 {\deftypecvof{#1}#2 {} } % Types: % @deftp category name args \makedefun{deftp}#1 #2 #3\endheader{% \doind{tp}{\code{#2}}% \defname{#1}{}{#2}\defunargs{#3\unskip}% } % Remaining @defun-like shortcuts: \makedefun{defun}{\deffnheader{\putwordDeffunc} } \makedefun{defmac}{\deffnheader{\putwordDefmac} } \makedefun{defspec}{\deffnheader{\putwordDefspec} } \makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} } \makedefun{defvar}{\defvrheader{\putwordDefvar} } \makedefun{defopt}{\defvrheader{\putwordDefopt} } \makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } \makedefun{defmethod}{\defopon\putwordMethodon} \makedefun{deftypemethod}{\deftypeopon\putwordMethodon} \makedefun{defivar}{\defcvof\putwordInstanceVariableof} \makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} % \defname, which formats the name of the @def (not the args). % #1 is the category, such as "Function". % #2 is the return type, if any. % #3 is the function name. % % We are followed by (but not passed) the arguments, if any. % \def\defname#1#2#3{% \par % Get the values of \leftskip and \rightskip as they were outside the @def... \advance\leftskip by -\defbodyindent % % Determine if we are typesetting the return type of a typed function % on a line by itself. \rettypeownlinefalse \ifdoingtypefn % doing a typed function specifically? % then check user option for putting return type on its own line: \expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else \rettypeownlinetrue \fi \fi % % How we'll format the category name. Putting it in brackets helps % distinguish it from the body text that may end up on the next line % just below it. \def\temp{#1}% \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} % % Figure out line sizes for the paragraph shape. We'll always have at % least two. \tempnum = 2 % % The first line needs space for \box0; but if \rightskip is nonzero, % we need only space for the part of \box0 which exceeds it: \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip % % If doing a return type on its own line, we'll have another line. \ifrettypeownline \advance\tempnum by 1 \def\maybeshapeline{0in \hsize}% \else \def\maybeshapeline{}% \fi % % The continuations: \dimen2=\hsize \advance\dimen2 by -\defargsindent % % The final paragraph shape: \parshape \tempnum 0in \dimen0 \maybeshapeline \defargsindent \dimen2 % % Put the category name at the right margin. \noindent \hbox to 0pt{% \hfil\box0 \kern-\hsize % \hsize has to be shortened this way: \kern\leftskip % Intentionally do not respect \rightskip, since we need the space. }% % % Allow all lines to be underfull without complaint: \tolerance=10000 \hbadness=10000 \exdentamount=\defbodyindent {% % defun fonts. We use typewriter by default (used to be bold) because: % . we're printing identifiers, they should be in tt in principle. % . in languages with many accents, such as Czech or French, it's % common to leave accents off identifiers. The result looks ok in % tt, but exceedingly strange in rm. % . we don't want -- and --- to be treated as ligatures. % . this still does not fix the ?` and !` ligatures, but so far no % one has made identifiers using them :). \df \tt \def\temp{#2}% text of the return type \ifx\temp\empty\else \tclose{\temp}% typeset the return type \ifrettypeownline % put return type on its own line; prohibit line break following: \hfil\vadjust{\nobreak}\break \else \space % type on same line, so just followed by a space \fi \fi % no return type #3% output function name }% {\rm\enskip}% hskip 0.5 em of \rmfont % \boldbrax % arguments will be output next, if any. } % Print arguments in slanted roman (not ttsl), inconsistently with using % tt for the name. This is because literal text is sometimes needed in % the argument list (groff manual), and ttsl and tt are not very % distinguishable. Prevent hyphenation at `-' chars. % \def\defunargs#1{% % use sl by default (not ttsl), % tt for the names. \df \sl \hyphenchar\font=0 % % On the other hand, if an argument has two dashes (for instance), we % want a way to get ttsl. We used to recommend @var for that, so % leave the code in, but it's strange for @var to lead to typewriter. % Nowadays we recommend @code, since the difference between a ttsl hyphen % and a tt hyphen is pretty tiny. @code also disables ?` !`. \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}% #1% \sl\hyphenchar\font=45 } % We want ()&[] to print specially on the defun line. % \def\activeparens{% \catcode`\(=\active \catcode`\)=\active \catcode`\[=\active \catcode`\]=\active \catcode`\&=\active } % Make control sequences which act like normal parenthesis chars. \let\lparen = ( \let\rparen = ) % Be sure that we always have a definition for `(', etc. For example, % if the fn name has parens in it, \boldbrax will not be in effect yet, % so TeX would otherwise complain about undefined control sequence. { \activeparens \global\let(=\lparen \global\let)=\rparen \global\let[=\lbrack \global\let]=\rbrack \global\let& = \& \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} \gdef\magicamp{\let&=\amprm} } \let\ampchar\& \newcount\parencount % If we encounter &foo, then turn on ()-hacking afterwards \newif\ifampseen \def\amprm#1 {\ampseentrue{\bf\ }} \def\parenfont{% \ifampseen % At the first level, print parens in roman, % otherwise use the default font. \ifnum \parencount=1 \rm \fi \else % The \sf parens (in \boldbrax) actually are a little bolder than % the contained text. This is especially needed for [ and ] . \sf \fi } \def\infirstlevel#1{% \ifampseen \ifnum\parencount=1 #1% \fi \fi } \def\bfafterword#1 {#1 \bf} \def\opnr{% \global\advance\parencount by 1 {\parenfont(}% \infirstlevel \bfafterword } \def\clnr{% {\parenfont)}% \infirstlevel \sl \global\advance\parencount by -1 } \newcount\brackcount \def\lbrb{% \global\advance\brackcount by 1 {\bf[}% } \def\rbrb{% {\bf]}% \global\advance\brackcount by -1 } \def\checkparencounts{% \ifnum\parencount=0 \else \badparencount \fi \ifnum\brackcount=0 \else \badbrackcount \fi } % these should not use \errmessage; the glibc manual, at least, actually % has such constructs (when documenting function pointers). \def\badparencount{% \message{Warning: unbalanced parentheses in @def...}% \global\parencount=0 } \def\badbrackcount{% \message{Warning: unbalanced square brackets in @def...}% \global\brackcount=0 } \message{macros,} % @macro. % To do this right we need a feature of e-TeX, \scantokens, % which we arrange to emulate with a temporary file in ordinary TeX. \ifx\eTeXversion\thisisundefined \newwrite\macscribble \def\scantokens#1{% \toks0={#1}% \immediate\openout\macscribble=\jobname.tmp \immediate\write\macscribble{\the\toks0}% \immediate\closeout\macscribble \input \jobname.tmp } \fi % Used at the time of macro expansion. % Argument is macro body with arguments substituted \def\scanmacro#1{% \newlinechar`\^^M \def\xeatspaces{\eatspaces}% % % Process the macro body under the current catcode regime. \scantokens{#1@comment}% % % The \comment is to remove the \newlinechar added by \scantokens, and % can be noticed by \parsearg. Note \c isn't used because this means cedilla % in math mode. } % Used for copying and captions \def\scanexp#1{% \expandafter\scanmacro\expandafter{#1}% } \newcount\paramno % Count of parameters \newtoks\macname % Macro name \newif\ifrecursive % Is it recursive? % List of all defined macros in the form % \commondummyword\macro1\commondummyword\macro2... % Currently is also contains all @aliases; the list can be split % if there is a need. \def\macrolist{} % Add the macro to \macrolist \def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname} \def\addtomacrolistxxx#1{% \toks0 = \expandafter{\macrolist\commondummyword#1}% \xdef\macrolist{\the\toks0}% } % Utility routines. % This does \let #1 = #2, with \csnames; that is, % \let \csname#1\endcsname = \csname#2\endcsname % (except of course we have to play expansion games). % \def\cslet#1#2{% \expandafter\let \csname#1\expandafter\endcsname \csname#2\endcsname } % Trim leading and trailing spaces off a string. % Concepts from aro-bend problem 15 (see CTAN). {\catcode`\@=11 \gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} \gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} \gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} \def\unbrace#1{#1} \unbrace{\gdef\trim@@@ #1 } #2@{#1} } % Trim a single trailing ^^M off a string. {\catcode`\^^M=\other \catcode`\Q=3% \gdef\eatcr #1{\eatcra #1Q^^MQ}% \gdef\eatcra#1^^MQ{\eatcrb#1Q}% \gdef\eatcrb#1Q#2Q{#1}% } % Macro bodies are absorbed as an argument in a context where % all characters are catcode 10, 11 or 12, except \ which is active % (as in normal texinfo). It is necessary to change the definition of \ % to recognize macro arguments; this is the job of \mbodybackslash. % % Non-ASCII encodings make 8-bit characters active, so un-activate % them to avoid their expansion. Must do this non-globally, to % confine the change to the current group. % % It's necessary to have hard CRs when the macro is executed. This is % done by making ^^M (\endlinechar) catcode 12 when reading the macro % body, and then making it the \newlinechar in \scanmacro. % \def\scanctxt{% used as subroutine \catcode`\"=\other \catcode`\+=\other \catcode`\<=\other \catcode`\>=\other \catcode`\^=\other \catcode`\_=\other \catcode`\|=\other \catcode`\~=\other \passthroughcharstrue } \def\scanargctxt{% used for copying and captions, not macros. \scanctxt \catcode`\@=\other \catcode`\\=\other \catcode`\^^M=\other } \def\macrobodyctxt{% used for @macro definitions \scanctxt \catcode`\ =\other \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other \catcode`\^^M=\other \usembodybackslash } % Used when scanning braced macro arguments. Note, however, that catcode % changes here are ineffectual if the macro invocation was nested inside % an argument to another Texinfo command. \def\macroargctxt{% \scanctxt \catcode`\ =\active \catcode`\@=\other \catcode`\^^M=\other \catcode`\\=\active } \def\macrolineargctxt{% used for whole-line arguments without braces \scanctxt \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other } % \mbodybackslash is the definition of \ in @macro bodies. % It maps \foo\ => \csname macarg.foo\endcsname => #N % where N is the macro parameter number. % We define \csname macarg.\endcsname to be \realbackslash, so % \\ in macro replacement text gets you a backslash. % {\catcode`@=0 @catcode`@\=@active @gdef@usembodybackslash{@let\=@mbodybackslash} @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} } \expandafter\def\csname macarg.\endcsname{\realbackslash} \def\margbackslash#1{\char`\#1 } \def\macro{\recursivefalse\parsearg\macroxxx} \def\rmacro{\recursivetrue\parsearg\macroxxx} \def\macroxxx#1{% \getargs{#1}% now \macname is the macname and \argl the arglist \ifx\argl\empty % no arguments \paramno=0\relax \else \expandafter\parsemargdef \argl;% \if\paramno>256\relax \ifx\eTeXversion\thisisundefined \errhelp = \EMsimple \errmessage{You need eTeX to compile a file with macros with more than 256 arguments} \fi \fi \fi \if1\csname ismacro.\the\macname\endcsname \message{Warning: redefining \the\macname}% \else \expandafter\ifx\csname \the\macname\endcsname \relax \else \errmessage{Macro name \the\macname\space already defined}\fi \global\cslet{macsave.\the\macname}{\the\macname}% \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% \addtomacrolist{\the\macname}% \fi \begingroup \macrobodyctxt \ifrecursive \expandafter\parsermacbody \else \expandafter\parsemacbody \fi} \parseargdef\unmacro{% \if1\csname ismacro.#1\endcsname \global\cslet{#1}{macsave.#1}% \global\expandafter\let \csname ismacro.#1\endcsname=0% % Remove the macro name from \macrolist: \begingroup \expandafter\let\csname#1\endcsname \relax \let\commondummyword\unmacrodo \xdef\macrolist{\macrolist}% \endgroup \else \errmessage{Macro #1 not defined}% \fi } % Called by \do from \dounmacro on each macro. The idea is to omit any % macro definitions that have been changed to \relax. % \def\unmacrodo#1{% \ifx #1\relax % remove this \else \noexpand\commondummyword \noexpand#1% \fi } % \getargs -- Parse the arguments to a @macro line. Set \macname to % the name of the macro, and \argl to the braced argument list. \def\getargs#1{\getargsxxx#1{}} \def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} \def\getmacname#1 #2\relax{\macname={#1}} \def\getmacargs#1{\def\argl{#1}} % This made use of the feature that if the last token of a % is #, then the preceding argument is delimited by % an opening brace, and that opening brace is not consumed. % Parse the optional {params} list to @macro or @rmacro. % Set \paramno to the number of arguments, % and \paramlist to a parameter text for the macro (e.g. #1,#2,#3 for a % three-param macro.) Define \macarg.BLAH for each BLAH in the params % list to some hook where the argument is to be expanded. If there are % less than 10 arguments that hook is to be replaced by ##N where N % is the position in that list, that is to say the macro arguments are to be % defined `a la TeX in the macro body. % % That gets used by \mbodybackslash (above). % % If there are 10 or more arguments, a different technique is used: see % \parsemmanyargdef. % \def\parsemargdef#1;{% \paramno=0\def\paramlist{}% \let\hash\relax % \hash is redefined to `#' later to get it into definitions \let\xeatspaces\relax \parsemargdefxxx#1,;,% \ifnum\paramno<10\relax\else \paramno0\relax \parsemmanyargdef@@#1,;,% 10 or more arguments \fi } \def\parsemargdefxxx#1,{% \if#1;\let\next=\relax \else \let\next=\parsemargdefxxx \advance\paramno by 1 \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname {\xeatspaces{\hash\the\paramno}}% \edef\paramlist{\paramlist\hash\the\paramno,}% \fi\next} % \parsemacbody, \parsermacbody % % Read recursive and nonrecursive macro bodies. (They're different since % rec and nonrec macros end differently.) % % We are in \macrobodyctxt, and the \xdef causes backslashshes in the macro % body to be transformed. % Set \macrobody to the body of the macro, and call \defmacro. % {\catcode`\ =\other\long\gdef\parsemacbody#1@end macro{% \xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}% {\catcode`\ =\other\long\gdef\parsermacbody#1@end rmacro{% \xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}% % Make @ a letter, so that we can make private-to-Texinfo macro names. \edef\texiatcatcode{\the\catcode`\@} \catcode `@=11\relax %%%%%%%%%%%%%% Code for > 10 arguments only %%%%%%%%%%%%%%%%%% % If there are 10 or more arguments, a different technique is used, where the % hook remains in the body, and when macro is to be expanded the body is % processed again to replace the arguments. % % In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the % argument N value and then \edef the body (nothing else will expand because of % the catcode regime under which the body was input). % % If you compile with TeX (not eTeX), and you have macros with 10 or more % arguments, no macro can have more than 256 arguments (else error). % % In case that there are 10 or more arguments we parse again the arguments % list to set new definitions for the \macarg.BLAH macros corresponding to % each BLAH argument. It was anyhow needed to parse already once this list % in order to count the arguments, and as macros with at most 9 arguments % are by far more frequent than macro with 10 or more arguments, defining % twice the \macarg.BLAH macros does not cost too much processing power. \def\parsemmanyargdef@@#1,{% \if#1;\let\next=\relax \else \let\next=\parsemmanyargdef@@ \edef\tempb{\eatspaces{#1}}% \expandafter\def\expandafter\tempa \expandafter{\csname macarg.\tempb\endcsname}% % Note that we need some extra \noexpand\noexpand, this is because we % don't want \the to be expanded in the \parsermacbody as it uses an % \xdef . \expandafter\edef\tempa {\noexpand\noexpand\noexpand\the\toks\the\paramno}% \advance\paramno by 1\relax \fi\next} \let\endargs@\relax \let\nil@\relax \def\nilm@{\nil@}% \long\def\nillm@{\nil@}% % This macro is expanded during the Texinfo macro expansion, not during its % definition. It gets all the arguments' values and assigns them to macros % macarg.ARGNAME % % #1 is the macro name % #2 is the list of argument names % #3 is the list of argument values \def\getargvals@#1#2#3{% \def\macargdeflist@{}% \def\saveparamlist@{#2}% Need to keep a copy for parameter expansion. \def\paramlist{#2,\nil@}% \def\macroname{#1}% \begingroup \macroargctxt \def\argvaluelist{#3,\nil@}% \def\@tempa{#3}% \ifx\@tempa\empty \setemptyargvalues@ \else \getargvals@@ \fi } \def\getargvals@@{% \ifx\paramlist\nilm@ % Some sanity check needed here that \argvaluelist is also empty. \ifx\argvaluelist\nillm@ \else \errhelp = \EMsimple \errmessage{Too many arguments in macro `\macroname'!}% \fi \let\next\macargexpandinbody@ \else \ifx\argvaluelist\nillm@ % No more arguments values passed to macro. Set remaining named-arg % macros to empty. \let\next\setemptyargvalues@ \else % pop current arg name into \@tempb \def\@tempa##1{\pop@{\@tempb}{\paramlist}##1\endargs@}% \expandafter\@tempa\expandafter{\paramlist}% % pop current argument value into \@tempc \def\@tempa##1{\longpop@{\@tempc}{\argvaluelist}##1\endargs@}% \expandafter\@tempa\expandafter{\argvaluelist}% % Here \@tempb is the current arg name and \@tempc is the current arg value. % First place the new argument macro definition into \@tempd \expandafter\macname\expandafter{\@tempc}% \expandafter\let\csname macarg.\@tempb\endcsname\relax \expandafter\def\expandafter\@tempe\expandafter{% \csname macarg.\@tempb\endcsname}% \edef\@tempd{\long\def\@tempe{\the\macname}}% \push@\@tempd\macargdeflist@ \let\next\getargvals@@ \fi \fi \next } \def\push@#1#2{% \expandafter\expandafter\expandafter\def \expandafter\expandafter\expandafter#2% \expandafter\expandafter\expandafter{% \expandafter#1#2}% } % Replace arguments by their values in the macro body, and place the result % in macro \@tempa. % \def\macvalstoargs@{% % To do this we use the property that token registers that are \the'ed % within an \edef expand only once. So we are going to place all argument % values into respective token registers. % % First we save the token context, and initialize argument numbering. \begingroup \paramno0\relax % Then, for each argument number #N, we place the corresponding argument % value into a new token list register \toks#N \expandafter\putargsintokens@\saveparamlist@,;,% % Then, we expand the body so that argument are replaced by their % values. The trick for values not to be expanded themselves is that they % are within tokens and that tokens expand only once in an \edef . \edef\@tempc{\csname mac.\macroname .body\endcsname}% % Now we restore the token stack pointer to free the token list registers % which we have used, but we make sure that expanded body is saved after % group. \expandafter \endgroup \expandafter\def\expandafter\@tempa\expandafter{\@tempc}% } % Define the named-macro outside of this group and then close this group. % \def\macargexpandinbody@{% \expandafter \endgroup \macargdeflist@ % First the replace in body the macro arguments by their values, the result % is in \@tempa . \macvalstoargs@ % Then we point at the \norecurse or \gobble (for recursive) macro value % with \@tempb . \expandafter\let\expandafter\@tempb\csname mac.\macroname .recurse\endcsname % Depending on whether it is recursive or not, we need some tailing % \egroup . \ifx\@tempb\gobble \let\@tempc\relax \else \let\@tempc\egroup \fi % And now we do the real job: \edef\@tempd{\noexpand\@tempb{\macroname}\noexpand\scanmacro{\@tempa}\@tempc}% \@tempd } \def\putargsintokens@#1,{% \if#1;\let\next\relax \else \let\next\putargsintokens@ % First we allocate the new token list register, and give it a temporary % alias \@tempb . \toksdef\@tempb\the\paramno % Then we place the argument value into that token list register. \expandafter\let\expandafter\@tempa\csname macarg.#1\endcsname \expandafter\@tempb\expandafter{\@tempa}% \advance\paramno by 1\relax \fi \next } % Trailing missing arguments are set to empty. % \def\setemptyargvalues@{% \ifx\paramlist\nilm@ \let\next\macargexpandinbody@ \else \expandafter\setemptyargvaluesparser@\paramlist\endargs@ \let\next\setemptyargvalues@ \fi \next } \def\setemptyargvaluesparser@#1,#2\endargs@{% \expandafter\def\expandafter\@tempa\expandafter{% \expandafter\def\csname macarg.#1\endcsname{}}% \push@\@tempa\macargdeflist@ \def\paramlist{#2}% } % #1 is the element target macro % #2 is the list macro % #3,#4\endargs@ is the list value \def\pop@#1#2#3,#4\endargs@{% \def#1{#3}% \def#2{#4}% } \long\def\longpop@#1#2#3,#4\endargs@{% \long\def#1{#3}% \long\def#2{#4}% } %%%%%%%%%%%%%% End of code for > 10 arguments %%%%%%%%%%%%%%%%%% % This defines a Texinfo @macro or @rmacro, called by \parsemacbody. % \macrobody has the body of the macro in it, with placeholders for % its parameters, looking like "\xeatspaces{\hash 1}". % \paramno is the number of parameters % \paramlist is a TeX parameter text, e.g. "#1,#2,#3," % There are four cases: macros of zero, one, up to nine, and many arguments. % \xdef is used so that macro definitions will survive the file % they're defined in: @include reads the file inside a group. % \def\defmacro{% \let\hash=##% convert placeholders to macro parameter chars \ifnum\paramno=1 \def\xeatspaces##1{##1}% % This removes the pair of braces around the argument. We don't % use \eatspaces, because this can cause ends of lines to be lost % when the argument to \eatspaces is read, leading to line-based % commands like "@itemize" not being read correctly. \else \let\xeatspaces\relax % suppress expansion \fi \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup \noexpand\spaceisspace \noexpand\endlineisspace \noexpand\expandafter % skip any whitespace after the macro name. \expandafter\noexpand\csname\the\macname @@@\endcsname}% \expandafter\xdef\csname\the\macname @@@\endcsname{% \egroup \noexpand\scanmacro{\macrobody}}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup \noexpand\braceorline \expandafter\noexpand\csname\the\macname @@@\endcsname}% \expandafter\xdef\csname\the\macname @@@\endcsname##1{% \egroup \noexpand\scanmacro{\macrobody}% }% \else % at most 9 \ifnum\paramno<10\relax % @MACNAME sets the context for reading the macro argument % @MACNAME@@ gets the argument, processes backslashes and appends a % comma. % @MACNAME@@@ removes braces surrounding the argument list. % @MACNAME@@@@ scans the macro body with arguments substituted. \expandafter\xdef\csname\the\macname\endcsname{% \bgroup \noexpand\expandafter % This \expandafter skip any spaces after the \noexpand\macroargctxt % macro before we change the catcode of space. \noexpand\expandafter \expandafter\noexpand\csname\the\macname @@\endcsname}% \expandafter\xdef\csname\the\macname @@\endcsname##1{% \noexpand\passargtomacro \expandafter\noexpand\csname\the\macname @@@\endcsname{##1,}}% \expandafter\xdef\csname\the\macname @@@\endcsname##1{% \expandafter\noexpand\csname\the\macname @@@@\endcsname ##1}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname @@@@\endcsname\paramlist{% \egroup\noexpand\scanmacro{\macrobody}}% \else % 10 or more: \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\getargvals@{\the\macname}{\argl}% }% \global\expandafter\let\csname mac.\the\macname .body\endcsname\macrobody \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble \fi \fi} \catcode `\@\texiatcatcode\relax % end private-to-Texinfo catcodes \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % {\catcode`\@=0 \catcode`\\=13 % We need to manipulate \ so use @ as escape @catcode`@_=11 % private names @catcode`@!=11 % used as argument separator % \passargtomacro#1#2 - % Call #1 with a list of tokens #2, with any doubled backslashes in #2 % compressed to one. % % This implementation works by expansion, and not execution (so we cannot use % \def or similar). This reduces the risk of this failing in contexts where % complete expansion is done with no execution (for example, in writing out to % an auxiliary file for an index entry). % % State is kept in the input stream: the argument passed to % @look_ahead, @gobble_and_check_finish and @add_segment is % % THE_MACRO ARG_RESULT ! {PENDING_BS} NEXT_TOKEN (... rest of input) % % where: % THE_MACRO - name of the macro we want to call % ARG_RESULT - argument list we build to pass to that macro % PENDING_BS - either a backslash or nothing % NEXT_TOKEN - used to look ahead in the input stream to see what's coming next @gdef@passargtomacro#1#2{% @add_segment #1!{}@relax#2\@_finish\% } @gdef@_finish{@_finishx} @global@let@_finishx@relax % #1 - THE_MACRO ARG_RESULT % #2 - PENDING_BS % #3 - NEXT_TOKEN % #4 used to look ahead % % If the next token is not a backslash, process the rest of the argument; % otherwise, remove the next token. @gdef@look_ahead#1!#2#3#4{% @ifx#4\% @expandafter@gobble_and_check_finish @else @expandafter@add_segment @fi#1!{#2}#4#4% } % #1 - THE_MACRO ARG_RESULT % #2 - PENDING_BS % #3 - NEXT_TOKEN % #4 should be a backslash, which is gobbled. % #5 looks ahead % % Double backslash found. Add a single backslash, and look ahead. @gdef@gobble_and_check_finish#1!#2#3#4#5{% @add_segment#1\!{}#5#5% } @gdef@is_fi{@fi} % #1 - THE_MACRO ARG_RESULT % #2 - PENDING_BS % #3 - NEXT_TOKEN % #4 is input stream until next backslash % % Input stream is either at the start of the argument, or just after a % backslash sequence, either a lone backslash, or a doubled backslash. % NEXT_TOKEN contains the first token in the input stream: if it is \finish, % finish; otherwise, append to ARG_RESULT the segment of the argument up until % the next backslash. PENDING_BACKSLASH contains a backslash to represent % a backslash just before the start of the input stream that has not been % added to ARG_RESULT. @gdef@add_segment#1!#2#3#4\{% @ifx#3@_finish @call_the_macro#1!% @else % append the pending backslash to the result, followed by the next segment @expandafter@is_fi@look_ahead#1#2#4!{\}@fi % this @fi is discarded by @look_ahead. % we can't get rid of it with \expandafter because we don't know how % long #4 is. } % #1 - THE_MACRO % #2 - ARG_RESULT % #3 discards the res of the conditional in @add_segment, and @is_fi ends the % conditional. @gdef@call_the_macro#1#2!#3@fi{@is_fi #1{#2}} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \braceorline MAC is used for a one-argument macro MAC. It checks % whether the next non-whitespace character is a {. It sets the context % for reading the argument (slightly different in the two cases). Then, % to read the argument, in the whole-line case, it then calls the regular % \parsearg MAC; in the lbrace case, it calls \passargtomacro MAC. % \def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} \def\braceorlinexxx{% \ifx\nchar\bgroup \macroargctxt \expandafter\passargtomacro \else \macrolineargctxt\expandafter\parsearg \fi \macnamexxx} % @alias. % We need some trickery to remove the optional spaces around the equal % sign. Make them active and then expand them all to nothing. % \def\alias{\parseargusing\obeyspaces\aliasxxx} \def\aliasxxx #1{\aliasyyy#1\relax} \def\aliasyyy #1=#2\relax{% {% \expandafter\let\obeyedspace=\empty \addtomacrolist{#1}% \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}% }% \next } \message{cross references,} \newwrite\auxfile \newif\ifhavexrefs % True if xref values are known. \newif\ifwarnedxrefs % True if we warned once that they aren't known. % @inforef is relatively simple. \def\inforef #1{\inforefzzz #1,,,,**} \def\inforefzzz #1,#2,#3,#4**{% \putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, node \samp{\ignorespaces#1{}}} % @node's only job in TeX is to define \lastnode, which is used in % cross-references. The @node line might or might not have commas, and % might or might not have spaces before the first comma, like: % @node foo , bar , ... % We don't want such trailing spaces in the node name. % \parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse} % % also remove a trailing comma, in case of something like this: % @node Help-Cross, , , Cross-refs \def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse} \def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}\omittopnode} % Used so that the @top node doesn't have to be wrapped in an @ifnottex % conditional. % \doignore goes to more effort to skip nested conditionals but we don't need % that here. \def\omittopnode{% \ifx\lastnode\wordTop \expandafter\ignorenode\fi } \def\wordTop{Top} % Until the next @node or @bye command, divert output to a box that is not % output. \def\ignorenode{\setbox\dummybox\vbox\bgroup\def\node{\egroup\node}% \ignorenodebye } {\let\bye\relax \gdef\ignorenodebye{\let\bye\ignorenodebyedef} \gdef\ignorenodebyedef{\egroup(`Top' node ignored)\bye}} % The redefinition of \bye here is because it is declared \outer \let\lastnode=\empty % Write a cross-reference definition for the current node. #1 is the % type (Ynumbered, Yappendix, Ynothing). % \def\donoderef#1{% \ifx\lastnode\empty\else \setref{\lastnode}{#1}% \global\let\lastnode=\empty \fi } % @anchor{NAME} -- define xref target at arbitrary point. % \newcount\savesfregister % \def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} \def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} \def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} % \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an % anchor), which consists of three parts: % 1) NAME-title - the current sectioning name taken from \currentsection, % or the anchor name. % 2) NAME-snt - section number and type, passed as the SNT arg, or % empty for anchors. % 3) NAME-pg - the page number. % % This is called from \donoderef, \anchor, and \dofloat. In the case of % floats, there is an additional part, which is not written here: % 4) NAME-lof - the text as it should appear in a @listoffloats. % \def\setref#1#2{% \pdfmkdest{#1}% \iflinks {% \requireauxfile \atdummies % preserve commands, but don't expand them % match definition in \xrdef, \refx, \xrefX. \def\value##1{##1}% \edef\writexrdef##1##2{% \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef ##1}{##2}}% these are parameters of \writexrdef }% \toks0 = \expandafter{\currentsection}% \immediate \writexrdef{title}{\the\toks0 }% \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout }% \fi } % @xrefautosectiontitle on|off says whether @section(ing) names are used % automatically in xrefs, if the third arg is not explicitly specified. % This was provided as a "secret" @set xref-automatic-section-title % variable, now it's official. % \parseargdef\xrefautomaticsectiontitle{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETxref-automatic-section-title\endcsname = \empty \else\ifx\temp\offword \expandafter\let\csname SETxref-automatic-section-title\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @xrefautomaticsectiontitle value `\temp', must be on|off}% \fi\fi } % % @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is % the node name, #2 the name of the Info cross-reference, #3 the printed % node name, #4 the name of the Info file, #5 the name of the printed % manual. All but the node name can be omitted. % \def\pxref{\putwordsee{} \xrefXX} \def\xref{\putwordSee{} \xrefXX} \def\ref{\xrefXX} \def\xrefXX#1{\def\xrefXXarg{#1}\futurelet\tokenafterxref\xrefXXX} \def\xrefXXX{\expandafter\xrefX\expandafter[\xrefXXarg,,,,,,,]} % \newbox\toprefbox \newbox\printedrefnamebox \newbox\infofilenamebox \newbox\printedmanualbox % \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup \unsepspaces % % Get args without leading/trailing spaces. \def\printedrefname{\ignorespaces #3}% \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}% % \def\infofilename{\ignorespaces #4}% \setbox\infofilenamebox = \hbox{\infofilename\unskip}% % \def\printedmanual{\ignorespaces #5}% \setbox\printedmanualbox = \hbox{\printedmanual\unskip}% % % If the printed reference name (arg #3) was not explicitly given in % the @xref, figure out what we want to use. \ifdim \wd\printedrefnamebox = 0pt % No printed node name was explicitly given. \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax % Not auto section-title: use node name inside the square brackets. \def\printedrefname{\ignorespaces #1}% \else % Auto section-title: use chapter/section title inside % the square brackets if we have it. \ifdim \wd\printedmanualbox > 0pt % It is in another manual, so we don't have it; use node name. \def\printedrefname{\ignorespaces #1}% \else \ifhavexrefs % We (should) know the real title if we have the xref values. \def\printedrefname{\refx{#1-title}{}}% \else % Otherwise just copy the Info node name. \def\printedrefname{\ignorespaces #1}% \fi% \fi \fi \fi % % Make link in pdf output. \ifpdf % For pdfTeX and LuaTeX {\indexnofonts \makevalueexpandable \turnoffactive % This expands tokens, so do it after making catcode changes, so _ % etc. don't get their TeX definitions. This ignores all spaces in % #4, including (wrongly) those in the middle of the filename. \getfilename{#4}% % % This (wrongly) does not take account of leading or trailing % spaces in #1, which should be ignored. \setpdfdestname{#1}% % \ifx\pdfdestname\empty \def\pdfdestname{Top}% no empty targets \fi % \leavevmode \startlink attr{/Border [0 0 0]}% \ifnum\filenamelength>0 goto file{\the\filename.pdf} name{\pdfdestname}% \else goto name{\pdfmkpgn{\pdfdestname}}% \fi }% \setcolor{\linkcolor}% \else \ifx\XeTeXrevision\thisisundefined \else % For XeTeX {\indexnofonts \makevalueexpandable \turnoffactive % This expands tokens, so do it after making catcode changes, so _ % etc. don't get their TeX definitions. This ignores all spaces in % #4, including (wrongly) those in the middle of the filename. \getfilename{#4}% % % This (wrongly) does not take account of leading or trailing % spaces in #1, which should be ignored. \setpdfdestname{#1}% % \ifx\pdfdestname\empty \def\pdfdestname{Top}% no empty targets \fi % \leavevmode \ifnum\filenamelength>0 % With default settings, % XeTeX (xdvipdfmx) replaces link destination names with integers. % In this case, the replaced destination names of % remote PDFs are no longer known. In order to avoid a replacement, % you can use xdvipdfmx's command line option `-C 0x0010'. % If you use XeTeX 0.99996+ (TeX Live 2016+), % this command line option is no longer necessary % because we can use the `dvipdfmx:config' special. \special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A << /S /GoToR /F (\the\filename.pdf) /D (\pdfdestname) >> >>}% \else \special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A << /S /GoTo /D (\pdfdestname) >> >>}% \fi }% \setcolor{\linkcolor}% \fi \fi {% % Have to otherify everything special to allow the \csname to % include an _ in the xref name, etc. \indexnofonts \turnoffactive \def\value##1{##1}% \expandafter\global\expandafter\let\expandafter\Xthisreftitle \csname XR#1-title\endcsname }% % % Float references are printed completely differently: "Figure 1.2" % instead of "[somenode], p.3". \iffloat distinguishes them by % \Xthisreftitle being set to a magic string. \iffloat\Xthisreftitle % If the user specified the print name (third arg) to the ref, % print it instead of our usual "Figure 1.2". \ifdim\wd\printedrefnamebox = 0pt \refx{#1-snt}{}% \else \printedrefname \fi % % If the user also gave the printed manual name (fifth arg), append % "in MANUALNAME". \ifdim \wd\printedmanualbox > 0pt \space \putwordin{} \cite{\printedmanual}% \fi \else % node/anchor (non-float) references. % % If we use \unhbox to print the node names, TeX does not insert % empty discretionaries after hyphens, which means that it will not % find a line break at a hyphen in a node names. Since some manuals % are best written with fairly long node names, containing hyphens, % this is a loss. Therefore, we give the text of the node name % again, so it is as if TeX is seeing it for the first time. % \ifdim \wd\printedmanualbox > 0pt % Cross-manual reference with a printed manual name. % \crossmanualxref{\cite{\printedmanual\unskip}}% % \else\ifdim \wd\infofilenamebox > 0pt % Cross-manual reference with only an info filename (arg 4), no % printed manual name (arg 5). This is essentially the same as % the case above; we output the filename, since we have nothing else. % \crossmanualxref{\code{\infofilename\unskip}}% % \else % Reference within this manual. % % Only output a following space if the -snt ref is nonempty; for % @unnumbered and @anchor, it won't be. \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi % % output the `[mynode]' via the macro below so it can be overridden. \xrefprintnodename\printedrefname % % But we always want a comma and a space: ,\space % % output the `page 3'. \turnoffactive \putwordpage\tie\refx{#1-pg}{}% % Add a , if xref followed by a space \if\space\noexpand\tokenafterxref ,% \else\ifx\ \tokenafterxref ,% @TAB \else\ifx\*\tokenafterxref ,% @* \else\ifx\ \tokenafterxref ,% @SPACE \else\ifx\ \tokenafterxref ,% @NL \else\ifx\tie\tokenafterxref ,% @tie \fi\fi\fi\fi\fi\fi \fi\fi \fi \endlink \endgroup} % Output a cross-manual xref to #1. Used just above (twice). % % Only include the text "Section ``foo'' in" if the foo is neither % missing or Top. Thus, @xref{,,,foo,The Foo Manual} outputs simply % "see The Foo Manual", the idea being to refer to the whole manual. % % But, this being TeX, we can't easily compare our node name against the % string "Top" while ignoring the possible spaces before and after in % the input. By adding the arbitrary 7sp below, we make it much less % likely that a real node name would have the same width as "Top" (e.g., % in a monospaced font). Hopefully it will never happen in practice. % % For the same basic reason, we retypeset the "Top" at every % reference, since the current font is indeterminate. % \def\crossmanualxref#1{% \setbox\toprefbox = \hbox{Top\kern7sp}% \setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}% \ifdim \wd2 > 7sp % nonempty? \ifdim \wd2 = \wd\toprefbox \else % same as Top? \putwordSection{} ``\printedrefname'' \putwordin{}\space \fi \fi #1% } % This macro is called from \xrefX for the `[nodename]' part of xref % output. It's a separate macro only so it can be changed more easily, % since square brackets don't work well in some documents. Particularly % one that Bob is working on :). % \def\xrefprintnodename#1{[#1]} % Things referred to by \setref. % \def\Ynothing{} \def\Yomitfromtoc{} \def\Ynumbered{% \ifnum\secno=0 \putwordChapter@tie \the\chapno \else \ifnum\subsecno=0 \putwordSection@tie \the\chapno.\the\secno \else \ifnum\subsubsecno=0 \putwordSection@tie \the\chapno.\the\secno.\the\subsecno \else \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno \fi\fi\fi } \def\Yappendix{% \ifnum\secno=0 \putwordAppendix@tie @char\the\appendixno{}% \else \ifnum\subsecno=0 \putwordSection@tie @char\the\appendixno.\the\secno \else \ifnum\subsubsecno=0 \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno \else \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno \fi\fi\fi } % \refx{NAME}{SUFFIX} - reference a cross-reference string named NAME. SUFFIX % is output afterwards if non-empty. \def\refx#1#2{% \requireauxfile {% \indexnofonts \turnoffactive \def\value##1{##1}% \expandafter\global\expandafter\let\expandafter\thisrefX \csname XR#1\endcsname }% \ifx\thisrefX\relax % If not defined, say something at least. \angleleft un\-de\-fined\angleright \iflinks \ifhavexrefs {\toks0 = {#1}% avoid expansion of possibly-complex value \message{\linenumber Undefined cross reference `\the\toks0'.}}% \else \ifwarnedxrefs\else \global\warnedxrefstrue \message{Cross reference values unknown; you must run TeX again.}% \fi \fi \fi \else % It's defined, so just use it. \thisrefX \fi #2% Output the suffix in any case. } % This is the macro invoked by entries in the aux file. Define a control % sequence for a cross-reference target (we prepend XR to the control sequence % name to avoid collisions). The value is the page number. If this is a float % type, we have more work to do. % \def\xrdef#1#2{% {% Expand the node or anchor name to remove control sequences. % \turnoffactive stops 8-bit characters being changed to commands % like @'e. \refx does the same to retrieve the value in the definition. \indexnofonts \turnoffactive \def\value##1{##1}% \xdef\safexrefname{#1}% }% % \bgroup \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% \egroup % We put the \gdef inside a group to avoid the definitions building up on % TeX's save stack, which can cause it to run out of space for aux files with % thousands of lines. \gdef doesn't use the save stack, but \csname does % when it defines an unknown control sequence as \relax. % % Was that xref control sequence that we just defined for a float? \expandafter\iffloat\csname XR\safexrefname\endcsname % it was a float, and we have the (safe) float type in \iffloattype. \expandafter\let\expandafter\floatlist \csname floatlist\iffloattype\endcsname % % Is this the first time we've seen this float type? \expandafter\ifx\floatlist\relax \toks0 = {\do}% yes, so just \do \else % had it before, so preserve previous elements in list. \toks0 = \expandafter{\floatlist\do}% \fi % % Remember this xref in the control sequence \floatlistFLOATTYPE, % for later use in \listoffloats. \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0 {\safexrefname}}% \fi } % If working on a large document in chapters, it is convenient to % be able to disable indexing, cross-referencing, and contents, for test runs. % This is done with @novalidate at the beginning of the file. % \newif\iflinks \linkstrue % by default we want the aux files. \let\novalidate = \linksfalse % Used when writing to the aux file, or when using data from it. \def\requireauxfile{% \iflinks \tryauxfile % Open the new aux file. TeX will close it automatically at exit. \immediate\openout\auxfile=\jobname.aux \fi \global\let\requireauxfile=\relax % Only do this once. } % Read the last existing aux file, if any. No error if none exists. % \def\tryauxfile{% \openin 1 \jobname.aux \ifeof 1 \else \readdatafile{aux}% \global\havexrefstrue \fi \closein 1 } \def\setupdatafile{% \catcode`\^^@=\other \catcode`\^^A=\other \catcode`\^^B=\other \catcode`\^^C=\other \catcode`\^^D=\other \catcode`\^^E=\other \catcode`\^^F=\other \catcode`\^^G=\other \catcode`\^^H=\other \catcode`\^^K=\other \catcode`\^^L=\other \catcode`\^^N=\other \catcode`\^^P=\other \catcode`\^^Q=\other \catcode`\^^R=\other \catcode`\^^S=\other \catcode`\^^T=\other \catcode`\^^U=\other \catcode`\^^V=\other \catcode`\^^W=\other \catcode`\^^X=\other \catcode`\^^Z=\other \catcode`\^^[=\other \catcode`\^^\=\other \catcode`\^^]=\other \catcode`\^^^=\other \catcode`\^^_=\other \catcode`\^=\other % % Special characters. Should be turned off anyway, but... \catcode`\~=\other \catcode`\[=\other \catcode`\]=\other \catcode`\"=\other \catcode`\_=\other \catcode`\|=\other \catcode`\<=\other \catcode`\>=\other \catcode`\$=\other \catcode`\#=\other \catcode`\&=\other \catcode`\%=\other \catcode`+=\other % avoid \+ for paranoia even though we've turned it off % \catcode`\\=\active % % @ is our escape character in .aux files, and we need braces. \catcode`\{=1 \catcode`\}=2 \catcode`\@=0 } \def\readdatafile#1{% \begingroup \setupdatafile \input\jobname.#1 \endgroup} \message{insertions,} % including footnotes. \newcount \footnoteno % The trailing space in the following definition for supereject is % vital for proper filling; pages come out unaligned when you do a % pagealignmacro call if that space before the closing brace is % removed. (Generally, numeric constants should always be followed by a % space to prevent strange expansion errors.) \def\supereject{\par\penalty -20000\footnoteno =0 } % @footnotestyle is meaningful for Info output only. \let\footnotestyle=\comment {\catcode `\@=11 % % Auto-number footnotes. Otherwise like plain. \gdef\footnote{% \global\advance\footnoteno by \@ne \edef\thisfootno{$^{\the\footnoteno}$}% % % In case the footnote comes at the end of a sentence, preserve the % extra spacing after we do the footnote number. \let\@sf\empty \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi % % Remove inadvertent blank space before typesetting the footnote number. \unskip \thisfootno\@sf \dofootnote }% % Don't bother with the trickery in plain.tex to not require the % footnote text as a parameter. Our footnotes don't need to be so general. % % Oh yes, they do; otherwise, @ifset (and anything else that uses % \parseargline) fails inside footnotes because the tokens are fixed when % the footnote is read. --karl, 16nov96. % \gdef\dofootnote{% \insert\footins\bgroup % % Nested footnotes are not supported in TeX, that would take a lot % more work. (\startsavinginserts does not suffice.) \let\footnote=\errfootnotenest % % We want to typeset this text as a normal paragraph, even if the % footnote reference occurs in (for example) a display environment. % So reset some parameters. \hsize=\txipagewidth \interlinepenalty\interfootnotelinepenalty \splittopskip\ht\strutbox % top baseline for broken footnotes \splitmaxdepth\dp\strutbox \floatingpenalty\@MM \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip \parindent\defaultparindent % \smallfonts \rm % % Because we use hanging indentation in footnotes, a @noindent appears % to exdent this text, so make it be a no-op. makeinfo does not use % hanging indentation so @noindent can still be needed within footnote % text after an @example or the like (not that this is good style). \let\noindent = \relax % % Hang the footnote text off the number. Use \everypar in case the % footnote extends for more than one paragraph. \everypar = {\hang}% \textindent{\thisfootno}% % % Don't crash into the line above the footnote text. Since this % expands into a box, it must come within the paragraph, lest it % provide a place where TeX can split the footnote. \footstrut % % Invoke rest of plain TeX footnote routine. \futurelet\next\fo@t } }%end \catcode `\@=11 \def\errfootnotenest{% \errhelp=\EMsimple \errmessage{Nested footnotes not supported in texinfo.tex, even though they work in makeinfo; sorry} } \def\errfootnoteheading{% \errhelp=\EMsimple \errmessage{Footnotes in chapters, sections, etc., are not supported} } % In case a @footnote appears in a vbox, save the footnote text and create % the real \insert just after the vbox finished. Otherwise, the insertion % would be lost. % Similarly, if a @footnote appears inside an alignment, save the footnote % text to a box and make the \insert when a row of the table is finished. % And the same can be done for other insert classes. --kasal, 16nov03. % % Replace the \insert primitive by a cheating macro. % Deeper inside, just make sure that the saved insertions are not spilled % out prematurely. % \def\startsavinginserts{% \ifx \insert\ptexinsert \let\insert\saveinsert \else \let\checkinserts\relax \fi } % This \insert replacement works for both \insert\footins{foo} and % \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}. % \def\saveinsert#1{% \edef\next{\noexpand\savetobox \makeSAVEname#1}% \afterassignment\next % swallow the left brace \let\temp = } \def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}} \def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1} \def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi} \def\placesaveins#1{% \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname {\box#1}% } % eat @SAVE -- beware, all of them have catcode \other: { \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-) \gdef\gobblesave @SAVE{} } % initialization: \def\newsaveins #1{% \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}% \next } \def\newsaveinsX #1{% \csname newbox\endcsname #1% \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts \checksaveins #1}% } % initialize: \let\checkinserts\empty \newsaveins\footins \newsaveins\margin % @image. We use the macros from epsf.tex to support this. % If epsf.tex is not installed and @image is used, we complain. % % Check for and read epsf.tex up front. If we read it only at @image % time, we might be inside a group, and then its definitions would get % undone and the next image would fail. \openin 1 = epsf.tex \ifeof 1 \else % Do not bother showing banner with epsf.tex v2.7k (available in % doc/epsf.tex and on ctan). \def\epsfannounce{\toks0 = }% \input epsf.tex \fi \closein 1 % % We will only complain once about lack of epsf.tex. \newif\ifwarnednoepsf \newhelp\noepsfhelp{epsf.tex must be installed for images to work. It is also included in the Texinfo distribution, or you can get it from https://ctan.org/texarchive/macros/texinfo/texinfo/doc/epsf.tex.} % \def\image#1{% \ifx\epsfbox\thisisundefined \ifwarnednoepsf \else \errhelp = \noepsfhelp \errmessage{epsf.tex not found, images will be ignored}% \global\warnednoepsftrue \fi \else \imagexxx #1,,,,,\finish \fi } % % Arguments to @image: % #1 is (mandatory) image filename; we tack on .eps extension. % #2 is (optional) width, #3 is (optional) height. % #4 is (ignored optional) html alt text. % #5 is (ignored optional) extension. % #6 is just the usual extra ignored arg for parsing stuff. \newif\ifimagevmode \def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup \catcode`\^^M = 5 % in case we're inside an example \normalturnoffactive % allow _ et al. in names \def\xprocessmacroarg{\eatspaces}% in case we are being used via a macro % If the image is by itself, center it. \ifvmode \imagevmodetrue \else \ifx\centersub\centerV % for @center @image, we need a vbox so we can have our vertical space \imagevmodetrue \vbox\bgroup % vbox has better behavior than vtop herev \fi\fi % \ifimagevmode \nobreak\medskip % Usually we'll have text after the image which will insert % \parskip glue, so insert it here too to equalize the space % above and below. \nobreak\vskip\parskip \nobreak \fi % % Leave vertical mode so that indentation from an enclosing % environment such as @quotation is respected. % However, if we're at the top level, we don't want the % normal paragraph indentation. % On the other hand, if we are in the case of @center @image, we don't % want to start a paragraph, which will create a hsize-width box and % eradicate the centering. \ifx\centersub\centerV\else \noindent \fi % % Output the image. \ifpdf % For pdfTeX and LuaTeX <= 0.80 \dopdfimage{#1}{#2}{#3}% \else \ifx\XeTeXrevision\thisisundefined % For epsf.tex % \epsfbox itself resets \epsf?size at each figure. \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi \setbox0 = \hbox{\ignorespaces #3}% \ifdim\wd0 > 0pt \epsfysize=#3\relax \fi \epsfbox{#1.eps}% \else % For XeTeX \doxeteximage{#1}{#2}{#3}% \fi \fi % \ifimagevmode \medskip % space after a standalone image \fi \ifx\centersub\centerV \egroup \fi \endgroup} % @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables, % etc. We don't actually implement floating yet, we always include the % float "here". But it seemed the best name for the future. % \envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish} % There may be a space before second and/or third parameter; delete it. \def\eatcommaspace#1, {#1,} % #1 is the optional FLOATTYPE, the text label for this float, typically % "Figure", "Table", "Example", etc. Can't contain commas. If omitted, % this float will not be numbered and cannot be referred to. % % #2 is the optional xref label. Also must be present for the float to % be referable. % % #3 is the optional positioning argument; for now, it is ignored. It % will somehow specify the positions allowed to float to (here, top, bottom). % % We keep a separate counter for each FLOATTYPE, which we reset at each % chapter-level command. \let\resetallfloatnos=\empty % \def\dofloat#1,#2,#3,#4\finish{% \let\thiscaption=\empty \let\thisshortcaption=\empty % % don't lose footnotes inside @float. % % BEWARE: when the floats start float, we have to issue warning whenever an % insert appears inside a float which could possibly float. --kasal, 26may04 % \startsavinginserts % % We can't be used inside a paragraph. \par % \vtop\bgroup \def\floattype{#1}% \def\floatlabel{#2}% \def\floatloc{#3}% we do nothing with this yet. % \ifx\floattype\empty \let\safefloattype=\empty \else {% % the floattype might have accents or other special characters, % but we need to use it in a control sequence name. \indexnofonts \turnoffactive \xdef\safefloattype{\floattype}% }% \fi % % If label is given but no type, we handle that as the empty type. \ifx\floatlabel\empty \else % We want each FLOATTYPE to be numbered separately (Figure 1, % Table 1, Figure 2, ...). (And if no label, no number.) % \expandafter\getfloatno\csname\safefloattype floatno\endcsname \global\advance\floatno by 1 % {% % This magic value for \currentsection is output by \setref as the % XREFLABEL-title value. \xrefX uses it to distinguish float % labels (which have a completely different output format) from % node and anchor labels. And \xrdef uses it to construct the % lists of floats. % \edef\currentsection{\floatmagic=\safefloattype}% \setref{\floatlabel}{Yfloat}% }% \fi % % start with \parskip glue, I guess. \vskip\parskip % % Don't suppress indentation if a float happens to start a section. \restorefirstparagraphindent } % we have these possibilities: % @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap % @float Foo,lbl & no caption: Foo 1.1 % @float Foo & @caption{Cap}: Foo: Cap % @float Foo & no caption: Foo % @float ,lbl & Caption{Cap}: 1.1: Cap % @float ,lbl & no caption: 1.1 % @float & @caption{Cap}: Cap % @float & no caption: % \def\Efloat{% \let\floatident = \empty % % In all cases, if we have a float type, it comes first. \ifx\floattype\empty \else \def\floatident{\floattype}\fi % % If we have an xref label, the number comes next. \ifx\floatlabel\empty \else \ifx\floattype\empty \else % if also had float type, need tie first. \appendtomacro\floatident{\tie}% \fi % the number. \appendtomacro\floatident{\chaplevelprefix\the\floatno}% \fi % % Start the printed caption with what we've constructed in % \floatident, but keep it separate; we need \floatident again. \let\captionline = \floatident % \ifx\thiscaption\empty \else \ifx\floatident\empty \else \appendtomacro\captionline{: }% had ident, so need a colon between \fi % % caption text. \appendtomacro\captionline{\scanexp\thiscaption}% \fi % % If we have anything to print, print it, with space before. % Eventually this needs to become an \insert. \ifx\captionline\empty \else \vskip.5\parskip \captionline % % Space below caption. \vskip\parskip \fi % % If have an xref label, write the list of floats info. Do this % after the caption, to avoid chance of it being a breakpoint. \ifx\floatlabel\empty \else % Write the text that goes in the lof to the aux file as % \floatlabel-lof. Besides \floatident, we include the short % caption if specified, else the full caption if specified, else nothing. {% \requireauxfile \atdummies % \ifx\thisshortcaption\empty \def\gtemp{\thiscaption}% \else \def\gtemp{\thisshortcaption}% \fi \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident \ifx\gtemp\empty \else : \gtemp \fi}}% }% \fi \egroup % end of \vtop % \checkinserts } % Append the tokens #2 to the definition of macro #1, not expanding either. % \def\appendtomacro#1#2{% \expandafter\def\expandafter#1\expandafter{#1#2}% } % @caption, @shortcaption % \def\caption{\docaption\thiscaption} \def\shortcaption{\docaption\thisshortcaption} \def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption} \def\defcaption#1#2{\egroup \def#1{#2}} % The parameter is the control sequence identifying the counter we are % going to use. Create it if it doesn't exist and assign it to \floatno. \def\getfloatno#1{% \ifx#1\relax % Haven't seen this figure type before. \csname newcount\endcsname #1% % % Remember to reset this floatno at the next chap. \expandafter\gdef\expandafter\resetallfloatnos \expandafter{\resetallfloatnos #1=0 }% \fi \let\floatno#1% } % \setref calls this to get the XREFLABEL-snt value. We want an @xref % to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we % first read the @float command. % \def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}% % Magic string used for the XREFLABEL-title value, so \xrefX can % distinguish floats from other xref types. \def\floatmagic{!!float!!} % #1 is the control sequence we are passed; we expand into a conditional % which is true if #1 represents a float ref. That is, the magic % \currentsection value which we \setref above. % \def\iffloat#1{\expandafter\doiffloat#1==\finish} % % #1 is (maybe) the \floatmagic string. If so, #2 will be the % (safe) float type for this float. We set \iffloattype to #2. % \def\doiffloat#1=#2=#3\finish{% \def\temp{#1}% \def\iffloattype{#2}% \ifx\temp\floatmagic } % @listoffloats FLOATTYPE - print a list of floats like a table of contents. % \parseargdef\listoffloats{% \def\floattype{#1}% floattype {% % the floattype might have accents or other special characters, % but we need to use it in a control sequence name. \indexnofonts \turnoffactive \xdef\safefloattype{\floattype}% }% % % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE. \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax \ifhavexrefs % if the user said @listoffloats foo but never @float foo. \message{\linenumber No `\safefloattype' floats to list.}% \fi \else \begingroup \leftskip=\tocindent % indent these entries like a toc \let\do=\listoffloatsdo \csname floatlist\safefloattype\endcsname \endgroup \fi } % This is called on each entry in a list of floats. We're passed the % xref label, in the form LABEL-title, which is how we save it in the % aux file. We strip off the -title and look up \XRLABEL-lof, which % has the text we're supposed to typeset here. % % Figures without xref labels will not be included in the list (since % they won't appear in the aux file). % \def\listoffloatsdo#1{\listoffloatsdoentry#1\finish} \def\listoffloatsdoentry#1-title\finish{{% % Can't fully expand XR#1-lof because it can contain anything. Just % pass the control sequence. On the other hand, XR#1-pg is just the % page number, and we want to fully expand that so we can get a link % in pdf output. \toksA = \expandafter{\csname XR#1-lof\endcsname}% % % use the same \entry macro we use to generate the TOC and index. \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}% \writeentry }} \message{localization,} % For single-language documents, @documentlanguage is usually given very % early, just after @documentencoding. Single argument is the language % (de) or locale (de_DE) abbreviation. % { \catcode`\_ = \active \globaldefs=1 \parseargdef\documentlanguage{% \tex % read txi-??.tex file in plain TeX. % Read the file by the name they passed if it exists. \let_ = \normalunderscore % normal _ character for filename test \openin 1 txi-#1.tex \ifeof 1 \documentlanguagetrywithoutunderscore #1_\finish \else \globaldefs = 1 % everything in the txi-LL files needs to persist \input txi-#1.tex \fi \closein 1 \endgroup % end raw TeX } % % If they passed de_DE, and txi-de_DE.tex doesn't exist, % try txi-de.tex. % \gdef\documentlanguagetrywithoutunderscore#1_#2\finish{% \openin 1 txi-#1.tex \ifeof 1 \errhelp = \nolanghelp \errmessage{Cannot read language file txi-#1.tex}% \else \globaldefs = 1 % everything in the txi-LL files needs to persist \input txi-#1.tex \fi \closein 1 } }% end of special _ catcode % \newhelp\nolanghelp{The given language definition file cannot be found or is empty. Maybe you need to install it? Putting it in the current directory should work if nowhere else does.} % This macro is called from txi-??.tex files; the first argument is the % \language name to set (without the "\lang@" prefix), the second and % third args are \{left,right}hyphenmin. % % The language names to pass are determined when the format is built. % See the etex.log file created at that time, e.g., % /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log. % % With TeX Live 2008, etex now includes hyphenation patterns for all % available languages. This means we can support hyphenation in % Texinfo, at least to some extent. (This still doesn't solve the % accented characters problem.) % \catcode`@=11 \def\txisetlanguage#1#2#3{% % do not set the language if the name is undefined in the current TeX. \expandafter\ifx\csname lang@#1\endcsname \relax \message{no patterns for #1}% \else \global\language = \csname lang@#1\endcsname \fi % but there is no harm in adjusting the hyphenmin values regardless. \global\lefthyphenmin = #2\relax \global\righthyphenmin = #3\relax } % XeTeX and LuaTeX can handle Unicode natively. % Their default I/O uses UTF-8 sequences instead of a byte-wise operation. % Other TeX engines' I/O (pdfTeX, etc.) is byte-wise. % \newif\iftxinativeunicodecapable \newif\iftxiusebytewiseio \ifx\XeTeXrevision\thisisundefined \ifx\luatexversion\thisisundefined \txinativeunicodecapablefalse \txiusebytewiseiotrue \else \txinativeunicodecapabletrue \txiusebytewiseiofalse \fi \else \txinativeunicodecapabletrue \txiusebytewiseiofalse \fi % Set I/O by bytes instead of UTF-8 sequence for XeTeX and LuaTex % for non-UTF-8 (byte-wise) encodings. % \def\setbytewiseio{% \ifx\XeTeXrevision\thisisundefined \else \XeTeXdefaultencoding "bytes" % For subsequent files to be read \XeTeXinputencoding "bytes" % For document root file % Unfortunately, there seems to be no corresponding XeTeX command for % output encoding. This is a problem for auxiliary index and TOC files. % The only solution would be perhaps to write out @U{...} sequences in % place of non-ASCII characters. \fi \ifx\luatexversion\thisisundefined \else \directlua{ local utf8_char, byte, gsub = unicode.utf8.char, string.byte, string.gsub local function convert_char (char) return utf8_char(byte(char)) end local function convert_line (line) return gsub(line, ".", convert_char) end callback.register("process_input_buffer", convert_line) local function convert_line_out (line) local line_out = "" for c in string.utfvalues(line) do line_out = line_out .. string.char(c) end return line_out end callback.register("process_output_buffer", convert_line_out) } \fi \txiusebytewiseiotrue } % Helpers for encodings. % Set the catcode of characters 128 through 255 to the specified number. % \def\setnonasciicharscatcode#1{% \count255=128 \loop\ifnum\count255<256 \global\catcode\count255=#1\relax \advance\count255 by 1 \repeat } \def\setnonasciicharscatcodenonglobal#1{% \count255=128 \loop\ifnum\count255<256 \catcode\count255=#1\relax \advance\count255 by 1 \repeat } % @documentencoding sets the definition of non-ASCII characters % according to the specified encoding. % \def\documentencoding{\parseargusing\filenamecatcodes\documentencodingzzz} \def\documentencodingzzz#1{% % % Encoding being declared for the document. \def\declaredencoding{\csname #1.enc\endcsname}% % % Supported encodings: names converted to tokens in order to be able % to compare them with \ifx. \def\ascii{\csname US-ASCII.enc\endcsname}% \def\latnine{\csname ISO-8859-15.enc\endcsname}% \def\latone{\csname ISO-8859-1.enc\endcsname}% \def\lattwo{\csname ISO-8859-2.enc\endcsname}% \def\utfeight{\csname UTF-8.enc\endcsname}% % \ifx \declaredencoding \ascii \asciichardefs % \else \ifx \declaredencoding \lattwo \iftxinativeunicodecapable \setbytewiseio \fi \setnonasciicharscatcode\active \lattwochardefs % \else \ifx \declaredencoding \latone \iftxinativeunicodecapable \setbytewiseio \fi \setnonasciicharscatcode\active \latonechardefs % \else \ifx \declaredencoding \latnine \iftxinativeunicodecapable \setbytewiseio \fi \setnonasciicharscatcode\active \latninechardefs % \else \ifx \declaredencoding \utfeight \iftxinativeunicodecapable % For native Unicode handling (XeTeX and LuaTeX) \nativeunicodechardefs \else % For treating UTF-8 as byte sequences (TeX, eTeX and pdfTeX) \setnonasciicharscatcode\active % since we already invoked \utfeightchardefs at the top level % (below), do not re-invoke it, otherwise our check for duplicated % definitions gets triggered. Making non-ascii chars active is % sufficient. \fi % \else \message{Ignoring unknown document encoding: #1.}% % \fi % utfeight \fi % latnine \fi % latone \fi % lattwo \fi % ascii % \ifx\XeTeXrevision\thisisundefined \else \ifx \declaredencoding \utfeight \else \ifx \declaredencoding \ascii \else \message{Warning: XeTeX with non-UTF-8 encodings cannot handle % non-ASCII characters in auxiliary files.}% \fi \fi \fi } % emacs-page % A message to be logged when using a character that isn't available % the default font encoding (OT1). % \def\missingcharmsg#1{\message{Character missing, sorry: #1.}} % Take account of \c (plain) vs. \, (Texinfo) difference. \def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} % First, make active non-ASCII characters in order for them to be % correctly categorized when TeX reads the replacement text of % macros containing the character definitions. \setnonasciicharscatcode\active % \def\gdefchar#1#2{% \gdef#1{% \ifpassthroughchars \string#1% \else #2% \fi }} % Latin1 (ISO-8859-1) character definitions. \def\latonechardefs{% \gdefchar^^a0{\tie} \gdefchar^^a1{\exclamdown} \gdefchar^^a2{{\tcfont \char162}} % cent \gdefchar^^a3{\pounds{}} \gdefchar^^a4{{\tcfont \char164}} % currency \gdefchar^^a5{{\tcfont \char165}} % yen \gdefchar^^a6{{\tcfont \char166}} % broken bar \gdefchar^^a7{\S} \gdefchar^^a8{\"{}} \gdefchar^^a9{\copyright{}} \gdefchar^^aa{\ordf} \gdefchar^^ab{\guillemetleft{}} \gdefchar^^ac{\ensuremath\lnot} \gdefchar^^ad{\-} \gdefchar^^ae{\registeredsymbol{}} \gdefchar^^af{\={}} % \gdefchar^^b0{\textdegree} \gdefchar^^b1{$\pm$} \gdefchar^^b2{$^2$} \gdefchar^^b3{$^3$} \gdefchar^^b4{\'{}} \gdefchar^^b5{$\mu$} \gdefchar^^b6{\P} \gdefchar^^b7{\ensuremath\cdot} \gdefchar^^b8{\cedilla\ } \gdefchar^^b9{$^1$} \gdefchar^^ba{\ordm} \gdefchar^^bb{\guillemetright{}} \gdefchar^^bc{$1\over4$} \gdefchar^^bd{$1\over2$} \gdefchar^^be{$3\over4$} \gdefchar^^bf{\questiondown} % \gdefchar^^c0{\`A} \gdefchar^^c1{\'A} \gdefchar^^c2{\^A} \gdefchar^^c3{\~A} \gdefchar^^c4{\"A} \gdefchar^^c5{\ringaccent A} \gdefchar^^c6{\AE} \gdefchar^^c7{\cedilla C} \gdefchar^^c8{\`E} \gdefchar^^c9{\'E} \gdefchar^^ca{\^E} \gdefchar^^cb{\"E} \gdefchar^^cc{\`I} \gdefchar^^cd{\'I} \gdefchar^^ce{\^I} \gdefchar^^cf{\"I} % \gdefchar^^d0{\DH} \gdefchar^^d1{\~N} \gdefchar^^d2{\`O} \gdefchar^^d3{\'O} \gdefchar^^d4{\^O} \gdefchar^^d5{\~O} \gdefchar^^d6{\"O} \gdefchar^^d7{$\times$} \gdefchar^^d8{\O} \gdefchar^^d9{\`U} \gdefchar^^da{\'U} \gdefchar^^db{\^U} \gdefchar^^dc{\"U} \gdefchar^^dd{\'Y} \gdefchar^^de{\TH} \gdefchar^^df{\ss} % \gdefchar^^e0{\`a} \gdefchar^^e1{\'a} \gdefchar^^e2{\^a} \gdefchar^^e3{\~a} \gdefchar^^e4{\"a} \gdefchar^^e5{\ringaccent a} \gdefchar^^e6{\ae} \gdefchar^^e7{\cedilla c} \gdefchar^^e8{\`e} \gdefchar^^e9{\'e} \gdefchar^^ea{\^e} \gdefchar^^eb{\"e} \gdefchar^^ec{\`{\dotless i}} \gdefchar^^ed{\'{\dotless i}} \gdefchar^^ee{\^{\dotless i}} \gdefchar^^ef{\"{\dotless i}} % \gdefchar^^f0{\dh} \gdefchar^^f1{\~n} \gdefchar^^f2{\`o} \gdefchar^^f3{\'o} \gdefchar^^f4{\^o} \gdefchar^^f5{\~o} \gdefchar^^f6{\"o} \gdefchar^^f7{$\div$} \gdefchar^^f8{\o} \gdefchar^^f9{\`u} \gdefchar^^fa{\'u} \gdefchar^^fb{\^u} \gdefchar^^fc{\"u} \gdefchar^^fd{\'y} \gdefchar^^fe{\th} \gdefchar^^ff{\"y} } % Latin9 (ISO-8859-15) encoding character definitions. \def\latninechardefs{% % Encoding is almost identical to Latin1. \latonechardefs % \gdefchar^^a4{\euro{}} \gdefchar^^a6{\v S} \gdefchar^^a8{\v s} \gdefchar^^b4{\v Z} \gdefchar^^b8{\v z} \gdefchar^^bc{\OE} \gdefchar^^bd{\oe} \gdefchar^^be{\"Y} } % Latin2 (ISO-8859-2) character definitions. \def\lattwochardefs{% \gdefchar^^a0{\tie} \gdefchar^^a1{\ogonek{A}} \gdefchar^^a2{\u{}} \gdefchar^^a3{\L} \gdefchar^^a4{\missingcharmsg{CURRENCY SIGN}} \gdefchar^^a5{\v L} \gdefchar^^a6{\'S} \gdefchar^^a7{\S} \gdefchar^^a8{\"{}} \gdefchar^^a9{\v S} \gdefchar^^aa{\cedilla S} \gdefchar^^ab{\v T} \gdefchar^^ac{\'Z} \gdefchar^^ad{\-} \gdefchar^^ae{\v Z} \gdefchar^^af{\dotaccent Z} % \gdefchar^^b0{\textdegree{}} \gdefchar^^b1{\ogonek{a}} \gdefchar^^b2{\ogonek{ }} \gdefchar^^b3{\l} \gdefchar^^b4{\'{}} \gdefchar^^b5{\v l} \gdefchar^^b6{\'s} \gdefchar^^b7{\v{}} \gdefchar^^b8{\cedilla\ } \gdefchar^^b9{\v s} \gdefchar^^ba{\cedilla s} \gdefchar^^bb{\v t} \gdefchar^^bc{\'z} \gdefchar^^bd{\H{}} \gdefchar^^be{\v z} \gdefchar^^bf{\dotaccent z} % \gdefchar^^c0{\'R} \gdefchar^^c1{\'A} \gdefchar^^c2{\^A} \gdefchar^^c3{\u A} \gdefchar^^c4{\"A} \gdefchar^^c5{\'L} \gdefchar^^c6{\'C} \gdefchar^^c7{\cedilla C} \gdefchar^^c8{\v C} \gdefchar^^c9{\'E} \gdefchar^^ca{\ogonek{E}} \gdefchar^^cb{\"E} \gdefchar^^cc{\v E} \gdefchar^^cd{\'I} \gdefchar^^ce{\^I} \gdefchar^^cf{\v D} % \gdefchar^^d0{\DH} \gdefchar^^d1{\'N} \gdefchar^^d2{\v N} \gdefchar^^d3{\'O} \gdefchar^^d4{\^O} \gdefchar^^d5{\H O} \gdefchar^^d6{\"O} \gdefchar^^d7{$\times$} \gdefchar^^d8{\v R} \gdefchar^^d9{\ringaccent U} \gdefchar^^da{\'U} \gdefchar^^db{\H U} \gdefchar^^dc{\"U} \gdefchar^^dd{\'Y} \gdefchar^^de{\cedilla T} \gdefchar^^df{\ss} % \gdefchar^^e0{\'r} \gdefchar^^e1{\'a} \gdefchar^^e2{\^a} \gdefchar^^e3{\u a} \gdefchar^^e4{\"a} \gdefchar^^e5{\'l} \gdefchar^^e6{\'c} \gdefchar^^e7{\cedilla c} \gdefchar^^e8{\v c} \gdefchar^^e9{\'e} \gdefchar^^ea{\ogonek{e}} \gdefchar^^eb{\"e} \gdefchar^^ec{\v e} \gdefchar^^ed{\'{\dotless{i}}} \gdefchar^^ee{\^{\dotless{i}}} \gdefchar^^ef{\v d} % \gdefchar^^f0{\dh} \gdefchar^^f1{\'n} \gdefchar^^f2{\v n} \gdefchar^^f3{\'o} \gdefchar^^f4{\^o} \gdefchar^^f5{\H o} \gdefchar^^f6{\"o} \gdefchar^^f7{$\div$} \gdefchar^^f8{\v r} \gdefchar^^f9{\ringaccent u} \gdefchar^^fa{\'u} \gdefchar^^fb{\H u} \gdefchar^^fc{\"u} \gdefchar^^fd{\'y} \gdefchar^^fe{\cedilla t} \gdefchar^^ff{\dotaccent{}} } % UTF-8 character definitions. % % This code to support UTF-8 is based on LaTeX's utf8.def, with some % changes for Texinfo conventions. It is included here under the GPL by % permission from Frank Mittelbach and the LaTeX team. % \newcount\countUTFx \newcount\countUTFy \newcount\countUTFz \gdef\UTFviiiTwoOctets#1#2{\expandafter \UTFviiiDefined\csname u8:#1\string #2\endcsname} % \gdef\UTFviiiThreeOctets#1#2#3{\expandafter \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname} % \gdef\UTFviiiFourOctets#1#2#3#4{\expandafter \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname} \gdef\UTFviiiDefined#1{% \ifx #1\relax \message{\linenumber Unicode char \string #1 not defined for Texinfo}% \else \expandafter #1% \fi } % Give non-ASCII bytes the active definitions for processing UTF-8 sequences \begingroup \catcode`\~13 \catcode`\$12 \catcode`\"12 % Loop from \countUTFx to \countUTFy, performing \UTFviiiTmp % substituting ~ and $ with a character token of that value. \def\UTFviiiLoop{% \global\catcode\countUTFx\active \uccode`\~\countUTFx \uccode`\$\countUTFx \uppercase\expandafter{\UTFviiiTmp}% \advance\countUTFx by 1 \ifnum\countUTFx < \countUTFy \expandafter\UTFviiiLoop \fi} % For bytes other than the first in a UTF-8 sequence. Not expected to % be expanded except when writing to auxiliary files. \countUTFx = "80 \countUTFy = "C2 \def\UTFviiiTmp{% \gdef~{% \ifpassthroughchars $\fi}}% \UTFviiiLoop \countUTFx = "C2 \countUTFy = "E0 \def\UTFviiiTmp{% \gdef~{% \ifpassthroughchars $% \else\expandafter\UTFviiiTwoOctets\expandafter$\fi}}% \UTFviiiLoop \countUTFx = "E0 \countUTFy = "F0 \def\UTFviiiTmp{% \gdef~{% \ifpassthroughchars $% \else\expandafter\UTFviiiThreeOctets\expandafter$\fi}}% \UTFviiiLoop \countUTFx = "F0 \countUTFy = "F4 \def\UTFviiiTmp{% \gdef~{% \ifpassthroughchars $% \else\expandafter\UTFviiiFourOctets\expandafter$\fi }}% \UTFviiiLoop \endgroup \def\globallet{\global\let} % save some \expandafter's below % @U{xxxx} to produce U+xxxx, if we support it. \def\U#1{% \expandafter\ifx\csname uni:#1\endcsname \relax \iftxinativeunicodecapable % All Unicode characters can be used if native Unicode handling is % active. However, if the font does not have the glyph, % letters are missing. \begingroup \uccode`\.="#1\relax \uppercase{.} \endgroup \else \errhelp = \EMsimple \errmessage{Unicode character U+#1 not supported, sorry}% \fi \else \csname uni:#1\endcsname \fi } % These macros are used here to construct the name of a control % sequence to be defined. \def\UTFviiiTwoOctetsName#1#2{% \csname u8:#1\string #2\endcsname}% \def\UTFviiiThreeOctetsName#1#2#3{% \csname u8:#1\string #2\string #3\endcsname}% \def\UTFviiiFourOctetsName#1#2#3#4{% \csname u8:#1\string #2\string #3\string #4\endcsname}% % For UTF-8 byte sequences (TeX, e-TeX and pdfTeX), % provide a definition macro to replace a Unicode character; % this gets used by the @U command % \begingroup \catcode`\"=12 \catcode`\<=12 \catcode`\.=12 \catcode`\,=12 \catcode`\;=12 \catcode`\!=12 \catcode`\~=13 \gdef\DeclareUnicodeCharacterUTFviii#1#2{% \countUTFz = "#1\relax \begingroup \parseXMLCharref % Give \u8:... its definition. The sequence of seven \expandafter's % expands after the \gdef three times, e.g. % % 1. \UTFviiTwoOctetsName B1 B2 % 2. \csname u8:B1 \string B2 \endcsname % 3. \u8: B1 B2 (a single control sequence token) % \expandafter\expandafter \expandafter\expandafter \expandafter\expandafter \expandafter\gdef \UTFviiiTmp{#2}% % \expandafter\ifx\csname uni:#1\endcsname \relax \else \message{Internal error, already defined: #1}% \fi % % define an additional control sequence for this code point. \expandafter\globallet\csname uni:#1\endcsname \UTFviiiTmp \endgroup} % % Given the value in \countUTFz as a Unicode code point, set \UTFviiiTmp % to the corresponding UTF-8 sequence. \gdef\parseXMLCharref{% \ifnum\countUTFz < "A0\relax \errhelp = \EMsimple \errmessage{Cannot define Unicode char value < 00A0}% \else\ifnum\countUTFz < "800\relax \parseUTFviiiA,% \parseUTFviiiB C\UTFviiiTwoOctetsName.,% \else\ifnum\countUTFz < "10000\relax \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiB E\UTFviiiThreeOctetsName.{,;}% \else \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiA!% \parseUTFviiiB F\UTFviiiFourOctetsName.{!,;}% \fi\fi\fi } % Extract a byte from the end of the UTF-8 representation of \countUTFx. % It must be a non-initial byte in the sequence. % Change \uccode of #1 for it to be used in \parseUTFviiiB as one % of the bytes. \gdef\parseUTFviiiA#1{% \countUTFx = \countUTFz \divide\countUTFz by 64 \countUTFy = \countUTFz % Save to be the future value of \countUTFz. \multiply\countUTFz by 64 % \countUTFz is now \countUTFx with the last 5 bits cleared. Subtract % in order to get the last five bits. \advance\countUTFx by -\countUTFz % Convert this to the byte in the UTF-8 sequence. \advance\countUTFx by 128 \uccode `#1\countUTFx \countUTFz = \countUTFy} % Used to put a UTF-8 byte sequence into \UTFviiiTmp % #1 is the increment for \countUTFz to yield a the first byte of the UTF-8 % sequence. % #2 is one of the \UTFviii*OctetsName macros. % #3 is always a full stop (.) % #4 is a template for the other bytes in the sequence. The values for these % bytes is substituted in here with \uppercase using the \uccode's. \gdef\parseUTFviiiB#1#2#3#4{% \advance\countUTFz by "#10\relax \uccode `#3\countUTFz \uppercase{\gdef\UTFviiiTmp{#2#3#4}}} \endgroup % For native Unicode handling (XeTeX and LuaTeX), % provide a definition macro that sets a catcode to `other' non-globally % \def\DeclareUnicodeCharacterNativeOther#1#2{% \catcode"#1=\other } % https://en.wikipedia.org/wiki/Plane_(Unicode)#Basic_M % U+0000..U+007F = https://en.wikipedia.org/wiki/Basic_Latin_(Unicode_block) % U+0080..U+00FF = https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block) % U+0100..U+017F = https://en.wikipedia.org/wiki/Latin_Extended-A % U+0180..U+024F = https://en.wikipedia.org/wiki/Latin_Extended-B % % Many of our renditions are less than wonderful, and all the missing % characters are available somewhere. Loading the necessary fonts % awaits user request. We can't truly support Unicode without % reimplementing everything that's been done in LaTeX for many years, % plus probably using luatex or xetex, and who knows what else. % We won't be doing that here in this simple file. But we can try to at % least make most of the characters not bomb out. % \def\unicodechardefs{% \DeclareUnicodeCharacter{00A0}{\tie}% \DeclareUnicodeCharacter{00A1}{\exclamdown}% \DeclareUnicodeCharacter{00A2}{{\tcfont \char162}}% 0242=cent \DeclareUnicodeCharacter{00A3}{\pounds{}}% \DeclareUnicodeCharacter{00A4}{{\tcfont \char164}}% 0244=currency \DeclareUnicodeCharacter{00A5}{{\tcfont \char165}}% 0245=yen \DeclareUnicodeCharacter{00A6}{{\tcfont \char166}}% 0246=brokenbar \DeclareUnicodeCharacter{00A7}{\S}% \DeclareUnicodeCharacter{00A8}{\"{ }}% \DeclareUnicodeCharacter{00A9}{\copyright{}}% \DeclareUnicodeCharacter{00AA}{\ordf}% \DeclareUnicodeCharacter{00AB}{\guillemetleft{}}% \DeclareUnicodeCharacter{00AC}{\ensuremath\lnot}% \DeclareUnicodeCharacter{00AD}{\-}% \DeclareUnicodeCharacter{00AE}{\registeredsymbol{}}% \DeclareUnicodeCharacter{00AF}{\={ }}% % \DeclareUnicodeCharacter{00B0}{\ringaccent{ }}% \DeclareUnicodeCharacter{00B1}{\ensuremath\pm}% \DeclareUnicodeCharacter{00B2}{$^2$}% \DeclareUnicodeCharacter{00B3}{$^3$}% \DeclareUnicodeCharacter{00B4}{\'{ }}% \DeclareUnicodeCharacter{00B5}{$\mu$}% \DeclareUnicodeCharacter{00B6}{\P}% \DeclareUnicodeCharacter{00B7}{\ensuremath\cdot}% \DeclareUnicodeCharacter{00B8}{\cedilla{ }}% \DeclareUnicodeCharacter{00B9}{$^1$}% \DeclareUnicodeCharacter{00BA}{\ordm}% \DeclareUnicodeCharacter{00BB}{\guillemetright{}}% \DeclareUnicodeCharacter{00BC}{$1\over4$}% \DeclareUnicodeCharacter{00BD}{$1\over2$}% \DeclareUnicodeCharacter{00BE}{$3\over4$}% \DeclareUnicodeCharacter{00BF}{\questiondown}% % \DeclareUnicodeCharacter{00C0}{\`A}% \DeclareUnicodeCharacter{00C1}{\'A}% \DeclareUnicodeCharacter{00C2}{\^A}% \DeclareUnicodeCharacter{00C3}{\~A}% \DeclareUnicodeCharacter{00C4}{\"A}% \DeclareUnicodeCharacter{00C5}{\AA}% \DeclareUnicodeCharacter{00C6}{\AE}% \DeclareUnicodeCharacter{00C7}{\cedilla{C}}% \DeclareUnicodeCharacter{00C8}{\`E}% \DeclareUnicodeCharacter{00C9}{\'E}% \DeclareUnicodeCharacter{00CA}{\^E}% \DeclareUnicodeCharacter{00CB}{\"E}% \DeclareUnicodeCharacter{00CC}{\`I}% \DeclareUnicodeCharacter{00CD}{\'I}% \DeclareUnicodeCharacter{00CE}{\^I}% \DeclareUnicodeCharacter{00CF}{\"I}% % \DeclareUnicodeCharacter{00D0}{\DH}% \DeclareUnicodeCharacter{00D1}{\~N}% \DeclareUnicodeCharacter{00D2}{\`O}% \DeclareUnicodeCharacter{00D3}{\'O}% \DeclareUnicodeCharacter{00D4}{\^O}% \DeclareUnicodeCharacter{00D5}{\~O}% \DeclareUnicodeCharacter{00D6}{\"O}% \DeclareUnicodeCharacter{00D7}{\ensuremath\times}% \DeclareUnicodeCharacter{00D8}{\O}% \DeclareUnicodeCharacter{00D9}{\`U}% \DeclareUnicodeCharacter{00DA}{\'U}% \DeclareUnicodeCharacter{00DB}{\^U}% \DeclareUnicodeCharacter{00DC}{\"U}% \DeclareUnicodeCharacter{00DD}{\'Y}% \DeclareUnicodeCharacter{00DE}{\TH}% \DeclareUnicodeCharacter{00DF}{\ss}% % \DeclareUnicodeCharacter{00E0}{\`a}% \DeclareUnicodeCharacter{00E1}{\'a}% \DeclareUnicodeCharacter{00E2}{\^a}% \DeclareUnicodeCharacter{00E3}{\~a}% \DeclareUnicodeCharacter{00E4}{\"a}% \DeclareUnicodeCharacter{00E5}{\aa}% \DeclareUnicodeCharacter{00E6}{\ae}% \DeclareUnicodeCharacter{00E7}{\cedilla{c}}% \DeclareUnicodeCharacter{00E8}{\`e}% \DeclareUnicodeCharacter{00E9}{\'e}% \DeclareUnicodeCharacter{00EA}{\^e}% \DeclareUnicodeCharacter{00EB}{\"e}% \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}}% \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}}% \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}}% \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}}% % \DeclareUnicodeCharacter{00F0}{\dh}% \DeclareUnicodeCharacter{00F1}{\~n}% \DeclareUnicodeCharacter{00F2}{\`o}% \DeclareUnicodeCharacter{00F3}{\'o}% \DeclareUnicodeCharacter{00F4}{\^o}% \DeclareUnicodeCharacter{00F5}{\~o}% \DeclareUnicodeCharacter{00F6}{\"o}% \DeclareUnicodeCharacter{00F7}{\ensuremath\div}% \DeclareUnicodeCharacter{00F8}{\o}% \DeclareUnicodeCharacter{00F9}{\`u}% \DeclareUnicodeCharacter{00FA}{\'u}% \DeclareUnicodeCharacter{00FB}{\^u}% \DeclareUnicodeCharacter{00FC}{\"u}% \DeclareUnicodeCharacter{00FD}{\'y}% \DeclareUnicodeCharacter{00FE}{\th}% \DeclareUnicodeCharacter{00FF}{\"y}% % \DeclareUnicodeCharacter{0100}{\=A}% \DeclareUnicodeCharacter{0101}{\=a}% \DeclareUnicodeCharacter{0102}{\u{A}}% \DeclareUnicodeCharacter{0103}{\u{a}}% \DeclareUnicodeCharacter{0104}{\ogonek{A}}% \DeclareUnicodeCharacter{0105}{\ogonek{a}}% \DeclareUnicodeCharacter{0106}{\'C}% \DeclareUnicodeCharacter{0107}{\'c}% \DeclareUnicodeCharacter{0108}{\^C}% \DeclareUnicodeCharacter{0109}{\^c}% \DeclareUnicodeCharacter{010A}{\dotaccent{C}}% \DeclareUnicodeCharacter{010B}{\dotaccent{c}}% \DeclareUnicodeCharacter{010C}{\v{C}}% \DeclareUnicodeCharacter{010D}{\v{c}}% \DeclareUnicodeCharacter{010E}{\v{D}}% \DeclareUnicodeCharacter{010F}{d'}% % \DeclareUnicodeCharacter{0110}{\DH}% \DeclareUnicodeCharacter{0111}{\dh}% \DeclareUnicodeCharacter{0112}{\=E}% \DeclareUnicodeCharacter{0113}{\=e}% \DeclareUnicodeCharacter{0114}{\u{E}}% \DeclareUnicodeCharacter{0115}{\u{e}}% \DeclareUnicodeCharacter{0116}{\dotaccent{E}}% \DeclareUnicodeCharacter{0117}{\dotaccent{e}}% \DeclareUnicodeCharacter{0118}{\ogonek{E}}% \DeclareUnicodeCharacter{0119}{\ogonek{e}}% \DeclareUnicodeCharacter{011A}{\v{E}}% \DeclareUnicodeCharacter{011B}{\v{e}}% \DeclareUnicodeCharacter{011C}{\^G}% \DeclareUnicodeCharacter{011D}{\^g}% \DeclareUnicodeCharacter{011E}{\u{G}}% \DeclareUnicodeCharacter{011F}{\u{g}}% % \DeclareUnicodeCharacter{0120}{\dotaccent{G}}% \DeclareUnicodeCharacter{0121}{\dotaccent{g}}% \DeclareUnicodeCharacter{0122}{\cedilla{G}}% \DeclareUnicodeCharacter{0123}{\cedilla{g}}% \DeclareUnicodeCharacter{0124}{\^H}% \DeclareUnicodeCharacter{0125}{\^h}% \DeclareUnicodeCharacter{0126}{\missingcharmsg{H WITH STROKE}}% \DeclareUnicodeCharacter{0127}{\missingcharmsg{h WITH STROKE}}% \DeclareUnicodeCharacter{0128}{\~I}% \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}}% \DeclareUnicodeCharacter{012A}{\=I}% \DeclareUnicodeCharacter{012B}{\={\dotless{i}}}% \DeclareUnicodeCharacter{012C}{\u{I}}% \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}}% \DeclareUnicodeCharacter{012E}{\ogonek{I}}% \DeclareUnicodeCharacter{012F}{\ogonek{i}}% % \DeclareUnicodeCharacter{0130}{\dotaccent{I}}% \DeclareUnicodeCharacter{0131}{\dotless{i}}% \DeclareUnicodeCharacter{0132}{IJ}% \DeclareUnicodeCharacter{0133}{ij}% \DeclareUnicodeCharacter{0134}{\^J}% \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}}% \DeclareUnicodeCharacter{0136}{\cedilla{K}}% \DeclareUnicodeCharacter{0137}{\cedilla{k}}% \DeclareUnicodeCharacter{0138}{\ensuremath\kappa}% \DeclareUnicodeCharacter{0139}{\'L}% \DeclareUnicodeCharacter{013A}{\'l}% \DeclareUnicodeCharacter{013B}{\cedilla{L}}% \DeclareUnicodeCharacter{013C}{\cedilla{l}}% \DeclareUnicodeCharacter{013D}{L'}% should kern \DeclareUnicodeCharacter{013E}{l'}% should kern \DeclareUnicodeCharacter{013F}{L\U{00B7}}% % \DeclareUnicodeCharacter{0140}{l\U{00B7}}% \DeclareUnicodeCharacter{0141}{\L}% \DeclareUnicodeCharacter{0142}{\l}% \DeclareUnicodeCharacter{0143}{\'N}% \DeclareUnicodeCharacter{0144}{\'n}% \DeclareUnicodeCharacter{0145}{\cedilla{N}}% \DeclareUnicodeCharacter{0146}{\cedilla{n}}% \DeclareUnicodeCharacter{0147}{\v{N}}% \DeclareUnicodeCharacter{0148}{\v{n}}% \DeclareUnicodeCharacter{0149}{'n}% \DeclareUnicodeCharacter{014A}{\missingcharmsg{ENG}}% \DeclareUnicodeCharacter{014B}{\missingcharmsg{eng}}% \DeclareUnicodeCharacter{014C}{\=O}% \DeclareUnicodeCharacter{014D}{\=o}% \DeclareUnicodeCharacter{014E}{\u{O}}% \DeclareUnicodeCharacter{014F}{\u{o}}% % \DeclareUnicodeCharacter{0150}{\H{O}}% \DeclareUnicodeCharacter{0151}{\H{o}}% \DeclareUnicodeCharacter{0152}{\OE}% \DeclareUnicodeCharacter{0153}{\oe}% \DeclareUnicodeCharacter{0154}{\'R}% \DeclareUnicodeCharacter{0155}{\'r}% \DeclareUnicodeCharacter{0156}{\cedilla{R}}% \DeclareUnicodeCharacter{0157}{\cedilla{r}}% \DeclareUnicodeCharacter{0158}{\v{R}}% \DeclareUnicodeCharacter{0159}{\v{r}}% \DeclareUnicodeCharacter{015A}{\'S}% \DeclareUnicodeCharacter{015B}{\'s}% \DeclareUnicodeCharacter{015C}{\^S}% \DeclareUnicodeCharacter{015D}{\^s}% \DeclareUnicodeCharacter{015E}{\cedilla{S}}% \DeclareUnicodeCharacter{015F}{\cedilla{s}}% % \DeclareUnicodeCharacter{0160}{\v{S}}% \DeclareUnicodeCharacter{0161}{\v{s}}% \DeclareUnicodeCharacter{0162}{\cedilla{T}}% \DeclareUnicodeCharacter{0163}{\cedilla{t}}% \DeclareUnicodeCharacter{0164}{\v{T}}% \DeclareUnicodeCharacter{0165}{\v{t}}% \DeclareUnicodeCharacter{0166}{\missingcharmsg{H WITH STROKE}}% \DeclareUnicodeCharacter{0167}{\missingcharmsg{h WITH STROKE}}% \DeclareUnicodeCharacter{0168}{\~U}% \DeclareUnicodeCharacter{0169}{\~u}% \DeclareUnicodeCharacter{016A}{\=U}% \DeclareUnicodeCharacter{016B}{\=u}% \DeclareUnicodeCharacter{016C}{\u{U}}% \DeclareUnicodeCharacter{016D}{\u{u}}% \DeclareUnicodeCharacter{016E}{\ringaccent{U}}% \DeclareUnicodeCharacter{016F}{\ringaccent{u}}% % \DeclareUnicodeCharacter{0170}{\H{U}}% \DeclareUnicodeCharacter{0171}{\H{u}}% \DeclareUnicodeCharacter{0172}{\ogonek{U}}% \DeclareUnicodeCharacter{0173}{\ogonek{u}}% \DeclareUnicodeCharacter{0174}{\^W}% \DeclareUnicodeCharacter{0175}{\^w}% \DeclareUnicodeCharacter{0176}{\^Y}% \DeclareUnicodeCharacter{0177}{\^y}% \DeclareUnicodeCharacter{0178}{\"Y}% \DeclareUnicodeCharacter{0179}{\'Z}% \DeclareUnicodeCharacter{017A}{\'z}% \DeclareUnicodeCharacter{017B}{\dotaccent{Z}}% \DeclareUnicodeCharacter{017C}{\dotaccent{z}}% \DeclareUnicodeCharacter{017D}{\v{Z}}% \DeclareUnicodeCharacter{017E}{\v{z}}% \DeclareUnicodeCharacter{017F}{\missingcharmsg{LONG S}}% % \DeclareUnicodeCharacter{01C4}{D\v{Z}}% \DeclareUnicodeCharacter{01C5}{D\v{z}}% \DeclareUnicodeCharacter{01C6}{d\v{z}}% \DeclareUnicodeCharacter{01C7}{LJ}% \DeclareUnicodeCharacter{01C8}{Lj}% \DeclareUnicodeCharacter{01C9}{lj}% \DeclareUnicodeCharacter{01CA}{NJ}% \DeclareUnicodeCharacter{01CB}{Nj}% \DeclareUnicodeCharacter{01CC}{nj}% \DeclareUnicodeCharacter{01CD}{\v{A}}% \DeclareUnicodeCharacter{01CE}{\v{a}}% \DeclareUnicodeCharacter{01CF}{\v{I}}% % \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}}% \DeclareUnicodeCharacter{01D1}{\v{O}}% \DeclareUnicodeCharacter{01D2}{\v{o}}% \DeclareUnicodeCharacter{01D3}{\v{U}}% \DeclareUnicodeCharacter{01D4}{\v{u}}% % \DeclareUnicodeCharacter{01E2}{\={\AE}}% \DeclareUnicodeCharacter{01E3}{\={\ae}}% \DeclareUnicodeCharacter{01E6}{\v{G}}% \DeclareUnicodeCharacter{01E7}{\v{g}}% \DeclareUnicodeCharacter{01E8}{\v{K}}% \DeclareUnicodeCharacter{01E9}{\v{k}}% % \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}}% \DeclareUnicodeCharacter{01F1}{DZ}% \DeclareUnicodeCharacter{01F2}{Dz}% \DeclareUnicodeCharacter{01F3}{dz}% \DeclareUnicodeCharacter{01F4}{\'G}% \DeclareUnicodeCharacter{01F5}{\'g}% \DeclareUnicodeCharacter{01F8}{\`N}% \DeclareUnicodeCharacter{01F9}{\`n}% \DeclareUnicodeCharacter{01FC}{\'{\AE}}% \DeclareUnicodeCharacter{01FD}{\'{\ae}}% \DeclareUnicodeCharacter{01FE}{\'{\O}}% \DeclareUnicodeCharacter{01FF}{\'{\o}}% % \DeclareUnicodeCharacter{021E}{\v{H}}% \DeclareUnicodeCharacter{021F}{\v{h}}% % \DeclareUnicodeCharacter{0226}{\dotaccent{A}}% \DeclareUnicodeCharacter{0227}{\dotaccent{a}}% \DeclareUnicodeCharacter{0228}{\cedilla{E}}% \DeclareUnicodeCharacter{0229}{\cedilla{e}}% \DeclareUnicodeCharacter{022E}{\dotaccent{O}}% \DeclareUnicodeCharacter{022F}{\dotaccent{o}}% % \DeclareUnicodeCharacter{0232}{\=Y}% \DeclareUnicodeCharacter{0233}{\=y}% \DeclareUnicodeCharacter{0237}{\dotless{j}}% % \DeclareUnicodeCharacter{02BC}{'}% % \DeclareUnicodeCharacter{02DB}{\ogonek{ }}% % % Greek letters upper case \DeclareUnicodeCharacter{0391}{{\it A}}% \DeclareUnicodeCharacter{0392}{{\it B}}% \DeclareUnicodeCharacter{0393}{\ensuremath{\mit\Gamma}}% \DeclareUnicodeCharacter{0394}{\ensuremath{\mit\Delta}}% \DeclareUnicodeCharacter{0395}{{\it E}}% \DeclareUnicodeCharacter{0396}{{\it Z}}% \DeclareUnicodeCharacter{0397}{{\it H}}% \DeclareUnicodeCharacter{0398}{\ensuremath{\mit\Theta}}% \DeclareUnicodeCharacter{0399}{{\it I}}% \DeclareUnicodeCharacter{039A}{{\it K}}% \DeclareUnicodeCharacter{039B}{\ensuremath{\mit\Lambda}}% \DeclareUnicodeCharacter{039C}{{\it M}}% \DeclareUnicodeCharacter{039D}{{\it N}}% \DeclareUnicodeCharacter{039E}{\ensuremath{\mit\Xi}}% \DeclareUnicodeCharacter{039F}{{\it O}}% \DeclareUnicodeCharacter{03A0}{\ensuremath{\mit\Pi}}% \DeclareUnicodeCharacter{03A1}{{\it P}}% %\DeclareUnicodeCharacter{03A2}{} % none - corresponds to final sigma \DeclareUnicodeCharacter{03A3}{\ensuremath{\mit\Sigma}}% \DeclareUnicodeCharacter{03A4}{{\it T}}% \DeclareUnicodeCharacter{03A5}{\ensuremath{\mit\Upsilon}}% \DeclareUnicodeCharacter{03A6}{\ensuremath{\mit\Phi}}% \DeclareUnicodeCharacter{03A7}{{\it X}}% \DeclareUnicodeCharacter{03A8}{\ensuremath{\mit\Psi}}% \DeclareUnicodeCharacter{03A9}{\ensuremath{\mit\Omega}}% % % Vowels with accents \DeclareUnicodeCharacter{0390}{\ensuremath{\ddot{\acute\iota}}}% \DeclareUnicodeCharacter{03AC}{\ensuremath{\acute\alpha}}% \DeclareUnicodeCharacter{03AD}{\ensuremath{\acute\epsilon}}% \DeclareUnicodeCharacter{03AE}{\ensuremath{\acute\eta}}% \DeclareUnicodeCharacter{03AF}{\ensuremath{\acute\iota}}% \DeclareUnicodeCharacter{03B0}{\ensuremath{\acute{\ddot\upsilon}}}% % % Standalone accent \DeclareUnicodeCharacter{0384}{\ensuremath{\acute{\ }}}% % % Greek letters lower case \DeclareUnicodeCharacter{03B1}{\ensuremath\alpha}% \DeclareUnicodeCharacter{03B2}{\ensuremath\beta}% \DeclareUnicodeCharacter{03B3}{\ensuremath\gamma}% \DeclareUnicodeCharacter{03B4}{\ensuremath\delta}% \DeclareUnicodeCharacter{03B5}{\ensuremath\epsilon}% \DeclareUnicodeCharacter{03B6}{\ensuremath\zeta}% \DeclareUnicodeCharacter{03B7}{\ensuremath\eta}% \DeclareUnicodeCharacter{03B8}{\ensuremath\theta}% \DeclareUnicodeCharacter{03B9}{\ensuremath\iota}% \DeclareUnicodeCharacter{03BA}{\ensuremath\kappa}% \DeclareUnicodeCharacter{03BB}{\ensuremath\lambda}% \DeclareUnicodeCharacter{03BC}{\ensuremath\mu}% \DeclareUnicodeCharacter{03BD}{\ensuremath\nu}% \DeclareUnicodeCharacter{03BE}{\ensuremath\xi}% \DeclareUnicodeCharacter{03BF}{{\it o}}% omicron \DeclareUnicodeCharacter{03C0}{\ensuremath\pi}% \DeclareUnicodeCharacter{03C1}{\ensuremath\rho}% \DeclareUnicodeCharacter{03C2}{\ensuremath\varsigma}% \DeclareUnicodeCharacter{03C3}{\ensuremath\sigma}% \DeclareUnicodeCharacter{03C4}{\ensuremath\tau}% \DeclareUnicodeCharacter{03C5}{\ensuremath\upsilon}% \DeclareUnicodeCharacter{03C6}{\ensuremath\phi}% \DeclareUnicodeCharacter{03C7}{\ensuremath\chi}% \DeclareUnicodeCharacter{03C8}{\ensuremath\psi}% \DeclareUnicodeCharacter{03C9}{\ensuremath\omega}% % % More Greek vowels with accents \DeclareUnicodeCharacter{03CA}{\ensuremath{\ddot\iota}}% \DeclareUnicodeCharacter{03CB}{\ensuremath{\ddot\upsilon}}% \DeclareUnicodeCharacter{03CC}{\ensuremath{\acute o}}% \DeclareUnicodeCharacter{03CD}{\ensuremath{\acute\upsilon}}% \DeclareUnicodeCharacter{03CE}{\ensuremath{\acute\omega}}% % % Variant Greek letters \DeclareUnicodeCharacter{03D1}{\ensuremath\vartheta}% \DeclareUnicodeCharacter{03D6}{\ensuremath\varpi}% \DeclareUnicodeCharacter{03F1}{\ensuremath\varrho}% % \DeclareUnicodeCharacter{1E02}{\dotaccent{B}}% \DeclareUnicodeCharacter{1E03}{\dotaccent{b}}% \DeclareUnicodeCharacter{1E04}{\udotaccent{B}}% \DeclareUnicodeCharacter{1E05}{\udotaccent{b}}% \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}}% \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}}% \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}}% \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}}% \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}}% \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}}% \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}}% \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}}% % \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}}% \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}}% % \DeclareUnicodeCharacter{1E20}{\=G}% \DeclareUnicodeCharacter{1E21}{\=g}% \DeclareUnicodeCharacter{1E22}{\dotaccent{H}}% \DeclareUnicodeCharacter{1E23}{\dotaccent{h}}% \DeclareUnicodeCharacter{1E24}{\udotaccent{H}}% \DeclareUnicodeCharacter{1E25}{\udotaccent{h}}% \DeclareUnicodeCharacter{1E26}{\"H}% \DeclareUnicodeCharacter{1E27}{\"h}% % \DeclareUnicodeCharacter{1E30}{\'K}% \DeclareUnicodeCharacter{1E31}{\'k}% \DeclareUnicodeCharacter{1E32}{\udotaccent{K}}% \DeclareUnicodeCharacter{1E33}{\udotaccent{k}}% \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}}% \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}}% \DeclareUnicodeCharacter{1E36}{\udotaccent{L}}% \DeclareUnicodeCharacter{1E37}{\udotaccent{l}}% \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}}% \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}}% \DeclareUnicodeCharacter{1E3E}{\'M}% \DeclareUnicodeCharacter{1E3F}{\'m}% % \DeclareUnicodeCharacter{1E40}{\dotaccent{M}}% \DeclareUnicodeCharacter{1E41}{\dotaccent{m}}% \DeclareUnicodeCharacter{1E42}{\udotaccent{M}}% \DeclareUnicodeCharacter{1E43}{\udotaccent{m}}% \DeclareUnicodeCharacter{1E44}{\dotaccent{N}}% \DeclareUnicodeCharacter{1E45}{\dotaccent{n}}% \DeclareUnicodeCharacter{1E46}{\udotaccent{N}}% \DeclareUnicodeCharacter{1E47}{\udotaccent{n}}% \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}}% \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}}% % \DeclareUnicodeCharacter{1E54}{\'P}% \DeclareUnicodeCharacter{1E55}{\'p}% \DeclareUnicodeCharacter{1E56}{\dotaccent{P}}% \DeclareUnicodeCharacter{1E57}{\dotaccent{p}}% \DeclareUnicodeCharacter{1E58}{\dotaccent{R}}% \DeclareUnicodeCharacter{1E59}{\dotaccent{r}}% \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}}% \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}}% \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}}% \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}}% % \DeclareUnicodeCharacter{1E60}{\dotaccent{S}}% \DeclareUnicodeCharacter{1E61}{\dotaccent{s}}% \DeclareUnicodeCharacter{1E62}{\udotaccent{S}}% \DeclareUnicodeCharacter{1E63}{\udotaccent{s}}% \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}}% \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}}% \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}}% \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}}% \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}}% \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}}% % \DeclareUnicodeCharacter{1E7C}{\~V}% \DeclareUnicodeCharacter{1E7D}{\~v}% \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}}% \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}}% % \DeclareUnicodeCharacter{1E80}{\`W}% \DeclareUnicodeCharacter{1E81}{\`w}% \DeclareUnicodeCharacter{1E82}{\'W}% \DeclareUnicodeCharacter{1E83}{\'w}% \DeclareUnicodeCharacter{1E84}{\"W}% \DeclareUnicodeCharacter{1E85}{\"w}% \DeclareUnicodeCharacter{1E86}{\dotaccent{W}}% \DeclareUnicodeCharacter{1E87}{\dotaccent{w}}% \DeclareUnicodeCharacter{1E88}{\udotaccent{W}}% \DeclareUnicodeCharacter{1E89}{\udotaccent{w}}% \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}}% \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}}% \DeclareUnicodeCharacter{1E8C}{\"X}% \DeclareUnicodeCharacter{1E8D}{\"x}% \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}}% \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}}% % \DeclareUnicodeCharacter{1E90}{\^Z}% \DeclareUnicodeCharacter{1E91}{\^z}% \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}}% \DeclareUnicodeCharacter{1E93}{\udotaccent{z}}% \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}}% \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}}% \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}}% \DeclareUnicodeCharacter{1E97}{\"t}% \DeclareUnicodeCharacter{1E98}{\ringaccent{w}}% \DeclareUnicodeCharacter{1E99}{\ringaccent{y}}% % \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}}% \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}}% % \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}}% \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}}% \DeclareUnicodeCharacter{1EBC}{\~E}% \DeclareUnicodeCharacter{1EBD}{\~e}% % \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}}% \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}}% \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}}% \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}}% % \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}}% \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}}% % \DeclareUnicodeCharacter{1EF2}{\`Y}% \DeclareUnicodeCharacter{1EF3}{\`y}% \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}}% % \DeclareUnicodeCharacter{1EF8}{\~Y}% \DeclareUnicodeCharacter{1EF9}{\~y}% % % Punctuation \DeclareUnicodeCharacter{2013}{--}% \DeclareUnicodeCharacter{2014}{---}% \DeclareUnicodeCharacter{2018}{\quoteleft{}}% \DeclareUnicodeCharacter{2019}{\quoteright{}}% \DeclareUnicodeCharacter{201A}{\quotesinglbase{}}% \DeclareUnicodeCharacter{201C}{\quotedblleft{}}% \DeclareUnicodeCharacter{201D}{\quotedblright{}}% \DeclareUnicodeCharacter{201E}{\quotedblbase{}}% \DeclareUnicodeCharacter{2020}{\ensuremath\dagger}% \DeclareUnicodeCharacter{2021}{\ensuremath\ddagger}% \DeclareUnicodeCharacter{2022}{\bullet{}}% \DeclareUnicodeCharacter{202F}{\thinspace}% \DeclareUnicodeCharacter{2026}{\dots{}}% \DeclareUnicodeCharacter{2039}{\guilsinglleft{}}% \DeclareUnicodeCharacter{203A}{\guilsinglright{}}% % \DeclareUnicodeCharacter{20AC}{\euro{}}% % \DeclareUnicodeCharacter{2192}{\expansion{}}% \DeclareUnicodeCharacter{21D2}{\result{}}% % % Mathematical symbols \DeclareUnicodeCharacter{2200}{\ensuremath\forall}% \DeclareUnicodeCharacter{2203}{\ensuremath\exists}% \DeclareUnicodeCharacter{2208}{\ensuremath\in}% \DeclareUnicodeCharacter{2212}{\minus{}}% \DeclareUnicodeCharacter{2217}{\ast}% \DeclareUnicodeCharacter{221E}{\ensuremath\infty}% \DeclareUnicodeCharacter{2225}{\ensuremath\parallel}% \DeclareUnicodeCharacter{2227}{\ensuremath\wedge}% \DeclareUnicodeCharacter{2229}{\ensuremath\cap}% \DeclareUnicodeCharacter{2261}{\equiv{}}% \DeclareUnicodeCharacter{2264}{\ensuremath\leq}% \DeclareUnicodeCharacter{2265}{\ensuremath\geq}% \DeclareUnicodeCharacter{2282}{\ensuremath\subset}% \DeclareUnicodeCharacter{2287}{\ensuremath\supseteq}% % \DeclareUnicodeCharacter{2016}{\ensuremath\Vert}% \DeclareUnicodeCharacter{2032}{\ensuremath\prime}% \DeclareUnicodeCharacter{210F}{\ensuremath\hbar}% \DeclareUnicodeCharacter{2111}{\ensuremath\Im}% \DeclareUnicodeCharacter{2113}{\ensuremath\ell}% \DeclareUnicodeCharacter{2118}{\ensuremath\wp}% \DeclareUnicodeCharacter{211C}{\ensuremath\Re}% \DeclareUnicodeCharacter{2135}{\ensuremath\aleph}% \DeclareUnicodeCharacter{2190}{\ensuremath\leftarrow}% \DeclareUnicodeCharacter{2191}{\ensuremath\uparrow}% \DeclareUnicodeCharacter{2193}{\ensuremath\downarrow}% \DeclareUnicodeCharacter{2194}{\ensuremath\leftrightarrow}% \DeclareUnicodeCharacter{2195}{\ensuremath\updownarrow}% \DeclareUnicodeCharacter{2196}{\ensuremath\nwarrow}% \DeclareUnicodeCharacter{2197}{\ensuremath\nearrow}% \DeclareUnicodeCharacter{2198}{\ensuremath\searrow}% \DeclareUnicodeCharacter{2199}{\ensuremath\swarrow}% \DeclareUnicodeCharacter{21A6}{\ensuremath\mapsto}% \DeclareUnicodeCharacter{21A9}{\ensuremath\hookleftarrow}% \DeclareUnicodeCharacter{21AA}{\ensuremath\hookrightarrow}% \DeclareUnicodeCharacter{21BC}{\ensuremath\leftharpoonup}% \DeclareUnicodeCharacter{21BD}{\ensuremath\leftharpoondown}% \DeclareUnicodeCharacter{21C0}{\ensuremath\rightharpoonup}% \DeclareUnicodeCharacter{21C1}{\ensuremath\rightharpoondown}% \DeclareUnicodeCharacter{21CC}{\ensuremath\rightleftharpoons}% \DeclareUnicodeCharacter{21D0}{\ensuremath\Leftarrow}% \DeclareUnicodeCharacter{21D1}{\ensuremath\Uparrow}% \DeclareUnicodeCharacter{21D3}{\ensuremath\Downarrow}% \DeclareUnicodeCharacter{21D4}{\ensuremath\Leftrightarrow}% \DeclareUnicodeCharacter{21D5}{\ensuremath\Updownarrow}% \DeclareUnicodeCharacter{2202}{\ensuremath\partial}% \DeclareUnicodeCharacter{2205}{\ensuremath\emptyset}% \DeclareUnicodeCharacter{2207}{\ensuremath\nabla}% \DeclareUnicodeCharacter{2209}{\ensuremath\notin}% \DeclareUnicodeCharacter{220B}{\ensuremath\owns}% \DeclareUnicodeCharacter{220F}{\ensuremath\prod}% \DeclareUnicodeCharacter{2210}{\ensuremath\coprod}% \DeclareUnicodeCharacter{2211}{\ensuremath\sum}% \DeclareUnicodeCharacter{2213}{\ensuremath\mp}% \DeclareUnicodeCharacter{2218}{\ensuremath\circ}% \DeclareUnicodeCharacter{221A}{\ensuremath\surd}% \DeclareUnicodeCharacter{221D}{\ensuremath\propto}% \DeclareUnicodeCharacter{2220}{\ensuremath\angle}% \DeclareUnicodeCharacter{2223}{\ensuremath\mid}% \DeclareUnicodeCharacter{2228}{\ensuremath\vee}% \DeclareUnicodeCharacter{222A}{\ensuremath\cup}% \DeclareUnicodeCharacter{222B}{\ensuremath\smallint}% \DeclareUnicodeCharacter{222E}{\ensuremath\oint}% \DeclareUnicodeCharacter{223C}{\ensuremath\sim}% \DeclareUnicodeCharacter{2240}{\ensuremath\wr}% \DeclareUnicodeCharacter{2243}{\ensuremath\simeq}% \DeclareUnicodeCharacter{2245}{\ensuremath\cong}% \DeclareUnicodeCharacter{2248}{\ensuremath\approx}% \DeclareUnicodeCharacter{224D}{\ensuremath\asymp}% \DeclareUnicodeCharacter{2250}{\ensuremath\doteq}% \DeclareUnicodeCharacter{2260}{\ensuremath\neq}% \DeclareUnicodeCharacter{226A}{\ensuremath\ll}% \DeclareUnicodeCharacter{226B}{\ensuremath\gg}% \DeclareUnicodeCharacter{227A}{\ensuremath\prec}% \DeclareUnicodeCharacter{227B}{\ensuremath\succ}% \DeclareUnicodeCharacter{2283}{\ensuremath\supset}% \DeclareUnicodeCharacter{2286}{\ensuremath\subseteq}% \DeclareUnicodeCharacter{228E}{\ensuremath\uplus}% \DeclareUnicodeCharacter{2291}{\ensuremath\sqsubseteq}% \DeclareUnicodeCharacter{2292}{\ensuremath\sqsupseteq}% \DeclareUnicodeCharacter{2293}{\ensuremath\sqcap}% \DeclareUnicodeCharacter{2294}{\ensuremath\sqcup}% \DeclareUnicodeCharacter{2295}{\ensuremath\oplus}% \DeclareUnicodeCharacter{2296}{\ensuremath\ominus}% \DeclareUnicodeCharacter{2297}{\ensuremath\otimes}% \DeclareUnicodeCharacter{2298}{\ensuremath\oslash}% \DeclareUnicodeCharacter{2299}{\ensuremath\odot}% \DeclareUnicodeCharacter{22A2}{\ensuremath\vdash}% \DeclareUnicodeCharacter{22A3}{\ensuremath\dashv}% \DeclareUnicodeCharacter{22A4}{\ensuremath\ptextop}% \DeclareUnicodeCharacter{22A5}{\ensuremath\bot}% \DeclareUnicodeCharacter{22A8}{\ensuremath\models}% \DeclareUnicodeCharacter{22C0}{\ensuremath\bigwedge}% \DeclareUnicodeCharacter{22C1}{\ensuremath\bigvee}% \DeclareUnicodeCharacter{22C2}{\ensuremath\bigcap}% \DeclareUnicodeCharacter{22C3}{\ensuremath\bigcup}% \DeclareUnicodeCharacter{22C4}{\ensuremath\diamond}% \DeclareUnicodeCharacter{22C5}{\ensuremath\cdot}% \DeclareUnicodeCharacter{22C6}{\ensuremath\star}% \DeclareUnicodeCharacter{22C8}{\ensuremath\bowtie}% \DeclareUnicodeCharacter{2308}{\ensuremath\lceil}% \DeclareUnicodeCharacter{2309}{\ensuremath\rceil}% \DeclareUnicodeCharacter{230A}{\ensuremath\lfloor}% \DeclareUnicodeCharacter{230B}{\ensuremath\rfloor}% \DeclareUnicodeCharacter{2322}{\ensuremath\frown}% \DeclareUnicodeCharacter{2323}{\ensuremath\smile}% % \DeclareUnicodeCharacter{25B3}{\ensuremath\triangle}% \DeclareUnicodeCharacter{25B7}{\ensuremath\triangleright}% \DeclareUnicodeCharacter{25BD}{\ensuremath\bigtriangledown}% \DeclareUnicodeCharacter{25C1}{\ensuremath\triangleleft}% \DeclareUnicodeCharacter{25C7}{\ensuremath\diamond}% \DeclareUnicodeCharacter{2660}{\ensuremath\spadesuit}% \DeclareUnicodeCharacter{2661}{\ensuremath\heartsuit}% \DeclareUnicodeCharacter{2662}{\ensuremath\diamondsuit}% \DeclareUnicodeCharacter{2663}{\ensuremath\clubsuit}% \DeclareUnicodeCharacter{266D}{\ensuremath\flat}% \DeclareUnicodeCharacter{266E}{\ensuremath\natural}% \DeclareUnicodeCharacter{266F}{\ensuremath\sharp}% \DeclareUnicodeCharacter{26AA}{\ensuremath\bigcirc}% \DeclareUnicodeCharacter{27B9}{\ensuremath\rangle}% \DeclareUnicodeCharacter{27C2}{\ensuremath\perp}% \DeclareUnicodeCharacter{27E8}{\ensuremath\langle}% \DeclareUnicodeCharacter{27F5}{\ensuremath\longleftarrow}% \DeclareUnicodeCharacter{27F6}{\ensuremath\longrightarrow}% \DeclareUnicodeCharacter{27F7}{\ensuremath\longleftrightarrow}% \DeclareUnicodeCharacter{27FC}{\ensuremath\longmapsto}% \DeclareUnicodeCharacter{29F5}{\ensuremath\setminus}% \DeclareUnicodeCharacter{2A00}{\ensuremath\bigodot}% \DeclareUnicodeCharacter{2A01}{\ensuremath\bigoplus}% \DeclareUnicodeCharacter{2A02}{\ensuremath\bigotimes}% \DeclareUnicodeCharacter{2A04}{\ensuremath\biguplus}% \DeclareUnicodeCharacter{2A06}{\ensuremath\bigsqcup}% \DeclareUnicodeCharacter{2A3F}{\ensuremath\amalg}% \DeclareUnicodeCharacter{2AAF}{\ensuremath\preceq}% \DeclareUnicodeCharacter{2AB0}{\ensuremath\succeq}% % \global\mathchardef\checkmark="1370% actually the square root sign \DeclareUnicodeCharacter{2713}{\ensuremath\checkmark}% }% end of \unicodechardefs % UTF-8 byte sequence (pdfTeX) definitions (replacing and @U command) % It makes the setting that replace UTF-8 byte sequence. \def\utfeightchardefs{% \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterUTFviii \unicodechardefs } % Whether the active definitions of non-ASCII characters expand to % non-active tokens with the same character code. This is used to % write characters literally, instead of using active definitions for % printing the correct glyphs. \newif\ifpassthroughchars \passthroughcharsfalse % For native Unicode handling (XeTeX and LuaTeX), % provide a definition macro to replace/pass-through a Unicode character % \def\DeclareUnicodeCharacterNative#1#2{% \catcode"#1=\active \def\dodeclareunicodecharacternative##1##2##3{% \begingroup \uccode`\~="##2\relax \uppercase{\gdef~}{% \ifpassthroughchars ##1% \else ##3% \fi } \endgroup } \begingroup \uccode`\.="#1\relax \uppercase{\def\UTFNativeTmp{.}}% \expandafter\dodeclareunicodecharacternative\UTFNativeTmp{#1}{#2}% \endgroup } % Native Unicode handling (XeTeX and LuaTeX) character replacing definition. % It activates the setting that replaces Unicode characters. \def\nativeunicodechardefs{% \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterNative \unicodechardefs } % For native Unicode handling (XeTeX and LuaTeX), % make the character token expand % to the sequences given in \unicodechardefs for printing. \def\DeclareUnicodeCharacterNativeAtU#1#2{% \def\UTFAtUTmp{#2} \expandafter\globallet\csname uni:#1\endcsname \UTFAtUTmp } % @U command definitions for native Unicode handling (XeTeX and LuaTeX). \def\nativeunicodechardefsatu{% \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterNativeAtU \unicodechardefs } % US-ASCII character definitions. \def\asciichardefs{% nothing need be done \relax } % Define all Unicode characters we know about. This makes UTF-8 the default % input encoding and allows @U to work. \iftxinativeunicodecapable \nativeunicodechardefsatu \else \utfeightchardefs \fi \message{formatting,} \newdimen\defaultparindent \defaultparindent = 15pt \chapheadingskip = 15pt plus 4pt minus 2pt \secheadingskip = 12pt plus 3pt minus 2pt \subsecheadingskip = 9pt plus 2pt minus 2pt % Prevent underfull vbox error messages. \vbadness = 10000 % Don't be very finicky about underfull hboxes, either. \hbadness = 6666 % Following George Bush, get rid of widows and orphans. \widowpenalty=10000 \clubpenalty=10000 % Use TeX 3.0's \emergencystretch to help line breaking, but if we're % using an old version of TeX, don't do anything. We want the amount of % stretch added to depend on the line length, hence the dependence on % \hsize. We call this whenever the paper size is set. % \def\setemergencystretch{% \ifx\emergencystretch\thisisundefined % Allow us to assign to \emergencystretch anyway. \def\emergencystretch{\dimen0}% \else \emergencystretch = .15\hsize \fi } % Parameters in order: 1) textheight; 2) textwidth; % 3) voffset; 4) hoffset; 5) binding offset; 6) topskip; % 7) physical page height; 8) physical page width. % % We also call \setleading{\textleading}, so the caller should define % \textleading. The caller should also set \parskip. % \def\internalpagesizes#1#2#3#4#5#6#7#8{% \voffset = #3\relax \topskip = #6\relax \splittopskip = \topskip % \vsize = #1\relax \advance\vsize by \topskip \outervsize = \vsize \advance\outervsize by 2\topandbottommargin \txipageheight = \vsize % \hsize = #2\relax \outerhsize = \hsize \advance\outerhsize by 0.5in \txipagewidth = \hsize % \normaloffset = #4\relax \bindingoffset = #5\relax % \ifpdf \pdfpageheight #7\relax \pdfpagewidth #8\relax % if we don't reset these, they will remain at "1 true in" of % whatever layout pdftex was dumped with. \pdfhorigin = 1 true in \pdfvorigin = 1 true in \else \ifx\XeTeXrevision\thisisundefined \special{papersize=#8,#7}% \else \pdfpageheight #7\relax \pdfpagewidth #8\relax % XeTeX does not have \pdfhorigin and \pdfvorigin. \fi \fi % \setleading{\textleading} % \parindent = \defaultparindent \setemergencystretch } % @letterpaper (the default). \def\letterpaper{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt \textleading = 13.2pt % % If page is nothing but text, make it come out even. \internalpagesizes{607.2pt}{6in}% that's 46 lines {\voffset}{.25in}% {\bindingoffset}{36pt}% {11in}{8.5in}% }} % Use @smallbook to reset parameters for 7x9.25 trim size. \def\smallbook{{\globaldefs = 1 \parskip = 2pt plus 1pt \textleading = 12pt % \internalpagesizes{7.5in}{5in}% {-.2in}{0in}% {\bindingoffset}{16pt}% {9.25in}{7in}% % \lispnarrowing = 0.3in \tolerance = 700 \contentsrightmargin = 0pt \defbodyindent = .5cm }} % Use @smallerbook to reset parameters for 6x9 trim size. % (Just testing, parameters still in flux.) \def\smallerbook{{\globaldefs = 1 \parskip = 1.5pt plus 1pt \textleading = 12pt % \internalpagesizes{7.4in}{4.8in}% {-.2in}{-.4in}% {0pt}{14pt}% {9in}{6in}% % \lispnarrowing = 0.25in \tolerance = 700 \contentsrightmargin = 0pt \defbodyindent = .4cm }} % Use @afourpaper to print on European A4 paper. \def\afourpaper{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt \textleading = 13.2pt % % Double-side printing via postscript on Laserjet 4050 % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm. % To change the settings for a different printer or situation, adjust % \normaloffset until the front-side and back-side texts align. Then % do the same for \bindingoffset. You can set these for testing in % your texinfo source file like this: % @tex % \global\normaloffset = -6mm % \global\bindingoffset = 10mm % @end tex \internalpagesizes{673.2pt}{160mm}% that's 51 lines {\voffset}{\hoffset}% {\bindingoffset}{44pt}% {297mm}{210mm}% % \tolerance = 700 \contentsrightmargin = 0pt \defbodyindent = 5mm }} % Use @afivepaper to print on European A5 paper. % From romildo@urano.iceb.ufop.br, 2 July 2000. % He also recommends making @example and @lisp be small. \def\afivepaper{{\globaldefs = 1 \parskip = 2pt plus 1pt minus 0.1pt \textleading = 12.5pt % \internalpagesizes{160mm}{120mm}% {\voffset}{\hoffset}% {\bindingoffset}{8pt}% {210mm}{148mm}% % \lispnarrowing = 0.2in \tolerance = 800 \contentsrightmargin = 0pt \defbodyindent = 2mm \tableindent = 12mm }} % A specific text layout, 24x15cm overall, intended for A4 paper. \def\afourlatex{{\globaldefs = 1 \afourpaper \internalpagesizes{237mm}{150mm}% {\voffset}{4.6mm}% {\bindingoffset}{7mm}% {297mm}{210mm}% % % Must explicitly reset to 0 because we call \afourpaper. \globaldefs = 0 }} % Use @afourwide to print on A4 paper in landscape format. \def\afourwide{{\globaldefs = 1 \afourpaper \internalpagesizes{241mm}{165mm}% {\voffset}{-2.95mm}% {\bindingoffset}{7mm}% {297mm}{210mm}% \globaldefs = 0 }} % @pagesizes TEXTHEIGHT[,TEXTWIDTH] % Perhaps we should allow setting the margins, \topskip, \parskip, % and/or leading, also. Or perhaps we should compute them somehow. % \parseargdef\pagesizes{\pagesizesyyy #1,,\finish} \def\pagesizesyyy#1,#2,#3\finish{{% \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi \globaldefs = 1 % \parskip = 3pt plus 2pt minus 1pt \setleading{\textleading}% % \dimen0 = #1\relax \advance\dimen0 by \voffset \advance\dimen0 by 1in % reference point for DVI is 1 inch from top of page % \dimen2 = \hsize \advance\dimen2 by \normaloffset \advance\dimen2 by 1in % reference point is 1 inch from left edge of page % \internalpagesizes{#1}{\hsize}% {\voffset}{\normaloffset}% {\bindingoffset}{44pt}% {\dimen0}{\dimen2}% }} % Set default to letter. % \letterpaper % Default value of \hfuzz, for suppressing warnings about overfull hboxes. \hfuzz = 1pt \message{and turning on texinfo input format.} \def^^L{\par} % remove \outer, so ^L can appear in an @comment % DEL is a comment character, in case @c does not suffice. \catcode`\^^? = 14 % Define macros to output various characters with catcode for normal text. \catcode`\"=\other \def\normaldoublequote{"} \catcode`\$=\other \def\normaldollar{$}%$ font-lock fix \catcode`\+=\other \def\normalplus{+} \catcode`\<=\other \def\normalless{<} \catcode`\>=\other \def\normalgreater{>} \catcode`\^=\other \def\normalcaret{^} \catcode`\_=\other \def\normalunderscore{_} \catcode`\|=\other \def\normalverticalbar{|} \catcode`\~=\other \def\normaltilde{~} % This macro is used to make a character print one way in \tt % (where it can probably be output as-is), and another way in other fonts, % where something hairier probably needs to be done. % % #1 is what to print if we are indeed using \tt; #2 is what to print % otherwise. Since all the Computer Modern typewriter fonts have zero % interword stretch (and shrink), and it is reasonable to expect all % typewriter fonts to have this, we can check that font parameter. % \def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} % Same as above, but check for italic font. Actually this also catches % non-italic slanted fonts since it is impossible to distinguish them from % italic fonts. But since this is only used by $ and it uses \sl anyway % this is not a problem. \def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} % Set catcodes for Texinfo file % Active characters for printing the wanted glyph. % Most of these we simply print from the \tt font, but for some, we can % use math or other variants that look better in normal text. % \catcode`\"=\active \def\activedoublequote{{\tt\char34}} \let"=\activedoublequote \catcode`\~=\active \def\activetilde{{\tt\char126}} \let~ = \activetilde \chardef\hatchar=`\^ \catcode`\^=\active \def\activehat{{\tt \hatchar}} \let^ = \activehat \catcode`\_=\active \def_{\ifusingtt\normalunderscore\_} \def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } \let\realunder=_ \catcode`\|=\active \def|{{\tt\char124}} \chardef \less=`\< \catcode`\<=\active \def\activeless{{\tt \less}}\let< = \activeless \chardef \gtr=`\> \catcode`\>=\active \def\activegtr{{\tt \gtr}}\let> = \activegtr \catcode`\+=\active \def+{{\tt \char 43}} \catcode`\$=\active \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix \catcode`\-=\active \let-=\normaldash % used for headline/footline in the output routine, in case the page % breaks in the middle of an @tex block. \def\texinfochars{% \let< = \activeless \let> = \activegtr \let~ = \activetilde \let^ = \activehat \markupsetuplqdefault \markupsetuprqdefault \let\b = \strong \let\i = \smartitalic % in principle, all other definitions in \tex have to be undone too. } % Used sometimes to turn off (effectively) the active characters even after % parsing them. \def\turnoffactive{% \normalturnoffactive \otherbackslash } \catcode`\@=0 % \backslashcurfont outputs one backslash character in current font, % as in \char`\\. \global\chardef\backslashcurfont=`\\ % \realbackslash is an actual character `\' with catcode other. {\catcode`\\=\other @gdef@realbackslash{\}} % In Texinfo, backslash is an active character; it prints the backslash % in fixed width font. \catcode`\\=\active % @ for escape char from now on. % Print a typewriter backslash. For math mode, we can't simply use % \backslashcurfont: the story here is that in math mode, the \char % of \backslashcurfont ends up printing the roman \ from the math symbol % font (because \char in math mode uses the \mathcode, and plain.tex % sets \mathcode`\\="026E). Hence we use an explicit \mathchar, % which is the decimal equivalent of "715c (class 7, e.g., use \fam; % ignored family value; char position "5C). We can't use " for the % usual hex value because it has already been made active. @def@ttbackslash{{@tt @ifmmode @mathchar29020 @else @backslashcurfont @fi}} @let@backslashchar = @ttbackslash % @backslashchar{} is for user documents. % \otherbackslash defines an active \ to be a literal `\' character with % catcode other. @gdef@otherbackslash{@let\=@realbackslash} % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of % the literal character `\'. % {@catcode`- = @active @gdef@normalturnoffactive{% @passthroughcharstrue @let-=@normaldash @let"=@normaldoublequote @let$=@normaldollar %$ font-lock fix @let+=@normalplus @let<=@normalless @let>=@normalgreater @let^=@normalcaret @let_=@normalunderscore @let|=@normalverticalbar @let~=@normaltilde @let\=@ttbackslash @markupsetuplqdefault @markupsetuprqdefault @unsepspaces } } % If a .fmt file is being used, characters that might appear in a file % name cannot be active until we have parsed the command line. % So turn them off again, and have @fixbackslash turn them back on. @catcode`+=@other @catcode`@_=@other % \enablebackslashhack - allow file to begin `\input texinfo' % % If a .fmt file is being used, we don't want the `\input texinfo' to show up. % That is what \eatinput is for; after that, the `\' should revert to printing % a backslash. % If the file did not have a `\input texinfo', then it is turned off after % the first line; otherwise the first `\' in the file would cause an error. % This is used on the very last line of this file, texinfo.tex. % We also use @c to call @fixbackslash, in case ends of lines are hidden. { @catcode`@^=7 @catcode`@^^M=13@gdef@enablebackslashhack{% @global@let\ = @eatinput% @catcode`@^^M=13% @def@c{@fixbackslash@c}% % Definition for the newline at the end of this file. @def ^^M{@let^^M@secondlinenl}% % Definition for a newline in the main Texinfo file. @gdef @secondlinenl{@fixbackslash}% % In case the first line has a whole-line command on it @let@originalparsearg@parsearg @def@parsearg{@fixbackslash@originalparsearg} }} {@catcode`@^=7 @catcode`@^^M=13% @gdef@eatinput input texinfo#1^^M{@fixbackslash}} % Emergency active definition of newline, in case an active newline token % appears by mistake. {@catcode`@^=7 @catcode13=13% @gdef@enableemergencynewline{% @gdef^^M{% @par% %@par% }}} @gdef@fixbackslash{% @ifx\@eatinput @let\ = @ttbackslash @fi @catcode13=5 % regular end of line @enableemergencynewline @let@c=@comment @let@parsearg@originalparsearg % Also turn back on active characters that might appear in the input % file name, in case not using a pre-dumped format. @catcode`+=@active @catcode`@_=@active % % If texinfo.cnf is present on the system, read it. % Useful for site-wide @afourpaper, etc. This macro, @fixbackslash, gets % called at the beginning of every Texinfo file. Not opening texinfo.cnf % directly in this file, texinfo.tex, makes it possible to make a format % file for Texinfo. % @openin 1 texinfo.cnf @ifeof 1 @else @input texinfo.cnf @fi @closein 1 } % Say @foo, not \foo, in error messages. @escapechar = `@@ % These (along with & and #) are made active for url-breaking, so need % active definitions as the normal characters. @def@normaldot{.} @def@normalquest{?} @def@normalslash{/} % These look ok in all fonts, so just make them not special. % @hashchar{} gets its own user-level command, because of #line. @catcode`@& = @other @def@normalamp{&} @catcode`@# = @other @def@normalhash{#} @catcode`@% = @other @def@normalpercent{%} @let @hashchar = @normalhash @c Finally, make ` and ' active, so that txicodequoteundirected and @c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}. If we @c don't make ` and ' active, @code will not get them as active chars. @c Do this last of all since we use ` in the previous @catcode assignments. @catcode`@'=@active @catcode`@`=@active @markupsetuplqdefault @markupsetuprqdefault @c Local variables: @c eval: (add-hook 'before-save-hook 'time-stamp) @c page-delimiter: "^\\\\message\\|emacs-page" @c time-stamp-start: "def\\\\texinfoversion{" @c time-stamp-format: "%:y-%02m-%02d.%02H" @c time-stamp-end: "}" @c End: @c vim:sw=2: @enablebackslashhack wanderlust-wanderlust-769699d/doc/txi-en.tex000066400000000000000000000045151406661363500211050ustar00rootroot00000000000000% txi.en.tex -- English non-translations for texinfo.tex. This is read % when a source document says @documentlanguage en (which might happen % after another @documentlanguage). The actual values are the same as % the defaults. % % Copyright 1999, 2007, 2008 Free Software Foundation. % % 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 3 of the License, 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, see . \txisetlanguage{USenglish}{2}{3} \plainnonfrenchspacing \gdef\putwordAppendix{Appendix} \gdef\putwordChapter{Chapter} \gdef\putworderror{error} \gdef\putwordfile{file} \gdef\putwordin{in} \gdef\putwordIndexIsEmpty{(Index is empty)} \gdef\putwordIndexNonexistent{(Index is nonexistent)} \gdef\putwordInfo{Info} \gdef\putwordInstanceVariableof{Instance Variable of} \gdef\putwordMethodon{Method on} \gdef\putwordNoTitle{No Title} \gdef\putwordof{of} \gdef\putwordon{on} \gdef\putwordpage{page} \gdef\putwordsection{section} \gdef\putwordSection{Section} \gdef\putwordsee{see} \gdef\putwordSee{See} \gdef\putwordShortTOC{Short Contents} \gdef\putwordTOC{Table of Contents} % \gdef\putwordMJan{January} \gdef\putwordMFeb{February} \gdef\putwordMMar{March} \gdef\putwordMApr{April} \gdef\putwordMMay{May} \gdef\putwordMJun{June} \gdef\putwordMJul{July} \gdef\putwordMAug{August} \gdef\putwordMSep{September} \gdef\putwordMOct{October} \gdef\putwordMNov{November} \gdef\putwordMDec{December} % \gdef\putwordDefmac{Macro} \gdef\putwordDefspec{Special Form} \gdef\putwordDefvar{Variable} \gdef\putwordDefopt{User Option} \gdef\putwordDeffunc{Function} % Produces Day Month Year style of output. \def\today{% \number\day\space \ifcase\month \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec \fi \space\number\year} wanderlust-wanderlust-769699d/doc/txi-ja.tex000066400000000000000000000775461406661363500211130ustar00rootroot00000000000000% txi-ja.tex -- Japanese translations and font definitions for texinfo.tex. % % Copyright 1999, 2007, 2008, 2016, 2020 Free Software Foundation, Inc. % % 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 3 of the license, 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, see . % % Written by Masamichi Hosoda, 22 Apr 2020, \txisetlanguage{USenglish}{2}{3} \plainnonfrenchspacing \gdef\putwordAppendix{付録} \gdef\putwordChapter{章} \gdef\putworderror{エラー} \gdef\putwordfile{ファイル} \gdef\putwordin{の} \gdef\putwordIndexIsEmpty{(インデックスが空です)} \gdef\putwordIndexNonexistent{(インデックスがありません)} \gdef\putwordInfo{Info} \gdef\putwordInstanceVariableof{Instance Variable of} \gdef\putwordMethodon{Method on} \gdef\putwordNoTitle{無題} \gdef\putwordof{of} \gdef\putwordon{on} \gdef\putwordpage{ページ} \gdef\putwordsection{節} \gdef\putwordSection{節} \gdef\putwordsee{を参照} \gdef\putwordSee{を参照してください} \gdef\putwordShortTOC{簡単な目次} \gdef\putwordTOC{目次} % \gdef\putwordMJan{1月} \gdef\putwordMFeb{2月} \gdef\putwordMMar{3月} \gdef\putwordMApr{4月} \gdef\putwordMMay{5月} \gdef\putwordMJun{6月} \gdef\putwordMJul{7月} \gdef\putwordMAug{8月} \gdef\putwordMSep{9月} \gdef\putwordMOct{10月} \gdef\putwordMNov{11月} \gdef\putwordMDec{12月} % \gdef\putwordDefmac{マクロ} \gdef\putwordDefspec{特殊フォーム} \gdef\putwordDefvar{変数} \gdef\putwordDefopt{ユーザオプション} \gdef\putwordDeffunc{関数} % Produces Year Month Day style of output. \def\today{% \number\year 年\space \ifcase\month \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec \fi \space\number\day 日} % % Japanese font definitions % \ifx\txijapackage\thisisundefined \errmessage{Required CJK package is not found. Use `texinfo-ja.tex' instead of `texinfo.tex'} \else % % For LuaTeX % \ifx\luatexversion\thisisundefined \else % Definitions for a main text size of 11pt. (The default in Texinfo.) % Japanese font size is muliplied by 0.962216. \let\definealphabetictextfontsizexi\definetextfontsizexi \gdef\definetextfontsizexi{% % Search Japanese Mincho (serif) font \ifx\txijamcfont\thisisundefined \suppressfontnotfounderror=1 % Text font (11.2pt, magstep1). \jfont\textmc{file:HaranoAjiMincho-Regular.otf:jfm=ujis} at 10.78pt \suppressfontnotfounderror=0 % workaround for LuaTeX < 1.10 \ifx\textmc\nullfont \suppressfontnotfounderror=1 % Text font (11.2pt, magstep1). \jfont\textmc{file:ipaexm.ttf:jfm=ujis} at 10.78pt \suppressfontnotfounderror=0 \ifx\textmc\nullfont \errmessage{Could not find Japanese Mincho (serif) font} \else \gdef\txijamcfont{file:ipaexm.ttf:jfm=ujis} \fi \else \gdef\txijamcfont{file:HaranoAjiMincho-Regular.otf:jfm=ujis} \fi \else % Text font (11.2pt, magstep1). \jfont\textmc{\txijamcfont} at 10.78pt \fi % Search Japanese Gothic (sans-serif) font \ifx\txijagtfont\thisisundefined \suppressfontnotfounderror=1 % Text font (11.2pt, magstep1). \jfont\textgt{file:HaranoAjiGothic-Medium.otf:jfm=ujis} at 10.78pt \suppressfontnotfounderror=0 % workaround for LuaTeX < 1.10 \ifx\textgt\nullfont \suppressfontnotfounderror=1 % Text font (11.2pt, magstep1). \jfont\textgt{file:ipaexg.ttf:jfm=ujis} at 10.78pt \suppressfontnotfounderror=0 \ifx\textgt\nullfont \errmessage{Could not find Japanese Gothic (sans-serif) font} \else \gdef\txijagtfont{file:ipaexg.ttf:jfm=ujis} \fi \else \gdef\txijagtfont{file:HaranoAjiGothic-Medium.otf:jfm=ujis} \fi \else % Text font (11.2pt, magstep1). \jfont\textgt{\txijagtfont} at 10.78pt \fi % Fonts for indices, footnotes, small examples (9pt). \jfont\smallmc{\txijamcfont} at 8.66pt \jfont\smallgt{\txijagtfont} at 8.66pt % Fonts for small examples (8pt). \jfont\smallermc{\txijamcfont} at 7.70pt \jfont\smallergt{\txijagtfont} at 7.70pt % Fonts for title page (20.4pt): \jfont\titlemc{\txijamcfont} at 19.63pt \jfont\titlegt{\txijagtfont} at 19.63pt % Chapter (and unnumbered) fonts (17.28pt). \jfont\chapmc{\txijamcfont} at 16.63pt \jfont\chapgt{\txijagtfont} at 16.63pt % Section fonts (14.4pt). \jfont\secmc{\txijamcfont} at 13.86pt \jfont\secgt{\txijagtfont} at 13.86pt % Subsection fonts (13.15pt). \jfont\ssecmc{\txijamcfont} at 12.65pt \jfont\ssecgt{\txijagtfont} at 12.65pt % Reduced fonts for @acronym in text (10pt). \jfont\reducedmc{\txijamcfont} at 9.62pt \jfont\reducedgt{\txijagtfont} at 9.62pt % Fonts for short table of contents. \jfont\shortcontmc{\txijamcfont} at 11.55pt \jfont\shortcontgt{\txijagtfont} at 11.55pt \definealphabetictextfontsizexi } % Definitions for a main text size of 10pt. % Japanese font size is muliplied by 0.962216. \let\definealphabetictextfontsizex\definetextfontsizex \gdef\definetextfontsizex{% % Search Japanese Mincho (serif) font \ifx\txijamcfont\thisisundefined \suppressfontnotfounderror=1 % Text font (10pt). \jfont\textmc{file:HaranoAjiMincho-Regular.otf:jfm=ujis} at 9.62pt \suppressfontnotfounderror=0 % workaround for LuaTeX < 1.10 \ifx\textmc\nullfont \suppressfontnotfounderror=1 % Text font (10pt). \jfont\textmc{file:ipaexm.ttf:jfm=ujis} at 9.62pt \suppressfontnotfounderror=0 \ifx\textmc\nullfont \errmessage{Could not find Japanese Mincho (serif) font} \else \gdef\txijamcfont{file:ipaexm.ttf:jfm=ujis} \fi \else \gdef\txijamcfont{file:HaranoAjiMincho-Regular.otf:jfm=ujis} \fi \else % Text font (10pt). \jfont\textmc{\txijamcfont} at 9.62pt \fi % Search Japanese Gothic (sans-serif) font \ifx\txijagtfont\thisisundefined \suppressfontnotfounderror=1 % Text font (10pt). \jfont\textgt{file:HaranoAjiGothic-Medium.otf:jfm=ujis} at 9.62pt \suppressfontnotfounderror=0 % workaround for LuaTeX < 1.10 \ifx\textgt\nullfont \suppressfontnotfounderror=1 % Text font (10pt). \jfont\textgt{file:ipaexg.ttf:jfm=ujis} at 9.62pt \suppressfontnotfounderror=0 \ifx\textgt\nullfont \errmessage{Could not find Japanese Gothic (sans-serif) font} \else \gdef\txijagtfont{file:ipaexg.ttf:jfm=ujis} \fi \else \gdef\txijagtfont{file:HaranoAjiGothic-Medium.otf:jfm=ujis} \fi \else % Text font (10pt). \jfont\textgt{\txijagtfont} at 9.62pt \fi % Fonts for indices, footnotes, small examples (9pt). \jfont\smallmc{\txijamcfont} at 8.66pt \jfont\smallgt{\txijagtfont} at 8.66pt % Fonts for small examples (8pt). \jfont\smallermc{\txijamcfont} at 7.70pt \jfont\smallergt{\txijagtfont} at 7.70pt % Fonts for title page (20.4pt): \jfont\titlemc{\txijamcfont} at 19.63pt \jfont\titlegt{\txijagtfont} at 19.63pt % Chapter fonts (14.4pt). \jfont\chapmc{\txijamcfont} at 13.86pt \jfont\chapgt{\txijagtfont} at 13.86pt % Section fonts (12pt). \jfont\secmc{\txijamcfont} at 11.55pt \jfont\secgt{\txijagtfont} at 11.55pt % Subsection fonts (10pt). \jfont\ssecmc{\txijamcfont} at 9.62pt \jfont\ssecgt{\txijagtfont} at 9.62pt % Reduced fonts for @acronym in text (9pt). \jfont\reducedmc{\txijamcfont} at 8.66pt \jfont\reducedgt{\txijagtfont} at 8.66pt % Fonts for short table of contents. \jfont\shortcontmc{\txijamcfont} at 11.55pt \jfont\shortcontgt{\txijagtfont} at 11.55pt \definealphabetictextfontsizex } % Ignore LuaTeX-ja added line end comment % https://osdn.jp/ticket/browse.php?group_id=5593&tid=36096 % % Re-define texinfo.tex's \parseargusing \def\parseargusing#1#2{% \def\argtorun{#2}% \begingroup \ifx\ltjlineendcomment\thisisundefined % Ignore U+FFFFF for LuaTeX-ja <= 20160208.0 \catcode"FFFFF=9 \else % Ignore the character \ltjlineendcomment for LuaTeX-ja > 20160208.0 \catcode\ltjlineendcomment=9 \fi \obeylines \spaceisspace #1% \parseargline\empty% Insert the \empty token, see \finishparsearg below. } % Re-define texinfo.tex's \c \def\c{\begingroup \catcode`\^^M=\active% \ifx\ltjlineendcomment\thisisundefined % Ignore U+FFFFF for LuaTeX-ja <= 20160208.0 \catcode"FFFFF=9% \else % Ignore the character \ltjlineendcomment for LuaTeX-ja > 20160208.0 \catcode\ltjlineendcomment=9% \fi \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% \cxxx} % Re-let \c related macro \let\comment=\c % Re-let \comment related macros \let\setfilename=\comment \let\dircategory=\comment \let\definfoenclose=\comment \let\footnotestyle=\comment \fi % LuaTeX % % For XeTeX % \ifx\XeTeXrevision\thisisundefined \else % Fix some Japanese character class % (unicode-letters.tex is wrong.) \def\do#1{\XeTeXcharclass"#1=1 } \do{3041}\do{3043}\do{3045}\do{3047}\do{3049}\do{3063} \do{3083}\do{3085}\do{3087}\do{308E}\do{3095}\do{3096} \do{30A1}\do{30A3}\do{30A5}\do{30A7}\do{30A9}\do{30C3} \do{30E3}\do{30E5}\do{30E7}\do{30EE}\do{30F5}\do{30F6} \do{30FC}\do{31F0}\do{31F1}\do{31F2}\do{31F3}\do{31F4} \do{31F5}\do{31F6}\do{31F7}\do{31F8}\do{31F9}\do{31FA} \do{31FB}\do{31FC}\do{31FD}\do{31FE}\do{31FF} % Add some character class \do{2015}\do{2016}\do{2025}\do{2030}\do{2032}\do{2033} \do{203B}\do{2103}\do{212B} \do{2500}\do{2501}\do{2502}\do{2503}\do{250C}\do{250F} \do{2510}\do{2513}\do{2514}\do{2517}\do{2518}\do{251B} \do{251C}\do{251D}\do{2520}\do{2523}\do{2524}\do{2525} \do{2528}\do{252B}\do{252C}\do{252F}\do{2530}\do{2533} \do{2534}\do{2537}\do{2538}\do{253B}\do{253C}\do{253F} \do{2542}\do{254B} \do{25A0}\do{25A1}\do{25B2}\do{25B3}\do{25BC}\do{25BD} \do{25C6}\do{25C7}\do{25CB}\do{25CE}\do{25CF}\do{25EF} \do{2605}\do{2606}\do{2640}\do{2642} \do{3000} % Setting Japanese font instead of Chinese font \def\setjafont#1{% \let\zhfont#1\let\zhpunctfont#1% \let\zhextafont#1\let\zhextbfont#1% } % Definitions for a main text size of 11pt. (The default in Texinfo.) % Japanese font size is muliplied by 0.962216. \let\definealphabetictextfontsizexi\definetextfontsizexi \gdef\definetextfontsizexi{% % Search Japanese Mincho (serif) font \ifx\txijamcfont\thisisundefined \suppressfontnotfounderror=1 % Text font (11.2pt, magstep1). \font\textmczzz"[HaranoAjiMincho-Regular.otf]:mapping=tex-text" at 10.78pt \ifx\textmczzz\nullfont % Text font (11.2pt, magstep1). \font\textmczzz"[ipaexm.ttf]:mapping=tex-text" at 10.78pt \ifx\textmczzz\nullfont \errmessage{Could not find Japanese Mincho (serif) font} \else \gdef\txijamcfont{[ipaexm.ttf]:mapping=tex-text} \fi \else \gdef\txijamcfont{[HaranoAjiMincho-Regular.otf]:mapping=tex-text} \fi \suppressfontnotfounderror=0 \else % Text font (11.2pt, magstep1). \font\textmczzz"\txijamcfont" at 10.78pt \fi % Search Japanese Gothic (sans-serif) font \ifx\txijagtfont\thisisundefined \suppressfontnotfounderror=1 % Text font (11.2pt, magstep1). \font\textgtzzz"[HaranoAjiGothic-Medium.otf]:mapping=tex-text" at 10.78pt \ifx\textgtzzz\nullfont % Text font (11.2pt, magstep1). \font\textgtzzz"[ipaexg.ttf]:mapping=tex-text" at 10.78pt \ifx\textgtzzz\nullfont \errmessage{Could not find Japanese Gothic (sans-serif) font} \else \gdef\txijagtfont{[ipaexg.ttf]:mapping=tex-text} \fi \else \gdef\txijagtfont{[HaranoAjiGothic-Medium.otf]:mapping=tex-text} \fi \suppressfontnotfounderror=0 \else % Text font (11.2pt, magstep1). \font\textgtzzz"\txijagtfont" at 10.78pt \fi % Text fonts (11.2pt, magstep1). \def\textmc{\setjafont\textmczzz} \def\textgt{\setjafont\textgtzzz} % Fonts for indices, footnotes, small examples (9pt). \font\smallmczzz"\txijamcfont" at 8.66pt \font\smallgtzzz"\txijagtfont" at 8.66pt \def\smallmc{\setjafont\smallmczzz} \def\smallgt{\setjafont\smallgtzzz} % Fonts for small examples (8pt). \font\smallermczzz"\txijamcfont" at 7.70pt \font\smallergtzzz"\txijagtfont" at 7.70pt \def\smallermc{\setjafont\smallermczzz} \def\smallergt{\setjafont\smallergtzzz} % Fonts for title page (20.4pt): \font\titlemczzz"\txijamcfont" at 19.63pt \font\titlegtzzz"\txijagtfont" at 19.63pt \def\titlemc{\setjafont\titlemczzz} \def\titlegt{\setjafont\titlegtzzz} % Chapter (and unnumbered) fonts (17.28pt). \font\chapmczzz"\txijamcfont" at 16.63pt \font\chapgtzzz"\txijagtfont" at 16.63pt \def\chapmc{\setjafont\chapmczzz} \def\chapgt{\setjafont\chapgtzzz} % Section fonts (14.4pt). \font\secmczzz"\txijamcfont" at 13.86pt \font\secgtzzz"\txijagtfont" at 13.86pt \def\secmc{\setjafont\secmczzz} \def\secgt{\setjafont\secgtzzz} % Subsection fonts (13.15pt). \font\ssecmczzz"\txijamcfont" at 12.65pt \font\ssecgtzzz"\txijagtfont" at 12.65pt \def\ssecmc{\setjafont\ssecmczzz} \def\ssecgt{\setjafont\ssecgtzzz} % Reduced fonts for @acronym in text (10pt). \font\reducedmczzz"\txijamcfont" at 9.62pt \font\reducedgtzzz"\txijagtfont" at 9.62pt \def\reducedmc{\setjafont\reducedmczzz} \def\reducedgt{\setjafont\reducedgtzzz} % Fonts for short table of contents. \font\shortcontmczzz"\txijamcfont" at 11.55pt \font\shortcontgtzzz"\txijagtfont" at 11.55pt \def\shortcontmc{\setjafont\shortcontmczzz} \def\shortcontgt{\setjafont\shortcontgtzzz} \definealphabetictextfontsizexi } % Definitions for a main text size of 10pt. % Japanese font size is muliplied by 0.962216. \let\definealphabetictextfontsizex\definetextfontsizex \gdef\definetextfontsizex{% % Search Japanese Mincho (serif) font \ifx\txijamcfont\thisisundefined \suppressfontnotfounderror=1 % Text font (10pt). \font\textmczzz"[HaranoAjiMincho-Regular.otf]:mapping=tex-text" at 9.62pt \ifx\textmczzz\nullfont % Text font (10pt). \font\textmczzz"[ipaexm.ttf]:mapping=tex-text" at 9.62pt \ifx\textmczzz\nullfont \errmessage{Could not find Japanese Mincho (serif) font} \else \gdef\txijamcffont{[ipaexm.ttf]:mapping=tex-text} \fi \else \gdef\txijamcfont{[HaranoAjiMincho-Regular.otf]:mapping=tex-text} \fi \suppressfontnotfounderror=0 \else % Text font (10pt). \font\textmczzz"\txijamcfont" at 9.62pt \fi % Search Japanese Gothic (sans-serif) font \ifx\txijagtfont\thisisundefined \suppressfontnotfounderror=1 % Text font (10pt). \font\textgtzzz"[HaranoAjiGothic-Medium.otf]:mapping=tex-text" at 9.62pt \ifx\textgtzzz\nullfont % Text font (10pt). \font\textgtzzz"[ipaexg.ttf]:mapping=tex-text" at 9.62pt \ifx\textgtzzz\nullfont \errmessage{Could not find Japanese Gothic (sans-serif) font} \else \gdef\txijagtffont{[ipaexg.ttf]:mapping=tex-text} \fi \else \gdef\txijagtfont{[HaranoAjiGothic-Medium.otf]:mapping=tex-text} \fi \suppressfontnotfounderror=0 \else % Text font (10pt). \font\textgtzzz"\txijagtfont" at 9.62pt \fi % Text fonts (10pt). \def\textmc{\setjafont\textmczzz} \def\textgt{\setjafont\textgtzzz} % Fonts for indices, footnotes, small examples (9pt). \font\smallmczzz"\txijamcfont" at 8.66pt \font\smallgtzzz"\txijagtfont" at 8.66pt \def\smallmc{\setjafont\smallmczzz} \def\smallgt{\setjafont\smallgtzzz} % Fonts for small examples (8pt). \font\smallermczzz"\txijamcfont" at 7.70pt \font\smallergtzzz"\txijagtfont" at 7.70pt \def\smallermc{\setjafont\smallermczzz} \def\smallergt{\setjafont\smallergtzzz} % Fonts for title page (20.4pt): \font\titlemczzz"\txijamcfont" at 19.63pt \font\titlegtzzz"\txijagtfont" at 19.63pt \def\titlemc{\setjafont\titlemczzz} \def\titlegt{\setjafont\titlegtzzz} % Chapter fonts (14.4pt). \font\chapmczzz"\txijamcfont" at 13.86pt \font\chapgtzzz"\txijagtfont" at 13.86pt \def\chapmc{\setjafont\chapmczzz} \def\chapgt{\setjafont\chapgtzzz} % Section fonts (12pt). \font\secmczzz"\txijamcfont" at 11.55pt \font\secgtzzz"\txijagtfont" at 11.55pt \def\secmc{\setjafont\secmczzz} \def\secgt{\setjafont\secgtzzz} % Subsection fonts (10pt). \font\ssecmczzz"\txijamcfont" at 9.62pt \font\ssecgtzzz"\txijagtfont" at 9.62pt \def\ssecmc{\setjafont\ssecmczzz} \def\ssecgt{\setjafont\ssecgtzzz} % Reduced fonts for @acronym in text (9pt). \font\reducedmczzz"\txijamcfont" at 8.66pt \font\reducedgtzzz"\txijagtfont" at 8.66pt \def\reducedmc{\setjafont\reducedmczzz} \def\reducedgt{\setjafont\reducedgtzzz} % Fonts for short table of contents. \font\shortcontmczzz"\txijamcfont" at 11.55pt \font\shortcontgtzzz"\txijagtfont" at 11.55pt \def\shortcontmc{\setjafont\shortcontmczzz} \def\shortcontgt{\setjafont\shortcontgtzzz} \definealphabetictextfontsizex } % Japanese line break settings \XeTeXlinebreaklocale "ja_JP" \XeTeXlinebreakskip=0em plus 0.1em minus 0.01em \XeTeXlinebreakpenalty=0 % For copy & paste Unicode characters (XeTeX 0.99995 - 0.99998) \ifx\XeTeXgenerateactualtext\thisisundefined \else % XeTeX 0.99999+ doesn't need this workaround. \ifnum\strcmp{\the\XeTeXversion\XeTeXrevision}{0.99999}<0 \XeTeXgenerateactualtext=1 \fi \fi \fi % XeTeX \iftxinativeunicodecapable % Sync fonts \let\alphabeticrm\rm \gdef\rm{\alphabeticrm\tenmc} \let\alphabeticit\it \gdef\it{\alphabeticit\tenmc} \let\alphabeticsl\sl \gdef\sl{\alphabeticsl\tengt} \let\alphabeticbf\bf \gdef\bf{\alphabeticbf\tengt} \let\alphabetictt\tt \gdef\tt{\alphabetictt\tengt} % Add fonts \let\alphabetictextfonts\textfonts \gdef\textfonts{% \alphabetictextfonts \let\tenmc\textmc \let\tengt\textgt } \let\alphabetictitlefonts\titlefonts \gdef\titlefonts{% \alphabetictitlefonts \let\tenmc\titlemc \let\tengt\titlegt } \let\alphabeticchapfonts\chapfonts \gdef\chapfonts{% \alphabeticchapfonts \let\tenmc\chapmc \let\tengt\chapgt } \let\alphabeticsecfonts\secfonts \gdef\secfonts{% \alphabeticsecfonts \let\tenmc\secmc \let\tengt\secgt } \let\alphabeticsubsecfonts\subsecfonts \gdef\subsecfonts{% \alphabeticsubsecfonts \let\tenmc\ssecmc \let\tengt\ssecgt } \global\let\subsubsecfonts\subsecfonts \let\alphabeticreducedfonts\reducedfonts \gdef\reducedfonts{% \alphabeticreducedfonts \let\tenmc\reducedmc \let\tengt\reducedgt } \let\alphabeticsmallfonts\smallfonts \gdef\smallfonts{% \alphabeticsmallfonts \let\tenmc\smallmc \let\tengt\smallgt } \let\alphabeticsmallerfonts\smallerfonts \gdef\smallerfonts{% \alphabeticsmallerfonts \let\tenmc\smallermc \let\tengt\smallergt } \let\smallexamplefonts\smallfonts % Reset fonts \globaldefs = 1 \definetextfontsizexi \globaldefs = 0 \fi % \iftxinativeunicodecapable \fi % \ifx\txijapackage\thisisundefined %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 日本語表記の改善 % 1. ヘッドの章の表記 % 2. See 訳語に合わせて動詞の後置 % 3. クロスレファレンスの表記 % 4. @dfn の表記 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 1. ヘッドの章の表記 \gdef\Ynumbered{% \ifnum\secno=0 第\the\chapno\putwordChapter% \else \ifnum\subsecno=0 \the\chapno.\the\secno\putwordSection% \else \ifnum\subsubsecno=0 \the\chapno.\the\secno.\the\subsecno\putwordSection% \else \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno\putwordSection% \fi\fi\fi } \gdef\Yappendix{% \ifnum\secno=0 \putwordAppendix@tie @char\the\appendixno{}% \else \ifnum\subsecno=0 @char\the\appendixno.\the\secno\putwordSection% \else \ifnum\subsubsecno=0 @char\the\appendixno.\the\secno.\the\subsecno\putwordSection% \else @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno\putwordSection% \fi\fi\fi } \gdef\chapmacro#1#2#3{% \expandafter\ifx\thisenv\titlepage\else \checkenv{}% chapters, etc., should not start inside an environment. \fi % Insert the first mark before the heading break (see notes for \domark). \let\prevchapterdefs=\currentchapterdefs \let\prevsectiondefs=\currentsectiondefs \gdef\currentsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}% \gdef\thissection{}}% % \def\temptype{#2}% \ifx\temptype\Ynothingkeyword \gdef\currentchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{\thischaptername}}% \else\ifx\temptype\Yomitfromtockeyword \gdef\currentchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{}}% \else\ifx\temptype\Yappendixkeyword \toks0={#1}% \xdef\currentchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\appendixletter}% % \noexpand\putwordAppendix avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thischapter{\noexpand\putwordAppendix{} \noexpand\thischapternum: \noexpand\thischaptername}% }% \else \toks0={#1}% \xdef\currentchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\the\chapno}% % \noexpand\putwordChapter avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thischapter{第\noexpand\thischapternum% \noexpand\putwordChapter{}\space% \noexpand\thischaptername}% }% \fi\fi\fi % % Output the mark. Pass it through \safewhatsit, to take care of % the preceding space. \safewhatsit\domark % % Insert the chapter heading break. \pchapsepmacro % % Now the second mark, after the heading break. No break points % between here and the heading. \let\prevchapterdefs=\currentchapterdefs \let\prevsectiondefs=\currentsectiondefs \domark % {% \chapfonts \rm \let\footnote=\errfootnoteheading % give better error message % % Have to define \currentsection before calling \donoderef, because the % xref code eventually uses it. On the other hand, it has to be called % after \pchapsepmacro, or the headline will change too soon. \gdef\currentsection{#1}% % % Only insert the separating space if we have a chapter/appendix % number, and don't print the unnumbered ``number''. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unnchap}% \else\ifx\temptype\Yomitfromtockeyword \setbox0 = \hbox{}% contents like unnumbered, but no toc entry \def\toctype{omit}% \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% \def\toctype{app}% \else \setbox0 = \hbox{#3\enspace}% \def\toctype{numchap}% \fi\fi\fi % % Write the toc entry for this chapter. Must come before the % \donoderef, because we include the current node name in the toc % entry, and \donoderef resets it to empty. \writetocentry{\toctype}{#1}{#3}% % % For pdftex, we have to write out the node definition (aka, make % the pdfdest) after any page break, but before the actual text has % been typeset. If the destination for the pdf outline is after the % text, then jumping from the outline may wind up with the text not % being visible, for instance under high magnification. \donoderef{#2}% % % Typeset the actual heading. \nobreak % Avoid page breaks at the interline glue. \vbox{\raggedtitlesettings \hangindent=\wd0 \centerparametersmaybe \unhbox0 #1\par}% }% \nobreak\bigskip % no page break after a chapter title \nobreak } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 2. See 訳語に合わせて動詞の後置 \global\def\inforefzzz #1,#2,#3,#4**{\putwordInfo{}\putwordfile{} \file{\ignorespaces #3{}}, ノード\samp{\ignorespaces#1{}}\putwordSee{}} \gdef\pxref#1{\xrefXX{#1}\putwordsee{}} \gdef\xref#1{\xrefXX{#1}\putwordSee{}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 3. クロスレファレンスの表記 \gdef\xrefprintnodename#1#2#3{「#1」} \gdef\crossmanualxref#1{% \setbox\toprefbox = \hbox{Top\kern7sp}% \setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}% #1% \ifdim \wd2 > 7sp % nonempty? \ifdim \wd2 = \wd\toprefbox \else % same as Top? \space\putwordin\space ``\printedrefname'' \putwordSection{}\space \fi% \fi% } \gdef\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup \unsepspaces % % Get args without leading/trailing spaces. \def\printedrefname{\ignorespaces #3}% \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}% % \def\infofilename{\ignorespaces #4}% \setbox\infofilenamebox = \hbox{\infofilename\unskip}% % \def\printedmanual{\ignorespaces #5}% \setbox\printedmanualbox = \hbox{\printedmanual\unskip}% % % If the printed reference name (arg #3) was not explicitly given in % the @xref, figure out what we want to use. \ifdim \wd\printedrefnamebox = 0pt % No printed node name was explicitly given. \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax % Not auto section-title: use node name inside the square brackets. \def\printedrefname{\ignorespaces #1}% \else % Auto section-title: use chapter/section title inside % the square brackets if we have it. \ifdim \wd\printedmanualbox > 0pt % It is in another manual, so we don't have it; use node name. \def\printedrefname{\ignorespaces #1}% \else \ifhavexrefs % We (should) know the real title if we have the xref values. \def\printedrefname{\refx{#1-title}{}}% \else % Otherwise just copy the Info node name. \def\printedrefname{\ignorespaces #1}% \fi% \fi \fi \fi % % Make link in pdf output. \ifpdf {\indexnofonts \turnoffactive \makevalueexpandable % This expands tokens, so do it after making catcode changes, so _ % etc. don't get their TeX definitions. This ignores all spaces in % #4, including (wrongly) those in the middle of the filename. \getfilename{#4}% % % This (wrongly) does not take account of leading or trailing % spaces in #1, which should be ignored. \edef\pdfxrefdest{#1}% \ifx\pdfxrefdest\empty \def\pdfxrefdest{Top}% no empty targets \else \txiescapepdf\pdfxrefdest % escape PDF special chars \fi % \leavevmode \startlink attr{/Border [0 0 0]}% \ifnum\filenamelength>0 goto file{\the\filename.pdf} name{\pdfxrefdest}% \else goto name{\pdfmkpgn{\pdfxrefdest}}% \fi }% \setcolor{\linkcolor}% \fi {% % Have to otherify everything special to allow the \csname to % include an _ in the xref name, etc. \indexnofonts \turnoffactive \expandafter\global\expandafter\let\expandafter\Xthisreftitle \csname XR#1-title\endcsname }% % % Float references are printed completely differently: "Figure 1.2" % instead of "[somenode], p.3". \iffloat distinguishes them by % \Xthisreftitle being set to a magic string. \iffloat\Xthisreftitle % % If the user also gave the printed manual name (fifth arg), append % "in MANUALNAME". \ifdim \wd\printedmanualbox > 0pt \cite{\printedmanual} \space \putwordin{}% \fi % If the user specified the print name (third arg) to the ref, % print it instead of our usual "Figure 1.2". \ifdim\wd\printedrefnamebox = 0pt \refx{#1-snt}{}% \else \printedrefname \fi \else % node/anchor (non-float) references. % % If we use \unhbox to print the node names, TeX does not insert % empty discretionaries after hyphens, which means that it will not % find a line break at a hyphen in a node names. Since some manuals % are best written with fairly long node names, containing hyphens, % this is a loss. Therefore, we give the text of the node name % again, so it is as if TeX is seeing it for the first time. % \ifdim \wd\printedmanualbox > 0pt % Cross-manual reference with a printed manual name. % \crossmanualxref{\cite{\printedmanual\unskip}}% % \else\ifdim \wd\infofilenamebox > 0pt % Cross-manual reference with only an info filename (arg 4), no % printed manual name (arg 5). This is essentially the same as % the case above; we output the filename, since we have nothing else. % \crossmanualxref{\code{\infofilename\unskip}}% % \else % Reference within this manual. % % _ (for example) has to be the character _ for the purposes of the % control sequence corresponding to the node, but it has to expand % into the usual \leavevmode...\vrule stuff for purposes of % printing. So we \turnoffactive for the \refx-snt, back on for the % printing, back off for the \refx-pg. {\turnoffactive % Only output a following space if the -snt ref is nonempty; for % @unnumbered and @anchor, it won't be. \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi }% % output the `[mynode]' via the macro below so it can be overridden. \xrefprintnodename\printedrefname % % But we always want a comma and a space: ,\space % % output the `page 3'. \turnoffactive (\refx{#1-pg}{}\tie\putwordpage)% % Add a , if xref followed by a space \if\space\noexpand\tokenafterxref ,% \else\ifx\ \tokenafterxref ,% @TAB \else\ifx\*\tokenafterxref ,% @* \else\ifx\ \tokenafterxref ,% @SPACE \else\ifx\ \tokenafterxref ,% @NL \else\ifx\tie\tokenafterxref ,% @tie \fi\fi\fi\fi\fi\fi \fi\fi \fi \endlink \endgroup} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 4. @dfn の表記 \gdef\doublebracket#1{『#1』} \global\let\dfn=\doublebracket wanderlust-wanderlust-769699d/doc/version.tex000066400000000000000000000000331406661363500213550ustar00rootroot00000000000000\def\versionnumber{2.15.9} wanderlust-wanderlust-769699d/doc/version.texi000066400000000000000000000000241406661363500215260ustar00rootroot00000000000000@set VERSION 2.15.9 wanderlust-wanderlust-769699d/doc/wl-ja.texi000066400000000000000000012767011406661363500210750ustar00rootroot00000000000000\input texinfo-ja @c -*-texinfo -*- coding: utf-8 -*- @c %**start of header @setfilename wl-ja.info @settitle Wanderlust -- Yet Another Message Interface On Emacsen -- @c %**end of header @documentlanguage ja @documentencoding utf-8 @include version.texi @synindex pg cp @finalout @dircategory GNU Emacs Lisp @direntry * Wanderlust-ja: (wl-ja). Yet Another Message Interface On Emacsen @end direntry @c permissions text appears in an Info file before the first node. @ifinfo This file documents Wanderlust, Yet another message interface on Emacsen. このファイルは Emacs で動くメール/ニュース管理システム Wanderlust に関す る説明書です。 Copyright @copyright{} 1998, 1999, 2000, 2001, 2002 @w{Yuuichi Teranishi}, @w{Fujikazu Okunishi}, @w{Masahiro Murata}, @w{Kenichi Okada}, @w{Kaoru Takahashi}, @w{Katsumi Yamaoka}, @w{Hiroya Murata} and @w{Yoichi Nakayama}. This edition is for Wanderlust version @value{VERSION}. この版は Wanderlust version @value{VERSION} に対応します。 Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. 著作権表示とこの許可文がすべての複製に存在する限り、この説明書のまったく 同一の複製を作り、配布することを許可する。 @ignore Permission is granted to process this file through TeX and print the results, provided the printed document carries copying permission notice identical to this one except for the removal of this paragraph (this paragraph not being relevant to the printed manual). この段落が取り除かれているのを除き、これと同じ複製に関する許可文が表示さ れている限り、このファイルを TeX にかけて、その結果を印刷することを許可 する(この段落は印刷されたマニュアルでは参照されません)。 @end ignore Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. 同一複製の条件の下で、それによって得られた結果もこの許可文の表示と同一の 条件のもとで配布する限り、この説明書の修正版の複製をし、配布することを許 可する。 Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions. 上記の修正版に関する条件の下で、この説明書の翻訳の複製を作り、配布するこ とを許可する。 @end ifinfo @titlepage @sp 10 @title Wanderlust ユーザマニュアル @subtitle Yet another message interface on Emacsen @subtitle for Wanderlust version @value{VERSION} @author 寺西裕一 @author 奥西藤和 @author 村田全寛 @author 岡田健一 @author 高橋 郁 @author 山岡克美 @author 村田浩也 @author 中山洋一 @page @vskip 0pt plus 1filll Copyright @copyright{} 1998, 1999, 2000, 2001, 2002 @w{Yuuichi Teranishi}, @w{Fujikazu Okunishi}, @w{Masahiro Murata}, @w{Kenichi Okada}, @w{Kaoru Takahashi}, @w{Katsumi Yamaoka}, @w{Hiroya Murata} and @w{Yoichi Nakayama}. This manual is for Wanderlust version @value{VERSION}. このマニュアルは Wanderlust version @value{VERSION} に対応します。 Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. 著作権表示とこの許可文がすべての複製に存在する限り、この説明書のまったく 同一の複製を作り、配布することを許可する。 Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. 同一複製の条件の下で、それによって得られた結果をこの許可文の表示と同一の 条件のもとで配布する限り、この説明書の修正版の複製をし、配布することを許 可する。 Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions. 上記の修正版に関する条件の下で、この説明書の翻訳の複製を作り、配布するこ とを許可する。 @end titlepage @ifinfo @node Top, Introduction, (dir), (dir) @top Wanderlust ユーザマニュアル @flushright 寺西裕一 奥西藤和 村田全寛 岡田健一 高橋 郁 山岡克美 村田浩也 中山洋一 @end flushright この文書は Wanderlust @value{VERSION} に対応します。 @end ifinfo @menu * Introduction:: はじめに * Start Me Up:: Wanderlust を起動する * Folders:: Wanderlust で扱えるフォルダたち * Folder:: フォルダモード * Summary:: サマリモード * Message:: メッセージバッファ * Draft:: ドラフトバッファ * Disconnected Operations:: オフライン処理 * Expire and Archive:: メッセージの自動削除とアーカイブ * Scoring:: メッセージのスコア * Address Book:: アドレス帳 * Quick Search:: Quickly search your mail archive * Spam Filter:: Spam フィルタ * Advanced Issues:: より進んだ使い方 * Migration:: 旧バージョンからの移行 * Terminology:: 用語の解説 * Mailing List:: メーリングリスト * Addition:: おまけ * Index:: 索引 @end menu @node Introduction, Start Me Up, Top, Top @chapter はじめに @cindex Introduction Wanderlust は Emacs で動くメール/ニュース管理システムです。 IMAP4rev1(RFC2060), NNTP, POP およびローカルのメッセージに対応しています。 Wanderlust の主な特徴/特長は以下の通りです。 @itemize @minus @item elisp のみによる実装。 @item IMAP4rev1, NNTP, POP(POP3/APOP), MH, Maildir 形式のサポート。 @item Mew っぽい Folder Specification に基づくメッセージへの統一的アクセス。 @item Mew っぽいキーバインドとマーク処理。 @item 未読管理。 @item インタラクティブなスレッド表示。 @item 購読フォルダの一覧を表示するフォルダモード。 @item メッセージキャッシュ、Disconnected Operation。 @item MH 的 FCC。(@samp{Fcc: %Backup} や @samp{Fcc: $Backup} も可)。 @item MIME 対応 (by SEMI)。 @item ニュース/メールの送信を統合したメッセージ送信ドラフト。 @item フォルダ一覧のアイコン表示。 @item 大きなパートを取り寄せずに表示(IMAP4)。 @item メッセージの検索をサーバ側で実行(IMAP4)。日本語検索も可。 @item 仮想フォルダ。 @item 多い日も安心の、マルチアーカイバ対応圧縮フォルダ。 @item フォルダ中の古い記事を自動的にアーカイブ/削除して整理する expire 機能。 @item 自動リファイル。 @item 定型メッセージの送信に便利なテンプレート機能。 @end itemize @section 動作環境 Wanderlust は以下の Emacsen で動作することが確認されています。 @itemize @bullet @item Emacs 24.5 以降 @end itemize Wanderlust から利用できると確認されている IMAP サーバは以下の通りです。 @itemize @bullet @item UW imapd 4.1〜4.7, 4.7a, 4.7b, 4.7c, 2000 以降 @item Cyrus imapd 1.4, 1.5.19, 1.6.22〜1.6.24, 2.0.5 以降 @item Courier-IMAP 1.3.2 以降 @item AIR MAIL (AIRC imapd release 2.00) @item Express Mail @item Microsoft Exchange Server 5.5 @item Sun Internet Mail Server 3.5, 3.5.alpha, 4.0 @end itemize Wanderlust から利用できると確認されている LDAP サーバは以下の通りです。 @itemize @bullet @item OpenLDAP 2.0.6 以降 @end itemize @node Start Me Up, Folders, Introduction, Top @chapter Wanderlust を起動する @cindex Start up Wanderlust を起動するまでに必要な手順を順番に説明します。 (当然のことながら、これらよりも先に、メール/ニュースを読むことのできる環 境があらかじめ必要です。) @menu * MIME Modules:: MIME 用モジュールのインストール * Download:: パッケージの入手と展開 * Install:: バイトコンパイルとインストール * Minimal Settings:: @file{.emacs} の設定 * Folder Definition:: 購読するフォルダの定義 * Start Wanderlust:: Wanderlust の起動 * Overview:: 概観 @end menu @node MIME Modules, Download, Start Me Up, Start Me Up @section MIME 用モジュールのインストール @cindex MIME modules @pindex APEL @pindex FLIM @pindex SEMI Wanderlust を使うためには、APEL, FLIM, SEMI のバリアントである、 APEL-LB, FLIM-LB, SEMI-EPG と呼ばれるパッケージが必要です。 @example @group APEL-LB: @uref{https://github.com/wanderlust/apel} FLIM-LB: @uref{https://github.com/wanderlust/flim} SEMI-EPG: @uref{https://github.com/wanderlust/semi} @end group @end example オリジナルの APEL, FLIM, SEMI は以下の場所からダウンロードできます。 @example @group APEL: @uref{http://git.chise.org/elisp/dist/semi/} FLIM: @uref{http://git.chise.org/elisp/dist/apel/} SEMI: @uref{http://git.chise.org/elisp/dist/semi/} @end group @end example APEL-LB, FLIM-LB, SEMI-EPG の順にインストールしてください。 基本的にすべて @samp{make install} の実行で済むはずです。 インストールの方法の詳細については、各パッケージに添付されているドキュメ ントを参照してください。 APEL-LB, FLIM-LB もしくは SEMI-EPG のバージョンアップを行った場合は、 Wanderlust をインストールし直してください。 @node Download, Install, MIME Modules, Start Me Up @section パッケージの入手と展開 @cindex Download Wanderlust 本体は以下の場所からダウンロードできます。 一次配布元: @example @uref{https://github.com/wanderlust/wanderlust} @end example ミラーしていただいている ftp, http サイト: @example @group @uref{http://www.jpl.org/ftp/pub/github-snapshots/} @end group @end example 入手したパッケージは適当な作業ディレクトリに展開しましょう。 @example @group % cd ~/work % tar zxvf wl-@var{version}.tar.gz % cd wl-@var{version} @end group @end example @subsection SSL (Secure Socket Layer) の利用 @cindex SSL @pindex OpenSSL @pindex starttls Wanderlust では、SMTP, IMAP, NNTP, POP のコネクションにおいて、SSL (Secure Socket Layer) を使用でき、Emacs 24 以降でサポートされた 組み込み GnuTLS が利用可能な場合はそれを使います。 SSL の利用形態には、コネクションと同時に SSL negotiation を始めるものと、 @command{STARTTLS} command の後に SSL negotiation を始めるものの二種類 があります。 組み込み GnuTLS が利用不能な場合、前者については @file{tls.el} が存在すれば それを使います。この時に GnuTLS に含まれる @command{gnutls-cli} にパスが 通っている必要があります。どちらもない場合は、本パッケージの @file{utils} ディレクトリにある@file{ssl.el} をインストールする必要があ ります。なおかつ、OpenSSL に含まれる @command{openssl} にパスが通ってい る必要があります。 後者については、組み込み GnuTLS が利用不能な場合は @file{starttls.el} が 必要になります。 また、変数 @code{starttls-use-gnutls} の値によって、GnuTLS もしくは starttls パッケージが必要です。 @file{starttls.el} が無い、もしくは @file{starttls.el} 内に @code{starttls-use-gnutls} の定義が無い場合は starttls パッケージを インストールする必要があります。 starttls パッケージは以下の場所から入手できます。 @example @uref{ftp://opaopa.org/pub/elisp/} @end example @node Install, Minimal Settings, Download, Start Me Up @section バイトコンパイルとインストール @cindex Bytecompile @cindex Compile @cindex Install @cindex Makefile @cindex Make @subsection 通常のインストール @file{Makefile} の @code{LISPDIR}, @code{EMACS} のあたりを編集します。 @code{LISPDIR} にはパッケージのインストール先、 @code{EMACS} には利用する Emacs のコマンド名を指定します。 @example @group % make % make install @end group @end example @file{Makefile} 中の @code{LISPDIR} を変更せず、 そのまま(@samp{NONE} のままでも)インストールした場合、 適当なインストール先を自動的に検出します。 実際のインストール先については後述します。 新聞フォルダを利用する場合には、emacs-w3m がインストールされている ディレクトリに @code{load-path} を通しておくと必要なモジュールが バイトコンパイル/インストールされます。@xref{Shimbun Folder}. @subsection @file{WL-CFG} @file{WL-CFG} というファイルが展開ディレクトリに存在すると、 インストール時に読み込まれるようになっています。 インストールで SEMI 等の @code{load-path} の設定が必要であれば、 @file{WL-CFG} に設定してください。 インストール先は @file{Makefile} 中の @code{LISPDIR} で指定しますが、 実際に @file{*.el}, @file{*.elc} が入るディレクトリ (@code{LISPDIR} からの相対パス)は @file{WL-CFG} 中の変数 @code{WL_PREFIX}, @code{ELMO_PREFIX} で指定します。 @table @code @item WL_PREFIX WL モジュールをインストールするディレクトリを指定します。 これは @code{LISPDIR} からの相対パスです。 WL モジュールはファイル @file{wl*.el} @file{wl*.elc} を含んでいます。 @c 必要に応じて @file{util/} 以下のファイルもインストールします。 @item ELMO_PREFIX ELMO モジュールをインストールするディレクトリを指定します。 これは @code{LISPDIR} からの相対パスです。 ELMO モジュールはファイル @file{elmo*.el} @file{elmo*.elc} を含んでいます。 @c @file{utf7.el}, @file{utf7.elc} も ELMO モジュールの一部となっています。 @end table @noindent @code{WL_PREFIX}, @code{ELMO_PREFIX} のデフォルトはいずれも @file{wl} です。 @file{elmo*} (ELMO モジュール) を @file{elmo} 配下にインストールしたければ、 @lisp (setq ELMO_PREFIX "elmo") @end lisp @noindent とします。 @subsection インストールしないで利用 Wanderlust はバイトコンパイル、インストールをしなくても、@file{wl}, @file{elmo} のディレクトリに @code{load-path} を設定すれば起動する ことができます。例えば @file{~/work} にパッケージを展開した場合、 @file{~/.emacs} に以下の設定をすれば起動できます。 @lisp @group (add-to-list 'load-path "~/work/wl-@var{version}/wl") (add-to-list 'load-path "~/work/wl-@var{version}/elmo") @end group @end lisp @subsection マニュアルについて マニュアルは Info 形式です。 インストールするには下記を実行してください。 @example @group % make info % make install-info @end group @end example また、下記にもマニュアルがあります。 @example @uref{http://wanderlust.github.io/wl-docs/wl-ja.html} @end example @node Minimal Settings, Folder Definition, Install, Start Me Up @section @file{.emacs}, @file{.wl} の設定 @cindex Minimal Settings @cindex Settings @cindex Configuration @cindex .emacs @cindex .wl Wanderlust のパッケージは、大きく分けて二つのモジュール群を含んでいます。 @table @samp @item ELMO (elmo-*.el) すべてをフォルダに見せるモジュール群です。WL のバックエンドです。 @item WL (wl-*.el) Wanderlust 本体の動作を決めるモジュール群です。ELMO のフロントエンドです。 @end table ユーザは @code{elmo-}, @code{wl-} で始まる変数の設定を変えることによって Wanderlust の動作をカスタマイズできます。 最低限必要な設定は以下の通りです。 @lisp @group ;; @r{autoload の設定} (autoload 'wl "wl" "Wanderlust" t) (autoload 'wl-other-frame "wl" "Wanderlust on new frame." t) (autoload 'wl-draft "wl-draft" "Write draft with Wanderlust." t) ;; @r{アイコンを置くディレクトリ。初期設定は Emacs 固有のデフォルト値。} ;; @r{(デフォルトの値が正しければ必要ありません)} (setq wl-icon-directory "~/work/wl/etc") ;; @r{メールを送信する SMTP サーバ。 初期設定は @code{nil}。} (setq wl-smtp-posting-server "your.smtp.example.com") ;; @r{ニュース投稿用の NNTP サーバ。 初期設定は @code{nil}。} (setq wl-nntp-posting-server "your.nntp.example.com") @end group @end lisp Wanderlust 起動後、@file{~/.wl} が存在すればそれをロードします。したがって Wanderlust に固有の設定は @file{~/.wl} に記述しておくと整理しやすいでしょ う。face の設定は @file{~/.emacs} に書くことはできないので@file{~/.wl} に書いてください。@xref{Highlights}. 上記のうち、@code{autoload} の設定は @file{~/.emacs} に書く必要があります。 それ以外の設定は @file{~/.wl} に記述できます。 @subsection @code{mail-user-agent} @cindex Default Mailer @cindex Mailer, Default @vindex mail-user-agent @findex compose-mail 以下のような設定を @file{~/.emacs} にしておくと、@kbd{C-x m} (@code{compose-mail}) によって Wanderlust のドラフトモードを起動する ようになります。Wanderlust を Emacs 上の標準メーラとして使いたい場合は設 定しておくと良いでしょう。ただし、これは @code{mail-user-agent} の定義が 可能な Emacsen の場合のみ有効です。 @xref{Mail Methods, , Mail-Composition Methods, emacs-ja, GNU Emacs Manual}. @lisp @group (autoload 'wl-user-agent-compose "wl-draft" nil t) (if (boundp 'mail-user-agent) (setq mail-user-agent 'wl-user-agent)) (if (fboundp 'define-mail-user-agent) (define-mail-user-agent 'wl-user-agent 'wl-user-agent-compose 'wl-draft-send 'wl-draft-kill 'mail-send-hook)) @end group @end lisp @node Folder Definition, Start Wanderlust, Minimal Settings, Start Me Up @section 購読するフォルダの定義 @cindex Folder Definition @cindex .folders 購読するフォルダをファイル @file{~/.folders} に定義します。 @file{~/.folders} に書かれた内容がそのままあなたの購読するフォルダとなります。 起動した状態でフォルダ一覧のバッファから購読フォルダを追加/編集すること も可能ですので、この項は読み飛ばしても構いません。 @xref{Folder Manager}. @file{~/.folders} の書き方はとても単純です。こんな感じです。 @example @group # # @r{@samp{#} で始まる行はコメント。} # @r{空行は無視。} # # @var{フォルダ} "@var{あだ名}" # @r{(あだ名は無くてもよい)} # %inbox "受信箱" +trash "ゴミ箱" +draft "草稿" %#mh/Backup@@my.imap.example.com "送信済み" # グループの定義 Emacsen@{ %#mh/spool/wl "Wanderlust ML" %#mh/spool/elips "ELIPS ML" %#mh/spool/apel-ja "APEL (日本語) ML" %#mh/spool/xemacs-beta "XEmacs ベータ" -fj.news.reader.gnus@@other.nntp.example.com *-fj.editor.xemacs,-fj.editor.mule,-fj.editor.emacs "fj の Emacsen" @} # # @r{行末に @samp{/} がつくと、そのフォルダに含まれるサブフォルダ全てが} # @r{ひとつのグループとなる(アクセスグループ)。} # %#mh/expire@@localhost / # @r{MH のフォルダ全てをひとつのグループにする例。} + / @end group @end example 一行にひとつ、読みたいフォルダを書きます。 各フォルダの定義については次の章で詳しく説明します。 @samp{@var{グループ名}@{} と @samp{@}} で囲まれた部分は一つのグループと なります。ひとつのグループはフォルダモードでは開閉できるディレクトリのよ うに見えます。いくつかのフォルダをまとめて整理するのに便利です。 注意すべきなのは、@samp{@var{グループ名}@{} と @samp{@}} は1行を占領し て書く必要があることです(これはパーサがダサいからです)。 グループには、2つの種類があります。一つは、上の例の @samp{Emacsen} のよ うに直接自分で好きなフォルダをグループとして定義するタイプです。 もう一つは、上の例の @samp{+ /} のような @dfn{アクセスグループ} です。これ は、あるフォルダに含まれるサブフォルダ全てをまとめて一つのグループとするもの です。(その動作はフォルダのタイプによって異なります。例えば @samp{+ /} なら MH のサブディレクトリすべてがひとつのグループとなります。) 実際に試してみて、確認してからの方がわかりやすいかもしれません。 ちょっと書いて試してみてから、またフォルダの定義をやり直すと良いでしょう。 @node Start Wanderlust, Overview, Folder Definition, Start Me Up @section Wanderlust の起動 @cindex Start Wanderlust インストール、および設定がうまくいっていれば、 @example M-x wl @end example @noindent で起動できます。 初期化の後、フォルダ一覧を表示するフォルダモードが現れます。 @kbd{C-u M-x wl} のように prefix argument つきで実行すると、 フォルダのチェックを省略して起動します。 @node Overview, , Start Wanderlust, Start Me Up @section 概観 @cindex Overview Wanderlust では基本的に、次に挙げるバッファを互いに行き来しながらメッセージ を取り扱います。それぞれの詳細については以下の各章で説明します。 @table @samp @item フォルダバッファ フォルダの一覧を表示します。フォルダを選択して、そのフォルダのサマリに入ることができます。 また、購読するフォルダを追加したり、編集することもできます。 @item サマリバッファ フォルダに含まれるメッセージの一覧を表示します。 ここではメッセージを選択してその内容を表示したり、メッセージに対して返信をすることができます。 また、メッセージを削除したり、別のフォルダに移動させたりすることができます。 @item メッセージバッファ メッセージの内容を表示します。パートを保存したり、外部プログラムで開くことができます。 @item ドラフトバッファ メッセージの編集を行います。 @end table @node Folders, Folder, Start Me Up, Top @chapter Wanderlust で扱えるフォルダたち @cindex Folder Type 以下では Wanderlust で扱えるフォルダについて説明します。 Wanderlust は ELMO のインタフェースを利用しているため、ELMO モジュールが サポートしていれば、どんなフォルダでも利用できます。 バージョン @value{VERSION} 現在、用意されているフォルダは、IMAP, NNTP, LocalDir(MH), Maildir, News Spool, Archive, POP, Shimbun, Search, Multi, Filter, Pipe, File, Access, Internal の 15 種類です。 @menu * IMAP Folder:: @samp{%} -- IMAP フォルダ * NNTP Folder:: @samp{-} -- NNTP フォルダ * MH Folder:: @samp{+} -- MH フォルダ * Maildir Folder:: @samp{.} -- Maildir フォルダ * News Spool Folder:: @samp{=} -- News Spool フォルダ * Archive Folder:: @samp{$} -- アーカイブフォルダ * POP Folder:: @samp{&} -- POP フォルダ * Shimbun Folder:: @samp{@@} -- 新聞フォルダ * RSS Folder:: @samp{rss} -- RSS フォルダ * Search Folder:: @samp{[} -- 検索フォルダ * Multi Folder:: @samp{*} -- マルチフォルダ * Filter Folder:: @samp{/} -- フィルタフォルダ * Pipe Folder:: @samp{|} -- パイプフォルダ * Internal Folder:: @samp{'} -- 内部フォルダ * File Folder:: -- ファイルフォルダ * Access Folder:: -- アクセスフォルダ @end menu @node IMAP Folder, NNTP Folder, Folders, Folders @section IMAP フォルダ @cindex @samp{%} @cindex IMAP Folder @cindex Folder, IMAP @cindex RFC 2060 @cindex IMAP4rev1 RFC 2060 で規定された IMAP4rev1 を利用してメールを読むためのフォルダです。 書式: @example @group @samp{%} @var{メールボックス名} [@samp{:} @var{ユーザ名} [@samp{/} @var{認証法}]][@samp{@@} @var{ホスト名}][@samp{:} @var{ポート番号}][@samp{!}] @end group @end example @example @var{認証法}には @code{login} (エンコードしてパスワードを送信)か @code{cram-md5} (CRAM-MD5 による認証)か @code{digest-md5} (DIGEST-MD5 による認証)か @code{clear} (または @code{nil}。生パスワードを送信) のいずれかを指定。 @end example default 値: @example ユーザ名 -> 変数 @code{elmo-imap4-default-user} の値。 初期設定は 環境変数 @env{USER} か、@env{LOGNAME} か、 @code{(user-login-name)} の返り値。 認証法 -> 変数 @code{elmo-imap4-default-authenticate-type} の値。 初期設定は @code{login}。 ホスト名 -> 変数 @code{elmo-imap4-default-server} の値。 初期設定は @samp{localhost}。 ポート番号-> 変数 @code{elmo-imap4-default-port} の値。 初期設定は 143。 @end example メインで使用する IMAP サーバを変数 @code{elmo-imap4-default-server} に指定すると、いちいちフォルダ名にホスト名を書かずに済みます。例えばファ イアウォールを越えなければならない場合でも @samp{foo%imap@@gateway} のよ うに指定できます。 @lisp @group ;; @r{例: imap4.exaple.org をメインで使用する IMAP サーバとして設定} (setq elmo-imap4-default-server "imap4.example.org") @end group @end lisp フォルダ名の最後に @samp{!} が付いていると、SSL (Secure Socket Layer)を 利用してコネクションを張ります。@samp{!!} だと、STARTTLS によりSSL コネ クションを張ります。 変数 @code{elmo-imap4-default-stream-type} の値が @code{ssl} なら、 @samp{!} を付けなくても SSL を使います。@code{starttls} なら @samp{!!} を意味します。これらの場合、通常の接続をするにはフォルダ名の最後に @samp{!direct} を付けます。 @lisp @group ;; @r{例: SSL を利用してコネクションを張る} (setq elmo-imap4-default-stream-type 'ssl) @end group @end lisp 認証法として、@code{login}、@code{cram-md5} もしくは @code{digest-md5} を指定した場合、パスワードをエンコードして送信します。ただし、サーバ側が パスワードをエンコードして受け取る能力が無い場合は、確認の後、 @code{clear} (生パスワードを送る) に切替えます。変数 @code{elmo-imap4-force-login} が non-nil ならば、確認無しに @code{clear} に切替えます(初期設定は @code{nil})。 @lisp ;; @r{例: 生パスワードで認証} (setq elmo-imap4-default-authenticate-type 'clear) @end lisp 例: @example @group %inbox -> IMAP のメールボックス、"inbox" %#mh/inbox -> IMAP のメールボックス、"#mh/inbox" %inbox:hoge -> IMAP のメールボックス、"inbox" へユーザ "hoge" でアクセス。 %inbox:hoge/clear@@server1 -> server1 上の IMAP のメールボックス "inbox" へ ユーザ "hoge" で、生パスワードを送って('clear で) アクセス。 @end group @end example @subsection 日本語メールボックス名の扱い(Modified UTF7) @cindex Modified UTF7 @cindex UTF7 @cindex UTF8 @cindex Unicode 変数 @code{elmo-imap4-use-modified-utf7} に non-nil の値を設定すれば (デフォルトは @code{t})、日本語 (や、その他の英語以外の言語) で メールボックス名を指定することができます。 @node NNTP Folder, MH Folder, IMAP Folder, Folders @section NNTP フォルダ @cindex @samp{-} @cindex NNTP Folder @cindex Folder, NNTP @cindex Folder, News @cindex NetNews @cindex News @cindex Newsgroup @cindex RFC 977 ネットニュースを読むためのフォルダです。 一つのニュースグループを一つのフォルダとして扱います。 書式: @example @group @samp{-} @var{ニュースグループ名} [@samp{:} @var{ユーザ名}][@samp{@@} @var{ホスト名}][@samp{:} @var{ポート番号}][@samp{!}] @end group @end example default 値: @example ホスト名 -> 変数 @code{elmo-nntp-default-server} の値。初期設定は "localhost"。 ユーザ名 -> 変数 @code{elmo-nntp-default-user} の値。初期設定は @code{nil}。 ポート番号-> 変数 @code{elmo-nntp-default-port} の値。 初期設定は 119。 @end example @var{ユーザ名}が non-nil の場合は AUTHINFO による認証を行ないます。 フォルダ名の最後に @samp{!} が付いていると、SSL を利用してコネクションを張ります。 @samp{!!} だと、STARTTLS により SSL コネクションを張ります。 変数 @code{elmo-nntp-default-stream-type} の値が @code{ssl} なら、@samp{!} を付け なくても SSL を使います。@code{starttls} なら @samp{!!} を意味します。 これらの場合、通常の接続をするにはフォルダ名の最後に @samp{!direct} を付けます。 例: @example @group -fj.rec.tv -> ニュースグループ、@samp{fj.rec.tv}。 -fj.rec.tv@@newsserver -> @samp{newsserver} 上のニュースグループ、@samp{fj.rec.tv}。 @end group @end example @node MH Folder, Maildir Folder, NNTP Folder, Folders @section MH フォルダ @cindex @samp{+} @cindex MH Folder @cindex Folder, MH @pindex MH MH 形式(1ファイル1メール)で保存されたメールを読むためのフォルダです。 書式: @example @samp{+} @var{ディレクトリ名} @end example @var{ディレクトリ名}は、通常、変数 @code{elmo-localdir-folder-path} (初期設定は @file{~/Mail}) からの相対パスですが、 @samp{/} や @samp{~} で始まっていれば絶対パスと見做します (ドライブレターも同様です)。 メッセージが保存されるファイルのファイル名には、メッセージ番号を使用します。 例: @example @group +inbox -> @file{~/Mail/inbox} +from/teranisi -> @file{~/Mail/from/teranisi} +~/test -> @file{~/test} @end group @end example @node Maildir Folder, News Spool Folder, MH Folder, Folders @section Maildir フォルダ @cindex @samp{.} @cindex Maildir Folder @pindex Maildir @pindex qmail Maildir 形式(1ファイル1メール)で保存されたメールを読むためのフォルダです。 書式: @example @samp{.} @var{ディレクトリ名} @end example @var{ディレクトリ名}は、通常、変数 @code{elmo-maildir-folder-path} (初期 設定は @file{~/Maildir}) からの相対パスですが、@samp{/} や @samp{~} で始 まっていれば絶対パスと見做します(ドライブレターも同様です)。 Maildir は、@file{cur}, @file{new}, @file{tmp} のディレクトリを含んでい ます。実際にメッセージが存在するのは、指定ディレクトリ直下の @file{cur} ディレクトリです。指定ディレクトリ直下の @file{new} ディレクトリに存在する メッセージファイルは、アクセス時に @file{cur} ディレクトリへ移動されます。 また、@file{tmp} ディレクトリにあり、かつ 36 時間以上アクセスが無いメッ セージファイルは削除されます。 この動作は @uref{http://cr.yp.to/proto/maildir.html} に従っています。@* (日本語訳は @uref{http://man.qmail.jp/jman5/maildir.html}) 例: @example @group . -> @file{~/Maildir} .inbox -> @file{~/Maildir/inbox} .from/teranisi -> @file{~/Maildir/from/teranisi} .~/test -> @file{~/test} @end group @end example @node News Spool Folder, Archive Folder, Maildir Folder, Folders @section News Spool フォルダ @cindex @samp{=} @cindex News spool Folder @pindex gnspool Mew/IM が提唱する、ローカルに保存されたニュース記事を読み書きするための フォルダです。NNTP 経由ではなく、@command{gnspool} などを使って取り寄せ ているような場合にそのスプールを直接読む、という使い方も想定しています。 書式: @example @samp{=} @var{ディレクトリ名} @end example @var{ディレクトリ名}は、変数 @code{elmo-localnews-folder-path} (初期設定 は @file{~/News})で指定したディレクトリのサブディレクトリを指します。ディ レクトリの区切りは @samp{.} でも可です。 例: @example @group =fj/os/os2 -> @file{~/News/fj/os/os2} =fj.os.bsd.freebsd -> @file{~/News/fj/os/bsd/freebsd} @end group @end example @node Archive Folder, POP Folder, News Spool Folder, Folders @section アーカイブフォルダ @cindex Archive Folder @cindex @samp{$} @c @pindex ange-ftp Info-ZIP や LHA などで圧縮されたアーカイブファイルを一つのフォルダとし て扱います。 書式: @example @group @samp{$} @var{ディレクトリ名} [@samp{;} @var{アーカイバタイプ} @samp{;} @var{プレフィクス}] @end group @end example @var{ディレクトリ名}は、通常、変数 @code{elmo-archive-folder-path} (初期設定は @file{~/Mail}) からの相対パスですが、 @samp{/} や @samp{~} で始まっていれば絶対パスと見做します (ドライブレターも OK)。 ange-ftp 表記も ange-ftp, efs が使える環境では OK です。 フォルダの実体としての書庫ファイルは、上述のディレクトリにある @code{elmo-archive-basename}(初期値は @file{elmo-archive})になります。 ただし、ディレクトリでなくファイルであった場合、そのファイルをフォルダ と見做します。 拡張子はアーカイバ毎に自動的に(動的に)選択されます。 @var{アーカイバタイプ}を省略した場合、変数 @code{elmo-archive-default-type} (初期設定は @code{zip})が参照されます。 @var{プレフィクス}は、書庫がディレクトリ構造を持っている場合に、そのディ レクトリ部分を指定します。これは主にアーカイブサービスや @command{tar} + @command{gzip} + @command{uuencode} によるダイジェスト配送を提供している ML の書庫ファイルを展開することなくマウントするためのもの、つまり閲覧時 の便宜のためのものです。 例えば ML サーバが fml の場合、@file{msend.tar.gz} は @file{spool/1} の ような構造なので、@samp{spool} を指定します。 例: @example @group $teranisi -> @file{~/Mail/teranisi/elmo-archive.zip} $bsd/freebsd;lha -> @file{~/Mail/bsd/freebsd/elmo-archive.lzh} $/foo@@server:~/bar;zoo -> @samp{server} 上の @file{~/bar/elmo-archive.zoo} $d:/msend.tar.gz;tgz;spool -> @file{d:/msend.tar.gz} $ml;zip/ -> @file{~/Mail/ml} 以下のアーカイブフォルダからなる アクセスグループ @end group @end example @menu * Archiver:: 対応(可能)アーカイバ * Archive Tips:: TIPS * Archive Vars:: カスタマイズ変数 @end menu @node Archiver, Archive Tips, Archive Folder, Archive Folder @subsection アーカイブフォルダが対応している(対応可能な)アーカイバ @cindex Archiver @pindex LHA @pindex Info-ZIP @pindex UNZIP @pindex ZOO @pindex RAR @pindex TAR @pindex GNU TAR デフォルトで以下のアーカイバに対応します。 @example @group LHA, Info-ZIP/UNZIP, ZOO, RAR ;; フルスペック GNU TAR(@code{tgz}, @code{tar}) ;; デフォルトでは閲覧専用 @end group @end example 複数ファイルを1プロセスで一つの書庫へまとめることができるアーカイバであ れば、必要な変数を追加定義するだけで使える可能性があります(ARJ/UNARJ, ARC は、手許で使ってないので定義していません。TAR は元ファイルを消す (@code{mv}) ことができない点で真面目にサポートしていません)。複数ファイ ルを一つにまとめられない点で @command{gzip}, @command{bzip}, @command{bzip2} は使えません。標準出力へ解凍できないアーカイバにも標準で は対応しません。 @subsection 各 OS でのアーカイバに関する特記事項 フルスペックで読み書き可能なことを確認しているアーカイバは、以下のとお りです(@samp{*} 印のものは処理速度などの点で最も適しているもの)。 @example [OS/2] Warp4.0J(w/o VoiceType)+Fx00505/emx0.9c(fix04)/PMMule,EmacsPM LHA OS/2 version Rel.2.06b Feb 18, 1998 *UnZip 5.32 of 3 November 1997, by Info-ZIP. *Zip 2.2 (November 3rd 1997). Zoo archiver, zoo 2.1 $@asis{}Date: 91/07/09 02:10:34 $ GNU tar version 1.10 - AK 2.58 (DBCS/SJIS) 981216(homy)版 gzip 1.2.4 (18 Aug 93) + bzip2 パッチ(by 飯田さん) [UN|X] FreeBSD 2.2.7-RELEASE, Linux 2.0.30, Solaris2.6, HP-UX 9.07 LHa for UNIX V 1.14c UnZip 5.32 of 3 November 1997 Zip 2.2 (November 3rd 1997) GNU tar 1.12 (1.11.x は不可) gzip 1.2.4 (18 Aug 93) [Win32] Win.98/Meadow Lha32 version 1.28 Zip 2.2 UnZip 5.40 GNU tar 1.11.8 + 1.5(WIN32) GZIP 1.2.4 RAR 2.06 @end example ※ LHA に関する注意 OS/2 の場合、Peter Fitzsimmons 氏作の LH/2 には対応しません。平松版をお 使いください。 Win32 では DOS 版でなく、LHa32 でないと動かないとのことです。 ※ GNU tar に関する注意 GNU tar は書庫からの削除に問題があるものが多いので、特に注意してください。 書庫が破壊される危険性が高いので、フルスペックで読み書きする前に @option{--delete} @option{-f} を充分テストしておいてください。なお、上記 のものでは今のところ問題は報告されていません。 @node Archive Tips, Archive Vars, Archiver, Archive Folder @subsection TIPS @cindex Archive Tips 快適に移行するには、@code{wl-summary-archive} を実行する (@pxref{Archive}) か、Expire 機能 (@pxref{Expire}) と組み合わせると良い でしょう。ただし、Expire 機能で作成したアーカイブフォルダを扱う場合は、 変数 @code{elmo-archive-treat-file} を non-nil に設定する必要があります。 一つの書庫ファイルが多くのファイルを含んでいるとアーカイバ起動時 のオーバーヘッドが加速度的に増加する(特に LHA の場合)ため、150 通程度、 最大でも 200 通までにしておくと、ストレスなく読み書きできるでしょう。 なお、当然のことながら @lisp @group (setq wl-fcc "$backup") (setq wl-trash-folder "$trash;lha") @end group @end lisp @noindent も可能です@t{:-)}。 @node Archive Vars, , Archive Tips, Archive Folder @subsection アーカイブフォルダに関する変数 @cindex Archive variables @table @code @item elmo-archive-default-type @vindex elmo-archive-default-type デフォルトのアーカイバタイプをシンボルで指定します。初期値は @code{zip} です。 @item elmo-archive-@var{type}-method-alist @vindex elmo-archive-TYPE-method-alist アーカイバの @var{type} (実際には @samp{lha}, @samp{zip}, @samp{zoo}, @samp{tgz} などの文字列が入る)毎の、各種メソッドを記述します。連想リスト の各要素は以下のようになります。 @example @group (@var{action} . (@var{exec-name} @var{options})) ;; 外部プログラムとオプション (@var{action} . @var{function}) ;; 関数 @end group @end example 現在のところ、有効な @var{action} は @example @group 'ls, 'cat ('cat-headers) ;; 最低限必要(閲覧のみ) 'mv ('mv-pipe), 'rm ('rm-pipe) ;; 上とセットでフルスペック 'cp ('cp-pipe) ;; @end group @end example @noindent です。括弧内のものは、無くても構いません(あれば優先的に使います)。 @item elmo-archive-suffix-alist @vindex elmo-archive-suffix-alist アーカイバタイプ(シンボル) 毎に対応する書庫の拡張子を記述します。 @item elmo-archive-file-regexp-alist @vindex elmo-archive-file-regexp-alist 書庫のリスト閲覧時の出力からファイル名を取得するための正規表現を、アー カイバタイプ (シンボル) 毎に記述します。 @item elmo-archive-method-list @vindex elmo-archive-method-list 有効にしたい @var{type} の elmo-archive-@var{type}-method-alist (@var{type} はアーカイバのシンボル)をリストで記述します。 @item elmo-archive-lha-dos-compatible @vindex elmo-archive-lha-dos-compatible この変数が non-nil であれば DOS 版(吉崎氏オリジナル)の LHA とオプション 互換と見做します。初期値では OS/2 と Win32 のみ @code{t} です。 @item elmo-archive-cmdstr-max-length @vindex elmo-archive-cmdstr-max-length elmo-archive からは(標準状態では)アーカイバをシェルを経由せずに起動し ます。elisp レベルでのコマンド文字列の総バイト数には制限はないとのことな ので、多くのパラメータを一度に与えて動かせるかどうかは OS レベルの問題に なります。これは、例えば数百通単位のメッセージを一度に消去できるかどうか の問題、と読み替えてください。 OS/2 ではシェルを介さずに発行できるコマンド文字列は 8190 バイトまでなの で、余裕を見てデフォルトを 8000 にしています。OS/2 REXX やシェルスクリプ トなどを噛ます場合、シェルの実装に依存することに注意してください。 なお、アーカイバが処理対象となるファイルのリストを標準入力から受け付ける (前述の @code{rm-pipe}, @code{mv-pipe}, @code{cat-headers} action を指定している)場合、1プロセスで処理することができます。 @end table @node POP Folder, Shimbun Folder, Archive Folder, Folders @section POP フォルダ @cindex @samp{&} @cindex POP Folder @cindex RFC 1939 @cindex POP3 @cindex APOP RFC 1939 で規定されている POP3 を利用してメールを読むためのフォルダです。 書式: @example @group @samp{&} [@var{ユーザ名}][@samp{/} @var{認証法}][@samp{:} @var{番号の振り方}][@samp{@@} @var{ホスト名}][@samp{:} @var{ポート番号}][@samp{!}] @end group @end example @var{認証法}には、@samp{user} (生パスワードを送信して認証) と @samp{apop} (APOP で認証) の 2 種類があります。 @var{番号の振り方}には、@samp{uidl} (UIDL コマンドによる番号付け) か @samp{list} (LIST コマンドによる番号付け) のいずれかを指定します。 default 値: @example ユーザ名 -> 変数 @code{elmo-pop3-default-user} の値。 初期設定は 環境変数 @env{USER} か、@env{LOGNAME} か、 @code{(user-login-name)} の返り値。 認証法 -> 変数 @code{elmo-pop3-default-authenticate-type} の値。 初期設定は "user"。 番号の振り方-> 変数 @code{elmo-pop3-default-use-uidl} の値による。 t なら UIDL を用いる。初期設定は t。 ホスト名 -> 変数 @code{elmo-pop3-default-server} の値。 初期設定は "localhost"。 ポート番号 -> 変数 @code{elmo-pop3-default-port} の値。 初期設定は 110。 @end example 例: @example @group &hoge@@localhost -> localhost へユーザ @samp{hoge} でアクセス。 &hoge@@popserver:109 -> ホスト @samp{popserver} のポート 109 番へ ユーザ @samp{hoge} でアクセス。 @end group @end example フォルダ名の最後に @samp{!} が付いていると、SSL を利用してコネクションを張ります。 変数 @code{elmo-pop3-default-stream-type} の値が @code{ssl} なら、@samp{!} を付け なくても SSL を使います。@code{starttls} なら @samp{!!} を意味します。 これらの場合、通常の接続をするにはフォルダ名の最後に@samp{!direct} を付けます。 @node Shimbun Folder, RSS Folder, POP Folder, Folders @section 新聞フォルダ @cindex @samp{@@} @cindex Shimbun Folder @cindex Folder, Shimbun @cindex Folder, Web @pindex w3m @pindex emacs-w3m emacs-w3m (@uref{http://emacs-w3m.namazu.org/}) を用いて WWW 上の新聞やニュースサイト、メーリングリストアーカイブなどを 読むためのフォルダです。 w3m および emacs-w3m がインストールされている必要があります。 書式: @example @group @samp{@@} @var{モジュール名} @samp{.} @var{フォルダ名} @end group @end example @var{モジュール名}、および @var{フォルダ名} に入る値については emacs-w3m に付属の @file{README.shimbun.ja} を参照してください。 例: @example @group @@airs.wl -> wanderlust ML アーカイブ (モジュール @file{sb-airs.el} 使用) @@asahi/ -> @file{sb-asahi.el} モジュールに含まれるフォルダのアクセスグループ @end group @end example @subsection 新聞フォルダに関する変数 @table @code @item elmo-shimbun-update-overview-folder-list @vindex elmo-shimbun-update-overview-folder-list 初期設定は @code{all}。メッセージをフェッチしたときに overview を更新す る新聞フォルダを指定します。全ての新聞フォルダで overview を更新したい場 合には、@code{all} を設定します。フォルダ名の正規表現からなるリストを設 定する事で、更新するフォルダを限定する事も出来ます。 例: @example (setq elmo-shimbun-update-overview-folder-list '("^@@airs\\." "^@@namazu\\.")) @end example サマリの表示は、自動的に更新されます。 @end table @node RSS Folder, Search Folder, Shimbun Folder, Folders @section RSS フォルダ @cindex RSS Folder @cindex Atom Folder RSS や Atom フィードに含まれるメッセージを閲覧する為のフォルダです。 書式: @example @samp{rss:} @var{RSS または Atom のURL} @end example 例: @example rss:https://github.com/wanderlust/wanderlust/commits/master.atom @end example サポートする RSS や Atom は全て自動的に扱われます。 より細かい設定が必要な場合は、新聞フォルダ (@pxref{Shimbun Folder}) を 使ってください。 メッセージのキャッシュは持たないので、メッセージはフィードから無くなると フォルダからも直ちに消失します。 保存する必要がある場合はパイプフォルダ (@pxref{Pipe Folder}) と 組み合わせてください。 @example |rss:http://lwn.net/headlines/newrss|+lwn @end example RSS や Atom 及び OPML をアクセスグループとして扱うことができ、 その場合、関連するフィードはサブフォルダ内に現れます。 @node Search Folder, Multi Folder, RSS Folder, Folders @section 検索フォルダ @cindex Search Folder @cindex @samp{[} @cindex Folder, Search @cindex Folder, Text Search 外部プログラムを用いて、検索式にマッチしたメッセージを集めた仮想的なフォ ルダを構成します。 書式: @example @group @samp{[} @var{検索式} @samp{]} [ @var{検索対象} [ @samp{!} @var{検索方式} ] ] @end group @end example 検索式と検索対象の指定方法は、検索方式によって異なります。 @subsection 対応している検索方式 デフォルトでは、以下の検索方式に対応しています。検索方式を省略した場合は、 @code{elmo-search-default-engine} で指定された検索方式が使用されます。 @menu * namazu:: namazu * grep:: grep * rgrep:: rgrep * mu:: mu * notmuch:: notmuch @end menu @node namazu, grep, Search Folder, Search Folder @subsection namazu @pindex namazu namazu (@uref{http://www.namazu.org/}) を使って、インデックスに登録された 文書を検索します。 検索式は、namazu の検索式です。詳しくは、namazu に付属の文書を参照して下 さい。 検索対象には、使用するインデックスを指定します。インデックスのあるディレ クトリのパスをそのまま指定するか、以下の説明にある別名を指定する事が出来 ます。インデックスを省略した場合は、 @code{elmo-search-namazu-default-index-path} で指定された値が使用されます。 例: @example @group [wanderlust] -> デフォルトのインデックスから "wanderlust" にマッチするものを探す [semi flim]~/Mail/semi -> ディレクトリ "~/Mail/semi" にあるインデックス から "semi flim" を探す @end group @end example @c @subsection TIPS @subsubsection 複数キーワードの入力 フォルダ名入力時に空白を入力したい場合、@kbd{C-q @key{SPC}} でできます。 @subsubsection インデックスのエイリアス名 インデックスにはエイリアス名(別名)を定義できます。 @example (setq elmo-search-namazu-index-alias-alist '(("cache" . "~/.elmo/cache") ("docs" . "~/documents"))) @end example の様に設定することによりインデックスの別名を定義できます。 上記例であれば、 @example [wanderlust]cache @end example と入力すれば、@file{~/.elmo/cache} にある namazu インデックスを対象として、 キーワード @samp{wanderlust} で検索を行います。 @subsubsection 複数インデックスの指定 @code{elmo-search-namazu-default-index-path}, @code{elmo-search-namazu-index-alias-alist} の値としてインデックスのリス トを指定することも可能です。リストを指定すると、複数のインデックスを対象 とした検索となります。 例えば、 @example (setq elmo-search-namazu-index-alias-alist '(("all" . ("~/.elmo/cache" "~/documents")) ("cache" . "~/.elmo/cache"))) @end example のように指定すると、 @example [wanderlust]all @end example と入力すれば、@file{~/.elmo/cache} と @file{~/documents} のインデックスを 対象として、キーワード @samp{wanderlust} で検索を行います。 @node grep, rgrep, namazu, Search Folder @subsection grep @pindex grep @pindex find grep を使って、検索対象で指定されたディレクトリにあるファイルを検索します。 検索式には、grep の正規表現を指定します。検索対象とするディレクトリを省略 する事は出来ません。 例: @example @group [wanderlust]~/Mail/inbox!grep -> ディレクトリ "~/Mail/inbox" から "wanderlust" にマッチするものを探す ["[sr]emi"]~/Mail/semi!grep -> 検索式が @samp{]} を含む正規表現である場合は、 @samp{"} で囲む必要があります @end group @end example 検索対象となるファイル名をすべて引数として grep を起動渡すため、 ファイルが多すぎると失敗する場合があります。 find が @samp{-maxdepth} オプションを受け付けるのであれば、 @file{~/.wl} に以下のように記載する事でこの問題を回避できます。 @example (eval-after-load "elmo-search" '(elmo-search-register-engine 'grep 'local-file :prog "find" :args '(elmo-search-rgrep-target "-maxdepth" "1" "-type" "f" "-exec" "grep" "-l" "-e" pattern "@{@}" "+"))) @end example find の @samp{-exec command @{@} +} オプションが正しく動作しない 場合は 最後の @samp{+} を @samp{;} に変えると動作するかもしれませんが、 ものすごく遅いかもしれません。 @node rgrep, mu, grep, Search Folder @subsection rgrep grep の @samp{-r} オプションをを使って、検索対象で指定された ディレクトリ以下にあるファイルを検索します。 @samp{-r} オプションを受け付ける grep が必要です。 検索方式 grep とは異なり、対象ディレクトリのサブディレクトリにある ファイルも検索対象になります (@pxref{grep})。 また、ファイル数に関する制限は生じません。 その他、書式などは検索方式grepに準じます。 @example @group [wanderlust]~/Mail/inbox!rgrep -> ディレクトリ "~/Mail/inbox" 以下から "wanderlust" にマッチするものを探す @end group @end example @node mu, notmuch, rgrep, Search Folder @subsection mu @pindex mu mu (@uref{http://www.djcbsoftware.nl/code/mu/}) を使って、文書を検索します。 例:(Mu cheatsheet より) @example @group [Helsinki] -> messages about Helsinki (in message body, subject, sender, ...) [to:Jack subject:jellyfish tumbleweed] -> messages to Jack with subject jellyfish containing the word tumbleweed [size:2k..2m date:20091201..20093112 flag:attach from:bill] -> messages between 2 kilobytes and a 2Mb, written in December 2009 with an attachment from Bill [subject:soc* flag:unread] -> サブジェクトが 'soc' で始まる (soccer, society, socrates, ...) 未読のメッセージを探す [mime:image/*] -> 画像が添付されたメッセージを探す ['foo bar'] -> "foo bar" というフレーズを含むメッセージを探す @end group @end example @node notmuch, , mu, Search Folder @subsection notmuch @pindex notmuch notmuch (@uref{http://notmuchmail.org/}) を使って、文書を検索します。 例(notmuch マニュアルより) @example @group [term1] -> 'term1' を含むメッセージを探す [-term1] -> 'term1' を@emph{含まない}メッセージを探す [term1 term2] -> 'term1' と 'term2' の両方を含むメッセージを探す ['foo bar'] -> "foo bar" というフレーズを含むメッセージを探す @end group @end example @node Multi Folder, Filter Folder, Search Folder, Folders @section マルチフォルダ @cindex @samp{*} @cindex Multi Folder @cindex Folder, Multiple @cindex Folder, Marge 複数のフォルダを仮想的に一つに見えるようにするフォルダです。 書式: @example @group @samp{*} @var{フォルダ1} [@samp{,} @var{フォルダ2}] @dots{} [@samp{,} @var{フォルダN}] @end group @end example @samp{*} の後に、@samp{@var{フォルダ1},@var{フォルダ2},@dots{},@var{フォ ルダN}}のように @samp{,} (コンマ)で区切って、一つに見えるようにしたいフォ ルダ群を指定します。 例: @example @group *-fj.editor.xemacs,-fj.editor.mule,-fj.editor.emacs -> -fj.editor.xemacs, -fj.editor.mule, -fj.editor.emacs が一つの フォルダとして見える。 *+inbox,-fj.rec.tv,%inbox -> +inbox, -fj.rec.tv, %inbox が一つのフォルダとして見える。 @end group @end example @node Filter Folder, Pipe Folder, Multi Folder, Folders @section フィルタフォルダ @cindex @samp{/} @cindex Filter Folder @cindex Folder, Filtering @cindex Folder, Virtual @cindex Folder, Conditional @cindex Flag 指定した条件を満たすメッセージのみを含む仮想的なフォルダです。 書式: @example @samp{/} @var{条件} @samp{/} @var{フォルダ} @end example @var{条件}には、以下を書けます。 @enumerate @item 部分フィルタ: @samp{first:@var{数字}}, @samp{last:@var{数字}} first: 全メッセージの先頭から@var{数字}の数だけメッセージを切り出します。 last: 全メッセージの末尾から@var{数字}の数だけメッセージを切り出します。 例: @example @group /last:10/-fj.os.linux -> -fj.os.linux の最近の 10 個のメッセージ のみを表示するフォルダ /first:20/%inbox -> %inbox の最初の 20 個を表示するフォルダ @end group @end example @item 日付フィルタ: @samp{since:@var{日付}}, @samp{before:@var{日付}} since: @var{日付}より最近のメッセージのみを取り出します。(@var{日付}を含みます) before: @var{日付}より以前のメッセージのみを取り出します。(@var{日付}を含みません) @var{日付}には以下が書けます。 @example @group yesterday -> 昨日 lastweek -> 先週の今日 lastmonth -> 先月の今日 lastyear -> 去年の今日 @var{数字}daysago -> @var{数字} 日前 (e.x. 3daysago) @var{日}-@var{月の略名}-@var{年} -> 日付そのものの指定 (ex. 1-Nov-1998) @end group @end example 例: @example @group /since:3daysago/+inbox → 最近3日間の +inbox 中のメッセージ。 /before:yesterday/+inbox → 昨日より以前の +inbox 中のメッセージ。 @end group @end example @item フィールドフィルタ: @samp{@var{フィールド名}:@var{文字列}} メッセージの@var{フィールド}の中身が@var{文字列}にマッチするメッセージを取り出します。 @var{フィールド名}、@var{文字列}に大文字小文字の区別はありません。 例: @example @group /from:teranisi/+inbox -> +inbox で、From: フィールドに "teranisi" という文字列を含むメッセージのフォルダ /body:なんとか/%inbox -> %inbox で、本文に "なんとか" という文字列を含むメッセージのフォルダ @end group @end example @item フラグフィルタ: @samp{flag:@var{フラグ名}} @var{フラグ名}で指定されたフラグを持つメッセージを取り出します。 指定出来るフラグ名には、以下のものがあります。 @example @group unread -> 未読 important -> 重要 answered -> 返信済み forwarded -> 転送済み digest -> 未読またはグローバルフラグ付き any -> 未読、返信済み、転送済み、グローバルフラグ付き @end group @end example また、グローバルフラグとして設定したフラグも同様に設定することが出来ます。 グローバルフラグとは、@code{wl-summary-set-flags} (F キー)により付与できる 任意の名前を持つフラグです。フラグの名前は自由に定義することができます。 デフォルトでは、@samp{important} フラグが用意されています。 グローバルフラグが付与されたメッセージは、@samp{'flag} フォルダの サブフォルダを閲覧することで、まとめて読むことができます。 @xref{Internal Folder}. 例: @example @group /flag:digest/%inbox -> %inbox のうち、未読または重要な メッセージのフォルダ /flag:wl/+ML/Wanderlust -> +ML/Wanderlust のうち、wl という グローバルフラグが付いたメッセージのフォルダ @end group @end example @item 複合条件 条件部分が @samp{!} で始まると否定の条件指定となります。複数の条件を @samp{|} で区切って指定すると、OR 条件となります。同様に、@samp{&} で区 切ると AND 条件を指定できます(AND 条件は OR 条件よりも優先して評価されま す)。さらに、@samp{(}, @samp{)}, で囲うと条件式をグルーピング指定できます。 また、条件の省略記法として @samp{tocc} を用意しています。 @samp{/tocc:xxxx/} は、@samp{/to:xxxx|cc:xxxx/} に展開されます。 @samp{/!tocc:xxxx/} は、@samp{/!to:xxxx&!cc:xxxx/} に展開されます。 例: @example @group /from:teranisi&!to:teranisi/+inbox -> +inbox で From: フィールドに "teranisi" を含み、 To: フィールドに "teranisi" を含まない メッセージのフォルダ /tocc:"Yuuichi Teranishi"/+inbox -> +inbox で、To: フィールドか Cc: フィールドに "Yuuichi Teranishi" を含む メッセージのフォルダ /(from:yt|from:teranisi)&subject:報告/+inbox -> +inbox で、From: フィールドが "yt" か "teranisi" を含み、かつ Subject が "報告" を含む メッセージのフォルダ @end group @end example @end enumerate @noindent 注意 文字列部分に、空白文字、@samp{"}、@samp{/}、@samp{)}、@samp{|}、@samp{&} を含みたい場合は、文字列全体を @samp{"} で括る必要があります。(@samp{"} で括られている文字列中に @samp{"} を含む場合は、@samp{\} でエスケープす る必要があります)。これらの文字を含まない場合でも @samp{"} で括るのは問 題ありません。 @noindent 応用編 @example *%inbox,/from:teranisi/%inbox@@server -> %inbox、および、 %inbox@@server の中で From フィールドが "teranisi" のメッセージ群、 をいっぺんに表示するフォルダ。 /last:100//to:teranisi/*+inbox,%inbox -> +inbox と %inbox 中のメッセージのうち、 To: フィールドが "teranisi" にマッチする メッセージの最近の 100 個を表示するフォルダ。 /from:hogehoge//last:20//tocc:teranisi/%#mh/inbox@@localhost -> %#mh/inbox@@localhost の中で、To か Cc に "teranisi" が含まれる メッセージの最近の 20 個のうち、From が "hogehoge" のものを 表示するフォルダ。 @end example @node Pipe Folder, Internal Folder, Filter Folder, Folders @section パイプフォルダ @cindex @samp{|} @cindex Pipe Folder @cindex Get Message @cindex Download Message @cindex Incorporate Message フォルダ閲覧時に、自動的にメッセージの取り込みを実行するフォルダです。 書式: @example @samp{|} @var{取り込み元} @samp{|} @var{取り込み先} @end example フォルダ閲覧時、@var{取り込み元}から@var{取り込み先}へ自動的にメッセージ が移動します。POP を利用してメッセージをローカルにダウンロードして閲覧し たい場合は、 @example |&username@@popserver|+inbox @end example @noindent のように指定すると、フォルダの表示を更新するときに @samp{&username@@popserver} から @samp{+inbox} へ、メッセージを自動的に 取り込みます。 また、二つ目の @samp{|} を @samp{|:} にして、 @example @samp{|} @var{取り込み元} @samp{|:} @var{取り込み先} @end example とすると、取り込み元から取り込み先にメッセージをコピーします。次に そのフォルダにアクセスした際には差分だけを取り込みます。 POP サーバにメールを残したまま、メッセージを @samp{+inbox} にコピーして 閲覧したい場合は、 @example |&username@@popserver|:+inbox @end example のようにします。 例: @example @group |%inbox|%myinbox -> %inbox から %myinbox へメッセージを取り込んで 閲覧するフォルダ。 |*&user@@popserver1,&user@@popserver2|+inbox -> &user@@popserver1 と &user@@popserver2 から +inbox へメッセージを 取り込んで閲覧するフォルダ。 |-gnu.emacs.sources|:+sources -> -gnu.emacs.sources から +sources へメッセージをコピーして閲覧する フォルダ。 @end group @end example メッセージが移動した後、フック @code{elmo-pipe-drained-hook} が呼ばれ ますので、ダウンロード後に実行したい関数を登録しておくと良いでしょう。 @node Internal Folder, File Folder, Pipe Folder, Folders @section 内部フォルダ @cindex @samp{'} @cindex Internal Folder @cindex Folder, @samp{$} mark @cindex Flag @cindex Cache @c @cindex Folder, Null Wanderlust の内部に保持したメッセージを閲覧するためのフォルダです。 書式: @example @group @samp{'flag} [@samp{/} @var{グローバルフラグ}] @samp{'sendlog} @samp{'cache/00} 〜 @samp{'cache/1F} @end group @end example @samp{'flag} というフォルダは、@var{グローバルフラグ}で指定したフラグの 付いたメッセージを集めた仮想フォルダです。 デフォルトで定義されている@var{グローバルフラグ}として @samp{important} フラグがあります。このフラグは、後述の重要マーク(@samp{$})を付けることで メッセージに付加されます。重要マークをメッセージにつけておいて、あとから 見直したいときなどに便利です。@var{グローバルフラグ}を省略した場合は、こ の @samp{important} フラグを指定したものと看倣されます。 また、後述のサマリモードにおいて、自由にグローバルフラグを定義してメッセー ジに付加することも出来ます。@xref{Usage of Summary Mode}. このフォルダでメッセージを削除すると、そのメッセージについていた @var{グローバルフラグ} が削除されます。また、このフォルダにメッセージ を追加すると、そのメッセージには @var{グローバルフラグ} が付けられます。 @samp{'sendlog} は @file{~/.elmo/sendlog} に記載されているメッセージのうち キャッシュしているものを集めた仮想フォルダです。自分自身への cc を 付け忘れた時などに有用かもしれません。 これを利用するには、@code{wl-draft-use-cache} を non-nil に設定して、 送信したメッセージをキャッシュするようにしてください。 @samp{'cache/00} 〜 @samp{'cache/1F} はネットワーク経由で読んだメッセー ジのキャッシュにアクセスするためのフォルダです。00 〜 1F には、キャッシュ ディレクトリ (@file{~/.elmo/cache})のサブディレクトリ名を指定します。 @node File Folder, Access Folder, Internal Folder, Folders @section ファイルフォルダ @cindex File Folder ローカルファイルシステムのファイルを閲覧するためのフォルダです。一つのディ レクトリを一つのフォルダとして扱います。 書式: @example @samp{file:} @var{ディレクトリのパス} @end example 例: @example @group file:~/work -> @file{~/work} file:/etc -> @file{/etc} @end group @end example @node Access Folder,, File Folder, Folders @section アクセスフォルダ @cindex Access Folder 指定されたフォルダの配下のサブフォルダを仮想的に一つのフォルダとして扱え るようにするフォルダです。サブフォルダの増減は自動的に反映されます。 書式: @example @samp{access:} @var{ルートフォルダ} @end example 例: @example @group access:%INBOX -> %INBOX 以下の IMAP のメールボックスの全て access:'cache -> 全ての 'cache フォルダ @end group @end example @node Folder, Summary, Folders, Top @chapter フォルダモード @cindex Folder 起動して最初に現れるのがフォルダモード(フォルダの一覧表示)です。 フォルダモードでは、読みたいフォルダの選択、購読フォルダの編集を行ないます。 @menu * Selecting Folder:: 読みたいフォルダの選択 * Folder Manager:: 購読フォルダの編集 @end menu @node Selecting Folder, Folder Manager, Folder, Folder @section 読みたいフォルダの選択 @cindex Selecting Folder @subsection 使用方法(TIPS) @subsubsection 新規数、未読数のチェック フォルダモードの見ためはこんな感じになるはずです。 @example @group [-]Desktop:14186/35580/67263 受信箱:3/10/10 ゴミ箱:2/7/10 草稿:0/0/3 送信済み:0/9/348 [-]Emacsen:0/34/4837 Wanderlust ML:0/0/558 ELIPS ML:0/0/626 tm (日本語) ML:0/0/821 XEmacs ベータ:0/29/255 Mew:0/0/998 Mule-Win32:0/0/1491 fj の Emacsen:0/5/88 @end group @end example 各行は、 @example @var{フォルダ名}:@var{未同期}(@var{新規})@var{数}/@var{未読数}/@var{総数} @end example @noindent を表示しています。 チェックしたいフォルダの上にカーソルを合わせて @kbd{s} を押すと、 これらの数を最新のものに更新します。 たくさん新規メッセージがあると色が変わります。 フォルダモード全体は @samp{Desktop} というグループフォルダになります。 グループフォルダはリターンキーで開閉できます。 グループフォルダに対する操作は、そのグループフォルダに属する全ての子 フォルダに対して適用されます。 例えば、@samp{[-]Emacsen} のところにカーソルを合わせて @kbd{s} を押すと、 これに含まれる6つのフォルダの表示を最新のものに更新します。 @subsubsection フォルダの選択 フォルダの行にカーソルを置いてリターン(スペース)キーを押すとそのフォルダ の内容を表示するサマリモードに移動します。 このとき、変数 @code{wl-stay-folder-window} が non-nil ならサマリに移動 したときにフォルダバッファの右にサマリのバッファが現れます。 @subsection キーバインド フォルダモードでのフォルダ選択に関するコマンドのキーバインドは以下の通りです。 @table @kbd @item @key{SPC} @itemx @key{RET} @kindex @key{SPC} (Folder) @kindex @key{RET} (Folder) @findex wl-folder-jump-to-current-entity 現在カーソルがある行のフォルダのサマリ表示へ移動します。 prefix argument をつけると、スティッキーサマリに入ります。 グループフォルダにカーソルがある場合は、グループフォルダの開閉を行ないます。 アクセスグループでは、prefix argument つきでグループフォルダを開くと、 内容を最新のリストに更新します。 アクセスグループが階層構造になっている場合は再帰的に更新します。 (@code{wl-folder-jump-to-current-entity}) @item M-@key{RET} @kindex M-@key{RET} (Folder) @findex wl-folder-update-recursive-current-entity 現在カーソルがあるアクセスグループの内容を最新のリストに更新します。 アクセスグループが階層構造になっている場合は再帰的に更新します。 (@code{wl-folder-update-recursive-current-entity}) @item w @kindex w (Folder) @findex wl-draft 新規ドラフトを用意します。 (@code{wl-draft}) @item W @kindex W (Folder) @findex wl-folder-write-current-folder 現在カーソルがあるフォルダが NNTP フォルダなら、@samp{Newsgroups:} フィー ルドを補ってドラフトを用意します。メーリングリストのリファイル先なら、メー リングリストのアドレスを推測して、@samp{To:} フィールドを補ってドラフト を用意します。変数 @code{wl-subscribed-mailing-list} を設定しておく必要 があります。 (@code{wl-folder-write-current-folder}) @item C-c C-o @kindex C-c C-o (Folder) @findex wl-jump-to-draft-buffer ドラフトバッファがあれば移動します。 複数のドラフトバッファが存在する場合は、 次々と切り替えていきます。また、prefix argument をつけることにより、 バッファが存在していない場合は、ドラフトフォルダからファイルを(存在すれば) 読み込みます。 (@code{wl-jump-to-draft-buffer}) @item s @kindex s (Folder) @findex wl-folder-check-current-entity 現在カーソルがある行のフォルダの未同期メッセージ数を更新します。 (@code{wl-folder-check-current-entity}) @item S @kindex S (Folder) @findex wl-folder-sync-current-entity 現在カーソルがある行のフォルダのサマリを更新します。 (@code{wl-folder-sync-current-entity}) @item r s @kindex r s (Folder) @findex wl-folder-check-region リージョンにあるフォルダの未同期メッセージ数を更新します。 (@code{wl-folder-check-region}) @item r S @kindex r S (Folder) @findex wl-folder-sync-region リージョンにあるフォルダのサマリを更新します。 (@code{wl-folder-sync-region}) @item Z @kindex Z (Folder) @findex wl-status-update @file{~/.addresses} 等の状態を最新のものに更新します。 (@code{wl-status-update}) @item P @kindex P (Folder) @findex wl-folder-prev-unread ひとつ上の未読があるフォルダ(もしくはグループ)に移動します。 (@code{wl-folder-prev-unread}) @item N @kindex N (Folder) @findex wl-folder-next-unread ひとつ下の未読があるフォルダ(もしくはグループ)に移動します。 (@code{wl-folder-next-unread}) @item p @kindex p (Folder) @findex wl-folder-prev-entity ひとつ上のフォルダへ移動します。 (@code{wl-folder-prev-entity}) @item n @kindex n (Folder) @findex wl-folder-next-entity ひとつ下のフォルダへ移動します。 (@code{wl-folder-next-entity}) @item J @kindex J (Folder) @findex wl-folder-jump-folder 指定したフォルダへカーソルを移動します。 (@code{wl-folder-jump-folder}) @item I @kindex I (Folder) @findex wl-folder-prefetch-current-entity 現在カーソルがある行のフォルダに対して、 @code{wl-summary-incorporate}により、 新着記事をプリフェッチします。 グループフォルダにカーソルがある場合は、 再帰的に実行します。 (@code{wl-folder-prefetch-current-entity}) @item c @kindex c (Folder) @findex wl-folder-mark-as-read-all-current-entity 現在カーソルがある行のフォルダの メッセージを全て読んだことにします。 グループフォルダにカーソルがある場合は、 再帰的に実行します。 (@code{wl-folder-mark-as-read-all-current-entity}) @item f @kindex f (Folder) @findex wl-folder-goto-first-unread-folder 最初の未読があるフォルダのサマリへ移動します。 (@code{wl-folder-goto-first-unread-folder}) @item E @kindex E (Folder) @findex wl-folder-empty-trash ゴミ箱を空にします。 (@code{wl-folder-empty-trash}) @item F @kindex F (Folder) @findex wl-folder-flush-queue キューにあるメッセージを送信します。 (@code{wl-folder-flush-queue}) @item V @kindex V (Folder) @findex wl-folder-virtual 指定した条件と合致するメッセージのみを含む仮想フォルダ(フィルタフォルダ) へ移動します。 (@code{wl-folder-virtual}) @item ? @kindex ? (Folder) @findex wl-folder-pick 指定した条件と合致するメッセージを含むフォルダを探します。 (@code{wl-folder-pick}) @item o @kindex o (Folder) @findex wl-folder-open-all-unread-folder 全ての未読があるフォルダが含まれるグループを開きます。 (@code{wl-folder-open-all-unread-folder}) @item x @kindex x (Folder) @findex wl-execute-temp-marks サマリバッファのマークを実行します。@xref{Sticky Summary}. (@code{wl-execute-temp-marks}) @item / @kindex / (Folder) @findex wl-folder-open-close カーソル行のグループの開閉をトグルします。 (@code{wl-folder-open-close}) @item [ @kindex [ (Folder) @findex wl-folder-open-all 全てのグループを開きます。 (@code{wl-folder-open-all}) @item ] @kindex ] (Folder) @findex wl-folder-close-all 全てのグループを閉じます。 (@code{wl-folder-close-all}) @item q @kindex q (Folder) @findex wl-exit Wanderlust を終了します。 (@code{wl-exit}) @item z @kindex z (Folder) @findex wl-folder-suspend Wanderlust をサスペンドします。 (@code{wl-folder-suspend}) @item C-x C-s @kindex C-x C-s (Folder) @findex wl-save 現在のフォルダの状態をセーブします。 (@code{wl-save}) @item M-t @kindex M-t (Folder) @findex wl-toggle-plugged Wanderlust のオフラインモード/オンラインモードをトグルします。 (@code{wl-toggle-plugged}) @item C-t @kindex C-t (Folder) @findex wl-plugged-change Wanderlust のサーバ・ポート別のオフライン/オンラインを変更します。 (@code{wl-plugged-change}) @end table @subsection カスタマイズ変数 @table @code @item wl-folders-file @vindex wl-folders-file 初期設定は @file{~/.folders}。 購読するフォルダを記述するファイルの名前です。 @item wl-folder-info-save @vindex wl-folder-info-save 初期設定は @code{t}。 次に立ち上げ直したときに前回の未読数などの結果を使い回しするかどうか、です。 @item wl-stay-folder-window @vindex wl-stay-folder-window 初期設定は @code{nil}。 Non-nil ならサマリに移動したときにフォルダバッファの右にサマリのバッファが現れます。 @item wl-folder-window-width @vindex wl-folder-window-width 初期設定は 20。 @code{wl-stay-folder-window} が non-nil のときに残すフォルダバッファのウィンドウの幅です。 @item wl-folder-use-frame @vindex wl-folder-use-frame 初期設定は @code{nil}。 Non-nil ならフォルダ一覧用に新しいフレームを開きます。 @item wl-folder-many-unsync-threshold @vindex wl-folder-many-unsync-threshold 初期設定は 70。 未同期数がたくさんかどうかの閾値。この値を越えると色が変わります。 @item wl-highlight-folder-by-numbers @vindex wl-highlight-folder-by-numbers フォルダバッファにおける各行のハイライトの形式を指定します。初期値は @code{t} で、行全体にメッセージ数に応じた色を付けます。@code{nil} ではフォ ルダの状態に応じた色を付けます。また、数字 (例えば 1) にしておくと、メッ セージ数とフォルダの状態の両方に応じたハイライトが行なわれます。 @item wl-folder-desktop-name @vindex wl-folder-desktop-name 初期設定は @samp{Desktop}。 トップのグループの名前です。 @item wl-folder-petname-alist @vindex wl-folder-petname-alist 初期設定は @code{nil}。 フォルダの本名とあだ名の cons のリストです。 @item wl-folder-access-subscribe-alist @vindex wl-folder-access-subscribe-alist 初期設定は @code{nil}。 アクセスグループのリスト取得で自動的に subscribe、もしくは unsubscribe するフォルダを指定します。 リストの各要素は @example (@var{アクセスグループの正規表現} . (@var{購読フラグ} @var{フォルダの正規表現} @dots{})) @end example @noindent となっています。@var{購読フラグ}が non-nil の場合は@var{フォルダの正規表 現}にマッチしたフォルダのみ表示し、@var{購読フラグ}が @code{nil} の場合 は@var{フォルダの正規表現}にマッチしたフォルダは表示しません。ただし、 @var{購読フラグ}が non-nil でも既に unsubscribe 済のフォルダは表示しませ ん。また、@var{フォルダの正規表現}は複数個記述できます。 例: @lisp @group '(("^-fj$" . (t "^-fj\\.\\(comp\\|editor\\|mail\\)" "^-fj\\.\\(net\\|news\\|os\\|rec\\)")) ("^-$" . (t "^-\\(fj\\|tnn\\|japan\\|gnu\\|comp\\)")) ("^\\+ml$" . (nil "^\\+ml$" "^\\+ml/tmp"))) @end group @end lisp @item wl-folder-hierarchy-access-folders @vindex wl-folder-hierarchy-access-folders 階層構造に作成するアクセスグループの正規表現からなるリストです。 例えば、以下のように @code{wl-folder-hierarchy-access-folders} を設定すると、 @lisp @group (setq wl-folder-hierarchy-access-folders '("^-[^\\.]*$" "^-comp.unix$" "^-comp.unix.bsd$")) @end group @end lisp @noindent 次のような階層構造になったアクセスグループを作ります。 @example @group [-]-:912/912/3011 [-]-fj:674/674/1314 -fj.comp.announce:0/0/2 -fj.comp.dev.cdrom:0/0/0 @dots{} [+]-japan:238/238/1688 [-]-comp:0/0/4 [-]-comp.unix:0/0/0 -comp.unix.admin:0/0/0 -comp.unix.dos-under-unix:0/0/0 -comp.unix.programmer:0/0/0 [-]-comp.unix.bsd:0/0/23 -comp.unix.bsd.freebsd.announce:0/0/0 @dots{} @end group @end example ただし、@samp{-} を開いただけでは1つ目の階層(@samp{-fj}, @samp{-japan}, @samp{-tnn}, @dots{}) を作るだけです。2つ目の階層 (@samp{-fj.comp.announce}, @dots{}, @samp{-comp.unix}, @dots{}) 以下のフォ ルダは、あらためてそのグループを開いた時に作られます。 @end table @node Folder Manager, , Selecting Folder, Folder @section 購読フォルダの編集 @cindex Folder Manager @cindex Folder, Edit @cindex Folder, Subscribe @cindex Folder, Unsubscribe 前に述べた通り、購読するフォルダは @file{~/.folders} に保持されますが、 @file{~/.folders} を直接編集するまでもなく、フォルダモードからもフォルダ の追加/削除/グループの定義などを編集できます。 @subsection 使用方法(TIPS) @subsubsection フォルダの追加 @kbd{m a} で新規に購読するフォルダを追加します。存在しないフォルダを入力 すると、新規に作成してよいか聞いてきます。@kbd{m g} でグループが追加され ます。このグループにフォルダを追加するには、まずこのグループを開いた状態 にします。そして次の行で挿入のコマンドを実行すると、そのグループにフォル ダを追加できます。 @subsubsection フォルダの編集 @kbd{C-k} でカット(切り取り)、@kbd{C-y} でペースト(張り付け)ができます。 つまり、通常の文書編集の行編集と同じようにフォルダの位置を変更可能です。 @subsubsection マルチフォルダの作成方法 @enumerate @item @kbd{m q}で @code{wl-fldmgr-cut-entity-list} を消します。 @item @kbd{C-k} でフォルダを切り取り、または @kbd{M-c} でフォルダをコピーします。 @item @kbd{m m} を実行するとマルチフォルダが作成されます。 @end enumerate @subsubsection あだ名(petname)やフィルタの削除 あだ名やフィルタを削除するためには、ミニバッファで ``''(@var{NULL}) を入 力します。 @subsubsection 空グループへの追加 @kbd{m g} などでグループを作成した後、このグループにフォルダを追加するに は、まずこのグループを開いた状態にします。そして次の行で追加や挿入のコマ ンドを実行するとグループにフォルダを追加できます。一方、上の行のグループが 閉じた状態のときは、そのグループと同じレベルに挿入されます。 言葉で説明するのは難しいので実際に実行してみると良いでしょう。 つまり、カーソル位置より上にあるグループの開閉状態に より挿入される位置が異なるのです。 @subsubsection セーブ時の言語コード @code{wl-folders-file} をセーブするときは @code{wl-mime-charset} の言語 コードになります。 @subsubsection フィルタフォルダの作成 カーソル上のフォルダをフィルタ付きに変更するには、フィルタフォルダ作成コ マンドを用います。もしカーソル上のフォルダを残したまま新たにフィルタフォ ルダを作成する場合は、まずコピーしてからフィルタを作成し、その後コピーし たフォルダを挿入します。フィルタフォルダ作成時には一度に複数の(多段の)フィ ルタが指定できます。先頭のフィルタをすべて削除するためには、 ``''(@var{NULL})を入力します。 @subsubsection フォルダの並び替え グループ内のフォルダを並び替える際には、@code{wl-fldmgr-sort-function} で指定した関数を用います。初期設定は @code{wl-fldmgr-sort-standard} になっ ています。これはアルファベット順に並び替え、グループを最初にする関数です。 並び替えの対象になるのは指定したグループのみで、下位のグループは並び 替えません。つまり、再帰的には行わないということです。 @subsubsection アクセスグループ内の表示しないフォルダの指定 アクセスグループを開くと通常全てのフォルダを表示しますが、表示しないフォ ルダを指定することもできます。以下の操作はアクセスグループ内でのみ有効で す。 コマンド @code{wl-fldmgr-unsubscribe} (@kbd{u}) はカーソル位置のフォルダの 表示(subscribe)・非表示(unsubscribe)設定をトグルします。これに対して @code{wl-fldmgr-unsubscribe-region} (@kbd{U}) は指定範囲のフォルダを非表示に します。 @code{wl-fldmgr-unsubscribe} はトグルしますが、 @code{wl-fldmgr-unsubscribe-region} だと通常トグルにならないことに注意し て下さい。リージョンの場合トグルにするよりどちらかに設定させる方が使いや すいと考え、このようにしています。しかし、上記2つの関数とも prefix argument の値が正ならフォルダを非表示、負なら表示、0ならトグルします。 またキーには割り当てていませんが、フォルダを表示に設定するだけの @code{wl-fldmgr-subscribe} と @code{wl-fldmgr-subscribe-region} も用意して います。使用する場合は適当なキーに割り当ててください。 さらに、アクセスグループ内で @code{wl-fldmgr-cut} と @code{wl-fldmgr-cut-region} を実行すると、それぞれ @code{wl-fldmgr-unsubscribe} と @code{wl-fldmgr-unsubscribe-region} を実 行したのと同じ効果が得られます。違いは cut の場合は画面からも消去するこ とです。 @subsubsection アクセスグループ内の操作 アクセスグループ内でも削除や挿入を行えます。といっても実際には unsubscribe するかどうかを設定しているだけなので、変更が可能なのは、当 然そのアクセスグループに属しているフォルダだけです。つまり、挿入は subscribe し、削除は unsubscribe したことと同じです。 @footnote{現在は、指定範囲を表示しないフォルダにするとき、 指定範囲の削除を行った方が高速です。} 従って、Wanderlust 以外でフォルダを変更した場合、そのフォルダを実際に追 加したり削除したりするには、アクセスグループを @kbd{C-u @key{RET}} で更 新してください。@xref{Selecting Folder}. また、挿入/削除/並び替えなどを行ったあとのフォルダの並びは保持されます。 もし @code{wl-force-fetch-folders} を設定するか、 @kbd{C-u @key{RET}} でグループを開くかすると、 存在しないフォルダは削除され、 新たに作成されたフォルダは先頭に追加されます。 @subsection キーバインド @cindex Keybind, Folder Mode @cindex Keybind, Folder Buffer フォルダの編集に関する主なコマンドのキーバインドは以下の通りです。一応 @kbd{m} で始まるキーに全て割り当てて、主な機能のみ1ストロークで使用できるよ うにしています。 @table @kbd @item m a @kindex m a (Folder) @findex wl-fldmgr-add フォルダ一覧にフォルダを追加します。存在しないフォルダを入力した場合には 確認の後、新規に作成します。 (@code{wl-fldmgr-add}) @item + @itemx m g @kindex + (Folder) @kindex m g (Folder) @findex wl-fldmgr-make-group グループを作成します。 (@code{wl-fldmgr-make-group}) @item m A @kindex m A (Folder) @findex wl-fldmgr-make-access-group アクセスグループを作成します。 (@code{wl-fldmgr-make-access-group}) @item m d @kindex m d (Folder) @findex wl-fldmgr-delete フォルダの実体とその msgdb を削除します。 nntp などの削除できないフォルダでは msgdb のみ削除します。 (@code{wl-fldmgr-delete}) @item R @itemx m R @kindex R (Folder) @kindex m R (Folder) @findex wl-fldmgr-rename フォルダ、もしくはグループ名を変更します。 フォルダを変更する場合は msgdb のパスも変更します。 (@code{wl-fldmgr-rename}) @item * @itemx m m @kindex * (Folder) @kindex m m(Folder) @findex wl-fldmgr-make-multi マルチフォルダを作成します (コピー、削除されたフォルダを結合します)。 (@code{wl-fldmgr-make-multi}) @item | @itemx m f @kindex | (Folder) @kindex m f (Folder) @findex wl-fldmgr-make-filter フィルタフォルダを作成します (選択したフォルダに filter を付けます)。 (@code{wl-fldmgr-make-filter}) @item M-c @itemx m c @kindex M-c (Folder) @kindex m c (Folder) @findex wl-fldmgr-copy フォルダをコピーする (グループはコピー不可)。 (@code{wl-fldmgr-copy}) @item M-w @itemx m W @kindex M-w (Folder) @kindex m W (Folder) @findex wl-fldmgr-copy-region 指定範囲のフォルダのコピー。 (@code{wl-fldmgr-copy-region}) @item C-k @itemx m k @kindex C-k (Folder) @kindex m k (Folder) @findex wl-fldmgr-cut フォルダの削除 (切り取り)。フォルダの実体は削除しません。 (@code{wl-fldmgr-cut}) @item C-w @itemx m C-w @kindex C-w (Folder) @kindex m C-w (Folder) @findex wl-fldmgr-cut-region 指定範囲のフォルダの削除 (切り取り)。 (@code{wl-fldmgr-cut-region}) @item C-y @itemx m y @kindex C-y (Folder) @kindex m y (Folder) @findex wl-fldmgr-yank コピー、削除したフォルダ(cut-list)を挿入する(ペースト、貼り付け)。 (@code{wl-fldmgr-yank}) @item m p @kindex m p (Folder) @findex wl-fldmgr-set-petname フォルダにあだ名(petname)を付ける。 (@code{wl-fldmgr-set-petname}) @item m q @kindex m q (Folder) @findex wl-fldmgr-clear-cut-entity-list コピー、削除したフォルダ情報(cut-list)を消す。 (@code{wl-fldmgr-clear-cut-entity-list}) @item m s @kindex m s (Folder) @findex wl-fldmgr-sort グループ内のフォルダを並び替える (そのグループ階層のみ)。 (@code{wl-fldmgr-sort}) @item m C-s @kindex m C-s (Folder) @findex wl-fldmgr-save wl-folders-file にセーブする。 (@code{wl-fldmgr-save}) @end table [以下の操作はアクセスグループに対してのみ有効] @table @kbd @item u @itemx m u @kindex u (Folder) @kindex m u (Folder) @findex wl-fldmgr-unsubscribe フォルダの表示/非表示の設定。 (@code{wl-fldmgr-unsubscribe}) @item U @itemx r u @kindex U (Folder) @kindex r u (Folder) @findex wl-fldmgr-unsubscribe-region 指定範囲にあるフォルダの表示/非表示の設定。 (@code{wl-fldmgr-unsubscribe-region}) @item l @itemx m l @kindex l (Folder) @kindex m l (Folder) @findex wl-fldmgr-access-display-normal 現在有効なフォルダのみ一覧表示する。 (@code{wl-fldmgr-access-display-normal}) @item L @itemx m L @kindex L (Folder) @kindex m L (Folder) @findex wl-fldmgr-access-display-all 非表示のフォルダも含めて全てのフォルダを一覧表示する。 (@code{wl-fldmgr-access-display-all}) @end table @subsection カスタマイズ変数 @table @code @item wl-interactive-save-folders @vindex wl-interactive-save-folders 初期設定は @code{t}。フォルダ変更の操作を行った場合、Wanderlust 終了時も しくは Emacs 終了時にセーブするか確認を行います。@code{nil} だと確認なし でセーブします。 @item wl-fldmgr-make-backup @vindex wl-fldmgr-make-backup 初期設定は @code{t}。Non-nil なら、セーブする際に @file{~/.folders.bak} にバックアップを取ります。 @item wl-fldmgr-sort-function @vindex wl-fldmgr-sort-function 初期設定は @code{wl-fldmgr-sort-standard}。sort 時に使用する関数を指定し ます。初期設定は、アルファベット順に並べグループは最初にする関数です。 (@code{wl-fldmgr-sort-group-first} が non-nil の場合)。 @item wl-fldmgr-sort-group-first @vindex wl-fldmgr-sort-group-first 初期設定は @code{t}。 Non-nil なら、@code{wl-fldmgr-sort-standard} で並び替えるときグループを最 初に置く。@code{nil} なら、グループも含めてアルファベット順に並び替えます。 @item wl-folder-check-async @vindex wl-folder-check-async 初期設定は @code{t}。 Non-nil の場合、フォルダの新規メッセージ数のチェックを非同期に行ないます。 ニュースグループのチェックが大幅に速くなります。 @item wl-folder-check-fast @vindex wl-folder-check-fast 初期設定は @code{nil}。 Non-nil の場合、フォルダの新規メッセージ数のチェックを行うたびに フォルダの表示を更新しません。 @item wl-folder-notify-deleted @vindex wl-folder-notify-deleted 初期設定は @code{nil}。 @c nil means? Non-nil ならメッセージが削除されたときにフォルダモードで未読数をチェック すると負の値が表示されます。値が @code{sync} ならば、メッセージが削除さ れていたときにフォルダの内容と同期を取ります。 @item wl-fldmgr-add-complete-with-current-folder-list @vindex wl-fldmgr-add-complete-with-current-folder-list 初期設定は @code{nil}。 Non-nil なら @code{wl-fldmgr-add} の補完候補を @code{elmo-folder-list-subfolders} で得ます。 @end table @subsection その他 フォルダの編集に関して、以下のような仕掛けや制限があります。 @enumerate @item 削除やコピーを行うと、スタックのように変数 @code{wl-fldmgr-cut-entity-list} にたまっていきます。ペースト(張り付け) は削除やコピーした単位で(リージョンでコピーしたなら、そのリージョン内の フォルダを一度に) 吐き出します。 @item @samp{Desktop} グループの削除、コピーはできません。 また、@samp{Desktop} 外への挿入はできません。 @item グループのコピーはできません。 @item アクセスグループ内での操作は、そのアクセスグループに実際に属しているフォルダ のみが対象になります。 @item 全体で同じ名前のグループは複数作れません。 @item 同じグループ(階層)に同じフォルダは作れません。階層が違えば複数作れます。 異なるフォルダに同じあだ名は指定できません。 @end enumerate @node Summary, Message, Folder, Top @chapter サマリモード フォルダモードで読みたいフォルダを選択すると、サマリモードに移動します。 サマリモードは、メッセージの一覧を表示するモードです。 @menu * Usage of Summary Mode:: 使用方法 * Thread Operations:: スレッドの操作 * Cache:: キャッシュと先読み機能 * Auto Refile:: 自動リファイル * Sticky Summary:: スティッキーサマリ * Summary View:: サマリ行の形式 * Mark and Action:: 一時マークとその処理 * Key Bindings of Summary:: キーバインド * Variables of Summary:: カスタマイズ変数 @end menu @node Usage of Summary Mode, Thread Operations, Summary, Summary @section 使用方法(TIPS) @subsection サマリの表示内容 サマリモードには、以下のようにメッセージの一覧が表示されます。 @example @group 377 09/16(水)11:57 [+1: 北目さん ] Bug? 381 09/17(木)00:16 [+3: 奥西さん ] elmo-lha.el -- LHA interface 384 09/17(木)01:32 [+1: てらにし ] wl-0.6.2 389 N09/18(金)01:07 [+2: てらにし ] wl-0.6.3 @end group @end example 各行は、メッセージの @example @var{メッセージ番号}、@var{一時的マーク}、@var{永続的マーク}、@var{日付け}、@var{差出人}、@var{サブジェクト} @end example @noindent を順に表示しています。表示形式の変更については、サマリ行の形式の節を 参照して下さい。@xref{Summary View}. @var{メッセージ番号}はそのフォルダ中にあるメッセージに対するラベルです。 News フォルダでは article 番号、IMAP フォルダでは UID、MH フォルダではファ イル名になります。 @var{一時的マーク}/@var{永続的マーク}については、あとで詳しく説明します。 @var{日付け}は、@samp{@var{月}/@var{日}(@var{曜日})@var{時}:@var{分}} の ように表示されます。曜日を日本語ではなく英語表記したい場合は、 @code{wl-summary-weekday-name-lang} を @samp{en} に設定してください。 @var{差出人}は、スレッドの深さ分インデントされて表示されます。@var{差出 人}は、アドレス帳にあだ名があればあだ名で表示します。あだ名表記を止めた い場合は、@code{wl-use-petname} を @code{nil} に設定してください。 @var{差出人}の部分にある @samp{+2} のような数字は、そのメッセージに対す る返事の数を表します。例えば @samp{+2} なら返事が 2 通あることを示します。 @var{サブジェクト}は、メッセージの @samp{Subject:} フィールドです。同じ スレッドで、かつ親と同じ @samp{Subject:} を持つメッセージの場合には、 @var{サブジェクト} を表示しません。メーリングリストなどの通し番号表示は 無視します。@samp{Subject:} が無い場合には、変数 @code{wl-summary-no-subject-message} の内容を表示します。 @subsection 一時的マーク @cindex Mark, Temporary 一時的マークは、メッセージを操作するためマークです。 一時的マークには、@samp{*}, @samp{d}, @samp{D}, @samp{o}, @samp{O}, @samp{i}, @samp{~} があります。 @table @samp @item * まとめ処理用マークです。 @kbd{m} で始まるコマンドで @samp{*}マークのついたメッセージ対して一括した処理 ができます。 @item d 処分するメッセージに付くマークです。@kbd{d} を押すと付きます。 @item D 削除するメッセージに付くマークです。@kbd{D} を押すと付きます。 @item o リファイルするメッセージに付くマークです。@kbd{o}を押すと、リファイル先 を聞いて来ます。それに答えると、リファイル先のフォルダ情報が付け加わります。 @item O コピーするメッセージに付くマークです。@kbd{O}を押すと、コピー先を聞いて 来ます。それに答えると、コピー先のフォルダ情報が付け加わります。 @item i プリフェッチ予約されたメッセージに付くマークです。@kbd{i}を押すと付きます。 @item ~ 再送予約されたメッセージに付くマークです。@kbd{~}を押すと、再送先アドレ スを聞いて来ます。それに答えると、再送先のアドレス情報が付け加わります。 @end table @kbd{x} を押すと、それぞれの一時的マークに対応したアクションを実行します。 @subsection 永続的マーク 永続的マークは、メッセージの状態を示すマークです。 永続的マークには、@samp{!}, @samp{N}, @samp{n}, @samp{U}, @samp{u}, @samp{A}, @samp{a}, @samp{F}, @samp{f}, @samp{$} があります。 @table @samp @item N 新規メッセージに付きます。 @item n 新規メッセージに付きます。@samp{N} とは異なり、@samp{n} のメッセージは キャッシュされています。 @item U 未読メッセージに付きます。 @item u 未読メッセージに付きます。@samp{U} とは異なり、@samp{u} のメッセージは キャッシュされています。 @item ! 既読メッセージに付きます。マーク無しとは異なり、@samp{!} のメッセージは キャッシュされていません。 @item A 返信済みメッセージに付きます。 @item a 返信済みメッセージに付きます。@samp{A} とは異なり、@samp{a} のメッセージ はキャッシュされています。 @item F 転送済みメッセージに付きます。 @item f 転送済みメッセージに付きます。@samp{F} とは異なり、@samp{f} のメッセージ はキャッシュされています。 @item $ グローバルフラグの設定されたメッセージに付きます。このマークは Emacs を 終了しても保存されるため、あとで返事を書きたい場合など、覚えておきたい重 要なメッセージに付けておくと便利です。@samp{$} の付いたメッセージは、(実 際のメッセージが消されたとしても) @samp{'flag} フォルダで閲覧できます。 グローバルフラグは、@kbd{$} または、@kbd{F} で付けることが出来ます。 @item なし 既読メッセージにはマークが存在しません。 @end table @samp{N}, @samp{U}, @samp{!}, @samp{A}, @samp{F} は、そのメッセージがキャッ シュされていないことを示しています。これらのマークが付いていない場合、つ まり、そのメッセージがキャッシュされている場合は、ネットワークに接続され ていなくてもIMAP フォルダのメッセージや NNTP フォルダのニュース記事を読 むことができます。 永続的マークのうち、@code{wl-summary-expire-reserve-marks} で指定した マークの付いたメッセージは、後で説明する (Wanderlust の機能としての) expire の対象から除外されます。@xref{Expire and Archive}. @subsection メッセージの読み進めかた サマリモードでは、基本的にスペースキーを押すだけでメッセージを 読み進めることができます。 サマリの表示内容をフォルダの最新の状態に合わせる(同期する)には、 @kbd{s} を押します。 @kbd{N} で次の未読、@kbd{n} で次のメッセージを表示します。 @kbd{j} を押すと現在表示中のメッセージのバッファに移動します。 マルチパートの操作はメッセージバッファに移動してから行います。 @xref{Message}. @subsection メッセージ番号を詰める サマリで @kbd{M-x wl-summary-pack-number} とすることで メッセージ番号を詰めることができます。ただし対応しているフォルダの種類は MH Folder, News Spool Folder, Maildir Folder のみです。 @node Thread Operations, Cache, Usage of Summary Mode, Summary @section スレッドの操作 例えば、 @example 384 09/17(木)01:32 [+1: てらにし ] wl-0.6.2 @end example @noindent は一つのスレッド(一つの話題の流れ)を示しています。 この行で @kbd{/} を押すと、スレッドが開いて次のような表示になります。 @example @group 384 09/17(木)01:32 [ てらにし ] wl-0.6.2 388 09/17(木)22:34 └[ 村田さん ] @end group @end example (388 番のメッセージは 384 番のメッセージに対する返事です。) もう一回 @kbd{/} を押すと、スレッドを閉じます。 prefix argument つきで @kbd{/} を押すと、全ての子スレッドを開きます。 @kbd{[} でサマリの全てのスレッドを開き、@kbd{]}で全てのスレッドを閉じま す。 そのスレッドに属するメッセージに対して一括して処理を行うためには @kbd{t} から始まるコマンドを用います。@xref{Key Bindings of Summary}. @subsection スレッドの繋ぎなおし 手動でスレッドの繋ぎなおしができます。サマリで該当するメッセージにカーソ ルを合わせて @kbd{M-w} (@code{wl-summary-save-current-message}) し、新し い親メッセージのところで @kbd{C-y} (@code{wl-summary-yank-saved-message})を実行してください。 @node Cache, Auto Refile, Thread Operations, Summary @section キャッシュ @subsection キャッシュファイル ネットワーク経由のメッセージはキャッシュされます。これにより、ネットワーク 流量が節約され、またオフライン操作が可能となります。キャッシュは、ディレク トリ @file{~/.elmo/cache} に保持されます。キャッシュをクリアするには、 @kbd{M-x elmo-cache-expire-by-size} と入力してください。最近使われてない キャッシュから順に、一定のディスク容量になるまで消します。 @subsection キャッシュファイル名 @vindex elmo-msgid-to-cache-max-length @vindex elmo-msgid-to-cache-algorithm キャッシュファイルのファイル名は、 Message-ID を単純に加工したファイル名 が生成されます。しかし、Message-ID が極端に長い場合にファイルを作成でき ない場合があります。その為、 @code{elmo-msgid-to-cache-max-length} に指 定された整数より長いファイル名が作られた場合はハッシュ関数を用いて一定の 長さのファイル名になるように調整します。 変数の値が @code{nil} の場合に はこの処理は行われません。ハッシュ関数のアルゴリズムは @code{elmo-msgid-to-cache-algorithm} で指定します。 いずれかの値を変更した場合、既存のキャッシュファイルが参照されなく場合 があります。 @subsection バッファキャッシュと先読み機能 一度読んだメッセージは一定数バッファに保持されます。これにより、次にその メッセージを表示する際の動作を高速にします。保持するバッファの数は @code{wl-message-buffer-cache-size} で指定します。 また、メッセージを読んでいる間に次のメッセージを取得しておく先読み機能が あります。 この先読みするフォルダは次の2つの変数により指定できます。 @table @code @item wl-message-buffer-prefetch-folder-type-list @vindex wl-message-buffer-prefetch-folder-type-list 初期設定は @code{'(imap4 nntp)}。先読み機能を有効にしたいフォルダタイプ のシンボルリストを指定します。初期設定では、IMAP4 とNNTP フォルダで先読 み機能が有効になります。もし localdir と IMAP フォルダが混在したマルチフォ ルダでは IMAP のメッセージだけが先読みの対象となります。この変数は @code{wl-message-buffer-prefetch-folder-list} よりも優先されます。すべて のフォルダで先読み機能を有効にしたい場合には、t を指定します。 @item wl-message-buffer-prefetch-folder-list @vindex wl-message-buffer-prefetch-folder-list 初期設定は @code{nil}。 先読み機能を有効にするフォルダをフォルダ名(正規表現)のリストで指定します。 @item wl-message-buffer-prefetch-depth @vindex wl-message-buffer-prefetch-depth 初期設定は 1。先読み機能するメッセージの数。 @item wl-message-buffer-prefetch-idle-time @vindex wl-message-buffer-prefetch-idle-time 初期設定は 1 (単位:秒)。先読み機能する時間間隔。 @item wl-message-buffer-prefetch-threshold @vindex wl-message-buffer-prefetch-threshold 初期設定は 30000 (bytes)。この値を越えるサイズのメッセージは、先読みしません。 @code{wl-message-buffer-prefetch-threshold}を @code{nil} に設定すると、 先読みするメッセージのサイズをチェックしません。 @item wl-auto-prefetch-first @vindex wl-auto-prefetch-first 初期設定は @code{nil}。 Non-nil であればフォルダに移動した時に最初のメッセージを自動的に先読みします。 @end table @node Auto Refile, Sticky Summary, Cache, Summary @section 自動リファイル @vindex elmo-msgdb-extra-fields @vindex wl-refile-rule-alist @findex wl-summary-auto-refile メッセージのヘッダ情報から任意のフォルダへ振り分ける自動リファイル機能が @kbd{C-o} (@code{wl-summary-auto-refile}) で使用できます。自動リファイル は msgdb の overview 情報を元に振り分けします。標準では @samp{From:} @samp{Subject:} @samp{To:} @samp{Cc:} が含まれています。これ以外の拡張項 目で振り分けたいときには、 @lisp @group (setq elmo-msgdb-extra-fields '("x-ml-name" "reply-to" "sender" "mailing-list" "newsgroups")) @end group @end lisp @noindent として拡張項目を msgdb に含めるようにしてください。既に取得したメッセージ の拡張項目を取り込むには @kbd{s all} などで msgdb を作り直す必要があり ます。 次に振り分けするルールを設定します。 自動振り分けは,変数 @code{wl-refile-rule-alist} の値に基づいて行われます。 @code{wl-refile-rule-alist} は、 @example @group (@var{フィールド} (@var{正規表現} . @var{振り分け先}) (@var{正規表現} . @var{振り分け先}) @dots{}) @end group @end example のようなルールのリストとなっています。各ルールは、『@var{フィールド}』の値が 『@var{正規表現}』にマッチするときに『@var{振り分け先}』に振り分けるという意味を持ち ます。前方に指定されたルールが優先されます。 『@var{フィールド}』部分には、フィールド名の文字列を指定します。また、フィール ド名の文字列のリストを指定することもできます。この場合、リストのいずれか のフィールドの値がマッチしたときに振り分けを行います(OR 条件となります)。 『@var{正規表現}』にはフィールドの値にマッチさせる正規表現文字列を指定します。 『@var{振り分け先}』には振り分け先のフォルダ名の文字列を指定します。 『@var{振り分け先}』部分には、再びルールを書くこともでき、その場合 そのルールのフィールドの値の条件と現在のルールのフィールドの値の条件が 満たされたときに振り分けを行ないます(AND 条件となります)。 また、『@var{正規表現}』でマッチした部分文字列を用いて、『@var{振り分け先}』 を指定することもできます。実際には次のようにして参照します。 @table @samp @item \& マッチした文字列全体を参照します。 @item \@var{N} @var{N} 番目の @samp{\(@dots{}\)} にマッチした文字列を参照します。 (@var{N} は数字) @end table 以下は @code{wl-refile-rule-alist} の一例です。 @lisp @group (setq wl-refile-rule-alist '(("x-ml-name" ("^Wanderlust" . "+wl") ("^Elisp" . "+elisp")) (("To" "Cc") ("\\([a-z]+\\)@@gohome\\.org" . "+\\1")) ("From" ("me@@gohome\\.org" . ("To" ("you@@gohome\\.org" . "+from-me-to-you")))))) @end group @end lisp @kbd{C-o} (@code{wl-summary-auto-refile}) で条件にマッチしたメッセージに リファイルマークが付加されます。@kbd{x} でリファイルを実行します。 @code{wl-summary-auto-refile-skip-marks} を設定することにより、 自動リファイルの対象とならないメッセージを指定することができます。 標準では @samp{N} @samp{U} @samp{!} が設定されており、 これらの永続的マークのついたメッセージは、自動リファイルしません。 つまり標準では未読のメッセージを自動リファイルしないことになります。 すべてのメッセージを自動リファイルの対象にするには、 @lisp (setq wl-summary-auto-refile-skip-marks nil) @end lisp @noindent の様に @code{wl-summary-auto-refile-skip-marks} を @code{nil} にします。 @node Sticky Summary, Summary View, Auto Refile, Summary @section スティッキーサマリ @cindex Summary, Sticky @cindex Sticky Summary スティッキーサマリは、@kbd{q} で現在のサマリを終了してもバッファが消えな い、その名の通りスティッキー(しつこい)サマリです。 フォルダモードから @kbd{Shift RET} 、もしくはサマリ から @kbd{G} して サマリに入ると、スティッキーサマリが作られます。 また、通常のサマリで @kbd{M-S} (@code{wl-summary-stick}) を実行すると 現在のサマリがスティッキーサマリになります。 スティッキーサマリのバッファ名は、@samp{Summary:@var{フォルダ名}} と なります。 @kbd{C-x b} (@code{switch-to-buffer}) などで、適当にバッファ を切替えればいつでもスティッキーサマリを参照できます。また、サマリモード で @kbd{C-c C-n} (@code{wl-summary-previous-buffer}) や @kbd{C-c C-p} (@code{wl-summary-next-buffer}) するとサマリを巡回できます。 スティッキーサマリでは、@kbd{q} や @kbd{g} の際に元のバッファを 残します。スティッキーサマリを終了するには @kbd{C-u q} でサマリを抜ける か、@kbd{C-u g} で別のサマリに移動して下さい。その他の操作に関しては通常 のサマリと同様です。 変数 @code{wl-summary-always-sticky-folder-list} にフォルダ名(正規表現) のリストを設定することにより、フォルダ移動時に自動的にスティッキーサマリ とすることもできます。 @node Summary View, Mark and Action, Sticky Summary, Summary @section サマリ行の形式 @cindex Format of summary lines @vindex wl-summary-line-format @vindex wl-summary-line-format-spec-alist @vindex wl-folder-summary-line-format-alist @vindex wl-summary-default-number-column @vindex wl-summary-number-column-alist サマリ行の形式は、ある程度自由に変更できます。 サマリ行の形式を変更するには @code{wl-summary-line-format} を設定します。 @code{wl-summary-line-format-spec-alist} で定義された書式を用います。 以下に例を示します。 @lisp @group ;; @r{番号 一時マーク 永続マーク 日付 枝 [ (子の数) 差出人 ] 件名} (setq wl-summary-line-format "%n%T%P%M/%D(%W) %t%[%17(%c %f%) %] %s") @end group @end lisp 数字は桁数を表します。負の数の場合は、右詰めになります。また、最初の数字 を @samp{0} にすると、桁数が足りない場合に @samp{ } の代わりに @samp{0} を追加して桁数を揃えます。 例: @example @group %5l -> `1 ' %-05l -> `00001' @end group @end example デフォルトの @code{wl-summary-line-format-spec-alist} で用意されている 書式記号のうち主なものは以下の通りです。 @example @group %n メッセージ番号 %T 一時的マーク %P 永続的マーク %Y 年 %M 月 %D 日 %W 曜日 %h 時 %m 分 %t スレッドの枝 %[ [ (繋ぎ直した子の場合は <) %] ] (繋ぎ直した子の場合は >) %f 差出人 %s 件名 %S サイズ %c +子の数: (スレッドを開いた時のみ表示) %C [+子の数] (スレッドを開いた時のみ表示) %# メーリングリストの情報 (`(' ML名 [ ` ' ML番号 ] `)') %l メーリングリストでの番号 %@@ 最初の MIME パートが multipart/mixed の場合に `@@' %~ 直前の項目が空でない場合に ` ' @end group @end example メッセージ番号 (@samp{%n}) の桁数を変更したい場合は、 @code{wl-summary-default-number-column} もしくは @code{wl-summary-number-column-alist} の値を変更してください。 @code{wl-summary-line-format} に一時的マーク (@samp{%T}) と永続的マーク (@samp{%P}) を含める場合には、必ず一定の位置に表示されるように定義しなけ ればなりません。例えば、スレッドによって長さが変わる @samp{%t} のうしろに @samp{%T} や @samp{%P} を表示するようにしてしまうと、正しくマーク処理を行 なえなくなる可能性があります。 また,@samp{%数字(}, @samp{%)} で囲んだ範囲は,'数字'の桁数になります(入 れ子も可)。複数の書式記号に対する幅を設定するときに使います。例えば、上 記例の @example %17(%c %f%) @end example という指定は、『「子の数」と「差出人」をつなげた文字列を 17 桁にする』と いう意味です。 また、@code{wl-folder-summary-line-format-alist} を設定すると、サマリ行 の形式をフォルダ毎に指定することができます。以下の例のように、フォルダ名 の正規表現とサマリ行の書式を指定して下さい。 @lisp @group (setq wl-folder-summary-line-format-alist '(("^%" . "%T%P%M/%D(%W)%h:%m %t%[%17(%c %f%) %] %s") ("^+" . "%n%T%P%M/%D %[ %17f %] %t%C%s"))) @end group @end lisp @subsection 差出し人の表示形式について 書式記号 @samp{%f} は、@code{wl-summary-from-function} で指定した関数が返す値を 表示します。関数 @code{wl-summary-default-from} を用いる場合(デフォルト)、通常は 差出人を表示しますが、フォルダ名が @code{wl-summary-showto-folder-regexp} にマッチし、かつ差出人が自分であるメッセージについては、宛先を表示します。 また、 @code{wl-use-petname} が Non-nil の場合にはペットネームを用いて表示します。 例えば、@samp{+backup} では自分が出したメッセージについては宛先を表示したい場合、 次のように設定します。 @lisp (setq wl-summary-showto-folder-regexp "^\\+backup$") @end lisp @node Mark and Action, Key Bindings of Summary, Summary View, Summary @section 一時マークとその処理 @cindex Mark and Action 一時マークとそれに対応する処理手順を @code{wl-summary-mark-action-list} で定義することができます。初期設定では、refile (@samp{o}), copy (@samp{O}), dispose (@samp{d}), delete (@samp{D}), prefetch (@samp{i}), resend (@samp{~}) が定義されています。 @code{wl-summary-mark-action-list} の各要素は @example (@samp{MARK} @samp{SYMBOL} @samp{ARGUMENT-FUNCTION} @samp{SET-MARK-FUNCTION} @samp{EXEC-FUNCTION} @samp{FACE} @samp{DOC-STRING}) @end example の組です。ここで @samp{MARK} は定義する一時マークの文字列で、 @samp{SYMBOL} は定義するアクションの名前です。 @samp{ARGUMENT-FUNCTION} は次に説明する @samp{SET-MARK-FUNCTION} に 与える引数を設定するための関数で、その引数としては @example (@samp{ACTION} @samp{NUMBER}) @end example が与えられます。@samp{ACTION} には @samp{SYMBOL} と同じものが入り、 @samp{NUMBER} にはメッセージ番号が入ります。 @samp{SET-MARK-FUNCTION} はマークを設定する際に呼ばれる関数で、引数は @example (@samp{NUMBER} @samp{MARK} @samp{DATA}) @end example です。@samp{NUMBER} は対象となるメッセージの番号、@samp{MARK} は一時マー クの文字列、@samp{DATA} は @samp{ARGUMENT-FUNCTION} で与えられるものです。 @samp{EXEC-FUNCTION} はアクションを実行する際に呼ばれる関数で、その引数は @samp{MARK-INFO} からなるリストです。ここで @samp{MARK-INFO} は @example (@samp{NUMBER} @samp{MARK} @samp{DATA}) @end example からなるリストです。@samp{FACE} はハイライトに用いる face です。 @node Key Bindings of Summary, Variables of Summary, Mark and Action, Summary @section キーバインド @cindex Keybind, Summary Mode @cindex Keybind, Summary Buffer サマリモードのキーバインドは以下の通りです。 @table @kbd @item @key{SPC} @kindex @key{SPC} (Summary) @findex wl-summary-read 現在カーソルがある行のメッセージをメッセージバッファに表示します。 (@code{wl-summary-read}) @item . @kindex . (Summary) @findex wl-summary-redisplay 現在カーソルがある行のメッセージをデフォルトの表示形式で再表示します。 prefix argument つきならばキャッシュが存在しても無視して再読み込みし直し ます。@kbd{C-u C-u .} のように 2回の @kbd{C-u} を付けて実行した場合、現在 の表示形式を維持して再読み込みし直します。(@code{wl-summary-redisplay}) @item < @kindex < (Summary) @findex wl-summary-display-top 最初のメッセージを表示します。 (@code{wl-summary-display-top}) @item > @kindex > (Summary) @findex wl-summary-display-bottom 最後尾のメッセージを表示します。 (@code{wl-summary-display-bottom}) @item @key{BS} @itemx @key{DEL} @kindex @key{BS} (Summary) @kindex @key{DEL} (Summary) 前のページを表示します。 @findex wl-summary-prev-page (@code{wl-summary-prev-page}) @item @key{RET} @kindex @key{RET} (Summary) @findex wl-summary-enter-handler @findex wl-summary-next-line-content カーソル行のメッセージが表示中であればメッセージを一行上にスクロールしま す。表示中でなければ、表示します。(@code{wl-summary-next-line-content}) prefix argument をつけて実行した場合には、逆にメッセージを一行下にスクロー ルします。(@code{wl-summary-prev-line-content}) また、prefix argument が 数値であった場合には、指定したメッセージ番号を持つメッセージへジャンプし ます。 @item - @itemx M-@key{RET} @kindex - (Summary) @kindex M-@key{RET} (Summary) @findex wl-summary-prev-line-content カーソル行のメッセージが表示中であればメッセージを一行下にスクロールします。 表示中でなければ、表示します。 (@code{wl-summary-prev-line-content}) @item / @kindex / (Summary) @findex wl-thread-open-close カーソル行のスレッドの開閉をトグルします。 prefix argument つきならば、カーソル行の子スレッドを全て開きます。 (@code{wl-thread-open-close}) @item [ @kindex [ (Summary) 全てのスレッドを開きます。 @findex wl-thread-open-all (@code{wl-thread-open-all}) @item ] @kindex ] (Summary) 全てのスレッドを閉じます。 @findex wl-thread-close-all (@code{wl-thread-close-all}) @item g @kindex g (Summary) @findex wl-summary-goto-folder 違うフォルダに移動します。 (@code{wl-summary-goto-folder}) @item c @kindex c (Summary) 全てのメッセージを読んだことにします。 @findex wl-summary-mark-as-read-all (@code{wl-summary-mark-as-read-all}) @item a @kindex a (Summary) @findex wl-summary-reply 現在カーソルがある行のメッセージへの返事用のドラフトを用意します。 (@code{wl-summary-reply}) @item A @kindex A (Summary) @findex wl-summary-reply-with-citation 現在カーソルがある行のメッセージへの返事用のドラフトを本文を引用して用意します。 (@code{wl-summary-reply-with-citation}) @item C @kindex C (Summary) @findex wl-summary-cancel-message 現在のカーソルがある行のメッセージが自分が出したニュース記事の場合、その投稿をキャンセルします。 (@code{wl-summary-cancel-message}) @item E @kindex E (Summary) @findex wl-summary-reedit 現在カーソルがある行のメッセージの内容を持つドラフトを用意します。 もし、prefix argument つきで実行すれば Supersedes メッセージを作成します。 ただし、NNTP フォルダでかつ自分が投稿したメッセージに限ります。 (@code{wl-summary-reedit}) @item M-E @kindex M-E (Summary) @findex wl-summary-resend-bounced-mail カーソル行のメッセージが、自分のところに返ってきたエラーメッセージならば、 もう一回送るためのドラフトを用意します。 (@code{wl-summary-resend-bounced-mail}) @item f @kindex f (Summary) @findex wl-summary-forward 現在カーソルがある行のメッセージを他の人に転送するドラフトを用意します。 (@code{wl-summary-forward}) @item $ @kindex $ (Summary) @findex wl-summary-mark-as-important @samp{important} フラグをつけます。既に @samp{important} フラグがあれば フラグを取り除きます。prefix argument をつけて実行した場合は、@kbd{F} と 同様に付加するグローバルフラグを尋ねてきます。 (@code{wl-summary-mark-as-important}) @item F @kindex F (Summary) @findex wl-summary-set-flags ミニバッファで入力した任意のグローバルフラグをつけます。Emacs 21以降なら @samp{,} で区切って複数のフラグを同時に設定出来ます。prefix argument を つけて実行した場合は、既についているグローバルフラグを取り除きます。 (@code{wl-summary-set-flags}) @item y @itemx e @kindex y (Summary) @kindex e (Summary) 現在カーソルがある行のメッセージを保存します。 @findex wl-summary-save (@code{wl-summary-save}) @item n @kindex n (Summary) @findex wl-summary-next 一つ下のメッセージへ移動します。 @code{wl-summary-skip-mark-list} にある一時マークが付いたメッセージへは 移動しません。オフラインモードのときには、 キャッシュされていないメッセージにも移動しません。 (@code{wl-summary-next}) @item p @kindex p (Summary) @findex wl-summary-prev 一つ上のメッセージへ移動します。 @code{wl-summary-skip-mark-list} にある一時マークが付いたメッセージへは 移動しません。オフラインモードのときには、 キャッシュされていないメッセージにも移動しません。 (@code{wl-summary-prev}) @item N @kindex N (Summary) @findex wl-summary-down 下方向にある未読もしくは @samp{$}マークつきのメッセージへ移動します。 オフラインモードのときには、キャッシュされていないメッセージに移動しません。 ただし、まとめ処理マーク @samp{*} がついたメッセージがある場合は、 まとめ処理マーク @samp{*} がついたメッセージに優先的に移動します。 この挙動は @code{wl-summary-move-order}の値に応じて変わります。 (@code{wl-summary-down}) @item P @kindex P (Summary) @findex wl-summary-up 上方向にある未読もしくは @samp{$}マークつきのメッセージへ移動します。 オフラインモードのときには、キャッシュされていないメッセージに移動しません。 ただし、まとめ処理マーク @samp{*} がついたメッセージがある場合は、 まとめ処理マーク @samp{*} がついたメッセージに優先的に移動します。 この挙動は @code{wl-summary-move-order}の値に応じて変わります。 (@code{wl-summary-up}) @item w @kindex w (Summary) @findex wl-summary-write 新規ドラフトを用意します。 (@code{wl-summary-write}) @item W @kindex W (Summary) @findex wl-summary-write-current-folder 現在のサマリがニュースグループの場合、@samp{Newsgroups:} フィールドを補っ てドラフトを用意します。 現在のサマリがメーリングリストの場合、メーリングリストのアドレスを推測し て @samp{To:} フィールドを補ってドラフトを用意します。 @code{wl-subscribed-mailing-list} を設定しておく必要があります。 (@code{wl-summary-write-current-folder}) @item H @kindex H (Summary) @findex wl-summary-toggle-all-header 現在カーソルがある行のメッセージを、全てヘッダ情報を表示するかどうかを切 り換えて再表示します。prefix argument つきならばキャッシュが存在しても 無視して再読み込みし直します。@kbd{C-u C-u H} のように 2回の @kbd{C-u} を 付けて実行した場合、現在のヘッダの表示形式をサマリのデフォルト値として 設定します。 (@code{wl-summary-toggle-all-header}) @item M @kindex M (Summary) @findex wl-summary-toggle-mime 現在カーソルがある行のメッセージを、MIME 解析の指定を切り換えて再表示しま す。切り換えは、@code{wl-summary-display-mime-mode-list} に指定された順に 行われます。また、数値の prefix argument つきで実行した場合、以下のように 直接切り換えることが出来ます。 @example @group 1: MIME 解析を有効にします 2: ヘッダのみ MIME 解析を有効にします 3: MIME 解析を無効にします @end group @end example @kbd{C-u C-u M} のように 2回の @kbd{C-u} を付けて実行した場合、現在の指定 をサマリのデフォルト値として設定します。(@code{wl-summary-toggle-mime}) @item C-c C-f @kindex C-c C-f (Summary) @findex wl-summary-toggle-header-narrowing 現在カーソルがある行のメッセージのヘッダの省略表示をトグルします。 (@code{wl-summary-toggle-header-narrowing}) @item B @kindex B (Summary) @findex wl-summary-burst 現在カーソルがある行のメッセージが MIME でカプセル化された複数のメッセージ含む場合、 それらを現在のフォルダにほどきます。 書き込み不可のフォルダに居る場合や prefix argument をつけて実行した場合 には、展開先のフォルダを尋ねます。 (@code{wl-summary-burst}) @item @@ @kindex @@ (Summary) @findex wl-summary-edit-petname サマリ行のメールの @samp{From:} (発信者)を @file{~/.addresses} にインタ ラクティブに追加します。既に登録されている場合は変更/削除もできます。 prefix argument つきで実行すると、任意の入力アドレスを登録/変更/削除でき ます。(@code{wl-summary-edit-petname}) @item Z @kindex Z (Summary) @findex wl-status-update @file{~/.addresses} 等の状態を最新のものに更新します。 (@code{wl-status-update}) @item | @kindex | (Summary) @findex wl-summary-pipe-message 現在のメッセージの内容を他のプロセスにパイプ経由で引き渡します。 (@code{wl-summary-pipe-message}) @item # @kindex # (Summary) @findex wl-summary-print-message 現在のメッセージの内容を印刷します。@code{ps-print} を使います。 白黒プリンタでは、@code{wl-ps-print-buffer-function} を @code{ps-print-buffer} に設定したほうが良いかもしれません。 @lisp (setq wl-ps-print-buffer-function 'ps-print-buffer) @end lisp @noindent (@code{wl-summary-print-message}) @item q @kindex q (Summary) @findex wl-summary-exit 現在のフォルダを脱出します。 (@code{wl-summary-exit}) @item j @kindex j (Summary) @findex wl-summary-jump-to-current-message 現在表示中のメッセージのバッファに移動します。 (@code{wl-summary-jump-to-current-message}) @item J @kindex J (Summary) 他のメッセージにジャンプします。 @findex wl-summary-jump-to-msg (@code{wl-summary-jump-to-msg}) @item I @kindex I (Summary) サマリの表示を更新した後、 @code{wl-summary-incorporate-marks} に含まれるマークを持つメッセージを プリフェッチします。 @findex wl-summary-incorporate (@code{wl-summary-incorporate}) @item M-j @kindex M-j (Summary) @findex wl-summary-jump-to-msg-by-message-id 入力した @samp{Message-ID:} を持つメッセージの行にジャンプします。 @item ^ @kindex ^ (Summary) 現在のメッセージの親メッセージに移動します。 @findex wl-summary-jump-to-parent-message (@code{wl-summary-jump-to-parent-message}) @item ! @kindex ! (Summary) @findex wl-summary-mark-as-unread カーソルがある行のメッセージを読まなかったことにします。 (@code{wl-summary-mark-as-unread}) @item s @kindex s (Summary) @findex wl-summary-sync メッセージの一覧表示の更新レンジの入力を受け付けた後、それに基づいてメッ セージの一覧表示を更新します。更新レンジとしては以下のいずれかを指定でき ます。 @example @group all 現在の msgdb の内容を破棄し、全情報を取り寄せ直します。 killed メッセージは取り寄せ直しません。 all-entirely 現在の msgdb の内容を破棄し、全情報を取り寄せ直します。 killed メッセージも取り寄せ直します。 update 保持している msgdb の情報と最新情報の差分を更新します。 killed メッセージは更新しません。 update-entirely 保持している msgdb の情報と最新情報の差分を更新します。 killed メッセージも更新します。 rescan 現在の msgdb に基づいて再表示を行います。 rescan-noscore 現在の msgdb に基づいて再表示を行います。 スコアにより消えたメッセージも表示します。 rescan-thread 現在の msgdb に基づいて再表示を行います。 スレッドの情報も再構築します。 cache-status キャッシュの状態をマークに反映します。 mark マークの状態を最新にします。 no-sync 何もしません。 first:数字 フィルタフォルダに移動します。 last:数字 フィルタフォルダに移動します。 @end group @end example @noindent (@code{wl-summary-sync}) @item S @kindex S (Summary) @findex wl-summary-sort サマリの表示順序を並び替えます。@samp{date} (日付)、@samp{from} (発信者)、 @samp{number} (メッセージ番号)、@samp{subject} (サブジェクト)、 @samp{size} (メッセージのサイズ)、@samp{list-info} (メーリングリストの名前とメッセージ番号) のいずれかを元に並び替えます。 prefix argument つきならば、選んだ順序の逆順でサマリを並び替えます。 (@code{wl-summary-sort}) @item T @kindex T (Summary) @findex wl-summary-toggle-thread スレッド表示をトグルします。その状態は Wanderlust を終了しても保存され ます。新規に作成されたサマリに対してのデフォルトの状態は @code{wl-summary-default-view} や @code{wl-summary-default-view-alist} で指定することができます。 現在のスレッド表示状態はモードラインに表示されます。 @samp{@{S@}} はスレッド・オフ(Sequence)の状態、 @samp{@{T@}} はスレッド・オン(Thread)の状態を示します。 (@code{wl-summary-toggle-thread}) @item l @kindex l (Summary) @findex wl-summary-toggle-disp-folder フォルダモードのバッファの表示をトグルします。 (@code{wl-summary-toggle-disp-folder}) @item v @kindex v (Summary) メッセージのバッファの表示をトグルします。 @findex wl-summary-toggle-disp-msg (@code{wl-summary-toggle-disp-msg}) @item V @kindex V (Summary) 与えられた条件を持つメッセージのみを持つ仮想フォルダ(フィルタフォルダ)へ 移動します。prefix argument つきで実行すると仮想フォルダから脱出します。 @findex wl-summary-virtual (@code{wl-summary-virtual}) @item @key{TAB} @kindex @key{TAB} (Summary) @findex wl-summary-goto-last-displayed-msg さっき表示したメッセージに飛びます。 (@code{wl-summary-goto-last-displayed-msg}) @item ? @kindex ? (Summary) @findex wl-summary-pick 与えられた条件を持つメッセージにまとめ処理マーク @samp{*} をつけます。通 常は、既についている @samp{*} マークはそのままで、単に追加されますが、 prefix argument をつけて実行した場合には、以前のマークを削除して置き換え ます。(@code{wl-summary-pick}) @item R @kindex R (Summary) @findex wl-summary-mark-as-read カーソル行のメッセージを読んだことにします。 (@code{wl-summary-mark-as-read}) @item x @kindex x (Summary) サマリバッファのすべてのメッセージに対して、一時的マークに対応するアクション を実行します。 @findex wl-summary-exec (@code{wl-summary-exec}) @item * @kindex * (Summary) @findex wl-summary-target-mark-line カーソル行のメッセージにまとめ処理用マークをつけます。 (@code{wl-summary-target-mark-line}) @xref{Mark and Action}. @item o @kindex o (Summary) カーソル行のメッセージにリファイルマークをつけます。 @findex wl-summary-refile (@code{wl-summary-refile}) @xref{Mark and Action}. @item C-o @kindex C-o (Summary) 自動リファイルを実行します。 @findex wl-summary-auto-refile (@code{wl-summary-auto-refile}) @item O @kindex O (Summary) カーソル行のメッセージにコピーマークをつけます。 @findex wl-summary-copy (@code{wl-summary-copy}) @xref{Mark and Action}. @item M-o @kindex M-o (Summary) カーソル行のメッセージに、直前にリファイルしたフォルダと同じフォルダ宛に、 リファイルマークをつけます。 @findex wl-summary-refile-prev-destination (@code{wl-summary-refile-prev-destination}) @item d @kindex d (Summary) @findex wl-summary-dispose カーソル行のメッセージに処分マークをつけます。 処分の結果は @code{wl-dispose-folder-alist} で制御でき、デフォルトでは @code{wl-trash-folder} にリファイルされます。 (@code{wl-summary-dispose}) @xref{Mark and Action}. @item D @kindex D (Summary) @findex wl-summary-delete カーソル行のメッセージに強制削除マークをつけます。 (@code{wl-summary-delete}) @xref{Mark and Action}. @item i @kindex i (Summary) カーソル行のメッセージにプリフェッチ予約マークを付けます。 @findex wl-summary-prefetch (@code{wl-summary-prefetch}) @xref{Mark and Action}. @item ~ @kindex ~ (Summary) @findex wl-summary-resend カーソル行のメッセージに再送予約マークを付けます。 (@code{wl-summary-resend}) @xref{Mark and Action}. @item u @kindex u (Summary) @findex wl-summary-unmark カーソル行のメッセージに一時的マークがあれば取り除きます。 (@code{wl-summary-unmark}) @item U @kindex U (Summary) 指定した一時的マークをすべて取り除きます。 @findex wl-summary-unmark-all (@code{wl-summary-unmark-all}) @item r R @kindex r R (Summary) @findex wl-summary-mark-as-read-region 指定リージョンにあるメッセージを全て読んだことにします。 (@code{wl-summary-mark-as-read-region}) @item r $ @kindex r $ (Summary) @findex wl-summary-mark-as-important-region 指定リージョンにあるメッセージ全てに @samp{important} フラグをつけます。 すでに @samp{important} フラグがあればそのフラグを取り除きます。 (@code{wl-summary-mark-as-important-region}) @item r F @kindex r F (Summary) @findex wl-summary-set-flags-region 指定リージョンにあるメッセージ全てにミニバッファで入力した任意のグローバ ルフラグをつけます。 (@code{wl-summary-set-flags-region}) @item r ! @kindex r ! (Summary) @findex wl-summary-mark-as-unread-region 指定リージョンにあるメッセージを全て読まなかったことにします。 (@code{wl-summary-mark-as-unread-region}) @item r x @kindex r x (Summary) @findex wl-summary-exec-region 指定リージョンにあるメッセージに対して、一時的マークに対応するアクション を実行します。 (@code{wl-summary-exec-region}) @item r * @kindex r * (Summary) @findex wl-summary-target-mark-region 指定リージョンにあるメッセージにまとめ処理用マークをつけます。 (@code{wl-summary-target-mark-region}) @xref{Mark and Action}. @item r o @kindex r o (Summary) @findex wl-summary-refile-region 指定リージョンにあるメッセージにリファイルマークをつけます。 (@code{wl-summary-refile-region}) @xref{Mark and Action}. @item r O @kindex r O (Summary) @findex wl-summary-copy-region 指定リージョンにあるメッセージにコピーマークをつけます。 (@code{wl-summary-copy-region}) @xref{Mark and Action}. @item r d @kindex r d (Summary) @findex wl-summary-dispose-region 指定リージョンにあるメッセージに処分マークをつけます。 (@code{wl-summary-dispose-region}) @xref{Mark and Action}. @item r D @kindex r D (Summary) @findex wl-summary-delete-region 指定リージョンにあるメッセージに強制削除マークをつけます。 (@code{wl-summary-delete-region}) @xref{Mark and Action}. @item r i @kindex r i (Summary) @findex wl-summary-prefetch-region 指定リージョンにあるメッセージにプリフェッチ予約マークを付けます。 (@code{wl-summary-prefetch-region}) @xref{Mark and Action}. @item r u @kindex r u (Summary) @findex wl-summary-unmark-region 指定リージョンにあるメッセージにマークがあれば削除します。 (@code{wl-summary-unmark-region}) @item r y @kindex r y (Summary) 指定リージョンにあるメッセージを保存します。 @findex wl-summary-save-region (@code{wl-summary-save-region}) @item t R @kindex t R (Summary) @findex wl-thread-mark-as-read カーソル行があるメッセージを先頭とするスレッドを読んだことにします。 prefix argument つきならばカーソル行があるメッセージを含むスレッド全てを読んだことにします。 (@code{wl-thread-mark-as-read}) @item t $ @kindex t $ (Summary) @findex wl-thread-mark-as-important カーソル行があるメッセージを先頭とするスレッドに @samp{important} フラグ をつけます。既に @samp{important} フラグがあれば取り除きます。prefix argument つきならばカーソル行があるメッセージを含むスレッド全体に適用し ます。(@code{wl-thread-mark-as-important}) @item t F @kindex t F (Summary) @findex wl-thread-set-flags カーソル行があるメッセージを先頭とするスレッドにミニバッファで入力した任 意のグローバルフラグをつけます。prefix argument つきならばカーソル行があ るメッセージを含むスレッド全体に適用します。 (@code{wl-thread-set-flags}) @item t ! @kindex t ! (Summary) @findex wl-thread-mark-as-unread カーソル行があるメッセージを先頭とするスレッドを読まなかったことにします。 prefix argument つきならばカーソル行があるメッセージを含むスレッド全てを読まなかったことにします。 (@code{wl-thread-mark-as-unread}) @item t x @kindex t x (Summary) @findex wl-thread-exec カーソル行があるメッセージを先頭とするスレッドのメッセージに対して、一時 的マークに対応するアクションを実行します。 prefix argument つきならばカーソル行があるメッセージを含むスレッド全てに 適用します。 (@code{wl-thread-exec}) @item t * @kindex t * (Summary) @findex wl-thread-target-mark カーソル行があるメッセージを先頭とするスレッドにまとめ処理用マークをつけます。 prefix argument つきならばカーソル行があるメッセージを含むスレッド全体に 適用します。 (@code{wl-thread-target-mark}) @xref{Mark and Action}. @item t o @kindex t o (Summary) @findex wl-thread-refile カーソル行があるメッセージを先頭とするスレッドにリファイルマークをつけます。 prefix argument つきならばカーソル行があるメッセージを含むスレッド全体に 適用します。 (@code{wl-thread-refile}) @xref{Mark and Action}. @item t O @kindex t O (Summary) @findex wl-thread-copy カーソル行があるメッセージを先頭とするスレッドにコピーマークをつけます。 prefix argument つきならばカーソル行があるメッセージを含むスレッド全体に 適用します。 (@code{wl-thread-copy}) @xref{Mark and Action}. @item t d @kindex t d (Summary) @findex wl-thread-dispose カーソル行があるメッセージを先頭とするスレッドに処分マークをつけます。 prefix argument つきならばカーソル行があるメッセージを含むスレッド全体に 適用します。 (@code{wl-thread-dispose}) @xref{Mark and Action}. @item t D @kindex t D (Summary) @findex wl-thread-delete カーソル行があるメッセージを先頭とするスレッドに強制削除マークを付けます。 (@code{wl-thread-delete}) @xref{Mark and Action}. @item t i @kindex t i (Summary) @findex wl-thread-prefetch カーソル行があるメッセージを先頭とするスレッドにプリフェッチ予約マークを 付けます。 (@code{wl-thread-prefetch}) @xref{Mark and Action}. @item t u @kindex t u (Summary) @findex wl-thread-unmark カーソル行があるメッセージを先頭とするスレッドのメッセージにマークがあれば削除します。 prefix argument つきならばカーソル行があるメッセージを含むスレッド全体に 適用します。 (@code{wl-thread-unmark}) @item t y @kindex t y (Summary) @findex wl-thread-save カーソル行があるメッセージを先頭とするスレッドを保存します。 prefix argument つきならばカーソル行があるメッセージを含むスレッド全体を保存します。 (@code{wl-thread-save}) @item m R @kindex m R (Summary) @findex wl-summary-target-mark-mark-as-read まとめ処理用マーク @samp{*} のついたメッセージを読んだことにします。 (@code{wl-summary-target-mark-mark-as-read}) @item m $ @kindex m $ (Summary) @findex wl-summary-target-mark-mark-as-important まとめ処理用マーク @samp{*} のついたメッセージに @samp{important} フラグ をつけます。すでに @samp{important} フラグがあれば取り除きます。 (@code{wl-summary-target-mark-mark-as-important}) @item m F @kindex m F (Summary) @findex wl-summary-target-mark-set-flags まとめ処理用マーク @samp{*} のついたメッセージにミニバッファで入力した任 意のグローバルフラグをつけます。 (@code{wl-summary-target-mark-set-flags}) @item m ! @kindex m ! (Summary) @findex wl-summary-target-mark-mark-as-unread まとめ処理用マーク @samp{*} のついたメッセージを読まなかったことにします。 (@code{wl-summary-target-mark-mark-as-unread}) @item m o @kindex m o (Summary) @findex wl-summary-target-mark-refile まとめ処理用マーク @samp{*} のついたメッセージにリファイルマークをつけます。 (@code{wl-summary-target-mark-refile}) @xref{Mark and Action}. @item m O @kindex m O (Summary) @findex wl-summary-target-mark-copy まとめ処理用マーク @samp{*} のついたメッセージにコピーマークをつけます。 (@code{wl-summary-target-mark-copy}) @xref{Mark and Action}. @item m d @kindex m d (Summary) @findex wl-summary-target-mark-dispose まとめ処理用マーク @samp{*} のついたメッセージに処分マークをつけます。 (@code{wl-summary-target-mark-dispose}) @xref{Mark and Action}. @item m D @kindex m D (Summary) @findex wl-summary-target-mark-delete まとめ処理用マーク @samp{*} のついたメッセージに強制削除マークを付けます。 (@code{wl-summary-target-mark-delete}) @xref{Mark and Action}. @item m i @kindex m i (Summary) @findex wl-summary-target-mark-prefetch まとめ処理用マーク @samp{*} のついたメッセージにプリフェッチ予約マークを 付けます。 (@code{wl-summary-target-mark-prefetch}) @xref{Mark and Action}. @item m y @kindex m y (Summary) @findex wl-summary-target-mark-save まとめ処理用マーク @samp{*} のついたメッセージを保存します。 (@code{wl-summary-target-mark-save}) @item m u @kindex m u (Summary) 全ての一時的マークを消します。 (@code{wl-summary-delete-all-temp-marks}) @findex wl-summary-delete-all-temp-marks @item m a @kindex m a (Summary) 全てのメッセージにまとめ処理用マーク @samp{*} を付けます。 (@code{wl-summary-target-mark-all}) @findex wl-summary-target-mark-all @item m t @kindex m t (Summary) まとめ処理用マーク @samp{*} を現在のスレッドにつけます。 @findex wl-summary-target-mark-thread (@code{wl-summary-target-mark-thread}) @item m T @kindex m T (Summary) まとめ処理用マーク @samp{*} を、現在マークされたメッセージを含むスレッド全体に拡大します。 @findex wl-summary-target-mark-threads (@code{wl-summary-target-mark-threads}) @item m r @kindex m r (Summary) @findex wl-summary-target-mark-region 指定されたリージョンにまとめ処理用マーク @samp{*} をつけます。 (@code{wl-summary-target-mark-region}) @item m A @kindex m A (Summary) @findex wl-summary-target-mark-reply-with-citation まとめ処理用マーク @samp{*} のついたメッセージを引用して返事を書くドラフト を用意します。 (@code{wl-summary-target-mark-reply-with-citation}) @item m f @kindex m f (Summary) @findex wl-summary-target-mark-forward まとめ処理用マーク @samp{*} のついたメッセージをフォワードするドラフトを 用意します。 (@code{wl-summary-target-mark-forward}) @item m U @kindex m U (Summary) @findex wl-summary-target-mark-uudecode まとめ処理用マーク @samp{*} のついたメッセージをまとめて uudecode します。 (@code{wl-summary-target-mark-uudecode}) @item m ? @kindex m ? (Summary) @findex wl-summary-target-mark-pick まとめ処理用マーク @samp{*} のついたメッセージの内、 条件にマッチするメッセージの @samp{*} マークのみを残します。 (@code{wl-summary-target-mark-pick}) @item m # @kindex m # (Summary) @findex wl-summary-target-mark-print まとめ処理用マーク @samp{*} のついたメッセージを印刷します。 (@code{wl-summary-target-mark-print}) @item m | @kindex m | (Summary) @findex wl-summary-target-mark-pipe まとめ処理用マーク @samp{*} のついたメッセージそれぞれを、 指定した他のプロセスにパイプ経由で引き渡します。 (@code{wl-summary-target-mark-pipe}) @item M-t @kindex M-t (Summary) @findex wl-toggle-plugged Wanderlust のオフラインモード/オンラインモードをトグルします。 (@code{wl-toggle-plugged}) @item C-t @kindex C-t (Summary) Wanderlust のサーバ・ポート別のオフライン/オンラインを変更します。 (@code{wl-plugged-change}) @item C-c C-o @kindex C-c C-o (Summary) @findex wl-jump-to-draft-buffer ドラフトバッファがあれば移動します。 複数のドラフトバッファが存在する場合は、 次々と切り替えていきます。また、prefix argument をつけることにより、 バッファが存在していない場合は、ドラフトフォルダからファイルを(存在すれば) 読み込みます。 (@code{wl-jump-to-draft-buffer}) @item M-w @kindex M-w (Summary) @findex wl-summary-save-current-message カーソル行のメッセージのコピー。 (@code{wl-summary-save-current-message}) @item C-y @kindex C-y (Summary) @findex wl-summary-yank-saved-message カーソル行のメッセージを親メッセージとして、 @code{wl-summary-save-current-message} で保存されたメッセージを スレッドに繋ぎます。 (@code{wl-summary-yank-saved-message}) @item C-x C-s @kindex C-x C-s (Summary) @findex wl-summary-save-status 現在のサマリをセーブします。 (@code{wl-summary-save-status}) @end table @node Variables of Summary, , Key Bindings of Summary, Summary @section カスタマイズ変数 @table @code @item wl-summary-move-order @vindex wl-summary-move-order 初期設定は @code{unread}。メッセージを読み進めるときに、何を優先するかを 指定します。新規メッセージを優先したいときは @code{new} を設定します。未 読をメッセージを優先したいときは @code{unread} を設定します。@code{nil} なら単純に次のメッセージに進みます。 @item wl-auto-select-first @vindex wl-auto-select-first 初期設定は @code{nil}。 Non-nil ならフォルダに移動した時に最初のメッセージを自動的に表示します。 @item wl-auto-select-next @vindex wl-auto-select-next 初期設定は @code{nil}。サマリに未読メッセージがなくなった時の動作を指定します。 @example nil: フォルダモードに戻るか尋ねる 'unread: 次の未読ありのフォルダに行くか尋ねる。 移動先のフォルダで crosspost 処理や Score 機能などにより 未読がなくなれば、さらに次のフォルダに行くか尋ねる。 'skip-no-unread: unread と同様。 ただし、移動した先で未読がなくなった場合には、自動的に次の フォルダに行く。 上記以外: 次の未読ありのフォルダに行くか尋ねる。 @end example スペースキーでひたすら読み進めたい人は @code{'skip-no-unread} にしておくのが 便利かもしれません。 @item wl-thread-insert-opened @vindex wl-thread-insert-opened 初期設定は @code{nil}。Non-nil なら最初から thread が開かれた状態でサマ リに表示されます。 @item wl-thread-open-reading-thread @vindex wl-thread-open-reading-thread 初期設定は @code{t}。Non-nil なら、閉じた状態の thread へ移動した時に自 動的に thread を開きます。 @item wl-summary-exit-next-move @vindex wl-summary-exit-next-move 初期設定は @code{t}。Non-nil なら、サマリを終了するときに次のフォルダに 移動します。 @item wl-folder-move-cur-folder @vindex wl-folder-move-cur-folder 初期設定は @code{nil}。Non-nil ならサマリで他のフォルダに移動するとフォ ルダモードでのカーソル位置も合わせて移動します。 @item wl-summary-weekday-name-lang @vindex wl-summary-weekday-name-lang サマリの曜日表示の言語を指定します。@samp{en} なら 英語、@samp{fr} ならフランス語、@samp{de} ならドイツ語となります。 値を変更した後には、サマリを rescan して下さい。 @item wl-summary-fix-timezone @vindex wl-summary-fix-timezone 初期設定は @code{nil}。サマリの日時表示を指定したタイムゾーンに直します。 @code{nil} ならば、デフォルトのタイムゾーンを参照して直します。 デフォルトのタイムゾーンとは、システムにあらかじめ設定されたタイムゾーンか、 環境変数 @samp{TZ} の値です。 @item wl-use-petname @vindex wl-use-petname 初期設定は @code{t}。 Non-nil ならサマリの From 部分にあだ名を表示します。 @item wl-break-pages @vindex wl-break-pages 初期設定は @code{t}。 Non-nil なら、@samp{^L} で改ページしてメッセージを表示します。 @item wl-summary-from-function @vindex wl-summary-from-function サマリの差出人表示の整形に使う関数を指定します。 初期設定は @code{wl-summary-default-from} です。 @item wl-summary-no-from-message @vindex wl-summary-no-from-message 初期設定は @samp{nobody@@nowhere?}。 メッセージに @samp{From:} が無かった場合にサマリに表示する文字列です。 @item wl-summary-subject-function @vindex wl-summary-subject-function サマリのサブジェクト表示の整形に使う関数を指定します。 初期設定は @code{wl-summary-default-subject} で、サブジェクト先頭の リスト名など部分をカットします。 サブジェクトをそのまま表示するには以下のように設定します。 @lisp (setq wl-summary-subject-function 'identity) @end lisp @item wl-summary-no-subject-message @vindex wl-summary-no-subject-message 初期設定は @samp{(WL:No Subject in original.)}。メッセージに @samp{Subject:} が無かった場合にサマリに表示する文字列です。 @item wl-summary-default-view @vindex wl-summary-default-view 初期設定は @code{'thread}。 新規に作成されたサマリの状態をスレッド表示なら @code{'thread}、 番号順なら @code{'sequence} のいずれかで指定します。 @item wl-summary-order @vindex wl-summary-order 初期設定は @code{'ascending}。 @code{'descending} ならサマリバッファのメッセージを降順に並べます。 各スレッド中のメッセージの順序はこの値に関わらず常に昇順です。 @item wl-summary-nobreak-char-display @vindex wl-summary-nobreak-char-display 初期設定は @code{nil}。 サマリバッファ内での @code{nobreak-char-display} の値を この値で上書きします。 @item wl-summary-use-frame @vindex wl-summary-use-frame 初期設定は @code{nil}。 Non-nil ならサマリ表示用に新しいフレームを開きます。 @item wl-use-folder-petname @vindex wl-use-folder-petname 初期設定は以下のリスト。 @lisp @group (modeline) @end group @end lisp @noindent フォルダのあだ名 (petname) を使用する場所(シンボル)のリストを指定します。 指定できるシンボルは次の通りです。 @table @code @item modeline サマリのモードラインを petname で表示します。 @item ask-folder @code{wl-auto-select-next} が non-nil のとき、 移動先フォルダを petname で表示します。 @item read-folder @code{wl-summary-read-folder} におけるフォルダ入力の際、 petname でも補完ができます。 @end table @item wl-summary-move-direction-toggle @vindex wl-summary-move-direction-toggle 初期設定は @code{t}。Non-nil なら最後に実行された @kbd{p}, @kbd{P}, @kbd{n}, @kbd{N} の結果で、次のメッセージが上か下かを切り替える。読んで いる方向を意識したいときは @code{t} にすると良いでしょう。 @item wl-summary-width @vindex wl-summary-width 初期設定は 80。サマリの表示幅を設定された値に切り詰めます。@code{nil} な ら表示幅を切り詰めません。 @item wl-summary-print-argument-within-window @vindex wl-summary-print-argument-within-window 初期設定は @code{nil}。Non-nil なら @code{wl-summary-width} が @code{nil} であってもウィンドウの右端に揃えて、アクション引数を表示しま す。 @item wl-summary-indent-length-limit @vindex wl-summary-indent-length-limit 初期設定は 46。設定された値以上サマリをインデントしません。@code{nil} な らサマリのインデントを無制限にします。 値を @code{nil} にするときは、@code{wl-summary-width} も @code{nil} に設定 するとよいでしょう。 @item wl-summary-max-thread-depth @vindex wl-summary-max-thread-depth 初期設定は 30。設定された値以上の深さのスレッドを分割します。 @item wl-summary-recenter @vindex wl-summary-recenter 初期設定は @code{t}。Non-nil ならば表示したときに表示中のメッセージのサ マリ行をウィンドウの中央付近に移動します。 @item wl-summary-max-thread-depth @vindex wl-summary-max-thread-depth 初期設定は 30。 スレッドの深さがこの値より大きくなるとスレッドを分割します。 @item wl-summary-divide-thread-when-subject-changed @vindex wl-summary-divide-thread-when-subject-changed 初期設定は @code{nil}。 Non-nil ならサブジェクトが変わったときにスレッドを切ります。 @item wl-summary-search-via-nntp @vindex wl-summary-search-via-nntp 初期設定は @code{confirm}。 Non-nil なら @code{wl-summary-jump-to-msg-by-message-id} で、メッセージ を見つけることができなかったときに、 @code{wl-summary-jump-to-msg-by-message-id-via-nntp} を呼び、 @code{elmo-nntp-default-server} で指定されたサーバから検索します。このと き @code{elmo-nntp-default-user}, @code{elmo-nntp-default-port}, @code{elmo-nntp-default-stream-type} で指定した条件でサーバと接続します。 @code{confirm} なら @code{elmo-nntp-default-*} で指定されたサーバから検 索するか、サーバを指定するかを確認します。この場合、サーバのホスト名、も しくは @samp{-:username@@servername:119!} のように NNTP フォルダ形式での 指定が可能です。 @item wl-summary-keep-cursor-command @vindex wl-summary-keep-cursor-command 初期設定は以下のリスト。 @lisp @group (wl-summary-goto-folder wl-summary-goto-last-visited-folder) @end group @end lisp @noindent 既に存在するサマリへ移動したときに更新せず、カーソル位置を保存する コマンドのリストです。 @item elmo-folder-update-threshold @vindex elmo-folder-update-threshold 初期設定は 500。この値よりサマリの更新数が多い場合、一部分だけ更新するか どうか、質問します(@code{elmo-folder-update-confirm} が non-nil の場合)。 @item elmo-folder-update-confirm @vindex elmo-folder-update-confirm 初期設定は @code{t}。Non-nil ならば @code{elmo-folder-update-threshold} による判定を行います。 @item wl-summary-always-sticky-folder-list @vindex wl-summary-always-sticky-folder-list 初期設定は @code{nil}。フォルダ名(正規表現)のリストを設定することにより、 自動的にスティッキーサマリとするかどうかをフォルダ毎に指定します。 @item wl-summary-reserve-mark-list @vindex wl-summary-reserve-mark-list 初期設定は以下のリスト。 @lisp @group ("o" "O" "D" "d" "i") @end group @end lisp @noindent このリストにある一時マークは、消さない限り上書きされません。 @item wl-summary-skip-mark-list @vindex wl-summary-skip-mark-list 初期設定は以下のリスト。 @lisp @group ("D" "d") @end group @end lisp @noindent このリストにある一時マークの付いたメッセージは、カーソル移動の際にスキッ プされます。 @item elmo-message-fetch-threshold @vindex elmo-message-fetch-threshold 初期設定は 30000 (bytes)。この値を越えるサイズのメッセージを表示する時に、 確認を求めます(@code{elmo-message-fetch-confirm} が non-nil の場合)。 @item elmo-message-fetch-confirm @vindex elmo-message-fetch-confirm 初期設定は @code{t}。Non-nil ならば @code{elmo-message-fetch-threshold} に よる判定を行います。 @item wl-prefetch-threshold @vindex wl-prefetch-threshold 初期設定は 30000 (bytes)。@code{wl-prefetch-threshold} を越えるサイズの メッセージは、@code{wl-prefetch-confirm} が non-nil の場合、プリフェッチ 時に確認を求めます。@code{wl-prefetch-threshold}を @code{nil} にすると、 @code{wl-prefetch-confirm} の値にかかわらずプリフェッチを実行します。 @item wl-prefetch-confirm @vindex wl-prefetch-confirm 初期設定は @code{t}。Non-nil ならば @code{wl-prefetch-threshold} を越え るサイズのメッセージをプリフェッチしようとしたときに、確認を求めます。 @item elmo-imap4-use-cache @vindex elmo-imap4-use-cache 初期設定は @code{t}。Non-nil なら、IMAP4 で読んだメッセージをキャッシュ します。 @item elmo-nntp-use-cache @vindex elmo-nntp-use-cache 初期設定は @code{t}。Non-nil なら、NNTP で読んだメッセージをキャッシュし ます。 @item elmo-pop3-use-cache @vindex elmo-pop3-use-cache 初期設定は @code{t}。Non-nil なら、POP3 で読んだメッセージをキャッシュし ます。 @item elmo-shimbun-use-cache @vindex elmo-shimbun-use-cache 初期設定は @code{t}。Non-nil なら、新聞フォルダで読んだメッセージを キャッシュします。 @item wl-summary-resend-use-cache @vindex wl-summary-resend-use-cache 初期設定は @code{nil}。Non-nil はら、オフライン状態でもキャッシュを 使って再送します。キャッシュを用いて再送すると、必ずしも意図した メッセージが使われるとは限らないことに留意してください。 @item wl-folder-process-duplicates-alist @vindex wl-folder-process-duplicates-alist 初期設定は @code{nil}。重複したメッセージが同じフォルダにある場合の動作 を指定します。各項目は、フォルダ名の正規表現と動作からなります。 動作としては以下のものが指定できます。 @example @code{nil} : 重複メッセージに対し,何もしない. @code{hide} : 重複メッセージをサマリに表示しない. @code{read} : 重複メッセージを既読にする. @end example @noindent 例えば以下のように設定します (マルチフォルダで重複メッセージを隠す場合) @lisp @group (setq wl-folder-process-duplicates-alist '(("^\\+draft$" . nil) ("^\\+trash$" . nil) ("^\\*.*" . hide) (".*" . read))) @end group @end lisp @item wl-summary-flag-alist @vindex wl-summary-flag-alist 初期設定は以下の通り。 @lisp @group ((important "orange")) @end group @end lisp サマリでのフラグつきメッセージの色とマークを指定します。マークを省略した 場合は、@code{wl-summary-flag-mark} に指定されたマークが使用されます。一 つのメッセージに複数のグローバルフラグが設定されている場合には、このリス トの前方にあるフラグが優先されます。 設定例: @lisp @group (setq wl-summary-flag-alist '((important "purple") (todo "red") (business "green" "B") (private "blue" "X"))) @end group @end lisp @item wl-summary-display-mime-mode-list @vindex wl-summary-display-mime-mode-list 初期設定は以下のリスト。 @lisp @group (mime as-is) @end group @end lisp @noindent @code{wl-summary-toggle-mime} はこのリストの順に MIME 解析の指定を切り換 えます。MIME 解析の方式には以下のものが指定できます。 @example @code{mime} : MIME 解析を行います @code{header-only} : ヘッダのみ MIME 解析を行います @code{as-is} : MIME 解析を行いません @end example @end table @node Message, Draft, Summary, Top @chapter メッセージバッファ メッセージバッファは SEMI の MIME-View mode です。 操作の方法、キーバインドはそれぞれのドキュメントを参照してください。 @xref{MIME-View, , ,mime-ui-ja, a MIME user interface for GNU Emacs}. また、メッセージバッファにおいて、@kbd{?} でヘルプが参照できます。 メッセージの先頭で @kbd{p}、メッセージの最後尾で @kbd{n} を押すと、サマ リモードに戻ります。また、@kbd{l} を押すと、サマリモードバッファの表示を トグルします。 @section キーバインド @cindex Keybind, Message Mode @cindex Keybind, Message Buffer @table @kbd @item l @kindex l (Message) @findex wl-message-toggle-disp-summary サマリバッファを表示するかどうかをトグルします。 (@code{wl-message-toggle-disp-summary}) @item Button-2 @kindex Button-2 (Message) @findex wl-message-button-refer-article @findex wl-message-header-narrowing マウスポインタの位置に @samp{Message-ID:} があったときに対応するメッセー ジが見つかれば表示します。(@code{wl-message-button-refer-article}) マウスポインタの位置のヘッダが省略表示されていた場合には、全ての内容を表 示します。もう一度押すと再度省略表示します。 @item Button-4 (ホイールつきマウスのホイールを上へ) @kindex Button-4 (Message) @findex wl-message-wheel-down メッセージを上にスクロールします。メッセージの末尾まで到達すると、 次のメッセージに移動します。 (@code{wl-message-wheel-down}) @item Button-5 (ホイールつきマウスのホイールを下へ) @kindex Button-5 (Message) @findex wl-message-wheel-up メッセージを上にスクロールします。メッセージの先頭まで到達すると、 前のメッセージに移動します。 (@code{wl-message-wheel-up}) @item D @kindex D (Message) @findex wl-message-delete-current-part カーソル位置のパートを削除します。実際には、変更したメッセージを 今居るフォルダに追加してから、古いメッセージをゴミ箱に移動するので、 メッセージ番号は変化します。 (@code{wl-message-delete-current-part}) @end table @section カスタマイズ変数 @table @code @item wl-message-window-size @vindex wl-message-window-size 初期設定は @code{(1 . 4)}。cons セルで、car 値: cdr 値がサマリのウィンド ウ幅:メッセージのウィンドウ幅となります。 @item wl-message-ignored-field-list @vindex wl-message-ignored-field-list 初期設定は @code{nil}。 メッセージバッファに表示しないヘッダフィールドを正規表現のリストで 指定します。 @code{nil} なら、@code{mime-view-ignored-field-list} の値を使います。 @item wl-message-visible-field-list @vindex wl-message-visible-field-list 初期設定は @code{nil}。 メッセージバッファに必ず表示したいヘッダフィールドを正規表現のリストで 指定します。@code{wl-message-ignored-field-list} よりも優先されます。 @code{nil} なら、@code{mime-view-visible-field-list} の値を使います。 @item wl-message-sort-field-list @vindex wl-message-sort-field-list 初期設定は '("Return-Path" "Received" "^To" "^Cc" "Newsgroups" "Subject" "^From")。 メッセージバッファに表示するヘッダフィールドの順番を正規表現のリストで 指定します。 @item wl-message-truncate-lines @vindex wl-message-truncate-lines 初期設定では @code{default-truncate-lines} の値を使います。 Non-nil ならメッセージバッファで長い行の折り返しをしません。 @item wl-message-use-header-narrowing @vindex wl-message-use-header-narrowing 初期設定は @code{t}。 Non-nil ならヘッダの省略表示を有効にします。 @item wl-message-header-narrowing-fields @vindex wl-message-header-narrowing-fields 初期設定は以下のリスト。 @lisp ("to" "cc") @end lisp @noindent 省略表示するフィールドを指定します。 @item wl-message-header-narrowing-lines @vindex wl-message-header-narrowing-lines 初期設定は 4。 指定行数以上ある場合に省略表示します。 @item wl-message-header-narrowing-string @vindex wl-message-header-narrowing-string 初期設定は @samp{...}。 ヘッダの内容を省略した時に表示する文字列を指定します。 @item wl-message-auto-reassemble-message/partial @vindex wl-message-auto-reassemble-message/partial 初期設定は @code{nil}。 Non-nil なら MIME メディアタイプが message/partial のメッセージを表示する 際に、自動的に結合して表示します。 @end table @node Draft, Disconnected Operations, Message, Top @chapter ドラフトバッファ サマリモードやフォルダモードで @kbd{w} を押すと新規ドラフトバッファが用意 されます。このバッファでは、メールやニュース記事の(新規)編集、送信を行います。 @kbd{W} を押すと、(可能であれば)宛先を推測してドラフトバッファを用意しま す。 @menu * Usage of Draft Mode:: 基本的な使い方 * Key Bindings of Draft:: キーバインド * Variables of Draft Mode:: カスタマイズ変数 @end menu @node Usage of Draft Mode, Key Bindings of Draft, Draft, Draft @section 使い方(TIPS) 基本は Emacs 標準のメールモードです。 @menu * Parameters for Sending:: 送信の為のパラメータ * Editing Header:: ヘッダの編集 * Editing Message Body and Sending:: メッセージの編集と送信 * Dynamical Message Re-arrangement:: メッセージの動的な変更 * Template:: テンプレートの挿入 * POP-before-SMTP:: POP-before-SMTP によるメールの送信 @end menu @node Parameters for Sending, Editing Header, Usage of Draft Mode, Usage of Draft Mode @subsection 送信の為のパラメータ メッセージの送信に使うサーバの情報に沿って以下の変数を設定して下さい。 @table @code @item wl-smtp-posting-server メール送信時の SMTP サーバ名です。 @item wl-smtp-posting-port メール送信時の SMTP ポート番号です。 設定していない場合はデフォルトの SMTP ポート番号(25)を使います。 @item wl-nntp-posting-server ニュース投稿時の NNTP サーバ名です。 設定していない場合は @code{elmo-nntp-default-server} を使います。 @item wl-nntp-posting-port ニュース投稿時の NNTP サーバのポート番号です。 設定していない場合は @code{elmo-nntp-default-port} を使います。 @end table 必要に応じて以下の変数も設定して下さい。詳細はカスタマイズ変数の節を参照 して下さい。 @xref{Variables of Draft Mode}. @table @code @item wl-smtp-posting-user SMTP AUTH による認証を行なうときのユーザ名です。 @item wl-smtp-authenticate-type SMTP AUTH による認証を行なうときの認証方式です。 設定していない場合は認証を行いません。 @item wl-smtp-authenticate-realm SMTP AUTH による認証を行なうときのレルム(realm)を指定します。 設定していない場合はレルムの指定を行いません。 @item wl-smtp-connection-type SMTP のコネクションをどのように張るかを指定します。 @item wl-nntp-posting-user ニュース投稿時に AUTHINFO による認証を行なうときのユーザ名です。 @item wl-nntp-posting-stream-type NNTP のコネクションをどのように張るかを指定します。 @end table @node Editing Header, Editing Message Body and Sending, Parameters for Sending, Usage of Draft Mode @subsection ヘッダの編集 実際に送信操作を行なうまでであれば、@samp{--text follows this line--} より上のヘッダ領域は自由に編集することができます。 初期状態では @samp{To:} にカーソルがあります。送信相手のアドレスを入力し てください。アドレスを入力する際には、@kbd{@key{TAB}} で補完ができます。 メッセージの宛先を指定するために、以下のフィールドが利用できます。それぞれ 自分で書き加えて下さい。フィールド名を入力する際には、@kbd{@key{TAB}}で 補完ができます。 @table @asis @item @samp{Newsgroups:} ニュース記事として出す場合の投稿先を指定します。 @item @samp{Cc:} メッセージのコピー(Carbon Copy)を送付するアドレス。 @end table 以下のヘッダは、送信されるメッセージからは削除されます。 @table @asis @item @samp{Bcc:} メッセージのコピー(Blind Carbon Copy)を送付するアドレス。 @item @samp{Fcc:} 送信したメッセージを保存するフォルダを指定します。 @item @samp{Ecc:} 送信したメッセージをカプセル化して転送します。 @end table 以下の変数により、最初に用意するヘッダを追加できます。 @table @code @item wl-fcc @vindex wl-fcc 初期設定は @code{nil}。 Non-nil なら、設定された値をドラフトの @samp{Fcc:} として最初から挿入します。 関数が指定されている場合、関数の返り値(string) が挿入されます。 @item wl-bcc @vindex wl-bcc 初期設定は @code{nil}。 Non-nil なら、設定された値をドラフトの @samp{Bcc:} として最初から挿入します。 @end table @node Editing Message Body and Sending, Dynamical Message Re-arrangement, Editing Header, Usage of Draft Mode @subsection メッセージの編集と送信 説明するまでもないですが、メッセージ本文の編集は基本的に通常の文章作成と 同様に行ないます。本文は @samp{--text follows this line--} の行より下に 記述します。(注意: @samp{--text follows this line--} の行はいじらないで 下さい。) マルチパートの編集は SEMI の MIME 編集モードを利用しています。 編集の方法については各パッケージ付属のドキュメントを参照してください。 @xref{MIME-Edit, , ,mime-ui-ja, a MIME user interface for GNU Emacs}. また、ドラフトバッファにおいて、@kbd{C-c C-x ?} でヘルプが参照できます。 編集中のドラフトをセーブすると、@code{wl-draft-folder} で設定したドラフ トフォルダに追加されます。@kbd{C-c C-z} (@code{wl-draft-save-and-exit}) により、後から編集できるようにそれをセーブした上でドラフトバッファを離脱 できます。ドラフトフォルダに入って @kbd{E} (@code{wl-summary-reedit}) を 押せば、編集を再開できます (@pxref{Key Bindings of Summary})。 メッセージの編集が完了したら、@kbd{C-c C-c} で送信できます。 @node Dynamical Message Re-arrangement, Template, Editing Message Body and Sending, Usage of Draft Mode @subsection メッセージの動的な変更 @vindex wl-draft-config-alist @c @cindex Chage Message @c @cindex Message, Chage Dynamic @code{wl-draft-config-alist} を設定すると、ヘッダやその他の情報に基づい て、自動的に他のヘッダや本文を変更することができます。 変数 @code{wl-draft-config-alist} について説明します。この変数の初期設定 は @code{nil} です。 例えば以下のように設定すると、@code{wl-draft-send-and-exit} や @code{wl-draft-send} を実行した時にヘッダが変更されます。 @code{wl-interactive-send} を non-nil に設定しておくと、送信前に変更点が 確認できるので安心です。 @lisp @group (setq wl-draft-config-alist '(((string-match "aaa\\.example\\.com$" (system-name)) ;; @r{式がnon-nilなら適用する} (wl-smtp-posting-server . "mailserver-B") (wl-nntp-posting-server . "newsserver-B") ;; @r{一時的な変数の設定} ) ("^To: .*user@@aaa\\.bbb\\.example\\.com" ;; @r{ドラフトバッファのヘッダにマッチすれば適用する} ("Organization" . (format "Go %s" my-webpage))) ;; @r{elisp 式が書ける (eval しているだけ)} (top . " ○○です。\n") ;; @r{本文先頭へ文字列を挿入します} (bottom . "\n以上です。\n") ;; @r{本文末尾へ文字列を挿入します} )) @end group @end lisp @code{wl-draft-config-alist} は次の形式になっています。 @example @group '((@var{ヘッダの正規表現} または elisp式 ("@var{Field}" . 値(elisp式)) (@var{variable} . 値(elisp式)) (@var{サブ関数} . 値(elisp式)) @var{関数} @dots{}) (@var{ヘッダの正規表現} または elisp式 ("@var{Field}" . 値(elisp式)) @dots{})) @end group @end example [サブ関数]には、デフォルトで以下の13個を用意しています。 @example 'header: ヘッダの末尾に指定した文字列を挿入します。 'header-top: ヘッダの先頭に指定した文字列を挿入します。 'header-file: ヘッダの末尾に指定したファイルを挿入します。 'x-face: 指定したファイルの内容を持つ @samp{X-Face:} フィールドを 挿入します。 'top: 本文の先頭に指定した文字列を挿入します。 'top-file: 本文の先頭に指定したファイルを挿入します。 'body: 本文を指定した文字列に置き換えます。 @code{nil} を指定すると本文の文字列を削除します。 'body-file: 本文を指定したファイルの内容で置き換えます。 'bottom: 本文の末尾に指定した文字列を挿入します。 'bottom-file: 本文の末尾に指定したファイルを挿入します。 'part-top: 現在のマルチパートの先頭に指定した文字列を挿入します。 'part-bottom: 現在のマルチパートの末尾に指定した文字列を挿入します。 'template: 指定したテンプレートを適用します。 (次項 テンプレートの挿入参照) @end example また、これらを定義しているのは @code{wl-draft-config-sub-func-alist} で あり、定義を変更したり自分で作った関数を追加することができます。関数の書 き方はここで説明するより直接コードを見た方が分かりやすいでしょうから、省 略します。 各要素の1番目には @var{ヘッダの正規表現} か elisp 式 を指定します。elisp 式の場合は評価した値が non-nil の場合に適用されます。 また、デフォルトでは複数の要素がマッチまたは non-nil になった場合に、その 全てが適用されます。ここで、変数 @code{wl-draft-config-matchone} を @code{t} にしてあれば、最初にマッチした1つだけを適用することもできます。 要素の2番目には cons か関数の list を指定します。cons にはヘッダの Field か変数、サブ関数を指定します。Field を指定した場合はその Field を変更し、 変数を指定した場合は一時的にその変数値を変更します。 値には文字列や変数の他、elisp式をそのまま記述することもできます。もし、 Field の値が @code{nil} ならばその Field を削除します。 つづいて、次の例を見て下さい。 @lisp @group (setq wl-draft-config-alist '((reply ;; @r{(1)} "X-ML-Name: \\(Wanderlust\\|emacs-mime-ja\\|apel-ja\\)" ;; @r{返信元バッファのヘッダにマッチすれば適用する} (body . " こんにちは\n") (template . "default") ))) @end group @end lisp この例 (1)のように、ヘッダの正規表現の前に @code{reply} をつけると @code{wl-summary-reply} などでドラフトを作成した場合、返信元のヘッダにマッ チすれば適用されるようになります。ただし、@code{wl-draft} を実行したとき など返信元のバッファがない場合は無視されます。 親フォルダの名前を利用したい場合には、バッファローカル変数 @code{wl-draft-parent-folder} を利用できます。次の例では、ドラフトを開く時に 居たサマリバッファのフォルダ名によって From を変更します。 @lisp @group (setq wl-draft-config-alist '(((string-match \".*@@domain1$\" wl-draft-parent-folder) (\"From\" . \"user@@domain1\")) ((string-match \".*@@domain2$\" wl-draft-parent-folder) (\"From\" . \"user@@domain2\")))) @end group @end lisp 何も特別な設定をしなければ、@code{wl-draft-config-alist} は、 @code{wl-draft-send-and-exit} か @code{wl-draft-send} が実行される直前に 一度だけ適用されます。送信を取りやめた後に再度 @code{wl-draft-config-alist} を適用したい場合は、@kbd{C-c C-e} (@code{wl-draft-config-exec}) を実行してください。 @code{wl-draft-send-and-exit}、@code{wl-draft-send} の実行時に自動的に @code{wl-draft-config-alist} を適用したくない場合は、次のように設定して 下さい。 @lisp (remove-hook 'wl-draft-send-hook 'wl-draft-config-exec) @end lisp ドラフトバッファの作成時に自動的に @code{wl-draft-config-alist} を適用したい場合は、次のように設定します。 @lisp (add-hook 'wl-mail-setup-hook 'wl-draft-config-exec) @end lisp サマリモードから 'E'(@code{wl-summary-reedit})を押してメールを 編集する時にも自動的に @code{wl-draft-config-alist} を適用したい場合は、 次のように設定します。 @lisp (add-hook 'wl-draft-reedit-hook 'wl-draft-config-exec) @end lisp @node Template, POP-before-SMTP, Dynamical Message Re-arrangement, Usage of Draft Mode @subsection テンプレートの挿入 @cindex Template @cindex Apply Template 変数 @code{wl-template-alist} を設定し、ドラフトバッファで@kbd{C-c C-j} もしくは @kbd{M-x wl-template-select}と入力することで適用します。 @code{wl-template-alist} の書式は @code{wl-draft-config-alist} とほぼ同 じです。 @xref{Dynamical Message Re-arrangement}. @lisp @group (setq wl-template-alist '(("default" ("From" . wl-from) ("Organization" . "組織名") (body . " ○○です。\n")) ("report" (template . "default") ;; @r{(a)} ("To" . "jousi@@example.com") ("Subject" . "報告") (body-file . "~/work/report.txt") ) )) @end group @end lisp このようにヘッダの正規表現の代わりに @samp{default} や @samp{report} の ように各要素の名前(テンプレート名)をつけるだけです。各要素の定義は @code{wl-draft-config-alist} と同じなので、(a)のように別のテンプレートを 呼ぶことも可能です。 コマンド @code{wl-template-select} を実行すると、テンプレートを選択できま す。変数 @code{wl-template-visible-select} の値によって、それぞれ以下の ように振舞います。 @code{wl-template-visible-select} が @code{t} (デフォルト)の場合、ドラフ トバッファの下に適用後のバッファウィンドウが表示されるので、それを見なが ら @kbd{n} と @kbd{p} で選択します。そしてリターンキーで決定すると実際に ドラフトバッファに適用されます。@kbd{q} を押すと何も適用されません。なお、 @code{wl-template-buffer-lines} でウィンドウの大きさを変更できます。 @code{wl-template-visible-select} が @code{nil} の場合、ミニバッファでテ ンプレート名を入力することで選択します。 @code{wl-template-select} を prefix argument つきで実行した場合には、 @code{wl-template-visible-select} の値を逆にした動作になります。 また、@code{wl-draft-config-alist} の例のように例えば @lisp (template . "default") @end lisp @noindent と書くことで @samp{default} のテンプレートを適用できます。 @node POP-before-SMTP, , Template, Usage of Draft Mode @subsection POP-before-SMTP によるメールの送信 @cindex POP-before-SMTP @cindex SMTP-after-POP POP-before-SMTP によるメールの送信ができます。 そのために必要な設定は、メール送信に用いる関数をデフォルトの @code{wl-draft-send-mail-with-smtp} から変更する @lisp (setq wl-draft-send-mail-function 'wl-draft-send-mail-with-pop-before-smtp) @end lisp @noindent と合わせて、必要に応じて以下の変数を設定してください。 @table @code @item wl-pop-before-smtp-user POP-before-SMTP で認証を行なうときの POP ユーザ名です。 設定していない場合は @code{elmo-pop3-default-user} を使います。 @item wl-pop-before-smtp-server POP-before-SMTP で認証を行なうときの POP サーバ名です。 設定していない場合は @code{elmo-pop3-default-server} を使います。 @item wl-pop-before-smtp-authenticate-type POP-before-SMTP で認証を行なうときの POP 認証方式です。 設定していない場合は @code{elmo-pop3-default-authenticate-type} を使います。 @item wl-pop-before-smtp-port POP-before-SMTP で認証を行なうときの POP ポート番号です。 設定していない場合は @code{elmo-pop3-default-port} を使います。 @item wl-pop-before-smtp-stream-type @code{ssl} なら SSL を利用して POP コネクションを張ります。@code{starttls} なら STARTTLS (RFC2595) を利用してコネクションを張ります。設定していな い場合は @code{elmo-pop3-default-stream-type} を使います。 @end table POP-before-SMTP 用の変数 (@code{wl-pop-before-smtp-*})を設定していない場 合には、POP フォルダの設定 (@code{elmo-pop3-default-*}) が用いられます。その ため、SMTP サーバと POP サーバの実体が同じで、デフォルト設定の POP フォル ダ(@samp{&} など)が利用可能なら、設定は不要です。 なお、POP-before-SMTP については以下を参照してください。 @example @group @uref{http://www.iecc.com/pop-before-smtp.html} @end group @end example @node Key Bindings of Draft, Variables of Draft Mode, Usage of Draft Mode, Draft @section キーバインド @cindex Keybind, Draft Mode @cindex Keybind, Draft Buffer @table @kbd @item C-c C-y @kindex C-c C-y (Draft) @findex wl-draft-yank-original 現在表示中のメッセージバッファ(カーソル位置のパート)の内容を引用します。 リージョンが有効な場合には、リージョンを引用します (@code{transient-mark-mode} が Non-nil の時のみ)。 また、prefix argument を付けると、yank で挿入されるテキスト の内容(クリップボードの内容)が引用されます。 (@code{wl-draft-yank-original}) @item C-c C-p @kindex C-c C-p (Draft) @findex wl-draft-preview-message 現在のドラフトの内容をプレビューします。 MIME のマルチパートメッセージの確認に使うと便利です。 (@code{wl-draft-preview-message}) @item C-c C-s @kindex C-c C-s (Draft) @findex wl-draft-send 現在のドラフトの内容を送信します。ドラフトバッファは消去しません。 複数の人に少しずつ内容を変えてメッセージを送りたい場合に便利です。 (@code{wl-draft-send}) @item C-c C-c @kindex C-c C-c (Draft) @findex wl-draft-send-and-exit 現在のドラフトの内容を送信し、ドラフトバッファを消去します。 (@code{wl-draft-send-and-exit}) @item C-x C-s @kindex C-x C-s (Draft) @findex wl-draft-save 現在のドラフトをセーブします。 (@code{wl-draft-save}) @item C-c C-k @kindex C-c C-k (Draft) @findex wl-draft-kill 現在のドラフトを破棄します。 セーブしていた場合、@samp{+draft} フォルダからも削除されます。 (@code{wl-draft-kill}) @item C-x k @kindex C-x k (Draft) @findex wl-draft-mimic-kill-buffer 現在のドラフトを破棄します。 (@code{wl-draft-mimic-kill-buffer}) @item C-c C-z @kindex C-c C-z (Draft) @findex wl-draft-save-and-exit 現在のドラフトをセーブし、ドラフトバッファを消去します。 ドラフトの編集を中断したいときに便利です。 (@code{wl-draft-save-and-exit}) @item C-c C-r @kindex C-c C-r (Draft) @findex wl-caesar-region 指定されたリージョンをシーザ暗号でエンコード/デコードします。 (@code{wl-caesar-region}) @item C-l @kindex C-l (Draft) @findex wl-draft-highlight-and-recenter 現在のドラフトをハイライトしなおします。 (@code{wl-draft-highlight-and-recenter}) @item M-t @kindex M-t (Draft) @findex wl-toggle-plugged Wanderlust のオフラインモード/オンラインモードをトグルします。 (@code{wl-toggle-plugged}) @item C-c C-o @kindex C-c C-o (Draft) @findex wl-jump-to-draft-buffer 他のドラフトバッファがあれば移動します。 また、prefix argument をつけることにより、バッファが存在していない場合は、 ドラフトフォルダからファイルを(存在すれば)読み込みます。 (@code{wl-jump-to-draft-buffer}) @item C-c C-e @kindex C-c C-e (Draft) @findex wl-draft-config-exec @code{wl-draft-config-alist}を適用します。 (@code{wl-draft-config-exec}) @item C-c C-j @kindex C-c C-j (Draft) @findex wl-template-select テンプレートを選択します。 (@code{wl-template-select}) @item C-c C-a @kindex C-c C-a (Draft) @findex wl-addrmgr アドレスマネージャを起動します。 @xref{Address Manager}. (@code{wl-addrmgr}) @item C-c C-d @kindex C-c C-d (Draft) @findex wl-draft-elide-region ポイントとマークの間の文を省きます (@code{wl-draft-elide-region})。文章 は切られて (killed) 変数 @code{wl-draft-elide-ellipsis} の値で置き換えら れます。デフォルトの省略符号として使われる値は (@samp{[...]}) です。 @end table @node Variables of Draft Mode, , Key Bindings of Draft, Draft @section カスタマイズ変数 @cindex SMTP AUTH @table @code @item wl-subscribed-mailing-list @vindex wl-subscribed-mailing-list 初期設定は @code{nil}。参加しているメーリングリストのリスト。返事のドラ フトを用意するときに @samp{Mail-Followup-To:} や @samp{Cc:} にこれらが含 まれるときは自分のアドレスを除きます。また、これらが @samp{To:} か @samp{Cc:} に含まれるときには、そのアドレスでリファイル先を覚えます。 設定例: @lisp @group (setq wl-subscribed-mailing-list '("wl@@ml.gentei.org" "apel-ja@@m17n.org" "emacs-mime-ja@@m17n.org")) @end group @end lisp @item wl-insert-mail-followup-to @vindex wl-insert-mail-followup-to 初期設定は @code{nil}。Non-nil なら、@samp{Mail-Followup-To:} フィールド をドラフトバッファに自動的に挿入します。 @item wl-insert-mail-reply-to @vindex wl-insert-mail-reply-to 初期設定は @code{nil}。Non-nil なら、@samp{Mail-Reply-To:} フィールドを ドラフトバッファに自動的に挿入します。 @item wl-auto-insert-x-face @vindex wl-auto-insert-x-face 初期設定は @code{t}。Non-nil でかつ、エンコードされた X-Face 文字列を @file{~/.xface} (変数 @code{wl-x-face-file} の値)の内容に用意しておくと、 ドラフトを準備するときに自動的に @samp{X-Face:} フィールドとして挿入され ます。@code{nil} の場合は自動的には挿入しません。 @item wl-insert-message-id @vindex wl-insert-message-id 初期設定は @code{t}。 Non-nil なら、送信時に @samp{Message-ID:} フィールドを自動的に挿入します。 @item wl-message-id-use-message-from @vindex wl-message-id-use-message-from 初期設定は @code{t}。Non-nil なら、@samp{Message-ID:} のドメインパートに @samp{From:} フィールド、もしくは @code{wl-from} の値を利用します。 @item wl-local-domain @vindex wl-local-domain 初期設定は @code{nil}。@code{nil} ならば @samp{Message-ID:} のドメインパー トには関数 @code{system-name} の返り値を設定します。 @code{system-name} が FQDN (@samp{smtp.gohome.org} のようなホストのフル ネーム) を返さない場合は、この変数に @strong{必ず} ホスト名を除いたドメ イン名 (@samp{gohome.org}など) を設定してください。 もし、グローバルな IP アドレスを持たない場合は、@code{wl-message-id-domain}を設定してください。 (@samp{Message-ID:} のドメインがおかしいと、ネットニュースでふくろ叩きに あってしまう可能性があります。) また、この値を設定している場合、@code{system-name} にこの値を付加したホ スト名を SMTP の HELO の引数として利用します。 @item wl-message-id-domain @vindex wl-message-id-domain 初期設定は @code{nil}。Non-nil なら、@samp{Message-ID:} のドメインパート に使用されます。グローバルな IP アドレスを持たない場合など、ドメインパー トを決められない場合は、@code{wl-message-id-domain} に一意な文字列(例え ば、メールアドレスなど)を設定してください。 @item wl-unique-id-suffix @vindex wl-unique-id-suffix 初期設定は @samp{.wl}。Message-ID を生成する際に @samp{@@} または @samp{%} の直前に現れる文字列を指定します。 @item wl-draft-config-alist @vindex wl-draft-config-alist 初期設定は @code{nil}。 送信直前にドラフトメッセージを変更します。自動的に @code{wl-draft-config-alist} の内容が適用されるのは送信時に一度だけです。 もし,手動で適用する場合は,@kbd{C-c C-e} (@code{wl-draft-config-exec}) を使用してください。このコマンドは何度でも適用できます。 @item wl-template-alist @vindex wl-template-alist 初期設定は @code{nil}。 ドラフトバッファで適用するテンプレートを設定します。 @item wl-draft-config-matchone @vindex wl-draft-config-matchone 初期設定は @code{nil}。Non-nil なら @code{wl-draft-config-alist} の適用 時に最初にマッチした要素のみを適用します。@code{nil} ならマッチしたもの すべてを適用します。 @item wl-template-visible-select @vindex wl-template-visible-select 初期設定は @code{t}。 Non-nil なら別ウィンドウに適用後の状態を表示しながらテンプレートを選択します。 @item wl-template-confirm @vindex wl-template-confirm 初期設定は @code{nil}。 Non-nil ならウィンドウを表示しながらテンプレートを選択する場合、リターン キーで選択する時に確認を行います。 @item wl-template-buffer-lines @vindex wl-template-buffer-lines 初期設定は 7。 @code{wl-template-visible-select}が non-nil の場合、 適用後の状態を表示するウィンドウの大きさを指定します。 @item wl-draft-buffer-style @vindex wl-draft-buffer-style 初期設定は @code{full}。 (返信と転送の場合以外の)ドラフトバッファのウインドウの形態を指定します。 @table @code @item keep 現在のウィンドウを使います。 @item full フレーム全体のウインドウを使います。 @item split 現在のウィンドウを垂直に分割して使います。 @item split-horiz 現在のウィンドウを水平に分割して使います。 @item msg-split 返信時のようにメッセージバッファのウィンドウを垂直に分割して使います。 @item msg-split-horiz 返信時のようにメッセージバッファのウィンドウを水平に分割して使います。 @end table 関数が指定された場合、ドラフトバッファを引数としてそれ呼び出します。 @item wl-draft-reply-buffer-style @vindex wl-draft-reply-buffer-style 初期設定は @code{split}。 返信と転送の場合のドラフトバッファのウインドウの形態を指定します。 @table @code @item keep メッセージバッファのウィンドウを使います。 @item full フレーム全体のウインドウを使います。 @item split メッセージバッファのウィンドウを垂直に分割して使います。 @item split-horiz メッセージバッファのウィンドウを水平に分割して使います。 @end table 関数が指定された場合、ドラフトバッファを引数としてそれ呼び出します。 @item wl-draft-use-frame @vindex wl-draft-use-frame 初期設定は @code{nil}。 Non-nil ならドラフト用に新しいフレームを開きます。 @item wl-draft-reply-default-position @vindex wl-draft-reply-default-position 初期設定は @code{body} 返信の場合のドラフトでのカーソルの初期位置を指定します。 @code{body} とするとメッセージ本文の先頭、@code{bottom} とすると本文末尾、 @code{top} とするとヘッダの先頭にカーソルを移動します。 @item wl-draft-truncate-lines @vindex wl-draft-truncate-lines 初期設定では @code{default-truncate-lines} の値を使います。Non-nil なら ドラフトバッファで長い行の折り返しをしません。 @item wl-from @vindex wl-from 初期設定は変数 @code{user-mail-address} の値。 設定された値をドラフトの @samp{From:} フィールドとして最初から挿入します。 @item wl-envelope-from @vindex wl-envelope-from 初期設定は @code{nil}。 設定した値を envelope from (MAIL FROM) に使用します。 @code{nil} なら @code{wl-from} のアドレス部分を使用します。 @item wl-user-mail-address-list @vindex wl-user-mail-address-list 初期設定は @code{nil}。 ユーザのアドレスリストです。 アドレスを複数持っている場合は設定してください。 @item wl-reply-subject-prefix @vindex wl-reply-subject-prefix 初期設定は @samp{Re: }。 返信時のドラフトの @samp{Subject:} で、元記事の @samp{Subject:} の先頭に 付け加える文字列です。返信対象のメッセージバッファで評価される関数を指定 することもできます。 @item wl-forward-subject-prefix @vindex wl-forward-subject-prefix 初期設定は @samp{Forward: }。 転送時のドラフトの @samp{Subject:} で、元記事の @samp{Subject:} の先頭に 付け加える文字列です。転送対象のメッセージバッファで評価される関数を指定 することもできます。 @item wl-draft-reply-use-address-with-full-name @vindex wl-draft-reply-use-address-with-full-name 初期設定は @code{t}。 Non-nil なら返信アドレスの @samp{To:}, @samp{Cc:} フィールドに相手のフル ネームを挿入します。@code{nil} ならアドレスだけを挿入します。 @item wl-draft-enable-queuing @vindex wl-draft-enable-queuing 初期設定は @code{t}。 オフライン送信するかどうかを示すフラグです。Non-nil ならオフライン送信します。 @item wl-draft-use-cache @vindex wl-draft-use-cache 初期設定は @code{nil}。送信するメッセージをキャッシュするかどうかを示すフ ラグです。Non-nil ならキャッシュします。ただし @code{wl-insert-message-id}が nil の場合はキャッシュしません。 @item wl-fcc-force-as-read @vindex wl-fcc-force-as-read 初期設定は @code{nil}。Non-nil なら @samp{Fcc:} で保存したメッセージを 既読にします。 @item wl-auto-flush-queue @vindex wl-auto-flush-queue 初期設定は @code{t}。 オンラインになったときに自動的にキューを送信するかどうかを示すフラグです。 Non-nil なら自動的に送信します (一応 @code{y-or-n-p} で確認します)。 手動でキューを送信するには、フォルダモードで @kbd{F} を押してください。 @item wl-ignored-forwarded-headers @vindex wl-ignored-forwarded-headers 初期設定は @samp{\\(received\\|return-path\\|x-uidl\\)}。 転送時に削除するヘッダフィールド名を正規表現で指定します。 @item wl-ignored-resent-headers 初期設定は @samp{\\(return-receipt\\|[bdf]cc\\)}。 再送時に削除するヘッダフィールド名を正規表現で指定します。 @item wl-draft-always-delete-myself @vindex wl-draft-always-delete-myself Non-nil なら、自分宛てのメールに返信する場合、常に @samp{To:}, @samp{Cc:} から自分のメールアドレスを削除します。 @item wl-draft-delete-myself-from-bcc-fcc @vindex wl-draft-delete-myself-from-bcc-fcc Non-nil で、@samp{To:}, @samp{Cc:} が 変数 @code{wl-subscribed-mailing-list} に 含まれている場合、@samp{Bcc:} , @samp{Fcc:} をつけません. @item wl-draft-send-mail-function @vindex wl-draft-send-mail-function 初期設定は @code{wl-draft-send-mail-with-smtp}。 メール送信に使う関数です。POP-before-SMTP を利用する場合は @code{wl-draft-send-mail-with-pop-before-smtp} に設定します。 @item wl-smtp-posting-server @vindex wl-smtp-posting-server 初期設定は @code{nil}。 メール送信時の SMTP サーバ名です。 @item wl-smtp-posting-port @vindex wl-smtp-posting-port 初期設定は @code{nil}。 メール送信時の SMTP ポート番号です。 @code{nil} ならデフォルトの SMTP ポート番号(25)を使います。 @item wl-smtp-posting-user @vindex wl-smtp-posting-user 初期設定は @code{nil}。 SMTP AUTH による認証を行なうときのユーザ名です。 @item wl-smtp-authenticate-type @vindex wl-smtp-authenticate-type 初期設定は @code{nil}。 SMTP AUTH による認証を行なうときの認証方式を文字列で指定します。 値として @code{plain}, @code{cram-md5}, @code{digest-md5}, @code{login} などが指定できます。 @code{nil} なら認証を行いません。 @item wl-smtp-authenticate-realm @vindex wl-smtp-authenticate-realm 初期設定は @code{nil}。 SMTP AUTH による認証を行なうときのレルム(realm)を文字列で指定します。 レルムの指定は DIGEST-MD5 等の認証方式で必要な場合があります。 @code{nil} の場合はレルムの指定を行いません。 @item wl-smtp-connection-type @vindex wl-smtp-connection-type 初期設定は @code{nil}。 SMTP のコネクションをどのように張るかをシンボルで指定します。 @code{nil} ならデフォルトの接続型式を利用します。 @code{starttls} なら STARTTLS (RFC3207)を利用してコネクションを張ります。 @code{ssl} なら SSL を利用します。 @item wl-nntp-posting-server @vindex wl-nntp-posting-server 初期設定は @code{nil}。 ニュース投稿時の NNTP サーバ名です。 @code{nil} なら @code{elmo-nntp-default-server} を使います。 @item wl-nntp-posting-user @vindex wl-nntp-posting-user 初期設定は @code{nil}。 ニュース投稿時に AUTHINFO による認証を行なうときのユーザ名です。 @code{nil} なら @code{elmo-nntp-default-user} を使います。 それでも @code{nil} なら AUTHINFO による認証を行ないません。 @item wl-nntp-posting-port @vindex wl-nntp-posting-port 初期設定は @code{nil}。 ニュース投稿時の NNTP サーバのポート番号。 @code{nil} なら @code{elmo-nntp-default-port} を使います。 @item wl-nntp-posting-stream-type @vindex wl-nntp-posting-stream-type 初期設定は @code{nil}。 @code{nil} なら @code{elmo-nntp-default-stream-type} を評価します。 @code{ssl} ならニュース投稿時に SSL を利用します。 @code{starttls}なら STARTTLS (RFC2595)を利用してコネクションを張ります。 @item wl-nntp-posting-function @vindex wl-nntp-posting-function 初期設定は @code{elmo-nntp-post}。 ニュース投稿のための関数。 @item wl-nntp-posting-config-alist @vindex wl-nntp-posting-config-alist 初期設定は @code{nil}。 以下の例のようにして、ニュース投稿時のサーバ選択方法を設定します。 @code{wl-nntp-posting-@{server|user|port|function@}}より優先されます。 @lisp @group (setq wl-nntp-posting-config-alist '((",?gmane\\." . "news.gmane.org") (",?comp\\." . ((server . "news-server") (user . "newsmaster") (port . 119) (function . elmo-nntp-post))) (".*" . "default-news-server"))) @end group @end lisp @item wl-pop-before-smtp-user @vindex wl-pop-before-smtp-user 初期設定は @code{nil}。 POP-before-SMTP で POP を行なうときのユーザ名です。 @code{nil} のままなら @code{elmo-pop3-default-user}を利用します。 @item wl-pop-before-smtp-server @vindex wl-pop-before-smtp-server 初期設定は @code{nil}。 POP-before-SMTP で POP を行なうときのサーバ名です。 @code{nil} のままなら @code{elmo-pop3-default-server}を利用します。 @item wl-pop-before-smtp-authenticate-type @vindex wl-pop-before-smtp-authenticate-type 初期設定は @code{nil}。 POP-before-SMTP で POP を行なうときの認証方式です。 @code{nil} のままなら @code{elmo-pop3-default-authenticate-type}を利用します。 @item wl-pop-before-smtp-port @vindex wl-pop-before-smtp-port 初期設定は @code{nil}。 POP-before-SMTP で POP を行なうときのポート番号です。 @code{nil} のままなら @code{elmo-pop3-default-port}を利用します。 @item wl-pop-before-smtp-stream-type @vindex wl-pop-before-smtp-stream-type 初期設定は @code{nil}。 POP-before-SMTP で SSL を利用するかどうかを示すフラグです。@code{nil} の ままなら @code{elmo-pop3-default-stream-type}を利用します。 @code{ssl} なら SSL を利用します。 @code{starttls}なら STARTTLS (RFC2595)を利用してコネクションを張ります。 @item wl-draft-queue-save-variables @vindex wl-draft-queue-save-variables オフライン送信時にキューに格納したメッセージについて保存しておく変数を リストで指定します。 @item wl-draft-sendlog @vindex wl-draft-sendlog 初期設定は @code{t}。 @code{t} なら @file{~/.elmo/sendlog} に送信ログを出力します。 ログを出力するタイミングは以下の通りです(失敗の場合も)。 @itemize @minus @item smtp, qmail による送信 @item fcc によるフォルダへの格納 @item queuing によるフォルダへの格納 @end itemize @noindent ただし、@file{im-wl.el} による送信では、 @file{sendlog} には出力せずに @command{imput} のログ機能におまかせします。 @item wl-draft-sendlog-max-size @vindex wl-draft-sendlog-max-size 初期設定は 20000 (バイト)。 @code{wl-draft-sendlog} が @code{t} の場合、保存したログの大きさが指定し た大きさ以上になれば、ログをローテーションします。 @item wl-use-ldap @vindex wl-use-ldap 初期設定は @code{nil}。 Non-nil なら LDAP を利用してアドレス補完します。 @item wl-ldap-server @vindex wl-ldap-server 初期設定は @samp{localhost}。 アドレス補完に用いる LDAP サーバ名です。 @item wl-ldap-port @vindex wl-ldap-port 初期設定は @code{nil}. アドレス補完に用いる LDAP サーバのポート番号です。 @item wl-ldap-base @vindex wl-ldap-base 初期設定は @samp{c=US}。 アドレス補完時の LDAP 検索の開始点(base)を指定します。 @item wl-draft-remove-group-list-contents @vindex wl-draft-remove-group-list-contents 初期設定は @code{t}。 Non-nil ならメール送信の際に宛先から group-list の内容を削除します (group-list とは宛先に含まれる @samp{Group: foo@@gohome.org, bar@@gohome.org;}のような記述を指します)。 @end table @node Disconnected Operations, Expire and Archive, Draft, Top @chapter オフライン処理 @cindex Disconnected Operations @cindex Offline @cindex Unplugged Wanderlust にはオンラインモードとオフラインモードがあります。 @menu * Off-line State:: オフラインモード * Enable Operations:: オフラインモードで実行できる操作 * Plugged Mode:: サーバ・ポート別の切り替え * Off-line State settings:: 起動時のオフライン状態設定 * Variables of Plugged Mode:: カスタマイズ変数 @end menu @node Off-line State, Enable Operations, Disconnected Operations, Disconnected Operations @section オフラインモード Wanderlust にはオンラインモードとオフラインモードがあります。オフライン モードでは、ネットワーク経由でなければ読めないメッセージにはアクセスでき ません(キャッシュされていればアクセスできます)。 モードラインの @samp{[ON]} という表示は、オンラインモードにあることを示 しています。モードラインが @samp{[--]} という表示になっているときはオフ ラインモードです。フォルダモード、サマリモードで @kbd{M-t} を押すとオフ ライン/ オンラインの切り替えができます。 オフラインモードではサマリモードの @kbd{n} と @kbd{p} の動作が変わり、 キャッシュされていないメッセージへは移動しなくなります。 @file{~/.wl} などで変数 @code{wl-plugged} を @code{nil} に設定してから起 動すると、起動時からオフラインモードとなります。 @node Enable Operations, Plugged Mode, Off-line State, Disconnected Operations @section オフラインモードで実行できる操作 以下の操作は(対象となるメッセージがキャッシュされていれば) オフラインモー ドでも実行できます。(変数 @code{elmo-enable-disconnected-operation} (後 述) が non-nil のとき。) @xref{Plugged Mode}, @xref{Off-line State settings}. @menu * Send Messages off-line:: メッセージの送信 * Re-file and Copy queue:: リファイル/コピー (IMAP4) * Creation of Folders:: フォルダ生成 (IMAP4) * Marking:: マーク付け (IMAP4) * Pre-fetching Reservations:: プリフェッチ @end menu オフラインモードで行ったこれらの操作が、ネットワーク経由でサーバ上に反映 されるのは、Wanderlust がオンラインモードになった瞬間です。 変数 @code{elmo-enable-disconnected-operation} が @code{nil} なら、これら のネットワークフォルダに関するオフライン処理を実行せず、オフライン中のリ ファイル/コピー等の操作は単にエラーになります。 @node Send Messages off-line, Re-file and Copy queue, Enable Operations, Enable Operations @subsection メッセージの送信 オフライン状態でメール/ニュース記事の送信操作をすると、送信の予約がされ ます。(@file{im-wl.el} をお使いの場合は、関係ありません。) オフラインの ときに送信予約されたメッセージはキューフォルダ @samp{+queue} に溜ります。 溜ったメッセージは、オンラインになったときに一気に送信されます。 オフラインのうちに @samp{+queue} を訪れて、キューにあるメッセージの内容 を確認できます。メッセージを削除することも可能です。(削除されたメッセー ジはオンラインになっても送信されません。) @c キューにあるメッセージを再編集することも可能ですが、 @c 問題が起こる可能性がありますのでお勧めできません。 @node Re-file and Copy queue, Creation of Folders, Send Messages off-line, Enable Operations @subsection リファイル/コピー(IMAP4) オフライン状態のあいだに実行された IMAP フォルダに対するリファイル/コピー 操作はキューに溜められ、オンラインになったときにサーバ側に反映されます。 オフライン・リファイル/コピーの後、リファイル/コピー先のフォルダを訪れ ると、オフラインでもメッセージが追加されているように見えます。 オフライン・リファイルのキュー処理時の削除処理は安全を期してサーバ上のメッ セージと @samp{Message-ID:} が一致した場合のみ実行されます。また、キュー処 理時にリファイル/コピー先に指定したフォルダへメッセージを追加できなかった 場合には、それらのメッセージを @samp{+lost+found} フォルダに追加します。 @node Creation of Folders, Marking, Re-file and Copy queue, Enable Operations @subsection フォルダ生成(IMAP4) IMAP フォルダの生成もオフライン状態で実行できます。オンラインになったと きにフォルダ生成がサーバに反映されますが、このとき、何らかの原因でフォル ダ生成が失敗してしまった場合、オフライン中に生成されたフォルダへリファイ ルされたメッセージは @samp{+lost+found} フォルダに追加されます。 @node Marking, Pre-fetching Reservations, Creation of Folders, Enable Operations @subsection マーク付け(IMAP4) IMAP フォルダにあるメッセージに対する未読/既読の情報、および、重要マーク @samp{$} がついているかどうかも、オフライン中の変更がオンラインになった ときにサーバに反映されます。 @node Pre-fetching Reservations, , Marking, Enable Operations @subsection プリフェッチ ネットワークフォルダ (IMAP, NNTP, POP3, shimbun) にあるメッセージに対して、 プリフェッチの予約をします。プリフェッチを予約したメッセージには @samp{u} が付きますが、この時点ではキャッシュされておらず、オンラインになっ たときにサーバからプリフェッチされます。 @node Plugged Mode, Off-line State settings, Enable Operations, Disconnected Operations @section サーバ・ポート別のオンライン、オフラインの切り替え 上記の @kbd{M-t} による操作ではネットワークの状態を一括して切り替えますが、 サーバ・ポート別にオンラインとオフラインを切り替えることもできます。 フォルダモード、サマリモードで @kbd{C-t} を押すと以下のような wl-plugged-mode に入り、このモードで各ポートの plug 状態を変更します。 @example @group Queuing:[ON] AutoFlushQueue:[--] DisconnectedOperation:[ON] [ON](wl-plugged) [--]hosta [--]smtp +queue: 2 msgs (1,2) @dots{}@r{sending queue} [--]nntp(119) +queue: 1 msg (3) @dots{}@r{sending queue} [ON]hostb [--]imap4/cram-md5(143) %#mh/wl(prefetch-msgs:3,mark-as-important:1) %inbox(delete-msgids:1) @dots{}@r{dop queue} [ON]nntp(119) [ON]smtp @end group @end example 1行目はオフライン操作に関係する次の3つの変数の状態を表示しています。 それぞれのラベル欄で @kbd{@key{SPC}} や @kbd{@key{RET}} を押すことで 変数の値を簡単に変更できるようになっています。 @example @group "Queuing" @code{wl-draft-enable-queuing} "AutoFlushQueue" @code{wl-auto-flush-queue} "DisconnectedOperation" @code{elmo-enable-disconnected-operation} @end group @end example ここで、@samp{[ON]} はその変数の値が @code{t} であることを、@samp{[--]} は @code{nil} であることを示しています。 また、2行目以降ではサーバとポートのオンラインとオフライン状態を表示し、 @samp{[ON]} はそのサーバやポートがオンラインであることを、 @samp{[--]} はオフラインであることを示しています 可能ならアイコンで表示されます。 そしてそれぞれの行で @kbd{@key{SPC}} や @kbd{@key{RET}} を押すことで 状態を切り替えることができます。 @dfn{sending queue} はオフライン送信時に @samp{+queue} フォルダに格納さ れている送信待ちのメッセージを指し、@dfn{dop queue} はオフラインで行った リファイル/コピー等の操作を指すとします。 @c 変数 @code{elmo-enable-disconnected-operation} が non-nil なら @c オフライン操作ができます。 そしてもし、これらの sending queue や dop queue があればその状態が画面に 表示されます。上記例では、sending queue には hosta の smtp 向けに 2 つ (queue フォルダの1番と2番)と、hosta の nntp 向けに 1 つ(3番)のメッセージ があり、dop queue には @samp{%inbox} の操作が1つと、@samp{%#mh/wl} の操 作が2つあることを示しています。 このモードで2行目にある @samp{(wl-plugged)} を変更すると、 @code{wl-plugged} 変数が変更され、これによりモードラインの indicator と 全体の ポート plug 状態が ON/OFF されます。また、各サーバやポートの plug 状態を変更すると、@code{elmo-plugged-condition} (後述)の設定と各ポートの plug 状態により 2行目の @samp{(wl-plugged)} が変化します。 @node Off-line State settings, Variables of Plugged Mode, Plugged Mode, Disconnected Operations @section 起動時のオフライン状態設定 前述の通り、@file{~/.wl} などで変数 @code{wl-plugged} を @code{nil} に設 定してから起動すると、起動時からオフラインモードにすることができます。さ らに細かくサーバやポート毎にオフライン状態を設定することも可能です。併せ て変数 @code{wl-reset-plugged-alist} も参照して下さい。 通常、起動時には @file{~/.folders} と @code{wl-smtp-posting-server}, @code{wl-nntp-posting-server} などから各ポートの plug 状態が自動的に追加 されますが、これらのポートの plug 状態を変更したり、上記以外のポートを追加 したりする場合には @code{wl-make-plugged-hook} に変更する関数を記述しま す。 @lisp @group (add-hook 'wl-make-plugged-hook '(lambda () (elmo-set-plugged plugged値(t/nil) server port) ;; @r{server,portのplug状態を新規追加もしくは変更する} (elmo-set-plugged plugged値(t/nil) server) ;; @r{port を省略するとserverの全portが変更される} ;; @r{(port を省略して新規の追加はできない)} )) @end group @end lisp @node Variables of Plugged Mode, , Off-line State settings, Disconnected Operations @section カスタマイズ変数 @table @code @item wl-plugged @vindex wl-plugged この値を @code{nil} に設定して Wanderlust を起動すると、起動時からオフラ インモードとなります。 @item wl-queue-folder @vindex wl-queue-folder 初期設定は @samp{+queue}。送信キューのメッセージが溜るフォルダ。 @item wl-auto-flush-queue @vindex wl-auto-flush-queue 初期設定は @code{t}。オンラインになったときに自動的にキューを送信するか どうか。Non-nil なら自動的に送信します (一応 @code{y-or-n-p} で確認 します)。手動でキューを送信するには、フォルダモードで @kbd{F} を押してく ださい。 @item elmo-enable-disconnected-operation @vindex elmo-enable-disconnected-operation 初期設定は @code{t}。ネットワークフォルダに関するオフライン処理を実行する かどうか。Non-nil ならオフライン処理を実行します。 @item elmo-lost+found-folder @vindex elmo-lost+found-folder 初期設定は @samp{+lost+found}。オフライン・リファイル/コピーのキュー処理 でメッセージの追加に失敗したときにメッセージを退避させるフォルダです。 @item elmo-plugged-condition @vindex elmo-plugged-condition 初期設定は @code{one}。 @code{wl-plugged} の値は関数 @code{elmo-plugged-p} (引数なし)の戻り値に より決定されます。この変数 @code{elmo-plugged-condition} は @code{(elmo-plugged-p)} の戻り値が @code{t} になる条件を各ポートの plug 状 態により指定します。 @example 'one : 1つ以上のポートが plugged なら plugged である 'all : 全てのポートが plugged なら plugged である 'independent : ポートの plug 状態に関係なく wl-plugged (elmo-plugged) を参照する @var{function} : 関数 @var{function} の戻り値により変化する 標準で用意されている関数 'elmo-plug-on-by-servrs : 変数 elmo-plug-on-servers で指定したサーバの plug 状態により変化する 'elmo-plug-on-by-exclude-servers : 変数 elmo-plug-on-exclude-servers で指定した以外の サーバの plug 状態により変化する elmo-plug-on-exclude-servers のデフォルト値は '("localhost" (system-name) (system-name)からドメイン部を除いたもの) である @end example @example @group 例1: (setq elmo-plugged-condition 'all) 例2: (setq elmo-plug-on-servers '("smtpserver" "newsserver")) (setq elmo-plugged-condition 'elmo-plug-on-by-servers) 例3: (setq elmo-plug-on-exclude-servers '("localhost" "myname")) (setq elmo-plugged-condition 'elmo-plug-on-by-exclude-servers) @end group @end example @item wl-reset-plugged-alist @vindex wl-reset-plugged-alist 初期設定は @code{t}。Non-nil なら Wanderlust の起動時にサーバ・ポート別 のプラグ状態を @code{wl-plugged} の値により初期化します。 @code{nil} なら、Emacs が動作している間、前回終了した時点のプラグ状態を 保持します。言い換えれば @code{nil} であっても Emacs を再起動すると初期 化されます。 @end table @node Expire and Archive, Scoring, Disconnected Operations, Top @chapter メッセージの自動削除とアーカイブ @cindex Expire and Archive @menu * Expire:: 期限メッセージの自動削除、アーカイブ * Archive:: 全メッセージのアーカイブ @end menu @node Expire, Archive, Expire and Archive, Expire and Archive @section メッセージの自動削除 @cindex Expire Message Expire とは、指定した期間を過ぎた古いメッセージを削除する機能です。 しかし、@code{wl-expire} ではメッセージを単純に消すだけではなく、指定したアーカ イブフォルダに移動することも出来ます。 @section 使い方 @code{wl-expire-alist}を設定して、フォルダモードで @kbd{e}、もしくはサマ リモードで @kbd{M-e} を押します。 @subsection @code{wl-expire-alist}の設定 次に@code{wl-expire-alist}の設定例を示します。この@code{wl-expire-alist} の書き方一つで expire の実施方法が大きく変わりますので、慎重に設定してく ださい。最初のうちは@code{wl-expire-use-log}を @code{t} にセットしておく と良いでしょう。 @lisp @group (setq wl-expire-alist '(("^\\+trash$" (date 14) remove) ;; @r{削除する。} ("^\\+tmp$" (date 7) trash) ;; @r{@code{wl-trash-folder} にリファイルする。} ("^\\+outbox$" (number 300) "$outbox;lha") ;; @r{特定のフォルダにリファイルする。} ("^\\+ml/tmp$" nil) ;; @r{expireしない} ("^\\+ml/wl$" (number 500 510) wl-expire-archive-number1 t) ;; @r{番号ごとにアーカイブする(番号は保持する)。} ("^\\+ml/.*" (number 300 310) wl-expire-archive-number2 t) ;; @r{一定数ごとにアーカイブする(番号は保持する)。} ("^\\+nikki$" (date 30) wl-expire-archive-date) ;; @r{年月ごとにアーカイブする(番号は保持しない)。} )) @end group @end lisp 各リストの要素は @example (@var{フォルダの正規表現} @var{削除メッセージの指定} @var{削除先}) @end example @noindent となっています。リストの先頭から@var{フォルダの正規表現}にマッチするかど うかを調べます。もし、@var{フォルダの正規表現}にマッチしないフォルダで、 expire を実行しても何もしません。また、2,3 番目の要素のいずれかが @code{nil} であれば expire しません。 @var{削除メッセージの指定}には次のものを指定します。 @table @code @item (number @var{n1} [@var{n2}]) フォルダにあるメッセージ数に応じて削除を行います。 @var{n1} は削除後のメッセージ数で、 例えば値が 500 なら最新の 500 個を残して残りを削除することになります。 @var{n2} は expire を実行するためのメッセージの総数で、省略すると @var{n1} + 1 になります。例えば値が 510 ならメッセージが 510 以上のとき に expire を実行することになります。これは自動実行で expire を行うように した場合、頻繁にメールが来るフォルダでは毎回 expire を実行するようになる ので、メールを読むまでに時間がかかり、煩わしくなってしまいます。そこで @var{n2} を @var{n1} よりも大きめの値に設定することで、一定数溜まるまでは expire を実行しないようにできます。 また、@code{wl-summary-expire-reserve-marks}で指定したメッセージ(重要マー クや新規・未読マークの付いたメッセージ)は削除しないようになっていますが、 もし、@code{wl-expire-number-with-reserve-marks} が non-nil の場合、この ようなメッセージも含めて 500 個になるように expire します。@code{nil} の場合は上記メッセージ以外で 500 になるように expire します。 @item (date @var{d1}) メッセージの日付により削除を行います。 @var{d1} は現在より何日前のメッセージを削除するどうかであり、 例えば値が 7 なら 7日より前のメッセージを削除します。 なお、この日付とはメッセージの @samp{Date:} フィールドの日付であり、 メッセージがフォルダに入った日付ではないことに注意してください。 もし、メッセージに @samp{Date:} フィールドがなかったり、@samp{Date:} フィー ルドが不正な値なら、expire されませんので手で削除するなりして下さい。 @end table @var{削除先}には次のものを指定します。 @table @asis @item @code{remove} 即メッセージを削除します。 @item @code{hide} メッセージをサマリから見えなくします(削除はされません)。 @item @code{trash} メッセージを @code{wl-trash-folder} に移動します。 @item @var{string}(folder) メッセージを@var{string}で指定したフォルダに移動します。 アーカイブフォルダを指定すると便利ですが、@samp{$} マークの付いた重要メッ セージなどは移動されないので、下記の標準関数を使う方がより良いです。 @item @var{function} 指定の関数を呼び出します。 指定した関数には次の3つの引数、フォルダ名、削除するメッセージのリスト、 そしてサマリの msgdb 情報が渡されます。また、関数名の後に関数独自の引数も 指定できます。なお、この関数には@code{wl-summary-expire-reserve-marks}で 指定したメッセージも含んだリストが渡されますので、独自に関数を作る場合は 注意してください。 ここで指定できる関数には、標準で次の4つが用意されています。そのうち3つは指 定した方法でアーカイブフォルダにメッセージを移動するもので、古いメッセー ジをフォルダから削除しながら別ファイルに圧縮して保存しておくことができま す。残り1つはメッセージを MH フォルダに振り分けるものです。 @table @code @item wl-expire-archive-number1 削除対象のメッセージ番号に対するアーカイブフォルダにリファイルします。例 えば、102 番であるなら @file{wl-00100.zip}、390 番であるなら @file{wl-00300.zip}、などのようにです。なお、 @code{wl-expire-archive-files} を 200 にすると、@file{wl-00000.zip}, @file{wl-00200.zip}, @file{wl-00400.zip}, @dots{} にリファイルしていきま す。 リファイル先のアーカイブフォルダは削除元のフォルダ名に基づいて次のように 決定されます。(このとき、アーカイブフォルダは @code{elmo-archive-treat-file} が non-nil の場合として扱われます) @table @asis @item フォルダタイプがlocaldirの場合 @file{@var{ArchiveDir}/@var{foldername}-xxxxx.zip} 例えば @samp{+ml/wl} は @samp{$ml/wl;zip} (@file{~/Mail/ml/wl-00100.zip})となります。 @item フォルダタイプがlocaldir以外の場合 @file{@var{ArchiveDir}/@var{foldertype}/@var{foldername}-xxxxx.zip} 例えば、@samp{%#mh/ml/wl} は @samp{$imap4/#mh/ml/wl;zip} (@file{~/Mail/imap4/#mh/ml/wl-00100.zip})となります。 @end table すなわち、localdir の場合は種別がパス名に含まれませんが、それ以外は種別 がパス名に含まれるのです。 また、@code{wl-expire-archive-folder-prefix} により、 アーカイブフォルダに付ける prefix を制御できます。 @code{wl-expire-archive-folder-prefix}の説明を良く見ておいてください。 @item wl-expire-archive-number2 指定した個数ごとにアーカイブフォルダにリファイルします。 @samp{wl-expire-archive-number1} と異なる点はメッセージ番号に関係なくアーカイブフォルダが指定数に達するまで そのフォルダにリファイルする、という点です。 なお、リファイル先のアーカイブフォルダは @code{wl-expire-archive-number1} と同じように決定されます。 この関数を使用する場合、@code{elmo-localdir-folder-path}と @code{elmo-archive-folder-path}を同じディレクトリにしないで下さい。 デフォルトでは同じディレクトになっているので、注意してください。 @item wl-expire-archive-date メッセージの日付(年月)ごとにアーカイブフォルダにリファイルします。 例えば、1998年12月のメッセージは @code{$folder-199812;zip} にリファイル されます。なお、日付の部分以外のアーカイブフォルダ名は @code{wl-expire-archive-number1}と同じように決定されます。 また、上記の3つの標準関数では @code{wl-expire-alist} での第1引数に non-nil を指定すると、フォルダのメッセージ番号をそのまま保存できます。例 えば、次のように関数名の後に続けて指定します。 @lisp ("^\\+ml/wl$" (number 300 310) wl-expire-archive-number1 t) @end lisp 引数を指定しない場合は、各アーカイブフォルダごとに 1 から順に番号を与え て保存されます。 @item wl-expire-localdir-date メッセージの日付(年月)ごとに、例えば、@samp{+ml/wl/1999_11/}, @samp{+ml/wl/1999_12/} といった MH フォルダにリファイルします。 @end table @end table @subsection 重要メッセージや未読メッセージの扱い 削除先に @code{remove} や @code{trash}、フォルダ名、標準関数のいずれを指 定した場合でも、@code{wl-summary-expire-reserve-marks}で指定したマークの メッセージ(以下、@dfn{reserveメッセージ}と呼びます)は残すようになってい ます。 この変数にはデフォルトで、重要マーク、新規マーク、未読マークが設定されて いるので、これらのマークのついたメッセージは削除されないことになります。 ただし、この変数には一時的マークは指定できないため(すなわち削除されるた め)、expire を実行する前に一時的マークは処理しておいてください。 @subsection 自動実行 サマリに移動したときに自動的に expire を実行するには次のように設定します。 ただし、この場合は確認せずに自動実行するため、フォルダの正規表現などに誤 りがないかどうかを十分確認してから設定して下さい。 @lisp @group (add-hook 'wl-summary-prepared-pre-hook 'wl-summary-expire) @end group @end lisp また、フォルダモードで各フォルダごとに expire を実行できるのはもちろん、 グループ単位の実行も可能です。従って、@samp{Desktop} グループを指定すれ ば@code{wl-expire-alist}にマッチする全てのフォルダで expire を実行します。 @section TIPS @subsection 作成したアーカイブフォルダの取り扱い 上記の標準関数 @code{wl-expire-archive-number1} などで作成したアーカイブ フォルダを扱う場合は、変数 @code{elmo-archive-treat-file} を non-nil に設 定しておく必要があります。 @subsection 動作確認 @code{remove} を指定する場合は、まず @code{trash} にして期待通りにメール が @code{wl-trash-folder} に移動されることを確認してから @code{remove} に変えるとよいでしょう。いきなり @code{remove} を指定するのは危険です。 また、@code{wl-expire-archive-number1}などの関数を利用する場合、まずは使 用するアーカイバタイプ(@code{zip} や @code{lha})などのフォルダを試しに作 って、正しく追加できるかどうかを確認してください。たとえ、 @code{wl-expire-alist} や @code{elmo-archive} の設定が正しくても、アーカ イブプログラムが正しく動かなければどこにも保存されずにメッセージが消えて しまうかも知れません。 アーカイブフォルダの動作が確認でき、実際に expire を実行するようになれば、 ログを活用してください。@code{wl-expire-use-log} を @code{t} にすると、 @file{~/.elmo/expired-log}には以下のような記録が残ります。 @example @group delete +ml/wl (593 594 595 596 597 598 599) move +ml/wl -> $ml/wl-00600;tgz;wl (600 601 602) @end group @end example 最初の項目は動作を示すもので、@samp{delete}, @samp{copy}, @samp{move} が あります。次が expire を実行したフォルダ名で、@samp{copy} と @samp{move} の場合は@samp{->}に続けてコピーもしくは移動先のフォルダ名が記録されます。 最後の項目は、実際に削除や移動されたメッセージ番号のリストです (@samp{copy} や @samp{move} の場合、移動後ではなく移動前のメッセージ番号 です)。 @subsection reserveメッセージのリファイル 標準で用意されている3つの関数では、reserve メッセージはアーカイブフォルダ にコピーしますが、元のフォルダからは削除しないようになっています。なお、 重要マークなどは常に残るため、何度もコピーされることがないように @file{~/.elmo/expired-alist} に記録するようになっています。ただしこれは reserve メッセージが refile 対象になったときの話です。 @code{wl-summary-archive} などでコピーされる場合は記録を残しません。 ログ機能を有効にしていた場合は、リファイル時には通常 @samp{move} が記 録されますが、reserve メッセージが含まれていると、@samp{copy} と @samp{delete} に分けて記録されます。これは reserve メッセージを含めたメッ セージをコピーした後、reserve メッセージを除いたメッセージを削除する、 という処理を行っているためです。 @section カスタマイズ変数 @table @code @item wl-expire-alist @vindex wl-expire-alist 初期設定は @code{nil}。 expire を行うフォルダと expire 方法の指定を行います。詳しくは上記の @code{wl-expire-alist}の設定をご覧下さい。 @item wl-summary-expire-reserve-marks @vindex wl-summary-expire-reserve-marks 初期設定は以下のリスト。 @lisp @group (list wl-summary-flag-mark wl-summary-new-uncached-mark wl-summary-new-cached-mark wl-summary-unread-uncached-mark wl-summary-unread-cached-mark) @end group @end lisp expire を行っても、フォルダには残しておくメッセージのマークを指定します。 マークには永続的マークのみ指定できます。 一時的マークは指定できません。 デフォルトのようにリストで指定するとそのマークのメッセージを残せる他、以 下の指定もできます。 @table @code @item all 永続マークの付いたすべてのメッセージを残します。 つまり、デフォルトで設定されているマーク以外に @code{wl-summary-read-uncached-mark} が含まれます。 @item none どんなマークの付いたメッセージであっても、通常の既読メッセージと同じ扱い をします。すなわち、@samp{$} マークの付いた重要メッセージであっても削除 されます。 @end table @item wl-expire-archive-files @vindex wl-expire-archive-files 初期設定は 100。 ひとつのアーカイブフォルダに保持するメッセージ数を指定します。 @item wl-expire-number-with-reserve-marks @vindex wl-expire-number-with-reserve-marks 初期設定は @code{nil}。 Non-nil にすると、 削除メッセージの指定で @code{number} を指定したとき、 残しておくメッセージ数に @code{wl-summary-expire-reserve-marks} で設定さ れたメッセージを含めます。 @item wl-expire-archive-get-folder-function @vindex wl-expire-archive-get-folder-function 初期設定は @code{wl-expire-archive-get-folder}。 削除先の標準関数でアーカイブフォルダ名を取得する関数を指定します。 次の3つの変数により簡易なフォルダ名の変更できますが、もっと複雑な指定を したい場合は新たに関数を作ってこの変数に設定します。 関数@code{wl-expire-archive-get-folder}のカスタマイズ変数には次の ものがあります。 @itemize @bullet @item @code{wl-expire-archive-folder-name-fmt} @item @code{wl-expire-archive-folder-type} @item @code{wl-expire-archive-folder-prefix} @end itemize @item wl-expire-archive-folder-name-fmt @vindex wl-expire-archive-folder-name-fmt 初期設定は @samp{%s-%%05d;%s}。 @code{wl-expire-archive-number1}および@code{wl-expire-archive-number2}で 使用されるアーカイブのフォルダの @code{format} 形式の文字列を指定します。 なお、2度 @code{format} で指定するため、 番号の部分は必ず @samp{%%d} にしなくてはなりません。 もし、変更する場合は @code{wl-expire-archive-folder-num-regexp} も合わせるようにしてください。 @item wl-expire-archive-date-folder-name-fmt @vindex wl-expire-archive-date-folder-name-fmt 初期設定は @samp{%s-%%04d%%02d;%s}。@code{wl-expire-archive-date} で使用 されるアーカイブのフォルダの @code{format} 形式の文字列を指定します。な お、2度 @code{format} で指定するため、番号の部分は必ず @samp{%%d} にしな くてはなりません。また、メッセージの年と月を与えるため、@samp{%%d} は2つ 必要です。 もし、変更する場合は @code{wl-expire-archive-date-folder-num-regexp} も合わせるようにしてください。 @item wl-expire-archive-folder-type @vindex wl-expire-archive-folder-type 初期設定は @code{zip}。 アーカイブフォルダのアーカイバタイプを指定します。 @item wl-expire-archive-folder-prefix @vindex wl-expire-archive-folder-prefix 初期設定は @code{nil}。 アーカイブフォルダに付ける prefix を指定します。 ただし、アーカイブフォルダに prefix (ディレクトリ構造)を付ける仕様は おまけ機能ですので、取り扱いは慎重に行って下さい。 最悪の場合,アーカイブファイルを壊す恐れがあります。 @table @code @item nil prefix は付きません。 @item short 例えば、@samp{+ml/wl} では prefix @samp{wl} が付き、 @samp{$ml/wl-00000;zip;wl} となります。 @item t 例えば、@samp{+ml/wl} では prefix @samp{ml/wl} が付き、 @samp{$ml/wl-00000;zip;ml/wl} となります。 @end table @item wl-expire-archive-folder-num-regexp @vindex wl-expire-archive-folder-num-regexp 初期設定は @samp{-\\([-0-9]+\\);}。 @code{elmo-list-folders} による複数のアーカイブフォルダ名から 番号を取得するための正規表現を指定します。 @code{wl-expire-archive-folder-name-fmt} に対応して設定してください。 @item wl-expire-archive-date-folder-num-regexp @vindex wl-expire-archive-date-folder-num-regexp 初期設定は @samp{-\\([-0-9]+\\);}。 @code{elmo-list-folders} による複数のアーカイブフォルダ名から 番号を取得するための正規表現を指定します。 @code{wl-expire-archive-date-folder-name-fmt} に対応して設定してください。 @item wl-expire-delete-oldmsg-confirm @vindex wl-expire-delete-oldmsg-confirm 初期設定は @code{t}。 Non-nil の場合、既に存在しているアーカイブフォルダの最大メッセージ番号よりも 古いメッセージがあった場合に確認してから削除します。 @code{nil} の場合は確認せずに削除します。 なお、標準関数の引数に non-nil を指定して番号を保持するようにした場合の み有効です。 @item wl-expire-use-log @vindex wl-expire-use-log 初期設定は @code{nil}。 Non-nil にすると、@file{~/.elmo/expired-log}に expire の実行結果を記録します。 なお、ファイルに追加していく一方なので、適当に手で消す必要があります。 @item wl-expire-add-seen-list @vindex wl-expire-add-seen-list 初期設定は @code{t}。 Non-nil の場合、expire によりメッセージをリファイルした場合、既読情報を リファイル先のフォルダに伝えるようにします。 ただし、リファイル先のフォルダを Wanderlust 上から読まないと、 @file{~/.elmo/}以下にある @file{seen} ファイルが大きくなっていくので、 アーカイブフォルダなどに単に保存しておくだけなら @code{nil} に設定しておくと良いでしょう。@code{nil} に設定しても、 リファイルしたアーカイブフォルダを読むときに新規メッセージ扱いされるだけで、 expire などの動作には影響はありません。 @item wl-expire-folder-update-msgdb @vindex wl-expire-folder-update-msgdb 初期設定は @code{t}。 @code{t} の場合、フォルダモードで expire を実行するときに、 サマリ情報を update してから expire を実行する。 また、フォルダ名の正規表現のリストを指定した場合は、マッチしたフォルダの みサマリ情報を update する。 @end table @node Archive, , Expire, Expire and Archive @section メッセージのアーカイブ @subsection メッセージのアーカイブ @kbd{M-x wl-summary-archive} でフォルダ全体をアーカイブフォルダにコピーしま す。既にアーカイブフォルダがある場合、新規メッセージのみ追加します。 @code{wl-expire-alist} と同じ様に、フォルダ名に応じてどのようにアーカイブ するかを @code{wl-archive-alist} で指定します。例えば以下のようになりま す。 @lisp @group (setq wl-archive-alist '(("^\\+tmp$" wl-archive-date) ("^\\+outbox$" wl-archive-number2) (".*" wl-archive-number1))) @end group @end lisp 各リストの要素は次のようになります。 @example (@var{フォルダの正規表現} @var{削除関数}) @end example このように@var{フォルダの正規表現}の後には関数しか指定できません。 標準では次の3つの関数 @itemize @bullet @item @code{wl-archive-number1} @item @code{wl-archive-number2} @item @code{wl-archive-date} @end itemize が用意されてます。名前からお解りの通り、次の点を除いて Expire 用に用意されて いる物と同じ動作をします。 @itemize @item メッセージを削除しない @item 引数なしであってもメッセージ番号を保持する @end itemize フォルダの全メッセージを番号ごとや日付ごとにまとめてアーカイブしたい場合 は、これらの関数を使用するとよいでしょう。 また、expire を行う前のバックアップや動作を確認するのにも有効です。 もっとも、アーカイブ後に expire でリファイルすると、リファイルせずに削除 するだけになります。 デフォルトではコピー先のアーカイブフォルダは @code{wl-expire-archive-get-folder-function} に従って自動的に決定されますが、 prefix argument を付けて @kbd{C-u M-x wl-summary-archive} で実行すると、 指定したフォルダにコピーすることができます。 しかし、単純に1つのアーカイブフォルダにコピーするだけなら、 @code{wl-summary-copy-region} などで全メッセージをアーカイブフォルダにコ ピーすることでも可能なため、おまけの機能でしかありません (つまり、動作確認は不十分です)。 このアーカイブフォルダの決定方法は @code{wl-summary-expire} と同じものを 用いているため、カスタマイズ変数の中で次に示すものが関係してきます。 @itemize @bullet @item @code{wl-expire-archive-files} @item @code{wl-expire-archive-get-folder-function} @item @code{wl-expire-archive-folder-name-fmt} @item @code{wl-expire-archive-folder-type} @item @code{wl-expire-archive-folder-prefix} @item @code{wl-expire-archive-folder-num-regexp} @end itemize @subsection カスタマイズ変数 @table @code @item wl-archive-alist @vindex wl-archive-alist 初期設定は以下のリスト。 @lisp ((".*" wl-archive-number1)) @end lisp @noindent アーカイブフォルダにコピーする処理を行う関数を指定します。この関数には、 フォルダ名、フォルダ内にあるメッセージのリスト、サマリの msgdb 情報、の3つ の引数が渡されます。もちろんユーザが独自に作って指定することができます。 @end table @node Scoring, Address Book, Expire and Archive, Top @chapter スコア @cindex Scoring @c @cindex Kill File スコアとは、メッセージにスコア(値)をつけ、 その値により既読マークを付けたりサマリから消したりする機能です。 この機能によって重要なメッセージにまとめ処理用マーク @samp{*} や重要マー ク@samp{$}をつけたり、spam 記事などの読みたくないメッセージに既読マーク をつけたりすることができます。 このスコア機能は Gnus のスコアとほぼ同等の機能を持ち、またスコアファイルの 書式もほぼ同じです。ただし、幾つかは未対応であったり Wanderlust 特有の機能 があったりします。 @xref{Scoring, , ,gnus-ja, Gnus Manual}. @menu * Score Commands:: スコアに関するコマンド * Score File Format:: スコアファイルの書式 @end menu @node Score Commands, Score File Format, Scoring, Scoring @section スコアに関するコマンド @cindex Score Commands @subsection スコアファイルの指定方法 変数 @code{wl-score-folder-alist} にフォルダ名に対応したスコアファイル名かスコアを定義した変数を設定します。 @lisp @group (setq wl-score-folder-alist '(("^-.*" "news.SCORE" "my.SCORE") (".*" "all.SCORE"))) @end group @end lisp スコアファイル名のパスを省略した場合は、 変数 @code{wl-score-files-directory} で指定したディレクトリにあるものとします。 また、@code{wl-score-folder-alist} の設定に関わらず デフォルトのスコアファイル @code{wl-score-default-file} (@file{all.SCORE}) は必ず読み込まれます(ファイルが存在していなくても構いません)。 したがって、上記例の @samp{^-.*} にマッチしたフォルダでは @file{news.SCORE}, @file{my.SCORE}, @file{all.SCORE} の3つのスコアファイル が読み込まれることになります。 @subsection スコアファイルの対象メッセージ スコアはサマリの update 時に一時的に @code{wl-summary-score-marks} で指定したメッセージのみにつけられます。 つまりサマリから抜けるとメッセージにつけられたスコアは消去され、 デフォルトのスコア値に戻ります。 @subsection スコアファイルの作成 まずサマリバッファで適当なメッセージに移動してから @kbd{L} をタイプしま す。その後ミニバッファでの入力を求められますので、続けて @kbd{s}, @kbd{s}, @kbd{p} とタイプしてみてください。すると Subject の文字列が入力 されている状態になりますので、適当に編集した後 @kbd{@key{RET}} を押します。 これで、入力した文字列と同じ @samp{Subject:} を持つメッセージに対してスコア @minus{}1000 がつけられるようになります。 つまり、このようなスコアファイルが自動的に作成されたことになります。 次に、同じサマリバッファで @kbd{h} @kbd{e} とタイプしてください。 すると先ほど作成したスコアファイルが表示されていると思います。 このバッファを@dfn{スコア編集バッファ}と呼びます。 このスコア編集バッファで @kbd{C-c C-e} とタイプすると、 ミニバッファで先ほどと同じような入力を求められると思いますが、 ここで @kbd{a} とタイプしてください。今度はすぐに "From" のスコアエントリが挿 入されたはずです。 このようにしてサマリバッファでもスコア編集バッファでも スコアファイルを簡単に作成することができます。 ところで、ミニバッファでの入力時に @kbd{s s p} または @kbd{a} とタイプしたように、 キータイプ数が違っていたと思います。 これは、@code{wl-score-header-default-entry} の設定によるものです。 この変数ではヘッダに応じたデフォルトのスコアエントリを設定します。 たとえば、"subject" ヘッダでは型と期限についての入力を求めますが、 "from" ヘッダでは型は substring, 期限は永続に自動的に決定されます。 ただし、スコアの値は prefix argument で強制的に変更することができます。 また、ミニバッファでの入力時に @kbd{?} とタイプすることでキーとそれに対応す るヘッダや型を(help)を表示します。 では最後に、スコア編集バッファで @kbd{C-c C-c} と入力して下さい。これでスコア ファイルを保存して編集モードを終了します。バッファの内容を消去してから @kbd{C-c C-c} すると編集中のスコアファイルを削除します。 @subsection TIPS @subsubsection スコアファイルの選択 @code{wl-summary-increase-score} と @code{wl-summary-lower-score} とで追 加するスコアファイルは @code{wl-score-change-score-file} で変更すること ができます。 @subsubsection スコアの加算 @code{wl-summary-increase-score} や @code{wl-summary-lower-score}、 @code{wl-score-edit-insert-entry} で同じエントリを追加した場合、 スコアが加算されます。 たとえば、@kbd{L a} でスコアが @minus{}1000 の @samp{from} エントリを作成した後、 再度 @kbd{C-u 200 L a} でスコアが @minus{}200 の @samp{from} エントリを作成すると、 スコアが @minus{}1200 のエントリが1つ作成されることになります。 @subsubsection Thread キーの作成 @code{wl-summary-increase-score} か @code{wl-summary-lower-score} で @samp{Thread}キーを作成すると、子スレッドの @samp{Message-ID} も全て 追加されます。 @subsubsection Followup キーの作成 @code{wl-summary-increase-score} か @code{wl-summary-lower-score} で @samp{Followup}キーを作成すると、カーソル上のメッセージの @samp{Message-ID} も @samp{References} キーに追加されます。 もし、@code{wl-score-auto-make-followup-entry} が non-nil であれば @code{wl-score-expiry-days} で指定した日にち以内の全 followup 対象のメッセー ジの @samp{Message-ID} が追加されます。 @subsection キーバインド @table @kbd @item K @kindex K (Summary) @findex wl-summary-increase-score 現在のメッセージのスコアを高くします。 同時にスコアエントリがスコアファイルに追加されます。 また、prefix argument でスコアの値を設定することができます。 @item L @kindex L (Summary) @findex wl-summary-lower-score 現在のメッセージのスコアを低くします。 同時にスコアエントリがスコアファイルに追加されます。 また、prefix argument でスコアの値を設定することができます。 @item h R @kindex h R (Summary) @findex wl-summary-rescore スコアを適用し直します。 ただし、既にスコアがつけられているメッセージには、新たにスコアはつきません。 @item h c @kindex h c (Summary) @findex wl-score-change-score-file 現在選択しているスコアファイルを変更します。 @item h e @kindex h e (Summary) @findex wl-score-edit-current-scores 現在選択しているスコアファイルを編集します。 スコアファイルが複数ある場合先に指定されたファイルが選択されます。 @item h f @kindex h f (Summary) @findex wl-score-edit-file 任意のスコアファイルを編集し、このスコアファイルを選択します。 @item h F @kindex h F (Summary) @findex wl-score-flush-cache 読み込んだスコアファイルは一旦キャッシュされますが、そのキャッシュを消去します。 Wanderlust 以外で直接スコアファイルを変更した場合は、 キャッシュを消去して再読み込みする必要があります。 @item h m @kindex h m (Summary) @findex wl-score-set-mark-below 既読マークを付ける(読んだことにする)スコア基準値を設定します。 この値よりも小さなスコアが既読になります。 @item h x @kindex h x (Summary) @findex wl-score-set-expunge-below サマリから消去するスコア基準値を設定します。 この値よりも小さなスコアが消去されます。 消去といっても表示されないだけであり、サマリ情報やフォルダからは削除されま せん。 消去されたメッセージは rescan-noscore により再び表示することができます。 @end table @subsection スコア編集バッファのキーバインド @table @kbd @item C-c C-k @kindex C-c C-k (Score Mode) @findex wl-score-edit-kill 編集中のファイルを破棄します。 @item C-c C-c @kindex C-c C-c (Score Mode) @findex wl-score-edit-exit 編集中のファイルを保存して、編集モードを終了します。 @item C-c C-p @kindex C-c C-p (Score Mode) @findex wl-score-pretty-print スコアを綺麗に表示し直します。 @item C-c C-d @kindex C-c C-d (Score Mode) @findex wl-score-edit-insert-date 紀元前1年12月31日からの日数を挿入します。 期限付きのスコアを作るときに期限の要素(3番目)に使用します。 @item C-c C-s @kindex C-c C-s (Score Mode) @findex wl-score-edit-insert-header サマリバッファで選択しているメッセージのヘッダを挿入します。 @item C-c C-e @kindex C-c C-e (Score Mode) @findex wl-score-edit-insert-entry サマリバッファで選択しているメッセージのスコアエントリを追加します。 @end table @subsection カスタマイズ変数 @table @code @item wl-summary-default-score @vindex wl-summary-default-score 初期設定は 0。 スコアのデフォルト値を設定します。この値を元にスコアが加減されます。 @item wl-summary-important-above @vindex wl-summary-important-above 初期設定は @code{nil}。 この値より大きいスコアに対して重要マーク(@samp{$}) をつけます。 @code{nil} の場合はマークを付けません。 @item wl-summary-target-above @vindex wl-summary-target-above 初期設定は @code{nil}。 この値より大きいスコアに対してまとめ処理用マーク(@samp{*}) をつけます。 @code{nil} の場合はマークを付けません。 @item wl-summary-mark-below @vindex wl-summary-mark-below 初期設定は 0。 この値より小さなスコアに対して既読マークをつけます(読んだことにします)。 @item wl-summary-expunge-below @vindex wl-summary-expunge-below 初期設定は @code{nil}。 この値より小さなスコアはサマリから消去します。 @code{nil} の場合は消去しません。 @item wl-summary-score-marks @vindex wl-summary-score-marks 初期設定は以下のリスト @lisp @group (list wl-summary-new-uncached-mark wl-summary-new-cached-mark) @end group @end lisp @noindent スコアをつけるメッセージのマークを指定します。 @item wl-use-scoring @vindex wl-use-scoring 初期設定は @code{t}。 Non-nil ならスコア機能を有効にします。 @item wl-score-files-directory @vindex wl-score-files-directory 初期設定は @file{~/.elmo/}。 スコアファイルをデフォルトのディレクトリを指定します。 @item wl-score-interactive-default-score @vindex wl-score-interactive-default-score 初期設定は 1000。 スコアファイルでスコア要素が @code{nil} の時に用いるスコアを指定します。 また、@code{wl-summary-increase-score} や @code{wl-summary-lower-score} でつけるスコア値でも用いられます。ただし、 @code{wl-score-header-default-entry} のスコア値が @code{nil} の時。 @item wl-score-expiry-days @vindex wl-score-expiry-days 初期設定は 7。 期限付きスコアを削除する日数を指定します。 @item wl-score-update-entry-dates @vindex wl-score-update-entry-dates 初期設定は @code{t}。 Non-nil なら期限付きスコアを削除する機能を有効にします。 @item wl-score-header-default-entry @vindex wl-score-header-default-entry @code{wl-summary-increase-score} や @code{wl-summary-lower-score}、 @code{wl-score-edit-insert-entry} でスコアエントリを作成する場合の 各ヘッダのデフォルト値を設定します。 @item wl-score-simplify-fuzzy-regexp @vindex wl-score-simplify-fuzzy-regexp スコアエントリの型で @code{fuzzy} を指定した場合、 文字列から削除する正規表現を指定します。 @code{Subject} で使用されることが多いので、デフォルトでは メーリングリストプログラムでつけられる prefix を指定しています。 @item wl-summary-rescore-partial-threshold @vindex wl-summary-rescore-partial-threshold 初期設定は 200。 sync-all や rescan が実行されたときに、この値を越えるメッセージが サマリにある場合、サマリの最後から指定された数のメッセージだけ、 部分的にスコア付けが適用されます。 @item wl-summary-auto-sync-marks @vindex wl-summary-auto-sync-marks Non-nil ならば、サマリ同期時に未読/重要マークも同期します。 未読マークは、IMAP4 サーバ上の未読情報が反映されます。 重要マークは IMAP4 サーバ上の重要情報(Flagged フラグがついているか)、 および @samp{'flag} フォルダの内容が、反映されます。 初期設定は @code{t}。 @end table @node Score File Format, , Score Commands, Scoring @section スコアファイル書式 @cindex Score File Format スコアファイルの書式は Gnus と同じなので、Gnus で使用していた スコアファイルがそのまま利用できます。 ただし、幾つかのキーは対応していなかったり Wanderlust 特有のキーがあったり しますので、完全に互換性があるわけではありません。 @xref{Score File Format, , ,gnus-ja, Gnus Manual}. @lisp @group (("subject" ("for sale" -1000 nil s) ("儲け" -1000 nil s)) ("from" ("spam@@spamspamspam" -10000 nil s)) ("followup" ("my@@address" 3001 nil s)) ("chars" (1000000 -10 nil >)) (important 5000) (target 3000) (mark 0) (expunge -3000)) @end group @end lisp @table @code @item 文字列 (STRING) キーが文字列である場合、マッチさせるヘッダの名前を指定します。 このキーには次のものが指定できます。 @code{Subject}, @code{From}, @code{Date}, @code{Message-Id}, @code{References}, @code{To}, @code{Cc}, @code{Chars}, @code{Lines}, @code{Xref}, @code{Extra}, @code{Followup}, @code{Thread} この中で、@code{Chars} はメッセージのサイズを指し、@code{Extra}, @code{Followup}, @code{Thread} については後述します。 残りはキーと同じ名前のフィールドが対象となります。 このキーの後にスコアエントリを任意の数だけ指定し、 この各スコアエントリは次の5つの要素からなります。 @enumerate @item ヘッダにマッチする要素。@code{lines} と @code{chars} の場合は数字で、そ れ以外は文字列を指定します。 @item スコア要素。1番目の要素がマッチした場合、そのメッセージのスコアをこの値分 増減させます。 @item 期限の要素。@code{nil} なら永続(permanent)指定で、 数字(日数)なら一定期間(@code{wl-score-expiry-days})マッチしないと削除されます。 この日数は紀元前1年12月31日から経過した日にちです。 @item 型の要素。1番目の要素をマッチさせる方法を指定します。 キーによって指定できる型が異なります。 @table @dfn @item From, Subject, References, Message-Id これらの文字列のキーに対しては、@code{r} と @code{R} (正規表現) (regexp) や、@code{s} と @code{S} (文字列の一部) (substring)、@code{e} と @code{E} (正確な合致) (exact match)、それに @code{f} と @code{F} (あいまい) (fuzzy) が指定できます。 @code{R}, @code{S}, @code{E}, @code{F} は大文字小文字を区別してマッチさせます。 @item Lines, Chars これらは数字の大小を指定します。その記号は次の5つです。 @code{<}, @code{>}, @code{=}, @code{>=}, @code{<=} @item Followup このキーは、@code{From}ヘッダにマッチし、 そのメッセージへの全てのフォローアップに対してスコアをつけます。 たとえば、自分自身の記事へのフォローアップのスコアを増やしたりするのに便利です。 @code{f} を除いて @code{From} キーと同じ型が指定出来ます。 また、自動的にスコアファイルに @samp{Followup} エントリが追加されます。 @item Thread このキーは、@code{Message-ID} @var{x} で始まっている(サブ)スレッドにスコアを付ける場合に指定します。 これは @code{References} ヘッダに @var{x} を持つそれぞれの記事に新しい @samp{Thread} エントリを自動的に追加します。 これにより、全ての祖先の @code{Message-ID} を @code{References} に含んでいない場合でも、 確実にスレッド全体のスコアを増減させることができます。 @code{f} を除いて @code{References} キーと同じ型が指定出来ます。 また、自動的にスコアファイルに @samp{Thread} エントリが追加されます。 @end table @item 拡張ヘッダの要素。キーが @code{Extra} である場合のみ意味を持ちます。 @code{Subject} や @code{From} などの標準以外のヘッダにマッチさせたい場合に そのヘッダを指定します。 ただし、指定したヘッダは @code{elmo-msgdb-extra-fields} にも設定する必要があります。 したがって、拡張ヘッダが取得できないフォルダでは機能しません。 @end enumerate そしてこれらの@emph{全ての要素を当てはめた後の}合計のスコアがそのメッセー ジのスコアとなります。 @cindex Score File Atoms @item mark この値より小さいスコアのメッセージには既読マークをつけます。 デフォルト値は @code{wl-summary-mark-below} で指定されます。 @item expunge この値より小さいスコアのメッセージはサマリから消去します。 デフォルト値は @code{wl-summary-expunge-below} で指定されます。 @item mark-and-expunge @code{mark} と @code{expunge} を同時に指定します。 つまり、この値より小さいスコアのメッセージは既読マークをつけ、サマリから消去します。 @item target この値より大きいスコアのメッセージにはまとめ処理用マーク @samp{*} をつけます。 デフォルト値は @code{wl-summary-target-above} で指定されます。 @item important この値より大きいスコアのメッセージには重要マーク @samp{$} をつけます。 デフォルト値は @code{wl-summary-important-above} で指定されます。 @end table @subsection 注意事項 @code{extra} キーはもちろん、@code{lines} と @code{xref} キーを使用する 場合でも、@code{elmo-msgdb-extra-fields} を設定する必要があります。 @lisp (setq elmo-msgdb-extra-fields '("lines" "xref")) @end lisp その他、下記の制限事項があります。 @itemize @bullet @item サマリ情報に含まれる@samp{References}フィールドには最後の @samp{Message-ID}しか存在しないため、@code{references}キーもその @samp{Message-ID}にしかマッチしない。 @end itemize フォルダ種別により参照できるキーの一覧。 @example @group @multitable {localdir,localnews} {chars} {lines} {xref} {extra} @headitem @tab chars @tab lines @tab xref @tab extra @item localdir,localnews @tab ○ @tab △ @tab △ @tab △ @item nntp (xover対応) @tab ○ @tab △ @tab △ @tab @U{00D7} @item (xover非対応) @tab @U{00D7} @tab △ @tab △ @tab △ @item imap4 @tab ○ @tab △ @tab △ @tab △ @item pop3 @tab @U{00D7} @tab △ @tab △ @tab △ @end multitable ○: 参照できる @U{00D7}: 参照できない(無視される) △: @code{elmo-msgdb-extra-fields} を設定すれば参照できる @end group @end example @node Address Book, Quick Search, Scoring, Top @chapter アドレス帳 @cindex Address Book アドレス帳を利用することで、メールアドレスを簡単に入力したり, サマリの表示にペットネームを用いることが出来ます。 @menu * Mail Addresses:: アドレス帳の定義 * Address Manager:: アドレスマネージャ @end menu @node Mail Addresses, Address Manager, Address Book, Address Book @section アドレス帳の定義 @cindex Address book Definition @cindex .addresses @cindex Alias, Address アドレスファイル @file{~/.addresses} を作成し、自分用に編集します。 @file{~/.addresses} に書かれたデータは、ドラフト作成時のアドレス補完デー タとして利用されるほか、サマリ表示での名前表示等にも用いられます。なお、 起動した状態でサマリバッファから @file{~/.addresses} にアドレスを追加/ 変更/削除することも可能です。 書き方はとても単純です。こんな感じです。 @example @group # # @r{@samp{#} で始まる行はコメント。} # @r{空行は無視。} # # @var{メールアドレス} "@var{あだ名}" "@var{本名}" # teranisi@@gohome.org "てらにし" "寺西裕一" foo@@bar.gohome.org "Foo さん" "John Foo" bar@@foo.gohome.org "Bar さん" "Michael Bar" @end group @end example @noindent 一行が一人分の定義です。 実際には(デフォルト設定では)サマリ表示で@var{あだ名}、ドラフト作成時のア ドレス情報として@var{本名}が使われます。試してみて、確認してからの方が わかりやすいと思われます。ちょっと書いて試してみてから、またアドレス帳の 定義をやり直すのが良いでしょう。 また、変数 @code{wl-alias-file} に MH の alias file が指定されていれば、 ドラフト作成時のアドレス情報として使われます。 さらに、変数 @code{wl-use-ldap} (初期設定は @code{nil}) を non-nil に設 定すると、LDAP サーバの情報をドラフト作成時のアドレス情報として利用しま す。 LDAP を利用する場合は、@code{wl-ldap-server}、@code{wl-ldap-port}, @code{wl-ldap-base} も適切に設定して下さい。 外部プログラムとして @command{ldapsearch} を利用しますので、 @command{ldapsearch} へあらかじめコマンド実行パスを設定しておく必要があ ります。 @node Address Manager, , Mail Addresses, Address Book @section アドレスマネージャ @cindex Address Manager @kbd{C-c C-a} とするとアドレスマネージャを起動されます。アドレスマネージャ ではアドレス帳の編集を行うことが出来るのに加えて、アドレスマネージャで指 定したアドレスをドラフトバッファへ挿入することができます。 @subsection キーバインド @table @kbd @item t @kindex t (Address Manager) @findex wl-addrmgr-set-to @samp{To:} マークをつけます。 @item c @kindex c (Address Manager) @findex wl-addrmgr-set-cc @samp{Cc:} マークをつけます。 @item b @kindex b (Address Manager) @findex wl-addrmgr-set-bcc @samp{Bcc:} マークをつけます。 @item u @kindex u (Address Manager) @findex wl-addrmgr-unmark マークを取り消します。 @item x @kindex x (Address Manager) @findex wl-addrmgr-apply 宛先マークがついている場合、それらのアドレスをドラフトバッファに 反映してアドレスマネージャを終了します。ドラフトバッファが無い場合、 それらを反映して新規にドラフトバッファを開きます。 宛先マークがついていない場合は単にアドレスマネージャを終了します。 @item q @kindex q (Address Manager) @findex wl-addrmgr-quit アドレスマネージャを終了します。 @item a @kindex a (Address Manager) @findex wl-addrmgr-add アドレス帳に新しい項目を追加します。 @item d @kindex d (Address Manager) @findex wl-addrmgr-delete アドレス帳の項目を削除します。 @item e @kindex e (Address Manager) @findex wl-addrmgr-edit アドレス帳の項目を編集します。 @end table @node Quick Search, Spam Filter, Address Book, Top @chapter Quick Search @cindex Quick Search @code{wl-qs} provides an interface to quickly search your mail archive. It can use an external search engine (@ref{Search Folder}), Gmail search, or a filter folder (@ref{Filter Folder}). @code{wl-qs} provides the command @code{wl-quicksearch-goto-search-folder}. Using it will first prompt for a search, and then jump to the search results. @menu * Setup of Quick Search:: Setup * Usage of Quick Search:: Searching @end menu @node Setup of Quick Search, Usage of Quick Search,, Quick Search @section Setup of @code{wl-qs} To setup, configure the value of @code{wl-quicksearch-folder}. This should be the name of the folder you would like to search. For example, @samp{%[Gmail]/All Mail:username@@imap.gmail.com}, @samp{.archive} or @samp{[]}. The latter is advised if you use a mail index, such as mu, notmuch or namazu, as it is quite fast. @node Usage of Quick Search,, Setup of Quick Search, Quick Search @section Searching To search your mail archive, use the command @code{wl-quicksearch-goto-search-folder}, which can be called using @kbd{'} in a Summary buffer or the Folder buffer. You will be prompted for a search, and then will immediately jump to the search results. @subsection Search folder If you use specified @samp{[} as the value of @code{wl-quicksearch-folder}, you will be accessing a search folder (@ref{Search Folder}). You will be prompted for a search string. The syntax of the search will depend on the value of @code{elmo-search-default-engine}. Quotes will be escaped for you automatically and passed on to the search program. (If you are using the grep search engine, you must specify a target folder. Your @code{wl-quicksearch-folder} should look like @samp{[]~/Mail/semi!grep}.) @subsection Gmail If you use a gmail folder as your @code{wl-quicksearch-folder}, you will be prompted for a Gmail search query (@uref{https://support.google.com/mail/answer/7190}). You may use any Gmail search operator; the search is handled by Gmail's server. @subsection Filter folder If you are using any other type of folder, you will be prompted for a query using the interactive query builder. When you have finished your query, you will be directed to a filter folder for your @code{wl-quicksearch-folder}. @node Spam Filter, Advanced Issues, Quick Search, Top @chapter Spam フィルタ @cindex Spam Filter @code{wl-spam} は、外部 spam フィルタプログラムへのフロントエンドを提供 します。Wanderlust 上でのメッセージに対する操作と連携して、フィルタプロ グラムへの登録や、spam の判定ができるようになります。 @menu * Usage of Spam Filter:: 使い方 * Spam Filter Processors:: 対応している Spam Filter @end menu @node Usage of Spam Filter, Spam Filter Processors, Spam Filter, Spam Filter @section 使い方 @subsection 初期設定 @code{wl-spam} を使うには、まず @file{~/.wl} に以下のように設定して下さ い。 @lisp @group ;; @r{@samp{bogofilter} を使う場合。} ;; @r{ここで、使いたい spam フィルタの @samp{scheme} を設定して下さい。} ;; @r{@xref{Spam Filter Processors}.} (setq elmo-spam-scheme 'bogofilter) (require 'wl-spam) @end group @end lisp @subsection spam マーク 一時的マークに spam マーク (@samp{s}) が追加されます。このマークの付いた メッセージは、アクションの実行時に @code{wl-spam-folder} にリファイルさ れます。また、デフォルトの設定ではサマリでの通常の移動でスキップされるよ うになります。 spam マークは、後述する spam の判定処理で自動的に付く他、@kbd{k m} と押 して任意に付けることも出来ます。 @subsection spam の判定 以下の方法で spam の判定を行うことが出来ます。 @enumerate @item 自動リファイルの実行時に判定する。 以下の設定例のように @code{wl-auto-refile-guess-functions} の任意の位置 に @code{wl-refile-guess-by-spam} を挿入します。 @lisp @group (setq wl-auto-refile-guess-functions '(wl-refile-guess-by-rule wl-refile-guess-by-spam)) @end group @end lisp この例の場合、@code{wl-refile-rule-alist} で振り分け先が決まらなかった時 に spam かどうかを判定するようにしています。 @item 特定のフォルダのサマリに移動した時に判定する。 @code{wl-spam-auto-check-folder-regexp-list} に自動判定を行いたいフォル ダ名の正規表現のリストを設定します。 @lisp (setq wl-spam-auto-check-folder-regexp-list '("\\+inbox")) @end lisp この例の場合、フォルダ名に @samp{+inbox} を含むフォルダのサマリに移動し た時に判定処理が実行されます。 @item @code{elmo-split} によるメッセージの振り分け時に判定する。 @code{elmo-split-rule} の @samp{CONDITION} として指定出来る関数に @code{spam-p} が追加されます。この関数は、対象のメッセージが spam と判定 された時に真となります。 @xref{Split messages}. また、判定結果を元に学習させることも出来ます。(ある程度学習が進んでから、 この設定を有効にするとよいでしょう) 以下に例を示します。 @lisp @group (setq elmo-split-rule '(((spam-p) "+spam") ;; @r{判定結果を元に学習させる場合は代わりに下の条件を使う} ;((spam-p :register t) "+spam") (t "+inbox")) @end group @end lisp @end enumerate @subsection spam の学習 @code{wl-spam} は、メッセージをリファイルすることで、自動的に spam を学 習します。 まず、@code{wl-spam} は Wanderlust の管理するフォルダをそこに含まれるメッ セージの区分によって、以下の 4つの領域に分類します。 @table @samp @item spam spam と判定されたメッセージがあるフォルダ。 (@code{wl-spam-folder} に設定されたフォルダ) @item good non-spam と判定されたメッセージがあるフォルダ。 @item undecide 未判定のメッセージがあるフォルダ。@samp{+inbox} 等、自身で振り分けていな いメッセージがあるフォルダが該当します。 (@code{wl-spam-undecided-folder-regexp-list} で設定) @item ignored @code{wl-trash-folder} や @code{wl-draft-folder} 等、spam の処理とは関係 のないフォルダ。(@code{wl-spam-ignored-folder-regexp-list} で設定) @end table メッセージをリファイルした時、そのメッセージの属する領域が変わった場合、 前後の領域に従って @samp{spam} または、@samp{non-spam} として学習します。 具体的には以下の通りです。 @table @samp @item undecide -> spam spam として学習。 @item good -> spam spam としての学習に加えて、non-spam に行なった学習を削除します。 @item undecide -> good non-spam として学習。 @item spam -> good non-spam としての学習に加えて、spam に行なった学習を削除します。 @end table 上記以外のリファイルでは、学習は行われません。 @subsection キーバインド @cindex Keybind, spam filter @table @kbd @item k m @kindex k m (Summary) @findex wl-summary-spam カーソル行のメッセージに spam マーク(@samp{s})を付けます。 @item k c @kindex k c (Summary) @findex wl-summary-test-spam カーソル行のメッセージをテストし、spam と判定された場合に spam マークを 付けます。spam でないと判定された場合は spam マークを取り除きます。 @item k C @kindex k C (Summary) @findex wl-summary-mark-spam @code{wl-spam-auto-check-marks} に含まれるマークを持つメッセージについて spam かどうかのテストを行います。spam と判定されたメッセージには、spam マークが付けられます。prefix argument をつけた場合は、マークにかかわらず 全てのメッセージを対象とします。 @item k s @kindex k s (Summary) @findex wl-summary-register-as-spam カーソル行のメッセージを spam として登録し spam マークを付けます。 @item k S @kindex k S (Summary) @findex wl-summary-register-as-spam-all フォルダ内の全てのメッセージを spam として登録し spam マークを付けます。 @item k n @kindex k n (Summary) @findex wl-summary-register-as-good カーソル行のメッセージを non-spam として登録し spam マークを取り除きます。 @item k N @kindex k N (Summary) @findex wl-summary-register-as-good-all フォルダ内の全てのメッセージを non-spam として登録し spam マークを取り除きます。 @item r k m @kindex r k m (Summary) @findex wl-summary-spam-region 指定リージョンにあるメッセージに spam マークを付けます。 @item r k c @kindex r k c (Summary) @findex wl-summary-test-spam-region 指定リージョンにあるメッセージをテストし、spam と判定された場合に spam マークを 付けます。spam でないと判定された場合は spam マークを取り除きます。 @item r k s @kindex r k s (Summary) @findex wl-summary-register-as-spam-region 指定リージョンにあるメッセージを spam として登録し spam マークを付けます。 @item r k n @kindex r k n (Summary) @findex wl-summary-register-as-good-region 指定リージョンにあるメッセージを non-spam として登録し spam マークを取り除きます。 @item t k m @kindex t k m (Summary) @findex wl-thread-spam カーソル行があるメッセージを先頭とするスレッドのメッセージに spam マークを付けます。 prefix argument つきならばカーソル行があるメッセージを含むスレッド全てに 適用します。 @item t k c @kindex t k c (Summary) @findex wl-thread-test-spam カーソル行があるメッセージを先頭とするスレッドのメッセージをテストし、 spam と判定された場合に spam マークを付けます。 spam でないと判定された場合は spam マークを取り除きます。 prefix argument つきならばカーソル行があるメッセージを含むスレッド全てに 適用します。 @item t k s @kindex t k s (Summary) @findex wl-thread-register-as-spam カーソル行があるメッセージを先頭とするスレッドのメッセージを spam として登録し spam マークを付けます。 prefix argument つきならばカーソル行があるメッセージを含むスレッド全てに 適用します。 @item t k n @kindex t k n (Summary) @findex wl-thread-register-as-good カーソル行があるメッセージを先頭とするスレッドのメッセージを non-spam として登録し spam マークを取り除きます。 prefix argument つきならばカーソル行があるメッセージを含むスレッド全てに 適用します。 @item m k @kindex m k (Summary) @findex wl-summary-target-mark-spam まとめ処理用マーク @samp{*} のついたメッセージに spam マーク(@samp{s})を 付けます。 @item m s @kindex m s (Summary) @findex wl-summary-target-mark-register-as-spam まとめ処理用マーク @samp{*} のついたメッセージを spam として登録し spam マークを付けます。 @item m n @kindex m n (Summary) @findex wl-summary-target-mark-register-as-good まとめ処理用マーク @samp{*} のついたメッセージを non-spam として登録し spam マークを取り除きます。 す。 @end table @subsection カスタマイズ変数 @table @code @item wl-spam-folder @vindex wl-spam-folder spam と判定されたメッセージを移動するフォルダ名を設定します。 初期設定は、@samp{+spam}。 @item wl-spam-undecided-folder-regexp-list @vindex wl-spam-undecided-folder-regexp-list spam か non-spam か未判定のメッセージがあると看倣すフォルダを、フォルダ 名の正規表現のリストで指定します。 初期設定は、@code{'("inbox")} @item wl-spam-ignored-folder-regexp-list @vindex wl-spam-ignored-folder-regexp-list 初期設定は以下の通り。 @lisp @group (list (regexp-opt (list wl-draft-folder wl-trash-folder wl-queue-folder))) @end group @end lisp spam 判定に対して無効なフォルダを、フォルダ名の正規表現のリストで指定し ます。 @item wl-spam-auto-check-folder-regexp-list @vindex wl-spam-auto-check-folder-regexp-list サマリに移動した時に自動的に spam 判定を行うフォルダを正規表現のリストで 指定します。 初期設定は、@code{nil}。 @item wl-spam-auto-check-marks @vindex wl-spam-auto-check-marks 初期設定は以下のリスト。 @lisp @group (list wl-summary-new-uncached-mark wl-summary-new-cached-mark) @end group @end lisp @code{wl-spam-auto-check-folder-regexp-list} による自動判定を含む、フォ ルダ全体に対する spam 判定の対象とするメッセージのマークを指定します。マー クには永続マークのみ指定できます。一時的マークは指定できません。 デフォルトのようにリストで指定するとそのマークのついたメッセージだけを対 象とする他、以下の指定もできます。 @table @code @item all 永続マークが何であっても spam 判定の対象とします。 @end table @end table @node Spam Filter Processors, , Usage of Spam Filter, Spam Filter @section 対応している Spam Filter @cindex Spam Filter, Bogofilter @cindex Spam Filter, Spamfilter デフォルトでは、以下の spam フィルタリングライブラリに対応しています。 @menu * bogofilter:: bogofilter * spamfilter:: spamfilter.el * bsfilter:: bsfilter * SpamAssassin:: SpamAssassin * SpamOracle:: SpamOracle * Regular Expressions Header Matching:: 正規表現によるヘッダ検査 @end menu @node bogofilter, spamfilter, Spam Filter Processors, Spam Filter Processors @subsection bogofilter @cindex bogofilter bogofilter (@uref{http://bogofilter.sourceforge.net/}) は、C言語で実装さ れた spam フィルタです。 bogofilter による spam フィルタを使用するには、@file{~/.wl} などに以下の 設定を記述します。 @lisp @group (setq elmo-spam-scheme 'bogofilter) @end group @end lisp @subsubsection カスタマイズ変数 @table @code @item elmo-spam-bogofilter-program @vindex elmo-spam-bogofilter-program 初期設定は、@file{bogofilter}。 bogofilter の実行ファイルの名前を設定します。実行ファイルが、環境変数 @env{PATH} 上にない場合は、フルパスを設定する必要があります。 @item elmo-spam-bogofilter-args @vindex elmo-spam-bogofilter-args 初期設定は、@code{nil}。 bogofilter の実行時に実行ファイルに渡される引数を指定します。 @item elmo-spam-bogofilter-database-directory @vindex elmo-spam-bogofilter-database-directory 使用する統計データベースの存在するディレクトリを指定します。@code{nil} ならデフォルトの位置 (@file{~/.bogofilter}) が使用されます。 初期設定は、@code{nil} @item elmo-spam-bogofilter-max-messages-per-process @vindex elmo-spam-bogofilter-max-messages-per-process 初期設定は、30。 学習時にまとめ処理されるメッセージの数を指定します。 @item elmo-spam-bogofilter-debug @vindex elmo-spam-bogofilter-debug 初期設定は、@code{nil}。 non-nil に指定すると、@command{bogofilter} からの出力が @code{"*Debug ELMO SPAM Bogofilter*"}というバッファに出力されます。 @end table @node spamfilter, bsfilter, bogofilter, Spam Filter Processors @subsection spamfilter.el @cindex spamfilter @file{spamfilter.el} (@uref{http://www.geocities.co.jp/SiliconValley-PaloAlto/7043/}) は、 Emacs Lisp で実装された spam フィルタリングライブラリです。 インストール時に @code{load-path} 上に @file{spamfilter.el} があれば、自 動的に対応モジュールがコンパイル/インストールされます。@xref{Install}. @file{spamfilter.el} を使用するには、@file{~/.wl} などに以下の設定を記述 します。(もちろん、@file{spamfilter.el} 自体の設定も必要です) @lisp @group (setq elmo-spam-scheme 'spamfilter) @end group @end lisp @subsubsection カスタマイズ変数 @table @code @item elmo-spam-spamfilter-corpus-filename @vindex elmo-spam-spamfilter-corpus-filename 初期設定は @file{~/.elmo/.spamfilter}。 コーパスファイルの名前を設定します。 @end table @node bsfilter, SpamAssassin, spamfilter, Spam Filter Processors @subsection bsfilter @cindex bsfilter bsfilter (@uref{http://bsfilter.org/}) は、Ruby で実装された spam フィルタです。 bsfilter による spam フィルタを使用するには、@file{~/.wl} などに以下の 設定を記述します。 @lisp @group (setq elmo-spam-scheme 'bsfilter) @end group @end lisp @subsubsection カスタマイズ変数 @table @code @item elmo-spam-bsfilter-program @vindex elmo-spam-bsfilter-program 初期設定は @file{bsfilter}。 @command{bsfilter} の実行ファイルの名前を設定します。実行ファイルが、 環境変数 @env{PATH} 上にない場合は、フルパスを設定する必要があります。 @item elmo-spam-bsfilter-args @vindex elmo-spam-bsfilter-args 初期設定は、@code{nil}。 bsfilter の実行時に実行ファイルに渡される引数を指定します。 @item elmo-spam-bsfilter-database-directory @vindex elmo-spam-bsfilter-database-directory 使用する統計データベースの存在するディレクトリを指定します。@code{nil} ならデフォルトの位置 (@file{~/.bsfilter}) が使用されます。 初期設定は、@code{nil}。 @item elmo-spam-bsfilter-debug @vindex elmo-spam-bsfilter-debug 初期設定は、@code{nil}。 non-nil を指定すると、@command{bsfilter} からの出力が @code{"*Debug ELMO Bsfilter*"}というバッファに出力されます。 @item elmo-spam-bsfilter-shell-program @vindex elmo-spam-bsfilter-shell-program 初期設定は、@file{ruby}。 bsfilter を起動するシェルの名前を設定します。シェルが環境変数 @env{PATH} 上にない場合は、フルパスを設定する必要があります。 @item elmo-spam-bsfilter-shell-switch @vindex elmo-spam-bsfilter-shell-switch 初期設定は、@code{nil}。 bsfilter を起動するシェルに与える引数を指定します。 @item elmo-spam-bsfilter-update-switch @vindex elmo-spam-bsfilter-update-switch 初期設定は、@code{"--auto-update"}。 メッセージを学習する際に @command{bsfilter} に与える引数を指定します。 @end table @node SpamAssassin, SpamOracle, bsfilter, Spam Filter Processors @subsection SpamAssassin @cindex SpamAssassin SpamAssassin (@uref{http://spamassassin.org/}) は、Perl 言語 で実装された、テキスト解析技術やブラックリストに基づくメールフィルタで、 最もよく使われている spam フィルタの一つです。SpamAssassin は Bayesian フィ ルタを使用しており、spam と正当なメールについて学習させることで判定の正確 性を向上することができます。 @file{SpamAssassin} を使用するには、@file{~/.wl} などに以下の設定を記述し ます。(もちろん、あらかじめ SpamAssassin がインストールされ、正常に動作す ることを確認してください) @lisp @group (setq elmo-spam-scheme 'sa) @end group @end lisp @subsubsection カスタマイズ変数 @table @code @item elmo-spam-spamassassin-program @vindex elmo-spam-spamassassin-program 初期設定は @file{spamassassin}。 @command{spamassassin} の実行ファイルの名前を設定します。実行ファイルが、 環境変数 @env{PATH} 上にない場合は、フルパスを設定する必要があります。 @item elmo-spam-spamassassin-learn-program @vindex elmo-spam-spamassassin-learn-program 初期設定は @file{sa-learn}。 SpamAssassin において Bayesian フィルタの学習を行なうプログラム、 @command{sa-learn} の実行ファイルの名前を設定します。実行ファイルが、環境 変数 @env{PATH} 上にない場合は、フルパスを設定する必要があります。 @item elmo-spam-spamassassin-program-arguments @vindex elmo-spam-spamassassin-program-arguments 初期設定は、@code{'("-e")}。 @command{spamassassin} 実行時に与える引数を指定します。 spam の判定結果を、プログラムのプロセス終了コードとして出力する引数を 与える必要があります。例えば、@command{spamassassin} の替わりに @command{spamc} を用いる場合、@code{'("-c")} を設定しなければなりません。 @item elmo-spam-spamassassin-learn-program-arguments @vindex elmo-spam-spamassassin-lern-program-arguments 初期設定は、@code{nil}。 SpamAssassin の学習用プログラム @command{sa-learn} 実行時に与える 引数を指定します。 @item elmo-spamassassin-debug @vindex elmo-spamassassin-debug 初期設定は、@code{nil}。@code{t} を指定すると、@command{spamassassin} からの出力が @code{"*Debug ELMO SpamAssassin*"}というバッファに出力されます。 @end table @node SpamOracle, Regular Expressions Header Matching, SpamAssassin, Spam Filter Processors @subsection SpamOracle @cindex SpamOracle SpamOracle (@uref{http://pauillac.inria.fr/~xleroy/software.html#spamoracle}) は、Objective Caml で実装された spam フィルタです. @file{SpamOracle} を使用するには、@file{~/.wl}などに以下の設定を記述します。 (もちろん、あらかじめ SpamOracle がインストールされ、正常に動作することを 確認してください) @lisp @group (setq elmo-spam-scheme 'spamoracle) @end group @end lisp @subsubsection カスタマイズ変数 @table @code @item elmo-spam-spamoracle-program @vindex elmo-spam-spamoracle-program 初期設定は @file{spamoracle}。 @command{spamoracle} の実行ファイルの名前を設定します。実行ファイルが、 環境変数 @env{PATH} 上にない場合は、フルパスを設定する必要があります。 @item elmo-spam-spamoracle-config-filename @vindex elmo-spam-spamoracle-config-filename 初期設定は @code{nil}。 @command{spamoracle} の設定ファイルを指定します. @code{nil} を指定すると、デフォルトの設定ファイル (@file{~/.spamoracle.conf})が使用されます。 @item elmo-spam-spamoracle-database-filename @vindex elmo-spam-spamoracle-database-filename 初期設定は @file{~/.elmo/.spamoracle.db}。 @command{spamoracle} で使用するデータベースファイルのパスを指定します。 @item elmo-spam-spamoracle-spam-header-regexp @vindex elmo-spam-spamoracle-spam-header-regexp 初期設定は @code{"^X-Spam: yes;"}。 spam メールであることを示すヘッダの正規表現を指定します。 @command{spamoracle} の設定ファイル内で、 @code{spam_header} パラメータの 設定を変更した場合は、この変数の値を設定してください。 @end table @node Regular Expressions Header Matching, , SpamOracle, Spam Filter Processors @subsection Regular Expressions Header Matching @cindex Regular Expressions Header Matching メッセージヘッダの各フィールドが正規表現と合致するかどうかを検査し、spam かどうかを判定します。このバックエンドを使用するには、@file{~/.wl} など に以下の設定を記述します。 @lisp @group (setq elmo-spam-scheme 'header) @end group @end lisp overview 情報に含まれないフィールドを検査の対象とする場合、 @code{elmo-msgdb-extra-fields} に追加しておくと、出来るだけメッセージ本 体を読み込まずに overview 情報を元に検査します。 @subsubsection カスタマイズ変数 @table @code @item elmo-spam-header-good-alist @vindex elmo-spam-header-good-alist 初期設定は以下の通り。 @lisp '(("X-Spam-Flag" . "No")) @end lisp ヘッダフィールド名と合致した時に non-spam と判定する為の正規表現の組をリ ストで指定します。@code{elmo-spam-header-spam-alist} より優先されます。 @item elmo-spam-header-spam-alist @vindex elmo-spam-header-spam-alist 初期設定は以下の通り。 @lisp '(("X-Spam-Flag" . "Yes")) @end lisp ヘッダフィールド名と合致した時に spam と判定する為の正規表現の組をリスト で指定します。 @end table @node Advanced Issues, Migration, Spam Filter, Top @chapter より進んだ使い方 @cindex Advanced Issues @menu * Living with other packages:: パッケージのある生活 * Highlights:: ハイライトの設定 * Biff:: メールの着信を知らせる * Password Management:: パスワードの管理 * Split messages:: メッセージの振り分け * Batch Processing:: バッチ処理 * Advanced Settings:: カスタマイズ〜応用編〜 * Customizable Valiables:: その他のカスタマイズ変数一覧 * Hooks:: フック @end menu @node Living with other packages, Highlights, Advanced Issues, Advanced Issues @section パッケージのある生活 他のパッケージを使うための設定例です。 @menu * imput:: imput (im-wl.el) * BBDB:: The Insidious Big Brother Database * LSDB:: The Lovely Sister Database * supercite:: supercite.el * mu-cite:: mu-cite.el * X-Face:: x-face,bitmap-mule * dired-dd:: dired-dd.el * MHC:: MHC * Addrbook:: Addrbook * mime-w3m:: mime-w3m.el @end menu @node imput, BBDB, Living with other packages, Living with other packages @subsection imput @pindex imput @cindex im-wl @file{util/im-wl.el} を @code{load-path} において以下のように設定すれば OK です。 @lisp @group (autoload 'wl-draft-send-with-imput-async "im-wl") (setq wl-draft-send-function 'wl-draft-send-with-imput-async) @end group @end lisp @node BBDB, LSDB, imput, Living with other packages @subsection bbdb.el @pindex BBDB The Insidious Big Brother Database (@uref{http://savannah.nongnu.org/projects/bbdb/}) は 3.2 以降から Wanderlust に対応しています。 設定の詳細は Wanderlust か BBDB のメーリングリストでおたずねください。 @xref{Mailing List}. @node LSDB, supercite, BBDB, Living with other packages @subsection lsdb.el @pindex LSDB The Lovely Sister Database (@uref{http://sourceforge.jp/projects/lsdb/}) を Wanderlust と共に使うための設定例を以下に示します。 @lisp @group (require 'lsdb) (lsdb-wl-insinuate) (add-hook 'wl-draft-mode-hook (lambda () (define-key wl-draft-mode-map "\M-\t" 'lsdb-complete-name))) @end group @end lisp この例では LSDB を用いたアドレスの補完を @kbd{M-@key{TAB}} に割り当てて います。 @node supercite, mu-cite, LSDB, Living with other packages @subsection sc.el(supercite), sc-register.el @pindex sc @pindex supercite 普通のメーラと同じ設定で OK です。以下は、設定の一例です。 @lisp @group (autoload 'sc-cite-original "supercite" nil t) (add-hook 'mail-citation-hook 'sc-cite-original) @end group @end lisp @node mu-cite, X-Face, supercite, Living with other packages @subsection mu-cite.el @pindex mu-cite 普通のメーラと同じ設定で OK です。以下は設定の一例です。 @lisp @group (autoload 'mu-cite-original "mu-cite" nil t) (add-hook 'mail-citation-hook (function mu-cite-original)) @end group @end lisp @node X-Face, dired-dd, mu-cite, Living with other packages @subsection x-face @pindex x-face 以下のいずれかをインストールすることで、 メッセージバッファの @samp{X-Face:} フィールドをデコードして、画像を表示することができます。 @menu * x-face-mule:: Emacs の場合 @end menu また、エンコード済みの X-Face 文字列を @file{~/.xface} (変数 @code{wl-x-face-file} の値です)の内容に用意しておくと、 ドラフトが準備されるときに自動的に @samp{X-Face:} フィールドとして挿入されます。 (変数 @code{wl-auto-insert-x-face} が non-nil の場合) @node x-face-mule, , X-Face, X-Face @subsubsection x-face-mule @pindex x-face-mule @pindex bitmap-mule bitmap-mule (@uref{ftp://ftp.jpl.org/pub/elisp/bitmap/}) 8.0以降に 付属の @file{x-face-mule.el} を使う場合は以下のように設定してください。 @lisp @group (autoload 'x-face-decode-message-header "x-face-mule") (setq wl-highlight-x-face-function 'x-face-decode-message-header) @end group @end lisp @subsubsection x-face-e21 @pindex x-face-e21 @file{x-face-mule.el} の代わりに @file{x-face-e21.el} (@uref{ftp://jpl.org/pub/elisp/}) を使って X-Face を表示することもできます。 その場合、bitmap-mule は不要です。以下のように設定してください。 @lisp @group (autoload 'x-face-decode-message-header "x-face-e21") (setq wl-highlight-x-face-function 'x-face-decode-message-header) @end group @end lisp @node dired-dd, MHC, X-Face, Living with other packages @subsection dired-dd(Dired-DragDrop) @pindex Dired-DragDrop @pindex Dired-DD @cindex Drag and Drop dired-dd パッケージに含まれる @file{dired-dd-mime.el} を組み込めば、GNU Emacs で編集中の草稿バッファへ dired からドラッグ&ドロップするだけで簡単 にマルチパートを作成できます(もっとも、Wanderlust 専用ではなく SEMI 汎用 ですが)。 @lisp @group ;; @r{dired-dd:} http://www.asahi-net.or.jp/~pi9s-nnb/dired-dd-home.html (add-hook 'dired-load-hook (function (lambda () (load "dired-x") ;; @r{Set dired-x variables here.} ;; @r{To and flo@dots{}} (if window-system (progn (require 'dired-dd) (require 'dired-dd-mime)))))) @end group @end lisp @node MHC, Addrbook, dired-dd, Living with other packages @subsection mhc.el @pindex MHC Message Harmonized Calendaring system (@uref{http://www.quickhack.net/mhc/}) MHC を用いると、メッセージを元に予定表を作れます。 mhc-0.25 の場合: @lisp @group (setq mhc-mailer-package 'wl) (autoload 'mhc-mode "mhc" nil t) (add-hook 'wl-summary-mode-hook 'mhc-mode) (add-hook 'wl-folder-mode-hook 'mhc-mode) @end group @end lisp mhc-current の場合: @lisp @group (autoload 'mhc-wl-setup "mhc-wl") (add-hook 'wl-init-hook 'mhc-wl-setup) @end group @end lisp @node Addrbook, mime-w3m, MHC, Living with other packages @subsection wl-addrbook.el @pindex Addrbook Addrbook of Mew (@uref{http://www.mew.org/}) Mew の Addrbook を Wanderlust で使用できるようにするには、 @file{util/wl-addrbook.el} と @file{util/wl-complete.el} を @code{load-path} において、以下のように設定します。 @lisp @group (require 'wl-addrbook) (wl-addrbook-setup) @end group @end lisp @node mime-w3m, , Addrbook, Living with other packages @subsection mime-w3m.el @pindex mime-w3m emacs-w3m (@uref{http://emacs-w3m.namazu.org/}) に付属の @file{mime-w3m.el} を使って、メッセージの html パートを 表示させることが出来ます。設定方法は @file{mime-w3m.el} の 先頭のコメントを参照してください。 SEMI が SEMI-EPG である場合は、特別な設定は不要です。 @node Highlights, Biff, Living with other packages, Advanced Issues @section ハイライトの設定 @subsection カスタマイズ変数 @table @code @item wl-summary-highlight @vindex wl-summary-highlight 初期設定は @code{t}。サマリのハイライトを行うかどうか。 Non-nil ならサマリのハイライトを行います。 @item wl-highlight-max-summary-lines @vindex wl-highlight-max-summary-lines 初期設定は 10000。 サマリの行数がこの値より大きい場合、サマリのハイライトを行いません。 @item wl-summary-highlight-partial-threshold @vindex wl-summary-highlight-partial-threshold 初期設定は 1000。 サマリ全体をハイライトするかどうかの閾値。 この値を越える行数のメッセージがサマリに存在する場合、 部分的なハイライトを行います。 @item wl-summary-partial-highlight-above-lines @vindex wl-summary-partial-highlight-above-lines 初期設定は 30。@code{wl-summary-highlight-partial-threshold} を越える行 数のメッセージがサマリに存在する場合、バッファ末から、カーソル行よりこの 値の行数分だけ上のメッセージまで部分的なハイライトが行なわれます。(この 値を @code{nil} にするとバッファ末から @code{wl-summary-highlight-partial-threshold}行分だけハイライトされるよ うになります。) @item wl-highlight-body-too @vindex wl-highlight-body-too 初期設定は @code{t}。 Non-nil ならドラフトおよびメッセージの本文もハイライトの対象とします。 @item wl-highlight-message-header-alist @vindex wl-highlight-message-header-alist ドラフトおよびメッセージのヘッダのハイライトを行う際に、 重要 (@code{wl-highlight-message-important-header-contents})な、 二番目に重要 (@code{wl-highlight-message-important-header-contents2})な、 そして重要ではない (@code{wl-highlight-message-unimportant-header-contents}) ことを表す face をそれぞれどのメッセージヘッダに割り当てるかを設定します。 同様に、任意の正規表現に対して任意の face を割り当てることもできます。 @item wl-highlight-citation-prefix-regexp @vindex wl-highlight-citation-prefix-regexp ドラフトおよびメッセージの本文内の引用行を示す正規表現を指定します。 この正規表現にマッチした本文は、 (@code{wl-highlight-message-cited-text-*})で指定される face でハイライトされます。 @item wl-highlight-highlight-citation-too @vindex wl-highlight-highlight-citation-too 初期設定は @code{nil}。 Non-nil なら@code{wl-highlight-citation-prefix-regexp}で与えられる 引用行の引用を示す正規表現自体もハイライトの対象とします。 @item wl-highlight-citation-header-regexp @vindex wl-highlight-citation-header-regexp 引用を始めることを示すヘッダの正規表現を指定します。 この正規表現にマッチした本文は、 @code{wl-highlight-message-headers}で指定される face でハイライトされます。 @item wl-highlight-max-header-size @vindex wl-highlight-max-header-size 初期設定は @code{nil}。 メッセージのヘッダサイズがこの値より大きい場合、ヘッダをハイライトしませ ん。@code{nil} の場合、サイズに関係なくハイライトします。 @item wl-highlight-max-message-size @vindex wl-highlight-max-message-size 初期設定は 10000。 メッセージがこの値より大きい場合、メッセージのハイライトを行いません。 これにより uuencode や非常に大きなダイジェストなどの ハイライトの抑止を行います。 @item wl-highlight-signature-separator @vindex wl-highlight-signature-separator シグニチャの境界を表す正規表現を指定します。 正規表現でも、正規表現のリストでも構いません。 この正規表現にマッチした場所以降のメッセージは、 @code{wl-highlight-message-signature}で指定される face でハイライトされます。 @item wl-max-signature-size @vindex wl-max-signature-size 初期設定は 400。 シグニチャをハイライトする場合、 ハイライトする最大のシグニチャの大きさを指定します。 @item wl-use-highlight-mouse-line @vindex wl-use-highlight-mouse-line 初期設定は @code{t}。 Non-nil ならフォルダモード、サマリモードなどで マウスポインタの行をハイライトの対象とします。 @end table @subsection 文字の色、フォントの設定 文字の色や、フォントを変えるには、Wanderlust で定義されている face を変 更する必要があります。フォントを変えたいときは @code{set-face-font}、 色を変えたいときは @code{set-face-foreground} などを使えばよいでしょう。 face の設定は @file{.emacs} に書くことはできないので @file{~/.wl} に書い てください。 たとえば、シグニチャの色を黄色に変えたいときは、 @lisp (set-face-foreground 'wl-highlight-message-signature "yellow") @end lisp @noindent を @file{~/.wl} に書きます。 以下に Wanderlust で定義されている face について説明します。 @table @code @item wl-highlight-message-headers メッセージヘッダの名前部分の face です。 @item wl-highlight-message-header-contents メッセージヘッダの内容部分の face です。 @item wl-highlight-message-important-header-contents メッセージヘッダの内容のうち重要な部分の face です。 デフォルトでは、@samp{Subject:} の内容部分が設定されています。 この値は @code{wl-highlight-message-header-alist} を変更すれば変えることができます。 @item wl-highlight-message-important-header-contents2 メッセージヘッダの内容のうち重要な部分の face その2です。 デフォルトでは、@samp{From:} と @samp{To:} の内容部分が設定されています。 この値は @code{wl-highlight-message-header-alist} を変更すれば変えることができます。 @item wl-highlight-message-unimportant-header-contents メッセージヘッダの内容のうち重要ではない部分の face です。 デフォルトでは、@samp{X-} で始まるヘッダと @samp{User-Agent:} の内容部分 が設定されています。この値は @code{wl-highlight-message-header-alist} を 変更すれば変えることができます。 @item wl-highlight-message-citation-header メッセージの引用ヘッダ部分の face です。 @item wl-highlight-message-cited-text-* メッセージの引用テキスト部分の face です。 最後には@var{数字}がつき、10 段階まで引用ごとに色分けできるようにしています。 @item wl-highlight-message-signature メッセージのシグニチャ部分の face です。初期設定は、明色バックでは @samp{khaki}、暗色バックでは @samp{DarkSlateBule} です。 @item wl-highlight-header-separator-face ドラフトのメッセージのヘッダセパレータの face です。 @item wl-highlight-summary-important-face サマリで重要マークのついたメッセージ行の face です。 @item wl-highlight-summary-new-face サマリで新規マークのついたメッセージ行の face です。 @item wl-highlight-summary-displaying-face サマリで現在表示中のメッセージ行の face です。 この face は overlay されます。 @item wl-highlight-thread-indent-face サマリで現在表示中のメッセージ行の face です。 @item wl-highlight-summary-unread-face サマリで未読マークのついたメッセージ行の face です。 @item wl-highlight-summary-deleted-face サマリで削除マークのついたメッセージ行の face です。 @item wl-highlight-summary-refiled-face サマリでリファイルマークのついたメッセージ行の face です。 @item wl-highlight-refile-destination-face サマリでリファイルマークの付いたメッセージ行の、 リファイル先情報の部分につく face です。 @item wl-highlight-summary-copied-face サマリでコピーマークのついたメッセージ行の face です。 @item wl-highlight-summary-target-face サマリでまとめ処理用マーク @samp{*} のついたメッセージ行の face です。 @item wl-highlight-summary-thread-top-face サマリでスレッドトップのメッセージ行の face です。 @item wl-highlight-summary-normal-face サマリでスレッドトップではないメッセージ行の face です。 @item wl-highlight-folder-unknown-face フォルダモードで、いくつ未同期メッセージがあるか分らないフォルダの face です。 @item wl-highlight-folder-zero-face フォルダモードで、未同期メッセージがないフォルダの face です。 @item wl-highlight-folder-few-face フォルダモードで、未同期メッセージが少しあるフォルダの face です。 @item wl-highlight-folder-many-face フォルダモードで、未同期メッセージがたくさんあるフォルダの face です。 「少し」と「たくさん」の切れ目は、 変数 @code{wl-folder-many-unsync-threshold} で設定されます。 @item wl-highlight-folder-unread-face フォルダモードで、未同期メッセージがなくて未読メッセージがある フォルダの face です。 @item wl-highlight-folder-killed-face フォルダモードで、アクセスグループ中の削除されたフォルダの face です。 @item wl-highlight-folder-opened-face フォルダモードで、開いたグループにつく face です。 変数 @code{wl-highlight-folder-by-numbers} が @code{nil} か @var{数} の とき有効です。 @item wl-highlight-folder-closed-face フォルダモードで、閉じたグループにつく face です。 変数 @code{wl-highlight-folder-by-numbers} が @code{nil} か @var{数} の とき有効です。 @item wl-highlight-folder-path-face フォルダモードで、現在選択中のフォルダまでのパスにつく face です。 @item wl-highlight-logo-face デモでロゴにつく face です。 @item wl-highlight-demo-face デモの文字列(バージョン番号など)につく face です。 @end table @node Biff, Password Management, Highlights, Advanced Issues @section メールの着信を知らせる @cindex Biff 以下のように設定しておくと @samp{%inbox} にメールが届いたときに、 モードラインの表示によりメールの着信を知らせてくれます。 @lisp (setq wl-biff-check-folder-list '("%inbox")) @end lisp @subsection カスタマイズ変数 @table @code @item wl-biff-check-folder-list @vindex wl-biff-check-folder-list 初期設定は @code{nil}。 メールの着信をチェックするフォルダのリスト。 @code{nil} の場合は着信のチェックを行ないません。 @item wl-biff-check-interval @vindex wl-biff-check-interval 初期設定は 40 (単位:秒)。 この値ごとにメール着信のチェックを行なおうとします。 @item wl-biff-check-delay @vindex wl-biff-check-delay 初期設定は 0 (単位:秒)。 @code{wl-biff-check-interval} で指定した時間が経過し、かつ、 この変数で指定された時間だけアイドル状態が続いた場合にチェックを行います。 @item wl-biff-use-idle-timer @vindex wl-biff-use-idle-timer 初期設定は @code{nil}。 @code{nil} なら @code{wl-biff-check-interval} で指定した時間が経過すると メール着信のチェックを行います。Non-nil なら @code{wl-biff-check-interval} で指定した時間だけアイドル状態が続くとメール着信のチェックを行います。 @item wl-biff-notify-hook @vindex wl-biff-notify-hook 新しいメールが届いた際に実行されるフック。 着信時にビープ音を鳴らす(初期設定)なら以下のように設定します。 @lisp (setq wl-biff-notify-hook '(ding)) @end lisp 音を鳴らしたりしない場合は @code{nil} に設定してください。 @item wl-biff-unnotify-hook @vindex wl-biff-unnotify-hook 前回のチェックで新しいメールが届いており、 今回のチェックで新しいメールが無くなった際に実行されるフック。 @end table @node Password Management, Split messages, Biff, Advanced Issues @section パスワードの管理 サーバに接続する為に入力したパスワードは変数 @code{elmo-passwd-storage} に 接続毎に保持されます。この変数にはエンコードされた生のパスワードが保持さ れており、Emacs を他人に触られるとパスワードを見られる危険性があるので十 分に注意して下さい。 @findex elmo-passwd-alist-clear @findex elmo-passwd-alist-save パスワードが保持されている状態で @kbd{M-x elmo-passwd-alist-save} を実行 するとパスワードがファイルに保存され、パスワードの入力が不要になります。 この場合、キー入力を盗み見られる危険性は減るかもしれませんが、生のパスワ ードがファイルに保存されるので、その扱いには十分注意して下さい。ファイル に保存されたパスワードを消去するには @kbd{M-x elmo-passwd-alist-clear} の後、@kbd{M-x elmo-passwd-alist-save} を実行して下さい。 @table @code @item elmo-passwd-alist-file-name @vindex elmo-passwd-alist-file-name 初期設定は @file{passwd}。 パスワードをセーブしておくファイルの名前です。 コマンド @code{elmo-passwd-alist-save} を実行するとこのファイルに現在設定 されているパスワードがセーブされます。 @item elmo-passwd-life-time @vindex elmo-passwd-life-time 初期設定は @code{nil}。 Non-nil な値が設定された場合は、新規にパスワードが入力されてから @code{elmo-passwd-life-time} 秒後にパスワードを消去するタイマが、 セットされます。@code{nil} の場合は入力されたパスワードを消去しません。 @end table @menu * Auth-source:: auth-source を利用したパスワードの管理 @end menu @node Auth-source, , Password Management, Password Management @subsection auth-source を利用したパスワードの管理 @cindex auth-source @vindex elmo-passwd-storage-type @file{~/.wl} に @code{(setq elmo-passwd-storage-type 'auth-source)} のように記述するとパスワードの管理に auth-source (@pxref{Top, , ,auth, Emacs auth-source}) を利用するようになります。 @subsubsection auth-source 利用時の制限 auth-source 使用時は以下の制限があります。 @itemize @bullet @item プロトコル名や認証メカニズムによるパスワードの区別を行いません。 @item netrc バックエンドの制限かもしれませんが、 同一ホスト名に複数アカウントが存在する場合、インタラクティブにパスワードを 入力することができず、あらかじめエントリを作成しておく必要があります。 @end itemize @node Split messages, Batch Processing, Password Management, Advanced Issues @section メッセージの振り分け @cindex Split messages @code{elmo-split} を使うと、変数 @code{elmo-split-folder} で指定したフ ォルダ内のメッセージを特定の規則に従って @command{procmail} 風に振り分 けることができます。 この機能を使うには、まず @file{~/.emacs} に以下のように設定して下さい。 @lisp (autoload 'elmo-split "elmo-split" "Split messages on the folder." t) @end lisp 振り分け元のフォルダを以下のように設定します。 @lisp (setq elmo-split-folder "%inbox") @end lisp 振り分けのルールは変数 @code{elmo-split-rule} に記述します(書き方は後で 説明します)。 以上の設定をした上で @kbd{M-x elmo-split} すると @code{elmo-split-rule} に従って振り分けを実行します。 @kbd{C-u M-x elmo-split} とすると実際には 振り分けはせずにリハーサルを行ない、その結果を表示します。 以下ではルールの記述の仕方を説明します。まずは次の例を見て下さい。 @lisp @group (setq elmo-split-rule ;; @r{SPAM は @samp{+junk} へ} '(((or (address-equal from "i.am@@spammer") (address-equal from "dull-work@@dull-boy") (address-equal from "death-march@@software") (address-equal from "ares@@aon.at") (address-equal from "get-money@@richman")) "+junk") ;; @r{mule メーリングリストからのメールを @samp{%mule} へ} ((equal x-ml-name "mule") "%mule") ;; @r{wanderlust メーリングリストからのメールを @samp{%wanderlust} へ} ;; @r{そして続けてそれ以下の規則も評価する。} ((equal x-ml-name "wanderlust") "%wanderlust" continue) ;; @r{Yahoo 利用者からのメッセージを @samp{+yahoo-@{username@}} へ} ((match from "\\(.*\\)@@yahoo\\.com") "+yahoo-\\1") ;; @r{マッチしなかった残りを @samp{+inbox} へ} (t "+inbox"))) @end group @end lisp 規則の基本単位は @lisp (@samp{CONDITION} @samp{ACTION} [@code{continue}]) @end lisp の組で、@samp{CONDITION} が真の場合に @samp{ACTION} を実行します。 第一の要素 @samp{CONDITION} には条件を S 式で記述します。書式については すぐ後で説明します。第二の要素 @samp{ACTION} にはメッセージの振り分け先 のフォルダ名、もしくはシンボルを指定します。 第三の要素 @code{continue} をシンボルとして与えると、@samp{CONDITION} が 満たされた場合にも振り分け規則の評価を継続します。 @samp{CONDITION} の記法は以下のようになります。実際の書き方は上で挙げた 例を参考にして下さい。 @enumerate @item @samp{フィールド名} および @samp{値} を引数として取る関数。 (@samp{フィールド名} はフィールド名を表すシンボルです) @table @code @item @code{equal} フィールドの値が @samp{値} に等しければ真。 大文字小文字の差は無視されます。 @item @code{match} フィールドの値が @samp{値} にマッチすれば真。 @samp{値} は @code{\&} や @code{\N} を含むことができます。 それらはその前の @samp{値} で @code{\(\)} にマッチしたパターンに 置き換えられます。 @item @code{address-equal} そのフィールドにあるアドレスのいずれかが @samp{値} に等しければ真。 大文字小文字の差は無視されます。 @item @code{address-match} そのフィールドにあるアドレスのいずれかが @samp{値} にマッチすれば真。 @samp{値} は @code{\&} や @code{\N} を含むことができます。 それらはその前の @samp{値} で @code{\(\)} にマッチしたパターンに 置き換えられます。 @end table @item 1 つの整数 (@samp{SIZE}) を引数としてとる関数。 @table @code @item @code{<} メッセージのサイズが @samp{SIZE} より小さければ真。 @item @code{>} メッセージのサイズが @samp{SIZE} より大きければ真。 @end table @item 任意数の引数を取る関数。 @table @code @item @code{or} 引数のいずれかが真を返すならば真。 @item @code{and} 引数のすべてが真を返すならば真。 @end table @item シンボル。 シンボルが指定されると、それを評価します。 @end enumerate @samp{ACTION} の値として指定できるのは以下のいずれかです。 @enumerate @item フォルダ名 文字列が指定されるとそれを振り分け先のフォルダ名とみなして、そのフォルダ へメッセージを追加します。 @item @samp{delete} シンボル @samp{delete} が指定されると @code{elmo-split-folder} 内にある メッセージの実体を削除します。 @item @samp{noop} シンボル @samp{noop} が指定された場合、そのメッセージに対しては何もせず、 そのままの状態に保ちます。 @item 関数 関数が指定された場合、それを実行します。 @end enumerate 全ての振り分け規則を通過したメッセージは、変数 @code{elmo-split-default-action} で指定した @samp{ACTION} に沿って処理さ れます。 @node Batch Processing, Advanced Settings, Split messages, Advanced Issues @section バッチ処理 @cindex Batch Processing コマンドラインから wanderlust に仕事をさせることができます。 現在できる処理は指定したフォルダの新着メッセージのプリフェッチです。 @code{wl-batch-prefetch-folder-list} にプリフェッチを行うフォルダを 指定してコマンドラインから以下のようにするとプリフェッチを行います。 @example @group % emacs -batch -l wl-batch -f wl-batch-prefetch @end group @end example @subsection カスタマイズ変数 @table @code @item wl-batch-prefetch-folder-list @vindex wl-batch-prefetch-folder-list @code{wl-batch-prefetch} でプリフェッチを行うフォルダを、フォルダ名のリスト で指定します。 @end table @node Advanced Settings, Customizable Valiables, Batch Processing, Advanced Issues @section カスタマイズ〜応用編〜 @menu * Draft for Reply:: 返事用ドラフト * Thread Format:: スレッドの見た目 * User-Agent Field:: @samp{User-Agent:} ヘッダフィールド @end menu @node Draft for Reply, Thread Format, Advanced Settings, Advanced Settings @subsection 返事用ドラフト @vindex wl-draft-reply-with-argument-list @vindex wl-draft-reply-without-argument-list サマリモードで @kbd{a} を押すと返事用のドラフトが用意されます。 用意される草稿の宛先は、以下のようにして設定することができます。 例えば、 @lisp @group (setq wl-draft-reply-without-argument-list '(("Mail-Followup-To" . (("Mail-Followup-To") nil ("Newsgroups"))) ("Followup-To" . (nil nil ("Followup-To"))) (("X-ML-Name" "Reply-To") . (("Reply-To") nil nil)) ("From" . (("From") ("To" "Cc") ("Newsgroups"))))) @end group @end lisp のように設定します。ここでリスト @code{wl-draft-reply-without-argument-list} の各要素は @example (key . (to-list cc-list newsgroup-list)) @end example となっており、@samp{key} で指定したフィールドが存在するときに、親メッセージ の @samp{to-list} で指定されるヘッダを、草稿の @samp{To:} にコピーします。 また同様に、親の @samp{cc-list}, @samp{newsgroup-list} は草稿の @samp{Cc:}, @samp{Newsgroups:} にコピーされます。 例を挙げて説明します。 @lisp ("Mail-Followup-To" . (("Mail-Followup-To") nil ("Newsgroups"))) @end lisp 親メッセージに @samp{Mail-Followup-To} フィールドが存在したときにマッチします。 親メッセージの @samp{Mail-Followup-To} および @samp{Newsgroups} フィールドの内容を、草稿の @samp{To} および @samp{Newsgroups} にコピーします。 @lisp (("X-ML-Name" "Reply-To") . (("Reply-To") nil nil)) @end lisp 親メッセージに @samp{X-ML-Name} および @samp{Reply-To} の両方が存在した ときにマッチします。 親メッセージの @samp{Reply-To} を草稿の @samp{To} にコピーします。 @lisp ("From" . (("From") ("To" "Cc") ("Newsgroups"))) @end lisp 親メッセージの @samp{From} を草稿の @samp{To} に、親の @samp{To} および @samp{Cc} を草稿の @samp{Cc} に、@samp{Newsgroups} を @samp{Newsgroups} にそれぞれコピーします。 これらは順番に評価され、最初にマッチしたものが使われます。 同様にして、prefix argument 付きで @kbd{a} を押したときの動作が、 @code{wl-draft-reply-with-argument-list} で設定できます。 また、関数(親メッセージのバッファで評価される)を @samp{key} や @samp{to-list} 等の変わりに用いることもできます。 自分の書いたメッセージへの返信の場合にマッチさせたい場合には @samp{key} として関数 @code{wl-draft-self-reply-p} を指定します。 @kbd{C-u a} したときに、@code{wl-subscribed-mailing-list} の アドレスが含まれるメールに対してはメーリングリストにのみ返信したい場合、 次のような設定ができます。 @lisp @group (defun wl-mailing-list-addresses () (let (list-addrs) (dolist (to (mapcar (lambda (addr) (nth 1 (std11-extract-address-components addr))) (wl-parse-addresses (wl-concat-list (elmo-multiple-fields-body-list (list "To" "Cc")) ",")))) (when (elmo-string-matched-member to wl-subscribed-mailing-list t) (setq list-addrs (cons to list-addrs)))) (nreverse list-addrs))) (setq wl-draft-reply-with-argument-list '((wl-mailing-list-addresses . (wl-mailing-list-addresses nil nil)) ("Reply-To" . (("Reply-To") nil nil)) ("Mail-Reply-To" . (("Mail-Reply-To") nil nil)) ("From" . (("From") nil nil)))) @end group @end lisp @node Thread Format, User-Agent Field, Draft for Reply, Advanced Settings @subsection スレッドの見ため @example @group 389 09/18(金)01:07 [ てらにし ] wl-0.6.3 390 09/18(金)07:25 +-[ 津邑さん ] 391 09/18(金)19:24 +-[ 村田さん ] 392 09/20(日)21:49 +-[ 奥西さん ] 396 09/20(日)22:11 | +-[ 津邑さん ] 398 09/21(月)00:17 | +-[ 津邑さん ] 408 09/21(月)22:37 | +-[ 奥西さん ] 411 09/22(火)01:34 | +-[ 津邑さん ] 412 09/22(火)09:28 | +-[ てらにし ] 415 09/22(火)11:52 | +-[ 津邑さん ] 416 09/22(火)12:38 | +-[ てらにし ] 395 09/20(日)21:49 +-[ 奥西さん ] 397 09/21(月)00:15 +-[ 奥西さん ] @end group @end example スレッドの見ためを上記のようにしたい場合の設定は以下の通りです。 @lisp @group (setq wl-thread-indent-level 2) (setq wl-thread-have-younger-brother-str "+") (setq wl-thread-youngest-child-str "+") (setq wl-thread-vertical-str "|") (setq wl-thread-horizontal-str "-") (setq wl-thread-space-str " ") @end group @end lisp 枝を表示しないようにしたい場合の設定は以下のようにします。 @lisp @group (setq wl-thread-indent-level 2) (setq wl-thread-have-younger-brother-str " ") (setq wl-thread-youngest-child-str " ") (setq wl-thread-vertical-str " ") (setq wl-thread-horizontal-str " ") (setq wl-thread-space-str " ") @end group @end lisp @node User-Agent Field, , Thread Format, Advanced Settings @subsection User-Agent フィールド @cindex X-Mailer @cindex User-Agent @samp{X-Mailer:} フィールドや @samp{User-Agent:} フィールドに凝りたいと いう変わった人は、文字列を生成する関数を自分の好きなように定義して、変数 @code{wl-generate-mailer-string-function} に設定してください。 @samp{User-Agent:} フィールドを短くしたいのであれば、以下の設定をしてく ださい。 @lisp @group (setq wl-generate-mailer-string-function 'wl-generate-user-agent-string-1) @end group @end lisp 以下は設定の例です。 @lisp @group (setq wl-generate-mailer-string-function nil) (setq wl-draft-additional-header-alist (list (cons 'X-Mailer (lambda () (product-string-1 'wl-version))))) @end group @end lisp @node Customizable Valiables, Hooks, Advanced Settings, Advanced Issues @section その他のカスタマイズ変数一覧 その他のカスタマイズ変数一覧。 @table @code @item wl-default-folder @vindex wl-default-folder 初期設定は @samp{%inbox}。フォルダ移動時などのデフォルト値となります。 @item wl-draft-folder @vindex wl-draft-folder 初期設定は @samp{+draft}。ドラフトをセーブするフォルダです。 書き込みのできるフォルダを指定する必要があります。 IMAP のリモートフォルダや、Maildir なども指定可能です。 なお、@code{wl-draft-config-exec} で設定された変数は @code{elmo-msgdb-directory} 以下に保存されます。したがって、@code{wl-draft-folder} でリモートのフォルダ を指定した場合、ドラフトのセーブ前に @code{wl-draft-config-exec} で設定された変数 は別のマシンで @code{wl-summary-reedit} で再編集した時には効果を持ちません。 @item wl-trash-folder @vindex wl-trash-folder 初期設定は @samp{+trash}。ゴミ箱フォルダです。 この値を変更したときは Wanderlust を再起動することをお勧めします。 @item wl-interactive-exit @vindex wl-interactive-exit 初期設定は @code{t}。 Non-nil ならば、Wanderlust 終了時に確認を行います。 @item wl-interactive-send @vindex wl-interactive-send 初期設定は @code{t}。 Non-nil ならば、メール送信時に本当に送信して良いかを確認します。 @item wl-default-sync-range @vindex wl-default-sync-range 初期設定は @samp{update}。 デフォルトのサマリ更新レンジで、@samp{all}, @samp{update}, @samp{rescan}, @samp{no-sync} のいずれかを指定します。 レンジの意味については @code{wl-summary-sync} の説明を参照して下さい。 @item wl-folder-sync-range-alist @vindex wl-folder-sync-range-alist 初期設定は、以下の連想リスト。 @lisp @group (("^&.*$" . "all") ("^\\+draft$\\|^\\+queue$" . "all")) @end group @end lisp @noindent フォルダ名の正規表現とサマリ更新レンジとの連想リストです。 更新レンジには @samp{all}, @samp{update}, @samp{rescan}, @samp{no-sync} のいずれかを指定します。マッチしなかった場合は、@code{wl-default-sync-range} の値(初期値は @samp{update})を使います。 レンジの意味については @code{wl-summary-sync} の説明を参照して下さい。 @item wl-ask-range @vindex wl-ask-range 初期設定は @code{t}。 @code{nil} なら、フォルダ移動時のサマリ更新で @code{wl-folder-sync-range-alist} の値を使用します。 @item wl-mime-charset @vindex wl-mime-charset 初期設定は @code{x-ctext}。 MIME ではないメッセージの場合 (@samp{Content-Type:} がないメールなど) や、 サマリの表示で用いられる MIME charset です。 (Nemacs とその他の Emacsen でサマリを共有したい場合は、 この値を @code{iso-2022-jp} としてください。) @item wl-highlight-folder-with-icon @vindex wl-highlight-folder-with-icon 初期設定は @code{t} です。 @item wl-strict-diff-folders @vindex wl-strict-diff-folders フォルダ名の正規表現のリストです。 フォルダモードで @kbd{s} を押すなどして未読のメッセージ数を チェックした場合、通常は簡易的な方法でチェックしています(処理は速いが、正確ではない)。 この変数にマッチするフォルダは厳密にチェックします。 IMAP4 フォルダに対する条件フィルタフォルダのような場合には、 この変数にマッチするよう設定すると良いでしょう。 初期設定は @code{nil}。 @item wl-folder-use-server-diff @vindex wl-folder-use-server-diff フォルダモードで @kbd{s} を押すなどして未読のメッセージ数をチェックした 場合、通常は(サーバ上のメッセージ数) @minus{} (ローカルにあるメッセージ 数)が未読とみなされます。しかし、この変数が non-nil ならば、サーバ上の未 読のメッセージ数をチェックします。IMAP4 フォルダにのみ影響があります。た だし、変数 @code{elmo-imap4-disuse-server-flag-mailbox-regexp} にマッチ するメールボックスの IMAP4 フォルダは、この変数にマッチしてもサーバ上の 未読のメッセージ数をチェックしません。初期設定は @code{t}。 @item wl-auto-check-folder-name @vindex wl-auto-check-folder-name 初期設定は @code{nil}。 起動時に未読数をチェックするフォルダやグループを指定します。 チェックを行ないたいフォルダ(グループ)のリストを指定することもできます。 @code{nil} ならば起動時に Desktop 全体をチェックします。 @code{none} ならば、起動時に何もチェックしません。 @item wl-auto-uncheck-folder-list @vindex wl-auto-uncheck-folder-list 初期設定は以下のリスト。 @lisp @group ("\\$.*") @end group @end lisp @noindent @code{wl-auto-check-folder-name} で指定されたグループに含まれていても 起動時に未読チェックしないフォルダ名の正規表現のリストです。 また、Desktop に対して未読チェックをする際にも、これらのフォルダはスキップされます。 @item wl-auto-check-folder-list @vindex wl-auto-check-folder-list 初期設定は @code{nil}。 @code{wl-auto-uncheck-folder-list} に指定されていたとしても 例外的に未読チェックしたいフォルダ名の正規表現のリストを指定します。 @item wl-no-save-folder-list @vindex wl-no-save-folder-list 初期設定は以下のリスト。 @lisp @group ("^/.*$") @end group @end lisp @noindent セーブしないフォルダ名の正規表現のリストです。 @item wl-save-folder-list @vindex wl-save-folder-list 初期設定は @code{nil}。 セーブするフォルダ名の正規表現のリストです。 @code{wl-no-save-folder-list} よりも優先します。 @item wl-folder-mime-charset-alist @vindex wl-folder-mime-charset-alist 初期設定は以下の連想リスト。 @lisp @group (("^-alt\\.chinese" . big5) ("^-relcom\\." . koi8-r) ("^-tw\\." . big5) ("^-han\\." . euc-kr)) @end group @end lisp @noindent フォルダ名の正規表現と MIME charset の連想リストです。 マッチしなかった場合は @code{wl-mime-charset} が使われます。 @item wl-folder-init-load-access-folders @vindex wl-folder-init-load-access-folders 初期設定は @code{nil}。 初期化時に特定のアクセスグループのみロードする場合に、そのグループのリ ストを指定します。 @code{nil} の場合は @code{wl-folder-init-no-load-access-folders} が参照されます。 @item wl-folder-init-no-load-access-folders @vindex wl-folder-init-no-load-access-folders 初期設定は @code{nil}。 初期化時に特定のアクセスグループを除いてロードする場合に、ロードしない アクセスグループのリストを指定します。 @code{wl-folder-init-load-access-folders} が non-nil の場合は無視されます。 @item wl-dispose-folder-alist @vindex wl-dispose-folder-alist 初期設定は以下の連想リスト。 @lisp @group (("^-" . remove) ("^@@" . remove)) @end group @end lisp @noindent 処分マーク @samp{d} をつけたメッセージを処分する方針を設定します。 リストの各要素はフォルダと処分先になっており、処分先には次のものが指定で きます。 @example @code{remove} or @code{null} : メッセージを即削除する。 string : 指定したフォルダに移動する。 @code{trash} or その他 : @code{wl-trash-folder} に移動する。 @end example @item wl-x-face-file @vindex wl-x-face-file 初期設定は @file{~/.xface}。 エンコード済みの X-Face 文字列を内容とするファイル名です。 @xref{x-face-mule}. @item wl-demo-display-logo @vindex wl-demo-display-logo Non-nil ならばオープニングデモでビットマップのイメージを表示します。 @code{xpm}, @code{xbm} を指定すると(可能ならば)、その画像タイプのイメー ジを表示します。 @item elmo-nntp-list-folders-use-cache @vindex elmo-nntp-list-folders-use-cache 初期設定は 600 (秒)。 NNTP において @samp{list} や @samp{list active} の結果を キャッシュしておく時間を秒単位で指定します。 @code{nil} ならキャッシュしません。 @item elmo-nntp-max-number-precedes-list-active @vindex elmo-nntp-max-number-precedes-list-active 初期設定は @code{nil}。 NNTP において @samp{list active} の結果得られる記事番号を フォルダの最大記事番号として利用します。 NNTP サーバとして INN 2.3 などを使用していて、フォルダモードでの既読数 が一致しない場合は @code{t} にしてください。 @c non-nil means? @item elmo-nntp-default-use-listgroup @vindex elmo-nntp-default-use-listgroup 初期設定は @code{t}。 Non-nil なら、NNTP において 総記事数を調べるために @samp{listgroup} を使 います。@code{nil} ならば @samp{group} の結果を用います。@samp{group} を使うと、 正確さには欠けますが、若干高速化されます。 @item elmo-pop3-send-command-synchronously @vindex elmo-pop3-send-command-synchronously 初期設定は @code{nil}。 Non-nil なら POP3 のコマンドを同期的に発行します。サーバによってはこの値を設定しないとサマリ情報を取り出せない場合があるようです。 POP3 参照時に処理がハングするような場合は、@code{t} にすると良いかもしれません。 @item elmo-dop-flush-confirm @vindex elmo-dop-flush-confirm 初期設定は @code{t}。 Non-nil ならばオフライン処理で溜った処理を実行するかどうかを確認します。 @item elmo-network-session-idle-timeout @vindex elmo-network-session-idle-timeout 初期設定は @code{nil}。 ネットワークセッションをキャッシュするアイドル時間を秒で指定します。 ここで指定された値よりも長い時間、なにも通信が行なわれなかった場合、 そのセッションは再利用されません。nil なら、無条件に再利用します。 @end table @node Hooks, , Customizable Valiables, Advanced Issues @section フック (Not yet written) @node Migration, Terminology, Advanced Issues, Top @chapter 旧バージョンからの移行 @cindex Migration この章では、以前のバージョンから移行する場合に必要な設定の変更や、制限等 について説明します。 @menu * Before 2.12.0:: 2.12.0 より前のバージョンからの移行 @end menu @node Before 2.12.0, , Migration, Migration @section 2.12.0 より前のバージョンからの移行 @subsection msgdb の変換について 2.12.0 より前のバージョンから、msgdb の構造が変更されています。以後、新 しく作成したフォルダの msgdb は、この新しい形式で作成/保存されます。以前 の msgdb の形式をそのまま使い続ける場合には、@file{~/.wl} 等に以下の設定 を記述します。 @lisp @group (setq elmo-msgdb-default-type 'legacy) @end group @end lisp 以前のバージョンで作成された msgdb は、デフォルトの設定ではロードされた時 に自動的に新しい形式の msgdb に変換されます。自動的に msgdb の形式を変換 しないようにするには、以下のいずれかの設定を @file{~/.wl} 等に記述します。 @lisp @group ;; @r{msgdb をロードした時に @code{elmo-msgdb-default-type} と} ;; @r{異なった形式だった場合に自動的に変換する場合 (デフォルト)} (setq elmo-msgdb-convert-type 'auto) ;; @r{サマリで @kbd{s all} した時に変換する場合} (setq elmo-msgdb-convert-type 'sync) ;; @r{変換しない場合} (setq elmo-msgdb-convert-type nil) @end group @end lisp 上述の様に以前の msgdb のまま使い続ける事も出来ますが、その場合には以下 の制限があります。 @enumerate @item 転送済みマーク (@samp{F}, @samp{f}) が使用出来ません。 @item @samp{important} 以外のグローバルフラグが使用出来ません。 @end enumerate @subsection @samp{'mark} フォルダから @samp{'flag} フォルダへの変更 新しいバージョンの Wanderlust を起動した時に @samp{'mark} フォルダにあっ たメッセージは、@samp{'flag} フォルダに自動的に引き継がれます。但し、こ うやって引き継いだメッセージには、以下の制限があります。 @enumerate @item @samp{'flag} フォルダでメッセージを消しても元のメッセージの @samp{important} フラグは消えません。 @item 元のメッセージの @samp{important} フラグを消しても @samp{'flag} フォルダ からは削除されません。 @item help-echo で、元のメッセージが表示されません。 @end enumerate もしも、自動での引き継ぎが上手くいかなかった場合は、@kbd{M-x elmo-global-mark-upgrade} を実行する事で、再度 @samp{'mark} フォルダから @samp{'flag} フォルダにメッセージを取り込む事が出来ます。(重複したメッセー ジは取り込まないので、何回実行しても問題ありません) @node Terminology, Mailing List, Migration, Top @chapter 用語の解説 @cindex Terminology このマニュアルで使われている用語についての説明をします。 @table @samp @item フォルダ (folder) メッセージが格納されているいれものです。 @item グループ (group) 複数のフォルダをまとめた集合です。 @item アクセスグループ (access group) 指定したパス以下のフォルダを自動的に集めてできる、特別なグループを 指します。 @xref{Folder Definition}. @item サマリ (summary buffer) メッセージの一覧を表示するバッファです。 @item スティッキーサマリ (sticky summary) サマリを抜けると、通常のサマリは破棄されますが、 @kbd{q} や @kbd{g} でサマリを抜けても破棄されずに残る、 特別なサマリを指します。 @xref{Sticky Summary}. @item エクスパイア (expire) 期限切れメッセージを自動的に削除したりアーカイブしたりすること。 @xref{Expire}. @item スコア (score) @xref{Scoring}. @item プリフェッチ (prefetch) オフラインでメッセージを読むために、あらかじめメッセージをキャッシュ しておくことをいいます。 @end table @node Mailing List, Addition, Terminology, Top @chapter メーリングリスト @cindex Bug report @cindex Backtrace Wanderlust に関する議論は以下のメーリングリストで行われます。 最新バージョンのアナウンスもこちらに流れます。 @display Wanderlust Mailing List @t{} @end display ここでは主に日本語での議論が行われています。また、英語専用のリストとして @display Wanderlust List in English @t{} @end display もあります(こちらに投稿されたメッセージは前者にも配送されます)。 これらのメーリングリストのガイドを得るには、@t{wl-ctl@@ml.gentei.org} 宛 (英語の方は @t{wl-en-ctl@@ml.gentei.org} 宛) で、本文に @example # guide @end example @noindent と書いたメールを送って下さい。 バグ報告やパッチの送付もこれらのメーリングリストへ送ってください。メーリ ングリストへの送信はメンバになる必要があります。 もしくは、GutHubも利用できます。 プルリクエストを送る場合は、Emacs の様に、コミットメッセージに従来の @file{ChangeLog} エントリに相当する内容をインデントせずに入力して下さい。 Emacs の @file{CONTRIBUTE} ファイル @footnote{@uref{https://git.savannah.gnu.org/cgit/emacs.git/plain/CONTRIBUTE}} にある @cite{Commit messages} セクションを参照して下さい。 また、バグ報告の場合はバックトレースを取って添付すると原因究明しやすくな ります。 @footnote{バックトレースの取り方は @uref{http://www.jpl.org/elips/BUGS-ja.html}が参考になります。} メーリングリストの皆様には貴重な御助言、コードをたくさん御提供いただいて おります。この場を借りてお礼申し上げます。 @section アーカイブ メーリングリストに投稿されたメッセージは、NetNews でも読むことができます。 @t{} に投稿されたメッセージ @example @uref{news://news.gmane.io/gmane.mail.wanderlust.general.japanese} @end example @t{} に投稿されたメッセージ @example @uref{news://news.gmane.io/gmane.mail.wanderlust.general} @end example @node Addition, Index, Mailing List, Top @chapter おまけ @section 略歴 @example 1998 3/05 MH メッセージをスレッド表示するプロトタイプを作ってみる。 3/10 elisp による msgdb のしくみをつくる。 3/26 IMAP と NNTP もスレッド表示できるようになる。 4/13 スレッド表示用モジュールを elmo としてまとめはじめる。 5/01 0.1.0 ボロボロの initial version が完成。 6/12 tm-ja ML で、IMAP 対応の elisp メーラを作っている、 とつい口を滑べらせてしまう。 6/16 tm-ja, elips ML で 0.1.3 をアナウンス。 6/22 北目さんのおかげで northeye.org でメーリングリストがスタート。 7/01 mm-backend 対応(0.3.0)。 8/25 multi フォルダ追加(0.5.0)。 8/28 filter フォルダ追加(0.5.1)。 9/10 スレッドが開閉できるようになる(0.6.0)。 9/11 fldmgr by 村田さん によりフォルダの編集が簡単に。 9/18 lha フォルダ追加 by 奥西さん(0.6.3)。 9/24 スレッドの枝を表示(0.6.5)。 9/28 圧縮フォルダがマルチアーカイバに対応 by 奥西さん。 10/28 オフライン処理 (0.7.4)。 12/09 ベータバージョンに。 12/21 wl-expire by 村田さん。 1999 2/03 auto-refile by 津邑さん。 4/28 wl-template by 村田さん。 5/18 1.0.0 stable リリース。 7/05 スコア機能 by 村田さん(2.1.0)。 9/26 プラグ管理システム by 村田さん(2.2.2)。 12/20 Modified UTF7 対応。 2000 3/24 1.1.0 stable リリース。 4/03 CVS サーバでの開発を開始。 5/07 スレッドつなぎ直し機能&高速化 with 村田さん。 6/12 LDAP 対応 with 千葉さん&後藤さん。 7/11 killed message 機能追加。 7/18 POP3 を UIDL 対応。 9/12 biff 機能 with 嵯峨田さん&山岡さん。 10/17 expire-hide by 岡田さん。 11/08 2.4.0 stable リリース。 2001 7/04 2.6.0 stable リリース。 8/21 wl-addrmgr by 北本さん。 12/27 2.8.1 stable リリース。 2002 12/11 2.10.0 stable リリース。 2003 7/05 2.10.1 stable リリース。 9/18 flag フォルダ。 9/20 新形式 msgdb (modb-standard) by 村田浩也さん。 10/20 スパムフィルタ by 村田浩也さん。 2004 1/06 デモの背景色指定。 2/09 'file' フォルダ。 9/12 forwarded マーク。 マーク文字列のデフォルト値変更。 12/24 2.12.0 stable リリース。 @end example 詳しい変遷は @file{ChangeLog} を御覧ください。 @section 名前 Wanderlust には、研究社英和辞典によれば、 @display wanderlust wan・der・lust ‡ドイツ語 'desire to wander' の意から‡ −名 放浪癖, 旅行熱, 旅心: have 〜 放浪癖がある. @end display @noindent という意味があります。が、名前にたいして深い意図はありません。 (強いて言えば、IMAP @result{} どこでもメールが読める @result{} 放浪癖 ?) elmo は、@samp{Elisp Library for Message Orchestration} の略です。 最初はあの赤いぬいぐるみのつもりでしたが、放浪 @result{} 漂流 @result{} 道標 @result{} St.@: Elmo's fire @result{} elmo という、 それっぽい連想も可能です。 @section コードネーム 各バージョンにはコードネームがついています(ほとんど冗談です)。 いまのところ 1980 年代の米ビルボード誌トップ 40 ヒット (@uref{http://ntl.matrix.com.br/pfilho/html/top40/}) @noindent からアルファベット順に適当に好きなものをピックアップして使っています。 @node Index, , Addition, Top @unnumbered 索引 @menu * Concept Index:: 概念索引 * Key Index:: キーバインド索引 * Variable Index:: 変数索引 * Function Index:: 関数索引 @end menu @node Concept Index, Key Index, Index, Index @unnumberedsec 概念索引 @printindex cp @node Key Index, Variable Index, Concept Index, Index @unnumberedsec キーバインド索引 @printindex ky @node Variable Index, Function Index, Key Index, Index @unnumberedsec 変数索引 @printindex vr @node Function Index, , Variable Index, Index @unnumberedsec 関数索引 @printindex fn @summarycontents @contents @bye @c Local Variables: @c fill-column: 72 @c End: wanderlust-wanderlust-769699d/doc/wl-refcard-ja.tex000066400000000000000000000314131406661363500223140ustar00rootroot00000000000000% Reference Card for Wanderlust % The format of this file is adapted from the GNU Emacs reference card % % You can compile with luatex and luatexja.sty. \input luatexja.sty \pagewidth=297mm \pageheight=210mm \pdfvariable horigin 1 true in \pdfvariable vorigin 1 true in % Reference Card for GNU Emacs version 20 on Unix systems %**start of header \newcount\columnsperpage % This file can be printed with 1, 2, or 3 columns per page (see below). % Specify how many you want here. Nothing else needs to be changed. \columnsperpage=3 % Copyright (c) 1987, 1993, 1996, 1997 Free Software Foundation, Inc. % This file is part of GNU Emacs. % GNU Emacs is free software; you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by % the Free Software Foundation; either version 2, or (at your option) % any later version. % GNU Emacs is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the % GNU General Public License for more details. % You should have received a copy of the GNU General Public License % along with GNU Emacs; see the file COPYING. If not, write to % the Free Software Foundation, Inc., 59 Temple Place - Suite 330, % Boston, MA 02111-1307, USA. % This file is intended to be processed by plain TeX (TeX82). % % The final reference card has six columns, three on each side. % This file can be used to produce it in any of three ways: % 1 column per page % produces six separate pages, each of which needs to be reduced to 80%. % This gives the best resolution. % 2 columns per page % produces three already-reduced pages. % You will still need to cut and paste. % 3 columns per page % produces two pages which must be printed sideways to make a % ready-to-use 8.5 x 11 inch reference card. % For this you need a dvi device driver that can print sideways. % Which mode to use is controlled by setting \columnsperpage above. % % Author: % Stephen Gildea % Internet: gildea@stop.mail-abuse.org % % Thanks to Paul Rubin, Bob Chassell, Len Tower, and Richard Mlynarik % for their many good ideas. % If there were room, it would be nice to see a section on Dired. \input version.tex \def\year{2001} \def\shortcopyrightnotice{\vskip 1ex plus 2 fill \centerline{\small \copyright\ \year\ Yuuichi Teranishi Permissions on back.}} \def\copyrightnotice{ \vskip 1ex plus 2 fill\begingroup\small \centerline{Copyright \copyright\ \year\ Yuuichi Teranishi} \centerline{for Wanderlust \versionnumber} Permission is granted to make and distribute copies of this card provided the copyright notice and this permission notice are preserved on all copies. \endgroup} % make \bye not \outer so that the \def\bye in the \else clause below % can be scanned without complaint. \def\bye{\par\vfill\supereject\end} \newdimen\intercolumnskip %horizontal space between columns \newbox\columna %boxes to hold columns already built \newbox\columnb \def\ncolumns{\the\columnsperpage} \message{[\ncolumns\space column\if 1\ncolumns\else s\fi\space per page]} \def\scaledmag#1{ scaled \magstep #1} % This multi-way format was designed by Stephen Gildea October 1986. % Note that the 1-column format is fontfamily-independent. \if 1\ncolumns %one-column format uses normal size \hsize 4in \vsize 10in \voffset -.7in \font\titlefont=\fontname\tenbf \scaledmag3 \font\headingfont=\fontname\tenbf \scaledmag2 \font\smallfont=\fontname\sevenrm \font\smallsy=\fontname\sevensy \footline{\hss\folio} \def\makefootline{\baselineskip10pt\hsize6.5in\line{\the\footline}} \else %2 or 3 columns uses prereduced size \hsize 3.2in \vsize 7.95in \hoffset -.75in \voffset -.745in \font\titlefont=cmbx10 \scaledmag2 \font\headingfont=cmbx10 \scaledmag1 \font\smallfont=cmr6 \font\smallsy=cmsy6 \font\eightrm=cmr8 \font\eightbf=cmbx8 \font\eightit=cmti8 \font\eighttt=cmtt8 \font\eightmi=cmmi8 \font\eightsy=cmsy8 \textfont0=\eightrm \textfont1=\eightmi \textfont2=\eightsy \def\rm{\eightrm} \def\bf{\eightbf} \def\it{\eightit} \def\tt{\eighttt} \normalbaselineskip=.8\normalbaselineskip \normallineskip=.8\normallineskip \normallineskiplimit=.8\normallineskiplimit \normalbaselines\rm %make definitions take effect \if 2\ncolumns \let\maxcolumn=b \footline{\hss\rm\folio\hss} \def\makefootline{\vskip 2in \hsize=6.86in\line{\the\footline}} \else \if 3\ncolumns \let\maxcolumn=c \nopagenumbers \else \errhelp{You must set \columnsperpage equal to 1, 2, or 3.} \errmessage{Illegal number of columns per page} \fi\fi \intercolumnskip=.46in \def\abc{a} \output={% %see The TeXbook page 257 % This next line is useful when designing the layout. %\immediate\write16{Column \folio\abc\space starts with \firstmark} \if \maxcolumn\abc \multicolumnformat \global\def\abc{a} \else\if a\abc \global\setbox\columna\columnbox \global\def\abc{b} %% in case we never use \columnb (two-column mode) \global\setbox\columnb\hbox to -\intercolumnskip{} \else \global\setbox\columnb\columnbox \global\def\abc{c}\fi\fi} \def\multicolumnformat{\shipout\vbox{\makeheadline \hbox{\box\columna\hskip\intercolumnskip \box\columnb\hskip\intercolumnskip\columnbox} \makefootline}\advancepageno} \def\columnbox{\leftline{\pagebody}} \def\bye{\par\vfill\supereject \if a\abc \else\null\vfill\eject\fi \if a\abc \else\null\vfill\eject\fi \end} \fi % we won't be using math mode much, so redefine some of the characters % we might want to talk about \catcode`\^=12 \catcode`\_=12 \chardef\\=`\\ \chardef\{=`\{ \chardef\}=`\} \hyphenation{mini-buf-fer} \parindent 0pt \parskip 1ex plus .5ex minus .5ex \def\small{\smallfont\textfont2=\smallsy\baselineskip=.8\baselineskip} % newcolumn - force a new column. Use sparingly, probably only for % the first column of a page, which should have a title anyway. \outer\def\newcolumn{\vfill\eject} % title - page title. Argument is title text. \outer\def\title#1{{\titlefont\centerline{#1}}\vskip 1ex plus .5ex} % section - new major section. Argument is section name. \outer\def\section#1{\par\filbreak \vskip 3ex plus 2ex minus 2ex {\headingfont #1}\mark{#1}% \vskip 2ex plus 1ex minus 1.5ex} \newdimen\keyindent % beginindentedkeys...endindentedkeys - key definitions will be % indented, but running text, typically used as headings to group % definitions, will not. \def\beginindentedkeys{\keyindent=1em} \def\endindentedkeys{\keyindent=0em} \endindentedkeys % paralign - begin paragraph containing an alignment. % If an \halign is entered while in vertical mode, a parskip is never % inserted. Using \paralign instead of \halign solves this problem. \def\paralign{\vskip\parskip\halign} % \<...> - surrounds a variable name in a code example \def\<#1>{{\it #1\/}} % kbd - argument is characters typed literally. Like the Texinfo command. \def\kbd#1{{\tt#1}\null} %\null so not an abbrev even if period follows % beginexample...endexample - surrounds literal text, such a code example. % typeset in a typewriter font with line breaks preserved \def\beginexample{\par\leavevmode\begingroup \obeylines\obeyspaces\parskip0pt\tt} {\obeyspaces\global\let =\ } \def\endexample{\endgroup} % key - definition of a key. % \key{description of key}{key-name} % prints the description left-justified, and the key-name in a \kbd % form near the right margin. \def\key#1#2{\leavevmode\hbox to \hsize{\vtop {\hsize=.75\hsize\rightskip=1em \hskip\keyindent\relax#1}\kbd{#2}\hfil}} \newbox\metaxbox \setbox\metaxbox\hbox{\kbd{M-x }} \newdimen\metaxwidth \metaxwidth=\wd\metaxbox % metax - definition of a M-x command. % \metax{description of command}{M-x command-name} % Tries to justify the beginning of the command name at the same place % as \key starts the key name. (The "M-x " sticks out to the left.) \def\metax#1#2{\leavevmode\hbox to \hsize{\hbox to .75\hsize {\hskip\keyindent\relax#1\hfil}% \hskip -\metaxwidth minus 1fil \kbd{#2}\hfil}} % threecol - like "key" but with two key names. % for example, one for doing the action backward, and one for forward. \def\threecol#1#2#3{\hskip\keyindent\relax#1\hfil&\kbd{#2}\hfil\quad &\kbd{#3}\hfil\quad\cr} %**end of header \title{Wanderlust Reference Card} \centerline{(for version \versionnumber)} \section{Wanderlust の起動} \key{Wanderlust を起動する}{M-x wl} \key{メッセージを作成}{M-x wl-draft} \section{Folder Mode} \key{Wanderlust をやめる}{q} \key{次}{n} \key{前}{p} \key{次の未読}{N} \key{前の未読}{P} \key{指定したフォルダに入る}{g} \key{このフォルダに入る}{SPC} \key{グループの開閉}{SPC} \key{アクセスグループの再スキャン}{C-u SPC} \key{新規メッセージをチェック}{s} \key{同期}{S} \key{プリフェッチ}{I} \key{全て既読に}{c} \key{エクスパイア}{e} \key{メッセージの作成}{w} \key{メッセージの作成(宛先を推測)}{W} \key{アドレス帳の再読込}{Z} \key{ごみ箱を空に}{E} \section{folder management} \key{カット}{C-k} \key{領域をカット}{C-w} \key{貼り付け}{C-y} \key{フォルダを加える}{m a} \key{グループを加える}{m g} \key{アクセスグループを加える}{m A} \section{access group} \key{非講読フォルダも表示}{L} \key{非講読フォルダを隠す}{l} \key{講読をやめる}{u} \key{講読をやめる(領域)}{U} \newcolumn \section{Summary Mode} \key{フォルダバッファに戻る}{q} \key{指定したフォルダに入る}{g} \key{次}{n} \key{前}{p} \key{次の未読}{N} \key{前の未読}{P} \key{先頭のメッセージ}{<} \key{末尾のメッセージ}{>} \key{直前に見たメッセージ}{TAB} \key{メッセージを読む}{SPC} \key{メッセージの再読込}{C-u .} \key{メッセージ表示のトグル}{v} \key{メッセージを作成}{w} \key{メッセージを作成(宛先を推測)}{W} \key{返信}{a} \key{引用して返信}{A} \key{フォワード}{f} \key{再編集}{E} \key{印刷}{\#} \key{メッセージバッファへ}{j} \key{アドレス帳の再読込}{Z} \section{mark command} \key{処分マークを付ける}{d} \key{削除マークを付ける}{D} \key{リファイルマークを付ける}{o} \key{コピーマークを付ける}{O} \key{プリフェッチマークを付ける}{i} \key{再送マークを付ける}{\~{}} \key{重要マークを付ける}{\$} \key{標的マークを付ける}{*} \key{全てのメッセージを標的にする}{m a} \key{スレッドを標的にする}{m t} \key{メッセージを選び出して標的に}{?} \key{標的の中からメッセージを選び出す}{m *} \key{標的をリファイル}{m o} \key{標的を削除}{m d} \key{標的を印刷}{m \#} \key{標的の各々をパイプに流す}{m |} \key{一時的マークのアクションを実行}{x} \section{prefix arguments for marking} \key{標的に対して}{m} \key{カーソル以降のスレッドに対して}{t} \key{領域に対して}{r} \newcolumn \section{sticky summary} \key{サマリをスティッキーに}{M-s} \key{指定したフォルダに入る}{G} \key{次のサマリ}{C-c C-n} \key{前のサマリ}{C-c C-p} \key{サマリを破棄}{C-u q} \section{Message Mode} \key{サマリバッファに戻る}{q} \key{スクロールか次のパート}{SPC} \key{スクロールか前のパート}{DEL} \key{次のパート}{n} \key{前のパート}{p} \key{パートを再生}{v} \key{パートを取り出す}{e} \key{パートを表示}{C-c C-v C-c} \key{パートを隠す}{C-c C-d C-c} \key{MIME-View のヘルプ}{?} \section{Draft Mode} \key{メッセージを引用}{C-c C-y} \key{テンプレートの挿入}{C-c C-j} \key{署名の挿入}{C-c C-w} \key{領域を省く}{C-c C-d} \key{プレビュー}{C-c C-p} \key{送信}{C-c C-c} \key{草稿を保存}{C-c C-z} \key{草稿を破棄}{C-c C-k} \key{他のドラフトへ}{C-c C-o} \key{ファイルを添付}{C-c C-x TAB} %\key{Insert a reference to external body}{C-c C-x C-e} \key{MIME タグの挿入}{C-c C-x t} %\key{Insert a text message}{C-c C-x C-t} \key{メッセージを暗号化}{C-c C-x e} \key{メッセージに署名}{C-c C-x s} \key{MIME-Edit のヘルプ}{C-c C-x ?} \shortcopyrightnotice \newcolumn \section{Plugged Status} \key{プラグ状態のトグル(全体)}{M-t} \key{プラグドモードへの入退出}{C-t} \key{プラグ状態のトグル(個別)}{SPC} \section{Address Book Management} \key{アドレスマネージャの起動}{C-c C-a} \key{アドレスマネージャの終了}{q} \key{{\tt To:} に指定}{t} \key{{\tt Cc:} に指定}{c} \key{{\tt Bcc:} に指定}{b} \key{宛先の指定を解除}{u} \key{指定に沿ってメッセージを作成}{x} \key{新規登録}{a} \key{編集}{e} \key{削除}{d} \copyrightnotice \bye % Local variables: % compile-command: "tex refcard" % End: wanderlust-wanderlust-769699d/doc/wl-refcard.tex000066400000000000000000000317331406661363500217310ustar00rootroot00000000000000% Reference Card for Wanderlust % The format of this file is adapted from the GNU Emacs reference card % % You can compile with luatex or pdftex. \ifx\luatexversion\thisisundefined \ifx\pdfoutput\undefined \else \ifx\pdfoutput\relax \else \pdfpageheight 210mm\relax \pdfpagewidth 297mm\relax \pdfhorigin = 1 true in \pdfvorigin = 1 true in \fi \fi \else \ifnum\luatexversion>84 % For LuaTeX >= 0.85 \pagewidth = 297mm \pageheight = 210mm \pdfvariable horigin 1 true in \pdfvariable vorigin 1 true in \fi \fi % Reference Card for GNU Emacs version 20 on Unix systems %**start of header \newcount\columnsperpage % This file can be printed with 1, 2, or 3 columns per page (see below). % Specify how many you want here. Nothing else needs to be changed. \columnsperpage=3 % Copyright (c) 1987, 1993, 1996, 1997 Free Software Foundation, Inc. % This file is part of GNU Emacs. % GNU Emacs is free software; you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by % the Free Software Foundation; either version 2, or (at your option) % any later version. % GNU Emacs is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the % GNU General Public License for more details. % You should have received a copy of the GNU General Public License % along with GNU Emacs; see the file COPYING. If not, write to % the Free Software Foundation, Inc., 59 Temple Place - Suite 330, % Boston, MA 02111-1307, USA. % This file is intended to be processed by plain TeX (TeX82). % % The final reference card has six columns, three on each side. % This file can be used to produce it in any of three ways: % 1 column per page % produces six separate pages, each of which needs to be reduced to 80%. % This gives the best resolution. % 2 columns per page % produces three already-reduced pages. % You will still need to cut and paste. % 3 columns per page % produces two pages which must be printed sideways to make a % ready-to-use 8.5 x 11 inch reference card. % For this you need a dvi device driver that can print sideways. % Which mode to use is controlled by setting \columnsperpage above. % % Author: % Stephen Gildea % Internet: gildea@stop.mail-abuse.org % % Thanks to Paul Rubin, Bob Chassell, Len Tower, and Richard Mlynarik % for their many good ideas. % If there were room, it would be nice to see a section on Dired. \input version.tex \def\year{2001} \def\shortcopyrightnotice{\vskip 1ex plus 2 fill \centerline{\small \copyright\ \year\ Yuuichi Teranishi Permissions on back.}} \def\copyrightnotice{ \vskip 1ex plus 2 fill\begingroup\small \centerline{Copyright \copyright\ \year\ Yuuichi Teranishi} \centerline{for Wanderlust \versionnumber} Permission is granted to make and distribute copies of this card provided the copyright notice and this permission notice are preserved on all copies. \endgroup} % make \bye not \outer so that the \def\bye in the \else clause below % can be scanned without complaint. \def\bye{\par\vfill\supereject\end} \newdimen\intercolumnskip %horizontal space between columns \newbox\columna %boxes to hold columns already built \newbox\columnb \def\ncolumns{\the\columnsperpage} \message{[\ncolumns\space column\if 1\ncolumns\else s\fi\space per page]} \def\scaledmag#1{ scaled \magstep #1} % This multi-way format was designed by Stephen Gildea October 1986. % Note that the 1-column format is fontfamily-independent. \if 1\ncolumns %one-column format uses normal size \hsize 4in \vsize 10in \voffset -.7in \font\titlefont=\fontname\tenbf \scaledmag3 \font\headingfont=\fontname\tenbf \scaledmag2 \font\smallfont=\fontname\sevenrm \font\smallsy=\fontname\sevensy \footline{\hss\folio} \def\makefootline{\baselineskip10pt\hsize6.5in\line{\the\footline}} \else %2 or 3 columns uses prereduced size \hsize 3.2in \vsize 7.95in \hoffset -.75in \voffset -.745in \font\titlefont=cmbx10 \scaledmag2 \font\headingfont=cmbx10 \scaledmag1 \font\smallfont=cmr6 \font\smallsy=cmsy6 \font\eightrm=cmr8 \font\eightbf=cmbx8 \font\eightit=cmti8 \font\eighttt=cmtt8 \font\eightmi=cmmi8 \font\eightsy=cmsy8 \textfont0=\eightrm \textfont1=\eightmi \textfont2=\eightsy \def\rm{\eightrm} \def\bf{\eightbf} \def\it{\eightit} \def\tt{\eighttt} \normalbaselineskip=.8\normalbaselineskip \normallineskip=.8\normallineskip \normallineskiplimit=.8\normallineskiplimit \normalbaselines\rm %make definitions take effect \if 2\ncolumns \let\maxcolumn=b \footline{\hss\rm\folio\hss} \def\makefootline{\vskip 2in \hsize=6.86in\line{\the\footline}} \else \if 3\ncolumns \let\maxcolumn=c \nopagenumbers \else \errhelp{You must set \columnsperpage equal to 1, 2, or 3.} \errmessage{Illegal number of columns per page} \fi\fi \intercolumnskip=.46in \def\abc{a} \output={% %see The TeXbook page 257 % This next line is useful when designing the layout. %\immediate\write16{Column \folio\abc\space starts with \firstmark} \if \maxcolumn\abc \multicolumnformat \global\def\abc{a} \else\if a\abc \global\setbox\columna\columnbox \global\def\abc{b} %% in case we never use \columnb (two-column mode) \global\setbox\columnb\hbox to -\intercolumnskip{} \else \global\setbox\columnb\columnbox \global\def\abc{c}\fi\fi} \def\multicolumnformat{\shipout\vbox{\makeheadline \hbox{\box\columna\hskip\intercolumnskip \box\columnb\hskip\intercolumnskip\columnbox} \makefootline}\advancepageno} \def\columnbox{\leftline{\pagebody}} \def\bye{\par\vfill\supereject \if a\abc \else\null\vfill\eject\fi \if a\abc \else\null\vfill\eject\fi \end} \fi % we won't be using math mode much, so redefine some of the characters % we might want to talk about \catcode`\^=12 \catcode`\_=12 \chardef\\=`\\ \chardef\{=`\{ \chardef\}=`\} \hyphenation{mini-buf-fer} \parindent 0pt \parskip 1ex plus .5ex minus .5ex \def\small{\smallfont\textfont2=\smallsy\baselineskip=.8\baselineskip} % newcolumn - force a new column. Use sparingly, probably only for % the first column of a page, which should have a title anyway. \outer\def\newcolumn{\vfill\eject} % title - page title. Argument is title text. \outer\def\title#1{{\titlefont\centerline{#1}}\vskip 1ex plus .5ex} % section - new major section. Argument is section name. \outer\def\section#1{\par\filbreak \vskip 3ex plus 2ex minus 2ex {\headingfont #1}\mark{#1}% \vskip 2ex plus 1ex minus 1.5ex} \newdimen\keyindent % beginindentedkeys...endindentedkeys - key definitions will be % indented, but running text, typically used as headings to group % definitions, will not. \def\beginindentedkeys{\keyindent=1em} \def\endindentedkeys{\keyindent=0em} \endindentedkeys % paralign - begin paragraph containing an alignment. % If an \halign is entered while in vertical mode, a parskip is never % inserted. Using \paralign instead of \halign solves this problem. \def\paralign{\vskip\parskip\halign} % \<...> - surrounds a variable name in a code example \def\<#1>{{\it #1\/}} % kbd - argument is characters typed literally. Like the Texinfo command. \def\kbd#1{{\tt#1}\null} %\null so not an abbrev even if period follows % beginexample...endexample - surrounds literal text, such a code example. % typeset in a typewriter font with line breaks preserved \def\beginexample{\par\leavevmode\begingroup \obeylines\obeyspaces\parskip0pt\tt} {\obeyspaces\global\let =\ } \def\endexample{\endgroup} % key - definition of a key. % \key{description of key}{key-name} % prints the description left-justified, and the key-name in a \kbd % form near the right margin. \def\key#1#2{\leavevmode\hbox to \hsize{\vtop {\hsize=.75\hsize\rightskip=1em \hskip\keyindent\relax#1}\kbd{#2}\hfil}} \newbox\metaxbox \setbox\metaxbox\hbox{\kbd{M-x }} \newdimen\metaxwidth \metaxwidth=\wd\metaxbox % metax - definition of a M-x command. % \metax{description of command}{M-x command-name} % Tries to justify the beginning of the command name at the same place % as \key starts the key name. (The "M-x " sticks out to the left.) \def\metax#1#2{\leavevmode\hbox to \hsize{\hbox to .75\hsize {\hskip\keyindent\relax#1\hfil}% \hskip -\metaxwidth minus 1fil \kbd{#2}\hfil}} % threecol - like "key" but with two key names. % for example, one for doing the action backward, and one for forward. \def\threecol#1#2#3{\hskip\keyindent\relax#1\hfil&\kbd{#2}\hfil\quad &\kbd{#3}\hfil\quad\cr} %**end of header \title{Wanderlust Reference Card} \centerline{(for version \versionnumber)} \section{Starting Wanderlust} \key{Start Wanderlust}{M-x wl} \key{Start composition}{M-x wl-draft} \section{Folder Mode} \key{Quit Wanderlust}{q} \key{Move to next entity}{n} \key{Move to previous entity}{p} \key{Move to next unread entity}{N} \key{Move to previous unread entity}{P} \key{Go to specified folder}{g} \key{Go into current folder}{SPC} \key{Open/Close current group}{SPC} \key{Rescan folders in current access group}{C-u SPC} \key{Check new messages for current entity}{s} \key{Synchronize current entity}{S} \key{Prefetch for current folder/group}{I} \key{Set as read all messages in current entity}{c} \key{Expire current entity}{e} \key{Compose message}{w} \key{Compose message for current folder}{W} \key{Reload address book}{Z} \key{Empty trash folder}{E} \section{folder management} \key{Cut current entity}{C-k} \key{Cut region}{C-w} \key{Yank}{C-y} \key{Add folder}{m a} \key{Add group}{m g} \key{Add access group}{m A} \section{access group} \key{Display unsubscribed folders}{L} \key{Hide unsubscribed folders}{l} \key{Unsubscribe current entity}{u} \key{Unsubscribe region}{U} \newcolumn \section{Summary Mode} \key{Go back to folder mode}{q} \key{Go to specified folder}{g} \key{Next message}{n} \key{Previous message}{p} \key{Next unread message}{N} \key{Previous unread message}{P} \key{First message}{<} \key{Last message}{>} \key{Jump to previously shown message}{TAB} \key{View current message}{SPC} \key{Force reloading current message}{C-u .} \key{Toggle display of message}{v} \key{Compose message}{w} \key{Compose message for current folder}{W} \key{Compose reply message}{a} \key{Compose reply message with citation}{A} \key{Forward current message}{f} \key{(Re-)Edit current message}{E} \key{Print current message}{\#} \key{Jump to message buffer}{j} \key{Reload address book}{Z} \section{mark command} \key{Mark for disposal}{d} \key{Mark for deletion}{D} \key{Mark for refiling}{o} \key{Mark for copying}{O} \key{Mark for prefetching}{i} \key{Mark for resending}{\~{}} \key{Mark as important}{\$} \key{Mark as target}{*} \key{Mark all messages as target}{m a} \key{Mark current thread as target}{m t} \key{Pick messages and mark}{?} \key{Pick messages from marked ones}{m *} \key{Mark target messages for refiling}{m o} \key{Mark target messages for deleting}{m d} \key{Print target messages}{m \#} \key{Send each target message to a pipe}{m |} \key{Execute action for each temp marks}{x} \section{prefix arguments for marking} \key{Apply command for marked messages}{m} \key{Apply command for thread after cursor point}{t} \key{Apply command for region}{r} \newcolumn \section{sticky summary} \key{Stick current summary}{M-s} \key{Open summary and stick}{G} \key{Display next summary}{C-c C-n} \key{Display previous summary}{C-c C-p} \key{Discard current summary}{C-u q} \section{Message Mode} \key{Go back to summary buffer}{q} \key{Scroll up or move to next content}{SPC} \key{Scroll down or move to previous content}{DEL} \key{Move to next content}{n} \key{Move to previous content}{p} \key{Decode current content as `play mode'}{v} \key{Decode current content as `extract mode'}{e} \key{Show current content}{C-c C-v C-c} \key{Hide current content}{C-c C-d C-c} \key{View help of MIME-View}{?} \section{Draft Mode} \key{Insert message to cite}{C-c C-y} \key{Insert template}{C-c C-j} \key{Insert signature}{C-c C-w} \key{Elide the region}{C-c C-d} \key{Preview current draft}{C-c C-p} \key{Send current draft}{C-c C-c} \key{Save current draft}{C-c C-z} \key{Discard current draft}{C-c C-k} \key{Jump to another draft}{C-c C-o} \key{Attach some file}{C-c C-x TAB} %\key{Insert a reference to external body}{C-c C-x C-e} \key{Insert a new MIME tag}{C-c C-x t} %\key{Insert a text message}{C-c C-x C-t} \key{Encrypt the message}{C-c C-x e} \key{Sign the message}{C-c C-x s} \key{View help of MIME-Edit}{C-c C-x ?} \shortcopyrightnotice \newcolumn \section{Plugged Status} \key{Toggle plugged status}{M-t} \key{Enter/Exit plugged mode}{C-t} \key{Toggle plugged state for current entity}{SPC} \section{Address Book Management} \key{Enter address book manager}{C-c C-a} \key{Exit address book manager}{q} \key{Set as {\tt To:}}{t} \key{Set as {\tt Cc:}}{c} \key{Set as {\tt Bcc:}}{b} \key{Unset}{u} \key{Compose message with current mark}{x} \key{Add new entry}{a} \key{Edit current entry}{e} \key{Delete current entry}{d} \copyrightnotice \bye % Local variables: % compile-command: "tex refcard" % End: wanderlust-wanderlust-769699d/doc/wl.texi000066400000000000000000011004021406661363500204650ustar00rootroot00000000000000\input texinfo @c -*-texinfo -*- coding: us-ascii -*- @c %**start of header @setfilename wl.info @settitle Wanderlust -- Yet Another Message Interface On Emacsen -- @c %**end of header @documentlanguage en @include version.texi @synindex pg cp @finalout @dircategory GNU Emacs Lisp @direntry * Wanderlust: (wl). Yet Another Message Interface On Emacsen @end direntry @c permissions text appears in an Info file before the first node. @ifinfo This file documents Wanderlust, Yet another message interface on Emacsen. Copyright @copyright{} 1998, 1999, 2000, 2001, 2002 @w{Yuuichi Teranishi}, @w{Fujikazu Okunishi}, @w{Masahiro Murata}, @w{Kenichi Okada}, @w{Kaoru Takahashi}, @w{Bun Mizuhara} and @w{Masayuki Osada}, @w{Katsumi Yamaoka}, @w{Hiroya Murata} and @w{Yoichi Nakayama}. This edition is for Wanderlust version @value{VERSION}. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. @ignore Permission is granted to process this file through TeX and print the results, provided the printed document carries copying permission notice identical to this one except for the removal of this paragraph (this paragraph not being relevant to the printed manual). @end ignore Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions. @end ifinfo @titlepage @sp 10 @title Wanderlust User's Manual @subtitle Yet another message interface on Emacsen @subtitle for Wanderlust version @value{VERSION} @author Yuuichi Teranishi @author Fujikazu Okunishi @author Masahiro Murata @author Kenichi Okada @author Kaoru Takahashi @author Bun Mizuhara @author Masayuki Osada @author Katsumi Yamaoka @author Hiroya Murata @author Yoichi Nakayama @page @vskip 0pt plus 1filll Copyright @copyright{} 1998, 1999, 2000, 2001, 2002 @w{Yuuichi Teranishi}, @w{Fujikazu Okunishi}, @w{Masahiro Murata}, @w{Kenichi Okada}, @w{Kaoru Takahashi}, @w{Bun Mizuhara}, @w{Masayuki Osada}, @w{Katsumi Yamaoka}, @w{Hiroya Murata} and @w{Yoichi Nakayama}. This manual is for Wanderlust version @value{VERSION}. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions. @end titlepage @ifinfo @node Top, Introduction, (dir), (dir) @top Wanderlust User's Manual @flushright Yuuichi Teranishi Fujikazu Okunishi Masahiro Murata Kenichi Okada Kaoru Takahashi Bun Mizuhara Masayuki Osada Katsumi Yamaoka Hiroya Murata Yoichi Nakayama @end flushright This manual is for Wanderlust @value{VERSION}. @end ifinfo @menu * Introduction:: Read this first * Start Me Up:: Invoking Wanderlust * Folders:: How to specify folders * Folder:: Selecting and editing folders * Summary:: Reading and refiling messages * Message:: Saving and playing MIME multipart entities * Draft:: Draft buffer, sending mail and news * Disconnected Operations:: Off-Line management * Expire and Archive:: Automatic expiration and archiving of messages * Scoring:: Score of the messages * Address Book:: Management of Address Book * Quick Search:: Quickly search your mail archive * Spam Filter:: Spam filtering * Advanced Issues:: Advanced Issues * Migration:: Switch from older version of Wanderlust * Terminology:: Terminologies * Mailing List:: Wanderlust mailing list * Addition:: Additional Information * Index:: Key index @end menu @node Introduction, Start Me Up, Top, Top @chapter Introduction of Wanderlust @cindex Introduction Wanderlust is an mail/news management system on Emacsen. It supports IMAP4rev1(RFC2060), NNTP, POP and local message files. The main features of Wanderlust: @itemize @minus @item Pure elisp implementation. @item Supports IMAP4rev1, NNTP, POP(POP3/APOP), MH and Maildir format. @item Unified access method to messages based on Mew-like Folder Specification. @item Mew-like Key-bind and mark handling. @item Manages unread messages. @item Interactive thread display. @item Folder Mode shows the list of subscribed folders. @item Message Cache, Disconnected Operation. @item MH-like FCC. (Fcc: %Backup and Fcc: $Backup is allowed). @item MIME compliant (by SEMI). @item Transmission of news and mail are unified by Message transmitting draft. @item Graphical list of folders. @item View a part of message without retrieving the whole message (IMAP4). @item Server-side message look up (IMAP4). Multi-byte characters are allowed. @item Virtual Folders. @item Supports compressed folder using common archiving utilities. @item Old articles in folders are automatically removed/archived (Expiration). @item Automatic re-file. @item Template function makes it convenient to send fixed form messages. @end itemize @section Environment We confirm Wanderlust works on following Emacsen: @itemize @bullet @item Emacs 24.5 or later @end itemize IMAP4 connectivity with following imapd are confirmed to work with Wanderlust: @itemize @bullet @item UW imapd 4.1--4.7, 4.7a, 4.7b, 4.7c, 2000 or later @item Cyrus imapd 1.4, 1.5.19, 1.6.22--1.6.24, 2.0.5 or later @item Courier-IMAP 1.3.2 or later @item AIR MAIL (AIRC imapd release 2.00) @item Express Mail @item Microsoft Exchange Server 5.5 @item Sun Internet Mail Server 3.5, 3.5.alpha, 4.0 @end itemize LDAP connectivity with following LDAPd are confirmed to work with Wanderlust: @itemize @bullet @item OpenLDAP 2.0.6 or later @end itemize @node Start Me Up, Folders, Introduction, Top @chapter Start up Wanderlust @cindex Start up The necessary procedure for starting Wanderlust is explained in steps here. (Of course, you need a mail/news readable environment in advance) @menu * MIME Modules:: Installing the MIME modules * Download:: Download and extract the packages * Install:: Byte-compile and install * Minimal Settings:: @file{.emacs} setup * Folder Definition:: Folder definition * Start Wanderlust:: Starting Wanderlust * Overview:: Basic components of Wanderlust @end menu @node MIME Modules, Download, Start Me Up, Start Me Up @section Installing MIME modules @cindex MIME modules @pindex APEL @pindex FLIM @pindex SEMI You must install packages named APEL-LB, FLIM-LB and SEMI-EPG, which are variants of APEL, FLIM and SEMI, beforehand to use Wanderlust. @example @group APEL-LB: @uref{https://github.com/wanderlust/apel} FLIM-LB: @uref{https://github.com/wanderlust/flim} SEMI-EPG: @uref{https://github.com/wanderlust/semi} @end group @end example You can download original APEL, FLIM and SEMI from following URLs: @example @group APEL: @uref{http://git.chise.org/elisp/dist/semi/} FLIM: @uref{http://git.chise.org/elisp/dist/apel/} SEMI: @uref{http://git.chise.org/elisp/dist/semi/} @end group @end example You have to install APEL-LB, FLIM-LB and SEMI-EPG in this order. Generally, @samp{make install} will do the job. Refer to the documents of each package for detailed installation procedure. You have to re-install Wanderlust if you upgraded APEL-LB, FLIM-LB or SEMI-EPG. @node Download, Install, MIME Modules, Start Me Up @section Download and Extract the Package @cindex Download You can download Wanderlust package from following sites: Original site: @example @uref{https://github.com/wanderlust/wanderlust} @end example Mirrored ftp/http sites: @example @group @uref{http://www.jpl.org/ftp/pub/github-snapshots/} @end group @end example Extract the obtained package to your working directory: @example @group % cd ~/work % tar zxvf wl-@var{version}.tar.gz % cd wl-@var{version} @end group @end example @subsection To use SSL (Secure Socket Layer) @cindex SSL @pindex OpenSSL @pindex starttls SSL (Secure Socket Layer) can be used for SMTP, IMAP, NNTP and POP connections in Wanderlust. Emacs 24 and later uses built-in GnuTLS if available. There are two ways to use SSL. One is to start SSL negotiation just after the connection establishment (generic way). The other one is to start SSL negotiation by invoking STARTTLS command in the each session. If built-in GnuTLS is not available, Emacs try to use @file{tls.el} for the formal SSL (generic SSL). In this case, GnuTLS's @command{gnutls-cli} is needed. if neither avialable, @file{ssl.el} of @file{utils} directory and OpenSSL's @command{openssl}. For the latter SSL (STARTTLS), you need @file{starttls.el} if built-in GnuTLS is not available. Moreover, GnuTLS or starttls package is needed according to @code{starttls-use-gnutls} variable's value. If your Emacs doesn't have @file{starttls.el} or @file{starttls.el} doesn't have the defninition of @code{starttls-use-gnutls}, you need starttls package. You can download starttls package from the following site. @example @uref{ftp://opaopa.org/pub/elisp/} @end example @node Install, Minimal Settings, Download, Start Me Up @section Byte-compile and install @cindex Byte-compile @cindex Compile @cindex Install @cindex Makefile @cindex Make @subsection Installation Edit @code{LISPDIR} and @code{EMACS} in @file{Makefile}. Set the Emacs's command name to @code{EMACS}. Set package installation directory to @code{LISPDIR}. Then, please execute following commands. @example @group % make % make install @end group @end example Destination directory is auto-probed if you leave @code{LISPDIR} in @file{Makefile} as is. (That is, leave it as @samp{NONE}) If you want to handle shimbun folders, add directory where emacs-w3m is installed to @code{load-path}. Then necessary modules will be byte-compiled and installed. @xref{Shimbun Folder}. @subsection @file{WL-CFG} Contents of the file @file{WL-CFG} is loaded under installation if a file with that name exists in extracted directory. You can use @file{WL-CFG} to configure @code{load-path} to extra packages such as SEMI if needed. If you want to specify the install directory of Wanderlust related files, then set following variables in @file{WL-CFG} @table @code @item WL_PREFIX A directory to install WL modules. This directory is relative directory from @code{LISPDIR}. WL modules include @file{wl*.el}, @file{wl*.elc} files. @c Modules under the directory @file{util/} are also installed if @c it detected as necessary. @item ELMO_PREFIX A directory to install ELMO modules. This directory is relative directory from @code{LISPDIR}. ELMO modules include @file{elmo*.el}, @file{elmo*.elc} files. @c @file{utf7.el}, @file{utf7.elc} are also included in the ELMO. @end table @noindent Default value of @code{WL_PREFIX} and @code{ELMO_PREFIX} are @file{wl}. If you want to install ELMO related files under a sub-directory such as "elmo" then add following to @file{WL-CFG}: @lisp (setq ELMO_PREFIX "elmo") @end lisp @subsection Run in place If wl and elmo directories are defined in @code{load-path}, then byte-compilation and installation are not necessary to start Wanderlust. For example, if package is extracted in @file{~/work}, Wanderlust can be invoked with following setting in @file{~/.emacs}. @lisp @group (add-to-list 'load-path "~/work/wl-@var{version}/wl") (add-to-list 'load-path "~/work/wl-@var{version}/elmo") @end group @end lisp @subsection Manual Manual is described in Info format. Please do following. @example @group % make info % make install-info @end group @end example Manual directory is automatically detected. Of course, it can be configured by @code{INFODIR} in @file{Makefile}. You can read manual at the following URL: @example @uref{http://wanderlust.github.io/wl-docs/wl.html} @end example @node Minimal Settings, Folder Definition, Install, Start Me Up @section Set up .emacs @cindex Minimal Settings @cindex Settings @cindex Configuration @cindex .emacs @cindex .wl The Wanderlust package contains two module groups. @table @samp @item ELMO (elmo-*.el) These modules show everything as folders. This is the back-end for WL. @item WL (wl-*.el) These modules controls the behavior of main body of Wanderlust. They are also the front-end for ELMO. @end table You can customize the behavior of Wanderlust by changing the value of environmental variables which begins with @code{elmo-} and @code{wl-}. The minimal requirement for settings is as the following. @lisp @group ;; @r{autoload configuration} (autoload 'wl "wl" "Wanderlust" t) (autoload 'wl-other-frame "wl" "Wanderlust on new frame." t) (autoload 'wl-draft "wl-draft" "Write draft with Wanderlust." t) ;; @r{Directory where icons are placed.} ;; @r{Default: the peculiar value to the running version of Emacs.} ;; @r{(Not required if the default value points properly)} (setq wl-icon-directory "~/work/wl/etc") ;; @r{SMTP server for mail posting. Default: @code{nil}} (setq wl-smtp-posting-server "your.smtp.example.com") ;; @r{NNTP server for news posting. Default: @code{nil}} (setq wl-nntp-posting-server "your.nntp.example.com") @end group @end lisp @file{~/.wl} is automatically loaded when Wanderlust starts up (if such a file exists). So it is convenient to gather Wanderlust specific settings in @file{~/.wl}. Settings for "face" must be written in @file{~/.wl}, because you can't write them in @file{.emacs} (if you write it to @file{.emacs}, you'll get an error). @xref{Highlights}. All above described settings except autoload configuration can be written in @file{~/.wl}). @subsection @code{mail-user-agent} @cindex Default Mailer @cindex Mailer, Default @vindex mail-user-agent @findex compose-mail If you write following setting in your @file{~/.emacs}, you can start Wanderlust draft mode by typing @kbd{C-x m} (@code{compose-mail}). This means it enables you to run Wanderlust as a default mail composer of Emacsen. It is effective only when your Emacs can define @code{mail-user-agent}. @xref{Mail Methods, , Mail-Composition Methods, emacs, GNU Emacs Manual}. @lisp @group (autoload 'wl-user-agent-compose "wl-draft" nil t) (if (boundp 'mail-user-agent) (setq mail-user-agent 'wl-user-agent)) (if (fboundp 'define-mail-user-agent) (define-mail-user-agent 'wl-user-agent 'wl-user-agent-compose 'wl-draft-send 'wl-draft-kill 'mail-send-hook)) @end group @end lisp @node Folder Definition, Start Wanderlust, Minimal Settings, Start Me Up @section Folder Definition @cindex Folder Definition @cindex .folders You can skip this section because it is possible to add/edit the subscribe folders from the buffer for list of folders. @xref{Folder Manager}. Define the folders you want to subscribe in file @file{~/.folders}. The contents written in @file{~/.folders} become the folders which you subscribe to as it is. Format for @file{~/.folders} is very simple. Here is an example: @example @group # # @r{Lines begin with @samp{#} are comment.} # @r{Empty lines are ignored} # # @var{folder name} "@var{folder nickname}" # @r{(nicknames are not necessary)} # %inbox "Inbox" +trash "Trash" +draft "Drafts" %#mh/Backup@@my.imap.example.com "Sent" # Folder Group Emacsen@{ %#mh/spool/wl "Wanderlust ML" %#mh/spool/elips "ELIPS ML" %#mh/spool/apel-ja "APEL Japanese ML" %#mh/spool/xemacs-beta "XEmacs beta" -fj.news.reader.gnus@@other.nntp.example.com "Gnus Net news" *-fj.editor.xemacs,-fj.editor.mule,-fj.editor.emacs "fj's Emacsen" @} # # @r{If folder name ends with @samp{/}, that means an `access group',} # @r{all subfolders automatically included in one folder group.} # %#mh/expire@@localhost / # @r{All MH folders are included in one folder group.} + / @end group @end example Each line contains one folder you want to read. The definition of folders will be explained in detail in the next section. The part surrounded by @samp{@var{group name}@{} and @samp{@}} will become one folder group. One folder group is treated as a directory which can be opened and closed in folder mode. It is convenient for collecting some folders and putting them in order. Please note that @samp{@var{group name}@{} and @samp{@}} occupies one line and you have to write it that way (It is because the parser sucks). There are two types of groups. One is like @samp{Emacsen} from above example which the user chooses his favorite folders as a group. The other one is @dfn{access group} like @samp{+ /} from above example. It collects all sub-folders in the folder to make a group. (Its behavior differs by the type of the folder. For example, @samp{+} followed by @samp{/} makes entire MH sub-directories to one group) This behavior is better understood if you try it and confirmed the function first. You can write and try a small folder definition, so you will know the idea of the folder function before writing the real one. @node Start Wanderlust, Overview, Folder Definition, Start Me Up @section Start Wanderlust @cindex Start Wanderlust If installation and configuration worked well, you can invoke Wanderlust by typing following command in Emacs. @example M-x wl @end example @noindent After initialization, Folder Mode which shows the list of folders will appear. That means the folders you defined in the @file{~/.folders} are listed. If you start Wanderlust with prefix argument like @kbd{C-u M-x wl}, you can skip folder checking. @node Overview, , Start Wanderlust, Start Me Up @section Overview @cindex Overview Basically, you will handle messages in wanderlust while you come and go from/to each of the following buffers. Details of each ones are explained in following chapters. @table @samp @item Folder Buffer You can see the list of folders. You can select some folder and go into the summary of it. You can subscribe new folder or edit subscription list. @item Summary Buffer You can see the list of messages in the folder. You can select message and view its contents, and reply to some message. You can delete ones or move ones to another folder. @item Message Buffer You can see the contents of the message. You can save part to disk or open in external programs. @item Draft Buffer You can edit message. @end table @node Folders, Folder, Start Me Up, Top @chapter Wanderlust's folders @cindex Folder Type This chapter describes the folder types which Wanderlust is able to handle. Wanderlust uses ELMO as it's interface, so you can use every folder types supported by ELMO. As of version @value{VERSION}, 15 types of folders are predefined. These are IMAP, NNTP, LocalDir(MH), Maildir, News Spool, Archive, POP, Shimbun, Search, Multi, Filter, Pipe, File, Access and Internal folder types. @menu * IMAP Folder:: @samp{%} -- IMAP folder * NNTP Folder:: @samp{-} -- NNTP folder * MH Folder:: @samp{+} -- MH folder * Maildir Folder:: @samp{.} -- Maildir folder * News Spool Folder:: @samp{=} -- News spool folder * Archive Folder:: @samp{$} -- Archive folder * POP Folder:: @samp{&} -- POP folder * Shimbun Folder:: @samp{@@} -- Shimbun Folder * RSS Folder:: @samp{rss} -- RSS folder * Search Folder:: @samp{[} -- Search Folder * Multi Folder:: @samp{*} -- Multi folder * Filter Folder:: @samp{/} -- Filter folder * Pipe Folder:: @samp{|} -- Pipe folder * Internal Folder:: @samp{'} -- Internal folder * File Folder:: -- File folder * Access Folder:: -- Access folder @end menu @node IMAP Folder, NNTP Folder, Folders, Folders @section IMAP Folder @cindex @samp{%} @cindex IMAP Folder @cindex Folder, IMAP @cindex RFC 2060 @cindex IMAP4rev1 A folder to access e-mails via IMAP4rev1 protocol (RFC 2060). Format: @example @group @samp{%} @var{mailbox} [@samp{:} @var{username} [@samp{/} @var{authenticate-type}]][@samp{@@} @var{hostname}][@samp{:} @var{port}][@samp{!}] @end group @end example You can specify @code{login} (encoded password transmission), @code{cram-md5} (CRAM-MD5 authentication), @code{digest-md5} (DIGEST-MD5 authentication) or @code{clear} (or @code{nil}, plain password transmission) as @var{authenticate-type}. default: @example @var{username} -> The value of @code{elmo-imap4-default-user}. Initial setting is @env{USER} environment variable or @env{LOGNAME} environment variable or return value of @code{(user-login-name)}. @var{authenticate-type} -> The value of @code{elmo-imap4-default-authenticate-type}. Initial setting is "auth". @var{hostname} -> The value of @code{elmo-imap4-default-server}. Initial setting is "localhost". @var{port} -> The value of @code{elmo-imap4-default-port}. Initial setting is 143. @end example You can omit the @var{hostname} from folder names if you set @code{elmo-imap4-default-server} as your main IMAP server. For example, you can specify a folder as @samp{foo%imap@@gateway} even if you have to go through a firewall. @lisp @group ;; @r{Example: imap4.exaple.org as main IMAP server} (setq elmo-imap4-default-server "imap4.example.org") @end group @end lisp SSL (Secure Socket Layer) connection will be used if a folder name ends with @samp{!}. If a folder name ends with @samp{!!}, STARTTLS connection will be established. If the value of @code{elmo-imap4-default-stream-type} is @code{ssl}, SSL will be the default connection, i.e. you can omit @samp{!}. If it is is @code{starttls}, STARTTLS will be the default connection. To use normal connection in these cases, add @samp{!direct} at the end of folder name. @lisp @group ;; @r{Example: Use SSL connection} (setq elmo-imap4-default-stream-type 'ssl) @end group @end lisp If you specify @code{login}, @code{cram-md5} or @code{digest-md5} as authentication method, the password is sent in encoded form. But, if your server is unable to receive an encoded password, authentication will fall back to @code{clear} (that is, sending password in raw format) after confirmation to user. If @code{elmo-imap4-force-login} is non-nil, authentication will fall back to @code{clear} without confirmation (default value is @code{nil}). @lisp @group ;; @r{Example: password in raw format} (setq elmo-imap4-default-authenticate-type 'clear) @end group @end lisp Example: @example @group %inbox -> IMAP mailbox "inbox" %#mh/inbox -> IMAP mailbox "#mh/inbox" %inbox:hoge -> IMAP mailbox "inbox" of user "hoge". %inbox:hoge/clear@@server1 -> server1's IMAP mailbox "inbox" of user "hoge", with plain password authentication ('clear). @end group @end example @subsection International mailbox names (Modified UTF7) @cindex Modified UTF7 @cindex UTF7 @cindex UTF8 @cindex Unicode You can use international mailbox names in @var{mailbox} part, if @code{elmo-imap4-use-modified-utf7} is set to non-nil value (default value is @code{t}). @node NNTP Folder, MH Folder, IMAP Folder, Folders @section NNTP Folder @cindex @samp{-} @cindex NNTP Folder @cindex Folder, NNTP @cindex Folder, News @cindex NetNews @cindex News @cindex Newsgroup @cindex RFC 977 A folder to access USENET news via NNTP protocol (RFC 977). One newsgroup is treated as a folder. Format: @example @group @samp{-} @var{newsgroup} [@samp{:} @var{username}][@samp{@@} @var{hostname}][@samp{:} @var{port}][@samp{!}] @end group @end example default: @example @var{hostname} -> The value of @code{elmo-nntp-default-server}. Initial setting is @samp{localhost}. @var{username} -> The value of @code{elmo-nntp-default-user}. Initial setting is @code{nil}. @var{port} -> The value of @code{elmo-nntp-default-port}. Initial setting is 119. @end example AUTHINFO is used as authentication method if the @var{username} is non-nil. SSL connection will be used if a folder name ends with @samp{!}. If a folder name ends with @samp{!!}, STARTTLS connection will be established. If the value of @code{elmo-nntp-default-stream-type} is @code{ssl}, SSL will be the default connection, i.e. you can omit @samp{!}. If it is is @code{starttls}, STARTTLS will be the default connection. To use normal connection in these cases, add @samp{!direct} at the end of folder name. Example: @example @group -fj.rec.tv -> Newsgroup @samp{fj.rec.tv}. -fj.rec.tv@@newsserver -> Newsgroup @samp{fj.rec.tv} on @samp{newsserver}. @end group @end example @node MH Folder, Maildir Folder, NNTP Folder, Folders @section MH Folder @cindex @samp{+} @cindex MH Folder @cindex Folder, MH @pindex MH A folder to access MH format mail (1 file is 1 mail). Format: @example @samp{+} @var{directory-name} @end example Normally, @var{directory-name} is an relative path to the variable @code{elmo-localdir-folder-path} (default is @file{~/Mail}), but if it starts with @samp{/} or @samp{~}, then it is treated as an absolute path (this is also true for drive-letters). Message number is used for the name of the message file. Example: @example @group +inbox -> @file{~/Mail/inbox} +from/teranisi -> @file{~/Mail/from/teranisi} +~/test -> @file{~/test} @end group @end example @node Maildir Folder, News Spool Folder, MH Folder, Folders @section Maildir Folder @cindex @samp{.} @cindex Maildir Folder @pindex Maildir @pindex qmail A folder to access Maildir format (1 file is 1 mail). Format: @example @samp{.} [@var{directory-name}] @end example Normally, @var{directory-name} is a relative path to the variable @code{elmo-maildir-folder-path} (default is @file{~/Maildir}), but if it starts with @samp{/} or @samp{~}, then it is treated as an absolute path (this is also true for drive-letters). Maildir contains @file{cur}, @file{new} and @file{tmp} subdirectories. Messages are contained in the @file{cur} directory. All message files in the @file{new} directory are moved to @file{cur} directory when you access the folder. All message files contained in the @file{tmp} directory and not accessed for 36 hours are deleted. This behavior conforms to the @uref{http://cr.yp.to/proto/maildir.html}. Example: @example @group . -> @file{~/Maildir} .inbox -> @file{~/Maildir/inbox} .from/teranisi -> @file{~/Maildir/from/teranisi} .~/test -> @file{~/test} @end group @end example @node News Spool Folder, Archive Folder, Maildir Folder, Folders @section News Spool Folder @cindex @samp{=} @cindex News spool Folder @pindex gnspool This folder handles locally saved news articles which are proposed by Mew/IM. You can also read articles directly from a spool-file which is retrieved by an utility like @command{gnspool}. Format: @example @samp{=} @var{directory-name} @end example @var{directory-name} is a sub-directory to the directory defined by variable @code{elmo-localnews-folder-path} (default is @file{~/News}) You can use @samp{.} as directory delimiter as well as @samp{/}. Example: @example @group =fj/os/os2 -> @file{~/News/fj/os/os2} =fj.os.bsd.freebsd -> @file{~/News/fj/os/bsd/freebsd} @end group @end example @node Archive Folder, POP Folder, News Spool Folder, Folders @section Archive Folder @cindex @samp{$} @cindex Archive Folder @c @pindex ange-ftp This method can handle archive files, which are compressed by utilities such as Info-ZIP or LHA, as one folder. Format: @example @group @samp{$} @var{path-name} [@samp{;} @var{archiver-type} @samp{;} @var{prefix}] @end group @end example @var{path-name} is the relative path from @code{elmo-archive-folder-path} (initial setting is @file{~/Mail}). If @var{path-name} begins with @samp{/} or @samp{~} or `drive-letter of DOS', @var{path-name} is treated as absolute path. ange-ftp format is also permitted under the environment of ange-ftp, efs. The actual file name of the archive folder is @code{elmo-archive-basename} (Initial setting is @file{elmo-archive}) under the @var{path-name}. If a file named @var{path-name} exists, it is treated as folder. The suffix is automatically decided for @var{archiver-type}. If @var{archiver-type} is omitted, @code{elmo-archive-default-type} (Initial setting is @code{zip}) is referred. @var{prefix} specifies the internal directory structure of the archive. For example, if the ML server is fml, @file{msend.tar.gz} has a structure like @file{spool/1}, so you have to specify @samp{spool} as @var{prefix}. Example: @example @group $teranisi -> @file{~/Mail/teranisi/elmo-archive.zip} $bsd/freebsd;lha -> @file{~/Mail/bsd/freebsd/elmo-archive.lzh} $/foo@@server:~/bar;zoo -> @file{~/bar/elmo-archive.zoo} on ftp server $d:/msend.tar.gz;tgz;spool -> @file{d:/msend.tar.gz} $ml;zip/ -> Access group consists of archive folders under @file{~/Mail/ml} @end group @end example @menu * Archiver:: Supported Archivers * Archive Tips:: TIPS * Archive Vars:: Customization @end menu @node Archiver, Archive Tips, Archive Folder, Archive Folder @subsection Supported Archives @cindex Archiver @pindex LHA @pindex Info-ZIP @pindex UNZIP @pindex ZOO @pindex RAR @pindex TAR @pindex GNU TAR By default, following archives are supported. @example @group LHA, Info-ZIP/UNZIP, ZOO, RAR ;; full-access GNU TAR('tgz, 'tar) ;; read-only @end group @end example If your archiver can include multiple files in one archive, you have a possibility use it as an archiver of Wanderlust (ARJ/UNARJ, ARC is one of the candidate. TAR is supported read-only because it cannot delete file in the archive (@code{mv})). @command{gzip}, @command{bzip}, @command{bzip2} cannot be used as an archiver of Wanderlust because they cannot include multiple files. Archivers that cannot extract files to standard output are also not supported. @subsection OS specific information about archiver Behaviors of the following archivers are confirmed by further experiences. (@samp{*} mark means recommended archiver). @example [OS/2] Warp4.0J(w/o VoiceType)+Fx00505/emx0.9c(fix04)/PMMule,EmacsPM LHA OS/2 version Rel.2.06b Feb 18, 1998 *UnZip 5.32 of 3 November 1997, by Info-ZIP. *Zip 2.2 (November 3rd 1997). Zoo archiver, zoo 2.1 $@asis{}Date: 91/07/09 02:10:34 $ GNU tar version 1.10 - AK 2.58 (DBCS/SJIS) 981216(homy) version gzip 1.2.4 (18 Aug 93) + bzip2 patch(by Iida-san) [UN|X] FreeBSD 2.2.7-RELEASE, Linux 2.0.30, Solaris2.6, HP-UX 9.07 LHa for UNIX V 1.14c UnZip 5.32 of 3 November 1997 Zip 2.2 (November 3rd 1997) GNU tar 1.12 (1.11.x is no good) gzip 1.2.4 (18 Aug 93) [Win32] Win.98/Meadow Lha32 version 1.28 Zip 2.2 UnZip 5.40 GNU tar 1.11.8 + 1.5(WIN32) GZIP 1.2.4 RAR 2.06 @end example * Caution about LHA If you are an OS/2 user, Peter Fitzsimmons's LH/2 is not supported. Hiramatsu version of LHA is only supported. In Win32, LHa32 is only supported (DOS version is no good). * Caution about GNU tar You have to take care about GNU tar's version because many version has problem on deleting file from archive. Please test @option{--delete} @option{-f} options work. Otherwise, your archive will be destroyed. No problem is reported on above versions of GNU tar. @node Archive Tips, Archive Vars, Archiver, Archive Folder @subsection TIPS @cindex Archive Tips For comfortable migration, usage of @code{wl-summary-archive} (@pxref{Archive}) or Expire (@pxref{Expire}) is recommended. To treat archive folders created by expiration, you must set non-nil value to @code{elmo-archive-treat-file}. If many files are included in one archive, it takes long time to access the archive folder because archiver starting overhead is increased (especially LHA). 150-200 messages in one archive is recommended. Of course, following is possible @t{:-)} (meanings of these variables are described later.) @lisp @group (setq wl-fcc "$backup") (setq wl-trash-folder "$trash;lha") @end group @end lisp @node Archive Vars, , Archive Tips, Archive Folder @subsection Variables About Archive Folder @cindex Archive variables @table @code @item elmo-archive-default-type @vindex elmo-archive-default-type The initial setting is @code{zip}. Set archiver type by symbol. @item elmo-archive-@var{type}-method-alist @vindex elmo-archive-TYPE-method-alist Define archiver @var{type}'s methods. (@var{type} is @samp{lha}, @samp{zip}, @samp{zoo}, @samp{tgz} etc) Each element of the alist is following. @example @group (@var{action} . (@var{exec-name} @var{options})) ;; external program and its option. (@var{action} . @var{function}) ;; function @end group @end example Currently available actions are following. @example @group 'ls, 'cat ('cat-headers) ;; Minimal setting(read-only) 'mv ('mv-pipe), 'rm ('rm-pipe) ;; full-access (with above) 'cp ('cp-pipe) ;; @end group @end example @noindent In above actions, actions enclosed with braces are optional (They are used for better performance). @item elmo-archive-suffix-alist @vindex elmo-archive-suffix-alist An alist of archiver-type (symbol) and suffix. @item elmo-archive-file-regexp-alist @vindex elmo-archive-file-regexp-alist An alist of a regexp to get file number from list output of archiver and archiver-type (symbol). @item elmo-archive-method-list @vindex elmo-archive-method-list A list of elmo-archive-@var{type}-method-alist (@var{type} is a symbol of archiver-type). @item elmo-archive-lha-dos-compatible @vindex elmo-archive-lha-dos-compatible The initial setting is @code{t} on OS/2 and Win32. If non-nil, LHA is DOS (Mr. Yoshizaki original) compatible. @item elmo-archive-cmdstr-max-length @vindex elmo-archive-cmdstr-max-length The initial setting is 8000. Max length of command line argument for external archiver program. Emacs does not have a limit of command line byte length, but some OS (e.x OS/2) have. It depends on the OS. Archive folder is affected by this limit because it calls external archiver program directly (not called via shell). For example, you cannot delete messages if archiver program must receive larger bytes of arguments to delete. OS/2 have a command line argument limit of 8190 bytes, so we defined default as 8000 with some margin. However, you don't have an influence of command line argument limit if the archiver has `actions' to receive target file information from standard input (@code{rm-pipe}, @code{mv-pipe}, @code{cat-headers} action). @end table @node POP Folder, Shimbun Folder, Archive Folder, Folders @section POP Folder @cindex @samp{&} @cindex POP Folder @cindex RFC 1939 @cindex POP3 @cindex APOP A folder to access e-mails via POP3 protocol (RFC 1939). Format: @example @group @samp{&} [@var{username}][@samp{/} @var{authenticate-type}][@samp{:} @var{numbering-method}][@samp{@@} @var{hostname}][@samp{:} @var{port}][@samp{!}] @end group @end example You can specify @samp{user} (plain password transmission) or @samp{apop} (APOP authentication) as @var{authenticate-type}. You can specify @samp{uidl} (use UIDL command for message numbering) or @samp{list} (use LIST command for message numbering) as @samp{numbering-method}. default: @example @var{username} -> The value of @code{elmo-pop3-default-user}. Initial setting is @env{USER} environment variable or @env{LOGNAME} environment variable or return value of @code{(user-login-name)}. @var{authenticate-type} -> The value of @code{elmo-pop3-default-authenticate-type}. Initial setting is @samp{user}. @var{numbering-method} -> Follow the value of @code{elmo-pop3-default-use-uidl}. If t, use UIDL for numbering. Initial setting is t. @var{hostname} -> The value of @code{elmo-pop3-default-server}. Initial setting is @samp{localhost}. @var{port} -> The value of @code{elmo-pop3-default-port}. Initial setting is 110. @end example Example: @example @group &hoge@@localhost -> access localhost as user @samp{hoge}. &hoge@@popserver:109 -> access the server "popserver" on port 109 as user @samp{hoge}. @end group @end example If the last character of the folder name is @samp{!}, Wanderlust connects to the POP server via SSL (Secure Socket Layer). If a folder name ends with @samp{!!}, STARTTLS connection will be established. If the value of @code{elmo-pop3-default-stream-type} is @code{ssl}, SSL will be the default connection, i.e. you can omit @samp{!}. If it is is @code{starttls}, STARTTLS will be the default connection. To use normal connection in these cases, add @samp{!direct} at the end of folder name. @node Shimbun Folder, RSS Folder, POP Folder, Folders @section Shimbun Folder @cindex @samp{@@} @cindex Shimbun Folder @cindex Folder, Shimbun @cindex Folder, Web @pindex w3m @pindex emacs-w3m A folder for watching "shimbun" (means "newspaper" in Japanese), news site and mailing list archives on WWW by using emacs-w3m (@uref{http://emacs-w3m.namazu.org/}). You should possess w3m and emacs-w3m to use this. Format: @example @group @samp{@@} @var{module-name} @samp{.} @var{folder-name} @end group @end example Admissible values of @var{module-name} and @var{folder-name} are described in @file{README.shimbun.ja} distributed with emacs-w3m. Example: @example @group @@airs.wl -> archive of wanderlust ML (using module @file{sb-airs.el}) @@asahi/ -> access group of all folders in module @file{sb-asahi.el} @end group @end example @subsection Variables About Shimbun Folder @table @code @item elmo-shimbun-update-overview-folder-list @vindex elmo-shimbun-update-overview-folder-list The initial setting is @code{all}. Specify a set of folders to update overview when messages are fetched. Specify @code{all} to update overview in all shimbun folders. You can specify a list of regular expressions of shimbun folder names to restrict affected folders. Example: @example (setq elmo-shimbun-update-overview-folder-list '("^@@airs\\." "^@@namazu\\.")) @end example Update summary view automatically after fetching. @end table @node RSS Folder, Search Folder, Shimbun Folder, Folders @section RSS Folder @cindex RSS Folder @cindex Atom Folder An RSS folder presents the messages contained in an RSS or Atom feed: Format: @example @samp{rss:} @var{URL for RSS or Atom} @end example Example: @example rss:https://github.com/wanderlust/wanderlust/commits/master.atom @end example This folder type attempts to automatically handle all known versions of RSS and Atom. Should you need more configurability, please use a Shimbun folder (@pxref{Shimbun Folder}) instead. Since this folder doesn't do any persistent caching, messages will disappear as soon as they expire from the feed. Should you want persistent messages, combine this with a pipe folder (@pxref{Pipe Folder}): @example |rss:http://lwn.net/headlines/newrss|+lwn @end example You may also use an RSS, Atom or OPML feed as an access group, in which case related feeds will appear as subfolders. @node Search Folder, Multi Folder, RSS Folder, Folders @section Search Folder @cindex @samp{[} @cindex Search Folder @cindex Folder, Search @cindex Folder, Text Search A folder to access messages found by an external program with some condition. Format: @example @group @samp{[} @var{search condition} @samp{]} [ @var{search target} [ @samp{!} @var{search engine} ] ] @end group @end example The format of the @var{search condition} and @var{search target} depend on the @var{search engine}. @subsection Supported search engines Supported search engines are following ones. Default search engine can be assigned by @code{elmo-search-default-engine}. @menu * namazu:: namazu * grep:: grep * rgrep:: rgrep * mu:: mu * notmuch:: notmuch @end menu @node namazu, grep, Search Folder, Search Folder @subsection namazu @pindex namazu The messages registered in the namazu-index is found by using namazu (@uref{http://www.namazu.org/}). @var{search condition} is a query of namazu. Please refer to the document of the attached to namazu for details. @var{search target} is a namazu-index used for search. The directory with the index or the alias that explain in the following can be specified. Default value of the path of namazu index can be assigned by @code{elmo-search-namazu-default-index-path}. Example: @example @group [wanderlust] -> search messages matched with "wanderlust" from the default index [semi flim]~/Mail/semi -> search "semi flim" from the index in the directory "~/Mail/semi" @end group @end example @c @subsection TIPS @subsubsection Enter space to separate keywords If you want to use space in folder entry, @kbd{C-q @key{SPC}} will help you. @subsubsection Alias name for index You can define an alias name for index. Example: @example (setq elmo-search-namazu-index-alias-alist '(("cache" . "~/.elmo/cache") ("docs" . "~/documents"))) @end example Above definition defines two index aliases. You can specify @example [wanderlust]cache @end example to execute a namazu search with keyword @samp{wanderlust} using a index in the directory @file{~/.elmo/cache}. @subsubsection Multiple indices You can specify a list for @code{elmo-search-namazu-default-index-path} and @code{elmo-search-namazu-index-alias-alist}. When list is specified, all index contained in the list is used as the namazu indices. Example: @example (setq elmo-search-namazu-index-alias-alist '(("all" . ("~/.elmo/cache" "~/documents")) ("cache" . "~/.elmo/cache"))) @end example Using above alias setting, you can specify @example [wanderlust]all @end example to execute a namazu search with keyword @samp{wanderlust} using indices in the directory @file{~/.elmo/cache} and @file{~/documents}. @node grep, rgrep, namazu, Search Folder @subsection grep @pindex grep @pindex find The files that exists in the directory specified with the @var{search target} are found by using grep. @var{search condition} is a regular expression of grep. The directory as @var{search target} cannot be omitted. Example: @example @group [wanderlust]~/Mail/inbox!grep -> search messages matched with "wanderlust" from the directory "~/Mail/inbox" ["[sr]emi"]~/Mail/semi!grep -> If @samp{]} is included in regular expression, @var{search condition} should be enclosed with @samp{"}. @end group @end example Because this method passes all target filenames to grep process as arguments, starting grep process may fail when there are too many files in the target directory. If your find proram accepts @samp{-maxdepth} option, adding the below code in @file{~/.wl} may resolve the problem. @example (eval-after-load "elmo-search" '(elmo-search-register-engine 'grep 'local-file :prog "find" :args '(elmo-search-rgrep-target "-maxdepth" "1" "-type" "f" "-exec" "grep" "-l" "-e" pattern "@{@}" "+"))) @end example If your find program can't handle @samp{-exec command @{@} +} option correctly, replacing the last @samp{+} with @samp{;} would do the trick, but it is probably very slow. @node rgrep, mu, grep, Search Folder @subsection rgrep Using grep with @samp{-r} option to search files in subdirectories of the target directory. Grep must accept @samp{-r} option. There is no limitation about the number of files such as grep method (@pxref{grep}). Syntax is similar to grep method. Example: @example @group [wanderlust]~/Mail/inbox!rgrep -> search messages matched with "wanderlust" from the directory "~/Mail/inbox" including subdirectories. @end group @end example @node mu, notmuch, rgrep, Search Folder @subsection mu @pindex mu Search mail using mu (@uref{http://www.djcbsoftware.nl/code/mu/}). Examples (from the mu cheatsheet) @example @group [Helsinki] -> messages about Helsinki (in message body, subject, sender, ...) [to:Jack subject:jellyfish tumbleweed] -> messages to Jack with subject jellyfish containing the word tumbleweed [size:2k..2m date:20091201..20093112 flag:attach from:bill] -> messages between 2 kilobytes and a 2Mb, written in December 2009 with an attachment from Bill [subject:soc* flag:unread] -> unread messages about things starting with 'soc' (soccer, society, socrates, ...) [mime:image/*] -> messages with images as attachment ['foo bar'] -> search for messages with the phrase "foo bar" @end group @end example @node notmuch, , mu, Search Folder @subsection notmuch @pindex notmuch Search mail using notmuch (@uref{http://notmuchmail.org/}). Examples (from the notmuch manual) @example @group [term1] -> messages that contain 'term1' [-term1] -> messages that DO NOT contain 'term1' [term1 term2] -> messages containing term1 and term2 ['foo bar'] -> search for messages with the phrase "foo bar" @end group @end example @node Multi Folder, Filter Folder, Search Folder, Folders @section Multi Folder @cindex @samp{*} @cindex Multi Folder @cindex Folder, Multiple @cindex Folder, Marge A folder to access virtual folder which collects messages from multiple folders. Format: @example @group @samp{*} @var{folder-1} [@samp{,} @var{folder-2}] @dots{} [@samp{,} @var{folder-N}] @end group @end example After @samp{*} character, specify multiple folders you want to collect separated by @samp{,} like @samp{@var{folder-1},@var{folder-2},@dots{},@var{folder-N}}. Example: @example @group *-fj.editor.xemacs,-fj.editor.mule,-fj.editor.emacs -> -fj.editor.xemacs, -fj.editor.mule and -fj.editor.emacs are treated as one folder. *+inbox,-fj.rec.tv,%inbox -> +inbox, -fj.rec.tv and %inbox are treated as one folder. @end group @end example @node Filter Folder, Pipe Folder, Multi Folder, Folders @section Filter Folder @cindex @samp{/} @cindex Filter Folder @cindex Folder, Filtering @cindex Folder, Virtual @cindex Folder, Conditional @cindex Flag A folder to access virtual folder which collects all messages that satisfy a condition. Format: @example @samp{/} @var{condition} @samp{/} @var{target-folder} @end example In the @var{condition} part, you can specify following. @enumerate @item Partial filter: @samp{first:@var{number}}, @samp{last:@var{number}} first: @var{number} messages are picked from top of folder. last: @var{number} messages are picked from bottom of folder. Example: @example @group /last:10/-fj.os.linux -> Latest 10 messages from -fj.os.linux are picked. /first:20/%inbox -> First 20 messages from %inbox are picked. @end group @end example @item Date filter: @samp{since:@var{date}}, @samp{before:@var{date}} since: only messages arrived since @var{date} are picked (@var{date} is included). before: only messages arrived before @var{date} are picked (@var{date} is not included). You can specify following as @var{date}. @example @group yesterday -> a day before today. lastweek -> same day of last week. lastmonth -> same day of last month. lastyear -> same day of last year. @var{number}daysago -> @var{number} days ago. (e.x. '3daysago') @var{day}-@var{month}-@var{year} -> specify date directly (ex. 1-Nov-1998) @end group @end example Example: @example @group /since:3daysago/+inbox -> messages arrived since 3 days ago in +inbox are picked. /before:yesterday/+inbox -> messages arrived before yesterday in +inbox are picked. @end group @end example @item Field filter: @samp{@var{field}:@var{value}} All messages that have @var{field} and its value is @var{value} are picked. @var{field} and @var{value} are case insensitive. Example: @example @group /from:teranisi/+inbox -> In +inbox, messages which have From: field and its value includes "teranisi" string are picked. /body:foo/%inbox -> In %inbox, messages which have "foo" text are picked. @end group @end example @item Flag filter: @samp{flag:@var{flag-name}} Pick up messages with flag specified by @var{flag-name}. You can specify following flag names: @example @group unread -> unread important -> important answered -> replied forwarded -> forwarded digest -> unread or important any -> unread or replied or forwarded or global-flag. @end group @end example You can also use flags which you have set as `global-flag'. global-flag is a flag which has arbitrary name. You can put global-flag on messages by invoking @code{wl-summary-set-flags} (Key @key{F}). By default, @samp{important} flag is prepared. You can view messages with global-flag by visiting the subfolder of @samp{'flag} folder. @xref{Internal Folder}. Example: @example @group /flag:digest/%inbox -> a folder consist of unread or important message in %inbox. /flag:wl/+ML/Wanderlust -> a folder consist of messages with global flag wl in +ML/Wanderlust. @end group @end example @item Compound condition A condition starting with @samp{!} indicates a negation. If you combine conditions by character @samp{|}, it is considered as OR condition. @samp{&} is considered as AND condition, likewise. Condition can be grouped by parentheses (@samp{(}, and @samp{)}). @samp{/tocc:xxxx/} is an abbreviation of @samp{/to:xxxx|cc:xxxx/}. @samp{/!tocc:xxxx/} is an abbreviation of @samp{/!to:xxxx&!cc:xxxx/}. Example: @example @group /from:teranisi&!to:teranisi/+inbox -> In +inbox, messages are picked if the message's From: field includes "teranisi" and To: field doesn't include "teranisi". /tocc:"Yuuichi Teranishi"/+inbox -> In +inbox, messages are picked if the message's To: field or Cc: field includes "Yuuichi Teranishi". /(from:yt|from:teranisi)&subject:report/+inbox -> In +inbox, messages are picked if the message's From: field includes "yt" or "teranisi", and Subject includes "report". @end group @end example @end enumerate @noindent Tip for string description: Space character, @samp{"}, @samp{/},@samp{)},@samp{|} and @samp{&} should be enclosed with @samp{"} in @var{value} string. (@samp{"} should be escaped with @samp{\} in it). You can enclose the string with @samp{"} even it does not contain these characters. @noindent Advanced example: @example *%inbox,/from:teranisi/%inbox@@server -> Messages in %inbox or message is in the %inbox@@server folder and it's From field includes "teranisi" are collected. /last:100//to:teranisi/*+inbox,%inbox -> Latest 100 messages which is in the +inbox or %inbox folder and To: field matches "teranisi". /from:hogehoge//last:20//tocc:teranisi/%#mh/inbox@@localhost -> Pick messages which have From: field and it includes "hogehoge" from latest 20 messages in the %#mh/inbox@@localhost and To: or Cc: field includes "teranisi". @end example @node Pipe Folder, Internal Folder, Filter Folder, Folders @section Pipe Folder @cindex @samp{|} @cindex Pipe Folder @cindex Get Message @cindex Download Message @cindex Incorporate Message In the pipe folder, messages are automatically transferred from the source folder to destination folder. Format: @example @samp{|} @var{source-folder} @samp{|} @var{destination-folder} @end example When you access the pipe folder, messages are automatically transferred from @var{source-folder} to @var{destination-folder}. It is convenient if you want to download messages to local disk via POP. For example, if you specify following @example |&username@@popserver|+inbox @end example @noindent and access it, Wanderlust downloads messages from @samp{&username@@popserver} to @samp{+inbox} automatically. On the other hand, if you put @samp{|:} instead of second @samp{|}, then messages are copied to the destination folder (not deleted from source-folder). At the next time you access that folder, copies new messages only. @example @samp{|} @var{source-folder} @samp{|:} @var{destination-folder} @end example If you want to copy messages from POP server and view them, specify the folder as follows: @example |&username@@popserver|:+inbox @end example where messages will be kept on the server. Example: @example @group |%inbox|%myinbox -> Download %inbox to %myinbox. |*&user@@popserver1,&user@@popserver2|+inbox -> Download from &user@@popserver1 and &user@@popserver2 to +inbox. |-gnu.emacs.sources|:+sources -> Copy messages from -gnu.emacs.sources to +sources. @end group @end example After messages are moved, a hook @code{elmo-pipe-drained-hook} is called. @node Internal Folder, File Folder, Pipe Folder, Folders @section Internal folder @cindex @samp{'} @cindex Internal Folder @cindex Folder, @samp{$} mark @cindex Flag @cindex Cache @c @cindex Folder, Null A folder to access internal messages of Wanderlust. Format: @example @group @samp{'flag} [@samp{/} @var{global-flag}] @samp{'sendlog} @samp{'cache/00} - @samp{'cache/1F} @end group @end example A folder named @samp{'flag} is a special virtual folder which collects messages which have @var{global-flag}. There is @samp{important} flag defined as @var{global-flag} by default. You can review important messages at once after you put important marks on the messages in the different folders. If @var{global-flag} is omitted, it is treated as @samp{important} flag is specified. In addition, in summary mode, to be described later, you can freely define global flags and put them on messages. @xref{Usage of Summary Mode}. In this folder, if you delete message, @var{global-flag} put on the message is removed. If you append messages to this folder, the message will have @var{global-flag}. A folder named @samp{'sendlog} is a virtual folder which collects cached messages which are recoded on @file{~/.elmo/sendlog}. It might be useful when you forgot to add cc for yourself. To use this, you should set @code{wl-draft-use-cache} to non-nil so that sent messages are cached. You can access cached messages fetched via network by accessing folders named @samp{'cache/00} - @samp{'cache/1F}. 00 - 1F are the name of the subdirectories of the cache directory (@file{~/.elmo/cache}). @node File Folder, Access Folder, Internal Folder, Folders @section File folder @cindex File Folder File Folder gives the view for local file system. The one File Folder corresponds to the one directory. Format: @example @samp{file:} @var{Path-of-the-directory} @end example Example: @example @group file:~/work -> @file{~/work} file:/etc -> @file{/etc} @end group @end example @node Access Folder,, File Folder, Folders @section Access folder @cindex Access Folder A folder to access virtual folder which collects messages from a root folder and subfolders of one. The add and remove of the subfolder is automatically reflected. Format: @example @samp{access:} @var{root-folder} @end example Example: @example @group access:%INBOX -> All subfolders of IMAP mailbox "inbox". access:'cache -> All of 'cache folder @end group @end example @node Folder, Summary, Folders, Top @chapter Folder mode @cindex Folder After you start Wanderlust, folder mode is appeared firstly. It contains folder list you subscribed. You can select and edit folders in this mode. @menu * Selecting Folder:: Select folder you want to read * Folder Manager:: Editing folders @end menu @node Selecting Folder, Folder Manager, Folder, Folder @section Selecting Folder @cindex Selecting Folder @subsection Usage (TIPS) @subsubsection Check new, unread number Folder mode looks like this. @example @group [-]Desktop:14186/35580/67263 Inbox:3/10/10 Trash:2/7/10 Drafts:0/0/3 Sent:0/9/348 [-]Emacsen:0/34/4837 Wanderlust ML:0/0/558 ELIPS ML:0/0/626 tm:0/0/821 XEmacs Beta:0/29/255 Mew:0/0/998 Mule-Win32:0/0/1491 fj's Emacsen:0/5/88 @end group @end example Each line means: @example @var{folder-name}:@var{new-number}/@var{unread-number}/@var{all-number} @end example @noindent @kbd{s} key on the folder line updates these numbers. It changes its color if it has many new messages. The whole folder mode is a folder group named @samp{Desktop}. Folder group open/close by return key. An operation on a folder group is treated as operations on the children folders. For example, when you type @kbd{s} on @samp{[-]Emacsen}, seven children folders update their unread number status. @subsubsection Select Folder To enter summary mode of the folder, type return (or space) key on the folder line. If the variable @code{wl-stay-folder-window} has non-nil value, summary window appears on the right of the folder mode window. @subsection Key bindings Folder mode's key binding (related to selecting folders) is following. @table @kbd @item @key{SPC} @itemx @key{RET} @kindex @key{SPC} (Folder) @kindex @key{RET} (Folder) @findex wl-folder-jump-to-current-entity Enter to the summary mode of the folder at the current cursor point. With prefix argument, enter the sticky summary. If the cursor is on the top of folder group line, the folder group is opened or closed. When the cursor is on the access group and this command is called with prefix argument, folder children list is updated to the newest one. (Children list is updated recursively if the access folder has hierarchical structure.) (@code{wl-folder-jump-to-current-entity}) @item M-@key{RET} @kindex M-@key{RET} (Folder) @findex wl-folder-update-recursive-current-entity Folder children list of the access group at the current cursor point is updated to the newest one. (Children list is updated recursively if the access folder has hierarchical structure.) (@code{wl-folder-update-recursive-current-entity}) @item w @kindex w (Folder) @findex wl-draft Create a new draft message. (@code{wl-draft}) @item W @kindex W (Folder) @findex wl-folder-write-current-folder If the current cursor point is on the NNTP folder, create a new draft message which already has @samp{Newsgroups:} field. If the current cursor point is on the folder for mailing list (refile destination), create a new draft message which already has @samp{To:} field with guessed mailing list address (If @code{wl-subscribed-mailing-list} is valid list). (@code{wl-folder-write-current-folder}) @item C-c C-o @kindex C-c C-o (Folder) @findex wl-jump-to-draft-buffer Move to the draft buffer if available. If multiple draft buffer exists, moved to one after another. If prefix argument is specified, load draft folder's message to the draft buffer and jump to it. (@code{wl-jump-to-draft-buffer}) @item s @kindex s (Folder) @findex wl-folder-check-current-entity Update new and unread number information of the folder at the current cursor point. (@code{wl-folder-check-current-entity}) @item S @kindex S (Folder) @findex wl-folder-sync-current-entity Update summary information of the folder at the current cursor point. (@code{wl-folder-sync-current-entity}) @item r s @kindex r s (Folder) @findex wl-folder-check-region Update new and unread number information of the folders in the currently selected region. (@code{wl-folder-check-region}) @item r S @kindex r S (Folder) @findex wl-folder-sync-region Update summary information of the folders in the currently selected region. (@code{wl-folder-sync-region}) @item Z @kindex Z (Folder) @findex wl-status-update Sync up address book status with @file{~/.addresses}'s content. (@code{wl-status-update}) @item P @kindex P (Folder) @findex wl-folder-prev-unread Jump cursor to the folder which have unread messages on the upward from current cursor point. (@code{wl-folder-prev-unread}) @item N @kindex N (Folder) @findex wl-folder-next-unread Jump cursor to the folder which have unread messages on the downward from current cursor point. (@code{wl-folder-next-unread}) @item p @kindex p (Folder) @findex wl-folder-prev-entity Move cursor to the folder on the previous line. (@code{wl-folder-prev-entity}) @item n @kindex n (Folder) @findex wl-folder-next-entity Move cursor to the folder on the next line. (@code{wl-folder-next-entity}) @item J @kindex J (Folder) @findex wl-folder-jump-folder Jump to the folder specified by the user input. (@code{wl-folder-jump-folder}) @item I @kindex I (Folder) @findex wl-folder-prefetch-current-entity Prefetch new messages of the folder at the current cursor point by @code{wl-summary-incorporate}. If the cursor is on the folder group, it is executed recursively. (@code{wl-folder-prefetch-current-entity}) @item c @kindex c (Folder) @findex wl-folder-mark-as-read-all-current-entity Mark all unread messages of the folder at the current cursor point as read. If the cursor is on the folder group, it is executed recursively. (@code{wl-folder-mark-as-read-all-current-entity}) @item f @kindex f (Folder) @findex wl-folder-goto-first-unread-folder Enter summary mode of the first unread folder. (@code{wl-folder-goto-first-unread-folder}) @item E @kindex E (Folder) @findex wl-folder-empty-trash Empty trash. (@code{wl-folder-empty-trash}) @item F @kindex F (Folder) @findex wl-folder-flush-queue Flush queue. (@code{wl-folder-flush-queue}) @item V @kindex V (Folder) @findex wl-folder-virtual Move to the virtual folder (filter folder) with the condition specified. (@code{wl-folder-virtual}) @item ? @kindex ? (Folder) @findex wl-folder-pick Search the folders with the condition specified. (@code{wl-folder-pick}) @item o @kindex o (Folder) @findex wl-folder-open-all-unread-folder All unread folders are opened. (@code{wl-folder-open-all-unread-folder}) @item x @kindex x (Folder) @findex wl-execute-temp-marks Execute marks in summary buffers. @xref{Sticky Summary}. (@code{wl-execute-temp-marks}) @item / @kindex / (Folder) @findex wl-folder-open-close Folder group is opened/closed. (@code{wl-folder-open-close}) @item [ @kindex [ (Folder) @findex wl-folder-open-all All folder groups are opened. (@code{wl-folder-open-all}) @item ] @kindex ] (Folder) @findex wl-folder-close-all All folder groups are closed. (@code{wl-folder-close-all}) @item q @kindex q (Folder) @findex wl-exit Quit Wanderlust. (@code{wl-exit}) @item z @kindex z (Folder) @findex wl-folder-suspend Suspend Wanderlust. (@code{wl-folder-suspend}) @item C-x C-s @kindex C-x C-s (Folder) @findex wl-save Save current folder status. (@code{wl-save}) @item M-t @kindex M-t (Folder) @findex wl-toggle-plugged Toggle Wanderlust's offline/online status. (@code{wl-toggle-plugged}) @item C-t @kindex C-t (Folder) @findex wl-plugged-change Start Wanderlust's plug-status manager. (@code{wl-plugged-change}) @end table @subsection Customize variables @table @code @item wl-folders-file @vindex wl-folders-file The initial setting is @file{~/.folders}. Subscribed folders are described (saved) in this file. @item wl-folder-info-save @vindex wl-folder-info-save The initial setting is @code{t}. If non-nil, unread information is saved and used in the next Wanderlust session. @item wl-stay-folder-window @vindex wl-stay-folder-window The initial setting is @code{nil}. If non-nil, summary window is appeared on the right side of the folder buffer. @item wl-folder-window-width @vindex wl-folder-window-width The initial setting is 20. Folder mode's window width when @code{wl-stay-folder-window} is non-nil. @item wl-folder-use-frame @vindex wl-folder-use-frame The initial setting is @code{nil}. If non-nil, use new frame for the folder window. @item wl-folder-many-unsync-threshold @vindex wl-folder-many-unsync-threshold The initial setting is 70. If the number of unread messages is more than this value, folder color is changed. @item wl-highlight-folder-by-numbers @vindex wl-highlight-folder-by-numbers This option controls how to highlight each line in the folder buffer. The default value is @code{t}, highlighting with various colors based on the message numbers. If it is @code{nil}, highlighting with various colors based on the folder status. In addition, if it is a number (e.g. 1), highlighting will be done based on both the message numbers and the folder status. @item wl-folder-desktop-name @vindex wl-folder-desktop-name The initial setting is @samp{Desktop}. The name of top folder group. @item wl-folder-petname-alist @vindex wl-folder-petname-alist The initial setting is @code{nil}. An alist of folder's realname and its nickname. @item wl-folder-access-subscribe-alist @vindex wl-folder-access-subscribe-alist The initial setting is @code{nil}. Control automatic subscribing and unsubscribing of the children list of access groups. Each element is: @example (@var{regexp-of-access-folder} . (@var{subscribe-flag} @var{regexp-of-folders} @dots{})) @end example @noindent If @var{subscribe-flag} is non-nil, folders which have name matched to @var{regexp-of-folders} are displayed. Otherwise, hidden. However, already unsubscribed folder is not displayed even when the @var{subscribe-flag} is non-nil. Multiple @var{regexp-of-folders} can be specified. Example: @lisp @group '(("^-fj$" . (t "^-fj\\.\\(comp\\|editor\\|mail\\)" "^-fj\\.\\(net\\|news\\|os\\|rec\\)")) ("^-$" . (t "^-\\(fj\\|tnn\\|japan\\|gnu\\|comp\\)")) ("^\\+ml$" . (nil "^\\+ml$" "^\\+ml/tmp"))) @end group @end lisp @item wl-folder-hierarchy-access-folders @vindex wl-folder-hierarchy-access-folders A list of regular expressions for access groups which creates children folder list hierarchically. For example, if you specify @code{wl-folder-hierarchy-access-folders} like following, @lisp @group (setq wl-folder-hierarchy-access-folders '("^-[^\\.]*$" "^-comp.unix$" "^-comp.unix.bsd$")) @end group @end lisp @noindent you obtain the access group hierarchy as follows. @example @group [-]-:912/912/3011 [-]-fj:674/674/1314 -fj.comp.announce:0/0/2 -fj.comp.dev.cdrom:0/0/0 @dots{} [+]-japan:238/238/1688 [-]-comp:0/0/4 [-]-comp.unix:0/0/0 -comp.unix.admin:0/0/0 -comp.unix.dos-under-unix:0/0/0 -comp.unix.programmer:0/0/0 [-]-comp.unix.bsd:0/0/23 -comp.unix.bsd.freebsd.announce:0/0/0 @dots{} @end group @end example If you opened @samp{-} in this example, only the direct children is created (@samp{-fj}, @samp{-japan}, @samp{-tnn}, @dots{}). second hierarchy (@samp{-fj.comp.announce}, @dots{}, @samp{-comp.unix}, @dots{}) is not created until the children access group is opened. @end table @node Folder Manager, , Selecting Folder, Folder @section Editing Folders @cindex Folder Manager @cindex Folder, Edit @cindex Folder, Subscribe @cindex Folder, Unsubscribe As described before, subscribed folder list is saved in @file{~/.folders} file. But you don't have to edit @file{~/.folders} directly. You can append, delete, edit folders from folder mode. @subsection Usage (Tips) @subsubsection Append Folder @kbd{m a} appends new folder to your folder list. If you enter non-existent folder, it will ask you to create a new one. @kbd{m g} appends new folder group. To append new folder to this group, firstly open it, then execute append command in the next line. @subsubsection Edit Folder You can cut folder by @kbd{C-k}, paste by @kbd{C-y}. Thus, you can change folder position as if you were editing a normal file. @subsubsection Create Multi Folder @enumerate @item Type @kbd{m q} to clear @code{wl-fldmgr-cut-entity-list}. @item Cut folder by @kbd{C-k} or copy folder by @kbd{M-c}. @item Type @kbd{m m}, then you can create multi folder. @end enumerate @subsubsection Delete Nickname, Filter You can delete nickname or filter by putting ``''(@var{NULL}) from the minibuffer while appending. @subsubsection Append Folder to Empty Group To append new folder to the empty folder group (after you create folder group by typing @kbd{m g}), firstly open it, then execute append command in the next line. If it is closed, folder is appended on the same level with the folder group above. It is difficult to explain by words so try it. In other words, appended position depends on the open/close status of the upper one. @subsubsection Charset of the Folders File @code{wl-mime-charset} is used for saving @code{wl-folders-file}. @subsubsection Create Filter @kbd{m f} adds filter to the folder at the current cursor point. To create new filter folder and leave the current folder unchanged, copy it @kbd{M-c}, make filter @kbd{m f} and paste it @kbd{C-y}. Multiple filter can be specified while appending filter. If you put ``''(@var{NULL}), filter is deleted. @subsubsection Sort Folders Sorting of the folders is executed by the function specified by @code{wl-fldmgr-sort-function}. The initial setting is @code{wl-fldmgr-sort-standard}, which sorts alphabetically. Sorting affects only on the current folder group. It does not affect on the child groups. @subsubsection Hiding Folders in the Access Group Usually, access group displays all children folders, but you can set some folders hidden. Following operations are only available on access group. Command @code{wl-fldmgr-unsubscribe} (@kbd{u}) toggles the visibility (subscribe/unsubscribe) of the folder at current cursor point. Against this, @code{wl-fldmgr-unsubscribe-region} (@kbd{U}) hides folders in the specified region. Note that @code{wl-fldmgr-unsubscribe-region} does not toggle while @code{wl-fldmgr-unsubscribe} toggles. These two commands accept prefix argument and if the argument has positive number, the unsubscribe it. If the prefix argument has negative value, folder becomes visible and if zero, folder visibility is toggled. The other commands, @code{wl-fldmgr-subscribe} and @code{wl-fldmgr-subscribe-region} are also prepared (not binded to the key). Moreover, if @code{wl-fldmgr-cut} or @code{wl-fldmgr-cut-region} is executed in the access group, they have a same effect with @code{wl-fldmgr-unsubscribe} and @code{wl-fldmgr-unsubscribe-region}. The difference is that cut commands deletes folders from the current buffer. @subsubsection Operations in the Access Group You can insert and delete folders in the access group like usual folder group. But insert and delete commands can be only available for the children folders of the access group and they only sets the subscribe status. In other words, insertion of the folder means subscribing, deletion means unsubscribing. @footnote{In the current implementation, it is faster to delete region than to unsubscribe region.} To update the access group when children folders are inserted or deleted by other way (other than Wanderlust), open the access group by typing @kbd{C-u @key{RET}}. @xref{Selecting Folder}. The order of children folders of access group is saved after insertion/deletion/sorting. If you set @code{wl-force-fetch-folders} to non-nil or open access group by typing @kbd{C-u @key{RET}}, disappeared folders are deleted and newly created folders are inserted on the top of the access group. @subsection Key bindings @cindex Keybind, Folder Mode @cindex Keybind, Folder Buffer Key bindings on the folder mode related to folder editing are shown below. All bindings starts with @kbd{m}, and primary commands are binded to one stroke key binding. @table @kbd @item m a @kindex m a (Folder) @findex wl-fldmgr-add Add specified folder to your folder list . If you enter non-existent folder, create it after confirmation. (@code{wl-fldmgr-add}) @item + @itemx m g @kindex + (Folder) @kindex m g (Folder) @findex wl-fldmgr-make-group Create a folder group. (@code{wl-fldmgr-make-group}) @item m A @kindex m A (Folder) @findex wl-fldmgr-make-access-group Create an access group. (@code{wl-fldmgr-make-access-group}) @item m d @kindex m d (Folder) @findex wl-fldmgr-delete Delete folder itself and msgdb. If the folder itself cannot be deleted like NNTP folder, only msgdb is deleted. (@code{wl-fldmgr-delete}) @item R @itemx m R @kindex R (Folder) @kindex m R (Folder) @findex wl-fldmgr-rename Change the name of folder or folder group. msgdb's path is also changed. (@code{wl-fldmgr-rename}) @item * @itemx m m @kindex * (Folder) @kindex m m(Folder) @findex wl-fldmgr-make-multi Create a multi folders in the cutlist (cut, copied folders). (@code{wl-fldmgr-make-multi}) @item | @itemx m f @kindex | (Folder) @kindex m f (Folder) @findex wl-fldmgr-make-filter Create a filter folder. (Put a filter on the folder). (@code{wl-fldmgr-make-filter}) @item M-c @itemx m c @kindex M-c (Folder) @kindex m c (Folder) @findex wl-fldmgr-copy Copy folder (it is not available on folder group). (@code{wl-fldmgr-copy}) @item M-w @itemx m W @kindex M-w (Folder) @kindex m W (Folder) @findex wl-fldmgr-copy-region Copy folders in the specified region. (@code{wl-fldmgr-copy-region}) @item C-k @itemx m k @kindex C-k (Folder) @kindex m k (Folder) @findex wl-fldmgr-cut Cut folder. Folder itself is not deleted. (@code{wl-fldmgr-cut}) @item C-w @itemx m C-w @kindex C-w (Folder) @kindex m C-w (Folder) @findex wl-fldmgr-cut-region Cut folders in the specified region. (@code{wl-fldmgr-cut-region}) @item C-y @itemx m y @kindex C-y (Folder) @kindex m y (Folder) @findex wl-fldmgr-yank Paste folders that are copied or cut (folders in the cut-list). (@code{wl-fldmgr-yank}) @item m p @kindex m p (Folder) @findex wl-fldmgr-set-petname Put nickname on the folder. (@code{wl-fldmgr-set-petname}) @item m q @kindex m q (Folder) @findex wl-fldmgr-clear-cut-entity-list Clear the cut-list. (cut, copied folder information is cleared, you cannot paste after this) (@code{wl-fldmgr-clear-cut-entity-list}) @item m s @kindex m s (Folder) @findex wl-fldmgr-sort Sort folders in the current folder group. (@code{wl-fldmgr-sort}) @item m C-s @kindex m C-s (Folder) @findex wl-fldmgr-save Save current folder view to the @file{wl-folders-file}. (@code{wl-fldmgr-save}) @end table [Following commands are only available on the access groups] @table @kbd @item u @itemx m u @kindex u (Folder) @kindex m u (Folder) @findex wl-fldmgr-unsubscribe Set the visibility of folder (subscribe/unsubscribe). (@code{wl-fldmgr-unsubscribe}) @item U @itemx r u @kindex U (Folder) @kindex r u (Folder) @findex wl-fldmgr-unsubscribe-region Set the visibility of the folders (subscribe/unsubscribe) in the specified region. (@code{wl-fldmgr-unsubscribe-region}) @item l @itemx m l @kindex l (Folder) @kindex m l (Folder) @findex wl-fldmgr-access-display-normal List folders that are currently available. (@code{wl-fldmgr-access-display-normal}) @item L @itemx m L @kindex L (Folder) @kindex m L (Folder) @findex wl-fldmgr-access-display-all List all folders regardless of the subscription status. (@code{wl-fldmgr-access-display-all}) @end table @subsection Customize variables @table @code @item wl-interactive-save-folders @vindex wl-interactive-save-folders The initial setting is @code{t}. If non-nil and folder view is modified, confirm saving it before Wanderlust or Emacs exits. If @code{nil}, save without confirmation. @item wl-fldmgr-make-backup @vindex wl-fldmgr-make-backup The initial setting is @code{t}. If non-nil, @file{~/.folders.bak} is created before saving the folder status. @item wl-fldmgr-sort-function @vindex wl-fldmgr-sort-function The initial setting is @code{wl-fldmgr-sort-standard}. A function to sort folders. By default function, folders are sorted alphabetically and folder group is put on top (when @code{wl-fldmgr-sort-group-first} is non-nil). @item wl-fldmgr-sort-group-first @vindex wl-fldmgr-sort-group-first The initial setting is @code{t}. If non-nil, @code{wl-fldmgr-sort-standard} precedes folder group. If @code{nil}, it does not care whether it is folder group or not. @item wl-folder-check-async @vindex wl-folder-check-async The initial setting is @code{t}. If non-nil, check folder's unread status asynchronously. It boosts newsgroup checking. @item wl-folder-check-fast @vindex wl-folder-check-fast The initial setting is @code{nil}. If non-nil, it does not update folder status while checking. @c it is obsolete? @item wl-folder-notify-deleted @vindex wl-folder-notify-deleted The initial setting is @code{nil}. @c nil means? If non-nil, negative value is displayed when the message is deleted. If @code{sync}, folder is synchronized when the message is deleted. If @code{nil}, message deletion is ignored. @item wl-fldmgr-add-complete-with-current-folder-list @vindex wl-fldmgr-add-complete-with-current-folder-list The initial setting is @code{nil}. Non-nil means call @code{elmo-folder-list-subfolders} and get completion candidate for @code{wl-fldmgr-add}. @end table @subsection Miscellanea Following is a note for folder editing. @enumerate @item cut or copy stacks the folder in the @code{wl-fldmgr-cut-entity-list}. paste(yank) command pastes the folders on one cut or copy command (If copy command is executed by region, folders in the region are pasted by one paste command) @item You cannot cut @samp{Desktop} group. Also, you cannot paste folders at the outside of the @samp{Desktop}. @item You cannot copy folder group. @item Operations on the access group are only available for the folders in the same access group. @item You cannot create a folder which has same name with the folders already exist. @item You cannot insert folders which have same name in one group. You can insert them in the different groups. You cannot put same nickname to the different folders. @end enumerate @node Summary, Message, Folder, Top @chapter Summary Mode After you select the folder via folder mode, you enter to the summary mode. @menu * Usage of Summary Mode:: TIPS * Thread Operations:: Thread operations * Cache:: File cache, Buffer cache, and Prefetch * Auto Refile:: Auto refile settings * Sticky Summary:: Summary make sticky * Summary View:: Format of summary lines * Mark and Action:: Temporary marks and their effect * Key Bindings of Summary:: Key bindings * Variables of Summary:: Customize Summary Mode @end menu @node Usage of Summary Mode, Thread Operations, Summary, Summary @section Usage (Tips) @subsection Summary Content In the summary mode, messages are displayed like following. @example @group 377 09/16(Wed)11:57 [+1: Takuro Kitame ] Bug? 381 09/17(Thu)00:16 [+3: Fujikazu Okuni ] elmo-lha.el -- LHA interface 384 09/17(Thu)01:32 [+1: Yuuichi Terani ] wl-0.6.2 389 N09/18(Fri)01:07 [+2: Yuuichi Terani ] wl-0.6.3 @end group @end example Each line displays: @example @var{Message number}, @var{Temporal mark}, @var{Persistent mark}, @var{Date}, @var{Sender}, @var{Subject} @end example @noindent If you want to know how to change the format for this, please refer the section format of Summary lines. @xref{Summary View}. @var{Message number} is the message's unique number in the folder. In the NNTP folder, it is article number, in the IMAP folder, it is UID and in the MH folder, it is the filename of the message. @var{Temporal mark} and @var{Persistent mark} are described later. @var{Date} is displayed like @samp{@var{Month}/@var{Day}(@var{Week Day})@var{Hour}:@var{Minute}}. Default setting displays week day in Japanese, but if you want to display it in English, set the value of @code{wl-summary-weekday-name-lang} as @samp{en}. @var{Sender}'s indentation corresponds to the depth of the thread. Sender name is displayed as nickname if it is defined in the address book. Set @code{wl-use-petname} as @code{nil}, if you want to quit displaying with nickname. If number is printed at the head of @var{Sender} part like @samp{+2}, that means the message have 2 follow messages. @var{Subject} is the @samp{Subject:} header field of the message. If the message have same @samp{Subject:} with the parent message, it is not displayed. Some mailing list puts its sequence number in the @samp{Subject:} field, but it is ignored. @code{wl-summary-no-subject-message} is displayed when the message has empty subject field. @subsection Temporary Marks @cindex Mark, Temporary There are seven temporary marks, @samp{*}, @samp{d}, @samp{D}, @samp{o}, @samp{O}, @samp{i} and @samp{~}. Temporary marks indicates message operations. @table @samp @item * Target mark. You can execute a command on the all messages that have @samp{*} mark, with the key bindings which begins with @kbd{m}. @item d The mark to dispose. You can put @samp{d} by typing @kbd{d} key. @item D The mark to force delete. You can put @samp{D} by typing @kbd{D} key. @item o The mark to refile. After you type @kbd{o} key, prompt appears to input refile destination. Your answer is printed in the summary line. @item O The mark to refile. You can put this mark by typing @kbd{O} key. The difference between this mark and refile mark is, this mark does not delete the message while latter does. @item i The mark to prefetch reserved. You can put this mark by typing @kbd{i} key. @item ~ The mark to resend reserved. After you type @kbd{~} key, prompt appears to input address to resend. Your answer is printed in the summary line. @end table @kbd{x} key executes action for temporary marks, respectively. @subsection Persistent Marks There are ten persistent marks, @samp{!}, @samp{N}, @samp{n}, @samp{U}, @samp{u}, @samp{A}, @samp{a}, @samp{F}, @samp{f} and @samp{$}. The persistent mark indicates the message's status and it is saved. Each persistent mark indicates: @table @samp @item N It is new message. @item n It is new message. It differs from @samp{N} that message with @samp{n} is already cached. @item U It is unread message. @item u It is unread message. It differs from @samp{U} that message with @samp{u} is already cached. @item ! It is message already read. It differs from message without mark that message with @samp{!} is not cached yet. @item A It is already replied message. @item a It is already replied message. It differs from @samp{A} that message with @samp{a} is already cached. @item F It is already forwarded message. @item f It is already forwarded message. It differs from @samp{F} that message with @samp{f} is already cached. @item $ It is a message with some global flag. It is convenient to put this mark on the messages to remember (If you want to remember to write a reply for the message, for example) because this mark remains after you exited Emacs. Messages with the @samp{$} mark can be reviewed in the @samp{'flag} folder even the message itself is deleted in the actual folder. You can put global flag by typing @kbd{$} or @kbd{F} key. @item None If the message is read and cached (or local message),there are no persistent mark. @end table @samp{N}, @samp{U}, @samp{!}, @samp{A}, @samp{F} indicates that the message have no cache. Messages with the marks other than these, you can read them in the offline status even they are in the IMAP folder or netnews folder. Among messages with persistent marks, ones with marks specified by @code{wl-summary-expire-reserve-marks} are excluded from the expiration (as a function of wanderlust) explained later. @xref{Expire and Archive}. @subsection How To Read Basically, you can read messages only typing space key again and again. To update summary status to the newest status (synchronize), type @kbd{s} key. You can jump to next unread message by typing @kbd{N} key, and @kbd{n} key moves cursor to the next message. Enter message buffer by typing @kbd{j} key. To operate multipart, you have to enter to the message buffer. @xref{Message}. @subsection Pack the Message Numbers You can pack the message numbers in Summary by @kbd{M-x wl-summary-pack-number}. Note that only MH Folder, News Spool Folder and Maildir Folder are supported folder types. @node Thread Operations, Cache, Usage of Summary Mode, Summary @section Thread Operations For example, the following line indicates one thread (a context of a topic). @example 384 09/17(Thu)01:32 [+1: Teranishi ] wl-0.6.2 @end example @noindent If you type @kbd{/} on this line, the thread is opened and it changes the appearance like following. @example @group 384 09/17(Thu)01:32 [ Teranishi ] wl-0.6.2 388 09/17(Thu)22:34 +-[ Murata san ] @end group @end example (Message 388 is the replied message to the message 384.) If you type @kbd{/} key once again, the thread is closed. With prefix argument, @kbd{/} opens all children threads. If you type @kbd{[}, opens all threads in summary. @kbd{]} closes all threads. Commands with the key binding that begins with @kbd{t} executes commands on the messages in the thread. @xref{Key Bindings of Summary}. @subsection reconstruct thread by hand You can reconstruct the thread manually. In Summary, @kbd{M-w} (@code{wl-summary-save-current-message}) at the corresponding message, and @kbd{C-y} (@code{wl-summary-yank-saved-message}) at the new parent message then you have the reconstructed thread. @node Cache, Auto Refile, Thread Operations, Summary @section Cache @subsection Cache File The messages which have to access via network (e.x. IMAP, NNTP folder) are cached as a local file so as to save network traffic or to enable off-line operation. The cache file is saved under the directory @file{~/.elmo/cache}. To expire cache, type @kbd{M-x elmo-cache-expire-by-size}. The command deletes cache files to the specified size by the order of last accessed time. @subsection Cache Filename @vindex elmo-msgid-to-cache-max-length @vindex elmo-msgid-to-cache-algorithm A filename of cache file is generated from Message-ID with minimal modification. But if Message-ID is very long, cache file can't be created. To avoid it, filename's length is kept constant by hash function when filename is longer than @code{elmo-msgid-to-cache-max-length}'s value. When the value of this variable is @code{nil}, this feature is disabled. An algorithm of hash is indicated by @code{elmo-msgid-to-cache-algorithm}. Changing the value of these variables, existing cache files may be unused. @subsection Buffer Cache and Prefetching The messages that are read are kept in the cache buffer so as to make the behavior fast when you are to read the message again. It is called `buffer cache'. The number of cache buffer is specified by @code{wl-message-buffer-cache-size}. There are message prefetching mechanism in the Wanderlust that prefetches next message while you are reading. You can control the message prefetching mechanism by these two variables. @table @code @item wl-message-buffer-prefetch-folder-type-list @vindex wl-message-buffer-prefetch-folder-type-list The initial setting is @code{'(imap4 nntp)}. If it is a list of folder types, it specifies the folder types in which message prefetching is enabled. In initial setting, messages are prefetch only in the nntp and imap4 folders. In this case, multi folder that contains localdir and imap4 prefetches only imap4 messages. This variable precedes the value of @code{wl-message-buffer-prefetch-folder-list}. To prefetch messages in all folder types, specify @code{t}. @item wl-message-buffer-prefetch-folder-list @vindex wl-message-buffer-prefetch-folder-list The initial setting is @code{nil}. A list of regexp of folders to enable message prefetching. @item wl-message-buffer-prefetch-depth @vindex wl-message-buffer-prefetch-depth The initial setting is 1. The number of messages for automatical prefetch. @item wl-message-buffer-prefetch-idle-time @vindex wl-message-buffer-prefetch-idle-time The initial setting is 1 (in seconds). The period of automatical prefetch. @item wl-message-buffer-prefetch-threshold @vindex wl-message-buffer-prefetch-threshold The initial setting is 30000 (bytes). If prefetching message has larger size than this value, Wanderlust does not prefetch automatically. If @code{wl-message-buffer-prefetch-threshold} is @code{nil}, the message is not checked for the size. @item wl-auto-prefetch-first @vindex wl-auto-prefetch-first The initial setting is @code{nil}. If non-nil, first message is automatically prefetched to the buffer when you enter the folder. @end table @node Auto Refile, Sticky Summary, Cache, Summary @section Auto Refile @vindex elmo-msgdb-extra-fields @vindex wl-refile-rule-alist @findex wl-summary-auto-refile You can refile messages automatically, by typing @kbd{C-o} (@code{wl-summary-auto-refile}). It decides destination of refile by the content of the message header information (information in the msgdb). By default, @samp{From:}, @samp{Subject:}, @samp{To:} and @samp{Cc:} is available. If you want to decide destination by other header fields, set the variable @code{elmo-msgdb-extra-fields} like following. @lisp @group (setq elmo-msgdb-extra-fields '("x-ml-name" "reply-to" "sender" "mailing-list" "newsgroups")) @end group @end lisp @noindent By this setting, Wanderlust saves extra fields in the msgdb. You have to type @kbd{s all} to get extra fields for the messages that are already in the summary. Then, specify the refile rule. The refile target folder of auto refiling is decided by the value of @code{wl-refile-rule-alist}. @code{wl-refile-rule-alist} is a list of a rule: @example @group (@var{field} (@var{regexp} . @var{target}) (@var{regexp} . @var{target}) @dots{}) @end group @end example Each rule means `if @var{field} value matches @var{regexp}, then refile to @var{target} folder'. The rule matched first is applied. @var{field} is a string of field name. You can specify a list of field name string, too. In this case, if one of these fields is matched, then the rule is fired (i.e. OR condition). @var{regexp} is a regular expression for field value. @var{target} is a target folder string. You can specify a rule at @var{target} part, too. In this case, If the field value of the rule and the current rule is matched, then the current rule is fired (i.e. AND condition). You can refer matched substring of @var{regexp} to specify @var{target} part. To refer substring, use following keys: @table @samp @item \& means substitute original matched text. @item \@var{N} means substitute what matched the @var{N}th `\(@dots{}\)'. (@var{N} is a number.) @end table Following is an example of @code{wl-refile-rule-alist}. @lisp @group (setq wl-refile-rule-alist '(("x-ml-name" ("^Wanderlust" . "+wl") ("^Elisp" . "+elisp")) (("To" "Cc") ("\\([a-z]+\\)@@gohome\\.org" . "+\\1")) ("From" ("me@@gohome\\.org" . ("To" ("you@@gohome\\.org" . "+from-me-to-you")))))) @end group @end lisp After these settings, refile marks are automatically put on the condition matched messages by typing @kbd{C-o} (@code{wl-summary-auto-refile}). Messages which have @code{wl-summary-auto-refile-skip-marks} is skipped auto refiling. By default, @samp{N}, @samp{U} and @samp{!} is specified, so the messages with these persistent marks are not automatically refiled. It means Wanderlust does not execute auto refile on unread messages by the default setting. To execute auto refile on all messages, set following. @lisp (setq wl-summary-auto-refile-skip-marks nil) @end lisp @node Sticky Summary, Summary View, Auto Refile, Summary @section Sticky Summary @cindex Summary, Sticky @cindex Sticky Summary The buffer of the `sticky summary' does not killed by typing @kbd{q}. By entering the summary by typing @kbd{Shift RET} in Folder mode or @kbd{G} in some summary sticky summary buffer is created. Also typing @kbd{M-S} (@code{wl-summary-stick}) on the normal summary makes current one sticky. The buffer name of the sticky summary becomes like @samp{Summary:@var{folder-name}}. You can visit the sticky summary at any time by @kbd{C-x b} (@code{switch-to-buffer}), or you can go round summary buffers by @kbd{C-c C-n} (@code{wl-summary-previous-buffer}) and @kbd{C-c C-p} (@code{wl-summary-next-buffer}) in summary mode. In sticky summary, the summary buffer is preserved after @kbd{g} or @kbd{q}. To delete sticky summary, type @kbd{C-u q} to exit or move to another summary by @kbd{C-u g}. Other operations in the sticky summary are same as normal summary. @code{wl-summary-always-sticky-folder-list} specifies the folders that are automatically stuck. @node Summary View, Mark and Action, Sticky Summary, Summary @section Format of summary lines @cindex Format of summary lines @vindex wl-summary-line-format @vindex wl-summary-line-format-spec-alist @vindex wl-folder-summary-line-format-alist @vindex wl-summary-default-number-column @vindex wl-summary-number-column-alist You can alter the format of lines in Summary mode. Summary line format is specified by @code{wl-summary-line-format}. You can use control strings defined by @code{wl-summary-line-format-spec-alist}. An example follows. @lisp @group ;; @r{number temporary-mark persistent-mark date branch} ;; @r{[ (number-of-children) sender ] subject} (setq wl-summary-line-format "%n%T%P%M/%D(%W) %t%[%17(%c %f%) %] %s") @end group @end lisp Where the number set the column number of the field. If negative value, the column is filled from right. If the number begins with @samp{0}, @samp{0} is used for filling columns instead of @samp{ }. Example: @example @group %5l -> `1 ' %-05l -> `00001' @end group @end example Major control strings defined by @code{wl-summary-line-format-spec-alist} are displayed in the following list. @example @group %n message number %T temporary mark %P persistent mark %Y year %M month %D day %W day of week %h hour %m minute %t branch of the thread %[ [ (< for re-connected child) %] ] (> for re-connected child) %f sender %s subject %S size %c +number-of-children: (display only for opened thread) %C [+number-of-children] (display only for opened thread) %# mailing list information (`(' ML-name [ ` ' ML-number ] `)') %l number in the mailing list %@@ `@@' only if the first MIME part is multipart/mixed %~ ` ' only if previous column is not empty @end group @end example If you want to change the width of message number (@samp{%n}), modify @code{wl-summary-default-number-column} or @code{wl-summary-number-column-alist}. The temporary mark (@samp{%T}) and persistent mark (@samp{%P}) must appear at the constant column. For example, if you specify @samp{%T} or @samp{%P} after the @samp{%t}, which changes its length by thread position, marks are not treated correctly. If the format string is enclosed by @samp{%number(} and @samp{%)}, the column of the enclosed region is justified to the `number'. Multiple level @samp{%number(} parenthesis can be defined. It is useful to justify the column of the multiple control strings. For example, in the above @code{wl-summary-line-format}, @example %17(%c %f%) @end example means ``Adjust number-of-children and sender string to the 17 column''. You can specify the format by each folders with @code{wl-folder-summary-line-format-alist}. Please set regular expression for folder names and summary line format as the following example. @lisp @group (setq wl-folder-summary-line-format-alist '(("^%" . "%T%P%M/%D(%W)%h:%m %t%[%17(%c %f%) %] %s") ("^+" . "%n%T%P%M/%D %[ %17f %] %t%C%s"))) @end group @end lisp @subsection on the format for sender name The format string @samp{%f} displays the return value of the function specified by @code{wl-summary-from-function}. If you use the function @code{wl-summary-default-from} (default), it displays sender name ordinarily, while displays the recipient names if the folder name matches with @code{wl-summary-showto-folder-regexp} and the sender is yourself. If the value of @code{wl-use-petname} is Non-nil, it uses petname to display. For example, to display recipient names for the message in @samp{+backup} if its sender is yourself, set up as follows. @lisp (setq wl-summary-showto-folder-regexp "^\\+backup$") @end lisp @node Mark and Action, Key Bindings of Summary, Summary View, Summary @section Temporary marks and their effect @cindex Mark and Action You can define temporary marks and corresponding procedure by @code{wl-summary-mark-action-list}. Initially, refile (@samp{o}), copy (@samp{O}), dispose (@samp{d}), delete (@samp{D}), prefetch (@samp{i}) and resend (@samp{~}) are defined. Each element of @code{wl-summary-mark-action-list} consists of @example (@samp{MARK} @samp{SYMBOL} @samp{ARGUMENT-FUNCTION} @samp{SET-MARK-FUNCTION} @samp{EXEC-FUNCTION} @samp{FACE} @samp{DOC-STRING}) @end example @samp{MARK} is a temporary mark string, and @samp{SYMBOL} is the name of the action to be defined. @samp{ARGUMENT-FUNCTION} is a function to generate argument to be given to @samp{SET-MARK-FUNCTION}, which will be described next, and it takes arguments: @example (@samp{ACTION} @samp{NUMBER}) @end example Where @samp{ACTION} equals to @samp{SYMBOL}, and @samp{NUMBER} is message number. @samp{SET-MARK-FUNCTION} is a function to be called when the mark is put. It takes arguments: @example (@samp{NUMBER} @samp{MARK} @samp{DATA}) @end example Where @samp{NUMBER} is target message number, @samp{MARK} is a temporary mark string, and @samp{DATA} is given by @samp{ARGUMENT-FUNCTION}. @samp{EXEC-FUNCTION} is a function to be called when the action is executed. Its argument is a list of @samp{MARK-INFO}. Here @samp{MARK-INFO} means a list consists of @example (@samp{NUMBER} @samp{MARK} @samp{DATA}) @end example @samp{FACE} is a face to be used for highlighting. @node Key Bindings of Summary, Variables of Summary, Mark and Action, Summary @section Key bindings @cindex Keybind, Summary Mode @cindex Keybind, Summary Buffer Key bindings of the summary mode are shown below. @table @kbd @item @key{SPC} @kindex @key{SPC} (Summary) @findex wl-summary-read Proceed reading a message at the current cursor point. (@code{wl-summary-read}) @item . @kindex . (Summary) @findex wl-summary-redisplay Redisplay a message at the current cursor point with default display type. If this command is called with prefix argument, reload and redisplay message regardless of the message cache. If this command is called with twice multiples @kbd{C-u} as @kbd{C-u C-u .}, reload and redisplay message with current display type regardless of the message cache. (@code{wl-summary-redisplay}) @item < @kindex < (Summary) @findex wl-summary-display-top Display the top message in the folder. (@code{wl-summary-display-top}) @item > @kindex > (Summary) @findex wl-summary-display-bottom Display the bottom message in the folder. (@code{wl-summary-display-bottom}) @item @key{BS} @itemx @key{DEL} @kindex @key{BS} (Summary) @kindex @key{DEL} (Summary) Display the previous page of the message at the current cursor point. @findex wl-summary-prev-page (@code{wl-summary-prev-page}) @item @key{RET} @kindex @key{RET} (Summary) @findex wl-summary-enter-handler Display the next line of the message at the current cursor point. Display the message at the current cursor point if it is not displayed yet. (@code{wl-summary-next-line-content}) If prefix argument is specified, message is scrolled up by one line. (@code{wl-summary-prev-line-content}) If prefix argument is numeric, cursor is jumped to the message with specified number. @item - @itemx M-@key{RET} @kindex - (Summary) @kindex M-@key{RET} (Summary) @findex wl-summary-prev-line-content Display the previous line of the message at the current cursor point. Display the message at the current cursor point if it is not displayed yet. (@code{wl-summary-prev-line-content}) @item / @kindex / (Summary) @findex wl-thread-open-close Toggle open or close the thread at the current cursor point. With prefix argument, open all children threads. (@code{wl-thread-open-close}) @item [ @kindex [ (Summary) Open all threads. @findex wl-thread-open-all (@code{wl-thread-open-all}) @item ] @kindex ] (Summary) Close all threads. @findex wl-thread-close-all (@code{wl-thread-close-all}) @item g @kindex g (Summary) @findex wl-summary-goto-folder Go to other folder. (@code{wl-summary-goto-folder}) @item c @kindex c (Summary) Mark all messages in the folder as read. @findex wl-summary-mark-as-read-all (@code{wl-summary-mark-as-read-all}) @item a @kindex a (Summary) @findex wl-summary-reply Prepare a draft for reply the message at the current cursor point. (@code{wl-summary-reply}) @item A @kindex A (Summary) @findex wl-summary-reply-with-citation Prepare a draft for reply the message at the current cursor point. (@code{wl-summary-reply-with-citation}) @item C @kindex C (Summary) @findex wl-summary-cancel-message If the message at current cursor point is your own netnews article, cancel it. (@code{wl-summary-cancel-message}) @item E @kindex E (Summary) @findex wl-summary-reedit Prepare a draft for re-editing the message at current cursor point. If the message at current cursor point is your own netnews article, a draft for `supersedes message' for the message is prepared. (@code{wl-summary-reedit}) @item M-E @kindex M-E (Summary) @findex wl-summary-resend-bounced-mail If the message at current cursor point is a bounced message, a draft for re-sending original message is prepared. (@code{wl-summary-resend-bounced-mail}) @item f @kindex f (Summary) @findex wl-summary-forward A draft for forwarding the message at current cursor point is prepared. (@code{wl-summary-forward}) @item $ @kindex $ (Summary) @findex wl-summary-mark-as-important Put @samp{important} flag on the message at current cursor point. If already flagged as @samp{important}, remove the flag. If it is called with prefix argument, ask global flag to put similarly to @kbd{F}. (@code{wl-summary-mark-as-important}) @item F @kindex F (Summary) @findex wl-summary-set-flags Put arbitrary global flag entered in the minibuffer. If you use Emacs 21 or later, you can specify multiple flags separated by @samp{,} simultaneously. If it is called with prefix argument, remove existent global flags. (@code{wl-summary-set-flags}) @item y @itemx e @kindex y (Summary) @kindex e (Summary) Save the message at current cursor point. @findex wl-summary-save (@code{wl-summary-save}) @item n @kindex n (Summary) @findex wl-summary-next Move cursor to the next message. If message is marked with a temporal mark in @code{wl-summary-skip-mark-list}, cursor is not moved to it. In the offline mode, cursor is not moved to the messages which are not cached yet. (@code{wl-summary-next}) @item p @kindex p (Summary) @findex wl-summary-prev Move cursor to the previous message. If message is marked with a temporal mark in @code{wl-summary-skip-mark-list}, cursor is not moved to it. In the offline mode, cursor is not moved to the messages which are not cached yet. (@code{wl-summary-prev}) @item N @kindex N (Summary) @findex wl-summary-down Move cursor to the downward message which is unread or marked as @samp{$}. In the offline mode, cursor is not moved to the messages which are not cached yet. If there are messages which have target mark @samp{*} in the summary, cursor is moved to the downward message which have a target mark. This behavior is changed according to the value of @code{wl-summary-move-order}. (@code{wl-summary-down}) @item P @kindex P (Summary) @findex wl-summary-up Move cursor to the upward message which is unread or marked as @samp{$}. In the offline mode, cursor is not moved to the messages which are not cached yet. If there are messages which have target mark @samp{*} in the summary, cursor is moved to the downward message which have a target mark. This behavior is changed according to the value of @code{wl-summary-move-order}. (@code{wl-summary-up}) @item w @kindex w (Summary) @findex wl-summary-write Prepare a new draft. (@code{wl-summary-write}) @item W @kindex W (Summary) @findex wl-summary-write-current-folder Prepare a new draft. If the current folder is NNTP folder, @samp{Newsgroups:} field is completed. If the current folder is mailing list folder (refile destination), guess @samp{To:} field and completed (If @code{wl-subscribed-mailing-list} is valid list) (@code{wl-summary-write-current-folder}) @item H @kindex H (Summary) @findex wl-summary-toggle-all-header Toggle display type between all and partial header fields and redisplay the message at current cursor point. If this command is called with prefix argument, reload and redisplay message regardless of the message cache. If this command is called with twice multiples @kbd{C-u} as @kbd{C-u C-u H}, set default display type of summary by current display type of header fields. (@code{wl-summary-toggle-all-header}) @item M @kindex M (Summary) @findex wl-summary-toggle-mime Toggle display type for MIME analysis and redisplay the message at current cursor point. A change is performed in the order set as @code{wl-summary-display-mime-mode-list}. If this command is called with numeric prefix argument, it switch directly as follows. @example @group 1: Enable MIME analysis. 2: Enable MIME analysis only for header fields. 3: Disable MIME analysis. @end group @end example If this command is called with twice multiples @kbd{C-u} as @kbd{C-u C-u M}, set default display type of summary by current display type of MIME analysis. (@code{wl-summary-toggle-mime}) @item C-c C-f @kindex C-c C-f (Summary) @findex wl-summary-toggle-header-narrowing Toggle header body narrowing of the message at current cursor point. (@code{wl-summary-toggle-header-narrowing}) @item B @kindex B (Summary) @findex wl-summary-burst If the message at current cursor point has encapsulates multiple messages using MIME, de-capsulate and extract them on the current folder. If it is invoked in non-writable folder or it is called with prefix argument, it asks the destination folder. (@code{wl-summary-burst}) @item @@ @kindex @@ (Summary) @findex wl-summary-edit-addresses Append/change/delete the message's sender information to the address book @file{~/.addresses} interactively. If this command is called with prefix argument, arbitrary address can be edited. (@code{wl-summary-edit-petname}) @item Z @kindex Z (Summary) @findex wl-status-update Sync up address book status with @file{~/.addresses}'s content. (@code{wl-status-update}) @item | @kindex | (Summary) @findex wl-summary-pipe-message Pipe current message's content to the external process. (@code{wl-summary-pipe-message}) @item # @kindex # (Summary) @findex wl-summary-print-message Print out current message's content. It uses @code{ps-print} module. If you don't use color printer, you might want to set @code{wl-ps-print-buffer-function} to @code{ps-print-buffer}. @lisp (setq wl-ps-print-buffer-function 'ps-print-buffer) @end lisp (@code{wl-summary-print-message}) @item q @kindex q (Summary) @findex wl-summary-exit Exit current folder. (@code{wl-summary-exit}) @item j @kindex j (Summary) @findex wl-summary-jump-to-current-message Jump cursor to the currently displayed message's window. (@code{wl-summary-jump-to-current-message}) @item J @kindex J (Summary) Jump cursor to the other message. @findex wl-summary-jump-to-msg (@code{wl-summary-jump-to-msg}) @item I @kindex I (Summary) Update summary status and prefetch all messages which have marks included in the @code{wl-summary-incorporate-marks}. @findex wl-summary-incorporate (@code{wl-summary-incorporate}) @item M-j @kindex M-j (Summary) @findex wl-summary-jump-to-msg-by-message-id Jump cursor to the message which have specified @samp{Message-Id:}. @item ^ @kindex ^ (Summary) Jump to parent message. @findex wl-summary-jump-to-parent-message (@code{wl-summary-jump-to-parent-message}) @item ! @kindex ! (Summary) @findex wl-summary-mark-as-unread Mark as unread the message at current cursor point. (@code{wl-summary-mark-as-unread}) @item s @kindex s (Summary) @findex wl-summary-sync Synchronize summary view after prompting the update range. You can specify one of the follows. @example @group all Discard present msgdb and retrieve all informations. Do not retrieve killed messages. all-entirely Discard present msgdb and retrieve all informations. Retrieve killed messages, too. update Update the difference between informations in present msgdb and in current folder instance. Do not retrieve killed messages. update-entirely Update the difference between informations in present msgdb and in current folder instance. Retrieve killed messages, too. rescan Redisplay summary by rescanning present msgdb. rescan-noscore Redisplay summary by rescanning present msgdb. Display messages killed by score, too. rescan-thread Redisplay summary by rescanning present msgdb. Reconstruct thread, too. cache-status Sync the all marks with the real status of cache. mark Update marks. no-sync Do nothing. first:NUM Move to the filter folder(partial filter). last:NUM Move to the filter folder(partial filter). @end group @end example @noindent (@code{wl-summary-sync}) @item S @kindex S (Summary) @findex wl-summary-sort Sort summary order. You can sort by @samp{date}, @samp{from}, @samp{number}, @samp{subject}, @samp{size} and @samp{list-info}. With prefix argument, sort summary lines into reverse order. (@code{wl-summary-sort}) @item T @kindex T (Summary) @findex wl-summary-toggle-thread Toggle the threading. The state will be preserved after exiting Wanderlust. You can alter default state for newly created summary by @code{wl-summary-default-view} or @code{wl-summary-default-view-alist}. Threading status is displayed on the modeline. @samp{@{S@}} means threading is off (Sequence) and @samp{@{T@}} means threading is on (Thread). (@code{wl-summary-toggle-thread}) @item l @kindex l (Summary) @findex wl-summary-toggle-disp-folder Toggle displaying of folder window. (@code{wl-summary-toggle-disp-folder}) @item v @kindex v (Summary) Toggle displaying of message window. @findex wl-summary-toggle-disp-msg (@code{wl-summary-toggle-disp-msg}) @item V @kindex V (Summary) Move to the virtual folder (filter folder) with the condition specified. If called with prefix argument and current folder is virtual, exit it. @findex wl-summary-virtual (@code{wl-summary-virtual}) @item @key{TAB} @kindex @key{TAB} (Summary) @findex wl-summary-goto-last-displayed-msg Jump to the message which is displayed last. (@code{wl-summary-goto-last-displayed-msg}) @item ? @kindex ? (Summary) Put @samp{*} mark on the messages that satisfies the specified condition. If messages already have @samp{*} mark, new @samp{*} marks are overridden. If prefix argument is specified, current @samp{*} marks are removed and new @samp{*} marks are appended. @findex wl-summary-pick (@code{wl-summary-pick}) @item R @kindex R (Summary) @findex wl-summary-mark-as-read Mark as read the message at the current cursor point. (@code{wl-summary-mark-as-read}) @item x @kindex x (Summary) Execute action for all temporary marks in the summary buffer. @findex wl-summary-exec (@code{wl-summary-exec}) @item * @kindex * (Summary) @findex wl-summary-target-mark-line Put target mark on the message at the current cursor point. (@code{wl-summary-target-mark-line}) @xref{Mark and Action}. @item o @kindex o (Summary) Put refile mark on the message at the current cursor point. @findex wl-summary-refile (@code{wl-summary-refile}) @xref{Mark and Action}. @item C-o @kindex C-o (Summary) Execute auto refile. @findex wl-summary-auto-refile (@code{wl-summary-auto-refile}) @item O @kindex O (Summary) Put copy mark on the message at the current cursor point. @findex wl-summary-copy (@code{wl-summary-copy}) @xref{Mark and Action}. @item M-o @kindex M-o (Summary) Put refile mark on the message at the current cursor point with the destination previously specified. @findex wl-summary-refile-prev-destination (@code{wl-summary-refile-prev-destination}) @item d @kindex d (Summary) @findex wl-summary-dispose Put disposal mark on the message at the current cursor point. The result of disposal is controlled by @code{wl-dispose-folder-alist}, refiled to @code{wl-trash-folder} by default. (@code{wl-summary-dispose}) @xref{Mark and Action}. @item D @kindex D (Summary) @findex wl-summary-delete Put force deletion mark on the message at the current cursor point. (@code{wl-summary-delete}) @xref{Mark and Action}. @item i @kindex i (Summary) Put prefetch reservation mark on the message at the current cursor point. @findex wl-summary-prefetch (@code{wl-summary-prefetch}) @xref{Mark and Action}. @item ~ @kindex ~ (Summary) @findex wl-summary-resend Put resend reservation mark on the message at the current cursor point. (@code{wl-summary-resend}) @xref{Mark and Action}. @item u @kindex u (Summary) @findex wl-summary-unmark Unmark the temporal mark on the message at the current cursor point. (@code{wl-summary-unmark}) @item U @kindex U (Summary) Unmark all the temporal marks. @findex wl-summary-unmark-all (@code{wl-summary-unmark-all}) @item r R @kindex r R (Summary) @findex wl-summary-mark-as-read-region Mark as read messages in the specified region. (@code{wl-summary-mark-as-read-region}) @item r $ @kindex r $ (Summary) @findex wl-summary-mark-as-important-region Put @samp{important} flag on messages in the specified region. If already flagged as @samp{important}, remove the flag. (@code{wl-summary-mark-as-important-region}) @item r F @kindex r F (Summary) @findex wl-summary-set-flags-region Put arbitrary global flag entered in the minibuffer on messages in specified region. (@code{wl-summary-set-flags-region}) @item r ! @kindex r ! (Summary) @findex wl-summary-mark-as-unread-region Mark as unread messages in the specified region. (@code{wl-summary-mark-as-unread-region}) @item r x @kindex r x (Summary) @findex wl-summary-exec-region Execute action for each temporary marks on the messages in the specified region. (@code{wl-summary-exec-region}) @item r * @kindex r * (Summary) @findex wl-summary-target-mark-region Put target mark on the messages in the specified region. (@code{wl-summary-target-mark-region}) @xref{Mark and Action}. @item r o @kindex r o (Summary) @findex wl-summary-refile-region Put refile mark on the messages in the specified region. (@code{wl-summary-refile-region}) @xref{Mark and Action}. @item r O @kindex r O (Summary) @findex wl-summary-copy-region Put copy mark on the messages in the specified region. (@code{wl-summary-copy-region}) @xref{Mark and Action}. @item r d @kindex r d (Summary) @findex wl-summary-dispose-region Put disposal mark on the messages in the specified region. (@code{wl-summary-dispose-region}) @xref{Mark and Action}. @item r D @kindex r D (Summary) @findex wl-summary-delete-region Put force deletion mark on the messages in the specified region. (@code{wl-summary-delete-region}) @xref{Mark and Action}. @item r i @kindex r i (Summary) @findex wl-summary-prefetch-region Put prefetch reservation mark on messages in the specified region. (@code{wl-summary-prefetch-region}) @xref{Mark and Action}. @item r u @kindex r u (Summary) @findex wl-summary-unmark-region Delete temporal mark on the messages in the specified region. (@code{wl-summary-unmark-region}) @item r y @kindex r y (Summary) Save messages in the specified region. @findex wl-summary-save-region (@code{wl-summary-save-region}) @item t R @kindex t R (Summary) @findex wl-thread-mark-as-read Mark as read messages which are the descendant of the current thread. With prefix argument, it affects on the all messages in the thread tree. (@code{wl-thread-mark-as-read}) @item t $ @kindex t $ (Summary) @findex wl-thread-mark-as-important Put @samp{important} flag on the messages which are the descendant of the current thread. If already flagged as @samp{important}, remove the flag. With prefix argument, it affects on the all messages in the thread tree. (@code{wl-thread-mark-as-important}) @item t F @kindex t F (Summary) @findex wl-thread-set-flags Put arbitrary global flag entered in the minibuffer on the messages which are the descendant of the current thread. With prefix argument, it affects on the all messages in the thread tree. (@code{wl-thread-set-flags}) @item t ! @kindex t ! (Summary) @findex wl-thread-mark-as-unread Mark as unread messages which are the descendant of the current thread. With prefix argument, it affects on the all messages in the thread tree. (@code{wl-thread-mark-as-unread}) @item t x @kindex t x (Summary) @findex wl-thread-exec Execute action for temporary marks on the messages which are the descendant of the current thread. With prefix argument, it affects on the all messages in the thread tree. (@code{wl-thread-exec}) @item t * @kindex t * (Summary) @findex wl-thread-target-mark Put target mark @samp{*} on the messages which are the descendant of the current thread. With prefix argument, it affects on the all messages in the thread tree. (@code{wl-thread-target-mark}) @xref{Mark and Action}. @item t o @kindex t o (Summary) @findex wl-thread-refile Put refile mark on the messages which are the descendant of the current thread. With prefix argument, it affects on the all messages in the thread tree. (@code{wl-thread-refile}) @xref{Mark and Action}. @item t O @kindex t O (Summary) @findex wl-thread-copy Put copy mark on the messages which are the descendant of the current thread. With prefix argument, it affects on the all messages in the thread tree. (@code{wl-thread-copy}) @xref{Mark and Action}. @item t d @kindex t d (Summary) @findex wl-thread-dispose Put disposal mark on the messages which are the descendant of the current thread. With prefix argument, it affects on the all messages in the thread tree. (@code{wl-thread-dispose}) @xref{Mark and Action}. @item t D @kindex t D (Summary) @findex wl-thread-delete Put force deletion mark on the messages which are the descendant of the current thread. (@code{wl-thread-delete}) @xref{Mark and Action}. @item t i @kindex t i (Summary) @findex wl-thread-prefetch Put prefetch reservation mark on messages which are the descendant of the current thread. (@code{wl-thread-prefetch}) @xref{Mark and Action}. @item t u @kindex t u (Summary) @findex wl-thread-unmark Unmark temporal mark on the messages which are the descendant of the current thread. With prefix argument, it affects on the all messages in the thread tree. (@code{wl-thread-unmark}) @item t y @kindex t y (Summary) @findex wl-thread-save Save messages which are the descendant of the current thread. With prefix argument, it affects on the all messages in the thread tree. (@code{wl-thread-save}) @item m R @kindex m R (Summary) @findex wl-summary-target-mark-mark-as-read Mark as read all messages which have target mark @samp{*}. (@code{wl-summary-target-mark-mark-as-read}) @item m $ @kindex m $ (Summary) @findex wl-summary-target-mark-mark-as-important Put @samp{important} flag on all messages which have target mark @samp{*}. If already flagged as @samp{important}, remove the flag. (@code{wl-summary-target-mark-mark-as-important}) @item m F @kindex m F (Summary) @findex wl-summary-target-mark-set-flags Put arbitrary global flag entered in the minibuffer on all messages which have target mark @samp{*}. (@code{wl-summary-target-mark-set-flags}) @item m ! @kindex m ! (Summary) @findex wl-summary-target-mark-mark-as-unread Mark as unread all messages which have target mark @samp{*}. (@code{wl-summary-target-mark-mark-as-unread}) @item m o @kindex m o (Summary) @findex wl-summary-target-mark-refile Put refile mark on the messages which have target mark @samp{*}. (@code{wl-summary-target-mark-refile}) @xref{Mark and Action}. @item m O @kindex m O (Summary) @findex wl-summary-target-mark-copy Put copy mark on the messages which have target mark @samp{*}. (@code{wl-summary-target-mark-copy}) @xref{Mark and Action}. @item m d @kindex m d (Summary) @findex wl-summary-target-mark-dispose Put disposal mark on the messages which have target mark @samp{*}. (@code{wl-summary-target-mark-dispose}) @xref{Mark and Action}. @item m D @kindex m D (Summary) @findex wl-summary-target-mark-delete Put force deletion mark on the messages which have target mark @samp{*}. (@code{wl-summary-target-mark-delete}) @xref{Mark and Action}. @item m i @kindex m i (Summary) @findex wl-summary-target-mark-prefetch Put prefetch reservation mark on messages which have target mark @samp{*}. (@code{wl-summary-target-mark-prefetch}) @xref{Mark and Action}. @item m y @kindex m y (Summary) @findex wl-summary-target-mark-save Save messages which have target mark @samp{*}. (@code{wl-summary-target-mark-save}) @item m u @kindex m u (Summary) Unmark all temporal marks. (@code{wl-summary-delete-all-temp-marks}) @findex wl-summary-delete-all-temp-marks @item m a @kindex m a (Summary) Put target mark @samp{*} on the all messages. (@code{wl-summary-target-mark-all}) @findex wl-summary-target-mark-all @item m t @kindex m t (Summary) Put target mark @samp{*} on the messages in the current thread. @findex wl-summary-target-mark-thread (@code{wl-summary-target-mark-thread}) @item m T @kindex m T (Summary) Put target mark @samp{*} on all the messages of the threads which contain already target marked message. @findex wl-summary-target-mark-threads (@code{wl-summary-target-mark-threads}) @item m r @kindex m r (Summary) @findex wl-summary-target-mark-region Put target mark @samp{*} on the messages in the specified region. (@code{wl-summary-target-mark-region}) @item m A @kindex m A (Summary) @findex wl-summary-target-mark-reply-with-citation Prepare a draft which cites all messages which have target mark @samp{*}. (@code{wl-summary-target-mark-reply-with-citation}) @item m f @kindex m f (Summary) @findex wl-summary-target-mark-forward Prepare a draft which forwards all messages which have target mark @samp{*}. (@code{wl-summary-target-mark-forward}) @item m U @kindex m U (Summary) @findex wl-summary-target-mark-uudecode Uudecode the messages which have target mark @samp{*}. (@code{wl-summary-target-mark-uudecode}) @item m ? @kindex m ? (Summary) @findex wl-summary-target-mark-pick Pick messages from the @samp{*} marked messages. That is, @samp{*} marks on the messages are remained if the specified condition is satisfied. (@code{wl-summary-target-mark-pick}) @item m # @kindex m # (Summary) @findex wl-summary-target-mark-print Print out all messages which have target mark @samp{*}. (@code{wl-summary-target-mark-print}) @item m | @kindex m | (Summary) @findex wl-summary-target-mark-pipe Pipe content of each message with target mark @samp{*} to some specified external process. (@code{wl-summary-target-mark-pipe}) @item M-t @kindex M-t (Summary) @findex wl-toggle-plugged Toggle offline/online status of Wanderlust. (@code{wl-toggle-plugged}) @item C-t @kindex C-t (Summary) Start Wanderlust's plug-status manager. (@code{wl-plugged-change}) @item C-c C-o @kindex C-c C-o (Summary) @findex wl-jump-to-draft-buffer Move to the draft buffer if available. If multiple draft buffer exists, moved to one after another. If prefix argument is specified, load draft folder's message to the draft buffer and jump to it. (@code{wl-jump-to-draft-buffer}) @item M-w @kindex M-w (Summary) @findex wl-summary-save-current-message Save the message at the current cursor point. (@code{wl-summary-save-current-message}) @item C-y @kindex C-y (Summary) @findex wl-summary-yank-saved-message Regard the message at the current cursor point as parent, connect the message saved by @code{wl-summary-save-current-message} to the thread. (@code{wl-summary-yank-saved-message}) @item C-x C-s @kindex C-x C-s (Summary) @findex wl-summary-save-status Save the current summary. (@code{wl-summary-save-status}) @end table @node Variables of Summary, , Key Bindings of Summary, Summary @section Customiziable variables @table @code @item wl-summary-move-order @vindex wl-summary-move-order The initial setting is @code{unread}. Specify cursor moving policy. If you want to precede new messages, set @code{new}. If you want to precede unread messages, set @code{unread}. If @code{nil}, proceed to next message. @item wl-auto-select-first @vindex wl-auto-select-first The initial setting is @code{nil}. If non-nil, first message is automatically displayed when you enter the folder. @item wl-auto-select-next @vindex wl-auto-select-next The initial setting is @code{nil}. This controls behavior when there is no unread message in current summary. @example nil: asks whether you want to go back to folder mode 'unread: asks whether you want to go to next unread folder If the next one comes to be possessing no unread message by treatment of cross-posted messages or Scoring, then asks whether you want to go to next to next folder. 'skip-no-unread: similar as unread But does not ask before going to next to next folder. otherwise: asks whether you want to go to next unread folder @end example It might be useful to set @code{'skip-no-unread} for people who want to continue reading by just pressing and pressing space key. @item wl-thread-insert-opened @vindex wl-thread-insert-opened The initial setting is @code{nil}. If non-nil, thread is inserted as opened. @item wl-thread-open-reading-thread @vindex wl-thread-open-reading-thread The initial setting is @code{t}. If non-nil, reading thread is automatically opened though it is closed thread. @item wl-summary-exit-next-move @vindex wl-summary-exit-next-move The initial setting is @code{t}. If non-nil, move to next folder at summary exit. @item wl-folder-move-cur-folder @vindex wl-folder-move-cur-folder The initial setting is @code{nil}. If non-nil, cursor position on the folder is moved. @item wl-summary-weekday-name-lang @vindex wl-summary-weekday-name-lang Specify language of the weekday. @samp{en} displays English, @samp{fr} displays French, @samp{de} displays Deutsch. You should rescan summary view after changing this value. @item wl-summary-fix-timezone @vindex wl-summary-fix-timezone The initial setting is @code{nil}. Time zone of the date string in summary mode is adjusted using this value. If @code{nil}, it is adjust to the default time zone information (system's default time zone or environment variable @samp{TZ}). @item wl-use-petname @vindex wl-use-petname The initial setting is @code{t}. If non-nil, sender part displays nickname. @item wl-break-pages @vindex wl-break-pages The initial setting is @code{t}. If non-nil, message is split as pages by @samp{^L}. @item wl-summary-from-function @vindex wl-summary-from-function Format function to display sender in summary. The initial setting is @code{wl-summary-default-from}. @item wl-summary-no-from-message @vindex wl-summary-no-from-message The initial setting is @samp{nobody@@nowhere?}. A string which is displayed when there's no @samp{From:} field in the message. @item wl-summary-subject-function @vindex wl-summary-subject-function Format function to display subject in summary. The initial setting is @code{wl-summary-default-subject} and it will cut the list name part etc. on the top of the subject. To display subject as it is, set as follows. @lisp (setq wl-summary-subject-function 'identity) @end lisp @item wl-summary-no-subject-message @vindex wl-summary-no-subject-message The initial setting is @samp{(WL:No Subject in original.)}. A string which is displayed when there's no @samp{Subject:} field in the message. @item wl-summary-default-view @vindex wl-summary-default-view The initial setting is @code{'thread}. The default state for newly created summary. You can set either @code{'thread} for thread view or @code{'sequence} for sequential view. @item wl-summary-order @vindex wl-summary-order The initial setting is @code{'ascending}. Specify order of messages in summary buffer. Note that messages in a thread are always listed in ascending order even if this value is @code{'descending}. @item wl-summary-nobreak-char-display @vindex wl-summary-nobreak-char-display The initial setting is @code{nil}. @code{nobreak-char-display} is overridden by this value in Summary buffer. @item wl-summary-use-frame @vindex wl-summary-use-frame The initial setting is @code{nil}. If non-nil, use new frame for the summary. @item wl-use-folder-petname @vindex wl-use-folder-petname The initial setting is the list shown below: @lisp @group (modeline) @end group @end lisp @noindent A list of display policy (symbol) of folder nickname. Available symbols are: @table @code @item modeline Display folder petname on modeline. @item ask-folder Destination folder is notified as nickname if @code{wl-auto-select-next} is non-nil. @item read-folder You can input folder name by nickname in the function @code{wl-summary-read-folder}. @end table @item wl-summary-move-direction-toggle @vindex wl-summary-move-direction-toggle The initial setting is @code{t}. If non-nil, last executed @kbd{p}, @kbd{P}, @kbd{n}, @kbd{N} toggles the direction of cursor move. If you want to aware of reading direction, set this to @code{t}. @item wl-summary-width @vindex wl-summary-width The initial setting is 80. Width of summary line. If @code{nil}, summary line's width is as is. @item wl-summary-print-argument-within-window @vindex wl-summary-print-argument-within-window The initial setting is @code{nil}. If non-nil, the action argument is always printed on right side of window. @item wl-summary-indent-length-limit @vindex wl-summary-indent-length-limit The initial setting is 46. Specify the limit of thread indent level. @code{nil} means unlimited indent level. If you set this to @code{nil} you should set @code{wl-summary-width} to @code{nil}, too. @item wl-summary-max-thread-depth @vindex wl-summary-max-thread-depth The initial setting is 15. If thread depth of the message is larger than this value, the thread is divided. @item wl-summary-recenter @vindex wl-summary-recenter The initial setting is t. If non-nil, cursor point is moved to the center of the summary window. @item wl-summary-max-thread-depth @vindex wl-summary-max-thread-depth The initial setting is 30. If thread depth is larger than this value, divide it. @item wl-summary-divide-thread-when-subject-changed @vindex wl-summary-divide-thread-when-subject-changed The initial setting is @code{nil}. If non-nil, thread is split if the subject is changed. @item wl-summary-search-via-nntp @vindex wl-summary-search-via-nntp The initial setting is @code{confirm}. If non-nil and @code{wl-summary-jump-to-msg-by-message-id} failed, call @code{wl-summary-jump-to-msg-by-message-id-via-nntp} and search message from the NNTP server @code{elmo-nntp-default-server}. The value of @code{elmo-nntp-default-user}, @code{elmo-nntp-default-port}, @code{elmo-nntp-default-stream-type} are used. If @code{confirm}, server name can be specified. You can specify NNTP folder format like @samp{-:username@@servername:119!}. @item wl-summary-keep-cursor-command @vindex wl-summary-keep-cursor-command The initial setting is the list shown below: @lisp @group (wl-summary-goto-folder wl-summary-goto-last-visited-folder) @end group @end lisp @noindent When you entered to summary by these commands and the target summary buffer already exists, summary status is not automatically updated and cursor position is saved. @item elmo-folder-update-threshold @vindex elmo-folder-update-threshold The initial setting is 500. If updated message number is larger than this value, confirm whether drop them or not (in the case where the value of @code{elmo-folder-update-confirm} is non-nil). @item elmo-folder-update-confirm @vindex elmo-folder-update-confirm The initial setting is @code{t}. If the value is non-nil, do check with @code{elmo-folder-update-threshold}. @item wl-summary-always-sticky-folder-list @vindex wl-summary-always-sticky-folder-list The initial setting is @code{nil}. @code{wl-summary-always-sticky-folder-list} specifies the folders that are automatically stuck. Each element is regexp of folder name. @item wl-summary-reserve-mark-list @vindex wl-summary-reserve-mark-list The initial setting is the list shown below: @lisp @group ("o" "O" "D" "d" "i") @end group @end lisp @noindent If a message is already marked as temporal marks in this list, the message is not marked by any mark command. @item wl-summary-skip-mark-list @vindex wl-summary-skip-mark-list The initial setting is the list shown below: @lisp @group ("D" "d") @end group @end lisp @noindent If a message is already marked as temporal marks in this list, the message is skipped at cursor move. @item elmo-message-fetch-threshold @vindex elmo-message-fetch-threshold The initial setting is 30000 (bytes). If displaying message has larger size than this value, Wanderlust confirms whether fetch the message or not (in the case where the value of @code{elmo-message-fetch-confirm} is non-nil). @item elmo-message-fetch-confirm @vindex elmo-message-fetch-confirm The initial setting is @code{t}. If the value is non-nil, do check with @code{elmo-message-fetch-threshold}. @item wl-prefetch-threshold @vindex wl-prefetch-threshold The initial setting is 30000 (bytes). If prefetching message has larger size than this value and @code{wl-prefetch-confirm} is non-nil, Wanderlust confirms whether prefetch the message or not. If @code{wl-prefetch-threshold} is @code{nil}, the message is prefetched without confirmation. @item wl-prefetch-confirm @vindex wl-prefetch-confirm The initial setting is @code{t}. If non-nil, Wanderlust confirms whether prefetch the message or not if the message has larger size than @code{wl-prefetch-threshold}. @item elmo-imap4-use-cache @vindex elmo-imap4-use-cache The initial setting is @code{t}. If non-nil, messages read via IMAP4 are cached. @item elmo-nntp-use-cache @vindex elmo-nntp-use-cache The initial setting is @code{t}. If non-nil, messages read via NNTP are cached. @item elmo-pop3-use-cache @vindex elmo-pop3-use-cache The initial setting is @code{t}. If non-nil, messages read via POP3 are cached. @item elmo-shimbun-use-cache @vindex elmo-shimbun-use-cache The initial setting is @code{t}. If non-nil, messages read in Shimbun folders are cached. @item wl-summary-resend-use-cache @vindex wl-summary-resend-use-cache The initial setting is @code{nil}. If non-nil, messages are resend using cache even in the offline status. Note that if you use cache, the message identity is not guaranteed. @item wl-folder-process-duplicates-alist @vindex wl-folder-process-duplicates-alist The initial setting is @code{nil}. This list determines how to deal with duplicated messages in the same folder. Each item in the list is regexp of folder name and action; you can specify any one of the following in the place of action: @example @code{nil} : do nothing for duplicated messages. @code{hide} : hide duplicated messages from the summary. @code{read} : set duplicated messages as read. @end example @noindent Following is an example (hide duplicated messages in multi folders) @lisp @group (setq wl-folder-process-duplicates-alist '(("^\\+draft$" . nil) ("^\\+trash$" . nil) ("^\\*.*" . hide) (".*" . read))) @end group @end lisp @item wl-summary-flag-alist @vindex wl-summary-flag-alist The initial setting is as follows: @lisp @group ((important "orange")) @end group @end lisp Specify the color and the mark of message in summary buffer with flag. If the mark are omitted, the mark specified in the variable @code{wl-summary-flag-mark} is assumed. If multiple global flags are on one message, the former flag in this list is preferred. Example: @lisp @group (setq wl-summary-flag-alist '((important "purple") (todo "red") (business "green" "B") (private "blue" "X"))) @end group @end lisp @item wl-summary-display-mime-mode-list @vindex wl-summary-display-mime-mode-list The initial setting is the list shown below: @lisp @group (mime as-is) @end group @end lisp @noindent The function @code{wl-summary-toggle-mime} switch specification of MIME analysis in the order of this list. You can specify one of the follows. @example @code{mime} : Header and body are decoded. @code{header-only} : Only header is decoded. @code{as-is} : Header and body are not decoded. @end example @end table @node Message, Draft, Summary, Top @chapter Message Buffer Message Buffers utilize MIME-View mode of SEMI. For operational procedures and key bindings, refer to respective documents. @xref{MIME-View, , ,mime-ui-en, a MIME user interface for GNU Emacs}. You can also see help by @kbd{?} in message buffer. @kbd{p} at the top of a message or @kbd{n} at the bottom of a message brings you back to Summary mode. @kbd{l} toggles display of Summary mode buffer. @section Key Bindings @table @kbd @item l @kindex l (Message) @findex wl-message-toggle-disp-summary Toggles display of Summary buffer. (@code{wl-message-toggle-disp-summary}) @item Button-2 @findex wl-message-refer-article-or-url @kindex Button-2 (Message) Assumes @samp{Message-ID:} at the mouse pointer, and shows the corresponding message if found. (@code{wl-message-refer-article-or-url}) @item Button-4 (upward movement of a wheel) @kindex Button-4 (Message) @findex wl-message-wheel-down Scrolls the message backwards. When the top of the message is hit, moves to the previous message. (@code{wl-message-wheel-down}) @item Button-5 (downward movement of a wheel) @kindex Button-5 (Message) @findex wl-message-wheel-up Scrolls the message forward. When the bottom of the message is hit, moves to the next message. (@code{wl-message-wheel-up}) @item D @kindex D (Message) @findex wl-message-delete-current-part Delete the part under cursor. In fact it appends modified message to the current folder then moves old one to trash folder. Therefore the message number will be changed. (@code{wl-message-delete-current-part}) @end table @section Customizable Variables @table @code @item wl-message-window-size @vindex wl-message-window-size Initial setting is @code{(1 . 4)}. It is a cons cell and the ratio of its car and cdr value corresponds to the ratio of Summary and Message windows. @item wl-message-ignored-field-list @vindex wl-message-ignored-field-list Initial setting is @code{nil}. All fields that match this list will be hidden in message buffer. Each elements are regexp of field-name. If @code{nil}, the value of @code{mime-view-ignored-field-list} is used. @item wl-message-visible-field-list @vindex wl-message-visible-field-list Initial setting is @code{nil}. All fields that match this list will be display in message buffer. Each elements are regexp of field-name. This value precedes @code{wl-message-ignored-field-list}. If @code{nil}, the value of @code{mime-view-visible-field-list} is used. @item wl-message-sort-field-list @vindex wl-message-sort-field-list Initial setting is '("Return-Path" "Received" "^To" "^Cc" "Newsgroups" "Subject" "^From"). Header fields in message buffer are ordered by this value. Each elements are regexp of field-name. @item wl-message-truncate-lines @vindex wl-message-truncate-lines The initial value is the value of @code{default-truncate-lines}. If it is non-nil, truncate long lines in message buffer. @item wl-message-auto-reassemble-message/partial @vindex wl-message-auto-reassemble-message/partial The initial setting is @code{nil}. If non-nil, automatically reassemble fragments of the message on displaying when its MIME media type is message/partial. @end table @node Draft, Disconnected Operations, Message, Top @chapter Draft Buffer At Summary mode, pressing @kbd{w} and the like creates a new draft buffer. You can edit and send mail and news articles in this buffer. By pressing @kbd{W}, Wanderlust guess addressees and prepare draft buffer with those if possible. @menu * Usage of Draft Mode:: TIPS * Key Bindings of Draft:: Key bindings * Variables of Draft Mode:: Customize Draft Mode @end menu @node Usage of Draft Mode, Key Bindings of Draft, Draft, Draft @section Tips Basically it is Emacs-standard mail mode. @menu * Parameters for Sending:: * Editing Header:: * Editing Message Body and Sending:: * Dynamical Message Re-arrangement:: * Template:: * POP-before-SMTP:: @end menu @node Parameters for Sending, Editing Header, Usage of Draft Mode, Usage of Draft Mode @subsection Parameters for Sending According to the information of servers to send messages, configure following variables. @table @code @item wl-smtp-posting-server The name of the SMTP server used for mail transmission. @item wl-smtp-posting-port The SMTP port number for mail transmission. Without configuration, use default SMTP port number (25). @item wl-nntp-posting-server The name of NNTP server used for news submission. Without configuration, use @code{elmo-nntp-default-server}. @item wl-nntp-posting-port The NNTP port number for news submission. Without configuration, use @code{elmo-nntp-default-port}. @end table You may configure following variables on demand. See section Variables of Draft Mode for detail @xref{Variables of Draft Mode}. @table @code @item wl-smtp-posting-user User name for authentication by SMTP AUTH. @item wl-smtp-authenticate-type The authentication method for SMTP AUTH. Without configuration, authentication will not be carried out. @item wl-smtp-authenticate-realm The authentication realm for SMTP AUTH. Without configuration, authentication realm will not be specified. @item wl-smtp-connection-type Specify how to establish SMTP connections. @item wl-nntp-posting-user User name for AUTHINFO authentication on news submission. @item wl-nntp-posting-stream-type Specify how to establish NNTP connections. @end table @node Editing Header, Editing Message Body and Sending, Parameters for Sending, Usage of Draft Mode @subsection Editing Message Header You can freely edit header region above @samp{--text follows this line--}, until you invoke the sending operation. Initially, the cursor is at the @samp{To:} field. Fill in recipients addresses. @kbd{@key{TAB}} completes them. You can use following headers to specify recipients. Add some of them by yourself. Field names can be completed by @kbd{@key{TAB}}. @table @asis @item @samp{Newsgroups:} Specify newsgroups to which you post the news article. @item @samp{Cc:} Specify addresses to send a copy (Carbon Copy) of the message. @end table Following ones are removed from the header contents before sending. @table @asis @item @samp{Bcc:} Specify addresses to send a copy (Blind Carbon Copy) of the message. @item @samp{Fcc:} Specify folders in which a copy of the message is saved. @item @samp{Ecc:} Specify recipients to send encapsulated copy of the message. @end table You can add initial headers by following variables. @table @code @item wl-fcc @vindex wl-fcc The initial setting is @code{nil}. If non-nil, the value of this variable is inserted as a @samp{Fcc:} of the draft when it is prepared. If function is specified, its return value is used. @item wl-bcc @vindex wl-bcc The initial setting is @code{nil}. If non-nil, the value of this variable is inserted as a @samp{Bcc:} of the draft when it is prepared. @end table @node Editing Message Body and Sending, Dynamical Message Re-arrangement, Editing Header, Usage of Draft Mode @subsection Editing Messages and Sending As a matter of course, editing message body can be performed in the same way as usual writing. You may write message body under @samp{--text follows this line--} line. (NOTE: Be sure to leave the line @samp{--text follows this line--} intact.) Multi-part editing utilize MIME edit mode of SEMI. For procedures of editing, refer to respective documents. @xref{MIME-Edit, , ,mime-ui-en, a MIME user interface for GNU Emacs}. You can also see help by @kbd{C-c C-x ?} in draft buffer. If you save the draft buffer you are editing, it is appended to the draft folder specified by @code{wl-draft-folder}. You can leave draft buffer after storing it for future editing by @kbd{C-c C-z} (@code{wl-draft-save-and-exit}) and resume editing by pressing @kbd{E} (@code{wl-summary-reedit}) in the draft folder (@pxref{Key Bindings of Summary}). If you have finished editing, you can send message by @kbd{C-c C-c}. @node Dynamical Message Re-arrangement, Template, Editing Message Body and Sending, Usage of Draft Mode @subsection Dynamic Modification of Messages @vindex wl-draft-config-alist @c @cindex Change Message @c @cindex Message, Change Dynamic You can set @code{wl-draft-config-alist} so that header and body of the message will automatically modified depending on information of header and others. The initial setting of @code{wl-draft-config-alist} is @code{nil}. In the example below, the header is modified when @code{wl-draft-send-and-exit} or @code{wl-draft-send} is invoked. You can set @code{wl-interactive-send} to non-nil so as to confirm changes before sending the message. @lisp @group (setq wl-draft-config-alist '(((string-match "aaa\\.example\\.com$" (system-name)) ;; @r{applied if the expression is non-nil} (wl-smtp-posting-server . "mailserver-B") (wl-nntp-posting-server . "newsserver-B") ;; @r{settings of temporary variables} ) ("^To: .*user@@aaa\\.bbb\\.example\\.com" ;; @r{applied if it matches the header of the draft buffer} ("Organization" . (format "Go %s" my-webpage))) ;; @r{you can write elisp expressions here (eval only)} (top . "Hello.\n") ;; @r{inserted at the top of the body} (bottom . "\nBye.\n") ;; @r{inserted at the bottom of the body} )) @end group @end lisp The format of @code{wl-draft-config-alist} is: @example @group '(("@var{regexp of the header}" or @var{elisp expression} ("@var{Field}" . value(@var{elisp expression})) (@var{variable} . value(@var{elisp expression})) (@var{sub-function} . value(@var{elisp expression})) @var{function} @dots{}) ("@var{regexp of the header}" or @var{elisp expression} ("@var{Field}" . value(@var{elisp expression})) @dots{})) @end group @end example Per default, there are 13 following sub-functions. @example 'header: Inserts the specified string at the bottom of the header. 'header-top: Inserts the specified string at the top of the header. 'header-file: Inserts the specified file at the bottom of the header. 'x-face: Inserts @samp{X-Face:} field with the content of the specified file. 'top: Inserts the specified string at the top of the body. 'top-file: Inserts the specified file at the top of the body. 'body: Replaces the body with the specified string. Specifying @code{nil} deletes the entire body string. 'body-file: Replaces the body with the content of the specified file. 'bottom: Inserts the specified string at the bottom of the body. 'bottom-file: Inserts the specified file at the top of the body. 'part-top: Inserts the specified string at the top of the current part. 'part-bottom: Inserts the specified string at the bottom of the current part. 'template: Applies the specified template. (refer to the next subsection) @end example These are defined in @code{wl-draft-config-sub-func-alist} and you can change them or add your own functions. If you read the code, you can easily find how to write the functions. At the first of each item, @var{a regular expression of the header} or an @var{elisp expression} should be specified. In the case of an elisp expression, the item is applied when the expression is evaluated non-nil. Per default, when multiple items match or are evaluated non-nil, all such items are applied, but if you set a variable @code{wl-draft-config-matchone} to @code{t}, only the first matching one is applied. At the second of the item, a cons or a list of functions should be specified. The car part of the cons should be a header field, a variable, or a sub-function. When a header field is specified, the field will be modified. If a variable is specified, the value of the variable will be modified temporarily. In the cdr part of a cons, not only a variable but also an elisp expression can be specified as is. If the car part is a header field and the cdr part is @code{nil}, the field will be deleted. See the next example as well: @lisp @group (setq wl-draft-config-alist '((reply ;; @r{(1)} "X-ML-Name: \\(Wanderlust\\|emacs-mime-ja\\|apel-ja\\)" ;; @r{applied if it matches the header of the buffer being replied} (body . " Hello.\n") (template . "default") ))) @end group @end lisp As in the (1) above, if a header regexp is prepended with @code{reply}, it is applied when the draft is prepared by @code{wl-summary-reply} for example, and when it matches the header being replied. It is ignored when there is no buffer being replied, like after @code{wl-draft} was invoked. If you want to use name of parent folder, you can refer the buffer local variable @code{wl-draft-parent-folder}. In the following example, Wanderlust changes From according to the folder name of the summary in which the draft was invoked. @lisp @group (setq wl-draft-config-alist '(((string-match \".*@@domain1$\" wl-draft-parent-folder) (\"From\" . \"user@@domain1\")) ((string-match \".*@@domain2$\" wl-draft-parent-folder) (\"From\" . \"user@@domain2\")))) @end group @end lisp Note that @code{wl-draft-config-alist} is applied only once when @code{wl-draft-send-and-exit} or @code{wl-draft-send} is invoked. Therefore, if you want to apply @code{wl-draft-config-alist} again after aborting transmission, execute @kbd{C-c C-e} (@code{wl-draft-config-exec}) explicitly. If you don't want to apply @code{wl-draft-config-alist} when @code{wl-draft-send-and-exit} or @code{wl-draft-send} is invoked, do the following: @lisp (remove-hook 'wl-draft-send-hook 'wl-draft-config-exec) @end lisp If you want to apply @code{wl-draft-config-alist} when a draft buffer is prepared, do the following: @lisp (add-hook 'wl-mail-setup-hook 'wl-draft-config-exec) @end lisp If you want to apply @code{wl-draft-config-alist} when you re-edit a mail from summary mode by typing @kbd{E}(@code{wl-summary-reedit}), do the following: @lisp (add-hook 'wl-draft-reedit-hook 'wl-draft-config-exec) @end lisp @node Template, POP-before-SMTP, Dynamical Message Re-arrangement, Usage of Draft Mode @subsection Inserting Templates @cindex Template @cindex Apply Template Set a variable @code{wl-template-alist}, and type @kbd{C-c C-j} or @kbd{M-x wl-template-select} in the draft buffer. The format of @code{wl-template-alist} is almost the same as @code{wl-draft-config-alist}. @xref{Dynamical Message Re-arrangement}. @lisp @group (setq wl-template-alist '(("default" ("From" . wl-from) ("Organization" . "Example Co.Ltd.") (body . "Hello.\n")) ("report" (template . "default") ;; @r{(a)} ("To" . "boss@@example.com") ("Subject" . "Report") (body-file . "~/work/report.txt") ) )) @end group @end lisp As you can see, the only difference is item (template) names such as @samp{default} and @samp{report}, instead of a regexp of header. Because definition of each item is the same as @code{wl-draft-config-alist}, you can call another template, like (a). Executing the command @code{wl-template-select} results in template selection, but the result differs depending on variable @code{wl-template-visible-select}. If @code{wl-template-visible-select} is @code{t} (default), a buffer window is shown below the draft buffer. You can select a template by @kbd{n} and @kbd{p} seeing the buffer window. Press the @key{RET} key and the template is actually applied to the draft buffer. If you press @kbd{q}, nothing is applied. In addition, you can adjust the window size by @code{wl-template-buffer-lines}. If @code{wl-template-visible-select} is @code{nil}, you should type the name of the template in the mini buffer. If @code{wl-template-select} is executed with prefix argument, inversed value of @code{wl-template-visible-select} is used. As shown in the example in @code{wl-draft-config-alist}, you can select @samp{default} template by writing: @lisp (template . "default") @end lisp @node POP-before-SMTP, , Template, Usage of Draft Mode @subsection Sending mail by POP-before-SMTP @cindex POP-before-SMTP You can send mail by POP-before-SMTP. Necessary setting is @lisp (setq wl-draft-send-mail-function 'wl-draft-send-mail-with-pop-before-smtp) @end lisp @noindent to change mail posting function from its default value @code{wl-draft-send-mail-with-smtp}. Also you would configure following variables on demand. @table @code @item wl-pop-before-smtp-user The POP user name for POP-before-SMTP authentication. If unset, @code{elmo-pop3-default-user} is used. @item wl-pop-before-smtp-server The POP server name for POP-before-SMTP authentication. If unset, @code{elmo-pop3-default-server} is used. @item wl-pop-before-smtp-authenticate-type The POP authentication method for POP-before-SMTP authentication. If unset, @code{elmo-pop3-default-authenticate-type} is used. @item wl-pop-before-smtp-port The POP port number for POP-before-SMTP authentication. If unset, @code{elmo-pop3-default-port} is used. @item wl-pop-before-smtp-stream-type If @code{ssl}, POP connection is established using SSL. If @code{starttls}, STARTTLS (RFC2595) connection will be established. If unset, @code{elmo-pop3-default-stream-type} is used. @end table If variables for POP-before-SMTP (@code{wl-pop-before-smtp-*}) are unset, settings for POP folders (@code{elmo-pop3-default-*}) are used. Therefore, if SMTP server and POP server are actually the same, and if POP folder per default (such as @samp{&}) is available, no settings are required. Refer to the following URL about POP-before-SMTP. @example @group @uref{http://www.iecc.com/pop-before-smtp.html} @end group @end example @node Key Bindings of Draft, Variables of Draft Mode, Usage of Draft Mode, Draft @section Key Bindings @cindex Keybind, Draft Mode @cindex Keybind, Draft Buffer @table @kbd @item C-c C-y @kindex C-c C-y (Draft) @findex wl-draft-yank-original Cites the content of the current message buffer (the part under cursor). If the region is active, cites the region (it affects only if @code{transient-mark-mode} is Non-nil). If the command is called with prefix argument, the text inserted by yank command (the text content of clipboard) is cited. (@code{wl-draft-yank-original}) @item C-c C-p @kindex C-c C-p (Draft) @findex wl-draft-preview-message Previews the content of the current draft. This is useful for previewing MIME multi-part messages. (@code{wl-draft-preview-message}) @item C-c C-s @kindex C-c C-s (Draft) @findex wl-draft-send Sends the content of the current draft. Does not erase the draft buffer. This is useful for sending multiple messages, which are a little different from each other. (@code{wl-draft-send}) @item C-c C-c @kindex C-c C-c (Draft) @findex wl-draft-send-and-exit Sends the content of the current draft and erases the draft buffer. (@code{wl-draft-send-and-exit}) @item C-x C-s @kindex C-x C-s (Draft) @findex wl-draft-save Save the current draft. (@code{wl-draft-save}) @item C-c C-k @kindex C-c C-k (Draft) @findex wl-draft-kill Kills the current draft. (@code{wl-draft-kill}) @item C-x k @kindex C-x k (Draft) @findex wl-draft-mimic-kill-buffer Kills the current draft. (@code{wl-draft-mimic-kill-buffer}) @item C-c C-z @kindex C-c C-z (Draft) @findex wl-draft-save-and-exit Saves the current draft, and erases the draft buffer. This is useful if you want to suspend editing of the draft. (@code{wl-draft-save-and-exit}) @item C-c C-r @kindex C-c C-r (Draft) @findex wl-caesar-region Encodes or decodes the specified region in Caesar cipher. (@code{wl-caesar-region}) @item C-l @kindex C-l (Draft) @findex wl-draft-highlight-and-recenter Recenter and rehighlight current draft. (@code{wl-draft-highlight-and-recenter}) @item M-t @kindex M-t (Draft) @findex wl-toggle-plugged Toggles off-line/on-line states of Wanderlust. (@code{wl-toggle-plugged}) @item C-c C-o @kindex C-c C-o (Draft) @findex wl-jump-to-draft-buffer Jumps to the other draft buffer, if exists. With prefix argument, reads a file (if any) from the draft folder when there is no such buffer. (@code{wl-jump-to-draft-buffer}) @item C-c C-e @kindex C-c C-e (Draft) @findex wl-draft-config-exec Applies @code{wl-draft-config-alist}. (@code{wl-draft-config-exec}) @item C-c C-j @kindex C-c C-j (Draft) @findex wl-template-select Selects a template. (@code{wl-template-select}) @item C-c C-a @kindex C-c C-a (Draft) @findex wl-addrmgr Enter Address Manager. @xref{Address Manager}. (@code{wl-addrmgr}) @item C-c C-d @kindex C-c C-d (Draft) @findex wl-draft-elide-region Elide the text between point and mark (@code{wl-draft-elide-region}). The text is killed and replaced with the contents of the variable @code{wl-draft-elide-ellipsis}. The default value is to use an ellipsis (@samp{[...]}). @end table @node Variables of Draft Mode, , Key Bindings of Draft, Draft @section Customizable Variables @cindex SMTP AUTH @table @code @item wl-subscribed-mailing-list @vindex wl-subscribed-mailing-list The initial setting is @code{nil}. Mailing lists to which you subscribe. If any of these are contained in @samp{To:} or @samp{Cc:} field of a reply draft, removes your own address from @samp{Mail-Followup-To:} and @samp{Cc:}. And if any of these are contained in @samp{To:} or @samp{Cc:} field of a message to be automatically re-filed, the destination folder will be leaned in connection with the address. Example: @lisp @group (setq wl-subscribed-mailing-list '("wl@@ml.gentei.org" "apel-ja@@m17n.org" "emacs-mime-ja@@m17n.org")) @end group @end lisp @item wl-insert-mail-followup-to @vindex wl-insert-mail-followup-to The initial setting is @code{nil}. If non-nil, @samp{Mail-Followup-To:} field is automatically inserted in the draft buffer. @item wl-insert-mail-reply-to @vindex wl-insert-mail-reply-to The initial setting is @code{nil}. If non-nil, @samp{Mail-Reply-To:} field is automatically inserted in the draft buffer. @item wl-auto-insert-x-face @vindex wl-auto-insert-x-face The initial setting is @code{t}. If non-nil and there is an encoded X-Face string in a file @file{~/.xface} (the value of the variable @code{wl-x-face-file}), inserts it as an @samp{X-Face:} field in the draft buffer. If @code{nil}, it is not automatically inserted. @item wl-insert-message-id @vindex wl-insert-message-id The initial setting is @code{t}. If non-nil, @samp{Message-ID:} field is automatically inserted on the transmission. @item wl-message-id-use-message-from @vindex wl-message-id-use-message-from The initial setting is @code{t}. If non-nil, the value of @samp{From:} field or @code{wl-from} will be used as the domain part of @samp{Message-ID:}. @item wl-local-domain @vindex wl-local-domain The initial setting is @code{nil}. If @code{nil}, the return value of the function @code{system-name} will be used as the domain part of @samp{Message-ID:}. If @code{system-name} does not return FQDN (i.e. the full name of the host, like @samp{smtp.gohome.org}), you @strong{must} set this variable to the string of the local domain name without hostname (like @samp{gohome.org}). That is, a concatenation of @code{system-name} @samp{.} @code{wl-local-domain} is used as domain part of the @samp{Message-ID:}. If your terminal does not have global IP, set the value of @code{wl-message-id-domain}. (You might be beaten up on the Net News if you use invalid @samp{Message-ID:}.) Moreover, concatenation of @code{system-name} @samp{.} @code{wl-local-domain} will be used as an argument to the HELO command in SMTP. @item wl-message-id-domain @vindex wl-message-id-domain The initial setting is @code{nil}. If non-nil, this value is used as a domain part of the @samp{Message-ID:}. If your terminal does not have global IP address, set unique string to this value (e.x. your e-mail address). @item wl-unique-id-suffix @vindex wl-unique-id-suffix The initial setting is @samp{.wl}. You can specify the string in generated Message-ID which appear just before @samp{@@} or @samp{%}. @item wl-draft-config-alist @vindex wl-draft-config-alist The initial setting is @code{nil}. Modifies the draft message just before the transmission. The content of @code{wl-draft-config-alist} will be automatically applied only once on the transmission. If you want to apply it manually, use @kbd{C-c C-e}. This command can be used many times. @item wl-template-alist @vindex wl-template-alist The initial setting is @code{nil}. This variable specifies the template to be applied in the draft buffer. @item wl-draft-config-matchone @vindex wl-draft-config-matchone The initial setting is @code{nil}. If non-nil, only the first matching item is used when @code{wl-draft-config-alist} is applied. If @code{nil}, all matching items are used. @item wl-template-visible-select @vindex wl-template-visible-select The initial setting is @code{t}. If non-nil, you can preview the result of the template selection in another window. @item wl-template-confirm @vindex wl-template-confirm The initial setting is @code{nil}. If non-nil, asks for confirmation when you press the enter key to select template while previewing. @item wl-template-buffer-lines @vindex wl-template-buffer-lines The initial setting is 7. If @code{wl-template-visible-select} is non-nil, this variable specifies the size of the preview window. @item wl-draft-buffer-style @vindex wl-draft-buffer-style The initial setting is @code{full}. Style of draft buffer window (except for replying and forwarding). @table @code @item keep is to use the current window, @item full is to use full frame window, @item split is to split the current window vertically and use it. @item msg-split is to split the message window vertically and use it as if replying message. @item split-horiz is to split the current window horizontally and use it. @item msg-split-horiz is to split the message window horizontally and use it as if replying message. @end table If some function is specified, it is called with the draft buffer as an argument. @item wl-draft-reply-buffer-style @vindex wl-draft-reply-buffer-style The initial setting is @code{split}. Style of draft buffer for replying and forwarding. @table @code @item keep is to use the message buffer window, @item full is to use full frame window, @item split is to split the message buffer window vertically and use it. @item split-horiz is to split the message buffer window horizontally and use it. @end table If some function is specified, it is called with the draft buffer as an argument. @item wl-draft-use-frame @vindex wl-draft-use-frame The initial setting is @code{nil}. If non-nil, use new frame for the draft. @item wl-draft-reply-default-position @vindex wl-draft-reply-default-position The initial setting is @code{body}. Specify initial cursor position on draft buffer for reply. @code{body} is to move cursor to the top of the message body, @code{bottom} to the bottom of the message body, and @code{top} to the top of the header. @item wl-draft-truncate-lines @vindex wl-draft-truncate-lines The initial value is the value of @code{default-truncate-lines}. If it is non-nil, truncate long lines in draft buffer. @item wl-from @vindex wl-from The initial setting is the value of the variable @code{user-mail-address}. The value of this variable is inserted as a @samp{From:} field of the draft when it is prepared. @item wl-envelope-from @vindex wl-envelope-from The initial setting is @code{nil}. The value of this variable is used for envelope from (MAIL FROM). If @code{nil}, the address part of @code{wl-from} is used. @item wl-user-mail-address-list @vindex wl-user-mail-address-list The initial setting is @code{nil}. This is the User's address list. If you have multiple addresses, set this variable. @item wl-reply-subject-prefix @vindex wl-reply-subject-prefix The initial setting is @samp{Re: }. In the @samp{Subject:} of the reply draft, this string is prepended to the @samp{Subject:} of being replied. You can specify a function to be message buffer of the reply target. @item wl-forward-subject-prefix @vindex wl-forward-subject-prefix The initial setting is @samp{Forward: }. In the @samp{Subject:} of the forwarding draft, this string is prepended to the @samp{Subject:} of being forwarded. You can specify a function to be message buffer of the forward target. @item wl-draft-reply-use-address-with-full-name @vindex wl-draft-reply-use-address-with-full-name The initial setting is @code{t}. If non-nil, insert her full name with address when prepare a draft for reply a message. If it is @code{nil}, insert her address only. @item wl-draft-enable-queuing @vindex wl-draft-enable-queuing The initial setting is @code{t}. This flag controls off-line transmission. If non-nil, the draft is sent off-line. @item wl-draft-use-cache @vindex wl-draft-use-cache The initial setting is @code{nil}. If the value is non-nil and @code{wl-insert-message-id} is nil, cache the message which is sent. @item wl-fcc-force-as-read @vindex wl-fcc-force-as-read The initial setting is @code{nil}. If the value is non-nil, Mark as read the message saved by @samp{Fcc:}. @item wl-auto-flush-queue @vindex wl-auto-flush-queue The initial setting is t. This flag controls automatic transmission of the queue when Wanderlust becomes on-line. If non-nil, the queue is automatically transmitted (with confirmation by @code{y-or-n-p}). If you want to transmit it manually, press @kbd{F} in the folder mode. @item wl-ignored-forwarded-headers @vindex wl-ignored-forwarded-headers Initial setting is @samp{\\(received\\|return-path\\|x-uidl\\)}. All headers that match this regexp will be deleted when forwarding a message. @item wl-ignored-resent-headers Initial setting is @samp{\\(return-receipt\\|[bdf]cc\\)}. All headers that match this regexp will be deleted when resending a message. @item wl-draft-always-delete-myself @vindex wl-draft-always-delete-myself If non-nil, always removes your own address from @samp{To:} and @samp{Cc:} when you are replying to the mail addressed to you. @item wl-draft-delete-myself-from-bcc-fcc @vindex wl-draft-delete-myself-from-bcc-fcc If any of @code{wl-subscribed-mailing-list} are contained in @samp{To:} or @samp{Cc:} field, do not insert @samp{Bcc:} or @samp{Fcc:} field. @item wl-draft-send-mail-function @vindex wl-draft-send-mail-function The initial setting is @code{wl-draft-send-mail-with-smtp}. This is the function to post mails. To use POP-before-SMTP, set this to @code{wl-draft-send-mail-with-pop-before-smtp}. @item wl-smtp-posting-server @vindex wl-smtp-posting-server The initial setting is @code{nil}. This is the SMTP server name for mail transmission. @item wl-smtp-posting-port @vindex wl-smtp-posting-port The initial setting is @code{nil}. This is the SMTP port number for mail transmission. If @code{nil}, default SMTP port number (25) is used. @item wl-smtp-posting-user @vindex wl-smtp-posting-user The initial setting is @code{nil}. This is the user name for SMTP AUTH authentication. @item wl-smtp-authenticate-type @vindex wl-smtp-authenticate-type The initial setting is @code{nil}. This string-valued variable specifies the authentication method for SMTP AUTH authentication. You may specify @code{plain}, @code{cram-md5}, @code{digest-md5}, @code{login}, etc. If @code{nil}, authentication will not be carried out. @item wl-smtp-authenticate-realm @vindex wl-smtp-authenticate-realm The initial setting is @code{nil}. This string-valued variable specifies the authentication realm for SMTP AUTH authentication. You have to set this variable for DIGEST-MD5 authentication and so on. If @code{nil}, authentication realm is not specified in the authentication. @item wl-smtp-connection-type @vindex wl-smtp-connection-type The initial setting is @code{nil}. This symbol-valued variable specifies how to establish SMTP connections. If @code{nil}, use default connection type. If it is @code{starttls}, use STARTTLS (RFC3207). If it is @code{ssl}, use SSL. @item wl-nntp-posting-server @vindex wl-nntp-posting-server The initial setting is @code{nil}. This is the NNTP server name used for news submission. If @code{nil}, @code{elmo-nntp-default-server} is used. @item wl-nntp-posting-user @vindex wl-nntp-posting-user The initial setting is @code{nil}. This is the user name for AUTHINFO authentication on news submission. If @code{nil}, @code{elmo-nntp-default-user} is used. If it is still @code{nil}, AUTHINFO authentication will not be carried out. @item wl-nntp-posting-port @vindex wl-nntp-posting-port The initial setting is @code{nil}. This is the port number of the NNTP server used for news submission. If @code{nil}, @code{elmo-nntp-default-port} is used. @item wl-nntp-posting-stream-type @vindex wl-nntp-posting-stream-type The initial setting is @code{nil}. If @code{nil}, @code{elmo-nntp-default-stream-type} is evaluated. If @code{ssl}, SSL is used for news submission. If @code{starttls}, STARTTLS (RFC2595) connection will be established. @item wl-nntp-posting-function @vindex wl-nntp-posting-function The initial setting is @code{elmo-nntp-post}. This is the function to post NNTP message. @item wl-nntp-posting-config-alist @vindex wl-nntp-posting-config-alist The initial setting is @code{nil}. The value takes an alist to define NNTP server like following example. It takes precedence over @code{wl-nntp-posting-@{server|user|port|function@}}. @lisp @group (setq wl-nntp-posting-config-alist '((",?gmane\\." . "news.gmane.org") (",?comp\\." . ((server . "news-server") (user . "newsmaster") (port . 119) (function . elmo-nntp-post))) (".*" . "default-news-server"))) @end group @end lisp @item wl-pop-before-smtp-user @vindex wl-pop-before-smtp-user The initial setting is @code{nil}. This is the POP user name for POP-before-SMTP. If it is @code{nil}, @code{elmo-pop3-default-user} is used. @item wl-pop-before-smtp-server @vindex wl-pop-before-smtp-server The initial setting is @code{nil}. This is the POP server name for POP-before-SMTP. If it is @code{nil}, @code{elmo-pop3-default-server} is used. @item wl-pop-before-smtp-authenticate-type @vindex wl-pop-before-smtp-authenticate-type The initial setting is @code{nil}. This is the authentication method for POP-before-SMTP authentication. If it is @code{nil}, @code{elmo-pop3-default-authenticate-type} is used. @item wl-pop-before-smtp-port @vindex wl-pop-before-smtp-port The initial setting is @code{nil}. This is the POP port number for POP-before-SMTP. If it is @code{nil}, @code{elmo-pop3-default-port} is used. @item wl-pop-before-smtp-stream-type @vindex wl-pop-before-smtp-stream-type The initial setting is @code{nil}. This flag controls the use of SSL for POP-before-SMTP. If it is @code{nil}, @code{elmo-pop3-default-stream-type} is used. If @code{ssl}, SSL is used. If @code{starttls}, STARTTLS (RFC2595) connection will be established. @item wl-draft-queue-save-variables @vindex wl-draft-queue-save-variables Specifies a list of variable to which queued messages are saved on the off-line transmission. @item wl-draft-sendlog @vindex wl-draft-sendlog The initial setting is @code{t}. If @code{t}, transmission log is written in @file{~/.elmo/sendlog}. It is written when: @itemize @minus @item drafts are sent by smtp or qmail @item saved into folders by fcc @item saved into folders by queuing @end itemize (it is written even if the transmission fails). But transmission by @file{im-wl.el} is not written in the @file{sendlog} and left to the logging function of @command{imput}. @item wl-draft-sendlog-max-size @vindex wl-draft-sendlog-max-size The initial setting is 20000 (in bytes). If @code{wl-draft-sendlog} is @code{t}, the log is rotated when it grows beyond the size specified by this variable. @item wl-use-ldap @vindex wl-use-ldap The initial setting is @code{nil}. If non-nil, address completion uses LDAP. @item wl-ldap-server @vindex wl-ldap-server The initial setting is @samp{localhost}. LDAP server name for address completion. @item wl-ldap-port @vindex wl-ldap-port The initial setting is @code{nil}. If non-nil, the value is used as port number. @item wl-ldap-base @vindex wl-ldap-base The initial setting is @samp{c=US}. LDAP search starting point (base) for address completion. @item wl-draft-remove-group-list-contents @vindex wl-draft-remove-group-list-contents The initial setting is @code{t}. If non-nil, remove the group-lists' members in the recipients when sending the message (group-list means the description such as @samp{Group: foo@@gohome.org, bar@@gohome.org;} in the recipients). @end table @node Disconnected Operations, Expire and Archive, Draft, Top @chapter Off-line Management @cindex Disconnected Operations Wanderlust has on-line and off-line states. @menu * Off-line State:: Wanderlust has on-line and off-line states * Enable Operations:: Enable Disconnected Operations * Plugged Mode:: Switching On-line/Off-line per Server/Port * Off-line State settings:: Invoking Wanderlust in the Off-line State * Variables of Plugged Mode:: Customize Plugged Mode @end menu @node Off-line State, Enable Operations, Disconnected Operations, Disconnected Operations @section Off-line State Wanderlust has on-line and off-line states. In the off-line state, you cannot access messages via network, unless they are cached. @samp{[ON]} in the mode line indicates the on-line state. @samp{[--]} in the mode line indicates the off-line state. In folder or summary modes, press @kbd{M-t} to switch between off- and on-line. You can invoke Wanderlust in the off-line state by setting @code{wl-plugged} to @code{nil} in @file{~/.wl} or anything appropriate. In the off-line mode, @kbd{n} and @kbd{p} command in the summary mode ignores uncached messages. @node Enable Operations, Plugged Mode, Off-line State, Disconnected Operations @section Enable Disconeected Operations Even in the off-line state, provided that relevant messages are cached, and the variable @code{elmo-enable-disconnected-operation} (described later) is non-nil, you can following operations: @xref{Plugged Mode}, @xref{Off-line State settings}. @menu * Send Messages off-line:: Transmit Messages * Re-file and Copy queue:: Re-file and Copy (IMAP4) * Creation of Folders:: Create Folders off-line (IMAP4) * Marking:: Mark (IMAP4) * Pre-fetching Reservations:: Pre-fetch @end menu As soon as Wanderlust becomes on-line, such operations invoked off-line are reflected in the servers via network. If the variable @code{elmo-enable-disconnected-operation} is @code{nil}, these off-line operations are not executed and causes an error on re-file or copy operations. @node Send Messages off-line, Re-file and Copy queue, Enable Operations, Enable Operations @subsection Transmission of Messages You can proceed sending operation for mail/news messages while you are off-line, then it will be reserved for sending (if you are using @file{im-wl.el}, it is irrelevant). Messages reserved for sending while off-line are accumulated in the queue folder, @samp{+queue}. These messages are transmitted at once when Wanderlust becomes on-line. You can visit @samp{+queue} in the off-line state and confirm content of messages in the queue. You can also remove messages. Removed messages are not transmitted even in the on-line state. @node Re-file and Copy queue, Creation of Folders, Send Messages off-line, Enable Operations @subsection Re-file and Copy (IMAP4) Re-file and copy operations to IMAP folders invoked during the off-line state are accumulated in the queue, and reflected in the server side when Wanderlust becomes on-line. If you visit destination folders after off-line re-file or copy, it looks as if messages were appended even in off-line state. For the safety reasons, messages re-filed off-line are removed from source folders only if their @samp{Message-ID:} match messages on the servers. While the queue is processed, messages that failed to be re-filed or copied to the specified folders are appended to the folder @samp{+lost+found}. @node Creation of Folders, Marking, Re-file and Copy queue, Enable Operations @subsection Creation of Folders (IMAP4) You can create IMAP folders off-line. The creation of folders are reflected in the servers when Wanderlust becomes on-line. If the creation of those folders fails at that time for some reasons, messages to be re-filed into those are appended to the folder @samp{+lost+found} instead. @node Marking, Pre-fetching Reservations, Creation of Folders, Enable Operations @subsection Marking (IMAP4) Off-line changes in unread/read and importance mark @samp{$} information are also reflected in the servers when Wanderlust becomes on-line. @node Pre-fetching Reservations, , Marking, Enable Operations @subsection Pre-fetching You can make reservations for pre-fetching messages in networking folders (IMAP, NNTP, POP3, shimbun). Reserved messages are marked with @samp{u} but not cached yet. When Wanderlust becomes on-line, they are pre-fetched from servers. @node Plugged Mode, Off-line State settings, Enable Operations, Disconnected Operations @section Switching On-line/Off-line per Server/Port @kbd{M-t} described above switches networking states as a whole, but you can switch on-line/off-line per server/port. Pressing @kbd{C-t} in the folder or summary modes brings you in wl-plugged-mode shown below, in which you can change the plugged state for each port. @example @group Queuing:[ON] AutoFlushQueue:[--] DisconnectedOperation:[ON] [ON](wl-plugged) [--]hosta [--]smtp +queue: 2 msgs (1,2) @dots{}@r{sending queue} [--]nntp(119) +queue: 1 msg (3) @dots{}@r{sending queue} [ON]hostb [--]imap4/cram-md5(143) %#mh/wl(prefetch-msgs:3,mark-as-important:1) %inbox(delete-msgids:1) @dots{}@r{dop queue} [ON]nntp(119) [ON]smtp @end group @end example The first line indicates status of the following three variables, and simply pressing @kbd{@key{SPC}} or @kbd{@key{RET}} in each labeled column modifies the values of these variables. @example @group "Queuing" @code{wl-draft-enable-queuing} "AutoFlushQueue" @code{wl-auto-flush-queue} "DisconnectedOperation" @code{elmo-enable-disconnected-operation} @end group @end example where @samp{[ON]} means its value is @code{t}, and @samp{[--]} means @code{nil}. The second and after lines indicate on-line/off-line states of servers and ports, where @samp{[ON]} stands for on-line and @samp{[--]} for off-line (in XEmacs or Emacs 21, they are shown with icons). Pressing @kbd{@key{SPC}} or @kbd{@key{RET}} in each line switches its state. @dfn{sending queue} means messages accumulated in the folder @samp{+queue} for off-line transmission, and @dfn{dop queue} means off-line operations when @code{elmo-enable-disconnected-operation} is @code{t}. @c If the variable @code{elmo-enable-disconnected-operation} is non-nil, @c off-line operations are enabled. They are displayed if there are any of them. In the example above, in the sending queue there are two messages (the first and the second in the queue folder) for smtp to hosta and one (the third) for nntp to hosta, and in the dop queue there are one for @samp{%inbox} and two for @samp{%#mh/wl}. If you change @samp{(wl-plugged)} in the second line, the variable @code{wl-plugged} is changed, so that the mode line indicator and plugged states of all ports are affected. If you change plugged states of any servers or ports, @samp{(wl-plugged)} in the second line is affected depending on @code{elmo-plugged-condition} settings and the plugged state of each port. @node Off-line State settings, Variables of Plugged Mode, Plugged Mode, Disconnected Operations @section Invoking Wanderlust in the Off-line State As described before, if you set @code{wl-plugged} to @code{nil} in @file{~/.wl} or anything appropriate, you can invoke Wanderlust in the off-line state. You can specify off-line state on a per server or port basis. Refer to @code{wl-reset-plugged-alist} also. Usually, when Wanderlust starts up, the plugged state of each port is read from @file{~/.folders} and @code{wl-smtp-posting-server}, @code{wl-nntp-posting-server} and so on. If you want to change the plugged state of these ports or to add other ports, configure @code{wl-make-plugged-hook} with a function. @lisp @group (add-hook 'wl-make-plugged-hook '(lambda () (elmo-set-plugged plugged-value(t/nil) server port) ;; @r{add or change plugged states of the port of the server} (elmo-set-plugged plugged-value(t/nil) server) ;; @r{if the port is omitted, all ports are affected} ;; @r{(you cannot omit the port if you newly add the server)} )) @end group @end lisp @node Variables of Plugged Mode, , Off-line State settings, Disconnected Operations @section Customizable Variables @table @code @item wl-plugged @vindex wl-plugged If this variable is set to @code{nil}, Wanderlust starts up in off-line mode from the beginning. @item wl-queue-folder @vindex wl-queue-folder The initial setting is @samp{+queue}. This is the folder in which messages in the transmission queue are accumulated. @item wl-auto-flush-queue @vindex wl-auto-flush-queue The initial setting is @code{t}. This flag controls automatic transmission of the queue when Wanderlust becomes on-line. If non-nil, the queue is automatically transmitted (with confirmation by @code{y-or-n-p}). If you want to transmit it manually, press @kbd{F} in the folder mode. @item elmo-enable-disconnected-operation @vindex elmo-enable-disconnected-operation The initial setting is @code{t}. Controls off-line operations regarding networking folders. If non-nil, off-line operations are carried out. @item elmo-lost+found-folder @vindex elmo-lost+found-folder The initial setting is @samp{+lost+found}. This is the folder to which messages are saved when they fails to be appended while the off-line re-file/copy queue is processed. @item elmo-plugged-condition @vindex elmo-plugged-condition The initial setting is @code{one}. The value of @code{wl-plugged} reflects the return value of the function @code{elmo-plugged-p} (without arguments). This variable @code{elmo-plugged-condition} specifies the condition on which the return value of @code{(elmo-plugged-p)} should be t depending on the plugged state of each port. @example 'one : plugged if one or more ports are plugged. 'all : plugged if all ports are plugged. 'independent : reflects wl-plugged (elmo-plugged) regardless of plugged states of the ports. @var{function} : reflects the return value of the @var{function} functions available per default 'elmo-plug-on-by-servers : reflects the plugged state of the servers specified by the variable elmo-plug-on-servers. 'elmo-plug-on-by-exclude-servers : reflects the plugged state of the servers that are not in elmo-plug-on-exclude-servers. elmo-plug-on-exclude-servers defaults to '("localhost" (system-name) (system-name)without the domain part) @end example @example @group Example 1: (setq elmo-plugged-condition 'all) Example 2: (setq elmo-plug-on-servers '("smtpserver" "newsserver")) (setq elmo-plugged-condition 'elmo-plug-on-by-servers) Example 3: (setq elmo-plug-on-exclude-servers '("localhost" "myname")) (setq elmo-plugged-condition 'elmo-plug-on-by-exclude-servers) @end group @end example @item wl-reset-plugged-alist @vindex wl-reset-plugged-alist The initial setting is @code{t}. If non-nil, plugged states are initialized on a per server or port basis when Wanderlust starts up. If @code{nil}, plugged states are retained while Emacs is running. In other words, they are initialized when Emacs is restarted even if the value is @code{nil}. @end table @node Expire and Archive, Scoring, Disconnected Operations, Top @chapter Automatic Expiration and Archiving of Messages @cindex Expire and Archive @menu * Expire:: Expiration and Archiving * Archive:: Archiving All Messages @end menu @node Expire, Archive, Expire and Archive, Expire and Archive @section Expiration @cindex Expire Message Expiration means deletion of old messages which have outlasted a certain period of time. @code{wl-expire} supports not only simple deletion, but also moving to specified archiving folders. @section How to Use Configure @code{wl-expire-alist} and press @kbd{e} in the folder mode, or @kbd{M-e} in the summary mode. @subsection Configuring @code{wl-expire-alist} An example configuration of @code{wl-expire-alist} is shown below. Everything in this @code{wl-expire-alist} makes a great difference in expiration, so be careful. I advise you to set @code{wl-expire-use-log} to @code{t}, especially in the initial stage. @lisp @group (setq wl-expire-alist '(("^\\+trash$" (date 14) remove) ;; @r{delete} ("^\\+tmp$" (date 7) trash) ;; @r{re-file to @code{wl-trash-folder}} ("^\\+outbox$" (number 300) "$outbox;lha") ;; @r{re-file to the specific folder} ("^\\+ml/tmp$" nil) ;; @r{do not expire} ("^\\+ml/wl$" (number 500 510) wl-expire-archive-number1 t) ;; @r{archive by message number (retaining numbers)} ("^\\+ml/.*" (number 300 310) wl-expire-archive-number2 t) ;; @r{archive by a fixed number (retaining numbers)} ("^\\+diary$" (date 30) wl-expire-archive-date) ;; @r{archive by year and month (numbers discarded)} )) @end group @end lisp Items in the list have the format of: @example (@var{regexp-for-folders} @var{specification-of-messages-to-be-deleted} @var{destination}) @end example @noindent The folder is examined if it matches @var{regexp-for-folders} from the beginning of the list. If you invoke expiration on the folder that does not match any of them, nothing will happen. And if either the second or the third element of the item is @code{nil}, expiration will not take place. You can use any one of the following for @var{specification-of-messages-to-be-deleted}: @table @code @item (number @var{n1} [@var{n2}]) deletes messages depending on the number of messages in the folder. @var{n1} is the number of messages which should survive deletion, for example if its value is 500, the newest 500 messages survive and the rests are deleted. @var{n2} is the number of messages in the folder on which expiration should take place, which defaults to @var{n1} + 1. For example if its value is 510, folders with 510 or more messages are expired. If you configured automatic expiration, frequently used folders may expire every time it receive messages, and you may be annoyed with the long delay in reading mail. In that case, you can set a wide margin between @var{n2} and @var{n1}, so that expiration would not take place until a certain number of messages accumulate. Messages with marks in @code{wl-summary-expire-reserve-marks} (marked with important/new/unread) are not deleted. If @code{wl-expire-number-with-reserve-marks} is non-nil, the folder will expire so as to have 500 messages including such ones. Otherwise, it will have 500 messages except such ones. @item (date @var{d1}) deletes messages depending on the dates. Messages dated @var{d1} or more days ago are deleted, for example if its value is seven, messages seven days old or more are deleted. Note that the date is the one in the @samp{Date:} field of the message, not when the message entered the folder. Messages with no or invalid @samp{Date:} field does not expire; you might have to delete them by hand. @end table You can use any one of the following in the place of @var{destination}: @table @asis @item @code{remove} deletes the messages instantly. @item @code{hide} hides the messages from summary (messages are not deleted). @item @code{trash} moves the messages to @code{wl-trash-folder}. @item @var{string}(folder) moves the messages to the folder specified with @var{string}. It would be useful for specifying an archiving folder, but because this does not move important messages, it might be better to use the standard functions described below. @item @var{function} invokes the specified @var{function}. To the @var{function}, three arguments are passed: a folder name, a list of messages to be deleted, and msgdb information of the summary. You can specify function-specific arguments after the name of the @var{function}. Note that the list contains messages with marks in @code{wl-summary-expire-reserve-marks}, so be careful in writing your own function. These are four standard functions; three of them move messages to an archive folder in the specified way. This means old messages can be compressed and saved in a file, being deleted from the original folder. The last one divides messages to some MH folders. @table @code @item wl-expire-archive-number1 re-files to archiving folders corresponding to the message numbers of the messages being deleted. For example, a message numbered 102 will be re-filed to @file{wl-00100.zip}, 390 to @file{wl-00300.zip}, and so on. If @code{wl-expire-archive-files} is 200, messages will be re-filed to @file{wl-00000.zip}, @file{wl-00200.zip}, @file{wl-00400.zip}, @dots{}. The archiving folders to which messages are re-filed are determined by the name of the folder as follows (in this case, archiving folders are handled as if @code{elmo-archive-treat-file} were non-nil). @table @asis @item If the folder type is localdir: @file{@var{ArchiveDir}/@var{foldername}-xxxxx.zip} For example, @samp{+ml/wl} corresponds to @samp{$ml/wl;zip} (@file{~/Mail/ml/wl-00100.zip}). @item The folder type is other than localdir: @file{@var{ArchiveDir}/@var{foldertype}/@var{foldername}-xxxxx.zip} For example, @samp{%#mh/ml/wl} corresponds to @samp{$imap4/#mh/ml/wl;zip} (@file{~/Mail/imap4/#mh/ml/wl-00100.zip}). @end table As you can see, in the case of localdir, the folder type is not included in the path name, but otherwise it is included. And you can control the prefix to the archiving folder name by @code{wl-expire-archive-folder-prefix}. Refer to @code{wl-expire-archive-folder-prefix} for details. @item wl-expire-archive-number2 re-files every certain number of messages to archiving folders. This differs from @samp{wl-expire-archive-number1} in that this re-files to the folder up to the specified number regardless of message numbers. The archiving folders to which messages are re-filed are determined in the same way as @code{wl-expire-archive-number1}. @code{elmo-localdir-folder-path} and @code{elmo-archive-folder-path} should be different from each other when you use this function. Please beware that default values are the same. @item wl-expire-archive-date re-files messages depending on its date (year and month) to archive folders. For example, a message dated December 1998 is re-filed to @code{$folder-199812;zip}. The name of the archiving folders except the date part are determined in the same way as @code{wl-expire-archive-number1}. You can set the first argument to these three standard functions to non-nil in @code{wl-expire-alist} so as to retain message numbers in the folder. For example, it can be specified just after the name of the function: @lisp ("^\\+ml/wl$" (number 300 310) wl-expire-archive-number1 t) @end lisp If you omit the argument, consecutive numbers from 1 are assigned for each archiving folder. @item wl-expire-localdir-date divides messages depending on their date (year and month) to MH folders e.g. to @samp{+ml/wl/1999_11/}, @samp{+ml/wl/1999_12/}. @end table @end table @subsection Treatment for Important or Unread Messages If you specify any of @code{remove}, @code{trash}, a folder name, or a standard function, messages with marks in @code{wl-summary-expire-reserve-marks} (which are called @dfn{reserved messages} thereafter) are retained. By default, this variable includes the important, new, and unread marks, so that messages with these marks are not removed. Note that you cannot include the temporary mark (i.e. temporary marks are removed anyway), and be sure to process temporary marks before you invoke expiration. @subsection Auto Expiration The following setup invokes expiration when you move into the summary mode. There will be no confirmation, so make sure you made no mistake in regexp and other settings before you set up this. @lisp @group (add-hook 'wl-summary-prepared-pre-hook 'wl-summary-expire) @end group @end lisp In the folder mode, you can invoke expiration per group as well as per folder. Therefore, if you specify @samp{Desktop} group, all folders matching @code{wl-expire-alist} expire. @section Tips @subsection Treating archive folders To treat archive folders created by @code{wl-expire-archive-number1} and so on, you must set non-nil value to @code{elmo-archive-treat-file}. @subsection Confirming If you are to use @code{remove}, try @code{trash} at first and see messages move to @code{wl-trash-folder} as expected, then replace it with @code{remove}. It would be dangerous to use @code{remove} from the beginning. If you are to use @code{wl-expire-archive-number1} and the like, try to make a folder of the archiver type (@code{zip} or @code{lha}) and see if you can append messages to it. Even if settings in @code{wl-expire-alist} and @code{elmo-archive} are correct, messages would not be saved anywhere and disappeared in case the archiver program fails. After you make sure you can archive to the folder correctly, you can invoke expiration and utilize the log. If you set @code{wl-expire-use-log} to @code{t}, @file{~/.elmo/expired-log} should contain the log, for example: @example @group delete +ml/wl (593 594 595 596 597 598 599) move +ml/wl -> $ml/wl-00600;tgz;wl (600 601 602) @end group @end example The first column indicates the operation, i.e. @samp{delete}, @samp{copy}, or @samp{move}. The next is the name of the folder that expired. In the case of @samp{copy} and @samp{move}, the destination folder is recorded after @samp{->}. The last is the list of message numbers that are actually deleted or moved (in the case of @samp{copy} and @samp{move}, the number is the one in the source folder, rather than the destination folder). @subsection Re-filing Reserved Messages The three standard functions copy reserved messages to the archive folder, but do not delete them from the source folder. Because reserved messages and the like always remain, they are recorded in @file{~/.elmo/expired-alist} so that they are not copied over and over again. They are not recorded if copied by @code{wl-summary-archive}. If you enabled logging, usually @samp{move} is recorded for re-filing, but instead @samp{copy} and @samp{delete} are recorded separately if reserved messages are involved. This is because it actually copies messages including reserved, then deletes ones except reserved in that case. @section Customizable Variables @table @code @item wl-expire-alist @vindex wl-expire-alist The initial setting is @code{nil}. This variable specifies folders and methods to expire. For details, refer to @code{wl-expire-alist} settings above. @item wl-summary-expire-reserve-marks @vindex wl-summary-expire-reserve-marks The initial setting is the list below. @lisp @group (list wl-summary-flag-mark wl-summary-new-uncached-mark wl-summary-new-cached-mark wl-summary-unread-uncached-mark wl-summary-unread-cached-mark) @end group @end lisp Messages with these marks are retained in the folder, even after expiration. Only permanent marks can be listed, not temporary marks. You can list marks one by one as in the default; you can use the following settings as well: @table @code @item all All messages with permanent marks are retained, i.e. @code{wl-summary-read-uncached-mark} is included in addition to the defaults. @item none All messages are handled as usual ones that are already read, no matter what marks they have; even important messages are deleted. @end table @item wl-expire-archive-files @vindex wl-expire-archive-files The initial setting is 100. This variable specifies the number of messages to be retained in one archiving folder. @item wl-expire-number-with-reserve-marks @vindex wl-expire-number-with-reserve-marks The initial setting is @code{nil}. If non-nil, if expiring messages are specified by @code{number}, messages with @code{wl-summary-expire-reserve-marks} are also retained. @item wl-expire-archive-get-folder-function @vindex wl-expire-archive-get-folder-function The initial setting is @code{wl-expire-archive-get-folder}. This variable specifies a function that returns the name of an archiving folder for standard functions in the place of @var{destination}. You can use the following three variables for simple modification of folder names; if you want more complex settings, define your own function in this variable. @code{wl-expire-archive-get-folder} can be customized by these variables: @itemize @bullet @item @code{wl-expire-archive-folder-name-fmt} @item @code{wl-expire-archive-folder-type} @item @code{wl-expire-archive-folder-prefix} @end itemize @item wl-expire-archive-folder-name-fmt @vindex wl-expire-archive-folder-name-fmt The initial setting is @samp{%s-%%05d;%s}. This is a @code{format} string for archiving folders used in @code{wl-expire-archive-number1} and @code{wl-expire-archive-number2}. Note that you must specify the message number by @samp{%%d}, because it is parsed twice by @code{format}. If you modify this, adjust @code{wl-expire-archive-folder-num-regexp} as well. @item wl-expire-archive-date-folder-name-fmt @vindex wl-expire-archive-date-folder-name-fmt The initial setting is @samp{%s-%%04d%%02d;%s}. This is a @code{format} string for archiving folders used in @code{wl-expire-archive-date}. Note that you must specify the message number by @samp{%%d}, because it is parsed twice by @code{format}. There should be @samp{%%d} twice, one for the year and the other for the month. If you modify this, adjust @code{wl-expire-archive-date-folder-num-regexp} as well. @item wl-expire-archive-folder-type @vindex wl-expire-archive-folder-type The initial setting is @code{zip}. This variable specifies an archiver type of the archiving folders. @item wl-expire-archive-folder-prefix @vindex wl-expire-archive-folder-prefix The initial setting is @code{nil}. This variable specifies the prefix (directory structure) to archiving folders. Exercise extreme caution in using this feature, as it has not been seriously tested. In the worst case, there is a fear of destructing archiving folders. @table @code @item nil There will be no prefix. @item short For example, @samp{+ml/wl} will be prefixed by @samp{wl}, resulting in @samp{$ml/wl-00000;zip;wl}. @item t For example, @samp{+ml/wl} will be prefixed by prefix @samp{ml/wl}, resulting in @samp{$ml/wl-00000;zip;ml/wl}. @end table @item wl-expire-archive-folder-num-regexp @vindex wl-expire-archive-folder-num-regexp The initial setting is @samp{-\\([-0-9]+\\);}. This variable specifies the regular expression to be used for getting message numbers from multiple archiving folders specified by @code{elmo-list-folders}. Set it in accordance with @code{wl-expire-archive-folder-name-fmt}. @item wl-expire-archive-date-folder-num-regexp @vindex wl-expire-archive-date-folder-num-regexp The initial setting is @samp{-\\([-0-9]+\\);}. This is the regular expression to be used for getting message numbers from multiple archiving folders specified by @code{elmo-list-folders}. Set it in accordance with @code{wl-expire-archive-date-folder-name-fmt}. @item wl-expire-delete-oldmsg-confirm @vindex wl-expire-delete-oldmsg-confirm The initial setting is @code{t}. If non-nil, messages older than the one with the largest number will be deleted with confirmation. If @code{nil}, they are deleted without confirmation. This feature is valid only if non-nil is specified as a argument to the standard functions so as to retain numbers. @item wl-expire-use-log @vindex wl-expire-use-log The initial setting is @code{nil}. If non-nil, expiration logs are recorded in @file{~/.elmo/expired-log}. They are appended but not truncated or rotated automatically; you might need to remove it manually. @item wl-expire-add-seen-list @vindex wl-expire-add-seen-list The initial setting is @code{t}. If non-nil, when messages are re-filed by expiration, read/unread information is passed to the destination folder. However if you do not read the destination folder from Wanderlust, @file{seen} under @file{~/.elmo/} grows larger and larger, so you might want to set this to @code{nil} if you are simply saving to some archiving folders. Even if its value is @code{nil}, messages in the archiving folders are simply treated as unread; it does not affect expiration itself. @item wl-expire-folder-update-msgdb @vindex wl-expire-folder-update-msgdb The initial setting is @code{t}. If @code{t}, in the folder mode, expiration is carried out after updating summary information. If you specified a list of regular expressions of folder names, summary information is updated for matching folders only. @end table @node Archive, , Expire, Expire and Archive @section Archiving Messages @subsection Archiving Messages @kbd{M-x wl-summary-archive} copies the whole folder to archiving folders. If there are the archiving folders already, only new messages are appended. You can use @code{wl-archive-alist} in order to specify how messages are archived according to their folder names, as in @code{wl-expire-alist}. For example: @lisp @group (setq wl-archive-alist '(("^\\+tmp$" wl-archive-date) ("^\\+outbox$" wl-archive-number2) (".*" wl-archive-number1))) @end group @end lisp Each item in the list has the following format: @example (@var{folders-regexp} @var{deleting-function}) @end example As you can see, you can only use a function after @var{folders-regexp}. Per default, there are three functions: @itemize @bullet @item @code{wl-archive-number1} @item @code{wl-archive-number2} @item @code{wl-archive-date} @end itemize As inferred from their names, they work similarly to "expire" versions, other than the following points: @itemize @minus @item No messages are deleted @item Message numbers are retained even if invoked without arguments @end itemize These functions are good to archive all messages in a folder by their numbers or by their dates. These are also useful for backup or confirmation purposes before expiration. If you try to re-file them after they are archived, they are deleted but not re-filed. Per default, the archiving folders to which messages are copied are determined automatically by @code{wl-expire-archive-get-folder-function}. You can copy to a specific folder by invoking with a prefix argument, i.e. @kbd{C-u M-x wl-summary-archive}. Note that this feature has not been seriously tested, because you can simply copy to an archiving folder, for example by @code{wl-summary-copy-region}. The archiving folders are determined by the same logic as in @code{wl-summary-expire}; the following customizable variables are relevant: @itemize @bullet @item @code{wl-expire-archive-files} @item @code{wl-expire-archive-get-folder-function} @item @code{wl-expire-archive-folder-name-fmt} @item @code{wl-expire-archive-folder-type} @item @code{wl-expire-archive-folder-prefix} @item @code{wl-expire-archive-folder-num-regexp} @end itemize @subsection Customizable Variables @table @code @item wl-archive-alist @vindex wl-archive-alist The initial setting is the list shown below: @lisp @group ((".*" wl-archive-number1)) @end group @end lisp @noindent This variable specifies a function that copies to archiving folders. To the function, three arguments are passed: a folder name, a list of messages in the folder, and msgdb information of the summary. Needless to say, you can use your own function. @end table @node Scoring, Address Book, Expire and Archive, Top @chapter Score of the Messages @cindex Scoring @c @cindex Kill File Scoring is the function that associates a score (value) with each message, and marks as read or deletes from the summary according to it. You can put target or important marks on essential messages, or read marks on the ones you do not want to read, for example spam articles. This scoring function has a capability and a format similar to the one that Gnus has, although there are some unsupported features and Wanderlust specifics. @xref{Scoring, , ,gnus, Gnus Manual}. @menu * Score Commands:: Score Commands * Score File Format:: Score File Format @end menu @node Score Commands, Score File Format, Scoring, Scoring @section Score Commands @cindex Score Commands @subsection Score File Specification @code{wl-score-folder-alist} specifies score files or variables in which scores are defined, corresponding to folder names. @lisp @group (setq wl-score-folder-alist '(("^-.*" "news.SCORE" "my.SCORE") (".*" "all.SCORE"))) @end group @end lisp If paths to the score files are omitted, the directory specified in the variable @code{wl-score-files-directory} is assumed. No matter what you write in @code{wl-score-folder-alist}, the default score file @code{wl-score-default-file} (@file{all.SCORE}) is always read (it does not have to exist). Therefore, in the example above, the three score files, @file{news.SCORE}, @file{my.SCORE}, and @file{all.SCORE} are read for the folders that matches @samp{^-.*}. @subsection Scored Messages Scores are attached to the messages that are specified by @code{wl-summary-score-marks} temporarily when the summary is updated; when you exit from the summary, the scores are removed and reverts to the defaults. @subsection Creation of Score Files In the summary buffer, move to an appropriate message and type @kbd{L}. Then type @kbd{s}, @kbd{s}, and @kbd{p} at a prompt in a mini-buffer. The string in Subject is presented. Edit it and press @kbd{@key{RET}}. This makes @minus{}1000 are scored for messages with the same @samp{Subject:} as the string you entered. That is, such a score file is created automatically. Then, try typing @kbd{h} and @kbd{e} in the same summary buffer. The score file you just made appears. This buffer is called @dfn{score editing buffer} thereafter. When you type @kbd{C-c C-e} in it, you are prompted in the mini-buffer as you are previously; type @kbd{a}. Then a score entry for "From" should be inserted. In this way, you can create a score file easily either in the summary buffer or in the score editing buffer. By the way, you might be aware the numbers of key strokes are different between @kbd{s s p} and @kbd{a}. This is determined by @code{wl-score-header-default-entry}. This variable specifies the default score entries corresponding to header fields. For example, for "subject" field, a type and a time limit are prompted, but for "from" field, they are fixed upon automatically as substring and permanent respectively. However, score values can be modified by the prefix argument. Typing @kbd{?} at the mini-buffer shows a help on keys and corresponding headers and types. At last, type @kbd{C-c C-c} in the score editing buffer. This saves the score file and terminates the edit mode. Typing @kbd{C-c C-c} after erasing contents of the buffer deletes the score file being edited. @subsection Tips @subsubsection Selecting Score Files You can change score files to which scores are appended by @code{wl-summary-increase-score} and @code{wl-summary-lower-score} by @code{wl-score-change-score-file}. @subsubsection Summing Up the Score If you add the same entries by @code{wl-summary-increase-score}, @code{wl-summary-lower-score}, and @code{wl-score-edit-insert-entry}, scores for the entry is summed up. For example, if you create @samp{from} entry with the score of @minus{}1000 by @kbd{L a} and again @samp{from} with @minus{}200, one entry with the score of @minus{}1200 will be created as a result. @subsubsection Creating Thread Key Creating @samp{Thread} key by @code{wl-summary-increase-score} or @code{wl-summary-lower-score} appends @samp{Message-ID} of all children. @subsubsection Creating Followup Key Creating @samp{Followup} key by @code{wl-summary-increase-score} or @code{wl-summary-lower-score} appends @samp{Message-ID} of the message at the cursor to @samp{References} key. If @code{wl-score-auto-make-followup-entry} is non-nil, @samp{Message-ID} of all messages to be followed up within dates specified by @code{wl-score-expiry-days}. @subsection Key Bindings @table @kbd @item K @kindex K (Summary) @findex wl-summary-increase-score Increases the score for the current message. And the score entry is appended to the score file at the same moment. You can specify the score value by a prefix argument. @item L @kindex L (Summary) @findex wl-summary-lower-score Decreases the score for the current message. And the score entry is appended to the score file at the same moment. You can specify the score value by a prefix argument. @item h R @kindex h R (Summary) @findex wl-summary-rescore Re-applies the scoring. However, already scored messages are not scored anew. @item h c @kindex h c (Summary) @findex wl-score-change-score-file Changes the score file currently selected. @item h e @kindex h e (Summary) @findex wl-score-edit-current-scores Edits the score file currently selected. If there are multiple score files, the previously specified one is selected. @item h f @kindex h f (Summary) @findex wl-score-edit-file Edits an arbitrary score file and selects it. @item h F @kindex h F (Summary) @findex wl-score-flush-cache Erases caches associated to the score files that are read. If you modified score files directly (from other than Wanderlust), you need to re-read them after erasing the cache. @item h m @kindex h m (Summary) @findex wl-score-set-mark-below Specifies the criterion for scores to be marked as read. Messages with scores less than this value are marked as read. @item h x @kindex h x (Summary) @findex wl-score-set-expunge-below Specifies the criterion for scores to be deleted from the summary. Messages with scores less than this value are deleted. "Deleted" means it is not shown; they are not removed from the summary information or the folder. The deleted messages can be shown by rescan-noscore again. @end table @subsection Key Bindings in the Score Editing Buffer @table @kbd @item C-c C-k @kindex C-c C-k (Score Mode) @findex wl-score-edit-kill Abandons the file being edited. @item C-c C-c @kindex C-c C-c (Score Mode) @findex wl-score-edit-exit Saves the file being edited, and quits from the edit mode. @item C-c C-p @kindex C-c C-p (Score Mode) @findex wl-score-pretty-print Re-draws the score. @item C-c C-d @kindex C-c C-d (Score Mode) @findex wl-score-edit-insert-date Inserts the number of dates from Dec. 31, 1 B.C. It is used for creating the third factor of time-limited scores. @item C-c C-s @kindex C-c C-s (Score Mode) @findex wl-score-edit-insert-header Inserts the header of the message selected in the summary buffer. @item C-c C-e @kindex C-c C-e (Score Mode) @findex wl-score-edit-insert-entry Inserts the score entry of the message selected in the summary buffer. @end table @subsection Customizable Variables @table @code @item wl-summary-default-score @vindex wl-summary-default-score The initial setting is 0 (zero). This variable specifies the default value of the score. The score is increased or decreased based upon this value. @item wl-summary-important-above @vindex wl-summary-important-above The initial setting is @code{nil}. Messages with scores larger than this value are attached with the important mark (@samp{$}). If @code{nil}, no important marks are attached. @item wl-summary-target-above @vindex wl-summary-target-above The initial setting is @code{nil}. Messages with scores larger than this value are attached with the target mark (@samp{*}). If @code{nil}, no target marks are attached. @item wl-summary-mark-below @vindex wl-summary-mark-below The initial setting is 0 (zero). Messages with scores smaller than this value are marked as read. @item wl-summary-expunge-below @vindex wl-summary-expunge-below The initial setting is @code{nil}. Messages with scores smaller than this value are deleted from the summary. If @code{nil}, they are not deleted. @item wl-summary-score-marks @vindex wl-summary-score-marks The initial setting is the list shown below: @lisp @group (list wl-summary-new-uncached-mark wl-summary-new-cached-mark) @end group @end lisp @noindent Messages with these marks are scored. @item wl-use-scoring @vindex wl-use-scoring The initial setting is t. If non-nil, scoring is enabled. @item wl-score-files-directory @vindex wl-score-files-directory The initial setting is @file{~/.elmo/}. The default directory for score files. @item wl-score-interactive-default-score @vindex wl-score-interactive-default-score The initial setting is 1000. This value is used as a score when a score factor is @code{nil} in the score file. It is also used in @code{wl-summary-increase-score} and @code{wl-summary-lower-score}, on condition that the value of @code{wl-score-header-default-entry} is @code{nil}. @item wl-score-expiry-days @vindex wl-score-expiry-days The initial setting is 7. This is the number of days before time-limited scores are deleted. @item wl-score-update-entry-dates @vindex wl-score-update-entry-dates The initial setting is @code{t}. If non-nil, it enables deletion of time-limited scores. @item wl-score-header-default-entry @vindex wl-score-header-default-entry Specifies the default value for each header field for score entries created by @code{wl-summary-increase-score}, @code{wl-summary-lower-score}, and @code{wl-score-edit-insert-entry}. @item wl-score-simplify-fuzzy-regexp @vindex wl-score-simplify-fuzzy-regexp In the case of a type of a score entry is @code{fuzzy}, this specifies a regular expression to be deleted from the string. Because this is usually used for Subject, the default is prefixes that are attached by mailing list programs. @item wl-summary-rescore-partial-threshold @vindex wl-summary-rescore-partial-threshold The initial setting is 200. When sync-all or rescan is executed, if there are messages more than this value, only the last same number of messages as this value are scored. @item wl-summary-auto-sync-marks @vindex wl-summary-auto-sync-marks If non-nil, unread/important marks are synchronized when the summary does. Unread marks reflect information on the IMAP4 server. Important marks reflect information on the IMAP4 server (flagged or not), and contents of @samp{'flag} folder. The initial setting is @code{t}. @end table @node Score File Format, , Score Commands, Scoring @section Score File Format @cindex Score File Format The format of score files are the same as Gnus, and basically you can use Gnus score files as they are. But they are not fully compatible because some keys are not supported and there are Wanderlust specifics. @xref{Score File Format, , ,gnus, Gnus Manual}. @lisp @group (("subject" ("for sale" -1000 nil s) ("profit" -1000 nil s)) ("from" ("spam@@spamspamspam" -10000 nil s)) ("followup" ("my@@address" 3001 nil s)) ("chars" (1000000 -10 nil >)) (important 5000) (target 3000) (mark 0) (expunge -3000)) @end group @end lisp @table @code @item string If the key is a string, it is the name of the header to be matched. The following keys are available: @code{Subject}, @code{From}, @code{Date}, @code{Message-ID}, @code{References}, @code{To}, @code{Cc}, @code{Chars}, @code{Lines}, @code{Xref}, @code{Extra}, @code{Followup}, @code{Thread} @code{Chars} and @code{Lines} mean the size and the number of lines of the message, respectively. @code{Extra}, @code{Followup}, @code{Thread} are described later. The rest corresponds the field of the same name. Arbitrary numbers of core entries are specified after the key. Each score entry consists of these five factors: @enumerate @item A factor that matches header. This should be a number in the cases of @code{lines} and @code{chars}, otherwise a string. @item A score factor. When the first item matches, the score of the message is increased or decreased by this value. @item A time limiting factor. If @code{nil}, the score is permanent, and in the case of a number, the score is deleted if it does not match for days (@code{wl-score-expiry-days}) from the date specified by this. The date is since Dec. 31, 1 B.C. @item A type factor. This specifies the way the first factor matches. Available types depend on keys. @table @dfn @item From, Subject, References, Message-ID For these keys in string, @code{r} and @code{R} (regexp), @code{s} and @code{S} (substring), @code{e} and @code{E} (exact match), as well as @code{f} and @code{F} (fuzzy) can be used. @code{R}, @code{S}, @code{E}, and @code{F} are case sensitive. @item Lines, Chars For these keys, the following five numerical relative operators can be used: @code{<}, @code{>}, @code{=}, @code{>=}, @code{<=}. @item Followup This key matches @code{From} header, and scores all follow-ups to the message. For example, it would be useful for increasing scores for follow-ups to you own article. You can use the same types as @code{From} except for @code{f}. And a @samp{Followup} entry is automatically appended to the score file. @item Thread This key scores (sub-)threads beginning with @code{Message-ID} @var{x}. A @samp{Thread} entry is automatically appended for each article that has @var{x} in the @code{References} header. You can make sure the whole thread including messages that does not have all ancestors @code{Message-ID} in @code{References} is scored. You can use the same types as @code{References} except for @code{f}. And a @samp{Thread} entry is automatically appended to the score file. @end table @item A factor for extension header. This is meaningful only if the key is @code{Extra}. This specifies headers to be matched other than standard headers like @code{Subject} and @code{From}. Note that you should specify the header in @code{elmo-msgdb-extra-fields} also. Therefore it does not work in folders where extension headers cannot be retrieved. @end enumerate The sum of these scores @emph{after all factors are applied} becomes the score of the message. @cindex Score File Atoms @item mark Messages with a score less than this value is marked as read. The default is @code{wl-summary-mark-below}. @item expunge Messages with a score less than this value is deleted from the summary. The default is @code{wl-summary-expunge-below}. @item mark-and-expunge Both @code{mark} and @code{expunge} are applied, i.e. messages with a score less than this value is marked as read and deleted from the summary. @item target Messages with a score greater than this value is attached with temp marks. The default is @code{wl-summary-target-above}. @item important Messages with a score greater than this value is attached with important marks. The default is @code{wl-summary-important-above}. @end table @subsection Caveats Not to mention the @code{extra} key, if @code{lines} or @code{xref} keys are used, you need to set @code{elmo-msgdb-extra-fields}. @lisp (setq elmo-msgdb-extra-fields '("lines" "xref")) @end lisp There are other restrictions as shown below: @itemize @bullet @item Because @samp{References} field in the summary information contains only the last @samp{Message-ID}, @code{references} key matches the last one only. @end itemize Keys that can be seen by folder of types: @example @group @multitable {nntp (supporting xover)} {chars} {lines} {xref} {extra} @headitem @tab chars @tab lines @tab xref @tab extra @item localdir,localnews @tab Y @tab E @tab E @tab E @item nntp (supporting xover) @tab Y @tab E @tab E @tab N @item (otherwise) @tab N @tab E @tab E @tab E @item imap4 @tab Y @tab E @tab E @tab E @item pop3 @tab N @tab E @tab E @tab E @end multitable Y: can be seen N: cannot be seen (ignored) E: can be seen with @code{elmo-msgdb-extra-fields} settings @end group @end example @node Address Book, Quick Search, Scoring, Top @chapter Address Book @cindex Address Book With address book, you can utilize address completion, and you have summary displayed with nicknames. @menu * Mail Addresses:: Definition of Address Book * Address Manager:: Address Manager @end menu @node Mail Addresses, Address Manager, Address Book, Address Book @section Address book @cindex Address book Definition @cindex .addresses @cindex Alias, Address The file @file{~/.addresses} is a simple address book for Wanderlust. Make address file @file{~/.addresses}, and edit to suit your requirement. The data written in @file{~/.addresses} are used for address completion under draft editing mode. Furthermore, they are used when showing names in summary display mode. You can safely skip this section, if you don't want to customize address completion and summary display. It is possible to add/change/remove addresses from @file{~/.addresses} in summary buffer after Wanderlust is invoked. @refill The format is very simple. Like this. @refill @example @group # # @r{Lines begin with @samp{#} are comment.} # @r{Empty lines are ignored} # # @r{Format of each line:} # @var{email-address} "@var{nickname} "@var{realname}" # teranisi@@gohome.org "Yuuichi" "Yuuichi Teranishi" foo@@bar.gohome.org "Mr. Foo" "John Foo" bar@@foo.gohome.org "Mr. Bar" "Michael Bar" @end group @end example @noindent One line defines one persons description. Actually, in default setup, @var{nickname} is used in summary-mode and @var{realname} is used in draft preparation mode. This behavior is better understood if you try it and confirmed the function first. You can write and try a small definition, so you will know the idea of the address book before writing a big one. And, if MH alias file is specified in variable @code{wl-alias-file}, it is used as an address information in the draft preparation mode. If variable @code{wl-use-ldap} is non-nil (initial setting is @code{nil}), address completion in draft mode uses LDAP information. If you use LDAP, you have to set @code{wl-ldap-server}, @code{wl-ldap-port} and @code{wl-ldap-base} properly. You also have to set command exec @env{PATH} to the program @command{ldapsearch}. @node Address Manager, , Mail Addresses, Address Book @section Address Manager @cindex Address Manager You can type @kbd{C-c C-a} to enter address manger mode. You can edit the address book and insert address to draft buffer. @subsection Key Bindings @table @kbd @item t @kindex t (Address Manager) @findex wl-addrmgr-set-to Add @samp{To:} mark. @item c @kindex c (Address Manager) @findex wl-addrmgr-set-cc Add @samp{Cc:} mark. @item b @kindex b (Address Manager) @findex wl-addrmgr-set-bcc Add @samp{Bcc:} mark. @item u @kindex u (Address Manager) @findex wl-addrmgr-unmark Cancel the mark. @item x @kindex x (Address Manager) @findex wl-addrmgr-apply Insert @samp{To:}, @samp{Cc:}, or @samp{Bcc:} marked addresses to draft buffer and quit address manager. When no draft buffer, make new draft with insert marked addresses. If no mark, quit address manager. @item q @kindex q (Address Manager) @findex wl-addrmgr-quit Quit address manager. @item a @kindex a (Address Manager) @findex wl-addrmgr-add Add new entry. @item d @kindex d (Address Manager) @findex wl-addrmgr-delete Delete entry. @item e @kindex e (Address Manager) @findex wl-addrmgr-edit Edit entry. @end table @node Quick Search, Spam Filter, Address Book, Top @chapter Quick Search @cindex Quick Search @code{wl-qs} provides an interface to quickly search your mail archive. It can use an external search engine (@ref{Search Folder}), Gmail search, or a filter folder (@ref{Filter Folder}). @code{wl-qs} provides the command @code{wl-quicksearch-goto-search-folder}. Using it will first prompt for a search, and then jump to the search results. @menu * Setup of Quick Search:: Setup * Usage of Quick Search:: Searching @end menu @node Setup of Quick Search, Usage of Quick Search,, Quick Search @section Setup of @code{wl-qs} To setup, configure the value of @code{wl-quicksearch-folder}. This should be the name of the folder you would like to search. For example, @samp{%[Gmail]/All Mail:username@@imap.gmail.com}, @samp{.archive} or @samp{[]}. The latter is advised if you use a mail index, such as mu, notmuch or namazu, as it is quite fast. @node Usage of Quick Search,, Setup of Quick Search, Quick Search @section Searching To search your mail archive, use the command @code{wl-quicksearch-goto-search-folder}, which can be called using @kbd{'} in a Summary buffer or the Folder buffer. You will be prompted for a search, and then will immediately jump to the search results. @subsection Search folder If you use specified @samp{[} as the value of @code{wl-quicksearch-folder}, you will be accessing a search folder (@ref{Search Folder}). You will be prompted for a search string. The syntax of the search will depend on the value of @code{elmo-search-default-engine}. Quotes will be escaped for you automatically and passed on to the search program. (If you are using the grep search engine, you must specify a target folder. Your @code{wl-quicksearch-folder} should look like @samp{[]~/Mail/semi!grep}.) @subsection Gmail If you use a gmail folder as your @code{wl-quicksearch-folder}, you will be prompted for a Gmail search query (@uref{https://support.google.com/mail/answer/7190}). You may use any Gmail search operator; the search is handled by Gmail's server. @subsection Filter folder If you are using any other type of folder, you will be prompted for a query using the interactive query builder. When you have finished your query, you will be directed to a filter folder for your @code{wl-quicksearch-folder}. @node Spam Filter, Advanced Issues, Quick Search, Top @chapter Spam Filter @cindex Spam Filter @code{wl-spam} provides an frontend to external spam filtering programs. You can register to or judge spam by the filtering program cooperateing with messages operations on Wanderlust. @menu * Usage of Spam Filter:: Usage of Spam Filter * Spam Filter Processors:: Supported spam filters @end menu @node Usage of Spam Filter, Spam Filter Processors, Spam Filter, Spam Filter @section Usage of Spam Filter @subsection Initial Setting To use @code{wl-spam}, write in @file{~/.wl} as follows: @lisp @group ;; @r{Use @samp{bogofilter} as spam back end} ;; @r{Set @samp{scheme} here as the spam filter you will use.} ;; @r{@xref{Spam Filter Processors}.} (setq elmo-spam-scheme 'bogofilter) (require 'wl-spam) @end group @end lisp @subsection spam mark The spam mark (@samp{s}) will be provided as new temporary mark. Messages marked by this will be refiled into @code{wl-spam-folder} when the action is called for execution. Marked messages will be skipped by summary walking in ordinary way. The spam mark is be put on by spam judgement described later, or by invoking @kbd{k m} at any time. @subsection spam judgment You can judge spam messages by following ways: @enumerate @item Make judgement on execution of auto-refile. Insert @code{wl-refile-guess-by-spam} to arbitrary position in @code{wl-auto-refile-guess-functions} as follows. @lisp @group (setq wl-auto-refile-guess-functions '(wl-refile-guess-by-rule wl-refile-guess-by-spam)) @end group @end lisp In this example, judge spam if it could not decide refile destination by @code{wl-refile-rule-alist}. @item Make judgement on entering the summary of specified folder. Specify the value of @code{wl-spam-auto-check-folder-regexp-list} as the list of regular expressions for folder names to be automatically judged by spam filter. @lisp (setq wl-spam-auto-check-folder-regexp-list '("\\+inbox")) @end lisp In this example, judgement will be processed when you enter summary of the folder whose name contains @samp{+inbox}. @item Make judgement on splitting messages with @code{elmo-split}. It provides new function @code{spam-p} to be specified as @samp{CONDITION} in @code{elmo-split-rule}. This function returns true when the message is judged as spam. @xref{Split messages}. You can also process learning by the result of judgement. (You would better turn on this feature after learning to some extent) Example follows: @lisp @group (setq elmo-split-rule '(((spam-p) "+spam") ;; @r{to learn by the judgement, use following instead} ;((spam-p :register t) "+spam") (t "+inbox")) @end group @end lisp @end enumerate @subsection spam learning @code{wl-spam} automatically learn spam with refiling messages. At first, @code{wl-spam} classifies the folders controlled by Wanderlust into following 4 domains by the class of containig messages @table @samp @item spam Folders containing messages judged as spam. (The folder specified by @code{wl-spam-folder}) @item good Folders containing messages judged as non-spam. @item undecide Folders containing messages not yet judged. Folders without pre-distribution may belong to this domain e.g. @samp{+inbox}. (specified by @code{wl-spam-undecided-folder-regexp-list}) @item ignored Foldes have nothing to do with spam processing e.g. @code{wl-trash-folder} or @code{wl-draft-folder}. (specified by @code{wl-spam-ignored-folder-regexp-list}) @end table When you refile messages across different domains, it automatically learn messages as @samp{spam} or @samp{non-spam} according to domains it belongs before and after. To put it concretely, it will learn by following rule: @table @samp @item undecide -> spam learn as spam. @item good -> spam learn as spam and cancel previous study as non-spam. @item undecide -> good learn as non-spam. @item spam -> good learn as non-spam and cancel previous study as spam. @end table It do not learn anything in other cases. @subsection Key Bindings @cindex Keybind, spam filter @table @kbd @item k m @kindex k m (Summary) @findex wl-summary-spam Put spam mark (@samp{s}) on current message. @item k c @kindex k c (Summary) @findex wl-summary-test-spam Test current message and put spam mark if judged as spam. Remove spam mark if judged as non-spam. @item k C @kindex k C (Summary) @findex wl-summary-mark-spam Test messages with the mark in @code{wl-spam-auto-check-marks}, and put spam mark if judged as spam. If it is called with prefix argument, test all messages regardless of their marks. @item k s @kindex k s (Summary) @findex wl-summary-register-as-spam Register current message as spam and put spam mark. @item k S @kindex k S (Summary) @findex wl-summary-register-as-spam-all Register all messages in the folder as spam and put spam mark. @item k n @kindex k n (Summary) @findex wl-summary-register-as-good Register current message as non-spam and remove spam mark. @item k N @kindex k N (Summary) @findex wl-summary-register-as-good-all Register all messages in the folder as non-spam and remove spam mark. @item r k m @kindex r k m (Summary) @findex wl-summary-spam-region Put spam mark on messages in the specified region. @item r k c @kindex r k c (Summary) @findex wl-summary-test-spam-region Test messages in the specified region and put spam mark if judged as spam. Remove spam mark if judged as non-spam. @item r k s @kindex r k s (Summary) @findex wl-summary-register-as-spam-region Register messages in the specified region as spam and put spam mark. @item r k n @kindex r k n (Summary) @findex wl-summary-register-as-good-region Register messages in the specified region as non-spam and remove spam mark. @item t k m @kindex t k m (Summary) @findex wl-thread-spam Put spam mark on messages which are the descendant of the current thread. With prefix argument, it affects on the all messages in the thread tree. @item t k c @kindex t k c (Summary) @findex wl-thread-test-spam Test messages which are the descendant of the current thread and put spam mark if judged as spam. Remove spam mark if judged as non-spam. With prefix argument, it affects on the all messages in the thread tree. @item t k s @kindex t k s (Summary) @findex wl-thread-register-as-spam Register messages which are the descendant of the current thread as spam and put spam mark. With prefix argument, it affects on the all messages in the thread tree. @item t k n @kindex t k n (Summary) @findex wl-thread-register-as-good Register messages which are the descendant of the current thread as non-spam and remove spam mark. With prefix argument, it affects on the all messages in the thread tree. @item m k @kindex m k (Summary) @findex wl-summary-target-mark-spam Put spam mark (@samp{s}) on messages with the target mark @samp{*}. @item m s @kindex m s (Summary) @findex wl-summary-target-mark-register-as-spam Register messages with the target mark @samp{*} as spam and put spam mark. @item m n @kindex m n (Summary) @findex wl-summary-target-mark-register-as-good Register messages with the target mark @samp{*} as non-spam and remove spam mark. @end table @subsection Customizable Variables @table @code @item wl-spam-folder @vindex wl-spam-folder Specify the name of destination folder for the spam messages. The initial setting is @samp{+spam}. @item wl-spam-undecided-folder-regexp-list @vindex wl-spam-undecided-folder-regexp-list Specify the list of regexp of folder names which contain messages not yet decided as spam or non-spam. The initial setting is @code{'("inbox")}. @item wl-spam-ignored-folder-regexp-list @vindex wl-spam-ignored-folder-regexp-list The initial setting is as follows. @lisp @group (list (regexp-opt (list wl-draft-folder wl-trash-folder wl-queue-folder))) @end group @end lisp Folders of no effect against spam judgement, specified by the list of folder name regular expressions. @item wl-spam-auto-check-folder-regexp-list @vindex wl-spam-auto-check-folder-regexp-list Folders to make spam judgement on entering the summary of them, specified by the list of folder name regular expressions. The initial setting is @code{nil}. @item wl-spam-auto-check-marks @vindex wl-spam-auto-check-marks The initial setting is the following list: @lisp @group (list wl-summary-new-uncached-mark wl-summary-new-cached-mark) @end group @end lisp Messages with mark specified by this variable will be processed by whole-folder judgement including auto test by @code{wl-spam-auto-check-folder-regexp-list}. Persistent marks can be used in this method, but temporary marks cannot. You can specify the list of marks as the initial setting, or you can specify follwing symbol: @table @code @item all Process all messages regardless of persistent marks. @end table @end table @node Spam Filter Processors, , Usage of Spam Filter, Spam Filter @section Supported Spam Filters @cindex Spam Filter, Bogofilter @cindex Spam Filter, Spamfilter Supported spam filtering libraries are following ones. @menu * bogofilter:: bogofilter * spamfilter:: spamfilter.el * bsfilter:: bsfilter * SpamAssassin:: SpamAssassin * SpamOracle:: SpamOracle * Regular Expressions Header Matching:: Header regexp @end menu @node bogofilter, spamfilter, Spam Filter Processors, Spam Filter Processors @subsection bogofilter @cindex bogofilter bogofilter (@uref{http://bogofilter.sourceforge.net/}) is a spam filter implemented by C language. To use spam filter with bogofilter, write following setting in @file{~/.wl} or somewhere else. @lisp @group (setq elmo-spam-scheme 'bogofilter) @end group @end lisp @subsubsection Customizable Variables @table @code @item elmo-spam-bogofilter-program @vindex elmo-spam-bogofilter-program The initial setting is @file{bogofilter}. Specify the name of executable of bogofilter. If the executable is not in your environmental variable @env{PATH}, you should set this by full path. @item elmo-spam-bogofilter-args @vindex elmo-spam-bogofilter-args The initial setting is @code{nil}. Specify arguments to be supplied for bogofilter executable. @item elmo-spam-bogofilter-database-directory @vindex elmo-spam-bogofilter-database-directory Specify the directory for statistical database to be used. @code{nil} to use default directory (@file{~/.bogofilter}). The initial setting is @code{nil}. @item elmo-spam-bogofilter-max-messages-per-process @vindex elmo-spam-bogofilter-max-messages-per-process The initial setting is 30. This variable specifies the number of messages to be learned by one process. @item elmo-spam-bogofilter-debug @vindex elmo-spam-bogofilter-debug The initial setting is @code{nil}. If you specify non-nil, the output from @command{bogofilter} is stored in the buffer named @code{"*Debug ELMO SPAM Bogofilter*"}. @end table @node spamfilter, bsfilter, bogofilter, Spam Filter Processors @subsection spamfilter.el @cindex spamfilter @file{spamfilter.el} (@uref{http://www.geocities.co.jp/SiliconValley-PaloAlto/7043/}) is a spam filtering library implemented by Emacs Lisp. Corresponding modules will be compiled/installed, if you have @file{spamfilter.el} within @code{load-path} when you are to install wl. @xref{Install}. To use @file{spamfilter.el}, write following setting in @file{~/.wl} or somewhere else. (Of cource, you have to have settings for @file{spamfilter.el} itself) @lisp @group (setq elmo-spam-scheme 'spamfilter) @end group @end lisp @subsubsection Customizable Variables @table @code @item elmo-spam-spamfilter-corpus-filename @vindex elmo-spam-spamfilter-corpus-filename The initial setting is @file{~/.elmo/.spamfilter}. It specifies the name of corpus file. @end table @node bsfilter, SpamAssassin, spamfilter, Spam Filter Processors @subsection bsfilter @cindex bsfilter bsfilter (@uref{http://bsfilter.org/index-e.html}) is a spam filter implemented by Ruby language. To use spam filter with bsfilter, write following setting in @file{~/.wl} or somewhere else. @lisp @group (setq elmo-spam-scheme 'bsfilter) @end group @end lisp @subsubsection Customizable Variables @table @code @item elmo-spam-bsfilter-program @vindex elmo-spam-bsfilter-program The initial setting is @file{bsfilter}. Specify the name of executable of @command{bsfilter}. If the executable is not in your environmental variable @env{PATH}, you should set this by full path. @item elmo-spam-bsfilter-args @vindex elmo-spam-bsfilter-args The initial setting is @code{nil}. Specify arguments to be supplied for bsfilter executable. @item elmo-spam-bsfilter-database-directory @vindex elmo-spam-bsfilter-database-directory Specify the directory for statistical database to be used. @code{nil} to use default directory (@file{~/.bsfilter}). The initial setting is @code{nil}. @item elmo-spam-bsfilter-debug @vindex elmo-spam-bsfilter-debug The initial setting is @code{nil}. If you specify non-nil, the output from @command{bsfilter} is stored in the buffer named @code{"*Debug ELMO Bsfilter*"}. @item elmo-spam-bsfilter-shell-program @vindex elmo-spam-bsfilter-shell-program The initial setting is @file{ruby}. Specify the shell to execute @command{bsfilter}. If the shell is not in your environmental variable @env{PATH}, you should set this by full path. @item elmo-spam-bsfilter-shell-switch @vindex elmo-spam-bsfilter-shell-switch The initial setting is @code{nil}. Specify options to give to the shell executing @command{bsfilter}. @item elmo-spam-bsfilter-update-switch @vindex elmo-spam-bsfilter-update-switch The initial setting is @code{"--auto-update"}. Specify options to give to @command{bsfilter} for learning messages. @end table @node SpamAssassin, SpamOracle, bsfilter, Spam Filter Processors @subsection SpamAssassin @cindex SpamAssassin SpamAssassin (@uref{http://spamassassin.org/}) is one of the most popular spam filtering program implemented on Perl. SpamAssassin attempts to identify spam using text analysis and several internet-based realtime blacklists. SpamAssassin also uses a Bayesian learning filter which enables more accurate spam filtering. To use @file{SpamAssassin} on Wanderlust, write following setting in @file{~/.wl} or somewhere else. (Of course, you have to install SpamAssassin beforehand.) @lisp @group (setq elmo-spam-scheme 'sa) @end group @end lisp @subsubsection Customize Variables @table @code @item elmo-spam-spamassassin-program @vindex elmo-spam-spamassassin-program The initial setting is @file{spamassassin}. Specify the name of executable @command{spamassassin}. If the executable is not in your environmental variable @env{PATH}, you should set this by full path. @item elmo-spam-spamassassin-learn-program @vindex elmo-spam-spamassassin-learn-program The initial setting is @file{sa-learn}. Specify the name of the SpamAssassin's Bayesian filtering learner program, @command{sa-learn}. If the executable is not in your environmental variable @env{PATH}, you should set this by full path. @item elmo-spam-spamassassin-program-arguments @vindex elmo-spam-spamassassin-program-arguments The initial setting is @code{'("-e")}. Specify the arguments to be supplied for @command{spamassassin} executable. You have to specify the argument to exit the program with an error exit code when the result is spam. For example, if you want to use @command{spamc} instead of @command{spamassassin}, you should specify @code{'("-c")}. @item elmo-spam-spamassassin-learn-program-arguments @vindex elmo-spam-spamassassin-lern-program-arguments The initial setting is @code{nil}. Specify the arguments to be supplied for @command{sa-learn}. @item elmo-spamassassin-debug @vindex elmo-spamassassin-debug The initial setting is @code{nil}. If you specify @code{t}, the output from @command{spamassassin} is stored in the buffer named @code{"*Debug ELMO SpamAssassin*"}. @end table @node SpamOracle, Regular Expressions Header Matching, SpamAssassin, Spam Filter Processors @subsection SpamOracle @cindex SpamOracle SpamOracle (@uref{http://pauillac.inria.fr/~xleroy/software.html#spamoracle}) is a spam filter implemented by Objective Caml language. To use spam filter with @file{spamoracle}, write following setting in @file{~/.wl} or somewhere else. (Of course, you have to install SpamOracle beforehand.) @lisp @group (setq elmo-spam-scheme 'spamoracle) @end group @end lisp @subsubsection Customizable Variables @table @code @item elmo-spam-spamoracle-program @vindex elmo-spam-spamoracle-program The initial setting is @file{spamoracle}. Specify the name of executable of spamoracle. If the executable is not in your environmental variable @env{PATH}, you should set this by full path. @item elmo-spam-spamoracle-config-filename @vindex elmo-spam-spamoracle-config-filename Specify the name of config file. @code{nil} to use default file (@file{~/.spamoracle.conf}). The initial setting is @code{nil}. @item elmo-spam-spamoracle-database-filename @vindex elmo-spam-spamoracle-database-filename The initial setting is @file{~/.elmo/.spamoracle.db}. It specifies the name of database file. @item elmo-spam-spamoracle-spam-header-regexp @vindex elmo-spam-spamoracle-spam-header-regexp The initial setting is @code{"^X-Spam: yes;"}. It specifies the regular expression of the header that indicates spam mail. Use this setting when you change the @code{spam_header} parameter in the config file. @end table @node Regular Expressions Header Matching, , SpamOracle, Spam Filter Processors @subsection Regular Expressions Header Matching @cindex Regular Expressions Header Matching Examine if regular expression matches corresponding field in message heaeder, and decide spam or not. To use this backend, add following setting to @file{~/.wl}. @lisp @group (setq elmo-spam-scheme 'header) @end group @end lisp If you want to check fields not included in the default overview information, add one into @code{elmo-msgdb-extra-fields}. Then it will do examination by the overview information and avoid loading whole message body as far as possible. @subsubsection Customize Variables @table @code @item elmo-spam-header-good-alist @vindex elmo-spam-header-good-alist The initial setting is the following list: @lisp '(("X-Spam-Flag" . "No")) @end lisp Specify a list of regular expressions to match with header field name for making non-spam decision. It takes precedence over @code{elmo-spam-header-spam-alist}. @item elmo-spam-header-spam-alist @vindex elmo-spam-header-spam-alist The initial setting is the following list: @lisp '(("X-Spam-Flag" . "Yes")) @end lisp Specify a list of regular expressions to match with header field name for making spam decision. @end table @node Advanced Issues, Migration, Spam Filter, Top @chapter Advanced Issues @cindex Advanced Issues @menu * Living with other packages:: Cooperating with other packages * Highlights:: Highlights * Biff:: Notify Mail arrival * Password Management:: Manage Passwords * Split messages:: Splitting messages * Batch Processing:: Invoke commands in batch mode * Advanced Settings:: Advanced Settings * Customizable Variables:: Customizable Variables * Hooks:: Hooks @end menu @node Living with other packages, Highlights, Advanced Issues, Advanced Issues @section Living with other packages Examples with other packages. @menu * imput:: imput (im-wl.el) * BBDB:: The Insidious Big Brother Database * LSDB:: The Lovely Sister Database * supercite:: supercite.el * mu-cite:: mu-cite.el * X-Face:: x-face,bitmap-mule * dired-dd:: dired-dd.el * MHC:: MHC * Addrbook:: Addrbook * mime-w3m:: mime-w3m.el @end menu @node imput, BBDB, Living with other packages, Living with other packages @subsection imput @pindex imput @cindex im-wl Place @file{util/im-wl.el} on the @code{load-path} and do the following settings. @lisp @group (autoload 'wl-draft-send-with-imput-async "im-wl") (setq wl-draft-send-function 'wl-draft-send-with-imput-async) @end group @end lisp @node BBDB, LSDB, imput, Living with other packages @subsection bbdb.el @pindex BBDB The Insidious Big Brother Database (@uref{http://savannah.nongnu.org/projects/bbdb/}) supports Wanderlust since 3.2. Please ask details of setings to mailing list of Wanderlust of BBDB. @xref{Mailing List}. @node LSDB, supercite, BBDB, Living with other packages @subsection lsdb.el @pindex LSDB The following is an example setting to use The Lovely Sister Database (@uref{http://sourceforge.jp/projects/lsdb/}) with Wanderlust. @lisp @group (require 'lsdb) (lsdb-wl-insinuate) (add-hook 'wl-draft-mode-hook (lambda () (define-key wl-draft-mode-map "\M-\t" 'lsdb-complete-name))) @end group @end lisp In this example, bind @kbd{M-@key{TAB}} to @code{lsdb-complete-name} (complete address with LSDB). @node supercite, mu-cite, LSDB, Living with other packages @subsection sc.el(supercite), sc-register.el @pindex sc @pindex supercite The same setting as usual mailers should be OK. The following is an example of settings: @lisp @group (autoload 'sc-cite-original "supercite" nil t) (add-hook 'mail-citation-hook 'sc-cite-original) @end group @end lisp @node mu-cite, X-Face, supercite, Living with other packages @subsection mu-cite.el @pindex mu-cite The same setting as usual mailers should be OK. The following is an example of settings. @lisp @group (autoload 'mu-cite-original "mu-cite" nil t) (add-hook 'mail-citation-hook (function mu-cite-original)) @end group @end lisp @node X-Face, dired-dd, mu-cite, Living with other packages @subsection x-face @pindex x-face If you have installed one of the following, you can decode @samp{X-Face:} field in message buffer and you will see face image. @menu * x-face-mule:: Emacs case @end menu If there is an encoded X-Face string in a file @file{~/.xface} (the value of the variable @code{wl-x-face-file}), it is inserted as a @samp{X-Face:} field in the draft buffer (if @code{wl-auto-insert-x-face} is non-nil). @node x-face-mule, , X-Face, X-Face @subsubsection x-face-mule @pindex x-face-mule @pindex bitmap-mule If you use @file{x-face-mule.el} in bitmap-mule (@uref{ftp://ftp.jpl.org/pub/elisp/bitmap/}) 8.0 or later, do the following: @lisp @group (autoload 'x-face-decode-message-header "x-face-mule") (setq wl-highlight-x-face-function 'x-face-decode-message-header) @end group @end lisp @subsubsection x-face-e21 @pindex x-face-e21 You can use @file{x-face-e21.el} (@uref{ftp://jpl.org/pub/elisp/}) instead of @file{x-face-mule.el} to display X-Face. In this case, bitmap-mule is not required. Do as follows: @lisp @group (autoload 'x-face-decode-message-header "x-face-e21") (setq wl-highlight-x-face-function 'x-face-decode-message-header) @end group @end lisp @node dired-dd, MHC, X-Face, Living with other packages @subsection dired-dd(Dired-DragDrop) @pindex Dired-DragDrop @pindex Dired-DD @cindex Drag and Drop If you embed @file{dired-dd-mime.el} in the dired-dd package, you can compose multi-part by simple Drag-and-Drop from dired to the draft buffer being edited in GNU Emacs (this feature is not Wanderlust specific, but general-purpose for SEMI). @lisp @group ;; @r{dired-dd:} http://www.asahi-net.or.jp/~pi9s-nnb/dired-dd-home.html (add-hook 'dired-load-hook (function (lambda () (load "dired-x") ;; @r{Set dired-x variables here.} ;; @r{To and flo@dots{}} (if window-system (progn (require 'dired-dd) (require 'dired-dd-mime)))))) @end group @end lisp @node MHC, Addrbook, dired-dd, Living with other packages @subsection mhc.el @pindex MHC Message Harmonized Calendaring system (@uref{http://www.quickhack.net/mhc/}) By using MHC, you can make a calendar from the messages. For mhc-0.25: @lisp @group (setq mhc-mailer-package 'wl) (autoload 'mhc-mode "mhc" nil t) (add-hook 'wl-summary-mode-hook 'mhc-mode) (add-hook 'wl-folder-mode-hook 'mhc-mode) @end group @end lisp For mhc-current: @lisp @group (autoload 'mhc-wl-setup "mhc-wl") (add-hook 'wl-init-hook 'mhc-wl-setup) @end group @end lisp @node Addrbook, mime-w3m, MHC, Living with other packages @subsection wl-addrbook.el @pindex Addrbook Addrbook of Mew (@uref{http://www.mew.org/}) Place @file{util/wl-addrbook.el} and @file{util/wl-complete.el} on the @code{load-path} and do the following settings. @lisp @group (require 'wl-addrbook) (wl-addrbook-setup) @end group @end lisp @node mime-w3m, , Addrbook, Living with other packages @subsection mime-w3m.el @pindex mime-w3m You can display html part by using @file{mime-w3m.el} distributed with emacs-w3m (@uref{http://emacs-w3m.namazu.org/}). You can find the usage in comment region at the head of @file{mime-w3m.el}. If you use SEMI-EPG, no additional setting is needed. @node Highlights, Biff, Living with other packages, Advanced Issues @section Highlights @subsection Customizable Variables @table @code @item wl-summary-highlight @vindex wl-summary-highlight The initial setting is @code{t}. If non-nil, the summary is highlighted. @item wl-highlight-max-summary-lines @vindex wl-highlight-max-summary-lines The initial setting is 10000. The summary is not highlighted if it has more lines than this value. @item wl-summary-highlight-partial-threshold @vindex wl-summary-highlight-partial-threshold The initial setting is 1000. This is a threshold whether the whole summary is highlighted. If there are more lines of messages in the summary, it is partially highlighted. @item wl-summary-partial-highlight-above-lines @vindex wl-summary-partial-highlight-above-lines The initial setting is 30. If there are more lines of messages than @code{wl-summary-highlight-partial-threshold} in the summary, messages after the point that is the same number of lines as this value above the cursor line are highlighted partially. (If this value is @code{nil}, the last same number of lines as the value of @code{wl-summary-highlight-partial-threshold} are highlighted.) @item wl-highlight-body-too @vindex wl-highlight-body-too The initial setting is @code{t}. If non-nil, bodies of drafts and messages are also highlighted. @item wl-highlight-message-header-alist @vindex wl-highlight-message-header-alist When highlighting headers of drafts and messages, this variable specifies which faces are allocated to important (@code{wl-highlight-message-important-header-contents}), secondly important (@code{wl-highlight-message-important-header-contents2}), and unimportant (@code{wl-highlight-message-unimportant-header-contents}) message headers. Similarly, it can be used for allocating arbitrary faces to arbitrary regular expressions. @item wl-highlight-citation-prefix-regexp @vindex wl-highlight-citation-prefix-regexp Specifies a regular expression to which quoted lines in bodies of drafts and messages match. Bodies matching to this regular expression are highlighted by the faces specified by (@code{wl-highlight-message-cited-text-*}). @item wl-highlight-highlight-citation-too @vindex wl-highlight-highlight-citation-too The initial setting is @code{nil}. If non-nil, the quoting regular expression itself given by @code{wl-highlight-citation-prefix-regexp} is also highlighted. @item wl-highlight-citation-header-regexp @vindex wl-highlight-citation-header-regexp Specifies a regular expression that denotes beginning of quotation. Bodies matching to this regular expression are highlighted by the face specified by @code{wl-highlight-message-headers}. @item wl-highlight-max-header-size @vindex wl-highlight-max-header-size The initial setting is @code{nil}. If a header size is larger than this value, it will not be highlighted. If @code{nil}, always highlighted (ignore header size). @item wl-highlight-max-message-size @vindex wl-highlight-max-message-size The initial setting is 10000. If a message is larger than this value, it will not be highlighted. With this variable, highlight is suppressed for uuencode or huge digest messages. @item wl-highlight-signature-separator @vindex wl-highlight-signature-separator Specifies regular expressions that denotes the boundary of a signature. It can be a regular expression, or a list of ones. Messages after the place that matches this regular expression are highlighted by the face specified by @code{wl-highlight-message-signature}. @item wl-max-signature-size @vindex wl-max-signature-size The initial setting is 400. This is the largest size for a signature to be highlighted. @item wl-use-highlight-mouse-line @vindex wl-use-highlight-mouse-line The initial setting is @code{t}. If non-nil, the line pointed by the mouse is highlighted in the folder mode, summary mode, and the like. @end table @subsection Setting Colors and Fonts of the Characters If you want to change colors or fonts of the characters, you need to modify faces defined in Wanderlust. Use @code{set-face-font} if you want to change fonts, and @code{set-face-foreground} for colors, and so on. You cannot write face settings in @file{.emacs}; write in @file{~/.wl}. For example, if you want to change the color for signatures to yellow, write @lisp (set-face-foreground 'wl-highlight-message-signature "yellow") @end lisp @noindent in @file{~/.wl}. Faces defined in Wanderlust: @table @code @item wl-highlight-message-headers The face for field names of message headers. @item wl-highlight-message-header-contents The face for field bodies of message headers. @item wl-highlight-message-important-header-contents The face for important parts of message headers. Per default, this face is used for a body of @samp{Subject:} field. You can change its value by editing @code{wl-highlight-message-header-alist}. @item wl-highlight-message-important-header-contents2 The face for secondly important parts of message headers. Per default, this face is used for bodies of @samp{From:} and @samp{To:} fields. You can change its value by editing @code{wl-highlight-message-header-alist}. @item wl-highlight-message-unimportant-header-contents The face for unimportant parts of message headers. Per default, this face is used for bodies of @samp{X-} fields @samp{User-Agent:} fields. You can change its value by editing @code{wl-highlight-message-header-alist}. @item wl-highlight-message-citation-header The face for headers of quoted messages. @item wl-highlight-message-cited-text-* The face for texts of quoted messages. The last @samp{*} is a @var{single figure} so that 10 different colors can be used according to citation levels. @item wl-highlight-message-signature The face for signatures of messages. The initial settings are @samp{khaki} for light background colors, and @samp{DarkSlateBlue} for dark background colors. @item wl-highlight-header-separator-face The face for header separators of draft messages. @item wl-highlight-summary-important-face The face for message lines with important marks in the summary. @item wl-highlight-summary-new-face The face for message lines with new marks in the summary. @item wl-highlight-summary-displaying-face The face for the message line that is currently displayed. This face is overlaid. @item wl-highlight-thread-indent-face The face for the threads that is currently displayed. @item wl-highlight-summary-unread-face The face for message lines with unread marks in the summary. @item wl-highlight-summary-deleted-face The face for message lines with delete marks in the summary. @item wl-highlight-summary-refiled-face The face for message lines with re-file marks in the summary. @item wl-highlight-refile-destination-face The face for re-file information part of message lines with re-file marks in the summary. @item wl-highlight-summary-copied-face The face for message lines with copy marks in the summary. @item wl-highlight-summary-target-face The face for message lines with target marks @samp{*} in the summary. @item wl-highlight-summary-thread-top-face The face for message lines that are on the top of the thread in the summary. @item wl-highlight-summary-normal-face The face for message lines that are not on top of the thread in the summary. @item wl-highlight-folder-unknown-face The face for folders that are not known to have how many unsync messages in the folder mode. @item wl-highlight-folder-zero-face The face for folders that have no unsync messages in the folder mode. @item wl-highlight-folder-few-face The face for folders that have some unsync messages in the folder mode. @item wl-highlight-folder-many-face The face for folders that have many unsync messages in the folder mode. The boundary between `some' and `many' is specified by the variable @code{wl-folder-many-unsync-threshold}. @item wl-highlight-folder-unread-face The face for folders that have no unsync but unread messages in the folder mode. @item wl-highlight-folder-killed-face The face for folders that are deleted from the access group in the folder mode. @item wl-highlight-folder-opened-face The face for open groups in the folder mode. It is meaningful when @code{wl-highlight-folder-by-numbers} is @code{nil} or a @var{number}. @item wl-highlight-folder-closed-face The face for close groups in the folder mode. It is meaningful when @code{wl-highlight-folder-by-numbers} is @code{nil} or a @var{number}. @item wl-highlight-folder-path-face The face for the path to the currently selected folder in the folder mode. @item wl-highlight-logo-face The face for logo in the demo. @item wl-highlight-demo-face The face for strings (for example, a version number) in the demo. @end table @node Biff, Password Management, Highlights, Advanced Issues @section Notify Mail arrival @cindex Biff Following setting is to notify mail arrival of @samp{%inbox} by the indicator on the modeline @lisp (setq wl-biff-check-folder-list '("%inbox")) @end lisp @subsection Customizable Variables @table @code @item wl-biff-check-folder-list @vindex wl-biff-check-folder-list The initial setting is @code{nil}. This is the list of folders to check mail arrival. If @code{nil}, wl doesn't check mail arrival. @item wl-biff-check-interval @vindex wl-biff-check-interval The initial setting is 40 (in seconds). Check mail arrival in this period. @item wl-biff-check-delay @vindex wl-biff-check-delay The initial setting is 0 (in seconds). Check mail when the time spcified by @code{wl-biff-check-interval} has passed and idling time exceeds specified seconds by this variable. @item wl-biff-use-idle-timer @vindex wl-biff-use-idle-timer The initial setting is @code{nil}. If it is @code{nil}, check mail arrival when the time specified by @code{wl-biff-check-interval} has passed. If it is non-nil, check mail arrival when idling time exceeds @code{wl-biff-check-interval}. @item wl-biff-notify-hook @vindex wl-biff-notify-hook This hook is run at the arrival of new mail. To beep with mail arrival (initial setting), set as follows. @lisp (setq wl-biff-notify-hook '(ding)) @end lisp For silence, set to @code{nil}. @item wl-biff-unnotify-hook @vindex wl-biff-unnotify-hook This hook is run if there were new mails at the last check and there is no new mail at the current check. @end table @node Password Management, Split messages, Biff, Advanced Issues @section Manage Passwords If you input passwords to connect servers, they are stored in the variable @code{elmo-passwd-storage} per connection. You should be careful that others might read your passwords if they can touch your Emacs, since encoded plain passwords are there. @findex elmo-passwd-alist-clear @findex elmo-passwd-alist-save If you invoke @kbd{M-x elmo-passwd-alist-save} while you have stored passwords, then they are saved on the file, and it will save you to input passwords. In this case, the risk that someone reads your keystroke might decrease, but please note that plain passwords are stored on a file. You should treat them very carefully. To remove saved passwords on file, invoke @kbd{M-x elmo-passwd-alist-clear} and then @kbd{M-x elmo-passwd-alist-save}. @table @code @item elmo-passwd-alist-file-name @vindex elmo-passwd-alist-file-name The initial setting is @file{passwd}. This is the name of the file in which passwords are saved. @code{elmo-passwd-alist-save} saves current passwords to the file. @item elmo-passwd-life-time @vindex elmo-passwd-life-time The initial setting is @code{nil}. If the value is some number, timer is set to remove password entry after @code{elmo-passwd-life-time} seconds since you input the password. @code{nil} means never to remove passwords. @end table @menu * Auth-source:: Using auth-source for password managament @end menu @node Auth-source, , Password Management, Password Management @subsection Using auth-source for password managament @cindex auth-source @vindex elmo-passwd-storage-type If you write as @code{(setq elmo-passwd-storage-type 'auth-source)} in your @file{~/.wl}, you can use auth-source (@pxref{Top, , ,auth, Emacs auth-source}) for password management. @subsubsection Limitations of using auth-source Thre are some limitations for auth-source. @itemize @bullet @item password is not distinguished by protocol name nor authentication mechanism. @item If you have multiple accounts on the one host, you have to prepare password entry before use. In such case, you can't input password interactively. It may be limitaion of netrc backend. @end itemize @node Split messages, Batch Processing, Password Management, Advanced Issues @section Message splitting @cindex Split messages You can use @code{elmo-split} to split message in folder specified by the variable @code{elmo-split-folder} a la @command{procmail} according to some specified rules. To use this feature, set as follows in your @file{~/.emacs} at first. @lisp (autoload 'elmo-split "elmo-split" "Split messages on the folder." t) @end lisp Set source folder like following. @lisp (setq elmo-split-folder "%inbox") @end lisp And specify the rule in the variable @code{elmo-split-rule} (its format will be is described below). Then you can invoke @kbd{M-x elmo-split} to split messages according to @code{elmo-split-rule}. On the other hand, invoke @kbd{C-u M-x elmo-split} to do a rehearsal and show result (do not split actually). We will describe how to specify the rule. First of all, see following example, please. @lisp @group (setq elmo-split-rule ;; @r{Store messages from spammers into @samp{+junk}} '(((or (address-equal from "i.am@@spammer") (address-equal from "dull-work@@dull-boy") (address-equal from "death-march@@software") (address-equal from "ares@@aon.at") (address-equal from "get-money@@richman")) "+junk") ;; @r{Store messages from mule mailing list into @samp{%mule}} ((equal x-ml-name "mule") "%mule") ;; @r{Store messages from wanderlust mailing list into @samp{%wanderlust}} ;; @r{and continue evaluating following rules} ((equal x-ml-name "wanderlust") "%wanderlust" continue) ;; @r{Store messages from Yahoo user into @samp{+yahoo-@{username@}}} ((match from "\\(.*\\)@@yahoo\\.com") "+yahoo-\\1") ;; @r{Store unmatched mails into @samp{+inbox}} (t "+inbox"))) @end group @end lisp The basic unit of the rule is a combination like @lisp (@samp{CONDITION} @samp{ACTION} [@code{continue}]) @end lisp If @samp{CONDITION} is true, @samp{ACTION} is performed. The 1st element @samp{CONDITION} is a condition represented by a balanced expression (sexp). Its grammar will be explained below. The 2nd element @samp{ACTION} is the name of the folder to split messages into, or a symbol. When the 3rd element @code{continue} is specified as symbol, evaluating rules is not stopped even when the condition is satisfied. The grammar for @samp{CONDITION} is as follows. See example above to learn how to write the condition practically. @enumerate @item Functions which accept arguments @samp{FIELD-NAME} and @samp{VALUE}. (@samp{FIELD-NAME} is a symbol that describes the field name) @table @code @item @code{equal} True if the field value equals to @samp{VALUE}. Case of the letters are ignored. @item @code{match} True if the field value matches to VALUE. @samp{VALUE} can contain @code{\&} and @code{\N} which will substitute from matching @code{\(\)} patterns in the previous @samp{VALUE}. @item @code{address-equal} True if one of the addresses in the field equals to @samp{VALUE}. Case of the letters are ignored. @item @code{address-match} True if one of the addresses in the field matches to @samp{VALUE}. @samp{VALUE} can contain @code{\&} and @code{\N} which will substitute from matching @code{\(\)} patterns in the previous @samp{VALUE}. @end table @item Functions which accept an integer argument (@samp{SIZE}). @table @code @item @code{<} True if the size of the message is less than @samp{SIZE}. @item @code{>} True if the size of the message is greater than @samp{SIZE}. @end table @item Functions which accept any number of arguments. @table @code @item @code{or} True if one of the argument returns true. @item @code{and} True if all of the arguments return true. @end table @item A symbol. When a symbol is specified, it is evaluated. @end enumerate You can specify followings as 2nd @samp{ACTION}. @enumerate @item folder name If some string is specified, it will be regarded as the destination folder, and the message will be appended to it. @item @samp{delete} If the symbol @samp{delete} is specified, delete the substance of the message in @code{elmo-split-folder} @item @samp{noop} If the symbol @samp{noop} is specified, do nothing on the message and keep it as it is. @item function If some function is specified, execute it. @end enumerate If the message passes all rules, it will be dealed along @samp{ACTION} specified by @code{elmo-split-default-action}. @node Batch Processing, Advanced Settings, Split messages, Advanced Issues @section Batch Processing @cindex Batch Processing You can request wanderlust to do some job on the command line. For now, you can invoke prefetching new messages in specified folders. Specify target folders in @code{wl-batch-prefetch-folder-list} then invoke as follows to execute prefetching: @example @group % emacs -batch -l wl-batch -f wl-batch-prefetch @end group @end example @subsection Customize Variables @table @code @item wl-batch-prefetch-folder-list @vindex wl-batch-prefetch-folder-list Target folders of prefetching by @code{wl-batch-prefetch}, specified as a list of folder names. @end table @node Advanced Settings, Customizable Variables, Batch Processing, Advanced Issues @section Advanced Settings @menu * Draft for Reply:: Draft for Reply * Thread Format:: Appearance of Thread * User-Agent Field:: @samp{User-Agent:} Header Field @end menu @node Draft for Reply, Thread Format, Advanced Settings, Advanced Settings @subsection Draft for Replay @vindex wl-draft-reply-with-argument-list @vindex wl-draft-reply-without-argument-list If you type @kbd{a} in the Summary Buffer, a draft for reply is prepared. The addressee for the draft is decided by following rules. For example, you can set as follows: @lisp @group (setq wl-draft-reply-without-argument-list '(("Mail-Followup-To" . (("Mail-Followup-To") nil ("Newsgroups"))) ("Followup-To" . (nil nil ("Followup-To"))) (("X-ML-Name" "Reply-To") . (("Reply-To") nil nil)) ("From" . (("From") ("To" "Cc") ("Newsgroups"))))) @end group @end lisp Where each element of the list @code{wl-draft-reply-without-argument-list} is in the form @example (key . (to-list cc-list newsgroup-list)) @end example and if the field designated by @samp{key} exist in the parent message, parent's field values designated by @samp{to-list} are copied to @samp{To:} in the draft. Similarly, parent's fields designated by @samp{cc-list} and @samp{newsgroup-list} are copied to @samp{Cc:} and @samp{Newsgroups:} in the draft respectively. Examples: @lisp ("Mail-Followup-To" . (("Mail-Followup-To") nil ("Newsgroups"))) @end lisp Match if the parent has @samp{Mail-Followup-To} field. The components of parent's @samp{Mail-Followup-To} and @samp{Newsgroups} fields are copied to @samp{To} and @samp{Newsgroups} in the draft respectively. @lisp (("X-ML-Name" "Reply-To") . (("Reply-To") nil nil)) @end lisp Match if the parent has both @samp{X-ML-Name} and @samp{Reply-To} fields. Parent's @samp{Reply-To} is copied to @samp{To} in the draft. @lisp ("From" . (("From") ("To" "Cc") ("Newsgroups"))) @end lisp Copy parent's @samp{From} to @samp{To} in the draft, parent's @samp{To} and @samp{Cc} to @samp{Cc}, parent's @samp{Newsgroups} to @samp{Newsgroups} respectively. These are evaluated in order and first matched one is used. Moreover, the behavior of @kbd{a} with prefix argument can be directed by @code{wl-draft-reply-with-argument-list} as well. By the way, you can use some function (will be evaluated in the parent message buffer) in the place of @samp{key} or @samp{to-list} etc. If you want to write a rule for replying to message written by yourself, specify function @code{wl-draft-self-reply-p} as @samp{key}. If you only want to reply to mailing lists in @code{wl-subscribed-mailing-list} if the parent has some of them, set as follows: @lisp @group (defun wl-mailing-list-addresses () (let (list-addrs) (dolist (to (mapcar (lambda (addr) (nth 1 (std11-extract-address-components addr))) (wl-parse-addresses (wl-concat-list (elmo-multiple-fields-body-list (list "To" "Cc")) ",")))) (when (elmo-string-matched-member to wl-subscribed-mailing-list t) (setq list-addrs (cons to list-addrs)))) (nreverse list-addrs))) (setq wl-draft-reply-with-argument-list '((wl-mailing-list-addresses . (wl-mailing-list-addresses nil nil)) ("Reply-To" . (("Reply-To") nil nil)) ("Mail-Reply-To" . (("Mail-Reply-To") nil nil)) ("From" . (("From") nil nil)))) @end group @end lisp @node Thread Format, User-Agent Field, Draft for Reply, Advanced Settings @subsection Appearance of Threads @example @group 389 09/18(Fri)01:07 [ Teranishi ] wl-0.6.3 390 09/18(Fri)07:25 +-[ Tsumura-san ] 391 09/18(Fri)19:24 +-[ Murata-san ] 392 09/20(Sun)21:49 +-[ Okunishi-san ] 396 09/20(Sun)22:11 | +-[ Tsumura-san ] 398 09/21(Mon)00:17 | +-[ Tsumura-san ] 408 09/21(Mon)22:37 | +-[ Okunishi-san ] 411 09/22(Tue)01:34 | +-[ Tsumura-san ] 412 09/22(Tue)09:28 | +-[ Teranishi ] 415 09/22(Tue)11:52 | +-[ Tsumura-san ] 416 09/22(Tue)12:38 | +-[ Teranishi ] 395 09/20(Sun)21:49 +-[ Okunishi-san ] 397 09/21(Mon)00:15 +-[ Okunishi-san ] @end group @end example Settings to make appearance of threads like shown above: @lisp @group (setq wl-thread-indent-level 2) (setq wl-thread-have-younger-brother-str "+") (setq wl-thread-youngest-child-str "+") (setq wl-thread-vertical-str "|") (setq wl-thread-horizontal-str "-") (setq wl-thread-space-str " ") @end group @end lisp If you do not want to see branches, do the following: @lisp @group (setq wl-thread-indent-level 2) (setq wl-thread-have-younger-brother-str " ") (setq wl-thread-youngest-child-str " ") (setq wl-thread-vertical-str " ") (setq wl-thread-horizontal-str " ") (setq wl-thread-space-str " ") @end group @end lisp @node User-Agent Field, , Thread Format, Advanced Settings @subsection User-Agent Field @cindex X-Mailer @cindex User-Agent If you are eccentric enough to elaborate @samp{X-Mailer:} or @samp{User-Agent:} fields, define a function that generate appropriate strings as you like, and set it to variable @code{wl-generate-mailer-string-function}. If you do not want verbose @samp{User-Agent:} field, do the following: @lisp @group (setq wl-generate-mailer-string-function 'wl-generate-user-agent-string-1) @end group @end lisp The following is a example: @lisp @group (setq wl-generate-mailer-string-function nil) (setq wl-draft-additional-header-alist (list (cons 'X-Mailer (lambda () (product-string-1 'wl-version))))) @end group @end lisp @node Customizable Variables, Hooks, Advanced Settings, Advanced Issues @section Customizable Variables Customizable variables that have not been described yet: @table @code @item wl-default-folder @vindex wl-default-folder The initial setting is @samp{%inbox}. This is the default value for moving to a folder and the like. @item wl-draft-folder @vindex wl-draft-folder The initial setting is @samp{+draft}. It is the folder to which drafts are saved. It must be a writable folder. You can set IMAP remote folder, Maildir and so on. Note that variable settings applied by @code{wl-draft-config-exec} is saved under @code{elmo-msgdb-directory}. That is to say, if you specified remote folder as @code{wl-draft-folder}, variable settings which are applied by @code{wl-draft-config-exec} before saving the draft will not affect on the draft buffer on another host by invoking @code{wl-summary-reedit}. @item wl-trash-folder @vindex wl-trash-folder The initial setting is @samp{+trash}. It is the wastebasket folder. If you changed this variable, you had better restart Wanderlust. @item wl-interactive-exit @vindex wl-interactive-exit The initial setting is @code{t}. If non-nil, you are asked for confirmation when Wanderlust terminates. @item wl-interactive-send @vindex wl-interactive-send The initial setting is @code{t}. If non-nil, you are asked for confirmation when mail is sent. @item wl-default-sync-range @vindex wl-default-sync-range The initial setting is @samp{update}. Default update range of the summary. You can specify @samp{all}, @samp{update}, @samp{rescan} or @samp{no-sync}. See description of @code{wl-summary-sync} for the meaning of ranges. @item wl-folder-sync-range-alist @vindex wl-folder-sync-range-alist The initial setting is the alist shown below: @lisp @group (("^&.*$" . "all") ("^\\+draft$\\|^\\+queue$" . "all")) @end group @end lisp @noindent This is an associative list of regular expressions of folder names and update range of the summary. Update range is one of the @samp{all}, @samp{update}, @samp{rescan} or @samp{no-sync}. If the folder do not match any of them, the value of @code{wl-default-sync-range} is used (@samp{update} by default). See description of @code{wl-summary-sync} for the meaning of ranges. @item wl-ask-range @vindex wl-ask-range The initial setting is @code{t}. If @code{nil}, the value of @code{wl-folder-sync-range-alist} is used for updating the summary when you changed folders. @item wl-mime-charset @vindex wl-mime-charset The initial setting is @code{x-ctext}. This is the MIME charset for messages that are not MIME (e.g. without @samp{Content-Type:}). This value also used as default charset for summary. (If you want to share Summary on Nemacs and other Emacsen, set this value as @code{iso-2022-jp}.) @item wl-highlight-folder-with-icon @vindex wl-highlight-folder-with-icon The default value is @code{t}. @item wl-strict-diff-folders @vindex wl-strict-diff-folders This is a list of regular expressions of folders. Unread messages are checked, for example when you press @kbd{s} in the folder mode, usually in a brief way (rapidly processed but not accurate). The folders matching this variable are seriously checked. You may want to set this variable so as to match conditional filter folders for IMAP4 folders. The initial setting is @code{nil}. @item wl-folder-use-server-diff @vindex wl-folder-use-server-diff When unread messages are checked, for example when you press @kbd{s} in the folder mode, usually (the number of messages on the server) @minus{} (the number of local messages) will be the number of unread messages. However, if this variable is non-nil, the number of unread messages on the server is checked. This affects IMAP4 folders only, but IMAP4 folders in mail boxes matching @code{elmo-imap4-disuse-server-flag-mailbox-regexp} are not checked for the number of unread messages on the server, even if they matches this variable. The initial setting is @code{t}. @item wl-auto-check-folder-name @vindex wl-auto-check-folder-name The initial setting is @code{nil}. You can specify a folder or a group which is checked for unread message at the start. You can also specify a list of folders (groups) to be checked. If the value is @code{nil}, whole Desktop is checked at the start. If it is @code{none}, no folders are checked. @item wl-auto-uncheck-folder-list @vindex wl-auto-uncheck-folder-list The initial setting is the list shown below: @lisp @group ("\\$.*") @end group @end lisp @noindent You can set a list of regular expressions to specify folders which are not automatically checked even if they are included in some groups assigned by @code{wl-auto-check-folder-name}. @item wl-auto-check-folder-list @vindex wl-auto-check-folder-list The initial setting is @code{nil}. You can set a list of regular expressions to specify exceptions for @code{wl-auto-uncheck-folder-list}. @item wl-no-save-folder-list @vindex wl-no-save-folder-list The initial setting is the list shown below: @lisp @group ("^/.*$") @end group @end lisp @noindent This is a list of regular expressions of folders not to be saved. @item wl-save-folder-list @vindex wl-save-folder-list The initial setting is @code{nil}. This is a list of regular expressions of folders to be saved. This takes precedence over @code{wl-no-save-folder-list}. @item wl-folder-mime-charset-alist @vindex wl-folder-mime-charset-alist The initial setting is the alist shown below: @lisp @group (("^-alt\\.chinese" . big5) ("^-relcom\\." . koi8-r) ("^-tw\\." . big5) ("^-han\\." . euc-kr)) @end group @end lisp @noindent This is an associative list of regular expressions of folder names and MIME charsets. If a folder do not match, @code{wl-mime-charset} is used. @item wl-folder-init-load-access-folders @vindex wl-folder-init-load-access-folders The initial setting is @code{nil}. This is a list of access groups to be loaded specifically at the start. If it is @code{nil}, @code{wl-folder-init-no-load-access-folders} is referred. @item wl-folder-init-no-load-access-folders @vindex wl-folder-init-no-load-access-folders The initial setting is @code{nil}. This is a list of access groups not to be loaded specifically at the start. It is ignored if @code{wl-folder-init-load-access-folders} is non-nil. @item wl-dispose-folder-alist @vindex wl-dispose-folder-alist The initial setting is the alist shown below: @lisp @group (("^-" . remove) ("^@@" . remove)) @end group @end lisp @noindent This list determines disposition of messages with disposal marks. Each item in the list is a folder and destination; you can specify any one of the following in the place of destination: @example @code{remove} or @code{null} : deletes the messages instantly. string : moves the messages to the specific folder. @code{trash} or others : moves the messages to @code{wl-trash-folder}. @end example @item wl-x-face-file @vindex wl-x-face-file The initial setting is @file{~/.xface}. The name of the file that contains encoded X-Face strings. @xref{x-face-mule}. @item wl-demo-display-logo @vindex wl-demo-display-logo If non-nil, bitmap image is shown on the opening demo. If you set @code{xpm} or @code{xbm}, (if possible) display selected image type logo. @item elmo-nntp-list-folders-use-cache @vindex elmo-nntp-list-folders-use-cache The initial setting is 600 (in seconds). This is period in seconds during which results of @samp{list} and @samp{list active} in NNTP are cached. If it is @code{nil}, they are not cached. @item elmo-nntp-max-number-precedes-list-active @vindex elmo-nntp-max-number-precedes-list-active The initial setting is @code{nil}. If non-nil, the number of article obtained by @samp{list active} in NNTP are used as the maximum article number of the folder. Set this to @code{t} if you are using for example INN 2.3 as an NNTP server, and if the number of read messages is not correct. @item elmo-nntp-default-use-listgroup @vindex elmo-nntp-default-use-listgroup The initial setting is @code{t}. If non-nil, @samp{listgroup} is used for checking the total number of articles. If it is @code{nil}, @samp{group} is used. In the latter case, the processing will be a little faster at the sacrifice of accuracy. @item elmo-pop3-send-command-synchronously @vindex elmo-pop3-send-command-synchronously The initial setting is @code{nil}. If non-nil, POP3 commands are issued synchronously. Some implementation of POP3 server fails to get summary information without this setting. You may have to set this variable to @code{t}, if the process hangs while looking up POP3. @item elmo-dop-flush-confirm @vindex elmo-dop-flush-confirm The initial setting is @code{t}. If non-nil, you are asked for confirmation if accumulated off-line operations are executed. @item elmo-network-session-idle-timeout @vindex elmo-network-session-idle-timeout The initial setting is @code{nil}. Idle timeout of the network cache. Specified in seconds. If elapsed time since last access is larger than this value, cached session is not reused. If nil, network cache is reused. @end table @node Hooks, , Customizable Variables, Advanced Issues @section Hooks (Not yet written) @node Migration, Terminology, Advanced Issues, Top @chapter Switch from older version of Wanderlust @cindex Migration This chapter explains the important thing for the upgrade, or migration from the previous version. It includes the changes of the setup, limitations etc. @menu * Before 2.12.0:: From prior to the version 2.12.0 @end menu @node Before 2.12.0, , Migration, Migration @section Migration from prior to the version 2.12.0 @subsection The conversion of msgdb From version 2.12.0 on, the structure of msgdb is changed. The msgdb for newly created folder will use this new format when created and saved. But by writing following line, you may use the old format of the msgdb as it was. @lisp @group (setq elmo-msgdb-default-type 'legacy) @end group @end lisp With the default setup, the old msgdb format is converted to the new format automatically. You may change this behavior by writing following lines in @file{~/.wl}. @lisp @group ;; @r{If the format of msgdb is different from} @code{elmo-msgdb-default-type}, ;; @r{the format will be converted automatically when} ;; @r{the msgdb is being loaded (default).} (setq elmo-msgdb-convert-type 'auto) ;; @r{Convert msgdb when hitting @kbd{s all} in Summary mode} (setq elmo-msgdb-convert-type 'sync) ;; @r{Inhibit conversion} (setq elmo-msgdb-convert-type nil) @end group @end lisp As is explained in above section, you may continue to use the old format. But you will have following limitations. @enumerate @item You cannot use forwarded mark (@samp{F}, @samp{f}). @item You may only use @samp{important} flag. The other global flags may not be available. @end enumerate @subsection Changes from @samp{'mark} folder to @samp{'flag} The folder @samp{'mark} will be automatically converted to @samp{'flag} folder when you first start the new version of Wanderlust. But there are some restrictions on this type of migrated folder. @enumerate @item @samp{important} flag attached will not be removed by deleting the associated message in @samp{'flag} folder. @item The message won't be deleted by removing @samp{important} flag in @samp{'flag} folder. @item help-echo will not show you the old message. @end enumerate If you have problem with migrating from @samp{'mark} folder to the @samp{'flag} folder, invoking @kbd{M-x elmo-global-mark-upgrade} will transfer the message from @samp{'mark} folder to the @samp{'flag} folder. The duplicated message will not be processed, you may issue that command repeatedly. @node Terminology, Mailing List, Migration, Top @chapter Terminology around Wanderlust @cindex Terminology Here we explain terminologies used in this manual. @table @samp @item folder A container in which messages are stored. @item group A set consists of some folders. @item access group A special group consists of automatically collected folders under some specified path. @xref{Folder Definition}. @item summary buffer A buffer for displaying list of messages in some folder. @item sticky summary Compared with ordinary summary buffer which will be destroyed after exiting from it, this type of summary will be remain even after exiting by @kbd{q} or @kbd{g}. @xref{Sticky Summary}. @item expire To delete or put into the archive expired messages. @xref{Expire}. @item score @xref{Scoring}. @item prefetch To cache messages beforehand in order to read messages after you will be disconnected from the server. @end table @node Mailing List, Addition, Terminology, Top @chapter Wanderlust Mailing List @cindex Bug report @cindex Backtrace Topics related to Wanderlust are discussed in following mailing lists. The latest version is also announced there. @display Wanderlust Mailing List @t{} @end display In this list Japanese is mainly used for discussion. We also have a list for discussion in English: @display Wanderlust List in English @t{} @end display (Messages posted to this list are also forwarded to the former one.) A guide can be obtained automatically by sending mail to @t{wl-ctl@@ml.gentei.org} (or to @t{wl-en-ctl@@ml.gentei.org} for the English one) with the body @example # guide @end example Please send bug reports or patches to one of those lists. You have to subscribe the mailing list to post a message. Alternatively, You can also use GitHub. If you send a pull request, please embed unindented @file{ChangeLog} entries in commit message like Emacs's. See @cite{Commit messages} section of Emacs's CONTRIBUTE file @footnote{@uref{https://git.savannah.gnu.org/cgit/emacs.git/plain/CONTRIBUTE}}. If you send a bug report, please attach Backtrace with it. @footnote{@uref{http://www.jpl.org/elips/BUGS-ja.html} describes how to in Japanese.} I would like to express my thanks to the members of the mailing list for valuable advice and many pieces of code they contributed. @section Archive You can read messages posted to the mailing list in NetNews. Read messages posted to @t{} @example @uref{news://news.gmane.io/gmane.mail.wanderlust.general.japanese} @end example Read messages posted to @t{} @example @uref{news://news.gmane.io/gmane.mail.wanderlust.general} @end example @node Addition, Index, Mailing List, Top @chapter Additional Information @section Brief History @example 1998 3/05 Tried to make a prototype that displays MH messages in threads. 3/10 Made a msgdb mechanism by elisp. 3/26 IMAP and NNTP can be displayed in threads. 4/13 Began to assemble thread display modules as elmo. 5/01 Finished 0.1.0, initial version with many defects. 6/12 I made a slip of the tongue and said I was writing elisp mailer supporting IMAP 6/16 0.1.3 was announced at tm-ja, elisp ML. 6/22 Thanks to Kitame-san, the mailing list started at northeye.org. 7/01 Support for mm-backend (0.3.0). 8/25 multi folder added (0.5.0). 8/28 filter folder added (0.5.1). 9/10 You can open/close threads (0.6.0). 9/11 fldmgr by Murata-san made editing folders easy. 9/18 lha folders added by Okunishi-san (0.6.3). 9/24 Display of branches of threads (0.6.5). 9/28 Compression folder supporting multiple archivers by Okunishi-san. 10/28 Off-line operations (0.7.4). 12/09 Becomes beta version. 12/21 wl-expire by Murata-san. 1999 2/03 auto-refile by Tsumura-san. 4/28 wl-template by Murata-san. 5/18 Released 1.0.0 stable. 7/05 Scoring by Murata-san (2.1.0). 9/26 New plugged system by Murata-san (2.2.2). 12/20 Support Modified UTF7. 2000 3/24 Released 1.1.0 stable. 4/03 CVS development started. 5/07 Thread restoration & Its speed up with Murata-san. 6/12 Address completion with LDAP with Chiba-san & Goto-san. 7/11 killed message feature. 7/18 Use UIDL in POP3. 9/12 biff feature with Satata-san & Yamaoka-san. 10/17 expire-hide by Okada-san. 11/08 Released 2.4.0 stable. 2001 7/04 Released 2.6.0 stable. 8/21 wl-addrmgr by Kitamoto-san. 12/27 Released 2.8.1 stable. 2002 12/11 Released 2.10.0 stable. 2003 7/05 Released 2.10.1 stable. 9/18 flag folder is added. 9/20 New msgdb format (modb-standard) by H.Murata-san. 10/20 Spam filter by H.Murata-san. 2004 1/06 Background color of the demo become configurable. 2/09 'file' folder is added. 9/12 forwarded mark. Default value of the mark strings are changed. 12/24 Released 2.12.0 stable. @end example See @file{ChangeLog} for details. @section The Name According to a dictionary, Wanderlust has the meaning: @display wanderlust n eager longing for or impulse towards travelling in distant lands [Ger, fr wandern to wander + lust desire, pleasure] @end display @noindent but I had no profound intention. (if farfetched, IMAP @result{} you can read mail anywhere @result{} desire to wander ?) Elmo is the abbreviation of @samp{Elisp Library for Message Orchestration}. At first I meant the red puppet in the Sesame Street, but you may associate it with Wandering @result{} Drifting @result{} Guidepost @result{} St.@: Elmo's fire @result{} elmo. @section Code Names Each versions has code names (they are almost jokes). Currently they are picked up alphabetically from the top 40 hits of U.S. Billboard magazines in 1980s. (@uref{http://ntl.matrix.com.br/pfilho/html/top40/}) @node Index, , Addition, Top @unnumbered Index @menu * Concept Index:: Concept Index * Key Index:: Key Index * Variable Index:: Variable Index * Function Index:: Function Index @end menu @node Concept Index, Key Index, Index, Index @unnumberedsec Concept Index @printindex cp @node Key Index, Variable Index, Concept Index, Index @unnumberedsec Key Index @printindex ky @node Variable Index, Function Index, Key Index, Index @unnumberedsec Variable Index @printindex vr @node Function Index, , Variable Index, Index @unnumberedsec Function Index @printindex fn @summarycontents @contents @bye @c Local Variables: @c fill-column: 72 @c End: wanderlust-wanderlust-769699d/elmo/000077500000000000000000000000001406661363500173415ustar00rootroot00000000000000wanderlust-wanderlust-769699d/elmo/ChangeLog.1000066400000000000000000013642371406661363500212720ustar00rootroot000000000000002020-08-20 Kazuhiro Ito Change non-ASCII text files's coding-system to UTF-8 * elmo-archive.el: Likewisw. * elmo-vars.el: Likewise. 2020-07-13 Kazuhiro Ito * elmo-util.el (elmo-number-list-to-number-set): New function. (elmo-number-set-to-number-list): Refactored. * elmo-imap4.el (elmo-imap4-make-number-set-list): Use elmo-number-list-to-number-set. 2020-06-24 Kazuhiro Ito * elmo-access.el (elmo-folder-commit): Remove redundant lambda expression. * elmo-msgdb.el (elmo-multiple-fields-body-list): Build regexp out of loop. * elmo-util.el (elmo-multiple-field-body): Minor refactorings. (elmo-filename-replace-chars): Renamed to elmo-filename-replace-chars-regexp. (elmo-replace-string-as-filename): User adjusted. * pldap.el (ldap/field-body): Build regexp out of loop. 2020-06-18 Kazuhiro Ito * elmo-util.el: Require timezone.el. (elmo-replace-char-in-string): New inline function. * elmo-date.el: Require elmo-util.el, (elmo-date-get-datevec): Use elmo-replace-char-in-string. * elmo-file.el (elmo-file-msgdb-create-entity) (elmo-map-message-fetch): Use elmo-replace-char-in-string. * elmo-localnews.el (elmo-folder-initialize) (elmo-localdir-folder-name): Use elmo-replace-char-in-string. * elmo-maildir.el (elmo-maildir-adjust-separator): Use elmo-replace-char-in-string. * elmo-search.el (elmo-search-replace-single-quotes): Use elmo-replace-char-in-string. * elmo-shimbun.el: Require lemo-date.el. * elmo.el (elmo-message-file-name): Update docstring to define current behavior as spec. * modb-entity.el (elmo-msgdb-create-message-entity-from-header): Use elmo-replace-char-in-string. 2020-06-17 Kazuhiro Ito Obsolete elmo-replace-in-string. Use replace-regexp-in-string. * elmo-date.el (elmo-replace-in-string, elmo-date-get-datevec): Likewise. * elmo-file.el (elmo-map-message-fetch) (elmo-file-msgdb-create-entity): Likewise. * elmo-localnews.el (elmo-localdir-folder-name) (elmo-folder-initialize): Likewise. * elmo-maildir.el (elmo-maildir-adjust-separator): Likewise. * elmo-nntp.el (elmo-nntp-get-folders-info): Likewise. * elmo-util.el (elmo-concat-path): Likewise. * modb-entity.el (elmo-msgdb-create-message-entity-from-header): Likewise. 2020-06-14 Kazuhiro Ito Replace char-to-string by list for concat function's arguments. That is slightly faster on my environment. * elmo-maildir.el (elmo-maildir-set-mark): Likewise. * elmo-nntp.el (elmo-nntp-folder-list-subfolders): Likewise. * elmo-util.el (elmo-expand-newtext): Likewise. 2020-06-06 Kazuhiro Ito Assume Emacs 24.5 or later. * elmo-util.el (elmo-define-error): Obsolete. * elmo.el: Use define-error directly instead of elmo-define-error. 2020-06-03 Kazuhiro Ito * acap.el (acap-parse-value-list) (acap-parse-value-or-return-metalist) (acap-parse-return-metalist, acap-parse-return-attr-list): Minor refactorings. * elmo-imap4.el (elmo-imap4-parse-address-list) (elmo-imap4-parse-header-list, elmo-imap4-parse-fetch): Ditto. * slp.el (slp-parse-attrs): Ditto. 2020-06-03 Kazuhiro Ito * elmo-vars.el (elmo-database-dl-module) (elmo-database-dl-handle, elmo-use-database): Obsolete. 2020-06-03 Kazuhiro Ito * elmo-util.el (elmo-progress-notify): Define as inline function. * elsp-bogofilter.el (elmo-spam-bogofilter-arguments): Likewise. 2020-06-02 Kazuhiro Ito * elmo-date.el (elmo-time-make-imap-date-string): Argument is now optional. * elmo-imap4.el (elmo-folder-append-buffer): Call elmo-time-make-imap-date-string without argument. 2020-06-02 Kazuhiro Ito Use lexical binding in all *.el files. 2020-05-30 Kazuhiro Ito * elmo-util.el (elmo-parse): Do not pass nil to store-match-data function. It is undocumented. 2020-05-30 Kazuhiro Ito * elmo-util.el: Adjust dependencies. (elmo-msgdb-insert-file-header) (elmo-file-cache-load, elmo-object-load): Use insert-file-contents-literally directly. (elmo-parse-token): Use string-to-list directly. (elmo-parse-token, elmo-collect-separators): Do not use char-list-to-string. * elmo.el: Remove XEmacs related codes. 2020-05-29 Kazuhiro Ito * elmo-util.el (elmo-assoc-ignore-case): New function. 2020-05-29 Kazuhiro Ito Remove cl dependencies except where lexical-let is used. * acap.el: Likewise. * elmo-archive.el: Likewise. * elmo-date.el: Likewise. * elmo-dop.el: Likewise. * elmo-file.el: Likewise. * elmo-imap4.el: Likewise. * elmo-localdir.el: Likewise. * elmo-maildir.el: Likewise. * elmo-map.el: Likewise. * elmo-mime.el: Likewise. * elmo-msgdb.el: Likewise. * elmo-multi.el: Likewise. * elmo-net.el: Likewise. * elmo-nntp.el: Likewise. * elmo-pop3.el: Likewise. * elmo-search.el: Likewise. * elmo-shimbun.el: Likewise. * elmo-signal.el: Likewise. * elmo-spam.el: Likewise. * elmo-split.el: Likewise. * elmo-util.el: Likewise. * elmo.el: Likewise. * modb-entity.el: Likewise. * modb-legacy.el: Likewise. * modb-standard.el: Likewise. * modb.el: Likewise. * pldap.el: Likewise. * slp.el: Likewise. 2020-05-28 Kazuhiro Ito Remove Meadow support. * elmo-util.el (elmo-list-subdirectories-1): Likewise.. * elmo-vars.el (elmo-have-link-count): Likewise. 2020-05-28 Kazuhiro Ito Adjust dependencies. * elmo-archive.el: Likewise. * elmo-cache.el: Likewise. * elmo-flag.el: Likewise. * elmo-maildir.el: Likewise. * elmo-mime.el: Likewise. * elmo-msgdb.el: Likewise. (elmo-message-entity-set-field) (elmo-message-entity-field, elmo-message-entity-set-number) (elmo-message-entity-number): Moved to modb.el. * elmo-null.el: Likewise. * elmo-passwd.el: Likewise. * elmo-sendlog.el: Likewise. * elmo-split.el: Likewise. * elmo-util.el: Likewise. * elmo-vars.el: Remove code for old platforms. * modb-entity.el: Likewise. * modb-standard.el: Likewise. * modb.el: Adjust dependencies. (elmo-message-entity-set-field) (elmo-message-entity-field, elmo-message-entity-set-number) (elmo-message-entity-number): Moved from elmo-msgdb.el. 2020-05-26 Kazuhiro Ito Obsolete aliased functions. Use bundled function with Emacs or alies target preferably. * elmo-date.el: Likewise. * elmo-imap4.el: Likewise. * elmo-msgdb.el: Likewise. * elmo-nntp.el: Likewise. * elmo-passwd.el: Likewise. * elmo-pop3.el: Likewise. * elmo-util.el: Likewise. * elmo-vars.el: Likewise. * elmo.el: Likewise. * modb-entity.el: Likewise. 2020-05-24 Kazuhiro Ito Drop old platforms support. Now supported Emacsen are version 24 and later. * elmo-archive.el: Assuse Emacs 24 or later. * elmo-date.el: Likewise. * elmo-imap4.el: Likewise. * elmo-net.el: Likewise. * elmo-pop3.el: Likewise. * elmo-util.el: Likewise. * elmo-vars.el: Likewise. * elmo-version.el: Likewise. * elmo.el: Likewise. * modb-entity.el: Likewise. * pldap.el: Likewise. * elmo-database.el: Removed. * utf7.el: Removed. 2019-02-03 Kazuhiro Ito * elmo-net.el (elmo-open-socks-ssl-stream) (elmo-open-gnutls-stream): Define only when built-in GnuTLS library is available. 2019-02-03 Kazuhiro Ito * elmo-net.el (elmo-open-socks-ssl-stream): Renamed from elmo-socks-ssl-open-network-stream and slightly simplified. * elmo-vars.el (elmo-network-stream-type-alist): Likewise. 2019-02-03 Kazuhiro Ito Do not call open-gnutls-stream directly. * elmo-net.el (elmo-open-gnutls-stream): New function. * elmo-vars.el (elmo-network-stream-type-alist): Use it instead of open-gnutls-stream. 2019-02-02 Kazuhiro Ito Support SSL / STARTTLS connection via SOCKS. Built-in GnuTLS library is required. Each connection's folder syntax is "!!socks" and "!!!socks" respectively. Connection type's symbol is "socks-ssl" and "socks-starttls". * elmo-net.el (elmo-socks-ssl-open-network-stream): New function * elmo-vars.el (elmo-network-stream-type-alist): Add entry for SSL / STARTTLS connection via SOCKS. (elmo-network-starttls-stream-type-list): New variable. * elmo-imap4.el (elmo-network-initialize-session): Use STARTTLS connection when connection type member of elmo-network-starttls-stream-type-list. * elmo-pop3.el (elmo-network-initialize-session): Likewise. * elmo-nntp.el (elmo-network-initialize-session): Likewise. 2019-01-13 Kazuhiro Ito * elmo-imap4.el (elmo-imap4-send-command-enqueue) (elmo-imap4-send-command) (elmo-imap4-session-process-send-literal): Expand cl-etypecase and cl-ecase for old platforms. 2019-01-07 David Maus * elmo-imap4.el (elmo-imap4-search-generate-or): Remove trailing whitespace from OR condition. (elmo-imap4-search-generate-or): Use `group' token to create search condition in parenthesis. 2019-01-06 David Maus * elmo-imap4.el (elmo-imap4-send-command): Make sure that function runs in session process buffer. 2019-01-05 David Maus * elmo-imap4.el (elmo-imap4-send-command-enqueue): New function. Create a queue of strings and buffers to be sent to server. (elmo-imap4-send-command-build-queue): New function. Entry point for `elmo-imap4-send-command-enqueue'. (elmo-imap4-session-process-send-literal): New function. Send literal command token. (elmo-imap4-send-command): Rewritten to use new functions. 2018-08-26 Kazuhiro Ito * elmo-search.el (elmo-search-engine-do-search): Discard STDERR output from process. (elmo-search-grep-target): Return null-device name only when no target file is found. 2018-06-05 Kazuhiro Ito * elmo-archive.el (elmo-intern-soft): Fix misuse of `eq' for string comparison. 2018-05-05 Kazuhiro Ito * elmo-rss.el (elmo-rss-download): Do not pass HTTP header to xml-parse-region. 2018-03-31 Kazuhiro Ito Use built-in GnuTLS library for STARTTLS cnnection on IMAP/NNTP/POP folders. * elmo-net.el (elmo-network-session-starttls-negotiate): New function. * elmo-vars.el (elmo-network-use-gnutls): New variable. (elmo-network-stream-type-alist): Use open-network-stream for STARTTLS connection with built-in GnuTLS library. * elmo-imap4.el (elmo-network-initialize-session): Use elmo-network-session-starttls-negotiate instead of starttls-negotiate. * elmo-nntp.el (elmo-network-initialize-session): Likewise. * elmo-pop3.el (elmo-network-initialize-session): Likewise. 2018-03-12 Kazuhiro Ito * elmo-net.el (elmo-open-network-stream): Use set-process-query-on-exit-flag function if available (Cf. [wl-en:6542]). 2018-02-11 Kazuhiro Ito Fix the case NNTP folder without newsgroup (for access group). * elmo-nntp.el (elmo-nntp-list-folders-get-cache): Fix the case GROUP is nil. (elmo-nntp-folder-list-subfolders): Fix the case FOLDER's group is "". 2018-02-03 Kazuhiro Ito * elmo-vars.el: Prune functions provided temporarily to avoid compile warnings in the end. 2017-12-23 Kazuhiro Ito * elmo.el (elmo-folder-confirm-appends): Display message when there are implicitly hidden messages. Minor refactoring. 2017-12-03 Kazuhiro Ito * elmo-cache.el (elmo-cache-folder-list-message-locations): Treat hashed filename as cache file. * elmo-util.el (elmo-cache-to-msgid): Abolished. (elmo-cache-get-path): Optional arguments are abolished. (elmo-msgid-to-cache): Use hash function when filename is too long. See docstring of below new varaibles. * elmo-vars.el (elmo-msgid-to-cache-max-length) (elmo-msgid-to-cache-algorithm): New variables. 2017-12-02 Kazuhiro Ito * elmo-util.el (elmo-time-expire): Use internal functions if available. 2017-10-19 Kazuhiro Ito * elmo-nntp.el (elmo-nntp-list-folders-get-cache): Fix wrong hit when cache contains the same folder name with GROUP argument. Minor refactoring. 2017-09-30 Kazuhiro Ito * elmo-util.el (elmo-get-hash-val, elmo-clear-hash-val): Assume unintern function is available. (elmo-unintern): Abolished. Call unintern directly. * elmo-imap4.el (elmo-imap4-parse-response): Likewise. 2017-09-21 Kazuhiro Ito * elmo-msgdb.el (elmo-msgdb-killed-list-length) (elmo-msgdb-max-of-killed): Refactored. 2017-06-28 Kazuhiro Ito * elmo-passwd.el (elmo-passwd-alist-ignore-smtp-port): Fix typo in the docstring. 2017-03-25 Kazuhiro Ito * elmo-util.el (elmo-list-to-string): Refactored. 2017-03-25 Kazuhiro Ito * elmo-util.el (elmo-cache-get-path): Remove redundant expand-file-name. 2017-03-23 Kazuhiro Ito Now elmo can use auth-source for managing password. If you want to use auth-source, write "(setq elmo-passwd-storage-type 'auth-source)" in your ~/.wl. There are some limitation. Please see the document. * elmo-vars.el (elmo-passwd-alist-file-name) (elmo-passwd-life-time): Moved to elmo-passwd.el. (elmo-passwd-storage-type, elmo-passwd-storage): New variable. * elmo-util.el (elmo-passwd-alist, elmo-passwd-alist-load): Abolished. (elmo-passwd-storage): New function. (elmo-passwd-alist-clear, elmo-passwd-alist-save, elmo-get-passwd) (elmo-remove-passwd): Use elmo-passwd.el. * elmo-passwd.el: New file. * elmo-net.el (elmo-network-session-password-key): Make list as key. 2017-03-05 Kazuhiro Ito * elmo-search.el (top): Add entry for rgrep (recursive grep) in elmo-search-engine-alist. (elmo-search-rgrep-target): New function. Cf. https://github.com/wanderlust/wanderlust/issues/140 2016-12-18 Piotr Trojanek * elmo-file.el (elmo-file-detect-content-type): rewrite LET followed by SETQ. 2016-12-13 Kazuhiro Ito * modb-entity.el (elmo-msgdb-create-message-entity-from-header): [modb-standard-entity-handler] Fix the case that elmo-msgdb-extra-fields is nil. Cf. https://github.com/wanderlust/wanderlust/issues/135 2016-11-23 Kazuhiro Ito * modb-entity.el (modb-standard-collect-field-values-from-header) (modb-standard-get-references-for-entity) (modb-standard-get-message-id-for-entity) (modb-standard-set-field-name-cache): New functions. (modb-standard-reserved-fields): New constant. (modb-standard-field-name-cache): New variable. (elmo-msgdb-create-message-entity-from-header): [modb-standard-entity-handler] Use them. Improve performance. 2016-11-20 Piotr Trojanek * elmo-util.el (elmo-list-insert): improve performance. (elmo-get-file-string): simplify. 2016-11-14 Piotr Trojanek * elmo-util.el (elmo-get-passwd): fix previous change to this routine, where passwords were only appended to non-empty alists. 2016-11-09 Piotr Trojanek * elmo-util.el (elmo-get-passwd): while new password was appended the old ones were becaming a garbage without being erased. 2016-10-18 Kazuhiro Ito * elmo-util.el (elmo-object-save): Fix error on XEmacs. 2016-09-22 Kazuhiro Ito * elmo-date.el (elmo-match-substring): Abolished. 2016-09-07 Piotr Trojanek * elmo-vars.el: Cosmetic change. 2016-08-27 Kazuhiro Ito * elmo-util.el (elmo-get-passwd): Call read-passwd directly. (elmo-read-passwd): Abolished. Cf. https://github.com/wanderlust/wanderlust/pull/130 2016-08-24 Piotr Trojanek * elmo-util.el (elmo-get-passwd): Use read-passwd for getting user's password; remove stars argument. (elmo-get-passwd): remove argument stars in call to elmo-get-passwd. (elmo-read-char-exclusive): Removed, no longer needed. (elmo-clear-string): added to use more efficient clear-string, if present. (elmo-remove-passwd, elmo-passwd-alist-clear): Use elmo-clear-passwd. 2016-08-21 Piotr Trojanek * elmo-util.el: Extra blank line removed. 2016-07-28 Juliusz Chroboczek RSS folder now uses cahce to enable searching text. Please remove files under ~/.elmo/rss and reload messages before search. * elmo-rss.el (elmo-message-use-cache-p): Newly implemented method. 2016-07-20 Kazuhiro Ito * elmo-msgdb.el (elmo-msgdb-location-load): Strip leading unneeded elements generated by elmo-location-map-save. (elmo-msgdb-location-save): Cosmetic change. * elmo-map.el (elmo-location-map-save): Do not save max-number. No one use it and elmo-location-map-load function assumes it is not contained. 2016-06-30 Piotr Trojanek * elmo-util.el (elmo-read-number): Fix typo. 2016-06-22 Kazuhiro Ito * modb-standard.el (modb-standard-save-entity-1): Fix the problem that large unneeded file is created instead of deleting. (modb-standard-cleanup-stale-entities): Detect entity files strictly. Minor refactoring. (modb-standard-save-entity): Fix the case that modb-standard-divide-number is nil and the case that msgdb is unmodified. 2016-04-03 Kazuhiro Ito * elmo-localdir.el (elmo-folder-pack-numbers): Return t. Report progress. * elmo-map.el (elmo-folder-pack-numbers): Likewise. 2016-03-30 Kazuhiro Ito * elmo-date.el (elmo-time-less-p, elmo-time<): Use time-less-p if available. 2016-03-30 Kazuhiro Ito * elmo.el (elmo-folder-synchronize): Revert the last change. * elmo-util.el (elmo-list-diff): Revert optional argment and progress report. Check equality only when before sorting. 2016-03-16 Kazuhiro Ito * elmo-util.el (elmo-list-diff): New optional argument MESSAGE is available. use `eq' instead of `='. * elmo.el (elmo-folder-synchronize): Add MESSAGE argument for elmo-list-diff. 2016-03-15 Kazuhiro Ito * elmo.el (elmo-strict-folder-diff): Do not sort argmuent for elmo-list-diff. 2016-03-15 Kazuhiro Ito * elmo-util.el (elmo-list-diff): Check equality of lists before calculating diff. Report progress. 2016-03-13 Kazuhiro Ito * elmo-util.el (elmo-delete-cr-get-content-type) (elmo-msgdb-get-last-message-id): Abolished. (elmo-get-message-id-from-header): Remove redundant let(). 2016-03-11 Kazuhiro Ito * elmo-nntp.el (elmo-nntp-folder-list-subfolders) (elmo-nntp-list-folders-get-cache): Refactored. Fix mis-generating cache and mis-checking for cache usability. 2016-03-09 Kazuhiro Ito * elmo-nntp.el (elmo-nntp-catchup-msgdb): Assume MAX-NUMBER argument is always non-nil. 2016-03-09 Kazuhiro Ito * elmo-nntp.el (elmo-nntp-catchup-msgdb, elmo-nntp-send-buffer) (elmo-nntp-groups-read-response): Refactored. * elmo-pop3.el (elmo-pop3-read-response) (elmo-pop3-parse-list-response, elmo-pop3-next-result-arrived-p): Refactored. (elmo-pop3-parse-uidl-response): Refactored. Reduce changing current buffer. 2016-03-09 Kazuhiro Ito * elmo-nntp.el (elmo-nntp-read-response): Don't let-bind case-fold-search. * elmo-pop3.el (elmo-pop3-read-response): Likewise. 2016-03-09 Kazuhiro Ito * elmo-imap4.el (elmo-imap4-session-process-send-string): Concatenate strings before sending. * elmo-nntp.el (elmo-nntp-send-command, elmo-nntp-send-data-line): Likewise. 2016-03-05 Kazuhiro Ito * elmo-util.el (elmo-cache-expire-by-size): Fix docstring. * elmo-vars.el (elmo-cache-expire-default-size): Likewise. 2016-03-05 Kazuhiro Ito * elmo-util.el (elmo-read-number): New function. (elmo-read-float-value-from-minibuffer): Abolished. (elmo-cache-expire-by-size, elmo-cache-expire-by-age): Use elmo-read-number. * elmo.el (elmo-folder-confirm-appends): Use elmo-read-number. 2016-03-02 Kazuhiro Ito * elmo-util.el (elmo-cache-expire): Use DEF parameter for completing-read. 2015-11-19 Kazuhiro Ito * elmo-rss.el: Fix the example of combination with pipe folder. 2015-10-03 Kazuhiro Ito * elmo-imap4.el (elmo-imap4-capability-search-keys-alist): New variable. (elmo-imap4-search-internal): Adjust elmo-imap4-search-keys according to elmo-imap4-capability-search-keys-alist and server's capabilities. 2015-09-09 Kazuhiro Ito * elmo-imap4.el (elmo-network-authenticate-session): Fix the case sasl-read-passphrase is used before set. Cf. https://github.com/wanderlust/wanderlust/issues/106 2015-09-06 Kazuhiro Ito * elmo-imap4.el (elmo-folder-append-buffer): Fix the case appended message number may lost when server dose not support APEENDUID response code. 2015-08-26 Kazuhiro Ito * elmo-multi.el (elmo-multi-real-folder-number) (elmo-multi-map-numbers, elmo-multi-split-numbers) (elmo-folder-length, elmo-folder-append-messages-multi-*): Minor refactoring. 2015-08-10 Kazuhiro Ito * elmo-multi.el (elmo-multi-max-number): New variable. (elmo-multi-check-divide-number): New macro. (elmo-folder-list-messages, elmo-folder-list-flagged): Check whether elmo-multi-divide-number is large enough. 2015-05-26 David Maus * elmo-imap4.el (elmo-message-fetch-field): Fix typo. 2015-05-17 Kazuhiro Ito * elmo-rss.el (elmo-rss-format-message): Use USEC of current-time instead of PSEC. PSEC is available on only Emacs 24.3 and later and possible PSEC value's range is narrower than USEC. 2015-05-17 Kazuhiro Ito * elmo-rss.el (elmo-rss-msgdb-create-entity): Use elmo-no-from and elmo-no-subject. 2015-05-17 Juliusz Chroboczek * elmo-rss.el: New file. 2015-05-15 Erik Hetzner * elmo-dop.el (elmo-dop-queue-flush): Move messages to `elmo-lost+found-folder' when clearing queue, do not delete them. 2014-11-29 David Maus * elmo-imap4.el (elmo-imap4-search-generate-vector): Provide correct search key for header searches. 2014-11-20 Kazuhiro Ito * elmo-util.el (elmo-string): Fix typo. 2014-11-15 Kazuhiro Ito * elmo-nntp.el (elmo-nntp-read-response): Use elmo-delete-cr. (elmo-nntp-groups-read-response): Use elmo-delete-cr-buffer. * elmo-pop3.el (elmo-pop3-read-response): Use elmo-delete-cr. 2014-11-15 Kazuhiro Ito * elmo-nntp.el (elmo-nntp-next-result-arrived-p): Simplified. 2014-11-15 Kazuhiro Ito Remove '1' argument for forward-char, backward-char and forward-line. Use following-char and preceding-char preferredly. * acap.el (acap-parse-greeting, acap-parse-string) (acap-parse-quoted, acap-parse-value-list) (acap-parse-value-or-return-metalist) (acap-parse-return-metalist, acap-parse-return-attr-list): Likewise. * elmo-archive.el (elmo-archive-list-folder-subr) (elmo-archive-parse-mmdf): Likewise. * elmo-imap4.el (elmo-imap4-forward, elmo-imap4-parse-string) (elmo-imap4-parse-address, elmo-imap4-parse-address-list) (elmo-imap4-parse-response, elmo-imap4-parse-bye) (elmo-imap4-parse-resp-text-code, elmo-imap4-parse-header-list) (elmo-imap4-parse-fetch-body-section, elmo-imap4-parse-fetch) (elmo-imap4-parse-status, elmo-imap4-parse-acl) (elmo-imap4-parse-envelope, elmo-imap4-parse-string-list) (elmo-imap4-parse-body-extension, elmo-imap4-parse-body-ext) (elmo-imap4-parse-body): Likewise. * elmo-nntp.el (elmo-nntp-folder-list-subfolders) (elmo-nntp-parse-xhdr-response, elmo-nntp-get-folders-info) (elmo-nntp-msgdb-create-message): Likewise. * elmo-pop3.el (elmo-pop3-msgdb-create-message): Likewise. * elmo-search.el (elmo-search-parse-filename-list): Likewise. * elmo-util.el (elmo-msgdb-insert-file-header) (elmo-parse-addresses): Likewise. * pldap.el (ldap-search-basic): Likewise. * slp.el (slp-parse-srvs, slp-parse-srvtypes): Likewise. 2014-11-15 Kazuhiro Ito * elmo-archive.el (elmo-archive-list-folder-subr): Remove redundant code. * elmo-dop.el (elmo-folder-next-message-number-dop): Likewise. * elmo-localdir.el (elmo-localdir-list-subr): Likewise. * elmo.el (elmo-folder-next-message-number) (elmo-strict-folder-diff): Likewise. 2014-11-08 Kazuhiro Ito * elmo-pop3.el (elmo-pop3-auth-apop, elmo-folder-status): Fix typo of regexp. 2014-11-08 Kazuhiro Ito * elmo.el (elmo-folder-search): Accept NUMBERS argument is set to t, that indicates to select messages for interactive folder search. Default method selects visible messages from msgdb. * elmo-archive.el (elmo-folder-search): Handle the case that NUMBERS is t (select visible messages from msgdb). * elmo-filter.el (elmo-folder-search): Likewise (select visible messages from msgdb). * elmo-imap4.el (elmo-imap4-search-internal): Likewise (treated as nil). * elmo-multi.el (elmo-folder-search): Likewise (passed through to child folders). * elmo-nntp.el (elmo-nntp-retrieve-field): Likewise (select visible messages from msgdb). Do not filter result. (elmo-nntp-search-primitive): Filter result by FROM-MSGS. 2014-11-08 Kazuhiro Ito * elmo-nntp.el (elmo-nntp-read-response): Refined. Improve performance. * elmo-pop3.el (elmo-pop3-read-response): Ditto. 2014-11-06 Kazuhiro Ito * elmo-imap4.el (elmo-imap4-elist): Fix typo. * elmo-split.el (elmo-split-subr): Fix typo. 2014-11-05 Kazuhiro Ito * elmo-imap4.el (elmo-imap4-search-generate-vector): Remove unused let-binding. Use elmo-list-diff instead of elmo-list-difference. * elmo-nntp.el (elmo-nntp-search-primitive): Use elmo-list-diff for "first" search. * elmo-util.el (elmo-list-difference): Removed. Not used anymore. 2014-11-05 Kazuhiro Ito * elmo-multi.el (elmo-folder-search): Rewritten. Avoid redundant use of elmo-folder-list-messages. 2014-11-05 Erik Hetzner * elmo.el (elmo-folder-synchronize): Avoid redundant use of elmo-folder-list-messages. Cf https://github.com/wanderlust/wanderlust/pull/79 2014-10-19 David Maus * elmo-imap4.el (elmo-imap4-search-keys): New variable. Known IMAP search keys. (elmo-imap4-search-generate-vector): Use new variable instead of local list. 2014-10-18 David Maus * elmo-imap4.el (elmo-imap4-strict-flag-availability-check): New variable. Perform a strict check for flag availability in set to a non-nil value. (elmo-imap4-session-flag-available-p): Use new variable and conditionally perform a strict check for a flag's availability. 2014-10-15 Erik Hetzner * elmo-search.el: Add support for mu, notmuch search. 2014-09-06 Kazuhiro Ito * elmo-localdir.el (elmo-folder-pack-numbers): Use `/=' instead of not+eq for number comparison. * elmo-nntp.el (elmo-nntp-parse-overview-string): Likewise. * elmo-util.el (elmo-msgdb-insert-file-header): Likewise. * elmo.el (elmo-folder-synchronize): Likewise. 2014-08-15 Kazuhiro Ito * elmo-nntp.el (elmo-nntp-parse-overview-string): Do not use temporary buffer. Improve performance. 2014-07-12 Kazuhiro Ito * elmo-util.el (elmo-string): Assume first argument STRING is string. 2014-07-09 Kazuhiro Ito * elmo-util.el (elmo-string): Optional arguments FROM and TO are available. Use substring-no-properties if available. * elmo.el (elmo-make-folder): Use elmo-string with optional arguments. 2014-07-07 Juliusz Chroboczek * elmo-pipe.el (elmo-folder-initialize): Protect against overwriting match data. 2014-06-11 Kazuhiro Ito * elmo-date.el (elmo-time-less-p): Use car-less-than-car. * elmo-mime.el (elmo-message-reassembled-mime-entity): Likewise. * elmo-util.el (elmo-list-diff): Likewise. 2014-06-03 Juliusz Chroboczek * elmo-imap4.el (elmo-imap4-parse-resp-text-code): Fix parsing of IMAP ALERT replies. 2014-06-01 David Maus * elmo-maildir.el (elmo-map-message-fetch): Signal error if maildir message file is not found. 2014-05-30 Kazuhiro Ito Fix for https://github.com/wanderlust/wanderlust/issues/59 * elmo-imap4.el (elmo-imap4-search-generate-vector): Call elmo-imap4-flag-to-imap-criteria instead of elmo-imap4-flag-to-imap-search-key. * elmo-nntp.el (elmo-nntp-use-server-search-p): Return nil for flag search. 2014-05-30 Kazuhiro Ito * elmo-msgdb.el (elmo-msgdb-get-parent-entity): Add the comment for old msgdb. * elmo-multi.el (elmo-message-entity-parent): Likewise. * elmo-shimbun.el (elmo-message-entity-parent): Likewise. 2014-05-24 Kazuhiro Ito * elmo-msgdb.el (elmo-message-entity-field): Revert the last change. (elmo-msgdb-get-parent-entity): Check type of references field's value. (elmo-msgdb-overview-entity-get-references): Revert the last change. * elmo-multi.el (elmo-message-entity-parent): Check type of references field's value. * elmo-shimbun.el (elmo-message-entity-parent): Likewise. 2014-05-23 Kazuhiro Ito * elmo-pop3.el (elmo-pop3-read-body): Fix trying to access buffer local variable from another buffer. Cf. https://github.com/wanderlust/wanderlust/commit/f1b56519a392a6087f5209afae52fb3324e65490#commitcomment-6424927 2014-05-23 Kazuhiro Ito * elmo-imap4.el (elmo-imap4-setup-send-buffer): Fix typo. Bind inhibit-eol-conversion to nil before code conversion. Cf. https://github.com/wanderlust/wanderlust/commit/88b9596f95b106dc04aba77e890a97252e32b516#commitcomment-6425013 2014-05-20 David Maus * elmo-imap4.el (elmo-folder-append-buffer): Fix even more trailing and leading whitespace. 2014-05-20 David Maus * elmo-imap4.el (elmo-folder-append-buffer): Remove trailing space from command particle. 2014-05-19 David Maus * elmo-imap4.el (elmo-imap4-send-command): Don't use string-empty-p to check for empty string. 2014-05-18 David Maus * elmo-imap4.el (elmo-imap4-search-build-full-command): Simplified. (elmo-imap4-search-generate-vector) (elmo-imap4-search-generate-and, elmo-imap4-search-generate-or): Remove trailing spaces. 2014-05-18 David Maus * elmo-imap4.el (elmo-create-folder-plugged): Remove leading and trainling space from IMAP command particle. (elmo-imap4-session-select-mailbox) (elmo-imap4-session-unselect-mailbox, elmo-imap4-clear-login) (elmo-imap4-server-diff-async, elmo-imap4-folder-status-plugged) (elmo-folder-list-subfolders, elmo-folder-delete) (elmo-folder-rename-internal, elmo-imap4-copy-messages) (elmo-folder-delete-messages-plugged) (elmo-imap4-folder-diff-plugged, elmo-folder-open) (elmo-folder-create-plugged, elmo-folder-append-buffer) (elmo-folder-next-message-number-plugged) (elmo-message-fetch-field): Dto. (elmo-imap4-send-command): Use a list to build final command string. 2014-05-18 David Maus * elmo-imap4.el (elmo-imap4-session-process-send-string): New function. Send string to session process, facoted out from `elmo-imap4-send-string`. (elmo-imap4-send-string): Use factord out function. (elmo-imap4-send-command): Use new function to send to process. 2014-05-18 David Maus * elmo-imap4.el (with-elmo-imap4-session-process-buffer): New macro. Execute BODY in a sessions' process buffer. (elmo-imap4-command-tag): Use new macro. (elmo-imap4-session-wait-response-maybe): New function. Wait for server response when in parsing state. (elmo-imap4-send-command): Use new function. 2014-05-18 David Maus * elmo-imap4.el (elmo-imap4-command-tag): New function. Return IMAP command tag. (elmo-imap4-send-command): Use new function to obtain command tag. 2014-05-18 David Maus * elmo-imap4.el (elmo-imap4-send-command): Refactor sending of literals, add logging. 2014-05-18 Kazuhiro Ito * elmo-util.el (elmo-list-diff): Simplified. Sort each element of return value. * elmo.el (elmo-folder-synchronize): Do not sort elmo-list-diff's result. 2014-05-17 Kazuhiro Ito Keep multiple parent Message-IDs in msgdb. Msgdb structure has slightly changed. Older wl can load new msgdb without any error, but will fail to search parent message. New wl can load old msgdb but new feature is available only for newly added messages. * elmo-msgdb.el (elmo-message-entity-field): Return list of Message-IDs for reference field. (elmo-msgdb-get-parent-entity): Assume references field's value is list. (elmo-msgdb-overview-entity-get-references): Return list of Message-IDs. * elmo-multi.el (elmo-message-entity-parent): Assume references field's value is list. * elmo-nntp.el (elmo-nntp-create-msgdb-from-overview-string): Make references field as list of Message-IDs. * elmo-shimbun.el (elmo-message-entity-parent): Assume references field's value is list. * elmo-util.el (elmo-msgdb-get-message-ids-from-header): New function. (elmo-msgdb-get-references-from-header): Use it. Return list of Message-IDs. 2014-05-17 Kazuhiro Ito Improve performance of uniquifying large list of sortable numbers. * elmo-util.el (elmo-sort-uniq-number-list): New function. (elmo-union): Use it. * elmo-filter.el (elmo-folder-list-messages): Likewise. * elmo-imap4.el (elmo-folder-merge-flagged): Likewise. * elmo-nntp.el (elmo-nntp-search-internal): Likewise. * elmo.el (elmo-folder-list-messages, elmo-folder-merge-flagged): Likewise. * modb-standard.el (modb-standard-cleanup-stale-entities): Likewise. 2014-05-16 Kazuhiro Ito * elmo-util.el (elmo-max-of-list): Fix the last change for the case argument is nil. 2014-05-16 Kazuhiro Ito * elmo-util.el (elmo-max-of-list, elmo-cache-get-path-subr) (elmo-warning): Explicit function's symbols. 2014-05-16 Kazuhiro Ito * elmo-util.el (elmo-max-of-list): Refactored. 2014-05-05 Kazuhiro Ito * elmo-util.el (elmo-with-enable-multibyte): Fix the last change. Check result was interpreted reversely. Reported by Juliusz Chroboczek. 2014-04-28 Kazuhiro Ito * elmo-pop3.el (elmo-pop3-read-contents): Do not bind case-fold-search. search-forward with minimal query. 2014-04-28 Kazuhiro Ito * elmo-nntp.el (elmo-nntp-read-response, elmo-nntp-read-contents) (elmo-nntp-read-body): Improve performance. Cf. https://github.com/wanderlust/wanderlust/commit/cf49dc988b79e2bb219fd45548e4511d7b815a9b * elmo-pop3.el (elmo-pop3-read-response, elmo-pop3-read-body): Likewise. 2014-03-31 Kazuhiro Ito * elmo-util.el (elmo-delete-cr-region, elmo-delete-cr): Bind inhibit-eol-conversion to nil. Cf. https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=742206 2014-02-22 Kazuhiro Ito * elmo-imap4.el (elmo-imap4-setup-send-buffer): Accept third argument FILE. Refactored. (elmo-imap4-setup-send-buffer-from-file): Use it. 2014-02-21 Kazuhiro Ito * elmo-util.el (elmo-delete-cr-region) (elmo-delete-cr-get-content-type, elmo-delete-cr) (elmo-delete-cr-region): Refactored. 2014-02-08 Kazuhiro Ito (not tested) * elmo-imap4.el (elmo-imap4-read-token): New inline function. (elmo-imap4-parse-response, elmo-imap4-parse-fetch): Use it. (elmo-imap4-parse-nil, elmo-imap4-parse-greeting) (elmo-imap4-parse-resp-text-code, elmo-imap4-parse-data-list): Match string case-insensitively. 2014-01-19 Kazuhiro Ito * elmo-util.el (elmo-parse-token): Optional argument ASIS is added. * elmo-multi.el (elmo-folder-initialize): Call elmo-parse-token with ASIS option. 2014-01-13 Kazuhiro Ito * elmo-vars.el (elmo-have-link-count): Set default to nil on Cygwin. 2013-06-30 David Maus * elmo-imap4.el (elmo-imap4-search-generate-vector): Remove repeated calls to `elmo-filter-key', use `search-key' variable. 2013-06-19 Kazuhiro Ito * elmo-vars.el: Explicitly specify file coding. 2013-03-31 Kazuhiro Ito * modb-entity.el (modb-entity-match-entity-body): Use elmo-mime-charset-decode-string instead of decode-mime-charset-string. 2013-03-29 Kazuhiro Ito * elmo-util.el (elmo-with-enable-multibyte): Move to temporary buffer only when FLIM's MIME-charset decodes/encoders require multibyte buffer. 2013-03-23 Kazuhiro Ito * elmo-util.el (elmo-mime-charset-decode-string) (elmo-mime-charset-encode-string): New functions. (elmo-mime-string): Use elmo-mime-charset-encode-string. * elmo-msgdb.el (elmo-msgdb-overview-entity-get-from-no-decode) (elmo-msgdb-overview-entity-get-subject-no-decode): Use elmo-mime-charset-encode-string. * modb-entity.el (elmo-msgdb-get-decoded-cache) (modb-entity-string-encoder) (modb-entity-encode-string-recursive): Use new functions. 2012-11-19 Kazuhiro Ito * elmo.el (elmo-message-match-condition): Do not decode a message here. * modb-entity.el (elmo-msgdb-message-match-condition): Decode a message for 'raw-body' seaching. 2012-11-17 Kazuhiro Ito elmo-folder-search by 'body' now searches only text parts and decodes them before searching. Previous behavior is available as seaching by 'raw-body'. * elmo-imap4.el (elmo-imap4-search-internal-primitive): Treat 'raw-body' search as the same with 'body' search. * elmo-nntp.el (elmo-nntp-use-server-search-p): Deal the case of 'raw-body' search. * modb-entity.el (modb-entity-match-entity-body): New function. (elmo-msgdb-message-match-condition): Use it for 'body' searching. Previous 'body' search is available as 'raw-body' search. 2012-08-26 Kazuhiro Ito * elmo-util.el (elmo-cache-get-path-subr): Refactored. * elmo-date.el (elmo-replace-in-string): Use replace-regexp-in-string if available. 2012-08-26 Kazuhiro Ito * elmo-imap4.el (elmo-imap4-parse-namespace-subr) (elmo-imap4-parse-flag-list) (elmo-imap4-search-internal-primitive): Use zerop instead of eq with 0. * elmo-nntp.el (elmo-nntp-send-buffer): Likewise. * elmo-split.el (elmo-split): Likewise. * elmo-util.el (elmo-time-expire, elmo-parse-token) (elmo-parse-prefixed-element): Likewise. * elmo.el (elmo-folder-move-messages): Likewise. 2012-08-26 Kazuhiro Ito * elmo-archive.el (Top, elmo-folder-initialize) (elmo-archive-folder-list-subfolders): Use match-string directly instead of elmo-match-string. * elmo-cache.el (elmo-folder-initialize): Likewise * elmo-date.el (elmo-replace-in-string, elmo-date-get-datevec): Likewise. * elmo-file.el (elmo-file-make-date-string): Likewise. * elmo-filter.el (elmo-folder-initialize): Likewise. * elmo-imap4.el (elmo-imap4-parse-capability) (elmo-folder-initialize): Likewise. * elmo-maildir.el (elmo-maildir-list-location) (elmo-maildir-set-mark, elmo-maildir-delete-mark): Likewise. * elmo-nntp.el (elmo-folder-list-messages-plugged) (elmo-nntp-folder-status, elmo-nntp-post): Likewise. * elmo-pipe.el (elmo-folder-initialize): Likewise. * elmo-shimbun.el (elmo-folder-initialize): Likewise. * elmo-util.el (elmo-msgid-to-cache): Likewise. 2012-08-26 Kazuhiro Ito * elmo-date.el (elmo-match-string): Obsolete. Use match-string directly. (elmo-match-buffer): Use `match-string-no-properties' if available. 2012-08-23 Kazuhiro Ito * elmo.el (elmo-folder-msgdb-path): Do not require md5.el. Autoload cookie is already defined. * elmo-util.el (elmo-string-to-list): Refactored. 2012-08-15 David Maus * elmo-util.el (elmo-get-message-id-from-field): Fallback to std11 parser if regexp didn't match. * elmo-vars.el (elmo-always-prefer-std11-parser): Renamed from `elmo-prefer-std11-parser', default to nil. 2012-08-14 David Maus * elmo-nntp.el (elmo-nntp-post): Dynamically bind `elmo-prefer-std11-parser'. (elmo-nntp-setup-crosspost-buffer): Dto. * elmo-util.el (elmo-get-message-id-from-field) (elmo-get-message-id-from-header) (elmo-get-message-id-from-buffer): Remove `strict' parameter, dynamically bind `elmo-prefer-std11-parser' instead. 2012-08-08 David Maus * elmo-util.el (elmo-parse-msgid-field): Renamed from `elmo-normalize-msgid-field'. (elmo-get-message-id-from-field): Dto. 2012-08-05 David Maus * elmo-util.el (elmo-extract-std11-msgid-tokens): Retain order of message-id values. * elmo-vars.el (elmo-prefer-std11-parser): New customizable. Prefer std11 parser over regexp. * elmo-util.el (elmo-get-message-id-from-field): Use customizable. 2012-08-05 David Maus * elmo-util.el (elmo-extract-std11-msgid-tokens): New function. Extract msg-id tokens from std11-parsed field. (elmo-normalize-msgid-field): New function. Return list of message-id field values in field. (elmo-get-message-id-from-field): New function. Return message-id field value. (elmo-get-message-id-from-header): Refactored. Use new functions. 2012-08-05 Kazuhiro Ito * elmo-util.el (elmo-unfold-field-body, elmo-decoded-field-body): Call make-obsolete with 2 arguments. Emacs 20.x don't accept 3 arguments. 2012-08-04 Kazuhiro Ito * elmo-util.el : Do not require utf7.el. 2012-08-02 Kazuhiro Ito * elmo-imap4.el : Don't require utf7.el unconditionally. Add autoload settings for `utf7-decode' and `utf7-encode'. (elmo-imap4-use-modified-utf7): Set t when internal coding system for modified UTF-7 is available. Fix typo of docstring. (elmo-imap4-decode-folder-string) (elmo-imap4-encode-folder-string): Use internal coding system if available. 2012-08-01 Kazuhiro Ito * elmo-nntp.el (elmo-nntp-post): Remove the invalid Message-ID header when the recommended ID is provided. 2012-08-01 Kazuhiro Ito * elmo-util.el (elmo-get-message-id-from-header) (elmo-get-message-id-from-buffer): New functions. (elmo-msgdb-get-message-id-from-header): Use them. * elmo-nntp.el (elmo-nntp-post): Likewise. (elmo-nntp-setup-crosspost-buffer): Likewise. * elmo-cache.el (elmo-folder-append-buffer): Use elmo-msgdb-get-message-id-from-buffer. 2012-07-30 David Maus * elmo-util.el (elmo-unfold-field-body, elmo-decoded-field-body): Declare obsolete. 2012-07-27 Kazuhiro Ito * elmo-util.el (elmo-msgdb-get-message-id-from-header): New function. (elmo-msgdb-get-message-id-from-buffer): Use it. * modb-entity.el (elmo-msgdb-create-message-entity-from-header): Likewise. 2012-07-27 Kazuhiro Ito * elmo-util.el (elmo-msgdb-get-references-from-header): Renamed from elmo-msgdb-get-references-from-buffer. * elmo-shimbun.el (elmo-shimbun-update-overview): Likewise. * modb-entity.el (elmo-msgdb-create-message-entity-from-header): Likewise. 2012-07-26 Kazuhiro Ito * modb-entity.el (elmo-msgdb-create-message-entity-from-header): Rnamed from elmo-msgdb-create-message-entity-from-buffer. (elmo-msgdb-create-message-entity-from-file): Likewise. * elmo-archive.el (elmo-archive-msgdb-create-entity-subr): Likewise. * elmo-imap4.el (elmo-imap4-fetch-callback-1): Likewise. * elmo-nntp.el (elmo-nntp-msgdb-create-message): Likewise. * elmo-pop3.el (elmo-pop3-msgdb-create-message): Likewise. * elmo-shimbun.el (elmo-shimbun-msgdb-create-entity): Likewise. 2012-07-26 Kazuhiro Ito * elmo-util.el (elmo-msgdb-get-message-id-from-buffer): Do not assume buffer is narrowed to header. 2012-07-26 Kazuhiro Ito * elmo-util.el (elmo-decoded-fetch-field): Renamed from elmo-decoded-field-body. elmo-decoded-fetch-field is obsolete. * elmo-spam.el (elmo-spam-buffer-spam-p) (elmo-spam-message-spam-p): Likewise. * modb-entity.el (elmo-msgdb-create-message-entity-from-buffer): Likewise. 2012-07-26 Kazuhiro Ito * elmo-util.el (elmo-unfold-fetch-field): Renamed from elmo-unfold-field-body. elmo-unfold-field-body is obsolete. (elmo-msgdb-get-message-id-from-buffer): Likewise. 2012-07-25 Kazuhiro Ito * elmo-util.el (elmo-field-body): Obsolete. Remove eval-and-compile. Do not care of std11-fetch-field's availability. (elmo-unfold-field-body, elmo-decoded-field-body) (elmo-msgdb-get-message-id-from-buffer) (elmo-msgdb-get-references-from-buffer): Call std11-fetch-field directly. * modb-entity.el (elmo-msgdb-create-message-entity-from-buffer): Likewise. 2011-11-30 David Maus * elmo-maildir.el (elmo-folder-append-buffer): Correctly get the number of the appended message. 2011-07-17 David Maus * elmo-util.el (elmo-list-difference): New function. Return difference of two lists. * elmo-imap4.el (elmo-imap4-search-generate-vector): Use function. 2011-07-03 Erik Hetzner * elmo-imap4.el (elmo-imap4-search-internal-primitive): Removed. (elmo-imap4-search-build-full-command): New function. Build full IMAP search command. (elmo-imap4-search-perform): New function. Perform IMAP search. (elmo-imap4-search-generate-vector): New function. Generate search vector. (elmo-imap4-search-mergeable-p): New function. Return non-nil if two search conditions are mergeable. (elmo-imap4-search-mergeable-charset): New function. Return charset of two searches for merging. (elmo-imap4-search-generate-uid): New function. Return search for a set of messages. (elmo-imap4-search-generate-and): New function. Return search that returns intersection of two search commands. (elmo-imap4-search-generate-or): New function. Return search that returns union of two search commands. (elmo-imap4-search-generate): New function. Return search in folder. (elmo-imap4-search-internal): Use new search functions. 2012-05-15 Kazuhiro Ito * modb-entity.el (elmo-msgdb-create-message-entity-from-file): Stop to get file attributes here. Stop to let-bind insert-file-contents-pre-hook and insert-file-contents-post-hook. Pass filename to temporary buffer. (elmo-msgdb-create-message-entity-from-buffer): Get file attributes here. Get file attributes and build date string from mtime only when needed. 2012-04-27 Kazuhiro Ito * modb-entity.el (elmo-msgdb-create-message-entity-from-file): Check whether file exists at first. Do not narrow. * elmo-util.el (elmo-delete-cr-region): New inline function. (elmo-delete-cr-buffer): Use it. (elmo-msgdb-insert-file-header): Fix failure to detect the end of headers in some cases. Delete contents after inserted headers. 2012-04-26 Kazuhiro Ito * modb-entity.el (elmo-msgdb-create-message-entity-from-buffer): (modb-standard-rntity-handler) Avoid redundant fetching field-value. Reduce use of let(). 2012-04-24 Kazuhiro Ito * elmo-util.el (elmo-msgdb-get-message-id-from-buffer): Normalize result string. * modb-entity.el (modb-standard-entity-normalizer) (modb-standard-entity-specializer): Fix typo. 2012-04-07 Kazuhiro Ito * elmo-net.el (elmo-open-tls-stream): Removed. * elmo-vars.el (elmo-network-stream-type-alist): Use open-tls-stream instead of elmo-open-tls-stream. 2012-04-07 Kazuhiro Ito * elmo-net.el (elmo-open-network-stream): Raise error when open connection function failed. 2012-04-07 Kazuhiro Ito * elmo-net.el (elmo-network-stream-type-from-symbol): Removed. elmo-get-network-stream-type has slipped out of my check, which had the same functionality. 2012-03-18 Kazuhiro Ito * elmo-nntp.el (elmo-folder-initialize): Do not modify elmo-network-stream-type-alist. 2011-07-03 David Maus * elmo-imap4.el (elmo-imap4-session-unselect-mailbox): New function. Leave selected state without silent EXPUNGE. (elmo-folder-rename-internal): Use function. 2011-06-03 David Maus * elmo-imap4.el (elmo-imap4-fetch-callback-1-subr): Don't mark unread messages with important or answered flag read. 2011-06-02 David Maus * elmo-date.el (elmo-time-make-imap-date-string): New function. Return IMAP4 compliant date string. * elmo-imap4.el (elmo-folder-append-buffer): Return uid of append message if requested. 2011-05-29 David Maus * elmo-imap4.el (elmo-network-authenticate-session): Always ask for capabilities after login. (elmo-imap4-parse-response): Remove superfluous third argument to split-string. 2011-05-29 David Maus * elmo-maildir.el (elmo-folder-append-buffer): Return number of appended message. * elmo-localdir.el (elmo-folder-append-buffer): Dto. * elmo-archive.el (elmo-archive-folder-append-buffer): Dto. * elmo.el (elmo-folder-append-buffer): Add optional fourth argument, return number of appended message if possible. * elmo-pipe.el (elmo-folder-append-buffer): Dto. * elmo-maildir.el (elmo-folder-append-buffer): Dto. * elmo-flag.el (elmo-folder-append-buffer): Dto. * elmo-localdir.el (elmo-folder-append-buffer): Dto. * elmo-filter.el (elmo-folder-append-buffer): Dto. * elmo-cache.el (elmo-folder-append-buffer): Dto. * elmo-archive.el (elmo-folder-append-buffer) (elmo-archive-folder-append-buffer): Dto. 2011-05-24 Kazuhiro Ito * elmo-util.el (elmo-uniq-sorted-list, elmo-uniq-list): Fix typo in the docstring. 2011-05-23 Kazuhiro Ito * elmo-net.el (elmo-network-stream-type-from-symbol): New function. (elmo-open-tls-stream): New function. * elmo-vars.el (elmo-network-stream-type-alist): Check whether gnutls.el or tls.el is available. 2011-01-12 David Maus * elmo-nntp.el (elmo-nntp-folder-msgdb-create): Remove accidental rebinding of new message db symbol. 2010-11-02 Kazuhiro Ito * elmo-pop3.el (elmo-folder-open-internal): Don't load location map if it is already loaded. 2010-10-31 David Maus * elmo-map.el (elmo-folder-open-internal): Don't load location map if it is already loaded. * elmo.el (elmo-folder-open-internal-p) (elmo-folder-move-messages): Method removed. * elmo-filter.el (elmo-folder-open-internal-p): Dto. * elmo-map.el (elmo-folder-open-internal-p): Dto. * elmo-multi.el (elmo-folder-open-internal-p): Dto. * elmo-pipe.el (elmo-folder-open-internal-p): Dto. * elmo-pop3.el (elmo-folder-open-internal-p): Dto. * elmo-shimbun.el (elmo-folder-open-internal-p): Dto. 2010-10-24 David Maus * elmo-pop3.el (elmo-folder-open-internal-p): Define method for this class. * elmo-shimbun.el (elmo-folder-open-internal-p): Dto. * elmo-multi.el (elmo-folder-open-internal-p): Fix invalid let statement. 2010-10-14 David Maus * elmo-multi.el (elmo-folder-open-internal-p): Evaluate symbol to return state of child folders. 2010-10-13 David Maus * elmo-multi.el (elmo-folder-open-internal-p): Start with t and set to nil if one of the child folders is not open. (elmo-folder-open-internal): Open child folders only if they are not opened yet. 2010-08-31 David Maus * elmo-imap4.el (elmo-folder-delete-messages-plugged): Use smarter mechanism to expunge messages. 2010-08-31 TAKAHASHI Kaoru * elmo-imap4.el: Remove trailing whitespace. * elmo-localdir.el (elmo-folder-pack-numbers): Fix `elmo-bind-directory' indent. * elmo-imap4.el (elmo-imap4-folder-list-range): Fix indent (only cosmetic fix). 2010-08-27 TAKAHASHI Kaoru * elmo-util.el (elmo-delete-char): Fix `elmo-set-work-buf' indent. (elmo-delete-cr, elmo-get-file-string, elmo-save-string) (elmo-string-to-list, elmo-list-to-string): Ditto. 2010-08-26 TAKAHASHI Kaoru * elmo-archive.el (elmo-archive-field-condition-match) (elmo-archive-suffix-alist) (elmo-archive-create-file, elmo-archive-folder-append-buffer) (elmo-archive-folder-message-make-temp-files) (elmo-archive-append-files) (elmo-archive-field-condition-match): Fix indent. * elmo-pop3.el (elmo-pop3-read-response): Fix `response-string'. Avoid `args-out-of-range 0, 1' error. 2010-08-24 TAKAHASHI Kaoru * acap.el (acap-arrival-filter): Use (delete-char (- X)) instead of (delete-backward-char X) that deletes region in Emacs 24. See delete-active-region described in NEWS. * elmo-imap4.el (elmo-imap4-arrival-filter): Ditto. * elmo-util.el (elmo-get-file-string): Ditto. * utf7.el (utf7-encode-internal, utf7-decode-internal): Ditto. 2010-08-09 David Maus * elmo.el (elmo-folder-open-internal-p): New luna method. (elmo-folder-move-messages): Open source folder only if necessary. * elmo-pipe.el (elmo-folder-open-internal-p): New luna method. * elmo-multi.el (elmo-folder-open-internal-p): Dto. * elmo-map.el (elmo-folder-open-internal-p): Dto. * elmo-filter.el (elmo-folder-open-internal-p): Dto. 2010-08-04 David Maus * elmo-imap4.el (elmo-imap4-session-deselect-mailbox): New function. Leave selected state without causing silent EXPUNGE. (elmo-imap4-folder-status-plugged, elmo-folder-rename-internal): Use function. 2010-08-01 David Maus * elmo.el (elmo-folder-move-messages): Open source folder before moving messages. 2010-07-18 David Maus * elmo-imap4.el (elmo-imap4-mailbox-size-update-maybe): Ignore EXPUNGE responses. (elmo-imap4-mailbox-size-update-maybe): Use latest EXIST or RECENT response value. 2010-07-02 David Maus * elmo-imap4.el (elmo-server-diff-async): Remove. Unused luna method. (elmo-imap4-folder-status-plugged): Close mailbox before calling STATUS if it is selected. If `elmo-imap4-use-select-to-update-status' is non-nil, do the opposite. (elmo-imap4-folder-status-plugged): Remove usage of kill file to adjust message counter. (elmo-folder-next-message-number-plugged): Close mailbox before calling STATUS if selected. If `elmo-imap4-use-select-to-update-status' is non-nil, do the opposite. 2010-05-18 David Maus * elmo-imap4.el (elmo-imap4-mailbox-selected-p): Fix typo. 2010-05-08 David Maus * elmo-imap4.el (elmo-imap4-mailbox-selected-p): New macro. Return non-nil if mailbox is selected in session. (elmo-imap4-session-select-mailbox): Use macro `elmo-imap4-mailbox-selected-p'. (elmo-folder-exists-p-plugged): Dto. (elmo-folder-check-plugged): Dto. (elmo-imap4-folder-diff-plugged): Dto. 2010-05-05 David Maus * elmo-imap4.el (elmo-imap4-mailbox-size-update-maybe): Use simpler method to count expunged messages. (elmo-imap4-folder-diff-plugged): Use NOOP and SEARCH when called for selected mailbox. 2010-04-17 David Maus * elmo-imap4.el (elmo-imap4-mailbox-size-update-maybe): Build list of expunged messages only when response contains expunge. (elmo-imap4-folder-diff-plugged): Removed usage of kill file to adjust message counter. (elmo-imap4-folder-diff-plugged): When mailbox is selected, search for unread messages, call noop to maybe update mailbox size and return recorded size of mailbox. 2010-04-16 David Maus * elmo-imap4.el (luna-define-class): Add slot `current-mailbox-size'. (elmo-imap4-mailbox-size-update-maybe): New function. (elmo-imap4-read-response): Update mailbox size when untagged EXISTS, RECENT and EXPUNGE responses arrive. (elmo-imap4-session-check, elmo-folder-delete-messages-plugged): Wait for and evaluate server response. (elmo-imap4-session-select-mailbox, elmo-folder-delete) (elmo-folder-open): Reset mailbox size when no mailbox selected. 2010-04-15 David Maus * elmo-imap4.el (elmo-imap4-folder-name-syntax): Allow numbers in imap user name. 2010-04-14 David Maus * elmo-imap4.el (elmo-imap4-disabled-extension): New variable. List of server extensions that are disabled on the client side. (elmo-imap4-session-capable-p): Honour list of disabled extensions. 2010-03-17 David Maus * elmo-imap4.el (elmo-imap4-folder-list-flagged) (elmo-imap4-search-internal-primitive): Pass filter type to imap search when performing search for flagged messages. 2010-03-02 Katsuyoshi Ohara * elmo-archive.el (elmo-intern-soft): New function. (elmo-folder-initialize): Use it. 2010-01-22 Vitaly Mayatskih * modb-standard.el (modb-standard-save-entity): Use `modb-standard-cleanup-stale-entities' to clean up stale entity files in modb cache. * elmo-imap4.el (elmo-network-authenticate-session): Ask for capabilities after login. 2010-01-17 TAKAHASHI Kaoru * elmo-imap4.el (elmo-folder-list-messages-plugged): Use TAB for indent (only cosmetic fix). 2010-01-15 Vitaly Mayatskih * elmo-version.el (elmo-version): Up to 2.15.9. * elmo-imap4.el (elmo-imap4-elist): New function * elmo-imap4.el (elmo-imap4-parse-response): Added support for ESEARCH feature (RFC4731). * elmo-imap4.el (toplevel): Require time-stamp * elmo-imap4.el (elmo-imap4-send-command, elmo-imap4-send-string, elmo-imap4-read-response elmo-imap4-read-untagged elmo-imap4-arrival-filter elmo-imap4-parse-response): Change logging format. * elmo-imap4.el (elmo-folder-list-messages-plugged, elmo-imap4-folder-list-range, elmo-folder-open): Don't ask server for full uid range on folder entering, retrieve updates only for newly appeared messages. * elmo-imap4.el (elmo-imap4-send-command, elmo-imap4-send-string, elmo-imap4-read-response, elmo-imap4-read-untagged, elmo-imap4-parse-response): Change deprecated time-stamp-hh:mm:ss to format-time-string. * elmo-vars.el (toplevel): New custom `elmo-imap4-set-seen-flag-explicitly' to override setting of Seen flag for some buggy servers. * elmo-imap4.el (elmo-message-fetch-plugged): Ditto 2010-01-05 TAKAHASHI Kaoru * acap.el (acap-parse-response): Fix comment-out style. Use three semicolons, that should start at the left margin. See. also (Info-goto-node "(elisp)Comment Tips"). * elmo.el (toplevel, elmo-message-match-condition) (elmo-folder-set-info-max-by-numdb, elmo-folder-move-messages): Ditto. * elmo-archive.el (elmo-archive-suffix-alist) (elmo-archive-tar-method-alist, elmo-archive-tgz-method-alist) (elmo-archive-method-list) (elmo-archive-msgdb-create-as-numlist-subr2, elmo-folder-search): Ditto. * elmo-imap4.el (toplevel) (elmo-imap4-send-command, elmo-imap4-check-validity) (elmo-imap4-fetch-callback-1-subr) (elmo-network-initialize-session, elmo-server-diff-async) (elmo-imap4-folder-diff-plugged): Ditto * elmo-maildir.el (elmo-maildir-temporal-filename): Ditto. * elmo-msgdb.el (elmo-msgdb-append-element): Ditto. * elmo-net.el (elmo-network-close-session): Ditto. * elmo-nntp.el (elmo-nntp-create-msgdb-from-overview-string) (elmo-nntp-parse-overview-string, elmo-nntp-post): Ditto. * elmo-pop3.el (elmo-pop3-retrieve-headers): Ditto. * elmo-util.el (elmo-set-auto-coding, elmo-passwd-alist-save) (elmo-number-set-delete) (elmo-cache-get-oldest-cache-file-entity): Ditto. 2010-01-04 TAKAHASHI Kaoru * elmo-version.el (elmo-version): Up to 2.15.8. * elmo-mime.el (elmo-mime-insert-header-from-buffer): Use `with-current-buffer' instead of `save-excursion' (for suppress compile warnings). * elmo.el (elmo-folder-confirm-appends): Use `number-to-string' instead of `int-to-string'. * elmo-archive.el (elmo-archive-message-fetch-internal) (elmo-archive-folder-message-make-temp-files) (elmo-archive-folder-append-buffer) (elmo-folder-delete-messages-internal) (elmo-archive-msgdb-create-entity) (elmo-archive-msgdb-create-as-numlist-subr2): Ditto. * elmo-util.el (elmo-cache-expire-by-age): Ditto. * elmo-flag.el (elmo-global-flag-set-internal): Ditto. * elmo-file.el (elmo-folder-message-make-temp-files): Ditto. * elmo-imap4.el (elmo-imap4-make-number-set-list) (elmo-folder-list-subfolders): Ditto. * elmo-localdir.el (elmo-message-file-name) (elmo-folder-message-make-temp-files) (elmo-localdir-msgdb-create-entity) (elmo-folder-append-messages-*-localdir) (elmo-folder-pack-numbers): Ditto. * elmo-maildir.el (elmo-folder-message-make-temp-files): Ditto. * elmo-map.el (elmo-location-map-key): Ditto. * elmo-nntp.el (elmo-nntp-folder-postfix) (elmo-nntp-folder-list-subfolders) (elmo-nntp-folder-msgdb-create): Ditto. * elmo.el (elmo-crosspost-message-alist-save): Don't use `function' for `lambda'. * elmo-archive.el (elmo-archive-folder-list-subfolders) (elmo-folder-append-messages-*-archive) (elmo-folder-delete-messages-internal): Ditto. * elmo-date.el (elmo-replace-in-string): Ditto. * elmo-multi.el (elmo-folder-list-messages, elmo-folder-search) (elmo-folder-list-flagged): Ditto. * elmo-maildir.el (elmo-maildir-cleanup-temporal): Ditto. * elmo-imap4.el (elmo-network-authenticate-session): Ditto. * modb-standard.el (modb-standard-cleanup-stale-entities): Ditto. 2010-01-02 TAKAHASHI Kaoru * elmo-dop.el (elmo-dop-spool-folder): Suppress warning "defsubst `elmo-dop-spool-folder' was used before it was defined"; Use `defun' instead. * pldap.el (ldap/ldif-safe-string-p): macro to function. * elmo-imap4.el (elmo-imap4-detect-search-charset): Ditto. * elmo.el (elmo-folder-info-make-hashtb): Use `mapc' instead of `mapcar'; Suppress compile warning. * elmo-imap4.el (elmo-network-initialize-session-buffer) (elmo-imap4-search-internal-primitive): Ditto. * elmo-nntp.el (elmo-nntp-search-primitive): Ditto. * elmo-archive.el (elmo-archive-exec-msgs-subr2): Ditto. * elmo-imap4.el (elmo-imap4-parse-address-list) (elmo-imap4-parse-fetch-body-section, elmo-imap4-parse-body) (elmo-imap4-parse-acl, elmo-imap4-parse-body-extension) (elmo-imap4-parse-body-ext, elmo-imap4-parse-body): Use `(string-to-char " ")' instead of `? ', `?\ '. 2010-01-01 TAKAHASHI Kaoru * pldap.el (ldap-search-entries): Don't use `function' for lambda. (ldap-add-entries, ldap-modify-entries): Use `mapc' instead of `mapcar'. (ldap-delete-entries): Use `mapc' instead of `mapcar'. Don't use `function' for lambda. * modb-standard.el (modb-standard-cleanup-stale-entities): Use `string-to-number' instead of `string-to-int'. * elmo-util.el (elmo-set-work-buf): Use `with-current-buffer' instead of `save-excursion' (for suppress compile warnings). * elmo-pop3.el (elmo-pop3-retrieve-headers): Ditto. * elmo-nntp.el (elmo-nntp-list-folders-get-cache): Ditto. (elmo-nntp-post): Ditto. 2009-08-01 TAKAHASHI Kaoru * utf7.el (utf7-get-u16char-converter): Revert BOM workaround for Mule-UCS (to-utf-16). (utf7-utf-16-coding-system): Change preference when Mule-UCS on Emacs 23. 2009-07-11 Taiki SUGAWARA * utf7.el (utf7-find-coding-system-without-bom): New Function. (utf7-utf-16-coding-system): use no-BOM coding system. (utf7-get-u16char-converter): remove workaround for BOM. 2009-05-26 Vitaly Mayatskikh * elmo-util.el (elmo-union): New function, make a union of two lists. * elmo-mime.el (elmo-mime-entity-display): Fix Emacs crash in mime-view when displaying malformed base64 attach. * elmo-imap4.el (elmo-imap4-folder-list-flagged): Use elmo-imap4-list (removed duplicated code) * modb-standard.el (modb-standard-cleanup-stale-entities): New function, Remove stale entities from elmo's cache. 2009-05-26 TAKAHASHI Kaoru * elmo-version.el (elmo-version): Up to 2.15.7. 2009-03-22 Tetsurou Okazaki * elsp-bsfilter.el (elmo-spam-bsfilter-update-switch): Change default value to `--auto-update'. 2008-07-06 TAKAHASHI Kaoru * elmo-pop3.el (elmo-pop3-read-contents): Fix double `goto-char'. Add `elmo-pop3-read-point' barrier. 2008-07-06 YAMASHITA Junji * elmo-pop3.el (elmo-pop3-read-contents): improving performance: goto the previous end-point insead of the head-point, and use `search-forward' instead of `re-search-forward'. 2008-06-30 Tetsurou Okazaki * elmo-imap4.el (elmo-imap4-parse-status): Use `case' instead of `cond'. 2008-06-30 Don Bashford * elmo-imap4.el (elmo-imap4-parse-status): Accept IMAP4 tokens in a case-insensitive fashion. 2008-03-30 Tetsurou Okazaki * elmo-imap4.el (elmo-imap4-send-command): Combine `process-send-string' calls. 2008-02-20 TAKAHASHI Kaoru * elmo-util.el (elmo-add-name-to-file, elmo-field-body): Use `eval-and-compile' for suppress compile warnings. * elmo-vars.el (dynamic-link, dynamic-call): Use `defalias-maybe' instead of `defun-maybe' * elmo-util.el: Add (eval-when-compile (require 'static)). 2008-02-19 TAKAHASHI Kaoru * mmimap.el: Remove (require 'static). * acap.el: Ditto. * elmo-flag.el: Move ';;; Code:' comment. * elmo-imap4.el: Ditto. * elmo-net.el: Ditto. * elmo-version.el (product-provide): Fix comment. 2008-02-18 TAKAHASHI Kaoru * slp.el: Add (eval-when-compile (require 'cl)). * elmo-date.el: Ditto. * elmo-pop3.el: Ditto. * elmo-mime.el: Add (eval-when-compile (require 'elmo)). 2008-02-17 TAKAHASHI Kaoru * modb.el (elmo-msgdb-match-condition-primitive): Use `string-to-number' instead of `string-to-int'. * modb-entity.el (elmo-msgdb-create-message-entity-from-buffer) (elmo-msgdb-message-match-condition) (elmo-msgdb-create-message-entity-from-buffer): Use `string-to-number' instead of `string-to-int'. * elmo.el (elmo-folder-confirm-appends): Use `string-to-number' instead of `string-to-int'. * elmo-util.el (elmo-cache-expire-by-age): Use `string-to-number' instead of `string-to-int'. * elmo-pop3.el (elmo-pop3-list-by-list, elmo-folder-status): Use `string-to-number' instead of `string-to-int'. * elmo-nntp.el (elmo-nntp-make-msglist) (elmo-folder-list-messages-plugged, elmo-nntp-folder-status) (elmo-nntp-create-msgdb-from-overview-string) (elmo-nntp-parse-xhdr-response, elmo-nntp-msgdb-create-message) (elmo-nntp-search-primitive): Use `string-to-number' instead of `string-to-int'. * elmo-net.el (elmo-net-folder-set-parameters): Use `string-to-number' instead of `string-to-int'. * elmo-localdir.el (elmo-localdir-list-subr): Use `string-to-number' instead of `string-to-int'. * elmo-imap4.el (elmo-imap4-search-internal-primitive): Use `string-to-number' instead of `string-to-int'. * elmo-date.el (elmo-date-get-datevec): Use `string-to-number' instead of `string-to-int'. * elmo-archive.el (elmo-archive-list-folder-subr): Use `string-to-number' instead of `string-to-int'. 2008-02-16 TAKAHASHI Kaoru * elmo-util.el (elmo-get-passwd): Fix typo. * elmo-nntp.el (elmo-nntp-get-server-command) (elmo-nntp-set-server-command, elmo-nntp-xover-p) (elmo-nntp-listgroup-p, elmo-nntp-set-listgroup) (elmo-nntp-list-active-p, elmo-nntp-set-list-active) (elmo-nntp-xhdr-p, elmo-nntp-set-xhdr): New backquote style. * elmo-imap4.el (elmo-imap4-debug) (elmo-imap4-response-continue-req-p, elmo-imap4-response-ok-p) (elmo-imap4-response-bye-p, elmo-imap4-response-garbage-p) (elmo-imap4-response-value, elmo-imap4-response-error-text) (elmo-imap4-response-bodydetail-text, elmo-imap4-value) (elmo-imap4-nth, elmo-imap4-detect-search-charset) (elmo-imap4-identical-system-p): New backquote style. 2008-02-15 TAKAHASHI Kaoru * elmo-dop.el (elmo-make-dop-queue): New backquote style. (elmo-dop-queue-fname, elmo-dop-queue-method): Ditto. (elmo-dop-queue-arguments): Ditto. * elmo-date.el (elmo-match-substring): New backquote style. (elmo-match-string, elmo-match-buffer): Ditto. (elmo-date-make-sortable-string): Ditto. * elmo-archive.el (elmo-archive-get-method):New backquote style. (elmo-archive-get-suffix, elmo-archive-get-regexp): Ditto. * elmo-multi.el (elmo-multi-real-folder-number): New backquote style. * elmo-net.el (elmo-network-stream-type-spec-string): New backquote style. (elmo-network-stream-type-symbol): Ditto. (elmo-network-stream-type-feature): Ditto. (elmo-network-stream-type-function): Ditto. (elmo-network-session-buffer): Ditto. * elmo-util.el (elmo-file-cache-expand-path): New backquote style. (elmo-file-cache-status, elmo-file-cache-path): Ditto. (elmo-make-file-cache, elmo-string, elmo-get-passwd): Ditto. (elmo-bind-directory, elmo-set-work-buf): Ditto. * elmo.el (elmo-folder-send): New backquote style. 2008-02-11 TAKAHASHI Kaoru * pldap.el (ldap-static-if): New backquote style. (ldap/ldif-safe-string-p): Ditto. (ldap/ldif-insert-field): Ditto. * elmo-version.el (elmo-version): Up to 2.15.6. 2008-01-31 Yoichi NAKAYAMA * elmo-imap4.el (elmo-folder-list-messages-plugged): Don't include messages with \Deleted flag. (elmo-folder-delete-messages-plugged): Ask before sending expunge command if there are messages with \Deleted flag. 2007-04-24 Yoichi NAKAYAMA * elmo-pop3.el (elmo-pop3-auth-apop): Use more strict regexp. http://seclists.org/bugtraq/2007/Apr/0018.html (Suggested by Tatsuya Kinoshita) 2007-04-16 Yoichi NAKAYAMA * elmo-imap4.el (elmo-folder-delete): Don't call close for mailbox with \Noselect attribute. 2007-04-15 Yoichi NAKAYAMA * elmo-imap4.el (elmo-folder-list-subfolders): Fix handling of hierarchical folder structure with UW-imapd. 2007-02-12 Yoichi NAKAYAMA * elmo-imap4.el (elmo-imap4-clear-login): Don't send LOGIN command when the LOGINDISABLED capability is advertised. 2007-01-27 Yoichi NAKAYAMA * elmo-msgdb.el (elmo-msgdb-extra-fields): Make it non-destructive. 2007-01-23 Hiroya Murata * elmo-shimbun.el (elmo-shimbun-update-overview): Add argnument `entity'. (elmo-map-message-fetch): Call `elmo-shimbun-update-overview' only if the message entity is exists. 2007-01-16 Hiroya Murata * elmo-util.el (elmo-msgdb-insert-file-header): Call `elmo-delete-cr-buffer'. * elmo-localdir.el (elmo-message-fetch-internal): Use `insert-file-contents-as-raw-text' instead of `insert-file-contents-as-binary'. * elmo-maildir.el (elmo-map-message-fetch): Ditto. 2006-12-03 Hiroya Murata * elmo-imap4.el (elmo-network-initialize-session): Check to retrieve a whole greeting message. 2006-11-25 Hiroya Murata * elmo-flag.el (elmo-folder-commit): Encode `.minfo' at save. 2006-11-21 Hiroya Murata * elmo-util.el (elmo-safe-plist-get): New alias or macro. (elmo-progress-notify): Use it instead of `plist-get'. 2006-11-19 Yoichi NAKAYAMA * elmo.el (elmo-generic-folder-append-messages): Remove unused variable `table'. 2006-11-16 Hiroya Murata * elmo-pipe.el (elmo-folder-set-plugged): Define. 2006-11-15 Hiroya Murata * elsp-bsfilter.el (elmo-spam-bsfilter-use-remote): New user option. (elmo-spam-list-spam-messages): Check it option. 2006-11-08 Tetsurou Okazaki * elmo-util.el (elmo-with-progress-display): Return the value of the last form in `body'. 2006-11-07 Hiroya Murata * elmo-util.el (elmo-progress-start): Accept nil for `total'. Set `elmo-progress-counter' as t when a query callback returns nil. (elmo-progress-clear): New function. (elmo-progress-done): Split into `elmo-progress-clear'. (elmo-progress-notify): Update a total slot when it is nil. (elmo-with-progress-display): Call `elmo-progress-clear' in unwind-protect and move calling `elmo-progress-done' to outside. * elmo-imap4.el (elmo-imap4-find-next-line): Call `elmo-progress-notify' with :total parameter instead of `elmo-progress-counter-set-total'. 2006-11-07 Tetsurou Okazaki * elmo-util.el (elmo-cache-expire-by-age): Add docstring. Make it interactive. (elmo-progress-start): Avoid updating `elmo-progress-counter' when a query callback returns nil. Return a progress counter instead of t whenever a start callback was called. 2006-11-05 Hiroya Murata * elmo-imap4.el (elmo-imap4-session-capable-p): New macro. (elmo-imap4-send-command): Use it. (elmo-network-initialize-session): Ditto. (elmo-network-setup-session): Ditto. (elmo-folder-msgdb-create-plugged): Ditto. 2006-11-04 Hiroya Murata * elmo-util.el (elmo-progress-done): Fix a miss refer to `elmo-progress-counter'. 2006-11-03 Hiroya Murata * elsp-bsfilter.el (elsp-bsfilter-list-spam-files): Abolish. (elsp-bsfilter-list-spam-filter): New function. (elsp-bsfilter-start-list-spam): Ditto. (elsp-bsfilter-read-list-spam): Ditto. (elmo-spam-list-spam-messages): Use async process to display progress message by each message. 2006-11-03 Yoichi NAKAYAMA * elmo-spam.el (elmo-spam-process-messages-as-mbox): Fix problem of flushing previously inserted message contents. * elmo-imap4.el (elmo-folder-search): Fix return value. 2006-11-01 Hiroya Murata * elmo-imap4.el (elmo-imap4-find-next-line): Check whether a label of reporter is enable or not. 2006-10-31 Hiroya Murata * elmo-util.el (elmo-list-bigger-diff): Abolish. (elmo-display-progress): Ditto. (elmo-progress-counter-alist): Ditto. (elmo-progress-set): Ditto. (elmo-progress-clear): Ditto. (elmo-progress-counter-all-value): Rename to `elmo-progress-counter-total'. (elmo-progress-counter-format): Rename to `elmo-progress-counter-action'. (elmo-progress-counter): New internal variable. (elmo-progress-callback-function): Ditto. (elmo-progress-counter-label): New function. (elmo-progress-counter-set-total): Ditto. (elmo-progress-counter-set-action): Ditto. (elmo-progress-call-callback): Ditto. (elmo-progress-start): Ditto. (elmo-progress-done): Ditto. (elmo-progress-notify): Rewrite. (elmo-with-progress-display): Remove first argument `condition'. Add optional argument `var' in `spec'. * elmo-vars.el (elmo-display-progress-threshold): Abolish. (elmo-display-retrieval-progress-threshold): Ditto. (elmo-inhibit-display-retrieval-progress): Ditto. * Replace all pair of `elmo-progress-set' and `elmo-progress-clear' into `elmo-with-progress-display'. * Replace to call `elmo-display-progress' into pair of `elmo-progress-notify' and `elmo-with-progress-display'. * elmo-version.el (elmo-version): Up to 2.15.5. 2006-10-15 Hiroya Murata * elmo-imap4.el (elmo-imap4-arrival-filter): Use `case' instead of `cond'. 2006-10-15 Yoichi NAKAYAMA * elmo-imap4.el (elmo-imap4-arrival-filter): Call delete-region in cleanup-forms [wl:14027]. 2006-10-02 Hiroya Murata * elmo-flag.el (elmo-global-flag-set-internal): Use `elmo-copy-file' by priority when the message is a file. 2006-10-01 Yoichi NAKAYAMA * elmo.el: Fix typo: disptch -> dispatch. 2006-10-01 Hiroya Murata * elmo.el (elmo-file-tag): New class. (elmo-append-messages-disptch-table): New constant. (elmo-folder-type-p): New function. (elmo-folder-append-messages): Redefine as function. * elmo-null.el (elmo-folder-append-messages): Renamed from `elmo-folder-append-messages'. * elmo-maildir.el (elmo-maildir-folder): Inherit `elmo-file-tag'. (elmo-folder-append-messages-*-maildir): Renamed from `elmo-folder-append-messages'. * elmo-localdir.el (elmo-localdir-folder): Inherit `elmo-file-tag'. (elmo-folder-append-messages-*-localdir): Renamed from `elmo-folder-append-messages'. * elmo-imap4.el (elmo-folder-append-messages-imap4-imap4): Renamed from `elmo-folder-append-messages'. * elmo-flag.el (elmo-folder-append-messages-*-flag): Renamed from `elmo-folder-append-messages'. * elmo-filter.el (elmo-folder-append-messages-filter-*): New function. (elmo-folder-append-messages-*-filter): Ditto. * elmo-multi.el (elmo-folder-append-messages-multi-*): Ditto. * elmo-pipe.el (elmo-folder-append-messages-pipe-*): Ditto. (elmo-folder-append-messages-*-pipe): Renamed from `elmo-folder-append-messages'. * elmo-cache.el (elmo-cache-folder): Inherit `elmo-file-tag'. * elmo-file.el (elmo-file-folder): Ditto. * elmo-sendlog.el (elmo-sendlog-folder): Ditto. * elmo-archive.el (elmo-folder-append-messages-*-archive): Renamed from `elmo-folder-append-messages' 2006-09-23 Hiroya Murata * elmo-map.el (elmo-location-map-setup): Change an argument `locations' to optional. (elmo-location-map-clear): Abolish. (elmo-folder-clear): Follow the API change. * elmo-pop3.el (elmo-folder-clear): Ditto. * elmo-pop3.el (toplevel): Require elmo-map. (elmo-pop3-folder): Inherit elmo-location-map and abolish location-alist slot (All other related portions are changed). (elmo-pop3-folder-use-uidl): New function. (elmo-folder-msgdb-create): Don't sort message entities. (elmo-pop3-sort-msgdb-by-original-number): Abolish. (elmo-pop3-number-to-size): Convert return value to number. (elmo-pop3-msgdb-create-by-header): Use unwind-protect to delete a working buffer. * elmo-map.el: Use `location-map' as a variable name for instance instead of `mapper'. (elmo-location-map-setup): Return location alist. (elmo-location-map-update): Ditto. 2006-09-21 Hiroya Murata * elmo-map.el (elmo-location-map): New class; split location and number mapping from elmo-map-folder (All other related portions are changed). * elmo-shimbun.el (elmo-folder-open-internal): Follow the API change. * elmo-version.el (elmo-version): Up to 2.15.4. 2006-09-06 Hiroya Murata * elmo-vars.el (elmo-use-hardlink): New user option. * elmo-util.el (elmo-add-name-to-file): Switch implementations by `elmo-use-hardlink'. * elmo-pipe.el (elmo-pipe-folder-list-target-messages): Keep the killed-list. (elmo-pipe-drain): Use `elmo-folder-open' and `elmo-folder-close' instead of `*-internal'. Use `elmo-with-progress-display'. 2006-09-02 Hiroya Murata * elsp-bogofilter.el (elmo-spam-bogofilter-register-messages): Use `elmo-spam-process-messages-as-mbox'. * elsp-sa.el (elmo-spam-spamassassin-register-messages): Ditto. 2006-08-27 Hiroya Murata * elsp-bsfilter.el (elsp-bsfilter-list-spam-files): Fix the argument BUFFER of `call-process'. 2006-08-27 Yoichi NAKAYAMA * elsp-bsfilter.el (elsp-bsfilter-call-bsfilter): Remove nil from args. (elsp-bsfilter-list-spam-files): Ditto. 2006-08-25 Hiroya Murata * elsp-bsfilter.el (elmo-spam-bsfilter-max-files-per-process) (elmo-spam-bsfilter-max-messages-per-process): New use option. (elmo-spam-bsfilter-debug): Fix a group. (elsp-bsfilter-call-bsfilter): Don't use `delq' and add option `--homedir'. (elmo-spam-buffer-spam-p): Don't specify `--homedir' option. (elsp-bsfilter-list-spam-files): New function. (elmo-spam-list-spam-messages): Define. (elsp-bsfilter-register-buffer): Add an optional argument `mbox'. (elmo-spam-bsfilter-register-messages): New function. (elmo-spam-register-spam-messages): Define. (elmo-spam-register-good-messages): Ditto. * elmo-spam.el (elmo-spam-process-messages-as-mbox): New function. * elmo-util.el (elmo-flatten): Use `append' and `listp' instead of `nconc' and `consp'. 2006-08-23 Hiroya Murata * elmo-map.el (elmo-map-folder-update-locations): Rewrite with hash table to test whether a location is exists. 2006-08-20 Yoichi NAKAYAMA * elmo-archive.el (elmo-folder-append-messages): Delete temp-dir even if some error occurred. * elmo-archive.el (elmo-archive-folder-append-buffer): Remove meaningless unwind-protect. * elmo-maildir.el (elmo-folder-message-make-temp-files): Respect start-number correctly. * elmo-search.el (elmo-folder-message-make-temp-files): Ditto. * elmo-file.el (elmo-folder-message-make-temp-files): Ditto. 2006-08-12 Hiroya Murata * elmo-flag.el (elmo-flag-folder-set-minfo): New function. (elmo-folder-initialize): Use it. (elmo-global-flag-replace-referrer): New function. * elmo.el (toplevel): Added autoload setting for `elmo-global-flag-replace-referrer'. (elmo-folder-rename): Rewrite the last change use `elmo-global-flag-replace-referrer'. * elmo-pipe.el (elmo-folder-rename): Call `elmo-global-flag-replace-referrer'. 2006-08-09 Hiroya Murata * elmo.el (elmo-folder-rename): Set meta data for global flags follow the rename. 2006-07-03 Hiroya Murata * elmo-filter.el (elmo-folder-initialize): Set slot `number-list' as 'not-loaded. (elmo-folder-close): Ditto. (elmo-filter-folder-number-list-loaded-p): New function. (elmo-filter-folder-number-list): Check whether loaded or not. (elmo-folder-commit): Use `elmo-filter-folder-number-list' instead of `elmo-filter-folder-number-list-internal'. (elmo-folder-delete-messages): Ditto. (elmo-folder-length): Check whether number-list is loaded or not. 2006-06-17 Hiroya Murata * modb-entity.el (modb-entity-field-extractor-alist): Add 3rd field `real field' into each element of list. (elmo-msgdb-create-message-entity-from-buffer): Follow the above change. (elmo-msgdb-message-entity-field): Ditto. (modb-entity-ml-info-real-fields): New function. * elmo-msgdb.el (elmo-msgdb-extra-fields): New function. * elmo-imap4.el (elmo-folder-msgdb-create-plugged): Use function `elmo-msgdb-extra-fields'. 2006-05-30 Hiroya Murata * elmo-util.el (elmo-passwd-alist-load): Move point to min position before read. 2006-05-15 Yoichi NAKAYAMA * elmo-flag.el (elmo-folder-expand-msgdb-path): Translate path. (elmo-global-flags-initialize): Ditto. 2006-05-14 Yoichi NAKAYAMA * elmo-archive.el (toplevel): Don't require emu, std11 and elmo-localdir. * elmo-localdir.el (elmo-message-file-name): Remove duplicate definition. 2006-05-07 Yoichi NAKAYAMA * elmo.el (elmo-folder-confirm-appends): Display folder name. 2006-04-29 Yoichi NAKAYAMA * elmo-imap4.el (elmo-imap4-send-command): Use non-synchronizing literals. 2006-04-21 Yoichi NAKAYAMA * elmo-maildir.el (elmo-maildir-list-location): Reduce `elmo-get-last-modification-time' call. 2006-04-13 Hiroya Murata * elmo-maildir.el (elmo-maildir-list-location): Fixed a regular expression. (elmo-maildir-set-mark): Ditto. (elmo-maildir-delete-mark): Ditto. 2006-03-13 Hiroya Murata * elmo-util.el (elmo-collect-separators-internal): Add 2nd optional argument `separators'. 2006-02-26 Hiroya Murata * elmo.el (cache-changed): Abolish. (status-changed): New signal. (elmo-message-killed-p): New generic function and define for elmo-folder. (elmo-folder-recover-messages): Ditto. (elmo-message-set-cached): Emit signal `status-changed' instead of `cache-changed'. (elmo-message-status): New macro. (elmo-message-status-folder): Ditto. (elmo-message-status-number): Ditto. (elmo-message-status-set-flags): Ditto. (elmo-message-status-set-killed): Ditto. (elmo-message-status-flags): New function. (elmo-message-status-cached-p): Ditto. (elmo-message-status-killed-p): Ditto. * elmo-pipe.el (elmo-pipe-connect-signals): Connect to signal `status-changed' instead of `cache-changed'. (elmo-folder-recover-messages): Define. (elmo-message-killed-p): Ditto. * elmo-filter.el (elmo-filter-connect-signals): Connect to signal `status-changed' instead of `cache-changed'. * elmo-multi.el (elmo-multi-connect-signals): Ditto. (elmo-message-killed-p): Define. (elmo-folder-recover-messages): Ditto. * elmo-version.el (elmo-version): Up to 2.15.3. 2006-02-18 Hiroya Murata * elmo-signal.el (elmo-signal-bindings): Use cons to append element into list. (elmo-define-signal-handler): Add docstring. (elmo-define-signal-filter): Ditto. * elmo-multi.el (elmo-multi-connect-signals): Fix the signal name. 2006-02-10 Hiroya Murata * elmo-util.el (elmo-flatten): Don't use recursive call. * elmo-search.el (elmo-folder-msgdb-create): Remove an unnecessary assignment. (elmo-folder-message-make-temp-files): Use `number-to-string' instead of `int-to-string'. 2006-01-24 Hiroya Murata * elmo-search.el (elmo-folder-delete-messages): Define. 2006-01-22 Hiroya Murata * elmo-vars.el (elmo-mailing-list-name-spec-list): Fixed customization type. (elmo-mailing-list-count-spec-list): Ditto. * elmo-vars.el (elmo-mailing-list-name-spec-list): Merge entries for `list-id'. 2006-01-22 Yoichi NAKAYAMA * elmo-vars.el (elmo-mailing-list-name-spec-list): Fix list-id handling. 2006-01-22 Hiroya Murata * elmo-vars.el (elmo-mailing-list-name-spec-list): New user option. (elmo-mailing-list-count-spec-list): Ditto. * elmo-util.el (elmo-map-until-success): New function. (elmo-string-match-substring): Ditto. (elmo-find-list-match-value): Ditto. * modb-entity.el (modb-entity-extract-ml-info-from-x-sequence): Removed. (modb-entity-extract-ml-info-from-subject): Ditto. (modb-entity-extract-ml-info-from-return-path): Ditto. (modb-entity-extract-ml-info-from-delivered-to): Ditto. (modb-entity-extract-ml-info-from-mailing-list): Ditto. (modb-entity-extract-ml-info-from-mailman): Ditto. (modb-entity-extract-mailing-list-info-functions): Ditto. (modb-entity-extract-mailing-list-info): Rewrite with `elmo-find-list-match-value'. 2006-01-03 Hiroya Murata * elmo-net.el (elmo-network-session-retry-count): New user option. (elmo-network-session-buffer-name): New internal function. (elmo-network-session-buffer-create): Ditto. (elmo-network-open-session): Retry open network session `elmo-network-session-retry-count' times. 2005-12-16 Tetsurou Okazaki * elmo-util.el (elmo-list-filter): Rewritten. 2005-12-10 Hiroya Murata * elmo-util.el (elmo-string-member): Allow symbol element in list. 2005-11-26 Hiroya Murata * elmo-search.el (elmo-make-search-engine): Use prefix `elmo-search-' for require symbol instead of `else-'. (elmo-search-engine-extprog): New class. (elmo-search-engine-do-search): Remove nil from argument list. Added argument pattern to evaluate element as function. (elmo-search-engine-local-file): Derived from `elmo-search-engine-extprog'. (elmo-search-engine-create-message-entity): Check existance of file. (elmo-search-engine-fetch-message): Ditto. (elmo-search-namazu-index): Follow the API change. (elmo-search-grep-target): Ditto. 2005-11-23 Hiroya Murata * elmo-spam.el (elmo-spam-message-fetch): Disable multibyte characters of working buffer. * modb-entity.el (elmo-msgdb-create-message-entity-from-buffer): Does not bind `default-mime-charset'. (elmo-msgdb-create-message-entity-from-buffer): Removed unnecessary local bind. * modb-entity.el (modb-entity-extract-ml-info-from-mailman): New function. (modb-entity-extract-mailing-list-info-functions): Added it. 2005-11-18 Hiroya Murata * modb-legacy.el (elmo-msgdb-append-entity): Execute the process when number and message-id are non-nil. * modb-standard.el (elmo-msgdb-append-entity): Ditto. * elmo-pop3.el (elmo-pop3-auth-user): Refactoring nested conditional steatment. (elmo-pop3-auth-apop): Likewise. (elmo-network-authenticate-session): Likewise. 2005-11-17 Hiroya Murata * elmo-mime.el (elmo-mime-header-max-column): Set default value as symbol `fill-column'. (elmo-mime-insert-header-from-buffer): Rewrite; ignore errors in decode field value. * elmo-util.el (elmo-mime-string): Ignore errors in eword decode. (elmo-decoded-field-body): Ditto. 2005-11-09 Hiroya Murata * elmo-net.el (elmo-net-folder-set-parameters): Rename argument `tokens' to `params'. 2005-10-13 Hiroya Murata * elmo-split.el (elmo-split-subr): Disable multibyte characters of working buffer. 2005-09-24 Hiroya Murata * elmo-search.el (elmo-search-namazu-index): Fixed the order to decide index. 2005-09-20 Hiroya Murata * elmo-search.el (elmo-search-engine-alist): Define with defvar; Set default value as nil. (toplevel): Register search engines by `elmo-search-register-engine' if there are not defined. * elmo.el (autoload): Added autoload setting for `elmo-search-register-engine'. 2005-09-17 Hiroya Murata * elmo.el (toplevel): `[' is redefined as the prefix of the search folder instead of nmz folder. (elmo-nmz-default-index-path): Added obsolete variable setting. (elmo-nmz-index-alias-alist): Ditto. (elmo-nmz-use-drive-letter): Ditto. * elmo-search.el (elmo-search-register-engine): New function. * elmo-nmz.el: Removed. * elmo-version.el (elmo-version): Up to 2.15.2. 2005-09-10 Hiroya Murata * elmo-search.el: New file. 2005-09-02 Yoichi NAKAYAMA * modb-entity.el (elmo-msgdb-message-match-condition): Add new condition `larger' and `smaller'. 2005-07-30 Hiroya Murata * elmo-util.el (elmo-safe-filename): Rewrite to replace `"' (double quote) into "_Q_". 2005-07-18 Hiroya Murata * elmo-net.el (elmo-net-quote-chars): Abolish. (elmo-net-format-quoted): Ditto. 2005-06-12 Hiroya Murata * elmo.el (elmo-get-folder-function): New variable. (elmo-get-folder): New function. (elmo-folder-rename): Call `elmo-make-folder' with specified mime-charset. * elmo-split.el (elmo-split): Use `elmo-get-folder' instead of `elmo-make-folder'. (elmo-split-subr): Ditto. * elmo-multi.el (elmo-folder-initialize): Ditto. * elmo-internal.el (elmo-folder-list-subfolders): Ditto. * elmo-flag.el (elmo-flag-folder-delete-message): Ditto. (elmo-flag-get-folder): Ditto. * elmo-filter.el (elmo-folder-initialize): Ditto. * elmo-access.el (elmo-folder-initialize): Ditto. (elmo-access-folder-update-children): Ditto. * elmo-dop.el (elmo-dop-queue-flush): Ditto. (elmo-dop-queue-flush): Ditto. (elmo-folder-append-buffer-dop-delayed): Ditto. (elmo-dop-spool-folder): Call `elmo-make-folder' with specified mime-charset. * elmo-pipe.el (elmo-folder-initialize): Use `elmo-get-folder' instead of `elmo-make-folder'. (elmo-folder-rename): Ditto. Use `elmo-folder-rename' to destination folder instead of send `elmo-folder-rename-internal'. * elmo-shimbun.el (elmo-folder-list-subfolders): Use `shimbun' slot of subfolder instead of create it. 2005-06-10 Hiroya Murata * elmo-util.el (elmo-collect-separators): New function. (elmo-collect-separators-internal): Ditto. (elmo-collect-trail-separators): Ditto. (elmo-parse-separated-tokens): Ditto. (elmo-parse-separated-tokens-internal): Ditto. (elmo-quote-syntactical-element): Ditto. * elmo-pop3.el (elmo-pop3-folder-name-syntax): New constant. (elmo-folder-initialize): Rewrite by `elmo-parse-separated-tokens'. * elmo-nntp.el (elmo-nntp-folder-name-syntax): New constant. (elmo-folder-initialize): Rewrite by `elmo-parse-separated-tokens'. (elmo-nntp-folder-list-subfolders): Quote a user name. * elmo-net.el (elmo-net-folder-name-syntax): New constant. (elmo-net-parse-network): Abolish. (elmo-net-folder-set-parameters): New function. (elmo-folder-initialize): Follow the above change. * elmo-imap4.el (elmo-imap4-folder-name-syntax): New constant. (elmo-folder-initialize): Rewrite by `elmo-parse-separated-tokens'. (elmo-folder-list-subfolders): Use `elmo-quote-syntactical-element' instead of `elmo-net-format-quoted' to quote mailbox and user name. 2005-06-07 Hiroya Murata * elmo-util.el (elmo-token-valid-p): New function. (elmo-parse-token): Add optional argument `requirement'. (elmo-parse-prefixed-element): Likewise. * elmo-net.el (elmo-net-quote-chars): Renamed from `elmo-net-quote-chars-regexp'. (elmo-net-format-quoted): Add optional argument `extra-chars'. * elmo-pop3.el (elmo-folder-initialize): Fix the token separators by info document. Check token `uidl' is started an alphabet. * elmo-nntp.el (elmo-folder-initialize): Fix the token separators by info document. Check token `user' is started an alphabet. * elmo-imap4.el (elmo-folder-initialize): Ditto. (elmo-folder-list-subfolders): Quote user. 2005-06-05 Hiroya Murata * elmo-util.el (elmo-quoted-specials-list): New constant. (elmo-quoted-token): New function. * elmo-net.el (elmo-net-quote-chars-regexp): New constant. (elmo-net-format-quoted): New function. (elmo-net-parse-network): Ditto. (elmo-folder-initialize): Use it. * elmo-nntp.el (elmo-folder-initialize): Use `elmo-net-parse-network' to parse network specification instead of `elmo-folder-initialize#elmo-net'. * elmo-pop3.el (elmo-folder-initialize): Ditto. * elmo-imap4.el (elmo-folder-initialize): Ditto. (elmo-folder-list-subfolders): Quote folder name by `elmo-net-format-quoted'. 2005-05-22 Hiroya Murata * elmo-nntp.el (elmo-nntp-use-server-search-p): New function. (elmo-folder-search): Use it. 2005-04-13 Hiroya Murata * modb-standard.el (modb-standard-loaded-message-id): Use `elmo-msgdb-message-entity-field'. 2005-04-11 Hiroya Murata * elmo-util.el (elmo-object-load): Call `elmo-set-auto-coding' without filename. 2005-04-11 Katsumi Yamaoka * elmo-util.el (elmo-set-auto-coding): New function. (elmo-object-load): Use it. 2005-04-09 Hiroya Murata * elmo-date.el (elmo-time-less-p): Renamed from `elmo-time<'. (elmo-time<): Define as alias of `elmo-time-less-p'. (elmo-time-to-datevec): New function. * elmo-date.el (elmo-time-to-days): New function. 2005-04-08 Hiroya Murata * elmo-util.el (elmo-map-recursive): Call `function' if `object' is not cons cell. 2005-04-07 Hiroya Murata * modb-entity.el (modb-entity-encode-string-recursive): Fixed parenthesis. * elmo-util.el (elmo-map-recursive): New function. * modb-entity.el (modb-entity-decode-string-recursive): Use it. (modb-entity-encode-string-recursive): Ditto. 2005-04-05 Yuuichi Teranishi * elmo-maildir.el (elmo-maildir-sequence-number): New function. (elmo-maildir-make-unique-string): Throw Emacs 18 away. (elmo-maildir-list-location): Use `elmo-maildir-sequence-number' to compare sequence number when last modified time is nil. 2005-04-03 Yuuichi Teranishi * elmo-maildir.el (elmo-folder-msgdb-create): Don't sort by date. * elmo-shimbun.el (elmo-folder-msgdb-create): Ditto. 2005-04-01 Yuuichi Teranishi * elmo-maildir.el (elmo-maildir-list-location): Sort by last modification time of the file. 2005-03-28 Hiroya Murata * elmo-util.el (elmo-condition-optimize): Discriminated against preserved fields, extra fields and the other weight. 2005-03-27 Hiroya Murata * modb-entity.el (initialize-instance): Define. (modb-entity-handler-mime-charset): New internal function. (modb-standard-entity-set-field): Use it. (elmo-msgdb-message-entity-field): Ditto. (elmo-msgdb-message-entity-field): Ditto. * modb.el (elmo-msgdb-match-condition): Rewrite with `elmo-condition-match'. (elmo-msgdb-match-condition-primitive): New function. * modb-entity.el (elmo-msgdb-message-match-condition): Removed arguments `flags' and `numbers'. (elmo-msgdb-match-condition-primitive): Abolished (merged to `elmo-msgdb-message-match-condition'). (modb-buffer-entity-handler): New class. * elmo.el (elmo-folder-search): Optimize condition to use `elmo-condition-optimize'. (elmo-message-buffer-match-condition): New function. (elmo-message-match-condition): Use `elmo-message-buffer-match-condition' instead of `elmo-buffer-field-condition-match'. * elmo-util.el (elmo-condition-match): New function. (elmo-condition-optimize): Ditto. (elmo-buffer-field-primitive-condition-match): Abolish. (elmo-buffer-field-condition-match): Ditto. * elmo-archive.el (elmo-archive-field-condition-match): Use `elmo-message-buffer-match-condition' instead of `elmo-buffer-field-condition-match'. 2005-03-25 Hiroya Murata * elmo-flag.el (elmo-global-flags-initialize): Check the existence of the flag directory. 2005-03-23 Hiroya Murata * elmo-access.el (elmo-folder-initialize): Call `elmo-multi-connect-signals'. * elmo-pipe.el (elmo-folder-close): Define. * elmo-multi.el (elmo-folder-close): Call `elmo-folder-close' with children folders. * elmo-filter.el (elmo-folder-close): Call `elmo-folder-close' with target folder. * modb-entity.el (elmo-msgdb-message-entity-set-number): Return `number'. * elmo-multi.el (elmo-message-entity): Don't use return value of `elmo-message-entity-set-number'. 2005-03-22 Hiroya Murata * modb.el (modb-generic): Added slot `mime-charset'. * modb-standard.el (modb-standard): Added slot `overview-handler'. (modb-standard-save-entity-1): Use `modb-entity-handler-equal-p' and `modb-entity-handler-dump-parameters'. (modb-standard-default-entity-handler): Abolish. (elmo-msgdb-message-entity-handler): Save created handler by instance slot. * modb-entity.el (modb-entity-handler): Added slot `mime-charset'. (modb-entity-handler-list-parameters): New method. (modb-entity-handler-equal-p): New function. (modb-entity-handler-dump-parameters): Ditto. (modb-entity-parse-address-string): Encode return value. (modb-entity-make-address-string): Decode argument value. (modb-entity-decode-string-recursive): New function. (modb-entity-encode-string-recursive): Ditto. (modb-standard-entity-normalizer): Set to encode field value. (modb-standard-entity-specializer): Follow the above change. (modb-standard-entity-set-field): Bind `elmo-mime-charset' by mime-charset of handler. (elmo-msgdb-message-entity-field): Ditto. (elmo-msgdb-copy-message-entity): Fixed reference to internal structure. (modb-entity-make-mailing-list-info-string): Decode `ml-name'. * elmo.el (elmo-folder): Added slot `mime-charset'. (elmo-make-folder): Added argument `mime-charset'. (elmo-folder-msgdb-load): Call `elmo-load-msgdb' with `mime-charest'. * elmo-msgdb.el (elmo-load-msgdb): Added argument `mime-charset'. (elmo-make-msgdb): Likewise. * elmo-internal.el (elmo-internal-folder-initialize): Call `luna-make-entity' with :mime-charset parameter. 2005-03-21 Yuuichi Teranishi * elmo-nntp.el (elmo-nntp-create-msgdb-from-overview-string): Decode encoded words in `from' and `subject' field. 2005-03-20 Hiroya Murata * modb.el (elmo-msgdb-message-field): Add argument `type'. (elmo-msgdb-match-condition): Get handler from entity instead of msgdb. * modb-standard.el (modb-standard-economize-entity-size): Abolish. (modb-standard-load-entity): Treat new file format. (modb-standard-save-entity-1): Save as new file format. (modb-standard-save-entity): Split messages into section here. (elmo-msgdb-message-field): Follow the API change. (modb-standard-default-entity-handler): New internal variable. (elmo-msgdb-message-entity-handler): Define. * modb-entity.el (elmo-msgdb-prefer-in-reply-to-for-parent): Moved to `elmo-vars.el'. (modb-entity-field-extractor-alist): New user option. (elmo-msgdb-message-entity-field): Removed argument `decode' and added argument `type'. (elmo-msgdb-copy-message-entity): Add optional argument `make-handler'. (modb-set-field-converter): New function. (modb-convert-field-value): Ditto. (modb-entity-string-decoder): Ditto. (modb-entity-string-encoder): Ditto. (modb-entity-parse-date-string): Ditto. (modb-entity-make-date-string): Ditto. (modb-entity-mime-decoder): Ditto. (modb-entity-mime-encoder): Ditto. (modb-entity-address-list-decoder): Ditto. (modb-entity-address-list-encoder): Ditto. (modb-entity-parse-address-string): Ditto. (modb-entity-make-address-string): Ditto. (modb-entity-create-field-indices): Ditto. (modb-legacy-entity-field-slots): New constant. (modb-legacy-entity-field-indices): Ditto. (modb-legacy-entity-normalizer): New variable. (modb-legacy-entity-specializer): Ditto. (modb-legacy-entity-field-index): New macro. (modb-legacy-entity-set-field): New function. (modb-legacy-make-message-entity): Rewrite. (elmo-msgdb-create-message-entity-from-buffer): Use `elmo-msgdb-get-references-from-buffer'. Use `elmo-decoded-field-body' instead of `elmo-unfold-field-body'. Use `modb-legacy-entity-set-field' instead of `elmo-msgdb-message-entity-set-field'. (elmo-msgdb-message-entity-field): Rewrite. (elmo-msgdb-message-entity-set-field): Ditto. (elmo-msgdb-copy-message-entity): Make new entity by `make-handler' if it specified. (elmo-msgdb-message-match-condition): Define a method of `modb-entity-handler' and follow the API change. (modb-standard-entity-handler): New class. (modb-entity-extract-ml-info-from-x-sequence): New function. (modb-entity-extract-ml-info-from-subject): Ditto. (modb-entity-extract-ml-info-from-return-path): Ditto. (modb-entity-extract-ml-info-from-delivered-to): Ditto. (modb-entity-extract-ml-info-from-mailing-list): Ditto. (modb-entity-extract-mailing-list-info): Ditto. (modb-entity-extract-mailing-list-info-functions): New variable. * elmo.el (elmo-message-field): Add optional argument `type'. * elmo-vars.el (elmo-msgdb-prefer-in-reply-to-for-parent): Moved from `modb-entity.el'. * elmo-util.el (elmo-object-load): Decode by coding-system from `set-auto-coding-function'. (elmo-object-save): Use `detect-mime-charset-region' and add coding cookie if encode. (elmo-msgdb-get-references-from-buffer): New function. (elmo-parse-addresses): Ditto (renamed from `wl-parse-addresses'). * elmo-spam.el (elmo-spam-message-spam-p): Follow the API change. * elmo-shimbun.el (elmo-shimbun-parse-time-string): Removed. (elmo-shimbun-entity-to-header): Use `shimbun-create-header' instead of `shimbun-make-header' and follow the API change. (elmo-shimbun-update-overview): Follow the API change. (elmo-map-folder-list-message-locations): Ditto. * elmo-pipe.el (elmo-message-field): Ditto. * elmo-nntp.el (elmo-nntp-create-msgdb-from-overview-string): Ditto. * elmo-nmz.el (elmo-nmz-msgdb-create-entity): Ditto. * elmo-multi.el (elmo-message-field): Ditto. * elmo-msgdb.el (elmo-message-entity-field): Ditto. (elmo-msgdb-sort-by-date): Ditto. (elmo-msgdb-flag-table): Use `elmo-msgdb-message-field' instead of `elmo-message-entity-field'. (elmo-msgdb-overview-entity-get-from-no-decode): Follow the API change. (elmo-msgdb-overview-entity-get-from): Ditto. (elmo-msgdb-overview-entity-get-subject): Ditto. (elmo-msgdb-overview-entity-get-subject-no-decode): Ditto. (elmo-msgdb-overview-entity-get-date): Ditto. (elmo-msgdb-overview-entity-get-to): Ditto. (elmo-msgdb-overview-entity-get-cc): Ditto. * elmo-mime.el (elmo-message-mime-entity): Ditto. (elmo-mime-collect-message/partial-pieces): Ditto. * elmo-filter.el (elmo-message-field): Ditto. * elmo-date.el (elmo-datevec-to-time): New function. (elmo-time-parse-date-string): Ditto. (elmo-time-make-date-string): Ditto. (elmo-time<): Ditto. * elmo-version.el (elmo-version): Up to 2.15.1. 2005-03-14 Yoichi NAKAYAMA * elmo-flag.el (elmo-global-flags-initialize): Don't include member of elmo-local-flags. 2005-03-13 Yuuichi Teranishi * elmo-version.el (elmo-version): Up to 2.15.0. 2005-03-13 Hiroya Murata * elmo.el (elmo-folder-synchronize): Ignore `mask' when `ignore-msgdb' is non-nil. 2005-03-12 Hiroya Murata * elmo-util.el (elmo-condition-in-msgdb-p-internal): Removed. (elmo-condition-in-msgdb-p): Ditto. (elmo-file-field-primitive-condition-match): Ditto. (elmo-file-field-condition-match): Ditto. * elmo-localdir.el (elmo-localdir-field-condition-match): Ditto. 2005-03-11 Hiroya Murata * elmo-flag.el (elmo-folder-list-subfolders): Don't list from subdirectories here. (elmo-global-flags-initialize): New function. * elmo.el (toplevel): Added autoload setting for `elmo-global-flags-initialize'. 2005-03-07 Yoichi NAKAYAMA * elmo.el (message-number-changed): Define new signal. * elmo-dop.el (elmo-folder-append-buffer-dop-delayed): Emit message-number-changed signal. * elmo-localdir.el (elmo-folder-pack-numbers): Ditto. * elmo-map.el (elmo-folder-pack-numbers): Ditto. Respect `elmo-pack-number-check-strict'. 2005-03-06 Yoichi NAKAYAMA * elmo-signal.el (elmo-connect-signal): Document. (elmo-emit-signal): Ditto. (elmo-emit-signal): It should pass source argument to filter and handler, not slot-source. 2005-03-05 Hiroya Murata * modb.el (elmo-msgdb-update-entity): New API and define generic implement. * modb-standard.el (elmo-msgdb-update-entity): Define. * modb-entity.el (elmo-msgdb-message-entity-update-fields): New API and define generic implement. * elmo.el (update-overview): New singnal. * elmo-shimbun.el (elmo-shimbun-update-overview): Rewrite use `elmo-msgdb-update-entity' and emit signal `update-overview'. (elmo-message-entity-parent): Define. * elmo-pipe.el (elmo-pipe-connect-signals): Connect to signal `update-overview'. * elmo-multi.el (elmo-multi-connect-signals): Ditto. * elmo-filter.el (elmo-filter-connect-signals): Ditto. 2005-02-27 Yuuichi Teranishi * elmo.el (elmo-folder-synchronize): Sort the return value of `elmo-list-diff'. * elmo-util.el (elmo-list-diff): Don't care the order of the returned list. 2005-02-27 Hiroya Murata * elmo-util.el (elmo-with-enable-multibyte): Don't bind `default-enable-multibyte-characters'. (elmo-object-load): Use `with-temp-buffer' instead of `elmo-set-work-buf'. (elmo-object-save): Ditto. (elmo-mime-string): Use `elmo-with-enable-multibyte' instead of `elmo-set-work-buf'. (elmo-decoded-field-body): Ditto. * elmo-shimbun.el (elmo-shimbun-entity-to-header): Ditto. * elmo-sendlog.el (elmo-sendlog-folder-list-message-locations): Use `with-temp-buffer' instead of `elmo-set-work-buf'. * elmo-version.el (elmo-version): Up to 2.13.3. 2005-02-27 Tetsurou Okazaki * elmo-util.el (elmo-list-diff): Fix the last change. Reverse order of result lists. 2005-02-26 Yuuichi Teranishi * modb-standard.el (elmo-msgdb-set-flag): Use `elmo-list-diff-nonsortable' instead of `elmo-list-diff'. (elmo-msgdb-unset-flag): Ditto. * elmo.el (elmo-strict-folder-diff): Don't use third argument of `elmo-list-diff'. * elmo-util.el (elmo-list-diff): Rewrite. (elmo-list-diff-nonsortable): New function. 2005-02-26 Tetsurou Okazaki * elmo-util.el (elmo-multibyte-buffer-name): Renamed from `elmo-multibypte-buffer-name'. All referers are updated. 2005-02-25 Hiroya Murata * elmo-mime.el (elmo-mime-entity-reassembled-p): New method. (elmo-mime-entity-fragment-p): New function. (mime-elmo-buffer-entity): Added slot `reassembled'. (elmo-message-mime-entity): Added 4th argument `reassemble'. (elmo-message-mime-entity-internal): New function (renamed from `elmo-message-mime-entity'). (elmo-mime-inherit-field-list-from-enclosed): New constant. (elmo-mime-make-reassembled-mime-entity): New function. (elmo-message-reassembled-mime-entity): Ditto. (elmo-mime-collect-message/partial-pieces): Ditto. 2005-02-24 Hiroya Murata * elmo.el (elmo-message-fetch-string): Disable multibyte. * elmo-util.el (elmo-multibypte-buffer-name): New constant. (elmo-with-enable-multibyte): New macro. * modb-entity.el (elmo-msgdb-get-decoded-cache): Use it. 2005-02-23 Hiroya Murata * elmo-filter.el (elmo-filter-add-flag-count): Removed unused argument `number'. (elmo-filter-connect-signals): Follow the above change. 2005-02-19 Yuuichi Teranishi * modb-standard.el (elmo-msgdb-unset-flag): Bind inhibit-quit. * elmo-maildir.el (elmo-folder-append-messages): Fix the problem that only the first flag is used. 2005-02-17 ARISAWA Akihiro * elmo-shimbun.el (elmo-folder-exists-p): Use `shimbun-group-p' if available. 2005-02-18 Hiroya Murata * elmo-signal.el: New file. * elmo.el (toplevel): Require elmo-signal. (flag-changing, flag-changed, cache-changed): New signal. (elmo-folder): Remove slog `handlers'. (elmo-message-set-cached): Use `elmo-emit-signal' instead of `elmo-folder-notify-event'. (elmo-folder-set-flag): Likewise. Emit signal `flag-changing'. (elmo-folder-unset-flag): Ditto. (elmo-event-handler): Abolish. (elmo-event-handler-flag-changed): Ditto. (elmo-event-handler-cache-changed): Ditto. (elmo-folder-add-handler): Ditto. (elmo-folder-remove-handler): Ditto. (elmo-folder-notify-event): Ditto. * elmo-pipe.el (toplevel): Require elmo-signal. (elmo-folder-initialize): Call `elmo-pipe-connect-signals'. (elmo-pipe-connect-signals): New function. (elmo-message-fetch): Does not call `elmo-folder-notify-event'. (elmo-folder-set-flag): Ditto. (elmo-folder-unset-flag): Ditto. (elmo-message-set-cached): Ditto. * elmo-multi.el (toplevel): Require elmo-signal. (elmo-folder-initialize): Call `elmo-multi-connect-signals'. (elmo-multi-connect-signals): New function. (elmo-multi-map-numbers): Ditto. (elmo-message-set-cached): Does not call `elmo-folder-notify-event'. (elmo-message-fetch): Ditto. (elmo-folder-set-flag): Ditto. (elmo-folder-unset-flag): Ditto. * elmo-filter.el (toplevel): Require elmo-signal. (elmo-folder-initialize): Call `elmo-filter-connect-signals'. (elmo-filter-connect-signals): New function. (elmo-filter-add-flag-count): Ditto. (elmo-message-fetch): Does not call `elmo-filter-folder-countup-message-flags' and `elmo-folder-notify-event'. (elmo-message-set-cached): Ditto. (elmo-folder-set-flag): Ditto. (elmo-folder-unset-flag): Ditto. * elmo-version.el (elmo-version): Up to 2.13.2. 2005-02-17 Hiroya Murata * elmo-imap4.el (elmo-imap4-flags-to-imap): Preserve argument `flags'. 2005-02-16 Hiroya Murata * elmo-filter.el (elmo-message-set-cached): Call `elmo-folder-notify-event' with event `cache-changed'. * elmo-multi.el (elmo-message-set-cached): Ditto. * elmo-pipe.el (elmo-message-set-cached): Ditto. 2005-02-16 Yoichi NAKAYAMA * elmo.el (elmo-folder-encache): Abolish. 2005-02-16 Yuuichi Teranishi * elmo-dop.el (elmo-folder-delete-messages-dop): Delete 'Append' queue. (elmo-folder-next-message-number-dop): Return appropriate negative integer. 2005-02-15 Yoichi NAKAYAMA * elmo-dop.el (elmo-dop-queue-flush): Remove files in dop spool on clearing pending operations. (elmo-folder-next-message-number-dop): Return appropriate negative integer. 2005-02-12 Hiroya Murata * elmo.el (toplevel): Added autoload setting for `md5'. (elmo-msgdb-path-encode-threshold): New user option. (elmo-folder-msgdb-path): Encode msgdb path if its length is longer than `elmo-msgdb-path-encode-threshold'. * elmo-flag.el (elmo-global-mark-migrate): Use `elmo-folder-expand-msgdb-path' instead of `elmo-folder-msgdb-path'. 2005-02-11 Hiroya Murata * elmo-multi.el (elmo-multi-folder-diff): Fixed problem when the element of the difference is nil. 2005-02-11 Yuuichi Teranishi * elmo-maildir.el (elmo-maildir-separator): Added some OS types to the check logic of file systems which are weak in colon character. 2005-02-11 Hiroya Murata * elmo-maildir.el (elmo-maildir-move-file): Simplify. 2005-02-10 Yuuichi Teranishi * elmo-maildir.el (elmo-maildir-move-file): New function. (elmo-folder-append-buffer): Use it. (elmo-folder-append-messages): Ditto. (These changes are based on Ron Isaacson's patch [wl-en: 01205]) * elmo-imap4.el (elmo-imap4-decode-folder-string): Call `utf7-decode'. (elmo-imap4-encode-folder-string): Call `utf7-encode'. * elmo-maildir.el (elmo-maildir-separator): New user option. (elmo-maildir-adjust-separator): New macro. (elmo-maildir-list-location): Use it. (elmo-maildir-update-current): Ditto. (elmo-maildir-set-mark): Ditto. (elmo-maildir-delete-mark): Ditto. (These changes are based on Hiroya Murata's patch [wl: 13437]) 2005-02-06 Hiroya Murata * elmo-nntp.el (elmo-nntp-server-command-index): Add entry `xhdr'. 2005-02-01 Hiroya Murata * elmo-flag.el (elmo-flag-valid-p): Simplify. (elmo-folder-list-subfolders): Copy `elmo-global-flags'. (elmo-folder-delete): Update `elmo-global-flag-folder-alist'. 2005-01-30 TAKAHASHI Kaoru * elmo-util.el (elmo-passwd-alist-load, elmo-passwd-alist-save): Use `with-temp-buffer'. 2005-01-30 Hiroya Murata * elmo-flag.el (elmo-folder-initialize): Fixed the last change. * elmo-util.el (elmo-read-search-condition): Eliminate (renamed to `wl-read-search-condition'). (elmo-read-search-condition-internal): Likewise. * elmo-flag.el (elmo-flag-char-regexp): New constant. (elmo-flag-valid-p): New function. (elmo-folder-initialize): Check flag name is valid. 2005-01-26 Yuuichi Teranishi * elmo-imap4.el (elmo-folder-list-subfolders): Use root mailbox without delimiter to obtain root mailbox itself. 2005-01-25 Tetsurou Okazaki * elmo-net.el (elmo-network-session-idle-timeout): Fix customization type mismatch. 2005-01-24 Yuuichi Teranishi * elmo-mime.el (elmo-mime-entity-display): Bind elmo-message-displaying as t. 2005-01-23 Hiroya Murata * elmo-shimbun.el (toplevel): Require cl at compile. * elmo-nntp.el (toplevel): Ditto. * elmo-nmz.el (toplevel): Ditto. * elmo-multi.el (toplevel): Ditto. * elmo-file.el (toplevel): Ditto. * elmo-dop.el (toplevel): Ditto. * elmo-archive.el (toplevel): Likewise elmo and cl (at compile). 2005-01-20 Yuuichi Teranishi * mmimap.el (mmimap-make-mime-entity): Set children's top node number as nil. * elmo.el (elmo-message-fetch): Return t even when the output buffer size of elmo-message-fetch-internal is 0 byte. 2005-01-14 Hiroya Murata * elmo-maildir.el (elmo-map-message-fetch): Fixed last change. 2005-01-13 Yoichi NAKAYAMA * elmo-shimbun.el (elmo-folder-plugged-p): Treat "@" as always plugged. 2005-01-13 Hiroya Murata * elmo-maildir.el (elmo-map-message-fetch): Call `elmo-map-folder-set-flag'. * elmo.el (elmo-message-fetch-with-cache-process): Abolish. (elmo-message-fetch): Merge from `elmo-message-fetch-with-cache-process'. * elmo-sendlog.el (elmo-message-fetch-with-cache-process): Abolish. (elmo-message-fetch): Define. * elmo-nntp.el (elmo-message-fetch): Renamed from `elmo-message-fetch-with-cache-process'. * elmo-cache.el (elmo-message-fetch-with-cache-process): Abolish. (elmo-message-fetch): Define. * elmo-util.el (elmo-condition-parse-primitive): Downcase search-key. * elmo-shimbun.el (shimbun-mua-search-id): Use `elmo-message-entity' instead of `elmo-msgdb-message-entity'. (elmo-shimbun-folder-shimbun-header): Ditto. (elmo-shimbun-get-headers): Ditto. (elmo-shimbun-update-overview): Ditto. * elmo-pipe.el (elmo-folder-detach-messages): Define. * elmo-net.el (elmo-folder-list-messages-unplugged): Use `elmo-folder-list-messages' instead of `elmo-msgdb-list-messages'. 2005-01-13 Yuuichi Teranishi * elmo.el (elmo-message-fetch): Unset unread flag on server when message is cached. (elmo-message-fetch-string): Fixed argument. 2005-01-11 Hiroya Murata * elmo.el (elmo-message-fetch): Removed argument `outbuf' and exchange order of arguments `section' and `unread'. (elmo-message-encache): Follow the API change. (elmo-message-match-condition): Ditto. (elmo-generic-folder-append-messages): Ditto. (elmo-message-fetch-string): New function. * elmo-split.el (elmo-split-subr): Ditto. * elmo-spam.el (elmo-spam-message-fetch): Ditto. * elmo-pipe.el (elmo-message-fetch): Ditto. * elmo-multi.el (elmo-message-fetch): Ditto. * elmo-mime.el (elmo-message-mime-entity): Ditto. * elmo-flag.el (elmo-global-flag-set-internal): Ditto. * elmo-filter.el (elmo-message-fetch): Ditto. * elmo-dop.el (elmo-folder-append-buffer-dop-delayed): Ditto. * elmo-imap4.el (mime-imap-location-section-body): Use `elmo-message-fetch-string' instead of `elmo-message-fetch' and follow the API change. 2005-01-10 Hiroya Murata * elmo-access.el: New file. * elmo-null.el: Ditto. * elmo-internal.el (elmo-internal-folder-list): Added `null'. 2005-01-08 Yuuichi Teranishi * elmo-net.el (elmo-network-session-idle-timeout): New option. (elmo-network-session): New attribute `last-accessed'. (elmo-network-get-session): Discard network cache if elapsed time since last-accessed is larger than elmo-network-session-idle-timeout. 2005-01-07 Hiroya Murata * elmo.el (elmo-find-fetch-strategy): Removed argument `entity' and added `number', `require-entireness'. (elmo-find-fetch-strategy): Rewrite. (elmo-message-fetch): Unset `unread' flag when argument unread is non-nil. * elmo-spam.el (elmo-spam-message-fetch): Follow the API change. * elmo-multi.el (elmo-find-fetch-strategy): Ditto. (elmo-message-fetch): Notify event `flag-changed'. * elmo-pipe.el: Likewise. * elmo-mime.el (elmo-mime-entity): New class. (elmo-mime-entity-display-p): New generic function. (elmo-mime-entity-display): Ditto. (elmo-mime-entity-display-as-is): Ditto. (mime-elmo-buffer-entity, mime-elmo-imap-entity): Inherit elmo-mime-entity. (elmo-make-mime-message-location): Removed. (elmo-mime-message-display): Ditto. (elmo-mime-display-as-is): Ditto. (elmo-message-mime-entity): New function. * elmo-imap4.el (elmo-find-fetch-strategy): Rewrite. * elmo-filter.el (elmo-find-fetch-strategy): Follow the API change. (elmo-message-fetch): Re-count flagged message number and notify event `flag-changed'. * elmo-version.el (elmo-version): Up to 2.13.1. 2005-01-02 Hiroya Murata * elmo-filter.el (elmo-message-field): Define. (elmo-message-set-field): Ditto. 2004-12-25 Hiroya Murata * elmo.el (elmo-message-set-cached): Call `elmo-folder-notify-event' with cache-changed. (elmo-event-handler-cache-changed): New generic function. 2004-12-22 Yuuichi Teranishi * elmo-maildir.el (elmo-folder-append-buffer): Use elmo-copy-file instead of elmo-add-name-to-file. (elmo-folder-append-messages): Ditto. 2004-12-21 Yoichi NAKAYAMA * elmo.el (elmo-folder-update-threshold): Add nil to range. 2004-12-12 Yuuichi Teranishi * elmo-version.el (elmo-version): Up to 2.13.0. * elmo-vars.el (elmo-msgdb-convert-type): Changed default value to `auto'. * modb-standard.el (modb-standard-economize-entity-size): Changed default value to `t'. * elmo-vars.el (elmo-msgdb-default-type): Changed default value to `standard'. * elmo-imap4.el (elmo-network-initialize-session): Erase buffer after parsing greeting string. 2004-11-23 Daishi Kato * elsp-spamoracle.el (elmo-spam-spamoracle-spam-header-regexp): New user option. (elmo-spam-spamoracle-call): Use it. 2004-11-23 Yoichi NAKAYAMA * elmo.el (elmo-message-accessible-p): Message in dop spool is accessible. 2004-11-23 Daishi Kato * elsp-spamoracle.el: New file. 2004-11-23 Hiroya Murata * elmo.el (elmo-message-flags-for-append): New function. (elmo-generic-folder-append-messages): Use it. * elmo-split.el (elmo-split-subr): Ditto. * elmo-dop.el (elmo-dop-spool-folder-append-buffer): Add argument `flags' and use elmo-folder-append-buffer instead of write-region-as-binary. (elmo-dop-filter-pending-messages): New function. (elmo-folder-append-buffer-dop): Call elmo-dop-spool-folder-append-buffer with `flag'. (elmo-folder-set-flag-dop): Filter messages by elmo-dop-filter-pending-messages. (elmo-folder-unset-flag-dop): Ditto. (elmo-folder-append-buffer-dop-delayed): Use elmo-message-flags-for-append to get flags of the message and simplify. 2004-11-07 Yuuichi Teranishi * elmo-mime.el (elmo-mime-display-as-is): Treat ignore-cache argument. 2004-11-06 Hiroya Murata * elmo.el (elmo-folder): Added handlers slot. (elmo-event-handler): New class. (elmo-event-handler-flag-changed): New API. (elmo-folder-add-handler): New function. (elmo-folder-remove-handler): Ditto. (elmo-folder-notify-event): Ditto. (elmo-folder-set-flag): Call `elmo-folder-notify-event' with event `flag-changed'. (elmo-folder-unset-flag): Ditto. * elmo-pipe.el (elmo-folder-set-flag): Ditto. (elmo-folder-unset-flag): Ditto. * elmo-multi.el (elmo-folder-set-flag): Ditto. (elmo-folder-unset-flag): Ditto. * elmo-filter.el (elmo-folder-set-flag): Ditto. (elmo-folder-unset-flag): Ditto. * elmo-version.el (elmo-version): Up to 2.11.33. 2004-10-25 Hiroya Murata * modb-legacy.el (elmo-msgdb-unset-flag): Accept flag `all'. 2004-10-24 Hiroya Murata * elmo-multi.el (elmo-folder-unset-flag): Ignore errors. * elmo-flag.el (elmo-folder-unset-flag): Define. (elmo-global-flag-detach): Do process when the flag is not target flag. 2004-10-18 Yoichi NAKAYAMA * modb-entity.el (elmo-msgdb-prefer-in-reply-to-for-parent): New variable. (elmo-msgdb-create-message-entity-from-buffer): Use it. 2004-10-16 Hiroya Murata * elmo-filter.el (elmo-filter-folder-copy-flag-count): New function. (elmo-folder-delete-messages): Detach messages before delete messages from target folder. (elmo-folder-detach-messages): Set updated number-list to slot. 2004-10-14 Hiroya Murata * elmo-filter.el (elmo-folder-detach-messages): Always return t. 2004-10-12 Hiroya Murata * elmo.el (elmo-generic-folder-commit): Fixed parenthesis. 2004-10-11 Hiroya Murata * elmo.el (elmo-folder-delete-messages-internal): New API (for internal use only). (elmo-generic-folder-commit): Save `killed-list' even if msgdb is not modified. (elmo-folder-delete-messages): Define. (elmo-folder-move-messages): Don't call `elmo-folder-detach-messages'. (elmo-folder-synchronize): Rewrite. (elmo-folder-detach-messages): Delete numbers from `killed-list'. * elmo-util.el (elmo-last): New function. (elmo-set-list): Ditto. (elmo-number-set-delete-list): Ditto. (elmo-number-set-delete): Ditto. * elmo-shimbun.el (elmo-folder-delete-messages): Define. * elmo-map.el (elmo-folder-delete-messages-internal): Renamed from `elmo-folder-delete-messages' and don't delete location map. (elmo-folder-detach-messages): Define. * elmo-imap4.el (elmo-folder-delete): Use `elmo-folder-delete-messages-internal' instead of `elmo-folder-delete-messages'. * elmo-filter.el (elmo-folder-delete-messages): Call `elmo-folder-detach-messages'. (elmo-folder-detach-messages): Don't call `elmo-folder-detach-messages' for target folder. * elmo-cache.el (elmo-map-folder-delete-messages): Return t when message deletion is succeeded. * elmo-maildir.el (elmo-map-folder-delete-messages): Ditto. * elmo-archive.el (elmo-folder-delete-messages-internal): Renamed from `elmo-folder-delete-messages'. * elmo-flag.el (elmo-folder-delete-messages-internal): Ditto. * elmo-localdir.el (elmo-folder-delete-messages-internal): Ditto. * elmo-net.el (elmo-folder-delete-messages-internal): Ditto. * elmo-version.el (elmo-version): Up to 2.11.32. 2004-10-10 Yuuichi Teranishi * elmo.el (autoload): Added autoload setting for `elmo-local-flag-p'. (elmo-global-flag-list): Added obsolete variable setting. * elmo-vars.el (elmo-preserved-flags): Fixed docstring. * elmo-mime.el (elmo-mime-display-header-analysis): New variable. (elmo-mime-insert-header-from-buffer): Don't decode header content when `elmo-mime-display-header-analysis' is nil. * elmo-flag.el (elmo-global-flags): Renamed from `elmo-global-flag-list' (All other related portions are changed). (elmo-local-flags): New variable. (elmo-local-flag-p): New function. (elmo-global-flag-set-internal): Cause an error when flag is not global. 2004-10-04 Yuuichi Teranishi * elmo-util.el (elmo-concat-path): Treat empty path. 2004-10-03 Hiroya Murata * elmo-split.el (elmo-split-address-equal): Fixed typo (field => field-or-fields). (elmo-split-address-match): Ditto. (elmo-split-equal): Ditto. (elmo-split-match): Ditto. 2004-10-03 Yuuichi Teranishi * elmo.el (elmo-message-flags): Abolish optional argument `msgid'. (elmo-generic-folder-append-messages): If src message exists but has no flag, pass (read) for the FLAG argument of `elmo-folder-append-buffer'. Otherwise, pass nil. * elmo-split.el (elmo-split-subr): Likewise. * elmo-pipe.el (elmo-message-flags): Abolish optional argument `msgid'. * elmo-multi.el (elmo-message-flags): Ditto. * elmo-filter.el (elmo-message-flags): Ditto. * elmo.el (elmo-folder-append-buffer): Fix docstring. (elmo-generic-folder-append-messages): If elmo-message-flags return nil, pass (read) for the FLAG argument of elmo-folder-append-buffer. 2004-10-02 Yoichi NAKAYAMA * elmo-split.el (elmo-split-rule): Update comment. (elmo-split-address-equal): Allow 2nd argument to be a list. (elmo-split-address-match): Ditto. (elmo-split-equal): Ditto. (elmo-split-match): Ditto. 2004-09-29 Yuuichi Teranishi * elmo.el (elmo-folder-append-buffer): Fix docstring. (elmo-folder-append-msgdb): Don't treat `read'. (elmo-message-flags): Don't return `read'. * elmo-dop.el (elmo-folder-set-read-delayed): Don't treat `read'. (elmo-folder-unset-read-delayed): Ditto. * elmo-imap4.el (elmo-imap4-flags-to-imap): Ditto. 2004-09-26 Yoichi NAKAYAMA * elmo-imap4.el (elmo-folder-delete): Clear current-mailbox after deletion. 2004-09-24 Yuuichi Teranishi * elmo-mime.el (elmo-mime-display-as-is-internal): Insert decoded header. 2004-09-23 Yuuichi Teranishi * modb-standard.el (modb-standard-load-entity): Don't bind inhibit-quit here. (elmo-msgdb-save): Bind inhibit-quit. (modb-standard-message-entity): Ditto. 2004-09-20 Yoichi NAKAYAMA * elmo-database.el: No need to require elmo-msgdb. 2004-09-20 Hiroya Murata * elmo-nmz.el (elmo-folder-list-subfolders): Use `directory-files' instead of `elmo-list-subdirectories'. 2004-09-20 Yoichi NAKAYAMA * elmo-nmz.el (elmo-folder-initialize): Enable "[" for access group entry. (elmo-folder-exists-p): "[" is empty. (elmo-folder-list-subfolders): Define. (elmo-folder-have-subfolder-p): Ditto. 2004-09-19 Yoichi NAKAYAMA * elmo-flag.el (elmo-folder-delete): Update elmo-global-flag-list. 2004-09-14 Tetsurou Okazaki * elmo-filter.el (elmo-folder-local-p): Define. 2004-09-13 Hiroya Murata * modb-standard.el (modb-standard-loaded-message-id): Return nil when entity is garbaged. (modb-standard-save-entity-1): Don't modify the original entity. 2004-09-13 Tetsurou Okazaki * elmo-util.el (elmo-delete-if): Reduce loop strength in a while loop. 2004-09-12 Hiroya Murata * elmo.el (elmo-strict-folder-diff): Use `elmo-folder-list-messages' instead of `elmo-msgdb-list-messages'. 2004-09-12 Yuuichi Teranishi * modb.el (elmo-msgdb-flag-available-p): New generic function. (elmo-msgdb-message-number): Ditto. (elmo-msgdb-message-field): Ditto. * modb-standard.el (modb-standard-economize-entity-size): New user option. (modb-standard-loaded-message-id): New inline function. (modb-standard-load-entity): Use it. (modb-standard-save-entity-1): If `modb-standard-economize-entity-size', throw message-id string away. (elmo-msgdb-flag-available-p): Define. (elmo-msgdb-message-number): Ditto. (elmo-msgdb-message-field): Ditto. * modb-legacy.el (modb-legacy-flag-list): Fix typo (suppoted -> supported). (modb-legacy-supported-flag-p): Ditto. (elmo-msgdb-set-flag): Ditto. (elmo-msgdb-unset-flag): Ditto. (elmo-msgdb-flag-available-p): Define. * modb-entity.el (elmo-message-entity-handler): If CAR element of entity is `t', treat it as legacy entity. * elmo.el (elmo-message-flag-available-p): New generic function. (elmo-message-number): Ditto. (elmo-message-field): Use `elmo-msgdb-message-field'. * elmo-vars.el (elmo-preserved-flags): Added `forwarded'. * elmo-pipe.el (elmo-message-flag-available-p): Define. (elmo-message-number): Ditto. * elmo-multi.el (elmo-message-number): Define. (elmo-message-flag-available-p): Ditto. * elmo-filter.el (elmo-message-flag-available-p): Define. (elmo-message-number): Ditto. * elmo-flag.el (elmo-flag-folder): Added slot `max-number'. (elmo-folder-initialize): Load `max-number'. (elmo-folder-commit): Save it. (elmo-folder-list-global-flag-messages): Use `elmo-message-number'. (elmo-global-flag-set-internal): Set up max-number slot. 2004-09-12 Yuuichi Teranishi * elmo-version.el (elmo-version): Up to 2.11.31. 2004-09-09 Yuuichi Teranishi * elmo-util.el (elmo-msgdb-get-message-id-from-buffer): Use unibyte string of the current buffer for the argument of `md5' (Reported by Yoichi NAKAYAMA ). 2004-09-05 Hiroya Murata * modb-legacy.el (modb-legacy-flag-list): New constant. (modb-legacy-suppoted-flag-p): New internal function. (elmo-msgdb-set-flag): Cause error when `flag' is not supported. (elmo-msgdb-unset-flag): Ditto. 2004-09-05 Yuuichi Teranishi * elmo.el (elmo-make-folder): Remove text properties for prefix. * elmo-flag.el (elmo-folder-list-subfolders): Fetch flag names from msgdb. 2004-08-31 Hiroya Murata * elmo-multi.el (elmo-folder-count-flags): Changed return value (follow the API change). * elmo-filter.el (elmo-folder-count-flags): Ditto. 2004-08-31 Yuuichi Teranishi * modb-standard.el (modb-standard-digest-flags): Abolish. (elmo-msgdb-list-flagged): Use elmo-digest-flags instead. * elmo-vars.el (elmo-digest-flags): New variable. (elmo-preserved-flags): Moved from elmo-flag.el. * elmo-imap4.el (elmo-imap4-flag-to-imap-search-key): New function. (elmo-imap4-flag-to-imap-criteria): Ditto. (elmo-imap4-folder-list-flagged): Use it. * elmo-flag.el (elmo-preserved-flags): Moved to elmo-vars.el. * elmo.el (elmo-folder-count-flags): Changed return value. * elmo-flag.el (elmo-preserved-flags): New variable. (elmo-get-global-flags): Use it. * modb-standard.el (modb-standard-digest-flags): New variable. (elmo-msgdb-list-flagged): Use it for `digest'; Add `uncached'; Changed behavior of `any'. * elmo-imap4.el (elmo-imap4-flag-specs): Added keyword flags which are defined the Internet draft (draft-melnikov-imap-keywords-03.txt). (elmo-imap4-flags-to-imap): New function. (elmo-folder-append-buffer): Use it. * modb-legacy.el (modb-legacy-answered-uncached-mark): Fixed typo in the docstring. * utf7.el (utf7-fragment-encode): Don't use narrow-to-region to avoid the bug of Emacs 21.3. 2004-08-31 Yoichi NAKAYAMA * utf7.el (utf7-utf-16-coding-system): Avoid error when the function find-coding-system does not exist. 2004-08-18 Hiroya Murata * elmo-util.el (elmo-condition-parse-search-value): Fixed atom parsing. 2004-08-09 Yuuichi Teranishi * elmo-pop3.el (elmo-pop3-read-response): Refined the regexp for response codes. 2004-08-09 Yuuichi Teranishi * elmo-pop3.el (elmo-pop3-read-response): Treat response codes. (elmo-network-close-session): Follow the changes in `elmo-pop3-read-response'. (elmo-pop3-auth-user): Ditto. (elmo-pop3-auth-apop): Ditto. (elmo-network-initialize-session): Ditto. (elmo-network-authenticate-session): Ditto. (elmo-network-setup-session): Ditto. (elmo-folder-status): Ditto. (elmo-message-fetch-plugged): Ditto. (elmo-pop3-delete-msg): Ditto. 2004-07-15 Yoichi NAKAYAMA * elmo-archive.el (elmo-archive-folder-append-buffer): Return nil on failure. 2004-07-15 Hiroya Murata * elmo-util.el (elmo-set-work-buf): Define edebug spec and indent style. (elmo-bind-directory): Ditto. 2004-07-12 Yoichi NAKAYAMA * elmo.el (elmo-folder-append-messages): Note on return value. * elmo-archive.el (elmo-folder-append-messages): Don't return message numbers which could not be appended. 2004-07-11 Yoichi NAKAYAMA * elmo.el (elmo-message-fetch-threshold): Add nil to its range. 2004-06-18 Yoichi NAKAYAMA * elmo-version.el (elmo-version): Up to 2.11.30. 2004-06-13 Hiroya Murata * elmo.el (elmo-folder-synchronize): Add 5th optional argument `mask'. * elmo-pipe.el (elmo-folder-synchronize): Follow the API chagne. * elmo-multi.el (elmo-folder-synchronize): Likewise. (elmo-multi-split-numbers): Add elmo-folder object into each element of return value at first. (elmo-folder-delete-messages): Follow the above change. (elmo-folder-detach-messages): Ditto. * elmo-filter.el (elmo-folder-synchronize): Minimize message number which is synchronized in target folder. 2004-05-25 Hiroya Murata * elmo-shimbun.el (elmo-shimbun-update-overview-folder-list): Change default value to symbol `all'. (elmo-map-message-fetch): Change condition to update overview follow the above. 2004-05-25 Yoichi NAKAYAMA * elmo-shimbun.el (elmo-map-message-fetch): Change default behavior to update overview. (elmo-shimbun-update-overview-folder-list): Note it. 2004-05-24 Hiroya Murata * modb-standard.el (modb-standard-message-entity): Avoid infinite recursive call. 2004-05-23 Hiroya Murata * elmo-spam.el (elmo-spam-register-good-messages): Don't call buffer-disable-undo, it is unnecessary. (elmo-spam-register-good-messages): Ditto. * elsp-bogofilter.el (elmo-spam-bogofilter-register-messages): Ditto. * elsp-sa.el (elmo-spam-spamassassin-register-messages): Ditto. 2004-05-22 Hiroya Murata * elmo-util.el (elmo-set-buffer-multibyte): Abolish. (elmo-set-work-buf): Use set-buffer-multibyte instead of elmo-set-buffer-multibyte. (elmo-object-load): Ditto. (elmo-save-buffer): Ditto. (elmo-delete-char): Ditto. (elmo-file-field-primitive-condition-match): Ditto. (elmo-mime-string): Ditto. * elmo-archive.el (elmo-archive-msgdb-create-entity-subr): Ditto. (elmo-archive-field-condition-match): Ditto. * elmo-imap4.el (elmo-imap4-setup-send-buffer): Ditto. * elmo-net.el (elmo-network-initialize-session-buffer): Ditto. * elmo-nntp.el (elmo-nntp-parse-overview-string): Ditto. (elmo-nntp-msgdb-create-message): Ditto. * elmo-pop3.el (elmo-pop3-msgdb-create-message): Ditto. * elmo.el (elmo-message-match-condition): Ditto. (elmo-message-match-condition): Ditto. * modb-entity.el (elmo-msgdb-create-message-entity-from-buffer): Ditto. * elmo-version.el (elmo-version): Up to 2.11.29. * elmo-spam.el (elmo-spam-scheme): Add `header' as a candidate. (elsp-header): New backend. * elmo-util.el (elmo-decoded-field-body): New function. 2004-05-16 Hiroya Murata * elmo-version.el (elmo-version): Up to 2.11.28. 2004-05-09 Hiroya Murata * elmo-filter.el: Rewrite. * elmo-version.el (elmo-version): Up to 2.11.27. 2004-05-05 Yuuichi Teranishi * elmo-localdir.el (elmo-folder-expand-msgdb-path): Changed msgdb path for the localdir folder with absolute path. * utf7.el: Synch up with latest gnus/utf7.el; Modified for latest Emacs. 2004-05-05 Hiroya Murata * elmo-shimbun.el (elmo-folder-initialize): Set a dummy when the shimbun backend couldn't open. 2004-04-25 Tetsurou Okazaki * elmo-pipe.el (elmo-message-folder): Call `elmo-message-folder' recursively. (elmo-folder-diff): Avoid error `wrong-type-argument number-or-marker-p nil' when a destination folder is a filter folder. 2004-04-23 Hiroya Murata * elmo.el (elmo-message-flags): Add optional argument `msgid'. (elmo-generic-folder-append-messages): Call elmo-message-flags with argument `msgid'. * elmo-split.el (elmo-split-subr): Ditto. * elmo-pipe.el (elmo-message-flags): Follow the API change. * elmo-multi.el (elmo-message-flags): Ditto. 2004-04-18 Hiroya Murata * elmo.el (elmo-folder): Add new slot `flag-table'. (elmo-folder-flag-table): New API. (elmo-folder-close-flag-table): Ditto. (elmo-folder-preserve-flags): New function. (elmo-generic-folder-append-messages): Use `elmo-folder-flag-table' and `elmo-folder-close-flag-table'. Flag of a non-registered message, it sets to nil. Does not set flag to flag-table. * elmo-maildir.el (elmo-folder-append-buffer): Use `elmo-folder-preserve-flags'. (elmo-folder-append-messages): Use `elmo-folder-flag-table' and `elmo-folder-close-flag-table'. * elmo-archive.el (elmo-folder-append-buffer): Fix interface. (elmo-archive-folder-append-buffer): Use `elmo-folder-preserve-flags'. * elmo-cache.el (elmo-folder-append-buffer): Ditto. * elmo-imap4.el (elmo-folder-append-buffer): Ditto. * elmo-localdir.el (elmo-folder-append-buffer): Ditto. (elmo-folder-append-messages): Use `elmo-folder-flag-table' and `elmo-folder-close-flag-table'. * elmo-version.el (elmo-version): Up to 2.11.26. 2004-04-18 Yoichi NAKAYAMA * elmo-vars.el (elmo-network-stream-type-alist): Add direct. * elmo-util.el (elmo-msgdb-get-message-id-from-buffer): Don't use md5's 4th and 5th argument (non-existent in flim one). 2004-04-17 Hiroya Murata * elmo-split.el (elmo-split-subr): Flag of a non-registered message, It sets to nil. 2004-04-16 Hiroya Murata * elmo.el (elmo-folder-list-messages): Merge lists only if both list is non-nil. 2004-04-16 YAMASHITA Junji * elmo.el (elmo-folder-list-messages): Use elmo-uniq-sorted-list. * elmo-nntp.el (elmo-nntp-make-msglist): Use elmo-make-number-list. * elmo-util.el (elmo-uniq-sorted-list): New function. (elmo-make-number-list): Ditto. (elmo-number-set-to-number-list): Use elmo-make-number-list and don't use nreverse. 2004-04-16 Hiroya Murata * elmo-version.el (elmo-version): Up to 2.11.25. 2004-04-14 TAKAHASHI Kaoru * elmo-util.el (elmo-msgdb-get-message-id-from-buffer): If date field not exists in message, Use md5 message digest of header. 2004-04-11 Yoichi NAKAYAMA * elmo.el (elmo-folder-append-buffer): Add note on return value. * elmo-cache.el (elmo-folder-append-buffer): Return nil on failure. * elmo-localdir.el (elmo-folder-append-buffer): Ditto. * elmo-split.el (elmo-split-subr): Check return value of elmo-folder-append-buffer. * elmo-localdir.el (elmo-folder-append-buffer): Create flag-table. * elmo-maildir.el (elmo-folder-append-buffer): Ditto. * elmo-cache.el (elmo-folder-append-buffer): Check existence of message-id. 2004-04-10 Yoichi NAKAYAMA * elmo-split.el (elmo-split-subr): Append message with flag. * elmo-localdir.el (elmo-folder-append-buffer): Fix interface. * elmo-flag.el (elmo-folder-append-buffer): Ditto. * elmo-maildir.el (elmo-folder-append-buffer): Ditto. 2004-04-03 Tetsurou Okazaki * elmo-imap4.el (elmo-imap4-fetch-callback-1): Use `elmo-delete-cr-buffer'. * elmo-nntp.el (elmo-nntp-retrieve-headers): Ditto. * elmo-pop3.el (elmo-pop3-retrieve-headers): Ditto. 2004-03-29 Tetsurou Okazaki * elmo-pop3.el (elmo-pop3-read-contents): Replace an argument `buffer' with a function call of `process-buffer'. All callers are updated. (elmo-pop3-retrieve-headers): Likewise. Move `process' to the 1st argument. Remove redundant `set-buffer' in a while loop. 2004-03-28 Tetsurou Okazaki * elmo-pop3.el (elmo-pop3-send-command): Combine `process-send-string' calls. 2004-03-26 Hiroya Murata * elsp-spamfilter.el (elmo-spam-buffer-spam-p): Call elsp-spamfilter-register-buffer-internal with current buffer. (elmo-spam-register-spam-buffer): Ditto. (elmo-spam-register-good-buffer): Ditto. 2004-03-15 ARISAWA Akihiro * elmo-imap4.el (elmo-folder-list-subfolders): Add root mailbox if it is not contained in the response(A workaround for courier-imap). 2004-03-11 Hiroya Murata * elmo-imap4.el (elmo-folder-set-flag-plugged): Fix mismatched parenthesis. 2004-03-08 Yoichi NAKAYAMA * elmo-vars.el (elmo-msgdb-default-type): Remove generic from the range. 2004-03-07 Hiroya Murata * modb-standard.el (elmo-msgdb-list-flagged): Use append instead of nconc. * modb-entity.el (elmo-msgdb-match-condition-primitive): Added argument handler. (elmo-msgdb-message-match-condition): Follow the change above. 2004-02-29 Hiroya Murata * elmo-flag.el (elmo-folder-initialize): Complete abbreviated folder name. 2004-02-26 Hiroya Murata * elmo.el (elmo-folder-kill-messages): Don't use msgdb directly. 2004-02-25 Hiroya Murata * elmo.el (elmo-folder-kill-messages): Fix to update killed list. 2004-02-24 Hiroya Murata * elmo-file.el (elmo-file-find): Fixed the problem when file is not found. 2004-02-22 Yuuichi Teranishi * elmo-file.el (elmo-file-find): Use expand-file-name for return value. (elmo-file-command-argument): Undo last change for cygwin. (elmo-file-detect-content-type): Renamed from elmo-file-detect-format; Don't return nil. (elmo-map-message-fetch): Use elmo-file-detect-content-type. 2004-02-21 Hiroya Murata * elmo-file.el (elmo-file-command-argument): Fixed problem when a value returned from elmo-file-find is nil. 2004-02-20 Yuuichi Teranishi * elmo-mime.el (elmo-mime-display-as-is-coding-system): Moved to elmo-vars.el. * elmo.el (elmo-message-match-condition): Use elmo-message-fetch instead of insert-file-contents-as-binary. (elmo-message-set-field): New generic function. * elmo-localdir.el (elmo-folder-expand-msgdb-path): Follow the behavior change on `split-string'. * elmo-file.el (elmo-file-find): New function. (elmo-file-command): New user option. (elmo-file-command-argument): Ditto. (elmo-file-fetch-max-size): Ditto. (elmo-file-detect-format): New function. (elmo-map-message-fetch): Use elmo-file-fetch-max-size; Use elmo-file-detect-format. (elmo-map-folder-list-message-locations): Don't treat directories. 2004-02-19 TAKAHASHI Kaoru * elmo-util.el (elmo-string-partial-p): Removed unused function. (elmo-passwd-alist-clear): Shred password before clear. (elmo-remove-passwd): Remove all mached pair. 2004-02-18 Yoichi NAKAYAMA * elmo.el (elmo-folder-synchronize): Fix description of the return value. 2004-02-16 Yuuichi Teranishi * elmo.el (elmo-message-fetch-bodystructure): New method. (elmo-message-fetch-bodystructure): Define default. * elmo-imap4.el (mime-imap-location-bodystructure): Call elmo-message-fetch-bodystructure. (elmo-message-fetch-bodystructure): Define. * elmo-filter.el (elmo-message-fetch-bodystructure): Define. 2004-02-15 Tetsurou Okazaki * elmo-filter.el (elmo-message-folder): Define. 2004-02-13 Yuuichi Teranishi * elmo.el (elmo-message-fetch-with-cache-process): Don't call elmo-delete-cr-buffer. * elmo-imap4.el (elmo-imap4-message-fetch): Call elmo-delete-cr-buffer. * elmo-pop3.el (elmo-message-fetch-plugged): Ditto. * elmo-nntp.el (elmo-nntp-read-body): Ditto. * elmo-file.el (elmo-map-message-fetch): Decode body only when content type seems to be a text. 2004-02-12 Yuuichi Teranishi * elsp-sa.el (elmo-spam-register-spam-buffer): Don't specify '--forget'. (elmo-spam-register-good-buffer): Ditto. (elmo-spam-spamassassin-register-messages): Ditto. * elmo-util.el (elmo-string-member-ignore-case): Define with static-cond. 2004-02-09 Yuuichi Teranishi * elmo.el (elmo-folder-type): Undo last change. * slp.el (slp-exec-wait): Avoid byte-compile warnings. * elmo-nntp.el (elmo-nntp-folder-list-subfolders): Avoid byte-compile warnings. * elmo-file.el: New file. * modb-standard.el (elmo-msgdb-list-flagged): Treat keyword flags. * elsp-sa.el (elmo-spam-spamassassin-max-messages-per-process): New variable. (elmo-spam-spamassassin-register-messages): New inline function. (elmo-spam-register-spam-messages): Define. (elmo-spam-register-good-messages): Ditto. * elsp-bogofilter.el (elmo-spam-bogofilter-max-messages-per-process): Fixed typo. * elmo.el (toplevel): Added autoload setting for `elmo-get-global-flags'. (elmo-message-has-global-flag-p): New function. (elmo-message-set-global-flags): Ditto. (elmo-folder-type): Improvement for name: format. * elmo-imap4.el (elmo-imap4-session-flag-available-p): Check availability of keyword flags. (elmo-imap4-folder-list-flagged): Treat keyword flags. (elmo-folder-list-flagged-plugged): Renamed from elmo-folder-list-flagged-unplugged. (elmo-imap4-set-flag): If "\*" is treated as permanent flag, accept any flag as keyword flag. (elmo-folder-set-flag-plugged): Accept keyword flags. (toplevel): Added autoload setting for `elmo-get-global-flags'. * elmo-flag.el (elmo-get-global-flags): New function. * elmo-filter.el (elmo-folder-diff): Fix total number for filter folders. * elmo-version.el (elmo-version): Up to 2.11.24. 2004-02-08 Yoichi NAKAYAMA * elmo-util.el (elmo-buffer-field-primitive-condition-match): Use elmo-multiple-field-body instead of std11-field-body to check all headers. 2004-02-07 TAKAHASHI Kaoru * elmo-util.el (elmo-cache-expire): Completion require match "age" or "size". 2004-01-28 Hiroya Murata * elmo-util.el (elmo-get-hash-val): Check symbol is bound if unintern is unbound. 2004-01-25 Yoichi NAKAYAMA * elsp-bogofilter.el (elmo-spam-bogofilter-register-messages): Protect from infinite loop. 2004-01-25 Hiroya Murata * elsp-bogofilter.el (elmo-spam-bogofilter-max-messages-per-process): New user option. (elmo-spam-bogofilter-register-messages): New internal function. (elmo-spam-register-spam-messages): Define. (elmo-spam-register-good-messages): Ditto. 2004-01-24 Hiroya Murata * elsp-bogofilter.el (elmo-spam-bogofilter-arguments-alist): Added "-vv" if elmo-spam-bogofilter-debug is non-nil. (elmo-spam-bogofilter-call): Fixed the last change. (elmo-spam-bogofilter-arguments): Ditto. * elsp-bogofilter.el (elmo-spam-bogofilter-arguments-alist): Follow the options change of latest bogofilter. * elsp-bogofilter.el (elmo-spam-bogofilter-spam-switch): Abolish. (elmo-spam-bogofilter-good-switch): Ditto. (elmo-spam-bogofilter-arguments-alist): New user option. (elmo-spam-bogofilter-debug): Ditto. (elmo-spam-bogofilter-call): Renamed from `elsp-bogofilter-call-bogofilter'. If elmo-spam-bogofilter-debug is non-nil, insert output in buffer for debug. (elmo-spam-bogofilter-arguments): New macro. (elmo-spam-buffer-spam-p): Use it. (elsp-bogofilter-register-buffer): Ditto. 2004-01-19 TAKAHASHI Kaoru * elmo-cache.el (elmo-folder-list-subfolders): Fix directory-files regexp. 2004-01-17 Hiroya Murata * elsp-bsfilter.el (elmo-spam-bsfilter-shell-program): Set default value as "ruby". (elmo-spam-bsfilter-shell-switch): Set default value as nil. (elmo-spam-bsfilter-program): Set default value as full path for `bsfilter'. (elmo-spam-bsfilter-debug): New user option. (elsp-bsfilter-call-bsfilter): If elmo-spam-bsfilter-debug is non-nil, insert output in buffer for debug. Fix treating of argument. 2004-01-16 Hiroya Murata * elmo-maildir.el (elmo-map-folder-set-flag): Use cdr of `elmo-maildir-flag-specs' element instead of one. (elmo-map-folder-unset-flag): Ditto. (Reported by Ken Makimura ) * elmo-imap4.el (elmo-folder-set-flag-plugged): Fixed. (elmo-folder-unset-flag-plugged): Ditto. 2004-01-13 Hiroya Murata * elmo-nntp.el (elmo-folder-list-flagged): Return a list according to `reads' slot only if `in-msgdb' is nil. 2004-01-12 Hiroya Murata * elmo-nntp.el (elmo-folder-list-flagged): Undo the last change and complement argument list. 2004-01-12 Yoichi NAKAYAMA * elmo-nntp.el (elmo-folder-list-flagged-internal): Define this instead of elmo-folder-list-flagged. 2004-01-11 Hiroya Murata * elmo-spam.el (elmo-spam-scheme): Add 'bsfilter' as a candidate. * elsp-bsfilter.el: New file. * elmo-pipe.el (elmo-folder-list-unreads, elmo-folder-list-answereds, elmo-folder-list-importants, elmo-folder-flag-as-important, elmo-folder-unflag-important, elmo-folder-flag-as-read, elmo-folder-unflag-read, elmo-folder-flag-as-answered, elmo-folder-unflag-answered): Remove. (elmo-folder-set-flag): Define. (elmo-folder-unset-flag): Ditto. * elmo-nntp.el (elmo-folder-flag-as-read): Remove. (elmo-folder-set-flag): Define. (elmo-folder-unset-flag): Ditto. (elmo-folder-list-unreads): Remove. (elmo-folder-list-flagged): Define. * elmo-net.el (elmo-folder-list-flagged-internal): Define. (elmo-folder-list-unreads, elmo-folder-list-importants, elmo-folder-list-answereds, elmo-folder-list-unreads-plugged, elmo-folder-list-importants-plugged, elmo-folder-list-answereds-plugged): Remove. (elmo-folder-list-flagged-plugged): New method. (elmo-folder-unflag-important, elmo-folder-flag-as-important, elmo-folder-unflag-read, elmo-folder-flag-as-read, elmo-folder-unflag-answered, elmo-folder-flag-as-answered, elmo-folder-flag-as-read-unplugged, elmo-folder-unflag-read-unplugged, elmo-folder-flag-as-important-unplugged, elmo-folder-unflag-important-unplugged, elmo-folder-flag-as-answered-unplugged, elmo-folder-unflag-answered-unplugged): Remove. (elmo-folder-set-flag): Define. (elmo-folder-unset-flag): Ditto. (elmo-folder-set-flag-unplugged): Ditto. (elmo-folder-unset-flag-unplugged): Ditto. * elmo-multi.el (elmo-folder-list-unreads, elmo-folder-list-answereds, elmo-folder-list-importants, elmo-folder-flag-as-important, elmo-folder-unflag-important, elmo-folder-flag-as-read, elmo-folder-unflag-read, elmo-folder-flag-as-answered, elmo-folder-unflag-answered): Remove. (elmo-folder-set-flag): Define. (elmo-folder-unset-flag): Ditto. * elmo-map.el (elmo-map-folder-unflag-important, elmo-map-folder-flag-as-important, elmo-map-folder-unflag-read, elmo-map-folder-flag-as-read, elmo-map-folder-unflag-answered, elmo-map-folder-flag-as-answered): Remove. (elmo-map-folder-set-flag): New method. (elmo-map-folder-unset-flag): Ditto. (elmo-map-folder-list-unreads, elmo-map-folder-list-importants, elmo-map-folder-list-answereds): Remove. (elmo-folder-list-flagged-internal): Define. (elmo-map-folder-list-flagged): New method. * elmo-maildir.el (elmo-maildir-flag-specs): New internal variable. (elmo-map-folder-list-unreads, elmo-map-folder-list-importants, elmo-map-folder-list-flagged): Remove. (elmo-map-folder-list-flagged): Define. (elmo-map-folder-flag-as-important, elmo-map-folder-unflag-important, elmo-map-folder-flag-as-read, elmo-map-folder-unflag-read, elmo-map-folder-flag-as-answered, elmo-map-folder-unflag-answered): Remove. (elmo-maildir-set-mark-messages): New internal function. (elmo-map-folder-set-flag): Define. (elmo-map-folder-unset-flag): Ditto. * elmo.el (toplevel): Added autoload setting for `elmo-folder-list-global-flag-messages'. (elmo-folder-list-unreads, elmo-folder-list-importants, elmo-folder-list-answereds): Remove. (elmo-folder-list-flagged): Use `elmo-folder-list-flagged-internal'. Return a list whitch merged with messages have global flag. (elmo-folder-list-flagged-internal): New method. (elmo-folder-unflag-important, elmo-folder-flag-as-important, elmo-folder-unflag-read, elmo-folder-flag-as-read, elmo-folder-unflag-answered, elmo-folder-flag-as-answered): Remove. (elmo-folder-set-flag): New method. (elmo-folder-unset-flag): Ditto. (elmo-message-set-flag):Use `elmo-folder-set-flag'. (elmo-message-unset-flag):Use `elmo-folder-unset-flag'. * elmo-imap4.el (elmo-imap4-flag-specs): New internal variable. (elmo-folder-list-unreads-plugged, elmo-folder-list-importants-plugged, elmo-folder-list-answereds-plugged, elmo-folder-list-flagged-unplugged, elmo-folder-unflag-important-plugged, elmo-folder-flag-as-important-plugged, elmo-folder-unflag-read-plugged, elmo-folder-flag-as-read-plugged, elmo-folder-unflag-answered-plugged, elmo-folder-flag-as-answered-plugged): Remove. (elmo-folder-set-flag-plugged, elmo-folder-unset-flag-plugged): Define. * elmo-flag.el (elmo-folder-initialize): Register to `elmo-global-flag-list' if flag is not global. (elmo-folder-append-messages): Set flag to source messages. * elmo-filter.el (elmo-filter-folder-list-unreads, elmo-folder-list-unreads, elmo-filter-folder-list-importants, elmo-folder-list-importants, elmo-folder-flag-as-read, elmo-folder-unflag-read, elmo-folder-flag-as-important, elmo-folder-unflag-important, elmo-folder-flag-as-answered, elmo-folder-unflag-answered): Remove. (elmo-folder-set-flag): Define. (elmo-folder-unset-flag): Ditto. * elmo-dop.el (elmo-folder-flag-as-read-dop, elmo-folder-unflag-read-dop, elmo-folder-flag-as-important-dop, elmo-folder-unflag-important-dop, elmo-folder-flag-as-answered-dop, elmo-folder-unflag-answered-dop): Remove. (elmo-folder-set-flag-dop, elmo-folder-unset-flag-dop, elmo-folder-set-important-delayed, elmo-folder-unset-important-delayed, elmo-folder-set-read-delayed, elmo-folder-unset-read-delayed, elmo-folder-set-answered-delayed, elmo-folder-unset-answered-delayed): New function. (elmo-dop-queue-merge-method-list): Follow the above chagned. (elmo-dop-queue-method-name-alist): Ditto. * elmo-version.el (elmo-version): Up to 2.11.23. 2004-01-11 Yuuichi Teranishi * elmo-spam.el (elmo-spam-scheme): Add 'sa' as a candidate. * elsp-sa.el: New file. 2003-12-17 Hiroya Murata * modb-standard.el (modb-standard-message-entity): New function. (elmo-msgdb-message-entity): Use it. 2003-12-14 Hiroya Murata * elmo-internal.el (elmo-folder-list-subfolders): Rewrite; Fixed behavior when one-level is nil. * elmo-flag.el (elmo-folder-list-subfolders): Defined. * elmo-sendlog.el (elmo-folder-have-subfolder-p): Ditto. 2003-12-06 Hiroya Murata * elmo.el (elmo-folder-set-info-max-by-numdb): Don't use `sort' to get max number. (elmo-generic-folder-diff): Ditto. * elmo-nntp.el (elmo-nntp-catchup-msgdb): Ditto. (elmo-folder-update-number): Ditto. * elmo-dop.el (elmo-folder-status-dop): Ditto. (elmo-folder-next-message-number-dop): Ditto. 2003-12-04 Hiroya Murata * elmo-filter.el (elmo-folder-msgdb-create): Use `elmo-message-entity' and `elmo-message-flags' instead of `elmo-msgdb-message-entity' and `elmo-msgdb-flags'. 2003-11-27 Hiroya Murata * elmo-spam.el (elmo-spam-processor): Added 3rd argument `if-exists'. 2003-11-23 Hiroya Murata * elmo-multi.el (elmo-folder-newsgroups): Simplify. * elmo-pipe.el (elmo-folder-get-primitive-list): Likewise. * elmo-filter.el (elmo-folder-get-primitive-list): Fixed. 2003-11-22 Hiroya Murata * elmo-version.el (elmo-version): Up to 2.11.22. 2003-11-21 Hiroya Murata * modb-standard.el (elmo-msgdb-delete-messages): Always return t. 2003-11-20 Hiroya Murata * modb-standard.el (elmo-msgdb-delete-messages): Dose not process if the message dose not exist. 2003-11-18 Tetsurou Okazaki * elmo-version.el (elmo-version): Up to 2.11.21. 2003-11-18 Hiroya Murata * modb-standard.el (toplevel): Don't require mime. 2003-11-15 Hiroya Murata * elsp-bogofilter.el (toplevel): Don't require path-util. (elmo-spam-bogofilter-program): Don't use `exec-installed-p'. (elmo-spam-bogofilter-header): Abolish. (elmo-spam-bogofilter-bogosity-positive-spam-header): Ditto. (elmo-spam-bogofilter-args): New user option. (elsp-bogofilter-call-bogofilter): New internal function. (elmo-spam-buffer-spam-p): Use it. (elsp-bogofilter-register-buffer): Renamed from `elmo-spam-bogofilter-register-buffer'; Use `elsp-bogofilter-call-bogofilter'. (elmo-spam-register-spam-buffer): Follow the change above. (elmo-spam-register-good-buffer): Ditto. 2003-11-11 Hiroya Murata * modb-standard.el (elmo-msgdb-append-entity): If entity or message-id is nil do nothing. 2003-11-10 Yuuichi Teranishi * elmo-imap4.el (elmo-imap4-disuse-server-flag-mailbox-regexp): Revival. (elmo-imap4-session): Removed use-flag slot. (elmo-imap4-session-select-mailbox): Undo last change. (elmo-folder-use-flag-p): Use elmo-imap4-disuse-server-flag-mailbox-regexp. 2003-11-09 Yuuichi Teranishi * elmo-imap4.el (elmo-imap4-session): Added use-flag slot. (elmo-imap4-session-select-mailbox): Set it up. (elmo-folder-use-flag-p): Return value of use-flag slot. 2003-11-07 Hiroya Murata * elmo-msgdb.el (elmo-msgdb-flag-table): Fixed problem when message-id is nil. (Reported by MAKINO Takashi ) * modb-entity.el (elmo-message-entity-handler): Likewise. 2003-11-07 Yuuichi Teranishi * elmo.el (toplevel): Remove setting of autoloding for elmo-global-flag-initialize. (elmo-init): Don't call elmo-global-flag-initialize. (toplevel): Added autoload setting for elmo-global-mark-migrate. * elmo-flag.el (elmo-global-flag-initialize): Abolish. (elmo-global-mark-migrate): Don't call it. (elmo-global-mark-upgrade): Ditto. 2003-11-06 Yuuichi Teranishi * elmo-internal.el (elmo-internal-obsolete-folder-list): New variable. (elmo-folder-initialize): Raise a warning when obsolete folder is used. * elmo-vars.el (elmo-init-hook): New user option. * elmo.el (elmo-init): Run the elmo-init-hook. * elmo-flag.el (elmo-global-mark-migrate): New function. 2003-11-06 Hiroya Murata * modb-standard.el (elmo-msgdb-set-flag): Simplify; Undo last change (move to elmo-msgdb-unset-flag). (elmo-msgdb-unset-flag): Simplify; Unset 'new flag when unread flag is unset. 2003-11-05 Yuuichi Teranishi * modb-standard.el (elmo-msgdb-set-flag): Unset 'new flag when read flag is set. (elmo-msgdb-set-flag): Don't remove 'new flag unconditionally. (elmo-msgdb-unset-flag): Ditto. 2003-11-05 Andreas Fuchs * elmo-split.el (elmo-split): Return split message count. 2003-11-05 Hiroya Murata * elmo-msgdb.el (elmo-flag-table-get): Check cached if saved flags is nil. 2003-11-03 Hiroya Murata * elmo.el (elmo-folder-unflag-important): Call `elmo-global-flag-detach' with 4th argument delete-if-none that is a symbol `always'. * elmo-flag.el (elmo-flag-folder-delete-message): Clear hash value before unset flag. (elmo-global-flag-detach): Delete the message from flag folder, if `delete-if-none' is a symbol `always'. 2003-11-02 Hiroya Murata * elsp-spamfilter.el (elsp-spamfilter-decode-buffer): Renamed from `elmo-spam-spamfilter-decode-buffer'. (elsp-spamfilter-register-buffer-internal): New internal function. (elmo-spam-buffer-spam-p): Use it; Follow the API change. (elmo-spam-register-spam-buffer): Ditto. (elmo-spam-register-good-buffer): Ditto. * elsp-bogofilter.el (elmo-spam-buffer-spam-p): Follow the API change. (elmo-spam-bogofilter-register-buffer): Added argument `restore'. (elmo-spam-register-spam-buffer): Follow the API change. (elmo-spam-register-good-buffer): Ditto. * elmo-split.el (toplevel): Require elmo-spam when copmile. (elmo-split-spam-p): Added argument plist; Call `elmo-spam-buffer-spam-p' with new argument register. * elmo-spam.el (elmo-spam-buffer-spam-p): Added optional argument `register'. (elmo-spam-message-spam-p): Ditto. (elmo-spam-register-spam-buffer): Added optional argument `restore'. (elmo-spam-register-good-buffer): Ditto. (elmo-spam-register-spam-messages): Ditto. (elmo-spam-register-good-messages): Ditto. 2003-10-27 Hiroya Murata * elsp-spamfilter.el (elmo-spam-register-spam-buffer): Fixed to register into good corpus. (elmo-spam-register-good-buffer): Fixed to register into bad corpus. 2003-10-26 Hiroya Murata * elmo-version.el (elmo-version): Up to 2.11.20. * elmo-imap4.el (elmo-imap4-fetch-callback-1-subr): Fixed last change. * elmo-imap4.el (elmo-imap4-fetch-callback-1-subr): Determine new flag without depending on \Recent flag. 2003-10-25 Hiroya Murata * elsp-spamfilter.el (elsp-spamfilter): Added new slot `modified'. (elmo-spam-modified-p): Defined. (elmo-spam-save-status): Set `modified' slot to nil. (elmo-spam-register-spam-buffer): Set `modified' slot to non nil. (elmo-spam-register-good-buffer): Ditto. * elmo-spam.el (elmo-spam-modified-p): New API. 2003-10-23 Hiroya Murata * elmo-msgdb.el (elmo-msgdb-get-message-id-from-buffer): Abolish duplicate definition. * elmo-util.el (elmo-unfold-field-body): New function. (elmo-msgdb-get-message-id-from-buffer): Use it. * modb-entity.el (elmo-msgdb-create-message-entity-from-buffer): Fixed the last change; Use elmo-unfold-field-body. 2003-10-22 Hiroya Murata * modb-entity.el (elmo-msgdb-create-message-entity-from-buffer): Unfold date value. 2003-10-21 Hiroya Murata * elmo-spam.el (elmo-spam-save-status): New API. * elsp-spamfilter.el: New file. 2003-10-21 TAKAHASHI Kaoru * elmo-split.el (toplevel): Add `elmo-spam-processor' args. 2003-10-20 Hiroya Murata * elmo-split.el (elmo-split-spam-p): New function. * elmo-spam.el: New file. * elsp-bogofilter.el: Ditto. 2003-10-15 Yuuichi Teranishi * elmo.el (elmo-folder-next-message-number): New API. (elmo-folder-next-message-number): Define. (elmo-message-field): Don't check folder length. * elmo-net.el (elmo-folder-next-message-number): Define. (elmo-folder-next-message-number-unplugged): Define. * elmo-map.el (elmo-folder-next-message-number): Define. (elmo-folder-delete-messages): Clear hash value. * elmo-imap4.el (elmo-folder-next-message-number-plugged): Define. * elmo-dop.el (elmo-folder-next-message-number-dop): New function. (elmo-folder-delete-messages-dop-delayed): Always return t. * elmo-version.el (elmo-version): Up to 2.11.19. 2003-10-15 Hiroya Murata * modb-legacy.el (elmo-msgdb-append-entity): Fixed the last change. * modb-legacy.el (elmo-msgdb-append-entity): Registered an identical cons cell into the mark-alist and the hash table. 2003-10-08 Yuuichi Teranishi * elmo-pipe.el (elmo-pipe-folder-list-target-messages): Call elmo-folder-list-messages with argument `visible-only' as t. * elmo-filter.el (elmo-folder-search-requires-msgdb-p): Define. (elmo-folder-msgdb-create): Check the target folder. 2003-10-07 Yuuichi Teranishi * elmo-imap4.el (elmo-imap4-session-select-mailbox): Use `permanentflag' instead of `flags'. (elmo-folder-open): Ditto. (elmo-imap4-set-flag): Treat \Deleted flag as an exception. (elmo-imap4-disuse-server-flag-mailbox-regexp): Abolish. (elmo-folder-use-flag-p): Always return t. (elmo-imap4-session-select-mailbox): Use value of `flags' if `permanentflags' does not exist. (elmo-folder-open): Ditto. 2003-10-06 Yuuichi Teranishi * modb-legacy.el (elmo-msgdb-message-entity): Return nil when key is nil. * modb-standard.el (elmo-msgdb-message-entity): Ditto. * elmo-imap4.el (elmo-imap4-session): Added new slot `flags'. (elmo-imap4-session-select-mailbox): Set it according to the SELECT response. (elmo-folder-open): Ditto. (elmo-imap4-set-flag): Send store flag command only when the `flags' slot of the session includes the flag. (elmo-imap4-session-flag-available-p): New function. (elmo-imap4-folder-list-flagged): Ditto. (elmo-folder-list-unreads-plugged): Use it. (elmo-folder-list-importants-plugged): Ditto. (elmo-folder-list-answereds-plugged): Ditto. (elmo-imap4-search-internal-primitive): Ditto. (elmo-imap4-folder-list-any-plugged, elmo-imap4-folder-list-digest-plugged): Abolish. * elmo-filter.el (elmo-folder-search): Don't call elmo-list-filter if numbers is nil. 2003-10-06 Yoichi NAKAYAMA * elmo-util.el (toplevel): Require emu for char-list-to-string. 2003-10-05 Yuuichi Teranishi * elmo-util.el (elmo-get-hash-val): Simplify. (elmo-set-hash-val): Rewrite. 2003-09-27 Hiroya Murata * elmo.el (elmo-folder-list-messages): Append killed messages into result if `visible-only' is nil and `in-msgdb' is non-nil. * elmo-util.el (elmo-uniq-list): Added optional argument `delete-function'. * modb.el (elmo-msgdb-flag-count): New API. * modb-standard.el (modb-standard): Added slot flag-count. (modb-standard-countup-flags): New function. (modb-standard-load-flag): Call it. (elmo-msgdb-append): Ditto. (elmo-msgdb-clear): Clear slot flag-count. (elmo-msgdb-set-flag): Call modb-standard-countup-flags. (elmo-msgdb-unset-flag): Treat `all' flag and call modb-standard-countup-flags. (elmo-msgdb-flag-count): Define. (elmo-msgdb-append-entity): Call modb-standard-countup-flags. (elmo-msgdb-delete-messages): Ditto. * modb-legacy.el (elmo-msgdb-unset-flag): Treat `all' flag. (elmo-msgdb-flag-count): Define. * elmo.el (elmo-folder-list-messages): Undo last change. (elmo-folder-count-flags): Use elmo-msgdb-flag-count. (elmo-folder-kill-messages): Unset all flags to numbers. * elmo-sendlog.el (elmo-folder-delete-messages): Rewrite; use elmo-folder-kill-messages. * elmo-nntp.el (elmo-folder-delete-messages): Ditto. (elmo-nntp-folder-delete-messages): Abolish. * elmo-version.el (elmo-version): Up to 2.11.18. 2003-09-26 Hiroya Murata * elmo.el (elmo-folder-kill-messages-before): Abolish. (elmo-folder-kill-messages-range): New function. (elmo-folder-synchronize): Use elmo-folder-kill-messages-range instead of elmo-folder-kill-messages-before. 2003-09-26 Yuuichi Teranishi * elmo-imap4.el (elmo-imap4-fetch-callback-1): Use elmo-imap4-current-msgdb to decide entity handler. 2003-09-25 Yuuichi Teranishi * elmo-dop.el (elmo-dop-msgdb): Rewrite. * modb-legacy.el (elmo-msgdb-overview-entity-get-id-internal): New inline function. (elmo-msgdb-overview-entity-get-number-internal): Ditto. (elmo-msgdb-overview-entity-set-number, elmo-msgdb-overview-entity-get-references, elmo-msgdb-overview-entity-set-references, elmo-msgdb-overview-entity-get-from-no-decode, elmo-msgdb-overview-entity-get-from, elmo-msgdb-overview-entity-set-from, elmo-msgdb-overview-entity-get-subject, elmo-msgdb-overview-entity-get-subject-no-decode, elmo-msgdb-overview-entity-set-subject, elmo-msgdb-overview-entity-get-date, elmo-msgdb-overview-entity-set-date, elmo-msgdb-overview-entity-get-to, elmo-msgdb-overview-entity-get-cc, elmo-msgdb-overview-entity-get-size, elmo-msgdb-overview-entity-set-size, elmo-msgdb-overview-entity-get-extra, elmo-msgdb-overview-entity-set-extra, elmo-msgdb-overview-entity-get-extra-field, elmo-msgdb-overview-entity-set-extra-field): Moved to elmo-msgdb.el. (elmo-msgdb-make-index): Use `elmo-msgdb-overview-entity-get-number-internal'. (elmo-msgdb-clear-index): Ditto. (elmo-msgdb-append-entity): Ditto; Use `elmo-msgdb-overview-entity-get-id-internal'. * elmo-msgdb.el (elmo-msgdb-overview-entity-get-number, elmo-msgdb-overview-entity-set-number, elmo-msgdb-overview-entity-get-references, elmo-msgdb-overview-entity-set-references, elmo-msgdb-overview-entity-get-from-no-decode, elmo-msgdb-overview-entity-get-from, elmo-msgdb-overview-entity-set-from, elmo-msgdb-overview-entity-get-subject, elmo-msgdb-overview-entity-get-subject-no-decode, elmo-msgdb-overview-entity-set-subject, elmo-msgdb-overview-entity-get-date, elmo-msgdb-overview-entity-set-date, elmo-msgdb-overview-entity-get-to, elmo-msgdb-overview-entity-get-cc, elmo-msgdb-overview-entity-get-size, elmo-msgdb-overview-entity-set-size, elmo-msgdb-overview-entity-get-extra, elmo-msgdb-overview-entity-set-extra, elmo-msgdb-overview-entity-get-extra-field, elmo-msgdb-overview-entity-set-extra-field): Moved from modb-legacy.el and rewrote for backward compatibility. 2003-09-24 Hiroya Murata * elmo.el (elmo-message-entity-number, elmo-message-entity-set-number, elmo-message-entity-field, elmo-message-entity-set-field): Moved to elmo-msgdb.el. * elmo-msgdb.el (elmo-message-entity-number, elmo-message-entity-set-number, elmo-message-entity-field, elmo-message-entity-set-field): Moved from elmo.el. 2003-09-24 Yuuichi Teranishi * elmo.el (toplevel): Changed definition orders. 2003-09-23 Hiroya Murata * modb.el (elmo-msgdb-search): New API . (elmo-msgdb-match-condition): Ditto. * modb-standard.el (elmo-msgdb-search): Define. * modb-legacy.el (elmo-msgdb-search): Ditto. * modb-entity.el (elmo-msgdb-message-match-condition): Renamed from elmo-msgdb-match-condition-internal. * elmo.el (elmo-folder-search-fast): Abolish. (elmo-folder-search): Use elmo-msgdb-search and elmo-with-progress-display. * elmo-msgdb.el (elmo-msgdb-match-condition): Removed; redefined as msgdb API. * elmo.el (elmo-folder): Remove slot message-modified and flag-modified. (elmo-folder-set-message-modified): Abolish. (elmo-generic-folder-commit): Follow the change above. (elmo-folder-synchronize): Ditto. * elmo-pipe.el (elmo-folder-set-message-modified): Abolish. * elmo-multi.el (elmo-folder-set-message-modified): Ditto. * elmo-filter.el (elmo-folder-set-message-modified): Ditto. 2003-09-22 Yuuichi Teranishi * modb-standard.el (modb-standard-make-message-entity, elmo-msgdb-make-message-entity, elmo-msgdb-create-message-entity-from-buffer, elmo-msgdb-message-entity-number, elmo-msgdb-message-entity-set-number, elmo-msgdb-message-entity-field, elmo-msgdb-message-entity-set-field, elmo-msgdb-copy-message-entity, elmo-msgdb-match-condition-internal): Remove. * modb-entity.el: New file (again). * modb.el (toplevel): Require modb-entity. (elmo-msgdb-message-entity-handler): New method. * modb-standard.el (modb-standard-entity-id): Use elmo-message-entity-handler. (modb-standard-load-entity): Ditto. (elmo-msgdb-append-entity): Ditto. (elmo-msgdb-create-message-entity-from-buffer): Ditto. * modb-legacy.el (elmo-msgdb-get-decoded-cache, elmo-msgdb-decoded-cache-hashtb, (modb-legacy-make-message-entity, elmo-msgdb-make-message-entity, elmo-msgdb-create-message-entity-from-buffer, elmo-msgdb-message-entity-number, elmo-msgdb-message-entity-set-number, elmo-msgdb-message-entity-field, elmo-msgdb-message-entity-set-field, elmo-msgdb-copy-message-entity, elmo-msgdb-match-condition-internal, elmo-msgdb-match-condition-primitive): Moved to modb-entity.el. * elmo.el (elmo-message-copy-entity): Use elmo-message-entity-handler. (elmo-message-entity-set-number): Ditto. (elmo-message-entity-field): Ditto. (elmo-message-entity-set-field): Ditto. * elmo-shimbun.el (elmo-shimbun-msgdb-create-entity): Ditto. * elmo-sendlog.el (elmo-folder-msgdb-create): Ditto. * elmo-pop3.el (elmo-pop3-msgdb-create-message): Ditto. * elmo-nntp.el (elmo-nntp-create-msgdb-from-overview-string): Ditto. (elmo-nntp-msgdb-create-message): Ditto. * elmo-nmz.el (elmo-nmz-msgdb-create-entity): Ditto. (elmo-folder-msgdb-create): Add unread flag. * elmo-maildir.el (elmo-folder-msgdb-create): Ditto. * elmo-localdir.el (elmo-localdir-msgdb-create-entity): Ditto. * elmo-imap4.el (elmo-imap4-fetch-callback-1): Ditto. * elmo-cache.el (elmo-folder-msgdb-create): Ditto. * elmo-archive.el (elmo-archive-msgdb-create-entity-subr): Call elmo-msgdb-messge-entity-handler. * elmo-version.el (elmo-version): Up to 2.11.17. 2003-09-22 Hiroya Murata * elmo-shimbun.el (elmo-shimbun-update-overview): Fixed the last change. 2003-09-22 Yuuichi Teranishi * elmo.el (elmo-message-field): Use elmo-message-entity-field. * elmo-msgdb.el (elmo-msgdb-get-number): Abolish. (elmo-msgdb-get-parent-entity): Use elmo-message-entity-field. (elmo-msgdb-flag-table): Ditto. (elmo-msgdb-sort-by-date): Ditto. * modb.el (elmo-msgdb-create-message-entity-from-file): Define. * modb-standard.el (toplevel): Require mime. (modb-standard-entity-id): Use elmo-msgdb-message-entity-field. (modb-standard-load-entity): Use elmo-msgdb-message-entity-field and elmo-msgdb-message-entity-number. (elmo-msgdb-append-entity): Ditto. (elmo-msgdb-create-message-entity-from-file): Remove. (elmo-msgdb-create-message-entity-from-buffer): Use msgdb which corresponds to the entity. (elmo-msgdb-message-entity-number): Do nothing currently. (elmo-msgdb-message-entity-field): Ditto. (elmo-msgdb-message-entity-set-field): Ditto. (elmo-msgdb-copy-message-entity): Ditto. (elmo-msgdb-match-condition-internal): Ditto. * modb-legacy.el (elmo-msgdb-insert-file-header): Moved to elmo-util.el. (elmo-msgdb-create-message-entity-from-file): Remove. * elmo-util.el (elmo-msgdb-insert-file-header): Moved from modb-legacy.el. (elmo-multiple-field-body): Moved from elmo-msgdb.el. * elmo-msgdb.el (elmo-multiple-field-body): Moved to elmo-util.el. 2003-09-21 Yuuichi Teranishi * modb.el (elmo-msgdb-make-message-entity): Define simple one. (elmo-msgdb-message-entity-field): Ditto. (elmo-msgdb-message-entity-number): Ditto. 2003-09-21 Hiroya Murata * modb-standard.el (elmo-msgdb-create-message-entity-from-buffer): Fixed how to set extra field into entity. (elmo-msgdb-message-entity-set-field): Fixed mistake string for symbol. * modb-legacy.el (elmo-msgdb-create-message-entity-from-buffer): Fixed how to set extra field into entity. (elmo-msgdb-message-entity-set-field): Fixed mistake string for symbol. 2003-09-21 Yuuichi Teranishi * modb.el (elmo-message-entity-db): New function. (elmo-msgdb-make-message-entity): New API. (elmo-msgdb-message-entity-number): Ditto. (elmo-msgdb-message-entity-set-number): Ditto. (elmo-msgdb-message-entity-field): Ditto. (elmo-msgdb-message-entity-set-field): Ditto. (elmo-msgdb-copy-message-entity): Ditto. (elmo-msgdb-create-message-entity-from-file): Ditto. (elmo-msgdb-create-message-entity-from-buffer): Ditto. (elmo-msgdb-match-condition-internal): Ditto. * modb-standard.el (modb-legacy): Require modb-legacy. (modb-standard-make-message-entity): New inline function. (elmo-msgdb-make-message-entity): Define. (elmo-msgdb-create-message-entity-from-file): Ditto. (elmo-msgdb-create-message-entity-from-buffer): Ditto. (elmo-msgdb-message-entity-field): Ditto. (elmo-msgdb-message-entity-set-field): Ditto. (elmo-msgdb-copy-message-entity): Ditto. (elmo-msgdb-match-condition-internal): Ditto. * modb-legacy.el: Don't require modb-entity. (elmo-msgdb-decoded-cache-hashtb): Moved from elmo-msgdb.el (elmo-msgdb-match-condition-primitive): Ditto. (elmo-msgdb-get-decoded-cache): Ditto. (elmo-msgdb-overview-entity-get-id): Ditto. (elmo-msgdb-overview-entity-get-number): Ditto. (elmo-msgdb-overview-entity-set-number): Ditto. (elmo-msgdb-overview-entity-get-references): Ditto. (elmo-msgdb-overview-entity-set-references): Ditto. (elmo-msgdb-overview-entity-get-from-no-decode): Ditto. (elmo-msgdb-overview-entity-get-from): Ditto. (elmo-msgdb-overview-entity-set-from): Ditto. (elmo-msgdb-overview-entity-get-subject): Ditto. (elmo-msgdb-overview-entity-get-subject-no-decode): Ditto. (elmo-msgdb-overview-entity-set-subject): Ditto. (elmo-msgdb-overview-entity-get-date): Ditto. (elmo-msgdb-overview-entity-set-date): Ditto. (elmo-msgdb-overview-entity-get-to): Ditto. (elmo-msgdb-overview-entity-get-cc): Ditto. (elmo-msgdb-overview-entity-get-size): Ditto. (elmo-msgdb-overview-entity-set-size): Ditto. (elmo-msgdb-overview-entity-get-extra): Ditto. (elmo-msgdb-overview-entity-set-extra): Ditto. (elmo-msgdb-overview-entity-get-extra-field): Ditto. (elmo-msgdb-overview-entity-set-extra-field): Ditto. (elmo-msgdb-number-load): Ditto. (elmo-msgdb-overview-load): Ditto. (elmo-msgdb-mark-load): Ditto. (elmo-msgdb-number-save): Ditto. (elmo-msgdb-mark-save): Ditto. (elmo-msgdb-overview-save): Ditto. (modb-legacy-make-message-entity): New inline function. (elmo-msgdb-insert-file-header): Ditto. (elmo-msgdb-make-message-entity): Define. (elmo-msgdb-create-message-entity-from-file): Ditto. (elmo-msgdb-create-message-entity-from-buffer): Ditto. (elmo-msgdb-message-entity-number): Ditto. (elmo-msgdb-message-entity-set-number): Ditto. (elmo-msgdb-message-entity-field): Ditto. (elmo-msgdb-message-entity-set-field): Ditto. (elmo-msgdb-copy-message-entity): Ditto. (elmo-msgdb-match-condition-internal): Ditto. * elmo.el (elmo-find-fetch-strategy): Use elmo-message-entity-field. (elmo-message-copy-entity): Rewrite. (elmo-message-entity-number): Ditto. (elmo-message-entity-set-number): Ditto. (elmo-message-entity-field): Use elmo-message-entity-db. (elmo-message-entity-set-field): Ditto. (elmo-message-field): Rewrite. * elmo-util.el (elmo-msgdb-get-last-message-id): Moved from elmo-msgdb.el (elmo-msgdb-get-message-id-from-buffer): Ditto. * elmo-shimbun.el (elmo-shimbun-folder-entity-hash): Use elmo-message-entity-field. (elmo-shimbun-folder-shimbun-header): Ditto. (elmo-shimbun-entity-to-header): Ditto. (elmo-folder-msgdb-create): Ditto. (elmo-shimbun-msgdb-create-entity): Ditto; Use elmo-msgdb-create-message-entity-from-buffer. (elmo-shimbun-update-overview): Use elmo-message-entity-set-field. (elmo-map-folder-list-message-locations): elmo-message-entity-field. * elmo-sendlog.el (elmo-folder-msgdb-create): Use elmo-msgdb-create-message-entity-from-file and elmo-message-entity-field. * elmo-pop3.el (elmo-pop3-sort-msgdb-by-original-number): Use elmo-message-entity-number. (elmo-pop3-msgdb-create-message): Use elmo-msgdb-create-message-entity-from-buffer, elmo-message-entity-set-field, elmo-message-entity-number and elmo-message-entity-set-number. * elmo-nntp.el (elmo-nntp-create-msgdb-from-overview-string): Follow the API change in elmo-msgdb-make-message-entity. (elmo-nntp-msgdb-create-message): Use elmo-msgdb-create-message-entity-from-buffer. * elmo-nmz.el (elmo-nmz-msgdb-create-entity): Use elmo-message-entity-field and elmo-msgdb-create-message-entity-from-file. * elmo-msgdb.el (toplevel): Don't require modb-entity. (elmo-msgdb-get-field): Abolish. (elmo-msgdb-get-number): Rewrite. (elmo-msgdb-sort-by-date): Use elmo-message-entity-field. (elmo-msgdb-flag-table): Ditto. (elmo-msgdb-get-last-message-id, elmo-msgdb-number-load, elmo-msgdb-overview-load, elmo-msgdb-mark-load, elmo-msgdb-number-save, elmo-msgdb-mark-save, elmo-msgdb-overview-save): Moved to modb-legacy. (elmo-msgdb-create-overview-from-buffer, elmo-msgdb-overview-get-parent-entity): Abolish. * elmo-mime.el (elmo-mime-display-as-is): Use elmo-message-entity-field. * elmo-map.el (elmo-folder-pack-numbers): Use elmo-message-entity-set-number. * elmo-maildir.el (elmo-folder-msgdb-create): elmo-msgdb-create-message-entity-from-file instead of elmo-msgdb-create-overview-entity-from-file. * elmo-localdir.el (elmo-localdir-msgdb-create-entity): Added argument msgdb. (elmo-folder-msgdb-create): Use elmo-message-entity-field. (elmo-folder-pack-numbers): Use elmo-message-entity-set-number. * elmo-imap4.el (elmo-imap4-fetch-callback-1-subr): Use elmo-messge-entity-field and elmo-message-entity-number. (elmo-imap4-fetch-callback-1): Call elmo-msgdb-create-message-entity-from-buffer instead of elmo-msgdb-create-overview-from-buffer. (elmo-folder-msgdb-create-plugged): Use elmo-messge-entity-field. (elmo-find-fetch-strategy): Likewise. * elmo-flag.el (elmo-folder-msgdb-create): Call elmo-localdir-msgdb-create-entity with argument msgdb. * elmo-dop.el (elmo-dop-msgdb): Use elmo-message-entity-number and elmo-message-entity-set-number. * elmo-cache.el (elmo-folder-msgdb-create): Use elmo-message-entity-field. (elmo-folder-msgdb-create): Call elmo-msgdb-create-message-entity-from-file instead of elmo-msgdb-create-overview-entity-from-file. * elmo-archive.el (elmo-archive-msgdb-create-entity-subr): Added argument msgdb; Call elmo-msgdb-create-message-from-buffer instead of elmo-msgdb-create-overview-from-buffer. (elmo-archive-msgdb-create-entity): Ditto. (elmo-archive-msgdb-create-as-numlist-subr1): Use elmo-message-entity-field. (elmo-archive-parse-mmdf): Ditto. * modb-entity.el: Removed. * elmo-version.el (elmo-version): Up to 2.11.16. 2003-09-20 Yuuichi Teranishi * elmo-map.el (elmo-folder-unflag-answered): Added optional argument `is-local'. (elmo-folder-flag-as-answered): Ditto. 2003-09-19 Hiroya Murata * modb-standard.el: New file. * elmo.el (elmo-folder-clear): Reconstruct msgdb if elmo-msgdb-convert-type is `sync'. * elmo-vars.el (elmo-msgdb-default-type): Added `standard'. (elmo-msgdb-convert-type): New user option. * elmo-msgdb.el (elmo-msgdb-load-priorities): New internal variable. (elmo-load-msgdb): Auto detect saved type. * elmo-version.el (elmo-version): Up to 2.11.15. 2003-09-19 Yuuichi Teranishi * elmo-flag.el (elmo-folder-list-global-flag-messages): New function. * elmo.el (elmo-folder-delete-messages): Added notice in docstring. (elmo-folder-move-messages): Call elmo-global-flag-detach-messages with argument `delete-if-none' when dst-folder is 'null. * elmo-flag.el (elmo-folder-append-messages): Defined. (elmo-global-flag-detach-messages): Added argumnet `delete-if-none'. 2003-09-18 Yuuichi Teranishi * elmo-flag.el (elmo-folder-initialize): Fixed ("/.minfo"->".minfo"). 2003-09-18 Hiroya Murata * elmo-flag.el (elmo-folder-expand-msgdb-path): Define. (elmo-folder-initialize): Use `elmo-folder-msgdb-path'. (elmo-folder-commit): Ditto. 2003-09-18 Yuuichi Teranishi * elmo-flag.el: New file. * elmo-mark.el: Removed. * modb-legacy.el (modb-legacy-new-mark, modb-legacy-unread-uncached-mark, modb-legacy-unread-cached-mark, modb-legacy-read-uncached-mark, modb-legacy-answered-cached-mark, modb-legacy-answered-uncached-mark, modb-legacy-important-mark): New constants (Moved from elmo-msgdb.el); All other related portions are changed. * elmo.el (luna-define-class): Changed mark-modified to flag-modified. (elmo-folder-list-messages-with-global-mark): Abolish. (elmo-folder-unflag-important): Renamed from `mark' to `flag'. (elmo-folder-flag-as-important): Ditto. (elmo-folder-unflag-read): Ditto. (elmo-folder-flag-as-read): Ditto. (elmo-folder-unflag-answered): Ditto. (elmo-folder-flag-as-answered): Ditto. (elmo-message-encache): Return the cache path. (elmo-folder-move-messages): Call elmo-global-flag-detach-messages. (elmo-message-set-flag): Transitional implementation. (elmo-message-unset-flag): Ditto. (elmo-folder-unflag-important): Call elmo-global-flag-detach. (elmo-folder-flag-as-important): Call elmo-global-flag-set. (elmo-init): Call elmo-global-flag-initialize. (toplevel): Added autoload settings for elmo-flag. * elmo-vars.el (elmo-msgdb-global-mark-filename): Abolished. * elmo-util.el: Removed all elmo-msgdb-global-mark stuff. (elmo-file-cache-delete): Don't treat global-mark. * elmo-shimbun.el (elmo-folder-msgdb-create): Ditto. * elmo-sendlog.el (elmo-folder-msgdb-create): Ditto. * elmo-pop3.el (elmo-pop3-msgdb-create-message): Call `elmo-global-flags-set'. * elmo-pipe.el (elmo-folder-flag-as-read): Renamed from `mark' to `flag'. (elmo-folder-unflag-read): Ditto. (elmo-folder-unflag-important): Ditto. (elmo-folder-flag-as-important): Ditto. (elmo-folder-unflag-answered): Ditto. (elmo-folder-flag-as-answered): Ditto. * elmo-nntp.el (elmo-nntp-create-msgdb-from-overview-string): Call `elmo-global-flags-set'. (elmo-folder-flag-as-read): Renamed from `mark' to `flag'. * elmo-nmz.el (elmo-folder-msgdb-create): Always put `new' flag. * elmo-net.el (elmo-folder-unflag-important): Renamed from `mark' to `flag'. (elmo-folder-flag-as-important): Ditto. (elmo-folder-unflag-important): Ditto. (elmo-folder-flag-as-important): Ditto. (elmo-folder-unflag-read): Ditto. (elmo-folder-flag-as-read): Ditto. (elmo-folder-unflag-answered): Ditto. (elmo-folder-flag-as-answered): Ditto. * elmo-multi.el (elmo-folder-list-importants): Don't call elmo-folder-list-messages-with-global-mark. (elmo-folder-flag-as-important): Renamed from `mark' to `flag'. (elmo-folder-unflag-important): Ditto. (elmo-folder-flag-as-read): Ditto. (elmo-folder-unflag-read): Ditto. (elmo-folder-flag-as-answered): Ditto. (elmo-folder-unflag-answered): Ditto. * elmo-msgdb.el (elmo-msgdb-new-mark, elmo-msgdb-unread-uncached-mark, elmo-msgdb-unread-cached-mark, elmo-msgdb-read-uncached-mark, elmo-msgdb-answered-cached-mark, elmo-msgdb-answered-uncached-mark, elmo-msgdb-important-mark): Removed (Moved to modb-legacy.el). (elmo-flag-table-get): Treat important flag too. * elmo-map.el (elmo-map-folder-unflag-important): Renamed from `mark' to `flag'. (elmo-map-folder-flag-as-important): Ditto. (elmo-map-folder-unflag-read): Ditto. (elmo-map-folder-flag-as-read): Ditto. (elmo-map-folder-unflag-answered): Ditto. (elmo-map-folder-flag-as-answered): Ditto. (elmo-folder-unflag-important): Ditto. (elmo-folder-flag-as-important): Ditto. (elmo-folder-unflag-read): Ditto. (elmo-folder-flag-as-read): Ditto. (elmo-folder-unflag-answered): Ditto. (elmo-folder-flag-as-answered): Ditto. * elmo-maildir.el (elmo-folder-msgdb-create): Ditto. (elmo-map-folder-flag-as-important): Renamed from `mark' to `flag'. (elmo-map-folder-unflag-important): Ditto. (elmo-map-folder-flag-as-read): Ditto. (elmo-map-folder-unflag-read): Ditto. (elmo-map-folder-flag-as-answered): Ditto. (elmo-map-folder-unflag-answered): Ditto. * elmo-localdir.el (elmo-folder-msgdb-create): Call `elmo-global-flags-set'. (elmo-global-flags-set): Added autoload setting. * elmo-internal.el (elmo-internal-folder-list): Changed `mark' to `flag'. * elmo-imap4.el (elmo-imap4-fetch-callback-1-subr): Don't call `elmo-msgdb-global-mark-set'. (elmo-folder-msgdb-create-plugged): Changed callback-data structure; Call `elmo-global-flags-set'. (elmo-folder-unflag-important-plugged): Renamed from `mark' to `flag'. (elmo-folder-flag-as-important-plugged): Ditto. (elmo-folder-unflag-read-plugged): Ditto. (elmo-folder-flag-as-read-plugged): Ditto. (elmo-folder-unflag-answered-plugged): Ditto. (elmo-folder-flag-as-answered-plugged): Ditto. (elmo-global-flags-set): Added autoload setting. * elmo-filter.el (elmo-folder-flag-as-read): Renamed from `mark' to `flag'. (elmo-folder-unflag-read): Ditto. (elmo-folder-flag-as-important): Ditto. (elmo-folder-unflag-important): Ditto. (elmo-folder-flag-as-answered): Ditto. (elmo-folder-unflag-answered): Ditto. * elmo-dop.el (elmo-dop-queue-merge-method-list): Follow the API change of `mark'->`flag'. (elmo-dop-queue-method-name-alist): Ditto. (elmo-folder-flag-as-read-dop): Renamed from `mark' to `flag'. (elmo-folder-unflag-read-dop): Ditto. (elmo-folder-flag-as-important-dop): Ditto. (elmo-folder-unflag-important-dop): Ditto. (elmo-folder-flag-as-answered-dop): Ditto. (elmo-folder-unflag-answered-dop): Ditto. * elmo-cache.el (elmo-folder-msgdb-create): Call `elmo-global-flags-set'. * elmo-archive.el (elmo-archive-msgdb-create-as-numlist-subr1): Call `elmo-global-flags-set'. (elmo-archive-msgdb-create-as-numlist-subr2): Call elmo-archive-parse-mmdf with argument `folder'. (elmo-archive-parse-mmdf): Added argument `folder'; Call `elmo-global-flags-set'. * elmo-version.el (elmo-version): Up to 2.11.14. 2003-09-17 Hiroya Murata * modb.el (elmo-msgdb-length): Define. * elmo.el (elmo-make-folder): Fixed. (elmo-generic-folder-append-messages): Follow the API change. * elmo-dop.el (elmo-folder-append-buffer-dop-delayed): Follow the API change. 2003-09-15 Hiroya Murata * modb.el: New file. * modb-entity.el: Ditto. * modb-legacy.el: Ditto. * elmo-msgdb.el (elmo-make-msgdb): Added 2nd argument `type'. (elmo-msgdb-get-number): Use `elmo-msgdb-message-entity' instead of `elmo-msgdb-overview-get-entity'. (elmo-msgdb-get-field): Ditto. (elmo-msgdb-merge): Moved to `elmo.el'. (elmo-msgdb-length): Removed; redefine as modb method. (elmo-msgdb-change-mark): Abolish. (elmo-msgdb-out-of-date-messages): Rewrite; don't use it. (elmo-msgdb-match-condition): Don't use mark. (elmo-msgdb-overview-get-entity): Abolish. Split modb part into `modb*.el'. * elmo-vars.el (elmo-msgdb-default-type): New user option. * elmo-shimbun.el (shimbun-mua-search-id): Use `elmo-msgdb-message-entity' instead of `elmo-msgdb-overview-get-entity'. (elmo-shimbun-folder-shimbun-header): Ditto. (elmo-shimbun-get-headers): Ditto. (elmo-shimbun-update-overview): Ditto. * elmo-mime.el (elmo-mime-display-as-is): Ditto. * elmo-filter.el (elmo-folder-msgdb-create): Ditto. * elmo.el (elmo-folder-list-messages-with-global-mark): Ditto. (elmo-msgdb-merge): Moved from `elmo-msgdb.el'. * elmo-mark.el (elmo-mark-folder-msgdb-create): Don't use `elmo-msgdb-mark-to-flags'. * elmo-map.el (elmo-folder-pack-numbers): Don't use `elmo-msgdb-set-path'. * elmo-localdir.el (elmo-folder-pack-numbers): Ditto. * elmo-version.el (elmo-version): Up to 2.11.13. * elmo.el (elmo-generic-folder-commit): Don't load msgdb. * elmo-mark.el (elmo-mark-folder-msgdb-create): Use flag instead of mark. 2003-09-14 TAKAHASHI Kaoru * elmo-imap4.el (elmo-imap4-fetch-callback-1-subr): Fixed paren mismatch. 2003-09-14 Hiroya Murata * elmo.el (elmo-message-cached-p): Use `elmo-message-flagged-p' instead of `elmo-msgdb-get-cached'. (elmo-message-set-cached): Don't use `elmo-msgdb-set-cached'. * elmo-msgdb.el (elmo-msgdb-get-cached): Abolish. (elmo-msgdb-set-cached): Ditto. (elmo-msgdb-set-flag): Rewrite. (elmo-msgdb-unset-flag): Ditto. * elmo-msgdb.el: Rewrite with luna. * elmo.el (elmo-folder-msgdb-load): Renamed from `elmo-msgdb-load'. (elmo-folder-msgdb): Follow the change above. (elmo-generic-folder-commit): Use `elmo-msgdb-save'. (elmo-folder-unmark-important): Follow the API change. (elmo-folder-mark-as-important): Ditto. (elmo-folder-unmark-read): Ditto. (elmo-folder-mark-as-read): Ditto. (elmo-folder-unmark-answered): Ditto. (elmo-folder-mark-as-answered): Ditto. (elmo-folder-clear): Likewise. * elmo-imap4.el (elmo-folder-open): Use `elmo-folder-msgdb-load' instead of `elmo-msgdb-load' (renamed). * elmo-version.el (elmo-version): Up to 2.11.12. 2003-09-13 Hiroya Murata * elmo.el (elmo-generic-folder-append-messages): Follow the API change. (elmo-message-mark): Abolish. (elmo-folder-synchronize): Use `elmo-msgdb-out-of-date-messages' instead of `elmo-msgdb-change-mark'. * elmo-pipe.el (elmo-message-mark): Abolish. * elmo-multi.el (elmo-message-mark): Ditto. * elmo-msgdb.el (elmo-msgdb-new-mark): Changed to constant. (elmo-msgdb-unread-uncached-mark): Ditto. (elmo-msgdb-unread-cached-mark): Ditto. (elmo-msgdb-read-uncached-mark): Ditto. (elmo-msgdb-answered-cached-mark): Ditto. (elmo-msgdb-answered-uncached-mark): Ditto. (elmo-msgdb-important-mark): Ditto. (elmo-msgdb-flags-to-mark): Remove arguments `cached' and `use-cache'. (elmo-msgdb-append-entity): Changed 3rd arg from `mark' to `flags'. (elmo-flag-table-load): Changed flag to list of flag. (elmo-flag-table-set): If flags is nil, set read flag. (elmo-flag-table-get): Return derived flags from global mark, cache status and saved flags. (elmo-msgdb-flag-table): Follow the change above. (elmo-msgdb-out-of-date-messages): New function. * elmo-shimbun.el (elmo-folder-msgdb-create): Follow the API change. * elmo-sendlog.el (elmo-folder-msgdb-create): Ditto. * elmo-pop3.el (elmo-pop3-msgdb-create-message): Ditto. * elmo-nntp.el (elmo-nntp-create-msgdb-from-overview-string): Ditto. (elmo-nntp-msgdb-create-message): Ditto. * elmo-map.el (elmo-folder-pack-numbers): Ditto. * elmo-maildir.el (elmo-maildir-list-location): Treat flags as independent. (elmo-folder-msgdb-create): Follow the API change. * elmo-localdir.el (elmo-folder-msgdb-create): Ditto. (elmo-folder-append-messages): Ditto. * elmo-imap4.el (elmo-imap4-fetch-callback-1-subr): Ditto. (elmo-folder-append-buffer): Ditto. * elmo-filter.el (elmo-folder-msgdb-create): Ditto. * elmo-cache.el (elmo-folder-msgdb-create): Ditto. * elmo-archive.el (elmo-archive-msgdb-create-as-numlist-subr1): Ditto. (elmo-archive-parse-mmdf): Ditto. * elmo-version.el (elmo-version): Up to 2.11.11. 2003-09-10 Hiroya Murata * elmo.el (elmo-message-flags): Use `elmo-msgdb-flags' instead of `elmo-msgdb-mark'. * elmo-util.el (elmo-with-progress-display): Fixed edebug spec. * elmo-pipe.el (elmo-message-flags): Defined. * elmo-multi.el (elmo-message-flags): Ditto. 2003-09-07 Hiroya Murata * elmo-msgdb.el (elmo-msgdb-delete-messages): Renamed from `elmo-msgdb-delete-msgs'. * elmo.el (elmo-folder-count-flags): Don't use `elmo-msgdb-get-mark-alist'. (elmo-folder-detach-messages): Follow the API change. * elmo.el (elmo-folder-list-messages): Append killed messages into result if `visible-only' is nil. * elmo-nntp.el (elmo-nntp-catchup-msgdb): Return a list of canceled messages. (elmo-nntp-folder-msgdb-create): Kill messages which already canceled. (elmo-folder-update-number): Likewise. * elmo-pop3.el (elmo-pop3-sort-overview-by-original-number): Abolish. (elmo-pop3-sort-msgdb-by-original-number): Use `elmo-msgdb-sort-entities'. * elmo-msgdb.el (elmo-msgdb-sort-entities): New function. (elmo-msgdb-sort-by-date): Use it. (elmo-msgdb-overview-sort-by-date): Abolish. * elmo-dop.el (elmo-folder-status-dop): Fixed. * elmo-msgdb.el (elmo-msgdb-list-messages): Undo last change. (elmo-msgdb-flags): New function. (elmo-msgdb-merge): Use elmo-msgdb-append. * elmo-localdir.el (elmo-folder-pack-numbers): Fixed the last change. * elmo-map.el (elmo-folder-pack-numbers): Ditto. * elmo-dop.el (elmo-folder-status-dop): Use elmo-folder-list-messages instead of elmo-msgdb-list-messages. 2003-09-06 Hiroya Murata * elmo-map.el (elmo-folder-pack-numbers): Rewrite. * elmo-localdir.el (elmo-folder-pack-numbers): Fixed last change. * elmo-msgdb.el (elmo-msgdb-append-entity): Fixed. * elmo-util.el (elmo-with-progress-display): New macro. * elmo-localdir.el (elmo-folder-pack-numbers): Rewrite. 2003-09-05 Hiroya Murata * elmo-shimbun.el (elmo-shimbun-folder-entity-hash): Use `elmo-folder-list-message-entities' instead of `elmo-msgdb-get-overview'. (elmo-map-folder-list-message-locations): Ditto. * elmo-msgdb.el (elmo-msgdb-append): Rewrite (use interface methods instead of treat directly). (elmo-msgdb-clear): Ditto. (elmo-msgdb-delete-msgs): Ditto. (elmo-msgdb-sort-by-date): Ditto. * elmo-nntp.el (elmo-nntp-msgdb-create-message): Removed unused local variables. (elmo-nntp-folder-msgdb-create): Follow the API change. * elmo-version.el (elmo-version): Up to 2.11.10. 2003-08-30 Hiroya Murata * elmo-msgdb.el (elmo-msgdb-mark-to-flags): New function. (elmo-msgdb-flags-to-mark): Ditto. (elmo-msgdb-append-entity): Ditto. * elmo-archive.el (elmo-archive-msgdb-create-as-numlist-subr1): Use `elmo-msgdb-append-entity' instead of construct msgdb. (elmo-archive-msgdb-create-as-numlist-subr2): Ditto. (elmo-archive-parse-mmdf): Ditto. * elmo-cache.el (elmo-folder-msgdb-create): Ditto. * elmo-filter.el (elmo-folder-msgdb-create): Ditto. * elmo-localdir.el (elmo-folder-msgdb-create): Ditto. * elmo-maildir.el (elmo-folder-msgdb-create): Ditto. * elmo-mark.el (elmo-mark-folder-msgdb-create): Ditto. * elmo-nmz.el (elmo-folder-msgdb-create): Ditto. * elmo-sendlog.el (elmo-folder-msgdb-create): Ditto. * elmo-shimbun.el (elmo-folder-msgdb-create): Ditto. * elmo-imap4.el (elmo-imap4-fetch-callback-1-subr): Ditto. (elmo-folder-msgdb-create-plugged): Set elmo-imap4-current-msgdb to empty msgdb. * elmo-nntp.el (elmo-nntp-create-msgdb-from-overview-string): Use `elmo-msgdb-make-message-entity' and `elmo-msgdb-append-entity' instead of directly construction. (elmo-nntp-msgdb-create-message): Use `elmo-msgdb-append-entity' instead of construct msgdb. * elmo-pop3.el (elmo-pop3-sort-msgdb-by-original-number): Use `elmo-msgdb-set-overview' instead of reconstruct msgdb. (elmo-pop3-msgdb-create-message): Use `elmo-msgdb-append-entity' instead of construct msgdb. 2003-08-28 Hiroya Murata * elmo-msgdb.el (elmo-msgdb-message-entity-field): Decode value when field is from or subject. 2003-08-23 Yuuichi Teranishi * elmo-multi.el (elmo-message-entity-parent): Define. (elmo-folder-search): Rewrite. 2003-08-22 Hiroya Murata * elmo-multi.el (elmo-message-cached-p): Define. * elmo.el (elmo-message-cached-p): New method. (elmo-message-accessible-p): Use it instead of msgdb API directly. (elmo-message-flags): New method. (elmo-message-flagged-p): New function. * elmo-version.el (elmo-version): Up to 2.11.9. 2003-08-20 Hiroya Murata * elmo-version.el (elmo-version): Up to 2.11.8. * elmo.el (elmo-folder-move-messages): Removed unused arguments. * elmo-pipe.el (elmo-pipe-drain): Follow the change above. 2003-08-14 Yuuichi Teranishi * elmo.el (elmo-folder-detach-messages): Undo last change. 2003-08-13 Yuuichi Teranishi * elmo.el (elmo-folder-detach-messages): Don't load msgdb if empty. * elmo-pipe.el (elmo-pipe-drain): Bind elmo-inhibit-number-mapping only when src folder type is pop3. 2003-08-12 Yuuichi Teranishi * elmo-msgdb.el (elmo-msgdb-make-index): Use elmo-msgdb-overview-entity-get-number instead of elmo-message-entity-number. 2003-08-09 Hiroya Murata * elmo-version.el (elmo-version): Up to 2.11.7. 2003-08-07 Yuuichi Teranishi * elmo.el (elmo-folder-append-msgdb): Rewrite and define as an inline function. * elmo-msgdb.el (elmo-msgdb-append): Use elmo-msgdb-make-index-return. (elmo-msgdb-merge): New function. (elmo-msgdb-make-index-return): Renamed from elmo-msgdb-make-index. (elmo-msgdb-make-index): Rewrite. * elmo-version.el (elmo-version): Up to 2.11.6. * elmo-msgdb.el (elmo-msgdb-list-messages): If argument is a string, use it as a the path for loading message entities. * elmo-dop.el (elmo-folder-status-dop): Use elmo-msgdb-list-messages. 2003-08-05 Yuuichi Teranishi * elmo-filter.el (elmo-folder-set-message-modified): Set message-modified slot of itself if it does not require target msgdb. * elmo-mime.el (elmo-mime-message-display): Display message entirely if folder length is zero. (elmo-mime-display-as-is): Ditto. * elmo-filter.el (elmo-folder-set-message-modified): Define. * elmo-multi.el (elmo-folder-set-message-modified): Ditto. 2003-08-03 Hiroya Murata * elmo.el (elmo-folder-set-message-modified): New method. (elmo-generic-folder-commit): Use it. (elmo-folder-synchronize): Ditto. * elmo-pipe.el (elmo-folder-set-message-modified): Define. (elmo-folder-commit): Remove duplicate definition. 2003-08-02 Yuuichi Teranishi * elmo.el (elmo-folder-list-message-entities): Ignore killed-list. 2003-08-02 Hiroya Murata * elmo.el (elmo-msgdb-load): Use elmo-msgdb-list-messages. (elmo-strict-folder-diff): Ditto. (elmo-folder-set-info-max-by-numdb): Simplify. * elmo-nntp.el (elmo-nntp-folder-msgdb-create): Use elmo-msgdb-list-messages. * elmo-msgdb.el (elmo-msgdb-seen-save): Abolish. (elmo-msgdb-list-flagged): Fixed problem when `flag' is `read'. 2003-08-02 Yuuichi Teranishi * elmo.el (elmo-folder-list-messages): Treat killed-list only when visible-only is non-nil. (elmo-folder-confirm-appends): Changed message. (elmo-folder-synchronize): Added argument disable-killed. * elmo-multi.el (elmo-folder-synchronize): Added argument disable-killed. * elmo-pipe.el (elmo-folder-synchronize): Ditto. * elmo-version.el (elmo-version): Up to 2.11.5. * elmo-multi.el (elmo-folder-search): Use nil for 1st argument of elmo-list-filter. * elmo-util.el (elmo-list-filter): Simplify. * elmo.el (elmo-generic-folder-commit): Use elmo-folder-list-messages. (elmo-folder-set-info-max-by-numdb): Changed argument to number list. (elmo-generic-folder-diff): Abolish argument. (elmo-msgdb-load): Don't use number-alist. * elmo-filter.el (elmo-folder-diff): Abolish argument. * elmo-pipe.el (elmo-folder-diff): Ditto. * elmo-nmz.el (elmo-folder-diff): Ditto. * elmo-net.el (elmo-folder-diff): Ditto. * elmo-maildir.el (elmo-folder-diff): Ditto. * elmo-imap4.el (elmo-folder-diff-async): Ditto. * elmo-multi.el (elmo-folder-diff): Ditto (elmo-multi-folder-diff): Rewrite. 2003-08-02 Hiroya Murata * elmo-pipe.el (elmo-folder-msgdb): Define. 2003-08-01 Yuuichi Teranishi * elmo.el (elmo-message-set-cached): Define as a method. * elmo-pipe.el (elmo-message-set-cached): Define. (elmo-find-fetch-strategy): Ditto. * elmo-multi.el (elmo-message-set-cached): Define. (elmo-find-fetch-strategy): Rewrite. * elmo-mime.el (elmo-mime-message-display): Use elmo-message-entity. * elmo-pipe.el (elmo-message-folder): Fixed definition. 2003-07-30 Yuuichi Teranishi * elmo-msgdb.el (elmo-msgdb-list-messages): Use number of overviews instead of number-alist. * elmo-localdir.el (elmo-folder-append-messages): Don't refer mark nor message-id when msgdb of source folder is not loaded. * elmo.el (elmo-generic-folder-append-messages): Ditto. * elmo-maildir.el (elmo-folder-append-messages): Ditto. 2003-07-29 Yuuichi Teranishi * elmo.el (elmo-folder-length): Don't require msgdb. 2003-07-28 Yuuichi Teranishi * elmo.el (elmo-message-mark): Cause an error when empty folder. (elmo-message-field): Ditto. * elmo-maildir.el (luna-define-class): Added slot `answered-locations'. (elmo-map-folder-list-message-locations): Setup `answered-locations' slot. (elmo-map-folder-list-answereds): Define. (elmo-maildir-list-location): Treat 'R' info. (elmo-folder-msgdb-create): Treat flag-table. (elmo-folder-append-messages): Save flag-table. 2002-05-05 David Smith * elmo-imap4.el (elmo-imap4-folder-diff-plugged): Use SELECT when elmo-imap4-use-select-to-update-status is t. 2003-07-24 Hiroya Murata * elmo.el (elmo-generic-folder-append-messages): Fixed last change. * elmo-localdir.el (elmo-folder-append-messages): Set flag as 'read when mark is null. 2003-07-24 Yuuichi Teranishi * elmo-version.el (elmo-version): Up to 2.11.4. 2003-07-23 Hiroya Murata * elmo-pipe.el (elmo-folder-unmark-answered): Define. (elmo-folder-mark-as-answered): Ditto. 2003-07-22 Yuuichi Teranishi * elmo-pop3.el (elmo-pop3-exists-exactly): Set default value as nil. (elmo-pop3-get-session): Make msgdb directory after session. (elmo-folder-exists-p): Check exactly at the first time even when the elmo-pop3-exists-exactly is nil. * elmo-pipe.el (elmo-folder-open-internal): Don't drain here. (elmo-folder-list-messages): Define instead of elmo-folder-list-messages-internal. (elmo-folder-check): Check destination folder. (elmo-folder-synchronize): Drain the pipe. * elmo-localdir.el (elmo-folder-append-messages): Don't cause an error when msgdb is not loaded. * elmo-msgdb.el (elmo-msgdb-append-to-killed-list): Abolish. * elmo-imap4.el (elmo-folder-list-messages-plugged): Fixed. (elmo-imap4-folder-diff-plugged): Use uidnext to calculate number of messages. * elmo.el (elmo-folder-kill-messages-before): New function. (elmo-folder-kill-messages): Ditto. (elmo-folder-synchronize): Use elmo-folder-kill-messages-before. * elmo-imap4.el (elmo-folder-list-messages-plugged): Don't use elmo-msgdb-max-of-killed. It is harmful when messages are killed not by synchronize (e.g. scoring). 2003-07-22 Hiroya Murata * elmo.el (elmo-folder-search-fast): Return t if condition is not treated. (elmo-folder-search): Follow the change above. * elmo-util.el (elmo-read-search-condition-internal): Add `Flag' into the candidates of search field. 2003-07-21 Yuuichi Teranishi * elmo-msgdb.el (elmo-msgdb-set-flag): Overwrite answered flag. (elmo-msgdb-unset-flag): Ditto. * elmo-imap4.el (elmo-imap4-fetch-callback-1-subr): Precedes Seen flag. 2003-07-19 Yuuichi Teranishi * elmo-pipe.el (elmo-folder-msgdb-create): Don't define. (elmo-folder-commit): Define. (elmo-folder-synchronize): Ditto. (elmo-folder-list-flagged): Ditto. (elmo-folder-commit): Ditto. (elmo-folder-length): Ditto. (elmo-folder-count-flags): Ditto. (elmo-message-mark): Ditto. (elmo-message-field): Ditto. (elmo-message-entity): Ditto. (elmo-message-folder): Ditto. 2003-07-18 Yuuichi Teranishi * elmo.el (elmo-message-field): Define as a method. * elmo-multi.el (elmo-message-entity): Fixed bug when no entity found. (elmo-message-field): Define. * elmo.el (elmo-folder-list-unreads): Don't use msgdb API. (elmo-folder-list-importants): Ditto. (elmo-folder-list-answereds): Ditto. * elmo-multi.el (elmo-folder-mark-as-important): Remove :before qualifier. (elmo-folder-mark-as-read): Ditto. (elmo-folder-unmark-read): Ditto. (elmo-folder-mark-as-answered): Ditto. (elmo-folder-unmark-answered): Ditto. (elmo-folder-list-flagged): Define. (elmo-folder-commit): Ditto. (elmo-folder-length): Ditto. (elmo-folder-count-flags): Ditto. 2003-07-17 Yuuichi Teranishi * elmo.el (elmo-folder-detach-messages): New method. (elmo-folder-move-messages): Use it. (elmo-folder-synchronize): Ditto. * elmo-multi.el (elmo-folder-detach-messages): Define. * elmo.el (elmo-message-copy-entity): New function. (elmo-message-entity-set-number): Ditto. (elmo-message-mark): Define as method. * elmo-multi.el (elmo-multi-real-folder-number): Changed position. (elmo-folder-synchronize): Return 0 (Should be reconsider). (elmo-message-entity): Fixed last change. (elmo-message-mark): Define. (elmo-folder-msgdb-create): Abolish. (elmo-multi-folder-append-msgdb): Ditto. (elmo-multi-folder-diff): Fixed. (elmo-multi-split-number-alist): Removed. (elmo-multi-split-mark-alist): Removed. (elmo-folder-list-messages): Define. (elmo-folder-list-messages-internal): Removed. * elmo-localdir.el (elmo-folder-append-messages): Treat flags for local file messages. (elmo-folder-msgdb-create): Fixed read mark. 2003-07-17 Hiroya Murata * elmo.el (elmo-generic-folder-append-messages): Set flag as nil if mark is nil. 2003-07-17 Yuuichi Teranishi * elmo.el (elmo-folder-list-message-entities): Define as inline function. (elmo-folder-messages): Abolish. * elmo-multi.el (elmo-folder-check): Call elmo-folder-check for each folder. (elmo-folder-synchronize): Define. (elmo-message-entity): Define. 2003-07-16 Yuuichi Teranishi * elmo-imap4.el (elmo-folder-delete-messages-plugged): Call elmo-imap4-session-select-mailbox. * elmo.el (elmo-folder-move-messages): Don't display any message. * elmo-imap4.el (elmo-imap4-send-command): Accept process output when parsing. (elmo-imap4-session-check): Don't wait CHECK response. (elmo-folder-delete-messages-plugged): Don't wait EXPUNGE response. 2003-07-13 Yuuichi Teranishi * elmo.el (elmo-folder-synchronize): Fixed bug when sync-all. 2003-07-12 Yuuichi Teranishi * elmo-multi.el (elmo-folder-process-crosspost): Follow the change in API. * elmo-nntp.el (elmo-folder-process-crosspost): Ditto. * elmo.el (elmo-folder-process-crosspost): Remove optional argument. (elmo-folder-list-message-entities): Added argument in-msgdb and numbers. (elmo-folder-synchronize): Define as a method. * elmo-nntp.el (elmo-folder-initialize): Don't use elmo-nntp-default-user if zero-length username is specified explicitly. 2003-07-06 Yoichi NAKAYAMA * elmo-nntp.el (elmo-nntp-folder-list-subfolders): Don't omit server name in case with username. (XXX: this is ad-hoc fix against username includes "@", it should be solved fundamentally) 2003-07-05 Yoichi NAKAYAMA * elmo-nntp.el (elmo-nntp-debug): New function. (elmo-nntp-send-command, elmo-nntp-process-filter): Call it. (elmo-network-authenticate-session): Hide auth-info from the log. * elmo-nntp.el (elmo-nntp-folder-list-subfolders): Don't append user name if it is equal to elmo-nntp-default-user. 2003-06-07 Yuuichi Teranishi * elmo-shimbun.el (elmo-shimbun-get-headers): Use shimbun-server instead of shimbun-server-internal; Use shimbun-current-group instead of shimbun-current-group-internal. (elmo-folder-plugged-p): Use shimbun-server instead of shimbun-server-internal. (elmo-folder-set-plugged): Ditto. (elmo-net-port-info): Ditto. (elmo-folder-check): Ditto. (elmo-folder-expand-msgdb-path): Ditto. (elmo-folder-list-subfolders): Ditto. 2003-05-18 Yoichi NAKAYAMA * elmo-msgdb.el (elmo-msgdb-overview-entity-get-extra-field): Convert field-name to lower case. (elmo-msgdb-overview-entity-set-extra-field): Ditto. 2003-05-12 Yoichi NAKAYAMA * acap.el, elmo-imap4.el, elmo-nntp.el, elmo-util.el, pldap.el: `message' and `error' take format string. 2003-04-10 Hiroya Murata * elmo-pipe.el (elmo-folder-clear): Implemented clear copied-list. 2003-04-05 Hiroya Murata * elmo-msgdb.el (elmo-msgdb-message-entity-field): Don't use self recursive call (can't byte compile on emacs 20.7). 2003-04-02 Yuuichi Teranishi * elmo.el (elmo-folder-list-messages): Redefine as a luna method. (elmo-folder-list-message-entities): New API. (elmo-message-entity): Ditto. (elmo-message-entity-parent): Ditto. (elmo-folder-do-each-message-entity): Ditto. (elmo-message-entity-number): Ditto. (elmo-message-entity-field): Ditto. (elmo-message-entity-set-field): Ditto. (elmo-folder-count-flags): Ditto. (elmo-folder-length): Ditto. * elmo-util.el (elmo-get-hash-val): Check whether hashtable is nil or not. * elmo-msgdb.el (elmo-msgdb-list-messages): New function. (elmo-msgdb-count-marks): Abolish. (elmo-msgdb-make-entity): Ditto. (elmo-msgdb-do-each-entity): Ditto. (elmo-msgdb-message-entity): New inline function. (elmo-msgdb-message-entity-field): Ditto. (elmo-msgdb-message-entity-set-field): Ditto. (elmo-msgdb-make-message-entity): New function. 2003-03-25 Yuuichi Teranishi * elmo.el (elmo-folder-append-buffer): Changed argument from unread to flag. (All other related portions are changed.) (elmo-folder-msgdb-create): Likewise. (elmo-generic-folder-append-messages): Use flag-table instead of seen-list. (elmo-folder-move-messages): Removed redundant process. (elmo-folder-synchronize): Likewise. * elmo-msgdb.el (elmo-flag-table-get): New function. (elmo-flag-table-save): Fixed. (elmo-msgdb-length): New inline function. (elmo-msgdb-flag-table): New function. (elmo-msgdb-mark): Add optional argument new. (elmo-msgdb-add-msgs-to-seen-list): Abolish. (elmo-msgdb-seen-list): Ditto. (elmo-msgdb-add-msgs-to-seen-list): Ditto. 2003-03-24 Yuuichi Teranishi * elmo.el (elmo-message-set-mark): Abolish. (elmo-folder-unmark-important): Added optional argument `ignore-flag'. (All related portions are changed.) * elmo-msgdb.el (toplevel): Added comment. (elmo-load-msgdb): Added 4th element `path'. (elmo-msgdb-append): Follow the change above. (elmo-msgdb-clear): Ditto. (elmo-msgdb-delete-msgs): Ditto. (elmo-msgdb-get-path): New inline function. (elmo-msgdb-set-path): Ditto. (elmo-flag-table-filename): New variable. (elmo-flag-table-load): New function. (elmo-flag-table-set): Ditto. (elmo-flag-table-save): Ditto. (elmo-msgdb-get-field-value): Abolish. (elmo-msgdb-overview-get-entity-by-number): Ditto. 2003-03-30 Yoichi NAKAYAMA * elmo.el (elmo-folder-delete): Confirm deletion here, return t if the folder has been deleted successfully. * elmo-imap4.el (elmo-folder-delete): Ditto. * elmo-archive.el (elmo-folder-delete): Ditto. * elmo-localdir.el (elmo-folder-delete): Ditto. * elmo-maildir.el (elmo-folder-delete): Ditto. 2003-03-27 Tetsurou Okazaki * elmo-util.el (elmo-string-member-ignore-case): New function. * elmo-imap4.el (elmo-imap4-response-get-selectable-mailbox-list): Use it. (elmo-imap4-fetch-callback-1-subr): Likewise. 2003-03-27 Kimura Fuyuki * elmo-imap4.el (elmo-imap4-response-get-selectable-mailbox-list): Fix the case of the name attribute "\Noselect". 2003-02-16 Yoichi NAKAYAMA * elmo.el (elmo-folder-rename-internal): New method to cause error. * elmo-localdir.el (elmo-folder-pack-numbers): onum, a member of flist, is not always a member of onum-alist. 2003-02-14 Yoichi NAKAYAMA * elmo-version.el (elmo-version): Up to 2.11.3. 2003-02-10 Yoichi NAKAYAMA * elmo-maildir.el (elmo-folder-rename-internal): New method, copied from localdir's one. * elmo-pipe.el (elmo-folder-rename): New method, rename destination folder with leaving source folder as it is. 2003-02-08 KAMO Tomoyuki * elmo-nntp.el (elmo-nntp-get-folders-info): Don't use replace-regexp. 2003-02-08 Yoichi NAKAYAMA * elmo-version.el (elmo-version): Up to 2.11.2. 2003-02-05 Yoichi NAKAYAMA * elmo-shimbun.el (elmo-folder-initialize): Do not call shimbun-open in case of "@". (elmo-folder-open-internal): Cope with shimbun = nil case. (elmo-folder-plugged-p): Ditto. (elmo-folder-list-subfolders): Make list for "@/" group. 2003-01-31 Yoichi NAKAYAMA * elmo-imap4.el (elmo-folder-expand-msgdb-path): Don't expand mailbox (e.g. for %~/something). 2003-01-31 TAKAHASHI Kaoru * elmo-localdir.el (elmo-folder-rename-internal): Referctoring; Replace nested conditional with guard clauses. 2003-01-30 Yuuichi Teranishi * pldap.el (ldap-search-basic): Don't treat exit status 32 as an error [wl:11327]. * elmo-imap4.el (elmo-folder-msgdb-create-plugged): Bind print-level, print-depth. 2003-01-30 TAKAHASHI Kaoru * elmo-archive.el (elmo-folder-rename-internal): Referctoring; Replace nested conditional with guard clauses. 2003-01-29 Yoichi NAKAYAMA * elmo-util.el (elmo-object-save): Bind print-level, print-length. (elmo-passwd-alist-save): Ditto. * elmo-database.el (elmo-database-msgid-put): Bind print-length. 2003-01-17 Yoichi NAKAYAMA * elmo-localdir.el (elmo-folder-expand-msgdb-path): Expand dir-name only if it is absolute path. (TODO: distinguish +/something and +something) 2003-01-15 Yoichi NAKAYAMA * elmo-localdir.el (elmo-folder-expand-msgdb-path): Correct msgdb path for "+~/something". 2003-01-15 Yoichi NAKAYAMA * elmo-localdir.el (elmo-folder-rename-internal): If new-dir exist as non-directory, cause error before rename-file. * elmo-archive.el (elmo-folder-rename-internal): Create directory apropriately, mimic localdir's one. Based on the patch from KAMO Tomoyuki . 2003-01-10 Tsutomu OKADA * elmo-map.el (elmo-folder-pack-numbers): Fix name of the function. 2003-01-06 Yuuichi Teranishi * elmo-msgdb.el: Moved global mark handling stuffs to elmo-util.el. * elmo-util.el: Moved global mark handling stuffs from elmo-msgdb.el. * elmo-util.el (elmo-file-cache-delete): Check whether the cache file is included in the global-mark or not. 2002-12-23 Yoichi NAKAYAMA * utf7.el (toplevel): Avoid error when the function find-coding-system does not exist. 2002-12-20 Yoichi NAKAYAMA * elmo-nntp.el (elmo-folder-search): Body search is to search from cache even if the folder is plugged. (elmo-nntp-search-primitive): Do nothing when body search is invoked (although it is not used by the change above). * elmo-multi.el (elmo-folder-search): Don't ignore error anymore. 2002-12-20 Kenichi OKADA * elmo-version.el (elmo-version): Up to 2.11.1. 2002-12-10 Kenichi OKADA * elmo-archive.el: Specify charset. 2002-12-04 Yuuichi Teranishi * elmo-pop3.el (elmo-pop3-process-filter): Check whether the pop3 process buffer lives or not. * elmo-dop.el (elmo-dop-queue-flush): Don't append to the dop-queue while flushing queues (It causes infinite loop). 2002-11-26 Yuuichi Teranishi * elmo-imap4.el (elmo-folder-list-subfolders): Fixed last change. 2002-11-24 Yuuichi Teranishi * utf7.el (toplevel): Check the ucs features dynamically. (Advice from Yoichi NAKAYAMA ) * elmo-pipe.el (elmo-folder-creatable-p): Don't check whether the folder is creatabe or not if it already exists. 2002-11-21 Yuuichi Teranishi * elmo-nntp.el (elmo-nntp-search-primitive): Revert the last change. * elmo-multi.el (elmo-folder-search): Ignore errors while search. * elmo-imap4.el (elmo-imap4-response-garbage-p): New macro. (elmo-imap4-read-response): Take care of garbage response. 2002-11-20 Yoichi NAKAYAMA * elmo-nntp.el (elmo-nntp-search-primitive): Fix the last change, just return nil instead of error. 2002-11-19 Yoichi NAKAYAMA * elmo-nntp.el (elmo-nntp-search-primitive): Cause error when the search-key is "body". 2002-11-19 Yuuichi Teranishi * elmo-imap4.el (elmo-folder-list-subfolders): Check the return value of elmo-string-matched-assoc to use match-data. (Thanks to Mito ) 2002-11-17 Yoichi NAKAYAMA * elmo-split.el (elmo-split->): New function. (elmo-split-<): Ditto. 2002-11-14 Yuuichi Teranishi * elmo-msgdb.el (elmo-msgdb-get-message-id-from-buffer): Added workaround for invalid message-id. 2002-11-13 Yuuichi Teranishi * elmo-pop3.el (elmo-pop3-get-session): If if-exists is 'any-exists, return normal pop3 session or pop3 biff session. 2002-11-08 Yuuichi Teranishi * elmo-maildir.el (elmo-maildir-update-current): Don't append info part to the cur files when the new files already have it. (Adviced by Jared Rhine ) 2002-11-06 Yoichi NAKAYAMA * elmo-split.el (elmo-split-default-action): New variable. (elmo-split-subr): Use it if all other conditions are passed. Extend `fname' and rename it as `action'. (implemented Teranishi-san's idea in [wl:10800]) 2002-10-29 Yoichi NAKAYAMA * elmo-imap4.el: Remove Nemacs hack, replace `elmo-read' by `read'. * elmo-util.el: Ditto. 2002-10-28 Yuuichi Teranishi * elmo.el (elmo-message-accessible-p): Renamed from elmo-message-cached-p and rewritten. 2002-10-27 Yuuichi Teranishi * elmo.el (elmo-folder-list-flagged): New generic function. (elmo-folder-list-importants): New implementation. (elmo-folder-list-answereds): Ditto. (elmo-folder-search-fast): Use 'flag' instead of 'mark'; Added 'digest'. (elmo-message-cached-p): New function. (elmo-message-set-flag): Ditto (no content). (elmo-message-unset-flag): Ditto. (elmo-folder-list-messages-mark-match): Abolish. * elmo-util.el (elmo-regexp-opt): New function. * elmo-msgdb.el (elmo-msgdb-get-cached): New function. (elmo-msgdb-match-condition-primitive): Use 'flag' instead of 'mark'; Added 'digest'. (elmo-msgdb-list-flagged): New function. * elmo-imap4.el (elmo-imap4-folder-list-digest-plugged): New function. (elmo-imap4-search-internal-primitive): Use 'flag' instead of 'mark'; Added 'digest'. * elmo-filter.el (elmo-folder-diff): Use 'flag' instead of 'mark'. 2002-10-26 Yuuichi Teranishi * elmo-version.el (elmo-version): Up to 2.11.0. 2002-10-24 Hiroya Murata * elmo-msgdb.el (elmo-msgdb-set-flag): Use `elmo-file-cache-exists-p'; use proper mark that depends on `use-cache'. (elmo-msgdb-unset-flag): Ditto. (elmo-msgdb-set-cached): Ditto. added argument `use-cache'. * elmo.el (elmo-message-set-cached): Call `elmo-msgdb-set-cached' with 4th argument `use-cache'. 2002-10-18 Yuuichi Teranishi * elmo.el (elmo-folder-unmark-important): Follow the changes above. (elmo-folder-mark-as-important): Ditto. (elmo-folder-unmark-read): Ditto. (elmo-folder-mark-as-read): Ditto. (elmo-folder-unmark-answered): Ditto. (elmo-folder-mark-as-answered): Ditto. * elmo-msgdb.el (elmo-msgdb-set-cached): Use the term 'flag' for message status. (elmo-msgdb-mark): Likewise. (elmo-msgdb-set-flag): Renamed from elmo-msgdb-set-status. (elmo-msgdb-unset-flag): Likewise. * elmo.el (elmo-generic-folder-diff): Avoid byte-compile warning. 2002-10-15 Hiroya Murata * elmo-filter.el (elmo-folder-diff): Fixed condition checking `last:' filter. 2002-10-12 Yoichi NAKAYAMA * elmo-dop.el (elmo-folder-status-dop): If spool-folder is absent, set spool-length to 0. 2002-10-06 Hiroya Murata * elmo-dop.el (elmo-dop-queue-flush): Check obsolete at first. (elmo-dop-queue-flush): Fixed last change. 2002-10-01 Hiroya Murata * elmo-filter.el (elmo-folder-list-unreads): Call generic method if require-msgdb slot is nil. (elmo-folder-list-importants): Likewise. 2002-09-26 Hiroya Murata * elmo.el (elmo-message-set-cached): Set mark-modified slot if mark is changed. * elmo-msgdb.el (elmo-msgdb-set-mark): Return t. (elmo-msgdb-set-cached): Undo last change; return non-nil if mark is changed. 2002-09-25 Yuuichi Teranishi * elmo-msgdb.el (elmo-msgdb-set-cached): Set mark-modified slot. 2002-09-24 Yuuichi Teranishi * elmo-msgdb.el (elmo-msgdb-unset-status): Set mark-modified slot. * elmo-multi.el (elmo-folder-close): Set msgdb of children as nil. 2002-09-24 Hiroya Murata * elmo-msgdb.el (elmo-msgdb-set-status): Fixed logic (new to read). (elmo-msgdb-uncached-marks): Added elmo-msgdb-new-mark. 2002-09-24 Yoichi NAKAYAMA * elmo.el: Add autoload setting for elmo-nntp-post, fix against the problem reported by Sean Rima [wl-en:180]. 2002-09-19 Yuuichi Teranishi * elmo-filter.el (elmo-folder-diff): Treat 'mark:' filter. * elmo.el (elmo-folder-unmark-read): Added argument `ignore-flag'. * elmo-filter.el (elmo-folder-unmark-read): Ditto. * elmo-map.el (elmo-folder-unmark-read): Ditto. * elmo-multi.el (elmo-folder-unmark-read): Ditto. * elmo-net.el (elmo-folder-unmark-read): Ditto. * elmo-pipe.el (elmo-folder-unmark-read): Ditto. 2002-09-18 Yuuichi Teranishi * elmo-imap4.el (elmo-imap4-parse-status): Skip white spaces after status number. 2002-09-17 Yuuichi Teranishi * elmo.el (elmo-folder-mark-as-read): Added argument `ignore-flag'. (elmo-folder-mark-as-read): Follow the API change. (elmo-message-set-cached): New function. * elmo-pipe.el (elmo-folder-mark-as-read): Follow the API change. * elmo-nntp.el (elmo-folder-mark-as-read): Set :before qualifier. * elmo-net.el (elmo-folder-unmark-important): Set :before qualifier. (elmo-folder-mark-as-important): Ditto. (elmo-folder-unmark-read): Ditto. (elmo-folder-mark-as-read): Ditto. (elmo-folder-unmark-answered): Ditto. (elmo-folder-mark-as-answered): Ditto. * elmo-multi.el (elmo-folder-mark-as-important): Set :before qualifier. (elmo-folder-unmark-important): Ditto. (elmo-folder-mark-as-read): Ditto. (elmo-folder-unmark-read): Ditto. (elmo-folder-mark-as-answered): Ditto. (elmo-folder-unmark-answered): Ditto. * elmo-mark.el (toplevel): Removed some mark method definitions. * elmo-map.el (elmo-map-folder-unmark-answered): New method. (elmo-map-folder-mark-as-answered): Ditto. (elmo-folder-unmark-important): Add :before qualifier. (elmo-folder-mark-as-important): Ditto. (elmo-folder-unmark-read): Ditto. (elmo-folder-mark-as-read): Ditto. (elmo-folder-unmark-answered): Define. (elmo-folder-mark-as-answered): Ditto. * elmo-maildir.el (elmo-map-folder-mark-as-answered): Define. (elmo-map-folder-unmark-answered): Ditto. * elmo-filter.el (elmo-folder-mark-as-read): Follow the API change. * elmo-net.el (elmo-folder-unmark-important): Added :around qualifier. (elmo-folder-mark-as-important): Ditto. (elmo-folder-unmark-read): Ditto. (elmo-folder-mark-as-read): Ditto. (elmo-folder-unmark-answered): Ditto. (elmo-folder-mark-as-answered): Ditto. * elmo-msgdb.el (elmo-msgdb-match-condition-primitive): Added argument `mark'; evaluate mark condition. (elmo-msgdb-match-condition-internal): New function. (elmo-msgdb-match-condition): Call it; changed argument. * elmo.el (elmo-folder-search): Follow the API change on `elmo-msgdb-match-condition'. 2002-09-17 Hiroya Murata * elmo-filter.el (elmo-folder-msgdb-create): Add to mark-alist if original mark is non-nil. 2002-09-17 Yuuichi Teranishi * elmo-map.el (elmo-map-folder-list-unreads): Define default behavior. (elmo-map-folder-list-answereds): New method. (elmo-folder-list-unreads): Add :around qualifier. (elmo-folder-list-importants): Ditto. (elmo-folder-list-answereds): Ditto. 2002-09-16 Yuuichi Teranishi * elmo-msgdb.el (elmo-msgdb-mark): New inline function. * elmo-filter.el (elmo-folder-msgdb-create): Call target-folder's method if msgdb is not required. (elmo-filter-folder-list-importants): Don't treat global-mark. * elmo.el (elmo-folder-list-importants): Ditto. * elmo-net.el (elmo-folder-list-importants): Ditto. * elmo-map.el (elmo-folder-list-importants): Ditto. * elmo-msgdb.el (elmo-msgdb-seen-list): Use `elmo-msgdb-unread-marks' * elmo-imap4.el (elmo-imap4-fetch-callback-1-subr): Set answered mark. (elmo-imap4-folder-list-any-plugged): New function. (elmo-imap4-search-internal-primitive): Use it. * elmo-filter.el (elmo-folder-check): Synchronize original folder only when require-msgdb slot is non-nil. (elmo-folder-close): Clear target folder's msgdb. 2002-09-13 Yuuichi Teranishi * elmo-pop3.el (elmo-folder-msgdb-create): Follow the API change. (elmo-pop3-msgdb-create-by-header): Ditto. (elmo-pop3-msgdb-create-message): Ditto. * elmo-shimbun.el (elmo-folder-msgdb-create): Ditto. * elmo-sendlog.el (elmo-folder-msgdb-create): Ditto. * elmo-nmz.el (elmo-folder-msgdb-create): Ditto. * elmo-nntp.el (elmo-nntp-create-msgdb-from-overview-string): Ditto. (elmo-folder-msgdb-create): Ditto. (elmo-nntp-folder-msgdb-create): Ditto. (elmo-nntp-msgdb-create-by-header): Ditto. (elmo-nntp-msgdb-create-message): Ditto. (elmo-folder-list-unreads): Define. * elmo-pipe.el (elmo-folder-msgdb-create): Ditto. (elmo-folder-append-messages): Ditto. (elmo-folder-list-unreads): Define. (elmo-folder-list-importants): Ditto. (elmo-folder-list-answereds): Ditto. * elmo-net.el (elmo-folder-list-unreads): Define. (elmo-folder-list-importants): Ditto. (elmo-folder-list-answereds): Ditto. (elmo-folder-list-answereds-plugged): Ditto. (elmo-folder-msgdb-create): Follow the API change. (elmo-folder-msgdb-create-unplugged): Ditto. (elmo-folder-unmark-answered): Define. (elmo-folder-mark-as-answered-unplugged): Ditto. (elmo-folder-unmark-answered-unplugged): Ditto. * elmo-msgdb.el (elmo-msgdb-new-mark): New user option. (elmo-msgdb-unread-uncached-mark): Ditto. (elmo-msgdb-unread-cached-mark): Ditto. (elmo-msgdb-read-uncached-mark): Ditto. (elmo-msgdb-answered-cached-mark): Ditto. (elmo-msgdb-answered-uncached-mark): Ditto. (elmo-msgdb-important-mark): Ditto. (elmo-msgdb-set-mark): Rewrite. (elmo-msgdb-count-marks): Rewrite. (elmo-msgdb-mark-alist-set): Abolish. (elmo-msgdb-seen-list): Removed argument `seen-marks'. (elmo-msgdb-add-msgs-to-seen-list): Likewise. * elmo-multi.el (elmo-folder-check): Call elmo-folder-synchronize. (elmo-folder-close): Define. (elmo-folder-msgdb-create): Follow the API change. (elmo-folder-list-unreads): Rewrite. (elmo-folder-mark-as-important): Ditto. (elmo-folder-unmark-important): Ditto. (elmo-folder-mark-as-read): Ditto. (elmo-folder-unmark-read): Ditto. (elmo-folder-mark-as-answered): Define. (elmo-folder-unmark-answered): Ditto. * elmo-localdir.el (elmo-folder-msgdb-create): Follow the API change. (elmo-folder-append-messages): Ditto. * elmo-mark.el (elmo-folder-msgdb-create): Ditto. * elmo-map.el (elmo-folder-list-unreads): Ditto. (elmo-folder-list-importants): Ditto. * elmo-maildir.el (elmo-folder-msgdb-create): Ditto. (elmo-folder-append-messages): Ditto. * elmo-imap4.el (elmo-imap4-fetch-callback-1-subr): Follow the API change. (elmo-folder-msgdb-create-plugged): Ditto. (elmo-folder-append-messages): Ditto. (elmo-folder-list-answereds-plugged): Define. (elmo-imap4-search-internal-primitive): Add `mark' processing. (elmo-folder-unmark-answered-plugged): Define. (elmo-folder-mark-as-answered-plugged): Ditto. (elmo-folder-search-requires-msgdb-p): Ditto. * elmo-filter.el (elmo-filter-folder): Added new slot 'require-msgdb'. (elmo-folder-initialize): Set it. (elmo-folder-msgdb): Define. (elmo-folder-check): Call elmo-folder-synchronize. (elmo-folder-close): Define. (elmo-folder-commit): Ditto. (elmo-folder-msgdb-create): Rewrite. (elmo-folder-list-unreads): Ditto. (elmo-folder-list-importants): Ditto. (elmo-folder-mark-as-read): Ditto. (elmo-folder-unmark-read): Ditto. (elmo-folder-mark-as-important): Ditto. (elmo-folder-unmark-important): Ditto. (elmo-folder-mark-as-answered): Define. (elmo-folder-unmark-answered): Ditto. * elmo-dop.el (elmo-dop-queue-merge-method-list): Added elmo-folder-mark-as-answered, elmo-folder-unmark-answered. (elmo-dop-queue-method-name-alist): Likewise. (elmo-folder-mark-as-answered-dop): New inline function. (elmo-folder-unmark-answered-dop): Ditto. (elmo-folder-status-dop): Treat spool-length as 0 if it does not exist. * elmo-archive.el (elmo-folder-append-messages): Follow the API change. (elmo-folder-msgdb-create): Ditto. (elmo-archive-msgdb-create-as-numlist-subr1): Ditto. (elmo-archive-msgdb-create-as-numlist-subr2): Ditto. (elmo-archive-parse-mmdf): Ditto. * elmo-cache.el (elmo-folder-msgdb-create): Ditto. (elmo-folder-list-unreads-internal): Ditto. * elmo.el (elmo-folder-msgdb): Define as generic function. (elmo-folder-list-messages): Added argument `in-msgdb'. (elmo-folder-list-unreads): Define as generic function. (elmo-folder-list-importants): Ditto. (elmo-folder-list-answereds): Ditto. (elmo-folder-list-messages-with-global-mark): New function. (elmo-folder-msgdb-create): Removed mark arguments. (elmo-folder-unmark-answered): New generic function. (elmo-folder-mark-as-answered): Ditto. (elmo-folder-append-messages): Removed argunment `unread-marks' (elmo-folder-list-unreads-internal): Abolish. (elmo-folder-list-importants-internal): Ditto. (elmo-folder-search-requires-msgdb-p): New generic function. (elmo-folder-search-requires-msgdb-p-internal): New function. (elmo-generic-folder-open): Call elmo-folder-msgdb instead of elmo-msgdb-load. (elmo-folder-search-fast): Added key 'mark'. (elmo-generic-folder-append-messages): Use elmo-msgdb-unread-marks instead of unread-marks argument. (elmo-folder-move-messages): Removed argunment `unread-marks' (elmo-folder-unmark-important): Define. (elmo-folder-mark-as-important): Ditto. (elmo-folder-unmark-read): Ditto. (elmo-folder-mark-as-read): Ditto. (elmo-folder-unmark-answered): Ditto. (elmo-folder-mark-as-answered): Ditto. (elmo-folder-replace-marks): Abolish. (elmo-generic-folder-append-msgdb): Append msgdb before checking duplicates. (elmo-folder-synchronize): Removed mark arguments; return crosspost only number. 2002-09-12 Yoichi NAKAYAMA * elmo-dop.el (elmo-dop-queue-flush): Remove unused argument. Remove redundunt connectivity check. 2002-09-08 Yoichi NAKAYAMA * elmo-dop.el (elmo-dop-queue-flush): Perform plugged ones only so as not to clear queue unexpectedly. (Ref. [wl:9778],[wl:10493]) 2002-09-03 Yuuichi Teranishi * pldap.el (ldap-decode-string): Return string as-is if `ldap-coding-system' is nil. (ldap-encode-string): Ditto. (ldap-search-entries): Encode filter string with `ldap-encode-string'. (ldap-default-host): Fixed docstring. 2002-08-21 Yuuichi Teranishi * elmo-util.el (elmo-warning): Define as a macro which uses `display-warning' if it is defined as a function. * elmo-split.el (elmo-split-fetch-decoded-field): New function. (elmo-split-equal): Use it. (elmo-split-match): Ditto. (elmo-split-message-entity): New buffer-local variable. (elmo-split-subr): Set it. * elmo-version.el (elmo-version): Up to 2.9.15. 2002-08-18 Kenichi OKADA * elmo-imap4.el (elmo-network-initialize-session): Check capability after starttls. 2002-08-06 Yuuichi Teranishi * elmo-util.el (elmo-list-delete): Added optional argument DELETE-FUNCTION. * elmo-vars.el (elmo-imap4-default-mailbox): Abolished. * elmo-util.el (elmo-warning): Ignore errors while recenter. * elmo-msgdb.el (elmo-msgdb-do-each-entity): New macro. * elmo-imap4.el (elmo-folder-initialize): Don't use elmo-imap4-default-mailbox. 2002-07-24 TAKAHASHI Kaoru * elmo-split.el (toplevel): Use `product-provide'. (elmo-split): Checkdoc. 2002-07-21 Tetsurou Okazaki * elmo-imap4.el (elmo-imap4-debug, elmo-imap4-debug-1): Split `elmo-imap4-debug' into the macro `elmo-imap4-debug' and the function `elmo-imap4-debug-1'. 2002-07-14 Hiroya Murata * elmo-split.el (elmo-split): Moved to run hooks and to show message from elmo-split-subr. (elmo-split-subr): Follow the change above. * elmo-split.el (elmo-split-subr): New function (renamed from elmo-split-subr). (elmo-split): Changed to call elmo-split-subr by element of elmo-split-folder. (elmo-split-folder): Changed customization type to choice. 2002-07-12 Hiroya Murata * elmo-split.el (elmo-split-and): Fixed condition. 2002-07-12 Yuuichi Teranishi * elmo-split.el: New file. (elmo-split): Fixed logic. Display "Test:" instead of "Folder:" when reharsal. * elmo-imap4.el (elmo-folder-append-buffer): Set flag as empty explicitly. * elmo-version.el (elmo-version): Up to 2.9.14. * elmo-util.el (elmo-expand-newtext): New function (renamed from wl-expand-newtext). 2002-06-10 Kenichi Sato * elmo-msgdb.el (elmo-msgdb-get-message-id-from-buffer): Fix for message with no message-id field. 2002-05-20 Yuuichi Teranishi * elmo-version.el (elmo-version): Up to 2.9.13. * elmo-dop.el (elmo-folder-status-dop): Fix. 2002-05-19 Yuuichi Teranishi * elmo-util.el (elmo-disk-usage): Return 0 if invalid file attribute. * elmo-msgdb.el (elmo-msgdb-create-overview-from-buffer): Avoid changing default value of default-mime-charset. (elmo-msgdb-create-overview-from-buffer): Remove TAB character. * elmo-imap4.el (elmo-folder-open): Fixed NO response check. * elmo-dop.el (elmo-dop-queue-merge-method-list): New variable. (elmo-dop-queue-merge): Use elmo-dop-queue-merge-method-list instead of elmo-dop-queue-method-name-alist to check merging queue. (elmo-folder-delete-messages-dop): Delete from queue if negative message number. (elmo-folder-append-buffer-dop-delayed): Treat as success if queue file is already removed. 2002-05-10 Katsumi Yamaoka * elmo-vars.el: Bind colon keywords for old Emacsen. 2002-05-10 Hiroya Murata * elmo-msgdb.el (elmo-msgdb-create-overview-from-buffer): Protect against non-exsisting charset. 2002-05-09 Yuuichi Teranishi * elmo-util.el (elmo-mime-string): Eliminate needless binding; Use eword-decode-and-unfold-unstructured-field-body. * elmo-msgdb.el (elmo-msgdb-make-entity): New function. (elmo-msgdb-create-overview-from-buffer): Use document charset if exists to decode raw subject string. (toplevel): Require 'mime. * elmo-version.el (elmo-version): Up to 2.9.12. 2002-05-02 Yuuichi Teranishi * elmo-msgdb.el (elmo-msgdb-get-mark): Fix docstring. (elmo-msgdb-set-mark): Ditto. * elmo-version.el (elmo-version): Up to 2.9.11. 2002-05-01 Yuuichi Teranishi * elmo-util.el (elmo-delete-match-files): New function. * elmo-localdir.el (elmo-folder-delete): Use elmo-delete-match-files instead of elmo-delete-directory. * elmo-shimbun.el (elmo-shimbun-get-headers): Bind elmo-hash-minimun-size as 63. * elmo-multi.el (elmo-multi-folder-diff): Use elmo-diff-new if elmo-diff-unread is nil. * elmo-imap4.el (elmo-folder-open): Fix. * elmo.el (elmo-message-mark): Rewrite. (elmo-message-field): Ditto. (elmo-message-set-mark): Ditto. (elmo-folder-replace-marks): New function. (elmo-generic-folder-append-msgdb): Removed third argument for elmo-msgdb-append. (elmo-folder-synchronize): Use elmo-msgdb-seen-list. (elmo-msgdb-load): New implementation. * elmo-vars.el (elmo-use-overview-hashtb): Removed. * elmo-util.el (elmo-list-insert): New implementation. * elmo-multi.el (elmo-multi-folder-append-msgdb): Removed third argument for elmo-msgdb-append. * elmo-msgdb.el (elmo-load-msgdb): New function. (elmo-make-msgdb): Ditto. (elmo-msgdb-get-index): New inline function. (elmo-msgdb-set-index): Ditto. (elmo-msgdb-get-entity-hashtb): Ditto. (elmo-msgdb-get-mark-hashtb): Ditto. (elmo-msgdb-get-mark): Ditto. (elmo-msgdb-set-mark): Ditto. (elmo-msgdb-count-marks): Ditto. (elmo-msgdb-get-number): Ditto. (elmo-msgdb-get-field): Ditto. (elmo-msgdb-seen-list): Ditto. (elmo-msgdb-mark-alist-set): Renamed from elmo-msgdb-mark-set. (elmo-msgdb-delete-msgs): Follow the changes above. (elmo-msgdb-overview-get-entity): Ditto. (elmo-msgdb-add-msgs-to-seen-list): Ditto. (elmo-msgdb-clear-index): Renamed from elmo-msgdb-clear-overview-hastb and rewritten. (elmo-msgdb-make-index): Likewise. (elmo-msgdb-append): Removed third argument. (elmo-msgdb-clear): Clear index as nil. (elmo-folder-set-info-hashtb): Removed. (elmo-folder-set-info-max-by-numdb): Ditto. (elmo-folder-info-make-hashtb): Ditto. * elmo-localdir.el (elmo-folder-pack-numbers): Use elmo-make-msgdb. * elmo-map.el (elmo-folder-pack-number): Ditto. 2002-04-30 Yuuichi Teranishi * elmo-version.el (elmo-version): Up to 2.9.10. * elmo-util.el (elmo-get-hash-val): Check the 1st argument is string. * elmo-msgdb.el (elmo-msgdb-get-parent-entity): New inline function. 2002-04-26 Kenichi OKADA * elmo-utils.el (elmo-make-directory): Add option. Default file mode is 700. 2002-04-17 Hiroya Murata * elmo-shimbun.el (elmo-folder-local-p): Defined. 2002-04-15 Yuuichi Teranishi * elmo-shimbun.el (elmo-shimbun-entity-to-header): Decode by mime-charset. * elmo-imap4.el (elmo-imap4-search-internal-primitive): Added "larger" and "smaller". 2002-04-14 Hiroya Murata * elmo-shimbun.el (elomo-shimbun-folder): Added entity-hash slot. (elmo-shimbun-folder-entity-hash): New function. (elmo-shimbun-folder-shimbun-header): Ditto. (elmo-shimbun-entity-to-header): Ditto. (elmo-shimbun-msgdb-to-headers): Removed. (elmo-shimbun-folder-setup): Ditto. (elmo-shimbun-folder-header-hash-setup): Don't use x-shimbun-id for hash key. (elmo-shimbun-get-headers): Set new headers only to slot. Don't call `elmo-shimbun-folder-header-hash-setup' if headers is nil. Removed useless local bind. (elmo-folder-open-internal): Don't call `elmo-shimbun-folder-setup'. (elmo-folder-close-internal): Clear entity-hash slot. (elmo-folder-clear): Ditto. (elmo-shimbun-msgdb-create-entity): Use `elmo-shimbun-folder-shimbun-header'. (elmo-map-message-fetch): Ditto. (elmo-shimbun-update-overview): Use overview entity instead of shimbun header to lookup id by references. (elmo-map-folder-list-message-locations): Use not only headers but also overviews to list locations. 2002-04-09 Hiroya Murata * elmo-net.el (elmo-folder-exists-p): If unplugged, guessed by msgdb path. * elmo-pop3.el (elmo-folder-exists-p): Ditto. 2002-04-08 Yoichi NAKAYAMA * elmo-util.el (elmo-read-search-condition-internal): Give default value for date. 2002-04-04 Mito * elmo-util.el (elmo-condition-parse-search-value): Accept YYYY-MM-DD format to search. * elmo-date.el (elmo-date-get-datevec): Likewise. 2002-04-04 Kenichi OKADA * elmo-nntp.el (elmo-nntp-list-folders-get-cache): Delete debugging code. 2002-04-03 Hiroya Murata * elmo.el (elmo-folder-creatable-p): Changed default value to nil from t. * elmo-pop3.el (elmo-folder-exists-p): Return nil if unplugged. * elmo-nntp.el (elmo-folder-exists-p-plugged): Divided plugged case from `elmo-folder-exists-p'. (elmo-folder-exists-p): Removed. (elmo-folder-creatable-p) Ditto. * elmo-net.el (elmo-folder-create): Defined. (elmo-folder-create-unplugged): New function. (elmo-folder-exists-p): Changed default value to nil from t. * elmo-imap4.el (elmo-folder-creatable-p): Defined. (elmo-folder-create-plugged): Renamed from `elmo-folder-create'. * elmo-dop.el (elmo-folder-create-dop): Renamed from `elmo-create-folder-dop' and append queue 'elmo-folder-create-dop-delayed instead of 'elmo-folder-create. (elmo-folder-create-dop-delayed): New function. * elmo-cache.el (elmo-folder-creatable-p): Ditto. * elmo-shimbun.el (elmo-folder-creatable-p): Ditto. * elmo-sendlog.el (elmo-folder-creatable-p): Ditto. (elmo-folder-writable-p) : Ditto. * elmo-version.el (elmo-version): Up to 2.9.9. 2002-03-26 Yoichi NAKAYAMA * elmo.el (elmo-find-fetch-strategy): Don't use file cache when `elmo-message-use-cache-p' returns nil. * elmo-mime.el (elmo-mime-display-as-is): Ditto. (ignore cache file and refer the substance in local folders) 2002-03-12 Yoichi NAKAYAMA * elmo-version.el (elmo-version): Up to 2.9.8. 2002-02-19 Yuuichi Teranishi * elmo-version.el (elmo-version): Up to 2.9.7. * elmo-imap4.el (elmo-folder-list-subfolders): Fixed logic. 2002-02-18 Daiki Ueno * elmo-nntp.el (elmo-nntp-send-mode-reader): Don't throw an error. 2002-02-12 Yuuichi Teranishi * elmo-nmz.el (elmo-nmz-args): Changed default argumnet to --late from --early. (elmo-map-folder-list-message-locations): Reverse location list. 2002-02-01 Kenichi OKADA * elmo-nntp.el (elmo-nntp-list-folders-get-cache): Fix. 2002-01-31 Yuuichi Teranishi * elmo-nntp.el (elmo-nntp-list-folders-get-cache): Use group and server as a key. (elmo-nntp-folder-list-subfolders): Follow the change above. 2002-01-27 Takaaki MORIYAMA * elmo-imap4.el (elmo-folder-list-subfolders): Don't omit user name if authentication type is specified. 2002-01-28 Yuuichi Teranishi * elmo.el (elmo-default-imap4-stream-type): Define as obsolete variable. (elmo-default-nntp-stream-type): Ditto. (elmo-default-pop3-stream-type): Ditto. 2002-01-25 ARISAWA Akihiro * elmo.el (elmo-generic-folder-append-messages): Disable multibyte. 2002-01-23 Yoichi NAKAYAMA * elmo-localnews.el (elmo-localnews-folder-path): Moved from elmo-vars.el. * elmo-maildir.el (elmo-maildir-folder-path): Ditto. * elmo-vars.el (elmo-localnews-folder-path): Removed. (elmo-maildir-folder-path): Ditto. (elmo-maildir-list): Ditto (abolished). 2002-01-23 Kenichi OKADA * elmo-version.el (elmo-version): Up to 2.9.6. 2002-01-22 Yoichi NAKAYAMA * elmo-vars.el (elmo-localnews-folder-path): Make customizable. (elmo-maildir-folder-path): Ditto. (elmo-msgdb-directory): Ditto. (elmo-passwd-life-time): Ditto. (elmo-msgdb-extra-fields): Ditto. (elmo-enable-disconnected-operation): Ditto. 2002-01-22 Kenichi OKADA * elmo-vars.el (elmo-imap4-default-authenticate-type): Give other choices. (elmo-pop3-default-authenticate-type): Ditto. 2002-01-22 Yoichi NAKAYAMA * elmo-vars.el (elmo-imap4-default-authenticate-type): Give choices for custom. (elmo-pop3-default-authenticate-type): Ditto. 2002-01-22 Kenichi OKADA * elmo-imap4.el (elmo-folder-rename-internal): Change current mailbox to new-folder. 2002-01-21 Yuuichi Teranishi * elmo-imap4.el (elmo-imap4-folder-diff-plugged): If unread is less than new, set new as unread. * elmo-util.el (elmo-string): Don't put text-property if nil. 2002-01-21 Kenichi OKADA * elmo-imap4.el (elmo-folder-list-subfolders): Case sensitive. * elmo-nntp.el (elmo-folder-list-subfolders): Ditto. 2002-01-21 Kenichi OKADA * elmo-utils.el (elmo-read-search-condition-internal): REQUIRE-MATCH is nil on `completing-read'. 2002-01-20 Yuuichi Teranishi * elmo-imap4.el (elmo-imap4-extra-namespace-alist): Added grouping for namespace part. (elmo-imap4-parse-namespace-subr): Ditto. (elmo-folder-list-subfolders): Append a delimiter when the specified folder path is a root with namespace and does not end with delimiter. 2002-01-20 Hiroya Murata * elmo.el (elmo-folder-search-fast): Moved upwards rather than it was used. 2002-01-19 Yoichi NAKAYAMA * elmo-util.el (elmo-save-buffer): The first argument of message is a format control string. 2002-01-19 Hiroya Murata * elmo.el (elmo-diff-new): Fixed (Adapted to doc-string of `elmo-folder-diff'). (elmo-diff-unread): Likewise. 2002-01-19 Kenichi OKADA * elmo-utils.el (elmo-read-search-condition-internal): REQUIRE-MATCH is t on `completing-read'. 2002-01-19 Hiroya Murata * elmo-filter.el (elmo-filter-folder-list-unreads-internal): Call method of target folder with self mark-alist if MARK-ALIST is nil. 2002-01-19 Kenichi OKADA * elmo-version.el (elmo-version): Up to 2.9.5. 2002-01-17 Kenichi OKADA * elmo-dop.el (elmo-dop-queue-merge): Implement. (elmo-dop-merge-funcs): Remove. 2002-01-11 Hiroya Murata * elmo-util.el (elmo-file-cache-delete): Fixed last change; Return t if PATH is directory, too. Use `dolist' instead of while loop. 2002-01-11 Yoichi NAKAYAMA * elmo-util.el (elmo-file-cache-delete): Return t if a cache file is deleted. 2002-01-07 Hiroya Murata * elmo-net.el (elmo-folder-list-messages-plugged): Changed default return value to t. (elmo-folder-list-messages-unplugged): Return t if elmo-enable-disconnected-operation is nil. * elmo-pop3.el (elmo-folder-list-messages-plugged): Renamed from `elmo-folder-list-messages-internal'. 2002-01-07 Kenichi OKADA * elmo-nntp.el (elmo-nntp-read-response): Added `error-msg' argument. Change to looking-at `[23][0-9]+'. (elmo-network-initialize-session): Use 'error-msg' * elmo-net.el (elmo-network-open-session): Set unplugged if elmo-network-initialize-session returns 'elmo-open-err. 2002-01-07 Kenichi OKADA * elmo-version.el (elmo-version): Up to 2.9.4. 2002-01-07 Yuuichi Teranishi * elmo-nntp.el (elmo-folder-list-messages-plugged): Renamed from `elmo-folder-list-messages-internal'. 2002-01-06 Hiroya Murata * elmo.el (elmo-folder-search): Defined. Fixed docstring. (elmo-message-match-condition): New method. (elmo-folder-search-fast): New inline function. (elmo-msgdb-search): Removed. * elmo-filter.el (elmo-folder-msgdb-create): Create from msgdb of target folder if it is unplugged. (elmo-folder-list-messages-internal): Return t if target folder is unplugged and itself is persistent; In this case, use list be searched already. * elmo-msgdb.el (elmo-msgdb-search-internal): Removed. (elmo-msgdb-search-internal-primitive): Ditto. (elmo-msgdb-match-condition): New function. (elmo-msgdb-match-condition-primitive): Ditto. * elmo-util.el (elmo-filter-condition-p): New macro. * elmo-cache.el (elmo-folder-search): Removed. * elmo-localdir.el (elmo-folder-search): Ditto. * elmo-maildir.el (elmo-folder-search): Ditto. * elmo-mark.el (elmo-folder-search): Ditto. * elmo-nmz.el (elmo-folder-search): Ditto. * elmo-sendlog.el (elmo-folder-search): Ditto. * elmo-shimbun.el (elmo-folder-search): Ditto. * elmo-imap4.el (elmo-folder-search): Call method of parent class if folder is unplugged. * elmo-nntp.el (elmo-folder-search): Likewise. (elmo-nntp-search-internal): New function. * elmo-version.el (elmo-version): Up to 2.9.3. 2001-12-27 Hiroya Murata * elmo.el (elmo-message-fetch-with-cache-process): Fixed typo. 2001-12-27 Tetsurou Okazaki * elmo-vars.el (elmo-nntp-default-user): Customization Type fix. 2001-12-27 Taiji Can * elmo-nntp.el (elmo-network-initialize-session): Fixed for NNTP response. 2001-12-27 Yuuichi Teranishi * elmo-nmz.el (elmo-nmz-use-drive-letter): New variable. (elmo-map-folder-list-message-locations): Do drive letter conversion on Windows environment. (elmo-nmz-msgdb-create-entity): Use expand-file-name. (elmo-map-message-fetch): Ditto. 2001-12-27 Kenichi OKADA * elmo-nntp.el (elmo-nntp-read-response): Fixed for Response '400' (elmo-network-initialize-session): Ditto. 2001-12-26 Yuuichi Teranishi * elmo-imap4.el (elmo-imap4-message-fetch): Fixed '100%' message. * elmo-pop3.el (elmo-message-fetch-plugged): Ditto. * elmo-util.el (elmo-progress-clear): Ditto. * elmo-date.el (elmo-date-get-datevec): Fix timezone of `DD-Mon-YYYY' type date. 2001-12-26 Hiroya Murata * elmo-util.el (elmo-buffer-field-primitive-condition-match): Use `elmo-date-make-sortable-string' instead of `timezone-make-date-sortable'. * elmo-date.el (elmo-date-make-sortable-string): Use `timezone-make-time-string'. 2001-12-26 Yuuichi Teranishi * elmo.el (elmo-folder-synchronize): Delete important messages too. * elmo-util.el (elmo-buffer-field-primitive-condition-match): Fixed `since'; Fix timezone. * elmo-msgdb.el (elmo-msgdb-search-internal-primitive): Ditto. * elmo-nntp.el (elmo-nntp-search-primitive): Likewise. 2001-12-25 Hiroya Murata * elmo.el (elmo-message-fetch-with-cache-process): Rewrite. 2001-12-23 Hiroya Murata * elmo.el (elmo-generic-folder-append-messages): Make fetch-strategy with `use-cache' as 'maybe. Check return value of `elmo-message-fetch'. (elmo-message-fetch): Return return value of `elmo-message-fetch-with-cache-process'. (elmo-message-fetch-with-cache-process): Return non-nil if fetching was succeed. Load cache when fetching was failed and fetch-strategy-use-cache is 'maybe. * elmo-util.el (elmo-file-cache-load): New function. * elmo-multi.el (elmo-message-use-cache-p): Remove duplicated defun. * elmo-archive.el (elmo-archive-message-fetch-internal): Return non-nil if fetching was succeed. * elmo-imap4.el (elmo-imap4-message-fetch): Likewise. * elmo-nmz.el (elmo-map-message-fetch): Likewise. * elmo-nntp.el (elmo-nntp-read-body): Likewise. (elmo-message-fetch-with-cache-process): Likwise. * elmo-pop3.el (elmo-pop3-read-body): Likewise. * elmo-shimbun.el (elmo-map-message-fetch): Likewise. * elmo-version.el (elmo-version): Up to 2.9.2. 2001-12-23 Yuuichi Teranishi * elmo.el (elmo-folder-delete): Delete msgdb path. * elmo-archive.el (elmo-folder-delete): Added `:before' qualifier. * elmo-maildir.el (elmo-folder-delete): Ditto. * elmo-localdir.el (elmo-folder-delete): Ditto. * elmo-imap4.el (elmo-folder-delete): Ditto. 2001-12-19 Yuuichi Teranishi * elmo.el (luna-define-class): Added `biff' slot. * elmo-pop3.el (elmo-pop3-debug): Split biff log. (elmo-pop3-debug-inhibit-logging): Abolished. (elmo-network-close-session): Eliminated needless let. (elmo-pop3-get-session): Set prefix 'BIFF' if biff folder. (elmo-pop3-send-command): Added `no-log' argument. (elmo-pop3-process-filter): Use `with-current-buffer'. (elmo-pop3-auth-user): Set `no-log' argument; Delete process if login failure. (elmo-pop3-auth-apop): Likewise. (elmo-network-authenticate-session): Likewise. * elmo-nntp.el (elmo-nntp-get-session): Set prefix 'BIFF' if biff folder. * elmo-net.el (elmo-network-session-password-key): Use class symbol string to determine protocol. (elmo-network-session-name-prefix): Abolished. (elmo-network-session-cache-key): Follow the change above. (elmo-network-open-session): Ditto. * elmo-imap4.el (elmo-imap4-send-command): Modified error message. (elmo-imap4-get-session): Set prefix 'BIFF' if biff folder. * elmo-version.el (elmo-version): Up to 2.9.1. * elmo-util.el (elmo-file-field-primitive-condition-match): Fixed unmatch condition checking. * elmo-localdir.el (elmo-folder-search): Don't short cut if unmatch condition. 2001-12-17 Yoichi NAKAYAMA * elmo.el (elmo-folder-confirm-appends): Fixed docstring. 2001-12-17 Yuuichi Teranishi * elmo-imap4.el (elmo-imap4-search-internal-primitive): Fixed test for while loop to execute at least one SEARCH command. 2001-12-15 Yuuichi Teranishi * elmo-version.el (elmo-version): Up to 2.9.0. 2001-12-14 Yuuichi Teranishi * elmo-archive.el (elmo-archive-folder): Added `dir-name' slot. (elmo-archive-folder-path): Define. (elmo-folder-initialize): Setup `dir-name' slot. (elmo-archive-folder-list-subfolders): Fixed problem when `name' is "". Use `dir-name' as prefix of each subfolders. (Applyed patch from Takaaki MORIYAMA ) 2001-12-13 Hiroya Murata * elmo-pipe.el (elmo-pipe-folder-copied-filename): New variable. (elmo-pipe-folder-list-target-messages): New internal function. (elmo-pipe-drain): Use new argument `ignore-list' instead of `killed-list'. (elmo-pipe-folder-copied-list-load): New function. (elmo-pipe-folder-copied-list-save): Ditto. (elmo-folder-open-internal): Follow the change above. (elmo-folder-status): Fixed for copy. 2001-12-13 Yuuichi Teranishi * elmo-shimbun.el (elmo-folder-creatable-p): Define. 2001-12-12 Yuuichi Teranishi * elmo-localdir.el (elmo-folder-message-make-temp-files): Use elmo-copy-file instead of elmo-add-name-to-file. * elmo-nmz.el (elmo-folder-message-make-temp-files): Ditto. * elmo-nmz.el (elmo-map-folder-list-message-locations): Allow "file://..." index. * elmo-pop3.el (elmo-pop3-read-response): Set timeout argument of accept-process-output as 1. (elmo-pop3-read-contents): Ditto. (elmo-pop3-read-body): Ditto. 2001-12-12 TAKAHASHI Kaoru * elmo-version.el (product-version-as-string): Remove define. 2001-12-11 Yuuichi Teranishi * elmo-imap4.el (elmo-imap4-number-set-chop-length): New variable. (elmo-imap4-copy-messages): Chop number set using `elmo-imap4-number-set-chop-length'. (elmo-imap4-set-flag): Ditto. (elmo-imap4-search-internal-primitive): Ditto. 2001-12-11 TAKAHASHI Kaoru * elmo.el (elmo-folder-make-temporary-directory): Renamed from `elmo-folder-make-temp-dir' * elmo-vars.el (elmo-cache-directory): New variable. (elmo-cache-dir): Abolished. (elmo-msgdb-directory): Renamed from `elmo-msgdb-dir'. * elmo-version.el (elmo-version): Up to 2.7.7. 2001-12-11 Yuuichi Teranishi * elmo-util.el (elmo-obsolete-variable-show-warnings): Define with defcustom; Set default value as t. 2001-12-10 Yuuichi Teranishi * pldap.el (ldap-ldif-field-name-regexp): Changed regexp. (ldap-search-program-arguments): Changed default value. (ldap-search-basic): Accept exit status 4. (ldap/field-body): Parse options. (ldap/collect-field): Ditto. (According to the advise from Mito ) * elmo-imap4.el (elmo-imap4-process-bye): New function. (elmo-imap4-send-command): Call elmo-imap4-process-bye. (elmo-imap4-accept-ok): Ditto. (elmo-imap4-session-select-mailbox): If argument `no-error' equals to 'notify-bye, only BYE error is reported. (elmo-folder-exists-p-plugged): Set no-error argument of `elmo-imap4-session-select-mailbox' as 'notify-bye. * elmo.el (elmo-imap4-bye-error): Changed message. * elmo-dop.el (elmo-dop-queue-flush): Fixed obsolete version message. (elmo-dop-queue-flush): Don't append to the dop-queue while flushing queues (It causes infinite loop). 2001-12-10 TAKAHASHI Kaoru * elmo.el (elmo-folder-diff): Fixed docstring for IMAP4 (RECENT UNSEEN MESSAGES) extension. 2001-12-07 Mito * elmo-nntp.el (elmo-nntp-create-msgdb-from-overview-string): Check number of overview fields. 2001-12-08 Yuuichi Teranishi * elmo.el (elmo-folder-confirm-appends): Changed message. (elmo-folder-confirm-appends): Ditto. * elmo-archive.el (elmo-archive-exec-msgs-subr1): Use `with-temp-buffer'. (According to the advise from Nishimoto Masaki ) 2001-12-06 Hiroshi Tsutsui * elmo.el (elmo-folder-confirm-appends): Check whether the value of elmo-folder-update-threshold is nil, which can be set by wl-summary-update-confirm-threshold. 2001-12-05 Yuuichi Teranishi * elmo-nmz.el (elmo-nmz-default-index-path): Allow path list. (elmo-nmz-index-alias-alist): Ditto. (elmo-map-folder-list-message-locations): Follow the change above. 2001-12-02 Hiroya Murata * elmo-filter.el (elmo-folder-list-subfolders): Defined. * elmo-archive.el (elmo-archive-call-process): Ignore nemacs. * elmo-msgdb.el (elmo-msgdb-insert-file-header): Ditto. * elmo-util.el (elmo-read): Ditto. (elmo-display-error): Ditto. * elmo-vars.el (elmo-date-match): Ditto. * pldap.el (ldap-coding-system): Ditto. * elmo-pipe.el (elmo-pipe-drain): If `copy' is non-nil, bind `elmo-inhibit-number-mapping' as nil. 2001-11-30 Tatsuya Kinoshita * elmo-pop3.el (elmo-pop3-parse-list-response): Allow multiple space delimiter for list response. 2001-12-02 Kenichi OKADA * elmo-sendlog.el (elmo-sendlog-buffer-name): Deleted. 2001-12-02 Kenichi OKADA * elmo-sendlog.el (elmo-folder-delete-messages): Added. (elmo-map-message-fetch): Fix. * elmo-map.el (elmo-folder-status): Fix for killed. 2001-12-02 Kenichi OKADA * elmo-sendlog.el: New file. * elmo-internal.el (elmo-internal-folder-list): Added 'sendlog. 2001-11-30 Yuuichi Teranishi * acap.el (acap-logging-out): New buffer local variable. (acap-close): Set it. (acap-wait-for-response): If acap-logging-out is non-nil, don't cause an error. 2001-11-28 Yuuichi Teranishi * acap.el (acap-response-bye-p): New function. (acap-response-bye-message): Ditto. (acap-wait-for-response): If bye response is received, cause an error. (acap-parse-response): Make bye response when 'Bye' is received. 2001-11-23 Kenichi OKADA * elmo-pipe.el (elmo-pipe-drain): Load killed-list. 2001-11-21 Hiroya Murata * elmo-util.el (elmo-copy-file): Added argument `ok-if-already-exists'. (elmo-copy-file): Fixed typo. 2001-11-21 Kenichi OKADA * elmo-pipe.el (elmo-pipe-drain): Load killed-list. 2001-11-21 Kenichi OKADA * elmo-pipe.el (elmo-pipe-drain): Save killed-list. 2001-11-20 Kenichi OKADA * elmo-pipe.el (elmo-pipe-drain): Append copied messages to killed-list. 2001-11-19 Kenichi OKADA * elmo-pipe.el (elmo-pipe-folder): Add `copy'. (elmo-folder-initialize): Fix for `copy'. (elmo-pipe-drain): Ditto. (elmo-folder-open-internal): Ditto. (elmo-folder-newsgroups): Fix. 2001-11-19 Yuuichi Teranishi * elmo-maildir.el (elmo-folder-append-messages): Make temporal filename for each message. * elmo-multi.el (elmo-multi-folder-diff): Fixed problem when recent value is returned from imap folder. * elmo.el (elmo-folder-newsgroups): New generic function. * elmo-localnews.el (elmo-localnews-folder): Added `group' slot. (elmo-folder-initialize): Set it. (elmo-folder-expand-msgdb-path): Use it. (elmo-folder-newsgroups): Define. * elmo-filter.el (elmo-folder-newsgroups): Define. * elmo-pipe.el (elmo-folder-newsgroups): Ditto. * elmo-nntp.el (elmo-folder-newsgroups): Ditto. * elmo-multi.el (elmo-folder-newsgroups): Ditto. 2001-11-10 Hiroya Murata * elmo-shimbun.el (elmo-shimbun-update-overview-folder-list): New user option. (elmo-shimbun-header-extra-field): New inline function. (elmo-shimbun-header-set-extra-field): Ditto. (elmo-shimbun-folder-header-hash-setup): Ditto. (elmo-shimbun-update-overview): Ditto. (elmo-shimbun-msgdb-to-headers): Set extra field `x-shimbun-id'. (elmo-shimbun-folder-setup): Use `elmo-shimbun-folder-header-hash-setup' to be setup hash table. (elmo-shimbun-get-headers): Ditto. (elmo-map-message-fetch): Call `elmo-shimbun-update-overview'; Insert `X-Shimbun-Id:' header if extra field is set. (elmo-map-folder-list-message-locations): Return `x-shimbun-id' field's value instead of `shimbun-header-id'. * elmo-msgdb.el (elmo-msgdb-overview-entity-set-references): New inline function. (elmo-msgdb-overview-entity-set-date): Ditto. (elmo-msgdb-overview-entity-set-extra-field): Ditto. 2001-11-09 Yuuichi Teranishi * mmimap.el (mmimap-entity-section): Changed body node number from "0" to "1". 2001-11-08 Hiroya Murata * elmo-pop3.el (elmo-folder-delete-messages-plugged): Renamed from `elmo-folder-delete-messages'. * elmo-nmz.el (elmo-nmz-index-alias-alist): New user option. (elmo-folder-initialize): Changed to expand alias into index path. * elmo-mime.el (elmo-mime-insert-sorted-header): Call `elmo-mime-insert-header-from-buffer' with 6th arg `sorted-fields'. 2001-11-08 Yuuichi Teranishi * mmimap.el (mmimap-entity-section): If node-id is nil, return "0". * elmo.el (elmo-diff-new): New inline function. (elmo-diff-unread): Ditto. (elmo-diff-all): Ditto. * elmo-imap4.el (elmo-imap4-server-diff-async-callback-1): Get recent value from responseb. (elmo-imap4-folder-diff-plugged): Ditto. (elmo-imap4-server-diff-async): Added recent argument. (elmo-server-diff-async): Ditto. (elmo-imap4-folder-diff-plugged): Ditto. * elmo-version.el (elmo-version): Up to 2.7.6. 2001-11-05 Hiroya Murata * elmo-util.el (elmo-parse-token): Fixed how to treat quoted-pair in quoted-stirng. 2001-11-05 Yuuichi Teranishi * elmo-pop3.el (elmo-folder-initialize): Rewrite. * elmo-imap4.el (elmo-folder-initialize): Ditto. * elmo-nntp.el (elmo-folder-initialize): Ditto. * elmo-multi.el (elmo-folder-initialize): Ditto. * elmo-util.el (elmo-parse-token): New function. (elmo-parse-prefixed-element): Ditto. 2001-11-01 Yuuichi Teranishi * elmo-imap4.el (elmo-imap4-send-command): If BYE response is detected, delete process. (elmo-imap4-accept-ok): Ditto. 2001-10-25 Hiroya Murata * mmimap.el (mime-imap-entity-header-string): Don't check first element of node-id is `0' (Follow last change). 2001-10-24 Hiroya Murata * mmimap.el (mmimap-make-mime-entity): Fixed problem to be assigned irregular node-id to nested multipart section. (initialize-instance): Followed above change. 2001-10-17 Hiroya Murata * elmo-shimbun.el (elmo-shimbun-get-headers): Don't call `shimbun-open-group' (Moved to `elmo-folder-open-internal'). (elmo-folder-open-internal): Call `shimbun-open-group' (Moved from `elmo-shimbun-get-headers'); Call `elmo-shimbun-folder-setup' if headers is empty (An entity of visible article on summary exists in headers). (elmo-map-message-fetch): Cause an error when folder is unplugged. 2001-10-17 Yoichi NAKAYAMA * elmo-shimbun.el (elmo-shimbun-use-cache): Fix typo in the definition. 2001-10-16 Yuuichi Teranishi * elmo-localnews.el (elmo-folder-expand-msgdb-path): Define. 2001-10-13 Hiroya Murata * elmo-msgdb.el (elmo-msgdb-insert-file-header): Moved searching header separator into loop condition. 2001-10-12 Hiroya Murata * elmo-imap4.el (elmo-folder-list-subfolders): Fixed problem; Return duplicate folder if it has subfolder. 2001-10-11 Yuuichi Teranishi * elmo.el (elmo-make-folder): Add folder name error check. * elmo-nntp.el (elmo-nntp-group-coding-system): New variable. (elmo-nntp-encode-group-string): New inline function. (elmo-nntp-decode-group-string): Ditto. (elmo-folder-initialize): Use elmo-nntp-encode-group-string. (elmo-nntp-folder-list-subfolders): Set processing buffer as unibyte; Use `not' instead of `null'; Use elmo-nntp-decode-group-string. * elmo-imap4.el (elmo-folder-list-subfolders): Don't append delimiter. * elmo-version.el (elmo-version): Up to 2.7.5. 2001-10-10 Hiroya Murata * elmo-pipe.el (elmo-pipe-drain): Use `unwind-protect'; Hide progress gauge if `elmo-folder-move-messages' exits nonlocally. 2001-10-09 Yuuichi Teranishi * elmo-imap4.el (elmo-folder-initialize): Use `elmo-imap4-encode-folder-string' for folder name. 2001-10-08 Hiroya Murata * elmo.el (elmo-folder-move-messages): Removed arguments `all' and `done'. 2001-10-06 Hiroya Murata * elmo-util.el (elmo-progress-counter-alist): New internal variable. (elmo-progress-counter-value): New macro. (elmo-progress-counter-all-value): Ditto. (elmo-progress-counter-format): Ditto. (elmo-progress-counter-set-value): Ditto. (elmo-progress-set): New function. (elmo-progress-clear): Ditto. (elmo-progress-notify): Ditto. * elmo-pipe.el (elmo-pipe-drain): Setup and clear progress counter. * elmo.el (elmo-generic-folder-append-messages): Call `elmo-progress-notify'. (elmo-folder-move-messages): Don't call `elmo-display-progress'. * elmo-archive.el (elmo-folder-append-messages): Call `elmo-progress-notify'. * elmo-imap4.el (elmo-folder-append-messages): Ditto. * elmo-localdir.el (elmo-folder-append-messages): Ditto. * elmo-maildir.el (elmo-folder-append-messages): Ditto. 2001-10-03 Yuuichi Teranishi * elmo-dop.el (elmo-dop-queue-method-name-alist): Fixed 'Encache' and 'Create'. (elmo-message-encache-dop): Added argument `read'. * elmo-shimbun.el (elmo-message-encache): Ditto. * elmo-net.el (elmo-message-encache): Ditto. * elmo-imap4.el (elmo-imap4-seen-messages): New buffer local variable. (elmo-imap4-fetch-callback-1-subr): Save important message numbers to elmo-imap4-seen-messages. (elmo-folder-msgdb-create-plugged): Initialize elmo-imap4-seen-messages; Set seen mark on elmo-imap4-seen-messages. * elmo-pipe.el (elmo-folder-message-file-p): Define. * elmo.el (elmo-generic-folder-append-messages): Check return value of elmo-folder-append-buffer. (elmo-folder-encache): Added optional argument `read'. (elmo-message-encache): Ditto. * elmo-dop.el (elmo-folder-append-buffer-dop-delayed): Ditto. * elmo-localdir.el (elmo-folder-append-buffer): Ditto. * elmo-archive.el (elmo-archive-folder-append-buffer): Return t if append buffer content succeds. 2001-10-02 Yuuichi Teranishi * elmo-pop3.el (elmo-message-fetch-plugged): Fixed label for elmo-display-progress. * elmo-mime.el (elmo-mime-message-display): Added argument keymap; Set 4th argument of mime-display-message. (elmo-mime-display-as-is): Ditto. 2001-10-01 Yuuichi Teranishi * elmo-nmz.el (toplevel): Require 'mime-edit. (elmo-nmz-content-type-alist): Abolished. (elmo-nmz-msgdb-create-entity): Add From: and Subject: field if content is not a message. (elmo-map-message-fetch): Changed behavior exept for message content; Detect mime-charset automatically, Use `mime-find-file-type' to detect content-type, Add From: and Subject: field. 2001-09-29 Hiroya Murata * elmo-nmz.el (elmo-nmz-content-type-alist): New variable. (elmo-map-message-fetch): Add `Content-Type' field if contents is not a message. 2001-09-20 Hiroya Murata * elmo.el (elmo-folder-writable-p): Changed default value to nil. (elmo-folder-move-messages): Check `elmo-folder-writable-p'. * elmo-archive.el (elmo-folder-writable-p): Defined. * elmo-cache.el (elmo-folder-writable-p): Ditto. * elmo-filter.el (elmo-folder-writable-p): Ditto. * elmo-imap4.el (elmo-folder-writable-p): Ditto. * elmo-localdir.el (elmo-folder-writable-p): Ditto. * elmo-maildir.el (elmo-folder-writable-p): Ditto. * elmo-mark.el (elmo-folder-writable-p): Ditto. * elmo-pipe.el (elmo-folder-writable-p): Ditto. * elmo-nntp.el (elmo-folder-writable-p): Eliminated. 2001-09-20 Yuuichi Teranishi * elmo-util.el (elmo-address-quote-specials): New function; Renamed from `wl-address-quote-specials'. 2001-09-18 TAKAHASHI Kaoru * elmo-version.el (elmo-version): Up to 2.7.4. 2001-09-14 Yuuichi Teranishi * elmo.el (elmo-quit): Call `elmo-dop-queue-save'. 2001-09-14 Katsumi Yamaoka * acap.el (acap-read-passphrase): Always autoload ange-ftp for both compile-time and run-time to avoid byte-compile warning. 2001-09-13 Kenichi OKADA * elmo-nntp.el (elmo-nntp-post): Fix for `elmo-nntp-default-stream-type'. 2001-09-13 Yuuichi Teranishi * elmo-mime.el (elmo-mime-display-as-is-coding-system): New user option. (elmo-mime-display-as-is-internal): Use it. * acap.el (acap-read-passphrase): Use `ange-ftp-read-passwd' if `read-passwd' is not defined. 2001-09-11 Yuuichi Teranishi * elmo-pop3.el (elmo-pop3-list-location): Sort locations by original number. (elmo-folder-status): Call `elmo-folder-open-internal'; Call `elmo-folder-close-internal' instead of `elmo-folder-close'. (elmo-folder-close-internal): Set location-alist as nil. (elmo-folder-clear): Define. (elmo-folder-check): Don't set location-alist as nil. * elmo-dop.el (elmo-dop-queue-method-name-alist): Fixed symbols. 2001-09-10 Yuuichi Teranishi * elmo-util.el (elmo-msgid-to-cache): Enclose with `save-match-data'. (Pointed out by Akihiro MOTOKI ) * mmimap.el (mime-imap-entity::requested): New slot. (mime-imap-location-fetch-entity-p): New generic function. (mime-decode-parameters): Define using `defun-maybe'. (mmimap-make-mime-entity): Use `make-mime-content-type' to make content-type structure. (mime-entity-body): Return empty body if `mime-imap-location-fetch-entity-p' returns nil in the first request. * elmo.el (elmo-message-displaying): New variable. * elmo-mime.el (elmo-mime-message-display): Bind elmo-message-displaying as t. * elmo-imap4.el (mime-imap-location-fetch-entity-p): Define. 2001-08-31 Yuuichi Teranishi * acap.el (acap-open): erase buffer before starting network process. (acap-store): Rewrite. 2001-08-29 Yuuichi Teranishi * elmo-imap4.el (elmo-imap4-default-mailbox, elmo-imap4-default-server elmo-imap4-default-authenticate-type, elmo-imap4-default-user, elmo-imap4-default-port, elmo-imap4-default-stream-type, elmo-imap4-stream-type-alist): Moved to elmo-vars.el. * elmo-pop3.el (elmo-pop3-default-user, elmo-pop3-default-server, elmo-pop3-default-authenticate-type, elmo-pop3-default-port, elmo-pop3-default-stream-type, elmo-pop3-stream-type-alist): Ditto. * elmo-nntp.el (elmo-nntp-default-server, elmo-nntp-default-user, elmo-nntp-default-port, elmo-nntp-default-stream-type, elmo-nntp-stream-type-alist): Ditto. * elmo-vars.el: Follow changes above. (elmo-setting): New custom group; added 'elmo-setting group to above variables. * elmo-version.el (elmo-version): Up to 2.7.3. * acap.el (acap-parse-response): Don't delete process when BYE response (It causes hang-up on slow network environment). (toplevel): Added comment. 2001-08-28 Yuuichi Teranishi * slp.el (slp-exec-wait): Use `slp-program-arguments'. * acap.el (acap-parse-return-metadata-or-return-metalist): Fix for parsing NIL. (acap-parse-return-metadata): Ditto. * slp.el: New file. (toplevel): Fixed typo. * acap.el: New file. (acap-network-stream-open): Show "Connecting..." message. (acap-parse-response): Fixed problem for BYE untagged response. (acap-open): Changed argument (Use `acap-default-user' if user is nil). (toplevel): Added tiny comments. 2001-08-20 Tatsuya Kinoshita * elmo-pop3.el (elmo-pop3-parse-uidl-response): Allow multiple space delimiter for uidl response. 2001-08-20 Yuuichi Teranishi * elmo-vars.el (elmo-use-semi): Eliminated. * elmo-util.el (elmo-string-assoc-all): New function. 2001-08-16 Hiroya Murata * elmo-mime.el (elmo-mime-display-as-is-internal): Put text property 'mime-preview-situation for `mime-preview-quit'. 2001-08-15 Hiroya Murata * elmo.el (elmo-message-fetch-with-cache-process): Call elmo-message-fetch-internal instead of causing an error when fetch strategy is 'entire but only 'section cache is available. 2001-08-15 Yuuichi Teranishi * elmo-version.el (elmo-version): Up to 2.7.2. * elmo.el (elmo-generic-folder-append-messages): Make fetch-strategy with `use-cache'. * elmo-dop.el (elmo-dop-queue-method-name-alist): New variable. (elmo-dop-queue-method-name): New macro. 2001-08-03 Hiroya Murata * elmo-archive.el (elmo-archive-get-archive-name): Fixed unbalanced parenthesis. 2001-08-03 YAMASHITA Junji * elmo-localdir.el (elmo-folder-rename-internal): Fixed typo. 2001-08-03 Yuuichi Teranishi * elmo-archive.el (elmo-archive-get-archive-name): Fixed logic. (Advised by YAMASHITA Junji .) 2001-08-02 Yuuichi Teranishi * elmo-shimbun.el (elmo-folder-msgdb-create): Bind unbound local variables. 2001-07-30 Yuuichi Teranishi * elmo-shimbun.el (elmo-shimbun-use-cache): New user option. (elmo-message-use-cache-p): Define. (elmo-folder-msgdb-create): Treat cache. 2001-07-28 Kenichi OKADA * elmo-nntp.el (elmo-network-initialize-session): Call `elmo-nntp-send-mode-reader'. (elmo-network-setup-session): Remove `elmo-nntp-send-mode-reader'. 2001-07-26 Yuuichi Teranishi * elmo-shimbun.el (elmo-shimbun-index-range-alist): Changed to regexp alist. (elmo-folder-initialize): Use elmo-string-matched-assoc instead of assoc. * elmo-net.el (elmo-network-get-session): Set stream-type argument for `elmo-plugged-p'. (elmo-open-network-stream): Fixed stream-type argument. 2001-07-25 Yuuichi Teranishi * elmo-archive.el (elmo-archive-get-archive-name): Cause an error when unknown archive type is specified. 2001-07-23 Yuuichi Teranishi * elmo-shimbun.el (elmo-folder-open-internal): Fixed. * elmo.el (elmo-generic-folder-open): Bind inhibit-quit as t while loading msgdb. * elmo-shimbun.el (elmo-shimbun-folder-setup): New function. (elmo-folder-open-internal): Rewrite. 2001-07-17 Yuuichi Teranishi * elmo-mime.el (elmo-mime-display-as-is-internal): Adjust buffer-multibyte status. 2001-07-13 Yuuichi Teranishi * elmo.el (elmo-msgdb-search): Use elmo-condition-in-msgdb-p instead of elmo-condition-find-key. * elmo-util.el (elmo-condition-in-msgdb-p-internal): New function. (elmo-condition-in-msgdb-p): Ditto. (elmo-read-search-condition-internal): Don't set REQUIRE-MATCH argument. 2001-07-12 Yuuichi Teranishi * elmo-pipe.el (elmo-folder-pack-numbers): Define. 2001-07-05 Yuuichi Teranishi * elmo-imap4.el (elmo-imap4-find-next-line): Fixed label for elmo-display-progress. 2001-07-02 Yuuichi Teranishi * elmo.el (elmo-folder-clear): New method. (elmo-folder-clear): Define. (elmo-folder-synchronize): Call `elmo-folder-clear'. * elmo-shimbun.el (elmo-folder-check): Rewrite. (elmo-folder-clear): Define. * elmo-map.el (elmo-folder-clear): Define. * elmo-version.el (elmo-version): Up to 2.7.1. 2001-06-26 Yuuichi Teranishi * elmo.el (elmo-folder-synchronize): Return list of nil when no updates. 2001-06-21 Yuuichi Teranishi * elmo.el (elmo-generic-folder-append-messages): Fixed logic. (Detected by NAKAJIMA Mikio ) 2001-06-20 Yuuichi Teranishi * elmo-util.el (elmo-get-network-stream-type): Moved to elmo-net.el. * elmo-net.el (elmo-get-network-stream-type): Moved from elmo-util.el and re-written. * elmo-imap4.el (elmo-folder-initialize): Use elmo-get-network-stream-type. * elmo-nntp.el (elmo-folder-initialize): Ditto. * elmo-pop3.el (elmo-folder-initialize): Ditto. 2001-06-19 Yuuichi Teranishi * elmo.el (elmo-message-encache): Set unread argument for elmo-message-fetch. * elmo-shimbun.el (elmo-dop): Require 'elmo-dop. * elmo.el (elmo-net-port-info): New method. * elmo-shimbun.el (elmo-net-port-info): Define. (elmo-message-encache): Ditto. * elmo-net.el (elmo-net-port-info): Define as method. * elmo.el (elmo-generic-folder-append-messages): Find cache file in unplugged status when elmo-enable-disconnected-operation is t. * elmo-dop.el (elmo-dop-spool-folder-append-buffer): Check existence of spool folder before checking new number. 2001-06-18 Yuuichi Teranishi * elmo-pop3.el (elmo-network-close-session): Removed 3rd argument. (elmo-network-setup-session): Ditto. (elmo-message-fetch-plugged): Ditto. (elmo-pop3-send-command): Don't call elmo-pop3-lock. (elmo-network-initialize-session): Ditto. (elmo-pop3-read-response): Abolish 3rd argument. (elmo-pop3-read-response): Don't call elmo-pop3-unlock. (elmo-pop3-read-contents): Ditto. (elmo-pop3-read-body): Ditto. (elmo-folder-status): Call elmo-folder-close. (elmo-pop3-lock): Abolish. (elmo-pop3-unlock): Ditto. (elmo-pop3-locked-p): Ditto. (elmo-folder-check): Don't call elmo-pop3-locked-p. 2001-06-15 Yuuichi Teranishi * elmo-version.el (elmo-version): Up to 2.7.0. * elmo-pop3.el (elmo-pop3-debug): New variable. (elmo-pop3-debug-inhibit-logging): Ditto. (elmo-pop3-debug): New function. (elmo-pop3-send-command): Call elmo-pop3-debug. (elmo-pop3-read-response): Added keep-lock optional argument; Don't unlock if keep-lock is non-nil. (elmo-pop3-process-filter): Call elmo-pop3-debug. (elmo-network-authenticate-session): Bind elmo-pop3-debug-inhibit-logging as t. (elmo-network-setup-session): Call elmo-pop3-read-response with keep-lock argument. (elmo-pop3-read-msg): Ditto. (elmo-pop3-locked-p): Call elmo-pop3-debug. (elmo-pop3-read-body): Call elmo-pop3-unlock. (elmo-network-initialize-session): Call elmo-pop3-lock. (elmo-folder-close-internal): Don't clear location-alist slot. (elmo-folder-check): Clear location-alist slot. 2001-06-13 Yuuichi Teranishi * elmo-pop3.el (elmo-pop3-lock): New buffer local variable. (elmo-pop3-send-command): Call elmo-pop3-lock. (elmo-pop3-read-response): Call elmo-pop3-unlock. (elmo-pop3-read-contents): Ditto. (elmo-pop3-lock): New function. (elmo-pop3-unlock): Ditto. (elmo-pop3-locked-p): Ditto. (elmo-folder-check): Don't delete process if elmo-pop3-locked-p returns t. 2001-06-11 Yuuichi Teranishi * elmo-shimbun.el (elmo-shimbun-msgdb-to-headers): Inverted logic. * elmo-util.el (elmo-file-field-primitive-condition-match): New inline function (Don't fetch file content if "first" or "last"). (elmo-file-field-condition-match): Use elmo-file-field-primitive-condition-match. * elmo-localdir.el (elmo-folder-search): Speed up simple "last" and "first". * elmo-pop3.el (elmo-pop3-process-filter): Don't use floor nor float. (elmo-message-fetch-plugged): Fixed. * elmo-imap4.el (elmo-imap4-find-next-line): Ditto. 2001-06-10 Yuuichi Teranishi * elmo.el (elmo-folder-move-messages): Bind elmo-inhibit-display-retrieval-progress as t while moving messages. * elmo-vars.el (elmo-display-retrieval-progress-threshold): New variable. (elmo-inhibit-display-retrieval-progress): Ditto. * elmo-pop3.el (elmo-pop3-process-filter): Use elmo-display-progress for retrieval progress; Don't display progress when total buffer size is smaller than elmo-display-retrieval-progress-threshold. (elmo-message-fetch-plugged): Don't display progress when elmo-inhibit-display-retrieval-progress is non-nil. * elmo-imap4.el (elmo-imap4-find-next-line): Use elmo-display-progress for retrieval progress; Don't display progress when literal size is smaller than elmo-display-retrieval-progress-threshold. (elmo-imap4-message-fetch): Don't display progress when elmo-inhibit-display-retrieval-progress is non-nil. 2001-06-07 Yuuichi Teranishi * elmo-imap4.el (elmo-imap4-display-literal-progress): New variable. (elmo-imap4-find-next-line): Display progress whille literal fetching. (elmo-imap4-message-fetch): Likewise. * elmo-shimbun.el (elmo-shimbun-default-index-range): New user option. (elmo-shimbun-index-range-alist): Ditto. (elmo-shimbun-use-entire-index): Abolish. (shimbun-mua-use-entire-index): Ditto. (elmo-shimbun-folder): Added new slot `range'. (elmo-folder-initialize): Setup slot `range'. 2001-06-06 Yuuichi Teranishi * elmo-shimbun.el (elmo-shimbun-parse-time-string): New function. (elmo-shimbun-msgdb-to-headers): Added `expire-days' argument. (elmo-shimbun-get-headers): Use return value of `shimbun-article-expiration-days'. (elmo-folder-close-internal): Clean up last-check slot. * elmo-pop3.el (elmo-pop3-process-filter): Show retrieve progress. (elmo-pop3-total-size): New variable. (elmo-message-fetch-plugged): Bind elmo-pop3-total-size while fetching. * elmo.el (elmo-folder-reserve-status-p): New method. * elmo-shimbun.el (elmo-shimbun-headers-cache): Abolish. (elmo-shimbun-use-entire-index): New user option. (shimbun-elmo-mua): New class. (shimbun-mua-search-id): Define. (shimbun-mua-use-entire-index): Ditto. (elmo-shimbun-folder:last-check): New slot. (elmo-shimbun-headers-cache-header-list): Abolish. (elmo-shimbun-headers-cache-set-header-list): Ditto. (elmo-shimbun-headers-cache-header-hash): Ditto. (elmo-shimbun-headers-cache-set-header-hash): Ditto. (elmo-shimbun-headers-cache-last-check): Ditto. (elmo-shimbun-headers-cache-set-last-check): Ditto. (elmo-shimbun-headers-check-p): Rewrite. (elmo-shimbun-msgdb-to-headers): New function. (elmo-shimbun-get-headers): Rewrite. (elmo-folder-initialize): Set 1st argument of `shimbun-open'. (elmo-folder-open-internal): Get headers only if `elmo-shimbun-headers-check-p' is non-nil. (elmo-folder-check): Check only if `elmo-shimbun-headers-check-p' is non-nil. (elmo-shimbun-msgdb-create-entity): Re-use old msgdb entities. (elmo-quit): Removed. * elmo-msgdb.el (elmo-msgdb-overview-entity-get-extra): New inline function. (elmo-msgdb-overview-entity-set-extra): Ditto. (elmo-msgdb-make-overview-hashtb): Make hash if overview is non-nil. * elmo-map.el (elmo-folder-status): Don't call elmo-folder-close-internal if `elmo-folder-reserve-status-p' is non-nil. 2001-06-05 Hiroya Murata * elmo-msgdb.el (elmo-msgdb-search-internal): Call itself instead of `elmo-msgdb-search-internal-primitive' when condition's car is `and' or `or'. 2001-05-23 Kenichi OKADA * elmo-nntp.el (elmo-nntp-get-newsgroup-by-msgid): Fix for luna. 2001-05-22 Hiroya Murata * elmo-pipe.el (elmo-folder-open-internal): Check plugged before call `elmo-pipe-drain'. 2001-05-19 Masahiro MURATA * elmo-mark.el (elmo-message-fetch-with-cache-process): Fixed typo. (elmo-cache-folder -> elmo-mark-folder) 2001-05-11 Hiroya Murata * elmo-net.el (elmo-message-fetch-unplugged): Don't call `elmo-message-fetch'. 2001-05-10 Hiroya Murata * elmo-net.el (elmo-message-encache): Fixed typo. (elmo-message-fetch-unplugged): Changed call `elmo-message-fetch-internal' without argument `outbuf'. 2001-05-10 Yuuichi Teranishi * elmo.el (elmo-message-encache): Define as generic function. (elmo-message-fetch-field): New generic function. (elmo-message-fetch-with-cache-process): Cause an error when fetch strategy is 'entire but only 'section cache is available. (toplevel): Fixed nmz folder definition. * elmo-vars.el (elmo-msgdb-lock-list-filename): Removed. (elmo-msgdb-resume-list-filename): Ditto. (elmo-queue-filename): Ditto. (elmo-enable-disconnected-operation): Changed default value to t. * elmo-util.el (elmo-cache-path-section-p): New function. (elmo-file-cache-get): Use it. (elmo-dop-queue-filename): Moved from elmo-dop.el. (elmo-dop-queue-load): Moved from elmo-msgdb.el. (elmo-dop-queue-save): Ditto. * elmo-net.el (elmo-folder-status-unplugged): Call elmo-folder-status-dop. (elmo-folder-list-messages-unplugged): Implemented. (elmo-folder-delete-messages-unplugged): Define. (elmo-folder-msgdb-create): Define. (elmo-folder-msgdb-create-unplugged): Define. (elmo-folder-mark-as-read-unplugged): Ditto. (elmo-folder-unmark-read-unplugged): Ditto. (elmo-folder-mark-as-important-unplugged): Ditto. (elmo-folder-unmark-important-unplugged): Ditto. (elmo-message-encache): Ditto. * elmo-msgdb.el (elmo-dop-queue-load): Moved to elmo-util.el. (elmo-dop-queue-save): Ditto. * elmo-imap4.el (elmo-folder-msgdb-create-plugged): Renamed from `elmo-folder-msgdb-create'. (elmo-folder-append-buffer): Implemented unplugged operation. (elmo-folder-append-messages): Call parent method in unplugged status. (elmo-message-fetch-unplugged): Removed definition. (elmo-message-fetch-field): Implemented. * elmo-dop.el (toplevel): Require 'elmo-localdir. (elmo-dop-folder): Removed variable definition. (elmo-dop-queue-append): Changed argument `fname' to `folder'. (elmo-dop-queue-flush): Implemented. (elmo-dop-queue-merge): Removed definition (TODO). (elmo-dop-spool-folder): New function. (elmo-dop-spool-folder-append-buffer): Ditto. (elmo-dop-spool-folder-list-messages): Ditto. (elmo-dop-list-deleting-messages): Ditto. (elmo-folder-append-buffer-dop): Ditto. (elmo-folder-delete-messages-dop): Ditto. (elmo-message-encache-dop): New inline function. (elmo-create-folder-dop): Ditto. (elmo-folder-mark-as-read-dop): Ditto. (elmo-folder-unmark-read-dop): Ditto. (elmo-folder-mark-as-important-dop): Ditto. (elmo-folder-unmark-important-dop): Ditto. (elmo-folder-status-dop): Fixed. (elmo-folder-append-buffer-dop-delayed): New function. (elmo-folder-delete-messages-dop-delayed): Ditto. (elmo-dop-msgdb): Ditto. 2001-05-10 Hiroya Murata * elmo-localdir.el (elmo-folder-pack-numbers): Fixed. 2001-05-10 Hiroya Murata * elmo.el (elmo-folder-move-messages): Fixed problem when `dst-folder' is 'null. 2001-05-09 Hiroya Murata * elmo.el (elmo-folder-list-importants): Rewirte. Use global mark instead of current mark. * elmo-multi.el (elmo-folder-list-importants-internal): No operation if importants is not list. * elmo-filter.el (elmo-filter-folder-list-importants-internal): Return t if importants is not list. * elmo-map.el (elmo-map-folder-list-importants): Define. (elmo-folder-list-importants-internal): Check return value of `elmo-map-folder-list-importants-internal'. * elmo-cache.el (elmo-folder-list-importants-internal): Eliminated. * elmo-mark.el (elmo-folder-list-importants-internal): Ditto. * elmo-nmz.el (elmo-folder-list-importants-internal): Ditto. * elmo-shimbun.el (elmo-folder-list-importants-internal): Ditto. 2001-05-08 Yuuichi Teranishi * elmo.el (elmo-message-fetch-confirm): Fixed docstring. (Patch is provided by ). 2001-05-08 Hiroya Murata * elmo.el (elmo-folder-synchronize): Don't check important mark in mark folder. 2001-05-08 Hiroya Murata * elmo.el (elmo-message-fetch): Define. (elmo-message-fetch-with-cache-process): New generic method. (elmo-message-fetch-internal): New generic method. (elmo-folder-synchronize): * elmo-archive.el (elmo-message-fetch-internal): Define. (elmo-message-fetch): Eliminated. * elmo-localdir.el (elmo-message-fetch-internal): Define. (elmo-message-fetch): Eliminated. * elmo-map.el (elmo-map-message-fetch): Eliminated optional argument OUTBUF. (elmo-message-fetch-internal): Define (Renamed from `elmo-message-fetch'). * elmo-cache.el (elmo-message-fetch-with-cache-process): Define. (elmo-map-message-fetch): Merged with elmo-cache-folder-map-message-fetch. * elmo-mark.el (elmo-message-fetch-with-cache-process): Define. (elmo-map-message-fetch): Merged with `elmo-mark-folder-map-message-fetch'. * elmo-maildir.el (elmo-map-message-fetch): Rewrite. * elmo-nmz.el (elmo-map-message-fetch): Ditto. * elmo-shimbun.el (elmo-map-message-fetch): Ditto. * elmo-net.el (elmo-message-fetch-plugged): Remove cache process. (elmo-message-fetch-unplugged): New generic method. (elmo-message-fetch-internal): Remove cache process (Renamed from `elmo-message-fetch'). * elmo-nntp.el (elmo-message-fetch-with-cache-process): Define. (elmo-message-fetch): Eliminated. (elmo-message-fetch-unplugged): Ditto. * elmo-imap4.el (elmo-message-fetch-unplugged): Remove cache process. 2001-05-02 Hiroya Murata * elmo-multi.el (elmo-multi-folder-append-msgdb): Fixed structure of `to-be-deleted' from number-alist to number-list. 2001-04-26 Hiroya Murata * elmo-pipe.el (elmo-folder-unmark-important): Fixed typo. (elmo-folder-mark-as-important): Ditto. 2001-04-26 Yuuichi Teranishi * elmo.el (elmo-folder): Added process-duplicates slot. * elmo-pipe.el (elmo-folder-mark-as-read): Define. (elmo-folder-unmark-read): Ditto. (elmo-folder-unmark-important): Ditto. (elmo-folder-mark-as-important): Ditto. * elmo-multi.el (elmo-multi-folder-append-msgdb): Implemented duplicated message processing. * elmo.el (elmo-generic-folder-append-msgdb): Ditto. 2001-04-24 Hiroya Murata * elmo-util.el (elmo-list-subdirectories-1): New function. (elmo-list-subdirectories): Use `elmo-list-subdirectories-1'. (elmo-mapcar-list-of-list): New function. * elmo-archive.el (elmo-archive-folder-list-subfolders): Use `elmo-mapcar-list-of-list' instead of `mapcar'. * elmo-localdir.el (elmo-folder-list-subfolders): Ditto. * elmo-maildir.el (elmo-folder-list-subfolders): Ditto. Bind `elmo-have-link-count'. Return the fully qualified folder name. 2001-04-23 Yuuichi Teranishi * elmo-shimbun.el (elmo-shimbun-check-interval): New user option. (elmo-shimbun-headers-cache): New internal variable. (elmo-shimbun-headers-cache-header-list): New inline function. (elmo-shimbun-headers-cache-set-header-list): Ditto. (elmo-shimbun-headers-cache-header-hash): Ditto. (elmo-shimbun-headers-cache-set-header-hash): Ditto. (elmo-shimbun-headers-cache-last-check): Ditto. (elmo-shimbun-headers-cache-set-last-check): Ditto. (elmo-shimbun-lapse-seconds): Ditto. (elmo-shimbun-headers-cache-check-p): Ditto. (elmo-shimbun-get-headers): New function. (elmo-folder-open-internal): Call it. (elmo-quit): Define (Clear headers-cache). 2001-04-18 Yuuichi Teranishi * elmo-nntp.el (elmo-folder-initialize): Fixed typo (folder->name). * elmo-msgdb.el (elmo-msgdb-flist-load): Use elmo-mime-charset. (elmo-msgdb-flist-save): Ditto. * elmo-shimbun.el (elmo-folder-list-subfolders): Use `shimbun-groups' instead of `shimbun-groups-internal'. (elmo-folder-exists-p): Ditto. * elmo-shimbun.el (elmo-shimbun-msgdb-create-entity): Set `shimbun' argument for `shimbun-header-insert'. 2001-04-17 Yuuichi Teranishi * elmo-multi.el (elmo-multi-folder-diff): Use dummy number list at first time. * elmo-util.el (toplevel): Require 'mcharset and 'pces. (With a little help from 'NAKAJIMA Mikio ') 2001-04-16 Yuuichi Teranishi * elmo-shimbun.el (elmo-folder-open-internal): Do nothing if unplugged. (elmo-folder-plugged-p): Define. (elmo-folder-set-plugged): Ditto. (elmo-shimbun-msgdb-create-entity): Do nothing if there's no header. (elmo-folder-list-messages-internal): Return t if unplugged. (elmo-folder-initialize): Fixed for "@gnome.gnome-1.4-list". * elmo-multi.el (elmo-folder-list-messages-internal): Fixed problem when elmo-folder-list-messages-internal method of children returns t. * elmo-map.el (elmo-map-folder-update-locations): Fixed problem when pair is nil. (elmo-folder-open-internal): Don't update if unplugged status. 2001-04-13 Yuuichi Teranishi * elmo.el (elmo-folder-synchronize): Fixed problem when there's no new message. 2001-04-12 Yuuichi Teranishi * elmo-util.el (elmo-file-cache-save): Ignore errors. * elmo-net.el (elmo-message-fetch): Check cache-path is non-nil before saving. 2001-04-09 Yuuichi Teranishi * elmo.el (elmo-folder-synchronize): Added optional no-check argument. * elmo-shimbun.el (elmo-shimbun-folder): Added headers slot. (elmo-folder-open-internal): Set up headers slot. (elmo-folder-check): Call elmo-folder-close-internal and elmo-folder-open-internal. (elmo-folder-close-internal): Clean up headers slot. 2001-04-07 Masahiro MURATA * elmo-archive.el (elmo-archive-folder-list-subfolders): Match exactly folder list. (elmo-folder-append-messages): Fixed append archive with prefix. * elmo-localdir.el (elmo-folder-message-make-temp-files): Fixed make temp files with start-number. * elmo-pipe.el (elmo-folder-message-make-temp-file-p): Fixed typo. 2001-04-05 Hiroya Murata * elmo.el (elmo-folder-list-messages-internal): Fixed lucking optional argument `visible-only'. (elmo-generic-folder-append-messages): Fixed condition. Use `unless' instead of `if'. * elmo-pop3.el (elmo-folder-open-internal): Check `elmo-inhibit-number-mapping' is non-nil. * elmo-pipe.el (elmo-folder-status): Fixed. 2001-04-05 Yuuichi Teranishi * elmo.el (elmo-dop-queue-flush): Added autload setting. * elmo-shimbun.el (elmo-shimbun-folder): Added `header-hash' slot. (elmo-folder-open-internal): Setup `header-hash' slot. (elmo-shimbun-msgdb-create-entity): Use `header-hash' to get header information. (elmo-map-message-fetch): Ditto. 2001-04-04 Yuuichi Teranishi * shimbun.el, sb-airs.el, sb-asahi.el, sb-bbdb-ml.el, sb-cnet.el, sb-fml.el, sb-lump.el, sb-mew.el, sb-mhonarc.el, sb-netbsd.el, sb-sponichi.el, sb-text.el, sb-wired.el, sb-xemacs.el, sb-yomiuri.el, sb-zdnet.el, sb-tcup.el: Removed. * elmo-util.el (elmo-resque-obsolete-variable): Fix. 2001-04-03 Yuuichi Teranishi * sb-airs.el: Added footer. * shimbun.el (shimbun-article): Define as luna-method. * sb-tcup.el: New file. * sb-airs.el (toplevel): Require 'sb-mhonarc. (According to the report from ABE Yasushi ) 2001-04-02 Yuuichi Teranishi * sb-asahi.el (shimbun-index-url): Removed redundant '/' in URL string. (shimbun-get-headers): Ditto. * elmo.el: Moved obsolete variable definitions from elmo-imap4.el, elmo-nntp.el and elmo-pop3.el. * sb-asahi.el (shimbun-asahi-groups): Deleted "feneral" and "personal" groups. * shimbun.el: New file. * elmo-shimbun.el: New file. * sb-airs.el, sb-asahi.el, sb-bbdb-ml.el, sb-cnet.el, sb-fml.el, sb-lump.el, sb-mew.el, sb-mhonarc.el, sb-netbsd.el, sb-sponichi.el, sb-text.el, sb-wired.el, sb-xemacs.el, sb-yomiuri.el, sb-zdnet.el: New files. 2001-03-27 Kenichi OKADA * elmo-imap4.el (elmo-imap4-list-folders): Fixed problem when hierarchy is t. 2001-03-12 Yuuichi Teranishi * elmo.el (elmo-folder-msgdb): Define as macro. (elmo-folder-open): Added argument `load-msgdb'. (elmo-generic-folder-open): Ditto. (elmo-folder-encache): New function. * elmo-dop.el (elmo-dop-queue): Moved from elmo-dop.el. * elmo-net.el (elmo-message-fetch): Check the cache path is non-nil. * elmo-msgdb.el (elmo-msgdb-delete-msgs): Eliminated argument FOLDER and added argument MSGDB. (elmo-dop-queue-load): Moved from elmo-dop.el. (elmo-dop-queue-save): Ditto. * elmo-map.el (elmo-map-folder-update-locations): Sort by number. * elmo-imap4.el (elmo-folder-open): Added argument load-msgdb. * elmo-filter.el (elmo-filter-folder-list-unreads-internal): Use elmo-folder-msgdb instead of elmo-folder-msgdb-internal. (elmo-filter-folder-list-importants-internal): Ditto. * elmo-map.el (elmo-folder-pack-number): Ditto. * elmo-mime.el (elmo-mime-message-display): Ditto. * elmo.el (elmo-generic-folder-commit): Ditto. (elmo-folder-list-unreads): Ditto. (elmo-folder-list-importants): Ditto. (elmo-generic-folder-commit): Ditto. (elmo-message-set-mark): Ditto. (elmo-generic-folder-append-msgdb): Ditto. (elmo-folder-synchronize): Ditto. (elmo-folder-messages): Ditto. (elmo-init): Call elmo-dop-queue-load. (elmo-folder-list-messages): Ditto. * elmo-nntp.el (elmo-folder-update-number): Ditto. (elmo-nntp-folder-process-crosspost): Ditto. (elmo-folder-list-unreads-internal): Ditto. * elmo-dop.el: Removed old functions. 2001-03-05 Yuuichi Teranishi * elmo-msgdb.el (elmo-msgdb-delete-msgs): Changed argument from `folder' to `msgdb'. 2001-03-01 Yuuichi Teranishi * mmimap.el (mmimap-parse-parameters-from-list): Define as alias for `mime-decode-parameters' instead of `mime-decode-parameter-plist'. * elmo-msgdb.el (elmo-msgdb-search-internal-primitive): Bind case-fold-search. 2001-02-28 Yuuichi Teranishi * elmo-util.el (elmo-resque-obsolete-variable): Use defvaralias if defined. * mmimap.el (toplevel): Require 'mime-parse and 'static. (mmimap-parse-parameters-from-list): Define as alias for `mime-decode-parameter-plist' if it is defined as function. (mmimap-make-mime-entity): Added argument `number'. (initialize-instance): Set `number' argument of mmimap-make-mime-entity as 0. (mime-imap-entity-header-string): Arrange node-id for rfc2060 section. * elmo.el (elmo-folder-have-subfolder-p): New generic function. * elmo-mark.el (elmo-folder-have-subfolder-p): Define. * elmo-internal.el (elmo-folder-list-subfolders): Rewrite. 2001-02-27 Yuuichi Teranishi * elmo-maildir.el (elmo-folder-msgdb-create): Fixed. * elmo-imap4.el (elmo-folder-initialize): Fixed problem when elmo-imap4-default-authenticate-type is nil. (elmo-folder-list-subfolders): Ditto (According to the reported of Bun Mizuhara ) (elmo-imap4-fetch-callback-1-subr): Renamed from `elmo-imap4-fetch-callback-1' and define as inline function. (elmo-imap4-fetch-callback-1): Renamed from `elmo-imap4-fetch-callback'. (elmo-imap4-parse-fetch): Funcall `elmo-imap4-fetch-callback'. * elmo-localdir.el (elmo-folder-expand-msgdb-path): Fixed msgdb path (To keep compatibility with main trunk). * elmo-vars.el (elmo-inhibit-number-mapping): New variable. * elmo-util.el (elmo-make-file-cache): Moved position of some macros. * elmo-pop3.el (elmo-pop3-inhibit-uidl): Eliminated. (elmo-pop3-get-session): Use `elmo-inhibit-number-mapping' instead of `elmo-pop3-inhibit-uidl'. (elmo-folder-exists-p): Ditto. (elmo-pop3-folder-list-messages): Ditto. * elmo-pipe.el (elmo-pipe-drain): Use `elmo-inhibit-number-mapping' instead of `elmo-pop3-inhibit-uidl'. (elmo-folder-status): Ditto. * elmo-dop.el (elmo-dop-folder): New variable. (elmo-dop-lock-message): Eliminated. (elmo-dop-unlock-message): Ditto. (elmo-dop-lock-list-load): Ditto. (elmo-dop-lock-list-save): Ditto. (elmo-dop-delete-folder): Ditto. (elmo-dop-rename-folder): Ditto. * elmo.el: Removed incomplete commentary. 2001-02-25 TAKAHASHI Kaoru * elmo.el (toplevel): Require 'elmo-version first; for little `recursive-load-depth' settings. Fix "ends here" comment. 2001-02-23 Yuuichi Teranishi * elmo-util.el (toplevel): Require 'poem; Some functions are moved from elmo-cache.el. * elmo-net.el (toplevel): Require 'elmo-cache. * elmo-msgdb.el (toplevel): Don't require 'elmo-cache. * elmo.el (toplevel): Ditto. * elmo-cache.el: Rewrite with luna; Some functions are moved to elmo-util.el. * elmo-internal.el (elmo-internal-folder-list): New variable. (elmo-internal-folder-initialize): Rewrite. (elmo-folder-list-subfolders): Ditto. * elmo-cache.el (elmo-cache-search-all): Eliminated. (elmo-cache-collect-sub-directories): Ditto. 2001-02-22 Yuuichi Teranishi * elmo-version.el (elmo-version): Up to 2.5.8. * elmo.el (elmo-folder-list-messages-mark-match): New function. * elmo-util.el (elmo-list-insert): New function. 2001-02-21 Yuuichi Teranishi * elmo.el (elmo-init): New function. (elmo-quit): Call `elmo-crosspost-message-alist-save'. * elmo-vars.el (elmo-msgdb-file-header-chop-length): New variable (Renamed from `elmo-localdir-header-chop-length'). * elmo-pop3.el (elmo-pop3-use-cache, elmo-pop3-send-command-synchronously): Moved from `elmo-vars.el'. * elmo-nntp.el (elmo-message-fetch): Define. (elmo-message-fetch-unplugged): Ditto. (elmo-nntp-overview-fetch-chop-length): Moved from `elmo-vars.el'. (elmo-nntp-use-cache): Ditto. (elmo-nntp-max-number-precedes-list-active): Ditto. * elmo-multi.el (elmo-multi-divide-number): Moved from `elmo-vars.el'. * elmo-msgdb.el (elmo-localdir-insert-header): Renamed to `elmo-msgdb-insert-file-header'. Use `elmo-msgdb-file-header-chop-length'. * elmo-localdir.el (elmo-localdir-lockfile-list): Moved from `elmo-vars.el'. * elmo-cache.el (elmo-cache-insert-header): Eliminated. (elmo-cache-msgdb-create-overview-entity-from-file): Use `elmo-msgdb-insert-file-header'. * elmo-imap4.el, elmo-nntp.el, elmo-pop3.el: Use new variable; Define obsolete variables with `elmo-define-obsolete-variable', * elmo-util.el (elmo-warning-buffer-name): New constant. (elmo-warning): New function. (elmo-obsolete-variable-alist): New variable. (elmo-obsolete-variable-show-warnings): New variable. (elmo-define-obsolete-variable): New function. (elmo-resque-obsolete-variable): Ditto. (elmo-resque-obsolete-variables): Ditto. 2001-02-20 Yuuichi Teranishi * elmo-vars.el (elmo-use-buffer-cache, elmo-buffer-cache-size): Eliminated. * elmo-pop3.el, elmo-nntp.el: Use custom. 2000-02-20 Kenichi OKADA * elmo-imap4.el (elmo-network-authenticate-session): Fix. * elmo-pop3.el (elmo-network-authenticate-session): Add comments. 2001-02-20 Yuuichi Teranishi * Luna-fy Kenichi OKADA's following changes. * elmo.el (elmo-folder-list-messages-internal): Added optional argument `nohide'. (elmo-folder-synchronize): Changed meaning of argument `ignore-msgdb'. 2001-02-21 OKAZAKI Tetsurou * elmo-util.el (elmo-display-progress): Prefer `progress-feedback-with-label' to `lprogress-display'. 2000-02-20 Kenichi OKADA * elmo-imap4.el (elmo-imap4-list-folder): Added 'uid' 2000-02-19 Kenichi OKADA * elmo2.el (elmo-list-folder): Added optional argument `nohide'. * elmo-imap4.el (elmo-imap4-list-folder): Added optional argument `nohide'. * elmo-pop3.el (elmo-pop3-list-folder): Ditto. * elmo-nntp.el (elmo-nntp-list-folder): Ditto. * elmo-localdir.el (elmo-localdir-list-folder): Ditto. * elmo-localnews.el (elmo-localnews-list-folder): Ditto. * elmo-archive.el (elmo-archive-list-folder): Ditto. * elmo-filter.el (elmo-filter-list-folder): Ditto. * elmo-internal.el (elmo-internal-list-folder): Ditto. * elmo-pipe.el (elmo-pipe-list-folder): Ditto. * elmo-multi.el (elmo-multi-list-folder): Ditto. * elmo-maildir.el (elmo-maildir-list-folder): Ditto. * elmo-dop.el (elmo-dop-list-folder): Ditto. 2000-02-17 Kenichi OKADA * elmo-msgdb.el (elmo-msgdb-max-of-killed): New function. * elmo-imap4.el (elmo-imap4-list-folder): Use killed-list. 2001-02-20 Yuuichi Teranishi * elmo.el (elmo-folder-process-crosspost): New generic method. (elmo-folder-writable-p): Ditto. (elmo-folder-message-appendable-p): Eliminated. (elmo-generic-folder-append-msgdb): Rewrite. (elmo-newsgroups-hashtb): New internal variable. (elmo-crosspost-message-set): Eliminated. (elmo-crosspost-message-delete): Ditto. (elmo-setup-subscribed-newsgroups): New function. (elmo-crosspost-message-alist-modified): New internal variable. (elmo-crosspost-message-alist-load): New function (Renamed from `wl-crosspost-alist-load'). (elmo-crosspost-message-alist-save): Ditto (Renamed from `wl-crosspost-alist-save'). * elmo-util.el (elmo-parse): New function (Renamed from `wl-parse'). * elmo-nntp.el (elmo-nntp-folder): New slots `temp-crosses' and `unreads'. (elmo-nntp-groups-hashtb): Eliminated (Renamed to elmo-newsgroups-hashtb). (elmo-nntp-message-fetch): Call `elmo-nntp-setup-crosspost-buffer', `elmo-nntp-folder-update-crosspost-message-alist'. (elmo-nntp-get-folders-info): Use `elmo-newsgroups-hashtb' instead of `elmo-nntp-groups-hashtb'. (elmo-nntp-make-groups-hashtb): Eliminated. (elmo-nntp-parse-newsgroups): New function (Renamed from `wl-parse-newsgroups'). (elmo-folder-creatable-p, elmo-folder-writable-p, elmo-folder-close-internal, elmo-folder-mark-as-read, elmo-folder-process-crosspost, elmo-folder-list-unreads-internal): Define. (elmo-nntp-folder-update-crosspost-message-alist): New function. * elmo-net.el (elmo-message-fetch): Check buffer size. * elmo-multi.el (elmo-multi-split-number-alist): New function. * elmo-localdir.el (elmo-folder-append-buffer): Fixed logic. * elmo-imap4.el (elmo-folder-rename-internal): Send `select' command before `close' command. * elmo.el (elmo-folder-list-unreads-internal): Added argument `mark-alist' (All other related portions are changed). 2001-02-13 Yuuichi Teranishi * elmo-util.el (elmo-create-hash-size): Eliminated. (elmo-make-hash) Make a hash with `one less than a power of two' length. * elmo-vars.el (elmo-hash-minimum-size): New variable. (elmo-hash-maximum-size): Changed value. 2001-02-09 Yuuichi Teranishi * elmo-mime.el (elmo-mime-message-display): Added argument `unread'. (elmo-mime-message-display-as-is): Ditto. 2001-02-07 Yuuichi Teranishi * elmo-pipe.el (elmo-pipe-drain): Eliminated needless bindings; Use `elmo-folder-close-internal' instead of `elmo-folder-close'. 2001-02-06 Yuuichi Teranishi * elmo-mark.el: New file. * elmo-internal.el: Rewrite (Almost empty). 2001-02-05 Yuuichi Teranishi * mmimap.el (mmimap-make-mime-entity): Consider message/rfc822. (mime-imap-entity-header-string): Ditto. (mmimap-entity-section): Rewrite. 2001-01-30 Yuuichi Teranishi * elmo-nmz.el: New file. * elmo-pipe.el: Rewrite with luna. 2001-01-29 Yuuichi Teranishi * elmo-archive.el: Rewrite with luna. * elmo-multi.el (elmo-folder-list-unreads-internal): Fixed. (elmo-folder-list-importants-internal): Ditto. 2001-01-24 Yuuichi Teranishi * elmo-archive.el (elmo-archive-version): Abolish. (toplevel) Removed `boso' comment. 2001-01-23 Yuuichi Teranishi * elmo-msgdb.el (elmo-msgdb-add-msgs-to-seen-list): Renamed from elmo-msgdb-add-msgs-to-seen-list-subr; Changed argument seen-marks to unread-marks. * elmo-nntp.el: Rewrite with luna. 2001-01-22 Yuuichi Teranishi * elmo-filter.el: Rewrite with luna. 2001-01-18 Yuuichi Teranishi * elmo-pop3.el: Rewrite with luna. 2001-01-17 Yuuichi Teranishi * elmo-multi.el: Rewrite with luna. * elmo-vars.el (elmo-use-killed-list): Abolish. All other related portions are changed. (elmo-filename-replace-string-alist): Renamed from elmo-msgid-replace-string-alist. 2001-01-16 Yuuichi Teranishi * elmo-msgdb.el (elmo-msgdb-delete-msgs): Changed argument. * elmo-map.el: New file. * elmo-maildir.el: Rewrite with luna. 2001-01-14 Yuuichi Teranishi * elmo.el: Changed meaning of `elmo-folder-commit'. * elmo-mime.el (elmo-mime-display-as-is-internal): New function. 2001-01-07 Yuuichi Teranishi * elmo.el (elmo-folder-append-buffer): New function. (Renamed from `elmo-append-msg') 2000-12-18 Yuuichi Teranishi * elmo-mime.el: New file. 2000-12-14 Yuuichi Teranishi * elmo-cache.el: Rewrite. 2000-02-17 Kenichi OKADA * elmo-pop3.el (elmo-network-authenticate-session): Bind `sasl-mechanisms' 2000-12-08 Yuuichi Teranishi * elmo-vars.el (elmo): New group. (elmo-strict-diff-folder-regexp): New variable. * elmo-util.el (elmo-call-func): Abolish. (elmo-folder-get-type): Ditto. (elmo-*-get-spec): Ditto. (elmo-*-spec-*): Ditto. (elmo-imap4-identical-name-space-p): Ditto. (elmo-folder-identical-system-p): Ditto. (elmo-folder-direct-copy-alist): Ditto. (elmo-folder-direct-copy-p): Ditto. * elmo-pipe.el (elmo-pipe-folder): New luna class. (elmo-folder-initialize): Define. (elmo-folder-get-primitive-list): Ditto. * elmo-nntp.el (elmo-nntp-folder): New luna class. (elmo-folder-initialize): Define. Renamed `elmo-network-session-host-internal' to `elmo-network-session-server-internal'. * elmo-multi.el (elmo-multi-folder): New luna class. (elmo-folder-initialize): Define. (elmo-folder-get-primitive-list): Ditto. (elmo-folder-contains-type): Ditto. (elmo-message-use-cache-p): Ditto. * elmo-msgdb.el (elmo-msgdb-expand-path): Abolish. Use `elmo-folder-msgdb-path' instead of `elmo-msgdb-expand-path'. * elmo-maildir.el (elmo-maildir-folder): New luna class. (elmo-folder-initialize): Define. * elmo-filter.el (elmo-filter-folder): New luna class. (elmo-folder-initialize): Define. (elmo-folder-get-primitive-list): Ditto. (elmo-folder-contains-type): Ditto. 2000-12-06 Yuuichi Teranishi * elmo-imap4.el: Rewrite with luna. * mmimap.el: New file. * mmelmo.el, mmelmo-imap4.el: Removed. * elmo-net.el: Ditto. * elmo-pop3.el (elmo-pop3-folder): New luna class. (elmo-folder-initialize): Define. * elmo-archive.el (elmo-archive-folder): New luna class. (elmo-folder-initialize): Define. * elmo-dop.el: Rename `elmo-msgdb-expand-path' to `elmo-folder-msgdb-path'. (elmo-dop-queue-append): Use `elmo-folder-name-internal' and `elmo-make-folder'. 2000-12-06 Yuuichi Teranishi * elmo.el: New file. * elmo2.el: Renamed to elmo.el. 2001-02-01 OKAZAKI Tetsurou * elmo-cache.el (elmo-cache-expire-by-size): Count a disk usage for a cache file entry in KB even when its kind is a directory. 2001-02-01 Yuuichi Teranishi * elmo-version.el (elmo-version): Up to 2.5.7. 2001-01-23 TAKAHASHI Kaoru * elmo-version.el (elmo-version): Up to 2.5.6. 2001-01-18 Yuuichi Teranishi * elmo-version.el (elmo-version): Up to 2.5.5. 2000-12-22 Yuuichi Teranishi * elmo-imap4.el (elmo-network-authenticate-session): Fixed a logic for response checking. 2000-12-15 Daiki Ueno * elmo-net.el: Add autoload settings for `starttls-negotiate', `sasl-find-mechanism', `sasl-make-client', `sasl-mechanism-name', `sasl-next-step', `sasl-step-data' and `sasl-step-set-data'; bind `sasl-mechanisms'. * elmo-imap4.el: Don't require `sasl'; remove autoload settings for `starttls-open-stream' and `starttls-negotiate'. * elmo-nntp.el: Remove autoload settings for `starttls-open-stream' and `starttls-negotiate'. * elmo-pop3.el: Don't require `sasl'; remove autoload settings for `starttls-open-stream' and `starttls-negotiate'; don't enclose `luna-define-class' with `eval-and-compile'. 2000-12-01 Kenichi OKADA * elmo-util.el (elmo-read-search-condition-internal): Require an element of table for searching field. 2000-11-30 Yuuichi Teranishi * elmo-version.el (elmo-version): Up to 2.5.4. 2000-11-26 Kenichi OKADA * elmo-nntp.el (elmo-network-initialize-session): Accept response 20[01]. 2000-11-24 Kenichi OKADA * elmo-nntp.el (elmo-network-initialize-session): omitted. 2000-11-22 Kenichi OKADA * elmo-nntp.el (elmo-network-initialize-session): Skip garbage output before greeting. 2000-11-28 Yuuichi Teranishi * elmo-imap4.el (elmo-imap4-delete-folder): Send "close" before "delete" (Use commented out line). (elmo-imap4-rename-folder): Ditto. * elmo-dop.el (elmo-dop-queue-append): Use `elmo-string' to get folder string itself. (elmo-dop-list-deleted): New function. (elmo-dop-list-folder): Treat result of `elmo-dop-list-deleted' as killed. * elmo-util.el (elmo-string-rassoc-all): New function. 2000-11-22 Yuuichi Teranishi * elmo-version.el (elmo-version): Up to 2.5.3. * elmo-net.el (elmo-network-get-session): Changed logic for checking process status. * elmo-pop3.el (elmo-network-close-session): Do nothing if session process is nil; Changed logic for checking process status. 2000-11-20 Yuuichi Teranishi * elmo-pop3.el (elmo-network-initialize-session): Skip garbage output before greeting. (elmo-network-setup-session): Set UIDL hash size according to the length of list response. (elmo-pop3-parse-list-response): Setup elmo-pop3-size-hash according to the length of list response; Return the length of list response. (Adviced by OKAZAKI Tetsurou ) 2000-11-21 Kenichi OKADA * elmo-imap4.el (toplevel): Require 'ssl. Add autoload 'starttls. * elmo-pop3.el (toplevel): Ditto. * elmo-nntp.el (toplevel): Ditto. 2000-11-20 Kenichi OKADA * elmo-imap4.el (toplevel): defun at compile time. sasl-find-mechanism, sasl-make-client, sasl-mechanism-name, sasl-next-step, sasl-step-data, sasl-step-set-data. * elmo-pop3.el (toplevel): Ditto. 2000-11-20 Kenichi OKADA * elmo-imap4.el (elmo-network-authenticate-session): Use `elmo-imap4-login' 2000-11-20 Kenichi OKADA * elmo-pop3.el (elmo-pop3-auth-apop): Signal `elmo-pop-auth-apop' if error. (elmo-network-authenticate-session): Use `elmo-pop-auth-user' and `elmo-pop-auth-apop'. 2000-11-20 Kenichi OKADA * elmo-pop3.el (elmo-network-authenticate-session): Fix for `APOP'. 2000-11-20 Kenichi OKADA * elmo-pop3.el (elmo-network-authenticate-session): Split encoded response value. 2000-11-20 Kenichi OKADA * elmo-pop3.el (elmo-network-authenticate-session): Abolish `elmo-pop3-force-login'. Redefine `sasl-mechanisms'. * elmo-vars.el (elmo-pop3-force-login): Ditto. 2000-11-20 Kenichi OKADA * elmo-imap4.el (toplevel): Delete defun-maybe for sasl-*. Delete `elmo-imap4-authenticator-alist'. (elmo-imap4-auth-cram-md5): Delete. (elmo-imap4-auth-digest-md5): Delete. 2000-11-20 Kenichi OKADA * elmo-pop3.el (elmo-pop3-auth-digest-md5): Delete. (elmo-pop3-auth-scram-md5): Ditto. (elmo-pop3-auth-cram-md5): Ditto. 2000-11-19 Kenichi OKADA * elmo-pop3.el (toplevel): Delete defun-maybe for sasl-*. Delete `elmo-pop3-authenticator-alist'. 2000-11-19 Kenichi OKADA * elmo-pop3.el (elmo-network-authenticate-session): Rewrite for new SASL API. * elmo-imap4.el (elmo-network-authenticate-session): Ditto. 2001-01-30 Yuuichi Teranishi * elmo-util.el (elmo-folder-local-p): Treat pipe and filter. 2001-01-19 Yuuichi Teranishi * elmo-pop3.el (elmo-pop3-sort-overview-by-original-number): Fixed problem when `elmo-pop3-use-uidl' is nil. (Reported by Takenobu Sugiyama ) 2000-11-19 Kenichi OKADA * elmo-version.el (elmo-version): Up to 2.5.2. 2001-01-16 Yuuichi Teranishi * elmo-pop3.el (elmo-pop3-sort-overview-by-original-number): New function. (elmo-pop3-sort-msgdb-by-original-number): Ditto. (elmo-pop3-msgdb-create-as-numlist): Use it. * elmo-imap4.el (elmo-imap4-arrival-filter): Check process-buffer. (Based on the report by AMAKAWA Shuhei ) * elmo-pop3.el (elmo-pop3-msgdb-create-as-numlist): Sort msgdb by date. (Pointed out by Mikiya Tani ) 2001-01-13 Takaaki MORIYAMA * elmo2.el (elmo-make-folder-numbers-list): Fixed problem when elmo-mark-as-read is called with second argument nil. 2001-01-12 Yuuichi Teranishi * elmo-pipe.el (elmo-pipe-spec-src, elmo-pipe-spec-dst): Moved to elmo-util.el. * elmo-util.el (elmo-pipe-spec-src, elmo-pipe-spec-dst): Moved from elmo-pipe.el * elmo-archive.el (elmo-archive-call-process): Enclose with static-if. * elmo-imap4.el (elmo-imap4-read-msg): Use "BODY[]" instead of "RFC822" (because RFC822.PEEK is obsolete). (Adviced by IMAI Takeshi ) 2001-01-10 Katsumi Yamaoka * elmo-archive.el (elmo-archive-call-process): Don't check for the exit status when Nemacs is running. 2001-01-09 Yuuichi Teranishi * elmo-net.el (elmo-network-session-password-key): Don't set default to 'plain. * elmo-util.el (elmo-imap4-get-spec): Set default of auth to 'clear. (elmo-pop3-get-spec): Set default of auth to 'user. * elmo-imap4.el (elmo-imap4-session-check): Clear `elmo-imap4-fetch-callback' and `elmo-imap4-fetch-callback-data'. (elmo-imap4-clear-login): New function; Renamed from `elmo-imap4-login'. (elmo-imap4-auth-login): New function; Revival. (elmo-network-authenticate-session): Use `elmo-imap4-clear-login' and `elmo-imap4-auth-login'. 2000-12-29 TAKAHASHI Kaoru * elmo2.el (toplevel): Move `product-provide' declare. * mmelmo.el (toplevel): Ditto. 2000-12-26 Yuuichi Teranishi * elmo-util.el (elmo-folder-get-store-type): Rewrite. 2000-12-26 OKAZAKI Tetsurou * elmo-util.el (elmo-folder-get-store-type): New function. (elmo-folder-direct-copy-p): Use it. 2000-12-26 Yuuichi Teranishi * elmo-imap4.el (elmo-imap4-msgdb-create): Set `elmo-imap4-fetch-callback-data' as a cons cell of `args' and result of `elmo-imap4-use-flag-p'. (elmo-imap4-fetch-callback-1): Set mark according to the result of `elmo-imap4-use-flag-p'. 2000-12-22 Yuuichi Teranishi * elmo-msgdb.el (elmo-generic-folder-diff): Moved from elmo2.el (elmo-generic-list-folder-unread): Ditto. (elmo-folder-get-info): Ditto. (elmo-folder-set-info-max-by-numdb): Ditto. (elmo-folder-get-info-max): Ditto. (elmo-folder-get-info-length): Ditto. (elmo-folder-get-info-unread): Ditto. (elmo-folder-info-make-hashtb): Ditto. * elmo2.el: Removed above functions. 2000-11-21 Kenichi OKADA * elmo-imap4.el (toplevel): Require 'ssl. Add autoload 'starttls. * elmo-pop3.el (toplevel): Ditto. * elmo-nntp.el (toplevel): Ditto. 2000-11-20 Kenichi OKADA * elmo-imap4.el (toplevel): defun at compile time. sasl-find-mechanism, sasl-make-client, sasl-mechanism-name, sasl-next-step, sasl-step-data, sasl-step-set-data. * elmo-pop3.el (toplevel): Ditto. 2000-11-20 Kenichi OKADA * elmo-imap4.el (elmo-network-authenticate-session): Use `elmo-imap4-login' 2000-11-20 Kenichi OKADA * elmo-pop3.el (elmo-pop3-auth-apop): Signal `elmo-pop-auth-apop' if error. (elmo-network-authenticate-session): Use `elmo-pop-auth-user' and `elmo-pop-auth-apop'. 2000-11-20 Kenichi OKADA * elmo-pop3.el (elmo-network-authenticate-session): Fix for `APOP'. 2000-11-20 Kenichi OKADA * elmo-pop3.el (elmo-network-authenticate-session): Split encoded response value. 2000-11-20 Kenichi OKADA * elmo-pop3.el (elmo-network-authenticate-session): Abolish `elmo-pop3-force-login'. Redefine `sasl-mechanisms'. * elmo-vars.el (elmo-pop3-force-login): Ditto. 2000-11-20 Kenichi OKADA * elmo-imap4.el (toplevel): Delete defun-maybe for sasl-*. Delete `elmo-imap4-authenticator-alist'. (elmo-imap4-auth-cram-md5): Delete. (elmo-imap4-auth-digest-md5): Delete. 2000-11-20 Kenichi OKADA * elmo-pop3.el (elmo-pop3-auth-digest-md5): Delete. (elmo-pop3-auth-scram-md5): Ditto. (elmo-pop3-auth-cram-md5): Ditto. 2000-11-19 Kenichi OKADA * elmo-pop3.el (toplevel): Delete defun-maybe for sasl-*. Delete `elmo-pop3-authenticator-alist'. 2000-11-19 Kenichi OKADA * elmo-pop3.el (elmo-network-authenticate-session): Rewrite for new SASL API. * elmo-imap4.el (elmo-network-authenticate-session): Ditto. 2000-12-18 Yuuichi Teranishi * elmo-nntp.el (elmo-nntp-get-folders-info): Fixed last change. 2000-12-01 Yuuichi Teranishi * elmo-nntp.el (elmo-nntp-get-folders-info): Fixed problem when '\' character is contained in user-id. (Reported by Yoichiro Okabe ) 2000-11-28 Yuuichi Teranishi * elmo-imap4.el (elmo-imap4-delete-folder): Send "close" before "delete" (Use commented out line). (elmo-imap4-rename-folder): Ditto. * elmo-dop.el (elmo-dop-queue-append): Use `elmo-string' to get folder string itself. (elmo-dop-list-deleted): New function. (elmo-dop-list-folder): Treat result of `elmo-dop-list-deleted' as killed. * elmo-util.el (elmo-string-rassoc-all): New function. * elmo-version.el (elmo-version): Up to 2.5.1. 2000-11-13 Yuuichi Teranishi * elmo-pop3.el (elmo-pop3-folder-exists-p): Don't use UIDL. * elmo-internal.el (elmo-internal-search): Fix last change. 2000-11-08 Yuuichi Teranishi * elmo-internal.el (elmo-internal-search): Rewrite. (Fixed problem which is pointed out by Akihiro MOTOKI ) * elmo-version.el (elmo-version): Up to 2.5.0. 2000-11-06 Kenichi OKADA * elmo-imap4.el (elmo-imap4-list-folders): Append authenticate-type. 2000-11-06 Kenichi OKADA * elmo-imap4.el (elmo-imap4-list-folders): When hierarchy is non-nil, make hierarchy. 2000-11-05 OKAZAKI Tetsurou * elmo-pipe.el (elmo-pipe-drain): When calling `elmo-list-folder', `elmo-pop3-use-uidl' must be bound to nil. (Pointed out by Hiroya Murata ) 2000-11-02 Yuuichi Teranishi * elmo-util.el (elmo-copy-file): Don't cause an error after `add-name-to-file' failed. * elmo-pipe.el (elmo-pipe-drain): List folder before loading msgdb. (Fix by HIROSE Yuuji ) 2000-11-01 TAKAHASHI Kaoru * elmo-version.el (elmo-version): Up to 2.3.93. 2000-11-01 Yuuichi Teranishi * elmo-util.el (elmo-flatten): New function. 2000-10-31 TAKAHASHI Kaoru * elmo-archive.el (toplevel): Added (C) to copyright notice, and sync Author header. * elmo-cache.el (toplevel): Ditto. * elmo-database.el (toplevel): Ditto. * elmo-date.el (toplevel): Ditto. * elmo-dop.el (toplevel): Ditto. * elmo-filter.el (toplevel): Ditto. * elmo-imap4.el (toplevel): Ditto. * elmo-internal.el (toplevel): Ditto. * elmo-localdir.el (toplevel): Ditto. * elmo-localnews.el (toplevel): Ditto. * elmo-maildir.el (toplevel): Ditto. * elmo-msgdb.el (toplevel): Ditto. * elmo-multi.el (toplevel): Ditto. * elmo-net.el (toplevel): Ditto. * elmo-nntp.el (toplevel): Ditto. * elmo-pipe.el (toplevel): Ditto. * elmo-pop3.el (toplevel): Ditto. * elmo-util.el (toplevel): Ditto. * elmo-vars.el (toplevel): Ditto. * elmo2.el (toplevel): Ditto. * mmelmo-imap4.el (toplevel): Ditto. * mmelmo.el (toplevel): Ditto. * elmo-version.el (elmo-version): Move to top. * elmo-cache.el (toplevel): Fixed multiple Author header format. * elmo-imap4.el (toplevel): Ditto. * elmo-localdir.el (toplevel): Ditto. * elmo-msgdb.el (toplevel): Ditto. * elmo-nntp.el (toplevel): Ditto. * elmo-pop3.el (toplevel): Ditto. * elmo-version.el (toplevel): Ditto. * elmo-localnews.el (toplevel): Added Keyword header. 2000-10-31 Yuuichi Teranishi * elmo-version.el (product-version-as-string): Defined using `defun-maybe'. (toplevel): Use it. * elmo-localdir.el (toplevel): Updated copyright notice. * elmo-version.el (toplevel): Ditto. * elmo-msgdb.el (toplevel): Ditto. * elmo-imap4.el (toplevel): Ditto. * elmo-nntp.el (toplevel): Ditto. * elmo-pop3.el (toplevel): Ditto. 2000-10-30 Yuuichi Teranishi * elmo-pipe.el (elmo-pipe-drain): Don't save msgdb after moving messages. * mmelmo.el (mime-parse-parameters-from-list): Don't downcase parameter value (It sometimes contains raw kanji). 2000-10-28 Kenichi OKADA * elmo-imap4.el (elmo-network-initialize-session): Check capability. * elmo-pop3.el (elmo-network-initialize-session): Ditto. 2000-10-28 Kenichi OKADA * elmo-imap4.el (elmo-network-initialize-session): Fix. 2000-10-28 Kenichi OKADA * elmo-imap4.el (elmo-network-initialize-session): Change error message. * elmo-pop3.el (elmo-network-initialize-session): Change error message. 2000-10-27 Yuuichi Teranishi * elmo-imap4.el (elmo-imap4-session-select-mailbox): Return response value if selecting folder succceeded. (Advised by MII Kazuyoshi for prom-wl.) 2000-10-26 TAKAHASHI Kaoru * elmo-util.el (elmo-make-directory): Fixed permission lateral representation. * elmo-util.el (elmo-string-matched-member): New function. 2000-10-26 Yuuichi Teranishi * elmo-util.el (elmo-unintern): New macro. (elmo-number-set-member): Fixed docstring. * elmo-imap4.el (elmo-imap4-parse-response): Call `elmo-unintern' for tag token. 2000-10-25 OKAZAKI Tetsurou * elmo-imap4.el (elmo-imap4-client-eol): Remove duplicated defvar of `elmo-imap4-status' and `elmo-imap4-reached-tag'. 2000-10-24 Yuuichi Teranishi * elmo-imap4.el (elmo-imap4-session-select-mailbox): Added argument `no-error'. Added docstring. Return non-nil if selecting folder succeeded. (elmo-imap4-folder-exists-p): Call with argument 'no-error. 2000-10-23 Yuuichi Teranishi * elmo-maildir.el (elmo-maildir-get-filename): Fixed problem when `file-name-completion' returns t. (Reported by Yoichi NAKAYAMA ) (elmo-maildir-set-mark): Put `info' part to the files in the cur directory if it does not exist. (elmo-maildir-update-current): Use `while' instead of `mapcar' for iteration. 2000-10-20 Yuuichi Teranishi * elmo-imap4.el (elmo-imap4-folder-exists-p): Removed `condition-case' enclosure (It's harmful in unplugged status). * elmo-pop3.el (elmo-pop3-folder-exists-p): Ditto. * mmelmo-1.el: Removed. * mmelmo-2.el: Ditto. * mmelmo-imap4-1.el: Ditto. * mmelmo-imap4-2.el: Ditto. * mmelmo-imap4.el: Merged mmelmo-imap4-2.el * mmelmo.el: Merged mmelmo-2.el. * elmo-version.el (elmo-version): Up to 2.3.92. 2000-10-19 TAKAHASHI Kaoru * elmo2.el (elmo-move-msgs, elmo-msgdb-load, elmo-msgdb-save, elmo-update-number): Remove last period in "...done." message. * elmo-archive.el (elmo-archive-msgdb-create-as-numlist-subr1): Ditto. * elmo-cache.el (elmo-cache-expire-by-size, elmo-cache-get-sorted-cache-file-list, elmo-cache-msgdb-create-as-numlist): Ditto. * elmo-dop.el (elmo-dop-save-pending-messages, (elmo-dop-flush-pending-append-operations): Ditto. * elmo-imap4.el (elmo-imap4-msgdb-create): Ditto. * elmo-internal.el (elmo-internal-msgdb-create): Ditto. * elmo-localdir.el (elmo-localdir-msgdb-create-as-numlist, (elmo-localdir-pack-number): Ditto. * elmo-maildir.el (elmo-maildir-msgdb-create): Ditto. * elmo-msgdb.el (elmo-msgdb-sort-by-date): Ditto. * mmelmo-imap4-2.el (mmelmo-imap4-mime-entity-buffer, mime-write-entity-content): Ditto. * pldap.el (ldap-search-basic): Ditto. 2000-10-18 Yuuichi Teranishi * elmo-version.el (elmo-version): Up to 2.3.91. * elmo-filter.el (elmo-filter-folder-diff): Use target folder's diff Only when filter is 'last'. * elmo-util.el (elmo-condition-atom-regexp): New constant. (elmo-condition-parse-search-value): Use it. (elmo-read-search-condition-internal): Quote value only when it is not an atom. 2000-10-18 Kenichi OKADA * elmo2.el (elmo-generic-folder-diff): Fix. 2000-10-17 Kenichi OKADA * elmo-msgdb.el (elmo-msgdb-killed-list-length): New function. * elmo-localdir.el (elmo-localdir-list-folder-subr): Fix. * elmo-maildir.el (elmo-maildir-list-folder-subr): Fix. * elmo-archive.el (elmo-archive-list-folder-subr): Fix. * elmo-internal.el (elmo-internal-list-folder-subr): Fix. * elmo-imap4.el (elmo-imap4-max-of-folder): Fix. 2000-10-17 Akihiro MOTOKI * elmo-msgdb.el (elmo-msgdb-search-internal-primitive): Search by extra-fields. 2000-10-17 Yuuichi Teranishi * elmo-version.el (elmo-version): Up to 2.3.90. * elmo-imap4.el (elmo-imap4-list-folder-unread): Check plugged status. (elmo-imap4-list-folder-important): Ditto. 2000-10-16 Kenichi OKADA * elmo-nntp.el (elmo-network-initialize-session): Fix. 2000-10-16 Kenichi OKADA * elmo-nntp.el (elmo-nntp-read-msg): Don't error. 2000-10-15 Kenichi OKADA * elmo-nntp.el (elmo-network-initialize-session): Add starttls negotiation. 2000-10-15 Masahiro MURATA * elmo-nntp.el (elmo-network-initialize-session): Read greeting response. (elmo-network-setup-session): Define. Call `elmo-nntp-send-mode-reader' when session opened. 2000-10-13 Yuuichi Teranishi * elmo-multi.el (elmo-multi-list-folder-unread): Fixed. 2000-10-13 OKAZAKI Tetsurou * elmo-imap4.el (elmo-imap4-search-internal-primitive): Remove an invalid SPACE character ahead of `SEARCH' command. Move a valid SPACE character following `SEARCH' from conditional `format' arguments to control-strings. 2000-10-13 Yuuichi Teranishi * elmo2.el (elmo-call-func-on-markable-msgs): Return t if marking was succeeded. * elmo-util.el (elmo-folder-get-spec): Enclose with save-match-data. 2000-10-12 Yuuichi Teranishi * elmo-localdir.el (elmo-localdir-list-folders-subr): Bind `w32-get-true-file-link-count' as t. * elmo-imap4.el (elmo-imap4-read): Abolished. (Renamed to `elmo-read' and moved to elmo-util.el) All other related portions are changed. * elmo-util.el (elmo-read): New function. (elmo-condition-parse-search-value): Use it. 2000-10-11 Yuuichi Teranishi * elmo2.el (elmo-quit): Don't use `elmo-nntp-flush-connection'. * elmo-nntp.el (elmo-nntp-session): Define. (elmo-nntp-setting): Abolished. All other related portions are changed. (elmo-nntp-get-server-command): Changed argument. (elmo-nntp-set-server-command): Ditto. (elmo-nntp-xover-p): Ditto. (elmo-nntp-set-xover): Ditto. (elmo-nntp-listgroup-p): Ditto. (elmo-nntp-set-listgroup): Ditto. (elmo-nntp-list-active-p): Ditto. (elmo-nntp-set-list-active): Ditto. (elmo-nntp-xhdr-p): Ditto. (elmo-nntp-set-xhdr): Ditto. (elmo-nntp-flush-connection): Abolished. (elmo-nntp-get-connection): Abolished. (elmo-nntp-get-session): New function. (elmo-network-initialize-session): Defined. (elmo-network-authenticate-session): Ditto. (elmo-nntp-send-mode-reader): Changed argument. (elmo-nntp-send-command): Changed argument. All other related portions are changed. (elmo-nntp-read-response): Ditto. (elmo-nntp-read-raw-response): Ditto. (elmo-nntp-read-contents): Ditto. (elmo-nntp-read-body): Ditto. (elmo-nntp-goto-folder): Abolished. (elmo-nntp-select-group): New function. All other related portions are changed. (This function substitutes `elmo-nntp-goto-folder') (elmo-nntp-msgdb-create-by-header): Rewrite. (elmo-nntp-get-overview): Eliminated. (elmo-nntp-get-message): Ditto. (elmo-nntp-open-connection) Abolished. (elmo-nntp-read-msg): Rewrite. (elmo-nntp-post): Ditto. (elmo-nntp-send-data): Abolished. (elmo-nntp-send-buffer): New function. (elmo-nntp-send-data-line): Define as inline function. (elmo-nntp-get-folders-info-prepare): Use session as key. (elmo-nntp-groups-read-response): Changed argument. (elmo-nntp-retrieve-headers): Ditto. (elmo-nntp-msgdb-create-message): Ditto. * elmo-msgdb.el (elmo-msgdb-search-internal-primitive): Fixed problem when searching by 'since' or 'before'. 2000-10-11 TAKAHASHI Kaoru * elmo-version.el (toplevel): Use product-version-as-string for set verstion-string, if defined. 2000-10-11 OKAZAKI Tetsurou * elmo-util.el: Doc fixes. 2000-10-10 TAKAHASHI Kaoru * elmo-archive.el (toplevel): Use product-provide. * elmo-cache.el (toplevel): Ditto. * elmo-database.el (toplevel): Ditto. * elmo-date.el (toplevel): Ditto. * elmo-dop.el (toplevel): Ditto. * elmo-filter.el (toplevel): Ditto. * elmo-imap4.el (toplevel): Ditto. * elmo-internal.el (toplevel): Ditto. * elmo-localdir.el (toplevel): Ditto. * elmo-localnews.el (toplevel): Ditto. * elmo-maildir.el (toplevel): Ditto. * elmo-msgdb.el (toplevel): Ditto. * elmo-multi.el (toplevel): Ditto. * elmo-net.el (toplevel): Ditto. * elmo-nntp.el (toplevel): Ditto. * elmo-pipe.el (toplevel): Ditto. * elmo-pop3.el (toplevel): Ditto. * elmo-util.el (toplevel): Ditto. * elmo-vars.el (toplevel): Ditto. * elmo2.el (toplevel): Ditto. * mmelmo-1.el (toplevel): Ditto. * mmelmo-2.el (toplevel): Ditto. * mmelmo-imap4-1.el (toplevel): Ditto. * mmelmo-imap4-2.el (toplevel): Ditto. * mmelmo-imap4.el (toplevel): Ditto. * mmelmo.el (toplevel): Ditto. 2000-10-10 Kenichi OKADA * elmo-dop.el (elmo-dop-flush-pending-append-operations): Add no-see. (elmo-dop-call-func-on-msgs): Don't delete appends from msgs. 2000-10-10 Yuuichi Teranishi * elmo-multi.el (elmo-multi-split-mark-alist): Copy and sort alist before splitting. (elmo-multi-split-number-alist): Ditto. 2000-10-10 TAKAHASHI Kaoru * elmo-version.el: New file. Use product.el. * elmo2.el: Add (require 'elmo-version). * elmo-vars.el (elmo-appname, elmo-version): Move to elmo-version.el 2000-10-09 Yuuichi Teranishi * elmo2.el (elmo-copy-msgs): Set `spec' as 1st argument for `elmo-msgdb-expand-path'. (elmo-msgdb-load): Ditto. Abolished 2nd argument. If 1st argument is not string, treat as spec. (elmo-generic-list-folder-unread): Rewrite. (elmo-generic-list-folder-important): Changed argument. (elmo-list-folder-unread): Ditto. (elmo-list-folder-important): Ditto. (elmo-folder-diff): Rewrite. (elmo-generic-folder-diff): New function. (elmo-multi-get-number-alist-list): Abolished (Renamed to elmo-multi-split-number-alist and moved to elmo-multi.el) (elmo-multi-folder-diff): Moved to elmo-multi.el (toplevel): Removed autoload setting of `elmo-multi-folder-diff'. * elmo-pop3.el (elmo-pop3-list-folder): Set `spec' as 1st argument for `elmo-msgdb-expand-path'. (elmo-pop3-msgdb-create-as-numlist): Ditto. (elmo-pop3-read-msg): Ditto. (elmo-pop3-delete-msgs): Ditto. (elmo-pop3-folder-diff): New alias. * elmo-pipe.el (elmo-pipe-list-folder): Set `spec' as 1st argument for `elmo-msgdb-expand-path'. (elmo-pipe-list-folder-unread): Changed arguments. (elmo-pipe-list-folder-important): Ditto. (elmo-pipe-folder-diff): New alias. * elmo-nntp.el (elmo-nntp-list-folder): Set `spec' as 1st argument for `elmo-msgdb-expand-path'. (elmo-nntp-max-of-folder): Ditto. (elmo-nntp-msgdb-create): Ditto. (elmo-nntp-delete-msgs): Ditto. (elmo-nntp-folder-diff): New alias. * elmo-multi.el (elmo-multi-folder-diff): New function. (elmo-multi-split-mark-alist): Ditto. (elmo-multi-split-number-alist): Ditto. (elmo-multi-mark-alist-list): Abolished (Renamed to elmo-multi-split-mark-alist). (elmo-multi-list-folder-unread): Rewrite. (elmo-multi-list-folder-important): Ditto. (elmo-multi-list-folder): Set `spec' as 1st argument for `elmo-msgdb-expand-path'. (elmo-multi-sync-number-alist): Use `elmo-multi-split-number-alist' instead of `elmo-multi-get-number-alist-list'. * elmo-msgdb.el (elmo-msgdb-expand-path): Abolished 2nd argument. If 1st argument is not string, treat as spec. (elmo-list-folder-by-location): Set `spec' as 1st argument for `elmo-msgdb-expand-path'. (elmo-msgdb-flist-load): Ditto. (elmo-msgdb-flist-save): Ditto. (elmo-msgdb-delete-path): Ditto. (elmo-msgdb-rename-path): Ditto. * elmo-maildir.el (elmo-maildir-set-mark-msgs): Set `spec' as 1st argument for `elmo-msgdb-expand-path'. (elmo-maildir-delete-mark-msgs): Ditto. (elmo-maildir-msgdb-create): Ditto. (elmo-maildir-read-msg): Ditto. (elmo-maildir-delete-msgs): Ditto. (elmo-maildir-list-folder-subr): Ditto. (elmo-maildir-search): Ditto. (elmo-maildir-get-msg-filename): Ditto. (elmo-maildir-pack-number): Ditto. (elmo-maildir-folder-diff): New alias. * elmo-localnews.el (elmo-localnews-folder-diff): New alias. * elmo-localdir.el (elmo-localdir-list-folder-subr): Set `spec' as 1st argument for `elmo-msgdb-expand-path'. (elmo-localdir-folder-diff): New alias. * elmo-internal.el (elmo-internal-list-folder-subr): Set `spec' as 1st argument for `elmo-msgdb-expand-path'. (elmo-internal-list-folder-by-location): Ditto. (elmo-internal-msgdb-create): Ditto. (elmo-internal-delete-msgs): Ditto. (elmo-internal-read-msg): Ditto. (elmo-internal-folder-diff): New alias. * elmo-imap4.el (elmo-imap4-folder-diff): New function. (elmo-imap4-list-folder): Set `spec' as 1st argument for `elmo-msgdb-expand-path'. (elmo-imap4-list-folder-unread): Changed arguments. (elmo-imap4-list-folder-important): Ditto. * elmo-filter.el (elmo-filter-list-folder-unread): Changed arguments. (elmo-filter-list-folder-important): Ditto. (elmo-filter-folder-diff): New function. * elmo-dop.el (elmo-dop-folder-exists-p): Check elmo directory first. * elmo-cache.el (elmo-cache-list-folder): Set `spec' as 1st argument for `elmo-msgdb-expand-path'. (elmo-cache-copy-msgs): Ditto. (elmo-cache-folder-diff): New alias. * elmo-archive.el (elmo-archive-list-folder-subr): Set `spec' as 1st argument for `elmo-msgdb-expand-path'. (elmo-archive-get-archive-name): Ditto. (elmo-archive-create-file): Ditto. (elmo-archive-append-msg): Ditto. (elmo-archive-copy-msgs): Ditto. (elmo-archive-copy-msgs-froms): Ditto. (elmo-archive-get-msg-filename): Ditto. (elmo-archive-folder-diff): New alias. 2000-10-06 Daiki Ueno * elmo-vars.el (elmo-imap4-stream-type-alist): New variable. (elmo-pop3-stream-type-alist): New variable. (elmo-nntp-stream-type-alist): New variable. * elmo-util.el (elmo-buffer-exists-p): Rewrite as function. (elmo-kill-buffer): Ditto. (elmo-get-network-stream-type): Add 2nd argument `stream-type-alist'. (elmo-network-get-spec): Add 5th argument `stream-type-alist'. (elmo-nntp-get-spec): Take into account `elmo-nntp-stream-type-alist'. (elmo-pop3-get-spec): Take into account `elmo-pop3-stream-type-alist'. (elmo-imap4-get-spec): Take into account `elmo-imap4-stream-type-alist'. 2000-10-06 Kenichi OKADA * elmo-nntp.el (elmo-nntp-list-folders): Fix for `-/' (elmo-nntp-list-folders-get-cache): Ditto. 2000-10-05 Yuuichi Teranishi * elmo-imap4.el (elmo-imap4-search-internal-primitive): Added space character before 'uid'. 2000-10-04 Yuuichi Teranishi * elmo-msgdb.el (elmo-msgdb-delete-msgs): Don't save location data. * elmo-nntp.el (elmo-nntp-max-of-folder): Fixed. * elmo-util.el (elmo-number-set-member): New function. (elmo-number-set-append-list): Ditto. (elmo-number-set-append): Ditto. * elmo-msgdb.el (elmo-msgdb-killed-message-p): Use `elmo-number-set-member'. (elmo-living-messages): Ditto. (elmo-msgdb-set-as-killed): Use `elmo-number-set-append'. (elmo-msgdb-append-to-killed-list): Use `elmo-number-set-append-list'. * elmo-imap4.el (elmo-imap4-folder-exists-p): Rewrite. (elmo-imap4-add-to-cont-list): Abolished. (elmo-imap4-make-number-set-list): Use `elmo-number-set-append' instead of elmo-imap4-add-to-cont-list. * elmo2.el (elmo-msgdb-search): Moved from elmo-msgdb.el. (toplevel): Removed autoload setting for `elmo-imap4-get-connection'. * elmo-msgdb.el (elmo-msgdb-search): Moved to elmo2.el. 2000-10-03 Hiroya Murata * elmo-util.el (elmo-condition-parse-search-value): Fixed date parsing. 2000-10-03 Yuuichi Teranishi * elmo-util.el (elmo-condition-find-key-internal): New function. (elmo-condition-find-key): Ditto. * elmo-msgdb.el (elmo-msgdb-search-internal-primitive): New function. (elmo-msgdb-search-internal): Ditto. (elmo-msgdb-search): Ditto. 2000-10-02 Yuuichi Teranishi * elmo-util.el (elmo-cross-device-link-error-p): Abolished. (elmo-copy-file): Uncheck error condition for `add-name-to-file'. * elmo-nntp.el (elmo-nntp-search-primitive): Decode header field. (elmo-nntp-search-primitive): Fixed problem when condition is 'unmatch'. * elmo-util.el (elmo-buffer-field-primitive-condition-match): Fixed. * elmo-nntp.el (elmo-nntp-default-use-xhdr): New variable. (elmo-nntp-xhdr-p): New macro. (elmo-nntp-set-xhdr): Ditto. (elmo-nntp-parse-xhdr-response): New function. (elmo-nntp-retrieve-field): Ditto. (elmo-nntp-search-primitive): Ditto. (elmo-nntp-search): Implemented. * elmo-date.el (elmo-date-make-sortable-string): New macro. * elmo-archive.el (elmo-archive-search): Set all number list to `elmo-archive-field-condition-match' * elmo-localdir.el (elmo-localdir-search): Likewise. * elmo-maildir.el (elmo-maildir-search): Likewise. 2000-10-01 OKAZAKI Tetsurou * elmo-msgdb.el (elmo-living-messages): New function. * elmo-archive.el (elmo-archive-list-folder-subr): Use it. * elmo-cache.el (elmo-cache-list-folder): Ditto. * elmo-dop.el (elmo-dop-list-folder): Ditto. * elmo-imap4.el (elmo-imap4-list-folder): Ditto. * elmo-internal.el (elmo-internal-list-folder-subr): Ditto. * elmo-localdir.el (elmo-localdir-list-folder-subr): Ditto. * elmo-maildir.el (elmo-maildir-list-folder-subr): Ditto. * elmo-multi.el (elmo-multi-list-folder): Ditto. * elmo-nntp.el (elmo-nntp-list-folder): Ditto. * elmo-pipe.el (elmo-pipe-list-folder): Ditto. * elmo-pop3.el (elmo-pop3-list-folder): Ditto. 2000-09-29 Yuuichi Teranishi * elmo-maildir.el (elmo-maildir-pack-number): Implemented. * elmo-msgdb.el (elmo-msgdb-delete-msgs): Save location data. * elmo2.el (elmo-pack-number): Added 'maildir as allowd type. * elmo-imap4.el (elmo-imap4-search-internal-primitive): Fixed arguments for `SEARCH' command. (elmo-imap4-parse-string): Set `POS' argument for char-after. All other related portions are changed. * elmo-cache.el (elmo-cache-search-all): Added argument `from-msgs'. * elmo2.el (elmo-generic-list-folder-unread): Rewrite. (elmo-list-folder-unread): Rewrite. (elmo-list-folder-important): Ditto. * elmo-util.el (elmo-filter-get-spec): Rewrite. (elmo-condition-parse-error): New inline function. (elmo-read-search-condition): New function. (elmo-read-search-condition-internal): Ditto. (elmo-parse-search-condition): Rewrite. (elmo-condition-parse): New function. (elmo-condition-parse-or-expr): Ditto. (elmo-condition-parse-and-expr): Ditto. (elmo-condition-parse-primitive): Ditto. (elmo-condition-parse-search-value): Ditto. (elmo-buffer-field-primitive-condition-match): Ditto. (elmo-buffer-field-condition-match): Rewrite. (elmo-file-field-condition-match): Ditto. * elmo-msgdb.el (elmo-msgdb-expand-path): Use `elmo-replace-msgid-as-filename' instead of `elmo-safe-filename'. * elmo-internal.el (elmo-internal-search): Set `number' and `number-list' argument of `elmo-file-field-condition-match'. * elmo-maildir.el (elmo-maildir-search): Ditto. * elmo-imap4.el (elmo-imap4-list-folder-unread): Use `msgdb' as argument instead of `mark-alist'. (elmo-imap4-list-folder-important): Use `msgdb' as argument instead of `overview'. * elmo-multi.el: Likewise. * elmo-pipe.el: Likewise. * elmo-imap4.el (elmo-imap4-search-internal-primitive): New function. (elmo-imap4-search-internal): Rewrite. (elmo-imap4-search): Ditto. * elmo-filter.el (elmo-filter-list-folder): Rewrite. (elmo-filter-list-folder-unread): Ditto. (elmo-filter-list-folder-important): Ditto. (elmo-filter-search): Rewrite. * elmo-cache.el (elmo-cache-search-all): Set `number' and `number-list' argument of `elmo-file-field-condition-match'. (elmo-cache-search): Ditto. * elmo-localdir.el: Likewise. * elmo-archive.el (elmo-archive-field-condition-match): Added argument number-list and pass it to `elmo-buffer-field-condition-match'. (elmo-archive-field-condition-match): Pass `number-list' to `elmo-archive-field-condition-match' 2000-09-25 Yuuichi Teranishi * elmo-nntp.el (elmo-nntp-list-folder): Set current group after `listgroup'. * elmo2.el (elmo-folder-diff-async-callback): New variable. (elmo-folder-diff-async-callback-data): Ditto. (elmo-folder-diff-async): New function. * elmo-net.el (elmo-network-session-name-prefix): New variable. (elmo-network-session-cache-key): Use it as a prefix of the session name. (elmo-network-open-session): Ditto. * elmo-imap4.el (elmo-imap4-status-callback): New local variable. (elmo-imap4-status-callback-data): Ditto. (elmo-imap4-server-diff-async-callback): New variable. (elmo-imap4-server-diff-async-callback-data): Ditto. (elmo-imap4-local-variables): Added `elmo-imap4-status-callback' and `elmo-imap4-status-callback-data'. (elmo-imap4-max-of-folder): Set `elmo-imap4-status-callback' and `elmo-imap4-status-callback-data' as nil. (elmo-imap4-server-diff): Ditto. (elmo-imap4-server-diff-async-callback-1): New function. (elmo-imap4-server-diff-async): Ditto. (elmo-imap4-parse-status): Call `elmo-imap4-status-callback'. 2000-09-24 OKAZAKI Tetsurou * elmo-util.el (elmo-list-delete): Doc fix. (elmo-delete-lists): Abolish. * elmo2.el (elmo-crosspost-message-delete): Use `elmo-list-delete' instead of `elmo-delete-lists'. 2000-09-19 Yuuichi Teranishi * elmo-imap4.el (elmo-imap4-make-number-set-list): Copy `msg-list' before `sort'. 2000-09-18 OKAZAKI Tetsurou * elmo-imap4.el (elmo-imap4-literal-1): Renamed from `elmo-imap4-literal-subr'. (elmo-imap4-string-1): Renamed from `elmo-imap4-string-subr'. (elmo-imap4-astring-1): Renamed from `elmo-imap4-astring-subr'. 2000-09-15 Kenichi OKADA * elmo-archive.el (elmo-archive-list-folder-subr): Fix. (elmo-archive-list-folder): Fix. (elmo-archive-max-of-folder): Fix. 2000-09-15 Kenichi OKADA * elmo-localdir.el (elmo-localdir-copy-msgs): Use `elmo-localdir-max-of-folder' instead of 'elmo-localdir-list-folder-subr'. (elmo-localdir-append-msg): Ditto. (elmo-localdir-list-folder): Fix for `nonsort'. (elmo-localdir-list-folder-subr): Fix for `killed'. * elmo-maildir.el (elmo-maildir-list-folder): Ditto. (elmo-maildir-list-folder-subr): Ditto. * elmo-archive.el (elmo-archive-list-folder): Ditto. (elmo-archive-list-folder-subr): Ditto. * elmo-internal.el (elmo-internal-list-folder): Ditto. (elmo-internal-list-folder-subr): Ditto. 2000-09-13 Yuuichi Teranishi * elmo-imap4.el (elmo-imap4-parse-flag-list): Rewrite. 2000-09-12 Katsumi Yamaoka * elmo-util.el (elmo-delete-plugged): Fix parenthesis. 2000-09-11 Yuuichi Teranishi * mmelmo-imap4-2.el (mmelmo-imap4-get-mime-entity): Clear `elmo-imap4-fetch-callback' and `elmo-imap4-fetch-callback-data'. * elmo-imap4.el (elmo-network-initialize-session): Skip garbage output before greeting. (elmo-imap4-read-part): Use "body.peek" to fetch part. Clear `elmo-imap4-fetch-callback' and `elmo-imap4-fetch-callback-data'. 2000-09-06 Yuuichi Teranishi * mmelmo-imap4-2.el (mime-entity-children): Defined. * elmo-imap4.el (elmo-imap4-mark-set-on-msgs): Clear `elmo-imap4-fetch-callback' and `elmo-imap4-fetch-callback-data' before STORE command. 2000-09-04 Yuuichi Teranishi * elmo2.el (elmo-multi-folder-diff): Fixed problem of filter folder. * elmo-imap4.el (elmo-imap4-authenticator-alist): Added `plain' entry. (elmo-imap4-send-command): Use `elmo-imap4-current-response' instead of `response'. (elmo-imap4-list-folders): Removed unused local variable. (elmo-network-initialize-session): Ditto. (elmo-imap4-delete-msg-by-id): Ditto. (elmo-imap4-parse-fetch): Ditto. (elmo-imap4-copy-msgs): Ditto. Use `dst-spec' instead of `dst-folder'. (elmo-network-authenticate-session): Check authenticate type `plain'. 2000-09-01 Yuuichi Teranishi * elmo-imap4.el (elmo-imap4-parse-response): Use string-match for garbage checking. (elmo-imap4-read-part): Use `elmo-imap4-response-value-all' instead of `elmo-imap4-response-value'. (elmo-imap4-parse-response): Return value of `EXPUNGE'. 2000-08-31 Yuuichi Teranishi * elmo-imap4.el (elmo-imap4-send-command): Cause elmo-imap4-bye-error when current response is BYE. (elmo-imap4-arrival-filter): Changed greeting response value. * elmo2.el (elmo-imap4-bye-error): Define. * elmo-imap4.el (elmo-imap4-list): Don't call `elmo-imap4-commit'. (elmo-imap4-server-diff): Ditto. (elmo-imap4-response-bye-p): New macro. (elmo-imap4-response-error-text): Get text from BYE response. (elmo-imap4-read-response): Return if BYE response. (elmo-imap4-accept-ok): Cause elmo-imap4-bye-error when BYE response. (elmo-imap4-folder-exists-p): Ditto. (elmo-imap4-commit): Do nothing when different mailbox is selected. (elmo-imap4-parse-bye): New function. (elmo-imap4-parse-response): Remove needless let. Call `elmo-imap4-parse-bye'. 2000-08-30 Yuuichi Teranishi * elmo-imap4.el (elmo-imap4-folder-exists-p): Don't cause an error when the mailbox does not exist. (elmo-imap4-parse-namespace): Copy `elmo-imap4-extra-namespace-alist'. 2000-08-30 OKAZAKI Tetsurou * elmo-imap4.el (elmo-imap4-send-command): Remove unused local variable. 2000-08-29 Yuuichi Teranishi * elmo-vars.el (elmo-search-mime-charset): Abolished. * elmo-pop3.el (elmo-pop3-local-variables): New variable. (elmo-network-initialize-session-buffer): Defined. * mmelmo-imap4-2.el (mmelmo-imap4-parse-bodystructure-string): Abolished. (mmelmo-imap4-get-mime-entity): Rewrite. * elmo2.el (elmo-error): Capitalize error message. * elmo-net.el (elmo-network-initialize-session-buffer): New method. (elmo-network-session-buffer): New macro. (elmo-network-open-session): Use it. * elmo-imap4.el: Rewrite. 2000-08-27 Yoichi NAKAYAMA * elmo-nntp.el (Toplevel): Require 'elmo-net. 2000-08-27 Daiki Ueno * elmo-imap4.el (elmo-imap4-make-address): Abolish. (elmo-imap4-msgdb-create): Don't request ENVELOPE. (elmo-imap4-create-msgdb-from-overview-string): Use `elmo-msgdb-create-overview-from-buffer'. 2000-08-26 Daiki Ueno * elmo-imap4.el (elmo-imap4-parse-namespace): Tolerate INBOX regexp. (elmo-imap4-default-hierarchy-delimiter): New variable. (elmo-imap4-list-folders): Use it. 2000-08-23 Yuuichi Teranishi * elmo-net.el (elmo-network-open-session): Add user and stream-type for process-buffer name. * elmo-pop3.el (elmo-network-initialize-session): Call buffer-disable-undo. * elmo-imap4.el (elmo-network-initialize-session): Set current-buffer as an argument for `buffer-disable-undo'. * elmo-pop3.el (elmo-network-close-session): Don't use `process-live-p'. * elmo-vars.el (elmo-default-pop3-authenticate-type): Set default as 'user. * mmelmo-imap4-2.el (mmelmo-imap4-get-mime-entity): Rewrite. * elmo2.el (elmo-quit): Don't use `elmo-pop3-flush-connection' and `elmo-imap4-flush-connection'. * elmo-util.el (toplevel): Removed workaround for timezone y2k. (elmo-pop3-get-spec): Assume auth as symbol. (elmo-open-network-stream): Moved to `elmo-net'. * elmo-pop3.el (toplevel): Require 'elmo-net. Define `sasl-cram-md5' to silence byte compilier. (elmo-pop3-connection-cache) Abolished. (elmo-pop3-authenticator-alist) New variable. (elmo-pop3-session): Define. (elmo-pop3-connection-get-process): Abolished. (elmo-pop3-connection-get-buffer): Ditto. (elmo-pop3-close-connection): Ditto. (elmo-pop3-flush-connection): Ditto. (elmo-pop3-get-connection): Ditto. (elmo-pop3-get-session): New function. (Replacement for `elmo-pop3-get-connection'). All other related modules are changed. (elmo-network-close-session): Define. (elmo-pop3-send-command): Abolished argument `buffer'. All other related modules are changed. (elmo-pop3-read-response): Likewise. (elmo-pop3-open-connection): Abolished. (elmo-pop3-auth-user): New function. (elmo-pop3-auth-apop): Ditto. (elmo-pop3-auth-cram-md5): Ditto. (elmo-pop3-auth-scram-md5): Ditto. (elmo-pop3-auth-digest-md5): Ditto. (elmo-network-initialize-session): Define. (elmo-network-authenticate-session): Ditto. (elmo-network-setup-session): Ditto. * elmo-imap4.el (toplevel): Require 'elmo-net. (elmo-imap4-session): Define. (elmo-imap4-connection-cache): Abolished. (elmo-imap4-password-key): Ditto. (elmo-imap4-flush-connection): Ditto. (elmo-imap4-get-connection): Ditto. All other related modules are changed. (elmo-imap4-get-session): New function (Replacement for `elmo-imap4-get-connection'). (elmo-imap4-read-response): Abolished argument `buffer'. All other related modules are changed. (elmo-imap4-send-command): Likewise. (elmo-imap4-select-folder): Abolished. All other related modules are changed. (elmo-imap4-select-mailbox): New function. (Replacement for `elmo-imap4-select-folder'). (elmo-imap4-auth-login): Simplify. (Assume current buffer as process buffer) (elmo-imap4-auth-cram-md5): Ditto. (elmo-imap4-auth-digest-md5): Ditto. (elmo-imap4-login): Ditto. (elmo-imap4-open-connection): Abolished. (elmo-imap4-open-connection-1): Abolished. (elmo-network-initialize-sessoin): Define. (elmo-network-authenticate-session): Ditto. (elmo-network-setup-session): Ditto. * elmo-net.el: New module. 2000-08-22 Daiki Ueno * elmo-util.el (elmo-define-error): New function. * elmo2.el (elmo-error): Define. (elmo-open-error): Define. (elmo-authenticate-error): Define. * elmo-imap4.el (elmo-imap4-error): Abolish. (elmo-imap4-error-type): Abolish. (elmo-imap4-error-process): Abolish. (elmo-imap4-error-message): Abolish (elmo-imap4-list-folders): Don't quote lambda. (elmo-imap4-create-msgdb-from-overview-string): Ditto. (elmo-imap4-parse-namespace): Ditto. (elmo-imap4-open-connection): Rewrite. (elmo-imap4-open-connection-1): Simplified (authenticate only). (elmo-imap4-get-connection): Abolish local variable `result'. 2000-08-21 Kaoru Takahashi * elmo-imap4.el (elmo-imap4-open-connection-1): Fixed probrem wrong-type-argument error when auth is nil. 2000-08-21 Yuuichi Teranishi * elmo-vars.el (elmo-default-imap4-stream-type): New variable. (elmo-default-nntp-stream-type): Ditto. (elmo-default-pop3-stream-type): Ditto. (elmo-network-stream-type-alist): Ditto. (elmo-default-imap4-ssl): Abolished. (elmo-default-nntp-ssl): Ditto. (elmo-default-pop3-ssl): Ditto. * elmo-util.el: (toplevel): Removed needless requires. (elmo-network-get-spec): Use `elmo-network-stream-type-alist'. (elmo-open-network-stream): Open network stream according to the value of `elmo-network-stream-type-alist'. (elmo-get-network-stream-type): New function. (elmo-network-stream-type-spec-string): New macro. (elmo-network-stream-type-symbol): Ditto. (elmo-network-stream-type-function): Ditto. * elmo-pop3.el (elmo-pop3-get-connection): Follow up changes for network-stream-type. All other related portions are changed. (elmo-pop3-open-connection): Ditto. * elmo-nntp.el (elmo-nntp-setting): Follow up changes for network-stream-type. All other related portions are changed. * elmo-imap4.el (elmo-imap4-get-connection): Follow up changes for network-stream-type.All other related portions are changed. (elmo-imap4-error): New macro. (elmo-imap4-error-type): Ditto. (elmo-imap4-error-process): Ditto. (elmo-imap4-error-message): Ditto. (elmo-imap4-auth-login): Use `elmo-imap4-error'. (elmo-imap4-auth-cram-md5): Ditto. (elmo-imap4-auth-digest-md5): Ditto. (elmo-imap4-login): Ditto. (elmo-imap4-open-connection): Remove password entry if authentication was in vain. (elmo-imap4-user-at-host): Abolished. (elmo-imap4-password-key): New buffer local variable. (elmo-imap4-open-connection-1): Set value of `elmo-imap4-password-key' using protocol, port, auth and stream-type. * elmo-dop.el (elmo-dop-list-folder): Use killed list. 2000-08-13 Daiki Ueno * elmo-vars.el (elmo-default-imap4-authenticate-type): Default to nil. * elmo-util.el (elmo-imap4-get-spec): Assume auth as symbol. * elmo-imap4.el (elmo-imap4-user-at-host): New variable. (elmo-imap4-authenticator-alist): New variable. (elmo-imap4-open-connection-1): Rename from elmo-imap4-open-connection. (elmo-imap4-open-connection): Abolish 5th argument `passphrase'; only wraps elmo-imap4-open-connection-1. (elmo-imap4-get-connection): Abolish local variable buffer, proc-stat, user-at-host. (elmo-imap4-auth-login): New function. (elmo-imap4-auth-cram-md5): New function. (elmo-imap4-auth-digest-md5): New function. (elmo-imap4-login): New function. 2000-08-12 Kenichi OKADA * elmo-maildir.el (elmo-maildir-delete-folder): Set argument of the function `error'. 2000-08-12 Kenichi OKADA * elmo-pop3.el (elmo-pop3-get-connection): Add `signal'. 2000-08-08 Yuuichi Teranishi * elmo2.el (elmo-move-msgs): Set value of `unseen'. 2000-08-06 OKAZAKI Tetsurou * elmo-imap4.el (elmo-imap4-parse-overview-string): In regexps for server responses, quote `*' regardless of where it appears. 2000-08-03 Kenichi OKADA * elmo-maildir.el (elmo-maildir-commit): New alias. 2000-08-03 Kenichi OKADA * elmo-util.el (elmo-display-progress): Use `progress-feedback-with-label'. 2000-08-02 OKAZAKI Tetsurou * elmo-imap4.el (elmo-imap4-quoted-specials-list): New constant. (elmo-imap4-non-atom-char-regex): Ditto. (elmo-imap4-non-text-char-regex): Ditto. (elmo-imap4-literal-threshold): Ditto. (elmo-imap4-atom-p): New function. (elmo-imap4-quotable-p): Ditto. (elmo-imap4-nil): Ditto. (elmo-imap4-atom): Ditto. (elmo-imap4-quoted): Ditto. (elmo-imap4-literal-subr): Ditto. (elmo-imap4-literal): Ditto. (elmo-imap4-buffer-literal): Ditto. (elmo-imap4-string-subr): Ditto. (elmo-imap4-string): Ditto. (elmo-imap4-buffer-string): Ditto. (elmo-imap4-astring-subr): Ditto. (elmo-imap4-astring): Ditto. (elmo-imap4-buffer-astring): Ditto. (elmo-imap4-nstring): Ditto. (elmo-imap4-buffer-nstring): Ditto. (elmo-imap4-mailbox): New alias. (elmo-imap4-field-body): Ditto. (elmo-imap4-userid): Ditto. (elmo-imap4-password): Ditto. (elmo-imap4-format-quoted): New function. (elmo-imap4-send-command): Rewritten. Accept a list of command arguments and handle "atom", "quoted" and "literal" string here. (elmo-imap4-list-folders): Use `elmo-imap4-mailbox' for `elmo-imap4-send-command'. (elmo-imap4-folder-exists-p): Likewise. (elmo-imap4-create-folder): Likewise. (elmo-imap4-delete-folder): Likewise. (elmo-imap4-rename-folder): Likewise. (elmo-imap4-max-of-folder): Likewise. (elmo-imap4-check-validity): Likewise. (elmo-imap4-sync-validity): Likewise. (elmo-imap4-server-diff): Likewise. (elmo-imap4-select-folder): Likewise. (elmo-imap4-copy-msgs): Likewise. (elmo-imap4-search-internal): Use `elmo-imap4-astring'. (elmo-imap4-mark-set-on-msgs): Likewise. (elmo-imap4-read-part): Likewise. (elmo-imap4-read-msg): Likewise. (elmo-imap4-open-connection): Use `elmo-imap4-userid' and `elmo-imap4-password' for `elmo-imap4-send-command'. (elmo-imap4-delete-msg-by-id): Use `elmo-imap4-field-body'. (elmo-imap4-append-msg-by-id): Use `elmo-imap4-mailbox' and `elmo-imap4-buffer-literal'. (elmo-imap4-append-msg): Likewise. * elmo-imap4.el (elmo-imap4-get-connection): Use `delq' instead of `delete' for removing dead connection from the connection cache. Move deletion of the process buffer after that. (elmo-imap4-list): Change `defsubst' to `defun'. (elmo-imap4-commit): Make error message verbose. (elmo-imap4-search): Ditto. (elmo-imap4-list): Ditto. (elmo-imap4-select-folder): Ditto. (elmo-imap4-copy-msgs): Ditto. (elmo-imap4-delete-msg-by-id): Ditto. (elmo-imap4-append-msg-by-id): Ditto. (elmo-imap4-append-msg): Ditto. 2000-07-26 Takaaki MORIYAMA * elmo-archive.el (elmo-archive-get-archive-name): Fixed problem when dired is used on XEmacs. 2000-07-25 OKAZAKI Tetsurou * elmo-imap4.el (elmo-imap4-process-folder-list): Use `nconc' instead of `append'. (elmo-imap4-commit): Use `elmo-imap4-plugged-p' instead of `elmo-plugged-p' directly. * elmo-pop3.el (elmo-pop3-commit): Use `elmo-pop3-plugged-p' instead of `elmo-plugged-p' directly. * elmo-pop3.el (elmo-pop3-get-connection): Split temporary variable. Eliminate unused variable. Use `memq' for checking a process status. Use `cons' instead of `append' for updating the connection cache. * elmo-nntp.el (elmo-nntp-get-connection): Likewise. * elmo-imap4.el (elmo-imap4-get-connection): Likewise. 2000-07-22 OKAZAKI Tetsurou * elmo-imap4.el (elmo-imap4-read-bytes): Advance `elmo-imap4-read-point' exactly. * mmelmo-imap4-2.el (mmelmo-imap4-get-mime-entity): Rename the local variable `folder' to `mailbox'. Rename the argument `fld' to `folder'. 2000-07-20 Kenichi OKADA * elmo-pop3.el (elmo-pop3-commit): Do nothing when unplugged. * elmo-imap4.el (elmo-imap4-commit): Ditto. 2000-07-18 Yuuichi Teranishi * elmo-pop3.el (elmo-pop3-use-uidl): New variable. (elmo-pop3-number-uidl-hash): New buffer-local variable. (elmo-pop3-uidl-number-hash): Ditto. (elmo-pop3-size-hash): Ditto. (elmo-pop3-uidl-done): Ditto. (elmo-pop3-list-done): Ditto. (elmo-pop3-connection-get-process): New defmacro. (elmo-pop3-connection-get-buffer): Ditto. (elmo-pop3-close-connection): Delete buffer and process. (elmo-pop3-flush-connection): Don't delete buffer and process. (elmo-pop3-get-connection): Added optional argument `if-exists'. Setup UIDL and size hash. (elmo-pop3-send-command-no-erase): Deleted (elmo-pop3-send-command): Added optional argument `no-erase'. (elmo-pop3-parse-uidl-response): New function. (elmo-pop3-parse-list-response): Set size hash. (elmo-pop3-list-location): New function. (elmo-pop3-list-by-uidl-subr): Ditto. (elmo-pop3-list-by-list): Ditto. (elmo-pop3-list-folder): Call `elmo-pop3-commit'. Call `elmo-pop3-list-by-uidl-subr' or `elmo-pop3-list-by-list'. (elmo-pop3-max-of-folder): Call `elmo-pop3-commit'. Call `elmo-pop3-list-by-uidl-subr' if `elmo-pop3-use-uidl' is non-nil. (elmo-pop3-msgdb-create-as-numlist): Added optional argument `msgdb'. Use uidl. (elmo-pop3-uidl-to-number): New function. (elmo-pop3-number-to-uidl): Ditto. (elmo-pop3-number-to-size): Ditto. (elmo-pop3-msgdb-create-by-header): Added argument `loc-alist'. Set number by use of uidl. (elmo-pop3-msgdb-create-message): Likewise. Set size, loc-alist in msgdb. (elmo-pop3-read-msg): Set number by use of uidl. Added optional argument `msgdb'. (elmo-pop3-delete-msg): Ditto. (elmo-pop3-delete-msgs): Added optional argument `msgdb'. (elmo-pop3-commit): Close connection. * elmo-pipe.el (elmo-pipe-max-of-folder): Bind `elmo-pop3-use-uidl' as nil. (elmo-pipe-drain): Ditto. Call `elmo-commit'. * elmo-msgdb.el (elmo-msgdb-delete-msgs): Delete location too. (elmo-msgdb-overview-entity-set-size): New defsubst. 2000-07-17 Yuuichi Teranishi * elmo-vars.el (elmo-use-killed-list): New variable (Renamed from `elmo-nntp-use-killed-list'). (elmo-nntp-use-killed-list): Eliminated. * elmo-msgdb.el (elmo-msgdb-expand-path): Changed expanding msgdb path for elmo-multi. * elmo-archive.el, elmo-cache.el, elmo-database.el, elmo-date.el, elmo-dop.el, elmo-filter.el, elmo-imap4.el, elmo-internal.el, elmo-localdir.el, elmo-localnews.el, elmo-maildir.el, elmo-msgdb.el, elmo-multi.el, elmo-nntp.el, elmo-pipe.el, elmo-pop3.el, elmo-util.el, elmo-vars.el, elmo2.el, mmelmo-1.el, mmelmo-2.el, mmelmo-imap4-1.el, mmelmo-imap4-2.el, mmelmo-imap4.el, mmelmo.el (toplevel): Deleted time-stamp line. * elmo2.el (elmo-clear-killed ): Defined as function (Abolished defining as a backend function). All other related modules are changed. 2000-07-14 Hiroshi Tsutsui * elmo-cache.el (elmo-cache-clear-killed): Fixed. 2000-07-13 Yuuichi Teranishi * elmo-msgdb.el (elmo-msgdb-append-to-killed-list): New function. 2000-07-12 Hiroya Murata * elmo-pop3.el (elmo-pop3-clear-killed): New alias. 2000-07-11 Yuuichi Teranishi * elmo-nntp.el (elmo-nntp-max-of-folder): Use killed list in asynchronous folder check. * elmo2.el (elmo-move-msgs): Don't move message when buffer-size is 0. * elmo-nntp.el (elmo-nntp-delete-msgs): Check the value of `elmo-nntp-use-killed-list'. (elmo-nntp-list-folder): Use killed list. (elmo-nntp-max-of-folder): Ditto. (elmo-nntp-msgdb-create): Set killed list. * elmo-vars.el (elmo-nntp-use-killed-list): New user option. * elmo2.el (elmo-clear-killed): New backend function. All other related modules are changed. 2000-07-07 OKAZAKI Tetsurou * elmo-util.el (elmo-imap4-spec-folder): Use `elmo-imap4-spec-mailbox'; Mark as obsolete. All callers changed. 2000-06-22 Yuuichi Teranishi * mmelmo-2.el (initialize-instance): Use `mime-buffer-entity-buffer-internal' instead of `mime-entity-buffer'. * mmelmo-imap4-2.el (mmelmo-imap4-mime-entity-buffer): New function. (mime-entity-body): Implemented. (mime-goto-header-start-point): Deleted. (mime-goto-body-end-point): Ditto. (mime-entity-point-min): Ditto. (mime-entity-point-max): Ditto. (mime-entity-children): Ditto. (mime-insert-header): Use `mime-buffer-entity-buffer-internal' instead of `mime-entity-buffer'. (mime-entity-header-buffer): Ditto. (mime-entity-body-buffer): Ditto. (mime-write-entity-content): Ditto. * pldap.el (ldap-static-if): New macro. (toplevel): Use it instead of `static-if'. 2000-06-19 Yuuichi Teranishi * pldap.el (ldap-search-basic): Don't collect 'dn' value even if it is included in `attrs' argument. 2000-06-16 Yuuichi Teranishi * elmo-util.el (elmo-get-passwd): Use old backquote style. * pldap.el (ldap-ldif-safe-char-regexp): New constant. (ldap-ldif-safe-init-char-regexp): Ditto. (ldap-ldif-safe-string-regexp): Ditto. (ldap/ldif-safe-string-p): New macro. (ldap/ldif-insert-field): Ditto. (ldap-modify): Use it. (ldap-add): Ditto. (ldap-search-basic): Consider `attrsonly' also when `attrs' is nil. (ldap-decode-attribute): Decode only when `attr' is consp. (ldap-delete): Bind `ret'. (toplevel): Require 'cl at compile time. Removed (require 'poe) and (require 'std11). (pldap-version): Eliminated. (ldap-search-basic): Removed auth and dn binding. (ldap-ldif-field-name-regexp): New constant. (ldap-ldif-field-head-regexp): Ditto. (ldap-ldif-next-field-head-regexp): Ditto. (ldap/collect-field): Use `ldap-ldif-field-head-regexp'. (ldap/field-end): New function. (ldap/field-body): Use it. (ldap/collect-field): Ditto. (ldap-search-basic): Use `ldap/field-body'. 2000-06-15 Yuuichi Teranishi * pldap.el (ldap-default-attribute-encoder): New user option. (ldap/field-body): Decode base64 string. (ldap/collect-field): Ditto. (ldap-encode-attribute): New function. (ldap-add-entries): Use it. (ldap-modify-entries): Ditto. (ldap-search-entries): Enclosed decoding function with `with-temp-buffer' and set as unibyte. (ldap-search-basic): Set process buffer as unibyte. * elmo-util.el (elmo-folder-identical-system-p): Eliminated name space checking. * pldap.el: New module. toplevel: Changed condition to detect built-in ldap feature. (ldap-delete): Enclosed call-process with `with-temp-buffer'. (ldap-add): Added error handling. (ldap-modify): Ditto. (ldap-delete): Ditto. 2000-06-03 OKAZAKI Tetsurou * elmo-localdir.el (elmo-localdir-msgdb-create-as-numlist): Initialize local variables with `let'. Inline a temporary variable for the progress percentage. Sort `setq' to reduce function call in the while-loop. * mmelmo.el (mmelmo-get-original-buffer): Move `save-excursion' into the conditional branch. 2000-05-30 OKAZAKI Tetsurou * elmo2.el (elmo-move-msgs): Replace `append' with `nconc'. Move a conditional out of the while-loop. 2000-05-27 Masahiro MURATA * elmo-msgdb.el (elmo-msgdb-overview-get-entity): Use elmo-msgdb-overview-get-entity-by-number. (elmo-msgdb-overview-get-entity-by-number): Don't use catch and throw. 2000-05-26 OKAZAKI Tetsurou * elmo-localdir.el (elmo-localdir-pack-number): Renamed the local variable for a packed number self descriptively. 2000-05-21 Masahiro MURATA * elmo2.el (elmo-msgdb-load): Remove elmo-msgdb-overview-hashtb. * elmo-localdir.el (elmo-localdir-pack-number): Use `elmo-msgdb-overview-get-entity' instead of `elmo-msgdb-overview-get-entity-by-number'. * elmo-msgdb.el (elmo-msgdb-overview-hashtb): Removed. (elmo-msgdb-search-overview-entity): Removed. (elmo-msgdb-overview-get-entity): Change argument. Get overview entity by message-id or number. (elmo-msgdb-delete-msgs): Use `elmo-msgdb-overview-get-entity' instead of `elmo-msgdb-overview-get-entity-by-number'. 2000-05-20 Masahiro MURATA * elmo-vars.el (elmo-use-overview-hashtb): New variable. If non-nil, use hash table for overview. (elmo-hash-maximum-size): New variable. * elmo-msgdb.el (elmo-msgdb-overview-hashtb): New variable. (elmo-msgdb-make-overview-hashtb): New function. (elmo-msgdb-clear-overview-hashtb): New function. (elmo-clear-hash-val): New macro. All other related modules are changed. 2000-05-18 Yuuichi Teranishi * elmo2.el (elmo-move-msgs): If there's other message with same message-id, don't use cache. 2000-05-18 Nishimoto Masaki * elmo-localdir.el (elmo-localdir-pack-number): Fixed problem when number is already packed. 2000-05-15 OKAZAKI Tetsurou * elmo-vars.el: Doc fixes. Trim trailing whitespace. 2000-05-12 Masahiro MURATA * elmo-vars.el (elmo-display-progress-threshold): New variable. All other related modules are changed. 2000-05-11 Yuuichi Teranishi * elmo-msgdb.el (elmo-msgdb-sort-by-date): Fixed a problem of refiling failure on Maildir. 2000-05-10 Masahiro MURATA * elmo-msgdb.el (elmo-msgdb-get-decoded-cache): get string of decoded mime-charset with cache. (elmo-msgdb-overview-entity-get-from): Ditto. (elmo-msgdb-overview-entity-get-subject): Ditto. * elmo-vars.el (elmo-use-decoded-cache): New variable. 2000-05-10 Kenichi OKADA * elmo-utils.el (elmo-get-passwd): Set timeout of password. (elmo-remove-passwd): Fill password with 0 before erase. * elmo-vars.el (elmo-passwd-life-time): New variable. 2000-05-10 Yuuichi Teranishi * elmo-cache.el (elmo-buffer-cache-add): Set message cache buffer as unibyte. 2000-05-07 Masahiro MURATA * elmo-archive.el (elmo-archive-list-folders): Fix base-folder become nil. 2000-04-28 Yuuichi Teranishi * elmo-nntp.el (elmo-nntp-list-folders): Remove progress gauge when display is finished. (elmo-nntp-msgdb-create): Ditto. (elmo-nntp-groups-read-response): Ditto. (elmo-nntp-retrieve-headers): Ditto. (elmo-nntp-msgdb-create-message): Ditto. * elmo-pop3.el (elmo-pop3-retrieve-headers): Ditto. (elmo-pop3-msgdb-create-message): Ditto. 2000-04-24 Yuuichi Teranishi * elmo-maildir.el (elmo-maildir-msgdb-create): Use `elmo-msgdb-sort-by-date'. 2000-04-20 Yuuichi Teranishi * elmo2.el (elmo-read-msg-no-cache): Eliminated arguments after `outbuf'. Don't use cache even if it exists. (elmo-read-msg): Don't pass arguments after `outbuf' to `elmo-read-msg-no-cache'. 2000-04-15 Yuuichi Teranishi * elmo-archive.el (elmo-archive-list-folders): Use `file-name-directory' if base folder does not exist. 2000-04-14 Nishimoto Masaki * elmo-archive.el (elmo-archive-list-folders): Don't use `file-name-directory'. 2000-04-07 Yuuichi Teranishi * elmo-dop.el (elmo-dop-queue-flush): Add optional argument `force'. If `force' is non-nil, try flushing all operation queues. 2000-04-03 Yuuichi Teranishi * elmo-pop3.el (elmo-pop3-open-connection): Enclose with as-binary-process. 2000-03-29 Daiki Ueno * elmo-util.el (elmo-display-progress): Fixed. 2000-03-27 Daiki Ueno * elmo-util.el (elmo-display-progress): New function. All other related modules are changed. wanderlust-wanderlust-769699d/elmo/acap.el000066400000000000000000000657541406661363500206100ustar00rootroot00000000000000;;; acap.el --- An ACAP interface. -*- lexical-binding: t -*- ;; Author: Yuuichi Teranishi ;; Keywords: ACAP ;; Copyright (C) 2001 Yuuichi Teranishi ;; This file is not part of GNU Emacs ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;; acap.el is an elisp library providing an interface for talking to ;; ACAP (RFC2244) servers. ;; ;; This is a transcript of short interactive session for demonstration ;; purposes. ;; (setq proc (acap-open "my.acap.server" "username" "CRAM-MD5")) ;; => # ;; ;; (acap-search proc "/addressbook/" '((RETURN ("*"))))) ;; => ((done-ok nil "search completed") ;; (modtime . "20010828091433000010") ;; (entry "user" ;; ((("subdataset" ;; (".")) ;; ("modtime" "20010824004532000003") ;; ("entry" "user")))) ;; (entry "" ;; ((("modtime" "20010824004532000002") ;; ("entry" "") ;; ("dataset.owner" "anonymous") ;; ("dataset.acl" ("$anyone xrwia"))))) ;; ;; (acap-close proc) ;; => t ;; ;; Todo: ;; * Send literal data for STORE. ;;; History: ;; ;; 27 Aug 2001 Created (Some codes are based on imap.el.). ;;; Code: (require 'cl-lib) (require 'sasl) ;; User variables. (defgroup acap nil "Low level ACAP issues." :group 'applications) (defcustom acap-default-user (user-login-name) "Default username to use." :type 'string :group 'acap) (defcustom acap-default-port 674 "Default port for ACAP." :type 'integer :group 'acap) (defcustom acap-stock-passphrase nil "Stock passphrase on memory if t." :type 'boolean :group 'acap) ;; Constants. (defconst acap-server-eol "\r\n" "The EOL string sent from the server.") (defconst acap-client-eol "\r\n" "The EOL string sent from the server.") ;; Internal variables. (defvar acap-state 'closed "ACAP state. Valid states are `closed', `initial', `auth'.") (defvar acap-capability nil "Capability for server.") (defvar acap-reached-tag 0 "Lower limit on command tags that have been parsed.") (defvar acap-tag 0 "Command tag number.") (defvar acap-auth nil "Authenticated mechanism name.") (defvar acap-process nil "Process for the buffer.") (defvar acap-server nil "Server name.") (defvar acap-port nil "Port number.") (defvar acap-response nil "ACAP Response.") (defvar acap-logging-out nil "Non-nil when ACAP is logging out.") (make-variable-buffer-local 'acap-state) (make-variable-buffer-local 'acap-auth) (make-variable-buffer-local 'acap-capability) (make-variable-buffer-local 'acap-reached-tag) (make-variable-buffer-local 'acap-failed-tag) (make-variable-buffer-local 'acap-tag) (make-variable-buffer-local 'acap-server) (make-variable-buffer-local 'acap-port) (make-variable-buffer-local 'acap-response) (make-variable-buffer-local 'acap-logging-out) (defvar acap-network-stream-alist '((default . open-network-stream-as-binary))) (defun acap-network-stream-open (buffer server port &optional type) (let* ((port (or port acap-default-port)) (process (progn (message "Connecting to %s..." server) (funcall (cdr (assq (or type 'default) acap-network-stream-alist)) "ACAP" buffer server port)))) (when process (with-current-buffer buffer (while (and (memq (process-status process) '(open run)) (goto-char (point-min)) (not (setq acap-capability (acap-parse-greeting)))) (message "Waiting for response from %s..." server) (accept-process-output process 1)) (message "Waiting for response from %s...done" server) (when (memq (process-status process) '(open run)) process))))) (defvar acap-passphrase nil) (defvar acap-rp-user nil) (defvar acap-rp-server nil) (defvar acap-rp-auth nil) (defvar acap-passphrase-alist nil) (eval-and-compile (autoload 'ange-ftp-read-passwd "ange-ftp")) (defun acap-read-passphrase (prompt) "Prompt is not used." (or acap-passphrase (progn (setq prompt (format "%s passphrase for %s@%s: " acap-rp-auth acap-rp-user acap-rp-server)) (if (functionp 'read-passwd) (read-passwd prompt) (if (load "passwd" t) (read-passwd prompt) (ange-ftp-read-passwd prompt)))))) ;;; Debug. (defvar acap-debug t) (defvar acap-debug-buffer nil) (defun acap-debug (string) "Insert STRING to the debug buffer." (when acap-debug (if (or (null acap-debug-buffer) (not (bufferp acap-debug-buffer)) (not (buffer-live-p acap-debug-buffer))) (setq acap-debug-buffer (get-buffer-create "*Debug acap*"))) (with-current-buffer acap-debug-buffer (goto-char (point-max)) (insert string)))) ;;; Stock passphrase (Not implemented yet) (defun acap-stock-passphrase (user server auth passphrase) (let ((key (format "%s/%s/%s" user server auth)) pair) (when (setq pair (assoc key acap-passphrase-alist)) (setq acap-passphrase-alist (delete pair acap-passphrase-alist))) (setq acap-passphrase-alist (cons (cons key passphrase) acap-passphrase-alist)))) (defun acap-stocked-passphrase (user server auth) (when acap-stock-passphrase (let ((key (format "%s/%s/%s" user server auth))) (cdr (assoc key acap-passphrase-alist))))) (defun acap-remove-stocked-passphrase (user server auth) (let ((key (format "%s/%s/%s" user server auth))) (setq acap-passphrase-alist (delq (assoc key acap-passphrase-alist) acap-passphrase-alist)))) ;;; Open, Close (defun acap-open (server &optional user auth port type) (let* ((user (or user acap-default-user)) (buffer (get-buffer-create (concat " *acap on " user " at " server))) process tag) (with-current-buffer buffer (erase-buffer) (if acap-process (delete-process acap-process)) (setq process (acap-network-stream-open buffer server port type) acap-process process) (set-buffer-multibyte nil) (buffer-disable-undo) (setq acap-state 'initial) (set-process-filter process 'acap-arrival-filter) (set-process-sentinel process 'acap-sentinel) (while (and (memq (process-status process) '(open run)) (not (eq acap-state 'auth))) (setq acap-auth (unwind-protect (let* ((mechanism (sasl-find-mechanism (if auth (list auth) (cdr (or (assq 'Sasl acap-capability) (assq 'SASL acap-capability)))))) (sclient (sasl-make-client mechanism user "acap" server)) (sasl-read-passphrase 'acap-read-passphrase) (acap-rp-user user) (acap-rp-server server) (acap-rp-auth (sasl-mechanism-name mechanism)) acap-passphrase step response) (unless (string= (sasl-mechanism-name mechanism) "ANONYMOUS") (setq acap-passphrase (acap-read-passphrase nil))) (setq tag (acap-send-command process (concat (format "AUTHENTICATE \"%s\"" (sasl-mechanism-name mechanism)) (if (and (setq step (sasl-next-step sclient nil)) (sasl-step-data step)) (concat " " (prin1-to-string (sasl-step-data step))))))) (when (setq response (acap-wait-for-response process tag)) (while (acap-response-cont-p response) (sasl-step-set-data step (acap-response-cont-string response)) (acap-response-clear process) (if (setq step (sasl-next-step sclient step)) (with-temp-buffer (insert (or (sasl-step-data step) "")) (setq response (acap-send-data-wait process (current-buffer) tag))) (setq response nil))) (if (acap-response-ok-p response) (progn (setq acap-state 'auth) mechanism) (message "Authentication failed.") (sit-for 1)))) nil))) (unless acap-auth (message "acap: Connecting to %s...failed" server)) (setq acap-server server acap-port port) process))) (defun acap-close (process) (with-current-buffer (process-buffer process) (setq acap-logging-out t) (unless (acap-response-ok-p (acap-send-command-wait process "LOGOUT")) (message "Server %s didn't let me log out" acap-server)) (when (memq (process-status process) '(open run)) (delete-process process)) (erase-buffer) t)) ;;; Commands (defun acap-noop (process) "Execute NOOP command on PROCESS." (acap-send-command-wait process "NOOP")) (defun acap-lang (process lang-list) "Execute LANG command on PROCESS." (acap-send-command-wait process (mapconcat 'identity (nconc (list "LANG") (mapcar 'prin1-to-string lang-list)) " "))) (defun acap-search (process target &optional modifier criteria) "Execute SEARCH command on PROCESS. TARGET is a string which specifies what is to be searched \(dataset or context name\). MODIFIER is an alist of modifiers. Each element should be a list like \(MODIFIER-NAME DATA1 DATA2...\). CRITERIA is a search criteria string. If CRITERIA is not specified, \"ALL\" is assumed, Modifiers and search criteria are described in section 6.4.1 of RFC2244. Examples: \(acap-search process \"/addressbook/\" '\((DEPTH 3\) \(RETURN \(\"addressbook.Alias\" \"addressbook.Email\" \"addressbook.List\"\)\)\) \"OR NOT EQUAL \\\"addressbook.Email\\\" \\\"i\;octed\\\" NIL\\ NOT EQUAL \\\"addressbook.Email\\\" \\\"i\;octed\\\" NIL\"\) \(acap-search process \"/addressbook/user/fred/\" '\(\(RETURN \(\"*\"\)\) \"EQUAL \\\"entry\\\" \\\"i\;octed\\\" \\\"A0345\\\"\"\)" (acap-send-command-wait process (concat "SEARCH " (prin1-to-string target) (if modifier " ") (mapconcat 'prin1-to-string (acap-flatten modifier) " ") " " (or criteria "ALL")))) (defun acap-freecontext (process name) "Execute FREECONTEXT command on PROCESS." (acap-send-command-wait process (concat "FREECONTEXT " name))) (defun acap-updatecontext (process names) "Execute UPDATECONTEXT command on PROCESS." (acap-send-command-wait process (mapconcat 'identity (nconc (list "FREECONTEXT") names) " "))) (defun acap-store (process entries) "Execute STORE command on PROCESS. ENTRIES is a store-entry list." (with-temp-buffer ;; As far as I know, current implementation of ACAP server ;; (cyrus-smlacapd 0.5) does not accept literal argument for STORE. ;; If literal argument is available, command arguments can be sent using ;; function `acap-send-command-wait'. (set-buffer-multibyte nil) (insert "STORE (") (let (beg tag) (while entries (cond ((stringp (car entries)) (setq beg (point)) (insert (car entries)) (goto-char beg) (while (re-search-forward "\\\\" nil t) (replace-match "\\\\\\\\")) (goto-char beg) (while (re-search-forward "\"" nil t) (replace-match "\\\\\"")) (goto-char beg) (insert "\"") (goto-char (point-max)) (insert "\"")) ((symbolp (car entries)) (insert (prin1-to-string (car entries))))) (if (cdr entries)(insert " ")) (setq entries (cdr entries))) (insert ")") (goto-char (point-min)) (insert (with-current-buffer (process-buffer process) (number-to-string (setq tag (setq acap-tag (1+ acap-tag))))) " ") (process-send-region process (point-min) (point-max)) (acap-debug (concat (buffer-string) acap-client-eol)) (process-send-string process acap-client-eol) (acap-wait-for-response process tag)))) (defun acap-deletedsince (process name time) "Execute DELETEDSINCE command on PROCESS." (acap-send-command-wait process (concat "DELETEDSINCE " (prin1-to-string name) " " (prin1-to-string (acap-encode-time time))))) (defun acap-setacl (process object identifier rights) "Execute SETACL command on PROCESS." (acap-send-command-wait process (concat "SETACL " (prin1-to-string object) " " (prin1-to-string identifier) " " (prin1-to-string rights)))) (defun acap-deleteacl (process object &optional identifier) "Execute DELETEACL command on PROCESS." (acap-send-command-wait process (concat "DELETEACL " (prin1-to-string object) (if identifier (concat " " (prin1-to-string identifier)))))) (defun acap-myrights (process object) "Execute MYRIGHTS command on PROCESS." (acap-send-command-wait process (concat "MYRIGHTS " (prin1-to-string object)))) (defun acap-listrights (process object identifier) "Execute LISTRIGHTS command on PROCESS." (acap-send-command-wait process (concat "LISTRIGHTS " (prin1-to-string object) " " (prin1-to-string identifier)))) (defun acap-getquota (process dataset) "Execute GETQUOTA command on PROCESS." (acap-send-command-wait process (concat "GETQUOTA " (prin1-to-string dataset)))) ;;; response accessor. (defun acap-response-ok-p (response) (assq 'done-ok response)) (defun acap-response-bye-p (response) (assq 'bye response)) (defun acap-response-bye-message (response) (nth 1 (cdr (assq 'bye response)))) (defun acap-response-cont-p (response) (assq 'cont response)) (defun acap-response-cont-string (response) (cdr (assq 'cont response))) (defun acap-response-body (response) (cdr (or (assq 'done-ok response) (assq 'done-no response) (assq 'done-bad response)))) (defun acap-response-entries (response) (let (entries) (dolist (ent response) (if (eq (car ent) 'entry) (setq entries (cons ent entries)))) entries)) (defun acap-response-entry-entry (entry) (car (cdr entry))) (defun acap-response-entry-return-data-list (entry) (nth 1 (cdr entry))) (defun acap-response-return-data-list-get-value (name return-data-list) (nth 1 (assoc name return-data-list))) (defun acap-response-listrights (response) (cdr (assq 'listrights response))) ;;; Send command, data. (defun acap-response-clear (process) (with-current-buffer (process-buffer process) (setq acap-response nil))) (defun acap-send-command-wait (process command) (acap-wait-for-response process (acap-send-command process command))) (defun acap-send-data-wait (process string tag) (cond ((stringp string) (acap-send-command-1 process string)) ((bufferp string) (with-current-buffer string (acap-response-clear process) (acap-send-command-1 process (format "{%d}" (buffer-size))) (if (acap-response-cont-p (acap-wait-for-response process tag)) (with-current-buffer string (acap-response-clear process) (process-send-region process (point-min) (point-max)) (process-send-string process acap-client-eol))) (acap-debug (concat (buffer-string) acap-client-eol))))) (acap-wait-for-response process tag)) (defun acap-send-command-1 (process cmdstr) (acap-debug (concat "<-" cmdstr acap-client-eol)) (process-send-string process (concat cmdstr acap-client-eol))) (defun acap-send-command (process command) (with-current-buffer (process-buffer process) (setq acap-response nil) (if (not (listp command)) (setq command (list command))) (let ((tag (setq acap-tag (1+ acap-tag))) cmd cmdstr response) (setq cmdstr (concat (number-to-string acap-tag) " ")) (while (setq cmd (pop command)) (cond ((stringp cmd) (setq cmdstr (concat cmdstr cmd))) ((bufferp cmd) (with-current-buffer cmd (setq cmdstr (concat cmdstr (format "{%d}" (buffer-size))))) (unwind-protect (progn (acap-send-command-1 process cmdstr) (setq cmdstr nil response (acap-wait-for-response process tag)) (if (not (acap-response-cont-p response)) (setq command nil) ;; abort command if no cont-req (with-current-buffer cmd (process-send-region process (point-min) (point-max)) (process-send-string process acap-client-eol)))))) (t (error "Unknown command type")))) (when cmdstr (acap-send-command-1 process cmdstr)) tag))) (defun acap-wait-for-response (process tag) (with-current-buffer (process-buffer process) (while (and (not (acap-response-cont-p acap-response)) (< acap-reached-tag tag)) (when (acap-response-bye-p acap-response) (if acap-logging-out (setq acap-response nil) (error "%s" (prog1 (acap-response-bye-message acap-response) (setq acap-response nil))))) (or (and (not (memq (process-status process) '(open run))) (sit-for 1)) (let ((len (/ (point-max) 1024)) message-log-max) (unless (< len 10) (message "acap read: %dk" len)) (accept-process-output process 1)))) (message "") acap-response)) ;;; Sentinel, Filter. (defun acap-sentinel (process _string) (delete-process process)) (defun acap-find-next-line () (when (re-search-forward (concat acap-server-eol "\\|{\\([0-9+]+\\)}" acap-server-eol) nil t) (if (match-string 1) (if (< (point-max) (+ (point) (string-to-number (match-string 1)))) nil (goto-char (+ (point) (string-to-number (match-string 1)))) (acap-find-next-line)) (point)))) (defun acap-arrival-filter (proc string) "ACAP process filter." (acap-debug string) (with-current-buffer (process-buffer proc) (goto-char (point-max)) (insert string) (let (end) (goto-char (point-min)) (while (setq end (acap-find-next-line)) (save-restriction (narrow-to-region (point-min) end) (delete-char (- (length acap-server-eol))) (goto-char (point-min)) (unwind-protect (cond ((or (eq acap-state 'auth) (eq acap-state 'initial) (eq acap-state 'nonauth)) (acap-parse-response)) (t (message "Unknown state %s in arrival filter" acap-state))) (delete-region (point-min) (point-max)))))))) ;;; acap parser. (defsubst acap-forward () (or (eobp) (forward-char))) (defsubst acap-parse-number () (when (looking-at "[0-9]+") (prog1 (string-to-number (match-string 0)) (goto-char (match-end 0))))) (defsubst acap-parse-literal () (when (looking-at "{\\([0-9]+\\)}\r\n") (let ((pos (match-end 0)) (len (string-to-number (match-string 1)))) (if (< (point-max) (+ pos len)) nil (goto-char (+ pos len)) (buffer-substring pos (+ pos len)))))) (defun acap-parse-greeting () (when (looking-at "* ACAP") (goto-char (match-end 0)) (acap-forward) (let (capabilities) (while (eq (following-char) ?\() (push (read (current-buffer)) capabilities) (acap-forward)) (nreverse capabilities)))) ;; resp-body = ["(" resp-code ")" SP] quoted (defun acap-parse-resp-body () (let ((body (read (current-buffer)))) (if (listp body) ; resp-code (list body (read (current-buffer))) (list nil body) ; no resp-code. ))) ;; string = quoted / literal ;; ;; quoted = DQUOTE *QUOTED-CHAR DQUOTE ;; ;; QUOTED-CHAR = / ;; "\" quoted-specials ;; ;; quoted-specials = DQUOTE / "\" ;; ;; TEXT-CHAR = (defsubst acap-parse-string () (cond ((eq (following-char) ?\") (forward-char) (let ((p (point)) (name "")) (skip-chars-forward "^\"\\\\") (setq name (buffer-substring p (point))) (while (eq (following-char) ?\\) (setq p (1+ (point))) (forward-char 2) (skip-chars-forward "^\"\\\\") (setq name (concat name (buffer-substring p (point))))) (forward-char) name)) ((eq (following-char) ?{) (acap-parse-literal)))) ;; nil = "NIL" (defsubst acap-parse-nil () (if (looking-at "NIL") (goto-char (match-end 0)))) ;; entry = entry-name / entry-path ;; entry-name = string-utf8 ;; ;; entry name MUST NOT contain slash ;; ;; MUST NOT begin with "." ;; entry-path = string-utf8 ;; ;; slash-separated path to entry ;; ;; begins with slash (defsubst acap-parse-quoted () (if (eq (following-char) ?\") (read (current-buffer)))) (defun acap-parse-entry () (acap-parse-quoted)) ;; value = string (defun acap-parse-value () (acap-parse-string)) ;; value-list = "(" [value *(SP value)] ")" (defun acap-parse-value-list () ;; same as acl. (when (eq (following-char) ?\() (let (values) (while (/=(following-char) ?\)) (acap-forward) (push (acap-parse-value) values)) (acap-forward) (nreverse values)))) ;; ;; return-data-list = return-data *(SP return-data) ;; ;; return-data = return-metadata / return-metalist / ;; return-attr-list (defun acap-parse-return-data-list () (let (rlist r) (setq rlist (list (acap-parse-return-metadata-or-return-metalist))) (acap-forward) (while (setq r (acap-parse-return-metadata-or-return-metalist)) (setq rlist (nconc rlist (list r))) (acap-forward)) rlist)) (defun acap-parse-return-metadata-or-return-metalist () (or (acap-parse-string) (acap-parse-value-or-return-metalist) (and (acap-parse-nil) nil))) (defun acap-parse-value-or-return-metalist () (when (eq (following-char) ?\() (let (elems) (while (/= (following-char) ?\)) (acap-forward) (push (or (acap-parse-value) (acap-parse-return-metalist)) elems)) (acap-forward) (nreverse elems)))) ;; return-metalist = "(" return-metadata *(SP return-metadata) ")" ;; ;; occurs when multiple metadata items requested ;; (defun acap-parse-return-metalist () (when (eq (following-char) ?\() (let (metadatas) (while (/= (following-char) ?\)) (acap-forward) (push (acap-parse-return-metadata) metadatas)) (acap-forward) (nreverse metadatas)))) ;; return-metadata = nil / string / value-list / acl (defun acap-parse-return-metadata () (or (acap-parse-string) (acap-parse-value-list) (and (acap-parse-nil) nil) ;; (acap-parse-acl) acl is same as value-list. )) ;; return-attr-list = "(" return-metalist *(SP return-metalist) ")" ;; ;; occurs when "*" in RETURN pattern on SEARCH (defun acap-parse-return-attr-list () (when (eq (following-char) ?\() (let (metalists) (while (/= (following-char) ?\)) (acap-forward) (push (acap-parse-return-metalist) metalists)) (acap-forward) (nreverse metalists)))) (defun acap-parse-time () (acap-parse-quoted)) ;; quoted *(SP quoted) (defun acap-parse-quoted-list () (let (qlist q) (setq qlist (list (acap-parse-quoted))) (acap-forward) (while (setq q (acap-parse-quoted)) (setq qlist (nconc qlist (list q))) (acap-forward)) qlist)) (defun acap-parse-any () (read (current-buffer))) (defun acap-parse-extension-data () (let (elist e) (setq elist (list (acap-parse-any))) (acap-forward) (while (setq e (acap-parse-any)) (setq elist (nconc elist (list e))) (acap-forward)) elist)) (defun acap-parse-response () "Parse a ACAP command response." (let ((token (read (current-buffer))) tag) (setq acap-response (cons (cond ((eq token '+) (acap-forward) (cons 'cont (acap-parse-string))) ((eq token '*) ;; untagged response. (cl-case (prog1 (setq token (read (current-buffer))) (acap-forward)) (ADDTO (cons 'addto (list (acap-parse-quoted) (progn (acap-forward) (acap-parse-quoted)) (progn (acap-forward) (acap-parse-number)) (progn (acap-forward) (acap-parse-return-data-list))))) (ALERT ;;; (cons 'alert (acap-parse-resp-body)) (message "%s" (nth 1 (acap-parse-resp-body)))) ((BYE Bye bye) (cons 'bye (acap-parse-resp-body))) (CHANGE (cons 'change (list (acap-parse-quoted) (progn (acap-forward) (acap-parse-quoted)) (progn (acap-forward) (acap-parse-number)) (progn (acap-forward) (acap-parse-number)) (progn (acap-forward) (acap-parse-return-data-list))))) (LANG (cons 'lang (list (acap-parse-quoted-list)))) ;; response-stat (OK (cons 'stat-ok (acap-parse-resp-body))) (NO (cons 'stat-no (acap-parse-resp-body))) (BAD ;;; (cons 'stat-bad (acap-parse-resp-body)) ;; XXX cyrus-sml-acap does not return tagged bad response? (error "%s" (nth 1 (acap-parse-resp-body)))))) ((integerp token) ;; tagged response. (setq tag token) (cl-case (prog1 (setq token (read (current-buffer))) (acap-forward)) (DELETED (cons 'deleted (acap-parse-quoted))) ;; response-done ((OK Ok ok) (prog1 (cons 'done-ok (acap-parse-resp-body)) (setq acap-reached-tag tag))) ((NO No no) (prog1 (cons 'done-no (acap-parse-resp-body)) (setq acap-reached-tag tag))) ((BAD Bad bad) (prog1 (cons 'done-bad (acap-parse-resp-body)) (setq acap-reached-tag tag))) (ENTRY (cons 'entry (list (acap-parse-entry) (progn (acap-forward) (acap-parse-return-data-list))))) (LISTRIGHTS (cons 'listrights (acap-parse-quoted-list))) (MODTIME (cons 'modtime (acap-parse-time))) (MYRIGHTS (cons 'myrights (acap-parse-quoted))) (QUOTA (cons 'quota (list (acap-parse-quoted) (progn (acap-forward) (acap-parse-number)) (progn (acap-forward) (acap-parse-number)) (acap-parse-extension-data)))) (REFER (cons 'refer (list (acap-parse-quoted) (acap-parse-quoted)))) (REMOVEFROM (cons 'removefrom (list (acap-parse-quoted) (progn (acap-forward) (acap-parse-quoted)) (progn (acap-forward) (acap-parse-number))))) ;; response-extend (t ; extend-token (cons 'extend (list token (acap-parse-extension-data)))))) (t ; garbage (list 'garbage token))) acap-response)))) ;;; Utilities. (defun acap-flatten (l) "Flatten list-of-list." (unless (null l) (append (if (and (car l) (listp (car l))) (car l) (list (car l))) (acap-flatten (cdr l))))) (defun acap-flatten-r (l) "Flatten list-of-list recursively." (cond ((null l) '()) ((listp l) (append (acap-flatten (car l)) (acap-flatten (cdr l)))) (t (list l)))) (defun acap-encode-time (time) ;; Universal time. (format-time-string "%Y%m%d%H%M%S" (or time (current-time)) t)) (defun acap-decode-time (acap-time) (when (string-match "^\\([0-9][0-9][0-9][0-9]\\)\\([0-1][0-9]\\)\\([0-3][0-9]\\)\\([0-2][0-9]\\)\\([0-5][0-9]\\)\\([0-5][0-9]\\)" acap-time) (encode-time (string-to-number (match-string 6 acap-time)) (string-to-number (match-string 5 acap-time)) (string-to-number (match-string 4 acap-time)) (string-to-number (match-string 3 acap-time)) (string-to-number (match-string 2 acap-time)) (string-to-number (match-string 1 acap-time)) t))) (provide 'acap) ;;; acap.el ends here wanderlust-wanderlust-769699d/elmo/elmo-access.el000066400000000000000000000105721406661363500220630ustar00rootroot00000000000000;;; elmo-access.el --- Auto Collect Multiple Folder Interface for ELMO. -*- lexical-binding: t -*- ;; Copyright (C) 2005 Yuuichi Teranishi ;; Author: Hiroya Murata ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'elmo) (require 'elmo-multi) (defvar elmo-access-folder-list-filename "flist" "Folder list cache.") (eval-and-compile (luna-define-class elmo-access-folder (elmo-multi-folder) (base-folder)) (luna-define-internal-accessors 'elmo-access-folder)) (luna-define-method elmo-folder-initialize ((folder elmo-access-folder) name) (elmo-access-folder-set-base-folder-internal folder (elmo-get-folder name)) (elmo-multi-folder-set-children-internal folder (mapcar #'elmo-get-folder (elmo-object-load (expand-file-name elmo-access-folder-list-filename (elmo-folder-msgdb-path folder))))) (elmo-multi-folder-set-divide-number-internal folder elmo-multi-divide-number) (elmo-access-folder-update-children folder) (elmo-multi-connect-signals folder) folder) (luna-define-method elmo-folder-expand-msgdb-path ((folder elmo-access-folder)) (expand-file-name (elmo-replace-string-as-filename (elmo-folder-name-internal folder)) (expand-file-name "access" elmo-msgdb-directory))) (defvar elmo-access-substitute-folder nil) (defun elmo-access-substitute-folder () (or elmo-access-substitute-folder (setq elmo-access-substitute-folder (elmo-make-folder "'null")))) (defun elmo-access-folder-update-children (folder &optional open expunge) (elmo-multi-folder-set-children-internal folder (if (elmo-folder-plugged-p (elmo-access-folder-base-folder-internal folder)) (let ((subfolders (elmo-folder-list-subfolders (elmo-access-folder-base-folder-internal folder))) children) (dolist (child (elmo-multi-folder-children-internal folder)) (let ((name (elmo-folder-name-internal child))) (cond ((member name subfolders) (setq children (nconc children (list child)))) (expunge) (t (setq children (nconc children (list (elmo-access-substitute-folder)))))) (setq subfolders (delete name subfolders)))) (if subfolders (nconc children (mapcar (lambda (name) (let ((folder (elmo-get-folder name))) (when open (elmo-folder-open-internal folder)) folder)) subfolders)) children)) (mapcar (lambda (f) (if (elmo-folder-exists-p f) f (elmo-access-substitute-folder))) (elmo-multi-folder-children-internal folder))))) (luna-define-method elmo-folder-open-internal :before ((folder elmo-access-folder)) (elmo-access-folder-update-children folder)) (luna-define-method elmo-folder-commit :after ((folder elmo-access-folder)) (when (elmo-folder-persistent-p folder) (elmo-object-save (expand-file-name elmo-access-folder-list-filename (elmo-folder-msgdb-path folder)) (mapcar 'elmo-folder-name-internal (elmo-multi-folder-children-internal folder))))) (luna-define-method elmo-folder-check :before ((folder elmo-access-folder)) (elmo-access-folder-update-children folder 'open)) (luna-define-method elmo-folder-synchronize :before ((folder elmo-access-folder) &optional _disable-killed ignore-msgdb no-check _mask) (when (or ignore-msgdb (not no-check)) (elmo-access-folder-update-children folder 'open ignore-msgdb))) (luna-define-method elmo-folder-creatable-p ((_folder elmo-access-folder)) nil) (require 'product) (product-provide (provide 'elmo-access) (require 'elmo-version)) ;;; elmo-access.el.el ends here wanderlust-wanderlust-769699d/elmo/elmo-archive.el000066400000000000000000001123371406661363500222450ustar00rootroot00000000000000;;; elmo-archive.el --- Archive folder of ELMO. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000 OKUNISHI Fujikazu ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Author: OKUNISHI Fujikazu ;; Yuuichi Teranishi ;; Keywords: mail, net news ;; Created: Sep 13, 1998 ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;; TODO: ;; Info-Zip 専用エージェントを用いた日本語検索(OS/2 専用)。 ;;; Code: ;; (require 'cl-lib) (require 'elmo) (require 'elmo-msgdb) (require 'elmo-flag) ;;; User vars. (defvar elmo-archive-lha-dos-compatible (memq system-type '(OS/2 emx windows-nt)) "*If non-nil, regard your LHA as compatible to DOS version.") (defvar elmo-archive-use-izip-agent (memq system-type '(OS/2 emx)) "*If non-nil, use the special agent in fetching headers.") (defvar elmo-archive-folder-path "~/Mail" "*Base directory for archive folders.") (defvar elmo-archive-basename "elmo-archive" "*Common basename of archive folder file, w/o suffix.") (defvar elmo-archive-cmdstr-max-length 8000 ; SASAKI Osamu's suggestion "*Command line string limitation under OS/2, exactly 8190 bytes.") (defvar elmo-archive-fetch-headers-volume 50 "*Quantity of article headers to fetch per once.") (defvar elmo-archive-dummy-file ".elmo-archive" "*Name of dummy file that will be appended when the folder is null.") (defvar elmo-archive-check-existance-strict t "*Check existance of archive contents if non-nil.") (defvar elmo-archive-load-hook nil "*Hook called after loading elmo-archive.el.") (defvar elmo-archive-treat-file nil "*Treat archive folder as a file if non-nil.") ;;; User variables for elmo-archive. (defvar elmo-archive-default-type 'zip "*Default archiver type. The value must be a symbol.") (defvar elmo-archive-use-cache nil "Use cache in archive folder.") ;;; ELMO Local directory folder (eval-and-compile (luna-define-class elmo-archive-folder (elmo-folder) (archive-name archive-type archive-prefix dir-name)) (luna-define-internal-accessors 'elmo-archive-folder)) (luna-define-generic elmo-archive-folder-path (folder) "Return local directory path of the FOLDER.") (luna-define-method elmo-archive-folder-path ((_folder elmo-archive-folder)) elmo-archive-folder-path) (defun elmo-intern-soft (str) (if (string= str "") nil (intern-soft str))) (luna-define-method elmo-folder-initialize ((folder elmo-archive-folder) name) (elmo-archive-folder-set-dir-name-internal folder name) (when (string-match "^\\([^;]*\\);?\\([^;]*\\);?\\([^;]*\\)$" name) ;; Drive letter is OK! (or (elmo-archive-folder-set-archive-name-internal folder (match-string 1 name)) (elmo-archive-folder-set-archive-name-internal folder "")) (or (elmo-archive-folder-set-archive-type-internal folder (elmo-intern-soft (match-string 2 name))) (elmo-archive-folder-set-archive-type-internal folder elmo-archive-default-type)) (or (elmo-archive-folder-set-archive-prefix-internal folder (match-string 3 name)) (elmo-archive-folder-set-archive-prefix-internal folder ""))) folder) (luna-define-method elmo-folder-expand-msgdb-path ((folder elmo-archive-folder)) ;; For compatibility (expand-file-name (elmo-replace-string-as-filename (elmo-folder-name-internal folder)) (expand-file-name (concat (symbol-name (elmo-folder-type-internal folder)) "/" (symbol-name (elmo-archive-folder-archive-type-internal folder))) elmo-msgdb-directory))) ;;; MMDF parser -- info-zip agent w/ REXX (defvar elmo-mmdf-delimiter "^\01\01\01\01$" "*Regular expression of MMDF delimiter.") (defvar elmo-unixmail-delimiter "^From \\([^ \t]+\\) \\(.+\\)" "*Regular expression of UNIX Mail delimiter.") (defvar elmo-archive-header-regexp "^[ \t]*[-=][-=][-=][-=]" "*Common regexp of the delimiter in listing archive.") ; marche (defvar elmo-archive-file-regexp-alist (append (if elmo-archive-lha-dos-compatible '((lha . "^%s\\([0-9]+\\)$")) ; OS/2,DOS w/ "-x" '((lha . "^.*[ \t]%s\\([0-9]+\\)$"))) '((zip . "^.*[ \t]%s\\([0-9]+\\)$") (zoo . "^.*[ \t]%s\\([0-9]+\\)$") (tar . "^%s\\([0-9]+\\)$") ; ok (tgz . "^%s\\([0-9]+\\)$") ; ok (rar . "^[ \t]%s\\([0-9]+\\)$")))) (defvar elmo-archive-suffix-alist '((lha . ".lzh") ; default ;;; (lha . ".lzs") (zip . ".zip") (zoo . ".zoo") ;;; (arc . ".arc") ;;; (arj . ".arj") (rar . ".rar") (tar . ".tar") (tgz . ".tar.gz"))) ;;; lha (defvar elmo-archive-lha-method-alist (if elmo-archive-lha-dos-compatible ;; OS/2 '((cp . ("lha" "u" "-x")) (mv . ("lha" "m" "-x")) (rm . ("lha" "d")) (ls . ("lha" "l" "-x")) (cat . ("lha" "p" "-n")) (ext . ("lha" "x")) ; "-x" ) ;; some UN|X '((cp . ("lha" "u")) (mv . ("lha" "m")) (rm . ("lha" "d")) (ls . ("lha" "l")) (cat . ("lha" "pq")) (ext . ("lha" "x"))))) ;;; info-zip/unzip (defvar elmo-archive-zip-method-alist '((cp . ("zip" "-9q")) (cp-pipe . ("zip" "-9q@")) (mv . ("zip" "-mDq9")) (mv-pipe . ("zip" "-mDq9@")) (rm . ("zip" "-dq")) (rm-pipe . ("zip" "-dq@")) (ls . ("unzip" "-lq")) (cat . ("unzip" "-pq")) (ext . ("unzip")) (cat-headers . ("izwlagent" "--cat")))) ;;; zoo (defvar elmo-archive-zoo-method-alist '((cp . ("zoo" "aq")) (cp-pipe . ("zoo" "aqI")) (mv . ("zoo" "aMq")) (mv-pipe . ("zoo" "aMqI")) (rm . ("zoo" "Dq")) (ls . ("zoo" "l")) ; normal (cat . ("zoo" "xpq")) (ext . ("zoo" "xq")))) ;;; rar (defvar elmo-archive-rar-method-alist '((cp . ("rar" "u" "-m5")) (mv . ("rar" "m" "-m5")) (rm . ("rar" "d")) (ls . ("rar" "v")) (cat . ("rar" "p" "-inul")) (ext . ("rar" "x")))) (defvar elmo-archive-gtar-program (or (executable-find "gtar") "tar")) ;;; GNU tar (*.tar) (defvar elmo-archive-tar-method-alist `((ls . (,elmo-archive-gtar-program "-tf")) (cat . (,elmo-archive-gtar-program "--to-stdout" "-xf")) (ext . (,elmo-archive-gtar-program "-xf")) ;;; (rm . (,elmo-archive-gtar-program "--delete" "-f")) ; well not work )) ;;; GNU tar (*.tar.gz, *.tar.Z, *.tar.bz2) (defvar elmo-archive-tgz-method-alist `((ls . (,elmo-archive-gtar-program "-ztf")) (cat . (,elmo-archive-gtar-program "--to-stdout" "-zxf")) (create . (,elmo-archive-gtar-program "-zcf")) ;;; (rm . elmo-archive-tgz-rm-func) (cp . elmo-archive-tgz-cp-func) (mv . elmo-archive-tgz-mv-func) (ext . (,elmo-archive-gtar-program "-zxf")) ;; tgz special method (decompress . ("gzip" "-d")) (compress . ("gzip")) (append . (,elmo-archive-gtar-program "-uf")) ;;; (delete . (,elmo-archive-gtar-program "--delete" "-f")) ; well not work )) (defvar elmo-archive-method-list '(elmo-archive-lha-method-alist elmo-archive-zip-method-alist elmo-archive-zoo-method-alist ;;; elmo-archive-tar-method-alist elmo-archive-tgz-method-alist ;;; elmo-archive-arc-method-alist ;;; elmo-archive-arj-method-alist elmo-archive-rar-method-alist)) ;;; Internal vars. (defvar elmo-archive-method-alist nil) (defvar elmo-archive-suffixes nil) ;;; Macro (defmacro elmo-archive-get-method (type action) `(cdr (assq ,action (cdr (assq ,type elmo-archive-method-alist))))) (defmacro elmo-archive-get-suffix (type) `(cdr (assq ,type elmo-archive-suffix-alist))) (defmacro elmo-archive-get-regexp (type) `(cdr (assq ,type elmo-archive-file-regexp-alist))) (defsubst elmo-archive-call-process (prog args &optional output) (= (apply 'call-process prog nil output nil args) 0)) (defsubst elmo-archive-call-method (method args &optional output) (cond ((functionp method) (funcall method args output)) (t (elmo-archive-call-process (car method) (append (cdr method) args) output)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Scan Folder (defsubst elmo-archive-list-folder-subr (folder &optional nonsort) "*Returns list of number-file(int, not string) in archive FILE. TYPE specifies the archiver's symbol." (let* ((type (elmo-archive-folder-archive-type-internal folder)) (prefix (elmo-archive-folder-archive-prefix-internal folder)) (file (elmo-archive-get-archive-name folder)) (method (elmo-archive-get-method type 'ls)) (args (list file)) (file-regexp (format (elmo-archive-get-regexp type) (elmo-concat-path (regexp-quote prefix) ""))) (killed (elmo-folder-killed-list-internal folder)) numbers file-list header-end) (if (file-exists-p file) (with-temp-buffer (unless (elmo-archive-call-method method args t) (error "%s exited abnormally!" method)) (goto-char (point-min)) (when (re-search-forward elmo-archive-header-regexp nil t) (forward-line) (setq header-end (point)) (when (re-search-forward elmo-archive-header-regexp nil t) (beginning-of-line) (narrow-to-region header-end (point)) (goto-char (point-min)))) (while (and (re-search-forward file-regexp nil t) (not (eobp))) ; for GNU tar 981010 (setq file-list (nconc file-list (list (string-to-number (match-string 1))))))) (error "%s does not exist" file)) (if nonsort (cons (elmo-max-of-list file-list) (if killed (- (length file-list) (elmo-msgdb-killed-list-length killed)) (length file-list))) (setq numbers (sort file-list '<)) (elmo-living-messages numbers killed)))) (luna-define-method elmo-folder-list-messages-internal ((folder elmo-archive-folder) &optional _nohide) (elmo-archive-list-folder-subr folder)) (luna-define-method elmo-folder-status ((folder elmo-archive-folder)) (elmo-archive-list-folder-subr folder t)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Folder related functions (defsubst elmo-archive-get-archive-directory (folder) ;; allow fullpath. return format is "/foo/bar/". (if (file-name-absolute-p (elmo-archive-folder-archive-name-internal folder)) (if (find-file-name-handler (elmo-archive-folder-archive-name-internal folder) 'copy-file) (elmo-archive-folder-archive-name-internal folder) (expand-file-name (elmo-archive-folder-archive-name-internal folder))) (expand-file-name (elmo-archive-folder-archive-name-internal folder) elmo-archive-folder-path))) (defun elmo-archive-get-archive-name (folder) (let ((dir (elmo-archive-get-archive-directory folder)) (suffix (elmo-archive-get-suffix (elmo-archive-folder-archive-type-internal folder))) filename dbdir) (unless suffix (error "Unknown archiver type: %s" (elmo-archive-folder-archive-type-internal folder))) (if elmo-archive-treat-file (if (string-match (concat (regexp-quote suffix) "$") (elmo-archive-folder-archive-name-internal folder)) (expand-file-name (elmo-archive-folder-archive-name-internal folder) elmo-archive-folder-path) (expand-file-name (concat (elmo-archive-folder-archive-name-internal folder) suffix) elmo-archive-folder-path)) (if (string-match "^\\(ange-ftp\\|efs\\)-" (symbol-name (find-file-name-handler dir 'copy-file))) ;; ange-ftp, efs (progn (setq filename (expand-file-name (concat elmo-archive-basename suffix) (setq dbdir (elmo-folder-msgdb-path folder)))) (if (file-directory-p dbdir) (); ok. (if (file-exists-p dbdir) (error "File %s already exists" dbdir) (elmo-make-directory dbdir))) (if (not (file-exists-p filename)) (copy-file (if (file-directory-p dir) (expand-file-name (concat elmo-archive-basename suffix) dir) dir) filename)) filename) (if (or (not (file-exists-p dir)) (file-directory-p dir)) (expand-file-name (concat elmo-archive-basename suffix) dir) dir))))) (luna-define-method elmo-folder-exists-p ((folder elmo-archive-folder)) (file-exists-p (elmo-archive-get-archive-name folder))) (luna-define-method elmo-folder-creatable-p ((_folder elmo-archive-folder)) t) (luna-define-method elmo-folder-writable-p ((_folder elmo-archive-folder)) t) (luna-define-method elmo-folder-create ((folder elmo-archive-folder)) (let* ((dir (directory-file-name ; remove tail slash. (elmo-archive-get-archive-directory folder))) (type (elmo-archive-folder-archive-type-internal folder)) (arc (elmo-archive-get-archive-name folder))) (if elmo-archive-treat-file (setq dir (directory-file-name (file-name-directory dir)))) (cond ((and (file-exists-p dir) (not (file-directory-p dir))) ;; file exists (error "Create folder failed; File \"%s\" exists" dir)) ((file-directory-p dir) (if (file-exists-p arc) t ; return value (elmo-archive-create-file arc type folder))) (t (elmo-make-directory dir) (elmo-archive-create-file arc type folder) t)))) (defun elmo-archive-create-file (archive type folder) (save-excursion (let* ((tmp-dir (directory-file-name (elmo-folder-msgdb-path folder))) (dummy elmo-archive-dummy-file) (method (or (elmo-archive-get-method type 'create) (elmo-archive-get-method type 'mv))) (args (list archive dummy))) (when (null method) (ding) (error "WARNING: read-only mode: %s (method undefined)" type)) (cond ((file-directory-p tmp-dir) ()) ; nop ((file-exists-p tmp-dir) ;; file exists (error "Create directory failed; File \"%s\" exists" tmp-dir)) (t (elmo-make-directory tmp-dir))) (elmo-bind-directory tmp-dir (write-region (point) (point) dummy nil 'no-msg) (prog1 (elmo-archive-call-method method args) (if (file-exists-p dummy) (delete-file dummy))))))) (luna-define-method elmo-folder-delete ((folder elmo-archive-folder)) (let ((msgs (and (elmo-folder-exists-p folder) (elmo-folder-list-messages folder)))) (when (yes-or-no-p (format "%sDelete msgdb and substance of \"%s\"? " (if (> (length msgs) 0) (format "%d msg(s) exists. " (length msgs)) "") (elmo-folder-name-internal folder))) (let ((arc (elmo-archive-get-archive-name folder))) (if (not (file-exists-p arc)) (error "No such file: %s" arc) (delete-file arc)) (elmo-msgdb-delete-path folder) t)))) (luna-define-method elmo-folder-rename-internal ((folder elmo-archive-folder) new-folder) (let* ((old-arc (elmo-archive-get-archive-name folder)) (new-arc (elmo-archive-get-archive-name new-folder)) (new-dir (directory-file-name (elmo-archive-get-archive-directory new-folder)))) (if elmo-archive-treat-file (setq new-dir (directory-file-name (file-name-directory new-dir)))) (unless (and (eq (elmo-archive-folder-archive-type-internal folder) (elmo-archive-folder-archive-type-internal new-folder)) (equal (elmo-archive-folder-archive-prefix-internal folder) (elmo-archive-folder-archive-prefix-internal new-folder))) (error "Not same archive type and prefix")) (unless (file-exists-p old-arc) (error "No such file: %s" old-arc)) (when (file-exists-p new-arc) (error "Already exists: %s" new-arc)) (unless (file-directory-p new-dir) (elmo-make-directory new-dir)) (rename-file old-arc new-arc) t)) (defun elmo-archive-folder-list-subfolders (folder one-level) (if elmo-archive-treat-file (let* ((path (elmo-archive-get-archive-directory folder)) (base-folder (or (elmo-archive-folder-archive-name-internal folder) "")) (suffix (elmo-archive-folder-archive-type-internal folder)) (prefix (if (string= (elmo-archive-folder-archive-prefix-internal folder) "") "" (concat ";" (elmo-archive-folder-archive-prefix-internal folder)))) (dir (if (file-directory-p path) path (file-name-directory path))) (name (if (file-directory-p path) "" (file-name-nondirectory path))) (flist (and (file-directory-p dir) (directory-files dir nil (if (> (length name) 0) (concat "^" name "[^A-z][^A-z]") name) nil))) (regexp (format "^\\(.*\\)\\(%s\\)$" (mapconcat (lambda (x) (regexp-quote (cdr x))) elmo-archive-suffix-alist "\\|")))) (if (string-match "\\(.*\\)/$" base-folder) ; ends with '/'. (setq base-folder (match-string 1 base-folder)) (unless (file-directory-p path) (setq base-folder (or (file-name-directory base-folder) "")))) (delq nil (mapcar (lambda (x) (when (and (string-match regexp x) (eq suffix (car (rassoc (match-string 2 x) elmo-archive-suffix-alist)))) (format "%s%s;%s%s" (elmo-folder-prefix-internal folder) (elmo-concat-path base-folder (match-string 1 x)) suffix prefix))) flist))) (elmo-mapcar-list-of-list (lambda (x) (if (file-exists-p (expand-file-name (concat elmo-archive-basename (elmo-archive-get-suffix (elmo-archive-folder-archive-type-internal folder))) (expand-file-name x (elmo-archive-folder-path folder)))) (concat (elmo-folder-prefix-internal folder) x))) (elmo-list-subdirectories (elmo-archive-folder-path folder) (or (elmo-archive-folder-dir-name-internal folder) "") one-level)))) (luna-define-method elmo-folder-list-subfolders ((folder elmo-archive-folder) &optional one-level) (elmo-archive-folder-list-subfolders folder one-level)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Article file related functions ;;; read(extract) / append(move) / delete(delete) / query(list) (defsubst elmo-archive-message-fetch-internal (folder number) (let* ((type (elmo-archive-folder-archive-type-internal folder)) (arc (elmo-archive-get-archive-name folder)) (prefix (elmo-archive-folder-archive-prefix-internal folder)) (method (elmo-archive-get-method type 'cat)) (args (list arc (elmo-concat-path prefix (number-to-string number))))) (and (file-exists-p arc) (as-binary-process (elmo-archive-call-method method args t)) (progn (elmo-delete-cr-buffer) t)))) (luna-define-method elmo-message-fetch-internal ((folder elmo-archive-folder) number _strategy &optional _section _unseen) (elmo-archive-message-fetch-internal folder number)) (luna-define-method elmo-folder-append-buffer ((folder elmo-archive-folder) &optional flags number return-number) (elmo-archive-folder-append-buffer folder flags number return-number)) ;; verrrrrry slow!! (defun elmo-archive-folder-append-buffer (folder flags number return-number) (let* ((type (elmo-archive-folder-archive-type-internal folder)) (prefix (elmo-archive-folder-archive-prefix-internal folder)) (arc (elmo-archive-get-archive-name folder)) (method (elmo-archive-get-method type 'mv)) (next-num (or number (1+ (if (file-exists-p arc) (car (elmo-folder-status folder)) 0)))) (tmp-dir (elmo-folder-msgdb-path folder)) (src-buffer (current-buffer)) dst-buffer newfile) (when (null method) (ding) (error "WARNING: read-only mode: %s (method undefined)" type)) (with-temp-buffer (let ((tmp-dir (expand-file-name prefix tmp-dir))) (when (not (file-directory-p tmp-dir)) (elmo-make-directory (directory-file-name tmp-dir)))) (setq newfile (elmo-concat-path prefix (number-to-string next-num))) (elmo-bind-directory tmp-dir (if (and (or (functionp method) (car method)) (file-writable-p newfile)) (progn (setq dst-buffer (current-buffer)) (with-current-buffer src-buffer (copy-to-buffer dst-buffer (point-min) (point-max))) (as-binary-output-file (write-region (point-min) (point-max) newfile nil 'no-msg)) (when (elmo-archive-call-method method (list arc newfile)) (elmo-folder-preserve-flags folder (with-current-buffer src-buffer (elmo-msgdb-get-message-id-from-buffer)) flags) (if return-number next-num t))) nil))))) (defun elmo-folder-append-messages-*-archive (folder src-folder numbers same-number) (let ((prefix (elmo-archive-folder-archive-prefix-internal folder))) (cond ((and same-number (null prefix) (elmo-folder-message-file-p src-folder) (elmo-folder-message-file-number-p src-folder)) ;; same-number(localdir, localnews) -> archive (unless (elmo-archive-append-files folder (elmo-folder-message-file-directory src-folder) numbers) (setq numbers nil)) (elmo-progress-notify 'elmo-folder-move-messages (length numbers)) numbers) ((elmo-folder-message-make-temp-file-p src-folder) ;; not-same-number (localdir, localnews), (archive maildir) -> archive (let ((temp-dir (elmo-folder-message-make-temp-files src-folder numbers (unless same-number (1+ (if (file-exists-p (elmo-archive-get-archive-name folder)) (car (elmo-folder-status folder)) 0))))) new-dir base-dir files) (unwind-protect (progn (setq base-dir temp-dir) (when (> (length prefix) 0) (when (file-name-directory prefix) (elmo-make-directory (file-name-directory prefix))) (rename-file temp-dir (setq new-dir (expand-file-name prefix ;; parent of temp-dir..(works in windows?) (expand-file-name ".." temp-dir)))) ;; now temp-dir has name prefix. (setq temp-dir new-dir) ;; parent of prefix becomes base-dir. (setq base-dir (expand-file-name ".." temp-dir))) (setq files (mapcar (lambda (x) (elmo-concat-path prefix x)) (directory-files temp-dir nil "^[^\\.]"))) (unless (elmo-archive-append-files folder base-dir files) (setq numbers nil))) (elmo-delete-directory temp-dir))) (elmo-progress-notify 'elmo-folder-move-messages (length numbers)) numbers) (t (elmo-folder-append-messages folder src-folder numbers same-number 'elmo-folder-append-messages-*-archive))))) (luna-define-method elmo-folder-message-make-temp-file-p ((folder elmo-archive-folder)) (let ((type (elmo-archive-folder-archive-type-internal folder))) (or (elmo-archive-get-method type 'ext-pipe) (elmo-archive-get-method type 'ext)))) (luna-define-method elmo-folder-message-make-temp-files ((folder elmo-archive-folder) numbers &optional start-number) (elmo-archive-folder-message-make-temp-files folder numbers start-number)) (defun elmo-archive-folder-message-make-temp-files (folder numbers start-number) (let* ((tmp-dir-src (elmo-folder-make-temporary-directory folder)) (tmp-dir-dst (elmo-folder-make-temporary-directory folder)) (arc (elmo-archive-get-archive-name folder)) (type (elmo-archive-folder-archive-type-internal folder)) (prefix (elmo-archive-folder-archive-prefix-internal folder)) (p-method (elmo-archive-get-method type 'ext-pipe)) (n-method (elmo-archive-get-method type 'ext)) (tmp-msgs (mapcar (lambda (x) (elmo-concat-path prefix (number-to-string x))) numbers)) number) ;; Expand files in the tmp-dir-src. (elmo-bind-directory tmp-dir-src (cond ((functionp n-method) (funcall n-method (cons arc tmp-msgs))) (p-method (let ((p-prog (car p-method)) (p-prog-arg (cdr p-method))) (elmo-archive-exec-msgs-subr1 p-prog (append p-prog-arg (list arc)) tmp-msgs))) (t (let ((n-prog (car n-method)) (n-prog-arg (cdr n-method))) (elmo-archive-exec-msgs-subr2 n-prog (append n-prog-arg (list arc)) tmp-msgs (length arc)))))) ;; Move files to the tmp-dir-dst. (setq number start-number) (dolist (tmp-file tmp-msgs) (rename-file (expand-file-name tmp-file tmp-dir-src) (expand-file-name (if start-number (number-to-string number) (file-name-nondirectory tmp-file)) tmp-dir-dst)) (if start-number (cl-incf number))) ;; Remove tmp-dir-src. (elmo-delete-directory tmp-dir-src) ;; tmp-dir-dst is the return directory. tmp-dir-dst)) (defun elmo-archive-append-files (folder dir &optional files) (let* ((dst-type (elmo-archive-folder-archive-type-internal folder)) (arc (elmo-archive-get-archive-name folder)) (p-method (elmo-archive-get-method dst-type 'cp-pipe)) (n-method (elmo-archive-get-method dst-type 'cp))) (unless (elmo-folder-exists-p folder) (elmo-folder-create folder)) (unless files (setq files (directory-files dir nil "^[^\\.]"))) (when (null (or p-method n-method)) (ding) (error "WARNING: read-only mode: %s (method undefined)" dst-type)) (save-excursion (elmo-bind-directory dir (cond ((functionp n-method) (funcall n-method (cons arc files))) (p-method (let ((p-prog (car p-method)) (p-prog-arg (cdr p-method))) (elmo-archive-exec-msgs-subr1 p-prog (append p-prog-arg (list arc)) files))) (t (let ((n-prog (car n-method)) (n-prog-arg (cdr n-method))) (elmo-archive-exec-msgs-subr2 n-prog (append n-prog-arg (list arc)) files (length arc))))))))) (luna-define-method elmo-folder-delete-messages-internal ((folder elmo-archive-folder) numbers) (let* ((type (elmo-archive-folder-archive-type-internal folder)) (prefix (elmo-archive-folder-archive-prefix-internal folder)) (arc (elmo-archive-get-archive-name folder)) (p-method (elmo-archive-get-method type 'rm-pipe)) (n-method (elmo-archive-get-method type 'rm)) (numbers (mapcar (lambda (x) (elmo-concat-path prefix (number-to-string x))) numbers))) (cond ((functionp n-method) (funcall n-method (cons arc numbers))) (p-method (let ((p-prog (car p-method)) (p-prog-arg (cdr p-method))) (elmo-archive-exec-msgs-subr1 p-prog (append p-prog-arg (list arc)) numbers))) (n-method (let ((n-prog (car n-method)) (n-prog-arg (cdr n-method))) (elmo-archive-exec-msgs-subr2 n-prog (append n-prog-arg (list arc)) numbers (length arc)))) (t (ding) (error "WARNING: not delete: %s (method undefined)" type))))) (defun elmo-archive-exec-msgs-subr1 (prog args msgs) (with-temp-buffer (insert (mapconcat 'concat msgs "\n")) ;string (= 0 (apply 'call-process-region (point-min) (point-max) prog nil nil nil args)))) (defun elmo-archive-exec-msgs-subr2 (prog args msgs arc-length) (let ((max-len (- elmo-archive-cmdstr-max-length arc-length)) (n (length msgs)) rest i sum) (setq rest msgs) ;string (setq i 1) (setq sum 0) (catch 'done (while (and rest (<= i n)) (mapc (lambda (x) (let* ((len (length x)) (files (member x (reverse rest)))) ;; total(previous) + current + white space (if (<= max-len (+ sum len 1)) (progn (unless (elmo-archive-call-process prog (append args files)) (throw 'done nil)) (setq sum 0) ;; reset (setq rest (nthcdr i rest))) (setq sum (+ sum len 1))) (setq i (1+ i)))) msgs)) (throw 'done (or (not rest) (elmo-archive-call-process prog (append args rest))))))) (defsubst elmo-archive-article-exists-p (arc msg type) (if (not elmo-archive-check-existance-strict) t ; nop (save-excursion ; added 980915 (let* ((method (elmo-archive-get-method type 'ls)) (args (list arc msg)) (buf (get-buffer-create " *ELMO ARCHIVE query*")) (error-msg "\\(no file\\|0 files\\)") ret-val) (set-buffer buf) (erase-buffer) (elmo-archive-call-method method args t) ;; pointer: point-max (setq ret-val (not (re-search-backward error-msg nil t))) (kill-buffer buf) ret-val)))) (defun elmo-archive-tgz-common-func (args exec-type &optional copy) (let* ((arc (car args)) (tmp-msgs (cdr args)) (decompress (elmo-archive-get-method 'tgz 'decompress)) (compress (elmo-archive-get-method 'tgz 'compress)) (exec (elmo-archive-get-method 'tgz exec-type)) (suffix (elmo-archive-get-suffix 'tgz)) (tar-suffix (elmo-archive-get-suffix 'tar)) arc-tar ret-val) (when (null (and decompress compress exec)) (ding) (error "WARNING: special method undefined: %s of %s" (or (if (null decompress) 'decompress) (if (null compress) 'compress) (if (null exec) exec-type)) 'tgz)) (unless tar-suffix (ding) (error "WARNING: `tar' suffix undefined")) (if (string-match (concat (regexp-quote suffix) "$") arc) (setq arc-tar (concat (substring arc 0 (match-beginning 0)) tar-suffix)) (error "%s: not match suffix [%s]" arc suffix)) (and ;; decompress (elmo-archive-call-process (car decompress) (append (cdr decompress) (list arc))) ;; append (or delete) (elmo-archive-exec-msgs-subr2 (car exec) (append (cdr exec) (list arc-tar)) tmp-msgs (length arc-tar)) ;; compress (setq ret-val (elmo-archive-call-process (car compress) (append (cdr compress) (list arc-tar))))) ;; delete temporary messages (if (and (not copy) (eq exec-type 'append)) (while tmp-msgs (if (file-exists-p (car tmp-msgs)) (delete-file (car tmp-msgs))) (setq tmp-msgs (cdr tmp-msgs)))) ret-val)) (defun elmo-archive-tgz-cp-func (args &optional _output) (elmo-archive-tgz-common-func args 'append t)) (defun elmo-archive-tgz-mv-func (args &optional _output) (elmo-archive-tgz-common-func args 'append)) (defun elmo-archive-tgz-rm-func (args &optional _output) (elmo-archive-tgz-common-func args 'delete)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; MessageDB functions (from elmo-localdir.el) (defsubst elmo-archive-msgdb-create-entity-subr (msgdb number) (let (header-end) (set-buffer-multibyte t) (goto-char (point-min)) (if (re-search-forward "\\(^--.*$\\)\\|\\(\n\n\\)" nil t) (setq header-end (point)) (setq header-end (point-max))) (narrow-to-region (point-min) header-end) (elmo-msgdb-create-message-entity-from-header (elmo-msgdb-message-entity-handler msgdb) number))) ;; verrrry slow!! (defsubst elmo-archive-msgdb-create-entity (msgdb method archive number type &optional prefix) (let* ((msg (elmo-concat-path prefix (number-to-string number))) (arg-list (list archive msg))) (when (elmo-archive-article-exists-p archive msg type) ;; insert article. (as-binary-process (elmo-archive-call-method method arg-list t)) (elmo-archive-msgdb-create-entity-subr msgdb number)))) (luna-define-method elmo-folder-msgdb-create ((folder elmo-archive-folder) numbers flag-table) (when numbers (save-excursion ;; 981005 (elmo-with-progress-display (elmo-folder-msgdb-create (length numbers)) "Creating msgdb" (if (and elmo-archive-use-izip-agent (elmo-archive-get-method (elmo-archive-folder-archive-type-internal folder) 'cat-headers)) (elmo-archive-msgdb-create-as-numlist-subr2 folder numbers flag-table) (elmo-archive-msgdb-create-as-numlist-subr1 folder numbers flag-table)))))) (defun elmo-archive-msgdb-create-as-numlist-subr1 (folder numlist flag-table) (let* ((type (elmo-archive-folder-archive-type-internal folder)) (file (elmo-archive-get-archive-name folder)) (method (elmo-archive-get-method type 'cat)) (new-msgdb (elmo-make-msgdb)) entity message-id flags) (with-temp-buffer (while numlist (erase-buffer) (setq entity (elmo-archive-msgdb-create-entity new-msgdb method file (car numlist) type (elmo-archive-folder-archive-prefix-internal folder))) (when entity (setq message-id (elmo-message-entity-field entity 'message-id) flags (elmo-flag-table-get flag-table message-id)) (elmo-global-flags-set flags folder (car numlist) message-id) (elmo-msgdb-append-entity new-msgdb entity flags)) (elmo-progress-notify 'elmo-folder-msgdb-create) (setq numlist (cdr numlist))) new-msgdb))) ;;; info-zip agent (defun elmo-archive-msgdb-create-as-numlist-subr2 (folder numlist flag-table) (let* ((delim1 elmo-mmdf-delimiter) ;; MMDF (type (elmo-archive-folder-archive-type-internal folder)) (prefix (elmo-archive-folder-archive-prefix-internal folder)) (method (elmo-archive-get-method type 'cat-headers)) (prog (car method)) (args (cdr method)) (arc (elmo-archive-get-archive-name folder)) (new-msgdb (elmo-make-msgdb)) n msgs case-fold-search) (with-temp-buffer (while numlist (setq n (min (1- elmo-archive-fetch-headers-volume) (1- (length numlist)))) (setq msgs (reverse (memq (nth n numlist) (reverse numlist)))) (setq numlist (nthcdr (1+ n) numlist)) (erase-buffer) (insert (mapconcat 'concat (mapcar (lambda (x) (elmo-concat-path prefix (number-to-string x))) msgs) "\n")) (as-binary-process (apply 'call-process-region (point-min) (point-max) prog t t nil (append args (list arc)))) (goto-char (point-min)) (cond ((looking-at delim1) ;; MMDF (elmo-msgdb-append new-msgdb (elmo-archive-parse-mmdf folder msgs flag-table))) (t ;; unknown format (error "Unknown format!"))) (elmo-progress-notify 'elmo-folder-msgdb-create))) new-msgdb)) (defun elmo-archive-parse-mmdf (folder msgs flag-table) (let ((delim elmo-mmdf-delimiter) (new-msgdb (elmo-make-msgdb)) number sp ep rest entity message-id flags) (goto-char (point-min)) (setq rest msgs) (while (and rest (re-search-forward delim nil t) (not (eobp))) (setq number (car rest)) (setq sp (1+ (point))) (setq ep (prog2 (re-search-forward delim) (1+ (- (point) (length delim))))) (if (>= sp ep) ; no article! () ; nop (save-excursion (narrow-to-region sp ep) (setq entity (elmo-archive-msgdb-create-entity-subr new-msgdb number) message-id (elmo-message-entity-field entity 'message-id) flags (elmo-flag-table-get flag-table message-id)) (elmo-global-flags-set flags folder number message-id) (elmo-msgdb-append-entity new-msgdb entity flags) (widen))) (forward-line) (setq rest (cdr rest))) new-msgdb)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Search functions (defsubst elmo-archive-field-condition-match (folder number _number-list condition prefix) (save-excursion (let* ((type (elmo-archive-folder-archive-type-internal folder)) (arc (elmo-archive-get-archive-name folder)) (method (elmo-archive-get-method type 'cat)) (args (list arc (elmo-concat-path prefix (number-to-string number))))) (elmo-set-work-buf (when (file-exists-p arc) (as-binary-process (elmo-archive-call-method method args t)) (set-buffer-multibyte t) (decode-mime-charset-region (point-min)(point-max) elmo-mime-charset) (elmo-message-buffer-match-condition condition number)))))) (luna-define-method elmo-folder-search ((folder elmo-archive-folder) condition &optional from-msgs) (let ((case-fold-search nil) ;;; (args (elmo-string-to-list key)) ;;; XXX: I don't know whether `elmo-archive-list-folder' updates match-data. ;;; (msgs (or from-msgs (elmo-archive-list-folder spec))) (msgs (cond ((null from-msgs) (elmo-folder-list-messages folder)) ((listp from-msgs) from-msgs) (t (elmo-folder-list-messages folder 'visible 'in-msgdb)))) ret-val) (elmo-with-progress-display (elmo-folder-search (length msgs)) "Searching" (dolist (number msgs) (when (elmo-archive-field-condition-match folder number msgs condition (elmo-archive-folder-archive-prefix-internal folder)) (setq ret-val (cons number ret-val))) (elmo-progress-notify 'elmo-folder-search))) (nreverse ret-val))) ;;; method(alist) (if (null elmo-archive-method-alist) (let ((mlist elmo-archive-method-list) ; from mew-highlight.el method type str) (while mlist (setq method (car mlist)) (setq mlist (cdr mlist)) (setq str (symbol-name method)) (string-match "elmo-archive-\\([^-].*\\)-method-alist$" str) (setq type (intern-soft (match-string 1 str))) (setq elmo-archive-method-alist (cons (cons type (symbol-value method)) elmo-archive-method-alist))))) ;;; valid suffix(list) (if (null elmo-archive-suffixes) (let ((slist elmo-archive-suffix-alist) tmp) (while slist (setq tmp (car slist)) (setq elmo-archive-suffixes (nconc elmo-archive-suffixes (list (cdr tmp)))) (setq slist (cdr slist))))) (luna-define-method elmo-message-use-cache-p ((_folder elmo-archive-folder) _number) elmo-archive-use-cache) ;;; End (run-hooks 'elmo-archive-load-hook) (require 'product) (product-provide (provide 'elmo-archive) (require 'elmo-version)) ;;; elmo-archive.el ends here wanderlust-wanderlust-769699d/elmo/elmo-cache.el000066400000000000000000000133661406661363500216710ustar00rootroot00000000000000;;; elmo-cache.el --- Cache modules for ELMO. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Copyright (C) 2000 Kenichi OKADA ;; Author: Yuuichi Teranishi ;; Kenichi OKADA ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'elmo-vars) (require 'elmo-util) (require 'elmo) (require 'elmo-map) (require 'elmo-flag) (eval-and-compile (luna-define-class elmo-cache-folder (elmo-map-folder elmo-file-tag) (dir-name directory)) (luna-define-internal-accessors 'elmo-cache-folder)) (luna-define-method elmo-folder-initialize ((folder elmo-cache-folder) name) (when (string-match "\\([^/]*\\)/?\\(.*\\)$" name) (elmo-cache-folder-set-dir-name-internal folder (match-string 2 name)) (elmo-cache-folder-set-directory-internal folder (expand-file-name (match-string 2 name) elmo-cache-directory)) folder)) (luna-define-method elmo-folder-expand-msgdb-path ((folder elmo-cache-folder)) (expand-file-name (elmo-cache-folder-dir-name-internal folder) (expand-file-name "internal/cache" elmo-msgdb-directory))) (luna-define-method elmo-map-folder-list-message-locations ((folder elmo-cache-folder)) (elmo-cache-folder-list-message-locations folder)) (defun elmo-cache-folder-list-message-locations (folder) (mapcar 'file-name-nondirectory (elmo-delete-if 'file-directory-p (directory-files (elmo-cache-folder-directory-internal folder) t "^\\([^@]+@[^@]+\\|[0-9A-Za-z]+\\)$" t)))) (luna-define-method elmo-folder-list-subfolders ((folder elmo-cache-folder) &optional _one-level) (delq nil (mapcar (lambda (f) (if (file-directory-p f) (concat (elmo-folder-prefix-internal folder) "cache/" (file-name-nondirectory f)))) (directory-files (elmo-cache-folder-directory-internal folder) t "^[01][0-9A-F]$")))) (luna-define-method elmo-folder-message-file-p ((_folder elmo-cache-folder)) t) (luna-define-method elmo-message-file-name ((folder elmo-cache-folder) number) (expand-file-name (elmo-map-message-location folder number) (elmo-cache-folder-directory-internal folder))) (luna-define-method elmo-folder-msgdb-create ((folder elmo-cache-folder) numbers flag-table) (let ((new-msgdb (elmo-make-msgdb)) entity message-id flags) (elmo-with-progress-display (elmo-folder-msgdb-create (length numbers)) "Creating msgdb" (dolist (number numbers) (setq entity (elmo-msgdb-create-message-entity-from-file (elmo-msgdb-message-entity-handler new-msgdb) number (elmo-message-file-name folder number))) (when entity (setq message-id (elmo-message-entity-field entity 'message-id) flags (elmo-flag-table-get flag-table message-id)) (elmo-global-flags-set flags folder number message-id) (elmo-msgdb-append-entity new-msgdb entity flags)) (elmo-progress-notify 'elmo-folder-msgdb-create))) new-msgdb)) (luna-define-method elmo-folder-append-buffer ((folder elmo-cache-folder) &optional flags _number _return-number) ;; dir-name is changed according to msgid. (unless (elmo-cache-folder-dir-name-internal folder) (let ((msgid (elmo-msgdb-get-message-id-from-buffer)) file dir) (when msgid (setq file (elmo-file-cache-get-path msgid)) (setq dir (directory-file-name (file-name-directory file))) (unless (file-exists-p dir) (elmo-make-directory dir)) (when (and (file-writable-p file) (not (file-exists-p file))) (write-region-as-binary (point-min) (point-max) file nil 'no-msg) (elmo-folder-preserve-flags folder msgid flags) t))))) (luna-define-method elmo-map-folder-delete-messages ((folder elmo-cache-folder) locations) (dolist (location locations) (elmo-file-cache-delete (expand-file-name location (elmo-cache-folder-directory-internal folder)))) t) (luna-define-method elmo-message-fetch ((folder elmo-cache-folder) number strategy &optional unseen section) ;; disable cache process (erase-buffer) (when (elmo-message-fetch-internal folder number strategy section unseen) (when (and (not unseen) (elmo-message-flagged-p folder number 'unread)) (elmo-message-unset-flag folder number 'unread)) t)) (luna-define-method elmo-map-message-fetch ((folder elmo-cache-folder) location _strategy &optional _section _unseen) (let ((file (expand-file-name location (elmo-cache-folder-directory-internal folder)))) (when (file-exists-p file) (insert-file-contents-literally file)))) (luna-define-method elmo-folder-writable-p ((_folder elmo-cache-folder)) t) (luna-define-method elmo-folder-exists-p ((_folder elmo-cache-folder)) t) (luna-define-method elmo-message-file-p ((_folder elmo-cache-folder) _number) t) (require 'product) (product-provide (provide 'elmo-cache) (require 'elmo-version)) ;;; elmo-cache.el ends here wanderlust-wanderlust-769699d/elmo/elmo-date.el000066400000000000000000000164371406661363500215450ustar00rootroot00000000000000;;; elmo-date.el --- Date processing module for ELMO. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Author: Yuuichi Teranishi ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'path-util) (require 'timezone) (require 'elmo-vars) (require 'elmo-util) (make-obsolete 'elmo-match-string 'match-string "26 Aug 2012") (defalias 'elmo-match-buffer 'match-string-no-properties) (make-obsolete 'elmo-match-buffer 'match-string-no-properties "24 May 2020") (make-obsolete 'elmo-replace-in-string 'replace-regexp-in-string "17 Jun 2020") (defvar elmo-date-descriptions '((yesterday . [0 0 1]) (lastweek . [0 0 7]) (lastmonth . [0 1 0]) (lastyear . [1 0 0]))) (defun elmo-date-get-description (datevec) (format "%d-%s-%d" (aref datevec 2) (car (rassq (aref datevec 1) timezone-months-assoc)) (aref datevec 0))) (defun elmo-date-get-datevec (description) (cond ((not elmo-date-match) (error "Date match is not available")) ((string-match "^[ \t]*\\([0-9]+\\)?[ \t]*\\([a-zA-Z]+\\)$" description) (let ((today (save-match-data (timezone-fix-time (current-time-string) (current-time-zone) nil))) (number (string-to-number (if (match-beginning 1) (match-string 1 description) "0"))) (suffix (downcase (match-string 2 description))) pair) (if (setq pair (assq (intern suffix) elmo-date-descriptions)) (elmo-datevec-substitute today (cdr pair)) (if (string= "daysago" suffix) (elmo-date-get-offset-datevec today number) (error "%s is not supported yet" suffix))))) ((string-match "[0-9]+-[A-Za-z]+-[0-9]+" description) (timezone-fix-time (concat (elmo-replace-char-in-string ?- ? description t) " 0:0") (current-time-zone) nil)) ((string-match "\\([0-9]+\\)-\\([0-9]+\\)-\\([0-9]+\\)" description) (vector (string-to-number (match-string 1 description)) (string-to-number (match-string 2 description)) (string-to-number (match-string 3 description)) 0 0 0 (current-time-zone))))) (defun elmo-datevec-substitute (datevec1 datevec2) (if (/= (aref datevec2 2) 0) (elmo-date-get-offset-datevec datevec1 (aref datevec2 2)) (let ((year (- (aref datevec1 0) (aref datevec2 0))) (month (- (aref datevec1 1) (aref datevec2 1))) (timezone (current-time-zone))) (while (<= month 0) (setq year (1- year) month (+ 12 month))) (timezone-fix-time (format "%d %s %d 0:00 %s" (aref datevec1 2) (car (rassq month timezone-months-assoc)) year (cadr timezone)) nil nil)))) (defun elmo-date-get-week (year month day) (when (< month 3) (setq month (+ month 12) year (1- year))) (let ((C (/ year 100)) (Y (% year 100))) (aref (symbol-value (intern (concat "elmo-weekday-name-" elmo-lang))) (% (+ day (/ (* 13 (1+ month)) 5) Y (/ Y 4) (* 5 C) (/ C 4) 6) 7)))) (defun elmo-date-get-offset-datevec (datevec offset &optional time) (let ((year (aref datevec 0)) (month (aref datevec 1)) (day (aref datevec 2)) (hour (aref datevec 3)) (minute (aref datevec 4)) (second (aref datevec 5)) (timezone (aref datevec 6)) day-number p day-of-month) (setq p 1) (setq day-number (- (timezone-day-number month day year) offset)) (while (<= day-number 0) (setq year (1- year) day-number (+ (timezone-day-number 12 31 year) day-number))) (while (> day-number (setq day-of-month (timezone-last-day-of-month p year))) (setq day-number (- day-number day-of-month)) (setq p (1+ p))) (setq month p) (setq day day-number) (timezone-fix-time (format "%d %s %d %s %s" day (car (rassq month timezone-months-assoc)) year (if time (format "%d:%d:%d" hour minute second) "0:00") (cadr timezone)) nil nil))) (defmacro elmo-date-make-sortable-string (datevec) "Make a sortable string from DATEVEC." `(timezone-make-sortable-date (aref ,datevec 0) (aref ,datevec 1) (aref ,datevec 2) (timezone-make-time-string (aref ,datevec 3) (aref ,datevec 4) (aref ,datevec 5)))) (defsubst elmo-datevec-to-time (datevec) (encode-time (aref datevec 5) (aref datevec 4) (aref datevec 3) (aref datevec 2) (aref datevec 1) (aref datevec 0) (aref datevec 6))) (defun elmo-time-parse-date-string (date) (ignore-errors (elmo-datevec-to-time (timezone-fix-time date nil nil)))) (defun elmo-time-make-date-string (time) (let ((system-time-locale "C")) (format-time-string "%a, %d %b %Y %T %z" time))) (defun elmo-time-make-imap-date-string (&optional time) (let ((system-time-locale "C")) (format-time-string "%d-%b-%Y %T %z" time))) (defalias 'elmo-time-less-p 'time-less-p) (make-obsolete 'elmo-time-less-p 'time-less-p "24 May 2020") (defalias 'elmo-time< 'time-less-p) (make-obsolete 'elmo-time< 'time-less-p "24 May 2020") (defun elmo-time-to-days (time) (let ((date (decode-time time))) (timezone-absolute-from-gregorian (nth 4 date) (nth 3 date) (nth 5 date)))) ;; from timezone-fix-time in `timezone.el' (defun elmo-time-to-datevec (time &optional timezone) (when time (let* ((date (decode-time time)) (year (nth 5 date)) (month (nth 4 date)) (day (nth 3 date)) (hour (nth 2 date)) (minute (nth 1 date)) (second (nth 0 date)) (local (nth 8 date)) (timezone (or timezone (timezone-time-zone-from-absolute (timezone-absolute-from-gregorian month day year) (+ second (* 60 (+ minute (* 60 hour))))))) (diff (- (timezone-zone-to-minute timezone) (/ local 60))) (minute (+ minute diff)) (hour-fix (floor minute 60))) (setq hour (+ hour hour-fix)) (setq minute (- minute (* 60 hour-fix))) ;; HOUR may be larger than 24 or smaller than 0. (cond ((<= 24 hour) ;24 -> 00 (setq hour (- hour 24)) (setq day (1+ day)) (when (< (timezone-last-day-of-month month year) day) (setq month (1+ month)) (setq day 1) (when (< 12 month) (setq month 1) (setq year (1+ year))))) ((> 0 hour) (setq hour (+ hour 24)) (setq day (1- day)) (when (> 1 day) (setq month (1- month)) (when (> 1 month) (setq month 12) (setq year (1- year))) (setq day (timezone-last-day-of-month month year))))) (vector year month day hour minute second timezone)))) (require 'product) (product-provide (provide 'elmo-date) (require 'elmo-version)) ;;; elmo-date.el ends here wanderlust-wanderlust-769699d/elmo/elmo-dop.el000066400000000000000000000343041406661363500214030ustar00rootroot00000000000000;;; elmo-dop.el --- Modules for Disconnected Operations on ELMO. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Author: Yuuichi Teranishi ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'cl-lib) (require 'elmo) (require 'elmo-vars) (require 'elmo-msgdb) (require 'elmo-util) (require 'elmo-localdir) ;; global variable. (defvar elmo-dop-queue nil "A list of (folder-name function-to-be-called argument-list). Automatically loaded/saved.") (defmacro elmo-make-dop-queue (fname method arguments) "Make a dop queue." `(vector ,fname ,method ,arguments)) (defmacro elmo-dop-queue-fname (queue) "Return the folder name string of the QUEUE." `(aref ,queue 0)) (defmacro elmo-dop-queue-method (queue) "Return the method symbol of the QUEUE." `(aref ,queue 1)) (defmacro elmo-dop-queue-arguments (queue) "Return the arguments of the QUEUE." `(aref ,queue 2)) (defun elmo-dop-queue-append (folder method arguments) "Append to disconnected operation queue." (let ((queue (elmo-make-dop-queue (elmo-folder-name-internal folder) method arguments))) (setq elmo-dop-queue (nconc elmo-dop-queue (list queue))))) (defvar elmo-dop-queue-merge-method-list '(elmo-folder-set-read-delayed elmo-folder-unset-read-delayed elmo-folder-set-important-delayed elmo-folder-unset-important-delayed elmo-folder-set-answered-delayed elmo-folder-unset-answered-delayed)) (defvar elmo-dop-queue-method-name-alist '((elmo-folder-append-buffer-dop-delayed . "Append") (elmo-folder-delete-messages-dop-delayed . "Delete") (elmo-message-encache . "Encache") (elmo-folder-create-dop-delayed . "Create") (elmo-folder-set-read-delayed . "Read") (elmo-folder-unset-read-delayed . "Unread") (elmo-folder-set-answered-delayed . "Answered") (elmo-folder-unset-answered-delayed . "Unanswered") (elmo-folder-set-important-delayed . "Important") (elmo-folder-unset-important-delayed . "Unimportant") (elmo-folder-set-flag . "Set flag") (elmo-folder-unset-flag . "Unset flag"))) (defmacro elmo-dop-queue-method-name (queue) `(cdr (assq (elmo-dop-queue-method ,queue) elmo-dop-queue-method-name-alist))) (defun elmo-dop-queue-flush () "Flush disconnected operations that consern plugged folders." ;; obsolete (unless (or (null elmo-dop-queue) (vectorp (car elmo-dop-queue))) (if (y-or-n-p "\ Saved queue is old version(2.6). Clear all pending operations? ") (progn (setq elmo-dop-queue nil) (message "All pending operations are cleared.") (elmo-dop-queue-save)) (error "Please use 2.6 or earlier"))) (elmo-dop-queue-merge) (let ((queue-all elmo-dop-queue) queue (count 0)) (while queue-all (if (elmo-folder-plugged-p (elmo-get-folder (elmo-dop-queue-fname (car queue-all)))) (setq queue (append queue (list (car queue-all))))) (setq queue-all (cdr queue-all))) (setq count (length queue)) (when (> count 0) (if (elmo-y-or-n-p (format "%d pending operation(s) exists. Perform now? " count) (not elmo-dop-flush-confirm) t) (progn (message "") (sit-for 0) (let ((queue elmo-dop-queue) (performed 0) (i 0) (num (length elmo-dop-queue)) folder failure) (while queue ;; now perform pending processes. (setq failure nil) (setq i (+ 1 i)) (message "Flushing queue....%d/%d." i num) (condition-case err (progn (apply (elmo-dop-queue-method (car queue)) (prog1 (setq folder (elmo-get-folder (elmo-dop-queue-fname (car queue)))) (elmo-folder-open folder) (unless (elmo-folder-plugged-p folder) (error "Unplugged"))) (elmo-dop-queue-arguments (car queue))) (elmo-folder-close folder)) (quit (setq failure t)) (error (setq failure err))) (if failure (); (setq elmo-dop-queue (delq (car queue) elmo-dop-queue)) (setq performed (+ 1 performed))) (setq queue (cdr queue))) (message "%d/%d operation(s) are performed successfully." performed num) (sit-for 0) ; (elmo-dop-queue-save))) ;; when answer=NO against performing dop (if (elmo-y-or-n-p "Clear these pending operations? " (not elmo-dop-flush-confirm) t) (progn (while queue (when (eq (elmo-dop-queue-method (car queue)) 'elmo-folder-append-buffer-dop-delayed) (elmo-folder-move-messages (elmo-dop-spool-folder (elmo-get-folder (elmo-dop-queue-fname (car queue)))) (list (nth 1 (elmo-dop-queue-arguments (car queue)))) (elmo-get-folder elmo-lost+found-folder))) (setq elmo-dop-queue (delq (car queue) elmo-dop-queue)) (setq queue (cdr queue))) (message "Pending operations are cleared.") (elmo-dop-queue-save)) (message ""))) count))) (defun elmo-dop-queue-merge () (let ((queue elmo-dop-queue) new-queue match-queue que) (while (setq que (car queue)) (if (and (memq (elmo-dop-queue-method que) elmo-dop-queue-merge-method-list) (setq match-queue (car (delete nil (mapcar (lambda (nqueue) (if (and (string= (elmo-dop-queue-fname que) (elmo-dop-queue-fname nqueue)) (string= (elmo-dop-queue-method que) (elmo-dop-queue-method nqueue))) nqueue)) new-queue))))) (setcar (elmo-dop-queue-arguments match-queue) (append (car (elmo-dop-queue-arguments match-queue)) (car (elmo-dop-queue-arguments que)))) (setq new-queue (nconc new-queue (list que)))) (setq queue (cdr queue)) ) (setq elmo-dop-queue new-queue))) ;;; dop spool folder (defun elmo-dop-spool-folder (folder) "Return a spool folder for disconnected operations which is corresponded to the FOLDER." (elmo-make-folder (concat "+" (expand-file-name "spool" (elmo-folder-msgdb-path folder))) nil (elmo-folder-mime-charset-internal folder))) (defun elmo-dop-spool-folder-append-buffer (folder flags) "Append current buffer content to the dop spool folder. FOLDER is the folder structure. Return a message number." (let ((spool (elmo-dop-spool-folder folder))) (unless (elmo-folder-exists-p spool) (elmo-folder-create spool)) (let ((new-number (1+ (car (elmo-folder-status spool))))) (elmo-folder-append-buffer spool flags new-number) new-number))) (defun elmo-dop-spool-folder-list-messages (folder) "List messages in the dop spool folder. FOLDER is the folder structure." (setq folder (elmo-dop-spool-folder folder)) (if (elmo-folder-exists-p folder) (elmo-folder-list-messages folder))) (defun elmo-dop-list-deleting-messages (folder) "List messages which are on the deleting queue for the folder. FOLDER is the folder structure." (let (messages) (dolist (queue elmo-dop-queue) (if (and (string= (elmo-dop-queue-fname queue) (elmo-folder-name-internal folder)) (eq (elmo-dop-queue-method queue) 'elmo-folder-delete-messages-dop-delayed)) (setq messages (nconc messages (mapcar 'car (car (elmo-dop-queue-arguments queue))))))))) (defun elmo-dop-filter-pending-messages (numbers) (elmo-delete-if (lambda (number) (< number 0)) numbers)) ;;; DOP operations. (defsubst elmo-folder-append-buffer-dop (folder &optional flag number) (elmo-dop-queue-append folder 'elmo-folder-append-buffer-dop-delayed (list flag (elmo-dop-spool-folder-append-buffer folder flag) number))) (defsubst elmo-folder-delete-messages-dop (folder numbers) (let ((spool-folder (elmo-dop-spool-folder folder)) queue) (dolist (number numbers) (if (< number 0) (progn ;; delete from queue (elmo-folder-delete-messages spool-folder (list (abs number))) (dolist (queue elmo-dop-queue) (when (and (eq (elmo-dop-queue-fname queue) (elmo-folder-name-internal folder)) (eq (elmo-dop-queue-method queue) 'elmo-folder-append-buffer-dop-delayed) (eq (abs number) (nth 1 (elmo-dop-queue-arguments queue)))) (setq elmo-dop-queue (delq queue elmo-dop-queue))))) (setq queue (cons number queue)))) (when queue (elmo-dop-queue-append folder 'elmo-folder-delete-messages-dop-delayed (list (mapcar (lambda (number) (cons number (elmo-message-field folder number 'message-id))) queue)))) t)) (defsubst elmo-message-encache-dop (folder number &optional read) (elmo-dop-queue-append folder 'elmo-message-encache (list number read))) (defsubst elmo-folder-create-dop (folder) (elmo-dop-queue-append folder 'elmo-folder-create-dop-delayed nil)) (defsubst elmo-folder-set-flag-dop (folder numbers flag) (when (setq numbers (elmo-dop-filter-pending-messages numbers)) (let ((method (cl-case flag (unread 'elmo-folder-unset-read-delayed) (read 'elmo-folder-set-read-delayed) (important 'elmo-folder-set-important-delayed) (answered 'elmo-folder-set-answered-delayed)))) (if method (elmo-dop-queue-append folder method (list numbers)) (elmo-dop-queue-append folder 'elmo-folder-set-flag (list numbers flag)))))) (defsubst elmo-folder-unset-flag-dop (folder numbers flag) (when (setq numbers (elmo-dop-filter-pending-messages numbers)) (let ((method (cl-case flag (unread 'elmo-folder-set-read-delayed) (read 'elmo-folder-unset-read-delayed) (important 'elmo-folder-unset-important-delayed) (answered 'elmo-folder-unset-answered-delayed)))) (if method (elmo-dop-queue-append folder method (list numbers)) (elmo-dop-queue-append folder 'elmo-folder-unset-flag (list numbers flag)))))) ;;; Execute as subsutitute for plugged operation. (defun elmo-folder-status-dop (folder) (let ((number-list (elmo-folder-list-messages folder nil 'in-msgdb)) (spool-folder (elmo-dop-spool-folder folder)) spool-length max-num) (setq spool-length (or (if (elmo-folder-exists-p spool-folder) (car (elmo-folder-status spool-folder))) 0)) (setq max-num (if number-list (apply #'max number-list) 0)) (cons (+ max-num spool-length) (+ (length number-list) spool-length)))) (defun elmo-folder-next-message-number-dop (folder) (let ((spool-folder (elmo-dop-spool-folder folder))) (- (1+ (elmo-max-of-list (elmo-folder-list-messages spool-folder)))))) ;;; Delayed operation (executed at online status). (defun elmo-folder-append-buffer-dop-delayed (folder flag number set-number) (let ((spool-folder (elmo-dop-spool-folder folder)) flags) (with-temp-buffer (when (elmo-message-fetch spool-folder number (elmo-make-fetch-strategy 'entire) 'unread) (setq flags (or (elmo-message-flags-for-append folder (* -1 number)) (cond ((listp flag) flag) ;; for compatibility with 2.11.12 or earlier ((eq flag t) nil) (t (list flag))))) (when (or (condition-case nil (let ((new-num (elmo-folder-next-message-number folder))) (prog1 (elmo-folder-append-buffer folder flags set-number) (elmo-emit-signal 'message-number-changed folder (- number) new-num))) (error)) ;; Append failed... (elmo-folder-append-buffer (elmo-get-folder elmo-lost+found-folder) flags)) (elmo-folder-delete-messages spool-folder (list number))))) ;; ignore failure (already dequed) t)) (defun elmo-folder-delete-messages-dop-delayed (folder number-alist) (ignore-errors (elmo-folder-delete-messages folder ;; messages are deleted only if message-id is not changed. (delq nil (mapcar (lambda (pair) (let ((number (car pair))) (if (string= (cdr pair) (or (elmo-message-fetch-field folder number 'message-id) ;; For the case that message doesn't have ;; Message-ID header. (elmo-msgdb-message-field (elmo-folder-msgdb-create folder (list number) nil) number 'message-id))) number (message "Cancel to delete message %s/%d, which may change" (elmo-folder-name-internal folder) number) nil))) number-alist)))) ;; Always success (If failure, just remain) t) (defun elmo-folder-create-dop-delayed (folder) (unless (elmo-folder-exists-p folder) (elmo-folder-create folder))) (defun elmo-folder-set-important-delayed (folder numbers) (elmo-folder-set-flag folder numbers 'important)) (defun elmo-folder-unset-important-delayed (folder numbers) (elmo-folder-unset-flag folder numbers 'important)) (defun elmo-folder-set-read-delayed (folder numbers) (elmo-folder-unset-flag folder numbers 'unread)) (defun elmo-folder-unset-read-delayed (folder numbers) (elmo-folder-set-flag folder numbers 'unread)) (defun elmo-folder-set-answered-delayed (folder numbers) (elmo-folder-set-flag folder numbers 'answered)) (defun elmo-folder-unset-answered-delayed (folder numbers) (elmo-folder-unset-flag folder numbers 'answered)) ;;; Util (defun elmo-dop-msgdb (msgdb) (let ((new-db (elmo-make-msgdb)) entity) (dolist (dop-entity (mapcar (lambda (number) (setq entity (elmo-msgdb-message-entity msgdb number)) (elmo-message-entity-set-number entity (* -1 (elmo-message-entity-number entity))) entity) (elmo-msgdb-list-messages msgdb))) (elmo-msgdb-append-entity new-db dop-entity (elmo-msgdb-flags msgdb (abs (elmo-message-entity-number dop-entity))))) new-db)) (require 'product) (product-provide (provide 'elmo-dop) (require 'elmo-version)) ;;; elmo-dop.el ends here wanderlust-wanderlust-769699d/elmo/elmo-file.el000066400000000000000000000214611406661363500215400ustar00rootroot00000000000000;;; elmo-file.el --- File interface for ELMO. -*- lexical-binding: t -*- ;; Copyright (C) 2000 Yuuichi Teranishi ;; Author: Yuuichi Teranishi ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'cl-lib) (require 'elmo) (require 'elmo-map) (require 'mime-edit) (defun elmo-file-find (files) "Return the first existing filename in the FILES." (let (file) (while files (when (file-exists-p (car files)) (setq file (car files) files nil)) (setq files (cdr files))) (and file (expand-file-name file)))) (defcustom elmo-file-command (exec-installed-p "file") "*Program name of the file type detection command `file'." :type '(string :tag "Program name of the file") :group 'elmo) (defcustom elmo-file-command-argument '("-i") "*Argument list for the `file' command. \(It should return the MIME content type\)" :type '(repeat string) :group 'elmo) (defcustom elmo-file-fetch-max-size (* 1024 1024) "*Max size of the message fetching." :type 'integer :group 'elmo) (eval-and-compile (luna-define-class elmo-file-folder (elmo-map-folder elmo-file-tag) (file-path)) (luna-define-internal-accessors 'elmo-file-folder)) (luna-define-method elmo-folder-initialize ((folder elmo-file-folder) name) (elmo-file-folder-set-file-path-internal folder name) folder) (luna-define-method elmo-folder-expand-msgdb-path ((folder elmo-file-folder)) (expand-file-name (elmo-replace-string-as-filename (elmo-folder-name-internal folder)) (expand-file-name "file" elmo-msgdb-directory))) (defun elmo-file-make-date-string (attrs) (let ((s (current-time-string (nth 5 attrs)))) (string-match "\\`\\([A-Z][a-z][a-z]\\) +[A-Z][a-z][a-z] +[0-9][0-9]? *[0-9][0-9]?:[0-9][0-9]:[0-9][0-9] *[0-9]?[0-9]?[0-9][0-9]" s) (concat (match-string 1 s) ", " (timezone-make-date-arpa-standard s (current-time-zone))))) (defun elmo-file-detect-content-type (file) "Return content-type of the FILE." (if (or (not (file-exists-p file)) (file-directory-p file)) "application/octet-stream" (let ((type (mime-find-file-type file))) (if (and (string= (nth 0 type) "application") (string= (nth 1 type) "octet-stream")) (if (and elmo-file-command elmo-file-command-argument) (with-temp-buffer (if (zerop (apply 'call-process elmo-file-command nil `(,(current-buffer) nil) nil (append elmo-file-command-argument (list (expand-file-name file))))) (progn (goto-char (point-min)) (when (re-search-forward ": *" nil t) (setq type (buffer-substring (match-end 0) (point-at-eol)))) (if (string-match "/" type) type "application/octet-stream")) "application/octet-stream")) (concat (nth 0 type) "/" (nth 1 type))) (concat (nth 0 type) "/" (nth 1 type)))))) (defun elmo-file-msgdb-create-entity (msgdb folder number) "Create msgdb entity for the message in the FOLDER with NUMBER." (let* ((file (elmo-message-file-name folder number)) (subject (file-name-nondirectory file)) (attrs (file-attributes file))) (and (not (file-directory-p file)) attrs (elmo-msgdb-make-message-entity (elmo-msgdb-message-entity-handler msgdb) :message-id (concat "<" (elmo-replace-char-in-string ?/ ?: file) "@" (system-name)) :number number :size (nth 7 attrs) :date (elmo-file-make-date-string attrs) :subject subject :from (concat (user-full-name (nth 2 attrs)) " <" (user-login-name (nth 2 attrs)) "@" (system-name) ">"))))) (luna-define-method elmo-folder-msgdb-create ((folder elmo-file-folder) numlist _flag-table) (let ((new-msgdb (elmo-make-msgdb)) entity) (elmo-with-progress-display (elmo-folder-msgdb-create (length numlist)) "Creating msgdb" (dolist (number numlist) (setq entity (elmo-file-msgdb-create-entity new-msgdb folder number)) (when entity (elmo-msgdb-append-entity new-msgdb entity '(new unread))) (elmo-progress-notify 'elmo-folder-msgdb-create))) new-msgdb)) (luna-define-method elmo-folder-message-file-p ((_folder elmo-file-folder)) t) (luna-define-method elmo-message-file-name ((folder elmo-file-folder) number) (expand-file-name (car (split-string (elmo-map-message-location folder number) "/")) (elmo-file-folder-file-path-internal folder))) (luna-define-method elmo-folder-message-make-temp-file-p ((_folder elmo-file-folder)) t) (luna-define-method elmo-folder-diff ((_folder elmo-file-folder)) (cons nil nil)) (luna-define-method elmo-folder-message-make-temp-files ((folder elmo-file-folder) numbers &optional start-number) (let ((temp-dir (elmo-folder-make-temporary-directory folder)) (cur-number (or start-number 0))) (dolist (number numbers) (elmo-copy-file (elmo-message-file-name folder number) (expand-file-name (number-to-string (if start-number cur-number number)) temp-dir)) (cl-incf cur-number)) temp-dir)) (luna-define-method elmo-map-message-fetch ((folder elmo-file-folder) location _strategy &optional _section _unseen) (let ((file (expand-file-name (car (split-string location "/")) (elmo-file-folder-file-path-internal folder))) charset guess uid is-text tweak-charset) (when (file-exists-p file) (set-buffer-multibyte nil) (prog1 (insert-file-contents-literally file nil 0 elmo-file-fetch-max-size) (unless (or (std11-field-body "To") (std11-field-body "Cc") (std11-field-body "Subject")) (setq guess (elmo-file-detect-content-type file)) (setq is-text (string-match "^text/" guess)) (when is-text (when (string-match "; *charset=\\([-_a-zA-Z0-9]+\\)" guess) (setq charset (intern (downcase (match-string 1 guess)))) (unless (mime-charset-to-coding-system charset) (setq charset nil))) (unless charset (setq tweak-charset t) (set-buffer-multibyte t) (decode-coding-region (point-min) (point-max) elmo-mime-display-as-is-coding-system) (setq charset (detect-mime-charset-region (point-min) (point-max))))) (setq uid (nth 2 (file-attributes file))) (insert "From: " (user-full-name uid) "<" (user-login-name uid) "@" (system-name) ">" "\n" "Subject: " (file-name-nondirectory file) "\n" "Date: " (elmo-file-make-date-string (file-attributes file)) "\n" "Message-ID: " "<" (elmo-replace-char-in-string ?/ ?: file) "@" (system-name) ">\n" "Content-Type: " guess (or (and is-text tweak-charset (concat "; charset=" (symbol-name charset))) "") "\nMIME-Version: 1.0\n\n") (when tweak-charset (encode-mime-charset-region (point-min) (point-max) charset) (set-buffer-multibyte nil))))))) (luna-define-method elmo-map-folder-list-message-locations ((folder elmo-file-folder)) (delq nil (mapcar (lambda (file) (let ((name (expand-file-name file (elmo-file-folder-file-path-internal folder)))) (when (not (file-directory-p name)) (concat file "/" (mapconcat 'number-to-string (nth 5 (file-attributes name)) ":"))))) (directory-files (elmo-file-folder-file-path-internal folder))))) (luna-define-method elmo-folder-exists-p ((folder elmo-file-folder)) (file-directory-p (elmo-file-folder-file-path-internal folder))) (luna-define-method elmo-folder-list-subfolders ((folder elmo-file-folder) &optional _one-level) (when (file-directory-p (elmo-file-folder-file-path-internal folder)) (append (list (elmo-folder-name-internal folder)) (delq nil (mapcar (lambda (file) (when (and (file-directory-p (expand-file-name file (elmo-file-folder-file-path-internal folder))) (not (string= file ".")) (not (string= file ".."))) (concat (elmo-folder-name-internal folder) "/" file))) (directory-files (elmo-file-folder-file-path-internal folder))))))) (require 'product) (product-provide (provide 'elmo-file) (require 'elmo-version)) ;;; elmo-file.el ends here wanderlust-wanderlust-769699d/elmo/elmo-filter.el000066400000000000000000000463111406661363500221070ustar00rootroot00000000000000;;; elmo-filter.el --- Filtered Folder Interface for ELMO. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Author: Yuuichi Teranishi ;; Hiroya Murata ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'elmo) (require 'elmo-signal) (require 'elmo-msgdb) (defvar elmo-filter-number-filename "number-list" "File name for message number database.") ;;; ELMO filter folder (eval-and-compile (luna-define-class elmo-filter-folder (elmo-folder) (condition target require-msgdb number-list flag-count)) (luna-define-internal-accessors 'elmo-filter-folder)) (luna-define-method elmo-folder-initialize ((folder elmo-filter-folder) name) (let (pair) (setq pair (elmo-parse-search-condition name)) (elmo-filter-folder-set-condition-internal folder (car pair)) (if (string-match "^ */\\(.*\\)$" (cdr pair)) (elmo-filter-folder-set-target-internal folder (elmo-get-folder (match-string 1 (cdr pair)))) (error "Folder syntax error `%s'" (elmo-folder-name-internal folder))) (elmo-filter-folder-set-require-msgdb-internal folder (elmo-folder-search-requires-msgdb-p (elmo-filter-folder-target-internal folder) (elmo-filter-folder-condition-internal folder))) (elmo-filter-folder-set-number-list-internal folder 'not-loaded) (elmo-filter-connect-signals folder (elmo-filter-folder-target-internal folder)) folder)) (defun elmo-filter-connect-signals (folder target) (elmo-connect-signal target 'flag-changing folder (elmo-define-signal-handler (folder _target number old-flags new-flags) (elmo-filter-add-flag-count folder old-flags -1) (elmo-filter-add-flag-count folder new-flags) (elmo-emit-signal 'flag-changing folder number old-flags new-flags)) (elmo-define-signal-filter (folder _target number) (memq number (elmo-folder-list-messages folder nil t)))) (elmo-connect-signal target 'flag-changed folder (elmo-define-signal-handler (folder _target numbers) (let ((filterd (elmo-list-filter (elmo-folder-list-messages folder nil t) numbers))) (when filterd (elmo-emit-signal 'flag-changed folder filterd))))) (elmo-connect-signal target 'status-changed folder (elmo-define-signal-handler (folder _target numbers) (let ((filterd (elmo-list-filter (elmo-folder-list-messages folder nil t) numbers))) (when filterd (elmo-emit-signal 'status-changed folder filterd))))) (elmo-connect-signal target 'update-overview folder (elmo-define-signal-handler (folder _target number) (elmo-emit-signal 'update-overview folder number)) (elmo-define-signal-filter (folder _target number) (memq number (elmo-folder-list-messages folder nil t))))) (defun elmo-filter-number-list-load (dir) (elmo-object-load (expand-file-name elmo-filter-number-filename dir))) (defun elmo-filter-number-list-save (dir number-list) (elmo-object-save (expand-file-name elmo-filter-number-filename dir) number-list)) (defun elmo-filter-folder-number-list-loaded-p (folder) (listp (elmo-filter-folder-number-list-internal folder))) (defun elmo-filter-folder-number-list (folder) (let ((numbers (elmo-filter-folder-number-list-internal folder))) (if (listp numbers) numbers (elmo-filter-folder-set-number-list-internal folder (elmo-filter-number-list-load (elmo-folder-msgdb-path folder)))))) (defsubst elmo-filter-folder-countup-message-flags (folder numbers &optional delta) (let ((flag-count (elmo-filter-folder-flag-count-internal folder)) (delta (or delta 1)) elem) (dolist (number numbers) (dolist (flag (elmo-message-flags folder number)) (if (setq elem (assq flag flag-count)) (setcdr elem (+ (cdr elem) delta)) (setq flag-count (cons (cons flag delta) flag-count))))) (elmo-filter-folder-set-flag-count-internal folder flag-count))) (defun elmo-filter-add-flag-count (folder flags &optional delta) (let ((flag-count (elmo-filter-folder-flag-count-internal folder)) (delta (or delta 1)) elem) (dolist (flag flags) (if (setq elem (assq flag flag-count)) (setcdr elem (+ (cdr elem) delta)) (setq flag-count (cons (cons flag delta) flag-count)))) (elmo-filter-folder-set-flag-count-internal folder flag-count))) (defun elmo-filter-folder-flag-count (folder) (or (elmo-filter-folder-flag-count-internal folder) (elmo-filter-folder-countup-message-flags folder (elmo-folder-list-messages folder t t)))) (defun elmo-filter-folder-copy-flag-count (flag-counts) (mapcar (lambda (pair) (cons (car pair) (cdr pair))) flag-counts)) (luna-define-method elmo-folder-open :after ((folder elmo-filter-folder) &optional load-msgdb) (when load-msgdb (elmo-filter-folder-number-list folder) (elmo-filter-folder-flag-count folder) (elmo-folder-msgdb (elmo-filter-folder-target-internal folder)))) (luna-define-method elmo-folder-open-internal ((folder elmo-filter-folder)) (elmo-folder-open-internal (elmo-filter-folder-target-internal folder))) (luna-define-method elmo-folder-check ((folder elmo-filter-folder)) (when (elmo-filter-folder-require-msgdb-internal folder) (elmo-folder-synchronize (elmo-filter-folder-target-internal folder)))) (luna-define-method elmo-folder-close-internal ((folder elmo-filter-folder)) (elmo-folder-close-internal (elmo-filter-folder-target-internal folder))) (luna-define-method elmo-folder-close ((folder elmo-filter-folder)) (elmo-generic-folder-close folder) (elmo-filter-folder-set-number-list-internal folder 'not-loaded) (elmo-filter-folder-set-flag-count-internal folder nil) (elmo-folder-close (elmo-filter-folder-target-internal folder))) (luna-define-method elmo-folder-commit ((folder elmo-filter-folder)) (elmo-folder-commit (elmo-filter-folder-target-internal folder)) (when (elmo-folder-persistent-p folder) (elmo-folder-set-info-max-by-numdb folder (elmo-folder-list-messages folder nil 'in-msgdb)) (elmo-msgdb-killed-list-save (elmo-folder-msgdb-path folder) (elmo-folder-killed-list-internal folder)) (when (elmo-filter-folder-number-list-loaded-p folder) (elmo-filter-number-list-save (elmo-folder-msgdb-path folder) (elmo-filter-folder-number-list folder))))) (luna-define-method elmo-folder-expand-msgdb-path ((folder elmo-filter-folder)) (expand-file-name (elmo-replace-string-as-filename (elmo-folder-name-internal folder)) (expand-file-name "filter" elmo-msgdb-directory))) (luna-define-method elmo-folder-search-requires-msgdb-p ((folder elmo-filter-folder) condition) (elmo-folder-search-requires-msgdb-p (elmo-filter-folder-target-internal folder) condition)) (luna-define-method elmo-folder-newsgroups ((folder elmo-filter-folder)) (elmo-folder-newsgroups (elmo-filter-folder-target-internal folder))) (luna-define-method elmo-find-fetch-strategy ((folder elmo-filter-folder) number &optional ignore-cache require-entireness) (elmo-find-fetch-strategy (elmo-filter-folder-target-internal folder) number ignore-cache require-entireness)) (luna-define-method elmo-folder-get-primitive-list ((folder elmo-filter-folder)) (elmo-folder-get-primitive-list (elmo-filter-folder-target-internal folder))) (luna-define-method elmo-folder-contains-type ((folder elmo-filter-folder) type) (elmo-folder-contains-type (elmo-filter-folder-target-internal folder) type)) (luna-define-method elmo-folder-append-buffer ((folder elmo-filter-folder) &optional flag number return-number) (elmo-folder-append-buffer (elmo-filter-folder-target-internal folder) flag number return-number)) (defun elmo-folder-append-messages-filter-* (dst-folder src-folder numbers same-number) (elmo-folder-append-messages dst-folder (elmo-filter-folder-target-internal src-folder) numbers same-number)) (defun elmo-folder-append-messages-*-filter (dst-folder src-folder numbers same-number) (elmo-folder-append-messages (elmo-filter-folder-target-internal dst-folder) src-folder numbers same-number)) (luna-define-method elmo-message-fetch-bodystructure ((folder elmo-filter-folder) number strategy) (elmo-message-fetch-bodystructure (elmo-filter-folder-target-internal folder) number strategy)) (luna-define-method elmo-message-fetch ((folder elmo-filter-folder) number strategy &optional unseen section) (elmo-message-fetch (elmo-filter-folder-target-internal folder) number strategy unseen section)) (luna-define-method elmo-folder-delete-messages ((folder elmo-filter-folder) numbers) (let ((flag-count (elmo-filter-folder-copy-flag-count (elmo-filter-folder-flag-count-internal folder))) (messages (copy-sequence (elmo-filter-folder-number-list folder))) success) (elmo-folder-detach-messages folder numbers) (unless (setq success (elmo-folder-delete-messages (elmo-filter-folder-target-internal folder) numbers)) (elmo-filter-folder-set-flag-count-internal folder flag-count) (elmo-filter-folder-set-number-list-internal folder messages)) success)) (luna-define-method elmo-folder-list-messages ((folder elmo-filter-folder) &optional visible-only in-msgdb) (let ((list (if in-msgdb t (elmo-folder-list-messages-internal folder visible-only))) (killed-list (elmo-folder-killed-list-internal folder))) (unless (listp list) ;; Use current list. (setq list (elmo-filter-folder-number-list folder))) (if visible-only (elmo-living-messages list killed-list) (if (and in-msgdb killed-list list) (elmo-sort-uniq-number-list (nconc (elmo-number-set-to-number-list killed-list) list)) list)))) (luna-define-method elmo-folder-list-messages-internal ((folder elmo-filter-folder) &optional _nohide) (let ((target (elmo-filter-folder-target-internal folder))) (if (or (elmo-folder-plugged-p target) (not (elmo-folder-persistent-p folder))) ;; search target folder (elmo-folder-search target (elmo-filter-folder-condition-internal folder)) ;; not available t))) (luna-define-method elmo-folder-list-flagged ((folder elmo-filter-folder) flag &optional in-msgdb) (elmo-list-filter (elmo-folder-list-messages folder nil t) (elmo-folder-list-flagged (elmo-filter-folder-target-internal folder) flag in-msgdb))) (luna-define-method elmo-folder-list-subfolders ((folder elmo-filter-folder) &optional one-level) (let* ((target (elmo-filter-folder-target-internal folder)) (prefix (and (string-match (concat "^\\(.*\\)" (regexp-quote (elmo-folder-name-internal target)) "$") (elmo-folder-name-internal folder)) (match-string 1 (elmo-folder-name-internal folder))))) (elmo-mapcar-list-of-list (lambda (x) (concat prefix x)) (elmo-folder-list-subfolders target one-level)))) (luna-define-method elmo-folder-diff :around ((folder elmo-filter-folder)) (let ((condition (elmo-filter-folder-condition-internal folder)) diff) (if (vectorp condition) (cond ((and (string= (elmo-filter-key condition) "flag") (or (string= (elmo-filter-value condition) "any") (string= (elmo-filter-value condition) "digest") (string= (elmo-filter-value condition) "unread"))) (setq diff (elmo-folder-diff (elmo-filter-folder-target-internal folder))) (if (consp (cdr diff)) ;; new unread unread (list (car diff) (nth 1 diff) (nth 1 diff)) (cons (car diff) (car diff)))) ((string= "last" (elmo-filter-key condition)) (luna-call-next-method)) (t (cons nil (cdr (elmo-folder-diff (elmo-filter-folder-target-internal folder)))))) (luna-call-next-method)))) (luna-define-method elmo-folder-status ((folder elmo-filter-folder)) (elmo-folder-status (elmo-filter-folder-target-internal folder))) (luna-define-method elmo-folder-exists-p ((folder elmo-filter-folder)) (elmo-folder-exists-p (elmo-filter-folder-target-internal folder))) (luna-define-method elmo-folder-creatable-p ((folder elmo-filter-folder)) (elmo-folder-creatable-p (elmo-filter-folder-target-internal folder))) (luna-define-method elmo-folder-writable-p ((folder elmo-filter-folder)) (elmo-folder-writable-p (elmo-filter-folder-target-internal folder))) (luna-define-method elmo-folder-create ((folder elmo-filter-folder)) (elmo-folder-create (elmo-filter-folder-target-internal folder))) (luna-define-method elmo-folder-search ((folder elmo-filter-folder) condition &optional numbers) ;; search from messages in this folder (elmo-folder-search (elmo-filter-folder-target-internal folder) condition (cond ((null numbers) (elmo-folder-list-messages folder)) ((listp numbers) numbers) (t (elmo-folder-list-messages folder 'visible 'in-msgdb))))) (luna-define-method elmo-message-use-cache-p ((folder elmo-filter-folder) number) (elmo-message-use-cache-p (elmo-filter-folder-target-internal folder) number)) (luna-define-method elmo-folder-message-file-p ((folder elmo-filter-folder)) (elmo-folder-message-file-p (elmo-filter-folder-target-internal folder))) (luna-define-method elmo-folder-local-p ((folder elmo-filter-folder)) (elmo-folder-local-p (elmo-filter-folder-target-internal folder))) (luna-define-method elmo-folder-plugged-p ((folder elmo-filter-folder)) (elmo-folder-plugged-p (elmo-filter-folder-target-internal folder))) (luna-define-method elmo-folder-set-plugged ((folder elmo-filter-folder) plugged &optional add) (elmo-folder-set-plugged (elmo-filter-folder-target-internal folder) plugged add)) (luna-define-method elmo-message-file-name ((folder elmo-filter-folder) number) (elmo-message-file-name (elmo-filter-folder-target-internal folder) number)) (luna-define-method elmo-message-flag-available-p ((folder elmo-filter-folder) number flag) (elmo-message-flag-available-p (elmo-filter-folder-target-internal folder) number flag)) (luna-define-method elmo-message-flags ((folder elmo-filter-folder) number) (elmo-message-flags (elmo-filter-folder-target-internal folder) number)) (luna-define-method elmo-message-set-cached ((folder elmo-filter-folder) number cached) (elmo-message-set-cached (elmo-filter-folder-target-internal folder) number cached)) (luna-define-method elmo-message-number ((folder elmo-filter-folder) message-id) (elmo-message-number (elmo-filter-folder-target-internal folder) message-id)) (luna-define-method elmo-message-entity ((folder elmo-filter-folder) key) (elmo-message-entity (elmo-filter-folder-target-internal folder) key)) (luna-define-method elmo-message-entity-parent ((folder elmo-filter-folder) entity) (let ((parent (elmo-message-entity-parent (elmo-filter-folder-target-internal folder) entity))) (when (memq (elmo-message-entity-number parent) (elmo-filter-folder-number-list folder)) parent))) (luna-define-method elmo-folder-flag-table ((folder elmo-filter-folder) &optional if-exists) (elmo-folder-flag-table (elmo-filter-folder-target-internal folder) if-exists)) (luna-define-method elmo-folder-close-flag-table ((folder elmo-filter-folder)) (elmo-folder-close-flag-table (elmo-filter-folder-target-internal folder))) (luna-define-method elmo-folder-count-flags ((folder elmo-filter-folder)) (elmo-filter-folder-flag-count folder)) (luna-define-method elmo-folder-set-flag ((folder elmo-filter-folder) numbers flag &optional is-local) (elmo-folder-set-flag (elmo-filter-folder-target-internal folder) numbers flag is-local)) (luna-define-method elmo-folder-unset-flag ((folder elmo-filter-folder) numbers flag &optional is-local) (elmo-folder-unset-flag (elmo-filter-folder-target-internal folder) numbers flag is-local)) (luna-define-method elmo-message-folder ((folder elmo-filter-folder) number) (elmo-message-folder (elmo-filter-folder-target-internal folder) number)) (luna-define-method elmo-message-field ((folder elmo-filter-folder) number field &optional type) (elmo-message-field (elmo-filter-folder-target-internal folder) number field type)) (luna-define-method elmo-message-set-field ((folder elmo-filter-folder) number field value) (elmo-message-set-field (elmo-filter-folder-target-internal folder) number field value)) (luna-define-method elmo-folder-clear ((folder elmo-filter-folder) &optional keep-killed) (unless keep-killed (elmo-folder-set-killed-list-internal folder nil)) (elmo-filter-folder-set-number-list-internal folder nil) (elmo-filter-folder-set-flag-count-internal folder nil)) (luna-define-method elmo-folder-synchronize ((folder elmo-filter-folder) &optional disable-killed ignore-msgdb no-check mask) (let (numbers) (unless no-check (when (elmo-filter-folder-require-msgdb-internal folder) (elmo-folder-synchronize (elmo-filter-folder-target-internal folder) disable-killed ignore-msgdb no-check mask))) (setq numbers (elmo-folder-list-messages folder (not disable-killed))) (when (and numbers (not (elmo-filter-folder-require-msgdb-internal folder))) (elmo-folder-synchronize (elmo-filter-folder-target-internal folder) 'disable-killed ignore-msgdb no-check (if mask (elmo-list-filter mask numbers) numbers))) (when (and disable-killed ignore-msgdb) (elmo-folder-set-killed-list-internal folder nil)) (elmo-filter-folder-set-number-list-internal folder numbers) (elmo-filter-folder-set-flag-count-internal folder nil) 0)) (luna-define-method elmo-folder-detach-messages ((folder elmo-filter-folder) numbers) (elmo-filter-folder-countup-message-flags folder numbers -1) (elmo-filter-folder-set-number-list-internal folder (elmo-list-delete numbers (elmo-filter-folder-number-list folder) #'delq)) t) (luna-define-method elmo-folder-length ((folder elmo-filter-folder)) (and (elmo-filter-folder-number-list-loaded-p folder) (length (elmo-filter-folder-number-list-internal folder)))) (require 'product) (product-provide (provide 'elmo-filter) (require 'elmo-version)) ;;; elmo-filter.el ends here wanderlust-wanderlust-769699d/elmo/elmo-flag.el000066400000000000000000000437131406661363500215360ustar00rootroot00000000000000;;; elmo-flag.el --- global flag handling. -*- lexical-binding: t -*- ;; Copyright (C) 2003 Yuuichi Teranishi ;; Author: Yuuichi Teranishi ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: (require 'elmo-util) (require 'elmo-localdir) (defcustom elmo-global-flags '(important) "A list of flag symbol which is managed globally by the flag folder." :type '(repeat symbol) :group 'elmo) (defcustom elmo-local-flags '(unread any digest) "A list of flag symbol which is not treated as global flag." :type '(repeat symbol) :group 'elmo) (defvar elmo-global-flag-folder-alist nil "Internal variable to hold global-flag-folder structures.") (eval-and-compile (defconst elmo-flag-char-regexp "]!#$&'+,./0-9:;<=>?@A-Z[^_`a-z|}~-")) (defun elmo-flag-valid-p (flag) (string-match (eval-when-compile (concat "^[" elmo-flag-char-regexp "]+$")) (if (stringp flag) flag (symbol-name flag)))) (eval-and-compile (luna-define-class elmo-flag-folder (elmo-localdir-folder) (flag minfo minfo-hash max-number)) (luna-define-internal-accessors 'elmo-flag-folder)) (luna-define-method elmo-folder-initialize ((folder elmo-flag-folder) name) (unless (string-match (eval-when-compile (concat "^flag\\(/\\([" elmo-flag-char-regexp "]+\\)\\)?$")) name) (error "Error in folder name `%s'" (elmo-folder-name-internal folder))) (if (match-beginning 1) (setq name (match-string 2 name)) (setq name (symbol-name (car elmo-global-flags))) (elmo-folder-set-name-internal folder (concat (elmo-folder-name-internal folder) "/" name))) (or (cdr (assq (intern name) elmo-global-flag-folder-alist)) (let ((flag (intern name)) msgdb-path) (elmo-flag-folder-set-flag-internal folder flag) (unless (elmo-global-flag-p flag) (setq elmo-global-flags (nconc elmo-global-flags (list flag)))) ;; must be AFTER set flag slot. (setq msgdb-path (elmo-folder-msgdb-path folder)) (unless (file-directory-p msgdb-path) (elmo-make-directory msgdb-path)) (elmo-localdir-folder-set-dir-name-internal folder msgdb-path) (elmo-localdir-folder-set-directory-internal folder msgdb-path) (if (file-exists-p (expand-file-name "max" msgdb-path)) (elmo-flag-folder-set-max-number-internal folder (elmo-object-load (expand-file-name "max" msgdb-path)))) (elmo-flag-folder-set-minfo folder (and (file-exists-p (expand-file-name ".minfo" msgdb-path)) (elmo-object-load (expand-file-name ".minfo" msgdb-path)))) (setq elmo-global-flag-folder-alist (cons (cons flag folder) elmo-global-flag-folder-alist)) folder))) (defun elmo-flag-folder-set-minfo (folder minfo) (let ((hash (elmo-make-hash (length minfo)))) (dolist (elem minfo) (elmo-set-hash-val (nth 1 elem) elem hash) (elmo-set-hash-val (concat "#" (number-to-string (nth 2 elem))) elem hash) (dolist (pair (car elem)) (elmo-set-hash-val (concat (number-to-string (cdr pair)) ":" (car pair)) elem hash))) (elmo-flag-folder-set-minfo-internal folder minfo) (elmo-flag-folder-set-minfo-hash-internal folder hash))) (luna-define-method elmo-folder-expand-msgdb-path ((folder elmo-flag-folder)) (expand-file-name (concat "flag/" (elmo-replace-string-as-filename (symbol-name (elmo-flag-folder-flag-internal folder)))) elmo-msgdb-directory)) (luna-define-method elmo-folder-commit :after ((folder elmo-flag-folder)) (elmo-object-save (expand-file-name ".minfo" (elmo-folder-msgdb-path folder)) (elmo-flag-folder-minfo-internal folder) elmo-mime-charset) (if (elmo-flag-folder-max-number-internal folder) (elmo-object-save (expand-file-name "max" (elmo-folder-msgdb-path folder)) (elmo-flag-folder-max-number-internal folder)))) (luna-define-method elmo-folder-list-subfolders ((folder elmo-flag-folder) &optional _one-level) (mapcar (lambda (flag) (concat (elmo-folder-prefix-internal folder) (symbol-name (elmo-folder-type-internal folder)) "/" (symbol-name flag))) elmo-global-flags)) (defun elmo-flag-folder-delete-message (folder number &optional keep-referrer) (let* ((elem (elmo-get-hash-val (concat "#" (number-to-string number)) (elmo-flag-folder-minfo-hash-internal folder))) target-folder) (dolist (pair (car elem)) (when (and (car pair) (cdr pair)) (elmo-clear-hash-val (concat (number-to-string (cdr pair)) ":" (car pair)) (elmo-flag-folder-minfo-hash-internal folder)) (unless keep-referrer (setq target-folder (elmo-get-folder (car pair))) (elmo-folder-open target-folder 'load-msgdb) ;; Unset the flag of the original folder. ;; (XXX Should the message-id checked?) (elmo-message-unset-flag target-folder (cdr pair) (elmo-flag-folder-flag-internal folder)) (elmo-folder-close target-folder)))) (elmo-clear-hash-val (concat "#" (number-to-string number)) (elmo-flag-folder-minfo-hash-internal folder)) (elmo-clear-hash-val (nth 1 elem) (elmo-flag-folder-minfo-hash-internal folder)) (elmo-flag-folder-set-minfo-internal folder (delq elem (elmo-flag-folder-minfo-internal folder)))) t) (luna-define-method elmo-folder-delete-messages-internal ((folder elmo-flag-folder) numbers) (dolist (number numbers) (elmo-flag-folder-delete-message folder number) (elmo-localdir-delete-message folder number)) (elmo-folder-commit folder) t) ;; Same as localdir except that the flag is always the flag. (luna-define-method elmo-folder-msgdb-create ((folder elmo-flag-folder) numbers _flag-table) (when numbers (let ((dir (elmo-localdir-folder-directory-internal folder)) (new-msgdb (elmo-make-msgdb)) (flags (list (elmo-flag-folder-flag-internal folder))) entity) (elmo-with-progress-display (elmo-folder-msgdb-create (length numbers)) "Creating msgdb" (dolist (number numbers) (when (setq entity (elmo-localdir-msgdb-create-entity new-msgdb dir number)) (elmo-msgdb-append-entity new-msgdb entity flags)) (elmo-progress-notify 'elmo-folder-msgdb-create))) new-msgdb))) (defun elmo-folder-append-messages-*-flag (dst-folder src-folder numbers _same-number) (let ((flag (elmo-flag-folder-flag-internal dst-folder))) (dolist (number numbers) (elmo-global-flag-set flag src-folder number (elmo-message-field src-folder number 'message-id))) (elmo-folder-set-flag src-folder numbers flag)) numbers) (luna-define-method elmo-folder-append-buffer ((_folder elmo-flag-folder) &optional _flag _number _return-number) (error "Cannot append to the flag folder")) (luna-define-method elmo-folder-unset-flag :before ((folder elmo-flag-folder) _numbers flag &optional _is-local) (when (eq flag (elmo-flag-folder-flag-internal folder)) (error "Cannot unset flag `%s' in this folder" flag))) ;;; Utilities (defmacro elmo-flag-get-folder (flag) "Get the flag folder structure for FLAG." `(when (memq ,flag elmo-global-flags) (elmo-get-folder (concat "'flag/" (symbol-name ,flag))))) (defun elmo-flag-folder-referrer (folder number) "Return a list of referrer message information. Each element is a cons cell like following: \(FNAME . NUMBER\) FNAME is the name of the folder which the message is contained. NUMBER is the number of the message." (when (eq (elmo-folder-type-internal folder) 'flag) (car (elmo-get-hash-val (concat "#" (number-to-string number)) (elmo-flag-folder-minfo-hash-internal folder))))) ;;; Global-Flag API (defun elmo-global-flag-p (flag) "Return non-nil when FLAG is global." (memq flag elmo-global-flags)) (defun elmo-global-flags (fname number) "Return a list of global flags for the message. FNAME is the name string of the folder. NUMBER is the number of the message." (let ((flag-list elmo-global-flags) folder matches) (while flag-list (setq folder (elmo-flag-get-folder (car flag-list))) (when (elmo-get-hash-val (concat (number-to-string number) ":" fname) (elmo-flag-folder-minfo-hash-internal folder)) (setq matches (cons (elmo-flag-folder-flag-internal folder) matches))) (setq flag-list (cdr flag-list))) matches)) (defun elmo-folder-list-global-flag-messages (folder flag) "List messages which have global flag. FOLDER is the elmo folder structure. FLAG is the symbol of the flag." (when (elmo-global-flag-p flag) (let ((flag-folder (elmo-flag-get-folder flag)) result number) (dolist (elem (elmo-flag-folder-minfo-internal flag-folder)) (if (setq number (elmo-message-number folder (nth 1 elem))) (setq result (cons number result)))) result))) ;;; ;; minfo is a list of following cell. ;; ((((FNAME . NUMBER)...(FNAME . NUMBER)) MESSAGE-ID NUMBER-IN-FLAG-FOLDER) ;; minfo-index is the hash table of above with following indice; (defun elmo-global-flags-set (flags folder number message-id) "Set global flags to the message. FLAGS is a list of symbol of the flag. FOLDER is the elmo folder structure. NUMBER is the message number." (dolist (flag flags) (elmo-global-flag-set flag folder number message-id))) (defun elmo-local-flag-p (flag) "Return non-nil when flag is not appropriate for global flag." (memq flag elmo-local-flags)) (defsubst elmo-global-flag-set-internal (flag folder number message-id) (when (elmo-local-flag-p flag) (error "Cannot treat `%s' as global flag" flag)) (when message-id (let ((flag-folder (elmo-flag-get-folder flag)) filename cache new-file new-number elem) (if (setq elem (elmo-get-hash-val message-id (elmo-flag-folder-minfo-hash-internal flag-folder))) ;; Same ID already exists. (when (and folder number (not (member (cons (elmo-folder-name-internal folder) number) (car elem)))) (setcar elem (cons (cons (elmo-folder-name-internal folder) number) (car elem))) (setq new-number (nth 2 elem)) (elmo-set-hash-val (concat (number-to-string number) ":" (elmo-folder-name-internal folder)) elem (elmo-flag-folder-minfo-hash-internal flag-folder))) ;; Append new element. (elmo-flag-folder-set-max-number-internal flag-folder (+ (or (elmo-flag-folder-max-number-internal flag-folder) ;; This is the first time. (car (elmo-folder-status flag-folder))) 1)) (setq new-file (expand-file-name (number-to-string (setq new-number (elmo-flag-folder-max-number-internal flag-folder))) (elmo-localdir-folder-directory-internal flag-folder))) (cond ((setq filename (elmo-message-file-name folder number)) (elmo-copy-file filename new-file)) ((and (setq cache (elmo-file-cache-get message-id)) (eq (elmo-file-cache-status cache) 'entire)) (elmo-copy-file (elmo-file-cache-path cache) new-file)) (t (with-temp-buffer (elmo-message-fetch folder number (elmo-make-fetch-strategy 'entire)) (write-region-as-binary (point-min) (point-max) new-file nil 'no-msg)))) (elmo-flag-folder-set-minfo-internal flag-folder (cons (setq elem (list (when (and folder number) (list (cons (elmo-folder-name-internal folder) number))) message-id new-number)) (elmo-flag-folder-minfo-internal flag-folder))) (when (and folder number) (elmo-set-hash-val (concat (number-to-string number) ":" (elmo-folder-name-internal folder)) elem (elmo-flag-folder-minfo-hash-internal flag-folder))) (elmo-set-hash-val message-id elem (elmo-flag-folder-minfo-hash-internal flag-folder)) (elmo-set-hash-val (concat "#" (number-to-string new-number)) elem (elmo-flag-folder-minfo-hash-internal flag-folder))) (elmo-folder-commit flag-folder) new-number))) (defun elmo-global-flag-set (flag folder number message-id) "Set global flag to the message. FLAG is a symbol of the flag. FOLDER is the elmo folder structure. NUMBER is the message number. MESSAGE-ID is the message-id of the message." (when (elmo-global-flag-p flag) (elmo-global-flag-set-internal flag folder number message-id))) (defun elmo-global-flag-detach (flag folder number &optional delete-if-none) "Detach the message from the global flag. FOLDER is the folder structure. NUMBERS is the message number. If optional DELETE-IF-NONE is non-nil, delete message from flag folder when the message is not flagged in any folder. If DELETE-IF-NONE is a symbol `always', delete message without flagged in other folder." (unless (and (eq (elmo-folder-type-internal folder) 'flag) (eq (elmo-flag-folder-flag-internal folder) flag)) (let ((flag-folder (elmo-flag-get-folder flag)) elem key) (when flag-folder (setq key (concat (number-to-string number) ":" (elmo-folder-name-internal folder)) elem (elmo-get-hash-val key (elmo-flag-folder-minfo-hash-internal flag-folder))) (when elem (setcar elem (delete (cons (elmo-folder-name-internal folder) number) (car elem))) (elmo-clear-hash-val key (elmo-flag-folder-minfo-hash-internal flag-folder)) ;; Does not have any referrer, remove. (when (and delete-if-none (or (eq delete-if-none 'always) (null (car elem)))) (elmo-flag-folder-delete-message flag-folder (nth 2 elem) (null (car elem))) (elmo-localdir-delete-message flag-folder (nth 2 elem)) (elmo-folder-commit flag-folder))))))) (defun elmo-global-flag-detach-messages (folder numbers &optional delete-if-none) "Detach all messages specified from all global flags. FOLDER is the folder structure. NUMBERS is the message number list. If optional DELETE-IF-NONE is non-nil, delete message from flag folder when the message is not flagged in any folder." (unless (eq (elmo-folder-type-internal folder) 'flag) (dolist (flag elmo-global-flags) (dolist (number numbers) (elmo-global-flag-detach flag folder number delete-if-none))))) (defun elmo-global-flag-replace-referrer (old-folder new-folder) (dolist (flag elmo-global-flags) (let* ((folder (elmo-flag-get-folder flag)) (minfo (elmo-flag-folder-minfo-internal folder)) modified) (dolist (entry minfo) (let ((pair (assoc old-folder (nth 0 entry)))) (when pair (setcar pair new-folder) (setq modified t)))) (when modified (elmo-flag-folder-set-minfo folder minfo) (elmo-folder-commit folder))))) (defun elmo-get-global-flags (&optional flags ignore-preserved) "Get global flags. Return value is a subset of optional argument FLAGS. If FLAGS is `t', all global flags becomes candidates. If optional IGNORE-PRESERVED is non-nil, preserved flags \(answered, cached, new, unread\) are not included." (let ((result (copy-sequence (if (eq flags t) (setq flags elmo-global-flags) flags)))) (while flags (unless (elmo-global-flag-p (car flags)) (setq result (delq (car flags) result))) (setq flags (cdr flags))) (when ignore-preserved (dolist (flag elmo-preserved-flags) (setq result (delq flag result)))) result)) (defun elmo-global-flags-initialize (&optional additional-flags) (let ((dir (expand-file-name "flag" elmo-msgdb-directory))) (setq elmo-global-flags (elmo-list-delete elmo-local-flags (elmo-uniq-list (append elmo-global-flags additional-flags (and (file-directory-p dir) (mapcar (lambda (x) (intern (elmo-recover-string-from-filename x))) (elmo-list-delete '(".." ".") (directory-files dir)))))) #'delq)))) ;;; To migrate from global mark folder (defvar elmo-global-mark-filename "global-mark" "Obsolete variable. (Just for migration)") (defun elmo-global-mark-migrate () "Migrate from 'mark to 'flag. For automatic migration." (when (and (file-exists-p (expand-file-name elmo-global-mark-filename elmo-msgdb-directory)) (elmo-global-flag-p 'important) (not (file-exists-p (elmo-folder-msgdb-path (elmo-flag-get-folder 'important))))) (elmo-global-mark-upgrade))) (defun elmo-global-mark-upgrade () "Upgrade old `global-mark' structure." (interactive) (when (file-exists-p (expand-file-name elmo-global-mark-filename elmo-msgdb-directory)) (message "Upgrading flag structure...") (when (elmo-global-flag-p 'important) (let ((global-marks (elmo-object-load (expand-file-name elmo-global-mark-filename elmo-msgdb-directory))) file-cache) (elmo-flag-get-folder 'important) (dolist (elem global-marks) (setq file-cache (elmo-file-cache-get (car elem))) (when (eq (elmo-file-cache-status file-cache) 'entire) (elmo-global-flag-set 'important nil nil (car elem)))))) (message "Upgrading flag structure...done"))) (luna-define-method elmo-folder-delete :around ((folder elmo-flag-folder)) (let ((flag (elmo-flag-folder-flag-internal folder))) (when (luna-call-next-method) (setq elmo-global-flags (delq flag elmo-global-flags)) (setq elmo-global-flag-folder-alist (delq (assq flag elmo-global-flag-folder-alist) elmo-global-flag-folder-alist)) t))) (require 'product) (product-provide (provide 'elmo-flag) (require 'elmo-version)) ;;; elmo-flag.el ends here wanderlust-wanderlust-769699d/elmo/elmo-imap4.el000066400000000000000000003703651406661363500216450ustar00rootroot00000000000000;;; elmo-imap4.el --- IMAP4 Interface for ELMO. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Copyright (C) 1999,2000 Kenichi OKADA ;; Copyright (C) 2000 OKAZAKI Tetsurou ;; Copyright (C) 2000 Daiki Ueno ;; Copyright (C) 2010 Erik Hetzner ;; Author: Yuuichi Teranishi ;; Kenichi OKADA ;; OKAZAKI Tetsurou ;; Daiki Ueno ;; Erik Hetzner ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;; Origin of IMAP parser part is imap.el, included in Gnus. ;; ;; Copyright (C) 1998, 1999, 2000 ;; Free Software Foundation, Inc. ;; Author: Simon Josefsson ;; ;;; Code: (require 'elmo-vars) (require 'elmo-util) (require 'elmo-date) (require 'elmo-msgdb) (require 'elmo-cache) (require 'elmo) (require 'elmo-net) (require 'elmo-mime) (require 'time-stamp) (require 'cl-lib) (defvar elmo-imap4-disuse-server-flag-mailbox-regexp "^#mh" ; UW imapd "Regexp to match IMAP4 mailbox names whose message flags on server should be ignored (For STATUS command).") (defvar elmo-imap4-overview-fetch-chop-length 200 "*Number of overviews to fetch in one request.") ;; c.f. rfc2683 3.2.1.5 Long Command Lines ;; ;; "A client should limit the length of the command lines it generates ;; to approximately 1000 octets (including all quoted strings but not ;; including literals). If the client is unable to group things into ;; ranges so that the command line is within that length, it should ;; split the request into multiple commands. The client should use ;; literals instead of long quoted strings, in order to keep the command ;; length down. ;; For its part, a server should allow for a command line of at least ;; 8000 octets. This provides plenty of leeway for accepting reasonable ;; length commands from clients. The server should send a BAD response ;; to a command that does not end within the server's maximum accepted ;; command length. " ;; To limit command line length, chop number set. (defvar elmo-imap4-number-set-chop-length 1000 "*Number of messages to specify as a number-set argument for one request.") (defvar elmo-imap4-force-login nil "*Non-nil forces to try 'login' if there is no 'auth' capability in imapd.") (defvar elmo-imap4-use-select-to-update-status nil "*Some imapd have to send select command to update status. \(ex. UW imapd 4.5-BETA?\). For these imapd, you must set this variable t.") (defvar elmo-imap4-use-modified-utf7 t "*Use modified UTF-7 (rfc2060) encoding for IMAP4 folder name.") (defvar elmo-imap4-use-cache t "Use cache in imap4 folder.") (defvar elmo-imap4-extra-namespace-alist '(("^\\({.*/nntp}\\).*$" . ".")) ; Default is for UW's remote nntp mailbox... "Extra namespace alist. A list of cons cell like: (REGEXP . DELIMITER). REGEXP should have a grouping for namespace prefix.") (defvar elmo-imap4-disabled-extensions nil "List of server extensions that are disabled on the client side.") (defvar elmo-imap4-flags-sync-method 'union "Method used when syncing server and client flags.") (defvar elmo-imap4-strict-flag-availability-check nil "Perform a strict check if a flag is available. When set to a non-nil value a flag is considered to be available if and only if it appears in the server's FLAGS or PERMAFLAGS response. Otherwise a flag is also reported to be available if the PERMAFLAGS response includes the special flag \* indicating that a user can create custom flags.") (defvar elmo-imap4-search-keys '("all" "answered" "bcc" "before" "body" "cc" "deleted" "draft" "flagged" "from" "header" "keyword" "larger" "new" "not" "old" "on" "or" "recent" "seen" "sentbefore" "senton" "sentsince" "since" "smaller" "subject" "text" "to" "uid" "unanswered" "undeleted" "undraft" "unflagged" "unkeyword" "unseen") "List of known IMAP search keys. This list is used in `elmo-imap4-search-generate-vector' to differentiate between IMAP4 search keys and searches for message header values.") (defvar elmo-imap4-capability-search-keys-alist '((x-gm-ext-1 "x-gm-raw" "x-gm-msgid" "x-gm-thrid" "x-gm-lables")) "*Alist of capability and extra IMAP4 search attributes. When server has specified capability, server is assumed to accept extra search keys.") ;;; internal variables ;; (defvar elmo-imap4-seq-prefix "elmo-imap4") (defvar elmo-imap4-seqno 0) (defvar elmo-imap4-use-uid t "Use UID as message number.") (defvar elmo-imap4-current-response nil) (defvar elmo-imap4-status nil) (defvar elmo-imap4-reached-tag "elmo-imap40") ;;; buffer local variables (defvar elmo-imap4-default-hierarchy-delimiter "/") (defvar elmo-imap4-server-capability nil) (defvar elmo-imap4-server-namespace nil) (defvar elmo-imap4-parsing nil) ; indicates parsing. (defvar elmo-imap4-fetch-callback nil) (defvar elmo-imap4-fetch-callback-data nil) (defvar elmo-imap4-status-callback nil) (defvar elmo-imap4-status-callback-data nil) (defvar elmo-imap4-server-diff-async-callback nil) (defvar elmo-imap4-server-diff-async-callback-data nil) ;;; progress...(no use?) (defvar elmo-imap4-count-progress nil) (defvar elmo-imap4-count-progress-message nil) (defvar elmo-imap4-progress-count nil) ;;; XXX Temporal implementation (defvar elmo-imap4-current-msgdb nil) (defvar elmo-imap4-seen-messages nil) (defvar elmo-imap4-local-variables '(elmo-imap4-status elmo-imap4-current-response elmo-imap4-seqno elmo-imap4-parsing elmo-imap4-reached-tag elmo-imap4-count-progress elmo-imap4-count-progress-message elmo-imap4-progress-count elmo-imap4-fetch-callback elmo-imap4-fetch-callback-data elmo-imap4-status-callback elmo-imap4-status-callback-data elmo-imap4-current-msgdb elmo-imap4-seen-messages)) ;;;; (defconst elmo-imap4-quoted-specials-list '(?\\ ?\")) (defconst elmo-imap4-non-atom-char-regex (eval-when-compile (concat "[^" "]!#$&'+,./0-9:;<=>?@A-Z[^_`a-z|}~-" "]"))) (defconst elmo-imap4-non-text-char-regex (eval-when-compile (concat "[^" "]\x01-\x09\x0b\x0c\x0e-\x1f\x7f !\"#$%&'()*+,./0-9:;<=>?@A-Z[\\^_`a-z{|}~-" "]"))) (defconst elmo-imap4-literal-threshold 1024 "Limitation of characters that can be used in a quoted string.") (defconst elmo-imap4-flag-specs '((important "\\Flagged") (read "\\Seen") (unread "\\Seen" 'remove) (answered "\\Answered") ;; draft-melnikov-imap-keywords-03.txt (forwarded "$Forwarded") (work "$Work") (personal "$Personal") (shouldreply "$ShouldReply"))) (defconst elmo-imap4-folder-name-syntax `(mailbox (?: [user "^[A-Za-z0-9]"] (?/ [auth ".+"])) ,@elmo-net-folder-name-syntax)) ;; For debugging. (defvar elmo-imap4-debug nil "Non-nil forces IMAP4 folder as debug mode. Debug information is inserted in the buffer \"*IMAP4 DEBUG*\"") (defvar elmo-imap4-debug-inhibit-logging nil) ;;; ELMO IMAP4 folder (eval-and-compile (luna-define-class elmo-imap4-folder (elmo-net-folder) (mailbox)) (luna-define-internal-accessors 'elmo-imap4-folder)) ;;; Session (eval-and-compile (luna-define-class elmo-imap4-session (elmo-network-session) (capability current-mailbox current-mailbox-size read-only flags)) (luna-define-internal-accessors 'elmo-imap4-session)) (defmacro elmo-imap4-session-capable-p (session capability) `(and (memq ,capability (elmo-imap4-session-capability-internal ,session)) (not (memq ,capability elmo-imap4-disabled-extensions)))) (defmacro elmo-imap4-mailbox-selected-p (mailbox session) "Return non-nil if MAILBOX is selected in SESSION." `(string= (elmo-imap4-session-current-mailbox-internal ,session) ,mailbox)) ;;; MIME-ELMO-IMAP Location (eval-and-compile (luna-define-class mime-elmo-imap-location (mime-imap-location) (folder number rawbuf strategy)) (luna-define-internal-accessors 'mime-elmo-imap-location)) ;;; Debug (defmacro elmo-imap4-debug (message &rest args) `(if elmo-imap4-debug (elmo-imap4-debug-1 ,message ,@args))) (defun elmo-imap4-debug-1 (message &rest args) (with-current-buffer (get-buffer-create "*IMAP4 DEBUG*") (goto-char (point-max)) (if elmo-imap4-debug-inhibit-logging (insert "NO LOGGING\n") (insert (apply 'format message args) "\n")))) (defsubst elmo-imap4-decode-folder-string (string) (if elmo-imap4-use-modified-utf7 (decode-coding-string string 'utf-7-imap) string)) (defsubst elmo-imap4-encode-folder-string (string) (if elmo-imap4-use-modified-utf7 (encode-coding-string string 'utf-7-imap) string)) ;;; Response (defmacro elmo-imap4-response-continue-req-p (response) "Returns non-nil if RESPONSE is '+' response." `(assq 'continue-req ,response)) (defmacro elmo-imap4-response-ok-p (response) "Returns non-nil if RESPONSE is an 'OK' response." `(assq 'ok ,response)) (defmacro elmo-imap4-response-bye-p (response) "Returns non-nil if RESPONSE is an 'BYE' response." `(assq 'bye ,response)) (defmacro elmo-imap4-response-garbage-p (response) "Returns non-nil if RESPONSE is an 'garbage' response." `(assq 'garbage ,response)) (defmacro elmo-imap4-response-value (response symbol) "Get value of the SYMBOL from RESPONSE." `(nth 1 (assq ,symbol ,response))) (defsubst elmo-imap4-response-value-all (response symbol) "Get all value of the SYMBOL from RESPONSE." (let (matched) (while response (if (eq (car (car response)) symbol) (setq matched (nconc matched (nth 1 (car response))))) (setq response (cdr response))) matched)) (defmacro elmo-imap4-response-error-text (response) "Returns text of NO, BAD, BYE response." `(nth 1 (or (elmo-imap4-response-value ,response 'no) (elmo-imap4-response-value ,response 'bad) (elmo-imap4-response-value ,response 'bye)))) (defmacro elmo-imap4-response-bodydetail-text (response) "Returns text of BODY[section]." `(nth 3 (assq 'bodydetail ,response))) (defun elmo-imap4-mailbox-size-update-maybe (session response) "Update size of selected mailbox in SESSION according to RESPONSE." (let ((exists (elmo-imap4-response-value-all response 'exists)) (recent (elmo-imap4-response-value-all response 'recent)) (current-size (or (elmo-imap4-session-current-mailbox-size-internal session) (cons nil nil)))) (if exists (setcar current-size (if (atom exists) exists (car (last exists))))) (if recent (setcdr current-size (if (atom recent) recent (car (last recent))))) (elmo-imap4-session-set-current-mailbox-size-internal session current-size) (elmo-imap4-debug "[%s] -> mailbox size adjusted: %s, %s" (format-time-string "%T") (elmo-imap4-session-current-mailbox-internal session) current-size))) ;;; Session commands. (defmacro with-elmo-imap4-session-process-buffer (session &rest body) `(with-current-buffer (process-buffer (elmo-network-session-process-internal ,session)) ,@body)) (put 'with-elmo-imap4-session-process-buffer 'lisp-indent-function 1) (defun elmo-imap4-command-tag (session) "Return new command tag for SESSION." (with-elmo-imap4-session-process-buffer session (concat elmo-imap4-seq-prefix (number-to-string (cl-incf elmo-imap4-seqno))))) ;;;(defun elmo-imap4-send-command-wait (session command) ;;; "Send COMMAND to the SESSION and wait for response. ;;;Returns RESPONSE (parsed lisp object) of IMAP session." ;;; (elmo-imap4-read-response session ;;; (elmo-imap4-send-command ;;; session ;;; command))) (defun elmo-imap4-session-wait-response-maybe (session) "Wait for a server response when in parsing state." (with-elmo-imap4-session-process-buffer session (when elmo-imap4-parsing (message "Waiting for IMAP response...") (accept-process-output (elmo-network-session-process-internal session)) (message "Waiting for IMAP response...done")))) (defun elmo-imap4-send-command-wait (session command) "Send COMMAND to the SESSION. Returns RESPONSE (parsed lisp object) of IMAP session. If response is not `OK', causes error with IMAP response text." (elmo-imap4-accept-ok session (elmo-imap4-send-command session command))) (defun elmo-imap4-send-command-enqueue (tokens &optional literal+ queue) (dolist (token tokens) (cond ((stringp token) (unless (string= token "") (insert token " "))) ((listp token) (cl-case (car token) (atom (unless (string= (nth 1 token) "") (insert (nth 1 token) " "))) (quoted (insert (elmo-imap4-format-quoted (nth 1 token)) " ")) (group (progn (insert "(") (setq queue (elmo-imap4-send-command-enqueue (nth 1 token) literal+ queue)) (unless (bobp) (delete-char -1)) (insert ") "))) (literal (progn (insert (format (if literal+ "{%d+}" "{%d}") (nth 2 token))) (push (buffer-string) queue) (push token queue) (erase-buffer))) (t (error "Unkown token type, %s" (car token))))) (t (error "Unkown token, %s" token)))) queue) (defun elmo-imap4-send-command-build-queue (tag tokens literal+) (with-temp-buffer (insert tag " ") (let ((queue (elmo-imap4-send-command-enqueue tokens literal+))) (unless (bobp) (delete-char -1) (push (buffer-string) queue)) (nreverse queue)))) (defun elmo-imap4-send-command (session command) "Send COMMAND to SESSION. SESSION is a network session. COMMAND is a list of command tokens or a single command token." (let* ((tag (elmo-imap4-command-tag session)) (queue (elmo-imap4-send-command-build-queue tag (if (listp command) command (list command)) (elmo-imap4-session-capable-p session 'literal+)))) (with-current-buffer (elmo-network-session-buffer session) (when (elmo-imap4-response-bye-p elmo-imap4-current-response) (elmo-imap4-process-bye session)) (setq elmo-imap4-current-response nil) (elmo-imap4-session-wait-response-maybe session) (setq elmo-imap4-parsing t) (dolist (chunk queue) (cond ((stringp chunk) (elmo-imap4-session-process-send-string session chunk)) ((listp chunk) (elmo-imap4-session-process-send-literal session chunk)) (t (error "Unkown command queues chunk, %s" chunk))))) tag)) (defun elmo-imap4-session-process-send-literal (session literal) (unless (elmo-imap4-session-capable-p session 'literal+) (elmo-imap4-accept-continue-req session)) (cond ((stringp (nth 1 literal)) (elmo-imap4-session-process-send-string session (nth 1 literal))) ((bufferp (nth 1 literal)) (with-current-buffer (nth 1 literal) (elmo-imap4-debug "[%s] <-- #<%s>" (format-time-string "%T") (buffer-name (current-buffer))) (process-send-region (elmo-network-session-process-internal session) (point-min) (+ (point-min) (nth 2 literal))) (process-send-string (elmo-network-session-process-internal session) "\r\n"))) (t (error "Unkown literal, %s" (nth 1 literal))))) (defun elmo-imap4-session-process-send-string (session string) "Send STRING to process of SESSION." (elmo-imap4-debug "[%s] <-- %s" (format-time-string "%T") string) (process-send-string (elmo-network-session-process-internal session) string) (process-send-string (elmo-network-session-process-internal session) "\r\n")) (defun elmo-imap4-send-string (session string) "Send STRING to the SESSION." (with-current-buffer (process-buffer (elmo-network-session-process-internal session)) (setq elmo-imap4-current-response nil) (goto-char (point-min)) (elmo-imap4-session-process-send-string session string))) (defun elmo-imap4-read-response (session tag) "Read parsed response from SESSION. TAG is the tag of the command" (with-current-buffer (process-buffer (elmo-network-session-process-internal session)) (while (not (or (string= tag elmo-imap4-reached-tag) (elmo-imap4-response-bye-p elmo-imap4-current-response) (when (elmo-imap4-response-garbage-p elmo-imap4-current-response) (message "Garbage response: %s" (elmo-imap4-response-value elmo-imap4-current-response 'garbage)) t))) (when (memq (process-status (elmo-network-session-process-internal session)) '(open run)) (accept-process-output (elmo-network-session-process-internal session) 1))) (elmo-imap4-debug "[%s] => %s" (format-time-string "%T") (prin1-to-string elmo-imap4-current-response)) (setq elmo-imap4-parsing nil) (elmo-imap4-mailbox-size-update-maybe session elmo-imap4-current-response) elmo-imap4-current-response)) (defsubst elmo-imap4-read-untagged (process) (with-current-buffer (process-buffer process) (while (not elmo-imap4-current-response) (accept-process-output process 1)) (elmo-imap4-debug "[%s] =>%s" (format-time-string "%T") (prin1-to-string elmo-imap4-current-response)) elmo-imap4-current-response)) (defun elmo-imap4-read-continue-req (session) "Returns a text following to continue-req in SESSION. If response is not `+' response, returns nil." (elmo-imap4-response-value (elmo-imap4-read-untagged (elmo-network-session-process-internal session)) 'continue-req)) (defun elmo-imap4-process-bye (session) (with-current-buffer (elmo-network-session-buffer session) (let ((r elmo-imap4-current-response)) (setq elmo-imap4-current-response nil) (elmo-network-close-session session) (signal 'elmo-imap4-bye-error (list (concat (elmo-imap4-response-error-text r)) "Try Again"))))) (defun elmo-imap4-accept-continue-req (session) "Returns non-nil if `+' (continue-req) response is arrived in SESSION. If response is not `+' response, cause an error." (let (response) (setq response (elmo-imap4-read-untagged (elmo-network-session-process-internal session))) (or (elmo-imap4-response-continue-req-p response) (error "IMAP error: %s" (or (elmo-imap4-response-error-text response) "No continut-req from server."))))) (defun elmo-imap4-read-ok (session tag) "Returns non-nil if `OK' response of the command with TAG is arrived in SESSION. If response is not `OK' response, returns nil." (elmo-imap4-response-ok-p (elmo-imap4-read-response session tag))) (defun elmo-imap4-accept-ok (session tag) "Accept only `OK' response from SESSION. If response is not `OK' response, causes error with IMAP response text." (let ((response (elmo-imap4-read-response session tag))) (if (elmo-imap4-response-ok-p response) response (if (elmo-imap4-response-bye-p response) (elmo-imap4-process-bye session) (error "IMAP error: %s" (or (elmo-imap4-response-error-text response) "No `OK' response from server.")))))) ;;; MIME-ELMO-IMAP Location (luna-define-method mime-imap-location-section-body ((location mime-elmo-imap-location) section) (if (and (stringp section) (string= section "HEADER")) ;; Even in the section mode, header fields should be saved to the ;; raw buffer . (with-current-buffer (mime-elmo-imap-location-rawbuf-internal location) (erase-buffer) (elmo-message-fetch (mime-elmo-imap-location-folder-internal location) (mime-elmo-imap-location-number-internal location) (mime-elmo-imap-location-strategy-internal location) 'unseen section) (buffer-string)) (elmo-message-fetch-string (mime-elmo-imap-location-folder-internal location) (mime-elmo-imap-location-number-internal location) (mime-elmo-imap-location-strategy-internal location) 'unseen section))) (luna-define-method mime-imap-location-bodystructure ((location mime-elmo-imap-location)) (elmo-message-fetch-bodystructure (mime-elmo-imap-location-folder-internal location) (mime-elmo-imap-location-number-internal location) (mime-elmo-imap-location-strategy-internal location))) (luna-define-method mime-imap-location-fetch-entity-p ((location mime-elmo-imap-location) entity) (or (not elmo-message-displaying) ; Fetching entity to save or force display. ;; cache exists (file-exists-p (expand-file-name (mmimap-entity-section (mime-entity-node-id-internal entity)) (elmo-fetch-strategy-cache-path (mime-elmo-imap-location-strategy-internal location)))) ;; not too large to fetch. (> elmo-message-fetch-threshold (or (mime-imap-entity-size-internal entity) 0)))) ;;; (defun elmo-imap4-session-check (session) (with-current-buffer (elmo-network-session-buffer session) (setq elmo-imap4-fetch-callback nil) (setq elmo-imap4-fetch-callback-data nil)) (elmo-imap4-send-command-wait session "check")) (defun elmo-imap4-atom-p (string) "Return t if STRING is an atom defined in rfc2060." (if (string= string "") nil (save-match-data (not (string-match elmo-imap4-non-atom-char-regex string))))) (defun elmo-imap4-quotable-p (string) "Return t if STRING can be formatted as a quoted defined in rfc2060." (save-match-data (not (string-match elmo-imap4-non-text-char-regex string)))) (defun elmo-imap4-nil (string) "Return a list represents the special atom \"NIL\" defined in rfc2060, \ if STRING is nil. Otherwise return nil." (if (eq string nil) (list 'atom "NIL"))) (defun elmo-imap4-atom (string) "Return a list represents STRING as an atom defined in rfc2060. Return nil if STRING is not an atom. See `elmo-imap4-atom-p'." (if (elmo-imap4-atom-p string) (list 'atom string))) (defun elmo-imap4-quoted (string) "Return a list represents STRING as a quoted defined in rfc2060. Return nil if STRING can not be formatted as a quoted. See `elmo-imap4-quotable-p'." (if (elmo-imap4-quotable-p string) (list 'quoted string))) (defun elmo-imap4-literal-1 (string-or-buffer length) "Internal function for `elmo-imap4-literal' and `elmo-imap4-buffer-literal'. Return a list represents STRING-OR-BUFFER as a literal defined in rfc2060. STRING-OR-BUFFER must be an encoded string or a single-byte string or a single-byte buffer. LENGTH must be the number of octets for STRING-OR-BUFFER." (list 'literal string-or-buffer length)) (defun elmo-imap4-literal (string) "Return a list represents STRING as a literal defined in rfc2060. STRING must be an encoded or a single-byte string." (elmo-imap4-literal-1 string (length string))) (defun elmo-imap4-buffer-literal (buffer) "Return a list represents BUFFER as a literal defined in rfc2060. BUFFER must be a single-byte buffer." (elmo-imap4-literal-1 buffer (with-current-buffer buffer (buffer-size)))) (defun elmo-imap4-string-1 (string length) "Internal function for `elmo-imap4-string' and `elmo-imap4-buffer-string'. Return a list represents STRING as a string defined in rfc2060. STRING must be an encoded or a single-byte string. LENGTH must be the number of octets for STRING." (or (elmo-imap4-quoted string) (elmo-imap4-literal-1 string length))) (defun elmo-imap4-string (string) "Return a list represents STRING as a string defined in rfc2060. STRING must be an encoded or a single-byte string." (let ((length (length string))) (if (< elmo-imap4-literal-threshold length) (elmo-imap4-literal-1 string length) (elmo-imap4-string-1 string length)))) (defun elmo-imap4-buffer-string (buffer) "Return a list represents BUFFER as a string defined in rfc2060. BUFFER must be a single-byte buffer." (let ((length (with-current-buffer buffer (buffer-size)))) (if (< elmo-imap4-literal-threshold length) (elmo-imap4-literal-1 buffer length) (elmo-imap4-string-1 (with-current-buffer buffer (buffer-string)) length)))) (defun elmo-imap4-astring-1 (string length) "Internal function for `elmo-imap4-astring' and `elmo-imap4-buffer-astring'. Return a list represents STRING as an astring defined in rfc2060. STRING must be an encoded or a single-byte string. LENGTH must be the number of octets for STRING." (or (elmo-imap4-atom string) (elmo-imap4-string-1 string length))) (defun elmo-imap4-astring (string) "Return a list represents STRING as an astring defined in rfc2060. STRING must be an encoded or a single-byte string." (let ((length (length string))) (if (< elmo-imap4-literal-threshold length) (elmo-imap4-literal-1 string length) (elmo-imap4-astring-1 string length)))) (defun elmo-imap4-buffer-astring (buffer) "Return a list represents BUFFER as an astring defined in rfc2060. BUFFER must be a single-byte buffer." (let ((length (with-current-buffer buffer (buffer-size)))) (if (< elmo-imap4-literal-threshold length) (elmo-imap4-literal-1 buffer length) (elmo-imap4-astring-1 (with-current-buffer buffer (buffer-string)) length)))) (defun elmo-imap4-nstring (string) "Return a list represents STRING as a nstring defined in rfc2060. STRING must be an encoded or a single-byte string." (or (elmo-imap4-nil string) (elmo-imap4-string string))) (defun elmo-imap4-buffer-nstring (buffer) "Return a list represents BUFFER as a nstring defined in rfc2060. BUFFER must be a single-byte buffer." (or (elmo-imap4-nil buffer) (elmo-imap4-buffer-string buffer))) (defalias 'elmo-imap4-mailbox 'elmo-imap4-astring) (defalias 'elmo-imap4-field-body 'elmo-imap4-astring) (defalias 'elmo-imap4-userid 'elmo-imap4-astring) (defalias 'elmo-imap4-password 'elmo-imap4-astring) (defun elmo-imap4-format-quoted (string) "Return STRING in a form of the quoted-string defined in rfc2060." (concat "\"" (std11-wrap-as-quoted-pairs string elmo-imap4-quoted-specials-list) "\"")) (defsubst elmo-imap4-response-get-selectable-mailbox-list (response) (delq nil (mapcar (lambda (entry) (if (and (eq 'list (car entry)) (not (member-ignore-case "\\Noselect" (nth 1 (nth 1 entry))))) (car (nth 1 entry)))) response))) (luna-define-method elmo-message-fetch-bodystructure ((folder elmo-imap4-folder) number strategy) (if (elmo-fetch-strategy-use-cache strategy) (elmo-object-load (elmo-file-cache-expand-path (elmo-fetch-strategy-cache-path strategy) "bodystructure")) (let ((session (elmo-imap4-get-session folder)) bodystructure) (elmo-imap4-session-select-mailbox session (elmo-imap4-folder-mailbox-internal folder)) (with-current-buffer (elmo-network-session-buffer session) (setq elmo-imap4-fetch-callback nil) (setq elmo-imap4-fetch-callback-data nil)) (prog1 (setq bodystructure (elmo-imap4-response-value (elmo-imap4-response-value (elmo-imap4-send-command-wait session (format (if elmo-imap4-use-uid "uid fetch %s bodystructure" "fetch %s bodystructure") number)) 'fetch) 'bodystructure)) (when (elmo-fetch-strategy-save-cache strategy) (elmo-file-cache-delete (elmo-fetch-strategy-cache-path strategy)) (elmo-object-save (elmo-file-cache-expand-path (elmo-fetch-strategy-cache-path strategy) "bodystructure") bodystructure)))))) ;;; Backend methods. (luna-define-method elmo-create-folder-plugged ((folder elmo-imap4-folder)) (elmo-imap4-send-command-wait (elmo-imap4-get-session folder) (list "create" (elmo-imap4-mailbox (elmo-imap4-folder-mailbox-internal folder))))) (defun elmo-imap4-get-session (folder &optional if-exists) (elmo-network-get-session 'elmo-imap4-session (concat (if (elmo-folder-biff-internal folder) "BIFF-") "IMAP") folder if-exists)) (defun elmo-imap4-session-select-mailbox (session mailbox &optional force no-error) "Select MAILBOX in SESSION. If optional argument FORCE is non-nil, select mailbox even if current mailbox is same as MAILBOX. If second optional argument NO-ERROR is non-nil, don't cause an error when selecting folder was failed. If NO-ERROR is 'notify-bye, only BYE response is reported as error. Returns response value if selecting folder succeed. " (when (or force (not (elmo-imap4-mailbox-selected-p mailbox session))) (let (response result) (unwind-protect (setq response (elmo-imap4-read-response session (elmo-imap4-send-command session (list "select" (elmo-imap4-mailbox mailbox))))) (if (setq result (elmo-imap4-response-ok-p response)) (progn (elmo-imap4-session-set-current-mailbox-internal session mailbox) (elmo-imap4-session-set-read-only-internal session (nth 1 (assq 'read-only (assq 'ok response)))) (elmo-imap4-session-set-flags-internal session (nth 1 (or (assq 'permanentflags response) (assq 'flags response))))) (elmo-imap4-session-set-current-mailbox-internal session nil) (elmo-imap4-session-set-current-mailbox-size-internal session nil) (if (and (eq no-error 'notify-bye) (elmo-imap4-response-bye-p response)) (elmo-imap4-process-bye session) (unless no-error (error "%s" (or (elmo-imap4-response-error-text response) (format "Select %s failed" mailbox))))))) (and result response)))) (defun elmo-imap4-session-unselect-mailbox (session mailbox) "Unselect MAILBOX in SESSION. Deselecting will exit selected state without causing silent EXPUNGE for deleted messages." (if (elmo-imap4-session-capable-p session 'unselect) (elmo-imap4-send-command-wait session "unselect") (elmo-imap4-send-command-wait session (list "examine" (elmo-imap4-mailbox mailbox))) (elmo-imap4-send-command-wait session "close")) (elmo-imap4-session-set-current-mailbox-internal session nil) (elmo-imap4-session-set-current-mailbox-size-internal session nil)) (defun elmo-imap4-check-validity (_spec _validity-file) ;;; Not used. ;;;(elmo-imap4-send-command-wait ;;;(elmo-imap4-get-session spec) ;;;(list "status " ;;; (elmo-imap4-mailbox ;;; (elmo-imap4-spec-mailbox spec)) ;;; " (uidvalidity)"))) ) (defun elmo-imap4-sync-validity (_spec _validity-file) ;; Not used. ) (defun elmo-imap4-elist (folder query tags) (let ((session (elmo-imap4-get-session folder))) (elmo-imap4-session-select-mailbox session (elmo-imap4-folder-mailbox-internal folder)) (let ((answer (elmo-imap4-response-value (elmo-imap4-send-command-wait session query) 'esearch)) tag result) (while answer (setq tag (intern (downcase (car answer)))) (cond ((eq tag 'uid) nil) ((memq tag tags) (setq result (append result (if (eq tag 'all) (sort (elmo-number-set-to-number-list (mapcar (lambda (x) (let ((y (split-string x ":"))) (if (null (cdr y)) (string-to-number (car y)) (cons (string-to-number (car y)) (string-to-number (cadr y)))))) (split-string (cadr answer) ","))) '<) (string-to-number (cadr answer)))))) (t nil)) (setq answer (cdr answer))) result))) (defun elmo-imap4-list (folder flag) (let ((session (elmo-imap4-get-session folder))) (elmo-imap4-session-select-mailbox session (elmo-imap4-folder-mailbox-internal folder)) (if (elmo-imap4-session-capable-p session 'esearch) (elmo-imap4-elist folder (concat (if elmo-imap4-use-uid "uid " "") "search return (all) " flag) '(all)) (elmo-imap4-response-value (elmo-imap4-send-command-wait session (format (if elmo-imap4-use-uid "uid search %s" "search %s") flag)) 'search)))) (defun elmo-imap4-session-flag-available-p (session flag) (cl-case flag ((read unread) (member-ignore-case "\\seen" (elmo-imap4-session-flags-internal session))) (important (member-ignore-case "\\flagged" (elmo-imap4-session-flags-internal session))) (digest (or (member-ignore-case "\\seen" (elmo-imap4-session-flags-internal session)) (member-ignore-case "\\flagged" (elmo-imap4-session-flags-internal session)))) (answered (member-ignore-case (concat "\\" (symbol-name flag)) (elmo-imap4-session-flags-internal session))) (t (member-ignore-case (if elmo-imap4-strict-flag-availability-check (symbol-name flag) "\\*") (elmo-imap4-session-flags-internal session))))) (defun elmo-imap4-flag-to-imap-search-key (flag) (cl-case flag (read "seen") (unread "unseen") (important "flagged") (answered "answered") (new "new") (t (concat "keyword " (or (car (cdr (assq flag elmo-imap4-flag-specs))) (symbol-name flag)))))) (defun elmo-imap4-flag-to-imap-criteria (flag) (cl-case flag ((any digest) (let ((criteria "flagged") (global-flags (delq 'important (elmo-get-global-flags t t)))) (dolist (flag (delete 'new (delete 'cached (copy-sequence (cl-case flag (any elmo-preserved-flags) (digest elmo-digest-flags)))))) (setq criteria (concat "or " (elmo-imap4-flag-to-imap-search-key flag) " " criteria))) (while global-flags (setq criteria (concat "or keyword " (symbol-name (car global-flags)) " " criteria)) (setq global-flags (cdr global-flags))) criteria)) (t (elmo-imap4-flag-to-imap-search-key flag)))) (defun elmo-imap4-folder-list-flagged (folder flag &optional type) "List flagged message numbers in the FOLDER. FLAG is one of the `unread', `read', `important', `answered', `any'. When optional argument TYPE is symbol 'unmatch, negate search condition." (let ((session (elmo-imap4-get-session folder)) (criteria (concat (if (eq type 'unmatch) "not " "") (elmo-imap4-flag-to-imap-criteria flag)))) (if (elmo-imap4-session-flag-available-p session flag) (elmo-imap4-list folder criteria) ;; List flagged messages in the msgdb. (elmo-msgdb-list-flagged (elmo-folder-msgdb folder) flag)))) (defvar elmo-imap4-rfc822-size "RFC822\.SIZE") (defvar elmo-imap4-rfc822-text "RFC822\.TEXT") (defvar elmo-imap4-rfc822-header "RFC822\.HEADER") (defvar elmo-imap4-header-fields "HEADER\.FIELDS") (defun elmo-imap4-make-number-set-list (msg-list &optional chop-length) "Make RFC2060's message set specifier from MSG-LIST. Returns a list of (NUMBER . SET-STRING). SET-STRING is the message set specifier described in RFC2060. NUMBER is contained message number in SET-STRING. Every SET-STRING does not contain number of messages longer than CHOP-LENGTH. If CHOP-LENGTH is not specified, message set is not chopped." (setq msg-list (sort (copy-sequence msg-list) '<) chop-length (or chop-length (length msg-list))) (let (result number-list notfirst nchop) (while msg-list (unless notfirst (when (zerop (setq nchop (% (length msg-list) chop-length))) (setq nchop chop-length))) (setq number-list (last msg-list nchop) msg-list (nbutlast msg-list nchop) result (cons (cons nchop (mapconcat (lambda (x) (cond ((consp x) (format "%s:%s" (car x) (cdr x))) ((integerp x) (number-to-string x)))) (elmo-number-list-to-number-set number-list) ",")) result)) (unless notfirst (setq notfirst t nchop chop-length))) result)) ;; ;; app-data: ;; cons of flag-table and folder structure (defsubst elmo-imap4-fetch-callback-1-subr (entity flags app-data) "A msgdb entity callback function." (let ((use-flag (elmo-folder-use-flag-p (cdr app-data))) (flag-table (car app-data)) (msg-id (elmo-message-entity-field entity 'message-id)) saved-flags flag-list) ;;; (when (elmo-string-member-ignore-case "\\Flagged" flags) ;;; (elmo-msgdb-global-mark-set msg-id elmo-msgdb-important-mark)) (setq saved-flags (elmo-flag-table-get flag-table msg-id) flag-list (if use-flag (append (and (memq 'new saved-flags) (not (member-ignore-case "\\Seen" flags)) '(new)) (and (member-ignore-case "\\Flagged" flags) '(important)) (and (not (member-ignore-case "\\Seen" flags)) '(unread)) (and (member-ignore-case "\\Answered" flags) '(answered)) (and (elmo-file-cache-exists-p msg-id) '(cached))) saved-flags)) (elmo-msgdb-append-entity elmo-imap4-current-msgdb entity flag-list))) ;; Current buffer is process buffer. (defun elmo-imap4-fetch-callback-1 (element app-data) (let ((handler (elmo-msgdb-message-entity-handler elmo-imap4-current-msgdb))) (elmo-imap4-fetch-callback-1-subr (with-temp-buffer (insert (or (elmo-imap4-response-bodydetail-text element) "")) ;; Replace all CRLF with LF. (elmo-delete-cr-buffer) (elmo-msgdb-create-message-entity-from-header handler (elmo-imap4-response-value element 'uid) :size (elmo-imap4-response-value element 'rfc822size))) (elmo-imap4-response-value element 'flags) app-data) (elmo-progress-notify 'elmo-folder-msgdb-create))) (defun elmo-imap4-parse-capability (string) (if (string-match "^\\*\\(.*\\)$" string) (read (concat "(" (downcase (match-string 1 string)) ")")))) (defun elmo-imap4-clear-login (session) (when (elmo-imap4-session-capable-p session 'logindisabled) (signal 'elmo-authenticate-error '(elmo-imap4-clear-login))) (let ((elmo-imap4-debug-inhibit-logging t)) (or (elmo-imap4-read-ok session (elmo-imap4-send-command session (list "login" (elmo-imap4-userid (elmo-network-session-user-internal session)) (elmo-imap4-password (elmo-get-passwd (elmo-network-session-password-key session)))))) (signal 'elmo-authenticate-error '(elmo-imap4-clear-login))))) (defun elmo-imap4-auth-login (session) (let ((tag (elmo-imap4-send-command session "authenticate login")) (elmo-imap4-debug-inhibit-logging t)) (or (elmo-imap4-read-continue-req session) (signal 'elmo-authenticate-error '(elmo-imap4-auth-login))) (elmo-imap4-send-string session (elmo-base64-encode-string (elmo-network-session-user-internal session))) (or (elmo-imap4-read-continue-req session) (signal 'elmo-authenticate-error '(elmo-imap4-auth-login))) (elmo-imap4-send-string session (elmo-base64-encode-string (elmo-get-passwd (elmo-network-session-password-key session)))) (or (elmo-imap4-read-ok session tag) (signal 'elmo-authenticate-error '(elmo-imap4-auth-login))) (setq elmo-imap4-status 'auth))) (luna-define-method elmo-network-initialize-session-buffer :after ((_session elmo-imap4-session) buffer) (with-current-buffer buffer (mapc 'make-variable-buffer-local elmo-imap4-local-variables) (setq elmo-imap4-seqno 0) (setq elmo-imap4-status 'initial))) (luna-define-method elmo-network-initialize-session ((session elmo-imap4-session)) (let ((process (elmo-network-session-process-internal session))) (with-current-buffer (process-buffer process) ;; Skip garbage output from process before greeting. (while (and (memq (process-status process) '(open run)) (goto-char (point-max)) (or (/= (forward-line -1) 0) (not (elmo-imap4-parse-greeting)))) (accept-process-output process 1)) (erase-buffer) (set-process-filter process 'elmo-imap4-arrival-filter) (set-process-sentinel process 'elmo-imap4-sentinel) ;;; (while (and (memq (process-status process) '(open run)) ;;; (eq elmo-imap4-status 'initial)) ;;; (message "Waiting for server response...") ;;; (accept-process-output process 1)) ;;; (message "") (unless (memq elmo-imap4-status '(nonauth auth)) (signal 'elmo-open-error (list 'elmo-network-initialize-session))) (elmo-imap4-session-set-capability-internal session (elmo-imap4-response-value (elmo-imap4-send-command-wait session "capability") 'capability)) (when (memq (elmo-network-stream-type-symbol (elmo-network-session-stream-type-internal session)) elmo-network-starttls-stream-type-list) (or (elmo-imap4-session-capable-p session 'starttls) (signal 'elmo-open-error '(elmo-imap4-starttls-error))) (elmo-imap4-send-command-wait session "starttls") (elmo-network-session-starttls-negotiate session) (elmo-imap4-session-set-capability-internal session (elmo-imap4-response-value (elmo-imap4-send-command-wait session "capability") 'capability)))))) (eval-when-compile (require 'sasl)) (luna-define-method elmo-network-authenticate-session ((session elmo-imap4-session)) (with-current-buffer (process-buffer (elmo-network-session-process-internal session)) (let* ((auth (elmo-network-session-auth-internal session)) (auth (if (listp auth) auth (list auth)))) (unless (or (eq elmo-imap4-status 'auth) (null auth)) (cond ((eq 'clear (car auth)) (elmo-imap4-clear-login session)) ((eq 'login (car auth)) (elmo-imap4-auth-login session)) (t (require 'sasl) (let* ((elmo-imap4-debug-inhibit-logging t) (sasl-mechanisms (delq nil (mapcar (lambda (cap) (if (string-match "^auth=\\(.*\\)$" (symbol-name cap)) (match-string 1 (upcase (symbol-name cap))))) (elmo-imap4-session-capability-internal session)))) (mechanism (sasl-find-mechanism (delq nil (mapcar (lambda (cap) (upcase (symbol-name cap))) (if (listp auth) auth (list auth)))))) ;) client name step response sasl-read-passphrase) (unless mechanism (if (or elmo-imap4-force-login (y-or-n-p (format "There's no %s capability in server. continue?" (elmo-list-to-string (elmo-network-session-auth-internal session))))) (setq mechanism (sasl-find-mechanism sasl-mechanisms)) (signal 'elmo-authenticate-error '(elmo-imap4-auth-no-mechanisms)))) (setq client (sasl-make-client mechanism (elmo-network-session-user-internal session) "imap" (elmo-network-session-server-internal session))) ;;; (if elmo-imap4-auth-user-realm ;;; (sasl-client-set-property client 'realm elmo-imap4-auth-user-realm)) (setq sasl-read-passphrase (lambda (_prompt) (elmo-get-passwd (elmo-network-session-password-key session)))) (setq name (sasl-mechanism-name mechanism) step (sasl-next-step client nil)) (elmo-network-session-set-auth-internal session (intern (downcase name))) (elmo-imap4-send-command session (concat "AUTHENTICATE " name (and (sasl-step-data step) (concat " " (elmo-base64-encode-string (sasl-step-data step) 'no-lin-break))))) (catch 'done (while t (setq response (elmo-imap4-read-untagged (elmo-network-session-process-internal session))) (if (elmo-imap4-response-ok-p response) (if (sasl-next-step client step) ;; Bogus server? (signal 'elmo-authenticate-error (list (intern (concat "elmo-imap4-auth-" (downcase name))))) ;; The authentication process is finished. (throw 'done nil))) (unless (elmo-imap4-response-continue-req-p response) ;; response is NO or BAD. (signal 'elmo-authenticate-error (list (intern (concat "elmo-imap4-auth-" (downcase name)))))) (sasl-step-set-data step (elmo-base64-decode-string (elmo-imap4-response-value response 'continue-req))) (setq step (sasl-next-step client step)) (elmo-imap4-send-string session (if (sasl-step-data step) (elmo-base64-encode-string (sasl-step-data step) 'no-line-break) ""))))))) ;; Some servers return reduced capabilities when client asks for them ;; before login. It might be a good idea to ask them again, otherwise ;; we can miss some useful feature. (elmo-imap4-session-set-capability-internal session (elmo-imap4-response-value (elmo-imap4-send-command-wait session "capability") 'capability)))))) (luna-define-method elmo-network-setup-session ((session elmo-imap4-session)) (with-current-buffer (elmo-network-session-buffer session) (when (elmo-imap4-session-capable-p session 'namespace) (setq elmo-imap4-server-namespace (elmo-imap4-response-value (elmo-imap4-send-command-wait session "namespace") 'namespace))))) (defun elmo-imap4-setup-send-buffer (&optional string file) (let ((send-buf (get-buffer-create " *elmo-imap4-setup-send-buffer*")) (source-buf (unless string (current-buffer)))) (save-excursion (save-match-data (set-buffer send-buf) (erase-buffer) (set-buffer-multibyte nil) (cond (string (insert string)) (file (as-binary-input-file (insert-file-contents file))) (t (with-current-buffer source-buf (copy-to-buffer send-buf (point-min) (point-max))))) (goto-char (point-min)) (if (eq (re-search-forward "^$" nil t) (point-max)) (insert "\n")) (let (inhibit-eol-conversion) (encode-coding-region (point-min) (point-max) 'raw-text-dos)))) send-buf)) (defun elmo-imap4-setup-send-buffer-from-file (file) (elmo-imap4-setup-send-buffer nil file)) (luna-define-method elmo-delete-message-safe ((folder elmo-imap4-folder) number msgid) (let ((session (elmo-imap4-get-session folder)) candidates) (elmo-imap4-session-select-mailbox session (elmo-imap4-folder-mailbox-internal folder)) (setq candidates (elmo-imap4-response-value (elmo-imap4-send-command-wait session (list (if elmo-imap4-use-uid "uid search header message-id " "search header message-id ") (elmo-imap4-field-body msgid))) 'search)) (if (memq number candidates) (elmo-folder-delete-messages folder (list number))))) (defun elmo-imap4-server-diff-async-callback-1 (status data) (funcall elmo-imap4-server-diff-async-callback (list (elmo-imap4-response-value status 'recent) (elmo-imap4-response-value status 'unseen) (elmo-imap4-response-value status 'messages)) data)) (defun elmo-imap4-server-diff-async (folder) (let ((session (elmo-imap4-get-session folder))) ;; We should `check' folder to obtain newest information here. ;; But since there's no asynchronous check mechanism in elmo yet, ;; checking is not done here. (with-current-buffer (elmo-network-session-buffer session) (setq elmo-imap4-status-callback 'elmo-imap4-server-diff-async-callback-1) (setq elmo-imap4-status-callback-data elmo-imap4-server-diff-async-callback-data)) (elmo-imap4-send-command session (list "status" (elmo-imap4-mailbox (elmo-imap4-folder-mailbox-internal folder)) "(recent unseen messages)")))) ;;; IMAP parser. (defvar elmo-imap4-server-eol "\r\n" "The EOL string sent from the server.") (defvar elmo-imap4-client-eol "\r\n" "The EOL string we send to the server.") (defvar elmo-imap4-literal-progress-reporter nil) (defun elmo-imap4-find-next-line () "Return point at end of current line, taking into account literals. Return nil if no complete line has arrived." (when (re-search-forward (concat elmo-imap4-server-eol "\\|{\\([0-9]+\\)}" elmo-imap4-server-eol) nil t) (if (match-string 1) (if (< (point-max) (+ (point) (string-to-number (match-string 1)))) (progn (when elmo-imap4-literal-progress-reporter (elmo-progress-notify 'elmo-retrieve-message :set (- (point-max) (point)) :total (string-to-number (match-string 1)))) nil) (goto-char (+ (point) (string-to-number (match-string 1)))) (elmo-imap4-find-next-line)) (point)))) (defun elmo-imap4-sentinel (process _string) (delete-process process)) (defun elmo-imap4-arrival-filter (proc string) "IMAP process filter." (when (buffer-live-p (process-buffer proc)) (with-current-buffer (process-buffer proc) (goto-char (point-max)) (insert string) (let (end) (goto-char (point-min)) (while (setq end (elmo-imap4-find-next-line)) (save-restriction (narrow-to-region (point-min) end) (delete-char (- (length elmo-imap4-server-eol))) (goto-char (point-min)) (unwind-protect (cl-case elmo-imap4-status (initial (setq elmo-imap4-current-response (list (list 'greeting (elmo-imap4-parse-greeting))))) ((auth nonauth selected examine) (setq elmo-imap4-current-response (cons (elmo-imap4-parse-response) elmo-imap4-current-response))) (t (message "Unknown state %s in arrival filter" elmo-imap4-status))) (delete-region (point-min) (point-max))))))))) ;; IMAP parser. (defsubst elmo-imap4-forward () (or (eobp) (forward-char))) (defsubst elmo-imap4-read-token () (prog1 (let ((token (read (current-buffer)))) (if (symbolp token) (intern (upcase (symbol-name token))) token)) (elmo-imap4-forward))) (defsubst elmo-imap4-parse-number () (when (looking-at "[0-9]+") (prog1 (string-to-number (match-string 0)) (goto-char (match-end 0))))) (defsubst elmo-imap4-parse-literal () (when (looking-at "{\\([0-9]+\\)}\r\n") (let ((pos (match-end 0)) (len (string-to-number (match-string 1)))) (if (< (point-max) (+ pos len)) nil (goto-char (+ pos len)) (buffer-substring pos (+ pos len)))))) ;;; (list ' pos (+ pos len)))))) (defsubst elmo-imap4-parse-string () (cond ((eq (following-char) ?\") (forward-char) (let ((p (point)) (name "")) (skip-chars-forward "^\"\\\\") (setq name (buffer-substring p (point))) (while (eq (following-char) ?\\) (setq p (1+ (point))) (forward-char 2) (skip-chars-forward "^\"\\\\") (setq name (concat name (buffer-substring p (point))))) (forward-char) name)) ((eq (following-char) ?{) (elmo-imap4-parse-literal)))) (defsubst elmo-imap4-parse-nil () (if (looking-at "[Nn][Ii][Ll]") (goto-char (match-end 0)))) (defsubst elmo-imap4-parse-nstring () (or (elmo-imap4-parse-string) (and (elmo-imap4-parse-nil) nil))) (defsubst elmo-imap4-parse-astring () (or (elmo-imap4-parse-string) (buffer-substring (point) (if (re-search-forward "[(){ \r\n%*\"\\]" nil t) (goto-char (1- (match-end 0))) (end-of-line) (point))))) (defsubst elmo-imap4-parse-address () (let (address) (when (eq (following-char) ?\() (elmo-imap4-forward) (setq address (vector (prog1 (elmo-imap4-parse-nstring) (elmo-imap4-forward)) (prog1 (elmo-imap4-parse-nstring) (elmo-imap4-forward)) (prog1 (elmo-imap4-parse-nstring) (elmo-imap4-forward)) (elmo-imap4-parse-nstring))) (when (eq (following-char) ?\)) (elmo-imap4-forward) address)))) (defsubst elmo-imap4-parse-address-list () (if (eq (following-char) ?\() (let (address addresses) (elmo-imap4-forward) (while (and (/= (following-char) ?\)) ;; next line for MS Exchange bug (progn (and (eq (following-char) (string-to-char " ")) (elmo-imap4-forward)) t) (setq address (elmo-imap4-parse-address))) (setq addresses (cons address addresses))) (when (eq (following-char) ?\)) (elmo-imap4-forward) (nreverse addresses))) (cl-assert (elmo-imap4-parse-nil)))) (defsubst elmo-imap4-parse-mailbox () (let ((mailbox (elmo-imap4-parse-astring))) (if (string-equal "INBOX" (upcase mailbox)) "INBOX" mailbox))) (defun elmo-imap4-parse-greeting () "Parse a IMAP greeting." (let ((case-fold-search t)) (cond ((looking-at "\\* OK ") (setq elmo-imap4-status 'nonauth)) ((looking-at "\\* PREAUTH ") (setq elmo-imap4-status 'auth)) ((looking-at "\\* BYE ") (setq elmo-imap4-status 'closed))))) (defun elmo-imap4-parse-response () "Parse a IMAP command response." (elmo-imap4-debug "[%s] -> %s" (format-time-string "%T") (buffer-substring (point) (point-max))) (let ((token (read (current-buffer)))) (cl-case token (+ (progn (skip-chars-forward " ") (list 'continue-req (buffer-substring (point) (point-max))))) (* (cl-case (setq token (elmo-imap4-read-token)) (OK (elmo-imap4-parse-resp-text-code)) (NO (elmo-imap4-parse-resp-text-code)) (BAD (elmo-imap4-parse-resp-text-code)) (BYE (elmo-imap4-parse-bye)) (FLAGS (list 'flags (elmo-imap4-parse-flag-list))) (LIST (list 'list (elmo-imap4-parse-data-list))) (LSUB (list 'lsub (elmo-imap4-parse-data-list))) (SEARCH (list 'search (read (concat "(" (buffer-substring (point) (point-max)) ")")))) (ESEARCH (list 'esearch (cddr (split-string (buffer-substring (point) (point-max)) " ")))) (STATUS (elmo-imap4-parse-status)) ;; Added (NAMESPACE (elmo-imap4-parse-namespace)) (CAPABILITY (list 'capability (read (concat "(" (downcase (buffer-substring (point) (point-max))) ")")))) (ACL (elmo-imap4-parse-acl)) (t (cl-case (elmo-imap4-read-token) (EXISTS (list 'exists token)) (RECENT (list 'recent token)) (EXPUNGE (list 'expunge token)) (FETCH (elmo-imap4-parse-fetch token)) (t (list 'garbage (buffer-string))))))) (t (if (not (string-match elmo-imap4-seq-prefix (symbol-name token))) (list 'garbage (buffer-string)) (cl-case (elmo-imap4-read-token) (OK (progn (setq elmo-imap4-parsing nil) (setq token (symbol-name token)) (unintern token obarray) (elmo-imap4-debug "*%s* OK arrived" token) (setq elmo-imap4-reached-tag token) (list 'ok (elmo-imap4-parse-resp-text-code)))) (NO (progn (setq elmo-imap4-parsing nil) (setq token (symbol-name token)) (unintern token obarray) (elmo-imap4-debug "*%s* NO arrived" token) (setq elmo-imap4-reached-tag token) (let (code text) (when (eq (following-char) ?\[) (setq code (buffer-substring (point) (search-forward "]"))) (elmo-imap4-forward)) (setq text (buffer-substring (point) (point-max))) (list 'no (list code text))))) (BAD (progn (setq elmo-imap4-parsing nil) (elmo-imap4-debug "*%s* BAD arrived" token) (setq token (symbol-name token)) (unintern token obarray) (setq elmo-imap4-reached-tag token) (let (code text) (when (eq (following-char) ?\[) (setq code (buffer-substring (point) (search-forward "]"))) (elmo-imap4-forward)) (setq text (buffer-substring (point) (point-max))) (list 'bad (list code text))))) (t (list 'garbage (buffer-string))))))))) (defun elmo-imap4-parse-bye () (let (code text) (when (eq (following-char) ?\[) (setq code (buffer-substring (point) (search-forward "]"))) (elmo-imap4-forward)) (setq text (buffer-substring (point) (point-max))) (list 'bye (list code text)))) (defun elmo-imap4-parse-text () (goto-char (point-min)) (when (search-forward "[" nil t) (search-forward "]") (elmo-imap4-forward)) (list 'text (buffer-substring (point) (point-max)))) (defun elmo-imap4-parse-resp-text-code () (when (eq (following-char) ?\[) (elmo-imap4-forward) (let ((case-fold-search t)) (cond ((search-forward "PERMANENTFLAGS " nil t) (list 'permanentflags (elmo-imap4-parse-flag-list))) ((search-forward "UIDNEXT " nil t) (list 'uidnext (read (current-buffer)))) ((search-forward "UNSEEN " nil t) (list 'unseen (read (current-buffer)))) ((looking-at "UIDVALIDITY \\([0-9]+\\)") (list 'uidvalidity (match-string 1))) ((search-forward "READ-ONLY" nil t) (list 'read-only t)) ((search-forward "READ-WRITE" nil t) (list 'read-write t)) ((search-forward "NEWNAME " nil t) (let (oldname newname) (setq oldname (elmo-imap4-parse-string)) (elmo-imap4-forward) (setq newname (elmo-imap4-parse-string)) (list 'newname newname oldname))) ((search-forward "TRYCREATE" nil t) (list 'trycreate t)) ((looking-at "APPENDUID \\([0-9]+\\) \\([0-9]+\\)") (list 'appenduid (list (match-string 1) (string-to-number (match-string 2))))) ((looking-at "COPYUID \\([0-9]+\\) \\([0-9,:]+\\) \\([0-9,:]+\\)") (list 'copyuid (list (match-string 1) (match-string 2) (match-string 3)))) ((search-forward "ALERT] " nil t) (let ((message (buffer-substring (point) (point-max)))) (message "IMAP server information: %s" message) (list 'alert message))) (t (list 'unknown)))))) (defun elmo-imap4-parse-data-list () (let (flags delimiter mailbox) (setq flags (elmo-imap4-parse-flag-list)) (when (looking-at " [Nn][Ii][Ll]\\| \"\\\\?\\(.\\)\"") (setq delimiter (match-string 1)) (goto-char (1+ (match-end 0))) (when (setq mailbox (elmo-imap4-parse-mailbox)) (list mailbox flags delimiter))))) (defsubst elmo-imap4-parse-header-list () (when (eq (following-char) ?\() (let (strlist) (while (/= (following-char) ?\)) (elmo-imap4-forward) (push (elmo-imap4-parse-astring) strlist)) (elmo-imap4-forward) (nreverse strlist)))) (defsubst elmo-imap4-parse-fetch-body-section () (let ((section (buffer-substring (point) (1- (progn (re-search-forward "[] ]" nil t) (point)))))) (if (eq (preceding-char) (string-to-char " ")) (prog1 (mapconcat 'identity (cons section (elmo-imap4-parse-header-list)) " ") (search-forward "]" nil t)) section))) (defun elmo-imap4-parse-fetch (_response) (when (eq (following-char) ?\() (let (element list) (while (/= (following-char) ?\)) (elmo-imap4-forward) (let ((token (elmo-imap4-read-token))) (setq element (cond ((eq token 'UID) (list 'uid (condition-case nil (read (current-buffer)) (error nil)))) ((eq token 'FLAGS) (list 'flags (elmo-imap4-parse-flag-list))) ((eq token 'ENVELOPE) (list 'envelope (elmo-imap4-parse-envelope))) ((eq token 'INTERNALDATE) (list 'internaldate (elmo-imap4-parse-string))) ((eq token 'RFC822) (list 'rfc822 (elmo-imap4-parse-nstring))) ((eq token (intern elmo-imap4-rfc822-header)) (list 'rfc822header (elmo-imap4-parse-nstring))) ((eq token (intern elmo-imap4-rfc822-text)) (list 'rfc822text (elmo-imap4-parse-nstring))) ((eq token (intern elmo-imap4-rfc822-size)) (list 'rfc822size (read (current-buffer)))) ((eq token 'BODY) (if (eq (preceding-char) ?\[) (list 'bodydetail (upcase (elmo-imap4-parse-fetch-body-section)) (and (eq (following-char) ?<) (buffer-substring (1+ (point)) (progn (search-forward ">" nil t) (point)))) (progn (elmo-imap4-forward) (elmo-imap4-parse-nstring))) (list 'body (elmo-imap4-parse-body)))) ((eq token 'BODYSTRUCTURE) (list 'bodystructure (elmo-imap4-parse-body))))) (setq list (cons element list)))) (and elmo-imap4-fetch-callback (funcall elmo-imap4-fetch-callback list elmo-imap4-fetch-callback-data)) (list 'fetch list)))) (defun elmo-imap4-parse-status () (let ((mailbox (elmo-imap4-parse-mailbox)) status) (when (and mailbox (search-forward "(" nil t)) (while (not (eq (following-char) ?\))) (setq status (cons (let ((token (read (current-buffer)))) (cl-case (intern (upcase (symbol-name token))) (MESSAGES (list 'messages (read (current-buffer)))) (RECENT (list 'recent (read (current-buffer)))) (UIDNEXT (list 'uidnext (read (current-buffer)))) (UIDVALIDITY (and (looking-at " \\([0-9]+\\)") (prog1 (list 'uidvalidity (match-string 1)) (goto-char (match-end 1))))) (UNSEEN (list 'unseen (read (current-buffer)))) (t (message "Unknown status data %s in mailbox %s ignored" token mailbox)))) status)) (skip-chars-forward " "))) (and elmo-imap4-status-callback (funcall elmo-imap4-status-callback status elmo-imap4-status-callback-data)) (list 'status status))) (defmacro elmo-imap4-value (value) `(if (eq ,value 'NIL) nil ,value)) (defmacro elmo-imap4-nth (pos list) `(let ((value (nth ,pos ,list))) (elmo-imap4-value value))) (defun elmo-imap4-parse-namespace () (list 'namespace (nconc (copy-sequence elmo-imap4-extra-namespace-alist) (elmo-imap4-parse-namespace-subr (read (concat "(" (buffer-substring (point) (point-max)) ")")))))) (defun elmo-imap4-parse-namespace-subr (ns) (let (prefix delim namespace-alist default-delim) ;; 0: personal, 1: other, 2: shared (dotimes (i 3) (setq namespace-alist (nconc namespace-alist (delq nil (mapcar (lambda (namespace) (setq prefix (elmo-imap4-nth 0 namespace) delim (elmo-imap4-nth 1 namespace)) (if (and prefix delim (string-match (concat (regexp-quote delim) "\\'") prefix)) (setq prefix (substring prefix 0 (match-beginning 0)))) (if (zerop (length prefix)) (progn (setq default-delim delim) nil) (cons (concat "^\\(" (if (string= (downcase prefix) "inbox") "[Ii][Nn][Bb][Oo][Xx]" (regexp-quote prefix)) "\\).*$") delim))) (elmo-imap4-nth i ns)))))) (if default-delim (setq namespace-alist (nconc namespace-alist (list (cons "^.*$" default-delim))))) namespace-alist)) (defun elmo-imap4-parse-acl () (let ((mailbox (elmo-imap4-parse-mailbox)) identifier rights acl) (while (eq (following-char) (string-to-char " ")) (elmo-imap4-forward) (setq identifier (elmo-imap4-parse-astring)) (elmo-imap4-forward) (setq rights (elmo-imap4-parse-astring)) (setq acl (append acl (list (cons identifier rights))))) (list 'acl acl mailbox))) (defun elmo-imap4-parse-flag-list () (let ((str (buffer-substring (+ (point) 1) (progn (search-forward ")" nil t) (- (point) 1))))) (unless (zerop (length str)) (split-string str)))) (defun elmo-imap4-parse-envelope () (when (eq (following-char) ?\() (elmo-imap4-forward) (vector (prog1 (elmo-imap4-parse-nstring);; date (elmo-imap4-forward)) (prog1 (elmo-imap4-parse-nstring);; subject (elmo-imap4-forward)) (prog1 (elmo-imap4-parse-address-list);; from (elmo-imap4-forward)) (prog1 (elmo-imap4-parse-address-list);; sender (elmo-imap4-forward)) (prog1 (elmo-imap4-parse-address-list);; reply-to (elmo-imap4-forward)) (prog1 (elmo-imap4-parse-address-list);; to (elmo-imap4-forward)) (prog1 (elmo-imap4-parse-address-list);; cc (elmo-imap4-forward)) (prog1 (elmo-imap4-parse-address-list);; bcc (elmo-imap4-forward)) (prog1 (elmo-imap4-parse-nstring);; in-reply-to (elmo-imap4-forward)) (prog1 (elmo-imap4-parse-nstring);; message-id (elmo-imap4-forward))))) (defsubst elmo-imap4-parse-string-list () (cond ((eq (following-char) ?\();; body-fld-param (let (strlist str) (elmo-imap4-forward) (while (setq str (elmo-imap4-parse-string)) (push str strlist) (elmo-imap4-forward)) (nreverse strlist))) ((elmo-imap4-parse-nil) nil))) (defun elmo-imap4-parse-body-extension () (if (eq (following-char) ?\() (let (b-e) (elmo-imap4-forward) (push (elmo-imap4-parse-body-extension) b-e) (while (eq (following-char) (string-to-char " ")) (elmo-imap4-forward) (push (elmo-imap4-parse-body-extension) b-e)) (cl-assert (eq (following-char) ?\))) (elmo-imap4-forward) (nreverse b-e)) (or (elmo-imap4-parse-number) (elmo-imap4-parse-nstring)))) (defsubst elmo-imap4-parse-body-ext () (let (ext) (when (eq (following-char) (string-to-char " ")) ; body-fld-dsp (elmo-imap4-forward) (let (dsp) (if (eq (following-char) ?\() (progn (elmo-imap4-forward) (push (elmo-imap4-parse-string) dsp) (elmo-imap4-forward) (push (elmo-imap4-parse-string-list) dsp) (elmo-imap4-forward)) (cl-assert (elmo-imap4-parse-nil))) (push (nreverse dsp) ext)) (when (eq (following-char) (string-to-char " ")) ; body-fld-lang (elmo-imap4-forward) (if (eq (following-char) ?\() (push (elmo-imap4-parse-string-list) ext) (push (elmo-imap4-parse-nstring) ext)) (while (eq (following-char) (string-to-char " "));; body-extension (elmo-imap4-forward) (setq ext (append (elmo-imap4-parse-body-extension) ext))))) ext)) (defun elmo-imap4-parse-body () (let (body) (when (eq (following-char) ?\() (elmo-imap4-forward) (if (eq (following-char) ?\() (let (subbody) (while (and (eq (following-char) ?\() (setq subbody (elmo-imap4-parse-body))) (push subbody body)) (elmo-imap4-forward) (push (elmo-imap4-parse-string) body);; media-subtype (when (eq (following-char) (string-to-char " ")) ; body-ext-mpart: (elmo-imap4-forward) (if (eq (following-char) ?\();; body-fld-param (push (elmo-imap4-parse-string-list) body) (push (and (elmo-imap4-parse-nil) nil) body)) (setq body (append (elmo-imap4-parse-body-ext) body)));; body-ext-... (cl-assert (eq (following-char) ?\))) (elmo-imap4-forward) (nreverse body)) (push (elmo-imap4-parse-string) body);; media-type (elmo-imap4-forward) (push (elmo-imap4-parse-string) body);; media-subtype (elmo-imap4-forward) ;; next line for Sun SIMS bug (and (eq (following-char) (string-to-char " ")) (elmo-imap4-forward)) (if (eq (following-char) ?\();; body-fld-param (push (elmo-imap4-parse-string-list) body) (push (and (elmo-imap4-parse-nil) nil) body)) (elmo-imap4-forward) (push (elmo-imap4-parse-nstring) body);; body-fld-id (elmo-imap4-forward) (push (elmo-imap4-parse-nstring) body);; body-fld-desc (elmo-imap4-forward) (push (elmo-imap4-parse-string) body);; body-fld-enc (elmo-imap4-forward) (push (elmo-imap4-parse-number) body);; body-fld-octets ;; ok, we're done parsing the required parts, what comes now is one ;; of three things: ;; ;; envelope (then we're parsing body-type-msg) ;; body-fld-lines (then we're parsing body-type-text) ;; body-ext-1part (then we're parsing body-type-basic) ;; ;; the problem is that the two first are in turn optionally followed ;; by the third. So we parse the first two here (if there are any)... (when (eq (following-char) (string-to-char " ")) (elmo-imap4-forward) (let (lines) (cond ((eq (following-char) ?\();; body-type-msg: (push (elmo-imap4-parse-envelope) body);; envelope (elmo-imap4-forward) (push (elmo-imap4-parse-body) body);; body (elmo-imap4-forward) (push (elmo-imap4-parse-number) body));; body-fld-lines ((setq lines (elmo-imap4-parse-number));; body-type-text: (push lines body));; body-fld-lines (t (backward-char)))));; no match... ;; ...and then parse the third one here... (when (eq (following-char) (string-to-char " ")) ; body-ext-1part: (elmo-imap4-forward) (push (elmo-imap4-parse-nstring) body);; body-fld-md5 (setq body (append (elmo-imap4-parse-body-ext) body)));; body-ext-1part.. (cl-assert (eq (following-char) ?\))) (elmo-imap4-forward) (nreverse body))))) (luna-define-method elmo-folder-initialize ((folder elmo-imap4-folder) name) (let ((default-user elmo-imap4-default-user) (default-server elmo-imap4-default-server) (default-port elmo-imap4-default-port) (elmo-network-stream-type-alist (if elmo-imap4-stream-type-alist (append elmo-imap4-stream-type-alist elmo-network-stream-type-alist) elmo-network-stream-type-alist)) tokens) (when (string-match "\\(.*\\)@\\(.*\\)" default-server) ;; case: imap4-default-server is specified like ;; "hoge%imap.server@gateway". (setq default-user (match-string 1 default-server)) (setq default-server (match-string 2 default-server))) (setq tokens (car (elmo-parse-separated-tokens name elmo-imap4-folder-name-syntax))) ;; mailbox (elmo-imap4-folder-set-mailbox-internal folder (elmo-imap4-encode-folder-string (cdr (assq 'mailbox tokens)))) ;; user (elmo-net-folder-set-user-internal folder (or (cdr (assq 'user tokens)) default-user)) ;; auth (elmo-net-folder-set-auth-internal folder (let ((auth (cdr (assq 'auth tokens)))) (or (and auth (intern auth)) elmo-imap4-default-authenticate-type 'clear))) ;; network (elmo-net-folder-set-parameters folder tokens (list :server default-server :port default-port :stream-type (elmo-get-network-stream-type elmo-imap4-default-stream-type))) folder)) ;;; ELMO IMAP4 folder (luna-define-method elmo-folder-expand-msgdb-path ((folder elmo-imap4-folder)) (convert-standard-filename (let ((mailbox (elmo-imap4-folder-mailbox-internal folder))) (if (string= "inbox" (downcase mailbox)) (setq mailbox "inbox")) (if (eq (string-to-char mailbox) ?/) (setq mailbox (substring mailbox 1 (length mailbox)))) ;; don't use expand-file-name (e.g. %~/something) (concat (expand-file-name (or (elmo-net-folder-user-internal folder) "nobody") (expand-file-name (or (elmo-net-folder-server-internal folder) "nowhere") (expand-file-name "imap" elmo-msgdb-directory))) "/" mailbox)))) (luna-define-method elmo-folder-status-plugged ((folder elmo-imap4-folder)) (elmo-imap4-folder-status-plugged folder)) (defun elmo-imap4-folder-status-plugged (folder) (let* ((session (elmo-imap4-get-session folder)) (selected (elmo-imap4-mailbox-selected-p (elmo-imap4-folder-mailbox-internal folder) session)) status) (with-current-buffer (elmo-network-session-buffer session) (setq elmo-imap4-status-callback nil) (setq elmo-imap4-status-callback-data nil)) (cond ((and selected (not elmo-imap4-use-select-to-update-status)) (elmo-imap4-session-unselect-mailbox session (elmo-imap4-folder-mailbox-internal folder))) ((and (not selected) elmo-imap4-use-select-to-update-status) ;; This will result in a violation of RFC3501: calling STATUS on ;; a selected mailbox. (elmo-imap4-session-select-mailbox session (elmo-imap4-folder-mailbox-internal folder)))) (setq status (elmo-imap4-response-value (elmo-imap4-send-command-wait session (list "status" (elmo-imap4-mailbox (elmo-imap4-folder-mailbox-internal folder)) "(uidnext messages)")) 'status)) (cons (- (elmo-imap4-response-value status 'uidnext) 1) (elmo-imap4-response-value status 'messages)))) (defun elmo-imap4-folder-list-range (folder min max) (elmo-imap4-list folder (concat (let ((killed (elmo-folder-killed-list-internal folder))) (if (and killed (eq (length killed) 1) (consp (car killed)) (eq (car (car killed)) 1)) ;; What about elmo-imap4-use-uid? (format "uid %d:%s" (cdr (car killed)) max) (format "uid %s:%s" min max))) " undeleted"))) (luna-define-method elmo-folder-list-messages-plugged ((folder elmo-imap4-folder) &optional _enable-killed) (let* ((old (elmo-msgdb-list-messages (elmo-folder-msgdb folder))) (new (elmo-imap4-folder-list-range folder (1+ (or (elmo-folder-get-info-max folder) 0)) "*")) (united-old-new (elmo-union old new))) (if (= (length united-old-new) (or (elmo-folder-get-info-length folder) 0)) united-old-new (elmo-union new (elmo-imap4-folder-list-range folder 1 (1+ (or (elmo-folder-get-info-max folder) 0))))))) (luna-define-method elmo-folder-list-flagged-plugged ((folder elmo-imap4-folder) flag) (elmo-imap4-folder-list-flagged folder flag)) (luna-define-method elmo-folder-merge-flagged ((_folder elmo-imap4-folder) local remote) (cl-case elmo-imap4-flags-sync-method (union (elmo-sort-uniq-number-list (nconc local remote))) (server->client remote) (otherwise (error "Unknown method for syncing flags: %s" elmo-imap4-flags-sync-method)))) (luna-define-method elmo-folder-use-flag-p ((folder elmo-imap4-folder)) (not (string-match elmo-imap4-disuse-server-flag-mailbox-regexp (elmo-imap4-folder-mailbox-internal folder)))) (luna-define-method elmo-folder-list-subfolders ((folder elmo-imap4-folder) &optional one-level) (let* ((root (elmo-imap4-folder-mailbox-internal folder)) (session (elmo-imap4-get-session folder)) (prefix (elmo-folder-prefix-internal folder)) (namespace-assoc (elmo-string-matched-assoc root (with-current-buffer (elmo-network-session-buffer session) elmo-imap4-server-namespace))) (delim (or (cdr namespace-assoc) elmo-imap4-default-hierarchy-delimiter)) ;; Append delimiter when root with namespace. (root-nodelim root) (root (if (and namespace-assoc (match-end 1) (string= (substring root (match-end 1)) "")) (concat root delim) root)) result append-serv type) (setq result (elmo-imap4-response-get-selectable-mailbox-list (elmo-imap4-send-command-wait session (list "list" (elmo-imap4-mailbox root) "*")))) ;; The response of Courier-imap doesn't contain a specified folder itself. (unless (member root result) (setq result (append result (elmo-imap4-response-get-selectable-mailbox-list (elmo-imap4-send-command-wait session (list "list \"\"" (elmo-imap4-mailbox root-nodelim))))))) (when (or (not (string= (elmo-net-folder-user-internal folder) elmo-imap4-default-user)) (not (eq (elmo-net-folder-auth-internal folder) (or elmo-imap4-default-authenticate-type 'clear)))) (setq append-serv (concat ":" (elmo-quote-syntactical-element (elmo-net-folder-user-internal folder) 'user elmo-imap4-folder-name-syntax)))) (unless (eq (elmo-net-folder-auth-internal folder) (or elmo-imap4-default-authenticate-type 'clear)) (setq append-serv (concat append-serv "/" (symbol-name (elmo-net-folder-auth-internal folder))))) (unless (string= (elmo-net-folder-server-internal folder) elmo-imap4-default-server) (setq append-serv (concat append-serv "@" (elmo-net-folder-server-internal folder)))) (unless (eq (elmo-net-folder-port-internal folder) elmo-imap4-default-port) (setq append-serv (concat append-serv ":" (number-to-string (elmo-net-folder-port-internal folder))))) (setq type (elmo-net-folder-stream-type-internal folder)) (unless (eq (elmo-network-stream-type-symbol type) elmo-imap4-default-stream-type) (if type (setq append-serv (concat append-serv (elmo-network-stream-type-spec-string type))))) (if one-level (let ((re-delim (regexp-quote delim)) (case-fold-search nil) folder ret has-child-p) ;; Append delimiter (when (and root (not (string= root "")) (not (string-match (concat "\\(.*\\)" re-delim "\\'") root))) (setq root (concat root delim))) (while (setq folder (car result)) (setq has-child-p (when (string-match (concat "^\\(" (regexp-quote root) "[^" re-delim "]" "+\\)" re-delim) folder) (setq folder (match-string 1 folder)))) (setq result (delq nil (mapcar (lambda (fld) (if (string-match (concat "^" (regexp-quote folder) "\\(" re-delim "\\|\\'\\)") fld) (progn (setq has-child-p t) nil) fld)) (cdr result))) folder (concat prefix (elmo-quote-syntactical-element (elmo-imap4-decode-folder-string folder) 'mailbox elmo-imap4-folder-name-syntax) (and append-serv (eval append-serv))) ret (append ret (if has-child-p (list (list folder)) (list folder))))) ret) (mapcar (lambda (fld) (concat prefix (elmo-quote-syntactical-element (elmo-imap4-decode-folder-string fld) 'mailbox elmo-imap4-folder-name-syntax) (and append-serv (eval append-serv)))) result)))) (luna-define-method elmo-folder-exists-p-plugged ((folder elmo-imap4-folder)) (let ((session (elmo-imap4-get-session folder))) (if (elmo-imap4-mailbox-selected-p (elmo-imap4-folder-mailbox-internal folder) session) t (elmo-imap4-session-select-mailbox session (elmo-imap4-folder-mailbox-internal folder) 'force 'notify-bye)))) (luna-define-method elmo-folder-creatable-p ((_folder elmo-imap4-folder)) t) (luna-define-method elmo-folder-writable-p ((_folder elmo-imap4-folder)) t) (luna-define-method elmo-folder-delete ((folder elmo-imap4-folder)) (let* ((exists (elmo-folder-exists-p folder)) (msgs (and exists (elmo-folder-list-messages folder)))) (when (yes-or-no-p (format "%sDelete msgdb and substance of \"%s\"? " (if (> (length msgs) 0) (format "%d msg(s) exists. " (length msgs)) "") (elmo-folder-name-internal folder))) (let ((session (elmo-imap4-get-session folder))) (when (elmo-imap4-folder-mailbox-internal folder) (when msgs (elmo-folder-delete-messages-internal folder msgs)) ;; close selected mailbox except one with \Noselect attribute (when exists (elmo-imap4-send-command-wait session "close")) (elmo-imap4-send-command-wait session (list "delete" (elmo-imap4-mailbox (elmo-imap4-folder-mailbox-internal folder))))) (elmo-imap4-session-set-current-mailbox-internal session nil) (elmo-imap4-session-set-current-mailbox-size-internal session nil)) (elmo-msgdb-delete-path folder) t))) (luna-define-method elmo-folder-rename-internal ((folder elmo-imap4-folder) new-folder) (let ((session (elmo-imap4-get-session folder))) ;; make sure the folder is selected. (elmo-imap4-session-select-mailbox session (elmo-imap4-folder-mailbox-internal folder)) (elmo-imap4-session-unselect-mailbox session (elmo-imap4-folder-mailbox-internal folder)) (elmo-imap4-send-command-wait session "close") (elmo-imap4-send-command-wait session (list "rename" (elmo-imap4-mailbox (elmo-imap4-folder-mailbox-internal folder)) " " (elmo-imap4-mailbox (elmo-imap4-folder-mailbox-internal new-folder)))) (elmo-imap4-session-set-current-mailbox-internal session (elmo-imap4-folder-mailbox-internal new-folder)))) (defun elmo-imap4-copy-messages (src-folder dst-folder numbers) (let ((session (elmo-imap4-get-session src-folder)) (set-list (elmo-imap4-make-number-set-list numbers elmo-imap4-number-set-chop-length)) succeeds) (elmo-imap4-session-select-mailbox session (elmo-imap4-folder-mailbox-internal src-folder)) (while set-list (if (elmo-imap4-send-command-wait session (list (format (if elmo-imap4-use-uid "uid copy %s" "copy %s") (cdr (car set-list))) (elmo-imap4-mailbox (elmo-imap4-folder-mailbox-internal dst-folder)))) (setq succeeds (append succeeds numbers))) (setq set-list (cdr set-list))) succeeds)) (defun elmo-imap4-set-flag (folder numbers flag &optional remove) "Set flag on messages. FOLDER is the ELMO folder structure. NUMBERS is the message numbers to be flagged. FLAG is the flag name. If optional argument REMOVE is non-nil, remove FLAG." (let ((session (elmo-imap4-get-session folder)) response set-list) (elmo-imap4-session-select-mailbox session (elmo-imap4-folder-mailbox-internal folder)) (when (or (member-ignore-case flag (elmo-imap4-session-flags-internal session)) (member "\\*" (elmo-imap4-session-flags-internal session)) (string= flag "\\Deleted")) ; XXX Humm.. (setq set-list (elmo-imap4-make-number-set-list numbers elmo-imap4-number-set-chop-length)) (while set-list (with-current-buffer (elmo-network-session-buffer session) (setq elmo-imap4-fetch-callback nil) (setq elmo-imap4-fetch-callback-data nil)) (unless (elmo-imap4-response-ok-p (elmo-imap4-send-command-wait session (format (if elmo-imap4-use-uid "uid store %s %sflags.silent (%s)" "store %s %sflags.silent (%s)") (cdr (car set-list)) (if remove "-" "+") flag))) (setq response 'fail)) (setq set-list (cdr set-list))) (not (eq response 'fail))))) (luna-define-method elmo-folder-delete-messages-plugged ((folder elmo-imap4-folder) numbers) (let ((session (elmo-imap4-get-session folder)) (deleted (elmo-imap4-list folder "deleted"))) (elmo-imap4-session-select-mailbox session (elmo-imap4-folder-mailbox-internal folder)) (unless (elmo-imap4-set-flag folder numbers "\\Deleted") (error "Failed to set deleted flag")) (cond ((and deleted elmo-imap4-use-uid (elmo-imap4-session-capable-p session 'uidplus)) (elmo-imap4-send-command-wait session (list "uid expunge" (mapconcat 'number-to-string numbers ",")))) ((and deleted elmo-imap4-use-uid) (unless (elmo-imap4-set-flag folder deleted "\\Deleted" 'remove) (error "Failed to temporarily remove deleted flag")) (elmo-imap4-send-command-wait session "expunge") (unless (elmo-imap4-set-flag folder deleted "\\Deleted") (error "Failed to restore deleted flags"))) ((or (null deleted) (y-or-n-p "There are hidden deleted messages. Expunge anyway?")) (elmo-imap4-send-command-wait session "expunge"))) t)) (defun elmo-imap4-detect-search-charset (string) (with-temp-buffer (insert string) (detect-mime-charset-region (point-min) (point-max)))) (defun elmo-imap4-search-build-full-command (search) "Process charset at beginning of SEARCH and build a full IMAP search command." (append '("uid search") (when (car search) (list "CHARSET" (car search))) (cdr search))) (defun elmo-imap4-search-perform (session search-or-uids) "Perform an IMAP search. SESSION is an imap session. SEARCH-OR-UIDS is either a list of UIDs or a list of the form (CHARSET IMAP-SEARCH-COMMAND ...) which is to be evaluated. Returns a list of UIDs." (if (numberp (car search-or-uids)) search-or-uids (elmo-imap4-response-value (elmo-imap4-send-command-wait session (elmo-imap4-search-build-full-command search-or-uids)) 'search))) (defun elmo-imap4-search-generate-vector (folder filter from-msgs) (let ((search-key (elmo-filter-key filter))) (cond ((string= "last" search-key) (let ((numbers (or from-msgs (elmo-folder-list-messages folder)))) (nthcdr (max (- (length numbers) (string-to-number (elmo-filter-value filter))) 0) numbers))) ((string= "first" search-key) (let ((numbers (or from-msgs (elmo-folder-list-messages folder)))) (car (elmo-list-diff numbers (nthcdr (string-to-number (elmo-filter-value filter)) numbers))))) ((string= "flag" search-key) (list nil (if (eq (elmo-filter-type filter) 'unmatch) "not " "") (elmo-imap4-flag-to-imap-criteria (intern (elmo-filter-value filter))))) ((or (string= "since" search-key) (string= "before" search-key)) (list nil (if (eq (elmo-filter-type filter) 'unmatch) "not" "") (concat "sent" search-key) (elmo-date-get-description (elmo-date-get-datevec (elmo-filter-value filter))))) (t (let ((charset (elmo-imap4-detect-search-charset (elmo-filter-value filter)))) (when (string= search-key "raw-body") (setq search-key "body")) (list (elmo-imap4-astring (symbol-name charset)) (if (eq (elmo-filter-type filter) 'unmatch) "not" "") (if (member search-key elmo-imap4-search-keys) search-key (format "header %s" search-key)) (elmo-imap4-astring (encode-mime-charset-string (elmo-filter-value filter) charset)))))))) (defun elmo-imap4-search-mergeable-p (a b) "Return t if A and B are two mergeable IMAP searches. A is the result of a call to elmo-imap4-search-generate. B is the result of a call to elmo-imap4-search-generate." (let ((cara (car a)) (carb (car b))) (and (not (numberp cara)) (not (numberp carb)) (or (null cara) (null carb) (equal cara carb))))) (defun elmo-imap4-search-mergeable-charset (a b) "Return the charset of two searches for merging. A is the result of a call to elmo-imap4-search-generate. B is the result of a call to elmo-imap4-search-generate." (or (car a) (car b))) (defun elmo-imap4-search-generate-uid (msgs) "Return a search for a set of msgs. A search is a list of the form (CHARSET IMAP-SEARCH-COMMAND ...) which is to be evaluated at a future time." (list nil (concat "uid " (cdr (car (elmo-imap4-make-number-set-list msgs)))))) (defun elmo-imap4-search-generate-and (session a b) "Return a search that returns the intersection of A and B in SESSION. SESSION is an imap session. A is the result of a call to elmo-imap4-search-generate. B is the result of a call to elmo-imap4-search-generate. A search is either a list of UIDs or a list of the form (CHARSET IMAP-SEARCH-COMMAND ...) which is to be evaluated at a future time." (if (elmo-imap4-search-mergeable-p a b) (append (list (elmo-imap4-search-mergeable-charset a b)) (cdr a) (cdr b)) (elmo-list-filter (elmo-imap4-search-perform session a) (elmo-imap4-search-perform session b)))) (defun elmo-imap4-search-generate-or (session a b) "Return a search that returns the union of A and B in SESSION. SESSION is an imap session. A is the result of a call to elmo-imap4-search-generate. B is the result of a call to elmo-imap4-search-generate. A search is either a list of UIDs or a list of the form (CHARSET IMAP-SEARCH-COMMAND ...) which is to be evaluated at a future time." (if (elmo-imap4-search-mergeable-p a b) (append (list (elmo-imap4-search-mergeable-charset a b) "OR" (list 'group (cdr a)) (list 'group (cdr b)))) (elmo-uniq-list (append (elmo-imap4-search-perform session a) (elmo-imap4-search-perform session b))))) (defun elmo-imap4-search-generate (folder session condition from-msgs) "Return search in FOLDER for CONDITON and FROM-MSGS. FOLDER is a elmo folder structure. CONDITION is a search condition. FROM-MSGS is a set of messages. When nil, generate vector for all messages in FOLDER. A search is either a list of UIDs or a list of the form (CHARSET IMAP-SEARCH-COMMAND ...) which is to be evaluated at a future time." (if (vectorp condition) (elmo-imap4-search-generate-vector folder condition from-msgs) (let ((a (elmo-imap4-search-generate folder session (nth 1 condition) from-msgs)) (b (elmo-imap4-search-generate folder session (nth 2 condition) from-msgs))) (cond ((eq (car condition) 'and) (elmo-imap4-search-generate-and session a b)) ((eq (car condition) 'or) (elmo-imap4-search-generate-or session a b)))))) (defun elmo-imap4-search-internal (folder session condition from-msgs) (let* ((elmo-imap4-search-keys (apply 'append elmo-imap4-search-keys (mapcar (lambda (elt) (when (elmo-imap4-session-capable-p session (car elt)) (cdr elt))) elmo-imap4-capability-search-keys-alist))) (imap-search (if (and from-msgs (listp from-msgs)) (elmo-imap4-search-generate-and session (elmo-imap4-search-generate-uid from-msgs) (elmo-imap4-search-generate folder session condition from-msgs)) (elmo-imap4-search-generate folder session condition nil)))) (when imap-search (elmo-imap4-search-perform session imap-search)))) (luna-define-method elmo-folder-search :around ((folder elmo-imap4-folder) condition &optional numbers) (if (elmo-folder-plugged-p folder) (save-excursion (let ((session (elmo-imap4-get-session folder)) ret) (message "Searching...") (elmo-imap4-session-select-mailbox session (elmo-imap4-folder-mailbox-internal folder)) (setq ret (elmo-imap4-search-internal folder session condition numbers)) (message "Searching...done") ret)) (luna-call-next-method))) (luna-define-method elmo-folder-msgdb-create-plugged ((folder elmo-imap4-folder) numbers flag-table) (when numbers (let ((session (elmo-imap4-get-session folder)) (headers (elmo-uniq-list (append '("Subject" "From" "To" "Cc" "Date" "Message-Id" "References" "In-Reply-To") (mapcar #'capitalize (elmo-msgdb-extra-fields 'non-virtual))))) print-length rfc2060 set-list) (setq rfc2060 (elmo-imap4-session-capable-p session 'imap4rev1)) (elmo-with-progress-display (elmo-folder-msgdb-create (length numbers)) "Creating msgdb" (elmo-imap4-session-select-mailbox session (elmo-imap4-folder-mailbox-internal folder)) (setq set-list (elmo-imap4-make-number-set-list numbers elmo-imap4-overview-fetch-chop-length)) ;; Setup callback. (with-current-buffer (elmo-network-session-buffer session) (setq elmo-imap4-current-msgdb (elmo-make-msgdb) elmo-imap4-seen-messages nil elmo-imap4-fetch-callback 'elmo-imap4-fetch-callback-1 elmo-imap4-fetch-callback-data (cons flag-table folder)) (while set-list (elmo-imap4-send-command-wait session ;; get overview entity from IMAP4 (format "%sfetch %s (%s rfc822.size flags)" (if elmo-imap4-use-uid "uid " "") (cdr (car set-list)) (if rfc2060 (format "body.peek[header.fields %s]" headers) (format "%s" headers)))) (setq set-list (cdr set-list))) (when elmo-imap4-seen-messages (elmo-imap4-set-flag folder elmo-imap4-seen-messages "\\Seen")) ;; cannot setup the global flag while retrieval. (dolist (number (elmo-msgdb-list-messages elmo-imap4-current-msgdb)) (elmo-global-flags-set (elmo-msgdb-flags elmo-imap4-current-msgdb number) folder number (elmo-message-entity-field (elmo-msgdb-message-entity elmo-imap4-current-msgdb number) 'message-id))) elmo-imap4-current-msgdb))))) (luna-define-method elmo-folder-set-flag-plugged ((folder elmo-imap4-folder) numbers flag) (let ((spec (cdr (assq flag elmo-imap4-flag-specs)))) (elmo-imap4-set-flag folder numbers (or (car spec) (capitalize (symbol-name flag))) (nth 1 spec)))) (luna-define-method elmo-folder-unset-flag-plugged ((folder elmo-imap4-folder) numbers flag) (let ((spec (cdr (assq flag elmo-imap4-flag-specs)))) (elmo-imap4-set-flag folder numbers (or (car spec) (capitalize (symbol-name flag))) (not (nth 1 spec))))) (luna-define-method elmo-message-use-cache-p ((_folder elmo-imap4-folder) _number) elmo-imap4-use-cache) (luna-define-method elmo-folder-message-appendable-p ((folder elmo-imap4-folder)) (if (elmo-folder-plugged-p folder) (not (elmo-imap4-session-read-only-internal (elmo-imap4-get-session folder))) elmo-enable-disconnected-operation)) ; offline refile. (luna-define-method elmo-folder-check-plugged ((folder elmo-imap4-folder)) (let ((session (elmo-imap4-get-session folder 'if-exists))) (when session (if (elmo-imap4-mailbox-selected-p (elmo-imap4-folder-mailbox-internal folder) session) (if elmo-imap4-use-select-to-update-status (elmo-imap4-session-select-mailbox session (elmo-imap4-folder-mailbox-internal folder) 'force) (elmo-imap4-session-check session)))))) (defsubst elmo-imap4-folder-diff-plugged (folder) (let ((session (elmo-imap4-get-session folder)) messages new unread response) ;;; (elmo-imap4-commit spec) (with-current-buffer (elmo-network-session-buffer session) (setq elmo-imap4-status-callback nil) (setq elmo-imap4-status-callback-data nil)) (if elmo-imap4-use-select-to-update-status (elmo-imap4-session-select-mailbox session (elmo-imap4-folder-mailbox-internal folder))) (if (elmo-imap4-mailbox-selected-p (elmo-imap4-folder-mailbox-internal folder) session) (progn (elmo-imap4-send-command-wait session "noop") (setq unread (length (elmo-imap4-folder-list-flagged folder 'unread))) (setq messages (car (elmo-imap4-session-current-mailbox-size-internal session)) new (cdr (elmo-imap4-session-current-mailbox-size-internal session)))) (setq response (elmo-imap4-send-command-wait session (list "status" (elmo-imap4-mailbox (elmo-imap4-folder-mailbox-internal folder)) "(recent unseen messages)"))) (setq response (elmo-imap4-response-value response 'status)) (setq messages (elmo-imap4-response-value response 'messages)) (setq new (elmo-imap4-response-value response 'recent) unread (elmo-imap4-response-value response 'unseen))) (if (< unread new) (setq new unread)) (list new unread messages))) (luna-define-method elmo-folder-diff-plugged ((folder elmo-imap4-folder)) (elmo-imap4-folder-diff-plugged folder)) (luna-define-method elmo-folder-diff-async ((folder elmo-imap4-folder)) (setq elmo-imap4-server-diff-async-callback elmo-folder-diff-async-callback) (setq elmo-imap4-server-diff-async-callback-data elmo-folder-diff-async-callback-data) (elmo-imap4-server-diff-async folder)) (luna-define-method elmo-folder-open :around ((folder elmo-imap4-folder) &optional load-msgdb) (if (elmo-folder-plugged-p folder) (let (session mailbox msgdb response tag) (condition-case nil (progn (setq session (elmo-imap4-get-session folder) mailbox (elmo-imap4-folder-mailbox-internal folder) tag (elmo-imap4-send-command session (list "select" (elmo-imap4-mailbox mailbox)))) (message "Selecting %s..." (elmo-folder-name-internal folder)) (if load-msgdb (setq msgdb (elmo-folder-msgdb-load folder 'silent))) (elmo-folder-set-killed-list-internal folder (elmo-msgdb-killed-list-load (elmo-folder-msgdb-path folder))) (if (elmo-imap4-response-ok-p (setq response (elmo-imap4-read-response session tag))) (progn (let ((exists (assq 'exists response))) ; update message count, (when exists ; so merge update can go (elmo-folder-set-info-hashtb folder nil (cadr exists)))) (elmo-imap4-session-set-current-mailbox-internal session mailbox) (elmo-imap4-session-set-read-only-internal session (nth 1 (assq 'read-only (assq 'ok response)))) (elmo-imap4-session-set-flags-internal session (nth 1 (or (assq 'permanentflags response) (assq 'flags response))))) (elmo-imap4-session-set-current-mailbox-internal session nil) (elmo-imap4-session-set-current-mailbox-size-internal session nil) (if (elmo-imap4-response-bye-p response) (elmo-imap4-process-bye session) (error "%s" (or (elmo-imap4-response-error-text response) (format "Select %s failed" mailbox))))) (message "Selecting %s...done" (elmo-folder-name-internal folder)) (elmo-folder-set-msgdb-internal folder msgdb)) (quit (if (elmo-imap4-response-ok-p response) (elmo-imap4-session-set-current-mailbox-internal session mailbox) (and session (elmo-imap4-session-set-current-mailbox-internal session nil)))) (error (if (elmo-imap4-response-ok-p response) (elmo-imap4-session-set-current-mailbox-internal session mailbox) (and session (elmo-imap4-session-set-current-mailbox-internal session nil) (elmo-imap4-session-set-current-mailbox-size-internal session nil)))))) (luna-call-next-method))) ;; elmo-folder-open-internal: do nothing. (luna-define-method elmo-find-fetch-strategy ((folder elmo-imap4-folder) number &optional ignore-cache require-entireness) (let ((entity (elmo-message-entity folder number))) (if (null entity) (elmo-make-fetch-strategy 'entire) (let* ((size (elmo-message-entity-field entity 'size)) (message-id (elmo-message-entity-field entity 'message-id)) (cache-file (elmo-file-cache-get message-id)) (use-cache (and (not ignore-cache) (elmo-message-use-cache-p folder number) (if require-entireness (eq (elmo-file-cache-status cache-file) 'entire) (elmo-file-cache-status cache-file))))) (elmo-make-fetch-strategy (if use-cache (elmo-file-cache-status cache-file) (if (and (not require-entireness) elmo-message-fetch-threshold (integerp size) (>= size elmo-message-fetch-threshold) (or (not elmo-message-fetch-confirm) (not (prog1 (y-or-n-p (format "Fetch entire message at once? (%dbytes)" size)) (message ""))))) 'section 'entire)) use-cache (elmo-message-use-cache-p folder number) (elmo-file-cache-path cache-file)))))) (luna-define-method elmo-folder-create-plugged ((folder elmo-imap4-folder)) (elmo-imap4-send-command-wait (elmo-imap4-get-session folder) (list "create" (elmo-imap4-mailbox (elmo-imap4-folder-mailbox-internal folder))))) (defun elmo-imap4-flags-to-imap (flags) "Convert FLAGS to the IMAP flag string." (let ((imap-flag (if (not (memq 'unread flags)) "\\Seen"))) (dolist (flag flags) (unless (memq flag '(new read unread cached)) (setq imap-flag (concat imap-flag (if imap-flag " ") (or (car (cdr (assq flag elmo-imap4-flag-specs))) (capitalize (symbol-name flag))))))) imap-flag)) (luna-define-method elmo-folder-append-buffer ((folder elmo-imap4-folder) &optional flags number return-number) (if (elmo-folder-plugged-p folder) (let ((session (elmo-imap4-get-session folder)) (internaldate (elmo-time-make-imap-date-string)) send-buffer result) (elmo-imap4-session-select-mailbox session (elmo-imap4-folder-mailbox-internal folder)) (setq send-buffer (elmo-imap4-setup-send-buffer)) (unwind-protect (setq result (elmo-imap4-send-command-wait session (list "append" (elmo-imap4-mailbox (elmo-imap4-folder-mailbox-internal folder)) (if (and flags (elmo-folder-use-flag-p folder)) (concat "(" (elmo-imap4-flags-to-imap flags) ")") "()") (if return-number (concat "\"" internaldate "\"") "") (elmo-imap4-buffer-literal send-buffer)))) (kill-buffer send-buffer)) (when result (elmo-folder-preserve-flags folder (elmo-msgdb-get-message-id-from-buffer) flags) (when return-number (unless (setq result (cl-cadadr (assq 'appenduid (cdar result)))) (let ((candidates (elmo-imap4-response-value (elmo-imap4-send-command-wait session (list "uid search since" (elmo-date-get-description (elmo-date-get-offset-datevec (elmo-date-get-datevec internaldate) 1)))) 'search))) (if (null candidates) (setq result t) (setq candidates (elmo-imap4-response-value-all (elmo-imap4-send-command-wait session (list "uid fetch" (mapconcat 'number-to-string candidates ",") "(internaldate)")) 'fetch)) (setq internaldate (elmo-date-get-datevec internaldate)) (while candidates (if (equal (elmo-date-get-datevec (cl-cadar candidates)) internaldate) (setq result (cons (cl-cadadr candidates) result))) (setq candidates (cddr candidates))) (setq result (or (null result) (> (length result) 1) (car result)))))))) result) ;; Unplugged (if elmo-enable-disconnected-operation (elmo-folder-append-buffer-dop folder flags number) (error "Unplugged")))) (eval-when-compile (defmacro elmo-imap4-identical-system-p (folder1 folder2) "Return t if FOLDER1 and FOLDER2 are in the same IMAP4 system." `(and (string= (elmo-net-folder-server-internal ,folder1) (elmo-net-folder-server-internal ,folder2)) (eq (elmo-net-folder-port-internal ,folder1) (elmo-net-folder-port-internal ,folder2)) (string= (elmo-net-folder-user-internal ,folder1) (elmo-net-folder-user-internal ,folder2))))) (luna-define-method elmo-folder-next-message-number-plugged ((folder elmo-imap4-folder)) (let* ((session (elmo-imap4-get-session folder)) (selected (elmo-imap4-mailbox-selected-p (elmo-imap4-folder-mailbox-internal folder) session)) response) (with-current-buffer (elmo-network-session-buffer session) (setq elmo-imap4-status-callback nil) (setq elmo-imap4-status-callback-data nil)) (cond ((and selected (not elmo-imap4-use-select-to-update-status)) (elmo-imap4-send-command-wait session "close") (elmo-imap4-session-set-current-mailbox-internal session nil) (elmo-imap4-session-set-current-mailbox-size-internal session nil)) ((and (not selected) elmo-imap4-use-select-to-update-status) ;; This will result in a violation of RFC3501: calling STATUS on ;; a selected mailbox. (elmo-imap4-session-select-mailbox session (elmo-imap4-folder-mailbox-internal folder)))) (setq response (elmo-imap4-send-command-wait session (list "status" (elmo-imap4-mailbox (elmo-imap4-folder-mailbox-internal folder)) "(uidnext)")) response (elmo-imap4-response-value response 'status)) (elmo-imap4-response-value response 'uidnext))) (defun elmo-folder-append-messages-imap4-imap4 (dst-folder src-folder numbers same-number) (if (and (elmo-imap4-identical-system-p dst-folder src-folder) (elmo-folder-plugged-p dst-folder)) ;; Plugged (prog1 (elmo-imap4-copy-messages src-folder dst-folder numbers) (elmo-progress-notify 'elmo-folder-move-messages (length numbers))) (elmo-folder-append-messages dst-folder src-folder numbers same-number 'elmo-folder-append-messages-imap4-imap4))) (luna-define-method elmo-message-deletable-p ((folder elmo-imap4-folder) _number) (if (elmo-folder-plugged-p folder) (not (elmo-imap4-session-read-only-internal (elmo-imap4-get-session folder))) elmo-enable-disconnected-operation)) ; offline refile. ;;;(luna-define-method elmo-message-fetch-unplugged ;;; ((folder elmo-imap4-folder) ;;; number strategy &optional section outbuf unseen) ;;; (error "%d%s is not cached." number (if section ;;; (format "(%s)" section) ;;; ""))) (defsubst elmo-imap4-message-fetch (folder number _strategy section outbuf unseen) (let ((session (elmo-imap4-get-session folder)) response) (elmo-imap4-session-select-mailbox session (elmo-imap4-folder-mailbox-internal folder)) (with-current-buffer (elmo-network-session-buffer session) (setq elmo-imap4-fetch-callback nil) (setq elmo-imap4-fetch-callback-data nil)) (elmo-with-progress-display (elmo-retrieve-message (elmo-message-field folder number :size) elmo-imap4-literal-progress-reporter) "Retrieving" (setq response (elmo-imap4-send-command-wait session (format (if elmo-imap4-use-uid "uid fetch %s body%s[%s]" "fetch %s body%s[%s]") number (if unseen ".peek" "") (or section ""))))) (if (setq response (elmo-imap4-response-bodydetail-text (elmo-imap4-response-value-all response 'fetch))) (with-current-buffer outbuf (erase-buffer) (insert response) (elmo-delete-cr-buffer) t)))) (luna-define-method elmo-message-fetch-plugged ((folder elmo-imap4-folder) number strategy &optional section outbuf unseen) (when elmo-imap4-set-seen-flag-explicitly (elmo-imap4-set-flag folder (list number) "\\Seen")) (elmo-imap4-message-fetch folder number strategy section outbuf unseen)) (luna-define-method elmo-message-fetch-field ((folder elmo-imap4-folder) number field) (let ((session (elmo-imap4-get-session folder))) (elmo-imap4-session-select-mailbox session (elmo-imap4-folder-mailbox-internal folder)) (with-current-buffer (elmo-network-session-buffer session) (setq elmo-imap4-fetch-callback nil) (setq elmo-imap4-fetch-callback-data nil)) (with-temp-buffer (insert (elmo-imap4-response-bodydetail-text (elmo-imap4-response-value (elmo-imap4-send-command-wait session (concat (if elmo-imap4-use-uid "uid ") (format "fetch %s (body.peek[header.fields (%s)])" number field))) 'fetch))) (elmo-delete-cr-buffer) (goto-char (point-min)) (std11-field-body (symbol-name field))))) (luna-define-method elmo-folder-search-requires-msgdb-p ((_folder elmo-imap4-folder) _condition) nil) (luna-define-method elmo-folder-close-internal ((folder elmo-imap4-folder)) (when (elmo-folder-plugged-p folder) (let ((session (elmo-imap4-get-session folder)) (mailbox (elmo-imap4-folder-mailbox-internal folder))) (when (elmo-imap4-mailbox-selected-p mailbox session) (elmo-imap4-session-unselect-mailbox session mailbox))))) (autoload 'elmo-global-flags-set "elmo-flag") (autoload 'elmo-get-global-flags "elmo-flag") (require 'product) (product-provide (provide 'elmo-imap4) (require 'elmo-version)) ;;; elmo-imap4.el ends here wanderlust-wanderlust-769699d/elmo/elmo-internal.el000066400000000000000000000061721406661363500224370ustar00rootroot00000000000000;;; elmo-internal.el --- Internal Interface for ELMO. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Author: Yuuichi Teranishi ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'elmo) ;;; ELMO internal folder (luna-define-class elmo-internal-folder (elmo-folder) ()) (defvar elmo-internal-folder-list '(flag cache sendlog null)) (defvar elmo-internal-obsolete-folder-list '((mark flag))) (luna-define-method elmo-folder-initialize ((folder elmo-internal-folder) name) (when (assq (intern name) elmo-internal-obsolete-folder-list) (elmo-warning "Folder '%s is now obsolete. Use '%s instead." name (cadr (assq (intern name) elmo-internal-obsolete-folder-list)))) (elmo-internal-folder-initialize folder name)) (defun elmo-internal-folder-initialize (folder name) (let ((fsyms elmo-internal-folder-list) fname class sym) (if (progn (while fsyms (setq fname (symbol-name (car fsyms))) (when (string-match (concat "^" fname) name) (require (intern (concat "elmo-" fname))) (setq class (intern (concat "elmo-" fname "-folder")) sym (intern fname) fsyms nil)) (setq fsyms (cdr fsyms))) class) (elmo-folder-initialize (luna-make-entity class :type sym :prefix (elmo-folder-prefix-internal folder) :name (elmo-folder-name-internal folder) :persistent (elmo-folder-persistent-internal folder) :mime-charset (elmo-folder-mime-charset-internal folder)) name) folder))) (luna-define-method elmo-folder-list-subfolders ((folder elmo-internal-folder) &optional one-level) (if one-level (mapcar (lambda (x) (let ((name (concat (elmo-folder-prefix-internal folder) (symbol-name x)))) (if (elmo-folder-have-subfolder-p (elmo-get-folder name)) (list name) name))) elmo-internal-folder-list) (apply #'nconc (mapcar (lambda (x) (let* ((name (concat (elmo-folder-prefix-internal folder) (symbol-name x))) (subfolder (elmo-get-folder name))) (if (elmo-folder-have-subfolder-p subfolder) (elmo-folder-list-subfolders subfolder) (list name)))) elmo-internal-folder-list)))) (require 'product) (product-provide (provide 'elmo-internal) (require 'elmo-version)) ;;; elmo-internal.el ends here wanderlust-wanderlust-769699d/elmo/elmo-localdir.el000066400000000000000000000303421406661363500224100ustar00rootroot00000000000000;;; elmo-localdir.el --- Localdir Interface for ELMO. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Copyright (C) 1998,1999,2000 Masahiro MURATA ;; Copyright (C) 1999,2000 Kenichi OKADA ;; Author: Yuuichi Teranishi ;; Masahiro MURATA ;; Kenichi OKADA ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'cl-lib) (require 'elmo-msgdb) (require 'elmo) (defcustom elmo-localdir-folder-path "~/Mail" "*Local mail directory (MH format) path." :type 'directory :group 'elmo) (defvar elmo-localdir-lockfile-list nil) ;;; ELMO Local directory folder (eval-and-compile (luna-define-class elmo-localdir-folder (elmo-folder elmo-file-tag) (dir-name directory)) (luna-define-internal-accessors 'elmo-localdir-folder)) ;;; elmo-localdir specific methods. (luna-define-generic elmo-localdir-folder-path (folder) "Return local directory path of the FOLDER.") (luna-define-generic elmo-localdir-folder-name (folder name) "Return directory NAME for FOLDER.") (luna-define-method elmo-localdir-folder-path ((_folder elmo-localdir-folder)) elmo-localdir-folder-path) (luna-define-method elmo-localdir-folder-name ((_folder elmo-localdir-folder) name) name) (luna-define-method elmo-folder-initialize ((folder elmo-localdir-folder) name) (elmo-localdir-folder-set-dir-name-internal folder name) (if (file-name-absolute-p name) (elmo-localdir-folder-set-directory-internal folder (expand-file-name name)) (elmo-localdir-folder-set-directory-internal folder (expand-file-name (elmo-localdir-folder-name folder name) (elmo-localdir-folder-path folder)))) folder) ;; open, check, commit, and close are generic. (luna-define-method elmo-folder-exists-p ((folder elmo-localdir-folder)) (file-directory-p (elmo-localdir-folder-directory-internal folder))) (luna-define-method elmo-folder-expand-msgdb-path ((folder elmo-localdir-folder)) (let* ((dir-name (elmo-localdir-folder-dir-name-internal folder)) (path (mapconcat 'identity (delete "" (mapcar 'elmo-replace-string-as-filename (split-string (if (file-name-absolute-p dir-name) (expand-file-name dir-name) dir-name) "/"))) "/"))) (expand-file-name path (expand-file-name ;;"localdir" or "localdir-abs" (concat (symbol-name (elmo-folder-type-internal folder)) (when (file-name-absolute-p dir-name) "-abs")) elmo-msgdb-directory)))) (luna-define-method elmo-message-file-name ((folder elmo-localdir-folder) number) (expand-file-name (number-to-string number) (elmo-localdir-folder-directory-internal folder))) (luna-define-method elmo-folder-message-file-number-p ((_folder elmo-localdir-folder)) t) (luna-define-method elmo-folder-message-file-directory ((folder elmo-localdir-folder)) (elmo-localdir-folder-directory-internal folder)) (luna-define-method elmo-folder-message-make-temp-file-p ((_folder elmo-localdir-folder)) t) (luna-define-method elmo-folder-message-make-temp-files ((folder elmo-localdir-folder) numbers &optional start-number) (let ((temp-dir (elmo-folder-make-temporary-directory folder)) (cur-number (or start-number 0))) (dolist (number numbers) (elmo-copy-file (expand-file-name (number-to-string number) (elmo-localdir-folder-directory-internal folder)) (expand-file-name (number-to-string (if start-number cur-number number)) temp-dir)) (cl-incf cur-number)) temp-dir)) (defun elmo-localdir-msgdb-create-entity (msgdb dir number) (elmo-msgdb-create-message-entity-from-file (elmo-msgdb-message-entity-handler msgdb) number (expand-file-name (number-to-string number) dir))) (luna-define-method elmo-folder-msgdb-create ((folder elmo-localdir-folder) numbers flag-table) (when numbers (let ((dir (elmo-localdir-folder-directory-internal folder)) (new-msgdb (elmo-make-msgdb)) entity message-id flags) (elmo-with-progress-display (elmo-folder-msgdb-create (length numbers)) "Creating msgdb" (dolist (number numbers) (setq entity (elmo-localdir-msgdb-create-entity new-msgdb dir number)) (when entity (setq message-id (elmo-message-entity-field entity 'message-id) flags (elmo-flag-table-get flag-table message-id)) (elmo-global-flags-set flags folder number message-id) (elmo-msgdb-append-entity new-msgdb entity flags)) (elmo-progress-notify 'elmo-folder-msgdb-create))) new-msgdb))) (luna-define-method elmo-folder-list-subfolders ((folder elmo-localdir-folder) &optional one-level) (elmo-mapcar-list-of-list (lambda (x) (concat (elmo-folder-prefix-internal folder) x)) (elmo-list-subdirectories (elmo-localdir-folder-path folder) (or (elmo-localdir-folder-dir-name-internal folder) "") one-level))) (defsubst elmo-localdir-list-subr (folder &optional nonsort) (let ((flist (mapcar 'string-to-number (directory-files (elmo-localdir-folder-directory-internal folder) nil "^[0-9]+$" t))) (killed (elmo-msgdb-killed-list-load (elmo-folder-msgdb-path folder)))) (if nonsort (cons (elmo-max-of-list flist) (if killed (- (length flist) (elmo-msgdb-killed-list-length killed)) (length flist))) (sort flist '<)))) (luna-define-method elmo-folder-append-buffer ((folder elmo-localdir-folder) &optional flags number return-number) (let ((filename (elmo-message-file-name folder (or number (1+ (car (elmo-folder-status folder))))))) (when (and (file-writable-p filename) (not (file-exists-p filename))) (write-region-as-binary (point-min) (point-max) filename nil 'no-msg) (elmo-folder-preserve-flags folder (elmo-msgdb-get-message-id-from-buffer) flags) (if return-number (car (elmo-folder-status folder)) t)))) (defun elmo-folder-append-messages-*-localdir (folder src-folder numbers same-number) (let ((src-msgdb-exists (not (zerop (elmo-folder-length src-folder)))) (dir (elmo-localdir-folder-directory-internal folder)) (table (elmo-folder-flag-table folder)) (succeeds numbers) (next-num (1+ (car (elmo-folder-status folder)))) flags id) (while numbers (setq flags (elmo-message-flags src-folder (car numbers))) (elmo-copy-file (elmo-message-file-name src-folder (car numbers)) (expand-file-name (number-to-string (if same-number (car numbers) next-num)) dir)) ;; save flag-table only when src folder's msgdb is loaded. (when (setq id (and src-msgdb-exists (elmo-message-field src-folder (car numbers) 'message-id))) (elmo-flag-table-set table id flags)) (elmo-progress-notify 'elmo-folder-move-messages) (if (and (setq numbers (cdr numbers)) (not same-number)) (setq next-num (if (elmo-localdir-locked-p) ;; MDA is running. (1+ (car (elmo-folder-status folder))) (1+ next-num))))) (when (elmo-folder-persistent-p folder) (elmo-folder-close-flag-table folder)) succeeds)) (luna-define-method elmo-folder-delete-messages-internal ((folder elmo-localdir-folder) numbers) (dolist (number numbers) (elmo-localdir-delete-message folder number)) t) (defun elmo-localdir-delete-message (folder number) "Delete message in the FOLDER with NUMBER." (let ((filename (elmo-message-file-name folder number))) (when (and (string-match "[0-9]+" filename) ; for safety. (file-exists-p filename) (file-writable-p filename) (not (file-directory-p filename))) (delete-file filename) t))) (luna-define-method elmo-message-fetch-internal ((folder elmo-localdir-folder) number _strategy &optional _section _unread) (let ((filename (elmo-message-file-name folder number))) (when (file-exists-p filename) (insert-file-contents-as-raw-text filename)))) (luna-define-method elmo-folder-list-messages-internal ((folder elmo-localdir-folder) &optional _nohide) (elmo-localdir-list-subr folder)) (luna-define-method elmo-folder-status ((folder elmo-localdir-folder)) (elmo-localdir-list-subr folder t)) (luna-define-method elmo-folder-creatable-p ((_folder elmo-localdir-folder)) t) (luna-define-method elmo-folder-writable-p ((_folder elmo-localdir-folder)) t) (luna-define-method elmo-folder-create ((folder elmo-localdir-folder)) (let ((dir (elmo-localdir-folder-directory-internal folder))) (if (file-directory-p dir) () (if (file-exists-p dir) (error "Create folder failed") (elmo-make-directory dir)) t))) (luna-define-method elmo-folder-delete ((folder elmo-localdir-folder)) (let ((msgs (and (elmo-folder-exists-p folder) (elmo-folder-list-messages folder)))) (when (yes-or-no-p (format "%sDelete msgdb and substance of \"%s\"? " (if (> (length msgs) 0) (format "%d msg(s) exists. " (length msgs)) "") (elmo-folder-name-internal folder))) (let ((dir (elmo-localdir-folder-directory-internal folder))) (if (not (file-directory-p dir)) (error "No such directory: %s" dir) (elmo-delete-match-files dir "[0-9]+" t))) (elmo-msgdb-delete-path folder) t))) (luna-define-method elmo-folder-rename-internal ((folder elmo-localdir-folder) new-folder) (let* ((old (elmo-localdir-folder-directory-internal folder)) (new (elmo-localdir-folder-directory-internal new-folder)) (new-dir (directory-file-name (file-name-directory new)))) (unless (file-directory-p old) (error "No such directory: %s" old)) (when (file-exists-p new) (error "Already exists directory: %s" new)) (unless (file-directory-p new-dir) (elmo-make-directory new-dir)) (rename-file old new) t)) (luna-define-method elmo-folder-pack-numbers ((folder elmo-localdir-folder)) (let* ((dir (elmo-localdir-folder-directory-internal folder)) (msgdb (elmo-folder-msgdb folder)) (new-msgdb (elmo-make-msgdb (elmo-folder-msgdb-path folder))) (numbers (sort (elmo-folder-list-messages folder nil (not elmo-pack-number-check-strict)) '<)) (new-number 1) ; first ordinal position in localdir entity) (elmo-with-progress-display (elmo-folder-pack-numbers (length numbers)) "Packing" (dolist (old-number numbers) (setq entity (elmo-msgdb-message-entity msgdb old-number)) (when (/= old-number new-number) (elmo-bind-directory dir ;; xxx nfs,hardlink (rename-file (number-to-string old-number) (number-to-string new-number) t)) (elmo-message-entity-set-number entity new-number)) (elmo-msgdb-append-entity new-msgdb entity (elmo-msgdb-flags msgdb old-number)) (elmo-emit-signal 'message-number-changed folder old-number new-number) (elmo-progress-notify 'elmo-folder-pack-numbers) (setq new-number (1+ new-number)))) (elmo-folder-set-msgdb-internal folder new-msgdb)) t) (luna-define-method elmo-folder-message-file-p ((_folder elmo-localdir-folder)) t) (defun elmo-localdir-locked-p () (if elmo-localdir-lockfile-list (let ((lock elmo-localdir-lockfile-list)) (catch 'found (while lock (if (file-exists-p (car lock)) (throw 'found t)) (setq lock (cdr lock))))))) (autoload 'elmo-global-flags-set "elmo-flag") (require 'product) (product-provide (provide 'elmo-localdir) (require 'elmo-version)) ;;; elmo-localdir.el ends here wanderlust-wanderlust-769699d/elmo/elmo-localnews.el000066400000000000000000000046711406661363500226140ustar00rootroot00000000000000;;; elmo-localnews.el --- Local News Spool Interface for ELMO. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000 OKUNISHI Fujikazu ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Author: OKUNISHI Fujikazu ;; Yuuichi Teranishi ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'elmo-localdir) (defcustom elmo-localnews-folder-path "~/News" "*Local news folder path." :type 'directory :group 'elmo) (eval-and-compile (luna-define-class elmo-localnews-folder (elmo-localdir-folder) (group)) (luna-define-internal-accessors 'elmo-localnews-folder)) (luna-define-method elmo-folder-initialize :before ((folder elmo-localnews-folder) name) (elmo-localnews-folder-set-group-internal folder (elmo-replace-char-in-string ?/ ?. name t))) (luna-define-method elmo-localdir-folder-path ((_folder elmo-localnews-folder)) elmo-localnews-folder-path) (luna-define-method elmo-localdir-folder-name ((_folder elmo-localnews-folder) name) (elmo-replace-char-in-string ?. ?/ name t)) (luna-define-method elmo-folder-expand-msgdb-path ((folder elmo-localnews-folder)) (expand-file-name (elmo-localnews-folder-group-internal folder) (expand-file-name (symbol-name (elmo-folder-type-internal folder)) elmo-msgdb-directory))) (luna-define-method elmo-folder-newsgroups ((folder elmo-localnews-folder)) (list (elmo-localnews-folder-group-internal folder))) (require 'product) (product-provide (provide 'elmo-localnews) (require 'elmo-version)) ;;; elmo-localnews.el ends here wanderlust-wanderlust-769699d/elmo/elmo-maildir.el000066400000000000000000000505411406661363500222430ustar00rootroot00000000000000;;; elmo-maildir.el --- Maildir interface for ELMO. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Author: Yuuichi Teranishi ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'cl-lib) (require 'elmo-util) (require 'elmo) (require 'elmo-map) (require 'elmo-flag) (defcustom elmo-maildir-folder-path "~/Maildir" "*Maildir folder path." :type 'directory :group 'elmo) (defconst elmo-maildir-flag-specs '((important ?F) (read ?S) (unread ?S 'remove) (answered ?R))) (defcustom elmo-maildir-separator (if (memq system-type '(windows-nt OS/2 emx ms-dos win32 w32 mswindows cygwin)) ?\- ?:) "Character separating the id section from the flags section. According to the maildir specification, this should be a colon (?:), but some file systems don't support colons in filenames." :type 'character :group 'elmo) (defmacro elmo-maildir-adjust-separator (string) `(if (= elmo-maildir-separator ?:) ,string (elmo-replace-char-in-string ?: elmo-maildir-separator ,string))) ;;; ELMO Maildir folder (eval-and-compile (luna-define-class elmo-maildir-folder (elmo-map-folder elmo-file-tag) (directory unread-locations flagged-locations answered-locations)) (luna-define-internal-accessors 'elmo-maildir-folder)) (luna-define-method elmo-folder-initialize ((folder elmo-maildir-folder) name) (if (file-name-absolute-p name) (elmo-maildir-folder-set-directory-internal folder (expand-file-name name)) (elmo-maildir-folder-set-directory-internal folder (expand-file-name name elmo-maildir-folder-path))) folder) (luna-define-method elmo-folder-expand-msgdb-path ((folder elmo-maildir-folder)) (expand-file-name (elmo-replace-string-as-filename (elmo-maildir-folder-directory-internal folder)) (expand-file-name "maildir" elmo-msgdb-directory))) (defun elmo-maildir-message-file-name (folder location) "Get a file name of the message from FOLDER which corresponded to LOCATION." (let ((file (file-name-completion location (expand-file-name "cur" (elmo-maildir-folder-directory-internal folder))))) (if file (expand-file-name (if (eq file t) location file) (expand-file-name "cur" (elmo-maildir-folder-directory-internal folder)))))) (defsubst elmo-maildir-list-location (dir &optional child-dir) (let* ((cur-dir (expand-file-name (or child-dir "cur") dir)) (cur (mapcar (lambda (x) (cons x (elmo-get-last-modification-time (expand-file-name x cur-dir)))) (directory-files cur-dir nil "^[^.].*$" t))) (regexp (elmo-maildir-adjust-separator "^\\(.+\\):[12],\\(.*\\)$")) unread-locations flagged-locations answered-locations sym locations flag-list x-time y-time) (setq cur (sort cur (lambda (x y) (setq x-time (cdr x) y-time (cdr y)) (cond ((< x-time y-time) t) ((eq x-time y-time) (< (elmo-maildir-sequence-number (car x)) (elmo-maildir-sequence-number (car y)))))))) (setq locations (mapcar (lambda (x) (let ((name (car x))) (if (string-match regexp name) (progn (setq sym (match-string 1 name) flag-list (string-to-list (match-string 2 name))) (when (memq ?F flag-list) (setq flagged-locations (cons sym flagged-locations))) (when (memq ?R flag-list) (setq answered-locations (cons sym answered-locations))) (unless (memq ?S flag-list) (setq unread-locations (cons sym unread-locations))) sym) name))) cur)) (list locations unread-locations flagged-locations answered-locations))) (luna-define-method elmo-map-folder-list-message-locations ((folder elmo-maildir-folder)) (elmo-maildir-update-current folder) (let ((locs (elmo-maildir-list-location (elmo-maildir-folder-directory-internal folder)))) ;; 0: locations, 1: unread-locs, 2: flagged-locs 3: answered-locs (elmo-maildir-folder-set-unread-locations-internal folder (nth 1 locs)) (elmo-maildir-folder-set-flagged-locations-internal folder (nth 2 locs)) (elmo-maildir-folder-set-answered-locations-internal folder (nth 3 locs)) (nth 0 locs))) (luna-define-method elmo-map-folder-list-flagged ((folder elmo-maildir-folder) flag) (cl-case flag (unread (elmo-maildir-folder-unread-locations-internal folder)) (important (elmo-maildir-folder-flagged-locations-internal folder)) (answered (elmo-maildir-folder-answered-locations-internal folder)) (otherwise t))) (luna-define-method elmo-folder-msgdb-create ((folder elmo-maildir-folder) numbers flag-table) (let ((unread-list (elmo-maildir-folder-unread-locations-internal folder)) (flagged-list (elmo-maildir-folder-flagged-locations-internal folder)) (answered-list (elmo-maildir-folder-answered-locations-internal folder)) (new-msgdb (elmo-make-msgdb)) entity message-id flags location) (elmo-with-progress-display (elmo-folder-msgdb-create (length numbers)) "Creating msgdb" (dolist (number numbers) (setq location (elmo-map-message-location folder number)) (setq entity (elmo-msgdb-create-message-entity-from-file (elmo-msgdb-message-entity-handler new-msgdb) number (elmo-maildir-message-file-name folder location))) (when entity (setq message-id (elmo-message-entity-field entity 'message-id) ;; Precede flag-table to file-info. flags (copy-sequence (elmo-flag-table-get flag-table message-id))) ;; Already flagged on filename (precede it to flag-table). (when (member location flagged-list) (or (memq 'important flags) (setq flags (cons 'important flags)))) (when (member location answered-list) (or (memq 'answered flags) (setq flags (cons 'answered flags)))) (unless (member location unread-list) (and (memq 'unread flags) (setq flags (delq 'unread flags)))) ;; Update filename's info portion according to the flag-table. (when (and (memq 'important flags) (not (member location flagged-list))) (elmo-maildir-set-mark (elmo-maildir-message-file-name folder location) ?F) ;; Append to flagged location list. (elmo-maildir-folder-set-flagged-locations-internal folder (cons location (elmo-maildir-folder-flagged-locations-internal folder))) (setq flags (delq 'unread flags))) (when (and (memq 'answered flags) (not (member location answered-list))) (elmo-maildir-set-mark (elmo-maildir-message-file-name folder location) ?R) ;; Append to answered location list. (elmo-maildir-folder-set-answered-locations-internal folder (cons location (elmo-maildir-folder-answered-locations-internal folder))) (setq flags (delq 'unread flags))) (when (and (not (memq 'unread flags)) (member location unread-list)) (elmo-maildir-set-mark (elmo-maildir-message-file-name folder location) ?S) ;; Delete from unread locations. (elmo-maildir-folder-set-unread-locations-internal folder (delete location (elmo-maildir-folder-unread-locations-internal folder)))) (unless (memq 'unread flags) (setq flags (delq 'new flags))) (elmo-global-flags-set flags folder number message-id) (elmo-msgdb-append-entity new-msgdb entity flags)) (elmo-progress-notify 'elmo-folder-msgdb-create))) new-msgdb)) (defun elmo-maildir-cleanup-temporal (dir) ;; Delete files in the tmp dir which are not accessed ;; for more than 36 hours. (let ((cur-time (current-time)) (count 0) last-accessed) (mapcar (lambda (file) (setq last-accessed (nth 4 (file-attributes file))) (when (or (> (- (car cur-time)(car last-accessed)) 1) (and (eq (- (car cur-time)(car last-accessed)) 1) (> (- (cadr cur-time)(cadr last-accessed)) 64064))) ; 36 hours. (message "Maildir: %d tmp file(s) are cleared." (setq count (1+ count))) (delete-file file))) (directory-files (expand-file-name "tmp" dir) t ; full "^[^.].*$" t)))) (defun elmo-maildir-update-current (folder) "Move all new msgs to cur in the maildir." (let* ((maildir (elmo-maildir-folder-directory-internal folder)) (news (directory-files (expand-file-name "new" maildir) nil "^[^.].*$" t))) ;; cleanup tmp directory. (elmo-maildir-cleanup-temporal maildir) ;; move new msgs to cur directory. (while news (rename-file (expand-file-name (car news) (expand-file-name "new" maildir)) (expand-file-name (concat (car news) (unless (string-match (elmo-maildir-adjust-separator ":2,[A-Z]*$") (car news)) (elmo-maildir-adjust-separator ":2,"))) (expand-file-name "cur" maildir))) (setq news (cdr news))))) (defun elmo-maildir-set-mark (filename mark) "Mark the FILENAME file in the maildir. MARK is a character." (if (string-match (elmo-maildir-adjust-separator "^\\(.+:[12],\\)\\(.*\\)$") filename) (let ((flaglist (string-to-list (match-string 2 filename)))) (unless (memq mark flaglist) (setq flaglist (sort (cons mark flaglist) '<)) (rename-file filename (concat (match-string 1 filename) (apply 'string flaglist))))) ;; Rescue no info file in maildir. (rename-file filename (concat filename (elmo-maildir-adjust-separator ":2,") (list mark)))) t) (defun elmo-maildir-delete-mark (filename mark) "Mark the FILENAME file in the maildir. MARK is a character." (if (string-match (elmo-maildir-adjust-separator "^\\(.+:2,\\)\\(.*\\)$") filename) (let ((flaglist (string-to-list (match-string 2 filename)))) (when (memq mark flaglist) (setq flaglist (delq mark flaglist)) (rename-file filename (concat (match-string 1 filename) (if flaglist (apply 'string flaglist)))))))) (defsubst elmo-maildir-set-mark-msgs (folder locs mark) (dolist (loc locs) (elmo-maildir-set-mark (elmo-maildir-message-file-name folder loc) mark)) t) (defsubst elmo-maildir-delete-mark-msgs (folder locs mark) (dolist (loc locs) (elmo-maildir-delete-mark (elmo-maildir-message-file-name folder loc) mark)) t) (defsubst elmo-maildir-set-mark-messages (folder locations mark remove) (when mark (if remove (elmo-maildir-delete-mark-msgs folder locations mark) (elmo-maildir-set-mark-msgs folder locations mark)))) (luna-define-method elmo-map-folder-set-flag ((folder elmo-maildir-folder) locations flag) (let ((spec (cdr (assq flag elmo-maildir-flag-specs)))) (when spec (elmo-maildir-set-mark-messages folder locations (car spec) (nth 1 spec))))) (luna-define-method elmo-map-folder-unset-flag ((folder elmo-maildir-folder) locations flag) (let ((spec (cdr (assq flag elmo-maildir-flag-specs)))) (when spec (elmo-maildir-set-mark-messages folder locations (car spec) (not (nth 1 spec)))))) (luna-define-method elmo-folder-list-subfolders ((folder elmo-maildir-folder) &optional one-level) (let ((prefix (concat (elmo-folder-name-internal folder) (unless (string= (elmo-folder-prefix-internal folder) (elmo-folder-name-internal folder)) elmo-path-sep))) (elmo-list-subdirectories-ignore-regexp "^\\(\\.\\.?\\|cur\\|tmp\\|new\\)$") elmo-have-link-count) (append (list (elmo-folder-name-internal folder)) (elmo-mapcar-list-of-list (lambda (x) (concat prefix x)) (elmo-list-subdirectories (elmo-maildir-folder-directory-internal folder) "" one-level))))) (defvar elmo-maildir-sequence-number-internal 0) (defun elmo-maildir-sequence-number (file) "Get `elmo-maildir' specific sequence number from FILE. Not that FILE is the name without directory." ;; elmo-maildir specific. (if (string-match "^.*_\\([0-9]+\\)\\..*" file) (string-to-number (match-string 1 file)) -1)) (defun elmo-maildir-make-unique-string () "This function generates a string that can be used as a unique file name for maildir directories." (let ((cur-time (current-time))) (format "%.0f.%d_%d.%s" (+ (* (car cur-time) (float 65536)) (cadr cur-time)) (emacs-pid) (cl-incf elmo-maildir-sequence-number-internal) (system-name)))) (defun elmo-maildir-temporal-filename (basedir) (let ((filename (expand-file-name (concat "tmp/" (elmo-maildir-make-unique-string)) basedir))) (unless (file-exists-p (file-name-directory filename)) (make-directory (file-name-directory filename))) (while (file-exists-p filename) ;;; I don't want to wait. ;;; (sleep-for 2) (setq filename (expand-file-name (concat "tmp/" (elmo-maildir-make-unique-string)) basedir))) filename)) (defun elmo-maildir-move-file (src dst) (or (condition-case nil (progn ;; 1. Try add-link-to-file, then delete the original. ;; This is safe on NFS. (add-name-to-file src dst) (ignore-errors ;; It's ok if the delete-file fails; ;; elmo-maildir-cleanup-temporal will catch it later. (delete-file src)) t) (error)) ;; 2. Even on systems with hardlinks, some filesystems (like AFS) ;; might not support them, so fall back on rename-file. This is ;; our best shot at atomic when add-name-to-file fails. (rename-file src dst))) (luna-define-method elmo-folder-append-buffer ((folder elmo-maildir-folder) &optional flags _number return-number) (let ((basedir (elmo-maildir-folder-directory-internal folder)) (src-buf (current-buffer)) (number (elmo-folder-next-message-number folder)) dst-buf filename) (condition-case nil (with-temp-buffer (setq filename (elmo-maildir-temporal-filename basedir)) (setq dst-buf (current-buffer)) (with-current-buffer src-buf (copy-to-buffer dst-buf (point-min) (point-max))) (as-binary-output-file (write-region (point-min) (point-max) filename nil 'no-msg)) (elmo-maildir-move-file filename (expand-file-name (concat "new/" (file-name-nondirectory filename)) basedir)) (elmo-folder-preserve-flags folder (elmo-msgdb-get-message-id-from-buffer) flags) (if return-number number t)) ;; If an error occured, return nil. (error)))) (luna-define-method elmo-folder-message-file-p ((_folder elmo-maildir-folder)) t) (luna-define-method elmo-message-file-name ((folder elmo-maildir-folder) number) (elmo-maildir-message-file-name folder (elmo-map-message-location folder number))) (luna-define-method elmo-folder-message-make-temp-file-p ((_folder elmo-maildir-folder)) t) (luna-define-method elmo-folder-message-make-temp-files ((folder elmo-maildir-folder) numbers &optional start-number) (let ((temp-dir (elmo-folder-make-temporary-directory folder)) (cur-number (or start-number 0))) (dolist (number numbers) (elmo-copy-file (elmo-message-file-name folder number) (expand-file-name (number-to-string (if start-number cur-number number)) temp-dir)) (cl-incf cur-number)) temp-dir)) (defun elmo-folder-append-messages-*-maildir (folder src-folder numbers _same-number) (let ((src-msgdb-exists (not (zerop (elmo-folder-length src-folder)))) (dir (elmo-maildir-folder-directory-internal folder)) (table (elmo-folder-flag-table folder)) (succeeds numbers) filename flags id) (dolist (number numbers) (setq flags (elmo-message-flags src-folder number) filename (elmo-maildir-temporal-filename dir)) (elmo-copy-file (elmo-message-file-name src-folder number) filename) (elmo-maildir-move-file filename (expand-file-name (concat "new/" (file-name-nondirectory filename)) dir)) ;; src folder's msgdb is loaded. (when (setq id (and src-msgdb-exists (elmo-message-field src-folder number 'message-id))) (elmo-flag-table-set table id flags)) (elmo-progress-notify 'elmo-folder-move-messages)) (when (elmo-folder-persistent-p folder) (elmo-folder-close-flag-table folder)) succeeds)) (luna-define-method elmo-map-folder-delete-messages ((folder elmo-maildir-folder) locations) (let (file) (dolist (location locations) (setq file (elmo-maildir-message-file-name folder location)) (if (and file (file-writable-p file) (not (file-directory-p file))) (delete-file file)))) t) (luna-define-method elmo-map-message-fetch ((folder elmo-maildir-folder) location _strategy &optional _section unseen) (let ((file (elmo-maildir-message-file-name folder location))) (unless (stringp file) (error "Unable to fetch message %s from maildir folder" location)) (when (file-exists-p file) (insert-file-contents-as-raw-text file) (unless unseen (elmo-map-folder-set-flag folder (list location) 'read)) t))) (luna-define-method elmo-folder-exists-p ((folder elmo-maildir-folder)) (let ((basedir (elmo-maildir-folder-directory-internal folder))) (and (file-directory-p (expand-file-name "new" basedir)) (file-directory-p (expand-file-name "cur" basedir)) (file-directory-p (expand-file-name "tmp" basedir))))) (luna-define-method elmo-folder-diff ((folder elmo-maildir-folder)) (let* ((dir (elmo-maildir-folder-directory-internal folder)) (new-len (length (car (elmo-maildir-list-location dir "new")))) (cur-len (length (car (elmo-maildir-list-location dir "cur"))))) (cons new-len (+ new-len cur-len)))) (luna-define-method elmo-folder-creatable-p ((_folder elmo-maildir-folder)) t) (luna-define-method elmo-folder-writable-p ((_folder elmo-maildir-folder)) t) (luna-define-method elmo-folder-create ((folder elmo-maildir-folder)) (let ((basedir (elmo-maildir-folder-directory-internal folder))) (condition-case nil (progn (dolist (dir '("." "new" "cur" "tmp")) (setq dir (expand-file-name dir basedir)) (or (file-directory-p dir) (progn (elmo-make-directory dir) (set-file-modes dir 448)))) t) (error)))) (luna-define-method elmo-folder-delete ((folder elmo-maildir-folder)) (let ((msgs (and (elmo-folder-exists-p folder) (elmo-folder-list-messages folder)))) (when (yes-or-no-p (format "%sDelete msgdb and substance of \"%s\"? " (if (> (length msgs) 0) (format "%d msg(s) exists. " (length msgs)) "") (elmo-folder-name-internal folder))) (let ((basedir (elmo-maildir-folder-directory-internal folder))) (condition-case nil (let ((tmp-files (directory-files (expand-file-name "tmp" basedir) t "[^.].*"))) ;; Delete files in tmp. (dolist (file tmp-files) (delete-file file)) (dolist (dir '("new" "cur" "tmp" ".")) (setq dir (expand-file-name dir basedir)) (if (not (file-directory-p dir)) (error nil) (elmo-delete-directory dir t)))) (error nil))) (elmo-msgdb-delete-path folder) t))) (luna-define-method elmo-folder-rename-internal ((folder elmo-maildir-folder) new-folder) (let* ((old (elmo-maildir-folder-directory-internal folder)) (new (elmo-maildir-folder-directory-internal new-folder)) (new-dir (directory-file-name (file-name-directory new)))) (unless (file-directory-p old) (error "No such directory: %s" old)) (when (file-exists-p new) (error "Already exists directory: %s" new)) (unless (file-directory-p new-dir) (elmo-make-directory new-dir)) (rename-file old new) t)) (require 'product) (product-provide (provide 'elmo-maildir) (require 'elmo-version)) ;;; elmo-maildir.el ends here wanderlust-wanderlust-769699d/elmo/elmo-map.el000066400000000000000000000251351406661363500214000ustar00rootroot00000000000000;;; elmo-map.el --- A ELMO folder class with message number mapping. -*- lexical-binding: t -*- ;; Copyright (C) 2000 Yuuichi Teranishi ;; Author: Yuuichi Teranishi ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; Folders which do not have unique message numbers but unique message names ;; should inherit this folder. ;;; Code: ;; (require 'elmo) (require 'elmo-msgdb) (eval-and-compile (luna-define-class elmo-location-map () (location-alist location-hash max-number))) (defmacro elmo-location-map-alist (entity) `(luna-slot-value ,entity 'location-alist)) (defmacro elmo-location-map-set-alist (entity value) `(luna-set-slot-value ,entity 'location-alist ,value)) (defmacro elmo-location-map-hash (entity) `(luna-slot-value ,entity 'location-hash)) (defmacro elmo-location-map-set-hash (entity value) `(luna-set-slot-value ,entity 'location-hash ,value)) (defmacro elmo-location-map-max-number (entity) `(luna-slot-value ,entity 'max-number)) (defmacro elmo-location-map-set-max-number (entity value) `(luna-set-slot-value ,entity 'max-number ,value)) (defmacro elmo-location-map-key (number) `(concat "#" (number-to-string ,number))) (defun elmo-location-map-load (location-map directory) (elmo-location-map-setup location-map (elmo-msgdb-location-load directory))) (defun elmo-location-map-save (location-map directory) (elmo-msgdb-location-save directory (elmo-location-map-alist location-map))) (defun elmo-location-map-setup (location-map &optional locations) "Setup internal data of LOCATION-MAP by LOCATIONS. Return a location alist." (let ((hash (elmo-make-hash (length locations))) (max-number 0)) ;; Set number-max and hashtables. (dolist (pair locations) (setq max-number (max max-number (car pair))) (when (cdr pair) (elmo-set-hash-val (cdr pair) pair hash) (elmo-set-hash-val (elmo-location-map-key (car pair)) pair hash))) (let ((inhibit-quit t)) (elmo-location-map-set-max-number location-map max-number) (elmo-location-map-set-hash location-map hash) (elmo-location-map-set-alist location-map locations)))) (defun elmo-location-map-teardown (location-map) (elmo-location-map-set-alist location-map nil) (elmo-location-map-set-hash location-map nil)) (defun elmo-location-map-update (location-map locations) "Update location alist in LOCATION-MAP by LOCATIONS. Return new location alist." (let ((old-hash (elmo-location-map-hash location-map)) (new-hash (elmo-make-hash (length locations))) (number (elmo-location-map-max-number location-map)) new-alist) (setq new-alist (mapcar (lambda (location) (let ((entry (or (elmo-get-hash-val location old-hash) (cons (setq number (1+ number)) location)))) (elmo-set-hash-val (elmo-location-map-key (car entry)) entry new-hash) (elmo-set-hash-val location entry new-hash) entry)) locations)) (let ((inhibit-quit t)) (elmo-location-map-set-max-number location-map number) (elmo-location-map-set-hash location-map new-hash) (elmo-location-map-set-alist location-map new-alist)))) (defun elmo-location-map-remove-numbers (location-map numbers) (let ((alist (elmo-location-map-alist location-map)) (hash (elmo-location-map-hash location-map))) (dolist (number numbers) (let* ((key (elmo-location-map-key number)) (entry (elmo-get-hash-val key hash)) (inhibit-quit t)) (elmo-location-map-set-alist location-map (setq alist (delq entry alist))) (elmo-clear-hash-val key hash) (elmo-clear-hash-val (cdr entry) hash))))) (defun elmo-map-message-number (location-map location) "Return number of the message in the MAPPER with LOCATION." (car (elmo-get-hash-val location (elmo-location-map-hash location-map)))) (defun elmo-map-message-location (location-map number) "Return location of the message in the MAPPER with NUMBER." (cdr (elmo-get-hash-val (elmo-location-map-key number) (elmo-location-map-hash location-map)))) (defun elmo-map-numbers-to-locations (location-map numbers) (let (locations pair) (dolist (number numbers) (if (setq pair (elmo-get-hash-val (elmo-location-map-key number) (elmo-location-map-hash location-map))) (setq locations (cons (cdr pair) locations)))) (nreverse locations))) (defun elmo-map-locations-to-numbers (location-map locations) (let (numbers pair) (dolist (location locations) (if (setq pair (elmo-get-hash-val location (elmo-location-map-hash location-map))) (setq numbers (cons (car pair) numbers)))) (nreverse numbers))) (eval-and-compile (luna-define-class elmo-map-folder (elmo-folder elmo-location-map)) (luna-define-internal-accessors 'elmo-map-folder)) (luna-define-generic elmo-map-folder-list-message-locations (folder) "Return a location list of the FOLDER.") (luna-define-generic elmo-map-folder-set-flag (folder locations flag) "Set FLAG to LOCATIONS.") (luna-define-generic elmo-map-folder-unset-flag (folder locations flag) "Unset FLAG from LOCATIONS.") (luna-define-generic elmo-map-message-fetch (folder location strategy &optional section unseen) "") (luna-define-generic elmo-map-folder-delete-messages (folder locations) "") (luna-define-method elmo-folder-status ((folder elmo-map-folder)) (elmo-folder-open-internal folder) (elmo-folder-set-killed-list-internal folder (elmo-msgdb-killed-list-load (elmo-folder-msgdb-path folder))) (let ((numbers (mapcar 'car (elmo-location-map-alist folder)))) (setq numbers (elmo-living-messages numbers (elmo-folder-killed-list-internal folder))) (prog1 (cons (elmo-max-of-list numbers) (length numbers)) ;; Don't close after status. (unless (elmo-folder-reserve-status-p folder) (elmo-folder-close-internal folder))))) (luna-define-method elmo-folder-pack-numbers ((folder elmo-map-folder)) (let* ((msgdb (elmo-folder-msgdb folder)) (numbers (sort (elmo-folder-list-messages folder nil (not elmo-pack-number-check-strict)) '<)) (new-msgdb (elmo-make-msgdb (elmo-folder-msgdb-path folder))) (number 1) location entity) (elmo-with-progress-display (elmo-folder-pack-numbers (length numbers)) "Packing" (dolist (old-number numbers) (setq entity (elmo-msgdb-message-entity msgdb old-number)) (elmo-message-entity-set-number entity number) (elmo-msgdb-append-entity new-msgdb entity (elmo-msgdb-flags msgdb old-number)) (setq location (cons (cons number (elmo-map-message-location folder old-number)) location)) (elmo-emit-signal 'message-number-changed folder old-number number) (elmo-progress-notify 'elmo-folder-pack-numbers) (setq number (1+ number)))) (elmo-location-map-setup folder (nreverse location)) (elmo-folder-set-msgdb-internal folder new-msgdb)) t) (luna-define-method elmo-folder-open-internal ((folder elmo-map-folder)) (unless (elmo-location-map-alist folder) (elmo-location-map-load folder (elmo-folder-msgdb-path folder))) (when (elmo-folder-plugged-p folder) (elmo-location-map-update folder (elmo-map-folder-list-message-locations folder)))) (luna-define-method elmo-folder-commit :after ((folder elmo-map-folder)) (when (elmo-folder-persistent-p folder) (elmo-location-map-save folder (elmo-folder-msgdb-path folder)))) (luna-define-method elmo-folder-close-internal ((folder elmo-map-folder)) (elmo-location-map-teardown folder)) (luna-define-method elmo-folder-check ((folder elmo-map-folder)) (elmo-location-map-update folder (elmo-map-folder-list-message-locations folder))) (luna-define-method elmo-folder-next-message-number ((folder elmo-map-folder)) (1+ (elmo-location-map-max-number folder))) (luna-define-method elmo-folder-clear :around ((folder elmo-map-folder) &optional keep-killed) (unless keep-killed (elmo-location-map-setup folder)) (luna-call-next-method)) (luna-define-method elmo-folder-list-messages-internal ((folder elmo-map-folder) &optional _nohide) (mapcar 'car (elmo-location-map-alist folder))) (luna-define-method elmo-folder-set-flag :before ((folder elmo-map-folder) numbers flag &optional is-local) (unless is-local (elmo-map-folder-set-flag folder (elmo-map-numbers-to-locations folder numbers) flag))) (luna-define-method elmo-folder-unset-flag :before ((folder elmo-map-folder) numbers flag &optional is-local) (unless is-local (elmo-map-folder-unset-flag folder (elmo-map-numbers-to-locations folder numbers) flag))) (luna-define-method elmo-message-fetch-internal ((folder elmo-map-folder) number strategy &optional section unread) (elmo-map-message-fetch folder (elmo-map-message-location folder number) strategy section unread)) (luna-define-method elmo-folder-list-flagged-internal ((folder elmo-map-folder) flag) (let ((locations (elmo-map-folder-list-flagged folder flag))) (if (listp locations) (elmo-map-locations-to-numbers folder locations) t))) (luna-define-generic elmo-map-folder-list-flagged (folder flag) "Return a list of message location in the FOLDER with FLAG. Return t if the message list is not available.") (luna-define-method elmo-map-folder-list-flagged ((_folder elmo-map-folder) _flag) t) (luna-define-method elmo-folder-delete-messages-internal ((folder elmo-map-folder) numbers) (elmo-map-folder-delete-messages folder (elmo-map-numbers-to-locations folder numbers))) (luna-define-method elmo-folder-detach-messages :around ((folder elmo-map-folder) numbers) (when (luna-call-next-method) (elmo-location-map-remove-numbers folder numbers) t)) ; success (require 'product) (product-provide (provide 'elmo-map) (require 'elmo-version)) ;;; elmo-map.el ends here wanderlust-wanderlust-769699d/elmo/elmo-mime.el000066400000000000000000000414241406661363500215510ustar00rootroot00000000000000;;; elmo-mime.el --- MIME module for ELMO. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Author: Yuuichi Teranishi ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'luna) (require 'mmbuffer) (require 'mmimap) (require 'mime-view) (require 'elmo) ; elmo-folder-do-each-message-entity (require 'elmo-vars) ;; MIME-Entity (eval-and-compile (luna-define-class elmo-mime-entity)) (luna-define-generic elmo-mime-entity-display-p (entity mime-mode) "Return non-nil if ENTITY is able to display with MIME-MODE. MIME-MODE is a symbol which is one of the following: `mime' (Can display each MIME part) `as-is' (Can display raw message)") (luna-define-generic elmo-mime-entity-reassembled-p (entity) "Return non-nil if ENTITY is reassembled message/partial pieces.") (luna-define-generic elmo-mime-entity-display (entity preview-buffer &optional original-major-mode keymap) "Display MIME message ENTITY. PREVIEW-BUFFER is a view buffer. Optional argument ORIGINAL-MAJOR-MODE is major-mode of representation buffer of ENTITY. If it is nil, current `major-mode' is used. If optional argument KEYMAP is specified, use for keymap of representation buffer.") (luna-define-generic elmo-mime-entity-display-as-is (entity preview-buffer &optional original-major-mode keymap) "Display MIME message ENTITY as is. PREVIEW-BUFFER is a view buffer. Optional argument ORIGINAL-MAJOR-MODE is major-mode of representation buffer of ENTITY. If it is nil, current `major-mode' is used. If optional argument KEYMAP is specified, use for keymap of representation buffer.") (luna-define-method elmo-mime-entity-display ((entity elmo-mime-entity) preview-buffer &optional original-major-mode keymap) (let ((elmo-message-displaying t) (default-mime-charset 'x-unknown)) (mime-display-message entity preview-buffer nil keymap original-major-mode))) (defun elmo-mime-entity-fragment-p (entity) (and (not (elmo-mime-entity-reassembled-p entity)) (eq (mime-entity-media-type entity) 'message) (eq (mime-entity-media-subtype entity) 'partial))) (eval-and-compile (luna-define-class mime-elmo-buffer-entity (mime-buffer-entity elmo-mime-entity) (reassembled)) (luna-define-internal-accessors 'mime-elmo-buffer-entity) (luna-define-class mime-elmo-imap-entity (mime-imap-entity elmo-mime-entity))) ;; Provide backend (provide 'mmelmo-imap) (provide 'mmelmo-buffer) (defvar elmo-message-ignored-field-list mime-view-ignored-field-list) (defvar elmo-message-visible-field-list mime-view-visible-field-list) (defvar elmo-message-sorted-field-list nil) (defvar elmo-mime-display-header-analysis t) (defcustom elmo-mime-header-max-column 'fill-column "*Header max column number. Default is `fill-colmn'. If a symbol of variable is specified, use its value in message buffer. If a symbol of function is specified, the function is called and its return value is used." :type '(choice (integer :tag "Column Number") (variable :tag "Variable") (function :tag "Function")) :group 'elmo) (luna-define-method initialize-instance :after ((entity mime-elmo-buffer-entity) &rest _init-args) entity) (luna-define-method initialize-instance :around ((_entity mime-elmo-imap-entity) &rest _init-args) (luna-call-next-method)) ;;; Insert sorted header. (defsubst elmo-mime-insert-header-from-buffer (buffer start end &optional invisible-fields visible-fields sort-fields) (let ((the-buf (current-buffer)) (max-column (cond ((functionp elmo-mime-header-max-column) (funcall elmo-mime-header-max-column)) ((and (symbolp elmo-mime-header-max-column) (boundp elmo-mime-header-max-column)) (symbol-value elmo-mime-header-max-column)) (t elmo-mime-header-max-column))) vf-alist) (with-current-buffer buffer (save-restriction (narrow-to-region start end) (goto-char start) (while (re-search-forward std11-field-head-regexp nil t) (let* ((field-start (match-beginning 0)) (name-end (match-end 0)) (field-name (buffer-substring field-start name-end))) (when (mime-visible-field-p field-name visible-fields invisible-fields) (let* ((field (intern (capitalize (buffer-substring field-start (1- name-end))))) (field-body (buffer-substring name-end (std11-field-end))) (field-decoder (and elmo-mime-display-header-analysis (inline (mime-find-field-decoder field 'wide))))) (setq vf-alist (cons (list field-name field-body field-decoder) vf-alist))))))) (and vf-alist (setq vf-alist (sort vf-alist (lambda (s d) (let ((sf (car s)) (df (car d))) (catch 'done (dolist (re sort-fields) (when (string-match re sf) (throw 'done t)) (when (string-match re df) (throw 'done nil))) t))))))) (set-buffer the-buf) ; verbose. remove me. (save-excursion (while vf-alist (let* ((vf (car vf-alist)) (field-name (nth 0 vf)) (field-body (nth 1 vf)) (field-decoder (nth 2 vf))) (insert field-name) (insert (or (and field-decoder (ignore-errors (funcall field-decoder field-body (string-width field-name) max-column))) ;; Don't decode field-body)) (insert "\n")) (setq vf-alist (cdr vf-alist))) (run-hooks 'mmelmo-header-inserted-hook)))) (luna-define-generic elmo-mime-insert-sorted-header (entity &optional invisible-fields visible-fields sorted-fields) "Insert sorted header fields of the ENTITY.") (luna-define-method elmo-mime-insert-sorted-header ((entity mime-elmo-buffer-entity) &optional invisible-fields visible-fields sorted-fields) (elmo-mime-insert-header-from-buffer (mime-buffer-entity-buffer-internal entity) (mime-buffer-entity-header-start-internal entity) (mime-buffer-entity-header-end-internal entity) invisible-fields visible-fields sorted-fields)) (luna-define-method elmo-mime-insert-sorted-header ((entity mime-elmo-imap-entity) &optional invisible-fields visible-fields sorted-fields) (let ((the-buf (current-buffer)) buf p-min p-max) (with-temp-buffer (insert (mime-imap-entity-header-string entity)) (setq buf (current-buffer) p-min (point-min) p-max (point-max)) (set-buffer the-buf) (elmo-mime-insert-header-from-buffer buf p-min p-max invisible-fields visible-fields sorted-fields)))) (luna-define-method mime-insert-text-content :around ((_entity mime-elmo-buffer-entity)) (luna-call-next-method) (run-hooks 'elmo-message-text-content-inserted-hook)) (luna-define-method mime-insert-text-content :around ((_entity mime-elmo-imap-entity)) (luna-call-next-method) (run-hooks 'elmo-message-text-content-inserted-hook)) (defun elmo-mime-insert-header (entity _situation) (elmo-mime-insert-sorted-header entity elmo-message-ignored-field-list elmo-message-visible-field-list elmo-message-sorted-field-list) (run-hooks 'elmo-message-header-inserted-hook)) ;; mime-elmo-buffer-entity (luna-define-method elmo-mime-entity-display-p ((_entity mime-elmo-buffer-entity) _mime-mode) ;; always return t. t) (luna-define-method elmo-mime-entity-reassembled-p ((entity mime-elmo-buffer-entity)) (mime-elmo-buffer-entity-reassembled-internal entity)) (luna-define-method elmo-mime-entity-display-as-is ((entity mime-elmo-buffer-entity) preview-buffer &optional original-major-mode keymap) (elmo-mime-display-as-is-internal entity preview-buffer nil keymap original-major-mode)) ;; mime-elmo-imap-entity (luna-define-method elmo-mime-entity-display-p ((_entity mime-elmo-imap-entity) mime-mode) (not (eq mime-mode 'as-is))) (luna-define-method elmo-mime-entity-display-as-is ((_entity mime-elmo-imap-entity) _preview-buffer &optional _original-major-mode _keymap) (error "Does not support this method")) (defun elmo-message-mime-entity (folder number rawbuf reassemble &optional ignore-cache unread entire) "Return the mime-entity structure of the message in the FOLDER with NUMBER. RAWBUF is the output buffer for original message. If REASSEMBLE is non-nil and MIME media type of the message is message/partial, the mime-entity is reassembled partial message. If optional argument IGNORE-CACHE is non-nil, existing cache is ignored. If second optional argument UNREAD is non-nil, keep status of the message as unread. If third optional argument ENTIRE is non-nil, fetch entire message at once." (let (id message entity content-type) (or (and reassemble (setq entity (elmo-message-entity folder number)) (setq id (if (setq content-type (elmo-message-entity-field entity 'content-type)) (and (string-match "message/partial" content-type) (mime-content-type-parameter (mime-parse-Content-Type content-type) "id")) (and (setq message (elmo-message-mime-entity-internal folder number rawbuf ignore-cache unread entire)) (eq (mime-entity-media-type message) 'message) (eq (mime-entity-media-subtype message) 'partial) (mime-content-type-parameter (mime-entity-content-type message) "id")))) (elmo-message-reassembled-mime-entity folder id rawbuf (elmo-message-entity-field entity 'subject) ignore-cache unread)) message (elmo-message-mime-entity-internal folder number rawbuf ignore-cache unread entire)))) (defun elmo-message-mime-entity-internal (folder number rawbuf &optional ignore-cache unread entire) (let ((strategy (elmo-find-fetch-strategy folder number ignore-cache entire))) (cond ((null strategy) nil) ((eq (elmo-fetch-strategy-entireness strategy) 'section) (mime-open-entity 'elmo-imap (luna-make-entity 'mime-elmo-imap-location :folder folder :number number :rawbuf rawbuf :strategy strategy))) (t (with-current-buffer rawbuf (let (buffer-read-only) (erase-buffer) (elmo-message-fetch folder number strategy unread))) (mime-open-entity 'elmo-buffer rawbuf))))) (defconst elmo-mime-inherit-field-list-from-enclosed '("^Content-.*:" "^Message-Id:" "^Subject:" "^Encrypted.*:" "^MIME-Version:")) (defsubst elmo-mime-make-reassembled-mime-entity (buffer) (let ((entity (mime-open-entity 'elmo-buffer buffer))) (mime-elmo-buffer-entity-set-reassembled-internal entity t) entity)) (defun elmo-message-reassembled-mime-entity (folder id rawbuf subject &optional ignore-cache unread) (let ((cache (elmo-file-cache-get (concat "<" id ">"))) pieces) (if (and (not ignore-cache) (eq (elmo-file-cache-status cache) 'entire)) ;; use cache (with-current-buffer rawbuf (let (buffer-read-only) (erase-buffer) (elmo-file-cache-load (elmo-file-cache-path cache) nil)) (elmo-mime-make-reassembled-mime-entity rawbuf)) ;; reassemble fragment of the entity (when (setq pieces (elmo-mime-collect-message/partial-pieces folder id (regexp-quote (if (string-match "[0-9\n]+" subject) (substring subject 0 (match-beginning 0)) subject)) ignore-cache unread)) (with-current-buffer rawbuf (let (buffer-read-only (outer-header (car pieces)) (pieces (sort (cdr pieces) #'car-less-than-car))) (erase-buffer) (while pieces (insert (cdr (car pieces))) (setq pieces (cdr pieces))) (let ((case-fold-search t)) (save-restriction (std11-narrow-to-header) (goto-char (point-min)) (while (re-search-forward std11-field-head-regexp nil t) (let ((field-start (match-beginning 0))) (unless (mime-visible-field-p (buffer-substring field-start (match-end 0)) elmo-mime-inherit-field-list-from-enclosed '(".*")) (delete-region field-start (1+ (std11-field-end)))))))) (goto-char (point-min)) (insert outer-header) ;; save cache (elmo-file-cache-save (elmo-file-cache-path cache) nil) (elmo-mime-make-reassembled-mime-entity rawbuf))))))) (defun elmo-mime-collect-message/partial-pieces (folder id subject-regexp &optional ignore-cache unread) (catch 'complete (with-temp-buffer (set-buffer-multibyte nil) (let (total header pieces) (elmo-folder-do-each-message-entity (entity folder) (when (string-match subject-regexp (elmo-message-entity-field entity 'subject)) (erase-buffer) (let* ((message (elmo-message-mime-entity-internal folder (elmo-message-entity-number entity) (current-buffer) ignore-cache unread)) (ct (mime-entity-content-type message)) (the-id (or (mime-content-type-parameter ct "id") "")) number) (when (string= (downcase the-id) (downcase id)) (setq number (string-to-number (mime-content-type-parameter ct "number"))) (setq pieces (cons (cons number (mime-entity-body message)) pieces)) (when (= number 1) (let ((case-fold-search t)) (save-restriction (std11-narrow-to-header) (goto-char (point-min)) (while (re-search-forward std11-field-head-regexp nil t) (let ((field-start (match-beginning 0))) (when (mime-visible-field-p (buffer-substring field-start (match-end 0)) nil elmo-mime-inherit-field-list-from-enclosed) (setq header (concat header (buffer-substring field-start (std11-field-end)) "\n")))))))) (unless total (setq total (ignore-errors (string-to-number (mime-content-type-parameter ct "total"))))) (when (and total (> total 0) (>= (length pieces) total)) (throw 'complete (cons header pieces))))))))) ;; return value nil)) ;; Replacement of mime-display-message. (defun elmo-mime-display-as-is-internal (message &optional preview-buffer mother default-keymap-or-function original-major-mode keymap) (mime-maybe-hide-echo-buffer) (let ((win-conf (current-window-configuration))) (or preview-buffer (setq preview-buffer (concat "*Preview-" (mime-entity-name message) "*"))) (or original-major-mode (setq original-major-mode major-mode)) (let ((inhibit-read-only t)) (set-buffer (get-buffer-create preview-buffer)) (widen) (erase-buffer) (if mother (setq mime-mother-buffer mother)) (setq mime-preview-original-window-configuration win-conf) (setq major-mode 'mime-view-mode) (setq mode-name "MIME-View") ;; Humm... (set-buffer-multibyte nil) (insert (mime-entity-body message)) (set-buffer-multibyte t) (decode-coding-region (point-min) (point-max) elmo-mime-display-as-is-coding-system) (goto-char (point-min)) (insert "\n") (goto-char (point-min)) (let ((method (cdr (assq original-major-mode mime-header-presentation-method-alist)))) (if (functionp method) (funcall method message nil))) ;; set original major mode for mime-preview-quit (put-text-property (point-min) (point-max) 'mime-view-situation `((major-mode . ,original-major-mode))) (put-text-property (point-min) (point-max) 'elmo-as-is-entity message) (use-local-map (or keymap (if default-keymap-or-function (mime-view-define-keymap default-keymap-or-function) mime-view-mode-default-map))) (goto-char (point-min)) (search-forward "\n\n" nil t) (run-hooks 'mime-view-mode-hook) (set-buffer-modified-p nil) (setq buffer-read-only t) preview-buffer))) (require 'product) (product-provide (provide 'elmo-mime) (require 'elmo-version)) ;; elmo-mime.el ends here wanderlust-wanderlust-769699d/elmo/elmo-msgdb.el000066400000000000000000000321561406661363500217200ustar00rootroot00000000000000;;; elmo-msgdb.el --- Message Database for ELMO. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Copyright (C) 2000 Masahiro MURATA ;; Author: Yuuichi Teranishi ;; Masahiro MURATA ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'elmo-vars) (require 'elmo-util) (require 'std11) (require 'mime) (require 'modb) ;;; MSGDB interface. ;; ;; MSGDB elmo-load-msgdb PATH MIME-CHARSET ;; MSGDB elmo-make-msgdb LOCATION TYPE ;; elmo-msgdb-sort-by-date MSGDB ;; elmo-flag-table-load ;; elmo-flag-table-set ;; elmo-flag-table-get ;; elmo-flag-table-save ;; elmo-msgdb-overview-save DIR OBJ ;;; Abolish ;; elmo-msgdb-get-parent-entity ENTITY MSGDB ;; elmo-msgdb-killed-list-load DIR ;; elmo-msgdb-killed-list-save DIR ;; elmo-msgdb-append-to-killed-list FOLDER MSG ;; elmo-msgdb-killed-list-length KILLED-LIST ;; elmo-msgdb-max-of-killed KILLED-LIST ;; elmo-msgdb-killed-message-p KILLED-LIST MSG ;; elmo-living-messages MESSAGES KILLED-LIST ;; elmo-msgdb-finfo-load ;; elmo-msgdb-finfo-save ;; elmo-msgdb-flist-load ;; elmo-msgdb-flist-save ;; elmo-crosspost-alist-load ;; elmo-crosspost-alist-save (defconst elmo-msgdb-load-priorities '(legacy standard) "Priority list of modb type for load.") ;;; Helper functions for MSGDB ;; (defun elmo-load-msgdb (location mime-charset) "Load the MSGDB from PATH." (let ((msgdb (elmo-make-msgdb location elmo-msgdb-default-type mime-charset)) priorities loaded temp-modb) (unless (elmo-msgdb-load msgdb) (setq priorities (delq elmo-msgdb-default-type (copy-sequence elmo-msgdb-load-priorities))) (while (and priorities (not loaded)) (setq temp-modb (elmo-make-msgdb location (car priorities) mime-charset) loaded (elmo-msgdb-load temp-modb) priorities (cdr priorities))) (when loaded (if (eq elmo-msgdb-convert-type 'auto) (elmo-msgdb-append msgdb temp-modb) (setq msgdb temp-modb)))) msgdb)) (defun elmo-make-msgdb (&optional location type mime-charset) "Make a MSGDB." (let* ((type (or type elmo-msgdb-default-type)) (class (intern (format "modb-%s" type)))) (require class) (luna-make-entity class :location location :mime-charset mime-charset))) (defun elmo-msgdb-extra-fields (&optional non-virtual) (if non-virtual (apply #'nconc (mapcar (lambda (extra) (let ((spec (assq (intern extra) modb-entity-field-extractor-alist))) (if spec (let ((real-fields (nth 2 spec))) (cond ((functionp real-fields) (funcall real-fields extra)) ((listp real-fields) (copy-sequence real-fields)))) (list extra)))) elmo-msgdb-extra-fields)) elmo-msgdb-extra-fields)) (defun elmo-msgdb-sort-by-date (msgdb) (elmo-msgdb-sort-entities msgdb (lambda (x y _app-data) (condition-case nil (time-less-p (elmo-message-entity-field x 'date) (elmo-message-entity-field y 'date)) (error))))) (defsubst elmo-msgdb-get-parent-entity (entity msgdb) ;; Set parent-ids to entity. (setq entity (elmo-message-entity-field entity 'references)) ;; In old msgdb, references's field is a string. (when (stringp entity) (setq entity (list entity))) (let (parent) (while entity (setq entity (if (setq parent (elmo-msgdb-message-entity msgdb (car entity))) nil (cdr entity)))) parent)) ;;; (defsubst elmo-msgdb-append-element (list element) (if list ;;; (append list (list element)) (nconc list (list element)) ;; list is nil (list element))) ;; ;; number <-> Message-ID handling ;; (defsubst elmo-msgdb-number-add (alist number id) (let ((ret-val alist)) (setq ret-val (elmo-msgdb-append-element ret-val (cons number id))) ret-val)) ;;; flag table ;; (defvar elmo-flag-table-filename "flag-table") (defun elmo-flag-table-load (dir) "Load flag hashtable for MSGDB." (let ((table (elmo-make-hash)) ;; For backward compatibility (seen-file (expand-file-name elmo-msgdb-seen-filename dir)) value) (when (file-exists-p seen-file) (dolist (msgid (elmo-object-load seen-file)) (elmo-set-hash-val msgid '(read) table)) (delete-file seen-file)) (dolist (pair (elmo-object-load (expand-file-name elmo-flag-table-filename dir))) (setq value (cdr pair)) (elmo-set-hash-val (car pair) (cond ((consp value) value) ;; Following cases for backward compatibility. (value (list value)) (t '(unread))) table)) table)) (defun elmo-flag-table-set (flag-table msg-id flags) (elmo-set-hash-val msg-id (or flags '(read)) flag-table)) (defun elmo-flag-table-get (flag-table msg-id) (let ((flags (elmo-get-hash-val msg-id flag-table))) (append (and (elmo-file-cache-exists-p msg-id) '(cached)) (if flags (elmo-list-delete '(cached read) (copy-sequence flags) #'delq) '(new unread))))) (defun elmo-flag-table-save (dir flag-table) (elmo-object-save (expand-file-name elmo-flag-table-filename dir) (if flag-table (let (list) (mapatoms (lambda (atom) (setq list (cons (cons (symbol-name atom) (symbol-value atom)) list))) flag-table) list)))) ;;; ;; persistent mark handling ;; (for each folder) (defun elmo-msgdb-mark-append (alist id mark) "Append mark." (setq alist (elmo-msgdb-append-element alist (list id mark)))) (defun elmo-msgdb-flag-table (msgdb &optional flag-table) ;; Make a table of msgid flag (read, answered) (let ((flag-table (or flag-table (elmo-make-hash (elmo-msgdb-length msgdb)))) msg-id) (dolist (number (elmo-msgdb-list-messages msgdb)) (when (setq msg-id (elmo-msgdb-message-field msgdb number 'message-id)) (elmo-flag-table-set flag-table msg-id (elmo-msgdb-flags msgdb number)))) flag-table)) (defun elmo-multiple-fields-body-list (field-names &optional boundary) "Return list of each field-bodies of FIELD-NAMES of the message header in current buffer. If BOUNDARY is not nil, it is used as message header separator." (save-excursion (save-restriction (std11-narrow-to-header boundary) (let* ((case-fold-search t) (s-rest field-names) field-name field-body regexp) (while (setq field-name (car s-rest)) (setq regexp (concat "^" field-name ":[ \t]*")) (goto-char (point-min)) (while (re-search-forward regexp nil t) (setq field-body (cons (buffer-substring-no-properties (match-end 0) (std11-field-end)) field-body))) (setq s-rest (cdr s-rest))) (nreverse field-body))))) (defsubst elmo-msgdb-remove-field-string (string) (if (string-match (concat std11-field-head-regexp "[ \t]*") string) (substring string (match-end 0)) string)) (defsubst elmo-msgdb-seen-load (dir) (elmo-object-load (expand-file-name elmo-msgdb-seen-filename dir))) (defsubst elmo-msgdb-out-of-date-messages (msgdb) (dolist (number (elmo-msgdb-list-flagged msgdb 'new)) (elmo-msgdb-unset-flag msgdb number 'new))) ;; ;; deleted message handling ;; (defun elmo-msgdb-killed-list-load (dir) (elmo-object-load (expand-file-name elmo-msgdb-killed-filename dir) nil t)) (defun elmo-msgdb-killed-list-save (dir killed-list) (elmo-object-save (expand-file-name elmo-msgdb-killed-filename dir) killed-list)) (defun elmo-msgdb-killed-message-p (killed-list msg) (elmo-number-set-member msg killed-list)) (defun elmo-msgdb-set-as-killed (killed-list msg) (elmo-number-set-append killed-list msg)) (defun elmo-msgdb-killed-list-length (killed-list) (let ((result (length killed-list))) (dolist (elt killed-list result) (when (consp elt) (setq result (+ result (cdr elt) (- (car elt)))))))) (defun elmo-msgdb-max-of-killed (killed-list) (let ((result 0)) (dolist (elt killed-list result) (setq result (max result (if (consp elt) (cdr elt) elt)))))) (defun elmo-living-messages (messages killed-list) (if killed-list (delq nil (mapcar (lambda (number) (unless (elmo-number-set-member number killed-list) number)) messages)) messages)) (defun elmo-msgdb-finfo-load () (elmo-object-load (expand-file-name elmo-msgdb-finfo-filename elmo-msgdb-directory) elmo-mime-charset t)) (defun elmo-msgdb-finfo-save (finfo) (elmo-object-save (expand-file-name elmo-msgdb-finfo-filename elmo-msgdb-directory) finfo elmo-mime-charset)) (defun elmo-msgdb-flist-load (fname) (let ((flist-file (expand-file-name elmo-msgdb-flist-filename (expand-file-name (elmo-safe-filename fname) (expand-file-name "folder" elmo-msgdb-directory))))) (elmo-object-load flist-file elmo-mime-charset t))) (defun elmo-msgdb-flist-save (fname flist) (let ((flist-file (expand-file-name elmo-msgdb-flist-filename (expand-file-name (elmo-safe-filename fname) (expand-file-name "folder" elmo-msgdb-directory))))) (elmo-object-save flist-file flist elmo-mime-charset))) (defun elmo-crosspost-alist-load () (elmo-object-load (expand-file-name elmo-crosspost-alist-filename elmo-msgdb-directory) nil t)) (defun elmo-crosspost-alist-save (alist) (elmo-object-save (expand-file-name elmo-crosspost-alist-filename elmo-msgdb-directory) alist)) (defsubst elmo-msgdb-location-load (dir) (let ((result (elmo-object-load (expand-file-name elmo-msgdb-location-filename dir)))) ;; The leading elements may be a list contains only max-number. (when result (while (null (cdar result)) (setq result (cdr result)))) result)) (defsubst elmo-msgdb-location-add (alist number location) (let ((ret-val alist)) (setq ret-val (elmo-msgdb-append-element ret-val (cons number location))) ret-val)) (defsubst elmo-msgdb-location-save (dir alist) (elmo-object-save (expand-file-name elmo-msgdb-location-filename dir) alist)) ;;; For backward compatibility. (defsubst elmo-msgdb-overview-entity-get-number (entity) (elmo-message-entity-number entity)) (defsubst elmo-msgdb-overview-entity-set-number (entity number) (elmo-message-entity-set-number entity number)) (defsubst elmo-msgdb-overview-entity-get-references (entity) (elmo-message-entity-field entity 'references)) (defsubst elmo-msgdb-overview-entity-set-references (entity references) (elmo-message-entity-set-field entity 'references references)) (defsubst elmo-msgdb-overview-entity-get-from-no-decode (entity) (mime-charset-encode-string (elmo-message-entity-field entity 'from) elmo-mime-charset)) (defsubst elmo-msgdb-overview-entity-get-from (entity) (elmo-message-entity-field entity 'from)) (defsubst elmo-msgdb-overview-entity-set-from (entity from) (elmo-message-entity-set-field entity 'from from)) (defsubst elmo-msgdb-overview-entity-get-subject (entity) (elmo-message-entity-field entity 'subject)) (defsubst elmo-msgdb-overview-entity-get-subject-no-decode (entity) (mime-charset-encode-string (elmo-message-entity-field entity 'subject) elmo-mime-charset)) (defsubst elmo-msgdb-overview-entity-set-subject (entity subject) (elmo-message-entity-set-field entity 'subject subject)) (defsubst elmo-msgdb-overview-entity-get-date (entity) (elmo-message-entity-field entity 'date 'string)) (defsubst elmo-msgdb-overview-entity-set-date (entity date) (elmo-message-entity-set-field entity 'date date)) (defsubst elmo-msgdb-overview-entity-get-to (entity) (elmo-message-entity-field entity 'to 'string)) (defsubst elmo-msgdb-overview-entity-get-cc (entity) (elmo-message-entity-field entity 'cc 'string)) (defsubst elmo-msgdb-overview-entity-get-size (entity) (elmo-message-entity-field entity 'size)) (defsubst elmo-msgdb-overview-entity-set-size (entity size) (elmo-message-entity-set-field entity 'size size)) (defsubst elmo-msgdb-overview-entity-get-extra (_entity) ;; Truely obsolete. ) (defsubst elmo-msgdb-overview-entity-set-extra (_entity _extra) ;; Truely obsolete. ) (defsubst elmo-msgdb-overview-entity-get-extra-field (entity field-name) (elmo-message-entity-field entity (intern field-name))) (defsubst elmo-msgdb-overview-entity-set-extra-field (entity field-name value) (elmo-message-entity-set-field entity (intern field-name) value)) (require 'product) (product-provide (provide 'elmo-msgdb) (require 'elmo-version)) ;;; elmo-msgdb.el ends here wanderlust-wanderlust-769699d/elmo/elmo-multi.el000066400000000000000000000460461406661363500217610ustar00rootroot00000000000000;;; elmo-multi.el --- Multiple Folder Interface for ELMO. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Author: Yuuichi Teranishi ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'elmo) (require 'elmo-signal) (require 'luna) (defvar elmo-multi-divide-number 100000 "*Multi divider number.") (defvar elmo-multi-max-number 1) ;;; ELMO Multi folder (eval-and-compile (luna-define-class elmo-multi-folder (elmo-folder) (children divide-number)) (luna-define-internal-accessors 'elmo-multi-folder)) (defmacro elmo-multi-real-folder-number (folder number) "Returns a cons cell of real FOLDER and NUMBER." `(cons (nth (1- (/ ,number (elmo-multi-folder-divide-number-internal ,folder))) (elmo-multi-folder-children-internal ,folder)) (% ,number (elmo-multi-folder-divide-number-internal ,folder)))) (defmacro elmo-multi-check-divide-number (max) `(when (and (>= ,max elmo-multi-divide-number) (> ,max elmo-multi-max-number)) (elmo-warning "`elmo-multi-number' is too small. It must be larger than %d" ,max) (setq elmo-multi-max-number ,max))) (luna-define-method elmo-folder-initialize ((folder elmo-multi-folder) name) (while (> (length (car (setq name (elmo-parse-token name "," nil t)))) 0) (elmo-multi-folder-set-children-internal folder (nconc (elmo-multi-folder-children-internal folder) (list (elmo-get-folder (car name))))) (setq name (cdr name)) (when (and (> (length name) 0) (eq (aref name 0) ?,)) (setq name (substring name 1)))) (elmo-multi-folder-set-divide-number-internal folder elmo-multi-divide-number) (elmo-multi-connect-signals folder) folder) (defun elmo-multi-connect-signals (folder) (elmo-connect-signal nil 'flag-changing folder (elmo-define-signal-handler (folder child number old-flags new-flags) (elmo-emit-signal 'flag-changing folder (car (elmo-multi-map-numbers folder child (list number))) old-flags new-flags)) (elmo-define-signal-filter (folder sender) (memq sender (elmo-multi-folder-children-internal folder)))) (elmo-connect-signal nil 'flag-changed folder (elmo-define-signal-handler (folder child numbers) (elmo-emit-signal 'flag-changed folder (elmo-multi-map-numbers folder child numbers))) (elmo-define-signal-filter (folder sender) (memq sender (elmo-multi-folder-children-internal folder)))) (elmo-connect-signal nil 'status-changed folder (elmo-define-signal-handler (folder child numbers) (elmo-emit-signal 'status-changed folder (elmo-multi-map-numbers folder child numbers))) (elmo-define-signal-filter (folder sender) (memq sender (elmo-multi-folder-children-internal folder)))) (elmo-connect-signal nil 'update-overview folder (elmo-define-signal-handler (folder child number) (elmo-emit-signal 'update-overview folder (car (elmo-multi-map-numbers folder child (list number))))) (elmo-define-signal-filter (folder sender) (memq sender (elmo-multi-folder-children-internal folder))))) (defun elmo-multi-map-numbers (folder child numbers) (let ((children (elmo-multi-folder-children-internal folder)) hit offset) (when (setq hit (memq child children)) (setq offset (* (elmo-multi-folder-divide-number-internal folder) (- (length children) (length hit) -1))) (mapcar (lambda (number) (+ offset number)) numbers)))) (luna-define-method elmo-folder-open-internal ((folder elmo-multi-folder)) (dolist (fld (elmo-multi-folder-children-internal folder)) (elmo-folder-open-internal fld))) (luna-define-method elmo-folder-check ((folder elmo-multi-folder)) (dolist (fld (elmo-multi-folder-children-internal folder)) (elmo-folder-check fld))) (luna-define-method elmo-folder-close-internal ((folder elmo-multi-folder)) (dolist (fld (elmo-multi-folder-children-internal folder)) (elmo-folder-close-internal fld))) (luna-define-method elmo-folder-close ((folder elmo-multi-folder)) (elmo-generic-folder-close folder) (dolist (fld (elmo-multi-folder-children-internal folder)) (elmo-folder-close fld))) (luna-define-method elmo-message-killed-p ((folder elmo-multi-folder) number) (let ((pair (elmo-multi-real-folder-number folder number))) (elmo-message-killed-p (car pair) (cdr pair)))) (luna-define-method elmo-folder-synchronize ((folder elmo-multi-folder) &optional disable-killed ignore-msgdb no-check mask) (if mask (dolist (element (elmo-multi-split-numbers folder mask)) (when (cdr element) (elmo-folder-synchronize (car element) disable-killed ignore-msgdb no-check (cdr element)))) (dolist (fld (elmo-multi-folder-children-internal folder)) (elmo-folder-synchronize fld disable-killed ignore-msgdb no-check))) 0) (luna-define-method elmo-folder-expand-msgdb-path ((folder elmo-multi-folder)) (expand-file-name (elmo-replace-string-as-filename (elmo-folder-name-internal folder)) (expand-file-name "multi" elmo-msgdb-directory))) (luna-define-method elmo-folder-newsgroups ((folder elmo-multi-folder)) (apply #'nconc (mapcar 'elmo-folder-newsgroups (elmo-multi-folder-children-internal folder)))) (luna-define-method elmo-folder-get-primitive-list ((folder elmo-multi-folder)) (elmo-flatten (mapcar 'elmo-folder-get-primitive-list (elmo-multi-folder-children-internal folder)))) (luna-define-method elmo-folder-contains-type ((folder elmo-multi-folder) type) (let ((children (elmo-multi-folder-children-internal folder)) match) (while children (when (elmo-folder-contains-type (car children) type) (setq match t) (setq children nil)) (setq children (cdr children))) match)) (luna-define-method elmo-message-folder ((folder elmo-multi-folder) number) (nth (- (/ number (elmo-multi-folder-divide-number-internal folder)) 1) (elmo-multi-folder-children-internal folder))) (luna-define-method elmo-message-cached-p ((folder elmo-multi-folder) number) (let ((pair (elmo-multi-real-folder-number folder number))) (elmo-message-cached-p (car pair) (cdr pair)))) (luna-define-method elmo-message-set-cached ((folder elmo-multi-folder) number cached) (let ((pair (elmo-multi-real-folder-number folder number))) (elmo-message-set-cached (car pair) (cdr pair) cached))) (luna-define-method elmo-find-fetch-strategy ((folder elmo-multi-folder) number &optional ignore-cache require-entireness) (let ((pair (elmo-multi-real-folder-number folder number))) (elmo-find-fetch-strategy (car pair) (cdr pair) ignore-cache require-entireness))) (luna-define-method elmo-message-number ((folder elmo-multi-folder) message-id) (let ((children (elmo-multi-folder-children-internal folder)) match) (while children (when (setq match (elmo-message-number (car children) message-id)) (setq children nil)) (setq children (cdr children))) match)) (luna-define-method elmo-message-entity ((folder elmo-multi-folder) key) (cond ((numberp key) (let* ((pair (elmo-multi-real-folder-number folder key)) (entity (elmo-message-entity (car pair) (cdr pair)))) (when entity (setq entity (elmo-message-copy-entity entity)) (elmo-message-entity-set-number entity key) entity))) ((stringp key) (let ((children (elmo-multi-folder-children-internal folder)) (cur-number 0) match) (while children (setq cur-number (+ cur-number 1)) (when (setq match (elmo-message-entity (car children) key)) (setq match (elmo-message-copy-entity match)) (elmo-message-entity-set-number match (+ (* (elmo-multi-folder-divide-number-internal folder) cur-number) (elmo-message-entity-number match))) (setq children nil)) (setq children (cdr children))) match)))) (luna-define-method elmo-message-entity-parent ((folder elmo-multi-folder) entity) (let ((references (elmo-message-entity-field entity 'references)) parent) ;; In old msgdb, references's field is a string. (when (stringp references) (setq references (list references))) (while references (setq references (if (setq parent (elmo-message-entity folder (car references))) nil (cdr references)))) parent)) (luna-define-method elmo-message-field ((folder elmo-multi-folder) number field &optional type) (let ((pair (elmo-multi-real-folder-number folder number))) (elmo-message-field (car pair) (cdr pair) field type))) (luna-define-method elmo-message-flag-available-p ((folder elmo-multi-folder) number flag) (let ((pair (elmo-multi-real-folder-number folder number))) (elmo-message-flag-available-p (car pair) (cdr pair) flag))) (luna-define-method elmo-message-flags ((folder elmo-multi-folder) number) (let ((pair (elmo-multi-real-folder-number folder number))) (elmo-message-flags (car pair) (cdr pair)))) (defun elmo-multi-split-numbers (folder numlist &optional as-is) (let ((numbers (sort numlist '<)) (folders (elmo-multi-folder-children-internal folder)) (divider (elmo-multi-folder-divide-number-internal folder)) (cur-number 0) (offset 0) one-list numbers-list limit) (while numbers (setq one-list (list (car folders)) cur-number (1+ cur-number) offset (+ offset divider) limit (+ offset divider)) (while (and numbers (> limit (car numbers))) (setq one-list (cons (if as-is (car numbers) (- (car numbers) offset)) one-list) numbers (cdr numbers))) (setq folders (cdr folders) numbers-list (cons (nreverse one-list) numbers-list))) (nreverse numbers-list))) (luna-define-method elmo-folder-process-crosspost ((folder elmo-multi-folder)) (dolist (child (elmo-multi-folder-children-internal folder)) (elmo-folder-process-crosspost child))) (luna-define-method elmo-message-fetch ((folder elmo-multi-folder) number strategy &optional unseen section) (let ((pair (elmo-multi-real-folder-number folder number))) (elmo-message-fetch (car pair) (cdr pair) strategy unseen section))) (luna-define-method elmo-folder-delete-messages ((folder elmo-multi-folder) numbers) (dolist (element (elmo-multi-split-numbers folder numbers)) (when (cdr element) (elmo-folder-delete-messages (car element) (cdr element)))) t) (luna-define-method elmo-folder-detach-messages ((folder elmo-multi-folder) numbers) (dolist (element (elmo-multi-split-numbers folder numbers)) (when (cdr element) (elmo-folder-detach-messages (car element) (cdr element)))) t) (luna-define-method elmo-folder-diff ((folder elmo-multi-folder)) (elmo-multi-folder-diff folder)) (defun elmo-multi-folder-diff (folder) (let ((news 0) (unreads 0) (alls 0) diff value) (dolist (child (elmo-multi-folder-children-internal folder)) (setq diff (elmo-folder-diff child)) (setq news (and news (setq value (elmo-diff-new diff)) (+ news value)) unreads (and unreads (setq value (elmo-diff-unread diff)) (+ unreads value)) alls (and alls (setq value (elmo-diff-all diff)) (+ alls value)))) (if unreads (list news unreads alls) (cons news alls)))) (luna-define-method elmo-folder-list-messages ((folder elmo-multi-folder) &optional visible-only in-msgdb) (let* ((flds (elmo-multi-folder-children-internal folder)) (cur-number 0) (max 0) list numbers base) (while flds (setq cur-number (+ cur-number 1) list (elmo-folder-list-messages (car flds) visible-only in-msgdb) max (apply 'max max list) base (* (elmo-multi-folder-divide-number-internal folder) cur-number) numbers (nconc numbers (mapcar (lambda (x) (+ base x)) list)) flds (cdr flds))) (elmo-multi-check-divide-number max) numbers)) (luna-define-method elmo-folder-exists-p ((folder elmo-multi-folder)) (let ((flds (elmo-multi-folder-children-internal folder))) (catch 'exists (while flds (unless (elmo-folder-exists-p (car flds)) (throw 'exists nil)) (setq flds (cdr flds))) t))) (luna-define-method elmo-folder-creatable-p ((folder elmo-multi-folder)) (let ((flds (elmo-multi-folder-children-internal folder))) (catch 'creatable (while flds (when (and (elmo-folder-creatable-p (car flds)) (not (elmo-folder-exists-p (car flds)))) ;; If folder already exists, don't to `creatable'. ;; Because this function is called, when folder doesn't exists. (throw 'creatable t)) (setq flds (cdr flds))) nil))) (luna-define-method elmo-folder-create ((folder elmo-multi-folder)) (let ((flds (elmo-multi-folder-children-internal folder))) (catch 'create (while flds (unless (or (elmo-folder-exists-p (car flds)) (elmo-folder-create (car flds))) (throw 'create nil)) (setq flds (cdr flds))) t))) (luna-define-method elmo-folder-search ((folder elmo-multi-folder) condition &optional numbers) (apply 'nconc (delq nil (if (and numbers (listp numbers)) (mapcar (lambda (element) (when (cdr element) (elmo-multi-map-numbers folder (car element) (elmo-folder-search (car element) condition (cdr element))))) (elmo-multi-split-numbers folder numbers)) (mapcar (lambda (child) (elmo-multi-map-numbers folder child (elmo-folder-search child condition numbers))) (elmo-multi-folder-children-internal folder)))))) (luna-define-method elmo-message-use-cache-p ((folder elmo-multi-folder) number) (let ((pair (elmo-multi-real-folder-number folder number))) (elmo-message-use-cache-p (car pair) (cdr pair)))) (luna-define-method elmo-message-file-p ((folder elmo-multi-folder) number) (let ((pair (elmo-multi-real-folder-number folder number))) (elmo-message-file-p (car pair) (cdr pair)))) (luna-define-method elmo-message-file-name ((folder elmo-multi-folder) number) (let ((pair (elmo-multi-real-folder-number folder number))) (elmo-message-file-name (car pair) (cdr pair)))) (luna-define-method elmo-folder-plugged-p ((folder elmo-multi-folder)) (let ((flds (elmo-multi-folder-children-internal folder))) (catch 'plugged (while flds (unless (elmo-folder-plugged-p (car flds)) (throw 'plugged nil)) (setq flds (cdr flds))) t))) (luna-define-method elmo-folder-set-plugged ((folder elmo-multi-folder) plugged add) (let ((flds (elmo-multi-folder-children-internal folder))) (dolist (fld flds) (elmo-folder-set-plugged fld plugged add)))) (defun elmo-multi-folder-numbers-list-assoc (folder folder-numbers) (let (ent) (while folder-numbers (when (string= (elmo-folder-name-internal (car (car folder-numbers))) (elmo-folder-name-internal folder)) (setq ent (car folder-numbers) folder-numbers nil)) (setq folder-numbers (cdr folder-numbers))) ent)) (defun elmo-multi-make-folder-numbers-list (folder msgs) (let ((msg-list msgs) pair fld-list ret-val) (while msg-list (when (and (numberp (car msg-list)) (> (car msg-list) 0)) (setq pair (elmo-multi-real-folder-number folder (car msg-list))) (if (setq fld-list (elmo-multi-folder-numbers-list-assoc (car pair) ret-val)) (setcdr fld-list (cons (cdr pair) (cdr fld-list))) (setq ret-val (cons (cons (car pair) (list (cdr pair))) ret-val)))) (setq msg-list (cdr msg-list))) ret-val)) (luna-define-method elmo-folder-set-flag ((folder elmo-multi-folder) numbers flag &optional is-local) (dolist (pair (elmo-multi-make-folder-numbers-list folder numbers)) (elmo-folder-set-flag (car pair) (cdr pair) flag is-local))) (luna-define-method elmo-folder-unset-flag ((folder elmo-multi-folder) numbers flag &optional is-local) (dolist (pair (elmo-multi-make-folder-numbers-list folder numbers)) (ignore-errors (elmo-folder-unset-flag (car pair) (cdr pair) flag is-local)))) (luna-define-method elmo-folder-list-flagged ((folder elmo-multi-folder) flag &optional in-msgdb) (let ((cur-number 0) (max 0) base numbers list) (dolist (child (elmo-multi-folder-children-internal folder)) (setq list (elmo-folder-list-flagged child flag in-msgdb) max (apply 'max max list) cur-number (1+ cur-number) base (* (elmo-multi-folder-divide-number-internal folder) cur-number) numbers (nconc numbers (mapcar (lambda (x) (+ base x)) list)))) (elmo-multi-check-divide-number max) numbers)) (luna-define-method elmo-folder-commit ((folder elmo-multi-folder)) (dolist (child (elmo-multi-folder-children-internal folder)) (elmo-folder-commit child))) (luna-define-method elmo-folder-length ((folder elmo-multi-folder)) (apply '+ (mapcar 'elmo-folder-length (elmo-multi-folder-children-internal folder)))) (luna-define-method elmo-folder-count-flags ((folder elmo-multi-folder)) (let (flag-alist element) (dolist (child (elmo-multi-folder-children-internal folder)) (dolist (pair (elmo-folder-count-flags child)) (if (setq element (assq (car pair) flag-alist)) (setcdr element (+ (cdr element) (cdr pair))) (setq flag-alist (cons pair flag-alist))))) flag-alist)) (luna-define-method elmo-folder-recover-messages ((folder elmo-multi-folder) numbers) (dolist (element (elmo-multi-split-numbers folder numbers)) (when (cdr element) (elmo-folder-recover-messages (car element) (cdr element))))) (defun elmo-folder-append-messages-multi-* (dst-folder src-folder numbers same-number) (if same-number (elmo-folder-append-messages dst-folder src-folder numbers same-number 'elmo-folder-append-messages-multi-*) (let ((divider (elmo-multi-folder-divide-number-internal src-folder)) (cur-number 0) (offset 0) succeeds) (dolist (element (elmo-multi-split-numbers src-folder numbers)) (setq cur-number (1+ cur-number) offset (+ offset divider)) (when (cdr element) (setq succeeds (cons (mapcar (lambda (x) (+ offset x)) (elmo-folder-append-messages dst-folder (car element) (cdr element))) succeeds)))) (apply 'nconc succeeds)))) (require 'product) (product-provide (provide 'elmo-multi) (require 'elmo-version)) ;;; elmo-multi.el ends here wanderlust-wanderlust-769699d/elmo/elmo-net.el000066400000000000000000000520461406661363500214120ustar00rootroot00000000000000;;; elmo-net.el --- Network module for ELMO. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Author: Yuuichi Teranishi ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'elmo-util) (require 'elmo-dop) (require 'elmo-vars) (require 'elmo-cache) (require 'elmo) (defconst elmo-net-folder-name-syntax '((?@ [server ".+"]) (?: [port "^[0-9]+$"]) (?! stream-type))) ;;; ELMO net folder (eval-and-compile (luna-define-class elmo-net-folder (elmo-folder) (user auth server port stream-type)) (luna-define-internal-accessors 'elmo-net-folder)) ;;; Session (eval-and-compile (autoload 'socks-open-network-stream "socks") (autoload 'gnutls-negotiate "gnutls") (autoload 'starttls-negotiate "starttls") (autoload 'sasl-find-mechanism "sasl") (autoload 'sasl-make-client "sasl") (autoload 'sasl-mechanism-name "sasl") (autoload 'sasl-next-step "sasl") (autoload 'sasl-step-data "sasl") (autoload 'sasl-step-set-data "sasl")) (defvar sasl-mechanisms) (defcustom elmo-network-session-idle-timeout nil "Idle timeout of the network cache. Specified in seconds. If elapsed time since last access is larger than this value, cached session is not reused. If nil, network cache is reused." :type '(choice number (const nil)) :group 'elmo) (defcustom elmo-network-session-retry-count nil "Retry count for authentication when open network session. If nil, just once. If t, until success." :type '(choice (integer :tag "Times") (const :tag "Just once" nil) (const :tag "Until success" t)) :group 'elmo) ;;; Code: ;; (eval-and-compile (luna-define-class elmo-network-session () (name server port user auth stream-type process greeting last-accessed)) (luna-define-internal-accessors 'elmo-network-session)) (luna-define-generic elmo-network-initialize-session (session) "Initialize SESSION (Called before authentication).") (luna-define-generic elmo-network-initialize-session-buffer (session buffer) "Initialize SESSION's BUFFER.") (luna-define-generic elmo-network-authenticate-session (session) "Authenticate SESSION.") (luna-define-generic elmo-network-setup-session (session) "Setup SESSION. (Called after authentication).") (luna-define-generic elmo-network-close-session (session) "Close SESSION.") (luna-define-method elmo-network-initialize-session-buffer ((_session elmo-network-session) buffer) (with-current-buffer buffer (set-buffer-multibyte nil) (buffer-disable-undo (current-buffer)))) (luna-define-method elmo-network-close-session ((session elmo-network-session)) (when (elmo-network-session-process-internal session) ;;; (memq (process-status (elmo-network-session-process-internal session)) ;;; '(open run)) (kill-buffer (process-buffer (elmo-network-session-process-internal session))) (delete-process (elmo-network-session-process-internal session)))) (defmacro elmo-network-stream-type-spec-string (stream-type) `(nth 0 ,stream-type)) (defmacro elmo-network-stream-type-symbol (stream-type) `(nth 1 ,stream-type)) (defmacro elmo-network-stream-type-feature (stream-type) `(nth 2 ,stream-type)) (defmacro elmo-network-stream-type-function (stream-type) `(nth 3 ,stream-type)) (defsubst elmo-network-session-password-key (session) (list (upcase (nth 1 (split-string (symbol-name (luna-class-name session)) "[4-]"))) (elmo-network-session-user-internal session) (elmo-network-session-auth-internal session) (elmo-network-session-server-internal session) (elmo-network-session-port-internal session))) (defvar elmo-network-session-cache nil) (defsubst elmo-network-session-cache-key (name folder) "Returns session cache key for NAME and FOLDER." (format "%s:%s/%s@%s:%d%s" name (elmo-net-folder-user-internal folder) (elmo-net-folder-auth-internal folder) (elmo-net-folder-server-internal folder) (elmo-net-folder-port-internal folder) (or (elmo-network-stream-type-spec-string (elmo-net-folder-stream-type-internal folder)) ""))) (defun elmo-network-clear-session-cache () "Clear session cache." (interactive) (dolist (pair elmo-network-session-cache) (elmo-network-close-session (cdr pair))) (setq elmo-network-session-cache nil)) (defsubst elmo-network-session-buffer-name (session) (format " *%s session for %s@%s:%d%s" (elmo-network-session-name-internal session) (elmo-network-session-user-internal session) (elmo-network-session-server-internal session) (elmo-network-session-port-internal session) (or (elmo-network-stream-type-spec-string (elmo-network-session-stream-type-internal session)) ""))) (defmacro elmo-network-session-buffer (session) "Get buffer for SESSION." `(process-buffer (elmo-network-session-process-internal ,session))) (defun elmo-network-get-session (class name folder &optional if-exists) "Get network session from session cache or a new network session. CLASS is the class name of the session. NAME is the name of the process. FOLDER is the ELMO folder structure. Returns a `elmo-network-session' instance. If optional argument IF-EXISTS is non-nil, it does not return session if there is no session cache. if making session failed, returns nil." (let (pair session key) (if (not (elmo-plugged-p (elmo-net-folder-server-internal folder) (elmo-net-folder-port-internal folder) (elmo-network-stream-type-symbol (elmo-net-folder-stream-type-internal folder)))) (error "Unplugged")) (setq pair (assoc (setq key (elmo-network-session-cache-key name folder)) elmo-network-session-cache)) (when (and pair (or (not (memq (process-status (elmo-network-session-process-internal (cdr pair))) '(open run))) (and elmo-network-session-idle-timeout (elmo-network-session-last-accessed-internal (cdr pair)) (elmo-time-expire (elmo-network-session-last-accessed-internal (cdr pair)) elmo-network-session-idle-timeout)))) (setq elmo-network-session-cache (delq pair elmo-network-session-cache)) (elmo-network-close-session (cdr pair)) (setq pair nil)) (if pair (progn (elmo-network-session-set-last-accessed-internal (cdr pair) (current-time)) (cdr pair)) ; connection cache exists. (unless if-exists (setq session (elmo-network-open-session class name (elmo-net-folder-server-internal folder) (elmo-net-folder-port-internal folder) (elmo-net-folder-user-internal folder) (elmo-net-folder-auth-internal folder) (elmo-net-folder-stream-type-internal folder))) (setq elmo-network-session-cache (cons (cons key session) elmo-network-session-cache)) session)))) (defun elmo-network-session-buffer-create (session) (let ((buffer-name (elmo-network-session-buffer-name session)) buffer) (when (get-buffer buffer-name) (kill-buffer buffer-name)) (setq buffer (get-buffer-create buffer-name)) (elmo-network-initialize-session-buffer session buffer) buffer)) (defun elmo-network-session-starttls-negotiate (session) (let ((process (elmo-network-session-process-internal session))) (if (memq (process-status process) '(run stop exit signal)) (starttls-negotiate process) (gnutls-negotiate :process process :hostname (elmo-network-session-server-internal session))))) (defun elmo-network-open-session (class name server port user auth stream-type) "Open an authenticated network session. CLASS is the class name of the session. NAME is the name of the process. SERVER is the name of the server server. PORT is the port number of the service. USER is the user-id for the authenticate. AUTH is the authenticate method name (symbol). STREAM-TYPE is the stream type (See also `elmo-network-stream-type-alist'). Returns a process object. if making session failed, returns nil." (let ((session (luna-make-entity class :name name :server server :port port :user user :auth auth :stream-type stream-type :process nil :greeting nil :last-accessed (current-time))) (retry elmo-network-session-retry-count) success) (while (not success) (condition-case error (when (elmo-network-session-set-process-internal session (elmo-open-network-stream (elmo-network-session-name-internal session) (elmo-network-session-buffer-create session) server port stream-type)) (elmo-network-initialize-session session) (elmo-network-authenticate-session session) (elmo-network-setup-session session) (setq success t)) (elmo-authenticate-error (elmo-remove-passwd (elmo-network-session-password-key session)) (message "Authetication is failed") (sit-for 1) (elmo-network-close-session session) (unless (if (numberp retry) (> (setq retry (1- retry)) 0) retry) (signal (car error) (cdr error)))) (elmo-open-error (elmo-set-plugged nil server port (elmo-network-stream-type-symbol stream-type) (current-time)) (message "Auto plugged off at %s:%d :%s" server port (cadr error)) (sit-for 1) (elmo-network-close-session session) (signal (car error) (cdr error))) (error (elmo-network-close-session session) (signal (car error) (cdr error))))) session)) (when elmo-network-use-gnutls (defun elmo-open-socks-ssl-stream (name buffer host service) (gnutls-negotiate :process (socks-open-network-stream name buffer host service) :hostname host)) (defun elmo-open-gnutls-stream (name buffer host service) (open-network-stream name buffer host service :type 'ssl))) (defun elmo-open-network-stream (name buffer server service stream-type) (let ((auto-plugged (and elmo-auto-change-plugged (> elmo-auto-change-plugged 0))) process) (if (and stream-type (elmo-network-stream-type-feature stream-type)) (require (elmo-network-stream-type-feature stream-type))) (condition-case err (let (process-connection-type) (as-binary-process (setq process (if stream-type (funcall (elmo-network-stream-type-function stream-type) name buffer server service) (open-network-stream name buffer server service))) (unless (and (processp process) (memq (process-status process) '(open run))) (error "Open network connection to %s:%d failed" server service)))) (error (when auto-plugged (elmo-set-plugged nil server service (elmo-network-stream-type-symbol stream-type) (current-time)) (message "Auto plugged off at %s:%d" server service) (sit-for 1)) (signal (car err) (cdr err)))) (when process (set-process-query-on-exit-flag process nil) (when auto-plugged (elmo-set-plugged t server service (elmo-network-stream-type-symbol stream-type))) process))) (defun elmo-get-network-stream-type (symbol) "Return network stream type corresponding to SYMBOL. Returned value is searched from `elmo-network-stream-type-alist'." (let ((alist elmo-network-stream-type-alist) spec) (while alist (when (eq (nth 1 (car alist)) symbol) (setq spec (car alist)) (setq alist nil)) (setq alist (cdr alist))) spec)) (defun elmo-net-folder-set-parameters (folder params &optional defaults) (let ((port (cdr (assq 'port params))) (stream-type (cdr (assq 'stream-type params)))) ;; server (elmo-net-folder-set-server-internal folder (or (cdr (assq 'server params)) (plist-get defaults :server))) ;; port (elmo-net-folder-set-port-internal folder (or (and port (string-to-number port)) (plist-get defaults :port))) ;; stream-type (elmo-net-folder-set-stream-type-internal folder (or (and stream-type (assoc (concat "!" stream-type) elmo-network-stream-type-alist)) (plist-get defaults :stream-type))))) (luna-define-method elmo-folder-initialize ((folder elmo-net-folder) name) ;; user and auth should be set in subclass. (when (string-match "\\(@[^@:/!]+\\)?\\(:[0-9]+\\)?\\(!.*\\)?$" name) (elmo-net-folder-set-parameters folder (car (elmo-parse-separated-tokens (substring name (match-beginning 0)) elmo-net-folder-name-syntax)))) folder) (luna-define-method elmo-net-port-info ((folder elmo-net-folder)) (list (elmo-net-folder-server-internal folder) (elmo-net-folder-port-internal folder) (elmo-network-stream-type-symbol (elmo-net-folder-stream-type-internal folder)))) (defun elmo-net-port-label (folder) (concat (symbol-name (elmo-folder-type-internal folder)) (if (elmo-net-folder-stream-type-internal folder) (concat "!" (symbol-name (elmo-network-stream-type-symbol (elmo-net-folder-stream-type-internal folder))))))) (luna-define-method elmo-folder-plugged-p ((folder elmo-net-folder)) (apply 'elmo-plugged-p (append (elmo-net-port-info folder) (list nil `,(elmo-net-port-label folder))))) (luna-define-method elmo-folder-set-plugged ((folder elmo-net-folder) plugged &optional add) (apply 'elmo-set-plugged plugged (append (elmo-net-port-info folder) (list nil nil `,(elmo-net-port-label folder) add)))) (luna-define-method elmo-folder-create ((folder elmo-net-folder)) (if (elmo-folder-plugged-p folder) (elmo-folder-send folder 'elmo-folder-create-plugged) (elmo-folder-send folder 'elmo-folder-create-unplugged))) (luna-define-method elmo-folder-create-unplugged ((folder elmo-net-folder)) (if elmo-enable-disconnected-operation (elmo-folder-create-dop folder) (error "Unplugged"))) (luna-define-method elmo-folder-exists-p ((folder elmo-net-folder)) (if (elmo-folder-plugged-p folder) (elmo-folder-send folder 'elmo-folder-exists-p-plugged) ;; If unplugged, guess by msgdb. (file-directory-p (elmo-folder-msgdb-path folder)))) (luna-define-method elmo-folder-status ((folder elmo-net-folder)) (if (elmo-folder-plugged-p folder) (elmo-folder-send folder 'elmo-folder-status-plugged) (elmo-folder-send folder 'elmo-folder-status-unplugged))) (luna-define-method elmo-folder-status-unplugged ((folder elmo-net-folder)) (if elmo-enable-disconnected-operation (elmo-folder-status-dop folder) (error "Unplugged"))) (luna-define-method elmo-folder-next-message-number ((folder elmo-net-folder)) (if (elmo-folder-plugged-p folder) (elmo-folder-send folder 'elmo-folder-next-message-number-plugged) (elmo-folder-send folder 'elmo-folder-next-message-number-unplugged))) (luna-define-method elmo-folder-next-message-number-unplugged ((folder elmo-net-folder)) (if elmo-enable-disconnected-operation (elmo-folder-next-message-number-dop folder) (error "Unplugged"))) (luna-define-method elmo-folder-list-messages-internal ((folder elmo-net-folder) &optional nohide) (elmo-net-folder-list-messages-internal folder nohide)) (defun elmo-net-folder-list-messages-internal (folder nohide) (if (elmo-folder-plugged-p folder) (elmo-folder-send folder 'elmo-folder-list-messages-plugged nohide) (elmo-folder-send folder 'elmo-folder-list-messages-unplugged))) (luna-define-method elmo-folder-list-messages-plugged ((_folder elmo-net-folder)) nil) ;; Should consider offline append and removal. (luna-define-method elmo-folder-list-messages-unplugged ((folder elmo-net-folder)) (if elmo-enable-disconnected-operation (let ((deleting (elmo-dop-list-deleting-messages folder))) (nconc ;; delete deleting messages (elmo-delete-if (lambda (number) (memq number deleting)) ;; current number-list. (elmo-folder-list-messages folder nil 'in-msgdb)) ;; append appending messages (mapcar (lambda (x) (* -1 x)) (elmo-dop-spool-folder-list-messages folder)))) t)) (luna-define-method elmo-folder-list-flagged-internal ((folder elmo-net-folder) flag) (if (and (elmo-folder-plugged-p folder) (elmo-folder-use-flag-p folder)) (elmo-folder-send folder 'elmo-folder-list-flagged-plugged flag) ;; Should consider offline append and removal? t)) (luna-define-method elmo-folder-list-flagged-plugged ((_folder elmo-net-folder) _flag) t) (luna-define-method elmo-folder-delete-messages-internal ((folder elmo-net-folder) numbers) (if (elmo-folder-plugged-p folder) (elmo-folder-send folder 'elmo-folder-delete-messages-plugged numbers) (elmo-folder-send folder 'elmo-folder-delete-messages-unplugged numbers))) (luna-define-method elmo-folder-delete-messages-unplugged ((folder elmo-net-folder) numbers) (elmo-folder-delete-messages-dop folder numbers)) (luna-define-method elmo-folder-msgdb-create ((folder elmo-net-folder) numbers flag-table) (if (elmo-folder-plugged-p folder) (elmo-folder-send folder 'elmo-folder-msgdb-create-plugged numbers flag-table) (elmo-folder-send folder 'elmo-folder-msgdb-create-unplugged numbers flag-table))) (luna-define-method elmo-folder-msgdb-create-unplugged ((folder elmo-net-folder) numbers flag-table) ;; XXXX should be appended to already existing msgdb. (elmo-dop-msgdb (elmo-folder-msgdb-create (elmo-dop-spool-folder folder) (mapcar 'abs numbers) flag-table))) (luna-define-method elmo-folder-set-flag :before ((folder elmo-net-folder) numbers flag &optional is-local) (when (and (not is-local) (elmo-folder-use-flag-p folder)) (elmo-folder-send folder (if (elmo-folder-plugged-p folder) 'elmo-folder-set-flag-plugged 'elmo-folder-set-flag-unplugged) numbers flag))) (luna-define-method elmo-folder-unset-flag :before ((folder elmo-net-folder) numbers flag &optional is-local) (when (and (not is-local) (elmo-folder-use-flag-p folder)) (elmo-folder-send folder (if (elmo-folder-plugged-p folder) 'elmo-folder-unset-flag-plugged 'elmo-folder-unset-flag-unplugged) numbers flag))) (luna-define-method elmo-folder-set-flag-unplugged ((folder elmo-net-folder) numbers flag) (elmo-folder-set-flag-dop folder numbers flag)) (luna-define-method elmo-folder-unset-flag-unplugged ((folder elmo-net-folder) numbers flag) (elmo-folder-unset-flag-dop folder numbers flag)) (luna-define-method elmo-message-encache :around ((folder elmo-net-folder) number &optional read) (if (elmo-folder-plugged-p folder) (luna-call-next-method) (if elmo-enable-disconnected-operation (elmo-message-encache-dop folder number read) (error "Unplugged")))) (luna-define-generic elmo-message-fetch-plugged (folder number strategy &optional section outbuf unseen) "") (luna-define-generic elmo-message-fetch-unplugged (folder number strategy &optional section outbuf unseen) "") (luna-define-method elmo-message-fetch-internal ((folder elmo-net-folder) number strategy &optional section unseen) (if (elmo-folder-plugged-p folder) (elmo-message-fetch-plugged folder number strategy section (current-buffer) unseen) (elmo-message-fetch-unplugged folder number strategy section (current-buffer) unseen))) (luna-define-method elmo-message-fetch-unplugged ((folder elmo-net-folder) number strategy &optional section _outbuf unseen) (if (and elmo-enable-disconnected-operation (< number 0)) (elmo-message-fetch-internal (elmo-dop-spool-folder folder) (abs number) strategy section unseen) (error "Unplugged"))) (luna-define-method elmo-folder-check ((folder elmo-net-folder)) (if (elmo-folder-plugged-p folder) (elmo-folder-send folder 'elmo-folder-check-plugged))) (luna-define-method elmo-folder-close :after ((folder elmo-net-folder)) (if (elmo-folder-plugged-p folder) (elmo-folder-send folder 'elmo-folder-check-plugged))) (luna-define-method elmo-folder-diff :around ((folder elmo-net-folder)) (if (and (elmo-folder-use-flag-p folder) (elmo-folder-plugged-p folder)) (elmo-folder-send folder 'elmo-folder-diff-plugged) (luna-call-next-method))) (luna-define-method elmo-folder-local-p ((_folder elmo-net-folder)) nil) (luna-define-method elmo-quit ((_folder elmo-net-folder)) (elmo-network-clear-session-cache)) (require 'product) (product-provide (provide 'elmo-net) (require 'elmo-version)) ;;; elmo-net.el ends here wanderlust-wanderlust-769699d/elmo/elmo-nntp.el000066400000000000000000001404611406661363500216020ustar00rootroot00000000000000;;; elmo-nntp.el --- NNTP Interface for ELMO. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Copyright (C) 1998,1999,2000 Masahiro MURATA ;; Copyright (C) 1999,2000 Kenichi OKADA ;; Author: Yuuichi Teranishi ;; Masahiro MURATA ;; Kenichi OKADA ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'cl-lib) (require 'elmo-vars) (require 'elmo-util) (require 'elmo-date) (require 'elmo-msgdb) (require 'elmo-cache) (require 'elmo) (require 'elmo-net) (defvar elmo-nntp-overview-fetch-chop-length 200 "*Number of overviews to fetch in one request in nntp.") (defvar elmo-nntp-use-cache t "Use cache in nntp folder.") (defvar elmo-nntp-max-number-precedes-list-active nil "Non-nil means max number of msgdb is set as the max number of `list active'. \(Needed for inn 2.3 or later?\).") (defvar elmo-nntp-group-coding-system nil "A coding system for newsgroup string.") (defconst elmo-nntp-folder-name-syntax `(group (?: [user "^\\([A-Za-z]\\|$\\)"]) ,@elmo-net-folder-name-syntax)) (defsubst elmo-nntp-encode-group-string (string) (if elmo-nntp-group-coding-system (encode-coding-string string elmo-nntp-group-coding-system) string)) (defsubst elmo-nntp-decode-group-string (string) (if elmo-nntp-group-coding-system (decode-coding-string string elmo-nntp-group-coding-system) string)) ;; For debugging. (defvar elmo-nntp-debug nil "Non-nil forces NNTP folder as debug mode. Debug information is inserted in the buffer \"*NNTP DEBUG*\"") ;;; Debug (defsubst elmo-nntp-debug (message &rest args) (if elmo-nntp-debug (let ((biff (string-match "BIFF-" (buffer-name)))) (with-current-buffer (get-buffer-create (concat "*NNTP DEBUG*" (if biff "BIFF"))) (goto-char (point-max)) (insert (apply 'format message args) "\n"))))) ;;; ELMO NNTP folder (eval-and-compile (luna-define-class elmo-nntp-folder (elmo-net-folder) (group temp-crosses reads)) (luna-define-internal-accessors 'elmo-nntp-folder)) (luna-define-method elmo-folder-initialize ((folder elmo-nntp-folder) name) (let ((elmo-network-stream-type-alist (if elmo-nntp-stream-type-alist (append elmo-nntp-stream-type-alist elmo-network-stream-type-alist) elmo-network-stream-type-alist)) tokens) (setq tokens (car (elmo-parse-separated-tokens name elmo-nntp-folder-name-syntax))) ;; group (elmo-nntp-folder-set-group-internal folder (elmo-nntp-encode-group-string (cdr (assq 'group tokens)))) ;; user (elmo-net-folder-set-user-internal folder (let ((user (cdr (assq 'user tokens)))) (if user (and (> (length user) 0) user) elmo-nntp-default-user))) ;; network (elmo-net-folder-set-parameters folder tokens (list :server elmo-nntp-default-server :port elmo-nntp-default-port :stream-type (elmo-get-network-stream-type elmo-nntp-default-stream-type))) folder)) (luna-define-method elmo-folder-expand-msgdb-path ((folder elmo-nntp-folder)) (convert-standard-filename (expand-file-name (elmo-nntp-folder-group-internal folder) (expand-file-name (or (elmo-net-folder-server-internal folder) "nowhere") (expand-file-name "nntp" elmo-msgdb-directory))))) (luna-define-method elmo-folder-newsgroups ((folder elmo-nntp-folder)) (list (elmo-nntp-folder-group-internal folder))) ;;; NNTP Session (eval-and-compile (luna-define-class elmo-nntp-session (elmo-network-session) (current-group)) (luna-define-internal-accessors 'elmo-nntp-session)) ;; ;; internal variables ;; (defvar elmo-nntp-connection-cache nil "Cache of NNTP connection.") ;; buffer local variable (defvar elmo-nntp-list-folders-use-cache 600 "*Time to cache of list folders, as the number of seconds. Don't cache if nil.") (defvar elmo-nntp-list-folders-cache nil) (defvar elmo-nntp-groups-async nil) (defvar elmo-nntp-header-fetch-chop-length 200) (defvar elmo-nntp-read-point 0) (defvar elmo-nntp-send-mode-reader t) (defvar elmo-nntp-opened-hook nil) (defvar elmo-nntp-get-folders-securely nil) (defvar elmo-nntp-default-use-xover t) (defvar elmo-nntp-default-use-listgroup t) (defvar elmo-nntp-default-use-list-active t) (defvar elmo-nntp-default-use-xhdr t) (defvar elmo-nntp-server-command-alist nil) (defconst elmo-nntp-server-command-index '((xover . 0) (listgroup . 1) (list-active . 2) (xhdr . 3))) (defmacro elmo-nntp-get-server-command (session) `(assoc (cons (elmo-network-session-server-internal ,session) (elmo-network-session-port-internal ,session)) elmo-nntp-server-command-alist)) (defmacro elmo-nntp-set-server-command (session com value) `(let (entry) (unless (setq entry (cdr (elmo-nntp-get-server-command ,session))) (setq elmo-nntp-server-command-alist (nconc elmo-nntp-server-command-alist (list (cons (cons (elmo-network-session-server-internal ,session) (elmo-network-session-port-internal ,session)) (setq entry (vector elmo-nntp-default-use-xover elmo-nntp-default-use-listgroup elmo-nntp-default-use-list-active elmo-nntp-default-use-xhdr))))))) (aset entry (cdr (assq ,com elmo-nntp-server-command-index)) ,value))) (defmacro elmo-nntp-xover-p (session) `(let ((entry (elmo-nntp-get-server-command ,session))) (if entry (aref (cdr entry) (cdr (assq 'xover elmo-nntp-server-command-index))) elmo-nntp-default-use-xover))) (defmacro elmo-nntp-set-xover (session value) `(elmo-nntp-set-server-command ,session 'xover ,value)) (defmacro elmo-nntp-listgroup-p (session) `(let ((entry (elmo-nntp-get-server-command ,session))) (if entry (aref (cdr entry) (cdr (assq 'listgroup elmo-nntp-server-command-index))) elmo-nntp-default-use-listgroup))) (defmacro elmo-nntp-set-listgroup (session value) `(elmo-nntp-set-server-command ,session 'listgroup ,value)) (defmacro elmo-nntp-list-active-p (session) `(let ((entry (elmo-nntp-get-server-command ,session))) (if entry (aref (cdr entry) (cdr (assq 'list-active elmo-nntp-server-command-index))) elmo-nntp-default-use-list-active))) (defmacro elmo-nntp-set-list-active (session value) `(elmo-nntp-set-server-command ,session 'list-active ,value)) (defmacro elmo-nntp-xhdr-p (session) `(let ((entry (elmo-nntp-get-server-command ,session))) (if entry (aref (cdr entry) (cdr (assq 'xhdr elmo-nntp-server-command-index))) elmo-nntp-default-use-xhdr))) (defmacro elmo-nntp-set-xhdr (session value) `(elmo-nntp-set-server-command ,session 'xhdr ,value)) (defsubst elmo-nntp-max-number-precedes-list-active-p () elmo-nntp-max-number-precedes-list-active) (defsubst elmo-nntp-folder-postfix (user server port type) (concat (and user (concat ":" user)) (if (and server (null (string= server elmo-nntp-default-server))) (concat "@" server)) (if (and port (null (eq port elmo-nntp-default-port))) (concat ":" (if (numberp port) (number-to-string port) port))) (unless (eq (elmo-network-stream-type-symbol type) elmo-nntp-default-stream-type) (elmo-network-stream-type-spec-string type)))) (defun elmo-nntp-get-session (folder &optional if-exists) (elmo-network-get-session 'elmo-nntp-session (concat (if (elmo-folder-biff-internal folder) "BIFF-") "NNTP") folder if-exists)) (luna-define-method elmo-network-initialize-session ((session elmo-nntp-session)) (let ((process (elmo-network-session-process-internal session)) response) (set-process-filter (elmo-network-session-process-internal session) 'elmo-nntp-process-filter) (with-current-buffer (elmo-network-session-buffer session) (setq elmo-nntp-read-point (point-min)) ;; Skip garbage output from process before greeting. (while (and (memq (process-status process) '(open run)) (goto-char (point-max)) (forward-line -1) (not (looking-at "^[2-5][0-9][0-9]"))) (accept-process-output process 1)) (setq elmo-nntp-read-point (point)) (setq response (elmo-nntp-read-response session t t)) (unless (car response) (signal 'elmo-open-error (list (cdr response)))) (if elmo-nntp-send-mode-reader (elmo-nntp-send-mode-reader session)) (when (memq (elmo-network-stream-type-symbol (elmo-network-session-stream-type-internal session)) elmo-network-starttls-stream-type-list) (elmo-nntp-send-command session "starttls") (or (elmo-nntp-read-response session) (error "Cannot open starttls session")) (elmo-network-session-starttls-negotiate session))))) (luna-define-method elmo-network-authenticate-session ((session elmo-nntp-session)) (with-current-buffer (elmo-network-session-buffer session) (when (elmo-network-session-user-internal session) (elmo-nntp-send-command session (format "authinfo user %s" (elmo-network-session-user-internal session)) nil 'no-log) (or (elmo-nntp-read-response session) (signal 'elmo-authenticate-error '(authinfo))) (elmo-nntp-send-command session (format "authinfo pass %s" (elmo-get-passwd (elmo-network-session-password-key session))) nil 'no-log) (or (elmo-nntp-read-response session) (signal 'elmo-authenticate-error '(authinfo)))))) (luna-define-method elmo-network-setup-session ((_session elmo-nntp-session)) (run-hooks 'elmo-nntp-opened-hook)) (defun elmo-nntp-process-filter (process output) (when (buffer-live-p (process-buffer process)) (with-current-buffer (process-buffer process) (goto-char (point-max)) (insert output) (elmo-nntp-debug "RECEIVED: %s\n" output)))) (defun elmo-nntp-send-mode-reader (session) (elmo-nntp-send-command session "mode reader") (if (null (elmo-nntp-read-response session t)) (message "Mode reader failed"))) (defun elmo-nntp-send-command (session command &optional noerase no-log) (with-current-buffer (elmo-network-session-buffer session) (unless noerase (erase-buffer) (goto-char (point-min))) (setq elmo-nntp-read-point (point)) (elmo-nntp-debug "SEND: %s\n" (if no-log "" command)) (process-send-string (elmo-network-session-process-internal session) (concat command "\r\n")))) (defun elmo-nntp-read-response (session &optional not-command error-msg) (with-current-buffer (elmo-network-session-buffer session) (let ((process (elmo-network-session-process-internal session)) (response-continue t) response match-end last (start elmo-nntp-read-point)) (while response-continue (setq match-end elmo-nntp-read-point) (while (null (progn (goto-char match-end) (search-forward "\r\n" nil t))) (setq match-end (max (1- (point-max)) elmo-nntp-read-point)) (accept-process-output process)) (setq match-end (point) last elmo-nntp-read-point elmo-nntp-read-point match-end) (goto-char last) (cond ((looking-at "[23][0-9]+ ") (setq response-continue nil)) ((looking-at "[^23][0-9]+ ") (setq response-continue nil start nil)) (not-command (setq response-continue nil)))) (setq response (and start (elmo-delete-cr (buffer-substring start (- match-end 2))))) (if error-msg (cons response (buffer-substring last (- match-end 2))) response)))) (defun elmo-nntp-read-raw-response (session) (with-current-buffer (elmo-network-session-buffer session) (goto-char elmo-nntp-read-point) (while (not (search-forward "\r\n" nil t)) (accept-process-output (elmo-network-session-process-internal session)) (goto-char elmo-nntp-read-point)) (buffer-substring elmo-nntp-read-point (- (point) 2)))) (defun elmo-nntp-read-contents (session) (with-current-buffer (elmo-network-session-buffer session) (let ((point elmo-nntp-read-point)) (while (null (progn (goto-char (1- point)) (search-forward "\n.\r\n" nil t))) (setq point (max (- (point-max) 2) elmo-nntp-read-point)) (accept-process-output (elmo-network-session-process-internal session))) (elmo-delete-cr (buffer-substring elmo-nntp-read-point (- (point) 3)))))) (defun elmo-nntp-read-body (session outbuf) (with-current-buffer (elmo-network-session-buffer session) (let ((point elmo-nntp-read-point)) (while (null (progn (goto-char (1- point)) (search-forward "\n.\r\n" nil t))) (setq point (max (- (point-max) 2) elmo-nntp-read-point)) (accept-process-output (elmo-network-session-process-internal session))) (setq point (point)) (set-buffer outbuf) (erase-buffer) (insert-buffer-substring (elmo-network-session-buffer session) elmo-nntp-read-point (- point 3)) (elmo-delete-cr-buffer))) t) (defun elmo-nntp-select-group (session group &optional force) (let (response) (when (or force (not (string= (elmo-nntp-session-current-group-internal session) group))) (unwind-protect (progn (elmo-nntp-send-command session (format "group %s" group)) (setq response (elmo-nntp-read-response session))) (elmo-nntp-session-set-current-group-internal session (and response group)) response)))) (defun elmo-nntp-list-folders-get-cache (group server buf) (when (and elmo-nntp-list-folders-use-cache elmo-nntp-list-folders-cache (string-match (concat "^" (regexp-quote (or (nth 1 elmo-nntp-list-folders-cache) ""))) (or group "")) (string= (or (nth 2 elmo-nntp-list-folders-cache) "") (or server "")) (null (elmo-time-expire (car elmo-nntp-list-folders-cache) elmo-nntp-list-folders-use-cache))) (with-current-buffer buf (if group (let ((regexp (concat "^" (regexp-quote group) "\\..*$")) (string (nth 3 elmo-nntp-list-folders-cache)) start) (while (string-match regexp string start) (insert (match-string 0 string) "\n") (setq start (match-end 0)))) (insert (nth 3 elmo-nntp-list-folders-cache)))) t)) (defsubst elmo-nntp-catchup-msgdb (msgdb max-number) (elmo-make-number-list (elmo-max-of-list (elmo-msgdb-list-messages msgdb)) max-number)) (luna-define-method elmo-folder-list-subfolders ((folder elmo-nntp-folder) &optional one-level) (elmo-nntp-folder-list-subfolders folder one-level)) (defun elmo-nntp-folder-list-subfolders (folder one-level) (let ((session (elmo-nntp-get-session folder)) (group (elmo-nntp-folder-group-internal folder)) (server (elmo-net-folder-server-internal folder)) (username (or (elmo-net-folder-user-internal folder) "")) (port (elmo-net-folder-port-internal folder)) (stream-type (elmo-net-folder-stream-type-internal folder)) case-fold-search response ret-val top-ng append-serv prefix start regexp) (setq append-serv (concat (unless (string= username (or elmo-nntp-default-user "")) (concat ":" (elmo-quote-syntactical-element username 'user elmo-nntp-folder-name-syntax))) (unless (string= server elmo-nntp-default-server) (concat "@" server)) (unless (eq port elmo-nntp-default-port) (concat ":" (number-to-string port))) (unless (eq (elmo-network-stream-type-symbol stream-type) elmo-nntp-default-stream-type) (elmo-network-stream-type-spec-string stream-type))) prefix (list (car (rassq 'nntp elmo-folder-type-alist)))) (when (string= group "") (setq group nil)) (with-temp-buffer (set-buffer-multibyte nil) (if (and group (elmo-nntp-select-group session group)) ;; add top newsgroups (setq ret-val (list (concat prefix group append-serv)))) (unless (elmo-nntp-list-folders-get-cache group server (current-buffer)) (when (and group (elmo-nntp-list-active-p session)) (elmo-nntp-send-command session (concat "list active" (and group (concat " " group ".*")))) (if (elmo-nntp-read-response session t) (if (null (setq response (elmo-nntp-read-contents session))) (error "NNTP List folders failed") (when elmo-nntp-list-folders-use-cache (setq elmo-nntp-list-folders-cache (list (current-time) group server response))) (insert response)) (elmo-nntp-set-list-active session nil))) (unless response (elmo-nntp-send-command session "list") (unless (and (elmo-nntp-read-response session t) (setq response (elmo-nntp-read-contents session))) (error "NNTP List folders failed")) (when elmo-nntp-list-folders-use-cache (setq elmo-nntp-list-folders-cache (list (current-time) nil server response))) (if group (progn (setq regexp (concat "^" (regexp-quote group) ".*$")) (while (string-match regexp response start) (insert (match-string 0 response) "\n") (setq start (match-end 0)))) (insert response)))) (goto-char (point-min)) (elmo-with-progress-display (elmo-nntp-parse-active (count-lines (point-min) (point-max))) "Parsing active" (if one-level (progn (setq regexp (concat "^\\(" (when group (regexp-quote (concat group "."))) "[^. ]+\\)\\([. ]\\).*\n")) (while (looking-at regexp) (setq top-ng (concat prefix (match-string-no-properties 1) append-serv)) (if (string= (match-string-no-properties 2) " ") (unless (or (member top-ng ret-val) (assoc top-ng ret-val)) (setq ret-val (cons top-ng ret-val))) (unless (assoc top-ng ret-val) (setq ret-val (cons (list top-ng) (delete top-ng ret-val))))) (elmo-progress-notify 'elmo-nntp-parse-active) (forward-line))) (while (re-search-forward "\\([^ ]+\\) .*\n" nil t) (setq ret-val (cons (concat prefix (match-string-no-properties 1) append-serv) ret-val)) (elmo-progress-notify 'elmo-nntp-parse-active))))) (nreverse ret-val))) (defun elmo-nntp-make-msglist (beg-str end-str) (elmo-make-number-list (string-to-number beg-str) (string-to-number end-str))) (luna-define-method elmo-folder-list-messages-plugged ((folder elmo-nntp-folder) &optional _nohide) (let ((session (elmo-nntp-get-session folder)) (group (elmo-nntp-folder-group-internal folder)) response numbers use-listgroup) (save-excursion (when (setq use-listgroup (elmo-nntp-listgroup-p session)) (elmo-nntp-send-command session (format "listgroup %s" group)) (if (not (elmo-nntp-read-response session t)) (progn (elmo-nntp-set-listgroup session nil) (setq use-listgroup nil)) (if (null (setq response (elmo-nntp-read-contents session))) (error "Fetching listgroup failed")) (setq numbers (elmo-string-to-list response)) (elmo-nntp-session-set-current-group-internal session group))) (unless use-listgroup (elmo-nntp-send-command session (format "group %s" group)) (if (null (setq response (elmo-nntp-read-response session))) (error "Select group failed")) (when (and (string-match "211 \\([0-9]+\\) \\([0-9]+\\) \\([0-9]+\\) [^.].+$" response) (> (string-to-number (match-string 1 response)) 0)) (setq numbers (elmo-nntp-make-msglist (match-string 2 response) (match-string 3 response))))) numbers))) (luna-define-method elmo-folder-status ((folder elmo-nntp-folder)) (elmo-nntp-folder-status folder)) (defun elmo-nntp-folder-status (folder) (let ((killed-list (elmo-msgdb-killed-list-load (elmo-folder-msgdb-path folder))) end-num entry) (if elmo-nntp-groups-async (if (setq entry (elmo-get-hash-val (concat (elmo-nntp-folder-group-internal folder) (elmo-nntp-folder-postfix (elmo-net-folder-user-internal folder) (elmo-net-folder-server-internal folder) (elmo-net-folder-port-internal folder) (elmo-net-folder-stream-type-internal folder))) elmo-newsgroups-hashtb)) (progn (setq end-num (nth 2 entry)) (when (and killed-list (elmo-number-set-member end-num killed-list)) ;; Max is killed. (setq end-num nil)) (cons end-num (car entry))) (error "No such newsgroup \"%s\"" (elmo-nntp-folder-group-internal folder))) (let ((session (elmo-nntp-get-session folder)) response e-num) (if (null session) (error "Connection failed")) (save-excursion (elmo-nntp-send-command session (format "group %s" (elmo-nntp-folder-group-internal folder))) (setq response (elmo-nntp-read-response session)) (if (and response (string-match "211 \\([0-9]+\\) \\([0-9]+\\) \\([0-9]+\\) [^.].+$" response)) (progn (setq end-num (string-to-number (match-string 3 response))) (setq e-num (string-to-number (match-string 1 response))) (when (and killed-list (elmo-number-set-member end-num killed-list)) ;; Max is killed. (setq end-num nil)) (cons end-num e-num)) (if (null response) (error "Selecting newsgroup \"%s\" failed" (elmo-nntp-folder-group-internal folder)) nil))))))) (defconst elmo-nntp-overview-index '(("number" . 0) ("subject" . 1) ("from" . 2) ("date" . 3) ("message-id" . 4) ("references" . 5) ("size" . 6) ("lines" . 7) ("xref" . 8))) (defun elmo-nntp-create-msgdb-from-overview-string (folder str flag-table &optional numlist) (let ((new-msgdb (elmo-make-msgdb)) ov-list message-id entity ov-entity num field field-index flags) (setq ov-list (elmo-nntp-parse-overview-string str)) (while ov-list (setq ov-entity (car ov-list)) ;;; INN bug?? ;;; (if (or (> (setq num (string-to-number (aref ov-entity 0))) ;;; 99999) ;;; (<= num 0)) ;;; (setq num 0)) ;;; (setq num (number-to-string num)) (setq num (string-to-number (aref ov-entity 0))) (when (or (null numlist) (memq num numlist)) (setq entity (elmo-msgdb-make-message-entity (elmo-msgdb-message-entity-handler new-msgdb) :message-id (aref ov-entity 4) :number num :references (nreverse (mapcar 'std11-msg-id-string (std11-parse-msg-ids-string (aref ov-entity 5)))) :from (eword-decode-string (elmo-delete-char ?\" (or (aref ov-entity 2) elmo-no-from))) :subject (or (eword-decode-string (aref ov-entity 1)) elmo-no-subject) :date (aref ov-entity 3) :size (string-to-number (aref ov-entity 6)))) (dolist (extra elmo-msgdb-extra-fields) (setq extra (downcase extra)) (when (and (setq field-index (cdr (assoc extra elmo-nntp-overview-index))) (> (length ov-entity) field-index)) (setq field (aref ov-entity field-index)) (when (eq field-index 8) ;; xref (setq field (elmo-msgdb-remove-field-string field))) (elmo-message-entity-set-field entity (intern extra) field))) (setq message-id (elmo-message-entity-field entity 'message-id) flags (elmo-flag-table-get flag-table message-id)) (elmo-global-flags-set flags folder num message-id) (elmo-msgdb-append-entity new-msgdb entity flags)) (setq ov-list (cdr ov-list))) new-msgdb)) (luna-define-method elmo-folder-msgdb-create ((folder elmo-nntp-folder) numbers flag-table) (elmo-nntp-folder-msgdb-create folder numbers flag-table)) (defun elmo-nntp-folder-msgdb-create (folder numbers flag-table) (let ((filter numbers) (session (elmo-nntp-get-session folder)) (new-msgdb (elmo-make-msgdb)) beg-num end-num cur length ov-str use-xover) (elmo-nntp-select-group session (elmo-nntp-folder-group-internal folder)) (when (setq use-xover (elmo-nntp-xover-p session)) (setq beg-num (car numbers) cur beg-num end-num (nth (1- (length numbers)) numbers) length (+ (- end-num beg-num) 1)) (elmo-with-progress-display (elmo-retrieve-overview length) "Getting overview" (while (<= cur end-num) (elmo-nntp-send-command session (format "xover %s-%s" (number-to-string cur) (number-to-string (+ cur elmo-nntp-overview-fetch-chop-length)))) (with-current-buffer (elmo-network-session-buffer session) (if ov-str (elmo-msgdb-append new-msgdb (elmo-nntp-create-msgdb-from-overview-string folder ov-str flag-table filter)))) (if (null (elmo-nntp-read-response session t)) (progn (setq cur end-num);; exit while loop (elmo-nntp-set-xover session nil) (setq use-xover nil)) (if (null (setq ov-str (elmo-nntp-read-contents session))) (error "Fetching overview failed"))) (setq cur (+ elmo-nntp-overview-fetch-chop-length cur 1)) (elmo-progress-notify 'elmo-retrieve-overview :set (+ (- (min cur end-num) beg-num) 1))))) (if (not use-xover) (setq new-msgdb (elmo-nntp-msgdb-create-by-header session numbers flag-table)) (with-current-buffer (elmo-network-session-buffer session) (if ov-str (elmo-msgdb-append new-msgdb (elmo-nntp-create-msgdb-from-overview-string folder ov-str flag-table filter))))) (elmo-folder-set-killed-list-internal folder (nconc (elmo-folder-killed-list-internal folder) (car (elmo-list-diff numbers (elmo-msgdb-list-messages new-msgdb))))) ;; If there are canceled messages, overviews are not obtained ;; to max-number(inn 2.3?). (when (and (elmo-nntp-max-number-precedes-list-active-p) (elmo-nntp-list-active-p session)) (elmo-nntp-send-command session (format "list active %s" (elmo-nntp-folder-group-internal folder))) (unless (elmo-nntp-read-response session) (elmo-nntp-set-list-active session nil) (error "NNTP list command failed")) (let ((killed (elmo-nntp-catchup-msgdb new-msgdb (nth 1 (read (concat "(" (elmo-nntp-read-contents session) ")")))))) (when killed (elmo-folder-kill-messages folder killed)))) new-msgdb)) (luna-define-method elmo-folder-update-number ((folder elmo-nntp-folder)) (when (elmo-nntp-max-number-precedes-list-active-p) (let ((session (elmo-nntp-get-session folder))) (when (elmo-nntp-list-active-p session) (let ((numbers (elmo-folder-list-messages folder nil 'in-msgdb)) msgdb-max max-number) ;; If there are canceled messages, overviews are not obtained ;; to max-number(inn 2.3?). (elmo-nntp-select-group session (elmo-nntp-folder-group-internal folder)) (elmo-nntp-send-command session (format "list active %s" (elmo-nntp-folder-group-internal folder))) (if (null (elmo-nntp-read-response session)) (error "NNTP list command failed")) (setq max-number (nth 1 (read (concat "(" (elmo-nntp-read-contents session) ")")))) (setq msgdb-max (if numbers (apply #'max numbers) 0)) (when (and msgdb-max max-number (< msgdb-max max-number)) (let ((i (1+ msgdb-max)) killed) (while (<= i max-number) (setq killed (cons i killed)) (cl-incf i)) (elmo-folder-kill-messages folder (nreverse killed))))))))) (defun elmo-nntp-msgdb-create-by-header (session numbers flag-table) (with-temp-buffer (elmo-nntp-retrieve-headers session (current-buffer) numbers) (elmo-nntp-msgdb-create-message (length numbers) flag-table))) (defun elmo-nntp-parse-xhdr-response (string) (let (response) (with-temp-buffer (insert string) (goto-char (point-min)) (while (not (eobp)) (if (looking-at "^\\([0-9]+\\) \\(.*\\)$") (setq response (cons (cons (string-to-number (match-string-no-properties 1)) (match-string-no-properties 2)) response))) (forward-line))) (nreverse response))) (defun elmo-nntp-parse-overview-string (string) (let ((index 0) (length (length string)) next result) (while (or (setq next (string-match "\n" string index)) (/= index length)) (setq result (cons (apply 'vector (split-string (substring string index next) "\t")) result) index (if next (1+ next) length))) (nreverse result))) (defun elmo-nntp-get-newsgroup-by-msgid (msgid server user port type) "Get nntp header string." (save-excursion (let ((session (elmo-nntp-get-session (luna-make-entity 'elmo-nntp-folder :user user :server server :port port :stream-type type)))) (elmo-nntp-send-command session (format "head %s" msgid)) (if (elmo-nntp-read-response session) (elmo-nntp-read-contents session)) (with-current-buffer (elmo-network-session-buffer session) (std11-field-body "Newsgroups"))))) (luna-define-method elmo-message-fetch :around ((folder elmo-nntp-folder) number _strategy &optional unread _section) (when (luna-call-next-method) (elmo-nntp-setup-crosspost-buffer folder number) (unless unread (elmo-nntp-folder-update-crosspost-message-alist folder (list number))) t)) (luna-define-method elmo-message-fetch-plugged ((folder elmo-nntp-folder) number strategy &optional section outbuf unread) (elmo-nntp-message-fetch folder number strategy section outbuf unread)) (defun elmo-nntp-message-fetch (folder number _strategy _section outbuf unread) (let ((session (elmo-nntp-get-session folder))) (with-current-buffer (elmo-network-session-buffer session) (elmo-nntp-select-group session (elmo-nntp-folder-group-internal folder)) (elmo-nntp-send-command session (format "article %s" number)) (if (null (elmo-nntp-read-response session t)) (progn (with-current-buffer outbuf (erase-buffer)) (message "Fetching message failed") nil) (prog1 (elmo-nntp-read-body session outbuf) (with-current-buffer outbuf (goto-char (point-min)) (while (re-search-forward "^\\." nil t) (replace-match "") (forward-line)) (elmo-nntp-setup-crosspost-buffer folder number) (unless unread (elmo-nntp-folder-update-crosspost-message-alist folder (list number))))))))) (defun elmo-nntp-post (hostname content-buf) (let ((session (elmo-nntp-get-session (luna-make-entity 'elmo-nntp-folder :user elmo-nntp-default-user :server hostname :port elmo-nntp-default-port :stream-type (elmo-get-network-stream-type elmo-nntp-default-stream-type)))) response has-message-id) (with-current-buffer content-buf (goto-char (point-min)) (if (search-forward mail-header-separator nil t) (delete-region (match-beginning 0)(match-end 0))) (setq has-message-id (elmo-get-message-id-from-buffer 'none)) (elmo-nntp-send-command session "post") (if (string-match "^340" (setq response (elmo-nntp-read-raw-response session))) (if (string-match "recommended ID \\(<[^@]+@[^>]+>\\)" response) (unless has-message-id ;; We should remove invalid Message-ID header. (save-restriction (save-match-data (std11-narrow-to-header) (goto-char (point-min)) (let ((case-fold-search t)) (if (re-search-forward "^message-id:[ \t]*" nil t) (delete-region (match-beginning 0) (min (point-max) (1+ (std11-field-end)))))))) (goto-char (point-min)) (insert (concat "Message-ID: " (match-string 1 response) "\n")))) (error "POST failed")) (run-hooks 'elmo-nntp-post-pre-hook) (elmo-nntp-send-buffer session content-buf) (elmo-nntp-send-command session ".") ;;; (elmo-nntp-read-response buffer process t) (if (not (string-match "^2" (setq response (elmo-nntp-read-raw-response session)))) (error "NNTP error: %s" response))))) (defsubst elmo-nntp-send-data-line (session line) "Send LINE to SESSION." (process-send-string (elmo-network-session-process-internal session) ;; Escape "." at start of a line (concat (if (eq (string-to-char line) ?.) ".") line "\r\n"))) (defun elmo-nntp-send-buffer (session databuf) "Send data content of DATABUF to SESSION." (with-current-buffer databuf (goto-char (point-min)) (while (null (eobp)) (elmo-nntp-send-data-line session (buffer-substring (point) (goto-char (line-end-position)))) (forward-line)))) (luna-define-method elmo-folder-delete-messages ((folder elmo-nntp-folder) numbers) (elmo-folder-kill-messages folder numbers) t) (luna-define-method elmo-folder-exists-p-plugged ((folder elmo-nntp-folder)) (let ((session (elmo-nntp-get-session folder))) (elmo-nntp-send-command session (format "group %s" (elmo-nntp-folder-group-internal folder))) (elmo-nntp-read-response session))) (defun elmo-nntp-retrieve-field (spec field from-msgs) "Retrieve FIELD values from FROM-MSGS. Returns a list of cons cells like (NUMBER . VALUE)" (let ((session (elmo-nntp-get-session spec)) result) (setq result (if (elmo-nntp-xhdr-p session) (progn (elmo-nntp-select-group session (elmo-nntp-folder-group-internal spec)) (elmo-nntp-send-command session (format "xhdr %s %s" field (if from-msgs (format "%d-%d" (apply 'min from-msgs) (apply 'max from-msgs)) "0-"))) (if (elmo-nntp-read-response session t) (elmo-nntp-parse-xhdr-response (elmo-nntp-read-contents session)) (elmo-nntp-set-xhdr session nil) (error "NNTP XHDR command failed"))))) (if from-msgs (delq nil (mapcar (lambda (pair) (when (memq (car pair) from-msgs) pair)) result)) result))) (defun elmo-nntp-search-primitive (spec condition &optional from-msgs) (let ((search-key (elmo-filter-key condition)) (numbers (cond ((null from-msgs) (elmo-folder-list-messages spec)) ((listp from-msgs) from-msgs) (t (elmo-folder-list-messages spec 'visible 'in-msgdb))))) (cond ((string= "last" search-key) (nthcdr (max (- (length numbers) (string-to-number (elmo-filter-value condition))) 0) numbers)) ((string= "first" search-key) (car (elmo-list-diff numbers (nthcdr (string-to-number (elmo-filter-value condition)) numbers)))) ((member search-key '("since" "before")) (let ((specified-date (elmo-date-make-sortable-string (elmo-date-get-datevec (elmo-filter-value condition)))) (since (string= "since" search-key)) field-date) (if (eq (elmo-filter-type condition) 'unmatch) (setq since (not since))) (delq nil (mapcar (lambda (pair) (setq field-date (ignore-errors (elmo-date-make-sortable-string (timezone-fix-time (cdr pair) (current-time-zone) nil)))) (if (and field-date (if since (null (string< field-date specified-date)) (string< field-date specified-date))) (car pair))) (elmo-nntp-retrieve-field spec "date" numbers))))) (t (let ((val (elmo-filter-value condition)) (negative (eq (elmo-filter-type condition) 'unmatch)) (case-fold-search t)) (delq nil (mapcar (lambda (pair) (if (string-match val (eword-decode-string (decode-mime-charset-string (cdr pair) elmo-mime-charset))) (unless negative (car pair)) (if negative (car pair)))) (elmo-nntp-retrieve-field spec search-key numbers)))))))) (defun elmo-nntp-search-internal (folder condition from-msgs) (let (result) (cond ((vectorp condition) (setq result (elmo-nntp-search-primitive folder condition from-msgs))) ((eq (car condition) 'and) (setq result (elmo-nntp-search-internal folder (nth 1 condition) from-msgs) result (elmo-list-filter result (elmo-nntp-search-internal folder (nth 2 condition) from-msgs)))) ((eq (car condition) 'or) (setq result (elmo-nntp-search-internal folder (nth 1 condition) from-msgs) result (elmo-sort-uniq-number-list (nconc result (elmo-nntp-search-internal folder (nth 2 condition) from-msgs)))))))) (defun elmo-nntp-use-server-search-p (condition) (if (vectorp condition) (not (member (elmo-filter-key condition) '("raw-body" "body" "flag"))) (and (elmo-nntp-use-server-search-p (nth 1 condition)) (elmo-nntp-use-server-search-p (nth 2 condition))))) (luna-define-method elmo-folder-search :around ((folder elmo-nntp-folder) condition &optional from-msgs) (if (and (elmo-folder-plugged-p folder) (elmo-nntp-use-server-search-p condition)) (elmo-nntp-search-internal folder condition from-msgs) (luna-call-next-method))) (defun elmo-nntp-get-folders-info-prepare (folder session-keys) (condition-case () (let ((session (elmo-nntp-get-session folder)) key count) (with-current-buffer (elmo-network-session-buffer session) (unless (setq key (assoc session session-keys)) (erase-buffer) (setq key (cons session (vector 0 (elmo-net-folder-server-internal folder) (elmo-net-folder-user-internal folder) (elmo-net-folder-port-internal folder) (elmo-net-folder-stream-type-internal folder)))) (setq session-keys (nconc session-keys (list key)))) (elmo-nntp-send-command session (format "group %s" (elmo-nntp-folder-group-internal folder)) 'noerase) (if elmo-nntp-get-folders-securely (accept-process-output (elmo-network-session-process-internal session) 1)) (setq count (aref (cdr key) 0)) (aset (cdr key) 0 (1+ count)))) (error (when elmo-auto-change-plugged (sit-for 1)) nil)) session-keys) (defun elmo-nntp-get-folders-info (session-keys) (let ((sessions session-keys) (cur (get-buffer-create " *ELMO NNTP Temp*"))) (while sessions (let* ((session (caar sessions)) (key (cdar sessions)) (count (aref key 0)) (server (aref key 1)) (user (aref key 2)) (port (aref key 3)) (type (aref key 4)) (hashtb (or elmo-newsgroups-hashtb (setq elmo-newsgroups-hashtb (elmo-make-hash count))))) (save-excursion (elmo-nntp-groups-read-response session cur count) (set-buffer cur) (goto-char (point-min)) (let ((case-replace nil) (postfix (elmo-nntp-folder-postfix user server port type))) (if (not (string= postfix "")) (save-excursion (while (re-search-forward "^\\(211 [0-9]+ [0-9]+ [0-9]+ [^ \n]+\\)\\(.*\\)$" nil t) (replace-match (concat (match-string 1) (replace-regexp-in-string "\\\\" "\\\\\\\\" postfix t t))))))) (let (len min max group) (while (not (eobp)) (condition-case () (when (= (following-char) ?2) (read cur) (setq len (read cur) min (read cur) max (read cur)) (set (setq group (let ((obarray hashtb)) (read cur))) (list len min max))) (error (and group (symbolp group) (set group nil)))) (forward-line)))) (setq sessions (cdr sessions)))) (kill-buffer cur))) ;; original is 'nntp-retrieve-groups [Gnus] (defun elmo-nntp-groups-read-response (session outbuf count) (let* ((received 0) (last-point (point-min))) (with-current-buffer (elmo-network-session-buffer session) (accept-process-output (elmo-network-session-process-internal session) 1) (discard-input) ;; Wait for all replies. (elmo-with-progress-display (elmo-nntp-groups-read-response count) "Getting folders info" (while (progn (goto-char last-point) ;; Count replies. (while (re-search-forward "^[0-9]" nil t) (forward-line) (setq received (1+ received))) (setq last-point (point)) (< received count)) (accept-process-output (elmo-network-session-process-internal session) 1) (discard-input) (elmo-progress-notify 'elmo-nntp-groups-read-response :set received))) ;; Wait for the reply from the final command. (goto-char (point-max)) (re-search-backward "^[0-9]" nil t) (when (memq (following-char) '(?2 ?3)) (while (progn (goto-char (point-max)) (not (re-search-backward "\r?\n" (- (point) 3) t))) (accept-process-output (elmo-network-session-process-internal session) 1) (discard-input))) ;; Now all replies are received. We remove CRs. (elmo-delete-cr-buffer) (copy-to-buffer outbuf (point-min) (point-max))))) ;; from nntp.el [Gnus] (defsubst elmo-nntp-next-result-arrived-p () (if (eq (following-char) ?2) (re-search-forward "\n\\.\r?\n" nil t) (if (memq (following-char) '(?3 ?4)) (search-forward "\n" nil t)))) (defun elmo-nntp-retrieve-headers (session outbuf articles) "Retrieve the headers of ARTICLES." (with-current-buffer (elmo-network-session-buffer session) (erase-buffer) (let ((number (length articles)) (count 0) (received 0) (last-point (point-min)) article) (elmo-with-progress-display (elmo-retrieve-header number) "Getting headers" ;; Send HEAD commands. (while (setq article (pop articles)) (elmo-nntp-send-command session (format "head %s" article) 'noerase) (setq count (1+ count)) ;; Every 200 requests we have to read the stream in ;; order to avoid deadlocks. (when (or (null articles) ;All requests have been sent. (zerop (% count elmo-nntp-header-fetch-chop-length))) (accept-process-output (elmo-network-session-process-internal session) 1) (discard-input) (while (progn (goto-char last-point) ;; Count replies. (while (elmo-nntp-next-result-arrived-p) (setq last-point (point)) (setq received (1+ received))) (< received count)) (elmo-progress-notify 'elmo-retrieve-header :set received) (accept-process-output (elmo-network-session-process-internal session) 1) (discard-input))))) ;; Replace all CRLF with LF. (elmo-delete-cr-buffer) (copy-to-buffer outbuf (point-min) (point-max))))) ;; end of from Gnus (defun elmo-nntp-msgdb-create-message (len flag-table) (save-excursion (let ((new-msgdb (elmo-make-msgdb)) beg entity num message-id) (set-buffer-multibyte nil) (goto-char (point-min)) (elmo-with-progress-display (elmo-folder-msgdb-create len) "Creating msgdb" (while (not (eobp)) (setq beg (save-excursion (forward-line) (point))) (setq num (and (looking-at "^2[0-9]*[ ]+\\([0-9]+\\)") (string-to-number (match-string-no-properties 1)))) (elmo-nntp-next-result-arrived-p) (when num (save-excursion (forward-line -1) (save-restriction (narrow-to-region beg (point)) (setq entity (elmo-msgdb-create-message-entity-from-header (elmo-msgdb-message-entity-handler new-msgdb) num)) (when entity (setq message-id (elmo-message-entity-field entity 'message-id)) (elmo-msgdb-append-entity new-msgdb entity (elmo-flag-table-get flag-table message-id)))))) (elmo-progress-notify 'elmo-folder-msgdb-create))) new-msgdb))) (luna-define-method elmo-message-use-cache-p ((_folder elmo-nntp-folder) _number) elmo-nntp-use-cache) (defun elmo-nntp-parse-newsgroups (string &optional subscribe-only) (let ((nglist (elmo-parse string "[ \t\f\r\n,]*\\([^ \t\f\r\n,]+\\)")) ngs) (if (not subscribe-only) nglist (dolist (ng nglist) (if (intern-soft ng elmo-newsgroups-hashtb) (setq ngs (cons ng ngs)))) ngs))) ;;; Crosspost processing. ;; 1. setup crosspost alist. ;; 1.1. When message is fetched and is crossposted message, ;; it is remembered in `temp-crosses' slot. ;; temp-crosses slot is a list of cons cell: ;; (NUMBER . (MESSAGE-ID (LIST-OF-NEWSGROUPS) 'ng)) ;; 1.2. In elmo-folder-close, `temp-crosses' slot is cleared, ;; 1.3. In elmo-folder-flag-as-read, move crosspost entry ;; from `temp-crosses' slot to `elmo-crosspost-message-alist'. ;; 2. process crosspost alist. ;; 2.1. At elmo-folder-process-crosspost, setup `reads' slot from ;; `elmo-crosspost-message-alist'. ;; 2.2. remove crosspost entry for current newsgroup from ;; `elmo-crosspost-message-alist'. ;; 2.3. elmo-folder-list-unreads return unread message list according to ;; `reads' slot. ;; (There's a problem that if `elmo-folder-list-unreads' ;; never executed, crosspost information is thrown away.) ;; 2.4. In elmo-folder-close, `read' slot is cleared, (defun elmo-nntp-setup-crosspost-buffer (folder number) ;; 1.1. When message is fetched and is crossposted message, ;; it is remembered in `temp-crosses' slot. ;; temp-crosses slot is a list of cons cell: ;; (NUMBER . (MESSAGE-ID (LIST-OF-NEWSGROUPS) 'ng)) (let (newsgroups crosspost-newsgroups message-id) (save-restriction (std11-narrow-to-header) (setq newsgroups (std11-fetch-field "newsgroups") message-id (elmo-get-message-id-from-header 'none))) (when newsgroups (when (setq crosspost-newsgroups (delete (elmo-nntp-folder-group-internal folder) (elmo-nntp-parse-newsgroups newsgroups t))) (unless (assq number (elmo-nntp-folder-temp-crosses-internal folder)) (elmo-nntp-folder-set-temp-crosses-internal folder (cons (cons number (list message-id crosspost-newsgroups 'ng)) (elmo-nntp-folder-temp-crosses-internal folder)))))))) (luna-define-method elmo-folder-close-internal ((folder elmo-nntp-folder)) ;; 1.2. In elmo-folder-close, `temp-crosses' slot is cleared, (elmo-nntp-folder-set-temp-crosses-internal folder nil) (elmo-nntp-folder-set-reads-internal folder nil)) (defun elmo-nntp-folder-update-crosspost-message-alist (folder numbers) ;; 1.3. In elmo-folder-flag-as-read, move crosspost entry ;; from `temp-crosses' slot to `elmo-crosspost-message-alist'. (let (elem) (dolist (number numbers) (when (setq elem (assq number (elmo-nntp-folder-temp-crosses-internal folder))) (unless (assoc (cdr (cdr elem)) elmo-crosspost-message-alist) (setq elmo-crosspost-message-alist (cons (cdr elem) elmo-crosspost-message-alist))) (elmo-nntp-folder-set-temp-crosses-internal folder (delq elem (elmo-nntp-folder-temp-crosses-internal folder))))))) (luna-define-method elmo-folder-set-flag :before ((folder elmo-nntp-folder) numbers flag &optional _is-local) (when (eq flag 'read) (elmo-nntp-folder-update-crosspost-message-alist folder numbers))) (luna-define-method elmo-folder-unset-flag :before ((folder elmo-nntp-folder) numbers flag &optional _is-local) (when (eq flag 'unread) (elmo-nntp-folder-update-crosspost-message-alist folder numbers))) (defsubst elmo-nntp-folder-process-crosspost (folder) ;; 2.1. At elmo-folder-process-crosspost, setup `reads' slot from ;; `elmo-crosspost-message-alist'. ;; 2.2. remove crosspost entry for current newsgroup from ;; `elmo-crosspost-message-alist'. (let (cross-deletes reads entity ngs) (dolist (cross elmo-crosspost-message-alist) (when (setq entity (elmo-message-entity folder (nth 0 cross))) (setq reads (cons (elmo-message-entity-number entity) reads))) (when entity (if (setq ngs (delete (elmo-nntp-folder-group-internal folder) (nth 1 cross))) (setcar (cdr cross) ngs) (setq cross-deletes (cons cross cross-deletes))) (setq elmo-crosspost-message-alist-modified t))) (dolist (dele cross-deletes) (setq elmo-crosspost-message-alist (delq dele elmo-crosspost-message-alist))) (elmo-nntp-folder-set-reads-internal folder reads))) (luna-define-method elmo-folder-process-crosspost ((folder elmo-nntp-folder)) (elmo-nntp-folder-process-crosspost folder)) (luna-define-method elmo-folder-list-flagged :around ((folder elmo-nntp-folder) flag &optional in-msgdb) ;; 2.3. elmo-folder-list-unreads return unread message list according to ;; `reads' slot. (let ((msgs (luna-call-next-method))) (if in-msgdb msgs (cl-case flag (unread (elmo-living-messages msgs (elmo-nntp-folder-reads-internal folder))) ;; Should consider read, digest and any flag? (otherwise msgs))))) (require 'product) (product-provide (provide 'elmo-nntp) (require 'elmo-version)) ;;; elmo-nntp.el ends here wanderlust-wanderlust-769699d/elmo/elmo-null.el000066400000000000000000000052621406661363500215740ustar00rootroot00000000000000;;; elmo-null.el --- /dev/null Folder Interface for ELMO. -*- lexical-binding: t -*- ;; Copyright (C) 2005 Yuuichi Teranishi ;; Author: Hiroya Murata ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'elmo) (require 'elmo-nntp) (eval-and-compile (luna-define-class elmo-null-folder (elmo-folder))) (luna-define-method elmo-folder-initialize ((folder elmo-null-folder) _name) folder) (luna-define-method elmo-folder-expand-msgdb-path ((_folder elmo-null-folder)) (expand-file-name "null" (expand-file-name "internal" elmo-msgdb-directory))) (luna-define-method elmo-folder-open ((_folder elmo-null-folder) &optional _load-msgdb)) (luna-define-method elmo-folder-commit ((_folder elmo-null-folder))) (luna-define-method elmo-folder-diff ((_folder elmo-null-folder)) '(0 . 0)) (luna-define-method elmo-folder-list-messages ((_folder elmo-null-folder) &optional _visible-only _in-msgdb) nil) (luna-define-method elmo-folder-list-flagged ((_folder elmo-null-folder) _flag &optional _in-msgdb) nil) (luna-define-method elmo-folder-count-flags ((_folder elmo-null-folder)) nil) (luna-define-method elmo-folder-have-subfolder-p ((_folder elmo-null-folder)) nil) (luna-define-method elmo-folder-exists-p ((_folder elmo-null-folder)) t) (luna-define-method elmo-folder-writable-p ((_folder elmo-null-folder)) t) (defun elmo-folder-append-messages-*-null (_dst-folder _src-folder numbers _same-number) (elmo-progress-notify 'elmo-folder-move-messages (length numbers)) numbers) (luna-define-method elmo-folder-synchronize ((_folder elmo-null-folder) &optional _disable-killed _ignore-msgdb _no-check _mask) nil) (require 'product) (product-provide (provide 'elmo-null) (require 'elmo-version)) ;;; elmo-null.el.el ends here wanderlust-wanderlust-769699d/elmo/elmo-passwd.el000066400000000000000000000233601406661363500221220ustar00rootroot00000000000000;;; elmo-passwd.el --- ELMO password manager. -*- lexical-binding: t -*- ;; Copyright (C) 2017 Kazuhiro Ito ;; Author: Kazuhiro Ito ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'luna) (require 'elmo-vars) (require 'elmo-util) (defgroup elmo-passwd nil "ELMO password manager settings." :prefix "elmo-passwd-" :group 'elmo) (defcustom elmo-passwd-life-time nil "*Duration of ELMO Password in seconds. nil means infinity." :type '(choice (const :tag "Infinity" nil) number) :group 'elmo-passwd) (defcustom elmo-passwd-confirm-before-clear nil "Confirm whether save passwords before clear password storage." :type 'boolean :group 'elmo-passwd) (eval-and-compile (luna-define-class elmo-passwd () (timers)) (luna-define-internal-accessors 'elmo-passwd)) (luna-define-generic elmo-passwd-load (elmo-passwd) "Load password storage.") (luna-define-generic elmo-passwd-clear (elmo-passwd) "Clear password storage.") (luna-define-generic elmo-passwd-save (elmo-passwd) "Save passwords into storage.") (luna-define-generic elmo-passwd-get (elmo-passwd key) "Get password for KEY. KEY is a list of protocol-name, username, authentication mechanism, host name and port number.") (luna-define-generic elmo-passwd-remove (elmo-passwd key) "Remove password for KEY from cache.") (luna-define-generic elmo-passwd-modified-p (elmo-passwd) "Return non-nil if storage is modified.") (luna-define-generic elmo-passwd-add-timer (elmo-passwd key) "Add removing timer for KEY. When `elmo-passwd-life-time' is nil, do nothing.") (luna-define-generic elmo-passwd-remove-timer (elmo-passwd key) "Remove removing timer for KEY. It is used to remove executed timer function.") (luna-define-generic elmo-passwd-clear-timers (elmo-passwd) "Remove all removing timers for ELMO-PASSWD.") (luna-define-method elmo-passwd-clear ((passwd elmo-passwd)) (elmo-passwd-clear-timers passwd) (when (and elmo-passwd-confirm-before-clear (elmo-passwd-modified-p passwd) (y-or-n-p "Save password storage? ")) (elmo-passwd-save passwd))) (luna-define-method elmo-passwd-modified-p ((_passwd elmo-passwd)) nil) (luna-define-method elmo-passwd-remove-timer ((passwd elmo-passwd) key) (let* ((timers (elmo-passwd-timers-internal passwd)) (elt (assoc key timers))) (elmo-passwd-set-timers-internal passwd (delq elt timers)))) (luna-define-method elmo-passwd-add-timer ((passwd elmo-passwd) key) (when elmo-passwd-life-time (elmo-passwd-set-timers-internal passwd (cons (cons key (run-with-timer elmo-passwd-life-time nil #'(lambda (passwd key) (elmo-passwd-remove passwd key) (elmo-passwd-remove-timer passwd key)) passwd key)) (elmo-passwd-timers-internal passwd))))) (luna-define-method elmo-passwd-clear-timers ((passwd elmo-passwd)) (dolist (elt (elmo-passwd-timers-internal passwd)) (cancel-timer (cdr elt))) (elmo-passwd-set-timers-internal passwd nil)) ;; elmo built-in password storage. (defcustom elmo-passwd-alist-file-name "passwd" "*ELMO Password filename." :type 'string :group 'elmo-passwd) (defcustom elmo-passwd-alist-ignore-smtp-port t "When non-nil, share SMTP password between the same host with different ports." :type 'boolean :group 'elmo-passwd) (eval-and-compile (luna-define-class elmo-passwd-alist (elmo-passwd) (filename ignore-smtp-port modified alist)) (luna-define-internal-accessors 'elmo-passwd-alist)) (defun elmo-passwd-alist-generate-key (passwd key) (if (and (elmo-passwd-alist-ignore-smtp-port-internal passwd) (string= (car key) "SMTP")) (apply 'format "%s:%s/%s@%s" (nreverse (cdr (reverse key)))) (apply 'format "%s:%s/%s@%s:%d" key))) (defun elmo-passwd-alist-load-internal (passwd) (let ((filename (elmo-passwd-alist-filename-internal passwd))) (elmo-passwd-alist-set-alist-internal passwd (when (file-readable-p filename) (with-temp-buffer (insert-file-contents filename) (goto-char (point-min)) (ignore-errors (read (current-buffer)))))))) (luna-define-method initialize-instance :after ((passwd elmo-passwd-alist) &rest _init-args) (elmo-passwd-alist-set-filename-internal passwd (expand-file-name elmo-passwd-alist-file-name elmo-msgdb-directory)) (elmo-passwd-alist-set-ignore-smtp-port-internal passwd elmo-passwd-alist-ignore-smtp-port) (elmo-passwd-alist-load-internal passwd) passwd) (luna-define-method elmo-passwd-load ((passwd elmo-passwd-alist)) (elmo-passwd-alist-load-internal passwd) (elmo-passwd-alist-set-modified-internal passwd nil)) (luna-define-method elmo-passwd-clear :after ((passwd elmo-passwd-alist)) (let ((alist (elmo-passwd-alist-alist-internal passwd))) (dolist (pair alist) (when (stringp (cdr-safe pair)) (clear-string (cdr pair))))) (elmo-passwd-alist-set-alist-internal passwd nil) (elmo-passwd-alist-set-modified-internal passwd nil)) (luna-define-method elmo-passwd-save ((passwd elmo-passwd-alist)) (with-temp-buffer (let ((filename (elmo-passwd-alist-filename-internal passwd)) print-length print-level) (prin1 (elmo-passwd-alist-alist-internal passwd) (current-buffer)) (princ "\n" (current-buffer)) (if (file-writable-p filename) (progn (write-region (point-min) (point-max) filename nil 'no-msg) (set-file-modes filename 384)) (message "%s is not writable." filename)))) (elmo-passwd-alist-set-modified-internal passwd nil)) (luna-define-method elmo-passwd-get ((passwd elmo-passwd-alist) key) ;; protocol-name, user, auth-method, server, port (let ((key-string (elmo-passwd-alist-generate-key passwd key)) (alist (elmo-passwd-alist-alist-internal passwd)) pair pass) (unless alist (elmo-passwd-load passwd) (setq alist (elmo-passwd-alist-alist-internal passwd))) (setq pair (assoc key-string alist)) (if pair (elmo-base64-decode-string (cdr pair)) (setq pass (read-passwd (format "Password for %s: " key-string))) ;; put key and passwd at the front of the alist (elmo-passwd-alist-set-alist-internal passwd (cons (cons key-string (elmo-base64-encode-string pass)) alist)) (elmo-passwd-alist-set-modified-internal passwd t) (elmo-passwd-add-timer passwd key) pass))) (luna-define-method elmo-passwd-remove ((passwd elmo-passwd-alist) key) ;; protocol-name, user, auth-method, server, port (let ((key (elmo-passwd-alist-generate-key passwd key)) (alist (elmo-passwd-alist-alist-internal passwd)) pass-cons) (while (setq pass-cons (assoc key alist)) (unwind-protect (clear-string (cdr pass-cons)) (elmo-passwd-alist-set-alist-internal passwd (setq alist (delete pass-cons alist))) (elmo-passwd-alist-set-modified-internal passwd t))))) (luna-define-method elmo-passwd-modified-p ((passwd elmo-passwd-alist)) (elmo-passwd-alist-modified-internal passwd)) ;; auth-source (eval-and-compile (luna-define-class elmo-passwd-auth-source (elmo-passwd) (savers)) (luna-define-internal-accessors 'elmo-passwd-auth-source)) (luna-define-method initialize-instance :after ((passwd elmo-passwd-auth-source) &rest _init-args) passwd) (luna-define-method elmo-passwd-clear :after ((passwd elmo-passwd-auth-source)) (elmo-passwd-auth-source-set-savers-internal passwd nil)) (luna-define-method elmo-passwd-save ((passwd elmo-passwd-auth-source)) (dolist (elt (nreverse (elmo-passwd-auth-source-savers-internal passwd))) (when (functionp (cdr elt)) (condition-case nil (funcall (cdr elt))))) (elmo-passwd-auth-source-set-savers-internal passwd nil)) (autoload 'auth-source-search "auth-source") (luna-define-method elmo-passwd-get ((passwd elmo-passwd-auth-source) key) (require 'auth-source) (defvar auth-source-creation-prompts) (let* ((auth-source-creation-prompts `((secret . ,(format "%s password for %%u@%%h:%%p? " (car key))))) source secret) (setq source (car (auth-source-search :host (nth 3 key) :port (nth 4 key) :user (nth 1 key) :require '(:secret) :create t))) (when (functionp (plist-get source :save-function)) (elmo-passwd-auth-source-set-savers-internal passwd (cons (cons key (plist-get source :save-function)) (elmo-passwd-auth-source-savers-internal passwd))) (elmo-passwd-add-timer passwd key)) (setq secret (plist-get source :secret)) (if (functionp secret) (funcall secret) secret))) (autoload 'auth-source-forget+ "auth-source") (luna-define-method elmo-passwd-remove ((passwd elmo-passwd-auth-source) key) (auth-source-forget+ :host (nth 3 key) :port (nth 4 key) :user (nth 1 key)) (let ((savers (elmo-passwd-auth-source-savers-internal passwd))) (elmo-passwd-auth-source-set-savers-internal passwd (delq (assoc key savers) savers)))) (luna-define-method elmo-passwd-modified-p ((passwd elmo-passwd-auth-source)) (elmo-passwd-auth-source-savers-internal passwd)) (provide 'elmo-passwd) ;;; elmo-passwd.el ends here wanderlust-wanderlust-769699d/elmo/elmo-pipe.el000066400000000000000000000405531406661363500215610ustar00rootroot00000000000000;;; elmo-pipe.el --- PIPE Interface for ELMO. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Author: Yuuichi Teranishi ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'elmo) (require 'elmo-signal) (defvar elmo-pipe-folder-copied-filename "copied" "Copied messages number set.") ;;; ELMO pipe folder (eval-and-compile (luna-define-class elmo-pipe-folder (elmo-folder) (src dst copy)) (luna-define-internal-accessors 'elmo-pipe-folder)) (luna-define-method elmo-folder-initialize ((folder elmo-pipe-folder) name) (when (string-match "^\\([^|]*\\)|\\(:?\\)\\(.*\\)$" name) ;; elmo-get-folder might overwrite our match data (let ((src (match-string 1 name)) (dst (match-string 3 name)) (copy (string= ":" (match-string 2 name)))) (elmo-pipe-folder-set-src-internal folder (elmo-get-folder src)) (elmo-pipe-folder-set-dst-internal folder (elmo-get-folder dst)) (elmo-pipe-folder-set-copy-internal folder copy))) (elmo-pipe-connect-signals folder (elmo-pipe-folder-dst-internal folder)) folder) (defun elmo-pipe-connect-signals (folder destination) (elmo-connect-signal destination 'flag-changing folder (elmo-define-signal-handler (folder _dst number old-flags new-flags) (elmo-emit-signal 'flag-changing folder number old-flags new-flags))) (elmo-connect-signal destination 'flag-changed folder (elmo-define-signal-handler (folder _dst numbers) (elmo-emit-signal 'flag-changed folder numbers))) (elmo-connect-signal destination 'status-changed folder (elmo-define-signal-handler (folder _dst numbers) (elmo-emit-signal 'status-changed folder numbers))) (elmo-connect-signal destination 'update-overview folder (elmo-define-signal-handler (folder _dst number) (elmo-emit-signal 'update-overview folder number)))) (luna-define-method elmo-folder-get-primitive-list ((folder elmo-pipe-folder)) (nconc (elmo-folder-get-primitive-list (elmo-pipe-folder-src-internal folder)) (elmo-folder-get-primitive-list (elmo-pipe-folder-dst-internal folder)))) (luna-define-method elmo-folder-contains-type ((folder elmo-pipe-folder) type) (or (elmo-folder-contains-type (elmo-pipe-folder-src-internal folder) type) (elmo-folder-contains-type (elmo-pipe-folder-dst-internal folder) type))) (defun elmo-folder-append-messages-pipe-* (dst-folder src-folder numbers same-number) (elmo-folder-append-messages dst-folder (elmo-pipe-folder-dst-internal src-folder) numbers same-number)) (defun elmo-folder-append-messages-*-pipe (dst-folder src-folder numbers same-number) (elmo-folder-append-messages (elmo-pipe-folder-dst-internal dst-folder) src-folder numbers same-number)) (luna-define-method elmo-folder-append-buffer ((folder elmo-pipe-folder) &optional flag number return-number) (elmo-folder-append-buffer (elmo-pipe-folder-dst-internal folder) flag number return-number)) (luna-define-method elmo-message-fetch ((folder elmo-pipe-folder) number strategy &optional unseen section) (elmo-message-fetch (elmo-pipe-folder-dst-internal folder) number strategy unseen section)) (luna-define-method elmo-folder-clear :after ((folder elmo-pipe-folder) &optional keep-killed) (unless keep-killed (elmo-pipe-folder-copied-list-save folder nil))) (luna-define-method elmo-folder-delete-messages ((folder elmo-pipe-folder) numbers) (elmo-folder-delete-messages (elmo-pipe-folder-dst-internal folder) numbers)) (luna-define-method elmo-folder-detach-messages ((folder elmo-pipe-folder) numbers) (elmo-folder-detach-messages (elmo-pipe-folder-dst-internal folder) numbers)) (defvar elmo-pipe-drained-hook nil "A hook called when the pipe is flushed.") (defsubst elmo-pipe-folder-list-target-messages (src &optional ignore-list) (let ((killed (elmo-folder-killed-list-internal src))) (elmo-folder-set-killed-list-internal src ignore-list) (unwind-protect (elmo-folder-list-messages src t) (elmo-folder-set-killed-list-internal src killed)))) (defun elmo-pipe-drain (src dst &optional copy ignore-list) "Move or copy all messages of SRC to DST." (let ((elmo-inhibit-number-mapping (and (eq (elmo-folder-type-internal src) 'pop3) (not copy)))) ; No need to use UIDL (message "Checking %s..." (elmo-folder-name-internal src)) (elmo-folder-open src) (unwind-protect (let ((msgs (elmo-pipe-folder-list-target-messages src ignore-list))) (elmo-with-progress-display (elmo-folder-move-messages (length msgs)) (if copy "Copying messages" "Moving messages") (elmo-folder-move-messages src msgs dst copy)) (when (and copy msgs) (setq ignore-list (elmo-number-set-append-list ignore-list msgs)))) (elmo-folder-close src)) (run-hooks 'elmo-pipe-drained-hook) ignore-list)) (defun elmo-pipe-folder-copied-list-load (folder) (elmo-object-load (expand-file-name elmo-pipe-folder-copied-filename (expand-file-name (elmo-replace-string-as-filename (elmo-folder-name-internal folder)) (expand-file-name "pipe" elmo-msgdb-directory))) nil t)) (defun elmo-pipe-folder-copied-list-save (folder copied-list) (elmo-object-save (expand-file-name elmo-pipe-folder-copied-filename (expand-file-name (elmo-replace-string-as-filename (elmo-folder-name-internal folder)) (expand-file-name "pipe" elmo-msgdb-directory))) copied-list)) (luna-define-method elmo-folder-msgdb ((folder elmo-pipe-folder)) (elmo-folder-msgdb (elmo-pipe-folder-dst-internal folder))) (luna-define-method elmo-folder-open-internal ((folder elmo-pipe-folder)) (elmo-folder-open-internal (elmo-pipe-folder-dst-internal folder))) (luna-define-method elmo-folder-close-internal ((folder elmo-pipe-folder)) (elmo-folder-close-internal (elmo-pipe-folder-dst-internal folder))) (luna-define-method elmo-folder-close ((folder elmo-pipe-folder)) (elmo-generic-folder-close folder) (elmo-folder-close (elmo-pipe-folder-dst-internal folder))) (luna-define-method elmo-folder-list-messages ((folder elmo-pipe-folder) &optional visible-only in-msgdb) ;; Use target folder's killed-list in the pipe folder. (elmo-folder-list-messages (elmo-pipe-folder-dst-internal folder) visible-only in-msgdb)) (luna-define-method elmo-folder-diff ((folder elmo-pipe-folder)) (elmo-folder-open-internal (elmo-pipe-folder-src-internal folder)) (elmo-folder-open-internal (elmo-pipe-folder-dst-internal folder)) (let* ((elmo-inhibit-number-mapping (not (elmo-pipe-folder-copy-internal folder))) (src-length (length (elmo-pipe-folder-list-target-messages (elmo-pipe-folder-src-internal folder) (elmo-pipe-folder-copied-list-load folder)))) (dst-diff (elmo-folder-diff (elmo-pipe-folder-dst-internal folder)))) (prog1 (cond ((consp (cdr dst-diff)) ; new unread all (mapcar (lambda (number) (+ number src-length)) dst-diff)) (t (cons (+ (or (car dst-diff) 0) src-length) (+ (or (cdr dst-diff) 0) src-length)))) ;; No save. (elmo-folder-close-internal (elmo-pipe-folder-src-internal folder)) (elmo-folder-close-internal (elmo-pipe-folder-dst-internal folder))))) (luna-define-method elmo-folder-exists-p ((folder elmo-pipe-folder)) (and (elmo-folder-exists-p (elmo-pipe-folder-src-internal folder)) (elmo-folder-exists-p (elmo-pipe-folder-dst-internal folder)))) (luna-define-method elmo-folder-expand-msgdb-path ((folder elmo-pipe-folder)) ;; Share with destination...OK? (elmo-folder-expand-msgdb-path (elmo-pipe-folder-dst-internal folder))) (luna-define-method elmo-folder-newsgroups ((folder elmo-pipe-folder)) (elmo-folder-newsgroups (elmo-pipe-folder-src-internal folder))) (luna-define-method elmo-folder-creatable-p ((folder elmo-pipe-folder)) (and (or (elmo-folder-exists-p (elmo-pipe-folder-src-internal folder)) (elmo-folder-creatable-p (elmo-pipe-folder-src-internal folder))) (or (elmo-folder-exists-p (elmo-pipe-folder-dst-internal folder)) (elmo-folder-creatable-p (elmo-pipe-folder-dst-internal folder))))) (luna-define-method elmo-folder-writable-p ((folder elmo-pipe-folder)) (elmo-folder-writable-p (elmo-pipe-folder-dst-internal folder))) (luna-define-method elmo-folder-recover-messages ((folder elmo-pipe-folder) numbers) (elmo-folder-recover-messages (elmo-pipe-folder-dst-internal folder) numbers)) (luna-define-method elmo-folder-create ((folder elmo-pipe-folder)) (if (and (not (elmo-folder-exists-p (elmo-pipe-folder-src-internal folder))) (elmo-folder-creatable-p (elmo-pipe-folder-src-internal folder))) (elmo-folder-create (elmo-pipe-folder-src-internal folder))) (if (and (not (elmo-folder-exists-p (elmo-pipe-folder-dst-internal folder))) (elmo-folder-creatable-p (elmo-pipe-folder-dst-internal folder))) (elmo-folder-create (elmo-pipe-folder-dst-internal folder)))) (luna-define-method elmo-folder-search ((folder elmo-pipe-folder) condition &optional numlist) (elmo-folder-search (elmo-pipe-folder-dst-internal folder) condition numlist)) (luna-define-method elmo-message-use-cache-p ((folder elmo-pipe-folder) number) (elmo-message-use-cache-p (elmo-pipe-folder-dst-internal folder) number)) (luna-define-method elmo-folder-check ((folder elmo-pipe-folder)) (elmo-folder-check (elmo-pipe-folder-dst-internal folder))) (luna-define-method elmo-folder-plugged-p ((folder elmo-pipe-folder)) (and (elmo-folder-plugged-p (elmo-pipe-folder-src-internal folder)) (elmo-folder-plugged-p (elmo-pipe-folder-dst-internal folder)))) (luna-define-method elmo-folder-set-plugged ((folder elmo-pipe-folder) plugged &optional add) (elmo-folder-set-plugged (elmo-pipe-folder-src-internal folder) plugged add) (elmo-folder-set-plugged (elmo-pipe-folder-dst-internal folder) plugged add)) (luna-define-method elmo-folder-message-file-p ((folder elmo-pipe-folder)) (elmo-folder-message-file-p (elmo-pipe-folder-dst-internal folder))) (luna-define-method elmo-message-file-p ((folder elmo-pipe-folder) number) (elmo-message-file-p (elmo-pipe-folder-dst-internal folder) number)) (luna-define-method elmo-message-file-name ((folder elmo-pipe-folder) number) (elmo-message-file-name (elmo-pipe-folder-dst-internal folder) number)) (luna-define-method elmo-folder-message-file-number-p ((folder elmo-pipe-folder)) (elmo-folder-message-file-number-p (elmo-pipe-folder-dst-internal folder))) (luna-define-method elmo-folder-message-file-directory ((folder elmo-pipe-folder)) (elmo-folder-message-file-directory (elmo-pipe-folder-dst-internal folder))) (luna-define-method elmo-folder-message-make-temp-file-p ((folder elmo-pipe-folder)) (elmo-folder-message-make-temp-file-p (elmo-pipe-folder-dst-internal folder))) (luna-define-method elmo-folder-message-make-temp-files ((folder elmo-pipe-folder) numbers &optional start-number) (elmo-folder-message-make-temp-files (elmo-pipe-folder-dst-internal folder) numbers start-number)) (luna-define-method elmo-folder-set-flag ((folder elmo-pipe-folder) numbers flag &optional is-local) (elmo-folder-set-flag (elmo-pipe-folder-dst-internal folder) numbers flag is-local)) (luna-define-method elmo-folder-unset-flag ((folder elmo-pipe-folder) numbers flag &optional is-local) (elmo-folder-unset-flag (elmo-pipe-folder-dst-internal folder) numbers flag is-local)) (luna-define-method elmo-folder-pack-numbers ((folder elmo-pipe-folder)) (elmo-folder-pack-numbers (elmo-pipe-folder-dst-internal folder))) (luna-define-method elmo-folder-rename ((folder elmo-pipe-folder) new-name) (let* ((new-folder (elmo-get-folder new-name))) (unless (string= (elmo-folder-name-internal (elmo-pipe-folder-src-internal folder)) (elmo-folder-name-internal (elmo-pipe-folder-src-internal new-folder))) (error "Source folder differ")) (unless (eq (elmo-folder-type-internal (elmo-pipe-folder-dst-internal folder)) (elmo-folder-type-internal (elmo-pipe-folder-dst-internal new-folder))) (error "Not same folder type")) (elmo-folder-rename (elmo-pipe-folder-dst-internal folder) (elmo-folder-name-internal (elmo-pipe-folder-dst-internal new-folder))) (elmo-global-flag-replace-referrer (elmo-folder-name-internal folder) new-name) (elmo-msgdb-rename-path folder new-folder))) (luna-define-method elmo-folder-synchronize ((folder elmo-pipe-folder) &optional disable-killed ignore-msgdb no-check mask) (let ((src-folder (elmo-pipe-folder-src-internal folder)) (dst-folder (elmo-pipe-folder-dst-internal folder))) (when (and (elmo-folder-plugged-p src-folder) (elmo-folder-plugged-p dst-folder)) (if (elmo-pipe-folder-copy-internal folder) (elmo-pipe-folder-copied-list-save folder (elmo-pipe-drain src-folder dst-folder 'copy (elmo-pipe-folder-copied-list-load folder))) (elmo-pipe-drain src-folder dst-folder)))) (elmo-folder-synchronize (elmo-pipe-folder-dst-internal folder) disable-killed ignore-msgdb no-check mask)) (luna-define-method elmo-folder-list-flagged ((folder elmo-pipe-folder) flag &optional in-msgdb) (elmo-folder-list-flagged (elmo-pipe-folder-dst-internal folder) flag in-msgdb)) (luna-define-method elmo-folder-commit ((folder elmo-pipe-folder)) (elmo-folder-commit (elmo-pipe-folder-dst-internal folder))) (luna-define-method elmo-folder-length ((folder elmo-pipe-folder)) (elmo-folder-length (elmo-pipe-folder-dst-internal folder))) (luna-define-method elmo-message-flag-available-p ((folder elmo-pipe-folder) number flag) (elmo-message-flag-available-p (elmo-pipe-folder-dst-internal folder) number flag)) (luna-define-method elmo-folder-count-flags ((folder elmo-pipe-folder)) (elmo-folder-count-flags (elmo-pipe-folder-dst-internal folder))) (luna-define-method elmo-message-flags ((folder elmo-pipe-folder) number) (elmo-message-flags (elmo-pipe-folder-dst-internal folder) number)) (luna-define-method elmo-message-field ((folder elmo-pipe-folder) number field &optional type) (elmo-message-field (elmo-pipe-folder-dst-internal folder) number field type)) (luna-define-method elmo-message-killed-p ((folder elmo-pipe-folder) number) (elmo-message-killed-p (elmo-pipe-folder-dst-internal folder) number)) (luna-define-method elmo-message-set-cached ((folder elmo-pipe-folder) number cached) (elmo-message-set-cached (elmo-pipe-folder-dst-internal folder) number cached)) (luna-define-method elmo-find-fetch-strategy ((folder elmo-pipe-folder) number &optional ignore-cache require-entireness) (elmo-find-fetch-strategy (elmo-pipe-folder-dst-internal folder) number ignore-cache require-entireness)) (luna-define-method elmo-message-number ((folder elmo-pipe-folder) message-id) (elmo-message-number (elmo-pipe-folder-dst-internal folder) message-id)) (luna-define-method elmo-message-entity ((folder elmo-pipe-folder) key) (elmo-message-entity (elmo-pipe-folder-dst-internal folder) key)) (luna-define-method elmo-message-folder ((folder elmo-pipe-folder) number) (elmo-message-folder (elmo-pipe-folder-dst-internal folder) number)) (require 'product) (product-provide (provide 'elmo-pipe) (require 'elmo-version)) ;;; elmo-pipe.el ends here wanderlust-wanderlust-769699d/elmo/elmo-pop3.el000066400000000000000000000705411406661363500215050ustar00rootroot00000000000000;;; elmo-pop3.el --- POP3 Interface for ELMO. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Copyright (C) 1999,2000 Kenichi OKADA ;; Author: Yuuichi Teranishi ;; Kenichi OKADA ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'elmo-msgdb) (require 'elmo-net) (require 'elmo-map) (require 'cl-lib) (eval-when-compile (require 'elmo-util)) (eval-and-compile (autoload 'md5 "md5")) (defcustom elmo-pop3-default-use-uidl t "If non-nil, use UIDL on POP3." :type 'boolean :group 'elmo) (defvar elmo-pop3-use-uidl-internal t "(Internal switch for using UIDL on POP3).") (defvar elmo-pop3-use-cache t "Use cache in pop3 folder.") (defvar elmo-pop3-send-command-synchronously nil "If non-nil, commands are send synchronously. If server doesn't accept asynchronous commands, this variable should be set as non-nil.") (defcustom elmo-pop3-exists-exactly nil "If non-nil, POP3 folder existence is checked everytime before the session." :type 'boolean :group 'elmo) (defconst elmo-pop3-folder-name-syntax `(([user ".+"]) (?/ [auth ".+"]) (?: [uidl "^[A-Za-z]+$"]) ,@elmo-net-folder-name-syntax)) (defvar sasl-mechanism-alist) (defvar elmo-pop3-retrieve-progress-reporter nil) ;; For debugging. (defvar elmo-pop3-debug nil "Non-nil forces POP3 folder as debug mode. Debug information is inserted in the buffer \"*POP3 DEBUG*\"") ;;; Debug (defsubst elmo-pop3-debug (message &rest args) (if elmo-pop3-debug (let ((biff (string-match "BIFF-" (buffer-name)))) (with-current-buffer (get-buffer-create (concat "*POP3 DEBUG*" (if biff "BIFF"))) (goto-char (point-max)) (insert (apply 'format message args) "\n"))))) ;;; ELMO POP3 folder (eval-and-compile (luna-define-class elmo-pop3-folder (elmo-net-folder elmo-location-map) (use-uidl)) (luna-define-internal-accessors 'elmo-pop3-folder)) (defsubst elmo-pop3-folder-use-uidl (folder) (if elmo-inhibit-number-mapping nil (elmo-pop3-folder-use-uidl-internal folder))) (luna-define-method elmo-folder-initialize ((folder elmo-pop3-folder) name) (let ((elmo-network-stream-type-alist (if elmo-pop3-stream-type-alist (append elmo-pop3-stream-type-alist elmo-network-stream-type-alist) elmo-network-stream-type-alist)) tokens auth uidl) (setq tokens (car (elmo-parse-separated-tokens name elmo-pop3-folder-name-syntax))) ;; user (elmo-net-folder-set-user-internal folder (or (cdr (assq 'user tokens)) elmo-pop3-default-user)) ;; auth (setq auth (cdr (assq 'auth tokens))) (elmo-net-folder-set-auth-internal folder (if auth (intern (downcase auth)) elmo-pop3-default-authenticate-type)) ;; uidl (setq uidl (cdr (assq 'uidl tokens))) (elmo-pop3-folder-set-use-uidl-internal folder (if uidl (string= uidl "uidl") elmo-pop3-default-use-uidl)) ;; network (elmo-net-folder-set-parameters folder tokens (list :server elmo-pop3-default-server :port elmo-pop3-default-port :stream-type (elmo-get-network-stream-type elmo-pop3-default-stream-type))) folder)) ;;; POP3 session (luna-define-class elmo-pop3-session (elmo-network-session) ()) ;; buffer-local (defvar elmo-pop3-read-point nil) (defvar elmo-pop3-number-uidl-hash nil) ; number -> uidl (defvar elmo-pop3-uidl-number-hash nil) ; uidl -> number (defvar elmo-pop3-size-hash nil) ; number -> size (defvar elmo-pop3-uidl-done nil) (defvar elmo-pop3-list-done nil) (defvar elmo-pop3-lock nil) (defvar elmo-pop3-local-variables '(elmo-pop3-read-point elmo-pop3-uidl-number-hash elmo-pop3-number-uidl-hash elmo-pop3-uidl-done elmo-pop3-size-hash elmo-pop3-list-done elmo-pop3-lock)) (luna-define-method elmo-network-close-session ((session elmo-pop3-session)) (when (elmo-network-session-process-internal session) (when (memq (process-status (elmo-network-session-process-internal session)) '(open run)) (elmo-pop3-send-command (elmo-network-session-process-internal session) "quit") ;; process is dead. (or (cdr (elmo-pop3-read-response (elmo-network-session-process-internal session) t)) (error "POP error: QUIT failed"))) (kill-buffer (process-buffer (elmo-network-session-process-internal session))) (delete-process (elmo-network-session-process-internal session)))) (defun elmo-pop3-get-session (folder &optional if-exists) "Get POP3 session for FOLDER. If IF-EXISTS is non-nil, don't get new session. If IF-EXISTS is `any-exists', get BIFF session or normal session if exists." (let ((elmo-pop3-use-uidl-internal (elmo-pop3-folder-use-uidl folder))) (prog1 (if (eq if-exists 'any-exists) (or (elmo-network-get-session 'elmo-pop3-session "POP3" folder if-exists) (elmo-network-get-session 'elmo-pop3-session "BIFF-POP3" folder if-exists)) (elmo-network-get-session 'elmo-pop3-session (concat (if (elmo-folder-biff-internal folder) "BIFF-") "POP3") folder if-exists)) ;; For saving existency. (unless (file-exists-p (elmo-folder-msgdb-path folder)) (elmo-make-directory (elmo-folder-msgdb-path folder)))))) (defun elmo-pop3-send-command (process command &optional no-erase no-log) (with-current-buffer (process-buffer process) (unless no-erase (erase-buffer)) (goto-char (point-min)) (setq elmo-pop3-read-point (point)) (elmo-pop3-debug "SEND: %s\n" (if no-log "" command)) (process-send-string process (concat command "\r\n")))) (defun elmo-pop3-read-response (process &optional not-command) "Read response and return a cons cell of \(CODE . BODY\). PROCESS is the process to read response from. If optional NOT-COMMAND is non-nil, read only the first line. CODE is one of the following: 'ok ... response is OK. 'err ... response is ERROR. 'login-delay ... user is not allowed to login until the login delay period has expired. 'in-use ... authentication was successful but the mailbox is in use." ;; buffer is in case for process is dead. (with-current-buffer (process-buffer process) (let ((response-continue t) err match-end (start elmo-pop3-read-point)) (while response-continue (setq match-end elmo-pop3-read-point) (while (null (progn (goto-char match-end) (search-forward "\r\n" nil t))) (setq match-end (max (1- (point-max)) elmo-pop3-read-point)) (accept-process-output process 1)) (setq match-end (point)) (goto-char elmo-pop3-read-point) (setq elmo-pop3-read-point match-end) (cond ((eq (following-char) ?+) (setq response-continue nil)) ((eq (following-char) ?-) (setq err (or (when (looking-at "[^ ]+ \\[\\([^]]+\\)\\]") (intern (downcase (buffer-substring (match-beginning 1) (match-end 1))))) 'err) response-continue nil start nil)) (not-command (setq response-continue nil)))) (cons (or err 'ok) (when start (elmo-delete-cr (buffer-substring start (- match-end 2)))))))) (defun elmo-pop3-process-filter (process output) (when (buffer-live-p (process-buffer process)) (with-current-buffer (process-buffer process) (goto-char (point-max)) (insert output) (elmo-pop3-debug "RECEIVED: %s\n" output) (when elmo-pop3-retrieve-progress-reporter (elmo-progress-notify 'elmo-retrieve-message :set (buffer-size)))))) (defun elmo-pop3-auth-user (session) (let ((process (elmo-network-session-process-internal session)) response) ;; try USER/PASS (elmo-pop3-send-command process (format "user %s" (elmo-network-session-user-internal session)) nil 'no-log) (setq response (elmo-pop3-read-response process t)) (unless (eq (car response) 'ok) (signal 'elmo-open-error '(elmo-pop-auth-user))) (elmo-pop3-send-command process (format "pass %s" (elmo-get-passwd (elmo-network-session-password-key session))) nil 'no-log) (setq response (elmo-pop3-read-response process t)) (cl-case (car response) (ok) (in-use (error "Maildrop is currently in use")) (login-delay (error "Not allowed to login until the login delay period has expired")) (t (signal 'elmo-authenticate-error '(elmo-pop-auth-user)))) (car response))) (defun elmo-pop3-auth-apop (session) (unless (string-match "^\\+OK .*\\(<[=!-;?-~]+@[=!-;?-~]+>\\)" (elmo-network-session-greeting-internal session)) (signal 'elmo-open-error '(elmo-pop3-auth-apop))) ;; good, APOP ready server (elmo-pop3-send-command (elmo-network-session-process-internal session) (format "apop %s %s" (elmo-network-session-user-internal session) (md5 (concat (match-string 1 (elmo-network-session-greeting-internal session)) (elmo-get-passwd (elmo-network-session-password-key session))))) nil 'no-log) (let ((response (elmo-pop3-read-response (elmo-network-session-process-internal session) t))) (cl-case (car response) (ok) (in-use (error "Maildrop is currently in use")) (login-delay (error "Not allowed to login until the login delay period has expired")) (t (signal 'elmo-authenticate-error '(elmo-pop-auth-apop)))) (car response))) (luna-define-method elmo-network-initialize-session-buffer :after ((_session elmo-pop3-session) buffer) (with-current-buffer buffer (mapcar 'make-variable-buffer-local elmo-pop3-local-variables))) (luna-define-method elmo-network-initialize-session ((session elmo-pop3-session)) (let ((process (elmo-network-session-process-internal session))) (with-current-buffer (process-buffer process) (set-process-filter process 'elmo-pop3-process-filter) (setq elmo-pop3-read-point (point-min)) ;; Skip garbage output from process before greeting. (while (and (memq (process-status process) '(open run)) (goto-char (point-max)) (forward-line -1) (not (looking-at "+OK"))) (accept-process-output process 1)) (setq elmo-pop3-read-point (point)) (or (elmo-network-session-set-greeting-internal session (cdr (elmo-pop3-read-response process t))) ; if ok, cdr is non-nil. (signal 'elmo-open-error '(elmo-network-intialize-session))) (when (memq (elmo-network-stream-type-symbol (elmo-network-session-stream-type-internal session)) elmo-network-starttls-stream-type-list) (elmo-pop3-send-command process "stls") (if (eq 'ok (car (elmo-pop3-read-response process))) (elmo-network-session-starttls-negotiate session) (signal 'elmo-open-error '(elmo-pop3-starttls-error))))))) (luna-define-method elmo-network-authenticate-session ((session elmo-pop3-session)) (with-current-buffer (process-buffer (elmo-network-session-process-internal session)) (let* ((process (elmo-network-session-process-internal session)) (auth (elmo-network-session-auth-internal session)) (auth (mapcar (lambda (mechanism) (upcase (symbol-name mechanism))) (if (listp auth) auth (list auth))))) (or (and (string= "USER" (car auth)) (elmo-pop3-auth-user session)) (and (string= "APOP" (car auth)) (elmo-pop3-auth-apop session)) (require 'sasl) (defvar sasl-mechanisms) (defvar sasl-mechanism-alist) (defvar sasl-read-passphrase) (let (sasl-mechanisms client name step response mechanism sasl-read-passphrase) (setq sasl-mechanisms (mapcar 'car sasl-mechanism-alist)) (setq mechanism (sasl-find-mechanism auth)) (unless mechanism (signal 'elmo-authenticate-error '(elmo-pop3-auth-no-mechanisms))) (setq client (sasl-make-client mechanism (elmo-network-session-user-internal session) "pop" (elmo-network-session-server-internal session))) ;;; (if elmo-pop3-auth-user-realm ;;; (sasl-client-set-property client 'realm elmo-pop3-auth-user-realm)) (setq name (sasl-mechanism-name mechanism)) (elmo-network-session-set-auth-internal session (intern (downcase name))) (setq sasl-read-passphrase (lambda (_prompt) (elmo-get-passwd (elmo-network-session-password-key session)))) (setq step (sasl-next-step client nil)) (elmo-pop3-send-command process (concat "AUTH " name (and (sasl-step-data step) (concat " " (elmo-base64-encode-string (sasl-step-data step) 'no-line-break)))) nil 'no-log) (catch 'done (while t (setq response (elmo-pop3-read-response process t)) (cl-case (car response) (ok) (in-use (error "Maildrop is currently in use")) (login-delay (error "Not allowed to login \ until the login delay period has expired")) (t (signal 'elmo-authenticate-error (list (intern (concat "elmo-pop3-auth-" (downcase name))))))) (if (sasl-next-step client step) ;; Bogus server? (signal 'elmo-authenticate-error (list (intern (concat "elmo-pop3-auth-" (downcase name))))) ;; The authentication process is finished. (throw 'done nil)) (sasl-step-set-data step (elmo-base64-decode-string (cadr (split-string response " ")))) (setq step (sasl-next-step client step)) (elmo-pop3-send-command process (if (sasl-step-data step) (elmo-base64-encode-string (sasl-step-data step) 'no-line-break) "") nil 'no-log)))))))) (luna-define-method elmo-network-setup-session ((session elmo-pop3-session)) (let ((process (elmo-network-session-process-internal session)) count response) (with-current-buffer (process-buffer process) (setq elmo-pop3-size-hash (elmo-make-hash 31)) ;; To get obarray of uidl and size (elmo-pop3-send-command process "list") (if (null (cdr (elmo-pop3-read-response process))) (error "POP LIST command failed")) (if (null (setq response (elmo-pop3-read-contents process))) (error "POP LIST command failed")) ;; POP server always returns a sequence of serial numbers. (setq count (elmo-pop3-parse-list-response response)) ;; UIDL (when elmo-pop3-use-uidl-internal (setq elmo-pop3-uidl-number-hash (elmo-make-hash (* count 2))) (setq elmo-pop3-number-uidl-hash (elmo-make-hash (* count 2))) ;; UIDL (elmo-pop3-send-command process "uidl") (unless (cdr (elmo-pop3-read-response process)) (error "POP UIDL failed")) (unless (setq response (elmo-pop3-read-contents process)) (error "POP UIDL failed")) (elmo-pop3-parse-uidl-response response))))) (defun elmo-pop3-read-contents (process) (with-current-buffer (process-buffer process) (let ((point elmo-pop3-read-point)) (while (progn (goto-char (1- point)) (null (search-forward "\n.\r\n" nil t))) (setq point (max (- (point-max) 2) ; Care of \r\n.\r[EOF] case elmo-pop3-read-point)) (accept-process-output process 1)) (elmo-delete-cr (buffer-substring elmo-pop3-read-point (- (point) 3)))))) (luna-define-method elmo-folder-expand-msgdb-path ((folder elmo-pop3-folder)) (convert-standard-filename (expand-file-name (elmo-safe-filename (elmo-net-folder-user-internal folder)) (expand-file-name (elmo-net-folder-server-internal folder) (expand-file-name "pop" elmo-msgdb-directory))))) (luna-define-method elmo-folder-exists-p ((folder elmo-pop3-folder)) (if (and elmo-pop3-exists-exactly (elmo-folder-plugged-p folder)) (save-excursion (let (elmo-auto-change-plugged ; don't change plug status. (elmo-inhibit-number-mapping t) ; No need to use uidl. session) (prog1 (setq session (elmo-pop3-get-session folder)) (if session (elmo-network-close-session session))))) (or (file-directory-p (elmo-folder-msgdb-path folder)) ;; First time. (when (elmo-folder-plugged-p folder) (let ((elmo-pop3-exists-exactly t)) (elmo-folder-exists-p folder)))))) (defun elmo-pop3-parse-uidl-response (string) (let (list) (with-temp-buffer (insert string) (goto-char (point-min)) (while (re-search-forward "^\\([0-9]+\\)[\t ]+\\([^ \n]+\\)$" nil t) (setq list (cons (cons (match-string-no-properties 1) (match-string-no-properties 2)) list)))) (setq elmo-pop3-uidl-done t) (dolist (elt list (nreverse (mapcar 'cdr list))) (elmo-set-hash-val (cdr elt) (car elt) elmo-pop3-uidl-number-hash) (elmo-set-hash-val (concat "#" (car elt)) (cdr elt) elmo-pop3-number-uidl-hash)))) (defun elmo-pop3-parse-list-response (string) (let (count alist) (with-temp-buffer (insert string) (goto-char (point-min)) (while (re-search-forward "^\\([0-9]+\\)[\t ]+\\([0-9]+\\)$" nil t) (setq alist (cons (cons (match-string-no-properties 1) (match-string-no-properties 2)) alist)))) (setq count (length alist) elmo-pop3-size-hash (elmo-make-hash (* count 2)) elmo-pop3-list-done t) (dolist (elt alist count) (elmo-set-hash-val (concat "#" (car elt)) (cdr elt) elmo-pop3-size-hash)))) (defun elmo-pop3-list-location (folder) (with-current-buffer (process-buffer (elmo-network-session-process-internal (elmo-pop3-get-session folder))) (let (locations) (if elmo-pop3-uidl-done (progn (mapatoms (lambda (atom) (setq locations (cons (symbol-name atom) locations))) elmo-pop3-uidl-number-hash) (sort locations (lambda (loc1 loc2) (< (elmo-pop3-uidl-to-number loc1) (elmo-pop3-uidl-to-number loc2))))) (error "POP3: Error in UIDL"))))) (defun elmo-pop3-list-folder-by-location (folder locations) (mapcar #'car (elmo-location-map-update folder locations))) (defun elmo-pop3-list-by-uidl-subr (folder &optional nonsort) (let ((flist (elmo-pop3-list-folder-by-location folder (elmo-pop3-list-location folder)))) (if nonsort (cons (elmo-max-of-list flist) (length flist)) (sort flist '<)))) (defun elmo-pop3-list-by-list (folder) (with-current-buffer (process-buffer (elmo-network-session-process-internal (elmo-pop3-get-session folder))) (let (list) (if elmo-pop3-list-done (progn (mapatoms (lambda (atom) (setq list (cons (string-to-number (substring (symbol-name atom) 1)) list))) elmo-pop3-size-hash) (sort list '<)) (error "POP3: Error in list"))))) (defsubst elmo-pop3-folder-list-messages (folder) (if (elmo-pop3-folder-use-uidl folder) (elmo-pop3-list-by-uidl-subr folder) (elmo-pop3-list-by-list folder))) (luna-define-method elmo-folder-list-messages-plugged ((folder elmo-pop3-folder) &optional _nohide) (elmo-pop3-folder-list-messages folder)) (luna-define-method elmo-folder-status ((folder elmo-pop3-folder)) (elmo-folder-open-internal folder) (elmo-folder-check folder) (if (elmo-pop3-folder-use-uidl folder) (prog1 (elmo-pop3-list-by-uidl-subr folder 'nonsort) (elmo-folder-close-internal folder)) (let ((process (elmo-network-session-process-internal (elmo-pop3-get-session folder))) (total 0) response) (with-current-buffer (process-buffer process) (elmo-pop3-send-command process "STAT") (setq response (cdr (elmo-pop3-read-response process))) ;; response: "^\\+OK 2 7570$" (if (not (string-match "^\\+OK[ \t]*\\([0-9]*\\)" response)) (error "POP STAT command failed") (setq total (string-to-number (substring response (match-beginning 1)(match-end 1 )))) (elmo-folder-close-internal folder) (cons total total)))))) (defvar elmo-pop3-header-fetch-chop-length 200) (defsubst elmo-pop3-next-result-arrived-p () (cond ((eq (following-char) ?+) (re-search-forward "\n\\.\r?\n" nil t)) ((eq (following-char) ?-) (search-forward "\n" nil t)) (t nil))) (defun elmo-pop3-retrieve-headers (process tobuffer articles) (with-current-buffer (process-buffer process) (erase-buffer) (let ((count 0) (received 0) (last-point (point-min))) (elmo-with-progress-display (elmo-retrieve-header (length articles)) "Getting headers" ;; Send HEAD commands. (while articles (elmo-pop3-send-command process (format "top %s 0" (car articles)) 'no-erase) ;;; (accept-process-output process 1) (setq articles (cdr articles)) (setq count (1+ count)) ;; Every 200 requests we have to read the stream in ;; order to avoid deadlocks. (when (or elmo-pop3-send-command-synchronously (null articles) ;All requests have been sent. (zerop (% count elmo-pop3-header-fetch-chop-length))) (unless elmo-pop3-send-command-synchronously (accept-process-output process 1)) (discard-input) (while (progn (goto-char last-point) ;; Count replies. (while (elmo-pop3-next-result-arrived-p) (setq last-point (point)) (setq received (1+ received))) (< received count)) (elmo-progress-notify 'elmo-retrieve-header :set received) (accept-process-output process 1) ;;; (accept-process-output process) (discard-input))))) ;; Replace all CRLF with LF. (elmo-delete-cr-buffer) (copy-to-buffer tobuffer (point-min) (point-max))))) (luna-define-method elmo-folder-msgdb-create ((folder elmo-pop3-folder) numlist flag-table) (let ((process (elmo-network-session-process-internal (elmo-pop3-get-session folder)))) (with-current-buffer (process-buffer process) (elmo-pop3-msgdb-create-by-header folder process (sort numlist #'<) flag-table)))) (defun elmo-pop3-uidl-to-number (uidl) (string-to-number (elmo-get-hash-val uidl elmo-pop3-uidl-number-hash))) (defun elmo-pop3-number-to-uidl (number) (elmo-get-hash-val (format "#%d" number) elmo-pop3-number-uidl-hash)) (defun elmo-pop3-number-to-size (number) (string-to-number (elmo-get-hash-val (format "#%d" number) elmo-pop3-size-hash))) (defun elmo-pop3-msgdb-create-by-header (folder process numlist flag-table) (let ((tmp-buffer (get-buffer-create " *ELMO Overview TMP*"))) (unwind-protect (with-current-buffer (process-buffer process) (when (elmo-pop3-folder-use-uidl folder) (setq numlist (delq nil (mapcar (lambda (number) (elmo-pop3-uidl-to-number (elmo-map-message-location folder number))) numlist)))) (elmo-pop3-retrieve-headers process tmp-buffer numlist) (elmo-pop3-msgdb-create-message folder tmp-buffer process (length numlist) numlist flag-table)) (kill-buffer tmp-buffer)))) (defun elmo-pop3-msgdb-create-message (folder buffer process num numlist flag-table) (save-excursion (let ((new-msgdb (elmo-make-msgdb)) beg entity number message-id flags) (set-buffer buffer) (set-buffer-multibyte t) (goto-char (point-min)) (elmo-with-progress-display (elmo-folder-msgdb-create num) "Creating msgdb" (while (not (eobp)) (setq beg (save-excursion (forward-line) (point))) (elmo-pop3-next-result-arrived-p) (save-excursion (forward-line -1) (save-restriction (narrow-to-region beg (point)) (setq entity (elmo-msgdb-create-message-entity-from-header (elmo-msgdb-message-entity-handler new-msgdb) (car numlist))) (setq numlist (cdr numlist)) (when entity (with-current-buffer (process-buffer process) (elmo-message-entity-set-field entity 'size (elmo-pop3-number-to-size (elmo-message-entity-number entity))) (when (setq number (elmo-map-message-number folder (elmo-pop3-number-to-uidl (elmo-message-entity-number entity)))) (elmo-message-entity-set-number entity number))) (setq message-id (elmo-message-entity-field entity 'message-id) flags (elmo-flag-table-get flag-table message-id)) (elmo-global-flags-set flags folder number message-id) (elmo-msgdb-append-entity new-msgdb entity flags)))) (elmo-progress-notify 'elmo-folder-msgdb-create))) new-msgdb))) (defun elmo-pop3-read-body (process outbuf) (with-current-buffer (process-buffer process) (let ((point elmo-pop3-read-point) (read-point elmo-pop3-read-point)) (while (and (goto-char (1- point)) (null (search-forward "\n.\r\n" nil t))) (setq point (max (- (point-max) 2) elmo-pop3-read-point)) (accept-process-output process 1)) (setq point (point)) (set-buffer outbuf) (erase-buffer) (insert-buffer-substring (process-buffer process) read-point (- point 3)))) t) (luna-define-method elmo-folder-open-internal ((folder elmo-pop3-folder)) (unless (elmo-location-map-alist folder) (when (elmo-pop3-folder-use-uidl folder) (elmo-location-map-load folder (elmo-folder-msgdb-path folder))))) (luna-define-method elmo-folder-commit :after ((folder elmo-pop3-folder)) (when (and (not elmo-inhibit-number-mapping) (elmo-folder-persistent-p folder)) (elmo-location-map-save folder (elmo-folder-msgdb-path folder)))) (luna-define-method elmo-folder-close-internal ((folder elmo-pop3-folder)) (elmo-location-map-teardown folder) ;; Just close connection (elmo-folder-check folder)) (luna-define-method elmo-message-fetch-plugged ((folder elmo-pop3-folder) number _strategy &optional _section outbuf _unseen) (let ((process (elmo-network-session-process-internal (elmo-pop3-get-session folder))) size response) (with-current-buffer (process-buffer process) (when (elmo-pop3-folder-use-uidl folder) (setq number (elmo-pop3-uidl-to-number (elmo-map-message-location folder number)))) (setq size (elmo-pop3-number-to-size number)) (when number (elmo-with-progress-display (elmo-retrieve-message size elmo-pop3-retrieve-progress-reporter) "Retrieving" (elmo-pop3-send-command process (format "retr %s" number)) (when (null (setq response (cdr (elmo-pop3-read-response process t)))) (error "Fetching message failed")) (setq response (elmo-pop3-read-body process outbuf))) (set-buffer outbuf) (goto-char (point-min)) (while (re-search-forward "^\\." nil t) (replace-match "") (forward-line)) (elmo-delete-cr-buffer) response)))) (defun elmo-pop3-delete-msg (process number) (unless number (error "Deleting message failed")) (elmo-pop3-send-command process (format "dele %s" number)) (when (null (cdr (elmo-pop3-read-response process t))) (error "Deleting message failed"))) (luna-define-method elmo-folder-delete-messages-plugged ((folder elmo-pop3-folder) msgs) (let ((process (elmo-network-session-process-internal (elmo-pop3-get-session folder)))) (with-current-buffer (process-buffer process) (dolist (number (if (elmo-pop3-folder-use-uidl folder) (mapcar (lambda (number) (elmo-pop3-uidl-to-number (elmo-map-message-location folder number))) msgs) msgs)) (elmo-pop3-delete-msg process number)) t))) (luna-define-method elmo-message-use-cache-p ((_folder elmo-pop3-folder) _number) elmo-pop3-use-cache) (luna-define-method elmo-folder-persistent-p ((folder elmo-pop3-folder)) (and (elmo-folder-persistent-internal folder) (elmo-pop3-folder-use-uidl-internal folder))) (luna-define-method elmo-folder-clear :around ((folder elmo-pop3-folder) &optional keep-killed) (unless keep-killed (elmo-location-map-setup folder)) (luna-call-next-method)) (luna-define-method elmo-folder-check ((folder elmo-pop3-folder)) (if (elmo-folder-plugged-p folder) (let ((session (elmo-pop3-get-session folder 'if-exists))) (when session (elmo-network-close-session session))))) (require 'product) (product-provide (provide 'elmo-pop3) (require 'elmo-version)) ;;; elmo-pop3.el ends here wanderlust-wanderlust-769699d/elmo/elmo-rss.el000066400000000000000000000501401406661363500214240ustar00rootroot00000000000000;;; elmo-rss --- RSS, Atom and OPML support for Wanderlust -*- lexical-binding: t -*- ;;; Copyright (c) 2014, 2015 Juliusz Chroboczek ;; Author: Juliusz Chroboczek ;; Keywords: Wanderlust ;; Version: 0.1 ;;; 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 ;;; of the License, 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: ;; ;; An Atom or RSS feed appears as a folder in Wanderlust: ;; ;; m a rss:https://github.com/wanderlust/wanderlust/commits/master.atom ;; ;; In order to cache previously downloaded messages, use a pipe folder: ;; ;; m a |rss:http://lwn.net/headlines/newrss|+lwn ;; ;; An Atom, RSS or OPML feed can be used for an access group: ;; ;; m A rss:http://planet.gnome.org/atom.xml ;; ;; ;; We don't do XML namespaces right -- we simply compare the tag prefixes ;; against a well-known list, rather than doing the whole binding dance. ;; If you use inhabitual prefixes in your feed, you deserve what you get. ;;; Code: (require 'elmo) (require 'elmo-map) (require 'url) (require 'xml) (eval-and-compile (luna-define-class elmo-rss-folder (elmo-map-folder) (url downloaded entries children)) (luna-define-internal-accessors 'elmo-rss-folder)) (defcustom elmo-rss-use-raw-utf8-in-headers nil "*Whether to use raw UTF-8 in headers of RSS messages. Setting this to true will annoy the pedants." :type 'boolean :group 'elmo) (defun elmo-rss-id-to-message-id (id url) "Convert an Atom/RSS id into something suitable for use as a Message-ID." (let* ((host (or (ignore-errors (url-host (url-generic-parse-url url))) "unknown")) ;; this should probably be improved in order to generate readable ;; IDs more often. (id* (if (string-match "\\`tag:\\(.*\\)\\'" id) (match-string 1 id) id)) (msg-id (concat "<" id* "@" host ">"))) (if (std11-parse-msg-id-string msg-id) msg-id (concat "<" (sha1 id) "@" host ">")))) (defun elmo-rss-parse-iso-timeoffset (string) (cond ((null string) nil) ((equal string "Z") '(0 "utc")) ((string-match "\\`[+-]\\([0-9]+\\):\\([0-9]+\\)\\'" string) (list (* (if (eql (aref string 0) ?-) -1 1) (+ (* 3600 (string-to-number (match-string 1 string))) (* 60 (string-to-number (match-string 2 string))))) nil)) (t nil))) (defun elmo-rss-parse-iso-date (string) "Convert a date in ISO 8601 format into Internet Mail format." (and string (and (string-match ;; Ugh. "\\`\\([0-9]+\\)-\\([0-9]+\\)-\\([0-9]+\\)t\\([0-9]+\\):\\([0-9]+\\):\\([0-9]+\\)\.?[0-9]*\\([z+-][0-9:]*\\)?\\'" string) (ignore-errors (timezone-make-arpa-date (string-to-number (match-string 1 string)) (string-to-number (match-string 2 string)) (string-to-number (match-string 3 string)) (format "%s:%s:%s" (match-string 4 string) (match-string 5 string) (match-string 6 string)) (elmo-rss-parse-iso-timeoffset (match-string 7 string))))))) (defun elmo-rss-utf-8 (string) "Decode string into UTF-8. String may be nil." (and string (decode-coding-string string 'utf-8 t))) (defun elmo-rss-whitespace-p (string) (and (stringp string) (string-match "\\`[ \t\n]*\\'" string))) ;; Emacs' XML library preserves whitespace, which it is then unable to ;; format properly. This partly works around the issue. (defun elmo-rss-trim-xml (xml) (when (consp xml) (when (elmo-rss-whitespace-p (car xml)) (setq xml (cdr xml))) (when (elmo-rss-whitespace-p (car (last xml))) (setq xml (butlast xml)))) xml) (defun elmo-rss-format-string (xml) (setq xml (elmo-rss-trim-xml xml)) (let ((string (cond ((atom xml) xml) ((null (cdr xml)) (car xml))))) (if (stringp string) string ;; This should not happen, but let's be defensive against the case ;; when somebody puts XML nodes within HTML content. (format "%s" string)))) (defun elmo-rss-format-xml (xml) (setq xml (elmo-rss-trim-xml xml)) (with-temp-buffer (condition-case nil (xml-print xml) (error (message "Unable to format XML parse tree") (insert (format "%s" xml)))) (buffer-substring (point-min) (point-max)))) (defun elmo-rss-atom-link-interesting (node &optional kind) (and (consp node) (member (xml-node-name node) '(link atom10:link)) (not (equal (xml-get-attribute-or-nil node 'href) "")) (member (xml-get-attribute-or-nil node 'type) '("application/atom+xml" "application/rss+xml")) (member (xml-get-attribute-or-nil node 'rel) (if kind (list kind) '("self" "related" "replies"))))) (defun elmo-rss-atom-link-web (node) (and (consp node) (member (xml-node-name node) '(link atom10:link)) (not (equal (xml-get-attribute-or-nil node 'href) "")) (not (member (xml-get-attribute-or-nil node 'type) '("application/atom+xml" "application/rss+xml"))) (member (xml-get-attribute-or-nil node 'rel) '(nil "alternate" "enclosure")))) (defun elmo-rss-parse-atom-entry (body &optional _url) "Parse one Atom entry." (let (id published updated author title in-reply-to links content summary urls) (dolist (node body) (when (consp node) (let ((name (xml-node-name node)) (child (car (xml-node-children node)))) (cond ((eq name 'id) (setq id child)) ((eq name 'published) (setq published child)) ((eq name 'updated) (setq updated child)) ((eq name 'author) (setq author node)) ((eq name 'title) (setq title child)) ((eq name 'thr:in-reply-to) (let ((ref (xml-get-attribute-or-nil node 'ref))) (when ref (push ref in-reply-to)))) ((eq name 'link) (cond ((elmo-rss-atom-link-interesting node) (push (xml-get-attribute node 'href) urls)) ((elmo-rss-atom-link-web node) (push (xml-get-attribute node 'href) links)))) ((eq name 'source) (dolist (child (xml-node-children node)) (when (elmo-rss-atom-link-interesting child "self") (push (xml-get-attribute child 'href) urls)))) ((eq name 'content) (setq content node)) ((eq name 'summary) (setq summary node)))))) (let* ((date (or (elmo-rss-parse-iso-date updated) (elmo-rss-parse-iso-date published))) (author-name (and author (car (xml-node-children (assoc 'name (xml-node-children author)))))) (author-email (and author (car (xml-node-children (assoc 'email (xml-node-children author)))))) (content* (or content summary)) (content-type (and content* (xml-get-attribute-or-nil content* 'type))) (mime-content-type (cond ((null content-type) "text/plain") ((member content-type '("html" "xhtml")) "text/html") ;; This is incorrect, we should be checking for XML and ;; doing the Base64 dance otherwise. ((string-match "/" content-type) content-type) (t "text/plain"))) (content-body (if (equal "xhtml" content-type) (elmo-rss-format-xml (xml-node-children content*)) (elmo-rss-format-string (xml-node-children content*))))) (list (list ;; id is compulsory in Atom, but I'm paranoid. (or id (sha1 (concat date "-" title "-" (car links)))) date (cond ((and author-name author-email) (concat (elmo-rss-utf-8 author-name) " <" author-email ">")) (author-name (elmo-rss-utf-8 author-name)) (author-email author-email)) (elmo-rss-utf-8 title) (nreverse in-reply-to) (nreverse links) mime-content-type content-body) urls)))) (defun elmo-rss-parse-atom (feed &optional url) "Parse an Atom feed, return a list of entries." (let ((children (xml-node-children feed)) (entries nil) (urls nil) (extra-urls nil)) (dolist (node children) (when (listp node) (cond ((eql 'link (xml-node-name node)) (when (elmo-rss-atom-link-interesting node) (push (xml-get-attribute node 'href) urls))) ((eql 'entry (xml-node-name node)) (let ((parse (elmo-rss-parse-atom-entry (xml-node-children node) url))) (when (car parse) (push (car parse) entries)) (dolist (u (cadr parse)) (push u extra-urls))))))) ;; feeds are in reverse chronological order, we've reversed them already (list entries (nconc (nreverse urls) extra-urls)))) (defun elmo-rss-parse-rss-entry (body &optional _url) "Parse one RSS entry." (let (guid pubdate dc-date author dc-creator title links content-encoded description urls) (dolist (node body) (when (consp node) (let ((name (xml-node-name node)) (child (car (xml-node-children node)))) (cond ((eq name 'guid) (setq guid child)) ((eq name 'pubDate) (setq pubdate child)) ((eq name 'dc:date) (setq dc-date child)) ((eq name 'author) (setq author child)) ((eq name 'dc:creator) (setq dc-creator child)) ((eq name 'title) (setq title child)) ((eq name 'link) (push child links)) ((eq name 'enclosure) (when (not (equal (xml-get-attribute node 'url) "")) (push (xml-get-attribute node 'url) links))) ((eq name 'source) (when (not (equal (xml-get-attribute node 'url) "")) (push (xml-get-attribute node 'url) urls))) ((eq name 'wfw:commentRss) (push child urls)) ((eq name 'content:encoded) (setq content-encoded child)) ((eq name 'description) (setq description child)))))) (let ((date (or pubdate (elmo-rss-parse-iso-date dc-date)))) (list (list ;; guid is optional in RSS. (or guid (sha1 (concat date "-" title "-" (car links)))) date (elmo-rss-utf-8 (or author dc-creator)) (elmo-rss-utf-8 title) nil (nreverse links) "text/html" (or content-encoded description)) urls)))) (defun elmo-rss-parse-rss (channel &optional container url) "Parse an RSS feed, return a list of entries." (let ((children (append (xml-node-children channel) (and container (xml-node-children container)))) (entries nil) (urls nil) (extra-urls nil)) (dolist (node children) (when (listp node) (cond ((eql 'atom10:link (xml-node-name node)) (when (elmo-rss-atom-link-interesting node) (push (xml-get-attribute node 'href) urls))) ((eql 'item (xml-node-name node)) (let ((parse (elmo-rss-parse-rss-entry (xml-node-children node) url))) (when (car parse) (push (car parse) entries)) (dolist (u (cadr parse)) (push u extra-urls))))))) (list entries (nconc (nreverse urls) extra-urls)))) (defun elmo-rss-parse-opml (body &optional _url) (let ((children (xml-node-children body)) (urls nil)) (dolist (child children) (when (and (listp child) (eql 'outline (xml-node-name child))) (when (equal "rss" (xml-get-attribute-or-nil child 'type)) (let ((url (xml-get-attribute-or-nil child 'xmlUrl))) (when url (push url urls)))) (dolist (url* (cadr (elmo-rss-parse-opml child))) (push url* urls)))) (list nil (nreverse urls)))) (defun elmo-rss-parse (body &optional url) "Parse a feed (Atom or RSS), return a list of entries." (let* ((feed (assoc 'feed body)) (entry (assoc 'entry body)) (rss (assoc 'rss body)) (rdf (assoc 'rdf:RDF body)) (channel (and (or rss rdf) (assoc 'channel (xml-node-children (or rss rdf))))) (opml (assoc 'opml body)) (opml-body (and opml (assoc 'body (xml-node-children opml))))) (cond ;; Atom feed (feed (elmo-rss-parse-atom feed url)) ;; RSS feed ((and rss channel) (elmo-rss-parse-rss channel nil url)) ((and rdf channel) (elmo-rss-parse-rss channel rdf url)) ;; Single Atom entry (entry (elmo-rss-parse-atom (cons 'feed (cons nil (list entry))))) ;; OPML outline (opml-body (elmo-rss-parse-opml opml-body url)) (t (error "Couldn't find Atom, RSS or OPML at %s." url))))) (defun elmo-rss-download (folder) "Download the RSS feed and parse it." (let* ((url (elmo-rss-folder-url-internal folder)) (buffer (or (url-retrieve-synchronously url) (error "No data for feed %s" url))) (xml (prog1 (with-current-buffer buffer (xml-parse-region (progn (goto-char (point-min)) (search-forward "\n\n")) (point-max))) (kill-buffer buffer))) (parse (elmo-rss-parse xml url)) (entries (car parse)) (urls (cadr parse))) (elmo-rss-folder-set-downloaded-internal folder t) (elmo-rss-folder-set-entries-internal folder entries) (elmo-rss-folder-set-children-internal folder urls))) (defun elmo-rss-maybe-download (folder) "Call elmo-rss-download if there is no ready data." (unless (elmo-rss-folder-downloaded-internal folder) (if (elmo-folder-plugged-p folder) (elmo-rss-download folder) (error "Unplugged")))) (luna-define-method elmo-folder-initialize ((folder elmo-rss-folder) name) (elmo-rss-folder-set-url-internal folder name) (elmo-rss-folder-set-downloaded-internal folder nil) (elmo-rss-folder-set-entries-internal folder nil) (elmo-rss-folder-set-children-internal folder nil) folder) (luna-define-method elmo-folder-local-p ((_folder elmo-rss-folder)) nil) (luna-define-method elmo-message-use-cache-p ((_folder elmo-rss-folder) _number) t) (luna-define-method elmo-folder-close-internal :after ((folder elmo-rss-folder)) (elmo-rss-folder-set-downloaded-internal folder nil) (elmo-rss-folder-set-entries-internal folder nil) (elmo-rss-folder-set-children-internal folder nil)) (luna-define-method elmo-folder-exists-p ((_folder elmo-rss-folder)) t) (luna-define-method elmo-folder-plugged-p ((_folder elmo-rss-folder)) (elmo-plugged-p)) (luna-define-method elmo-map-folder-list-message-locations ((folder elmo-rss-folder)) (cond ((elmo-folder-plugged-p folder) ;; Re-download unconditionally, so that sync does the right thing. (elmo-rss-download folder)) ((not (elmo-rss-folder-downloaded-internal folder)) (error "Unplugged"))) (mapcar #'car (elmo-rss-folder-entries-internal folder))) (defun elmo-rss-encode-field-body (body) "Encode a header body depending on elmo-rss-use-raw-utf8-in-headers." (if elmo-rss-use-raw-utf8-in-headers (encode-coding-string body 'utf-8 t) ;; since From fields don't necessarily have the syntax of an e-mail ;; address, we always encode them as an unstructured field. (mime-encode-field-body body "Subject"))) (defun elmo-rss-format-message (entry url) "Format a parsed entry as a mail message." (let* ((id (car entry)) (date (cadr entry)) (author (nth 2 entry)) (subject (nth 3 entry)) (in-reply-to (nth 4 entry)) (links (nth 5 entry)) (content-type (nth 6 entry)) (body (nth 7 entry)) (time (current-time)) (boundary (format "%d-%d" (cadr time) (nth 2 time)))) (when author (insert "From: " (elmo-rss-encode-field-body author) "\n")) (when subject (insert "Subject: " (elmo-rss-encode-field-body subject) "\n")) (when date (insert "Date: " date "\n")) (insert "Message-Id: " (elmo-rss-id-to-message-id id url) "\n") (when in-reply-to (insert "References:") (dolist (r in-reply-to) (insert " " (elmo-rss-id-to-message-id r url))) (insert "\n")) (insert "Mime-Version: 1.0\n") (when (and body links) (insert "Content-type: multipart/mixed; boundary=\"" boundary "\"\n") (insert "\n--" boundary "\n")) (when body (insert "Content-Type: " content-type "; charset=utf-8\n") (insert "\n") (insert body) (unless (bolp) (insert "\n"))) (when (and body links) (insert "--" boundary "\n")) (when links (insert "Content-Type: text/plain\n") (insert "\n") (dolist (l links) (insert "<" l ">\n"))) (when (and body links) (insert "--" boundary "--\n")) (unless (bolp) (insert "\n")))) (luna-define-method elmo-map-message-fetch ((folder elmo-rss-folder) location _strategy &optional _section _unseen) (elmo-rss-maybe-download folder) (let ((entry (assoc location (elmo-rss-folder-entries-internal folder)))) (set-buffer-multibyte nil) (elmo-rss-format-message entry (elmo-rss-folder-url-internal folder))) t) (luna-define-method elmo-folder-expand-msgdb-path ((folder elmo-rss-folder)) (expand-file-name (elmo-replace-string-as-filename (elmo-folder-name-internal folder)) (expand-file-name "rss" elmo-msgdb-directory))) (defun elmo-rss-msgdb-create-entity (msgdb folder number) (let* ((url (elmo-rss-folder-url-internal folder)) (location (elmo-map-message-location folder number)) (entry (assoc location (elmo-rss-folder-entries-internal folder)))) (elmo-msgdb-make-message-entity (elmo-msgdb-message-entity-handler msgdb) :message-id (elmo-rss-id-to-message-id location url) :number number :date (cadr entry) :from (or (nth 2 entry) elmo-no-from) :subject (or (nth 3 entry) elmo-no-subject) :references (mapcar #'(lambda (ref) (elmo-rss-id-to-message-id ref url)) (nth 4 entry))))) (luna-define-method elmo-folder-msgdb-create ((folder elmo-rss-folder) numlist _flag-table) (elmo-rss-maybe-download folder) (let ((new-msgdb (elmo-make-msgdb))) (elmo-with-progress-display (elmo-folder-msgdb-create (length numlist)) "Creating msgdb" (dolist (number numlist) (let ((entity (elmo-rss-msgdb-create-entity new-msgdb folder number))) (when entity (elmo-msgdb-append-entity new-msgdb entity '(new unread)))) (elmo-progress-notify 'elmo-folder-msgdb-create))) new-msgdb)) (luna-define-method elmo-folder-delete-messages ((folder elmo-rss-folder) numbers) (elmo-folder-kill-messages folder numbers) t) (luna-define-method elmo-folder-list-subfolders ((folder elmo-rss-folder) &optional _one-level) (elmo-rss-maybe-download folder) (mapcar #'(lambda (url) (concat "rss:" url)) (nconc (and (elmo-rss-folder-entries-internal folder) (not (member (elmo-rss-folder-url-internal folder) (elmo-rss-folder-children-internal folder))) (list (elmo-rss-folder-url-internal folder))) (elmo-rss-folder-children-internal folder)))) (provide 'elmo-rss) ;;; elmo-rss.el ends here wanderlust-wanderlust-769699d/elmo/elmo-search.el000066400000000000000000000336671406661363500221010ustar00rootroot00000000000000;;; elmo-search.el --- Search by external program interface for ELMO. -*- lexical-binding: t -*- ;; Copyright (C) 2005 Yuuichi Teranishi ;; Author: Yuuichi Teranishi ;; Hiroya Murata ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'cl-lib) (require 'elmo) (require 'elmo-map) (require 'mime-edit) (defcustom elmo-search-use-drive-letter (memq system-type '(OS/2 emx windows-nt)) "*If non-nil, do a drive letter conversion (e.g. /a|/ => a:/)." :type '(choice (const :tag "Not use" nil) (other :tag "Use" t)) :group 'elmo) (defvar elmo-search-engine-alist nil "*An alist of search engines. Each element looks like (ENGINE CLASS PROPERTIES...) ENGINE is a symbol, the name of the search engine. CLASS is a symbol, the class name that performs a search. PROPERTIES is a plist, it configure an engine with the CLASS.") (defcustom elmo-search-default-engine 'namazu "*Default search engine for elmo-search folder." :type 'symbol :group 'elmo) (defconst elmo-search-folder-name-syntax `(pattern (?\] param (?! engine)))) ;; Search engine I/F (eval-and-compile (luna-define-class elmo-search-engine () (param)) (luna-define-internal-accessors 'elmo-search-engine)) (luna-define-generic elmo-search-engine-do-search (engine pattern) "Search messages which is match PATTERN by ENGINE.") (luna-define-generic elmo-search-engine-create-message-entity (engine handler folder number) "Create msgdb entity for the message in the FOLDER with NUMBER.") (luna-define-generic elmo-search-engine-fetch-message (engine location) "Fetch a message into current buffer. ENGINE is the ELMO search engine structure. LOCATION is the location of the message. Returns non-nil if fetching was succeed.") (defun elmo-make-search-engine (type &optional param) (let ((spec (or (cdr (assq type elmo-search-engine-alist)) (error "Undefined search engine `%s'" type)))) (require (intern (format "elmo-search-%s" (car spec)))) (apply 'luna-make-entity (intern (format "elmo-search-engine-%s" (car spec))) :param param (cdr spec)))) (defun elmo-search-register-engine (name class &rest properties) (let ((cell (assq name elmo-search-engine-alist)) (spec (cons class properties))) (if cell (setcdr cell spec) (setq elmo-search-engine-alist (cons (cons name spec) elmo-search-engine-alist))))) ;; ELMO search folder (eval-and-compile (luna-define-class elmo-search-folder (elmo-map-folder) (engine pattern)) (luna-define-internal-accessors 'elmo-search-folder)) (luna-define-method elmo-folder-initialize ((folder elmo-search-folder) name) (when (> (length name) 0) (let* ((tokens (car (elmo-parse-separated-tokens name elmo-search-folder-name-syntax))) (engine (cdr (assq 'engine tokens)))) (elmo-search-folder-set-engine-internal folder (elmo-make-search-engine (if (> (length engine) 0) (intern engine) elmo-search-default-engine) (cdr (assq 'param tokens)))) (elmo-search-folder-set-pattern-internal folder (cdr (assq 'pattern tokens))))) folder) (luna-define-method elmo-folder-expand-msgdb-path ((folder elmo-search-folder)) (expand-file-name (elmo-replace-string-as-filename (elmo-folder-name-internal folder)) (expand-file-name "search" elmo-msgdb-directory))) (luna-define-method elmo-folder-msgdb-create ((folder elmo-search-folder) numbers _flag-table) (let ((new-msgdb (elmo-make-msgdb)) entity) (elmo-with-progress-display (elmo-folder-msgdb-create (length numbers)) "Creating msgdb" (dolist (number numbers) (setq entity (elmo-search-engine-create-message-entity (elmo-search-folder-engine-internal folder) (elmo-msgdb-message-entity-handler new-msgdb) folder number)) (when entity (elmo-msgdb-append-entity new-msgdb entity '(new unread))) (elmo-progress-notify 'elmo-folder-msgdb-create))) new-msgdb)) (luna-define-method elmo-folder-message-file-p ((_folder elmo-search-folder)) nil) (defun elmo-search-location-to-filename (location) (when (string-match "^file://" location) (let ((filename (substring location (match-end 0)))) (expand-file-name (if (and elmo-search-use-drive-letter (string-match "^/\\([A-Za-z]\\)[:|]/\\(.*\\)$" filename)) (replace-match "\\1:/\\2" t nil filename) filename))))) (luna-define-method elmo-message-file-name ((folder elmo-search-folder) number) (elmo-search-location-to-filename (elmo-map-message-location folder number))) (luna-define-method elmo-folder-message-make-temp-file-p ((_folder elmo-search-folder)) nil) (luna-define-method elmo-folder-diff ((_folder elmo-search-folder)) (cons nil nil)) (luna-define-method elmo-folder-message-make-temp-files ((folder elmo-search-folder) numbers &optional start-number) (let ((temp-dir (elmo-folder-make-temporary-directory folder)) (cur-number (or start-number 0))) (dolist (number numbers) (elmo-copy-file (elmo-message-file-name folder number) (expand-file-name (number-to-string (if start-number cur-number number)) temp-dir)) (cl-incf cur-number)) temp-dir)) (luna-define-method elmo-map-message-fetch ((folder elmo-search-folder) location _strategy &optional _section _unseen) (elmo-search-engine-fetch-message (elmo-search-folder-engine-internal folder) location)) (luna-define-method elmo-map-folder-list-message-locations ((folder elmo-search-folder)) (elmo-search-engine-do-search (elmo-search-folder-engine-internal folder) (elmo-search-folder-pattern-internal folder))) (luna-define-method elmo-folder-exists-p ((folder elmo-search-folder)) (elmo-search-folder-pattern-internal folder)) (luna-define-method elmo-folder-have-subfolder-p ((folder elmo-search-folder)) (null (elmo-search-folder-pattern-internal folder))) (luna-define-method elmo-folder-list-subfolders ((folder elmo-search-folder) &optional _one-level) (mapcar (lambda (name) (elmo-recover-string-from-filename name)) (directory-files (expand-file-name "search" elmo-msgdb-directory) nil (concat "^" (regexp-quote (elmo-folder-prefix-internal folder)))))) (luna-define-method elmo-folder-delete-messages ((folder elmo-search-folder) numbers) (elmo-folder-kill-messages folder numbers) t) ;;; Search engine ;; external program search engine (eval-and-compile (luna-define-class elmo-search-engine-extprog (elmo-search-engine) (prog args charset parser)) (luna-define-internal-accessors 'elmo-search-engine-extprog)) (luna-define-method elmo-search-engine-do-search ((engine elmo-search-engine-extprog) pattern) (with-temp-buffer (let ((charset (elmo-search-engine-extprog-charset-internal engine)) (parser (or (elmo-search-engine-extprog-parser-internal engine) #'elmo-search-parse-filename-list))) (apply 'call-process (elmo-search-engine-extprog-prog-internal engine) nil (list (current-buffer)) nil (delq nil (elmo-flatten (mapcar (lambda (arg) (cond ((stringp arg) arg) ((eq arg 'pattern) (if charset (encode-mime-charset-string pattern charset) pattern)) ((functionp arg) (condition-case nil (funcall arg engine pattern) (wrong-number-of-arguments (funcall arg engine)))) ((and (symbolp arg) (boundp arg)) (symbol-value arg)))) (elmo-search-engine-extprog-args-internal engine))))) (funcall parser)))) ;; search engine for local files (eval-and-compile (luna-define-class elmo-search-engine-local-file (elmo-search-engine-extprog)) (luna-define-internal-accessors 'elmo-search-engine-local-file)) (defun elmo-search-parse-filename-list () (let (bol locations) (goto-char (point-min)) (while (not (eobp)) (beginning-of-line) (when (and elmo-search-use-drive-letter (looking-at "^\\([A-Za-z]\\)[:|]/")) (replace-match "/\\1:/") (beginning-of-line)) (unless (looking-at "^file://") (insert "file://") (beginning-of-line)) (setq bol (point)) (end-of-line) (setq locations (cons (buffer-substring bol (point)) locations)) (forward-line)) (nreverse locations))) (luna-define-method elmo-search-engine-create-message-entity ((_engine elmo-search-engine-local-file) handler folder number) (let ((filename (elmo-message-file-name folder number)) entity uid) (when (and filename (setq entity (elmo-msgdb-create-message-entity-from-file handler number filename))) (unless (or (elmo-message-entity-field entity 'to) (elmo-message-entity-field entity 'cc) (not (string= (elmo-message-entity-field entity 'subject) elmo-no-subject))) (elmo-message-entity-set-field entity 'subject (file-name-nondirectory filename)) (setq uid (nth 2 (file-attributes filename))) (elmo-message-entity-set-field entity 'from (concat (user-full-name uid) " <"(user-login-name uid) "@" (system-name) ">"))) entity))) (luna-define-method elmo-search-engine-fetch-message ((_engine elmo-search-engine-local-file) location) (let ((filename (elmo-search-location-to-filename location))) (when (and filename (file-exists-p filename)) (prog1 (insert-file-contents-literally filename) (unless (or (std11-field-body "To") (std11-field-body "Cc") (std11-field-body "Subject")) (let (charset guess uid) (erase-buffer) (set-buffer-multibyte t) (insert-file-contents filename) (setq charset (detect-mime-charset-region (point-min) (point-max))) (goto-char (point-min)) (setq guess (mime-find-file-type filename)) (setq uid (nth 2 (file-attributes filename))) (insert "From: " (concat (user-full-name uid) " <"(user-login-name uid) "@" (system-name) ">") "\n") (insert "Subject: " filename "\n") (insert "Content-Type: " (concat (nth 0 guess) "/" (nth 1 guess)) "; charset=" (upcase (symbol-name charset)) "\nMIME-Version: 1.0\n\n") (encode-mime-charset-region (point-min) (point-max) charset) (set-buffer-multibyte nil))))))) (provide 'elmo-search-local-file) ;; namazu (defcustom elmo-search-namazu-default-index-path "~/Mail" "*Default index path for namazu. If the value is a list, all elements are used as index paths for namazu." :type '(choice (directory :tag "Index Path") (repeat (directory :tag "Index Path"))) :group 'elmo) (defcustom elmo-search-namazu-index-alias-alist nil "*Alist of ALIAS and INDEX-PATH." :type '(repeat (cons (string :tag "Alias Name") (choice (directory :tag "Index Path") (repeat (directory :tag "Index Path"))))) :group 'elmo) (defun elmo-search-namazu-index (engine _pattern) (let* ((param (elmo-search-engine-param-internal engine)) (index (cond ((cdr (assoc param elmo-search-namazu-index-alias-alist))) ((and param (> (length param) 0)) param) (t elmo-search-namazu-default-index-path)))) (if (listp index) (mapcar 'expand-file-name index) (expand-file-name index)))) ;; grep (defun elmo-search-grep-target (engine _pattern) (let ((dirname (expand-file-name (elmo-search-engine-param-internal engine))) files) (dolist (filename (directory-files dirname)) (unless (string-match "^\\.\\.?" filename) (setq files (cons (expand-file-name filename dirname) files)))) (or files (list null-device)))) (defun elmo-search-rgrep-target (engine _pattern) (expand-file-name (elmo-search-engine-param-internal engine))) (defun elmo-search-split-pattern-list (engine pattern) "ENGINE is ignored. Splits query PATTERN into list of strings, with ' and \" quoting phrases." (split-string-and-unquote (elmo-search-replace-single-quotes engine pattern))) (defun elmo-search-replace-single-quotes (_engine pattern) "ENGINE is ignored. Replace single quotes with double quotes in PATTERN." (elmo-replace-char-in-string ?' ?\" pattern t)) ;;; Setup `elmo-search-engine-alist' (unless noninteractive (or (assq 'namazu elmo-search-engine-alist) (elmo-search-register-engine 'namazu 'local-file :prog "namazu" :args '("--all" "--list" "--early" pattern elmo-search-namazu-index) :charset 'iso-2022-jp)) (or (assq 'grep elmo-search-engine-alist) (elmo-search-register-engine 'grep 'local-file :prog "grep" :args '("-l" "-e" pattern elmo-search-grep-target))) (or (assq 'rgrep elmo-search-engine-alist) (elmo-search-register-engine 'rgrep 'local-file :prog "grep" :args '("-r" "-l" "-e" pattern elmo-search-rgrep-target))) (or (assq 'mu elmo-search-engine-alist) (elmo-search-register-engine 'mu 'local-file :prog "mu" :args '("find" elmo-search-split-pattern-list "--fields" "l") :charset 'utf-8)) (or (assq 'notmuch elmo-search-engine-alist) (elmo-search-register-engine 'notmuch 'local-file :prog "notmuch" :args '("search" "--output=files" elmo-search-replace-single-quotes) :charset 'utf-8))) (require 'product) (product-provide (provide 'elmo-search) (require 'elmo-version)) ;;; elmo-search.el ends here wanderlust-wanderlust-769699d/elmo/elmo-sendlog.el000066400000000000000000000113041406661363500222470ustar00rootroot00000000000000;;; elmo-sendlog.el --- Sendlog folder for ELMO. -*- lexical-binding: t -*- ;; Copyright (C) 2001 Kenichi OKADA ;; Author: Kenichi OKADA ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'elmo-vars) (require 'elmo-util) (require 'elmo) (require 'elmo-map) (require 'elmo-flag) (defvar elmo-sendlog-filename "sendlog") ;;; ELMO sendlog folder (eval-and-compile (luna-define-class elmo-sendlog-folder (elmo-map-folder elmo-file-tag) (dir-name directory)) (luna-define-internal-accessors 'elmo-sendlog-folder)) (luna-define-method elmo-folder-initialize ((folder elmo-sendlog-folder) _name) folder) (luna-define-method elmo-folder-expand-msgdb-path ((_folder elmo-sendlog-folder)) (expand-file-name "sendlog" (expand-file-name "internal" elmo-msgdb-directory))) (luna-define-method elmo-map-folder-list-message-locations ((folder elmo-sendlog-folder)) (elmo-sendlog-folder-list-message-locations folder)) (defun elmo-sendlog-folder-list-message-locations (_folder) (let ((filename (expand-file-name elmo-sendlog-filename elmo-msgdb-directory)) result) (if (not (file-readable-p filename)) nil (with-temp-buffer (as-binary-input-file (insert-file-contents filename)) (goto-char (point-min)) (catch 'done (while t (re-search-forward "id=\\([^@]+@[^@]+\\)$" (point-at-eol) t) (setq result (append result (list (match-string 1)))) (if (eq (1+ (point-at-eol)) (point-max)) (throw 'done nil) (beginning-of-line 2)))))) result)) (luna-define-method elmo-folder-message-file-p ((_folder elmo-sendlog-folder)) t) (luna-define-method elmo-message-file-name ((folder elmo-sendlog-folder) number) (elmo-file-cache-get-path (elmo-map-message-location folder number))) (luna-define-method elmo-folder-msgdb-create ((folder elmo-sendlog-folder) numbers flag-table) (let ((new-msgdb (elmo-make-msgdb)) entity message-id flags) (elmo-with-progress-display (elmo-folder-msgdb-create (length numbers)) "Creating msgdb" (dolist (number numbers) (setq entity (elmo-msgdb-create-message-entity-from-file (elmo-msgdb-message-entity-handler new-msgdb) number (elmo-message-file-name folder number))) (if (null entity) (elmo-folder-set-killed-list-internal folder (nconc (elmo-folder-killed-list-internal folder) (list number))) (setq message-id (elmo-message-entity-field entity 'message-id) flags (elmo-flag-table-get flag-table message-id)) (elmo-global-flags-set flags folder number message-id) (elmo-msgdb-append-entity new-msgdb entity flags)) (elmo-progress-notify 'elmo-folder-msgdb-create))) new-msgdb)) (luna-define-method elmo-message-fetch ((folder elmo-sendlog-folder) number strategy &optional unseen section) ;; disbable cache process (erase-buffer) (when (elmo-message-fetch-internal folder number strategy section unseen) (when (and (not unseen) (elmo-message-flagged-p folder number 'unread)) (elmo-message-unset-flag folder number 'unread)) t)) (luna-define-method elmo-map-message-fetch ((_folder elmo-sendlog-folder) location _strategy &optional _section _unseen) (let ((filename (elmo-file-cache-get-path location))) (if (file-exists-p filename) (insert-file-contents-literally filename) (error "Now this message is not cached. Please s all")))) (luna-define-method elmo-folder-exists-p ((_folder elmo-sendlog-folder)) t) (luna-define-method elmo-folder-delete-messages ((folder elmo-sendlog-folder) numbers) (elmo-folder-kill-messages folder numbers) t) (luna-define-method elmo-message-file-p ((_folder elmo-sendlog-folder) _number) t) (luna-define-method elmo-folder-have-subfolder-p ((_folder elmo-sendlog-folder)) nil) (require 'product) (product-provide (provide 'elmo-sendlog) (require 'elmo-version)) ;;; elmo-sendlog.el ends here wanderlust-wanderlust-769699d/elmo/elmo-shimbun.el000066400000000000000000000415051406661363500222670ustar00rootroot00000000000000;;; elmo-shimbun.el --- Shimbun interface for ELMO. -*- lexical-binding: t -*- ;; Copyright (C) 2001 Yuuichi Teranishi ;; Author: Yuuichi Teranishi ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'elmo) (require 'elmo-date) (require 'elmo-map) (require 'elmo-dop) (require 'shimbun) (defcustom elmo-shimbun-check-interval 60 "*Check interval for shimbun." :type 'integer :group 'elmo) (defcustom elmo-shimbun-default-index-range 2 "*Default value for the range of header indices." :type '(choice (const :tag "all" all) (const :tag "last" last) (integer :tag "number")) :group 'elmo) (defcustom elmo-shimbun-use-cache t "*If non-nil, use cache for each article." :type 'boolean :group 'elmo) (defcustom elmo-shimbun-index-range-alist nil "*Alist of FOLDER-REGEXP and RANGE. FOLDER-REGEXP is the regexp for shimbun folder name. RANGE is the range of the header indices . See `shimbun-headers' for more detail about RANGE." :type '(repeat (cons (regexp :tag "Folder Regexp") (choice (const :tag "all" all) (const :tag "last" last) (integer :tag "number")))) :group 'elmo) (defcustom elmo-shimbun-update-overview-folder-list 'all "*List of FOLDER-REGEXP. FOLDER-REGEXP is the regexp of shimbun folder name which should be update overview when message is fetched. If it is the symbol `all', update overview for all shimbun folders." :type '(choice (const :tag "All shimbun folders" all) (repeat (regexp :tag "Folder Regexp"))) :group 'elmo) ;; Shimbun header. (defsubst elmo-shimbun-header-extra-field (header field-name) (let ((extra (and header (shimbun-header-extra header)))) (and extra (cdr (assoc field-name extra))))) (defsubst elmo-shimbun-header-set-extra-field (header field-name value) (let ((extras (and header (shimbun-header-extra header))) extra) (if (setq extra (assoc field-name extras)) (setcdr extra value) (shimbun-header-set-extra header (cons (cons field-name value) extras))))) ;; Shimbun mua. (eval-and-compile (luna-define-class shimbun-elmo-mua (shimbun-mua) (folder)) (luna-define-internal-accessors 'shimbun-elmo-mua)) (luna-define-method shimbun-mua-search-id ((mua shimbun-elmo-mua) id) (elmo-message-entity (shimbun-elmo-mua-folder-internal mua) id)) (eval-and-compile (luna-define-class elmo-shimbun-folder (elmo-map-folder) (shimbun headers header-hash entity-hash group range last-check)) (luna-define-internal-accessors 'elmo-shimbun-folder)) (defun elmo-shimbun-folder-entity-hash (folder) (or (elmo-shimbun-folder-entity-hash-internal folder) (let ((overviews (elmo-folder-list-message-entities folder)) hash id) (when overviews (setq hash (elmo-make-hash (length overviews))) (dolist (entity overviews) (elmo-set-hash-val (elmo-message-entity-field entity 'message-id) entity hash) (when (setq id (elmo-message-entity-field entity 'x-original-id)) (elmo-set-hash-val id entity hash))) (elmo-shimbun-folder-set-entity-hash-internal folder hash))))) (defsubst elmo-shimbun-folder-shimbun-header (folder location) (let ((hash (elmo-shimbun-folder-header-hash-internal folder))) (or (and hash (elmo-get-hash-val location hash)) (let ((entity (elmo-message-entity folder location)) (elmo-hash-minimum-size 63) header) (when entity (setq header (elmo-shimbun-entity-to-header entity)) (unless hash (elmo-shimbun-folder-set-header-hash-internal folder (setq hash (elmo-make-hash)))) (elmo-set-hash-val (elmo-message-entity-field entity 'message-id) header hash) header))))) (defsubst elmo-shimbun-lapse-seconds (time) (let ((now (current-time))) (+ (* (- (car now) (car time)) 65536) (- (nth 1 now) (nth 1 time))))) (defsubst elmo-shimbun-headers-check-p (folder) (or (null (elmo-shimbun-folder-last-check-internal folder)) (and (elmo-shimbun-folder-last-check-internal folder) (> (elmo-shimbun-lapse-seconds (elmo-shimbun-folder-last-check-internal folder)) elmo-shimbun-check-interval)))) (defun elmo-shimbun-entity-to-header (entity) (let (message-id shimbun-id) (if (setq message-id (elmo-message-entity-field entity 'x-original-id)) (setq shimbun-id (elmo-message-entity-field entity 'message-id)) (setq message-id (elmo-message-entity-field entity 'message-id) shimbun-id nil)) (shimbun-create-header (elmo-message-entity-number entity) (elmo-message-entity-field entity 'subject) (elmo-message-entity-field entity 'from) (elmo-time-make-date-string (elmo-message-entity-field entity 'date)) message-id (elmo-message-entity-field entity 'references) (elmo-message-entity-field entity 'size) 0 (elmo-message-entity-field entity 'xref) (and shimbun-id (list (cons "x-shimbun-id" shimbun-id)))))) (defsubst elmo-shimbun-folder-header-hash-setup (folder headers) (let ((hash (or (elmo-shimbun-folder-header-hash-internal folder) (elmo-make-hash (length headers))))) (dolist (header headers) (elmo-set-hash-val (shimbun-header-id header) header hash)) (elmo-shimbun-folder-set-header-hash-internal folder hash))) (defun elmo-shimbun-get-headers (folder) (let ((elmo-hash-minimum-size 63) headers) ;; new headers. (setq headers (delq nil (mapcar (lambda (x) (unless (elmo-message-entity folder (shimbun-header-id x)) x)) ;; This takes much time. (shimbun-headers (elmo-shimbun-folder-shimbun-internal folder) (elmo-shimbun-folder-range-internal folder))))) (elmo-shimbun-folder-set-headers-internal folder headers) (when headers (elmo-shimbun-folder-header-hash-setup folder headers)) (elmo-shimbun-folder-set-last-check-internal folder (current-time)))) (luna-define-method elmo-folder-initialize ((folder elmo-shimbun-folder) name) (if (string= name "") folder (let ((server-group (if (string-match "\\([^.]+\\)\\." name) (list (match-string 1 name) (substring name (match-end 0))) (list name)))) (when (nth 0 server-group) ; server (elmo-shimbun-folder-set-shimbun-internal folder (condition-case nil (shimbun-open (nth 0 server-group) (luna-make-entity 'shimbun-elmo-mua :folder folder)) (file-error (luna-make-entity 'shimbun :server (nth 0 server-group)))))) (when (nth 1 server-group) (elmo-shimbun-folder-set-group-internal folder (nth 1 server-group))) (elmo-shimbun-folder-set-range-internal folder (or (cdr (elmo-string-matched-assoc (elmo-folder-name-internal folder) elmo-shimbun-index-range-alist)) elmo-shimbun-default-index-range)) folder))) (luna-define-method elmo-folder-open-internal ((folder elmo-shimbun-folder)) (when (elmo-shimbun-folder-shimbun-internal folder) (shimbun-open-group (elmo-shimbun-folder-shimbun-internal folder) (elmo-shimbun-folder-group-internal folder)) (let ((inhibit-quit t)) (unless (elmo-location-map-alist folder) (elmo-location-map-setup folder (elmo-msgdb-location-load (elmo-folder-msgdb-path folder)))) (when (and (elmo-folder-plugged-p folder) (elmo-shimbun-headers-check-p folder)) (elmo-shimbun-get-headers folder) (elmo-location-map-update folder (elmo-map-folder-list-message-locations folder)))))) (luna-define-method elmo-folder-reserve-status-p ((_folder elmo-shimbun-folder)) t) (luna-define-method elmo-folder-local-p ((_folder elmo-shimbun-folder)) nil) (luna-define-method elmo-message-use-cache-p ((_folder elmo-shimbun-folder) _number) elmo-shimbun-use-cache) (luna-define-method elmo-folder-close-internal :after ((folder elmo-shimbun-folder)) (shimbun-close-group (elmo-shimbun-folder-shimbun-internal folder)) (elmo-shimbun-folder-set-headers-internal folder nil) (elmo-shimbun-folder-set-header-hash-internal folder nil) (elmo-shimbun-folder-set-entity-hash-internal folder nil) (elmo-shimbun-folder-set-last-check-internal folder nil)) (luna-define-method elmo-folder-plugged-p ((folder elmo-shimbun-folder)) (if (elmo-shimbun-folder-shimbun-internal folder) (elmo-plugged-p "shimbun" (shimbun-server (elmo-shimbun-folder-shimbun-internal folder)) nil nil (shimbun-server (elmo-shimbun-folder-shimbun-internal folder))) t)) (luna-define-method elmo-folder-set-plugged ((folder elmo-shimbun-folder) plugged &optional add) (elmo-set-plugged plugged "shimbun" (shimbun-server (elmo-shimbun-folder-shimbun-internal folder)) nil nil nil (shimbun-server (elmo-shimbun-folder-shimbun-internal folder)) add)) (luna-define-method elmo-net-port-info ((folder elmo-shimbun-folder)) (list "shimbun" (shimbun-server (elmo-shimbun-folder-shimbun-internal folder)) nil)) (luna-define-method elmo-folder-check :around ((folder elmo-shimbun-folder)) (when (shimbun-current-group (elmo-shimbun-folder-shimbun-internal folder)) (when (and (elmo-folder-plugged-p folder) (elmo-shimbun-headers-check-p folder)) (elmo-shimbun-get-headers folder) (luna-call-next-method)))) (luna-define-method elmo-folder-clear :around ((folder elmo-shimbun-folder) &optional _keep-killed) (elmo-shimbun-folder-set-headers-internal folder nil) (elmo-shimbun-folder-set-header-hash-internal folder nil) (elmo-shimbun-folder-set-entity-hash-internal folder nil) (elmo-shimbun-folder-set-last-check-internal folder nil) (luna-call-next-method)) (luna-define-method elmo-folder-expand-msgdb-path ((folder elmo-shimbun-folder)) (expand-file-name (concat (shimbun-server (elmo-shimbun-folder-shimbun-internal folder)) "/" (elmo-shimbun-folder-group-internal folder)) (expand-file-name "shimbun" elmo-msgdb-directory))) (defun elmo-shimbun-msgdb-create-entity (folder number) (let ((header (elmo-shimbun-folder-shimbun-header folder (elmo-map-message-location folder number))) ov) (when header (with-temp-buffer (shimbun-header-insert (elmo-shimbun-folder-shimbun-internal folder) header) (setq ov (elmo-msgdb-create-message-entity-from-header (elmo-msgdb-message-entity-handler (elmo-folder-msgdb-internal folder)) number)) (elmo-message-entity-set-field ov 'xref (shimbun-header-xref header))) ov))) (luna-define-method elmo-folder-msgdb-create ((folder elmo-shimbun-folder) numlist flag-table) (let ((new-msgdb (elmo-make-msgdb)) entity msgid flags) (elmo-with-progress-display (elmo-folder-msgdb-create (length numlist)) "Creating msgdb" (dolist (number numlist) (setq entity (elmo-shimbun-msgdb-create-entity folder number)) (when entity (setq msgid (elmo-message-entity-field entity 'message-id) flags (elmo-flag-table-get flag-table msgid)) (elmo-global-flags-set flags folder number msgid) (elmo-msgdb-append-entity new-msgdb entity flags)) (elmo-progress-notify 'elmo-folder-msgdb-create))) new-msgdb)) (luna-define-method elmo-folder-message-file-p ((_folder elmo-shimbun-folder)) nil) (defsubst elmo-shimbun-update-overview (folder entity shimbun-id header) (let ((message-id (shimbun-header-id header))) (when (elmo-msgdb-update-entity (elmo-folder-msgdb folder) entity (nconc (unless (string= shimbun-id message-id) (elmo-shimbun-header-set-extra-field header "x-shimbun-id" shimbun-id) (elmo-set-hash-val message-id entity (elmo-shimbun-folder-entity-hash folder)) (elmo-set-hash-val shimbun-id entity (elmo-shimbun-folder-entity-hash folder)) (list (cons 'x-original-id message-id))) (list (cons 'from (shimbun-header-from header 'no-encode)) (cons 'subject (shimbun-header-subject header 'no-encode)) (cons 'date (shimbun-header-date header)) (cons 'references (elmo-msgdb-get-references-from-header))))) (elmo-emit-signal 'update-overview folder (elmo-message-entity-number entity))))) (luna-define-method elmo-map-message-fetch ((folder elmo-shimbun-folder) location _strategy &optional _section _unseen) (if (elmo-folder-plugged-p folder) (let ((header (elmo-shimbun-folder-shimbun-header folder location)) shimbun-id) (shimbun-article (elmo-shimbun-folder-shimbun-internal folder) header) (when (or (eq elmo-shimbun-update-overview-folder-list 'all) (elmo-string-match-member (elmo-folder-name-internal folder) elmo-shimbun-update-overview-folder-list)) (let ((entity (elmo-message-entity folder location))) (when entity (elmo-shimbun-update-overview folder entity location header)))) (when (setq shimbun-id (elmo-shimbun-header-extra-field header "x-shimbun-id")) (goto-char (point-min)) (insert (format "X-Shimbun-Id: %s\n" shimbun-id))) t) (error "Unplugged"))) (luna-define-method elmo-message-encache :around ((folder elmo-shimbun-folder) number &optional read) (if (elmo-folder-plugged-p folder) (luna-call-next-method) (if elmo-enable-disconnected-operation (elmo-message-encache-dop folder number read) (error "Unplugged")))) (luna-define-method elmo-folder-list-messages-internal :around ((folder elmo-shimbun-folder) &optional _nohide) (if (elmo-folder-plugged-p folder) (luna-call-next-method) t)) (luna-define-method elmo-map-folder-list-message-locations ((folder elmo-shimbun-folder)) (let ((expire-days (shimbun-article-expiration-days (elmo-shimbun-folder-shimbun-internal folder)))) (elmo-uniq-list (nconc (delq nil (mapcar (lambda (ov) (when (and (elmo-message-entity-field ov 'xref) (if expire-days (< (elmo-shimbun-lapse-seconds (elmo-message-entity-field ov 'date)) (* expire-days 86400 ; seconds per day )) t)) (elmo-message-entity-field ov 'message-id))) (elmo-folder-list-message-entities folder))) (mapcar (lambda (header) (or (elmo-shimbun-header-extra-field header "x-shimbun-id") (shimbun-header-id header))) (elmo-shimbun-folder-headers-internal folder)))))) (luna-define-method elmo-folder-list-subfolders ((folder elmo-shimbun-folder) &optional one-level) (let ((prefix (elmo-folder-prefix-internal folder))) (cond ((elmo-shimbun-folder-shimbun-internal folder) (unless (elmo-shimbun-folder-group-internal folder) (mapcar (lambda (fld) (concat prefix (shimbun-server (elmo-shimbun-folder-shimbun-internal folder)) "." fld)) (shimbun-groups (elmo-shimbun-folder-shimbun-internal folder))))) ;; the rest are for "@/" group (one-level (mapcar (lambda (server) (list (concat prefix server))) (shimbun-servers-list))) (t (let (folders) (dolist (server (shimbun-servers-list)) (setq folders (append folders (mapcar (lambda (group) (concat prefix server "." group)) (shimbun-groups (elmo-shimbun-folder-shimbun-internal (elmo-get-folder (concat prefix server)))))))) folders))))) (luna-define-method elmo-folder-exists-p ((folder elmo-shimbun-folder)) (if (elmo-shimbun-folder-group-internal folder) (shimbun-group-p (elmo-shimbun-folder-shimbun-internal folder) (elmo-shimbun-folder-group-internal folder)) t)) (luna-define-method elmo-folder-delete-messages ((folder elmo-shimbun-folder) numbers) (elmo-folder-kill-messages folder numbers) t) (luna-define-method elmo-message-entity-parent ((folder elmo-shimbun-folder) entity) (let ((references (elmo-message-entity-field entity 'references)) parent) ;; In old msgdb, references's field is a string. (when (stringp references) (setq references (list references))) (while references (setq references (if (setq parent (elmo-get-hash-val (car references) (elmo-shimbun-folder-entity-hash folder))) nil (cdr references)))) parent)) (require 'product) (product-provide (provide 'elmo-shimbun) (require 'elmo-version)) ;;; elmo-shimbun.el ends here wanderlust-wanderlust-769699d/elmo/elmo-signal.el000066400000000000000000000147151406661363500221020ustar00rootroot00000000000000;;; elmo-signal.el --- "signal-slot" abstraction for routing events -*- lexical-binding: t -*- ;; Copyright (C) 1998-2003 Daiki Ueno ;; Author: Daiki Ueno ;; Hiroya Murata ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;;; This module implements Qt like "signal-slot" abstraction for ;;; routing events. ;;; Based on riece-signal.el. ;;; Code: (defvar elmo-signal-slot-obarray (make-vector 31 0)) (defun elmo-make-slot (source listener function &optional filter handback) "Make an instance of slot object. Arguments are corresponding to callback function, filter function, and a handback object, respectively. This function is for internal use only." (vector source listener function filter handback)) (defun elmo-slot-source (slot) "Return the source of SLOT. This function is for internal use only." (aref slot 0)) (defun elmo-slot-listener (slot) "Return the listener of SLOT. This function is for internal use only." (aref slot 1)) (defun elmo-slot-function (slot) "Return the callback function of SLOT. This function is for internal use only." (aref slot 2)) (defun elmo-slot-filter (slot) "Return the filter function of SLOT. This function is for internal use only." (aref slot 3)) (defun elmo-slot-handback (slot) "Return the handback object of SLOT. This function is for internal use only." (aref slot 4)) (put 'elmo-define-signal 'lisp-indent-function 'defun) (defmacro elmo-define-signal (name args &optional doc) `(setplist ',name (list 'elmo-signal-args ',args 'elmo-signal-docstring ,doc))) (defun elmo-signal-name (signal) "Return the name of SIGNAL." signal) (defun elmo-signal-args (signal) "Return the argument list of SIGNAL." (get signal 'elmo-signal-args)) (defun elmo-signal-docstring (signal) "Return the docment string of SIGNAL." (get signal 'elmo-signal-docstring)) (defun elmo-signal-bindings (source listener args handback arg-list) (let ((i 0) bindings) (when (car arg-list) (setq bindings (cons (list (car arg-list) listener) bindings))) (when (setq arg-list (cdr arg-list)) (setq bindings (cons (list (car arg-list) source) bindings))) (while (and (setq arg-list (cdr arg-list)) (not (eq (car arg-list) '&optional))) (setq bindings (cons (list (car arg-list) (list 'nth i args)) bindings) i (1+ i))) (when (and handback (setq arg-list (cdr arg-list))) (setq bindings (cons (list (car arg-list) handback) bindings))) bindings)) (defmacro elmo-define-signal-handler (args &rest body) "Define a signal handler. ARGS is a symbol list as (LISTENER SOURCE ARG... &optional HANDBACK)." (let ((source (make-symbol "--source--")) (listener (make-symbol "--listener--")) (argument (make-symbol "--argument--")) (handback (make-symbol "--handback--"))) `(lambda (,listener ,source ,argument ,handback) (let ,(elmo-signal-bindings source listener argument handback args) ,@body)))) (put 'elmo-define-signal-handler 'lisp-indent-function 'defun) (def-edebug-spec elmo-define-signal-handler (&define (arg [&rest arg] [&optional ["&optional" arg &rest arg]]) def-body)) (defmacro elmo-define-signal-filter (args &rest body) "Define a signal filter. ARGS is a symbol list as (LISTENER SOURCE ARG...)." (let ((source (make-symbol "--source--")) (listener (make-symbol "--listener--")) (argument (make-symbol "--argument--"))) `(lambda (,listener ,source ,argument) (let ,(elmo-signal-bindings source listener argument nil args) ,@body)))) (put 'elmo-define-signal-filter 'lisp-indent-function 'defun) (def-edebug-spec elmo-define-signal-filter (&define (arg [&rest arg]) def-body)) (defun elmo-connect-signal (source signal-name listener handler &optional filter handback) "Add HANDLER as a callback function for signal identified by SIGNAL-NAME. If SOURCE has non-nil value, HANDLER will be invoked only if SOURCE is same as source argument of `elmo-emit-signal'. Comparison is done with `eq'. If SOURCE is nil, react on signals from any sources. You can specify further filter function by FILTER." (let ((symbol (intern (symbol-name signal-name) elmo-signal-slot-obarray))) (set symbol (cons (elmo-make-slot source listener handler filter handback) (if (boundp symbol) (symbol-value symbol)))))) (defun elmo-disconnect-signal (signal-name listener &optional function) "Remove FUNCTION from the listener of the signal identified by SIGNAL-NAME." (let* ((symbol (intern-soft (symbol-name signal-name) elmo-signal-slot-obarray)) (slots (symbol-value symbol))) (while slots (when (and (eq (elmo-slot-listener (car slots)) listener) (or (null function) (eq (elmo-slot-function (car slots)) function))) (set symbol (delq (car slots) (symbol-value symbol)))) (setq slots (cdr slots))))) (defun elmo-clear-signal-slots () "Remove all functions from listeners list." (fillarray elmo-signal-slot-obarray 0)) (defun elmo-emit-signal (signal-name source &rest args) "Emit signal with SIGNAL-NAME." (let ((symbol (intern-soft (symbol-name signal-name) elmo-signal-slot-obarray))) (when symbol (dolist (slot (symbol-value symbol)) (ignore-errors (when (and (or (null (elmo-slot-source slot)) (eq (elmo-slot-source slot) source)) (or (null (elmo-slot-filter slot)) (ignore-errors (funcall (elmo-slot-filter slot) (elmo-slot-listener slot) source args)))) (funcall (elmo-slot-function slot) (elmo-slot-listener slot) source args (elmo-slot-handback slot)))))))) (require 'product) (product-provide (provide 'elmo-signal) (require 'elmo-version)) ;;; elmo-signal.el ends here wanderlust-wanderlust-769699d/elmo/elmo-spam.el000066400000000000000000000231741406661363500215640ustar00rootroot00000000000000;;; elmo-spam.el --- Spam filtering interface to processor. -*- lexical-binding: t -*- ;; Copyright (C) 2003 Hiroya Murata ;; Copyright (C) 2003 Yuuichi Teranishi ;; Author: Hiroya Murata ;; Keywords: mail, net news, spam ;; This file is part of Wanderlust (Yet Another Message Interface on Emacsen). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'luna) (require 'elmo-util) (require 'elmo) (defgroup elmo-spam nil "Spam configuration for wanderlust." :group 'elmo) (defcustom elmo-spam-scheme nil "*Scheme of spam processor implementation. " :type '(choice (const :tag "none" nil) (const :tag "Bogofilter" bogofilter) (const :tag "Spamfilter" spamfilter) (const :tag "SpamAssassin" sa) (const :tag "Header" header) (const :tag "Bsfilter" bsfilter)) :group 'elmo-spam) (eval-and-compile (luna-define-class elsp-generic ())) ;; required method (luna-define-generic elmo-spam-buffer-spam-p (processor buffer &optional register) "Return non-nil if contents of BUFFER is spam. PROCESSOR is spam processor structure. If optional augument REGISTER is non-nil, register according to the classification.") (luna-define-generic elmo-spam-register-spam-buffer (processor buffer &optional restore) "Register contents of BUFFER as spam. PROCESSOR is spam processor structure. If optional argument RESTORE is non-nil, unregister from non-spam list.") (luna-define-generic elmo-spam-register-good-buffer (processor buffer &optional restore) "Register contents of BUFFER as non-spam. PROCESSOR is spam processor structure. If optional argument RESTORE is non-nil, unregister from spam list.") ;; optional method (luna-define-generic elmo-spam-modified-p (processor) "Return non-nil if status of PROCESSOR is modified.") (luna-define-generic elmo-spam-save-status (processor) "Save status of the PROCESSOR.") (luna-define-generic elmo-spam-message-spam-p (processor folder number &optional register) "Return non-nil if the message in the FOLDER with NUMBER is spam. PROCESSOR is spam processor structure. If optional augument REGISTER is non-nil, register according to the classification.") (luna-define-generic elmo-spam-list-spam-messages (processor folder &optional numbers) "Return a list of message numbers which is classified as spam. PROCESSOR is spam processor structure. FOLDER is the ELMO folder structure. If optional argument NUMBERS is specified and is a list of message numbers, messages are searched from the list.") (luna-define-generic elmo-spam-register-spam-messages (processor folder &optional numbers restore) "Register contents of messages as spam. PROCESSOR is spam processor structure. FOLDER is the ELMO folder structure. If optional argument NUMBERS is specified and is a list of message numbers, messages are searched from the list. If optional argument RESTORE is non-nil, unregister from non-spam list.") (luna-define-generic elmo-spam-register-good-messages (processor folder &optional numbers restore) "Register contents of messages as non spam. PROCESSOR is spam processor structure. FOLDER is the ELMO folder structure. If optional argument NUMBERS is specified and is a list of message numbers, messages are searched from the list. If optional argument RESTORE is non-nil, unregister from spam list.") ;; for internal use (defun elmo-spam-message-fetch (folder number) (let (elmo-message-fetch-threshold) (when enable-multibyte-characters (set-buffer-multibyte nil)) (elmo-message-fetch folder number (elmo-find-fetch-strategy folder number nil 'entire) 'unread))) (defun elmo-spam-process-messages-as-mbox (folder numbers number-per-process function &rest args) (with-temp-buffer (while numbers (let ((count 0)) (while (and numbers (< count number-per-process)) (insert "From MAILER-DAEMON@example.com\n") (let ((begin (point))) (insert (with-temp-buffer (elmo-spam-message-fetch folder (car numbers)) (buffer-string))) (goto-char begin) (while (re-search-forward "^>*From " nil t) (goto-char (match-beginning 0)) (insert ?>) (forward-line)) (goto-char (point-max)) (insert "\n\n")) (setq count (1+ count) numbers (cdr numbers))) (apply function count args) (erase-buffer))))) ;; generic implement (luna-define-method elmo-spam-message-spam-p ((processor elsp-generic) folder number &optional register) (with-temp-buffer (elmo-spam-message-fetch folder number) (elmo-spam-buffer-spam-p processor (current-buffer) register))) (luna-define-method elmo-spam-list-spam-messages ((processor elsp-generic) folder &optional numbers) (let ((numbers (or numbers (elmo-folder-list-messages folder t t))) spam-list) (dolist (number numbers) (when (elmo-spam-message-spam-p processor folder number) (setq spam-list (cons number spam-list))) (elmo-progress-notify 'elmo-spam-check-spam)) (nreverse spam-list))) (luna-define-method elmo-spam-register-spam-messages ((processor elsp-generic) folder &optional numbers restore) (let ((numbers (or numbers (elmo-folder-list-messages folder t t)))) (with-temp-buffer (dolist (number numbers) (erase-buffer) (elmo-spam-message-fetch folder number) (elmo-spam-register-spam-buffer processor (current-buffer) restore) (elmo-progress-notify 'elmo-spam-register))))) (luna-define-method elmo-spam-register-good-messages ((processor elsp-generic) folder &optional numbers restore) (let ((numbers (or numbers (elmo-folder-list-messages folder t t)))) (with-temp-buffer (dolist (number numbers) (erase-buffer) (elmo-spam-message-fetch folder number) (elmo-spam-register-good-buffer processor (current-buffer) restore) (elmo-progress-notify 'elmo-spam-register))))) (provide 'elsp-generic) (defvar elmo-spam-processor-internal nil) (defun elmo-spam-processor (&optional if-exists) (or elmo-spam-processor-internal (unless if-exists (let* ((scheme (or elmo-spam-scheme 'generic)) (class (intern (format "elsp-%s" scheme)))) (require class) (setq elmo-spam-processor-internal (luna-make-entity class)))))) ;; Backend for header match (eval-and-compile (luna-define-class elsp-header (elsp-generic))) (defgroup elmo-spam-header nil "Spam header configuration." :group 'elmo-spam) (defcustom elmo-spam-header-good-alist '(("X-Spam-Flag" . "No")) "*Regular expression for positive header good matches." :type '(repeat (cons (string :tag "Header name") (regexp :tag "Regular expression to match good header"))) :group 'elmo-spam-header) (defcustom elmo-spam-header-spam-alist '(("X-Spam-Flag" . "Yes")) "*Regular expression for positive header spam matches." :type '(repeat (cons (string :tag "Header name") (regexp :tag "Regular expression to match spam header"))) :group 'elmo-spam-header) (defun elmo-spam-header-check-headers (fetch-field-function) (catch 'done (dolist (pair elmo-spam-header-good-alist) (let ((field-body (funcall fetch-field-function (car pair)))) (when (and field-body (string-match (cdr pair) field-body)) (throw 'done nil)))) (dolist (pair elmo-spam-header-spam-alist) (let ((field-body (funcall fetch-field-function (car pair)))) (when (and field-body (string-match (cdr pair) field-body)) (throw 'done t)))))) (luna-define-method elmo-spam-buffer-spam-p ((_processor elsp-header) buffer &optional _register) (with-current-buffer buffer (save-restriction (std11-narrow-to-header) (elmo-spam-header-check-headers #'elmo-decoded-fetch-field)))) (luna-define-method elmo-spam-message-spam-p ((_processor elsp-header) folder number &optional _register) (let ((entity (elmo-message-entity folder number)) buffer) (unwind-protect (save-excursion (elmo-spam-header-check-headers (lambda (field-name) (or (elmo-message-entity-field entity (intern (downcase field-name)) 'string) (progn (unless buffer (setq buffer (get-buffer-create (generate-new-buffer-name " *elmo-spam-work*"))) (set-buffer buffer) (elmo-spam-message-fetch folder number) (std11-narrow-to-header)) (elmo-decoded-fetch-field field-name)))))) (and buffer (kill-buffer buffer))))) (luna-define-method elmo-spam-register-spam-messages ((_processor elsp-header) _folder &optional numbers _restore) (elmo-progress-notify 'elmo-spam-register (length numbers))) (luna-define-method elmo-spam-register-good-messages ((_processor elsp-header) _folder &optional numbers _restore) (elmo-progress-notify 'elmo-spam-register (length numbers))) (provide 'elsp-header) (require 'product) (product-provide (provide 'elmo-spam) (require 'elmo-version)) ;;; elmo-spam.el ends here wanderlust-wanderlust-769699d/elmo/elmo-split.el000066400000000000000000000337051406661363500217600ustar00rootroot00000000000000;;; elmo-split.el --- Split messages according to the user defined rules. -*- lexical-binding: t -*- ;; Copyright (C) 2002 Yuuichi Teranishi ;; Author: Yuuichi Teranishi ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;; Put following lines on your .emacs. ;; ;; (autoload 'elmo-split "elmo-split" "Split messages on the folder." t) ;; ;; A command elmo-split is provided. If you enter: ;; ;; M-x elmo-split ;; ;; Messages in the `elmo-split-folder' are splitted to the folders ;; according to the definition of `elmo-split-rule'. ;; ;;; Code: (require 'cl-lib) (require 'elmo) (defcustom elmo-split-rule nil "Split rule for the command `elmo-split'. The format of this variable is a list of RULEs which has form like: \(CONDITION ACTION [continue]\) The 1st element CONDITION is a sexp which consists of following. 1. Functions which accept arguments FIELD-NAME and VALUE. FIELD-NAME is a symbol of the field name. `equal' ... True if the field value equals to VALUE. Case of the letters are ignored. `match' ... True if the field value matches to VALUE. VALUE can contain \\& and \\N which will substitute from matching \\(\\) patterns in the previous VALUE. `address-equal' ... True if one of the addresses in the field equals to VALUE. Case of the letters are ignored. `address-match' ... True if one of the addresses in the field matches to VALUE. VALUE can contain \\& and \\N which will substitute from matching \\(\\) patterns in the previous VALUE. FIELD-NAME can be a list of field names, return true if any of the fields satisfy the condition. 2. Functions which accept an argument SIZE, SIZE is some number. `<' ... True if the size of the message is less than SIZE. `>' ... True if the size of the message is greater than SIZE. 3. Functions which accept any number of arguments. `or' ... True if one of the argument returns true. `and' ... True if all of the arguments return true. `spam-p' ... True if contents of the message is guessed as spam. Rest arguments are property list which consists following. `:register' ... If this value is non-nil, Register according to the classification. 5. A symbol. When a symbol is specified, it is evaluated. The 2nd element ACTION is the name of the destination folder or some symbol. If CONDITION is satisfied, the message is splitted according to this value. If ACTION is a string, it will be considered as the name of destination folder. Symbol `delete' means that the substance of the message will be removed. On the other hand, symbol `noop' is used to do nothing and keep the substance of the message as it is. Or, if some function is specified, it will be called. When the 3rd element `continue' is specified as symbol, evaluating rules is not stopped even when the condition is satisfied. Example: \(setq elmo-split-rule ;; Messages from spammers are stored in `+junk' '(((or (address-equal from \"i.am@spammer\") (address-equal from \"dull-work@dull-boy\") (address-equal from \"death-march@software\") (address-equal from \"ares@aon.at\") (address-equal from \"get-money@richman\")) \"+junk\") ;; Messages from mule mailing list are stored in `%mule' ((equal x-ml-name \"mule\") \"%mule\") ;; Messages from wanderlust mailing list are stored in `%wanderlust' ;; and continue evaluating following rules. ((equal x-ml-name \"wanderlust\") \"%wanderlust\" continue) ;; Messages from DoCoMo user are stored in `+docomo-{username}'. ((match from \"\\\\(.*\\\\)@docomo\\\\.ne\\\\.jp\") \"+docomo-\\\\1\") ;; Unmatched mails go to `+inbox'. (t \"+inbox\")))" :group 'elmo :type 'sexp) (defcustom elmo-split-folder "%inbox" "Target folder or list of folders for splitting." :type '(choice (string :tag "folder name") (repeat (string :tag "folder name"))) :group 'elmo) (defcustom elmo-split-default-action 'noop "Default action for messages which pass all rules. It can be some ACTION as in `elmo-split-rule'." :type '(choice (const :tag "do not touch" noop) (const :tag "delete" delete) (string :tag "folder name") (function :tag "function")) :group 'elmo) (defcustom elmo-split-log-coding-system 'x-ctext "A coding-system for writing log file." :type 'coding-system :group 'elmo) (defcustom elmo-split-log-file "~/.elmo/split-log" "The file name of the split log." :type 'file :group 'elmo) ;;; (defvar elmo-split-match-string-internal nil "Internal variable for string matching. Don't touch this variable by hand.") (defvar elmo-split-message-entity nil "Buffer local variable to store mime-entity.") (make-variable-buffer-local 'elmo-split-message-entity) ;;; (defun elmo-split-or (buffer &rest args) (catch 'done (dolist (arg args) (if (elmo-split-eval buffer arg) (throw 'done t))) nil)) (defun elmo-split-and (buffer &rest args) (catch 'done (dolist (arg args) (unless (elmo-split-eval buffer arg) (throw 'done nil))) t)) (defun elmo-split-> (buffer size) (> (buffer-size buffer) size)) (defun elmo-split-< (buffer size) (< (buffer-size buffer) size)) (defun elmo-split-address-equal (buffer field-or-fields value) (with-current-buffer buffer (let (result) (dolist (field (if (listp field-or-fields) field-or-fields (list field-or-fields))) (let ((addrs (mapcar 'std11-address-string (std11-parse-addresses-string (std11-field-body (symbol-name field))))) (case-fold-search t)) (while addrs (when (string-match (concat "^" (regexp-quote value) "$") (car addrs)) (setq addrs nil result t)) (setq addrs (cdr addrs))))) result))) (defun elmo-split-address-match (buffer field-or-fields value) (with-current-buffer buffer (let (result) (dolist (field (if (listp field-or-fields) field-or-fields (list field-or-fields))) (let ((addrs (mapcar 'std11-address-string (std11-parse-addresses-string (std11-field-body (symbol-name field)))))) (while addrs (when (string-match value (car addrs)) (setq elmo-split-match-string-internal (car addrs) addrs nil result t)) (setq addrs (cdr addrs))))) result))) (defun elmo-split-fetch-decoded-field (entity field-name) (let ((sym (intern (capitalize field-name))) (field-body (mime-entity-fetch-field entity field-name))) (when field-body (mime-decode-field-body field-body sym 'plain)))) (defun elmo-split-equal (buffer field-or-fields value) (with-current-buffer buffer (let (result) (dolist (field (if (listp field-or-fields) field-or-fields (list field-or-fields))) (let ((field-value (and elmo-split-message-entity (elmo-split-fetch-decoded-field elmo-split-message-entity (symbol-name field))))) (setq result (or result (equal field-value value))))) result))) (autoload 'elmo-spam-buffer-spam-p "elmo-spam") (autoload 'elmo-spam-processor "elmo-spam") (defun elmo-split-spam-p (buffer &rest plist) (elmo-spam-buffer-spam-p (elmo-spam-processor) buffer (plist-get plist :register))) (defun elmo-split-match (buffer field-or-fields value) (with-current-buffer buffer (let (result) (dolist (field (if (listp field-or-fields) field-or-fields (list field-or-fields))) (let ((field-value (and elmo-split-message-entity (elmo-split-fetch-decoded-field elmo-split-message-entity (symbol-name field))))) (and field-value (when (string-match value field-value) (setq result t) (setq elmo-split-match-string-internal field-value))))) result))) (defun elmo-split-eval (buffer sexp) (cond ((consp sexp) (apply (intern (concat "elmo-split-" (symbol-name (car sexp)))) buffer (cdr sexp))) ((stringp sexp) (std11-field-body sexp)) (t (eval sexp)))) (defun elmo-split-log (message reharsal) (with-current-buffer (get-buffer-create "*elmo-split*") (goto-char (point-max)) (let ((start (point)) (coding-system-for-write elmo-split-log-coding-system)) (insert message) (if reharsal (progn (pop-to-buffer (current-buffer)) (sit-for 0)) (write-region start (point) elmo-split-log-file t 'no-msg))))) ;;;###autoload (defun elmo-split (&optional arg) "Split messages in the `elmo-split-folder' according to `elmo-split-rule'. If prefix argument ARG is specified, do a reharsal (no harm)." (interactive "P") (unless elmo-split-rule (error "Split rule does not exist. Set `elmo-split-rule' first")) (let ((folders (if (listp elmo-split-folder) elmo-split-folder (list elmo-split-folder))) (count 0) (fcount 0) ret) (dolist (folder folders) (setq ret (elmo-split-subr (elmo-get-folder folder) arg) count (+ count (car ret)) fcount (+ fcount (cdr ret)))) (run-hooks 'elmo-split-hook) (message (concat (cond ((zerop count) "No message is splitted") ((eq count 1) "1 message is splitted") (t (format "%d messages are splitted" count))) (if (zerop fcount) "." (format " (%d failure)." fcount)))) count)) (defun elmo-split-subr (folder &optional reharsal) (let ((count 0) (fcount 0) (default-rule `((t ,elmo-split-default-action))) msgs action target-folder failure delete-substance record-log log-string flags) (message "Splitting...") (elmo-folder-open-internal folder) (setq msgs (elmo-folder-list-messages folder)) (elmo-with-progress-display (elmo-split (length msgs)) "Splitting messages" (unwind-protect (with-temp-buffer (set-buffer-multibyte nil) (dolist (msg msgs) (erase-buffer) (when (ignore-errors (elmo-message-fetch folder msg (elmo-make-fetch-strategy 'entire) 'unread)) (run-hooks 'elmo-split-fetch-hook) (setq elmo-split-message-entity (mime-parse-buffer)) (setq flags (elmo-message-flags-for-append folder msg)) (catch 'terminate (dolist (rule (append elmo-split-rule default-rule)) (setq elmo-split-match-string-internal nil) (when (elmo-split-eval (current-buffer) (car rule)) (if (and (stringp (nth 1 rule)) elmo-split-match-string-internal) (setq action (elmo-expand-newtext (nth 1 rule) elmo-split-match-string-internal)) (setq action (nth 1 rule))) ;; 1. ACTION & DELETION (unless reharsal (setq failure nil delete-substance nil record-log nil log-string nil) (cond ((stringp action) (condition-case nil (progn (setq target-folder (elmo-get-folder action)) (unless (elmo-folder-exists-p target-folder) (when (and (elmo-folder-creatable-p target-folder) (y-or-n-p (format "Folder %s does not exist, Create it? " action))) (elmo-folder-create target-folder))) (elmo-folder-open-internal target-folder) (setq failure (not (elmo-folder-append-buffer target-folder flags))) (elmo-folder-close-internal target-folder)) (error (setq failure t) (cl-incf fcount))) (setq record-log t delete-substance (not (or failure (eq (nth 2 rule) 'continue)))) (cl-incf count)) ((eq action 'delete) (setq record-log t delete-substance t)) ((eq action 'noop) ;; do nothing ) ((functionp action) (funcall action)) (t (error "Wrong action specified in elmo-split-rule"))) (when delete-substance (ignore-errors (elmo-folder-delete-messages folder (list msg))))) ;; 2. RECORD LOG (when (or record-log reharsal) (elmo-split-log (concat "From " (nth 1 (std11-extract-address-components (or (std11-field-body "from") ""))) " " (or (std11-field-body "date") "") "\n" " Subject: " (eword-decode-string (or (std11-field-body "subject") "")) "\n" (if reharsal (cond ((stringp action) (concat " Test: " action "\n")) ((eq action 'delete) " Test: /dev/null\n") ((eq action 'noop) " Test: do nothing\n") ((functionp action) (format " Test: function:%s\n" (prin1-to-string action))) (t " ERROR: wrong action specified\n")) (cond (failure (concat " FAILED: " action "\n")) ((stringp action) (concat " Folder: " action "\n")) ((eq action 'delete) " Deleted\n") (log-string log-string) (t (debug))))) reharsal)) ;; 3. CONTINUATION CHECK (unless (eq (nth 2 rule) 'continue) (throw 'terminate nil)))))) (elmo-progress-notify 'elmo-split))) (elmo-folder-close-internal folder))) (cons count fcount))) (require 'product) (product-provide (provide 'elmo-split) (require 'elmo-version)) ;;; elmo-split.el ends here wanderlust-wanderlust-769699d/elmo/elmo-util.el000066400000000000000000002023371406661363500216010ustar00rootroot00000000000000;;; elmo-util.el --- Utilities for ELMO. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Author: Yuuichi Teranishi ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'timezone) (require 'mcharset) (require 'pces) (require 'luna) (require 'std11) (require 'eword-decode) (require 'elmo-vars) (require 'cl-lib) (eval-when-compile (require 'static)) (eval-and-compile (autoload 'md5 "md5")) (defvar elmo-work-buf-name " *elmo work*") (defvar elmo-temp-buf-name " *elmo temp*") (make-obsolete 'elmo-with-enable-multibyte "obsoleted" "25 Oct 2020") (make-obsolete 'elmo-mime-charset-decode-string 'mime-charset-decode-string "25 Oct 2020") (make-obsolete 'elmo-mime-charset-encode-string 'mime-charset-encode-string "25 Oct 2020") (defun elmo-base64-encode-string (_string &optional _no-line-break)) (defun elmo-base64-decode-string (_string)) ;; base64 encoding/decoding (require 'mel) (fset 'elmo-base64-encode-string (mel-find-function 'mime-encode-string "base64")) (fset 'elmo-base64-decode-string (mel-find-function 'mime-decode-string "base64")) (eval-and-compile (if elmo-use-hardlink (defalias 'elmo-add-name-to-file 'add-name-to-file) (defun elmo-add-name-to-file (filename newname &optional ok-if-already-exists) (copy-file filename newname ok-if-already-exists t)))) (defmacro elmo-set-work-buf (&rest body) "Execute BODY on work buffer. Work buffer remains." `(with-current-buffer (get-buffer-create elmo-work-buf-name) (set-buffer-multibyte t) (erase-buffer) ,@body)) (put 'elmo-set-work-buf 'lisp-indent-function 0) (def-edebug-spec elmo-set-work-buf t) (defmacro elmo-bind-directory (dir &rest body) "Set current directory DIR and execute BODY." `(let ((default-directory (file-name-as-directory ,dir))) ,@body)) (put 'elmo-bind-directory 'lisp-indent-function 1) (def-edebug-spec elmo-bind-directory (form &rest form)) (defalias 'elmo-safe-plist-get 'plist-get) (make-obsolete 'elmo-safe-plist-get 'plist-get "24 May 2020") (defun elmo-set-auto-coding () "Find coding system used to decode the contents of the current buffer. This function looks for the coding system magic cookie." (let (auto-coding-alist) (condition-case error (funcall set-auto-coding-function "" (- (point-max) (point-min))) (error (message "Error in %s, %s" set-auto-coding-function (cdr error)) nil)))) (defun elmo-object-load (filename &optional mime-charset no-err) "Load OBJECT from the file specified by FILENAME. File content is decoded with MIME-CHARSET." (if (not (file-readable-p filename)) nil (with-temp-buffer (insert-file-contents-literally filename) (let ((coding-system (or (elmo-set-auto-coding) (mime-charset-to-coding-system mime-charset)))) (when coding-system (decode-coding-region (point-min) (point-max) coding-system))) (goto-char (point-min)) (condition-case nil (read (current-buffer)) (error (unless no-err (message "Warning: Loading object from %s failed." filename) (elmo-object-save filename nil mime-charset)) nil))))) (defsubst elmo-save-buffer (filename &optional mime-charset) "Save current buffer to the file specified by FILENAME. Directory of the file is created if it doesn't exist. File content is encoded with MIME-CHARSET." (let ((dir (directory-file-name (file-name-directory filename)))) (if (file-directory-p dir) () ; ok. (unless (file-exists-p dir) (elmo-make-directory dir))) (if (file-writable-p filename) (progn (when mime-charset ;;; (set-buffer-multibyte default-enable-multibyte-characters) (encode-mime-charset-region (point-min) (point-max) mime-charset)) (as-binary-output-file (write-region (point-min) (point-max) filename nil 'no-msg))) (message "%s is not writable." filename)))) (defun elmo-object-save (filename object &optional mime-charset) "Save OBJECT to the file specified by FILENAME. Directory of the file is created if it doesn't exist. File content is encoded with MIME-CHARSET." (with-temp-buffer (let (print-length print-level) (prin1 object (current-buffer))) (when mime-charset (let ((coding (mime-charset-to-coding-system (or (detect-mime-charset-region (point-min) (point-max)) mime-charset)))) (goto-char (point-min)) (insert ";;; -*- mode: emacs-lisp; coding: " (symbol-name coding) " -*-\n") (encode-coding-region (point-min) (point-max) coding))) (elmo-save-buffer filename))) ;;; Search Condition (defconst elmo-condition-atom-regexp "[^/ \")|&]*") (defsubst elmo-condition-parse-error () (error "Syntax error in '%s'" (buffer-string))) (defun elmo-parse-search-condition (condition) "Parse CONDITION. Return value is a cons cell of (STRUCTURE . REST)" (with-temp-buffer (insert condition) (goto-char (point-min)) (cons (elmo-condition-parse) (buffer-substring (point) (point-max))))) ;; condition ::= or-expr (defun elmo-condition-parse () (or (elmo-condition-parse-or-expr) (elmo-condition-parse-error))) ;; or-expr ::= and-expr / ;; and-expr "|" or-expr (defun elmo-condition-parse-or-expr () (let ((left (elmo-condition-parse-and-expr))) (if (looking-at "| *") (progn (goto-char (match-end 0)) (list 'or left (elmo-condition-parse-or-expr))) left))) ;; and-expr ::= primitive / ;; primitive "&" and-expr (defun elmo-condition-parse-and-expr () (let ((left (elmo-condition-parse-primitive))) (if (looking-at "& *") (progn (goto-char (match-end 0)) (list 'and left (elmo-condition-parse-and-expr))) left))) ;; primitive ::= "(" expr ")" / ;; ["!"] search-key SPACE* ":" SPACE* search-value (defun elmo-condition-parse-primitive () (cond ((looking-at "( *") (goto-char (match-end 0)) (prog1 (elmo-condition-parse) (unless (looking-at ") *") (elmo-condition-parse-error)) (goto-char (match-end 0)))) ;; search-key ::= [A-Za-z-]+ ;; ;; "since" / "before" / "last" / "first" / ;; ;; "body" / "flag" / field-name ((looking-at "\\(!\\)? *\\([A-Za-z-]+\\) *: *") (goto-char (match-end 0)) (let ((search-key (vector (if (match-beginning 1) 'unmatch 'match) (downcase (match-string-no-properties 2)) (elmo-condition-parse-search-value)))) ;; syntax sugar. (if (string= (aref search-key 1) "tocc") (if (eq (aref search-key 0) 'match) (list 'or (vector 'match "to" (aref search-key 2)) (vector 'match "cc" (aref search-key 2))) (list 'and (vector 'unmatch "to" (aref search-key 2)) (vector 'unmatch "cc" (aref search-key 2)))) search-key))))) ;; search-value ::= quoted / time / number / atom ;; quoted ::= ;; time ::= "yesterday" / "lastweek" / "lastmonth" / "lastyear" / ;; number SPACE* "daysago" / ;; number "-" month "-" number ; ex. 10-May-2000 ;; number "-" number "-" number ; ex. 2000-05-10 ;; number ::= [0-9]+ ;; month ::= "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" / ;; "Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec" ;; atom ::= ATOM_CHARS* ;; SPACE ::= ;; ATOM_CHARS ::= ;; specials ::= SPACE / <"> / / <)> / <|> / <&> ;; ;; These characters should be quoted. (defun elmo-condition-parse-search-value () (cond ((looking-at "\"") (read (current-buffer))) ((or (looking-at elmo-condition-atom-regexp) (looking-at "yesterday") (looking-at "lastweek") (looking-at "lastmonth") (looking-at "lastyear") (looking-at "[0-9]+ *daysago") (looking-at "[0-9]+-[A-Za-z]+-[0-9]+") (looking-at "[0-9]+-[0-9]+-[0-9]+") (looking-at "[0-9]+")) (prog1 (match-string-no-properties 0) (goto-char (match-end 0)))) (t (error "Syntax error '%s'" (buffer-string))))) (defmacro elmo-filter-condition-p (filter) `(or (vectorp ,filter) (consp ,filter))) (defmacro elmo-filter-type (filter) `(aref ,filter 0)) (defmacro elmo-filter-key (filter) `(aref ,filter 1)) (defmacro elmo-filter-value (filter) `(aref ,filter 2)) (defun elmo-condition-match (condition match-primitive args) (cond ((vectorp condition) (if (eq (elmo-filter-type condition) 'unmatch) (not (apply match-primitive condition args)) (apply match-primitive condition args))) ((eq (car condition) 'and) (let ((lhs (elmo-condition-match (nth 1 condition) match-primitive args))) (cond ((elmo-filter-condition-p lhs) (let ((rhs (elmo-condition-match (nth 2 condition) match-primitive args))) (cond ((elmo-filter-condition-p rhs) (list 'and lhs rhs)) (rhs lhs)))) (lhs (elmo-condition-match (nth 2 condition) match-primitive args))))) ((eq (car condition) 'or) (let ((lhs (elmo-condition-match (nth 1 condition) match-primitive args))) (cond ((elmo-filter-condition-p lhs) (let ((rhs (elmo-condition-match (nth 2 condition) match-primitive args))) (cond ((elmo-filter-condition-p rhs) (list 'or lhs rhs)) (rhs t) (t lhs)))) (lhs t) (t (elmo-condition-match (nth 2 condition) match-primitive args))))))) (defun elmo-condition-optimize (condition) (cond ((vectorp condition) (let ((key (elmo-filter-key condition))) (cond ((cdr (assoc key '(("first" . 0) ("last" . 0) ("flag" . 1) ("body" . 5))))) ((member key '("since" "before" "from" "subject" "to" "cc")) 2) ((member key elmo-msgdb-extra-fields) 3) (t 4)))) (t (let ((weight-l (elmo-condition-optimize (nth 1 condition))) (weight-r (elmo-condition-optimize (nth 2 condition)))) (if (> weight-l weight-r) (let ((lhs (nth 1 condition))) (setcar (nthcdr 1 condition) (nth 2 condition)) (setcar (nthcdr 2 condition) lhs) weight-l) weight-r))))) ;;; (defsubst elmo-replace-char-in-string (char newchar string &optional no-modify) "Replace CHAR in STRING with NEWCHAR and return modified STRING. When NO-NODIFY is non-nil, dont' modify STRING and return new string." (when no-modify (setq string (copy-sequence string))) (dotimes (c (length string)) (when (eq (aref string c) char) (aset string c newchar))) string) (defsubst elmo-buffer-replace (regexp &optional newtext) (goto-char (point-min)) (while (re-search-forward regexp nil t) (replace-match (or newtext "")))) (defsubst elmo-delete-char (char string &optional unibyte) (save-match-data (elmo-set-work-buf (let ((coding-system-for-read 'no-conversion) (coding-system-for-write 'no-conversion)) (if unibyte (set-buffer-multibyte nil)) (insert string) (goto-char (point-min)) (while (search-forward (char-to-string char) nil t) (replace-match "")) (buffer-string))))) (defsubst elmo-delete-cr-region (start end) "Delete CR from region." (let (inhibit-eol-conversion) (decode-coding-region start (or end (point-max)) 'raw-text-dos))) (defsubst elmo-delete-cr-buffer () "Delete CR from buffer." (elmo-delete-cr-region (point-min) nil)) (defun elmo-delete-cr (string) (let (inhibit-eol-conversion) (decode-coding-string string 'raw-text-dos))) (defun elmo-last (list) (and list (nth (1- (length list)) list))) (make-obsolete 'elmo-set-list "works only on dynamic bindings" "01 Jun 2020") (defun elmo-uniq-list (lst &optional delete-function) "Destructively uniquify elements of LST." (setq delete-function (or delete-function #'delete)) (let ((tmp lst)) (while tmp (setq tmp (setcdr tmp (and (cdr tmp) (funcall delete-function (car tmp) (cdr tmp))))))) lst) (defun elmo-uniq-sorted-list (list &optional equal-function) "Destructively uniquify elements of sorted LIST." (setq equal-function (or equal-function #'equal)) (let ((list list)) (while list (while (funcall equal-function (car list) (cadr list)) (setcdr list (cddr list))) (setq list (cdr list)))) list) (defun elmo-sort-uniq-number-list (list) (elmo-uniq-sorted-list (sort list #'<) #'eq)) (defun elmo-union (l1 l2) "Make a union of two lists" (elmo-sort-uniq-number-list (append l1 l2))) (defun elmo-list-insert (list element after) (let ((match (memq after list))) (if match (progn (setcdr match (cons element (cdr match))) list) (nconc list (cons element nil))))) (defun elmo-get-file-string (filename &optional remove-final-newline) (if (file-exists-p filename) (elmo-set-work-buf (as-binary-input-file (insert-file-contents filename)) (when (and remove-final-newline (> (buffer-size) 0) (= (char-before (point-max)) ?\n)) (goto-char (point-max)) (delete-char -1)) (buffer-string)) "")) (defun elmo-save-string (string filename) (if string (elmo-set-work-buf (as-binary-output-file (insert string) (write-region (point-min) (point-max) filename nil 'no-msg))))) (defun elmo-max-of-list (nlist) (apply #'max 0 nlist)) (defun elmo-read-number (prompt &optional default) (let (result) (when (numberp default) (setq default (number-to-string default))) (setq prompt (apply 'concat prompt (when default `("(default " ,default ") ")))) (while (null (numberp (setq result (condition-case nil (read-from-minibuffer prompt nil nil t nil default) (error nil))))) (message "Please input a number.") (sit-for 1)) result)) (defun elmo-concat-path (path filename) (if (not (string= path "")) (replace-regexp-in-string (concat (regexp-quote elmo-path-sep)(regexp-quote elmo-path-sep)) elmo-path-sep (if (string= elmo-path-sep (substring path (- (length path) 1))) (concat path filename) (concat path elmo-path-sep filename)) t t) filename)) (eval-and-compile (autoload 'elmo-passwd-clear "elmo-passwd") (autoload 'elmo-passwd-save "elmo-passwd") (autoload 'elmo-passwd-get "elmo-passwd") (autoload 'elmo-passwd-remove "elmo-passwd")) (defun elmo-passwd-storage () (require 'elmo-passwd) (if elmo-passwd-storage elmo-passwd-storage (setq elmo-passwd-storage (luna-make-entity (intern (concat "elmo-passwd-" (symbol-name elmo-passwd-storage-type))))))) (defun elmo-passwd-alist-clear () "Clear password cache." (interactive) (when elmo-passwd-storage (elmo-passwd-clear elmo-passwd-storage) (setq elmo-passwd-storage nil))) (defun elmo-passwd-alist-save () "Save password into file." (interactive) (elmo-passwd-save (elmo-passwd-storage))) (defun elmo-get-passwd (key) "Get password from password pool." (elmo-passwd-get (elmo-passwd-storage) key)) (defun elmo-remove-passwd (key) "Remove password from password pool (for failure)." (elmo-passwd-remove (elmo-passwd-storage) key)) (defun elmo-string-to-list (string) (read (concat "(" string ")"))) (defun elmo-list-to-string (list) (if (listp list) (concat "(" (mapconcat (lambda (elt) (if (symbolp elt) (symbol-name elt) elt)) list " ") ")") (if (symbolp list) (symbol-name list) list))) (defalias 'elmo-clear-string 'clear-string) (make-obsolete 'elmo-clear-string 'clear-string "24 May 2020") (defun elmo-plug-on-by-servers (_alist &optional servers) (let ((server-list (or servers elmo-plug-on-servers))) (catch 'plugged (while server-list (if (elmo-plugged-p (car server-list)) (throw 'plugged t)) (setq server-list (cdr server-list)))))) (defun elmo-plug-on-by-exclude-servers (alist &optional servers) (let ((server-list (or servers elmo-plug-on-exclude-servers)) server other-servers) (while alist (when (and (not (member (setq server (cl-caaar alist)) server-list)) (not (member server other-servers))) (push server other-servers)) (setq alist (cdr alist))) (elmo-plug-on-by-servers alist other-servers))) (defun elmo-plugged-p (&optional server port stream-type alist label-exp) (let ((alist (or alist elmo-plugged-alist)) plugged-info) (cond ((and (not port) (not server)) (cond ((eq elmo-plugged-condition 'one) (if alist (catch 'plugged (while alist (if (nth 2 (car alist)) (throw 'plugged t)) (setq alist (cdr alist)))) elmo-plugged)) ((eq elmo-plugged-condition 'all) (if alist (catch 'plugged (while alist (if (not (nth 2 (car alist))) (throw 'plugged nil)) (setq alist (cdr alist))) t) elmo-plugged)) ((functionp elmo-plugged-condition) (funcall elmo-plugged-condition alist)) (t ;; independent elmo-plugged))) ((not port) ;; server (catch 'plugged (while alist (when (string= server (cl-caaar alist)) (if (nth 2 (car alist)) (throw 'plugged t))) (setq alist (cdr alist))))) (t (setq plugged-info (assoc (list server port stream-type) alist)) (if (not plugged-info) ;; add elmo-plugged-alist automatically (progn (elmo-set-plugged elmo-plugged server port stream-type nil nil nil label-exp) elmo-plugged) (if (and elmo-auto-change-plugged (> elmo-auto-change-plugged 0) (nth 3 plugged-info) ;; time (elmo-time-expire (nth 3 plugged-info) elmo-auto-change-plugged)) t (nth 2 plugged-info))))))) (defun elmo-set-plugged (plugged &optional server port stream-type time alist label-exp add) (let ((alist (or alist elmo-plugged-alist)) label plugged-info) (cond ((and (not port) (not server)) (setq elmo-plugged plugged) ;; set plugged all element of elmo-plugged-alist. (while alist (setcdr (cdar alist) (list plugged time)) (setq alist (cdr alist)))) ((not port) ;; set plugged all port of server (while alist (when (string= server (cl-caaar alist)) (setcdr (cdar alist) (list plugged time))) (setq alist (cdr alist)))) (t ;; set plugged one port of server (setq plugged-info (assoc (list server port stream-type) alist)) (setq label (if label-exp (eval label-exp) (nth 1 plugged-info))) (if plugged-info ;; if add is non-nil, don't reset plug state. (unless add (setcdr plugged-info (list label plugged time))) (setq alist (setq elmo-plugged-alist (nconc elmo-plugged-alist (list (list (list server port stream-type) label plugged time)))))))) alist)) (defun elmo-delete-plugged (&optional server port alist) (let* ((alist (or alist elmo-plugged-alist)) (alist2 alist)) (cond ((and (not port) (not server)) (setq alist nil)) ((not port) ;; delete plugged all port of server (while alist2 (when (string= server (cl-caaar alist2)) (setq alist (delete (car alist2) alist))) (setq alist2 (cdr alist2)))) (t ;; delete plugged one port of server (setq alist (delete (assoc (cons server port) alist) alist)))) alist)) (defun elmo-disk-usage (path) "Get disk usage (bytes) in PATH." (let ((file-attr (condition-case () (file-attributes path) (error nil)))) (if file-attr (if (nth 0 file-attr) ; directory (let ((files (condition-case () (directory-files path t "^[^\\.]") (error nil))) (result 0.0)) ;;; (result (nth 7 file-attr))) ; ... directory size (while files (setq result (+ result (or (elmo-disk-usage (car files)) 0))) (setq files (cdr files))) result) (float (nth 7 file-attr))) 0))) (defun elmo-get-last-accessed-time (path &optional dir) "Return the last accessed time of PATH." (let ((last-accessed (nth 4 (file-attributes (or (and dir (expand-file-name path dir)) path))))) (if last-accessed (setq last-accessed (+ (* (nth 0 last-accessed) (float 65536)) (nth 1 last-accessed))) 0))) (defun elmo-get-last-modification-time (path &optional dir) "Return the last accessed time of PATH." (let ((last-modified (nth 5 (file-attributes (or (and dir (expand-file-name path dir)) path))))) (setq last-modified (+ (* (nth 0 last-modified) (float 65536)) (nth 1 last-modified))))) (defun elmo-make-directory (path &optional mode) "Create directory recursively." (let ((parent (directory-file-name (file-name-directory path)))) (if (null (file-directory-p parent)) (elmo-make-directory parent)) (make-directory path) (set-file-modes path (or mode (+ (* 64 7) (* 8 0) 0))))) ; chmod 0700 (defun elmo-delete-directory (path &optional no-hierarchy) "Delete directory recursively." (if (stringp path) ; nil is not permitted. (let ((dirent (directory-files path)) relpath abspath hierarchy) (while dirent (setq relpath (car dirent) dirent (cdr dirent) abspath (expand-file-name relpath path)) (when (not (string-match "^\\.\\.?$" relpath)) (if (eq (nth 0 (file-attributes abspath)) t) (if no-hierarchy (setq hierarchy t) (elmo-delete-directory abspath no-hierarchy)) (delete-file abspath)))) (unless hierarchy (delete-directory path))))) (defun elmo-delete-match-files (path regexp &optional remove-if-empty) "Delete directory files specified by PATH. If optional REMOVE-IF-EMPTY is non-nil, delete directory itself if the directory becomes empty after deletion." (when (stringp path) ; nil is not permitted. (dolist (file (directory-files path t regexp)) (delete-file file)) (if remove-if-empty (ignore-errors (delete-directory path) ; should be removed if empty. )))) (defun elmo-list-filter (l1 l2) "Return a list from L2 in which each element is a member of L1." (let (result) (dolist (element l2) (if (memq element l1) (setq result (cons element result)))) (nreverse result))) (defsubst elmo-list-delete-if-smaller (list number) (let ((ret-val (copy-sequence list))) (while list (if (< (car list) number) (setq ret-val (delq (car list) ret-val))) (setq list (cdr list))) ret-val)) (defun elmo-list-diff (list1 list2) (if (equal list1 list2) (list nil nil) (let ((clist1 (sort (copy-sequence list1) #'<)) (clist2 (sort (copy-sequence list2) #'<)) list1-only list2-only) (while (and clist1 clist2) (cond ((eq (car clist1) (car clist2)) (setq clist1 (cdr clist1) clist2 (cdr clist2))) ((car-less-than-car clist1 clist2) (setq list1-only (cons (car clist1) list1-only) clist1 (cdr clist1))) (t ;; (car-less-than-car clist2 clist1) (setq list2-only (cons (car clist2) list2-only) clist2 (cdr clist2))))) ;; Keep sorted orders. (list (nconc (nreverse list1-only) clist1) (nconc (nreverse list2-only) clist2))))) (defun elmo-list-diff-nonsortable (list1 list2) (let ((clist1 (copy-sequence list1)) (clist2 (copy-sequence list2))) (while list2 (setq clist1 (delq (car list2) clist1)) (setq list2 (cdr list2))) (while list1 (setq clist2 (delq (car list1) clist2)) (setq list1 (cdr list1))) (list clist1 clist2))) (defmacro elmo-get-hash-val (string hashtable) `(symbol-value (intern-soft ,string ,hashtable))) (defmacro elmo-set-hash-val (string value hashtable) `(set (intern ,string ,hashtable) ,value)) (defmacro elmo-clear-hash-val (string hashtable) (list 'unintern string hashtable)) (defun elmo-make-hash (&optional hashsize) "Make a new hash table which have HASHSIZE size." (make-vector (if hashsize (max ;; Prime numbers as lengths tend to result in good ;; hashing; lengths one less than a power of two are ;; also good. (min (let ((i 1)) (while (< (- i 1) hashsize) (setq i (* 2 i))) (- i 1)) elmo-hash-maximum-size) elmo-hash-minimum-size) elmo-hash-minimum-size) 0)) (defsubst elmo-mime-string (string) "Normalize MIME encoded STRING." (and string (mime-charset-encode-string (or (ignore-errors (eword-decode-and-unfold-unstructured-field-body string)) string) elmo-mime-charset))) (defsubst elmo-collect-field (beg end downcase-field-name) (save-excursion (save-restriction (narrow-to-region beg end) (goto-char (point-min)) (let ((regexp (concat "\\(" std11-field-head-regexp "\\)[ \t]*")) dest name body) (while (re-search-forward regexp nil t) (setq name (buffer-substring-no-properties (match-beginning 1)(1- (match-end 1)))) (if downcase-field-name (setq name (downcase name))) (setq body (buffer-substring-no-properties (match-end 0) (std11-field-end))) (or (assoc name dest) (setq dest (cons (cons name body) dest)))) dest)))) (defsubst elmo-collect-field-from-string (string downcase-field-name) (with-temp-buffer (insert string) (goto-char (point-min)) (let ((regexp (concat "\\(" std11-field-head-regexp "\\)[ \t]*")) dest name body) (while (re-search-forward regexp nil t) (setq name (buffer-substring-no-properties (match-beginning 1)(1- (match-end 1)))) (if downcase-field-name (setq name (downcase name))) (setq body (buffer-substring-no-properties (match-end 0) (std11-field-end))) (or (assoc name dest) (setq dest (cons (cons name body) dest)))) dest))) (defun elmo-safe-filename (filename) (let* ((replace-alist '(("/" . " ") (":" . "__") ("|" . "_or_") ("\"" . "_Q_"))) (regexp (concat "[" (regexp-quote (mapconcat 'car replace-alist "")) "]")) (rest filename) converted) (while (string-match regexp rest) (setq converted (concat converted (substring rest 0 (match-beginning 0)) (cdr (assoc (substring rest (match-beginning 0) (match-end 0)) replace-alist))) rest (substring rest (match-end 0)))) (concat converted rest))) (defvar elmo-filename-replace-chars-regexp nil) (defsubst elmo-replace-string-as-filename (msgid) "Replace string as filename." (setq msgid (replace-regexp-in-string " " " " msgid t t)) (if (null elmo-filename-replace-chars-regexp) (setq elmo-filename-replace-chars-regexp (concat "[" (mapconcat 'car elmo-filename-replace-string-alist nil) "]"))) (while (string-match elmo-filename-replace-chars-regexp msgid) (setq msgid (concat (substring msgid 0 (match-beginning 0)) (cdr (assoc (substring msgid (match-beginning 0) (match-end 0)) elmo-filename-replace-string-alist)) (substring msgid (match-end 0))))) msgid) (defsubst elmo-recover-string-from-filename (filename) "Recover string from FILENAME." (let (tmp result) (while (string-match " " filename) (setq tmp (substring filename (match-beginning 0) (+ (match-end 0) 1))) (if (string= tmp " ") (setq tmp " ") (setq tmp (car (rassoc tmp elmo-filename-replace-string-alist)))) (setq result (concat result (substring filename 0 (match-beginning 0)) tmp)) (setq filename (substring filename (+ (match-end 0) 1)))) (concat result filename))) (defsubst elmo-copy-file (src dst &optional ok-if-already-exists) (condition-case nil (elmo-add-name-to-file src dst ok-if-already-exists) (error (copy-file src dst ok-if-already-exists t)))) (defsubst elmo-buffer-exists-p (buffer) (if (bufferp buffer) (buffer-live-p buffer) (get-buffer buffer))) (defsubst elmo-kill-buffer (buffer) (when (elmo-buffer-exists-p buffer) (kill-buffer buffer))) (defun elmo-delete-if (pred lst) "Return new list contain items which don't satisfy PRED in LST." (let (result) (while lst (unless (funcall pred (car lst)) (setq result (cons (car lst) result))) (setq lst (cdr lst))) (nreverse result))) (defun elmo-list-delete (list1 list2 &optional delete-function) "Delete by side effect any occurrences equal to elements of LIST1 from LIST2. Return the modified LIST2. Deletion is done with `delete'. Write `(setq foo (elmo-list-delete bar foo))' to be sure of changing the value of `foo'. If optional DELETE-FUNCTION is speficied, it is used as delete procedure." (setq delete-function (or delete-function 'delete)) (while list1 (setq list2 (funcall delete-function (car list1) list2)) (setq list1 (cdr list1))) list2) (defun elmo-list-member (list1 list2) "If any element of LIST1 is member of LIST2, return t." (catch 'done (while list1 (if (member (car list1) list2) (throw 'done t)) (setq list1 (cdr list1))))) (defun elmo-count-matches (regexp beg end) (let ((count 0)) (save-excursion (goto-char beg) (while (re-search-forward regexp end t) (setq count (1+ count))) count))) (defun elmo-display-error (error-object stream) "A tiny function to display ERROR-OBJECT to the STREAM." (let ((first t) (errobj error-object) err-mes) (while errobj (setq err-mes (concat err-mes (format (if (stringp (car errobj)) "%s" "%S") (car errobj)))) (setq errobj (cdr errobj)) (if errobj (setq err-mes (concat err-mes (if first ": " ", ")))) (setq first nil)) (princ err-mes stream))) (defalias 'elmo-define-error 'define-error) (make-obsolete 'elmo-define-error 'define-error "06 Jun 2020") (defvar elmo-progress-counter nil) (defalias 'elmo-progress-counter-label 'car-safe) (defmacro elmo-progress-counter-value (counter) `(aref (cdr ,counter) 0)) (defmacro elmo-progress-counter-set-value (counter value) `(aset (cdr ,counter) 0 ,value)) (defmacro elmo-progress-counter-total (counter) `(aref (cdr ,counter) 1)) (defmacro elmo-progress-counter-set-total (counter value) `(aset (cdr ,counter) 1 ,value)) (defmacro elmo-progress-counter-action (counter) `(aref (cdr ,counter) 2)) (defmacro elmo-progress-counter-set-action (counter action) `(aset (cdr ,counter) 2, action)) (defvar elmo-progress-callback-function nil) (defun elmo-progress-call-callback (counter &optional value) (when elmo-progress-callback-function (funcall elmo-progress-callback-function (elmo-progress-counter-label counter) (elmo-progress-counter-action counter) (or value (elmo-progress-counter-value counter)) (elmo-progress-counter-total counter)))) (defun elmo-progress-start (label total action) (when (and (null elmo-progress-counter) (or (null total) (> total 0))) (let ((counter (cons label (vector 0 total action)))) (elmo-progress-call-callback counter 'start) (setq elmo-progress-counter (cond ((null total) counter) ((elmo-progress-call-callback counter 'query) (elmo-progress-call-callback counter) counter) (t t))) counter))) (defun elmo-progress-clear (counter) (when counter (when (and (elmo-progress-counter-label elmo-progress-counter) (elmo-progress-counter-total elmo-progress-counter)) (elmo-progress-call-callback elmo-progress-counter 100)) (setq elmo-progress-counter nil))) (defun elmo-progress-done (counter) (when (elmo-progress-counter-label counter) (elmo-progress-call-callback counter 'done))) (defsubst elmo-progress-notify (label &rest params) (when (eq label (elmo-progress-counter-label elmo-progress-counter)) (let ((counter elmo-progress-counter)) (if (or (elmo-progress-counter-total counter) (and (elmo-progress-counter-set-total counter (plist-get params :total)) (elmo-progress-call-callback counter 'query))) (progn (elmo-progress-counter-set-value counter (or (plist-get params :set) (+ (elmo-progress-counter-value counter) (or (plist-get params :inc) (car params) 1)))) (elmo-progress-call-callback counter)) (setq elmo-progress-counter t))))) (defmacro elmo-with-progress-display (spec message &rest body) "Evaluate BODY with progress message and return its value. SPEC is a list as followed (LABEL TOTAL [VAR]). LABEL is an identifier what is specidied by `elmo-progress-notify'. If TOTAL is nil, the first `elmo-progress-notify' call must be with a `:total' parameter. If optional parameter VAR is specified, bind it with a progress counter object. MESSAGE is a doing part of progress message." (let ((label (nth 0 spec)) (total (nth 1 spec)) (var (or (nth 2 spec) (make-symbol "--elmo-progress-temp--")))) `(let ((,var (elmo-progress-start (quote ,label) ,total ,message))) (prog1 (unwind-protect (progn ,@body) (elmo-progress-clear ,var)) (elmo-progress-done ,var))))) (put 'elmo-with-progress-display 'lisp-indent-function '2) (def-edebug-spec elmo-with-progress-display ((symbolp form &optional symbolp) form &rest form)) (static-cond ((condition-case nil (progn (time-add 0 nil) (time-less-p 0 nil)) (error nil)) ;; Emacs 25 and later (defun elmo-time-expire (before-time diff-time) (time-less-p (time-add before-time diff-time) nil))) (t (defun elmo-time-expire (before-time diff-time) (< diff-time (float-time (time-subtract (current-time) before-time)))))) (defalias 'elmo-field-body 'std11-fetch-field) ;;no narrow-to-region (defun elmo-unfold-fetch-field (name) (let ((value (std11-fetch-field name))) (and value (std11-unfold-string value)))) (make-obsolete 'elmo-unfold-field-body 'elmo-unfold-fetch-field "30 Jul 2012") (defun elmo-decoded-fetch-field (field-name &optional mode) (let ((field-body (std11-fetch-field field-name))) (and field-body (or (ignore-errors (mime-decode-field-body field-body field-name mode)) field-body)))) (make-obsolete 'elmo-decoded-field-body 'elmo-decoded-fetch-field "30 Jul 2012") (defun elmo-address-quote-specials (word) "Make quoted string of WORD if needed." (let ((lal (std11-lexical-analyze word))) (if (or (assq 'specials lal) (assq 'domain-literal lal)) (prin1-to-string word) word))) (defalias 'elmo-string 'substring-no-properties) (make-obsolete 'elmo-string 'substring-no-properties "24 May 2020") (defun elmo-flatten (list-of-list) "Flatten LIST-OF-LIST." (and list-of-list (apply #'append (mapcar (lambda (element) (if (listp element) element (list element))) list-of-list)))) (defun elmo-y-or-n-p (prompt &optional auto default) "Same as `y-or-n-p'. But if optional argument AUTO is non-nil, DEFAULT is returned." (if auto default (y-or-n-p prompt))) (defun elmo-string-member (string slist) (catch 'found (dolist (element slist) (cond ((null element)) ((stringp element) (when (string= string element) (throw 'found t))) ((symbolp element) (when (string= string (symbol-value element)) (throw 'found t))))))) (defalias 'elmo-string-member-ignore-case 'member-ignore-case) (make-obsolete 'elmo-string-member-ignore-case 'member-ignore-case "24 May 2020") (defun elmo-string-match-member (str list &optional case-ignore) (let ((case-fold-search case-ignore)) (catch 'member (while list (if (string-match (car list) str) (throw 'member (car list))) (setq list (cdr list)))))) (defun elmo-string-matched-member (str list &optional case-ignore) (let ((case-fold-search case-ignore)) (catch 'member (while list (if (string-match str (car list)) (throw 'member (car list))) (setq list (cdr list)))))) (defsubst elmo-string-delete-match (string pos) (concat (substring string 0 (match-beginning pos)) (substring string (match-end pos)))) (defun elmo-assoc-ignore-case (key alist) "Return non-nil if KEY is `equal' to the car of an element of ALIST. The value is actually the first element of ALIST whose car equals KEY, which must be string and be compared case insensitively." (setq key (downcase key)) (let (result) (while alist (if (equal key (downcase (caar alist))) (setq result (car alist) alist nil) (setq alist (cdr alist)))) result)) (defun elmo-string-match-assoc (key alist &optional case-ignore) (let ((case-fold-search case-ignore) a) (catch 'loop (while alist (setq a (car alist)) (if (and (consp a) (stringp (car a)) (string-match key (car a))) (throw 'loop a)) (setq alist (cdr alist)))))) (defun elmo-string-matched-assoc (key alist &optional case-ignore) (let ((case-fold-search case-ignore) a) (catch 'loop (while alist (setq a (car alist)) (if (and (consp a) (stringp (car a)) (string-match (car a) key)) (throw 'loop a)) (setq alist (cdr alist)))))) (defun elmo-string-assoc (key alist) (let (a) (catch 'loop (while alist (setq a (car alist)) (if (and (consp a) (stringp (car a)) (string= key (car a))) (throw 'loop a)) (setq alist (cdr alist)))))) (defun elmo-string-assoc-all (key alist) (let (matches) (while alist (if (string= key (car (car alist))) (setq matches (cons (car alist) matches))) (setq alist (cdr alist))) matches)) (defun elmo-string-rassoc (key alist) (let (a) (catch 'loop (while alist (setq a (car alist)) (if (and (consp a) (stringp (cdr a)) (string= key (cdr a))) (throw 'loop a)) (setq alist (cdr alist)))))) (defun elmo-string-rassoc-all (key alist) (let (matches) (while alist (if (string= key (cdr (car alist))) (setq matches (cons (car alist) matches))) (setq alist (cdr alist))) matches)) (defun elmo-expand-newtext (newtext original) (let ((len (length newtext)) (pos 0) c expanded beg N did-expand) (while (< pos len) (setq beg pos) (while (and (< pos len) (not (= (aref newtext pos) ?\\))) (setq pos (1+ pos))) (unless (= beg pos) (push (substring newtext beg pos) expanded)) (when (< pos len) ;; We hit a \; expand it. (setq did-expand t pos (1+ pos) c (aref newtext pos)) (if (not (or (= c ?\&) (and (>= c ?1) (<= c ?9)))) ;; \ followed by some character we don't expand. (push (list c) expanded) ;; \& or \N (if (= c ?\&) (setq N 0) (setq N (- c ?0))) (when (match-beginning N) (push (substring original (match-beginning N) (match-end N)) expanded)))) (setq pos (1+ pos))) (if did-expand (apply (function concat) (nreverse expanded)) newtext))) ;;; Folder parser utils. (defconst elmo-quoted-specials-list '(?\\ ?\")) (defun elmo-quoted-token (string) (concat "\"" (std11-wrap-as-quoted-pairs string elmo-quoted-specials-list) "\"")) (defun elmo-token-valid-p (token requirement) (cond ((null requirement)) ((stringp requirement) (string-match requirement token)) ((functionp requirement) (funcall requirement token)))) (defun elmo-parse-token (string &optional seps requirement asis) "Parse atom from STRING using SEPS as a string of separator char list. When optional argument ASIS is non-nil, keep '\\' and '\"' from result." (let ((len (length string)) (seps (and seps (string-to-list seps))) (i 0) (sep nil) content c in) (if (zerop len) (cons "" "") (while (and (< i len) (or in (null sep))) (setq c (aref string i)) (cond ((and in (eq c ?\\)) (when asis (setq content (cons c content))) (setq i (1+ i) content (cons (aref string i) content) i (1+ i))) ((eq c ?\") (when asis (setq content (cons c content))) (setq in (not in) i (1+ i))) (in (setq content (cons c content) i (1+ i))) ((memq c seps) (setq sep c)) (t (setq content (cons c content) i (1+ i))))) (if in (error "Parse error in quoted")) (let ((atom (if (null content) "" (apply 'string (nreverse content))))) (if (elmo-token-valid-p atom requirement) (cons atom (substring string i)) (cons "" string)))))) (defun elmo-parse-prefixed-element (prefix string &optional seps requirement) (let (parsed) (if (and (not (zerop (length string))) (eq (aref string 0) prefix) (setq parsed (elmo-parse-token (substring string 1) seps)) (elmo-token-valid-p (car parsed) requirement)) parsed (cons "" string)))) (defun elmo-collect-separators (spec) (when (listp spec) (let ((result (elmo-collect-separators-internal spec))) (and result (apply 'string (elmo-uniq-list result #'delq)))))) (defun elmo-collect-separators-internal (specs &optional separators) (while specs (let ((spec (car specs))) (cond ((listp spec) (setq separators (elmo-collect-separators-internal spec separators) specs (cdr specs))) ((characterp spec) (setq separators (cons spec separators) specs nil)) (t (setq specs nil))))) separators) (defun elmo-collect-trail-separators (element specs) (cond ((symbolp specs) (eq specs element)) ((vectorp specs) (eq (aref specs 0) element)) ((listp specs) (let (spec result) (while (setq spec (car specs)) (if (setq result (elmo-collect-trail-separators element spec)) (setq result (concat (if (stringp result) result) (elmo-collect-separators (cdr specs))) specs nil) (setq specs (cdr specs)))) result)))) (defun elmo-parse-separated-tokens (string spec) (let ((result (elmo-parse-separated-tokens-internal string spec))) (if (eq (car result) t) (cons nil (cdr result)) result))) (defun elmo-parse-separated-tokens-internal (string spec &optional separators) (cond ((symbolp spec) (let ((parse (elmo-parse-token string separators))) (cons (list (cons spec (car parse))) (cdr parse)))) ((vectorp spec) (let ((parse (elmo-parse-token string separators))) (if (elmo-token-valid-p (car parse) (aref spec 1)) (cons (list (cons (aref spec 0) (car parse))) (cdr parse)) (cons nil string)))) ((characterp spec) (if (and (> (length string) 0) (eq (aref string 0) spec)) (cons t (substring string 1)) (cons nil string))) ((listp spec) (catch 'unmatch (let ((rest string) result tokens) (while spec (setq result (elmo-parse-separated-tokens-internal rest (car spec) (concat (elmo-collect-separators (cdr spec)) separators))) (cond ((null (car result)) (throw 'unmatch (cons t string))) ((eq t (car result))) (t (setq tokens (nconc (car result) tokens)))) (setq rest (cdr result) spec (cdr spec))) (cons (or tokens t) rest)))))) (defun elmo-quote-syntactical-element (value element syntax) (let ((separators (elmo-collect-trail-separators element syntax))) (if (and separators (string-match (concat "[" separators "]") value)) (elmo-quoted-token value) value))) ;;; Number set defined by OKAZAKI Tetsurou ;; ;; number ::= [0-9]+ ;; beg ::= number ;; end ::= number ;; number-range ::= "(" beg " . " end ")" ;; cons cell ;; number-set-elem ::= number / number-range ;; number-set ::= "(" *number-set-elem ")" ;; list (defun elmo-number-set-member (number number-set) "Return non-nil if NUMBER is an element of NUMBER-SET. The value is actually the tail of NUMBER-RANGE whose car contains NUMBER." (or (memq number number-set) (let (found) (while (and number-set (not found)) (if (and (consp (car number-set)) (and (<= (car (car number-set)) number) (<= number (cdr (car number-set))))) (setq found t) (setq number-set (cdr number-set)))) number-set))) (defun elmo-number-set-append-list (number-set list) "Append LIST of numbers to the NUMBER-SET. NUMBER-SET is altered." (let ((appended number-set)) (while list (setq appended (elmo-number-set-append appended (car list))) (setq list (cdr list))) appended)) (defun elmo-number-set-append (number-set number) "Append NUMBER to the NUMBER-SET. NUMBER-SET is altered." (let ((number-set-1 number-set) found elem) (while (and number-set (not found)) (setq elem (car number-set)) (cond ((and (consp elem) (eq (+ 1 (cdr elem)) number)) (setcdr elem number) (setq found t)) ((and (integerp elem) (eq (+ 1 elem) number)) (setcar number-set (cons elem number)) (setq found t)) ((or (and (integerp elem) (eq elem number)) (and (consp elem) (<= (car elem) number) (<= number (cdr elem)))) (setq found t))) (setq number-set (cdr number-set))) (if (not found) (setq number-set-1 (nconc number-set-1 (list number)))) number-set-1)) (defun elmo-number-set-delete-list (number-set list) "Delete LIST of numbers from the NUMBER-SET. NUMBER-SET is altered." (let ((deleted number-set)) (dolist (number list) (setq deleted (elmo-number-set-delete deleted number))) deleted)) (defun elmo-number-set-delete (number-set number) "Delete NUMBER from the NUMBER-SET. NUMBER-SET is altered." (let* ((curr number-set) (top (cons 'dummy number-set)) (prev top) elem found) (while (and curr (not found)) (setq elem (car curr)) (if (consp elem) (cond ((eq (car elem) number) (if (eq (cdr elem) (1+ number)) (setcar curr (cdr elem)) (setcar elem (1+ number))) (setq found t)) ((eq (cdr elem) number) (if (eq (car elem) (1- number)) (setcar curr (car elem)) (setcdr elem (1- number))) (setq found t)) ((and (> number (car elem)) (< number (cdr elem))) (setcdr prev (nconc (list ;;; (beg . (1- number)) (let ((new (cons (car elem) (1- number)))) (if (eq (car new) (cdr new)) (car new) new)) ;;; ((1+ number) . end) (let ((new (cons (1+ number) (cdr elem)))) (if (eq (car new) (cdr new)) (car new) new))) (cdr curr))))) (when (eq elem number) (setcdr prev (cdr curr)) (setq found t))) (setq prev curr curr (cdr curr))) (cdr top))) (defun elmo-make-number-list (beg end) (let (number-list i) (setq i end) (while (>= i beg) (setq number-list (cons i number-list)) (setq i (1- i))) number-list)) (defun elmo-number-set-to-number-list (number-set) "Return a number list which corresponds to NUMBER-SET." (let (result) (while number-set (if (integerp (car number-set)) (setq result (cons (car number-set) result)) (let ((from (caar number-set)) (to (cdar number-set))) (while (<= from to) (setq result (cons from result) from (1+ from))))) (setq number-set (cdr number-set))) (nreverse result))) (defun elmo-number-list-to-number-set (number-list) "Return a number set which corresponds to NUMBER-LIST. NUMBER-LIST must be sorted in ascending order and uniquified." (let (result start) (while number-list (setq start (car number-list)) (while (eq (1+ (car number-list)) (cadr number-list)) (setq number-list (cdr number-list))) (setq result (cons (if (eq start (car number-list)) start (cons start (car number-list))) result) number-list (cdr number-list))) (nreverse result))) (defcustom elmo-list-subdirectories-ignore-regexp "^\\(\\.\\.?\\|[0-9]+\\)$" "*Regexp to filter subfolders." :type 'regexp :group 'elmo) (defun elmo-list-subdirectories-1 (basedir curdir one-level) (let ((root (zerop (length curdir))) attr dirs dir) (catch 'done (dolist (file (directory-files (setq dir (expand-file-name curdir basedir)))) (when (and (not (string-match elmo-list-subdirectories-ignore-regexp file)) (car (setq attr (file-attributes (expand-file-name file dir))))) (when (eq one-level 'check) (throw 'done t)) (let ((relpath (concat curdir (and (not root) elmo-path-sep) file)) subdirs) (setq dirs (nconc dirs (if (if elmo-have-link-count (< 2 (nth 1 attr)) (setq subdirs (elmo-list-subdirectories-1 basedir relpath (if one-level 'check)))) (if one-level (list (list relpath)) (cons relpath (or subdirs (elmo-list-subdirectories-1 basedir relpath nil)))) (list relpath))))))) dirs))) (defun elmo-list-subdirectories (directory file one-level) (let ((subdirs (elmo-list-subdirectories-1 directory file one-level))) (if (zerop (length file)) subdirs (cons file subdirs)))) (defun elmo-mapcar-list-of-list (func list-of-list) (mapcar (lambda (x) (cond ((listp x) (elmo-mapcar-list-of-list func x)) (t (funcall func x)))) list-of-list)) (defun elmo-map-recursive (function object) (if (consp object) (let* ((prev (list 'dummy)) (result prev)) (while (consp object) (setq prev (setcdr prev (list (elmo-map-recursive function (car object)))) object (cdr object))) (when object (setcdr prev (funcall function object))) (cdr result)) (funcall function object))) (defun elmo-map-until-success (function sequence) (let (result) (while (and (null result) sequence) (setq result (funcall function (car sequence)) sequence (cdr sequence))) result)) (defun elmo-string-match-substring (regexp string &optional matchn) (when (string-match regexp string) (match-string (or matchn 1) string))) (defun elmo-parse (string regexp &optional matchn) (or matchn (setq matchn 1)) (let ((index 0) list) (while (string-match regexp string index) (setq list (cons (substring string (match-beginning matchn) (match-end matchn)) list) index (match-end 0))) (nreverse list))) (defun elmo-find-list-match-value (specs getter) (elmo-map-until-success (let ((getter getter)) (lambda (spec) (cond ((symbolp spec) (funcall getter spec)) ((consp spec) (let ((value (funcall getter (car spec)))) (when value (elmo-map-until-success (lambda (rule) (cond ((stringp rule) (elmo-string-match-substring rule value)) ((consp rule) (elmo-string-match-substring (car rule) value (cdr rule))))) (cdr spec)))))))) specs)) ;;; File cache. (defmacro elmo-make-file-cache (path status) "PATH is the cache file name. STATUS is one of 'section, 'entire or nil. nil means no cache exists. 'section means partial section cache exists. 'entire means entire cache exists. If the cache is partial file-cache, TYPE is 'partial." `(cons ,path ,status)) (defmacro elmo-file-cache-path (file-cache) "Returns the file path of the FILE-CACHE." `(car ,file-cache)) (defmacro elmo-file-cache-status (file-cache) "Returns the status of the FILE-CACHE." `(cdr ,file-cache)) (defsubst elmo-cache-get-path-subr (msgid) (format "%02X" (logand (apply #'+ (string-to-list msgid)) 31))) ;;; (defun elmo-file-cache-get-path (msgid &optional section) "Get cache path for MSGID. If optional argument SECTION is specified, partial cache path is returned." (if (setq msgid (elmo-msgid-to-cache msgid)) (expand-file-name (if section (format "%s/%s/%s/%s" elmo-cache-directory (elmo-cache-get-path-subr msgid) msgid section) (format "%s/%s/%s" elmo-cache-directory (elmo-cache-get-path-subr msgid) msgid))))) (defmacro elmo-file-cache-expand-path (path section) "Return file name for the file-cache corresponds to the section. PATH is the file-cache path. SECTION is the section string." `(expand-file-name (or ,section "") ,path)) (defun elmo-file-cache-delete (path) "Delete a cache on PATH." (when (file-exists-p path) (if (file-directory-p path) (progn (dolist (file (directory-files path t "^[^\\.]")) (delete-file file)) (delete-directory path)) (delete-file path)) t)) (defun elmo-file-cache-exists-p (msgid) "Returns 'section or 'entire if a cache which corresponds to MSGID exists." (elmo-file-cache-status (elmo-file-cache-get msgid))) (defun elmo-file-cache-save (cache-path section) "Save current buffer as cache on PATH. Return t if cache is saved successfully." (condition-case nil (let ((path (if section (expand-file-name section cache-path) cache-path)) files dir) (if (and (null section) (file-directory-p path)) (progn (setq files (directory-files path t "^[^\\.]")) (while files (delete-file (car files)) (setq files (cdr files))) (delete-directory path)) (if (and section (not (file-directory-p cache-path))) (delete-file cache-path))) (when path (setq dir (directory-file-name (file-name-directory path))) (if (not (file-exists-p dir)) (elmo-make-directory dir)) (write-region-as-binary (point-min) (point-max) path nil 'no-msg) t)) ;; ignore error (error))) (defun elmo-file-cache-load (cache-path section) "Load cache on PATH into the current buffer. Return t if cache is loaded successfully." (condition-case nil (let (cache-file) (when (and cache-path (if (elmo-cache-path-section-p cache-path) section (null section)) (setq cache-file (elmo-file-cache-expand-path cache-path section)) (file-exists-p cache-file)) (insert-file-contents-literally cache-file) t)) ;; igore error (error))) (defun elmo-cache-path-section-p (path) "Return non-nil when PATH is `section' cache path." (file-directory-p path)) (defun elmo-file-cache-get (msgid &optional section) "Returns the current file-cache object associated with MSGID. MSGID is the message-id of the message. If optional argument SECTION is specified, get partial file-cache object associated with SECTION." (if msgid (let ((path (elmo-cache-get-path msgid))) (if (and path (file-exists-p path)) (if (elmo-cache-path-section-p path) (if section (if (file-exists-p (setq path (expand-file-name section path))) (cons path 'section)) ;; section is not specified but sectional. (cons path 'section)) ;; not directory. (unless section (cons path 'entire))) ;; no cache. (cons path nil))))) ;;; ;; Expire cache. (defun elmo-cache-expire () (interactive) (let ((completion-ignore-case t)) (funcall (intern (concat "elmo-cache-expire-by-" (completing-read (format "Expire by (%s): " elmo-cache-expire-default-method) '(("size" . "size") ("age" . "age")) nil t nil nil elmo-cache-expire-default-method)))))) (defun elmo-cache-expire-by-size (&optional kbytes) "Expire cache file by size. KBYTES is a number specifying size in kilo bytes." (interactive) (let ((size (float (or kbytes (and (called-interactively-p 'interactive) (elmo-read-number "Enter cache disk size (Kbytes): " elmo-cache-expire-default-size)) elmo-cache-expire-default-size))) (count 0) (Kbytes 1024) total beginning) (message "Checking disk usage...") (setq total (/ (elmo-disk-usage elmo-cache-directory) Kbytes)) (setq beginning total) (message "Checking disk usage...done") (let ((cfl (elmo-cache-get-sorted-cache-file-list)) (deleted 0) oldest cur-size cur-file) (while (and (<= size total) (setq oldest (elmo-cache-get-oldest-cache-file-entity cfl))) (setq cur-file (expand-file-name (car (cdr oldest)) (car oldest))) (setq cur-size (/ (elmo-disk-usage cur-file) Kbytes)) (when (elmo-file-cache-delete cur-file) (setq count (+ count 1)) (message "%d cache(s) are expired." count)) (setq deleted (+ deleted cur-size)) (setq total (- total cur-size))) (message "%d cache(s) are expired from disk (%d Kbytes/%d Kbytes)." count deleted beginning)))) (defun elmo-cache-make-file-entity (filename path) (cons filename (elmo-get-last-accessed-time filename path))) (defun elmo-cache-get-oldest-cache-file-entity (cache-file-list) (let ((cfl cache-file-list) flist firsts oldest-entity wonlist) (while cfl (setq flist (cdr (car cfl))) (setq firsts (append firsts (list (cons (car (car cfl)) (car flist))))) (setq cfl (cdr cfl))) ;;; (prin1 firsts) (while firsts (if (and (not oldest-entity) (cdr (cdr (car firsts)))) (setq oldest-entity (car firsts))) (if (and (cdr (cdr (car firsts))) (cdr (cdr oldest-entity)) (> (cdr (cdr oldest-entity)) (cdr (cdr (car firsts))))) (setq oldest-entity (car firsts))) (setq firsts (cdr firsts))) (setq wonlist (assoc (car oldest-entity) cache-file-list)) (and wonlist (setcdr wonlist (delete (car (cdr wonlist)) (cdr wonlist)))) oldest-entity)) (defun elmo-cache-get-sorted-cache-file-list () (let ((dirs (directory-files elmo-cache-directory t "^[^\\.]")) elist ret-val) (elmo-with-progress-display (elmo-collecting-cache (length dirs)) "Collecting cache info" (dolist (dir dirs) (setq elist (mapcar (lambda (x) (elmo-cache-make-file-entity x dir)) (directory-files dir nil "^[^\\.]"))) (setq ret-val (append ret-val (list (cons dir (sort elist (lambda (x y) (< (cdr x) (cdr y)))))))))) ret-val)) (defun elmo-cache-expire-by-age (&optional days) "Expire cache file by age. Optional argument DAYS specifies the days to expire caches." (interactive) (let ((age (or (and (numberp days) days) (and (called-interactively-p 'interactive) (elmo-read-number "Enter days: " elmo-cache-expire-default-age)) elmo-cache-expire-default-age)) (dirs (directory-files elmo-cache-directory t "^[^\\.]")) (count 0) curtime) (setq curtime (current-time)) (setq curtime (+ (* (nth 0 curtime) (float 65536)) (nth 1 curtime))) (while dirs (let ((files (directory-files (car dirs) t "^[^\\.]")) (limit-age (* age 86400))) (while files (when (> (- curtime (elmo-get-last-accessed-time (car files))) limit-age) (when (elmo-file-cache-delete (car files)) (setq count (+ 1 count)) (message "%d cache file(s) are expired." count))) (setq files (cdr files)))) (setq dirs (cdr dirs))))) ;;; ;; msgid to path. (defun elmo-msgid-to-cache (msgid) (save-match-data (when (and msgid (string-match "<\\(.+\\)>$" msgid) (setq msgid (match-string 1 msgid))) (let (result) (if (and elmo-msgid-to-cache-max-length (or (zerop elmo-msgid-to-cache-max-length) (> (length (setq result (elmo-replace-string-as-filename msgid))) elmo-msgid-to-cache-max-length))) (secure-hash elmo-msgid-to-cache-algorithm msgid) (or result (elmo-replace-string-as-filename msgid))))))) (defun elmo-cache-get-path (msgid) "Get path for cache file associated with MSGID." (if (setq msgid (elmo-msgid-to-cache msgid)) (expand-file-name (format "%s/%s" (elmo-cache-get-path-subr msgid) msgid) elmo-cache-directory))) ;;; ;; Warnings. (defmacro elmo-warning (&rest args) "Display a warning with `elmo' group." `(display-warning 'elmo (format ,@args))) (defvar elmo-obsolete-variable-alist nil) (defcustom elmo-obsolete-variable-show-warnings t "Show warning window if obsolete variable is treated." :type 'boolean :group 'elmo) (defun elmo-define-obsolete-variable (obsolete var) "Define obsolete variable. OBSOLETE is a symbol for obsolete variable. VAR is a symbol for new variable. Definition is stored in `elmo-obsolete-variable-alist'." (let ((pair (assq var elmo-obsolete-variable-alist))) (if pair (setcdr pair obsolete) (setq elmo-obsolete-variable-alist (cons (cons var obsolete) elmo-obsolete-variable-alist))))) (defun elmo-resque-obsolete-variable (obsolete var) "Resque obsolete variable OBSOLETE as VAR. If `elmo-obsolete-variable-show-warnings' is non-nil, show warning message." (when (boundp obsolete) (defvaralias var obsolete) (if elmo-obsolete-variable-show-warnings (elmo-warning "%s is obsolete. Use %s instead." (symbol-name obsolete) (symbol-name var))))) (defun elmo-resque-obsolete-variables (&optional _alist) "Resque obsolete variables in ALIST. ALIST is a list of cons cell of \(OBSOLETE-VARIABLE-SYMBOL . NEW-VARIABLE-SYMBOL\). If ALIST is nil, `elmo-obsolete-variable-alist' is used." (dolist (pair elmo-obsolete-variable-alist) (elmo-resque-obsolete-variable (cdr pair) (car pair)))) (defun elmo-extract-std11-msgid-tokens (msgid-string) (let (ids) (dolist (token msgid-string ids) (when (eq (car token) 'msg-id) (setq ids (cons token ids)))) (nreverse ids))) (defun elmo-parse-msgid-field (field) (mapcar #'std11-msg-id-string (elmo-extract-std11-msgid-tokens (std11-parse-msg-ids-string field)))) (defun elmo-get-message-id-from-field (field) (if (and (not elmo-always-prefer-std11-parser) (string-match "\\`[ \n\t]*\\(<[^<>]+>\\)[ \n\t]*\\'" field)) (match-string 1 field) (let ((msgid-list (elmo-parse-msgid-field field))) (when (null (cdr msgid-list)) (car msgid-list))))) (defun elmo-get-message-id-from-header (&optional when-invalid) (let ((msgid-field (std11-fetch-field "message-id"))) (when msgid-field (or (elmo-get-message-id-from-field msgid-field) (cond ((eq when-invalid 'none) nil) ((eq when-invalid 'msgdb) (concat "<" (std11-unfold-string msgid-field) ">")) (t (std11-unfold-string msgid-field))))))) (defun elmo-get-message-id-from-buffer (&optional when-invalid) (save-excursion (save-restriction (std11-narrow-to-header) (elmo-get-message-id-from-header when-invalid)))) (defun elmo-msgdb-get-message-id-from-header () (or (elmo-get-message-id-from-header 'msgdb) ;; no message-id, so put dummy msgid. (concat "<" (let ((string (elmo-unfold-fetch-field "date"))) (or (when string (ignore-errors (timezone-make-date-sortable string))) (md5 (string-as-unibyte (buffer-string))))) (nth 1 (eword-extract-address-components (or (std11-fetch-field "from") "nobody"))) ">"))) (defun elmo-msgdb-get-message-id-from-buffer () (save-excursion (save-restriction (std11-narrow-to-header) (elmo-msgdb-get-message-id-from-header)))) (defun elmo-msgdb-get-message-ids-from-header (field) (mapcar 'std11-msg-id-string (std11-parse-msg-ids-string (std11-fetch-field field)))) (defun elmo-msgdb-get-references-from-header () (let ((irt (elmo-msgdb-get-message-ids-from-header "in-reply-to")) (refs (elmo-msgdb-get-message-ids-from-header "references"))) (delq nil (elmo-uniq-list (nreverse (if elmo-msgdb-prefer-in-reply-to-for-parent (nconc refs irt) (nconc irt refs))))))) (defsubst elmo-msgdb-insert-file-header (file) "Insert the header of the article. Buffer contents after point are deleted." (when (file-exists-p file) (let ((beg 0) format-alist (first t) done) ;; Read until header separator is found. (while (null done) (setq done (/= elmo-msgdb-file-header-chop-length (nth 1 (insert-file-contents-literally file nil beg (cl-incf beg elmo-msgdb-file-header-chop-length))))) (if first (setq first nil) (backward-char)) (elmo-delete-cr-region (point) nil) (setq done (or (search-forward "\n\n" nil 'move) done))) (delete-region (point) (point-max))))) ;; ;; overview handling ;; (defun elmo-multiple-field-body (name &optional boundary) (save-excursion (save-restriction (std11-narrow-to-header boundary) (goto-char (point-min)) (let ((case-fold-search t) (regexp (concat "^" name ":[ \t]*")) field-body) (while (re-search-forward regexp nil t) (setq field-body (cons (buffer-substring-no-properties (match-end 0) (std11-field-end)) field-body))) (nreverse field-body))))) (defun elmo-parse-addresses (string) (if (null string) () (elmo-set-work-buf (let (list start s char) (insert string) (goto-char (point-min)) (skip-chars-forward "\t\f\n\r ") (setq start (point)) (while (not (eobp)) (skip-chars-forward "^\"\\,(") (setq char (following-char)) (cond ((= char ?\\) (forward-char) (if (not (eobp)) (forward-char))) ((= char ?,) (setq s (buffer-substring start (point))) (if (or (null (string-match "^[\t\f\n\r ]+$" s)) (not (string= s ""))) (setq list (cons s list))) (skip-chars-forward ",\t\f\n\r ") (setq start (point))) ((= char ?\") (re-search-forward "[^\\]\"" nil 0)) ((= char ?\() (let ((parens 1)) (forward-char) (while (and (not (eobp)) (not (zerop parens))) (re-search-forward "[()]" nil 0) (cond ((or (eobp) (= (char-after (- (point) 2)) ?\\))) ((= (preceding-char) ?\() (setq parens (1+ parens))) (t (setq parens (1- parens))))))))) (setq s (buffer-substring start (point))) (if (and (null (string-match "^[\t\f\n\r ]+$" s)) (not (string= s ""))) (setq list (cons s list))) (nreverse list))))) ;;; Queue. (defvar elmo-dop-queue-filename "queue" "*Disconnected operation queue is saved in this file.") (defun elmo-dop-queue-load () (setq elmo-dop-queue (elmo-object-load (expand-file-name elmo-dop-queue-filename elmo-msgdb-directory)))) (defun elmo-dop-queue-save () (elmo-object-save (expand-file-name elmo-dop-queue-filename elmo-msgdb-directory) elmo-dop-queue)) (defalias 'elmo-regexp-opt 'regexp-opt) (make-obsolete 'elmo-regexp-opt 'regexp-opt "24 May 2020") (require 'product) (product-provide (provide 'elmo-util) (require 'elmo-version)) ;;; elmo-util.el ends here wanderlust-wanderlust-769699d/elmo/elmo-vars.el000066400000000000000000000356641406661363500216060ustar00rootroot00000000000000;;; elmo-vars.el --- User variables for ELMO. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Author: Yuuichi Teranishi ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'path-util) (defgroup elmo nil "ELMO, Elisp Library for Message Orchestration." :tag "ELMO" :prefix "elmo-" :group 'news :group 'mail) (defgroup elmo-setting nil "ELMO common settings." :prefix "elmo-" :group 'elmo) (defcustom elmo-always-prefer-std11-parser nil "Always prefer std11 parser over regexp." :type 'boolean :group 'elmo) (defcustom elmo-digest-flags '(unread) "Flags which are treated as `digest'." :type '(repeat (symbol :tag "flag")) :group 'elmo) (defcustom elmo-preserved-flags '(forwarded answered cached new unread) "A list to define preserved flags. Flags in this list can be searched by `any' flag condition. If you want to treat a flag in this list as a `digest' flag, you have to add it to `elmo-digest-flags'. " :type '(repeat (symbol :tag "flag")) :group 'elmo) ;; Message Database (defcustom elmo-msgdb-default-type 'standard "*Default type of Message Database for ELMO." :type '(radio (const legacy) (const standard)) :group 'elmo :group 'elmo-setting) (defcustom elmo-msgdb-convert-type 'auto "*MODB conversion type." :type '(radio (const sync) (const auto) (const :tag "No convert" nil)) :group 'elmo :group 'elmo-setting) (defcustom elmo-init-hook '(elmo-global-mark-migrate) "*A hook called when elmo is initialized." :type 'hook :group 'elmo) (defvar elmo-msgdb-file-header-chop-length 2048 "*Number of bytes to get header in one reading from file.") (defcustom elmo-msgdb-directory "~/.elmo" "*ELMO Message Database path." :type 'directory :group 'elmo :group 'elmo-setting) (defcustom elmo-passwd-storage-type 'alist "Specify ELMO password storage type. If you want to use `auth-source', set its value to symbol auth-source." :type '(choice (const alist :tag "alist") (const auth-source :tag "Use auth-source")) :group 'elmo :group 'elmo-setting) (defvar elmo-passwd-storage nil) (defvar elmo-warning-threshold 30000 "*Display warning when the bytes of message exceeds this value.") (defvar elmo-msg-appended-hook nil "A hook called when message is appended to database.") (defvar elmo-msg-deleted-hook nil "A hook called when message is deleted from database.") (defvar elmo-nntp-post-pre-hook nil "A hook called just before the nntp posting.") ;;; IMAP4 (defcustom elmo-imap4-set-seen-flag-explicitly nil "*Set Seen flag explicitly (avoid bug in Google Mail)" :type 'boolean :group 'elmo :group 'elmo-setting) (defcustom elmo-imap4-default-server "localhost" "*Default IMAP4 server." :type 'string :group 'elmo :group 'elmo-setting) (defcustom elmo-imap4-default-authenticate-type 'login "*Default Authentication type for IMAP4." :type '(radio (const :tag "encoded password transmission (login)" login) (const :tag "CRAM-MD5 authentication (cram-md5)" cram-md5) (const :tag "DIGEST-MD5 authentication (digest-md5)" digest-md5) (const :tag "plain password transmission (clear)" clear) (const :tag "NTLM authentication (ntlm)" ntlm) (function :tag "Other")) :group 'elmo) (defcustom elmo-imap4-default-user (or (getenv "USER") (getenv "LOGNAME") (user-login-name)) "*Default username for IMAP4." :type 'string :group 'elmo :group 'elmo-setting) (defcustom elmo-imap4-default-port 143 "*Default Port number of IMAP." :type 'integer :group 'elmo :group 'elmo-setting) (defcustom elmo-imap4-default-stream-type nil "*Default stream type for IMAP4. Any symbol value of `elmo-network-stream-type-alist' or `elmo-imap4-stream-type-alist'." :type 'symbol :group 'elmo) (defvar elmo-imap4-stream-type-alist nil "*Stream bindings for IMAP4. This is taken precedence over `elmo-network-stream-type-alist'.") ;;; NNTP (defcustom elmo-nntp-default-server "localhost" "*Default NNTP server." :type 'string :group 'elmo :group 'elmo-setting) (defcustom elmo-nntp-default-user nil "*Default User of NNTP. nil means no user authentication." :type '(choice (const nil) string) :group 'elmo :group 'elmo-setting) (defcustom elmo-nntp-default-port 119 "*Default Port number of NNTP." :type 'integer :group 'elmo :group 'elmo-setting) (defcustom elmo-nntp-default-stream-type nil "*Default stream type for NNTP. Any symbol value of `elmo-network-stream-type-alist' or `elmo-nntp-stream-type-alist'." :type 'symbol :group 'elmo) (defvar elmo-nntp-stream-type-alist nil "*Stream bindings for NNTP. This is taken precedence over `elmo-network-stream-type-alist'.") ;;; POP3 (defcustom elmo-pop3-default-user (or (getenv "USER") (getenv "LOGNAME") (user-login-name)) "*Default username for POP3." :type 'string :group 'elmo :group 'elmo-setting) (defcustom elmo-pop3-default-server "localhost" "*Default POP3 server." :type 'string :group 'elmo :group 'elmo-setting) (defcustom elmo-pop3-default-authenticate-type 'user "*Default Authentication type for POP3." :type '(radio (const :tag "plain password transmission (user)" user) (const :tag "APOP authentication (apop)" apop) (const :tag "CRAM-MD5 authentication (cram-md5)" cram-md5) (const :tag "DIGEST-MD5 authentication (digest-md5)" digest-md5) (const :tag "NTLM authentication (ntlm)" ntlm) (function :tag "Other")) :group 'elmo) (defcustom elmo-pop3-default-port 110 "*Default POP3 port." :type 'integer :group 'elmo :group 'elmo-setting) (defcustom elmo-pop3-default-stream-type nil "*Default stream type for POP3. Any symbol value of `elmo-network-stream-type-alist' or `elmo-pop3-stream-type-alist'." :type 'symbol :group 'elmo) (defvar elmo-pop3-stream-type-alist nil "*Stream bindings for POP3. This is taken precedence over `elmo-network-stream-type-alist'.") (defcustom elmo-msgid-to-cache-max-length nil "When cache filename generated from message-id is longer than its value, hash algorith is used to keep filename not too long. When value is nil, hash algorithm is never used." :type '(choice (const :tag "Never use hash" nil) integer) :group 'elmo-setting) (defcustom elmo-msgid-to-cache-algorithm 'sha1 "A hash algorithm for converting msgid to cache filename. On Emacs25 and later, the value is first argument for `secure-hash' function. On other platforms, the value indicates hash function." :type `(choice ,(append '(md5 sha1) (when (functionp 'secure-hash) '(sha224 sha256 sha384 sha512)))) :group 'elmo-setting) (defcustom elmo-lang "ja" "Language for displayed messages." :type 'string :group 'elmo-setting) (defvar elmo-mime-charset 'iso-2022-jp) (defvar elmo-msgdb-mark-filename "mark" "Mark database.") (defvar elmo-msgdb-overview-filename "overview" "Overview database.") (defvar elmo-msgdb-number-filename "number" "Message number <=> Message-ID database.") (defvar elmo-msgdb-location-filename "location" "Message number <=> Actual location symbol.") (defvar elmo-msgdb-seen-filename "seen" "Seen message list for append.") (defvar elmo-msgdb-killed-filename "killed" "Deleted messages... contains elmo-killed-msgs-list.") (defvar elmo-msgdb-validity-filename "validity") (defvar elmo-msgdb-flist-filename "flist" "Folder list cache (for access folder).") (defvar elmo-msgdb-finfo-filename "finfo" "Folder information cache...list of '(filename . '(new unread all)).") (defvar elmo-msgdb-lock-list-filename "lock" "Locked messages...list of message-id. For disconnected operations.") (defvar elmo-lost+found-folder "+lost+found" "Lost and found.") (defvar elmo-crosspost-alist-filename "crosspost-alist" "Alist of crosspost messages.") (defvar elmo-use-server-diff t "Non-nil forces to get unread message information on server.") (defvar elmo-strict-diff-folder-list nil "List of regexps of folder name which should be checked its diff strictly.") (defcustom elmo-msgdb-prefer-in-reply-to-for-parent nil "*Non-nil to prefer In-Reply-To header for finding parent message on thread, rather than References header." :type 'boolean :group 'elmo :group 'elmo-setting) (defcustom elmo-msgdb-extra-fields nil "Extra fields for msgdb." :type '(repeat string) :group 'elmo :group 'elmo-setting) (defcustom elmo-enable-disconnected-operation t "*Non-nil enables disconnected operations." :type 'boolean :group 'elmo :group 'elmo-setting) (defvar elmo-auto-change-plugged 600 "*Time to expire change plugged state automatically, as the number of seconds. Don't change plugged state automatically if nil.") (defvar elmo-plugged-condition 'one "*The condition for `elmo-plugged' becomes on. If `all', when all ports are on. If `one', when even one port is on. If `independent', independent port plugged. If function, return value of function.") (defvar elmo-plug-on-servers nil) (defvar elmo-plug-on-exclude-servers (list "localhost" (system-name) (and (string-match "[^.]+" (system-name)) (substring (system-name) 0 (match-end 0))))) (defvar elmo-plugged-alist nil) (defvar elmo-dop-flush-confirm t "*Flush disconnected operations queue with confirmation.") (defvar elmo-path-sep "/" "*Path separator.") (defvar elmo-plugged t) (defvar elmo-no-subject "(No Subject in original.)" "*A string used when no subject field exists.") (defvar elmo-no-from "nobody@nowhere?" "*A string used when no from field exists.") ;; database dynamic linking (make-obsolete-variable 'elmo-database-dl-module "Obsoleted" "04 Jun 2020") (make-obsolete-variable 'elmo-database-dl-handle "Obsoleted" "04 Jun 2020") (make-obsolete-variable 'elmo-use-database "Obsoleted" "04 Jun 2020") (defvar elmo-date-match t "Date match is available or not.") (defvar elmo-network-use-gnutls (gnutls-available-p) "Non-nil means built-in GnuTLS is used for SSL/STARTTLS connection.") (defvar elmo-network-stream-type-alist (append `(("!" ssl ,@(cond (elmo-network-use-gnutls '(nil elmo-open-gnutls-stream)) ((module-installed-p 'tls) '(tls open-tls-stream)) (t '(ssl open-ssl-stream)))) ("!!" starttls ,@(cond (elmo-network-use-gnutls '(nil open-network-stream)) (t '(starttls starttls-open-stream)))) ("!socks" socks socks socks-open-network-stream) ("!direct" direct nil open-network-stream)) (when elmo-network-use-gnutls '(("!!socks" socks-ssl nil elmo-open-socks-ssl-stream) ("!!!socks" socks-starttls socks socks-open-network-stream)))) "An alist of (SPEC-STRING SYMBOL FEATURE OPEN-STREAM-FUNCTION). SPEC-STRING is a string for stream-type spec (it must start with '!'). SYMBOL is a symbol which indicates the name of the stream type. SYMBOL should be identical in this alist. FEATURE is a symbol of the feature for OPEN-STREAM-FUNCTION. OPEN-STREAM-FUNCTION is a function to open network stream. Arguments for this function are NAME, BUFFER, HOST and SERVICE.") (defvar elmo-network-starttls-stream-type-list '(starttls socks-starttls)) (defvar elmo-folder-info-hashtb nil "Array of folder database information '(max length new unread).") (defvar elmo-crosspost-message-alist nil "List of crosspost message.") (defvar elmo-cache-expire-default-method "size" "Default expiration method.") (defvar elmo-cache-expire-default-size 30000 "Cache expiration disk size (Kilo bytes).") (defvar elmo-cache-expire-default-age 50 "Cache expiration age (days).") (defvar elmo-cache-directory (expand-file-name "cache" elmo-msgdb-directory) "Directory name for cache storage.") (defvar elmo-pack-number-check-strict t "Pack number strictly.") (defvar elmo-have-link-count (not ;; OS/2 (EMX) and Windows always return the link count "1" :-( (memq system-type '(OS/2 emx cygwin windows-nt))) "Your file system has link count, or not.") (defvar elmo-use-hardlink t "Hardlink is available on your file system, or not.") (defvar elmo-weekday-name-en '["Sun" "Mon" "Tue" "Wed" "Thu" "Fri" "Sat"]) (defvar elmo-weekday-name-ja '["日" "月" "火" "水" "木" "金" "土"]) (defvar elmo-weekday-name-fr '["Dim" "Lun" "Mar" "Mer" "Jeu" "Ven" "Sam"]) (defvar elmo-weekday-name-de '["Son" "Mon" "Die" "Mit" "Don" "Fre" "Sam"]) (defvar elmo-filename-replace-string-alist '((":" . " c") ("*" . " a") ("?" . " q") ("<" . " l") (">" . " g") ("\"" . " d") ("|" . " p") ("/" . " s") ("\\" . " b"))) (defvar elmo-hash-minimum-size 1023 "Minimum size of hash table.") (defvar elmo-hash-maximum-size 4095 "Maximum size of hash table.") (defvar elmo-use-decoded-cache nil "Use cache of decoded mime charset string.") (defvar elmo-inhibit-number-mapping nil "Global switch to inhibit number mapping (e.g. Inhibit UIDL on POP3).") (defvar elmo-dop-queue nil "Global variable for storing disconnected operation queues.") (defcustom elmo-mime-display-as-is-coding-system 'undecided "*Coding system used when message is displayed as is." :type 'symbol :group 'elmo) (defcustom elmo-mailing-list-name-spec-list '(x-ml-name (x-sequence "^\\([^ ]+\\)") (subject "^\\s(\\(\\S)+\\)[ :][0-9]+\\s)[ \t]*") (list-post "]+\\)-return-[0-9]+-") (delivered-to "^mailing list \\([^@]+\\)@")) "*List of spec to extract mailing list name from field value." :type '(repeat (choice (symbol :tag "Field Name") (list (symbol :tag "Field Name") (repeat :inline symbol (choice regexp (cons regexp (integer :tag "Match Index"))))))) :group 'elmo) (defcustom elmo-mailing-list-count-spec-list '(x-mail-count x-ml-count (x-sequence "^[^ ]+ \\([^ ]+\\)") (subject "^\\s(\\S)+[ :]\\([0-9]+\\)\\s)[ \t]*") (return-path "^<[^@>]+-return-\\([0-9]+\\)-")) "*List of spec to extract mailing list count from field value." :type '(repeat (choice (symbol :tag "Field Name") (list (symbol :tag "Field Name") (repeat :inline symbol (choice regexp (cons regexp (integer :tag "Match Index"))))))) :group 'elmo) (require 'product) (product-provide (provide 'elmo-vars) (require 'elmo-version)) ;;; elmo-vars.el ends here wanderlust-wanderlust-769699d/elmo/elmo-version.el000066400000000000000000000042361406661363500223070ustar00rootroot00000000000000;;; elmo-version.el --- Version information for ELMO. -*- lexical-binding: t -*- ;; Copyright (C) 2000-2001 Yuuichi Teranishi ;; Copyright (C) 2000-2001 TAKAHASHI Kaoru ;; Author: Yuuichi Teranishi ;; TAKAHASHI Kaoru ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;; Put the following lines to each file of ELMO package. ;; ;; (require 'product) ;; (product-provide (provide FEATURE) (require 'elmo-version)) ;;; Code: ;; (require 'product) (provide 'elmo-version) ; before product-provide ;; product-define in the first place (product-provide 'elmo-version ;; Don't forget to run `make update-version' and `make test'. ;; Don't forget to check codename in `wl-version.el'. (product-define "ELMO" nil '(2 15 9))) ;; set version-string (product-version-as-string 'elmo-version) (defun elmo-version () "Return ELMO version." (product-string-1 'elmo-version)) ;; for backward compatibility (defconst elmo-appname (product-name (product-find 'elmo-version))) (make-obsolete-variable 'elmo-appname "use (product-name (product-find 'elmo-version)) instead." "10 Oct 2000") (defconst elmo-version (product-version-string (product-find 'elmo-version))) (make-obsolete-variable 'elmo-version "use (product-version-string (product-find 'elmo-version)) instead." "10 Oct 2000") ;;; elmo-version.el ends here wanderlust-wanderlust-769699d/elmo/elmo.el000066400000000000000000002106441406661363500206260ustar00rootroot00000000000000;;; elmo.el --- Elisp Library for Message Orchestration. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Author: Yuuichi Teranishi ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'luna) (require 'elmo-version) ; reduce recursive-load-depth (require 'elmo-vars) (require 'elmo-util) (require 'elmo-msgdb) (require 'elmo-signal) (require 'cl-lib) (defcustom elmo-message-fetch-threshold 30000 "Fetch threshold." :type '(choice (integer :tag "Threshold (bytes)") (const :tag "No limitation" nil)) :group 'elmo) (defcustom elmo-message-fetch-confirm t "If non-nil, confirm fetching if message size is larger than `elmo-message-fetch-threshold'. Otherwise, entire fetching of the message is aborted without confirmation." :type 'boolean :group 'elmo) (defcustom elmo-folder-update-threshold 500 "Update threshold." :type '(choice (integer :tag "Number of messages") (const :tag "No limitation" nil)) :group 'elmo) (defcustom elmo-folder-update-confirm t "Confirm if update number exceeds `elmo-folder-update-threshold'." :type 'boolean :group 'elmo) (defcustom elmo-msgdb-path-encode-threshold nil "*Encode msgdb path if its length is longer than this value." :type '(choice (const :tag "No encode" nil) number) :group 'elmo) (defvar elmo-message-displaying nil "A global switch to indicate message is displaying or not.") ;;; internal (defvar elmo-folder-type-alist nil) (defvar elmo-newsgroups-hashtb nil) (define-error 'elmo-error "Error" 'error) (define-error 'elmo-open-error "Cannot open" 'elmo-error) (define-error 'elmo-authenticate-error "Login failed" 'elmo-open-error) (define-error 'elmo-imap4-bye-error "IMAP4 session was terminated" 'elmo-open-error) ;; Event declarations (elmo-define-signal flag-changing (number old-flags new-flags) "Notify the changing flag of the messages with NUMBER.") (elmo-define-signal flag-changed (numbers) "Notify the change flag of the messages with NUMBERS.") (elmo-define-signal status-changed (numbers) "Notify the change status of the message with NUMBERS.") (elmo-define-signal update-overview (number) "Notify update overview of the message with NUMBER.") (elmo-define-signal message-number-changed (old-number new-number) "Notify change of message number within the folder.") ;; autoloads (eval-and-compile (autoload 'md5 "md5") (autoload 'elmo-dop-queue-flush "elmo-dop") (autoload 'elmo-nntp-post "elmo-nntp") (autoload 'elmo-global-flag-p "elmo-flag") (autoload 'elmo-local-flag-p "elmo-flag") (autoload 'elmo-global-flag-detach "elmo-flag") (autoload 'elmo-global-flag-detach-messages "elmo-flag") (autoload 'elmo-global-flag-set "elmo-flag") (autoload 'elmo-global-flag-replace-referrer "elmo-flag") (autoload 'elmo-get-global-flags "elmo-flag") (autoload 'elmo-global-flags-initialize "elmo-flag") (autoload 'elmo-global-mark-migrate "elmo-flag") (autoload 'elmo-folder-list-global-flag-messages "elmo-flag") (autoload 'elmo-search-register-engine "elmo-search")) (defun elmo-define-folder (prefix backend) "Define a folder. If a folder name begins with PREFIX, use BACKEND." (let ((pair (assq prefix elmo-folder-type-alist))) (if pair (progn (setcar pair prefix) (setcdr pair backend)) (setq elmo-folder-type-alist (cons (cons prefix backend) elmo-folder-type-alist))))) (defmacro elmo-folder-type (name) "Get folder type from NAME string." `(and (stringp ,name) (cdr (assoc (string-to-char ,name) elmo-folder-type-alist)))) ;;; ELMO folder ;; A elmo folder provides uniformed (orchestrated) access ;; to the internet messages. (eval-and-compile (luna-define-class elmo-folder () (type ; folder type symbol. name ; orignal folder name string. prefix ; prefix for folder name path ; directory path for msgdb. msgdb ; msgdb (may be nil). killed-list ; killed list. flag-table ; flag table. persistent ; non-nil if persistent. process-duplicates ; read or hide biff ; folder for biff mime-charset ; charset for encode & decode )) (luna-define-internal-accessors 'elmo-folder)) (luna-define-generic elmo-folder-initialize (folder name) ;; Initialize a FOLDER structure with NAME." ) (defmacro elmo-folder-send (folder message &rest args) "Let FOLDER receive the MESSAGE with ARGS." `(luna-send ,folder ,message ,folder ,@args)) ;;;###autoload (defun elmo-make-folder (name &optional non-persistent mime-charset) "Make an ELMO folder structure specified by NAME. If optional argument NON-PERSISTENT is non-nil, the folder msgdb is not saved. If optional argument MIME-CHARSET is specified, it is used for encode and decode a multibyte string." (let ((type (elmo-folder-type name)) prefix split class folder original) (setq original (substring-no-properties name)) (if type (setq prefix (substring-no-properties name 0 1) name (substring-no-properties name 1)) (setq type (intern (car (setq split (split-string name ":"))))) (if (>= (length split) 2) (setq name (substring name (+ 1 (length (car split))))) (error "Error in folder name `%s'" original)) (setq prefix (concat (car split) ":"))) (setq class (format "elmo-%s" (symbol-name type))) (require (intern class)) (setq folder (luna-make-entity (intern (concat class "-folder")) :type type :prefix prefix :name original :persistent (not non-persistent) :mime-charset mime-charset)) (save-match-data (elmo-folder-send folder 'elmo-folder-initialize name)))) (defvar elmo-get-folder-function nil) (defun elmo-get-folder (name) (or (and elmo-get-folder-function (funcall elmo-get-folder-function name)) (elmo-make-folder name))) ;; Note that this function is for internal use only. (luna-define-generic elmo-folder-msgdb (folder) "Return the msgdb of FOLDER (on-demand loading). \(For internal use only.\)") (luna-define-method elmo-folder-msgdb ((folder elmo-folder)) (or (elmo-folder-msgdb-internal folder) (elmo-folder-set-msgdb-internal folder (elmo-folder-msgdb-load folder)))) (luna-define-generic elmo-folder-open (folder &optional load-msgdb) "Open and setup (load saved status) FOLDER. If optional LOAD-MSGDB is non-nil, msgdb is loaded. \(otherwise, msgdb is loaded on-demand)") (luna-define-generic elmo-folder-open-internal (folder) "Open FOLDER (without loading saved folder status).") (luna-define-generic elmo-folder-check (folder) "Check the FOLDER to obtain newest information at the next list operation.") (luna-define-generic elmo-folder-clear (folder &optional keep-killed) "Clear FOLDER to the initial state. If optional KEEP-KILLED is non-nil, killed-list is not cleared.") (luna-define-generic elmo-folder-commit (folder) "Save current status of FOLDER.") (luna-define-generic elmo-folder-close (folder) "Close, save and clearnup FOLDER.") (luna-define-generic elmo-folder-close-internal (folder) "Close FOLDER (without saving folder status).") (luna-define-generic elmo-folder-plugged-p (folder) "Returns t if FOLDER is plugged.") (luna-define-generic elmo-folder-set-plugged (folder plugged &optional add) "Set FOLDER as plugged.") (luna-define-generic elmo-net-port-info (folder) "Get port information of FOLDER.") (luna-define-generic elmo-folder-use-flag-p (folder) "Returns t if FOLDER treats unread/important flag itself.") (luna-define-generic elmo-folder-diff (folder) "Get diff of FOLDER. Return value is cons cell or list: - a cons cell (new . all) - a list (new unread all)") (luna-define-generic elmo-folder-status (folder) "Returns a cons cell of (MAX-NUMBER . MESSAGES) in the FOLDER.") (luna-define-generic elmo-folder-reserve-status-p (folder) "If non-nil, the folder should not close folder after `elmo-folder-status'.") (luna-define-generic elmo-folder-list-messages (folder &optional visible-only in-msgdb) "Return a list of message numbers contained in FOLDER. If optional VISIBLE-ONLY is non-nil, killed messages are not listed. If second optional IN-MSGDB is non-nil, only messages in the msgdb are listed.") (luna-define-method elmo-folder-list-messages ((folder elmo-folder) &optional visible-only in-msgdb) (let ((list (if in-msgdb t (elmo-folder-list-messages-internal folder visible-only))) (killed-list (elmo-folder-killed-list-internal folder))) (unless (listp list) ;; Use current list. (setq list (elmo-msgdb-list-messages (elmo-folder-msgdb folder)))) (if visible-only (elmo-living-messages list killed-list) (if (and in-msgdb killed-list) (elmo-sort-uniq-number-list (nconc (elmo-number-set-to-number-list killed-list) list)) list)))) (luna-define-generic elmo-folder-list-messages-internal (folder &optional visible-only) ;; Return a list of message numbers contained in FOLDER. ;; Return t if the message list is not available. ) (luna-define-generic elmo-folder-list-flagged (folder flag &optional in-msgdb) "List messages in the FOLDER with FLAG. FLAG is a symbol which is one of the following: `new' (new messages) `unread' (unread messages (new messages are included)) `answered' (answered or forwarded) `important' (marked as important) 'sugar' flags: `read' (not unread) `digest' (unread + important + other flags) `any' (digest + answered + other flags) If optional IN-MSGDB is non-nil, retrieve flag information from msgdb.") (luna-define-method elmo-folder-list-flagged ((folder elmo-folder) flag &optional in-msgdb) (if in-msgdb (elmo-msgdb-list-flagged (elmo-folder-msgdb folder) flag) (let ((msgs (elmo-folder-list-flagged-internal folder flag))) (unless (listp msgs) (setq msgs (elmo-msgdb-list-flagged (elmo-folder-msgdb folder) flag))) (elmo-folder-merge-flagged folder (elmo-folder-list-global-flag-messages folder flag) msgs)))) (luna-define-generic elmo-folder-list-flagged-internal (folder flag) "Return a list of message in the FOLDER with FLAG. Return t if the message list is not available.") (luna-define-method elmo-folder-list-flagged-internal ((_folder elmo-folder) _flag) t) (luna-define-generic elmo-folder-merge-flagged (folder local remote) "Merge messages of flag folder and messages of remote folder. LOCAL is the list of messages from flag folder. REMOTE is the list of messages from remote folder.") (luna-define-method elmo-folder-merge-flagged ((_folder elmo-folder) local remote) (elmo-sort-uniq-number-list (nconc local remote))) (luna-define-generic elmo-folder-list-subfolders (folder &optional one-level) "Returns a list of subfolders contained in FOLDER. If optional argument ONE-LEVEL is non-nil, only children of FOLDER is returned. \(a folder which have children is returned as a list\) Otherwise, all descendent folders are returned.") (luna-define-generic elmo-folder-have-subfolder-p (folder) "Return non-nil when FOLDER has subfolders.") (luna-define-generic elmo-folder-exists-p (folder) "Returns non-nil when FOLDER exists.") (luna-define-generic elmo-folder-creatable-p (folder) "Returns non-nil when FOLDER is creatable.") (luna-define-generic elmo-folder-writable-p (folder) "Returns non-nil when FOLDER is writable.") (luna-define-generic elmo-folder-persistent-p (folder) "Return non-nil when FOLDER is persistent.") (luna-define-generic elmo-folder-create (folder) "Create a FOLDER.") (luna-define-generic elmo-message-deletable-p (folder number) "Returns non-nil when the message in the FOLDER with NUMBER is deletable.") (luna-define-generic elmo-folder-delete (folder) "Delete FOLDER completely.") (luna-define-generic elmo-folder-rename (folder new-name) "Rename FOLDER to NEW-NAME (string).") (luna-define-generic elmo-folder-delete-messages (folder numbers) "Delete messages with msgdb entity. FOLDER is the ELMO folder structure. NUMBERS is a list of message numbers to be deleted. It is not recommended to use this function other than internal use. Use `elmo-folder-move-messages' with dst-folder 'null instead.") (luna-define-generic elmo-folder-delete-messages-internal (folder numbers) "Delete messages, but no delete msgdb entity. FOLDER is the ELMO folder structure. NUMBERS is a list of message numbers to be deleted. Override this method by each implement of `elmo-folder'.") (luna-define-generic elmo-folder-search (folder condition &optional numbers) "Search and return list of message numbers. FOLDER is the ELMO folder structure. CONDITION is a condition structure for searching. If optional argument NUMBERS is specified and is a list of message numbers, messages are searched from the list. If NUMBERS is t, indicates that messages are selected for interactive folder search.") (luna-define-generic elmo-message-match-condition (folder number condition numbers) "Return non-nil when the message in the FOLDER with NUMBER is matched. CONDITION is a condition structure for testing. NUMBERS is a list of message numbers, use to be test for \"last\" and \"first\" predicates.") (luna-define-generic elmo-folder-msgdb-create (folder numbers flag-table) "Create a message database (implemented in each backends). FOLDER is the ELMO folder structure. NUMBERS is a list of message numbers to create msgdb. FLAG-TABLE is a hashtable of message-id and flag.") (luna-define-generic elmo-folder-set-flag (folder numbers flag &optional is-local) "Set messages flag. FOLDER is a ELMO folder structure. NUMBERS is a list of message number to set flag. FLAG is a symbol which is one of the following: `unread' (set the message as unread) `answered' (set the message as answered) `important' (set the message as important) 'sugar' flag: `read' (remove new and unread flags) If optional IS-LOCAL is non-nil, update only local (not server) status.") (luna-define-generic elmo-folder-unset-flag (folder numbers flag &optional is-local) "Unset messages flag. FOLDER is a ELMO folder structure. NUMBERS is a list of message number to unset flag. FLAG is a symbol which is one of the following: `unread' (remove unread and new flag) `answered' (remove answered flag) `important' (remove important flag) 'sugar' flag: `read' (set unread flag) `all' (remove all flags) If optional IS-LOCAL is non-nil, update only local (not server) status.") (luna-define-generic elmo-message-flag-available-p (folder number flag) "Return non-nil when a message in the FOLDER with NUMBER treats FLAG.") (luna-define-generic elmo-folder-next-message-number (folder) "The next message number that will be assigned to a new message. FOLDER is the ELMO folder structure.") (luna-define-generic elmo-folder-append-buffer (folder &optional flags number return-number) "Append current buffer as a new message. FOLDER is the destination folder (ELMO folder structure). FLAGS is the flag list for the appended message (list of symbols). If FLAGS contain `read', the message is appended as `not-unread'. If it is nil, the appended message will be treated as `new'. If optional argument NUMBER is specified, the new message number is set \(if possible\). If optional argument RETURN-NUMBER is non-nil, return the number of the appended message if possible. If the number could not be obtained return t. Return nil on failure.") (luna-define-generic elmo-folder-pack-numbers (folder) "Pack message numbers of FOLDER.") (luna-define-generic elmo-folder-update-number (folder) "Update number of FOLDER.") (luna-define-generic elmo-folder-diff-async (folder) "Get diff of FOLDER asynchronously.") (luna-define-generic elmo-folder-expand-msgdb-path (folder) "Expand path for FOLDER.") (luna-define-generic elmo-folder-get-primitive-list (folder) "Get primitive folder structure list contained in FOLDER.") (luna-define-generic elmo-folder-contains-type (folder type) "Returns t if FOLDER contains TYPE.") (luna-define-generic elmo-folder-local-p (folder) "Returns t if FOLDER is local.") (luna-define-generic elmo-folder-message-file-p (folder) "Returns t if all messages in the FOLDER are files.") ;;; Message methods. (luna-define-generic elmo-message-use-cache-p (folder number) "Returns t if the message in the FOLDER with NUMBER uses cache.") (luna-define-generic elmo-message-file-name (folder number) "Return new string fo the file name of a message specified by FOLDER and NUMBER.") ;;; For archive ;;; Use original file (luna-define-generic elmo-folder-message-file-number-p (folder) "Return t if the file name in the FOLDER is the message number.") (luna-define-generic elmo-folder-message-file-directory (folder) "Return the directory of the message files of FOLDER.") ;;; Use temporary file (luna-define-generic elmo-folder-message-make-temp-file-p (folder) "Return t if the messages in the FOLDER makes local temporary file.") (luna-define-generic elmo-folder-message-make-temp-files (folder numbers &optional start-number) "Make a new temporary files from the messages in the FOLDER with NUMBERS. If START-NUMBER is specified, temporary files begin from the number. Otherwise, same number is used for temporary files. Return newly created temporary directory name which contains temporary files.") (luna-define-generic elmo-message-file-p (folder number) "Return t if message in the FOLDER with NUMBER is a file.") (luna-define-generic elmo-message-flags (folder number) "Return a list of flags. FOLDER is a ELMO folder structure. NUMBER is a number of the message.") (defun elmo-message-flags-for-append (folder number &optional message-id) "Return a list of flags for `elmo-folder-append-buffer'. FOLDER is a ELMO folder structure. NUMBER is a number of the message. If optional argument MESSAGES-ID is not specified, get it from current buffer." (let ((this-id (elmo-message-field folder number 'message-id))) (and this-id (string= this-id (or message-id (elmo-msgdb-get-message-id-from-buffer))) (or (elmo-message-flags folder number) ;; message exists, but no flag. '(read))))) (luna-define-method elmo-message-flag-available-p ((folder elmo-folder) _number flag) (elmo-msgdb-flag-available-p (elmo-folder-msgdb folder) flag)) (luna-define-method elmo-message-flags ((folder elmo-folder) number) (elmo-msgdb-flags (elmo-folder-msgdb folder) number)) (defsubst elmo-message-flagged-p (folder number flag) "Return non-nil if the message is set FLAG. FOLDER is a ELMO folder structure. NUMBER is a message number to test." (let ((cur-flags (elmo-message-flags folder number))) (cl-case flag (read (not (memq 'unread cur-flags))) (t (memq flag cur-flags))))) (luna-define-generic elmo-find-fetch-strategy (folder number &optional ignore-cache require-entireness) "Return the message fetching strategy suitable for the message with NUMBER. FOLDER is the ELMO folder structure. If optional argument IGNORE-CACHE is non-nil, existing cache is ignored. If second optional argument REQUIRE-ENTIRENESS is non-nil, ensure that entireness of the returned strategy is entire. Returned value is a elmo-fetch-strategy object. If return value is nil, message should not be nil.") (defmacro elmo-make-fetch-strategy (entireness &optional use-cache save-cache cache-path) "Make elmo-message-fetching strategy. ENTIRENESS is 'entire or 'section. 'entire means fetch message entirely at once. 'section means fetch message section by section. If optional USE-CACHE is non-nil, existing cache is used and otherwise, existing cache is thrown away. If SAVE-CACHE is non-nil, fetched message is saved. CACHE-PATH is the cache path to be used as a message cache file." `(vector ,entireness ,use-cache ,save-cache ,cache-path)) (defmacro elmo-fetch-strategy-entireness (strategy) "Return entireness of STRATEGY." `(aref ,strategy 0)) (defmacro elmo-fetch-strategy-use-cache (strategy) "Return use-cache of STRATEGY." `(aref ,strategy 1)) (defmacro elmo-fetch-strategy-save-cache (strategy) "Return save-cache of STRATEGY." `(aref ,strategy 2)) (defmacro elmo-fetch-strategy-cache-path (strategy) "Return cache-path of STRATEGY." `(aref ,strategy 3)) (luna-define-method elmo-find-fetch-strategy ((folder elmo-folder) number &optional ignore-cache require-entireness) (let ((entity (elmo-message-entity folder number))) (if (null entity) (elmo-make-fetch-strategy 'entire) (let* ((size (elmo-message-entity-field entity 'size)) (message-id (elmo-message-entity-field entity 'message-id)) (cache-file (elmo-file-cache-get message-id)) (use-cache (elmo-message-use-cache-p folder number))) (if (and (not ignore-cache) use-cache (eq (elmo-file-cache-status cache-file) 'entire)) ;; Cache exists and use it. (elmo-make-fetch-strategy 'entire t ; Use cache. use-cache ; Save cache. (elmo-file-cache-path cache-file)) ;; No cache or ignore-cache. (if (and (not (elmo-folder-local-p folder)) (not require-entireness) elmo-message-fetch-threshold (integerp size) (>= size elmo-message-fetch-threshold) (or (not elmo-message-fetch-confirm) (not (prog1 (y-or-n-p (format "Fetch entire message(%dbytes)? " size)) (message ""))))) ;; Don't fetch message at all. nil ;; Don't use existing cache and fetch entire message at once. (elmo-make-fetch-strategy 'entire nil ; Don't use cache. use-cache ; Save cache. (elmo-file-cache-path cache-file)))))))) (luna-define-method elmo-folder-list-messages-internal ((_folder elmo-folder) &optional _visible-only) t) (luna-define-generic elmo-message-encache (folder number &optional read) "Encache message in the FOLDER with NUMBER. If READ is non-nil, message is flaged as read.") (luna-define-method elmo-message-encache ((folder elmo-folder) number &optional read) (let (path) (with-temp-buffer (elmo-message-fetch folder number (elmo-make-fetch-strategy 'entire nil ;use-cache t ;save-cache (setq path (elmo-file-cache-get-path (elmo-message-field folder number 'message-id)))) (not read))) path)) (luna-define-generic elmo-message-fetch-bodystructure (folder number strategy) "Fetch bodystructure of the message in FOLDER with NUMBER using STRATEGY.") (luna-define-generic elmo-message-fetch (folder number strategy &optional unread section) "Fetch a message into current buffer. FOLDER is the ELMO folder structure. NUMBER is the number of the message in the FOLDER. STRATEGY is the message fetching strategy. If optional argument UNREAD is non-nil, message is not flaged as read. If second optional argument SECTION is specified, only the SECTION of the message is fetched (if possible). Returns non-nil if fetching was succeed.") (luna-define-generic elmo-message-fetch-internal (folder number strategy &optional section unread) "Fetch a message into current buffer. FOLDER is the ELMO folder structure. NUMBER is the number of the message in the FOLDER. STRATEGY is the message fetching strategy. If optional argument SECTION is specified, only the SECTION of the message is fetched (if possible). If second optional argument UNREAD is non-nil, message is not flaged as read. Returns non-nil if fetching was succeed.") (luna-define-generic elmo-message-fetch-field (folder number field) "Fetch a message field value. FOLDER is the ELMO folder structure. NUMBER is the number of the message in the FOLDER. FIELD is a symbol of the field name.") (luna-define-generic elmo-message-folder (folder number) "Get primitive folder of the message.") (luna-define-generic elmo-folder-process-crosspost (folder) "Process crosspost for FOLDER. Return a cons cell of (NUMBER-CROSSPOSTS . NEW-FLAG-ALIST).") (luna-define-generic elmo-folder-newsgroups (folder) "Return list of newsgroup name of FOLDER.") (luna-define-generic elmo-folder-search-requires-msgdb-p (folder condition) "Return non-nil if searching in FOLDER by CONDITION requires msgdb fetch.") (defun elmo-folder-search-requires-msgdb-p-internal (folder condition) (if (listp condition) (or (elmo-folder-search-requires-msgdb-p-internal folder (nth 1 condition)) (elmo-folder-search-requires-msgdb-p-internal folder (nth 2 condition))) (and (not (string= (elmo-filter-key condition) "last")) (not (string= (elmo-filter-key condition) "first"))))) (luna-define-method elmo-folder-search-requires-msgdb-p ((folder elmo-folder) condition) (elmo-folder-search-requires-msgdb-p-internal folder condition)) (luna-define-method elmo-folder-newsgroups ((_folder elmo-folder)) nil) (luna-define-method elmo-folder-open ((folder elmo-folder) &optional load-msgdb) (elmo-generic-folder-open folder load-msgdb)) (defun elmo-generic-folder-open (folder load-msgdb) (let ((inhibit-quit t)) (if load-msgdb (elmo-folder-msgdb folder)) (elmo-folder-set-killed-list-internal folder (elmo-msgdb-killed-list-load (elmo-folder-msgdb-path folder)))) (elmo-folder-open-internal folder)) (luna-define-method elmo-folder-open-internal ((_folder elmo-folder)) nil ; default is do nothing. ) (luna-define-method elmo-folder-check ((_folder elmo-folder)) nil) ; default is noop. (luna-define-method elmo-folder-commit ((folder elmo-folder)) (elmo-generic-folder-commit folder)) (defun elmo-generic-folder-commit (folder) (when (elmo-folder-persistent-p folder) (let ((msgdb (elmo-folder-msgdb-internal folder))) (when msgdb (when (elmo-msgdb-message-modified-p msgdb) (elmo-folder-set-info-max-by-numdb folder (elmo-folder-list-messages folder nil 'in-msgdb))) (elmo-msgdb-save msgdb))) (elmo-msgdb-killed-list-save (elmo-folder-msgdb-path folder) (elmo-folder-killed-list-internal folder)))) (luna-define-method elmo-folder-close-internal ((_folder elmo-folder)) ;; do nothing. ) (luna-define-method elmo-folder-close ((folder elmo-folder)) (elmo-generic-folder-close folder) (elmo-folder-close-internal folder)) (defun elmo-generic-folder-close (folder) (elmo-folder-commit folder) (elmo-folder-set-msgdb-internal folder nil) (elmo-folder-set-killed-list-internal folder nil)) (luna-define-method elmo-folder-plugged-p ((_folder elmo-folder)) t) ; default is plugged. (luna-define-method elmo-folder-set-plugged ((_folder elmo-folder) _plugged &optional _add) nil) ; default is do nothing. (luna-define-method elmo-folder-use-flag-p ((_folder elmo-folder)) nil) ; default is no flag. (luna-define-method elmo-folder-persistent-p ((folder elmo-folder)) (elmo-folder-persistent-internal folder)) (luna-define-method elmo-folder-creatable-p ((_folder elmo-folder)) nil) ; default is not creatable. (luna-define-method elmo-folder-writable-p ((_folder elmo-folder)) nil) ; default is not writable. (luna-define-method elmo-folder-delete ((folder elmo-folder)) (when (yes-or-no-p (format "Delete msgdb of \"%s\"? " (elmo-folder-name-internal folder))) (elmo-msgdb-delete-path folder) t)) (luna-define-method elmo-folder-rename ((folder elmo-folder) new-name) (let ((new-folder (elmo-make-folder new-name nil (elmo-folder-mime-charset-internal folder)))) (unless (eq (elmo-folder-type-internal folder) (elmo-folder-type-internal new-folder)) (error "Not same folder type")) (when (or (file-exists-p (elmo-folder-msgdb-path new-folder)) (elmo-folder-exists-p new-folder)) (error "Already exists folder: %s" new-name)) (elmo-folder-send folder 'elmo-folder-rename-internal new-folder) (elmo-global-flag-replace-referrer (elmo-folder-name-internal folder) new-name) (elmo-msgdb-rename-path folder new-folder))) (luna-define-method elmo-folder-delete-messages ((folder elmo-folder) numbers) (and (elmo-folder-delete-messages-internal folder numbers) (elmo-folder-detach-messages folder numbers))) (luna-define-method elmo-folder-search ((folder elmo-folder) condition &optional numbers) (let ((msgdb (elmo-folder-msgdb folder)) results) (setq numbers (cond ((null numbers) (elmo-folder-list-messages folder)) ((listp numbers) numbers) (t (elmo-folder-list-messages folder 'visible 'in-msgdb))) results (elmo-msgdb-search msgdb condition numbers)) (if (listp results) results (elmo-condition-optimize condition) (when (and (consp condition) (eq (car condition) 'and) (listp (setq results (elmo-msgdb-search msgdb (nth 1 condition) numbers)))) (setq numbers results condition (nth 2 condition))) (let (matched) (elmo-with-progress-display (elmo-folder-search (length numbers)) "Searching messages" (dolist (number numbers) (let (result) (setq result (elmo-msgdb-match-condition msgdb condition number numbers)) (when (elmo-filter-condition-p result) (setq result (elmo-message-match-condition folder number condition numbers))) (when result (setq matched (cons number matched)))) (elmo-progress-notify 'elmo-folder-search))) (nreverse matched))))) (defun elmo-message-buffer-match-condition (condition number) (let* ((handler (luna-make-entity 'modb-buffer-entity-handler)) (result (elmo-condition-match condition (lambda (condition handler entity) (elmo-msgdb-message-match-condition handler condition entity)) (list handler (elmo-msgdb-make-message-entity handler :number number :buffer (current-buffer)))))) (and result (not (elmo-filter-condition-p result))))) (luna-define-method elmo-message-match-condition ((folder elmo-folder) number condition _numbers) (let* (cache cache-path (filename (cond ((elmo-message-file-name folder number)) ((progn (setq cache (elmo-file-cache-get (elmo-message-field folder number 'message-id))) (setq cache-path (elmo-file-cache-path cache)) (and cache-path (not (elmo-cache-path-section-p cache-path)))) cache-path)))) (when (and filename (file-readable-p filename)) (with-temp-buffer (set-buffer-multibyte nil) ;;; (insert-file-contents-as-binary filename) (elmo-message-fetch folder number (elmo-make-fetch-strategy 'entire (and cache t) nil cache-path) 'unread) (set-buffer-multibyte t) (elmo-message-buffer-match-condition condition number))))) (luna-define-method elmo-folder-pack-numbers ((_folder elmo-folder)) nil) ; default is noop. (luna-define-method elmo-folder-update-number ((_folder elmo-folder)) nil) ; default is noop. (luna-define-method elmo-folder-message-file-p ((_folder elmo-folder)) nil) ; default is not file. (luna-define-method elmo-folder-message-file-number-p ((_folder elmo-folder)) nil) ; default is not number. (luna-define-method elmo-folder-message-make-temp-file-p ((_folder elmo-folder)) nil) ; default is not make temp file. (luna-define-method elmo-message-file-name ((_folder elmo-folder) _number) nil) ; default is no name. (luna-define-method elmo-folder-local-p ((_folder elmo-folder)) t) ; default is local. (luna-define-method elmo-folder-have-subfolder-p ((_folder elmo-folder)) t) ;; Flag table (luna-define-generic elmo-folder-flag-table (folder &optional if-exists) "Return the flag-table of FOLDER. If optional argument IF-EXISTS is nil, load on demand. \(For internal use only.\)") (luna-define-generic elmo-folder-close-flag-table (folder) "Close flag-table of FOLDER.") (luna-define-method elmo-folder-flag-table ((folder elmo-folder) &optional if-exists) (or (elmo-folder-flag-table-internal folder) (unless if-exists (elmo-folder-set-flag-table-internal folder (elmo-flag-table-load (elmo-folder-msgdb-path folder)))))) (luna-define-method elmo-folder-close-flag-table ((folder elmo-folder)) (elmo-flag-table-save (elmo-folder-msgdb-path folder) (elmo-folder-flag-table folder)) (elmo-folder-set-flag-table-internal folder nil)) (defun elmo-folder-preserve-flags (folder msgid flags) "Preserve FLAGS into FOLDER for a message that has MSGID." (when (and msgid flags) (let ((flag-table (elmo-folder-flag-table folder 'if-exists)) load-now) (when (setq load-now (null flag-table)) (setq flag-table (elmo-folder-flag-table folder))) (elmo-flag-table-set flag-table msgid flags) (when load-now (elmo-folder-close-flag-table folder))))) ;;; Folder info ;; Folder info is a message number information cache (hashtable) (defsubst elmo-folder-get-info (folder &optional hashtb) "Return FOLDER info from HASHTB (default is `elmo-folder-info-hashtb')." (elmo-get-hash-val (elmo-folder-name-internal folder) (or hashtb elmo-folder-info-hashtb))) (defun elmo-folder-set-info-hashtb (folder max numbers &optional new unread) "Set FOLDER info (means MAX, NUMBERS, NEW and UNREAD)." (let ((info (elmo-folder-get-info folder))) (when info (or new (setq new (nth 0 info))) (or unread (setq unread (nth 1 info))) (or numbers (setq numbers (nth 2 info))) (or max (setq max (nth 3 info)))) (elmo-set-hash-val (elmo-folder-name-internal folder) (list new unread numbers max) elmo-folder-info-hashtb))) (defun elmo-folder-set-info-max-by-numdb (folder numbers) "Set FOLDER info by MSGDB-NUMBER in msgdb." (elmo-folder-set-info-hashtb folder (if numbers (apply #'max numbers) 0) ;;; (length num-db) nil)) (defun elmo-folder-get-info-max (folder) "Return max number of FODLER from folder info." (nth 3 (elmo-folder-get-info folder))) (defun elmo-folder-get-info-length (folder) "Return length of FODLER from folder info." (nth 2 (elmo-folder-get-info folder))) (defun elmo-folder-get-info-unread (folder) "Return unread of FODLER from folder info." (nth 1 (elmo-folder-get-info folder))) (defun elmo-folder-info-make-hashtb (info-alist hashtb) "Setup folder info hashtable by INFO-ALIST on HASHTB." (let* ((hashtb (or hashtb (elmo-make-hash (length info-alist))))) (mapc (lambda (x) (let ((info (cadr x))) (and (intern-soft (car x) hashtb) (elmo-set-hash-val (car x) (list (nth 2 info) ;; new (nth 3 info) ;; unread (nth 1 info) ;; length (nth 0 info)) ;; max hashtb)))) info-alist) (setq elmo-folder-info-hashtb hashtb))) (defsubst elmo-diff-new (diff) (car diff)) (defsubst elmo-diff-unread (diff) (when (consp (cdr diff)) (nth 1 diff))) (defsubst elmo-diff-all (diff) (if (consp (cdr diff)) (nth 2 diff) (cdr diff))) (defsubst elmo-strict-folder-diff (folder) "Return folder diff information strictly from FOLDER." (let ((in-db (elmo-folder-list-messages folder nil 'in-msgdb)) (in-folder (elmo-folder-list-messages folder)) append-list delete-list diff) (cons (if (equal in-folder in-db) 0 (setq diff (elmo-list-diff in-folder in-db)) (setq append-list (car diff)) (setq delete-list (cadr diff)) (if append-list (length append-list) (if delete-list (- (length delete-list)) 0))) (length in-folder)))) (luna-define-method elmo-folder-diff ((folder elmo-folder)) (elmo-generic-folder-diff folder)) (defun elmo-generic-folder-diff (folder) (if (elmo-string-match-member (elmo-folder-name-internal folder) elmo-strict-diff-folder-list) (elmo-strict-folder-diff folder) (let ((cached-in-db-max (elmo-folder-get-info-max folder)) (in-folder (elmo-folder-status folder)) (in-db t) unsync messages in-db-max) (if (not cached-in-db-max) (let ((number-list (elmo-folder-list-messages folder nil 'in-msgdb))) ;; No info-cache. (setq in-db number-list) (setq in-db-max (if in-db (apply #'max in-db) 0)) (elmo-folder-set-info-hashtb folder in-db-max nil)) (setq in-db-max cached-in-db-max)) (setq unsync (if (and in-db (car in-folder)) (- (car in-folder) in-db-max) (if (and in-folder (null in-db)) (cdr in-folder) (car in-folder)))) (setq messages (cdr in-folder)) (if (and unsync messages (> unsync messages)) (setq unsync messages)) (cons (or unsync 0) (or messages 0))))) (defvar elmo-folder-diff-async-callback nil) (defvar elmo-folder-diff-async-callback-data nil) (luna-define-method elmo-folder-diff-async ((folder elmo-folder)) (and elmo-folder-diff-async-callback (funcall elmo-folder-diff-async-callback folder (elmo-folder-diff folder)))) (luna-define-method elmo-folder-get-primitive-list ((folder elmo-folder)) (list folder)) (luna-define-method elmo-folder-contains-type ((folder elmo-folder) type) (eq (elmo-folder-type-internal folder) type)) (luna-define-method elmo-folder-next-message-number ((folder elmo-folder)) (1+ (elmo-max-of-list (elmo-folder-list-messages folder)))) (eval-and-compile (luna-define-class elmo-file-tag)) (defconst elmo-append-messages-dispatch-table '(((nil . null) . elmo-folder-append-messages-*-null) ((filter . nil) . elmo-folder-append-messages-filter-*) ((nil . filter) . elmo-folder-append-messages-*-filter) ((pipe . nil) . elmo-folder-append-messages-pipe-*) ((nil . pipe) . elmo-folder-append-messages-*-pipe) ((multi . nil) . elmo-folder-append-messages-multi-*) ((nil . flag) . elmo-folder-append-messages-*-flag) ((imap4 . imap4) . elmo-folder-append-messages-imap4-imap4) ((elmo-file-tag . localdir) . elmo-folder-append-messages-*-localdir) ((elmo-file-tag . maildir) . elmo-folder-append-messages-*-maildir) ((nil . archive) . elmo-folder-append-messages-*-archive) ((nil . nil) . elmo-generic-folder-append-messages))) (defun elmo-folder-type-p (folder type) (or (null type) (eq (elmo-folder-type-internal folder) type) (cl-labels ((member-if (predicate list) (and list (or (funcall predicate (car list)) (member-if predicate (cdr list))))) (subtypep (name type) (or (eq name type) (let ((class (luna-find-class name))) (and class (member-if (lambda (name) (subtypep name type)) (luna-class-parents class))))))) (subtypep (luna-class-name folder) (or (intern-soft (format "elmo-%s-folder" type)) type))))) (defun elmo-folder-append-messages (dst-folder src-folder numbers &optional same-number caller) "Append messages from folder. DST-FOLDER is the ELMO folder structure. Caller should make sure DST-FOLDER is `writable'. \(Can be checked with `elmo-folder-writable-p'\). SRC-FOLDER is the source ELMO folder structure. NUMBERS is the message numbers to be appended in the SRC-FOLDER. If second optional argument SAME-NUMBER is specified, message number is preserved \(if possible\). Returns a list of message numbers successfully appended." (let ((rest (if caller (cdr (memq (rassq caller elmo-append-messages-dispatch-table) elmo-append-messages-dispatch-table)) elmo-append-messages-dispatch-table)) result) (while rest (let ((types (car (car rest)))) (if (and (elmo-folder-type-p src-folder (car types)) (elmo-folder-type-p dst-folder (cdr types))) (setq result (funcall (cdr (car rest)) dst-folder src-folder numbers same-number) rest nil) (setq rest (cdr rest))))) result)) (defun elmo-generic-folder-append-messages (folder src-folder numbers same-number) (let ((src-msgdb-exists (not (zerop (elmo-folder-length src-folder)))) succeed-numbers failure cache id) (elmo-folder-flag-table folder) ; load (with-temp-buffer (set-buffer-multibyte nil) (while numbers (setq failure nil id (and src-msgdb-exists (elmo-message-field src-folder (car numbers) 'message-id))) (condition-case nil (setq cache (elmo-file-cache-get id) failure (not (and (elmo-message-fetch src-folder (car numbers) (if (elmo-folder-plugged-p src-folder) (elmo-make-fetch-strategy 'entire 'maybe nil (and cache (elmo-file-cache-path cache))) (or (and elmo-enable-disconnected-operation cache (eq (elmo-file-cache-status cache) 'entire) (elmo-make-fetch-strategy 'entire t nil (elmo-file-cache-path cache))) (error "Unplugged"))) 'unread) (> (buffer-size) 0) (elmo-folder-append-buffer folder (elmo-message-flags-for-append src-folder (car numbers)) (if same-number (car numbers)))))) (error (setq failure t))) ;; FETCH & APPEND finished (unless failure (setq succeed-numbers (cons (car numbers) succeed-numbers))) (elmo-progress-notify 'elmo-folder-move-messages) (setq numbers (cdr numbers))) (when (elmo-folder-persistent-p folder) (elmo-folder-close-flag-table folder)) succeed-numbers))) ;; Arguments should be reduced. (defun elmo-folder-move-messages (src-folder msgs dst-folder &optional no-delete same-number) (save-excursion (let* ((messages msgs) (len (length msgs)) succeeds result) (if (eq dst-folder 'null) (setq succeeds messages) (unless (elmo-folder-writable-p dst-folder) (error "move: %d is not writable" (elmo-folder-name-internal dst-folder))) (when messages (elmo-folder-open-internal src-folder) (elmo-folder-open-internal dst-folder) (unless (setq succeeds (elmo-folder-append-messages dst-folder src-folder messages same-number)) (error "move: append message to %s failed" (elmo-folder-name-internal dst-folder))) (elmo-folder-close dst-folder))) (if (and (not no-delete) succeeds) (progn (if (elmo-folder-delete-messages src-folder succeeds) (progn (elmo-global-flag-detach-messages src-folder succeeds (eq dst-folder 'null)) (setq result t)) (message "move: delete messages from %s failed." (elmo-folder-name-internal src-folder)) (setq result nil)) result) (if no-delete (progn ;;; (message "Copying messages...done") t) (if (zerop len) (message "No message was moved.") (message "Moving messages failed.") nil ; failure )))))) (defun elmo-folder-msgdb-path (folder) "Return the msgdb path for FOLDER." (or (elmo-folder-path-internal folder) (elmo-folder-set-path-internal folder (if (null elmo-msgdb-path-encode-threshold) (elmo-folder-expand-msgdb-path folder) (let* ((path (directory-file-name (elmo-folder-expand-msgdb-path folder))) (dirname (file-name-nondirectory path))) (if (<= (length dirname) elmo-msgdb-path-encode-threshold) path (setq dirname (md5 dirname)) (when (> (length dirname) elmo-msgdb-path-encode-threshold) (error "Cannot shrink msgdb path for `%s'" (elmo-folder-name-internal folder))) (expand-file-name dirname (file-name-directory path)))))))) (luna-define-generic elmo-message-cached-p (folder number) "Return non-nil if the message is cached.") (luna-define-method elmo-message-cached-p ((folder elmo-folder) number) (elmo-message-flagged-p folder number 'cached)) (luna-define-generic elmo-message-killed-p (folder number) "Return non-nil if the message is killed.") (luna-define-method elmo-message-killed-p ((folder elmo-folder) number) (let ((killed-list (elmo-folder-killed-list-internal folder))) (and killed-list (elmo-number-set-member number killed-list)))) (defun elmo-message-accessible-p (folder number) "Get accessibility of the message. Return non-nil when message is accessible." (or (elmo-folder-plugged-p folder) (elmo-folder-local-p folder) (< number 0) ; in dop spool (elmo-message-cached-p folder number))) (luna-define-generic elmo-message-set-cached (folder number cached) "Set cache status of the message in the msgdb. FOLDER is the ELMO folder structure. NUMBER is a number of the message. If CACHED is t, message is set as cached.") (luna-define-method elmo-message-set-cached ((folder elmo-folder) number cached) (if cached (elmo-msgdb-set-flag (elmo-folder-msgdb folder) number 'cached) (elmo-msgdb-unset-flag (elmo-folder-msgdb folder) number 'cached)) (elmo-emit-signal 'status-changed folder (list number))) (defun elmo-message-copy-entity (entity) (elmo-msgdb-copy-message-entity (elmo-message-entity-handler entity) entity)) (luna-define-generic elmo-message-number (folder message-id) "Get message number from MSGDB which corresponds to MESSAGE-ID.") (luna-define-method elmo-message-number ((folder elmo-folder) message-id) (elmo-msgdb-message-number (elmo-folder-msgdb folder) message-id)) (luna-define-generic elmo-message-entity (folder key) "Return the message-entity structure which matches to the KEY. KEY is a number or a string. A number is for message number in the FOLDER. A string is for message-id of the message.") (luna-define-method elmo-message-entity ((folder elmo-folder) key) (elmo-msgdb-message-entity (elmo-folder-msgdb folder) key)) (luna-define-generic elmo-message-entity-parent (folder entity) "Return the parent message-entity structure in the FOLDER. ENTITY is the message-entity to get the parent.") (luna-define-method elmo-message-entity-parent ((folder elmo-folder) entity) (elmo-msgdb-get-parent-entity entity (elmo-folder-msgdb folder))) (put 'elmo-folder-do-each-message-entity 'lisp-indent-function '1) (def-edebug-spec elmo-folder-do-each-message-entity ((symbolp form &rest form) &rest form)) (defsubst elmo-folder-list-message-entities (folder) ;; List all message entities in the FOLDER. (mapcar (lambda (number) (elmo-message-entity folder number)) (elmo-folder-list-messages folder nil t))) ; XXX killed-list is not used. (defmacro elmo-folder-do-each-message-entity (spec &rest form) "Iterator for message entity in the folder. \(elmo-folder-do-each-message-entity \(entity folder\) ... do the process using entity... \)" `(dolist (,(car spec) (elmo-folder-list-message-entities ,(car (cdr spec)))) ,@form)) (luna-define-generic elmo-folder-count-flags (folder) "Count flagged message number in the msgdb of the FOLDER. Return alist of flag and numbers. Example: \(\(new . 10\) \(unread . 20\) \(answered . 3\)\)") (luna-define-method elmo-folder-count-flags ((folder elmo-folder)) (elmo-msgdb-flag-count (elmo-folder-msgdb folder))) (defun elmo-message-set-flag (folder number flag &optional is-local) "Set message flag. FOLDER is a ELMO folder structure. NUMBER is a message number to set flag. FLAG is a symbol which is one of the following: `unread' (set the message as unread) `answered' (set the message as answered) `important' (set the message as important) 'sugar' flag: `read' (remove new and unread flags) If optional IS-LOCAL is non-nil, update only local (not server) status." ;; XXX Transitional implementation. (elmo-folder-set-flag folder (list number) flag is-local)) (defun elmo-message-unset-flag (folder number flag &optional is-local) "Unset message flag. FOLDER is a ELMO folder structure. NUMBER is a message number to set flag. FLAG is a symbol which is one of the following: `unread' (remove unread and new flag) `answered' (remove answered flag) `important' (remove important flag) 'sugar' flag: `read' (set unread flag) If optional IS-LOCAL is non-nil, update only local (not server) status." ;; XXX Transitional implementation. (elmo-folder-unset-flag folder (list number) flag is-local)) (luna-define-generic elmo-message-field (folder number field &optional type) "Get message field value in the msgdb. FOLDER is the ELMO folder structure. NUMBER is a number of the message. FIELD is a symbol of the field. If optional argument TYPE is specified, return converted value.") (luna-define-method elmo-message-field ((folder elmo-folder) number field &optional type) (elmo-msgdb-message-field (elmo-folder-msgdb folder) number field type)) (luna-define-generic elmo-message-set-field (folder number field value) "Set message field value in the msgdb. FOLDER is the ELMO folder structure. NUMBER is a number of the message. FIELD is a symbol of the field. VALUE is a value to set.") (luna-define-method elmo-message-set-field ((folder elmo-folder) number field value) (elmo-message-entity-set-field (elmo-message-entity folder number) field value)) (luna-define-method elmo-message-use-cache-p ((_folder elmo-folder) _number) nil) ; default is not use cache. (luna-define-method elmo-message-folder ((folder elmo-folder) _number) folder) ; default is folder (luna-define-method elmo-folder-set-flag ((folder elmo-folder) numbers flag &optional _is-local) (when (elmo-folder-msgdb-internal folder) (dolist (number numbers) (let ((old-flags (elmo-message-flags folder number))) (when (elmo-global-flag-p flag) (let ((message-id (elmo-message-field folder number 'message-id))) (elmo-global-flag-set flag folder number message-id))) (elmo-msgdb-set-flag (elmo-folder-msgdb folder) number flag) (elmo-emit-signal 'flag-changing folder number old-flags (elmo-message-flags folder number)))) (elmo-emit-signal 'flag-changed folder numbers))) (defun elmo-message-has-global-flag-p (folder number) "Return non-nil when the message in the FOLDER with NUMBER has global flag." (let ((flags (elmo-message-flags folder number)) result) (while flags (when (and (elmo-global-flag-p (car flags)) (not (memq (car flags) '(answered unread cached)))) (setq result t flags nil)) (setq flags (cdr flags))) result)) (defun elmo-message-set-global-flags (folder number flags &optional local) "Set global flags of the message in the FOLDER with NUMBER as FLAGS. If Optional LOCAL is non-nil, don't update server flag." (dolist (flag flags) (unless (elmo-global-flag-p flag) (error "Not a global flag"))) (let ((old-flags (elmo-get-global-flags (elmo-message-flags folder number)))) (dolist (flag flags) (unless (memq flag old-flags) (elmo-message-set-flag folder number flag local))) (dolist (flag old-flags) (unless (memq flag flags) (elmo-message-unset-flag folder number flag local))))) (luna-define-method elmo-folder-unset-flag ((folder elmo-folder) numbers flag &optional _is-local) (when (elmo-folder-msgdb-internal folder) (dolist (number numbers) (let ((old-flags (elmo-message-flags folder number))) (when (elmo-global-flag-p flag) (elmo-global-flag-detach flag folder number 'always)) (elmo-msgdb-unset-flag (elmo-folder-msgdb folder) number flag) (elmo-emit-signal 'flag-changing folder number old-flags (elmo-message-flags folder number)))) (elmo-emit-signal 'flag-changed folder numbers))) (luna-define-method elmo-folder-process-crosspost ((_folder elmo-folder)) ;; Do nothing. ) ;;;(luna-define-generic elmo-folder-append-message-entity (folder entity ;;; &optional ;;; flag-table) ;;; "Append ENTITY to the folder.") (defun elmo-msgdb-merge (folder msgdb-merge) "Return a list of messages which have duplicated message-id." (let (msgdb duplicates) (setq msgdb (or (elmo-folder-msgdb-internal folder) (elmo-make-msgdb (elmo-folder-msgdb-path folder)))) (setq duplicates (elmo-msgdb-append msgdb msgdb-merge)) (elmo-folder-set-msgdb-internal folder msgdb) duplicates)) (defsubst elmo-folder-append-msgdb (folder append-msgdb) (if append-msgdb (let ((duplicates (elmo-msgdb-merge folder append-msgdb))) (cond ((eq (elmo-folder-process-duplicates-internal folder) 'hide) ;; Let duplicates be a temporary killed message. (elmo-folder-kill-messages folder duplicates) ;; Should be flag as read. (elmo-folder-unset-flag folder duplicates 'unread)) ((eq (elmo-folder-process-duplicates-internal folder) 'read) ;; Flag as read duplicates. (elmo-folder-unset-flag folder duplicates 'unread)) (t ;; Do nothing. (setq duplicates nil))) (length duplicates)) 0)) (defun elmo-folder-confirm-appends (folder appends) (nthcdr (let ((len (length appends)) in) (if (and elmo-folder-update-threshold (> len elmo-folder-update-threshold)) (if elmo-folder-update-confirm (if (y-or-n-p (format "Too many messages(%d) in %s. Update all? " len (elmo-folder-name-internal folder))) 0 (catch 'end (while t (setq in (elmo-read-number "Update number: " elmo-folder-update-threshold)) (cond ((< len in) (throw 'end 0)) ((y-or-n-p (format "%d messages are killed (not appeared). OK? " (setq in (- len in)))) (throw 'end in)))))) (message "%d messages are killed (not appeared)." (- len elmo-folder-update-threshold)) (- len elmo-folder-update-threshold)) 0)) appends)) (luna-define-method elmo-message-fetch-bodystructure ((_folder elmo-folder) _number _strategy) nil) (defun elmo-message-fetch-string (folder number strategy &optional unread section) (with-temp-buffer (set-buffer-multibyte nil) (when (elmo-message-fetch folder number strategy unread section) (buffer-string)))) (luna-define-method elmo-message-fetch ((folder elmo-folder) number strategy &optional unread section) (erase-buffer) (let ((cache-path (elmo-fetch-strategy-cache-path strategy)) (method-priorities (cond ((eq (elmo-fetch-strategy-use-cache strategy) 'maybe) '(entity cache)) ((elmo-fetch-strategy-use-cache strategy) '(cache entity)) (t '(entity)))) result err updated-server-flag) (while (and method-priorities (not result)) (setq result (cl-case (car method-priorities) (cache (elmo-file-cache-load cache-path section)) (entity (when (condition-case error (elmo-message-fetch-internal folder number strategy section unread) (error (setq err error) nil)) (setq updated-server-flag t) (when (and (elmo-fetch-strategy-save-cache strategy) cache-path) (elmo-file-cache-save cache-path section)) t))) method-priorities (cdr method-priorities))) (if result (when (and (not unread) (elmo-message-flagged-p folder number 'unread)) (elmo-message-unset-flag folder number 'unread updated-server-flag)) (when err (signal (car err) (cdr err)))) result)) (defun elmo-folder-kill-messages-range (folder beg end) (elmo-folder-set-killed-list-internal folder (nconc (elmo-folder-killed-list-internal folder) (list (cons beg end))))) (defun elmo-folder-kill-messages (folder numbers) "Kill(hide) messages in the FOLDER with NUMBERS." (elmo-folder-set-killed-list-internal folder (elmo-number-set-append-list (elmo-folder-killed-list-internal folder) numbers)) (elmo-folder-unset-flag folder numbers 'all 'local-only)) (luna-define-generic elmo-folder-recover-messages (folder numbers) "Recover killed messages in the FOLDER with NUMBERS.") (luna-define-method elmo-folder-recover-messages ((folder elmo-folder) numbers) (let ((msgdb (elmo-folder-msgdb folder))) (elmo-folder-set-killed-list-internal folder (elmo-number-set-delete-list (elmo-folder-killed-list-internal folder) numbers)) (dolist (number numbers) (if (elmo-file-cache-exists-p (elmo-message-field folder number 'message-id)) (elmo-msgdb-set-flag msgdb number 'cached) (elmo-msgdb-unset-flag msgdb number 'cached))) (elmo-emit-signal 'status-changed folder numbers))) (luna-define-method elmo-folder-clear ((folder elmo-folder) &optional keep-killed) (unless keep-killed (elmo-folder-set-killed-list-internal folder nil)) (if (eq elmo-msgdb-convert-type 'sync) (elmo-folder-set-msgdb-internal folder (elmo-make-msgdb (elmo-folder-msgdb-path folder))) (elmo-msgdb-clear (elmo-folder-msgdb folder)))) (luna-define-generic elmo-folder-synchronize (folder &optional disable-killed ignore-msgdb no-check mask) "Synchronize the folder data to the newest status. FOLDER is the ELMO folder structure. If optional DISABLE-KILLED is non-nil, killed messages are also synchronized. If optional IGNORE-MSGDB is non-nil, current msgdb is thrown away except flag status. If NO-CHECK is non-nil, rechecking folder is skipped. If optional argument MASK is specified and is a list of message numbers, synchronize messages only which are contained the list. MASK is assumed to be a subset of existing (not deleted) messages. Return amount of cross-posted messages. If update process is interrupted, return nil.") (luna-define-method elmo-folder-synchronize ((folder elmo-folder) &optional disable-killed ignore-msgdb no-check mask) (let ((old-msgdb (elmo-folder-msgdb folder)) (killed-list (elmo-folder-killed-list-internal folder)) (flag-table (elmo-flag-table-load (elmo-folder-msgdb-path folder))) (before-append t)) (when ignore-msgdb (elmo-msgdb-flag-table (elmo-folder-msgdb folder) flag-table) (elmo-folder-clear folder (not disable-killed))) (unless no-check (elmo-folder-check folder)) (condition-case nil (let ((killed-list (elmo-folder-killed-list-internal folder)) diff-new diff-del delete-list new-list new-msgdb crossed) (message "Checking folder diff...") ;; If MASK is supplied, compare against messagedb to ;; determine what needs to be synchronized. (if (and mask (not ignore-msgdb)) (setq diff-new (car (elmo-list-diff mask (elmo-folder-list-messages folder nil 'in-msgdb)))) (setq diff-new (elmo-list-diff (elmo-folder-list-messages folder) (elmo-folder-list-messages folder nil 'in-msgdb)) diff-del (cadr diff-new) diff-new (car diff-new)) ;; (let ((list (elmo-list-diff ;; (elmo-folder-list-messages folder) ;; (elmo-folder-list-messages folder nil 'in-msgdb)))) ;; (setq diff-new (car list) ;; diff-del (cadr list))) ) (if diff-new (unless disable-killed (setq diff-new (elmo-living-messages diff-new killed-list)))) (message "Checking folder diff...done") (setq new-list (elmo-folder-confirm-appends folder diff-new)) ;; Append to killed list as (MIN-OF-DISAPPEARED . MAX-OF-DISAPPEARED) (when (/= (length diff-new) (length new-list)) (let* ((diff (elmo-list-diff diff-new new-list)) (disappeared (car diff))) (when disappeared (elmo-folder-kill-messages-range folder (car disappeared) (elmo-last disappeared))))) (setq delete-list diff-del) (if (and (null diff-new) (null diff-del)) (progn (elmo-folder-update-number folder) (elmo-folder-process-crosspost folder) 0) ; `0' means no updates. (when delete-list (elmo-folder-detach-messages folder delete-list)) (when new-list (elmo-msgdb-out-of-date-messages (elmo-folder-msgdb folder)) (setq new-msgdb (elmo-folder-msgdb-create folder new-list flag-table)) ;; Clear flag-table (if (elmo-folder-persistent-p folder) (elmo-flag-table-save (elmo-folder-msgdb-path folder) nil)) (setq before-append nil) (setq crossed (elmo-folder-append-msgdb folder new-msgdb)) ;; process crosspost. ;; Return a cons cell of (NUMBER-CROSSPOSTS . NEW-FLAG-ALIST). (elmo-folder-process-crosspost folder)) ;; return value. (or crossed 0))) (quit ;; Resume to the original status. (if before-append (elmo-folder-set-msgdb-internal folder old-msgdb)) (elmo-folder-set-killed-list-internal folder killed-list) nil)))) (luna-define-generic elmo-folder-detach-messages (folder numbers) "Remove messages with NUMBERS from MSGDB.") (luna-define-method elmo-folder-detach-messages ((folder elmo-folder) numbers) (when (elmo-msgdb-delete-messages (elmo-folder-msgdb folder) numbers) ;; Remove NUMBERS from killed message list. (elmo-folder-set-killed-list-internal folder (elmo-number-set-delete-list (elmo-folder-killed-list-internal folder) numbers)) t)) (luna-define-generic elmo-folder-length (folder) "Return number of messages in the FOLDER.") (luna-define-method elmo-folder-length ((folder elmo-folder)) (if (elmo-folder-msgdb-internal folder) (elmo-msgdb-length (elmo-folder-msgdb folder)) 0)) (defun elmo-folder-msgdb-load (folder &optional silent) (unless silent (message "Loading msgdb for %s..." (elmo-folder-name-internal folder))) (let ((msgdb (elmo-load-msgdb (elmo-folder-msgdb-path folder) (elmo-folder-mime-charset-internal folder)))) (elmo-folder-set-info-max-by-numdb folder (elmo-msgdb-list-messages msgdb)) (unless silent (message "Loading msgdb for %s...done" (elmo-folder-name-internal folder))) msgdb)) (defun elmo-msgdb-delete-path (folder) (let ((path (elmo-folder-msgdb-path folder))) (if (file-directory-p path) (elmo-delete-directory path t)))) (defun elmo-msgdb-rename-path (old-folder new-folder) (let* ((old (directory-file-name (elmo-folder-msgdb-path old-folder))) (new (directory-file-name (elmo-folder-msgdb-path new-folder))) (new-dir (directory-file-name (file-name-directory new)))) (if (not (file-directory-p old)) () (if (file-exists-p new) (error "Already exists directory: %s" new) (if (not (file-exists-p new-dir)) (elmo-make-directory new-dir)) (rename-file old new))))) (defun elmo-setup-subscribed-newsgroups (groups) "Setup subscribed newsgroups. GROUPS is a list of newsgroup name string. Return a hashtable for newsgroups." (let ((hashtb (or elmo-newsgroups-hashtb (setq elmo-newsgroups-hashtb (elmo-make-hash (length groups)))))) (dolist (group groups) (or (elmo-get-hash-val group hashtb) (elmo-set-hash-val group nil hashtb))) (setq elmo-newsgroups-hashtb hashtb))) (defvar elmo-crosspost-message-alist-modified nil) (defun elmo-crosspost-message-alist-load () "Load crosspost message alist." (setq elmo-crosspost-message-alist (elmo-crosspost-alist-load)) (setq elmo-crosspost-message-alist-modified nil)) (defun elmo-crosspost-message-alist-save () "Save crosspost message alist." (when elmo-crosspost-message-alist-modified (let ((alist elmo-crosspost-message-alist) newsgroups) (while alist (setq newsgroups (elmo-delete-if (lambda (x) (not (intern-soft x elmo-newsgroups-hashtb))) (nth 1 (car alist)))) (if newsgroups (setcar (cdar alist) newsgroups) (setq elmo-crosspost-message-alist (delete (car alist) elmo-crosspost-message-alist))) (setq alist (cdr alist))) (elmo-crosspost-alist-save elmo-crosspost-message-alist) (setq elmo-crosspost-message-alist-modified nil)))) (defun elmo-folder-make-temporary-directory (folder) ;; Make a temporary directory for FOLDER. (let ((temp-dir (make-temp-name (concat (file-name-as-directory (elmo-folder-msgdb-path folder)) "elmo")))) (elmo-make-directory temp-dir) temp-dir)) ;; ELMO status structure. (defmacro elmo-message-status (folder number &optional flags killed) "Make ELMO status structure from FOLDER and NUMBER. A value in this structure is cached at first access." `(vector ,folder ,number ,flags ,killed)) (defmacro elmo-message-status-folder (status) `(aref ,status 0)) (defmacro elmo-message-status-number (status) `(aref ,status 1)) (defmacro elmo-message-status-set-flags (status flags) `(aset ,status 2 (or ,flags '(read)))) (defsubst elmo-message-status-flags (status) (or (aref status 2) (elmo-message-status-set-flags status (elmo-message-flags (elmo-message-status-folder status) (elmo-message-status-number status))))) (defsubst elmo-message-status-cached-p (status) (memq 'cached (elmo-message-status-flags status))) (defmacro elmo-message-status-set-killed (status killed) `(aset ,status 3 (if ,killed 'killed 'living))) (defsubst elmo-message-status-killed-p (status) (eq 'killed (or (aref status 3) (elmo-message-status-set-killed status (elmo-message-killed-p (elmo-message-status-folder status) (elmo-message-status-number status)))))) ;;; (defun elmo-init () "Initialize ELMO module." (elmo-crosspost-message-alist-load) (elmo-resque-obsolete-variables) (elmo-dop-queue-load) (run-hooks 'elmo-init-hook)) (defun elmo-quit () "Quit and cleanup ELMO." (elmo-crosspost-message-alist-save) (elmo-dop-queue-save) ;; Not implemented yet. (let ((types elmo-folder-type-alist) class) (while types (setq class (luna-find-class (intern (format "elmo-%s-folder" (symbol-name (cdr (car types))))))) ;; Call all folder's `elmo-quit' method. (if class (dolist (func (luna-class-find-functions class 'elmo-quit)) (funcall func nil))) (setq types (cdr types))))) (luna-define-method elmo-folder-rename-internal ((folder elmo-folder) _new-folder) (error "Cannot rename %s folder" (symbol-name (elmo-folder-type-internal folder)))) ;;; Define folders. (elmo-define-folder ?% 'imap4) (elmo-define-folder ?- 'nntp) (elmo-define-folder ?\+ 'localdir) (elmo-define-folder ?\* 'multi) (elmo-define-folder ?\/ 'filter) (elmo-define-folder ?\$ 'archive) (elmo-define-folder ?& 'pop3) (elmo-define-folder ?= 'localnews) (elmo-define-folder ?| 'pipe) (elmo-define-folder ?. 'maildir) (elmo-define-folder ?' 'internal) (elmo-define-folder ?\[ 'search) (elmo-define-folder ?@ 'shimbun) ;;; Obsolete variables. (elmo-define-obsolete-variable 'elmo-default-imap4-mailbox 'elmo-imap4-default-mailbox) (elmo-define-obsolete-variable 'elmo-default-imap4-server 'elmo-imap4-default-server) (elmo-define-obsolete-variable 'elmo-default-imap4-authenticate-type 'elmo-imap4-default-authenticate-type) (elmo-define-obsolete-variable 'elmo-default-imap4-user 'elmo-imap4-default-user) (elmo-define-obsolete-variable 'elmo-default-imap4-port 'elmo-imap4-default-port) (elmo-define-obsolete-variable 'elmo-default-imap4-stream-type 'elmo-imap4-default-stream-type) (elmo-define-obsolete-variable 'elmo-default-nntp-server 'elmo-nntp-default-server) (elmo-define-obsolete-variable 'elmo-default-nntp-user 'elmo-nntp-default-user) (elmo-define-obsolete-variable 'elmo-default-nntp-port 'elmo-nntp-default-port) (elmo-define-obsolete-variable 'elmo-default-nntp-stream-type 'elmo-nntp-default-stream-type) (elmo-define-obsolete-variable 'elmo-default-pop3-server 'elmo-pop3-default-server) (elmo-define-obsolete-variable 'elmo-default-pop3-user 'elmo-pop3-default-user) (elmo-define-obsolete-variable 'elmo-default-pop3-authenticate-type 'elmo-pop3-default-authenticate-type) (elmo-define-obsolete-variable 'elmo-default-pop3-port 'elmo-pop3-default-port) (elmo-define-obsolete-variable 'elmo-default-pop3-stream-type 'elmo-pop3-default-stream-type) (elmo-define-obsolete-variable 'elmo-cache-dirname 'elmo-cache-directory) (elmo-define-obsolete-variable 'elmo-msgdb-dir 'elmo-msgdb-directory) (elmo-define-obsolete-variable 'elmo-global-flag-list 'elmo-global-flags) (elmo-define-obsolete-variable 'elmo-nmz-default-index-path 'elmo-search-namazu-default-index-path) (elmo-define-obsolete-variable 'elmo-nmz-index-alias-alist 'elmo-search-namazu-index-alias-alist) (elmo-define-obsolete-variable 'elmo-nmz-use-drive-letter 'elmo-search-use-drive-letter) ;; Obsolete functions. (defalias 'elmo-folder-make-temp-dir 'elmo-folder-make-temporary-directory) (make-obsolete 'elmo-folder-make-temp-dir 'elmo-folder-make-temporary-directory "11 Dec 2001") (require 'product) (product-provide (provide 'elmo) (require 'elmo-version)) ;;; elmo.el ends here wanderlust-wanderlust-769699d/elmo/elsp-bogofilter.el000066400000000000000000000131711406661363500227630ustar00rootroot00000000000000;;; elsp-bogofilter.el --- Bogofilter support for elmo-spam. -*- lexical-binding: t -*- ;; Copyright (C) 2003 Hiroya Murata ;; Copyright (C) 2003 Yuuichi Teranishi ;; Author: Hiroya Murata ;; Keywords: mail, net news, spam ;; This file is part of Wanderlust (Yet Another Message Interface on Emacsen). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'elmo-spam) (require 'luna) (defgroup elmo-spam-bogofilter nil "Spam bogofilter configuration." :group 'elmo-spam) (defcustom elmo-spam-bogofilter-program "bogofilter" "*Program name of the Bogofilter." :type '(string :tag "Program name of the bogofilter") :group 'elmo-spam-bogofilter) (defcustom elmo-spam-bogofilter-args nil "*Argument list for bogofilter." :type '(repeat string) :group 'elmo-spam-bogofilter) (defcustom elmo-spam-bogofilter-database-directory nil "*Directory path of the Bogofilter databases." :type '(choice (directory :tag "Location of the Bogofilter database directory") (const :tag "Use the default")) :group 'elmo-spam-bogofilter) (defcustom elmo-spam-bogofilter-max-messages-per-process 30 "Number of messages processed at once." :type 'integer :group 'elmo-spam-bogofilter) (defcustom elmo-spam-bogofilter-arguments-alist '((classify (if elmo-spam-bogofilter-debug "-vv") (if register "-u") (if elmo-spam-bogofilter-database-directory (list "-d" elmo-spam-bogofilter-database-directory))) (register (if elmo-spam-bogofilter-debug "-vv") (if spam "-s" "-n") (if restore (if spam "-N" "-S")) (if elmo-spam-bogofilter-database-directory (list "-d" elmo-spam-bogofilter-database-directory)))) "*An alist of options that are used with call bogofilter process. Each element is a list of following: \(TYPE [SEXP...]) TYPE is a symbol from `classify' or `register'. SEXP is an expression to get options. Must be return a string or list of string." :type '(repeat (cons (choice (const :tag "Classify" classify) (const :tag "Register" register)) (repeat sexp))) :group 'elmo-spam-bogofilter) (defcustom elmo-spam-bogofilter-debug nil "Non-nil to debug elmo bogofilter spam backend." :type 'boolean :group 'elmo-spam-bogofilter) (eval-and-compile (luna-define-class elsp-bogofilter (elsp-generic))) (defsubst elmo-spam-bogofilter-call (&optional args) (apply #'call-process-region (point-min) (point-max) elmo-spam-bogofilter-program nil (if elmo-spam-bogofilter-debug (get-buffer-create "*Debug ELMO SPAM Bogofilter*")) nil (append elmo-spam-bogofilter-args (delq nil args)))) (defsubst elmo-spam-bogofilter-arguments (type register spam restore) (elmo-flatten (mapcar (lambda (sexp) (eval `(let ((register ,register) (spam ,spam) (restore ,restore)) ,sexp))) (cdr (assq type elmo-spam-bogofilter-arguments-alist))))) (luna-define-method elmo-spam-buffer-spam-p ((_processor elsp-bogofilter) buffer &optional register) (with-current-buffer buffer (= 0 (elmo-spam-bogofilter-call (elmo-spam-bogofilter-arguments 'classify register nil nil))))) (defsubst elsp-bogofilter-register-buffer (buffer spam restore) (with-current-buffer buffer (elmo-spam-bogofilter-call (elmo-spam-bogofilter-arguments 'register nil spam restore)))) (luna-define-method elmo-spam-register-spam-buffer ((_processor elsp-bogofilter) buffer &optional restore) (elsp-bogofilter-register-buffer buffer t restore)) (luna-define-method elmo-spam-register-good-buffer ((_processor elsp-bogofilter) buffer &optional restore) (elsp-bogofilter-register-buffer buffer nil restore)) (defsubst elmo-spam-bogofilter-register-messages (folder numbers spam restore) (if (not (< 0 elmo-spam-bogofilter-max-messages-per-process)) (error "\ non-positive value for `elmo-spam-bogofilter-max-messages-per-process'")) (elmo-spam-process-messages-as-mbox folder numbers elmo-spam-bogofilter-max-messages-per-process (lambda (count spam restore) (elsp-bogofilter-register-buffer (current-buffer) spam restore) (elmo-progress-notify 'elmo-spam-register count)) spam restore)) (luna-define-method elmo-spam-register-spam-messages :around ((_processor elsp-bogofilter) folder &optional numbers restore) (let ((numbers (or numbers (elmo-folder-list-messages folder t t)))) (if (> (length numbers) 1) (elmo-spam-bogofilter-register-messages folder numbers t restore) (luna-call-next-method)))) (luna-define-method elmo-spam-register-good-messages :around ((_processor elsp-bogofilter) folder &optional numbers restore) (let ((numbers (or numbers (elmo-folder-list-messages folder t t)))) (if (> (length numbers) 1) (elmo-spam-bogofilter-register-messages folder numbers nil restore) (luna-call-next-method)))) (require 'product) (product-provide (provide 'elsp-bogofilter) (require 'elmo-version)) ;;; elsp-bogofilter.el ends here wanderlust-wanderlust-769699d/elmo/elsp-bsfilter.el000066400000000000000000000201421406661363500224350ustar00rootroot00000000000000;;; elsp-bsfilter.el --- Bsfilter support for elmo-spam. -*- lexical-binding: t -*- ;; Copyright (C) 2004 Hiroya Murata ;; Copyright (C) 2004 Yuuichi Teranishi ;; Author: Hiroya Murata ;; Keywords: mail, net news, spam ;; This file is part of Wanderlust (Yet Another Message Interface on Emacsen). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'elmo-spam) (require 'luna) (defgroup elmo-spam-bsfilter nil "Spam bsfilter configuration." :group 'elmo-spam) (defcustom elmo-spam-bsfilter-shell-program "ruby" "*" :type 'string :group 'elmo-spam-bsfilter) (defcustom elmo-spam-bsfilter-shell-switch nil "*" :type 'string :group 'elmo-spam-bsfilter) (defcustom elmo-spam-bsfilter-program (exec-installed-p "bsfilter") "*Program name of the Bsfilter." :type '(string :tag "Program name of the bsfilter") :group 'elmo-spam-bsfilter) (defcustom elmo-spam-bsfilter-args nil "*Argument list for bsfilter." :type '(repeat string) :group 'elmo-spam-bsfilter) (defcustom elmo-spam-bsfilter-update-switch "--auto-update" "*The switch that Bsfilter uses to update database with classify." :type 'string :group 'elmo-spam-bsfilter) (defcustom elmo-spam-bsfilter-database-directory nil "*Directory path of the Bsfilter databases." :type '(choice (directory :tag "Location of the Bsfilter database directory") (const :tag "Use the default")) :group 'elmo-spam-bsfilter) (defcustom elmo-spam-bsfilter-max-files-per-process 100 "Number of files processed at once." :type 'integer :group 'elmo-spam-bsfilter) (defcustom elmo-spam-bsfilter-max-messages-per-process 30 "Number of messages processed at once." :type 'integer :group 'elmo-spam-bsfilter) (defcustom elmo-spam-bsfilter-use-remote (and elmo-spam-bsfilter-shell-program (let ((program (file-name-nondirectory elmo-spam-bsfilter-shell-program)) (remote-shells '("ssh" "rsh"))) (catch 'found (dolist (shell remote-shells) (when (string-match (concat "\\`" shell) program) (throw 'found t))) nil))) "*Non-nil disables local file feature." :type 'boolean :group 'elmo-spam-bsfilter) (defcustom elmo-spam-bsfilter-debug nil "Non-nil to debug elmo bsfilter spam backend." :type 'boolean :group 'elmo-spam-bsfilter) (eval-and-compile (luna-define-class elsp-bsfilter (elsp-generic))) (defsubst elsp-bsfilter-call-bsfilter (&rest args) (apply #'call-process-region (point-min) (point-max) elmo-spam-bsfilter-shell-program nil (if elmo-spam-bsfilter-debug (get-buffer-create "*Debug ELMO Bsfilter*")) nil (append (if elmo-spam-bsfilter-shell-switch (list elmo-spam-bsfilter-shell-switch)) (if elmo-spam-bsfilter-program (list elmo-spam-bsfilter-program)) elmo-spam-bsfilter-args (if elmo-spam-bsfilter-database-directory (list "--homedir" elmo-spam-bsfilter-database-directory)) (elmo-flatten args)))) (luna-define-method elmo-spam-buffer-spam-p ((_processor elsp-bsfilter) buffer &optional register) (with-current-buffer buffer (= 0 (elsp-bsfilter-call-bsfilter (if register elmo-spam-bsfilter-update-switch))))) (defun elsp-bsfilter-list-spam-filter (process output) (when (buffer-live-p (process-buffer process)) (with-current-buffer (process-buffer process) (save-excursion (goto-char (process-mark process)) (insert output) (set-marker (process-mark process) (point))) (while (re-search-forward "^combined probability.+\r?\n" nil t) (delete-region (match-beginning 0) (match-end 0)) (elmo-progress-notify 'elmo-spam-check-spam)) (when elmo-spam-bsfilter-debug (with-current-buffer (get-buffer-create "*Debug ELMO Bsfilter*") (goto-char (point-max)) (insert output)))))) (defsubst elsp-bsfilter-start-list-spam (targets) (let ((process (apply #'start-process "elsp-bsfilter" (current-buffer) elmo-spam-bsfilter-shell-program (append (if elmo-spam-bsfilter-shell-switch (list elmo-spam-bsfilter-shell-switch)) (if elmo-spam-bsfilter-program (list elmo-spam-bsfilter-program)) elmo-spam-bsfilter-args (list "--list-spam") (if elmo-spam-bsfilter-database-directory (list "--homedir" elmo-spam-bsfilter-database-directory)) targets)))) (set-process-filter process #'elsp-bsfilter-list-spam-filter) process)) (defsubst elsp-bsfilter-read-list-spam (results hash) (goto-char (point-min)) (while (not (eobp)) (let* ((filename (buffer-substring (point) (save-excursion (end-of-line) (point)))) (number (elmo-get-hash-val filename hash))) (when number (setq results (cons number results))) (forward-line))) results) (luna-define-method elmo-spam-list-spam-messages :around ((_processor elsp-bsfilter) folder &optional numbers) (if (or elmo-spam-bsfilter-use-remote (not (elmo-folder-message-file-p folder))) (luna-call-next-method) (let* ((nth-of-targets (1- (or elmo-spam-bsfilter-max-files-per-process 100))) (numbers (or numbers (elmo-folder-list-messages folder t t))) (hash (elmo-make-hash (length numbers))) (targets (mapcar (lambda (number) (let ((filename (elmo-message-file-name folder number))) (elmo-set-hash-val filename number hash) filename)) numbers)) results) (with-temp-buffer (while targets (let* ((last (nthcdr nth-of-targets targets)) (next (cdr last))) (when last (setcdr last nil)) (let ((process (elsp-bsfilter-start-list-spam targets))) (while (memq (process-status process) '(open run)) (accept-process-output process 1)) (setq results (elsp-bsfilter-read-list-spam results hash))) (erase-buffer) (setq targets next)))) results))) (defsubst elsp-bsfilter-register-buffer (buffer spam restore &optional mbox) (with-current-buffer buffer (elsp-bsfilter-call-bsfilter "--update" (if restore (if spam "--sub-clean" "--sub-spam")) (if spam "--add-spam" "--add-clean") (if mbox "--mbox")))) (luna-define-method elmo-spam-register-spam-buffer ((_processor elsp-bsfilter) buffer &optional restore) (elsp-bsfilter-register-buffer buffer t restore)) (luna-define-method elmo-spam-register-good-buffer ((_processor elsp-bsfilter) buffer &optional restore) (elsp-bsfilter-register-buffer buffer nil restore)) (defsubst elmo-spam-bsfilter-register-messages (folder numbers spam restore) (let ((numbers (or numbers (elmo-folder-list-messages folder t t)))) (if (and (> (length numbers) 1) elmo-spam-bsfilter-max-messages-per-process (> elmo-spam-bsfilter-max-messages-per-process 0)) (elmo-spam-process-messages-as-mbox folder numbers elmo-spam-bsfilter-max-messages-per-process (lambda (count spam restore) (elsp-bsfilter-register-buffer (current-buffer) spam restore 'mbox) (elmo-progress-notify 'elmo-spam-register count)) spam restore) (luna-call-next-method)))) (luna-define-method elmo-spam-register-spam-messages :around ((_processor elsp-bsfilter) folder &optional numbers restore) (elmo-spam-bsfilter-register-messages folder numbers t restore)) (luna-define-method elmo-spam-register-good-messages :around ((_processor elsp-bsfilter) folder &optional numbers restore) (elmo-spam-bsfilter-register-messages folder numbers nil restore)) (require 'product) (product-provide (provide 'elsp-bsfilter) (require 'elmo-version)) ;;; elsp-bsfilter.el ends here wanderlust-wanderlust-769699d/elmo/elsp-sa.el000066400000000000000000000117211406661363500212310ustar00rootroot00000000000000;;; elsp-sa.el --- SpamAssassin support for elmo-spam. -*- lexical-binding: t -*- ;; Copyright (C) 2004 Yuuichi Teranishi ;; Author: Yuuichi Teranishi ;; Keywords: mail, net news, spam ;; This file is part of Wanderlust (Yet Another Message Interface on Emacsen). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'elmo-spam) (defgroup elmo-spam-spamassassin nil "Spam SpamAssassin configuration." :group 'elmo-spam) (defcustom elmo-spam-spamassassin-program "spamassassin" "Program name for SpamAssassin." :type '(file :tag "Program name of SpamAssassin.") :group 'elmo-spam-spamassassin) (defcustom elmo-spam-spamassassin-learn-program "sa-learn" "Program name for SpamAssassin Learner." :type '(file :tag "Program name of SpamAssassin Learner.") :group 'elmo-spam-spamassassin) (defcustom elmo-spam-spamassassin-program-arguments '("-e") "Program argument list for SpamAssassin." :type '(file :tag "Program name of SpamAssassin Learner.") :group 'elmo-spam-spamassassin) (defcustom elmo-spam-spamassassin-learn-program-arguments nil "Program argument list for SpamAssassin Learner." :type '(file :tag "Program name of SpamAssassin Learner.") :group 'elmo-spam-spamassassin) (defcustom elmo-spam-spamassassin-max-messages-per-process 30 "Number of messages processed at once." :type 'integer :group 'elmo-spam-spamassassin) (defcustom elmo-spamassassin-debug nil "Non-nil to debug elmo spamassassin spam backend." :type 'boolean :group 'elmo-spam-spamassassin) (eval-and-compile (luna-define-class elsp-sa (elsp-generic)) (luna-define-internal-accessors 'elsp-sa)) (defun elmo-spamassassin-call (type &rest args) (let ((pair (cond ((eq type 'check) (cons elmo-spam-spamassassin-program elmo-spam-spamassassin-program-arguments)) ((eq type 'learn) (cons elmo-spam-spamassassin-learn-program elmo-spam-spamassassin-learn-program-arguments)) (t (error "Internal error"))))) (apply #'call-process-region (point-min) (point-max) (car pair) nil (if elmo-spamassassin-debug (get-buffer-create "*Debug ELMO SpamAssassin*")) nil (delq nil (append (cdr pair) args))))) (luna-define-method elmo-spam-buffer-spam-p ((processor elsp-sa) buffer &optional register) (let ((result (with-current-buffer buffer (not (eq 0 (elmo-spamassassin-call 'check)))))) (when register (if result (elmo-spam-register-spam-buffer processor buffer) (elmo-spam-register-good-buffer processor buffer))) result)) (luna-define-method elmo-spam-register-spam-buffer ((_processor elsp-sa) buffer &optional _restore) (with-current-buffer buffer (eq 0 (apply 'elmo-spamassassin-call 'learn (list "--spam"))))) (luna-define-method elmo-spam-register-good-buffer ((_processor elsp-sa) buffer &optional _restore) (with-current-buffer buffer (eq 0 (apply 'elmo-spamassassin-call 'learn (list "--ham"))))) (defsubst elmo-spam-spamassassin-register-messages (folder numbers spam restore) (if (not (< 0 elmo-spam-spamassassin-max-messages-per-process)) (error "\ non-positive value for `elmo-spam-spamassassin-max-messages-per-process'")) (elmo-spam-process-messages-as-mbox folder numbers elmo-spam-spamassassin-max-messages-per-process (lambda (count spam _restore) (apply 'elmo-spamassassin-call 'learn (delq nil (list "--mbox" (if spam "--spam" "--ham")))) (elmo-progress-notify 'elmo-spam-register count)) spam restore)) (luna-define-method elmo-spam-register-spam-messages :around ((_processor elsp-sa) folder &optional numbers restore) (let ((numbers (or numbers (elmo-folder-list-messages folder t t)))) (if (> (length numbers) 1) (elmo-spam-spamassassin-register-messages folder numbers t restore) (luna-call-next-method)))) (luna-define-method elmo-spam-register-good-messages :around ((_processor elsp-sa) folder &optional numbers restore) (let ((numbers (or numbers (elmo-folder-list-messages folder t t)))) (if (> (length numbers) 1) (elmo-spam-spamassassin-register-messages folder numbers nil restore) (luna-call-next-method)))) (require 'product) (product-provide (provide 'elsp-sa) (require 'elmo-version)) ;;; elsp-sa.el ends here wanderlust-wanderlust-769699d/elmo/elsp-spamfilter.el000066400000000000000000000103461406661363500227760ustar00rootroot00000000000000;;; elsp-spamfilter.el --- Spamfilter support for elmo-spam. -*- lexical-binding: t -*- ;; Copyright (C) 2003 Hiroya Murata ;; Copyright (C) 2003 Yuuichi Teranishi ;; Author: Hiroya Murata ;; Keywords: mail, net news, spam ;; This file is part of Wanderlust (Yet Another Message Interface on Emacsen). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'elmo-spam) (require 'luna) (require 'mime-view) (require 'spamfilter) (defgroup elmo-spam-spamfilter nil "Spam spamfilter configuration." :group 'elmo-spam) (defcustom elmo-spam-spamfilter-corpus-filename (expand-file-name ".spamfilter" elmo-msgdb-directory) "Filename of the Spamfilter corpus." :type '(file :tag "Filename of the Spamfilter corpus") :group 'elmo-spam-spamfilter) (eval-and-compile (luna-define-class elsp-spamfilter (elsp-generic) (good-corpus bad-corpus modified)) (luna-define-internal-accessors 'elsp-spamfilter)) (luna-define-method initialize-instance :around ((processor elsp-spamfilter) &rest _init-args) (luna-call-next-method) (let ((spamf-good-corpus (make-spamf-corpus :name "spamf-good-corpus" :table (make-hash-table :test #'eq) :message-count 0)) (spamf-bad-corpus (make-spamf-corpus :name "spamf-bad-corpus" :table (make-hash-table :test #'eq) :message-count 0))) (spamf-load-corpus-from-file elmo-spam-spamfilter-corpus-filename) (elsp-spamfilter-set-good-corpus-internal processor spamf-good-corpus) (elsp-spamfilter-set-bad-corpus-internal processor spamf-bad-corpus) processor)) (luna-define-method elmo-spam-modified-p ((processor elsp-spamfilter)) (elsp-spamfilter-modified-internal processor)) (luna-define-method elmo-spam-save-status ((processor elsp-spamfilter)) (spamf-save-corpus-to-file elmo-spam-spamfilter-corpus-filename (elsp-spamfilter-good-corpus-internal processor) (elsp-spamfilter-bad-corpus-internal processor)) (elsp-spamfilter-set-modified-internal processor nil)) (defun elsp-spamfilter-decode-buffer (buffer) (mime-display-message (mime-open-entity 'elmo-buffer buffer) (current-buffer))) (defsubst elsp-spamfilter-register-buffer-internal (processor buffer spam) (spamf-register-words-buffer (if spam (elsp-spamfilter-bad-corpus-internal processor) (elsp-spamfilter-good-corpus-internal processor)) buffer) (elsp-spamfilter-set-modified-internal processor t)) (luna-define-method elmo-spam-buffer-spam-p ((processor elsp-spamfilter) buffer &optional register) (with-temp-buffer (elsp-spamfilter-decode-buffer buffer) (let ((spam (spamf-spam-buffer-p (current-buffer) (elsp-spamfilter-good-corpus-internal processor) (elsp-spamfilter-bad-corpus-internal processor)))) (when register (elsp-spamfilter-register-buffer-internal processor (current-buffer) spam)) spam))) (luna-define-method elmo-spam-register-spam-buffer ((processor elsp-spamfilter) buffer &optional _restore) (with-temp-buffer (elsp-spamfilter-decode-buffer buffer) (elsp-spamfilter-register-buffer-internal processor (current-buffer) t))) (luna-define-method elmo-spam-register-good-buffer ((processor elsp-spamfilter) buffer &optional _restore) (with-temp-buffer (elsp-spamfilter-decode-buffer buffer) (elsp-spamfilter-register-buffer-internal processor (current-buffer) nil))) (require 'product) (product-provide (provide 'elsp-spamfilter) (require 'elmo-version)) ;;; elsp-spamfilter.el ends here wanderlust-wanderlust-769699d/elmo/elsp-spamoracle.el000066400000000000000000000075371406661363500227660ustar00rootroot00000000000000;;; elsp-spamoracle.el --- SpamOracle support for elmo-spam. -*- lexical-binding: t -*- ;; Copyright (C) 2004 Daishi Kato ;; Author: Daishi Kato ;; Keywords: mail, net news, spam ;; This file is part of Wanderlust (Yet Another Message Interface on Emacsen). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'elmo-spam) (defgroup elmo-spam-spamoracle nil "Spam spamoracle configuration." :group 'elmo-spam) (defcustom elmo-spam-spamoracle-program "spamoracle" "Program name of the SpamOracle." :type '(string :tag "Program name of the SpamOracle") :group 'elmo-spam-spamoracle) (defcustom elmo-spam-spamoracle-config-filename nil "Filename of the SpamOracle config." :type '(file :tag "Filename of the SpamOracle config") :group 'elmo-spam-spamoracle) (defcustom elmo-spam-spamoracle-database-filename (expand-file-name ".spamoracle.db" elmo-msgdb-directory) "Filename of the SpamOracle database." :type '(file :tag "Filename of the SpamOracle database") :group 'elmo-spam-spamoracle) (defcustom elmo-spam-spamoracle-spam-header-regexp "^X-Spam: yes;" "Regexp of the SpamOracle spam header." :type '(string :tag "Regexp of the SpamOracle spam header") :group 'elmo-spam-spamoracle) (eval-and-compile (luna-define-class elsp-spamoracle (elsp-generic))) (defsubst elmo-spam-spamoracle-call (type) (let ((args (cond ((eq type 'check) (list "mark")) ((eq type 'add-spam) (list "add" "-v" "-spam")) ((eq type 'add-good) (list "add" "-v" "-good")))) (output-buffer (get-buffer-create "*Output ELMO SpamOracle*"))) (with-current-buffer output-buffer (erase-buffer)) (apply #'call-process-region (point-min) (point-max) elmo-spam-spamoracle-program nil output-buffer nil (delq nil (append (if elmo-spam-spamoracle-config-filename (list "-config" elmo-spam-spamoracle-config-filename)) (if elmo-spam-spamoracle-database-filename (list "-f" elmo-spam-spamoracle-database-filename)) args))) (if (eq type 'check) (with-current-buffer output-buffer (goto-char (point-min)) (let ((body-point (re-search-forward "^$" nil t))) (goto-char (point-min)) (re-search-forward elmo-spam-spamoracle-spam-header-regexp body-point t))) t))) (luna-define-method elmo-spam-buffer-spam-p ((processor elsp-spamoracle) buffer &optional register) (let ((result (with-current-buffer buffer (elmo-spam-spamoracle-call 'check)))) (when register (if result (elmo-spam-register-spam-buffer processor buffer) (elmo-spam-register-good-buffer processor buffer))) result)) (luna-define-method elmo-spam-register-spam-buffer ((_processor elsp-spamoracle) buffer &optional _restore) (with-current-buffer buffer (elmo-spam-spamoracle-call 'add-spam))) (luna-define-method elmo-spam-register-good-buffer ((_processor elsp-spamoracle) buffer &optional _restore) (with-current-buffer buffer (elmo-spam-spamoracle-call 'add-good))) (require 'product) (product-provide (provide 'elsp-spamoracle) (require 'elmo-version)) ;;; elsp-spamoracle.el ends here wanderlust-wanderlust-769699d/elmo/mmimap.el000066400000000000000000000204451406661363500211500ustar00rootroot00000000000000;;; mmimap.el --- MIME entity module for IMAP4rev1 (RFC2060). -*- lexical-binding: t -*- ;; **** This is EXPERIMENTAL ***** ;; Copyright (C) 2000 Yuuichi Teranishi ;; Author: Yuuichi Teranishi ;; Keywords: IMAP, MIME, multimedia, mail, news ;; This file is part of FLIM (Faithful Library about Internet Message). ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the GNU General Public License as ;; published by the Free Software Foundation; either version 2, or (at ;; your option) any later version. ;; This program is distributed in the hope that it will be useful, but ;; WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;; General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;;; Commentary: ;; ;;; Code: (require 'mmgeneric) (require 'mime) (require 'pces) (require 'mime-parse) (eval-and-compile (luna-define-class mime-imap-entity (mime-entity) (size header-string body-string new requested)) (luna-define-internal-accessors 'mime-imap-entity)) ;;; @ MIME IMAP location ;; It should contain server, mailbox and uid (sequence number). (eval-and-compile (luna-define-class mime-imap-location () ())) (luna-define-generic mime-imap-location-section-body (location section) "Return a body string from LOCATION which corresponds to SECTION. SECTION is a section string which is defined in RFC2060.") (luna-define-generic mime-imap-location-bodystructure (location) "Return a parsed bodystructure of LOCATION. `NIL' should be converted to nil, `astring' should be converted to a string.") (luna-define-generic mime-imap-location-fetch-entity-p (location entity) "Return non-nil when LOCATION may fetch the ENTITY.") ;;; @ Subroutines ;; (defun mmimap-entity-section (node-id) "Return a section string from NODE-ID" (cond ((null node-id) "1") ((numberp node-id) (number-to-string (1+ node-id))) ((listp node-id) (mapconcat 'mmimap-entity-section (reverse node-id) ".")))) (defun mmimap-make-mime-entity (bodystructure class location node-id number parent) "Analyze parsed IMAP4 BODYSTRUCTURE response and make MIME entity. CLASS, LOCATION, NODE-ID, PARENT are set to the returned entity." (setq node-id (if number (cons number node-id) node-id)) (cond ((listp (car bodystructure)) ; multipart (let ((num 0) curp children entity) (setq entity (luna-make-entity class :new t :parent parent :location location :node-id node-id)) (while (and (setq curp (car bodystructure)) (listp curp)) (setq children (nconc children (list (mmimap-make-mime-entity curp class location node-id num entity)))) (setq num (+ num 1)) (setq bodystructure (cdr bodystructure))) (mime-entity-set-children-internal entity children) (mime-entity-set-content-type-internal entity (make-mime-content-type 'multipart (if (car bodystructure) (intern (downcase (car bodystructure)))) (mime-decode-parameters (nth 1 bodystructure)))) entity)) (t ; singlepart (let ((content-type (make-mime-content-type (intern (downcase (car bodystructure))) (if (nth 1 bodystructure) (intern (downcase (nth 1 bodystructure)))) (mime-decode-parameters (nth 2 bodystructure)))) entity) (setq entity (luna-make-entity class :new t :size (nth 6 bodystructure) :content-type content-type :location location :parent parent :node-id node-id)) (mime-entity-set-encoding-internal entity (and (nth 5 bodystructure) (downcase (nth 5 bodystructure)))) (if (and (nth 7 bodystructure) (nth 8 bodystructure)) ; children. (mime-entity-set-children-internal entity (list (mmimap-make-mime-entity (nth 8 bodystructure) class location node-id nil entity)))) entity)))) (luna-define-method initialize-instance :after ((entity mime-imap-entity) &rest _init-args) ;; To prevent infinite loop... (if (mime-imap-entity-new-internal entity) entity (mmimap-make-mime-entity (mime-imap-location-bodystructure (mime-entity-location-internal entity)) (luna-class-name entity) (mime-entity-location-internal entity) nil nil nil))) ;;; @ entity ;; (luna-define-method mime-insert-entity ((entity mime-imap-entity)) (if (mime-root-entity-p entity) (progn (insert (mime-imap-entity-header-string entity)) (mime-insert-entity-body entity)) ;; Insert body if it is not a multipart. (unless (eq (mime-content-type-primary-type (mime-entity-content-type entity)) 'multipart) (mime-insert-entity-body entity)))) (luna-define-method mime-write-entity ((entity mime-imap-entity) filename) (with-temp-buffer (mime-insert-entity entity) (write-region-as-raw-text-CRLF (point-min) (point-max) filename))) ;;; @ entity body ;; (luna-define-method mime-entity-body ((entity mime-imap-entity)) (or (mime-imap-entity-body-string-internal entity) (if (or (mime-imap-entity-requested-internal entity) ; second time. (mime-imap-location-fetch-entity-p (mime-entity-location-internal entity) entity)) (mime-imap-entity-set-body-string-internal entity (mime-imap-location-section-body (mime-entity-location-internal entity) (mmimap-entity-section (mime-entity-node-id-internal entity)))) (mime-imap-entity-set-requested-internal entity t) ""))) (luna-define-method mime-insert-entity-body ((entity mime-imap-entity)) (insert (mime-entity-body entity))) (luna-define-method mime-write-entity-body ((entity mime-imap-entity) filename) (with-temp-buffer (mime-insert-entity-body entity) (write-region-as-binary (point-min) (point-max) filename))) ;;; @ entity content ;; (luna-define-method mime-entity-content ((entity mime-imap-entity)) (let ((ret (mime-entity-body entity))) (if ret (mime-decode-string ret (mime-entity-encoding entity)) (message "Cannot decode content.") nil))) (luna-define-method mime-insert-entity-content ((entity mime-imap-entity)) (insert (mime-entity-content entity))) (luna-define-method mime-write-entity-content ((entity mime-imap-entity) filename) (with-temp-buffer (mime-insert-entity-body entity) (mime-write-decoded-region (point-min) (point-max) filename (or (mime-entity-encoding entity) "7bit")))) ;;; @ header field ;; (defun mime-imap-entity-header-string (entity) (or (mime-imap-entity-header-string-internal entity) (mime-imap-entity-set-header-string-internal entity (mime-imap-location-section-body (mime-entity-location-internal entity) (if (mime-entity-node-id-internal entity) (concat (mmimap-entity-section (mime-entity-node-id-internal entity)) ".HEADER") "HEADER"))))) (luna-define-method mime-entity-fetch-field :around ((entity mime-imap-entity) field-name) (if (mime-root-entity-p entity) (or (luna-call-next-method) (with-temp-buffer (insert (mime-imap-entity-header-string entity)) (let ((ret (std11-fetch-field field-name))) (when ret (or (symbolp field-name) (setq field-name (intern (capitalize (capitalize field-name))))) (mime-entity-set-original-header-internal entity (put-alist field-name ret (mime-entity-original-header-internal entity))) ret)))))) (luna-define-method mime-insert-header ((entity mime-imap-entity) &optional invisible-fields visible-fields) (let ((the-buf (current-buffer)) buf p-min p-max) (with-temp-buffer (insert (mime-imap-entity-header-string entity)) (setq buf (current-buffer) p-min (point-min) p-max (point-max)) (set-buffer the-buf) (mime-insert-header-from-buffer buf p-min p-max invisible-fields visible-fields)))) ;;; @ end ;; (provide 'mmimap) ;;; mmimap.el ends here wanderlust-wanderlust-769699d/elmo/modb-entity.el000066400000000000000000000774011406661363500221270ustar00rootroot00000000000000;;; modb-entity.el --- Message Entity Interface. -*- lexical-binding: t -*- ;; Copyright (C) 2003 Yuuichi Teranishi ;; Author: Yuuichi Teranishi ;; Hiroya Murata ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;; Message entity handling. ;;; Code: (require 'luna) (require 'mime) (require 'mime-parse) (require 'eword-encode) (require 'elmo-vars) (require 'elmo-util) (require 'elmo-date) (eval-and-compile (luna-define-class modb-entity-handler () (mime-charset)) (luna-define-internal-accessors 'modb-entity-handler)) (defcustom modb-entity-default-handler 'modb-legacy-entity-handler "Default entity handler." :type 'symbol :group 'elmo) (defcustom modb-entity-field-extractor-alist '((ml-info modb-entity-extract-mailing-list-info modb-entity-ml-info-real-fields)) "*An alist of field name and function to extract field body from buffer." :type '(repeat (list (symbol :tag "Field Name") (function :tag "Extractor") (choice :tag "Real Field" (repeat :tag "Field Name List" string) (function :tag "Function")))) :group 'elmo) (defvar modb-entity-default-cache-internal nil) (defun elmo-message-entity-handler (&optional entity) "Get modb entity handler instance which corresponds to the ENTITY." (if (and entity (car-safe entity) (not (eq (car entity) t)) (not (stringp (car entity)))) (car entity) (or modb-entity-default-cache-internal (setq modb-entity-default-cache-internal (luna-make-entity modb-entity-default-handler))))) (luna-define-generic modb-entity-handler-list-parameters (handler) "Return a parameter list of HANDLER.") (luna-define-generic elmo-msgdb-make-message-entity (handler &rest args) "Make a message entity using HANDLER.") (luna-define-generic elmo-msgdb-message-entity-number (handler entity) "Number of the ENTITY.") (luna-define-generic elmo-msgdb-message-entity-set-number (handler entity number) "Set number of the ENTITY.") (luna-define-generic elmo-msgdb-message-entity-field (handler entity field &optional type) "Retrieve field value of the message entity. HANDLER is the message entity handler. ENTITY is the message entity structure. FIELD is a symbol of the field. If optional argument TYPE is specified, return converted value.") (luna-define-generic elmo-msgdb-message-entity-set-field (handler entity field value) "Set the field value of the message entity. HANDLER is the message entity handler. ENTITY is the message entity structure. FIELD is a symbol of the field. VALUE is the field value to set.") (luna-define-generic elmo-msgdb-message-entity-update-fields (handler entity values) "Update message entity by VALUES. HANDLER is the message entity handler. ENTITY is the message entity structure. VALUES is an alist of field-name and field-value.") (luna-define-generic elmo-msgdb-copy-message-entity (handler entity &optional make-handler) "Copy message entity. HANDLER is the message entity handler. ENTITY is the message entity structure. If optional argument MAKE-HANDLER is specified, use it to make new entity.") (luna-define-generic elmo-msgdb-create-message-entity-from-file (handler number file) "Create message entity from file. HANDLER is the message entity handler. NUMBER is the number of the newly created message entity. FILE is the message file.") (luna-define-generic elmo-msgdb-create-message-entity-from-header (handler number &rest args) "Create message entity from current buffer. HANDLER is the message entity handler. NUMBER is the number of the newly created message entity. Rest of the ARGS is a plist of message entity field for initial value. Header region is supposed to be narrowed.") ;; Transitional interface. (luna-define-generic elmo-msgdb-message-match-condition (handler condition entity) "Return non-nil when the entity matches the condition.") ;; Generic implementation. (luna-define-method initialize-instance :after ((handler modb-entity-handler) &rest _init-args) (unless (modb-entity-handler-mime-charset-internal handler) (modb-entity-handler-set-mime-charset-internal handler elmo-mime-charset)) handler) (luna-define-method modb-entity-handler-list-parameters ((_handler modb-entity-handler)) (list 'mime-charset)) (luna-define-method elmo-msgdb-create-message-entity-from-file ((handler modb-entity-handler) number file) (when (file-exists-p file) (with-temp-buffer (setq buffer-file-name file) ;; insert header from file. (catch 'done (condition-case nil (elmo-msgdb-insert-file-header file) (error (setq buffer-file-name nil) (throw 'done nil))) (prog1 (elmo-msgdb-create-message-entity-from-header handler number) (setq buffer-file-name nil)))))) (luna-define-method elmo-msgdb-make-message-entity ((handler modb-entity-handler) args) (cons handler args)) (luna-define-method elmo-msgdb-message-entity-field ((_handler modb-entity-handler) entity field &optional _type) (plist-get (cdr entity) (intern (concat ":" (symbol-name field))))) (luna-define-method elmo-msgdb-message-entity-number ((_handler modb-entity-handler) entity) (plist-get (cdr entity) :number)) (luna-define-method elmo-msgdb-message-entity-update-fields ((handler modb-entity-handler) entity values) (let (updated) (dolist (pair values) (unless (equal (cdr pair) (elmo-msgdb-message-entity-field handler entity (car pair))) (elmo-msgdb-message-entity-set-field handler entity (car pair) (cdr pair)) (setq updated t))) updated)) ;; helper functions (defsubst modb-entity-handler-mime-charset (handler) (or (modb-entity-handler-mime-charset-internal handler) elmo-mime-charset)) (defun modb-entity-handler-equal-p (handler other) "Return non-nil, if OTHER hanlder is equal this HANDLER." (and (eq (luna-class-name handler) (luna-class-name other)) (catch 'mismatch (dolist (slot (modb-entity-handler-list-parameters handler)) (when (not (equal (luna-slot-value handler slot) (luna-slot-value other slot))) (throw 'mismatch nil))) t))) (defun modb-entity-handler-dump-parameters (handler) "Return parameters for reconstruct HANDLER as plist." (apply #'nconc (mapcar (lambda (slot) (let ((value (luna-slot-value handler slot))) (when value (list (intern (concat ":" (symbol-name slot))) value)))) (modb-entity-handler-list-parameters handler)))) ;; field in/out converter (defun modb-set-field-converter (converter type &rest specs) "Set convert function of TYPE into CONVERTER. SPECS must be like `FIELD1 FUNCTION1 FIELD2 FUNCTION2 ...'. If each field is t, function is set as default converter." (when specs (let ((alist (symbol-value converter)) (type (or type t))) (while specs (let ((field (pop specs)) (function (pop specs)) cell) (if (setq cell (assq type alist)) (setcdr cell (put-alist field function (cdr cell))) (setq cell (cons type (list (cons field function))) alist (cons cell alist))) ;; support colon keyword (syntax sugar). (unless (or (eq field t) (string-match "^:" (symbol-name field))) (setcdr cell (put-alist (intern (concat ":" (symbol-name field))) function (cdr cell)))))) (set converter alist)))) (put 'modb-set-field-converter 'lisp-indent-function 2) (defsubst modb-convert-field-value (converter field value &optional type) (and value (let* ((alist (cdr (assq (or type t) converter))) (function (cdr (or (assq field alist) (assq t alist))))) (if function (funcall function field value) value)))) ;; mime decode cache (defvar elmo-msgdb-decoded-cache-hashtb nil) (make-variable-buffer-local 'elmo-msgdb-decoded-cache-hashtb) (defsubst elmo-msgdb-get-decoded-cache (string) (if elmo-use-decoded-cache (let ((hashtb (or elmo-msgdb-decoded-cache-hashtb (setq elmo-msgdb-decoded-cache-hashtb (elmo-make-hash 2048)))) decoded) (or (elmo-get-hash-val string hashtb) (prog1 (setq decoded (mime-charset-decode-string string elmo-mime-charset)) (elmo-set-hash-val string decoded hashtb)))) (mime-charset-decode-string string elmo-mime-charset))) (defun modb-entity-string-decoder (_field value) (elmo-msgdb-get-decoded-cache value)) (defun modb-entity-string-encoder (_field value) (mime-charset-encode-string value elmo-mime-charset)) (defun modb-entity-parse-date-string (_field value) (if (stringp value) (elmo-time-parse-date-string value) value)) (defun modb-entity-make-date-string (_field value) (if (stringp value) value (elmo-time-make-date-string value))) (defun modb-entity-mime-decoder (field value) (mime-decode-field-body value (symbol-name field) 'summary)) (defun modb-entity-mime-encoder (field value) (mime-encode-field-body value (symbol-name field))) (defun modb-entity-address-list-decoder (field value) (if (stringp value) (mapcar (lambda (address) (mime-decode-field-body address (symbol-name field))) (elmo-parse-addresses value)) value)) (defun modb-entity-address-list-encoder (field value) (if (stringp value) value (mime-encode-field-body (mapconcat 'identity value ", ") (symbol-name field)))) (defun modb-entity-parse-address-string (field value) (modb-entity-encode-string-recursive field (if (stringp value) (elmo-parse-addresses value) value))) (defun modb-entity-make-address-string (field value) (let ((value (modb-entity-decode-string-recursive field value))) (if (stringp value) value (mapconcat 'identity value ", ")))) (defun modb-entity-decode-string-recursive (_field value) (elmo-map-recursive (lambda (element) (if (stringp element) (elmo-msgdb-get-decoded-cache element) element)) value)) (defun modb-entity-encode-string-recursive (_field value) (elmo-map-recursive (lambda (element) (if (stringp element) (mime-charset-encode-string element elmo-mime-charset) element)) value)) (defun modb-entity-create-field-indices (slots) (let ((index 0) indices) (while slots (setq indices (cons (cons (car slots) index) indices) index (1+ index) slots (cdr slots))) (append indices (mapcar (lambda (cell) (cons (intern (concat ":" (symbol-name (car cell)))) (cdr cell))) indices)))) ;; Legacy implementation. (eval-and-compile (luna-define-class modb-legacy-entity-handler (modb-entity-handler))) (defconst modb-legacy-entity-field-slots '(number references from subject date to cc size extra)) (defconst modb-legacy-entity-field-indices (modb-entity-create-field-indices modb-legacy-entity-field-slots)) (defvar modb-legacy-entity-normalizer nil) (modb-set-field-converter 'modb-legacy-entity-normalizer nil 'message-id nil 'number nil 'references nil 'from #'modb-entity-string-encoder 'subject #'modb-entity-string-encoder 'date #'modb-entity-make-date-string 'to #'modb-entity-address-list-encoder 'cc #'modb-entity-address-list-encoder 'size nil t #'modb-entity-mime-encoder) (defvar modb-legacy-entity-specializer nil) ;; default type (modb-set-field-converter 'modb-legacy-entity-specializer nil 'message-id nil 'number nil 'references nil 'from #'modb-entity-string-decoder 'subject #'modb-entity-string-decoder 'date #'modb-entity-parse-date-string 'to #'modb-entity-address-list-decoder 'cc #'modb-entity-address-list-decoder 'size nil t #'modb-entity-mime-decoder) ;; string type (modb-set-field-converter 'modb-legacy-entity-specializer 'string 'message-id nil 'number nil ; not supported 'references nil 'from #'modb-entity-string-decoder 'subject #'modb-entity-string-decoder 'date nil 'size nil ; not supported t #'modb-entity-mime-decoder) (defmacro modb-legacy-entity-field-index (field) `(cdr (assq ,field modb-legacy-entity-field-indices))) (defsubst modb-legacy-entity-set-field (entity field value &optional as-is) (when entity (let (index) (unless as-is (setq value (modb-convert-field-value modb-legacy-entity-normalizer field value))) (cond ((memq field '(message-id :message-id)) (setcar entity value)) ((setq index (modb-legacy-entity-field-index field)) (aset (cdr entity) index value)) (t (setq index (modb-legacy-entity-field-index :extra)) (let ((extras (and entity (aref (cdr entity) index))) extra) (if (setq extra (assoc (symbol-name field) extras)) (setcdr extra value) (aset (cdr entity) index (cons (cons (symbol-name field) value) extras))))))))) (defsubst modb-legacy-make-message-entity (args) "Make an message entity." (let ((entity (cons nil (make-vector 9 nil))) field value) (while args (setq field (pop args) value (pop args)) (when value (modb-legacy-entity-set-field entity field value))) entity)) (luna-define-method elmo-msgdb-make-message-entity ((_handler modb-legacy-entity-handler) args) (modb-legacy-make-message-entity args)) (luna-define-method elmo-msgdb-create-message-entity-from-header ((handler modb-legacy-entity-handler) number args) (let ((extras elmo-msgdb-extra-fields) (default-mime-charset default-mime-charset) entity message-id references from subject to cc date extra field-body charset size file-attrib) (save-excursion (setq entity (modb-legacy-make-message-entity args)) (set-buffer-multibyte t) (setq message-id (elmo-msgdb-get-message-id-from-header)) (and (setq charset (cdr (assoc "charset" (mime-read-Content-Type)))) (setq charset (intern-soft charset)) (setq default-mime-charset charset)) (setq references (elmo-msgdb-get-references-from-header) from (elmo-replace-char-in-string ?\t ? (elmo-mime-string (or (std11-fetch-field "from") elmo-no-from))) subject (elmo-replace-char-in-string ?\t ? (elmo-mime-string (or (std11-fetch-field "subject") elmo-no-subject))) date (or (elmo-decoded-fetch-field "date") (when buffer-file-name (timezone-make-date-arpa-standard (current-time-string (nth 5 (or file-attrib (setq file-attrib (file-attributes buffer-file-name))))) (current-time-zone)))) to (mapconcat 'identity (elmo-multiple-field-body "to") ",") cc (mapconcat 'identity (elmo-multiple-field-body "cc") ",")) (unless (elmo-msgdb-message-entity-field handler entity 'size) (setq size (or (std11-fetch-field "content-length") (when buffer-file-name (nth 7 (or file-attrib (setq file-attrib (file-attributes buffer-file-name))))) 0)) (when (stringp size) (setq size (string-to-number size)))) (while extras (if (setq field-body (std11-fetch-field (car extras))) (modb-legacy-entity-set-field entity (intern (downcase (car extras))) field-body 'as-is)) (setq extras (cdr extras))) (dolist (field '(message-id number references from subject date to cc size)) (when (symbol-value field) (modb-legacy-entity-set-field entity field (symbol-value field) 'as-is))) entity))) (luna-define-method elmo-msgdb-message-entity-number ((_handler modb-legacy-entity-handler) entity) (and entity (aref (cdr entity) 0))) (luna-define-method elmo-msgdb-message-entity-set-number ((_handler modb-legacy-entity-handler) entity number) (and entity (aset (cdr entity) 0 number))) (luna-define-method elmo-msgdb-message-entity-field ((_handler modb-legacy-entity-handler) entity field &optional type) (and entity (let (index) (modb-convert-field-value modb-legacy-entity-specializer field (cond ((memq field '(message-id :message-id)) (car entity)) ((setq index (modb-legacy-entity-field-index field)) (aref (cdr entity) index)) (t (setq index (modb-legacy-entity-field-index :extra)) (cdr (assoc (symbol-name field) (aref (cdr entity) index))))) type)))) (luna-define-method elmo-msgdb-message-entity-set-field ((_handler modb-legacy-entity-handler) entity field value) (modb-legacy-entity-set-field entity field value)) (luna-define-method elmo-msgdb-copy-message-entity ((handler modb-legacy-entity-handler) entity &optional make-handler) (if make-handler (let ((copy (elmo-msgdb-make-message-entity make-handler))) (dolist (field (append '(message-id number references from subject date to cc size) (mapcar (lambda (extra) (intern (car extra))) (aref (cdr entity) 8)))) (elmo-msgdb-message-entity-set-field make-handler copy field (elmo-msgdb-message-entity-field handler entity field))) copy) (cons (car entity) (copy-sequence (cdr entity))))) (luna-define-method elmo-msgdb-message-match-condition ((handler modb-entity-handler) condition entity) (let ((key (elmo-filter-key condition)) (case-fold-search t) field-value) (cond ((or (string= key "since") (string= key "before")) (let ((field-date (elmo-msgdb-message-entity-field handler entity 'date)) (specified-date (elmo-datevec-to-time (elmo-date-get-datevec (elmo-filter-value condition))))) (if (string= key "since") (not (time-less-p field-date specified-date)) (time-less-p field-date specified-date)))) ((or (string= key "larger") (string= key "smaller")) (let ((bytes (elmo-msgdb-message-entity-field handler entity 'size)) (threshold (string-to-number (elmo-filter-value condition)))) (if (string= key "larger") (> bytes threshold) (< bytes threshold)))) ((setq field-value (elmo-msgdb-message-entity-field handler entity (intern key) 'string)) (and (stringp field-value) (string-match (elmo-filter-value condition) field-value))) (t condition)))) ;; Standard implementation. (eval-and-compile (luna-define-class modb-standard-entity-handler (modb-entity-handler))) (defconst modb-standard-entity-field-slots '(number from subject date to cc content-type references size score extra)) (defconst modb-standard-entity-field-indices (modb-entity-create-field-indices modb-standard-entity-field-slots)) (defvar modb-standard-entity-normalizer nil) (modb-set-field-converter 'modb-standard-entity-normalizer nil 'message-id nil 'number nil 'date #'modb-entity-parse-date-string 'to #'modb-entity-parse-address-string 'cc #'modb-entity-parse-address-string 'references nil 'size nil 'score nil t #'modb-entity-encode-string-recursive) (defvar modb-standard-entity-specializer nil) (modb-set-field-converter 'modb-standard-entity-specializer nil 'message-id nil 'number nil 'date nil 'references nil 'size nil 'score nil t #'modb-entity-decode-string-recursive) (modb-set-field-converter 'modb-standard-entity-specializer 'string 'message-id nil 'number nil 'date #'modb-entity-make-date-string 'to #'modb-entity-make-address-string 'cc #'modb-entity-make-address-string 'references nil 'size nil 'score nil 'ml-info #'modb-entity-make-mailing-list-info-string t #'modb-entity-decode-string-recursive) (defmacro modb-standard-entity-field-index (field) `(cdr (assq ,field modb-standard-entity-field-indices))) (defsubst modb-standard-entity-set-field (entity field value &optional as-is) (when entity (let (index) (unless as-is (let ((elmo-mime-charset (modb-entity-handler-mime-charset (car entity)))) (setq value (modb-convert-field-value modb-standard-entity-normalizer field value)))) (cond ((memq field '(message-id :message-id)) (setcar (cdr entity) value)) ((setq index (modb-standard-entity-field-index field)) (aset (cdr (cdr entity)) index value)) (t (setq index (modb-standard-entity-field-index :extra)) (let ((extras (aref (cdr (cdr entity)) index)) cell) (if (setq cell (assq field extras)) (setcdr cell value) (aset (cdr (cdr entity)) index (cons (cons field value) extras))))))))) (defsubst modb-standard-make-message-entity (handler args) (let ((entity (cons handler (cons nil (make-vector (length modb-standard-entity-field-slots) nil)))) field value) (while args (setq field (pop args) value (pop args)) (when value (modb-standard-entity-set-field entity field value))) entity)) (luna-define-method elmo-msgdb-make-message-entity ((handler modb-standard-entity-handler) args) (modb-standard-make-message-entity handler args)) (luna-define-method elmo-msgdb-message-entity-number ((_handler modb-standard-entity-handler) entity) (and entity (aref (cdr (cdr entity)) 0))) (luna-define-method elmo-msgdb-message-entity-set-number ((_handler modb-standard-entity-handler) entity number) (and entity (aset (cdr (cdr entity)) 0 number))) (luna-define-method elmo-msgdb-message-entity-field ((handler modb-standard-entity-handler) entity field &optional type) (and entity (let ((elmo-mime-charset (modb-entity-handler-mime-charset handler)) index) (modb-convert-field-value modb-standard-entity-specializer field (cond ((memq field '(message-id :message-id)) (car (cdr entity))) ((setq index (modb-standard-entity-field-index field)) (aref (cdr (cdr entity)) index)) (t (setq index (modb-standard-entity-field-index :extra)) (cdr (assq field (aref (cdr (cdr entity)) index))))) type)))) (luna-define-method elmo-msgdb-message-entity-set-field ((_handler modb-standard-entity-handler) entity field value) (modb-standard-entity-set-field entity field value)) (luna-define-method elmo-msgdb-copy-message-entity ((handler modb-standard-entity-handler) entity &optional make-handler) (if make-handler (let ((copy (elmo-msgdb-make-message-entity make-handler))) (dolist (field (nconc (delq 'extra (copy-sequence modb-standard-entity-field-slots)) (mapcar 'car (aref (cdr (cdr entity)) (modb-standard-entity-field-index :extra))) '(message-id))) (elmo-msgdb-message-entity-set-field make-handler copy field (elmo-msgdb-message-entity-field handler entity field))) copy) (cons handler (cons (car (cdr entity)) (copy-sequence (cdr (cdr entity))))))) (defvar modb-standard-field-name-cache nil) (defconst modb-standard-reserved-fields '("number" "message-id" "references" "from" "subject" "date" "to" "cc" "content-type" "size")) (defun modb-standard-set-field-name-cache () (let (extras all) (dolist (extra (cons "newsgroups" (mapcar 'downcase elmo-msgdb-extra-fields))) (unless (or (member extra modb-standard-reserved-fields) (member extra extras)) (setq extras (cons extra extras)))) (setq all (append modb-standard-reserved-fields extras) modb-standard-field-name-cache (list elmo-msgdb-extra-fields extras ;; used, but not reserved fields (dolist (elt '("in-reply-to" "content-length") all) (unless (member elt all) (setq all (cons elt all)))))))) (defun modb-standard-get-message-id-for-entity (values) (let ((field (cdr (assoc "message-id" values)))) (if field (or (elmo-get-message-id-from-field field) (concat "<" (std11-unfold-string field) ">")) (concat "<" (or (when (setq field (cdr (assoc "date" values))) (ignore-errors (timezone-make-date-sortable (std11-unfold-string field)))) (md5 (string-as-unibyte (buffer-string)))) (nth 1 (eword-extract-address-components (or (cdr (assoc "from" values)) "nobody"))) ">")))) (defun modb-standard-get-references-for-entity (values) (let ((irt (cdr (assoc "in-reply-to" values))) (refs (cdr (assoc "references" values)))) (elmo-uniq-list (nreverse (delq nil (mapcar 'std11-msg-id-string (std11-parse-msg-ids-string (if elmo-msgdb-prefer-in-reply-to-for-parent (concat refs "\n " irt) (concat irt "\n " refs))))))))) (defun modb-standard-collect-field-values-from-header () (let ((all-field (nth 2 modb-standard-field-name-cache)) (regexp (concat "\\(" std11-field-head-regexp "\\)[ \t]*")) value values field) (save-excursion (goto-char (point-min)) (while (re-search-forward regexp nil t) (setq field (downcase (buffer-substring-no-properties (match-beginning 0) (1- (match-end 1))))) (cond ((member field '("cc" "to")) (setq value (buffer-substring-no-properties (match-end 0) (std11-field-end)) values (cons (cons field (cons value (cdr (assoc field values)))) (delq (assoc field values) values)))) ((and (member field all-field) (null (assoc field values))) (setq value (buffer-substring-no-properties (match-end 0) (std11-field-end)) values (cons (cons field value) values)))) (forward-line))) values)) (luna-define-method elmo-msgdb-create-message-entity-from-header ((handler modb-standard-entity-handler) number args) (let ((decoder (lambda (name values) (let ((body (cdr (assoc name values)))) (when body (or (ignore-errors (mime-decode-field-body body name 'summary)) body))))) entity value values field file-attrib extractor) (unless (and modb-standard-field-name-cache (eq elmo-msgdb-extra-fields (car modb-standard-field-name-cache))) (modb-standard-set-field-name-cache)) (setq values (modb-standard-collect-field-values-from-header)) (setq entity (modb-standard-make-message-entity handler (append args (list :number number :message-id (modb-standard-get-message-id-for-entity values) :references (modb-standard-get-references-for-entity values) :from (elmo-replace-char-in-string ?\t ? (or (funcall decoder "from" values) elmo-no-from) t) :subject (elmo-replace-char-in-string ?\t ? (or (funcall decoder "subject" values) elmo-no-subject) t) :date (or (funcall decoder "date" values) (when buffer-file-name (timezone-make-date-arpa-standard (current-time-string (nth 5 (setq file-attrib (file-attributes buffer-file-name)))) (current-time-zone)))) :to (mapconcat (lambda (field-body) (mime-decode-field-body field-body "to" 'summary)) (nreverse (cdr (assoc "to" values))) ",") :cc (mapconcat (lambda (field-body) (mime-decode-field-body field-body "cc" 'summary)) (nreverse (cdr (assoc "cc" values))) ",") :content-type (funcall decoder "content-type" values) :size (if (setq value (cdr (assoc "content-length" values))) (string-to-number value) (or (plist-get args :size) (when buffer-file-name (nth 7 (or file-attrib (setq file-attrib (file-attributes buffer-file-name))))) 0)))))) (dolist (extra (nth 1 modb-standard-field-name-cache) entity) (setq field (intern extra) extractor (nth 1 (assq field modb-entity-field-extractor-alist)) value (if extractor (funcall extractor field) (funcall decoder extra values))) (when value (modb-standard-entity-set-field entity field value))))) ;; mailing list info handling (defun modb-entity-extract-mailing-list-info (_field) (let* ((getter (lambda (field) (elmo-decoded-fetch-field (symbol-name field) 'summary))) (name (elmo-find-list-match-value elmo-mailing-list-name-spec-list getter)) (count (elmo-find-list-match-value elmo-mailing-list-count-spec-list getter))) (when (or name count) (cons name (and count (string-to-number count)))))) (defun modb-entity-ml-info-real-fields (_field) (elmo-uniq-list (mapcar (lambda (entry) (symbol-name (if (consp entry) (car entry) entry))) (append elmo-mailing-list-name-spec-list elmo-mailing-list-count-spec-list)))) (defun modb-entity-make-mailing-list-info-string (_field value) (when (car value) (format (if (cdr value) "(%s %05.0f)" "(%s)") (elmo-msgdb-get-decoded-cache (car value)) (cdr value)))) ;; message buffer handler (eval-and-compile (luna-define-class modb-buffer-entity-handler (modb-entity-handler))) (defvar modb-buffer-entity-specializer nil) (modb-set-field-converter 'modb-buffer-entity-specializer nil 'date #'elmo-time-parse-date-string) (luna-define-method elmo-msgdb-make-message-entity ((handler modb-buffer-entity-handler) args) (cons handler (cons (or (plist-get args :number) (plist-get args 'number)) (or (plist-get args :buffer) (plist-get args 'buffer) (current-buffer))))) (luna-define-method elmo-msgdb-message-entity-number ((_handler modb-buffer-entity-handler) entity) (car (cdr entity))) (luna-define-method elmo-msgdb-message-entity-set-number ((_handler modb-buffer-entity-handler) entity number) (and entity (setcar (cdr entity) number))) (luna-define-method elmo-msgdb-message-entity-field ((handler modb-buffer-entity-handler) entity field &optional type) (and entity (let ((elmo-mime-charset (modb-entity-handler-mime-charset handler))) (modb-convert-field-value modb-buffer-entity-specializer field (if (memq field '(number :number)) (car (cdr entity)) (with-current-buffer (cdr (cdr entity)) (let ((extractor (nth 1 (assq field modb-entity-field-extractor-alist)))) (if extractor (funcall extractor field) (mapconcat (lambda (field-body) (mime-decode-field-body field-body (symbol-name field) 'summary)) (elmo-multiple-field-body (symbol-name field)) "\n"))))) type)))) (luna-define-method elmo-msgdb-message-match-condition :around ((_handler modb-buffer-entity-handler) condition entity) (let ((case-fold-search t)) (cond ((string= (elmo-filter-key condition) "body") (modb-entity-match-entity-body (regexp-quote (elmo-filter-value condition)) (mime-parse-buffer (cdr (cdr entity))))) ((string= (elmo-filter-key condition) "raw-body") (with-current-buffer (cdr (cdr entity)) (decode-coding-region (point-min) (point-max) elmo-mime-display-as-is-coding-system) (goto-char (point-min)) (and (re-search-forward "^$" nil t) ; goto body (search-forward (elmo-filter-value condition) nil t)))) (t (luna-call-next-method))))) (defun modb-entity-match-entity-body (regexp mime-entity) (let ((content-type (mime-entity-content-type mime-entity)) children result) (cond ((setq children (mime-entity-children mime-entity)) (while children (when (modb-entity-match-entity-body regexp (car children)) (setq result t children nil)) (setq children (cdr children))) result) ((eq (mime-content-type-primary-type content-type) 'text) (string-match regexp (mime-charset-decode-string (mime-entity-content mime-entity) (or (mime-content-type-parameter content-type "charset") default-mime-charset) 'CRLF))) (t nil)))) (require 'product) (product-provide (provide 'modb-entity) (require 'elmo-version)) ;;; modb-entity.el ends here wanderlust-wanderlust-769699d/elmo/modb-legacy.el000066400000000000000000000454361406661363500220620ustar00rootroot00000000000000;;; modb-legacy.el --- Legacy Implement of MODB. -*- lexical-binding: t -*- ;; Copyright (C) 2003 Yuuichi Teranishi ;; Author: Yuuichi Teranishi ;; Hiroya Murata ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'cl-lib) (require 'elmo-util) (require 'modb) ;;; legacy implement ;; (defconst modb-legacy-new-mark "N" "Mark for new message.") (defconst modb-legacy-unread-uncached-mark "U" "Mark for unread and uncached message.") (defconst modb-legacy-unread-cached-mark "!" "Mark for unread but already cached message.") (defconst modb-legacy-read-uncached-mark "u" "Mark for read but uncached message.") (defconst modb-legacy-answered-cached-mark "&" "Mark for answered and cached message.") (defconst modb-legacy-answered-uncached-mark "A" "Mark for answered but uncached message.") (defconst modb-legacy-important-mark "$" "Mark for important message.") (defconst modb-legacy-flag-list '(new unread important answered cached read uncached) "A list of flag symbol which is supported by legacy msgdb.") (eval-and-compile (luna-define-class modb-legacy (modb-generic) (overview number-alist mark-alist index)) (luna-define-internal-accessors 'modb-legacy)) ;; for internal use only (defsubst elmo-msgdb-get-overview (msgdb) (modb-legacy-overview-internal msgdb)) (defsubst elmo-msgdb-get-number-alist (msgdb) (modb-legacy-number-alist-internal msgdb)) (defsubst elmo-msgdb-get-mark-alist (msgdb) (modb-legacy-mark-alist-internal msgdb)) (defsubst elmo-msgdb-get-index (msgdb) (modb-legacy-index-internal msgdb)) (defsubst elmo-msgdb-get-entity-hashtb (msgdb) (car (modb-legacy-index-internal msgdb))) (defsubst elmo-msgdb-get-mark-hashtb (msgdb) (cdr (modb-legacy-index-internal msgdb))) (defsubst elmo-msgdb-get-path (msgdb) (elmo-msgdb-location msgdb)) (defsubst elmo-msgdb-set-overview (msgdb overview) (modb-legacy-set-overview-internal msgdb overview)) (defsubst elmo-msgdb-set-number-alist (msgdb number-alist) (modb-legacy-set-number-alist-internal msgdb number-alist)) (defsubst elmo-msgdb-set-mark-alist (msgdb mark-alist) (modb-legacy-set-mark-alist-internal msgdb mark-alist)) (defsubst elmo-msgdb-set-index (msgdb index) (modb-legacy-set-index-internal msgdb index)) (defsubst elmo-msgdb-set-path (msgdb path) (modb-generic-set-location-internal msgdb path)) ;;; ;; Internal use only (obsolete interface) ;; (defsubst elmo-msgdb-overview-entity-get-id-internal (entity) (and entity (car entity))) (defsubst elmo-msgdb-overview-entity-get-number-internal (entity) (and entity (aref (cdr entity) 0))) ;;; load & save (defun elmo-msgdb-number-load (dir) (elmo-object-load (expand-file-name elmo-msgdb-number-filename dir))) (defun elmo-msgdb-overview-load (dir) (elmo-object-load (expand-file-name elmo-msgdb-overview-filename dir))) (defun elmo-msgdb-mark-load (dir) (elmo-object-load (expand-file-name elmo-msgdb-mark-filename dir))) (defun elmo-msgdb-number-save (dir obj) (elmo-object-save (expand-file-name elmo-msgdb-number-filename dir) obj)) (defun elmo-msgdb-mark-save (dir obj) (elmo-object-save (expand-file-name elmo-msgdb-mark-filename dir) obj)) (defsubst elmo-msgdb-overview-save (dir overview) (elmo-object-save (expand-file-name elmo-msgdb-overview-filename dir) overview)) ;;; (defsubst modb-legacy-supported-flag-p (flag) (memq flag modb-legacy-flag-list)) (defvar modb-legacy-unread-marks-internal nil) (defsubst modb-legacy-unread-marks () "Return an unread mark list" (or modb-legacy-unread-marks-internal (setq modb-legacy-unread-marks-internal (list modb-legacy-new-mark modb-legacy-unread-uncached-mark modb-legacy-unread-cached-mark)))) (defvar modb-legacy-answered-marks-internal nil) (defsubst modb-legacy-answered-marks () "Return an answered mark list" (or modb-legacy-answered-marks-internal (setq modb-legacy-answered-marks-internal (list modb-legacy-answered-cached-mark modb-legacy-answered-uncached-mark)))) (defvar modb-legacy-uncached-marks-internal nil) (defsubst modb-legacy-uncached-marks () (or modb-legacy-uncached-marks-internal (setq modb-legacy-uncached-marks-internal (list modb-legacy-new-mark modb-legacy-answered-uncached-mark modb-legacy-unread-uncached-mark modb-legacy-read-uncached-mark)))) (defsubst modb-legacy-mark-to-flags (mark) (append (and (string= mark modb-legacy-new-mark) '(new)) (and (string= mark modb-legacy-important-mark) '(important)) (and (member mark (modb-legacy-unread-marks)) '(unread)) (and (member mark (modb-legacy-answered-marks)) '(answered)) (and (not (member mark (modb-legacy-uncached-marks))) '(cached)))) (defsubst modb-legacy-flags-to-mark (flags) (cond ((memq 'new flags) modb-legacy-new-mark) ((memq 'important flags) modb-legacy-important-mark) ((memq 'answered flags) (if (memq 'cached flags) modb-legacy-answered-cached-mark modb-legacy-answered-uncached-mark)) ((memq 'unread flags) (if (memq 'cached flags) modb-legacy-unread-cached-mark modb-legacy-unread-uncached-mark)) (t (if (memq 'cached flags) nil modb-legacy-read-uncached-mark)))) (defsubst elmo-msgdb-get-mark (msgdb number) "Get mark string from MSGDB which corresponds to the message with NUMBER." (cadr (elmo-get-hash-val (format "#%d" number) (elmo-msgdb-get-mark-hashtb msgdb)))) (defsubst elmo-msgdb-set-mark (msgdb number mark) "Set MARK of the message with NUMBER in the MSGDB. if MARK is nil, mark is removed." (let ((elem (elmo-get-hash-val (format "#%d" number) (elmo-msgdb-get-mark-hashtb msgdb)))) (if elem (if mark ;; Set mark of the elem (setcar (cdr elem) mark) ;; Delete elem from mark-alist (elmo-msgdb-set-mark-alist msgdb (delq elem (elmo-msgdb-get-mark-alist msgdb))) (elmo-clear-hash-val (format "#%d" number) (elmo-msgdb-get-mark-hashtb msgdb))) (when mark ;; Append new element. (elmo-msgdb-set-mark-alist msgdb (nconc (elmo-msgdb-get-mark-alist msgdb) (list (setq elem (list number mark))))) (elmo-set-hash-val (format "#%d" number) elem (elmo-msgdb-get-mark-hashtb msgdb)))) (modb-generic-set-flag-modified-internal msgdb t) ;; return value. t)) (defun elmo-msgdb-make-index (msgdb &optional overview mark-alist) "Append OVERVIEW and MARK-ALIST to the index of MSGDB. If OVERVIEW and MARK-ALIST are nil, make index for current MSGDB. Return a list of message numbers which have duplicated message-ids." (when msgdb (let* ((overview (or overview (elmo-msgdb-get-overview msgdb))) (mark-alist (or mark-alist (elmo-msgdb-get-mark-alist msgdb))) (index (elmo-msgdb-get-index msgdb)) (ehash (or (car index) ;; append (elmo-make-hash (length overview)))) (mhash (or (cdr index) ;; append (elmo-make-hash (length overview)))) duplicates) (while overview ;; key is message-id (if (elmo-get-hash-val (caar overview) ehash) ; duplicated. (setq duplicates (cons (elmo-msgdb-overview-entity-get-number-internal (car overview)) duplicates))) (if (caar overview) (elmo-set-hash-val (caar overview) (car overview) ehash)) ;; key is number (elmo-set-hash-val (format "#%d" (elmo-msgdb-overview-entity-get-number-internal (car overview))) (car overview) ehash) (setq overview (cdr overview))) (while mark-alist ;; key is number (elmo-set-hash-val (format "#%d" (car (car mark-alist))) (car mark-alist) mhash) (setq mark-alist (cdr mark-alist))) (setq index (or index (cons ehash mhash))) (elmo-msgdb-set-index msgdb index) duplicates))) (defun elmo-msgdb-clear-index (msgdb entity) (let ((ehash (elmo-msgdb-get-entity-hashtb msgdb)) (mhash (elmo-msgdb-get-mark-hashtb msgdb)) number) (when (and entity ehash) (and (setq number (elmo-msgdb-overview-entity-get-number-internal entity)) (elmo-clear-hash-val (format "#%d" number) ehash)) (and (car entity) ;; message-id (elmo-clear-hash-val (car entity) ehash))) (when (and entity mhash) (and (setq number (elmo-msgdb-overview-entity-get-number-internal entity)) (elmo-clear-hash-val (format "#%d" number) mhash))))) ;;; Implement ;; (luna-define-method elmo-msgdb-load ((msgdb modb-legacy)) (let ((inhibit-quit t) (path (elmo-msgdb-location msgdb))) (when (file-exists-p (expand-file-name elmo-msgdb-mark-filename path)) (modb-legacy-set-overview-internal msgdb (elmo-msgdb-overview-load path)) (modb-legacy-set-number-alist-internal msgdb (elmo-msgdb-number-load path)) (modb-legacy-set-mark-alist-internal msgdb (elmo-msgdb-mark-load path)) (elmo-msgdb-make-index msgdb) t))) (luna-define-method elmo-msgdb-save ((msgdb modb-legacy)) (let ((path (elmo-msgdb-location msgdb))) (when (elmo-msgdb-message-modified-p msgdb) (elmo-msgdb-overview-save path (modb-legacy-overview-internal msgdb)) (elmo-msgdb-number-save path (modb-legacy-number-alist-internal msgdb)) (modb-generic-set-message-modified-internal msgdb nil)) (when (elmo-msgdb-flag-modified-p msgdb) (elmo-msgdb-mark-save path (modb-legacy-mark-alist-internal msgdb)) (modb-generic-set-flag-modified-internal msgdb nil)))) (luna-define-method elmo-msgdb-append :around ((msgdb modb-legacy) msgdb-append) (if (eq (luna-class-name msgdb-append) 'modb-legacy) (let (duplicates) (elmo-msgdb-set-overview msgdb (nconc (elmo-msgdb-get-overview msgdb) (elmo-msgdb-get-overview msgdb-append))) (elmo-msgdb-set-number-alist msgdb (nconc (elmo-msgdb-get-number-alist msgdb) (elmo-msgdb-get-number-alist msgdb-append))) (elmo-msgdb-set-mark-alist msgdb (nconc (elmo-msgdb-get-mark-alist msgdb) (elmo-msgdb-get-mark-alist msgdb-append))) (setq duplicates (elmo-msgdb-make-index msgdb (elmo-msgdb-get-overview msgdb-append) (elmo-msgdb-get-mark-alist msgdb-append))) (elmo-msgdb-set-path msgdb (or (elmo-msgdb-get-path msgdb) (elmo-msgdb-get-path msgdb-append))) (modb-generic-set-message-modified-internal msgdb t) (modb-generic-set-flag-modified-internal msgdb t) duplicates) (luna-call-next-method))) (luna-define-method elmo-msgdb-clear :after ((msgdb modb-legacy)) (elmo-msgdb-set-overview msgdb nil) (elmo-msgdb-set-number-alist msgdb nil) (elmo-msgdb-set-mark-alist msgdb nil) (elmo-msgdb-set-index msgdb nil)) (luna-define-method elmo-msgdb-length ((msgdb modb-legacy)) (length (modb-legacy-overview-internal msgdb))) (luna-define-method elmo-msgdb-flag-available-p ((_msgdb modb-legacy) flag) (modb-legacy-supported-flag-p flag)) (luna-define-method elmo-msgdb-flags ((msgdb modb-legacy) number) (modb-legacy-mark-to-flags (elmo-msgdb-get-mark msgdb number))) (luna-define-method elmo-msgdb-set-flag ((msgdb modb-legacy) number flag) (unless (modb-legacy-supported-flag-p flag) (error "Flag `%s' is not supported by this msgdb type" (capitalize (symbol-name flag)))) (cl-case flag (read (elmo-msgdb-unset-flag msgdb number 'unread)) (uncached (elmo-msgdb-unset-flag msgdb number 'cached)) (t (let* ((cur-mark (elmo-msgdb-get-mark msgdb number)) (flags (modb-legacy-mark-to-flags cur-mark)) new-mark) (and (memq 'new flags) (setq flags (delq 'new flags))) (or (memq flag flags) (setq flags (cons flag flags))) (when (and (eq flag 'unread) (memq 'answered flags)) (setq flags (delq 'answered flags))) (setq new-mark (modb-legacy-flags-to-mark flags)) (unless (string= new-mark cur-mark) (elmo-msgdb-set-mark msgdb number new-mark)))))) (luna-define-method elmo-msgdb-unset-flag ((msgdb modb-legacy) number flag) (unless (or (modb-legacy-supported-flag-p flag) (eq flag 'all)) (error "Flag `%s' is not supported by this msgdb type" (capitalize (symbol-name flag)))) (cl-case flag (read (elmo-msgdb-set-flag msgdb number 'unread)) (uncached (elmo-msgdb-set-flag msgdb number 'cached)) (all (elmo-msgdb-set-mark msgdb number nil)) (t (let* ((cur-mark (elmo-msgdb-get-mark msgdb number)) (flags (modb-legacy-mark-to-flags cur-mark)) new-mark) (and (memq 'new flags) (setq flags (delq 'new flags))) (and (memq flag flags) (setq flags (delq flag flags))) (when (and (eq flag 'unread) (memq 'answered flags)) (setq flags (delq 'answered flags))) (setq new-mark (modb-legacy-flags-to-mark flags)) (unless (string= new-mark cur-mark) (elmo-msgdb-set-mark msgdb number new-mark)))))) (luna-define-method elmo-msgdb-flag-count ((msgdb modb-legacy)) (let ((new 0) (unread 0) (answered 0)) (dolist (elem (elmo-msgdb-get-mark-alist msgdb)) (cond ((string= (cadr elem) modb-legacy-new-mark) (cl-incf new) (cl-incf unread)) ((member (cadr elem) (modb-legacy-unread-marks)) (cl-incf unread)) ((member (cadr elem) (modb-legacy-answered-marks)) (cl-incf answered)))) (list (cons 'new new) (cons 'unread unread) (cons 'answered answered)))) (luna-define-method elmo-msgdb-list-messages ((msgdb modb-legacy)) (mapcar 'elmo-msgdb-overview-entity-get-number-internal (elmo-msgdb-get-overview msgdb))) (luna-define-method elmo-msgdb-list-flagged ((msgdb modb-legacy) flag) (let ((case-fold-search nil) mark-regexp matched) (cl-case flag (new (setq mark-regexp (regexp-quote modb-legacy-new-mark))) (unread (setq mark-regexp (regexp-opt (modb-legacy-unread-marks)))) (answered (setq mark-regexp (regexp-opt (modb-legacy-answered-marks)))) (important (setq mark-regexp (regexp-quote modb-legacy-important-mark))) (read (setq mark-regexp (regexp-opt (modb-legacy-unread-marks)))) (digest (setq mark-regexp (regexp-opt (append (modb-legacy-unread-marks) (list modb-legacy-important-mark))))) (any (setq mark-regexp (regexp-opt (append (modb-legacy-unread-marks) (modb-legacy-answered-marks) (list modb-legacy-important-mark)))))) (when mark-regexp (if (eq flag 'read) (dolist (number (elmo-msgdb-list-messages msgdb)) (let ((mark (elmo-msgdb-get-mark msgdb number))) (unless (and mark (string-match mark-regexp mark)) (setq matched (cons number matched))))) (dolist (elem (elmo-msgdb-get-mark-alist msgdb)) (if (string-match mark-regexp (cadr elem)) (setq matched (cons (car elem) matched)))))) matched)) (luna-define-method elmo-msgdb-search ((msgdb modb-legacy) condition &optional numbers) (if (vectorp condition) (let ((key (elmo-filter-key condition)) results) (cond ((and (string= key "flag") (eq (elmo-filter-type condition) 'match)) (setq results (elmo-msgdb-list-flagged msgdb (intern (elmo-filter-value condition)))) (if numbers (elmo-list-filter numbers results) results)) ((member key '("first" "last")) (let* ((numbers (or numbers (elmo-msgdb-list-messages msgdb))) (len (length numbers)) (lastp (string= key "last")) (value (string-to-number (elmo-filter-value condition)))) (when (eq (elmo-filter-type condition) 'unmatch) (setq lastp (not lastp) value (- len value))) (if lastp (nthcdr (max (- len value) 0) numbers) (when (> value 0) (let* ((numbers (copy-sequence numbers)) (last (nthcdr (1- value) numbers))) (when last (setcdr last nil)) numbers))))) (t t))) t)) (luna-define-method elmo-msgdb-append-entity ((msgdb modb-legacy) entity &optional flags) (when entity (let ((number (elmo-msgdb-overview-entity-get-number-internal entity)) (message-id (elmo-msgdb-overview-entity-get-id-internal entity)) mark cell) (when (and number message-id) (elmo-msgdb-set-overview msgdb (nconc (elmo-msgdb-get-overview msgdb) (list entity))) (elmo-msgdb-set-number-alist msgdb (nconc (elmo-msgdb-get-number-alist msgdb) (list (cons number message-id)))) (modb-generic-set-message-modified-internal msgdb t) (when (setq mark (modb-legacy-flags-to-mark flags)) (setq cell (list number mark)) (elmo-msgdb-set-mark-alist msgdb (nconc (elmo-msgdb-get-mark-alist msgdb) (list cell))) (modb-generic-set-flag-modified-internal msgdb t)) (elmo-msgdb-make-index msgdb (list entity) (and cell (list cell))))))) (luna-define-method elmo-msgdb-delete-messages ((msgdb modb-legacy) numbers) (let* ((overview (elmo-msgdb-get-overview msgdb)) (number-alist (elmo-msgdb-get-number-alist msgdb)) (mark-alist (elmo-msgdb-get-mark-alist msgdb)) (index (elmo-msgdb-get-index msgdb)) ov-entity) ;; remove from current database. (dolist (number numbers) (setq overview (delq (setq ov-entity (elmo-msgdb-message-entity msgdb number)) overview)) (setq number-alist (delq (assq number number-alist) number-alist)) (setq mark-alist (delq (assq number mark-alist) mark-alist)) ;; (when index (elmo-msgdb-clear-index msgdb ov-entity))) (elmo-msgdb-set-overview msgdb overview) (elmo-msgdb-set-number-alist msgdb number-alist) (elmo-msgdb-set-mark-alist msgdb mark-alist) (elmo-msgdb-set-index msgdb index) (modb-generic-set-message-modified-internal msgdb t) (modb-generic-set-flag-modified-internal msgdb t) t)) ;return value (luna-define-method elmo-msgdb-sort-entities ((msgdb modb-legacy) predicate &optional app-data) (message "Sorting...") (let ((overview (elmo-msgdb-get-overview msgdb))) (elmo-msgdb-set-overview msgdb (sort overview (lambda (a b) (funcall predicate a b app-data)))) (message "Sorting...done") msgdb)) (luna-define-method elmo-msgdb-message-entity ((msgdb modb-legacy) key) (when key (elmo-get-hash-val (cond ((stringp key) key) ((numberp key) (format "#%d" key))) (elmo-msgdb-get-entity-hashtb msgdb)))) (require 'product) (product-provide (provide 'modb-legacy) (require 'elmo-version)) ;;; modb-legacy.el ends here wanderlust-wanderlust-769699d/elmo/modb-standard.el000066400000000000000000000535551406661363500224170ustar00rootroot00000000000000;;; modb-standard.el --- Standartd Implement of MODB. -*- lexical-binding: t -*- ;; Copyright (C) 2003 Yuuichi Teranishi ;; Author: Yuuichi Teranishi ;; Hiroya Murata ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'cl-lib) (require 'elmo-util) (require 'elmo-flag) (require 'modb) (defcustom modb-standard-divide-number 500 "*Standard modb divide entity number." :type '(choice (const :tag "Not divide" nil) number) :group 'elmo) (defvar modb-standard-entity-filename "entity" "Message entity database.") (defvar modb-standard-flag-filename "flag" "Message number <=> Flag status database.") (defvar modb-standard-msgid-filename "msgid" "Message number <=> Message-Id database.") (eval-and-compile (luna-define-class modb-standard (modb-generic) (number-list ; sorted list of message numbers. entity-map ; number, msg-id -> entity mapping. flag-map ; number -> flag-list mapping flag-count ; list of (FLAG . COUNT) overview-handler ; instance of modb-entity-handler. )) (luna-define-internal-accessors 'modb-standard)) ;; for internal use only (defsubst modb-standard-key (number) (concat "#" (number-to-string number))) (defsubst modb-standard-entity-id (entity) (if (eq 'autoload (car-safe entity)) (cddr entity) (elmo-msgdb-message-entity-field (elmo-message-entity-handler entity) entity 'message-id))) (defsubst modb-standard-entity-map (modb) (or (modb-standard-entity-map-internal modb) (modb-standard-set-entity-map-internal modb (elmo-make-hash (elmo-msgdb-length modb))))) (defsubst modb-standard-flag-map (modb) (or (modb-standard-flag-map-internal modb) (modb-standard-set-flag-map-internal modb (elmo-make-hash (elmo-msgdb-length modb))))) (defsubst modb-standard-set-message-modified (modb number) (if modb-standard-divide-number (let ((section (/ number modb-standard-divide-number)) (modified (modb-generic-message-modified-internal modb))) (unless (memq section modified) (modb-generic-set-message-modified-internal modb (cons section modified)))) (modb-generic-set-message-modified-internal modb t))) (defsubst modb-standard-set-flag-modified (modb _number) (modb-generic-set-flag-modified-internal modb t)) (defsubst modb-standard-message-flags (modb number) (cdr (elmo-get-hash-val (modb-standard-key number) (modb-standard-flag-map-internal modb)))) (defsubst modb-standard-match-flags (check-flags flags) (catch 'done (while check-flags (when (memq (car check-flags) flags) (throw 'done t)) (setq check-flags (cdr check-flags))))) (defsubst modb-standard-countup-flags (modb flags &optional delta) (let ((flag-count (modb-standard-flag-count-internal modb)) (delta (or delta 1)) elem) (dolist (flag flags) (if (setq elem (assq flag flag-count)) (setcdr elem (+ (cdr elem) delta)) (setq flag-count (cons (cons flag delta) flag-count)))) (modb-standard-set-flag-count-internal modb flag-count))) ;; save and load functions (defun modb-standard-load-msgid (modb path) (let* ((alist (elmo-object-load (expand-file-name modb-standard-msgid-filename path))) (table (or (modb-standard-entity-map-internal modb) (elmo-make-hash (length alist)))) numbers info) (dolist (pair alist) (setq info (cons 'autoload pair)) (elmo-set-hash-val (modb-standard-key (car pair)) info table) (elmo-set-hash-val (cdr pair) info table) (setq numbers (cons (car pair) numbers))) (modb-standard-set-number-list-internal modb (nreverse numbers)) (modb-standard-set-entity-map-internal modb table))) (defun modb-standard-save-msgid (modb path) (let ((table (modb-standard-entity-map-internal modb)) entity alist) (dolist (number (modb-standard-number-list-internal modb)) (setq entity (elmo-get-hash-val (modb-standard-key number) table)) (setq alist (cons (cons number (modb-standard-entity-id entity)) alist))) (elmo-object-save (expand-file-name modb-standard-msgid-filename path) (nreverse alist)))) (defun modb-standard-load-flag (modb path) (let ((table (or (modb-standard-flag-map-internal modb) (elmo-make-hash (elmo-msgdb-length modb))))) (dolist (info (elmo-object-load (expand-file-name modb-standard-flag-filename path))) (modb-standard-countup-flags modb (cdr info)) (elmo-set-hash-val (modb-standard-key (car info)) info table)) (modb-standard-set-flag-map-internal modb table))) (defun modb-standard-save-flag (modb path) (let (table flist info) (when (setq table (modb-standard-flag-map-internal modb)) (mapatoms (lambda (atom) (setq info (symbol-value atom)) (when (cdr info) (setq flist (cons info flist)))) table)) (elmo-object-save (expand-file-name modb-standard-flag-filename path) flist))) (defsubst modb-standard-entity-filename (section) (if section (concat modb-standard-entity-filename "-" (number-to-string section)) modb-standard-entity-filename)) (defsubst modb-standard-loaded-message-id (msgdb number) "Get message-id for autoloaded entity." (let ((ret (elmo-get-hash-val (modb-standard-key number) (modb-standard-entity-map-internal msgdb)))) (cond ((null ret) ;; Garbage entity. (elmo-clear-hash-val (modb-standard-key number) (modb-standard-entity-map-internal msgdb)) nil) ; return nil. ((eq (car-safe ret) 'autoload) (cdr (cdr ret))) ; message-id. ((elmo-msgdb-message-entity-field (elmo-message-entity-handler ret) ret 'message-id)) ; Already loaded. (t (error "Internal error: invalid msgdb status"))))) (defun modb-standard-load-entity (modb path &optional section) (let ((table (or (modb-standard-entity-map-internal modb) (elmo-make-hash (elmo-msgdb-length modb)))) (objects (elmo-object-load (expand-file-name (modb-standard-entity-filename section) path))) number msgid) (cond ((eq (car objects) 'modb-standard-entity-handler) ;; (standard PARAMETERS ENTITY*) (let ((handler (apply #'luna-make-entity (car objects) (car (cdr objects)))) entity) (dolist (element (cdr (cdr objects))) (setq entity (cons handler (cons nil element)) number (elmo-msgdb-message-entity-number handler entity) msgid (modb-standard-loaded-message-id modb number)) (when msgid (elmo-msgdb-message-entity-set-field handler entity 'message-id msgid) (elmo-set-hash-val (modb-standard-key number) entity table) (elmo-set-hash-val msgid entity table))))) (t ;; legacy format (dolist (entity objects) (setq number (elmo-msgdb-message-entity-number (elmo-message-entity-handler entity) entity) msgid (modb-standard-loaded-message-id modb number)) (when msgid (setcar entity msgid) (elmo-set-hash-val (modb-standard-key number) entity table) (elmo-set-hash-val msgid entity table))))) (modb-standard-set-entity-map-internal modb table))) (defsubst modb-standard-save-entity-1 (modb path &optional section) (let ((filename (expand-file-name (modb-standard-entity-filename (car section)) path)) (handler (elmo-msgdb-message-entity-handler modb)) entity entities) (dolist (number (if section (cdr section) (modb-standard-number-list-internal modb))) (when (setq entity (elmo-msgdb-message-entity modb number)) (unless (modb-entity-handler-equal-p handler (elmo-message-entity-handler entity)) (setq entity (elmo-msgdb-copy-message-entity (elmo-message-entity-handler entity) entity handler))) (setq entities (cons (cdr (cdr entity)) entities)))) (if entities (elmo-object-save filename (nconc (list (luna-class-name handler) (modb-entity-handler-dump-parameters handler)) entities)) (ignore-errors (delete-file filename))))) (defun modb-standard-cleanup-stale-entities (modb path) (message "Removing stale entities...") (let* ((entity-regex (concat "^" modb-standard-entity-filename "-\\([0-9]+\\)$")) (entities (elmo-sort-uniq-number-list (mapcar (lambda (x) (/ x modb-standard-divide-number)) (modb-standard-number-list-internal modb)))) (files (mapcar (lambda(x) (progn (string-match entity-regex x) (string-to-number (match-string 1 x)))) (directory-files path nil entity-regex t)))) (dolist (entity (car (elmo-list-diff files entities))) (ignore-errors (delete-file (expand-file-name (modb-standard-entity-filename entity) path))))) (message "Removing stale entities...done")) (defun modb-standard-save-entity (modb path) (let ((modified (modb-generic-message-modified-internal modb))) (when modified (if (listp modified) (let ((sections (mapcar 'list modified)) section) (dolist (number (modb-standard-number-list-internal modb)) (when (setq section (assq (/ number modb-standard-divide-number) sections)) (nconc section (list number)))) (dolist (section sections) (modb-standard-save-entity-1 modb path section))) (modb-standard-save-entity-1 modb path))))) ;;; Implement ;; (luna-define-method elmo-msgdb-load ((msgdb modb-standard)) (let ((inhibit-quit t) (path (elmo-msgdb-location msgdb))) (when (file-exists-p (expand-file-name modb-standard-flag-filename path)) (modb-standard-load-msgid msgdb path) (modb-standard-load-flag msgdb path) (unless modb-standard-divide-number (modb-standard-load-entity msgdb path)) t))) (luna-define-method elmo-msgdb-save ((msgdb modb-standard)) (let ((path (elmo-msgdb-location msgdb)) (inhibit-quit t)) (when (elmo-msgdb-message-modified-p msgdb) (modb-standard-save-msgid msgdb path) (modb-standard-save-entity msgdb path) (modb-generic-set-message-modified-internal msgdb nil)) (when (elmo-msgdb-flag-modified-p msgdb) (modb-standard-save-flag msgdb path) (modb-generic-set-flag-modified-internal msgdb nil)))) (luna-define-method elmo-msgdb-append :around ((msgdb modb-standard) msgdb-append) (when (> (elmo-msgdb-length msgdb-append) 0) (if (eq (luna-class-name msgdb-append) 'modb-standard) (let ((numbers (modb-standard-number-list-internal msgdb-append)) duplicates) ;; number-list (modb-standard-set-number-list-internal msgdb (nconc (modb-standard-number-list-internal msgdb) numbers)) ;; entity-map (let ((table (modb-standard-entity-map msgdb)) entity msg-id) (dolist (number numbers) (setq entity (elmo-msgdb-message-entity msgdb-append number) msg-id (modb-standard-entity-id entity)) (if (elmo-get-hash-val msg-id table) (setq duplicates (cons number duplicates)) (elmo-set-hash-val msg-id entity table)) (elmo-set-hash-val (modb-standard-key number) entity table))) ;; flag-map (let ((table (modb-standard-flag-map msgdb))) (mapatoms (lambda (atom) (elmo-set-hash-val (symbol-name atom) (symbol-value atom) table)) (modb-standard-flag-map msgdb-append))) ;; flag-count (dolist (pair (modb-standard-flag-count-internal msgdb-append)) (modb-standard-countup-flags msgdb (list (car pair)) (cdr pair))) ;; modification flags (dolist (number (modb-standard-number-list-internal msgdb-append)) (modb-standard-set-message-modified msgdb number) (modb-standard-set-flag-modified msgdb number)) duplicates) (luna-call-next-method)))) (luna-define-method elmo-msgdb-clear :after ((msgdb modb-standard)) (modb-standard-set-number-list-internal msgdb nil) (modb-standard-set-entity-map-internal msgdb nil) (modb-standard-set-flag-map-internal msgdb nil) (modb-standard-set-flag-count-internal msgdb nil)) (luna-define-method elmo-msgdb-length ((msgdb modb-standard)) (length (modb-standard-number-list-internal msgdb))) (luna-define-method elmo-msgdb-flag-available-p ((_msgdb modb-standard) _flag) t) (luna-define-method elmo-msgdb-flags ((msgdb modb-standard) number) (modb-standard-message-flags msgdb number)) (luna-define-method elmo-msgdb-set-flag ((msgdb modb-standard) number flag) (cl-case flag (read (elmo-msgdb-unset-flag msgdb number 'unread)) (uncached (elmo-msgdb-unset-flag msgdb number 'cached)) (t (let ((cur-flags (modb-standard-message-flags msgdb number)) new-flags diff) (unless (memq flag cur-flags) (setq new-flags (cons flag cur-flags)) (setq diff (elmo-list-diff-nonsortable new-flags cur-flags)) (modb-standard-countup-flags msgdb (car diff)) (modb-standard-countup-flags msgdb (cadr diff) -1) (elmo-set-hash-val (modb-standard-key number) (cons number new-flags) (modb-standard-flag-map msgdb)) (modb-standard-set-flag-modified msgdb number)))))) (luna-define-method elmo-msgdb-unset-flag ((msgdb modb-standard) number flag) (cl-case flag (read (elmo-msgdb-set-flag msgdb number 'unread)) (uncached (elmo-msgdb-set-flag msgdb number 'cached)) (all (modb-standard-countup-flags msgdb (modb-standard-message-flags msgdb number) -1) (elmo-clear-hash-val (modb-standard-key number) (modb-standard-flag-map msgdb))) (t (let ((cur-flags (modb-standard-message-flags msgdb number)) (inhibit-quit t) new-flags diff) (when (memq flag cur-flags) (setq new-flags (delq flag (copy-sequence cur-flags))) (setq diff (elmo-list-diff-nonsortable new-flags cur-flags)) (modb-standard-countup-flags msgdb (car diff)) (modb-standard-countup-flags msgdb (cadr diff) -1) (elmo-set-hash-val (modb-standard-key number) (cons number new-flags) (modb-standard-flag-map msgdb)) (modb-standard-set-flag-modified msgdb number)) (when (eq flag 'unread) (elmo-msgdb-unset-flag msgdb number 'new)))))) (luna-define-method elmo-msgdb-flag-count ((msgdb modb-standard)) (modb-standard-flag-count-internal msgdb)) (luna-define-method elmo-msgdb-list-messages ((msgdb modb-standard)) (copy-sequence (modb-standard-number-list-internal msgdb))) (luna-define-method elmo-msgdb-list-flagged ((msgdb modb-standard) flag) (let (entry matched) (cl-case flag (read (dolist (number (modb-standard-number-list-internal msgdb)) (unless (memq 'unread (modb-standard-message-flags msgdb number)) (setq matched (cons number matched))))) (uncached (dolist (number (modb-standard-number-list-internal msgdb)) (unless (memq 'cached (modb-standard-message-flags msgdb number)) (setq matched (cons number matched))))) (any (mapatoms (lambda (atom) (setq entry (symbol-value atom)) (unless (and (eq (length (cdr entry)) 1) (eq (car (cdr entry)) 'cached)) ;; If there is a flag other than cached, then the message ;; matches to `any'. (setq matched (cons (car entry) matched)))) (modb-standard-flag-map msgdb))) (digest (let ((flags (append elmo-digest-flags (elmo-get-global-flags t t)))) (mapatoms (lambda (atom) (setq entry (symbol-value atom)) (when (modb-standard-match-flags flags (cdr entry)) (setq matched (cons (car entry) matched)))) (modb-standard-flag-map msgdb)))) (t (mapatoms (lambda (atom) (setq entry (symbol-value atom)) (when (memq flag (cdr entry)) (setq matched (cons (car entry) matched)))) (modb-standard-flag-map msgdb)))) matched)) (luna-define-method elmo-msgdb-search ((msgdb modb-standard) condition &optional numbers) (if (vectorp condition) (let ((key (elmo-filter-key condition)) results) (cond ((and (string= key "flag") (eq (elmo-filter-type condition) 'match)) (setq results (elmo-msgdb-list-flagged msgdb (intern (elmo-filter-value condition)))) (if numbers (elmo-list-filter numbers results) results)) ((member key '("first" "last")) (let* ((numbers (or numbers (modb-standard-number-list-internal msgdb))) (len (length numbers)) (lastp (string= key "last")) (value (string-to-number (elmo-filter-value condition)))) (when (eq (elmo-filter-type condition) 'unmatch) (setq lastp (not lastp) value (- len value))) (if lastp (nthcdr (max (- len value) 0) numbers) (when (> value 0) (let* ((numbers (copy-sequence numbers)) (last (nthcdr (1- value) numbers))) (when last (setcdr last nil)) numbers))))) (t t))) t)) (luna-define-method elmo-msgdb-append-entity ((msgdb modb-standard) entity &optional flags) (when entity (let ((number (elmo-msgdb-message-entity-number (elmo-message-entity-handler entity) entity)) (msg-id (elmo-msgdb-message-entity-field (elmo-message-entity-handler entity) entity 'message-id)) duplicate) (when (and number msg-id) ;; number-list (modb-standard-set-number-list-internal msgdb (nconc (modb-standard-number-list-internal msgdb) (list number))) ;; entity-map (let ((table (modb-standard-entity-map msgdb))) (setq duplicate (elmo-get-hash-val msg-id table)) (elmo-set-hash-val (modb-standard-key number) entity table) (elmo-set-hash-val msg-id entity table)) ;; modification flags (modb-standard-set-message-modified msgdb number) ;; flag-map (when flags (elmo-set-hash-val (modb-standard-key number) (cons number flags) (modb-standard-flag-map msgdb)) (modb-standard-countup-flags msgdb flags) (modb-standard-set-flag-modified msgdb number)) duplicate)))) (luna-define-method elmo-msgdb-update-entity ((msgdb modb-standard) entity values) (let ((handler (elmo-message-entity-handler entity))) (when (elmo-msgdb-message-entity-update-fields handler entity values) (modb-standard-set-message-modified msgdb (elmo-msgdb-message-entity-number handler entity)) t))) (luna-define-method elmo-msgdb-delete-messages ((msgdb modb-standard) numbers) (let ((number-list (modb-standard-number-list-internal msgdb)) (entity-map (modb-standard-entity-map-internal msgdb)) (flag-map (modb-standard-flag-map-internal msgdb)) key entity) (dolist (number numbers) (setq key (modb-standard-key number) entity (elmo-get-hash-val key entity-map)) (when entity ;; number-list (setq number-list (delq number number-list)) ;; entity-map (elmo-clear-hash-val key entity-map) (elmo-clear-hash-val (modb-standard-entity-id entity) entity-map) ;; flag-count (must be BEFORE flag-map) (modb-standard-countup-flags msgdb (modb-standard-message-flags msgdb number) -1) ;; flag-map (elmo-clear-hash-val key flag-map) (modb-standard-set-message-modified msgdb number) (modb-standard-set-flag-modified msgdb number))) (modb-standard-set-number-list-internal msgdb number-list) (modb-standard-set-entity-map-internal msgdb entity-map) (modb-standard-set-flag-map-internal msgdb flag-map) t)) (luna-define-method elmo-msgdb-sort-entities ((msgdb modb-standard) predicate &optional app-data) (message "Sorting...") (let ((numbers (modb-standard-number-list-internal msgdb))) (modb-standard-set-number-list-internal msgdb (sort numbers (lambda (a b) (funcall predicate (elmo-msgdb-message-entity msgdb a) (elmo-msgdb-message-entity msgdb b) app-data)))) (message "Sorting...done") msgdb)) (defun modb-standard-message-entity (msgdb key load) (let ((ret (elmo-get-hash-val key (modb-standard-entity-map-internal msgdb))) (inhibit-quit t)) (if (eq 'autoload (car-safe ret)) (when (and load modb-standard-divide-number) (modb-standard-load-entity msgdb (elmo-msgdb-location msgdb) (/ (nth 1 ret) modb-standard-divide-number)) (modb-standard-message-entity msgdb key nil)) ret))) (luna-define-method elmo-msgdb-message-number ((msgdb modb-standard) message-id) (let ((ret (elmo-get-hash-val message-id (modb-standard-entity-map-internal msgdb)))) (if (eq 'autoload (car-safe ret)) ;; Not loaded yet but can return number. (nth 1 ret) (elmo-message-entity-number ret)))) (luna-define-method elmo-msgdb-message-field ((msgdb modb-standard) number field &optional type) (let ((ret (elmo-get-hash-val (modb-standard-key number) (modb-standard-entity-map-internal msgdb)))) (if (and (eq 'autoload (car-safe ret)) (eq field 'message-id)) ;; Not loaded yet but can return message-id (cdr (cdr ret)) (elmo-message-entity-field (elmo-msgdb-message-entity msgdb (modb-standard-key number)) field type)))) (luna-define-method elmo-msgdb-message-entity ((msgdb modb-standard) key) (when key (modb-standard-message-entity msgdb (cond ((stringp key) key) ((numberp key) (modb-standard-key key))) 'autoload))) (luna-define-method elmo-msgdb-message-entity-handler ((msgdb modb-standard)) (or (modb-standard-overview-handler-internal msgdb) (modb-standard-set-overview-handler-internal msgdb (luna-make-entity 'modb-standard-entity-handler :mime-charset (modb-generic-mime-charset-internal msgdb))))) (require 'product) (product-provide (provide 'modb-standard) (require 'elmo-version)) ;;; modb-standard.el ends here wanderlust-wanderlust-769699d/elmo/modb.el000066400000000000000000000254771406661363500206230ustar00rootroot00000000000000;;; modb.el --- Message Orchestration DataBase. -*- lexical-binding: t -*- ;; Copyright (C) 2003 Yuuichi Teranishi ;; Author: Yuuichi Teranishi ;; Hiroya Murata ;; Keywords: mail, net news ;; This file is part of ELMO (Elisp Library for Message Orchestration). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'cl-lib) (require 'luna) (require 'modb-entity) (provide 'modb) (eval-and-compile (luna-define-class modb-generic () (location ; location for save. message-modified ; message is modified. flag-modified ; flag is modified. mime-charset ; for encode & decode. )) (luna-define-internal-accessors 'modb-generic)) (luna-define-generic elmo-msgdb-load (msgdb) "Load the MSGDB.") (luna-define-generic elmo-msgdb-save (msgdb) "Save the MSGDB.") (luna-define-generic elmo-msgdb-location (msgdb) "Return the location of MSGDB.") (luna-define-generic elmo-msgdb-message-modified-p (msgdb) "Return non-nil if message is modified.") (luna-define-generic elmo-msgdb-flag-modified-p (msgdb) "Return non-nil if flag is modified.") (luna-define-generic elmo-msgdb-append (msgdb msgdb-append) "Append the MSGDB-APPEND to the MSGDB. Return a list of messages which have duplicated message-id.") (luna-define-generic elmo-msgdb-clear (msgdb) "Clear the MSGDB structure.") (luna-define-generic elmo-msgdb-length (msgdb) "Return number of messages in the MSGDB") (luna-define-generic elmo-msgdb-flag-available-p (msgdb flag) "Return non-nil when FLAG is available.") (luna-define-generic elmo-msgdb-flags (msgdb number) "Return a list of flag which corresponds to the message with NUMBER.") (luna-define-generic elmo-msgdb-set-flag (msgdb number flag) "Set message flag. MSGDB is the ELMO msgdb. NUMBER is a message number to set flag. FLAG is a symbol which is one of the following: `new' ... Message which is new. `unread' ... Message which is not read. `important' ... Message which is important. `answered' ... Message which is answered. `cached' ... Message which is cached. 'sugar' flag: `read' ... Message which is already read. `uncached' ... Message which is not cached.") (luna-define-generic elmo-msgdb-unset-flag (msgdb number flag) "Unset message flag. MSGDB is the ELMO msgdb. NUMBER is a message number to set flag. FLAG is a symbol which is one of the following: `new' ... Message which is new. `unread' ... Message which is not read. `important' ... Message which is important. `answered' ... Message which is answered. `cached' ... Message which is cached. 'sugar' flag: `read' ... Message which is already read. `uncached' ... Message which is not cached. `all' ... Remove all flags.") (luna-define-generic elmo-msgdb-flag-count (msgdb) "Return a list of cons cell as (flag . count). The count is number of message which is set flag in the MSGDB.") (luna-define-generic elmo-msgdb-list-messages (msgdb) "Return a list of message numbers in the MSGDB.") (luna-define-generic elmo-msgdb-list-flagged (msgdb flag) "Return a list of message numbers which is set FLAG in the MSGDB.") (luna-define-generic elmo-msgdb-search (msgdb condition &optional numbers) "Search and return list of message numbers. MSGDB is the ELMO msgdb structure. CONDITION is a condition structure for searching. If optional argument NUMBERS is specified and is a list of message numbers, messages are searched from the list. Return t if the condition is unsupported.") (luna-define-generic elmo-msgdb-match-condition (msgdb condition number &optional numbers) "Check whether the condition of the message is satisfied or not. MSGDB is the msgdb to search from. CONDITION is the search condition. NUMBER is the message number to check. If optional argument NUMBERS is specified and is a list of message numbers, messages are searched from the list. Return CONDITION itself if no entity exists in msgdb.") (luna-define-generic elmo-msgdb-append-entity (msgdb entity &optional flags) "Append a ENTITY with FLAGS into the MSGDB. Return non-nil if message-id of entity is duplicated.") (luna-define-generic elmo-msgdb-update-entity (msgdb entity values) "Update a ENTITY with VALUES into the MSGDB. VALUES is an alist of field-name and field-value.") (luna-define-generic elmo-msgdb-delete-messages (msgdb numbers) "Delete messages which are contained NUMBERS from MSGDB. Return non-nil if messages is deleted successfully.") (luna-define-generic elmo-msgdb-sort-entities (msgdb predicate &optional app-data) "Sort entities of MSGDB, comparing with PREDICATE. PREDICATE is called with two entities and APP-DATA. Should return non-nil if the first entity is \"less\" than the second.") (luna-define-generic elmo-msgdb-message-number (msgdb message-id) "Get message number from MSGDB which corresponds to MESSAGE-ID.") (luna-define-generic elmo-msgdb-message-entity (msgdb key) "Return the message-entity structure which matches to the KEY. KEY is a number or a string. A number is for message number in the MSGDB. A string is for message-id of the message.") (luna-define-generic elmo-msgdb-message-field (msgdb number field &optional type) "Get message field value in the MSGDB. NUMBER is a number of the message. FIELD is a symbol of the field. If optional argument TYPE is specified, return converted value.") (luna-define-generic elmo-msgdb-message-entity-handler (msgdb) "Get modb entity handler instance which corresponds to the MSGDB.") ;;; message entity wrappers ;; (defsubst elmo-message-entity-number (entity) (elmo-msgdb-message-entity-number (elmo-message-entity-handler entity) entity)) (defsubst elmo-message-entity-set-number (entity number) (elmo-msgdb-message-entity-set-number (elmo-message-entity-handler entity) entity number)) (defsubst elmo-message-entity-field (entity field &optional type) "Get message entity field value. ENTITY is the message entity structure obtained by `elmo-message-entity'. FIELD is the symbol of the field name. If optional argument TYPE is specified, return converted value." (elmo-msgdb-message-entity-field (elmo-message-entity-handler entity) entity field type)) (defsubst elmo-message-entity-set-field (entity field value) "Set message entity field value. ENTITY is the message entity structure. FIELD is the symbol of the field name. VALUE is the field value." (elmo-msgdb-message-entity-set-field (elmo-message-entity-handler entity) entity field value)) ;;; generic implement ;; (luna-define-method elmo-msgdb-message-number ((msgdb modb-generic) message-id) (elmo-message-entity-number (elmo-msgdb-message-entity msgdb message-id))) (luna-define-method elmo-msgdb-message-field ((msgdb modb-generic) number field &optional type) (elmo-msgdb-message-entity-field (elmo-msgdb-message-entity msgdb number) field type)) (luna-define-method elmo-msgdb-load ((_msgdb modb-generic)) t) (luna-define-method elmo-msgdb-location ((msgdb modb-generic)) (modb-generic-location-internal msgdb)) (luna-define-method elmo-msgdb-message-modified-p ((msgdb modb-generic)) (modb-generic-message-modified-internal msgdb)) (luna-define-method elmo-msgdb-flag-modified-p ((msgdb modb-generic)) (modb-generic-flag-modified-internal msgdb)) (luna-define-method elmo-msgdb-append ((msgdb modb-generic) msgdb-append) (let (duplicates) (dolist (number (elmo-msgdb-list-messages msgdb-append)) (when (elmo-msgdb-append-entity msgdb (elmo-msgdb-message-entity msgdb-append number) (elmo-msgdb-flags msgdb-append number)) (setq duplicates (cons number duplicates)))) duplicates)) (luna-define-method elmo-msgdb-clear ((msgdb modb-generic)) (modb-generic-set-message-modified-internal msgdb nil) (modb-generic-set-flag-modified-internal msgdb nil)) (luna-define-method elmo-msgdb-length ((_msgdb modb-generic)) 0) (luna-define-method elmo-msgdb-search ((_msgdb modb-generic) _condition &optional _numbers) t) (luna-define-method elmo-msgdb-match-condition ((msgdb modb-generic) condition number &optional numbers) (let ((entity (elmo-msgdb-message-entity msgdb number))) (if entity (elmo-condition-match condition #'elmo-msgdb-match-condition-primitive (list msgdb number entity (or numbers (elmo-msgdb-list-messages msgdb)))) condition))) (require 'elmo-flag) (defun elmo-msgdb-match-condition-primitive (condition msgdb number entity population) (let ((key (elmo-filter-key condition)) (case-fold-search t)) (cond ((string= key "last") (<= (length (memq number population)) (string-to-number (elmo-filter-value condition)))) ((string= key "first") (< (- (length population) (length (memq number population))) (string-to-number (elmo-filter-value condition)))) ((string= key "flag") (let ((flags (elmo-msgdb-flags msgdb number))) (cond ((string= (elmo-filter-value condition) "any") (and flags (not (equal flags '(cached))))) ((string= (elmo-filter-value condition) "digest") (catch 'found (dolist (flag flags) (when (or (memq flag elmo-digest-flags) (elmo-global-flag-p flag)) (throw 'found t))))) ((string= (elmo-filter-value condition) "read") (not (memq 'read flags))) (t (memq (intern (elmo-filter-value condition)) flags))))) (t (elmo-msgdb-message-match-condition (elmo-message-entity-handler entity) condition entity))))) (luna-define-method elmo-msgdb-update-entity ((msgdb modb-generic) entity values) (when (elmo-msgdb-message-entity-update-fields (elmo-message-entity-handler entity) entity values) (modb-generic-set-message-modified-internal msgdb t) t)) (luna-define-method elmo-msgdb-message-entity-handler ((_msgdb modb-generic)) (or modb-entity-default-cache-internal (setq modb-entity-default-cache-internal (luna-make-entity modb-entity-default-handler)))) ;; for on demand loading (provide 'modb-generic) (require 'product) (product-provide (provide 'modb) (require 'elmo-version)) ;;; modb.el ends here wanderlust-wanderlust-769699d/elmo/pldap.el000066400000000000000000001121111406661363500207600ustar00rootroot00000000000000;;; pldap.el --- A portable LDAP support for Emacs. -*- lexical-binding: t -*- ;; Copyright (C) 1998 Free Software Foundation, Inc. ;; Copyright (C) 2000 Yuuichi Teranishi ;; Original was ldap.el: ;; Author: Oscar Figueiredo ;; Maintainer: Oscar Figueiredo ;; pldap.el: ;; Author: Yuuichi Teranishi ;; Maintainer: Yuuichi Teranishi ;; Keywords: emulating, LDAP, comm ;; Created: 15 June 2000 ;; This file is not part of GNU Emacs ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;;; Code: ;; ;; You don't have built-in ldap feature. ;; Use external program. ;;; For LDIF encoding. ;; SAFE-CHAR = %x01-09 / %x0B-0C / %x0E-7F (defconst ldap-ldif-safe-char-regexp "[\000-\011\013\014\016-\177]" "A Regexp for safe-char.") ;; SAFE-INIT-CHAR = %x01-09 / %x0B-0C / %x0E-1F / ;; %x21-39 / %x3B / %x3D-7F (defconst ldap-ldif-safe-init-char-regexp "[\001-\011\013\014\016-\037\038-\071\073\075-\177]" "A Regexp for safe-init-char.") ;; SAFE-STRING = [SAFE-INIT-CHAR *SAFE-CHAR] (defconst ldap-ldif-safe-string-regexp (concat ldap-ldif-safe-init-char-regexp ldap-ldif-safe-char-regexp "*") "A Regexp for safe-string.") (defconst ldap-ldif-field-name-regexp "[a-zA-Z][a-zA-Z0-9-;]*" "A Regexp for field name.") (defconst ldap-ldif-field-head-regexp (concat "^" ldap-ldif-field-name-regexp ":") "A Regexp for field head.") (defconst ldap-ldif-next-field-head-regexp (concat "\n" ldap-ldif-field-name-regexp ":") "A Regexp for next field head.") (defun ldap/ldif-safe-string-p (string) "Return t if STRING is a safe-string for LDIF." ;; Need better implentation. (string-match ldap-ldif-safe-string-regexp string)) (defgroup ldap nil "Lightweight Directory Access Protocol" :group 'comm) (defvar ldap-search-program "ldapsearch" "LDAP search program.") (defvar ldap-add-program "ldapadd" "LDAP add program.") (defvar ldap-delete-program "ldapdelete" "LDAP delete program.") (defvar ldap-modify-program "ldapmodify" "LDAP modify program.") (defcustom ldap-search-program-arguments '("-LL" "-x") "*A list of additional arguments to pass to `ldapsearch'. It is recommended to use the `-T' switch with Nescape's implementation to avoid line wrapping. `-L' is needed to get LDIF outout. \(`-LL' is needed to get rid of comments from OpenLDAP's ldapsearch.\) `-x' is needed to use simple authentication. The `-B' switch should be used to enable the retrieval of binary values." :type '(repeat :tag "`ldapsearch' Arguments" (string :tag "Argument")) :group 'ldap) (defcustom ldap-default-host nil "*Default LDAP server hostname." :type '(choice (string :tag "Host name") (const :tag "Use library default" nil)) :group 'ldap) (defcustom ldap-default-port nil "*Default TCP port for LDAP connections. Initialized from the LDAP library at build time. Default value is 389." :type '(choice (const :tag "Use library default" nil) (integer :tag "Port number")) :group 'ldap) (defcustom ldap-default-base nil "*Default base for LDAP searches. This is a string using the syntax of RFC 1779. For instance, \"o=ACME, c=US\" limits the search to the Acme organization in the United States." :type '(choice (const :tag "Use library default" nil) (string :tag "Search base")) :group 'ldap) (defcustom ldap-host-parameters-alist nil "*Alist of host-specific options for LDAP transactions. The format of each list element is: \(HOST PROP1 VAL1 PROP2 VAL2 ...) HOST is the hostname of an LDAP server (with an optional TCP port number appended to it using a colon as a separator). PROPn and VALn are property/value pairs describing parameters for the server. Valid properties include: `binddn' is the distinguished name of the user to bind as (in RFC 1779 syntax). `passwd' is the password to use for simple authentication. `auth' is the authentication method to use. Possible values are: `simple', `krbv41' and `krbv42'. `base' is the base for the search as described in RFC 1779. `scope' is one of the three symbols `subtree', `base' or `onelevel'. `deref' is one of the symbols `never', `always', `search' or `find'. `timelimit' is the timeout limit for the connection in seconds. `sizelimit' is the maximum number of matches to return." :type '(repeat :menu-tag "Host parameters" :tag "Host parameters" (list :menu-tag "Host parameters" :tag "Host parameters" :value nil (string :tag "Host name") (checklist :inline t :greedy t (list :tag "Search Base" :inline t (const :tag "Search Base" base) string) (list :tag "Binding DN" :inline t (const :tag "Binding DN" binddn) string) (list :tag "Password" :inline t (const :tag "Password" passwd) string) (list :tag "Authentication Method" :inline t (const :tag "Authentication Method" auth) (choice (const :menu-tag "None" :tag "None" nil) (const :menu-tag "Simple" :tag "Simple" simple) (const :menu-tag "Kerberos 4.1" :tag "Kerberos 4.1" krbv41) (const :menu-tag "Kerberos 4.2" :tag "Kerberos 4.2" krbv42))) (list :tag "Search Scope" :inline t (const :tag "Search Scope" scope) (choice (const :menu-tag "Default" :tag "Default" nil) (const :menu-tag "Subtree" :tag "Subtree" subtree) (const :menu-tag "Base" :tag "Base" base) (const :menu-tag "One Level" :tag "One Level" onelevel))) (list :tag "Dereferencing" :inline t (const :tag "Dereferencing" deref) (choice (const :menu-tag "Default" :tag "Default" nil) (const :menu-tag "Never" :tag "Never" never) (const :menu-tag "Always" :tag "Always" always) (const :menu-tag "When searching" :tag "When searching" search) (const :menu-tag "When locating base" :tag "When locating base" find))) (list :tag "Time Limit" :inline t (const :tag "Time Limit" timelimit) (integer :tag "(in seconds)")) (list :tag "Size Limit" :inline t (const :tag "Size Limit" sizelimit) (integer :tag "(number of records)"))))) :group 'ldap) (defcustom ldap-verbose nil "*If non-nil, LDAP operations echo progress messages." :type 'boolean :group 'ldap) (defcustom ldap-ignore-attribute-codings nil "*If non-nil, do not perform any encoding/decoding on LDAP attribute values." :type 'boolean :group 'ldap) (defcustom ldap-default-attribute-encoder nil "*Encoder function to use for attributes whose syntax is unknown." :type 'symbol :group 'ldap) (defcustom ldap-default-attribute-decoder nil "*Decoder function to use for attributes whose syntax is unknown." :type 'symbol :group 'ldap) (defcustom ldap-coding-system nil "*Coding system of LDAP string values. LDAP v3 specifies the coding system of strings to be UTF-8. Mule support is needed for this." :type 'symbol :group 'ldap) (defvar ldap-attribute-syntax-encoders [nil ; 1 ACI Item N nil ; 2 Access Point Y nil ; 3 Attribute Type Description Y nil ; 4 Audio N nil ; 5 Binary N nil ; 6 Bit String Y ldap-encode-boolean ; 7 Boolean Y nil ; 8 Certificate N nil ; 9 Certificate List N nil ; 10 Certificate Pair N ldap-encode-country-string ; 11 Country String Y ldap-encode-string ; 12 DN Y nil ; 13 Data Quality Syntax Y nil ; 14 Delivery Method Y ldap-encode-string ; 15 Directory String Y nil ; 16 DIT Content Rule Description Y nil ; 17 DIT Structure Rule Description Y nil ; 18 DL Submit Permission Y nil ; 19 DSA Quality Syntax Y nil ; 20 DSE Type Y nil ; 21 Enhanced Guide Y nil ; 22 Facsimile Telephone Number Y nil ; 23 Fax N nil ; 24 Generalized Time Y nil ; 25 Guide Y nil ; 26 IA5 String Y number-to-string ; 27 INTEGER Y nil ; 28 JPEG N nil ; 29 Master And Shadow Access Points Y nil ; 30 Matching Rule Description Y nil ; 31 Matching Rule Use Description Y nil ; 32 Mail Preference Y nil ; 33 MHS OR Address Y nil ; 34 Name And Optional UID Y nil ; 35 Name Form Description Y nil ; 36 Numeric String Y nil ; 37 Object Class Description Y nil ; 38 OID Y nil ; 39 Other Mailbox Y nil ; 40 Octet String Y ldap-encode-address ; 41 Postal Address Y nil ; 42 Protocol Information Y nil ; 43 Presentation Address Y ldap-encode-string ; 44 Printable String Y nil ; 45 Subtree Specification Y nil ; 46 Supplier Information Y nil ; 47 Supplier Or Consumer Y nil ; 48 Supplier And Consumer Y nil ; 49 Supported Algorithm N nil ; 50 Telephone Number Y nil ; 51 Teletex Terminal Identifier Y nil ; 52 Telex Number Y nil ; 53 UTC Time Y nil ; 54 LDAP Syntax Description Y nil ; 55 Modify Rights Y nil ; 56 LDAP Schema Definition Y nil ; 57 LDAP Schema Description Y nil ; 58 Substring Assertion Y ] "A vector of functions used to encode LDAP attribute values. The sequence of functions corresponds to the sequence of LDAP attribute syntax object identifiers of the form 1.3.6.1.4.1.1466.1115.121.1.* as defined in RFC2252 section 4.3.2") (defvar ldap-attribute-syntax-decoders [nil ; 1 ACI Item N nil ; 2 Access Point Y nil ; 3 Attribute Type Description Y nil ; 4 Audio N nil ; 5 Binary N nil ; 6 Bit String Y ldap-decode-boolean ; 7 Boolean Y nil ; 8 Certificate N nil ; 9 Certificate List N nil ; 10 Certificate Pair N ldap-decode-string ; 11 Country String Y ldap-decode-string ; 12 DN Y nil ; 13 Data Quality Syntax Y nil ; 14 Delivery Method Y ldap-decode-string ; 15 Directory String Y nil ; 16 DIT Content Rule Description Y nil ; 17 DIT Structure Rule Description Y nil ; 18 DL Submit Permission Y nil ; 19 DSA Quality Syntax Y nil ; 20 DSE Type Y nil ; 21 Enhanced Guide Y nil ; 22 Facsimile Telephone Number Y nil ; 23 Fax N nil ; 24 Generalized Time Y nil ; 25 Guide Y nil ; 26 IA5 String Y string-to-number ; 27 INTEGER Y nil ; 28 JPEG N nil ; 29 Master And Shadow Access Points Y nil ; 30 Matching Rule Description Y nil ; 31 Matching Rule Use Description Y nil ; 32 Mail Preference Y nil ; 33 MHS OR Address Y nil ; 34 Name And Optional UID Y nil ; 35 Name Form Description Y nil ; 36 Numeric String Y nil ; 37 Object Class Description Y nil ; 38 OID Y nil ; 39 Other Mailbox Y nil ; 40 Octet String Y ldap-decode-address ; 41 Postal Address Y nil ; 42 Protocol Information Y nil ; 43 Presentation Address Y ldap-decode-string ; 44 Printable String Y nil ; 45 Subtree Specification Y nil ; 46 Supplier Information Y nil ; 47 Supplier Or Consumer Y nil ; 48 Supplier And Consumer Y nil ; 49 Supported Algorithm N nil ; 50 Telephone Number Y nil ; 51 Teletex Terminal Identifier Y nil ; 52 Telex Number Y nil ; 53 UTC Time Y nil ; 54 LDAP Syntax Description Y nil ; 55 Modify Rights Y nil ; 56 LDAP Schema Definition Y nil ; 57 LDAP Schema Description Y nil ; 58 Substring Assertion Y ] "A vector of functions used to decode LDAP attribute values. The sequence of functions corresponds to the sequence of LDAP attribute syntax object identifiers of the form 1.3.6.1.4.1.1466.1115.121.1.* as defined in RFC2252 section 4.3.2") (defvar ldap-attribute-syntaxes-alist '((createtimestamp . 24) (modifytimestamp . 24) (creatorsname . 12) (modifiersname . 12) (subschemasubentry . 12) (attributetypes . 3) (objectclasses . 37) (matchingrules . 30) (matchingruleuse . 31) (namingcontexts . 12) (altserver . 26) (supportedextension . 38) (supportedcontrol . 38) (supportedsaslmechanisms . 15) (supportedldapversion . 27) (ldapsyntaxes . 16) (ditstructurerules . 17) (nameforms . 35) (ditcontentrules . 16) (objectclass . 38) (aliasedobjectname . 12) (cn . 15) (sn . 15) (serialnumber . 44) (c . 15) (l . 15) (st . 15) (street . 15) (o . 15) (ou . 15) (title . 15) (description . 15) (searchguide . 25) (businesscategory . 15) (postaladdress . 41) (postalcode . 15) (postofficebox . 15) (physicaldeliveryofficename . 15) (telephonenumber . 50) (telexnumber . 52) (telexterminalidentifier . 51) (facsimiletelephonenumber . 22) (x121address . 36) (internationalisdnnumber . 36) (registeredaddress . 41) (destinationindicator . 44) (preferreddeliverymethod . 14) (presentationaddress . 43) (supportedapplicationcontext . 38) (member . 12) (owner . 12) (roleoccupant . 12) (seealso . 12) (userpassword . 40) (usercertificate . 8) (cacertificate . 8) (authorityrevocationlist . 9) (certificaterevocationlist . 9) (crosscertificatepair . 10) (name . 15) (givenname . 15) (initials . 15) (generationqualifier . 15) (x500uniqueidentifier . 6) (dnqualifier . 44) (enhancedsearchguide . 21) (protocolinformation . 42) (distinguishedname . 12) (uniquemember . 34) (houseidentifier . 15) (supportedalgorithms . 49) (deltarevocationlist . 9) (dmdname . 15)) "A map of LDAP attribute names to their type object id minor number. This table is built from RFC2252 Section 5 and RFC2256 Section 5") ;;; LDAP primitive functions. ;; ;; LDAP object is ;; (__ldap-object HOSTNAME PLIST) (defun ldapp (object) "Return t if OBJECT is a LDAP connection." (and (listp object) (eq (car object) '__ldap-object))) (defun ldap-open (host &optional plist) "Open a LDAP connection to HOST. PLIST is a plist containing additional parameters for the connection. Valid keys in that list are: `port' the TCP port to use for the connection if different from `ldap-default-port'. `auth' is the authentication method to use, possible values depend on the LDAP library: `simple', `krbv41' and `krbv42'. `binddn' is the distinguished name of the user to bind as (in RFC 1779 syntax). `passwd' is the password to use for simple authentication. `deref' is one of the symbols `never', `always', `search' or `find'. `timelimit' is the timeout limit for the connection in seconds. `sizelimit' is the maximum number of matches to return." (list '__ldap-object host plist)) (defun ldap-host (ldap) "Return the server host of the connection LDAP, as a string." (nth 1 ldap)) (defun ldap-close (_ldap) "Close an LDAP connection." t) (defun ldap-delete (ldap dn) "Delete an entry to an LDAP directory. LDAP is an LDAP connection object created with `ldap-open'. DN is the distinguished name of the entry to delete." (let* ((plist (or (nth 2 ldap) (cdr (assoc (ldap-host ldap) ldap-host-parameters-alist)))) (port (plist-get plist 'port)) (binddn (plist-get plist 'binddn)) (passwd (plist-get plist 'passwd)) arglist ret) (setq arglist (list (format "-h%s" (ldap-host ldap)))) (if (and port (not (equal 389 port))) (setq arglist (nconc arglist (list (format "-p%d" port))))) (if (and binddn (not (equal "" binddn))) (setq arglist (nconc arglist (list (format "-D%s" binddn))))) (if (and passwd (not (equal "" passwd))) (setq arglist (nconc arglist (list (format "-w%s" passwd))))) (with-temp-buffer (setq ret (apply 'call-process ldap-delete-program nil (current-buffer) t (append arglist (list dn)))) (cond ((integerp ret) (or (zerop ret) (error "%s" (car (split-string (buffer-string) "\n"))))) ((and (setq ret (buffer-string)); Nemacs (string-match "ldap_delete:" ret)) (error "%s" (car (split-string ret "\n")))))))) (defmacro ldap/ldif-insert-field (attr value) `(if (not (ldap/ldif-safe-string-p ,value)) (insert ,attr ":: " (base64-encode-string ,value) "\n") (insert ,attr ": " ,value "\n"))) (defun ldap-modify (ldap dn mods) "Add an entry to an LDAP directory. LDAP is an LDAP connection object created with `ldap-open'. DN is the distinguished name of the entry to modify. MODS is a list of modifications to apply. A modification is a list of the form (MOD-OP ATTR VALUE1 VALUE2 ...) MOD-OP and ATTR are mandatory, VALUEs are optional depending on MOD-OP. MOD-OP is the type of modification, one of the symbols `add', `delete' or `replace'. ATTR is the LDAP attribute type to modify." (let* ((plist (or (nth 2 ldap) (cdr (assoc (ldap-host ldap) ldap-host-parameters-alist)))) (port (plist-get plist 'port)) (binddn (plist-get plist 'binddn)) (passwd (plist-get plist 'passwd)) arglist ret) (setq arglist (list (format "-h%s" (ldap-host ldap)))) (if (and port (not (equal 389 port))) (setq arglist (nconc arglist (list (format "-p%d" port))))) (if (and binddn (not (equal "" binddn))) (setq arglist (nconc arglist (list (format "-D%s" binddn))))) (if (and passwd (not (equal "" passwd))) (setq arglist (nconc arglist (list (format "-w%s" passwd))))) (with-temp-buffer (ldap/ldif-insert-field "dn" dn) (insert "changetype: modify\n") (while mods (cond ((eq (nth 0 (car mods)) 'add) (insert "add: " (nth 1 (car mods)) "\n") (ldap/ldif-insert-field (nth 1 (car mods)) (nth 2 (car mods))) (insert "-\n")) ((eq (nth 0 (car mods)) 'delete) (insert "delete: " (nth 1 (car mods)) "\n-\n")) ((eq (nth 0 (car mods)) 'replace) (insert "replace: " (nth 1 (car mods)) "\n") (ldap/ldif-insert-field (nth 1 (car mods)) (nth 2 (car mods))) (insert "-\n"))) (setq mods (cdr mods))) (setq ret (apply 'call-process-region (point-min) (point-max) ldap-modify-program t t nil arglist)) (cond ((integerp ret) (or (zerop ret) (error "%s" (car (split-string (buffer-string) "\n"))))) ((and (setq ret (buffer-string)); Nemacs (string-match "ldap_modify:" ret)) (error "%s" (car (split-string ret "\n")))))))) (defun ldap-add (ldap dn entry) "Add an entry to an LDAP directory. LDAP is an LDAP connection object created with `ldap-open'. DN is the distinguished name of the entry to add. ENTRY is an entry specification, i.e., a list of cons cells containing attribute/value string pairs." (let* ((plist (or (nth 2 ldap) (cdr (assoc (ldap-host ldap) ldap-host-parameters-alist)))) (port (plist-get plist 'port)) (binddn (plist-get plist 'binddn)) (passwd (plist-get plist 'passwd)) arglist ret) (setq arglist (list (format "-h%s" (ldap-host ldap)))) (if (and port (not (equal 389 port))) (setq arglist (nconc arglist (list (format "-p%d" port))))) (if (and binddn (not (equal "" binddn))) (setq arglist (nconc arglist (list (format "-D%s" binddn))))) (if (and passwd (not (equal "" passwd))) (setq arglist (nconc arglist (list (format "-w%s" passwd))))) (with-temp-buffer (set-buffer-multibyte nil) (ldap/ldif-insert-field "dn" dn) (while entry (ldap/ldif-insert-field (car (car entry)) (cdr (car entry))) (setq entry (cdr entry))) (setq ret (apply 'call-process-region (point-min) (point-max) ldap-add-program t t nil arglist)) (cond ((integerp ret) (or (zerop ret) (error "%s" (car (split-string (buffer-string) "\n"))))) ((and (setq ret (buffer-string)) ; Nemacs (string-match "ldap_add:" ret)) (error "%s" (car (split-string ret "\n")))))))) (defun ldap-search-basic (ldap filter base scope &optional attrs attrsonly withdn verbose) "Perform a search on a LDAP server. (Use external program `ldapsearch') FILTER is a filter string for the search as described in RFC 1558. BASE is the distinguished name at which to start the search. SCOPE is one of the symbols `base', `onelevel' or `subtree' indicating the scope of the search. ATTRS is a list of strings indicating which attributes to retrieve for each matching entry. If nil return all available attributes. If ATTRSONLY is non-nil then only the attributes are retrieved, not the associated values. If WITHDN is non-nil each entry in the result will be prepended with its distinguished name DN. If VERBOSE is non-nil progress messages will be echoed. The function returns a list of matching entries. Each entry is itself an alist of attribute/value pairs optionally preceded by the DN of the entry according to the value of WITHDN." (let* ((plist (or (nth 2 ldap) (cdr (assoc (ldap-host ldap) ldap-host-parameters-alist)))) (port (plist-get plist 'port)) (base (or base (plist-get plist 'base) ldap-default-base)) (scope (or scope (plist-get plist 'scope))) (binddn (plist-get plist 'binddn)) (passwd (plist-get plist 'passwd)) (deref (plist-get plist 'deref)) (timelimit (plist-get plist 'timelimit)) (sizelimit (plist-get plist 'sizelimit)) start value attrs-result (i 0) result arglist ret) (setq arglist (list (format "-h%s" (ldap-host ldap)))) (if (and port (not (equal 389 port))) (setq arglist (nconc arglist (list (format "-p%d" port))))) (if (and base (not (equal "" base))) (setq arglist (nconc arglist (list (format "-b%s" base))))) (if (and scope (not (equal "" scope))) (setq arglist (nconc arglist (list (format "-s%s" (cond ((eq scope 'onelevel) "one") ((eq scope 'base) "base") ((eq scope 'subtree) "sub") ((null scope) "sub") (t (error "Invalid scope: %s" scope)))))))) (if (and binddn (not (equal "" binddn))) (setq arglist (nconc arglist (list (format "-D%s" binddn))))) (if (and passwd (not (equal "" passwd))) (setq arglist (nconc arglist (list (format "-w%s" passwd))))) (if (and deref (not (equal "" deref))) (setq arglist (nconc arglist (list (format "-a%s" deref))))) (if (and timelimit (not (equal "" timelimit))) (setq arglist (nconc arglist (list (format "-l%s" timelimit))))) (if (and sizelimit (not (equal "" sizelimit))) (setq arglist (nconc arglist (list (format "-z%s" sizelimit))))) (with-temp-buffer (set-buffer-multibyte nil) (setq ret (apply 'call-process ldap-search-program nil (current-buffer) t (append arglist ldap-search-program-arguments (list filter) attrs))) (if (and (integerp ret) (not (zerop ret)) ;; When openldap's `ldapsearch' exceeds response size limit, ;; it's exit status becomes `4'. (/= ret 4) ;; When openldap's `ldapsearch' uses referral, ;; it's exit status becomes `32'. (/= ret 32)) (error "LDAP error: \"No such object\"")) (goto-char (point-min)) (setq start (point)) (while (and (not (eobp)) (re-search-forward "^$" nil t)) ; empty line is a delimiter. (if verbose (message "Parsing ldap results...%d" (setq i (+ i 1)))) (save-excursion (save-restriction (narrow-to-region start (point)) (if attrs (setq attrs-result (delq nil (mapcar (lambda (attr) ;; dn is not an attribute. (unless (string= attr "dn") (if (setq value (ldap/field-body attr)) (if attrsonly (list attr) (nconc (list attr) value))))) attrs))) (setq attrs-result (ldap/collect-field "dn")) (if attrsonly (setq attrs-result (mapcar (lambda (x) (list (car x))) attrs-result)))) (setq result (cons (if withdn (if attrs-result (nconc (ldap/field-body "dn") attrs-result) (ldap/field-body "dn")) attrs-result) result)))) (if (not (eobp)) (forward-char)) (setq start (point))) (if verbose (message "Parsing ldap results...done")) (delq nil (nreverse result))))) (defun ldap/field-end () "Move to end of field and return this point." (if (re-search-forward ldap-ldif-next-field-head-regexp nil t) (goto-char (match-beginning 0)) (if (re-search-forward "^$" nil t) (goto-char (1- (match-beginning 0))) (end-of-line))) (point)) (defun ldap/field-body (name) "Return field body list of NAME." (save-excursion (goto-char (point-min)) (let ((case-fold-search t) (field-body nil) (regexp (concat "^" name "\\(;[a-zA-Z0-9-]+\\)?:[ \t]*")) body) ;; search for the line which have name with options. (while (re-search-forward regexp nil t) ;; Base64 (if (string-match "^:[ \t]*" (setq body (buffer-substring-no-properties (match-end 0) (ldap/field-end)))) (setq body (base64-decode-string (substring body (match-end 0))))) (setq field-body (nconc field-body (list body)))) field-body))) (defun ldap/collect-field (without) "Collect fields without WITHOUT." (goto-char (point-min)) (let ((regexp (concat "\\(" ldap-ldif-field-head-regexp "\\)[ \t]*")) dest name name-option body entry) (while (re-search-forward regexp nil t) ;; name with options. (setq name-option (split-string (downcase (buffer-substring-no-properties (match-beginning 1) (1- (match-end 1)))) ";")) ;; XXX options are discarded. (setq name (car name-option)) (setq body (buffer-substring-no-properties (match-end 0) (ldap/field-end))) (if (string-match "^:[ \t]*" body) (setq body (base64-decode-string (substring body (match-end 0))))) (unless (string= name without) (if (setq entry (assoc name dest)) (nconc entry (list body)) (setq dest (cons (list name body) dest))))) (nreverse dest))) ;;; Coding/decoding functions ;; (defun ldap-encode-boolean (bool) "Encode BOOL to LDAP type." (if bool "TRUE" "FALSE")) (defun ldap-decode-boolean (str) "Decode STR to elisp type." (cond ((string-equal str "TRUE") t) ((string-equal str "FALSE") nil) (t (error "Wrong LDAP boolean string: %s" str)))) (defun ldap-encode-country-string (str) "Encode STR to LDAP country string." ;; We should do something useful here... (if (not (= 2 (length str))) (error "Invalid country string: %s" str))) (defun ldap-decode-string (str) "Decode LDAP STR." (if ldap-coding-system (decode-coding-string str ldap-coding-system) str)) (defun ldap-encode-string (str) "Encode LDAP STR." (if ldap-coding-system (encode-coding-string str ldap-coding-system) str)) (defun ldap-decode-address (str) "Decode LDAP address STR." (mapconcat 'ldap-decode-string (split-string str "\\$") "\n")) (defun ldap-encode-address (str) "Encode address STR to LDAP type." (mapconcat 'ldap-encode-string (split-string str "\n") "$")) ;;; LDAP protocol functions ;; (defun ldap-get-host-parameter (host parameter) "Get HOST's PARAMETER in `ldap-host-parameters-alist'." (plist-get (cdr (assoc host ldap-host-parameters-alist)) parameter)) (defun ldap-encode-attribute (attr) "Encode the attribute/value pair ATTR according to LDAP rules. The attribute name is looked up in `ldap-attribute-syntaxes-alist' and the corresponding decoder is then retrieved from `ldap-attribute-syntax-encoders' and applied on the value(s)." (let* ((name (car attr)) (values (cdr attr)) (syntax-id (cdr (assq (intern (downcase name)) ldap-attribute-syntaxes-alist))) encoder) (if syntax-id (setq encoder (aref ldap-attribute-syntax-encoders (1- syntax-id))) (setq encoder ldap-default-attribute-encoder)) (if encoder (cons name (mapcar encoder values)) attr))) (defun ldap-decode-attribute (attr) "Decode the attribute/value pair ATTR according to LDAP rules. The attribute name is looked up in `ldap-attribute-syntaxes-alist' and the corresponding decoder is then retrieved from `ldap-attribute-syntax-decoders' and applied on the value(s)." (if (consp attr) (let* ((name (car attr)) (values (cdr attr)) (syntax-id (cdr (assq (intern (downcase name)) ldap-attribute-syntaxes-alist))) decoder) (if syntax-id (setq decoder (aref ldap-attribute-syntax-decoders (1- syntax-id))) (setq decoder ldap-default-attribute-decoder)) (if decoder (cons name (mapcar decoder values)) attr)) attr)) (defun ldap-search (arg1 &rest args) "Perform an LDAP search.if ARG1 is LDAP object, invoke `ldap-search-basic'. Otherwise, invoke `ldap-search-entries'. ARGS are passed to each function." (apply (if (ldapp arg1) 'ldap-search-basic 'ldap-search-entries) arg1 args)) (make-obsolete 'ldap-search "Use `ldap-search-entries' instead or `ldap-search-basic' for the low-level search API." "15 Jun 2000 at latest") (defun ldap-search-entries (filter &optional host attributes attrsonly withdn) "Perform an LDAP search. FILTER is the search filter in RFC1558 syntax, i.e., something that looks like \"(cn=John Smith)\". HOST is the LDAP host on which to perform the search. ATTRIBUTES is a list of attributes to retrieve; nil means retrieve all. If ATTRSONLY is non nil, the attributes will be retrieved without the associated values. If WITHDN is non-nil each entry in the result will be prepennded with its distinguished name DN. Additional search parameters can be specified through `ldap-host-parameters-alist' which see. The function returns a list of matching entries. Each entry is itself an alist of attribute/value pairs optionally preceded by the DN of the entry according to the value of WITHDN." (interactive "sFilter:") (or host (setq host ldap-default-host) (error "No LDAP host specified")) (let ((host-plist (cdr (assoc host ldap-host-parameters-alist))) ldap result) (if ldap-verbose (message "Opening LDAP connection to %s..." host)) (setq ldap (ldap-open host host-plist)) (if ldap-verbose (message "Searching with LDAP on %s..." host)) (setq result (ldap-search-basic ldap (ldap-encode-string filter) (plist-get host-plist 'base) (plist-get host-plist 'scope) attributes attrsonly withdn ldap-verbose)) (ldap-close ldap) (with-temp-buffer (set-buffer-multibyte nil) (if ldap-ignore-attribute-codings result (mapcar (lambda (record) (mapcar 'ldap-decode-attribute record)) result))))) (defun ldap-add-entries (entries &optional host binddn passwd) "Add entries to an LDAP directory. ENTRIES is a list of entry specifications of the form (DN (ATTR . VALUE) (ATTR . VALUE) ...) where DN is the distinguished name of an entry to add, the following are cons cells containing attribute/value string pairs. HOST is the LDAP host, defaulting to `ldap-default-host' BINDDN is the DN to bind as to the server PASSWD is the corresponding password" (or host (setq host ldap-default-host) (error "No LDAP host specified")) (let ((host-plist (cdr (assoc host ldap-host-parameters-alist))) ldap (i 1)) (if (or binddn passwd) (setq host-plist (copy-sequence host-plist))) (if binddn (setq host-plist (plist-put host-plist 'binddn binddn))) (if passwd (setq host-plist (plist-put host-plist 'passwd passwd))) (if ldap-verbose (message "Opening LDAP connection to %s..." host)) (setq ldap (ldap-open host host-plist)) (if ldap-verbose (message "Adding LDAP entries...")) (mapc (lambda (thisentry) (setcdr thisentry (mapcar (lambda (add-spec) (setq add-spec (ldap-encode-attribute (list (car add-spec) (cdr add-spec)))) (cons (nth 0 add-spec) (nth 1 add-spec))) (cdr thisentry))) (setq thisentry (ldap-encode-attribute thisentry)) (ldap-add ldap (car thisentry) (cdr thisentry)) (if ldap-verbose (message "%d added" i)) (setq i (1+ i))) entries) (ldap-close ldap))) (defun ldap-modify-entries (entry-mods &optional host binddn passwd) "Modify entries of an LDAP directory. ENTRY-MODS is a list of entry modifications of the form \(DN MOD-SPEC1 MOD-SPEC2 ...\) where DN is the distinguished name of the entry to modify, the following are modification specifications. A modification specification is itself a list of the form \(MOD-OP ATTR VALUE1 VALUE2 ...\) MOD-OP and ATTR are mandatory, VALUEs are optional depending on MOD-OP. MOD-OP is the type of modification, one of the symbols `add', `delete' or `replace'. ATTR is the LDAP attribute type to modify. HOST is the LDAP host, defaulting to `ldap-default-host' BINDDN is the DN to bind as to the server PASSWD is the corresponding password" (or host (setq host ldap-default-host) (error "No LDAP host specified")) (let ((host-plist (cdr (assoc host ldap-host-parameters-alist))) ldap (i 1)) (if (or binddn passwd) (setq host-plist (copy-sequence host-plist))) (if binddn (setq host-plist (plist-put host-plist 'binddn binddn))) (if passwd (setq host-plist (plist-put host-plist 'passwd passwd))) (if ldap-verbose (message "Opening LDAP connection to %s..." host)) (setq ldap (ldap-open host host-plist)) (if ldap-verbose (message "Modifying LDAP entries...")) (mapc (lambda (thisentry) (setcdr thisentry (mapcar (lambda (mod-spec) (if (or (eq (car mod-spec) 'add) (eq (car mod-spec) 'replace)) (append (list (nth 0 mod-spec)) (ldap-encode-attribute (cdr mod-spec))))) (cdr thisentry))) (ldap-modify ldap (car thisentry) (cdr thisentry)) (if ldap-verbose (message "%d modified" i)) (setq i (1+ i))) entry-mods) (ldap-close ldap))) (defun ldap-delete-entries (dn &optional host binddn passwd) "Delete an entry from an LDAP directory. DN is the distinguished name of an entry to delete or a list of those. HOST is the LDAP host, defaulting to `ldap-default-host' BINDDN is the DN to bind as to the server PASSWD is the corresponding password." (or host (setq host ldap-default-host) (error "No LDAP host specified")) (let ((host-plist (cdr (assoc host ldap-host-parameters-alist))) ldap) (if (or binddn passwd) (setq host-plist (copy-sequence host-plist))) (if binddn (setq host-plist (plist-put host-plist 'binddn binddn))) (if passwd (setq host-plist (plist-put host-plist 'passwd passwd))) (if ldap-verbose (message "Opening LDAP connection to %s..." host)) (setq ldap (ldap-open host host-plist)) (if (consp dn) (let ((i 1)) (if ldap-verbose (message "Deleting LDAP entries...")) (mapc (lambda (thisdn) (ldap-delete ldap thisdn) (if ldap-verbose (message "%d deleted" i)) (setq i (1+ i))) dn)) (if ldap-verbose (message "Deleting LDAP entry...")) (ldap-delete ldap dn)) (ldap-close ldap))) (provide 'pldap) ;;; pldap.el ends here wanderlust-wanderlust-769699d/elmo/slp.el000066400000000000000000000106431406661363500204650ustar00rootroot00000000000000;;; slp.el --- An SLP interface. -*- lexical-binding: t -*- ;; Author: Yuuichi Teranishi ;; Keywords: SLP ;; Copyright (C) 2001 Yuuichi Teranishi ;; This file is not part of GNU Emacs ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;; slp.el is an elisp library providing an interface for SLP (RFC2614) ;; using OpenSLP(http://www.openslp.org/) slptool . ;; ;;; History: ;; 28 Aug 2001 Created. ;;; Code: (require 'cl-lib) (defgroup slp nil "Interface for `Service Location Protocol'." :group 'comm) (defcustom slp-program "slptool" "SLP client program (OpenSLP's slptool)." :type 'string :group 'slp) (defcustom slp-program-arguments nil "Option argument for SLP client program." :type '(repeat string) :group 'slp) (defun slp-exec-wait (type &rest args) "Synchronous execution of slp-program. TYPE is a symbol (one of `srvs', `attrs', `srvtypes', `as-is', `ignore')." (with-temp-buffer (let ((result (apply 'call-process slp-program nil t nil (append slp-program-arguments (delq nil args))))) (unless (zerop result) (error "SLP error: %s" (buffer-string))) (goto-char (point-min)) (cl-case type (srvs (slp-parse-srvs)) (attrs (slp-parse-attrs)) (srvtypes (slp-parse-srvtypes)) (as-is (buffer-string)))))) ;; Response parser. (defun slp-parse-srvs () (let (srvtype hostport host port lifetime srvs) (while (and (not (eobp)) (looking-at "service:\\([^:]+\\):/[^/]*/\\([^,]+\\),\\([0-9]+\\)")) (setq srvtype (match-string 1) hostport (match-string 2) lifetime (string-to-number (match-string 3))) (if (string-match ":\\([0-9]+\\)" hostport) (setq host (substring hostport 0 (match-beginning 0)) port (string-to-number (match-string 1 hostport))) (setq host hostport port nil)) (push (cons (list srvtype host port) lifetime) srvs) (forward-line)) (list 'srvs (nreverse srvs)))) (defsubst slp-forward () (or (eobp) (forward-char))) (defun slp-parse-attr () (when (looking-at "(\\([^=]+\\)=\\([^)]+\\))") (prog1 (cons (match-string 1) (match-string 2)) (goto-char (match-end 0))))) (defun slp-parse-attrs () (let (attrs) (push (slp-parse-attr) attrs) (while (eq (following-char) ?,) (slp-forward) (push (slp-parse-attr) attrs)) (list 'attrs (nreverse attrs)))) (defun slp-parse-srvtypes () (let (types) (while (not (eobp)) (when (looking-at "^service:\\([^/\n]+\\)$") (push (buffer-substring (match-beginning 1) (match-end 1)) types)) (forward-line)) (list 'srvtypes (nreverse types)))) ;; Response accessor. (defsubst slp-response-type (response) (nth 0 response)) (defsubst slp-response-body (response) (nth 1 response)) (defsubst slp-response-srv-url-service-type (srv) (nth 0 (car srv))) (defsubst slp-response-srv-url-host (srv) (nth 1 (car srv))) (defsubst slp-response-srv-url-port (srv) (nth 2 (car srv))) (defsubst slp-response-srv-lifetime (srv) (cdr srv)) ;; Commands (defun slp-findsrvs (service-type &optional filter) (slp-exec-wait 'srvs "findsrvs" service-type filter)) (defun slp-findattrs (url &rest attrids) (apply 'slp-exec-wait 'attrs "findattrs" url attrids)) (defun slp-findsrvtypes (&optional authority) (slp-exec-wait 'srvtypes "findsrvtypes" authority)) (defun slp-findscopes () (slp-exec-wait 'as-is "findscopes")) (defun slp-register (url &optional attrs) (slp-exec-wait 'ignore "register" url (mapconcat (lambda (pair) (format "(%s=%s)" (car pair) (cdr pair))) attrs ","))) (defun slp-deregister (url) (slp-exec-wait 'ignore "deregister" url)) (defun slp-getproperty (propertyname) (slp-exec-wait 'as-is "getproperty" propertyname)) (provide 'slp) ;;; slp.el ends here wanderlust-wanderlust-769699d/etc/000077500000000000000000000000001406661363500171605ustar00rootroot00000000000000wanderlust-wanderlust-769699d/etc/ChangeLog.1.ja000066400000000000000000002675031406661363500214770ustar00rootroot000000000000001998-12-02 Yuuichi Teranishi * 0.8.8 - "Veronica" * news 記事をキャンセルするときも wl-mail-send-pre-hook を呼ぶ ようにした。 * im-wl.el の非同期 imput を使っている場合 news 記事を キャンセルできなかったのを修正。 * Summary で 'E' reedit したとき、draft のバッファが read-only に なってしまう場合がある問題に対処。 (神嶌さん より御指摘。) * 閉じたスレッドを削除したときにその子どもが行方不明になるのを 修正(神嶌さん より御指摘。) * wl-mail-send-pre-hook の呼ばれ方を変更。 im-wl.el で imput を使う場合と elisp 版の場合でバッファの状態が 同じになるようにした。 1998-12-01 Yuuichi Teranishi * 変数 wl-insert-message-id がまるっきり無視されていたのを修正。 1998-12-01 Masahiro MURATA (村田全寛) * update all でサマリを作り直すとき,スレッドの親より子が若い番 号だと,子がサマリに表示されないのを修正した。 * wl-thread-insert-entity, wl-thread-update-line-on-buffer wl-thread-entity-get-children-num, wl-thread-entity-get-children-msgs wl-thread-entity-check-next-mark,wl-thread-entity-check-prev-mark wl-thread-entity-check-next-mark-from-younger-brother wl-thread-entity-check-prev-mark-from-older-brother 以上の関数を再帰的に呼び出さないよう修正。 * 紛らわしい一時変数の名前を修正 (num -> len, number -> num)。 * nntp (not xover) で新規メッセージに "N" マークがつかないのを修正。 * wl-auto-select-next が t のときにサマリ内を移動しても "Updated (-0/+1) message(s)" などの表示を消さないようにした。 1998-11-30 Yuuichi Teranishi * msgdb に 最後の message-id しか保存しないようにした。 * wl-summary-weekday-name-lang が実は反映されていなかったのを修正。 * 0.8.7 - "Union Of The Snake" * pack で、未読マークを保存するようにした。 * elmo-set-work-buf のマクロが mule-2.3@19.28 で動かないのを修正。 1998-11-30 IMAI Takeshi * wl-highlight-body-tooがnilの時は、ドラフトの body もハイライトし ないようにした。 1998-11-30 Yuuichi Teranishi * [elmo]elmo-localdir-msgdb-create-overview-entity-from-file 中の insert-file-contents で起こるエラーを無視するようにした。 (岡田さん より御指摘。) * wl-summary-mark-collect が、閉じたスレッドでメッセージを重複して 集めてしまうため、削除時にスレッドがおかしくなることがあるのを修正。 1998-11-29 OKUNISHI Fujikazu * local[dir|news] だけ pack をサポート。 1998-11-29 Masahiro MURATA (村田全寛) * wl-thread-insert-entity, wl-thread-update-line-on-buffer, wl-thread-entity-check-prev-mark, wl-thread-entity-check-next-mark の各関数で再帰的に binding さ れるローカル変数を削減した。 * wl-summary.el と wl-thread.el のバイトコンパイル時のメッセージ を削減した(ローカル変数の整理をした)。 * timezone-fix-time でエラーが起こってもサマリを作成できるように した。 * 複数メッセージでのスレッドアップデートとスレッド削除の高速化を 行った。 * サマリ情報がない場合 wl-summary-buffer-msgdb が '(nil nil nil nil) になることが反映されていなかったのを反映した。 * wl-summary-sync の update all で古い entity 情報が残ってしまう のを修正した。wl-thread-entities が nil に set されていなかっ たため。 * elmo-util.el と wl-util.el の関数で個別にバッファを作っていたの を1つにまとめて高速化した。 * sample.dot.wl を更新した。wl-highlight-group-folder-by-numbers の追加と,my-wl-summary-from-func-petname のバグ修正。 1998-11-29 Yuuichi Teranishi * wl-ja.texi に加筆・修正。 * [elmo] localdir, archive, pop3, nntp の各マーク生成部分で seen-list を利用するよう修正。 * sync-all, sync-update で前の未読状態を引き継ぐようにした。 * [elmo] elmo-msgdb-create の引数に seen-list を追加。 1998-11-28 OKUNISHI Fujikazu * elmo-call-func の変更のため、起動時にarchive フォルダの フォルダチェックに失敗するようになってしまったのを修正。 1998-11-28 Yuuichi Teranishi * 新規変数 wl-summary-weekday-name-lang。デフォルトは "ja"。 * wl-summary-wday-use-japanese -> 廃止。 * [elmo] elmo-plugged が 2 回 defvar されていたのを修正 (寺田さん より御指摘。) 1998-11-27 Masayuki TERADA * [elmo] elmo-folder-identical-system-p のロジックが錯綜していたの を改善。 1998-11-27 Masahiro MURATA (村田全寛) * wl-interactive-exit が t のとき,終了確認で n と答えてから再度 M-x wl を実行すると,デモ画面がでて初期化が実行されてしまうのを 修正。 1998-11-27 Teruki SHIGITANI * elmo-date がインストーラに入っていなかったのを修正。 1998-11-27 Yuuichi Teranishi * 0.8.6 - "True Colors" * localdir, imap4 は since と before で日付検索できるようにした。 (北目さん の御要望に基づく)。 * 日付け処理モジュール用新規ファイル elmo-date.el を追加。 * スレッドが削除されたとき、スレッドトップのリストが正しくなくなる のを修正 (村田さん より御指摘)。 * elmo-localdir-copy-msgs に (require 'elmo-archive) を追加。 (寺田さん より御指摘。) 1998-11-27 Masahiro MURATA (村田全寛) * elmo-call-func で elmo-folder-get-spec が無駄に呼ばれていたのを 修正。 * .folders の頭につけていたフォルダタイプの説明を削除。 1998-11-26 Shun-ichi GOTO * elmo-read-passwd で prompt に '%' が含まれているとエラーになる のを修正。 1998-11-26 Yuuichi Teranishi * スレッド構造のセーブにかかる時間を短縮。 → セーブ時にいちいち obarray からセーブするlist を生成するのをやめ、 スレッド木構造のノードのリストをバッファローカル変数に保持すること にした。 * 閉じたスレッドに隠されたメッセージの処理が実行されないバグを修正。 * pick できないバグを修正。 1998-11-25 Yuuichi Teranishi * 0.8.5 - "Sussudio" * IMAP4 で RFC822 のパートが巨大でスキップされた場合に mime-entity の body-start と body-end が取れなくてエラーになるのを修正。 * 同じ Message-ID のメッセージが複数あるときにそのうち一つを削除 すると Summary がおかしくなるのを修正。 * Folder モードで 'rc' を押すと 'c' をリージョン実行するようにした。 * Folder モードで 'c' を押すと、全部読んだことにするようにした。 (岡田さん より御要望) * 村田さんによるいくつかの変更を反映し忘れていたのを反映 (村田さん より御指摘)。 1998-11-25 Shun-ichi GOTO * 関数 elmo-pop3-get-connection に新しい引数 authを追加。 * 関数 elmo-pop3-open-connection に新しい引数 authを追加。 * 新規関数 elmo-pop-make-apop-digest を追加。 * 新規変数 elmo-default-pop3-authenticate-type (デフォルトの認証方法)。 * 関数 elmo-pop3-open-connection にて、APOPコマンドによる認証のための コードを追加。 * POP フォルダの書式を user[/auth]@host[:port] とした。 * [elmo-pop3] APOP 対応。 1998-11-24 Yuuichi Teranishi * 0.8.4 - "Rosanna" * 'mo' 'mO' でマークがないとき先頭にマークがついてしまうのを修正。 * スレッドがまだうまく削除できてなかったのを修正。 (津邑さん の御指摘) * "#" はやっぱりまずいので pop3 のフォルダ文字を "&" に変更。 (後藤さんShun-ichi GOTO の御指摘)。 1998-11-24 Shun-ichi GOTO * POP3 はセッション中に新着メールを検出する機能がないため scan: update しても新着が現れない対策として list時には強制的に一度セッションを切るようにした。 1998-11-24 Yuuichi Teranishi * 0.8.3 - "Pop Life" * スレッドがうまく削除できないバグを修正。 * elmo-maildir.el がインストールされないのを修正。 * 0.8.2 - "Open Arms" 1998-11-23 Yuuichi Teranishi * ローカルニュースのパスのデリミタは "." でもよいことにした。 1998-11-23 OKUNISHI Fujikazu * ローカルニュース、'=' のサポート。 1998-11-23 Yuuichi Teranishi * update 時にエラーがあると Summary が modified になってしまうのを 修正。 * XEmacs でアクセスグループに含まれる自分自身のアイコンが 表示されないバグを修正。 1998-11-22 Yuuichi Teranishi * wl-thread-{open|close}-all で処理の進捗を表示するようにした。 * スレッドの入れ子管理をやめ、スレッド構造の検索には obarray (hashtable) を使うようにした。 (後藤さん Shun-ichi GOTO の御助言に基づく) * wl-thread-jump-to-next-unread の hereto がうまく動かない場合が あったのを修正。 * elmo-pop3.el を実装。(フォルダ文字は "#" とした。) (後藤さん Shun-ichi GOTO の御助言に基づく) 1998-11-21 Masahiro MURATA (村田全寛) * [typo] wl-draft-enable-queueing -> wl-draft-enable-queuing。 * [typo] wl-interacitve-save-folders -> wl-interactive-save-folders。 * [wl-ja.texi] x-face-mule の設定例を修正。 1998-11-21 OKUNISHI Fujikazu * [wl-ja.texi] 補間 -> 補完。 1998-11-21 Yuuichi Teranishi * elmo-maildir の追加に伴う変更多数。 * 新規ファイル elmo-maildir.el。 * 新規変数 elmo-maildir-list。マッチする localdir フォルダは Maildir として扱う。 1998-11-20 OKUNISHI Fujikazu * sample.dot.wl で msgdb に jka-compr を利用する例を追加。 1998-11-19 Susumu Wakabayashi * ドキュメントの文章でいくつかまるが抜けていたのを修正。 1998-11-18 Masahiro MURATA (村田全寛) * 新規ファイル sample.dot.wl。 1998-11-17 Yuuichi Teranishi * elmo-cache-expire-by-size が mule-2.3@19.28 でも動くようにした。 * ハイライトのデフォルト設定は wl-highlight-background-mode の値を見る ようにした(Takehama Hirohisa さん、 元木さん の御意見に基づく)。 * 新規変数 wl-highlight-background-mode。 * 新規変数 wl-highlight-group-folder-by-numbers。 * グループフォルダを、メッセージの数に応じて色を変えられるように した(大澤さん 、 元木さん より御要望)。 1998-11-16 Hidekazu NAKAMURA * wl-summary-exit するときに Message バッファを kill するよう にした。 1998-11-16 Masahiro MURATA (村田全寛) * wl-delete-folder-alist の docstring の間違いを修正。 1998-11-16 Masahiro MURATA (村田全寛) * summary の update 時に important mark の付いたメッセージが既に 存在しないと,サマリから消えてしまうのを修正した。 * メッセージを削除したときのポリシーをユーザが変更できるようにし た。 1998-11-15 Yuuichi Teranishi * Message バッファが modified になってしまうのを修正。 1998-11-14 Yuuichi Teranishi * スレッドが closed なとき prefetch に失敗するのを修正。 * スレッドの prefetch 時、メッセージ数がおかしかったのを修正。 * [elmo-archive] elmo-archive-get-archive-name で、存在しない フォルダのときに期待されるファイル名が返って来ないのを修正。 (奥西さん の御指摘) 1998-11-14 OKUNISHI Fujikazu * typo fix elmo-funcall() -> elmo-call-func()。 * ディレクトリを掘る前に同名のファイルが存在するかを真面目に チェック。 * [elmo-archive] 頻繁に呼ばれない関数は defun に戻した。 1998-11-12 Masahiro MURATA (村田全寛) * elmo-localdir.el, elmo-imap4.el, elmo-nntp.el が起動時から load されないようにした。 * nntpフォルダが1つもなくても起動時に elmo-nntp.el が load され るのを修正した。 * `wl-summary-prepared-hook' を追加。 1998-11-10 Yuuichi Teranishi * 0.8.1 - "Nasty" 1998-11-09 Yuuichi Teranishi * wl-toggle-plugged で modeline が不正確な表示になってしまう場合 があるのを修正。 * ps-print.el が無い環境用の新規変数 wl-print-message-func。 wl-summary-print-message->wl-summary-print-message-with-ps-print。 1998-11-09 Masahiro MURATA (村田全寛) * unplugged な状態で local フォルダのみのグループをチェックする と,チェック後に "Unplugged." のメッセージが出るのを修正。 1998-11-09 OKUNISHI Fujikazu * MsgDB が vector 化されたのに elmo-archive-parse-mmdf() が対 応してなかった(OS/2 で 'zip な場合に msgdb 作成中にこける) 不具合を修正。 1998-11-08 Yuuichi Teranishi * unplugged なときはスレッドビューでも wl-summary-cursor-down で cache されているメッセージに飛ぶようにした (樽石さんの御指摘)。 * [elmo] autoload 化。 * [elmo] elmo-call-func で featurep でない backend を require するようにした(村田さん の御助言 に基づく)。 1998-11-06 Yuuichi Teranishi * WL-ELS を 0.7.4 の状態に戻した。 * elmo-enable-disconnected-operation が nil のときの 不具合をいくつか修正(樽石さん、 村田さん より御指摘) 1998-11-05 武田 芳信 * wl-summary-print-message (with ps-print)。 1998-11-05 Yuuichi Teranishi * [im-wl] imput プロセスの非同期化。 1998-11-05 Masahiro MURATA (村田全寛) * rassq -> rassoc。 * wl-summary-reedit(wl-draft-reedit) がinteger化により動かなく なったのを修正。 1998-11-04 Masahiro MURATA (村田全寛) * nntp (not xover) がinteger化に対応していなかったのを修正。 1998-11-04 Yuuichi Teranishi * 相変わらず easymenu の関数が見付からずエラーになる場合があるので (require 'easymenu) を wl-folder.el に追加(take@isl.ntt.co.jp より御指摘)。 * reply に失敗するバグを修正。 * 0.8.0 - "Manic Monday" * WL-ELS で mime-setup の require に失敗したら、mail-mime-setup も 試すようにした。(村田さん より御指摘) 1998-11-03 Yuuichi Teranishi * 新規関数 elmo-msgdb-overview-entity-get-extra-field。 * 新規変数 elmo-msgdb-extra-fields。 * '*' マークがビューキャッシュに残ってしまうバグを修正。 * バッファから overview を生成する関数を一つにまとめた。 * overview を vector 化。 1998-11-02 Masahiro MURATA (村田全寛) * [fldmgr] access タイプ以外のグループには petname が付けられな いようにした。 * [fldmgr] アクセスグループを変更して削除した後にセーブすると, そのアクセスグループのリストが空になるのを修正した。 * [fldmgr] append をできるかぎり nconc に置き換えた。 * wl-folder-access-info-alist を wl-folder-entity に統合させた。 * new command `wl-folder-open-unread-current-entity', `wl-folder-open-only-unread-folder'. * wl-folder-open-all-unread-folder, wl-folder-open-all, wl-folder-close-all の各コマンドを実行しても,カーソルを元あっ た entity,もしくは親 entity の位置に戻すようにした。 * wl-folder-reconstruct-entity-alist で id を振り直すと,バッファ 上の id と変数の id が異なってしまうのを修正した。 * wl-folder-exit で終了するとき,主な変数は nil に初期化するよう にした。 * draft での補完で候補が1つに決まれば候補リストのバッファウィン ドウを消すようにした。また,候補が1画面に収まらないときはスク ロールするようにした。 1998-11-30 Yuuichi Teranishi * [elmo] imap4, multi, dop の msg-num も integer 化。 1998-10-29 OKUNISHI Fujikazu * [wl-*, elmo-*] msg-num の integer 化。 * [wl-*, elmo-*. smtp.el] integer, symbol の比較を eq, memq, assq, rassq でおこなう。 * [elmo-archive] macro の記述位置を前の方に移動。 1998-10-29 Yuuichi Teranishi * [elmo] オフライン・バーチャル(imap4 のみ...)。 * [elmo] オフライン・フォルダ生成。 1998-10-28 Yuuichi Teranishi * 0.7.4 - "Luka" 1998-10-27 Yuuichi Teranishi * wl-ja.texi の文字コードを JIS にした。 * [elmo] オフライン・リファイル/コピー。 * 同じフォルダへのリファイル/コピーを禁止した。 * unplugged で 'i' (prefetch) するとサマリがおかしくなるのを修正。 * burst を実装。 * [elmo] FLIM では (require 'mel-b) するのをやめ、 mel-find-function で base64 decoder を見つけるようにした。 1998-10-26 Yuuichi Teranishi * bbdb-wl.el で、bbdb-user-mail-names が効いてるときに To に encoded-word があるとまずいのを修正。 1998-10-26 Masahiro MURATA (村田全寛) * [elmo] wl-match-buffer->elmo-match-buffer. 1998-10-25 Masahiro MURATA (村田全寛) * elmo-nntp.el の typo 修正。 1998-10-25 Yuuichi Teranishi * wl-ja.texi に加筆/修正。 * wl-generate-mailer-string-func の default を 'wl-generate-user-agent-string にした。 * Folder 'F' -- キューにあるメッセージを送信。 * 新規変数 wl-auto-flush-queue トグルしたときに自動的にキューを送る。 * 新規変数 wl-draft-enable-queueing。offline なら送信をキューイング。 * オフラインメッセージ送信。 * Folder で'ゴミ箱を空に'したあと、サマリがおかしくなるのを修正。 1998-10-24 TSUMURA Tomoaki * bbdb-wl.el で、bbdb-user-mail-names が効くようにした。 1998-10-24 OKUNISHI Fujikazu * elmo-archive.el で 'tgz 以外では読めなくなってたのを修正。 1998-10-24 Masahiro MURATA (村田全寛) * 多数のニュースグループフォルダのチェック処理を大幅に高速化した。 * 変数 `wl-folder-newsgroups-alist' を配列(vector) `wl-folder-newsgroups-hashtb' に変更した。 * [elmo-nntp] xover に対応していないニュースサーバでも overview 情報が取得出来るようにした。 * wl-match-buffer を elmo-match-buffer に変えて,wl-match-buffer はその alias とした。また,elmo-match-string を新規作成し, wl-match-string はその alias とした。 * wl-make-hash, wl-get-hash-val, wl-set-hash-val を elmo に移し, wl の関数名はそれぞれ elmo の対応する関数の alias とした。 * elmo-msgdb-get-field-value が2度 narrow-to-region するので, SEMI の場合に std11-fetch-field があるならそれを使うようにした。 1998-10-24 Yuuichi Teranishi * wl-use-semi の default を (module-installed-p 'mime-view) にした。 * wl-from の default を user-mail-address にした。 * 開始時に wl-plugged が nil ならオフライン状態から開始 するようにした。 * view-cache のセーブ時に一時的マークを消すようにした。 * Summary に未処理の refile, delete, copy のマークがあるのに 終了しようとした場合は処理するかどうか確認するようにした。 (村田さん より御助言) 1998-10-22 OKUNISHI Fujikazu * [elmo] localdir をちょっとだけ高速化。 1998-10-20 Yuuichi Teranishi * 0.7.3 - "Kyrie" * access フォルダのフォルダ情報ファイルの old compatibility のチェック部分(?)を修正。 * wl-thread-jump-to-prev-unread を実装。 * +foo と +foo/ が共存できない問題を修正。 1998-10-19 Yuuichi Teranishi * wl-ja.texi に加筆。 * User-Agent フィールドの生成は関数 wl-generate-user-agent-string 内で のみ行なうようにした。mime-edit-insert-user-agent-field が t なら mime-edit-user-agent-value の値を使う。 * マルチフォルダでメッセージが減ったときにスレッド構造がおかしくなる ことがあったのを修正。 * 閉じたスレッドのアップデート時にハイライトがおかしかったを修正。 * [elmo] mmelmo-imap4 バックエンドがメソッド content-entity でエラーを発生する場合があるのを修正。 1998-10-18 OKUNISHI Fujikazu * eq で済むところ(symbol の比較)まで equal が使われてたのが 目立ったので、明らかに symbol の比較とわかるところを置換した。 * wl-folder-accessible-p() に 'archive を加えた。 * wl-ja.texi のアーカイブフォルダ部の記述の修正。 1998-10-18 Masahiro MURATA (村田全寛) * fldmgr で各種操作を行うと,グループの未読数/総数を反映するよう にした。 * fldmgr でグループの追加をした際,wl-folder-entity-id-name-alist にグループの entity が追加されないのを修正した。 * wl-folder-entity-alist を finfo を使って復元させるとき,同じ entity が複数あると1つしか復元されないのを修正した。 * グループの未読数を反映する際,グループが下の階層にあって表示さ れていない場合,Desktop グループに多重に未読数が追加されるのを 修正した。 * wl-fldmgr.el のコードの refine (equal->eq 等を含む)。 1998-10-16 Yuuichi Teranishi * [elmo] capability のチェックが XEmacs 以外でうまく動かず、 IMAP4rev1 でも IMAP4 と勘違いするようになっていたため、 References を使ったスレッド化が XEmacs 以外で動かなくなって しまっていたのを修正。 * [fldmgr] フォルダのセーブ時、.folders が存在しないとき、 .bak に rename-file しようとしてエラーになるのを修正。 * convert-standard-filename でファイル名に使えない文字を置き換える ようにした。Mule for Win32 へは独自に対応。 * [elmo] ネットワークプロセスの process-status が 'exit のときも コネクションを張りなおすようにした。 1998-10-14 Yuuichi Teranishi * [elmo] XEmacs 21.2 で backspace などの event キーの一部を char として読めるようにするコードを x-pgp-sig からパクらせて いただいた。 1998-10-13 Yuuichi Teranishi * 0.7.2 - "Joanna" * [elmo] RFC1730 でもそこそこ動くようにした。 * カレントフォルダのハイライトの regexp 修正。 * XEmacs のパッケージとしてインストールできるようにした。 (make package; make install-package) * easymenu は require するようにした。 1998-10-12 Masahiro MURATA (村田全寛) * wl-folder-open-folder が正常に動作しなくなったのを修正した。 * wl-folder-unread-regex の引数 group が nil の動作が変わったの を修正した。 * wl-folder-move-cur-folder が non-nil の時の動作が変わったのを 修正した。 * 同じ entity が複数あった場合,wl-folder-update-unread では wl-folder-entity-alist やグループの表示数が1つの entity しか更 新されないのを修正した。 1998-10-12 Yuuichi Teranishi * Folder チェック時に未読数の更新がおかしかったのを修正 * wl-thread- 系のコマンドで最後のメッセージが処理されなくなって しまったのを修正。(津邑さん の御指摘) * 0.7.1 - "In Too Deep" 1998-10-11 Yuuichi Teranishi * [elmo-archive.el] フォルダの最後が "/" だと .folders に 書けないのでフォルダの第 3 スペック (書庫内のパス情報)の末尾に "/" をつけなくてもよいようにした。 * [elmo] オフライン FCC。 * Message-ID がないときに Summary がおかしくなるのを修正。 * Folder mode でグループにも未読数表示。 * [im-wl.el] Message-Id -> Message-ID。 1998-10-11 Masahiro MURATA (村田全寛) * [elmo] filterやmultiフォルダ内の localdir メッセージは cache しないようにした。 * アクセスグループは rename できないようにした。 * save 時に使用されていない petname は削除するようにした。 1998-10-11 OKUNISHI Fujikazu [elmo-archive.el] * elmo-archive-header-delimiter を出力しないアーカイバ(GNU tar など) の場合、list-folder-subr() 内部で無限ループに陥るのを修正した。 * 閲覧専用モードを積極的にサポートするため、書庫の改変を伴なう関数につ いてはメソッドが定義されてるかどうかを調べることでエラーを発生するよ うにした。 * Info-Zip が最も適しているとの結論から、デフォルトを 'zip にした。 * tar => gtar [elmo-util.el] * elmo-archive-get-spec() でドライブレターも取得できるよう修正した。 [im-wl.el] * Message-ID: の付け方が変更されたため、im-wl.el を使っている場合に Fcc すると Fcc されたメッセージに Message-ID: がつかない不具合が発生 していたのを修正した。 * more typo fix (s/strucuture/structure/g) 1998-10-10 Yuuichi Teranishi * wl-summary-temp-mark-region の範囲を変更。 (津邑さん の御指摘) 1998-10-09 Yuuichi Teranishi * [elmo-archive.el] ':'->';', ange-ftp/efs への対応, tar+gz 対応, 書庫内パス情報。 1998-10-08 Yuuichi Teranishi * よく呼ばれる defun を defsubst に置き換えた (scan の速度が約 20% くらい向上)。 1998-10-08 pf21 GOTO_Toshiya * wl-summary-temp-mark-copy のメッセージを修正。 1998-10-07 Yuuichi Teranishi * Message-Id -> Message-ID。 * wl-highlight-message で、re-search-forward の引数が足りなかった ためにエラーが起こる場合があるのを修正。 1998-10-05 Yuuichi Teranishi * いくつかのメッセージの typo を修正。 (三原さん より御指摘) * 0.7.0 - "Hungry Heart" 1998-10-04 Masahiro MURATA (村田全寛) * ニュース記事の行頭にあるドット(.)を削る処理が間違っていた(余分な ドットが付いたままになる)のを修正した。 * 1通も記事がないニュースグループでは elmo-nntp-list-folder の戻り値 が nil になるようにした。 1998-10-04 OKUNISHI Fujikazu * wl-ja.texi の間違いを修正。 1998-10-04 Yuuichi Teranishi * [elmo] マーク・オフライン処理の実験的実装。 * [elmo] 新規ファイル elmo-dop.el。オフライン処理用モジュール。 * [elmo] IMAP フォルダでは未読/既読/重要マーク操作をサーバに 反映させるようにした。 1998-10-03 Yuuichi Teranishi * グループでも petname をつけられるようにした。 * [elmo] auth->login 切替え時、y-or-n-p で確認するようにした。 (樽石 さん の御助言に基づく) * [elmo] imapd の capability をチェックするようにし、authenticate が できなければ 'auth' でも 'login' で認証するようにした。 * [elmo] append 時に append 可能かどうかチェックするようにした。 * [elmo] Cyrus imapd に対応。 1998-10-03 OKUNISHI Fujikazu * elmo-archive-default-type が参照されてなかったのを修正。 * ハードリンク可能かどうかを調べるのに、add-name-to-file があるか どうかを調べるのは全く意味がないので、make-symbolic-link を調べ ることで代用した。 * elmo-archive-list-folders で再利用するために elmo-localdir-list-folders-subr での正規表現を変更。 * elmo-archive-copy-msgs() を実装。localdir => archive の時だけ有効。 1998-10-02 pf21 GOTO_Toshiya * Mule for win32 でも認識できるよう wl-highlight.el の色定義を 修正。 1998-10-02 TSUMURA Tomoaki OKUNISHI Fujikazu * wl-ja.texi の間違いを修正。 1998-10-01 Yuuichi Teranishi * citation のハイライト色を引用ごとに変えるようにした。 (北目さん の御要望に基づく)。 * wl-highlight-message-cited-text -> 廃止。 * 0.6.6 - "Get It On" 1998-09-30 OKUNISHI Fujikazu * elmo-archive.el 0.09。 1998-09-30 Yuuichi Teranishi * Folder, Summary のメニューバーをちょっと整理。 * Message-Id は送信時に自動的につけるようにした。 1998-09-30 Masato Taruishi * [elmo] user-login-name -> (user-login-name) の修正。 1998-09-30 Masahiro MURATA (村田全寛) * アクセスグループでも fldmgr からあだ名を追加できるようにした。 1998-09-30 Yuuichi Teranishi * .folders にあだ名のみを定義する syntax を追加。 * コマンド、wl-message-refer-article-or-url で browse-url を呼ぶの をやめ、tm/SEMI の button-dispatcher を呼ぶようにした。 1998-09-29 Yuuichi Teranishi * wl-summary-forward で日本語サブジェクトが化けるのを修正。 (武田さん より御指摘) * mime-edit-insert-user-agent-field が t なら mime-edit-user-agent-value の値を使って User-Agent: フィールドを挿入するようにした。nil なら従来通り。 1998-09-28 Yuuichi Teranishi * elmo-util.el に (require 'cl) を追加。 (Hermit-chan (はみちゃん) さんの御指摘) * elmo-filter-msgdb-create の間違いを修正。 (奥西さん の御指摘) 1998-09-28 Masato Taruishi * [elmo] IMAPのグループフォルダを fetch するときにユーザ名を 付加してないためユーザ名の違うIMAPサーバへアクセスすると問題が 起きるのを修正。 1998-09-27 Masahiro MURATA (村田全寛) * クロスポスト記事を既読処理する時に未読数が正常に反映されないのを 修正。 * クロスポスト対象のメッセージが閉じたスレッドの中にあっても表示し て処理するようにした。 * fldmgr でフォルダを追加するとき,フォルダ情報の反映がおかしくなる のを修正。 1998-09-27 Yuuichi Teranishi * 新規変数、wl-draft-reply-buffer-style。 値が 'full なら、リプライ時にフレーム全体を使う (北目さん より御要望)。 * wl-mail-setup-hook は reply 時にはバッファの内容が確定してから 呼ぶようにした。 * update 時に子どもスレッド数の update がおかしかったのを修正。 1998-09-26 OKUNISHI Fujikazu * wl-ja.texi に elmo-archive の説明を追加。 1998-09-25 OKUNISHI Fujikazu * elmo-lha 改め elmo-archive.el(lha, info-zip 対応) 1998-09-25 Yuuichi Teranishi * HTML のメールを cite すると w3 の keymap の text-property が ついてきてしまうのを回避。 1998-09-24 Yuuichi Teranishi * update 時のハイライト用 regexp が間違っていたのを修正。 1998-09-23 Yuuichi Teranishi * 0.6.5 - "Footloose" * [elmo] Reference と In-Reply-To から message-id を切り出す モジュールの regexp を修正。 * XEmacs でメッセージのドラッグ&ドロップが復活 (21.0 の API に合わせた)。 * [elmo] imap4 で、メッセージ番号が飛んでいるときに overview の 生成に失敗するのを回避(北目さん の御指摘)。 * elmo-multi-max-of-folder がないと怒られるのを回避。 (奥西さん, 津邑さん より御指摘) * スレッド枝の可視化に伴う変更多数。 スレッド内のメッセージが複数一度に移動したときに表示がずれる問題 (村田さん より御指摘)も同時に修正。 * スレッドの枝を可視化。 (樽石 さん の御助言に基づく) * 新規変数: wl-thread-indent-level wl-thread-have-younger-brother-str wl-thread-youngest-child-str wl-thread-vertical-str wl-thread-horizontal-str wl-thread-space-str * wl-summary-indent-level -> 廃止。 1998-09-22 Yuuichi Teranishi * wl-thread-goto-bottom-of-sub-thread : メッセージが子孫かどうか、見ためで判断するのをやめた。 * [elmo] IMAP4 だと In-Reply-To にある Message-ID をもとにスレッド が作られなかったのを修正。 * ファイルシステムをまたがる local どうしの refile がエラーになるの を修正。(後藤(と) さん より御指摘) 1998-09-21 Yuuichi Teranishi * ゴミ箱フォルダでひとつづつ完全削除しようとすると無限ループする のを修正。 (後藤(と) さん からも御指摘) * 0.6.4 - "Easy Lover" 1998-09-21 TSUMURA Tomoaki * elmo-lha で、zip などで append 時に directory 名がつかない ようにした。 1998-09-21 OKUNISHI Fujikazu * 新規バックエンドを作る時、既存コードでは elmo-msgdb だけは パッチ入れないと localdir になってしまうのを回避する策。 1998-09-20 OKUNISHI Fujikazu * lha-prog-arg-get-list だけが他のオプション変数と非対称だったので、 *-getlist に縮めた。 * LHA 実効形式が DOS、平松 OS/2 版とオプション互換かどうかを system-type から判定して、自動的に適切な値をセットするようにした。 * lha-file-regexp の UN|X 版 LHA 対応により OS/2 でマッチしなくなって いたので安直に直した。 * elmo-localdir-folder-path との対称性から elmo-lha-basedir を elmo-lha-folder-path に変更。デフォルトは "~/Mail" * 存在しない LHA フォルダの場合に elmo-lha-list-folder() から elmo-lha-list-folder-subr() を呼び出して lha が異常終了してこけてた ので、存在しない時はサブルーチンを呼び出さないようにした。 * elmo-lha-get-archive-name() がフルパスの LHA フォルダを通せるように した。$/foo/bar のように "/" で始まる場合は /foo/bar.lzh と見做す。 一時的に任意のフォルダをマウントしたいときなど。 1998-09-20 Yuuichi Teranishi * wl-ja.texi を書いてみた。 * tm では wl-use-folder-petname-on-modeline を無視していたのを修正。 * tm でオフライン状態で IMAP のメッセージを読もうとするとメッセージ バッファにカーソルが行ってしまうのを修正。 1998-09-19 Yuuichi Teranishi * Summary の From 部に日本語があると閉じたスレッドの update が おかしくなるのを修正。 * 特定のマークだけ全て消す、'U' wl-summary-unmark-all。 * 関数 wl-thread-force-open が全然スレッドを開かなくなっていたのを 直す。 * local->local, IMAP->IMAP のコピーを最適化、メッセージの移動を (たぶん)高速化。 * オフライン状態でも fldmgr で IMAP4 フォルダを付け足せるようにした。 * ~/.folders が無くても起動できるようにした。 * ハイライトが何か変だったのを直した(つもり)。 * partial filter なら unsync を nil にせず、普通にチェックする ようにした (村田さん の御助言)。 1998-09-18 Masahiro MURATA (村田全寛) * Folder の未読数をチェックするたびに未読数が増えて行くことがある のを修正。 * elmo-folder-info-alist の save 時には,存在しない entity の情報 を削除するようにした。 * fldmgr で先頭にフォルダを挿入した場合,wl-folder-entity-alist の更 新方法が間違っていたのを修正した。 1998-09-18 TSUMURA Tomoaki * 存在しない lha folder に refile したときなどに、新規に lha folder が作成されないのを修正。 1998-09-18 Yuuichi Teranishi * 0.6.3 - "Danger Zone" 1998-09-17 Masahiro MURATA (村田全寛) * elmo で wl の関数を使用しているのを直した。 * Emacs-19 の同じ文字列の比較(equal)で nil になることがあるため, 一部の member と assoc を wl-string-member や wl-string-assoc に 置き換えた。wl-string-assoc は 新規関数。 * wl-folder-goto-first-unread-folder で一番最初の entity が unread の 場合,そのフォルダに移動しないのを修正した。 * folder mode でのフォルダの検索時に異なる petname がマッチすることが あるのを修正した。 * wl-summary-mark-as-read-region のみ region が行末までになっていない ので,wl-thread-mark-as-read が正常に動作しないのを修正した。 * 複数フォルダの crosspost 処理において,multi や filter が複数になっ たフォルダも考慮するようにした。また,既読処理したメッセージ数を表 示するようにした。 * wl-summary.el においてローカル変数 children が let で宣言されていな かった部分を修正。 1998-09-17 Yuuichi Teranishi * multi のときに mmelmo-imap4 がおかしかったのを修正。 * wl-summary-mark-as-read-all が local,uncache を無視してしまっていた のを修正。 1998-09-17 OKUNISHI Fujikazu * elmo-lha.el をマージ。 1998-09-17 Yuuichi Teranishi * wl-thread-jump-to-next-unread が hereto を無視していたのを修正。 * ':' がファイル名に使われているとまずい場合があるので使わないよう に修正(奥西さん の御指摘)。 * elmo-lha-search を実装。 * elmo-lha.el を多少修正。 1998-09-16 OKUNISHI Fujikazu * 新規ファイル elmo-lha.el。LHA 用インタフェース。 1998-09-16 Yuuichi Teranishi * 0.6.2 - "China Girl" * wl-stay-folder-window が nil なら E で trash を空にするときも 分割しないようにした(北目さん の御指摘)。 * 新規変数 wl-summary-fix-timezone。サマリの Timezone を合わせる。 * スレッド操作コマンドを整理。 ついでにマーク操作、リージョン操作コマンドも整理。 1998-09-15 Yuuichi Teranishi * wl-thread-open-close で refile マークつきのスレッドを開いた時、 refile 先の表示が途中までしか出なかったのを修正。 * 'O' でコピーを実現。 * 新規変数 wl-highlight-summary-copied-face。 * wl-summary-refer-article-or-url を wl-message-refer-article-or-url とし、Message のボタン 2 に割り当てた。 * wl-summary-move-direction-downward の default を t に。 1998-09-15 Masahiro MURATA (村田全寛) * Emacs-19.34 では,wl-fldmgr-unsubscribe が正常に機能せず、 また同じグループに複数の entity が作れてしまう不具合を修正。 * XEmacs-21.0 では,unsubscribe や remove されたフォルダに text-property が付くのを修正。 * wl-folder.el の変更に抜けがあったのを修正。 * 異なる folder の同じ petname は検出するようにした。 * accessグループでもフォルダの追加,挿入,削除が行えるようにした。 * accessグループで表示しないフォルダを指定できるようにした。 * fldmgr の region操作を高速化した。 * access グループの fetching 時に新しいフォルダと削除されたフォルダが 分かるようにした。新しいフォルダは先頭に表示されます。 * wl-summary-move-order が 'new 以外だとwl-thread-jump-to-next-unread でエラーになるのを修正。 * wl-summary-read で次の未読フォルダに移動するとき,移動先フォルダの 未読数が 0 なら,つづけて次の未読フォルダに移れるようにした。 * folder mode でグループを全て閉じるコマンド(wl-folder-close-all)と 全て開くコマンド(wl-folder-open-all)を追加した。 * summary に移動した際,folder mode のカーソル位置を対応させるように した。デフォルトはしない。 * 新規変数 wl-summary-next-no-unread (default は t) * 新規変数 wl-summary-exit-next-move (default は t) * 新規変数 wl-folder-move-cur-folder (default は nil) * 新規変数 wl-highlight-folder-killed-face (default は gray50) * fldmgr の機能を説明する新規ファイル、README-fldmgr.ja。 1998-09-15 pf21 GOTO_Toshiya * Summary で o や d でマークするときに gnus, mh-e 風に、読んでいる方向を意識して移動するようにした。 * 新規変数 wl-summary-move-direction-downward が t の時、 最後に実行された p,P,n,N の結果で、次のメッセージが上か下かを 切り替える。 1998-09-13 OKUNISHI Fujikazu * 関数 wl-summary-refer-article-or-url。 1998-09-12 Yuuichi Teranishi * 0.6.1 - "Billie Jean" * スレッドを開閉しても一時的マークが消えないよう、delete mark, temp mark を変数に保持するようにした。 * wl-thread-jump-to-next-unread の遅さをだいぶ軽減。 * スレッドを削除したときに他のメッセージ行も消してしまう場合がある 不具合を直す。 (森山さん の御指摘による。) * wl-address.el 中の insert-file を insert-file-contents に置き換え るのをわすれてた。 (森山さん の御指摘による。) * wl-fldmgr.el が write-file-as-mime-charset を使わないようにした。 * wl-fldmgr.el が alist.el を require しないようにした。 * wl-fldmgr.el をマージ。 1998-09-11 Masahiro MURATA (村田全寛) * 新規ファイル wl-fldmgr.el。 フォルダモードから .folders の編集が可能になった。 * wl-folder.el で同じ petname があるときの不具合を直す。 1998-09-10 Yuuichi Teranishi * mt のときにスレッドを開くようにした。 (津邑さん の御助言に基づく) * 0.6.0 - "Angelia" 1998-09-10 Masahiro MURATA (村田全寛) * wl-summary-jump-to-parent-message で参照先の msg-id を得るときに空 白が含まれるために,親メッセージが参照できない場合があるのを修正し た。 * wl-parse-newsgroups で split-string の代わりに wl-parse を使うよう にした。 1998-09-09 Yuuichi Teranishi * pick されたメッセージのスレッドは開くようにした。 * thread 操作用のキーバインドを '/' -> wl-thread-open-close '[' -> wl-thread-open-all ']' -> wl-thread-close-all とする。 * wl-thread.el に最低限必要なモジュールがとりあえず完成。 * 新規変数 wl-thread-insert-opened。 t ならスレッドを開いて挿入。 nil ならスレッドを閉じて挿入。デフォルトは nil とした。 * elmo でも一部 append を nconc に変更できるところを置き換えてみた。 1998-09-09 Takaaki MORIYAMA * wl-folder.el でappendしているところで変更できる部分をnconcで 置き換えた。 * wl-address.el 中の insert-file を insert-file-contents に置き換えた。 1998-09-08 Yuuichi Teranishi * 関数 wl-address-setup で file-exists-p と file-readable-p の and を 取っていたのを file-exists-p のみで判定するようにした。 (樽石 さん Masato Taruishi より御指摘) * 新規変数 wl-use-folder-petname-on-modeline が t (default は t)なら modeline に folder のあだ名を出すようにした。 * サマリ/メッセージのマウスホイール完全(?)対応。 * multi ならクロスポストの記事を消すようにした。 * [elmo] multi は Date で sort。 * [elmo] mark-alist を ("Message-Number" . "Mark") の assoc list に 変更。 1998-09-08 Masahiro MURATA (村田全寛) * petname の取得でメール大文字小文字が区別されていたのを無視するよう にした。 * filter や multi になると,imap, nntp,localdir の判断ができていない 部分があったのを修正。 1998-09-06 Yuuichi Teranishi * wl-folder-diff で info-alist の値を変更するようにした。 * 新規ファイル wl-thread.el。interactive な thread 表示モジュール群。 (樽石さん Masato Taruishi の御助言に基づく) 1998-09-05 Yuuichi Teranishi * .folders で、フォルダ名のうしろに "" でくくって Petname を定義 できるようにした。 (津邑さん 、 樽石さん Masato Taruishi の御提案に基づく) 1998-09-04 Yuuichi Teranishi * 0.5.4 - "You Might Think" * 新規変数 wl-force-fetch-folders が non-nil ならアクセス型フォルダを 開いたときに常に最新のリストを取りに行くようにした。 (樽石さん Masato Taruishi の御助言に基づく) 1998-09-03 Yuuichi Teranishi * unplugged のときに wl-summary-{next|prev} の動作がおかしくなって いたのを直す。 * wl-draft-send-mail-with-smtp と wl-draft-send-mail-with-qmail も wl-mail-send-pre-hook を評価するのを wl-do-fcc() 実行前に。 * [elmo] IMAP で \Seen フラグが付いていたら、新規メールでも既読 あつかいするようにしてみた。 * [elmo] elmo-imap4-list-folders がまともに動かなかったのを修正。 (樽石さん Masato Taruishi の御指摘による) まだ不完全? * 例えば /last:100/... で 100 個なかったらエラーが出るのを修正。 1998-09-03 Ishikawa Ichiro * Message-Id や本文がないメッセージがあるときの問題を修正。 1998-09-03 TSUMURA Tomoaki * Emacs20.2 で update がエラーになる問題を修正。 1998-09-03 OKUNISHI Fujikazu * wl-init() で wl-demo() するタイミングを ~/.wl ロード後に。 * im-wl.el で wl-mail-send-pre-hook を評価するのを wl-do-fcc() 実行 前に。 1998-09-02 Yuuichi Teranishi * 新規変数 wl-draft-reply-without-argument-list および wl-draft-reply-with-argument-list を追加、reply 時のデフォルトを カスタマイズできるようにした。 * ChangeLog が間違っていたのを修正。 (村田さん Masahiro MURATA より御指摘) * 0.5.3 - "Xanadu" * elmo-nntp-msgdb-create-as-numlist のことをわすれてたので作った。 (津邑さん より御指摘) 1998-09-01 Yuuichi Teranishi * 新規ファイル、README-FOLDER.ja。 フォルダの書式を説明するメモ。 * Summary で "V" 等で作られた仮想フォルダから脱出する新規コマンド、 wl-summary-unvirtual を "U" にバインド。 * [elmo] elmo-filter-search をちょっとまじめに実装。 * [elmo] imap4 の filter スペック用 msgdb 生成関数で、 メッセージ毎に envelope 情報を fetch するのをやめ、 当該部分の envelope を全部 fetch したあとクライアント側で filter するようにして高速化(メモリ使うけど)。 1998-09-01 Masahiro MURATA (村田全寛) * wl-auto-select-first が nil のとき,最初の未読メッセージに 飛ぶよう修正。 1998-09-01 Yuuichi Teranishi * update の message を出すタイミングを変更。 * [elmo] "Message-ID: <>" だと削除できないという問題が残っていたの を直す。 1998-08-31 Yuuichi Teranishi * 0.5.2 - "Wild Boys" * [elmo] またもや "Message-ID: <>" だと動かなくなっていたのを直す。 * [elmo] localdir で、数字が連続的でないと無駄にループを回るのを修正。 * wl-summary-goto-folder で、highlight の仕方を間違えていたのを直す。 * XEmacs だと .folders に filter を指定しているとエラーになるのを修正 (アイコンのことわすれてた)。 (津邑さん の御指摘に基づく変更) * [elmo] elmo-folder-diff で、filter のときに multi を指定していると エラーになるのを直す。 (津邑さん の御指摘に基づく変更) * [elmo] elmo-filter-append-msg を直す。 1998-08-28 Yuuichi Teranishi * 0.5.1 - "Valotte" * filter の追加に伴う変更多数。 * 新規変数 wl-folder-no-save-list, wl-folder-save-list。 * [elmo] 新規ファイル elmo-filter.el。 1998-08-26 Yuuichi Teranishi * 0.5.0 - "Uptown Girl" 1998-08-25 Yuuichi Teranishi * multi の追加に伴う変更多数。 * [elmo] 新規ファイル elmo-multi.el。 * elmo-cache-expire-by-size を実装。 1998-08-25 TSUMURA Tomoaki * XEmacs で複数 frame を使っている場合、only one window な frame で wl-draft-hide すると、frame ごと消えてしまうのを回避。 1998-08-24 Yuuichi Teranishi * Summary が一定行数以上ある場合は、最初に表示するメッセージの あたりから下だけハイライトするようにした。 (一定数 = wl-summary-highlight-partial-threshold, default は 1000) * Summary の highlight で looking-at の回数を減らしてちょっとだけ 高速化(15% くらい?)。 * Summary の メッセージ番号の表示桁数の設定を汎用化。 1998-08-23 Yuuichi Teranishi * wl-folder-info-save が t なら未読情報表示もリジュームするよう にした。 * elmo-folder-info-save -> wl-folder-info-save (default を t に)。 * fdbinfo -> finfo. 1998-08-23 Masahiro MURATA (村田全寛) * 各フォルダの最大メッセージ番号や未読数を cache して wl-folder-check-entity を高速化した。 elmo-folder-info-save が non-nil なら save して次回起動時も利用 する。 * NetNews フォルダにてクロスポストされた記事を別フォルダで既読扱いする ようにした。 * draft mode にて Newsgroup 名が補完できるようにした。 * alias ファイルの解析時に行頭の '#' ';' をコメント扱いにした。 * wl-folder-empty-trash 実行後に msgdb も save するようにした。 * wl-summary-delete-all-msgs 実行後に new-count と unread-count を更新するようにした。 * new メッセージを読まずに delete すると,mark msgdb が更新されな いのを修正した。また wl-summary-exec-region 実行後に wl-folder-set-folder-updated にてメッセージ数などを更新するよう にした。 1998-08-23 Yuuichi Teranishi * important-mark をグローバルに管理するようにした。 1998-08-21 Yuuichi Teranishi * wl-summary-jump-to-parent-msg-by-message-id で、当該メッセージが 違うフォルダにある場合は飛ぶこともできるようにした。 (XEmacs で elmo-use-database が t の場合のみ) * [elmo] dbm モジュール群用新規ファイル、elmo-database.el 作成。 (XEmacs 専用) 1998-08-20 Yuuichi Teranishi * wl-summary-mark-as-read-all でいちいちキャッシュが存在するかどうか チェックしないようにした。 * XEmacs 向け Opening Logo を一新。 * [elmo] elmo-cache-search を新キャッシュ方式に追従。 1998-08-19 Yuuichi Teranishi * [elmo] キャッシュをグローバルに管理するようにした。 * [elmo] キャッシュ管理モジュール群用新規ファイル、elmo-cache.el を 作成。 1998-08-18 OKUNISHI Fujikazu * search-parent の修正。 1998-08-17 Yuuichi Teranishi * [elmo] imap4 で select せずに list folder すると、実際は内容が 変化していても結果が更新されないので、list folder の前に noop を送るようにした。 * v0.4.4 - "Thriller" 1998-08-17 OKUNISHI Fujikazu * search-parent で何番前の親かを指定できるようにした。 1998-08-16 Yuuichi Teranishi * wl-mime.el で、follow-current-entity の前に widen するようにした。 * original buffer を read-only にした。 (奥西さん より御指摘) 1998-08-16 OKUNISHI Fujikazu * wl-break-pages がちゃんと反映されないのを修正。 1998-08-16 Masahiro MURATA (村田全寛) * wl-folder-goto-first-unread-folder, wl-folder-open-all-unread-folder, wl-folder-open-folder を wl-folder-get-path を使うよう変更。 * wl-highlight-folder-path の改良。 1998-08-14 Masahiro MURATA (村田全寛) * localdir な access グループを fetching するときに,グループ名に property がついているせいで取得したリストにも余計な property が付く のを修正。 * wl-folder-goto-folder で移動するときに wl-folder-buffer-cur-entity-id をセットするようにした。 * 新規関数 wl-folder-goto-first-unread-folder ('f') 未読メッセージがある最初のフォルダに移動する。 * 新規関数 wl-folder-jump-folder ('J') 指定したフォルダに移動する。その時,フォルダが属しているグループ を開く。 * 新規関数 wl-folder-open-all-unread-folder ('o') 未読メッセージがあるフォルダのグループを全て開く。 * 新規関数 wl-folder-open-folder 指定したフォルダのグループを開く。 1998-08-14 Yuuichi Teranishi * [elmo] delete 時、expunge のタイミングを変更(かなり高速化)。 * trash folder での "D" マークは(真の)削除を実行するようにした。 (奥西さん より御指摘) 1998-08-14 Masahiro MURATA (村田全寛) * msgdb は save されて,summary-cache は save されない状況が発生する 場合があるのを回避。 1998-08-13 Yuuichi Teranishi * Summary に追加される行の highlight の方法を変更(多少高速化)。 * デフォルトの cite だとFrom:に漢字が含まれていると internal になって しまうのを修正。(te@gohome.org より御指摘) * no-cache-folder でも、important-mark をつけるときにキャッシュする ようにした。(村田さん より御意見) * Message-Id: <> のメールがキャッシュ時にエラーになるのを回避。 (鵜飼さん より御指摘) * [bbdb-wl.el] bbdbエントリをキャッシュするよう変更。 1998-08-13 OKUNISHI Fujikazu * [bbdb-wl.el] Emacs20.x でエラーが起こるのを回避。 1998-08-11 Yuuichi Teranishi * wl-set-string-width で、セットしようとしている長さが string と ちょうど同じだと XEmacs ではなぜか1文字長くなってしまうのを回避。 * [elmo] imap4 の bodystructure 取り寄せで、添付ファイルの ファイル名が日本語だったりすると parse に失敗するのを回避。 1998-08-09 Yuuichi Teranishi * v0.4.3 - "Starting Over" * wl-no-cache-folder-list を新設、マッチしたフォルダは メッセージを読んでもキャッシュしない。 * elmo-imap4-msgdb-create-range, elmo-nntp-msgdb-create-range における overview の取り寄せとその解析処理を非同期化。 1998-08-08 Yuuichi Teranishi * msgdb のセーブを、変更があった部分だけ行うようにした。 (村田さん より御指摘) 1998-08-07 Fumitoshi UKAI * elmo-imap4-msgdb-create-range を高速化。 1998-08-06 Fumitoshi UKAI * msgdb の load と imap4 select folder を非同期に行う wl-summary-msgdb-load-async の実現。 1998-08-06 Yuuichi Teranishi * v0.4.2 - "Rock Me Amadeus" * imap4, nntp で overview を取り寄せるときにいっぺんに全てではなく 一定数づつ fetch するようにした。デフォルトは 200 づつ。 (鵜飼さん より御助言) * Summary の Update で, 追加されたメッセージの highlight の方法を変更。 1998-08-06 Masahiro MURATA (村田全寛) * wl-summary-reedit を draft フォルダで実行するとき, 同じメッセージ番号を使用するようにした。 * 変数 wl-draft-config-alist を新設。ヘッダ(宛先など)に応じて他の ヘッダ(Fromなど)を変更する機能を追加した。 1998-08-06 Yuuichi Teranishi * [elmo] current folder が同じなら select folder しないようにした。 (鵜飼さん より御助言) 1998-08-06 Fumitoshi UKAI * [elmo] elmo-msgdb-list-diff2 を高速化。 1998-08-05 Masahiro MURATA (村田全寛) * メッセージヘッダの highlight をもっと自由に定義できるようにした。 1998-08-04 Yuuichi Teranishi * [elmo] scan の速度向上のために overview データベースは、メモリ上、 HDD上いずれも iso-2022-jp(そのフォルダの mime-charset)で保存する ようにした。 * wl-summary-toggle-thread を実装。't' に bind。 1998-08-04 Yuji Yamano * tm で引用してリプライしようとすると (void-variable mime::preview/mother-buffer) になる場合があるのを 回避。 1998-08-04 Yuuichi Teranishi * 変数 wl-summary-indent-length-limit を新設。 どんなにスレッドが深くてもこの長さ以上インデントしない。 デフォルトは 46 (根拠なし)。 (奥西さん より御指摘) 1998-08-03 Yuuichi Teranishi * [elmo] localdir の search 時、ちゃんと elmo-mime-charset で decode するようにした。 * wl-summary-sort を実装、(by date, number, subject, from). 'S' に bind. * wl-summary-jump-to-parent-message の arg の意味を逆にした。 * v0.4.1 - "Private Eyes" 1998-08-02 Yuuichi Teranishi * 新規メッセージを prefetch する関数 wl-summary-incorporate を追加。 * tm で巨大メッセージを取って来るかどうか質問するようにするのを 忘れてたのを直す。 * prefetch すると未読数表示がおかしくなるのを修正。 * wl-folder-sync-entity が正しくサマリビューキャッシュを更新しない バグを修正。 * wl-summary-down が interrupt された時にカレントフォルダ情報が おかしくなるのを修正。 * 00README.ja に install.el に関する注意書きを追加。 (奥西さん より御助言) 1998-07-31 Masahiro MURATA (村田全寛) * [elmo] elmo-nntp-list-folder が XEmacs 以外で動かないバグを修正。 1998-07-31 Yuuichi Teranishi * [elmo] imap4 で、シングルパートの巨大なメッセージの場合、 取って来ないと言っているのに取って来てしまうバグを修正。 * [elmo] read-msg でのコピー回数を減らしてメモリ使用量を節約。 * Emacs 終了時に Summary が残っていたら cache と mark をセーブする ようにした。 1998-07-30 Yuuichi Teranishi * グループフォルダ上にカーソルがあるときにゴミ箱を空にすると、 summary window が残ってしまうのを回避。 * get-text-property の多用で、wl-folder-update-unread 等が 遅くなっていたので、極力 get-text-property を減らした。 * wl-message-window-size のデフォルトを '(1 . 4) にした。 * 変数 wl-summary-recenter が non-nil なら、redisplay 時に recenter するようにした。 * v0.4.0 - "One More Try" 1998-07-29 Yuuichi Teranishi * wl-folder-petname-alist を新設。マッチしたらフォルダをあだ名表示。 * wl-auto-select-next が non-nil のとき、SPC だけでなく、 現在のコマンドが実行されたキー、もしくはマウスイベントが続けて 入力された場合でも次のフォルダに移れるようにした。 * wl-auto-select-next が non-nil なら、最後のメッセージで 'n' を押したときも次のフォルダに即移動できるようにした。 * [elmo] elmo-nntp-list-folder を大幅に高速化 (今までが遅すぎ?)。 1998-07-28 Yuuichi Teranishi * ヘッダのフォントのデフォルトを bold にした。 * 現在選択されているフォルダ(のパス)とメッセージをハイライトする ようにした。 * wl-summary-auto-select-next で、次の未読があるフォルダが Folder モードに現れていなくても(閉じられたフォルダ内にあっても) 適当なものを割り出して移動するようにした。 * 各フォルダに Id を振るようにし、バッファ上では text-property, 'wl-folder-entity-id で参照できるようにした。 wl-folder-entity-alist の構造にも entity-id を追加。 1998-07-26 Yuuichi Teranishi * キャッシュで本文検索(キャッシュ検索)できるようにした。imap4 の offline 状態、および、nntp では、このキャッシュ検索を用いる。 * Message-ID に "/" が含まれるとき、キャッシュのファイル名では " " に置き換えることにした。 * リファイルマークを付けたままフォルダを脱出すると、ゴミがセーブ されるのを回避した(つもり)。 * サマリビューキャッシュのHDDへの書き込みを、変更があるたびではなく、 フォルダーを移動・抜ける時に一気に書き出すようにした。 * NNTP でもフォルダリストの取り寄せをできるようにした。 (.folders に "-fj.rec /" のように書けるようになった。) * XEmacs のメニューを日本語表示するリソース、etc/ja.Emacs を追加。 * 同じ Message-ID のメッセージが複数ある場合、未読マークの数が おかしくなるのを直した(つもり)。 * フォルダリストをキャッシュするようにした。 最新リストに更新するには、C-u RET でフォルダを開き直す。 unplugged 状態でも access 型グループフォルダを利用できる ようになった。 1998-07-24 Masahiro MURATA (村田全寛) * wl-auto-select-first を non-nil にすると,wl-folder-empty-trash を実行したときに,wl-folder-toggle-disp-summary の select-window でエラーになるのを修正。 1998-07-24 Yuuichi Teranishi * folder-mode-map で "P" を wl-folder-prev-unread, "N" を wl-folder-next-unread にしたほうが使いやすい気がしてきたので デフォルトをそのように変更。 * [elmo] elmo-localdir で、overview 生成時のファイルからのデータ 読み込み量を削減。メモリ使用量が減った(はず)。 1998-07-23 Yuuichi Teranishi * v0.3.6 - "Never Surrender" 1998-07-23 Masahiro MURATA (村田全寛) * wl-folder.el で、get-buffer-{window|buffer} が失敗したときに 誤動作するのを修正。 1998-07-22 Yuuichi Teranishi * 新規変数 wl-summary-buffer-mime-charset, wl-folder-mime-charset-alist を設置、Summary の生成、本文のデコードで利用するようにした。 * MIME-Version がないときも生 JIS サブジェクトをデコードして表示。 (奥西さん より御指摘) * wl-draft-normal-send-func で、Date field を挿入するようにした。 * wl-mail-do-fcc-insert-date-header -> wl-draft-insert-date-field 名前変更と同時に、timezone.el を使うようにした。 * wl-summary-auto-select-next が non-nil のときの動作が IMAP4 フォルダでおかしくなってしまうのを修正。 * IMAP4 もオープンすると,Emacs の終了時に確認を行うので無視するよ うにした。 1998-07-22 Masahiro MURATA (村田全寛) * 未読フォルダー間を移動する wl-folder-(prev|next)-unread を新規 作成した。 * 変数 `wl-auto-select-first' が non-nil なら,フォルダに移動後 最初の未読メッセージを即表示するようにした。 * 変数 `wl-auto-select-next' が non-nil なら,最後のメッセージを 読み終えた後に次の未読フォルダに即移動するようにした。 * 変数 `wl-summary-move-order' により,メッセージ移動時の優先順 位を変更可能にした。変数には `new' と `unread' が指定できる。 * 未読フォルダの wl-highlight-folder-unread-face を新規追加した。 * (buffer-substring (match...)) のコードを整理した。 (wl-folder.el, wl-summary.el のみ) * wl-draft-send-mail-with-qmail を使用すると,void-variable header-end エラーが出るので修正した。 * NNTP をオープンすると,Emacs の終了時に確認を行うので無視するように した。 1998-07-21 Yuuichi Teranishi * [elmo] imap4 の本文検索で日本語をキーとして与えられるようにした。 1998-07-21 TSUMURA Tomoaki * wl-folder-empty-trash でフォルダデータを空にセットするときの バグを直す。 1998-07-21 Yuuichi Teranishi * v0.3.5 - "Miss Me Blind" 1998-07-21 Masahiro MURATA (村田全寛) * WL-ELS で ./WL.hack をちゃんと load するよう "." を load-path に 追加する行を移動。 1998-07-17 Yuuichi Teranishi * Folder にも unread 数を表示するようにした。いくつかの関連関数も 変更。(村田全寛 さんの御助言に基づく変更) * Summary の modeline に new と unread の数を表示するようにした。 バッファローカル変数、wl-summary-buffer-unread-count, wl-summary-buffer-new-count で管理。 (村田全寛 さんの御助言に基づく変更) * 未読メールを1通読む度に mark ファイルをHDDに書き込まず、 フォルダーを移動・抜ける時に一気に書き出すようにした。 (村田全寛 さんの御助言に基づく変更) * mark ファイルにたまに (("" nil)) が残るバグを修正 した(つもり)。(村田全寛 さんより御指摘) 1998-07-16 Yuuichi Teranishi * Semi-vm の手法を参考に、文字列を固定長にする処理を行う 新規関数 wl-set-string-width を追加。 * wl-display-error が error を出すのを回避した(が、まだいまいち)。 * wl-draft-folder が localdir でなければ、wl-init でエラーメッセージ を出すようにした。 * Folder mode に戻らずに goto-folder ばっかりしていると、移動する度に modeline 上の `[ON]' が増加してしまうバグを修正。 (奥西さん より御指摘) 1998-07-15 Yuuichi Teranishi * v0.3.4 - "La Bamba" wl release. 1998-07-15 OKUNISHI Fujikazu * 余計なプロパティを取ってほしいところを適当に見繕って buffer-substring->buffer-substring-no-properties に置換。 * wl-summary-redisplay() が必ずしも必要でなく、 wl-summary-set-message-buffer-or-redisplay() で済むところは置換。 1998-07-14 Yuuichi Teranishi * mh 形式の alias file が wl-alias-file に設定されていたら、 completion で使えるようにした(つもり)。 * modeline の toggle-status を mode-line-buffer-identification の 前に書くことにしてみた。 * wl-draft-insert-message で mail-citation-hook と mail-yank-hooks を nil に拘束するのを忘れてた。 (奥西さん より御指摘) * Mule2.3@19.28 には display-error がないようなので、 それっぽい関数を自前で用意した。 (奥西さん より御指摘) * wl-summary-redisplay-all-header, wl-summary-redisplay-no-mime でも 未読マーク処理するようにした。 1998-07-14 Masahiro MURATA (村田全寛) * 新規関数 wl-folder-goto-folder, wl-folder-suspend。 1998-07-14 Yuuichi Teranishi * wl-mmelmo-message-redisplay: すでに cache されているにもかかわらず 全部読むかどうか質問してしまうのを直す。 * [elmo] message/partial もキャッシュ管理できるようにした。 * [elmo] read-msg の返り値を (content-type . message) とした。 * wl-draft.el: (insert-body) -> (insert body) 1998-07-13 Yuuichi Teranishi * v0.3.3 - "Karma Chameleon" wl release. 1998-07-13 OKUNISHI Fujikazu * 新規関数 wl-summary-jump-to-parent-message。 1998-07-13 Yuuichi Teranishi * 未読がないときは update 時に最後のメッセージに移動。 (村田全寛 さんの御指摘に基づく変更) * elmo-nntp-send-mode-reader で response を読むようにした。 1998-07-12 Masahiro MURATA (村田全寛) * 初めて移動する folder に移ると,summary モードで2つ目のメッセージに カーソルが移動する不具合を修正。 * NNTP で最初に "mode reader" コマンドを送信する。 * from に異常(?)な文字が含まれていると,wl-substring 内の sref でエラー が出るのを無視。 * wl-auto-check-folder-pre-hook を追加。 * wl-interactive-exit が nil なら終了時に確認を取らない。 * wl-interactive-send が t なら送信時に確認を取る。 1998-07-12 Yuuichi Teranishi * News 記事のキャンセル記事を出す時に wl-draft-raw-send を呼ぶように した。 * 新規関数 wl-draft-raw-send。 * 新規関数 wl-mime-request-patrial-message。 * WL-ELS, install.el がインストールされていれば、 自動的に ELISPDIR を検出できるようにする。 * wl-summary-reedit, wl-draft-open-file のときは、 edit-again を使うようにした。 * wl-draft-send で送信時は別バッファを使うようにした。 (守岡 知彦 さんの御助言に基づく変更) * semi-wl.el -> wl-mime.el (守岡 知彦 さんの御助言に基づく変更) * 変数 wl-init-file を追加。wl-init で load-file する。 1998-07-11 OKUNISHI - PatchMan II - Fujikazu * 起動して Summary mode に移行せず、Group mode からいきなり "w" する 時場合に tm-wl.el で関数の未定義エラーが出る不具合に対処。 * bbdb が読まれているにも関わらず、一回目の compose 時に M-[TAB] が (text-mode の)ispell-complete-word() のまま、という謎の現象に対処。 * 関数 wl-summary-pipe-message を追加。 1998-07-10 Yuuichi Teranishi * User-Agent フィールドを生成する関数、wl-generate-user-agent-string。 * draft-send 中の error, quit を resume するようにしてみた。 1998-07-09 Yuuichi Teranishi * wl-folder-{next|prev}-unsync の regexp を修正。 * Flim-Chao に合わせ、mmelmo の書き換え。 mmelmo を mmelmo と mmelmo-imap4 に分割。 mmelmo と mmelmo-imap4 の dispatch は FLIM 側に任せるようにした。 1998-07-07 Yuuichi Teranishi * v0.3.2 - "Jump" wl release. 1998-07-06 Yuuichi Teranishi * wl-draft-send を修正。エラーを検知できたときは、edit-mode に戻る。 im-wl.el もそれに合わせて修正。 * utils/x-face-wl.el, utils/x-pgp-sig-wl.el deleted. * elmo-imap4, elmo-nntp も coding-system 関係の拘束を as-binary-* を使うようにした。 1998-07-06 OKUNISHI Fujikazu * coding-system 関係の拘束を as-binary-* を使うようにする。 1998-07-05 OKUNISHI Fujikazu * New im-wl.el 1998-07-05 Yuuichi Teranishi * util/bbdb-wl.el * wl-summary-update 後 folderモードの全メッセージ数表示が間違って いたのを直す。 * wl-message-back-to-summary-hook -> wl-message-exit-hook * wl-message-back-to-summary -> wl-message-exit * wl-summary-toggle-disp-off-hook 追加 * wl-summary-exit-hook 追加 * wl-summary-goto-folder-mode -> wl-summary-exit * wl-folder-{next|prev}-unsync の regexp を修正。 * wl-auto-check-folder-name 追加 * wl-plugged かどうかを Folder モードと Summary モードの modeline に表示。 * wl-summary-next, wl-summary-prev, wl-summary-cursor-up, wl-summary-cursor-down は unplugged の時には読めないメッセージを とばすようにする。 * wl-draft-kill でたまにエラーが出るバグを修正。 * [elmo] imap4, nntp は plugged でなければエラーとする。 * 関数 wl-toggle-plugged を実現。M-t でトグル。 * wl-summary-goto-folder でも (wl-summary-folder-cache-save)。 (津邑公暁 さんの御指摘に基づく変更) 1998-07-04 OKUNISHI Fujikazu * x-face-wl.el, x-pgp-sig-wl.el は coding-system を拘束しなくてよい。 1998-07-03 Yuuichi Teranishi * Folder の開閉を delete-region でやるよう変更した。 1998-07-02 Yuuichi Teranishi * v0.3.1 - "Invisible Touch" wl release. * [elmo] imap4 で overview 取得時に、へんなメッセージの References フィールドの parse に失敗するバグを修正。 * [elmo] imap4 で closed コネクションを復活したとき、inbox の fetch に 失敗するバグを解決(したつもり)。 * mmelmo-imap4-node-id-to-string が 0 (integer) を返すバグを修正。 * wl-folders-file が newline で終わっていないと、Syntax error になるのを回避。 (山野裕司 さんの御指摘に基づく修正) * wl-draft-send-with-smtp で user-mail-address が設定されていな ければ、wl-from からメールアドレスを取り出して使うようにする。 (山野裕司 さんの御指摘に基づく変更) 1998-07-01 Yuuichi Teranishi * v0.3.0 - "Human Nature" wl release. * mmelmo backend の実装。 SEMI を使う場合は 1.8.2 以降でないと動かない。 * wl-mmelmo-display-message を実装。 (wl-fetch-confirm-threshold 以上のパートを、取り寄せずに表示) * wl-insert-mail-followup-to が nil のときにおかしなことになる バグに対処 * semi-elmo-imap4.el -> mmelmo.el * (wl-message-mail-p) か (wl-message-news-p) の時のみ wl-draft-send する。 1998-06-28 Yuuichi Teranishi * v0.2.2 - "Girls Just Want To Have Fun" wl release. * imap4, localdir のアイコンの絵を変更(XEmacs)。 * Folder 一覧の表示を、『未同期メッセージ数/全メッセージ数』にした。 * [elmo] elmo-localdir-search を実装。 (localdir でも pick by Body ができるようになった。) 1998-06-27 Yuuichi Teranishi * WL-ELS を Makefile から呼ぶようにする。 * WL-ELS に install と uninstall を追加してみた。 1998-06-26 OKUNISHI Fujikazu * byte-compile を高速に行うための WL-ELS。 * キャッシュファイルの読み書きを、file-coding-system-for-read ではなく {in|out}put-coding-system で拘束。 * Makefile の bytecomp のコマンドを -batch が最初に来るように変更。 1998-06-25 Yuuichi Teranishi * folder の開閉をすこしスムースに表示するようにした。 * draft, trash フォルダには特別なアイコンを出すようにした(XEmacs)。 1998-06-24 Yuuichi Teranishi * elmo-imap4-search を実装。 Body の検索をサーバ側で行う(imap4 で pick 時)。 日本語検索が、動かない。 1998-06-23 Yuuichi Teranishi * v0.2.1 - "Freedom" wl release. * wl-draft-insert-signature から signature.el の insert-signature を呼ぶ (XEmacs ツールバー用)。 * wl-draft-normal-send-func を変更し、ニュースにのみ送る場合 でも mail-send-hook を run-hooks するようにした。 (津邑公暁 さんの御指摘に基づく変更) * wl-organization が non-nil なら Organization フィールドを 挿入するようにした。 (津邑公暁 さんの御指摘に基づく変更) * 00README.ja にメーリングリストの説明を追加。 1998-06-22 Yuuichi Teranishi * v0.2.0 - "Every Breath You Take" wl release. * [elmo] nntp でもサイズを読むようにする。 * プリフェッチ時も wl-fetch-confirm-threshold を越えるものは 質問するようにした。 * SEMI-1.7.0 以降で wl-message-redisplay を、新規関数 wl-semi-message-redisplay にすり替えるようにした。 閾値 wl-fetch-confirm-threshold を越えるバイト数、 かつ、マルチパートで最初のパートが text の場合、 最初のパートだけを表示できるようにしてみた。 * 変数 wl-fetch-confirm-threshold を追加。 このバイト数以上のメッセージについては、 読むかどうか質問するようにする。 1998-06-21 Yuuichi Teranishi * 関数 semi-elmo-imap4-read-first-part, マルチパートの最初のパートだけの raw-buffer をつくる。 * 関数 semi-elmo-imap4-get-mime-entity, bodystructure を読んで、mime-parse-message の出力相当を作る。 * [elmo] imap4 でサイズを読むようにする。 * ファイル semi-elmo-imap4.el を新規追加。 1998-06-18 Yuuichi Teranishi * v0.1.4 - "Dancing In The Dark" * 変数 wl-strict-diff-folders を追加。 この変数に設定された IMAP4 フォルダたちは 未同期メッセージ数のチェックを厳密にやるようにした。 "%inbox" など、頻繁に変更されるフォルダ向け。 * アクセス型グループフォルダを最初に開いたときに、 全フォルダの未読数が初期化されてしまうバグを解消。 * [elmo] IMAP4 で read-msg のたびに select folder するのを やめた(UW v10.224 より古い imapd だと問題あるかも)。 * Summary の view を cache するときに、いちいち永続的マーク をリジュームさせるのをやめた。 1998-06-17 Yuuichi Teranishi * 00README.ja のいくつかの間違いを直す。 (山野裕司 さんより御指摘) 1998-06-16 Yuuichi Teranishi * v0.1.3 - "Centerfold" announced in elips, tm-ja. 1998-06-15 Yuuichi Teranishi * Summary の resume-mark と highlight を一回の scan で 終らせるようにした。 1998-06-14 Yuuichi Teranishi * Folder ファイルに "%#mh /" みたいに書けるようにする。 * アクセス型グループフォルダの場合、開くまで内容を取り 寄せないようにする。 * wl-use-full-window -> wl-stay-folder-window。 1998-06-12 Yuuichi Teranishi * toolbar の refine。 * folder-mode の動作を修正。 * replicate->prefetch。 * refile の推測で自分を学習の対象から外す。 * make をいっぱつで。 1998-06-11 Yuuichi Teranishi * 返事を書く時、Cc に自分が参加している ML と自分が含まれてしまう 時には自分は消すようにする(正しい?)。 * Mail-Followup-To, Mail-Reply-To に対応してみた。 1998-06-10 Yuuichi Teranishi * wl-summary-insert-summary を見直し、スレッド生成速度を 高速化(約 1.5 倍)。 1998-06-07 Yuuichi Teranishi * Summary で News 記事をキャンセルする関数 wl-summary-cancel-message を新設、'C' にバインド。 * Newsgroups が付いていれば News にもポストするようにした(つもり)。 * ほかの SEMI MUA のことを考えて toolbar を付けるのを hook ではなくす。 1998-06-02 Yuuichi Teranishi * [elmo] "/" を含む Message-ID をファイルにセーブするのに失敗す るのを回避。 ("_" に置換するようにしたがいいのか。) * wl-summary-redisplay で、recenter するようにした。 * wl-summary-cursor-up で、important-mark を regexp-quote するの 忘れてた。 1998-05-31 Yuuichi Teranishi * 変数 wl-draft-folder を設置、Mew と同じように、Draft モードで セーブすると wl-draft-folder で指定されたフォルダに 新規メッセージとして保存するようにした。 * Summary で TAB を押すと前に表示したメッセージに戻るようにする。 * Summary で、default-directory を wl-tmp-dir にする。 * wl-draft-open-file を追加。 1998-05-20 Yuuichi Teranishi * v0.1.2 - "Beat It" internal release. * CVS を使いはじめる。 * Summary の highlight を2〜3倍高速化。 * te@isl.ntt.co.jp の御意見により Folder でバッチ的に msgdb を Sync する "S" wl-folder-sync-current-entity を追加。 1998-05-19 Yuuichi Teranishi * やって来る返事は最近のメッセージに対するものが多いという スレッド追加の局所性を利用してちょっとだけスレッド生成を高速化。 * qmail-inject をサポート。 * 中途半端に miee.el をサポートしていたが、とりあえずやめて、 default は Semi-gnus についていた smtp.el を利用するようにする。 1998-05-18 Yuuichi Teranishi * Makefile の ELMODIR を elmo にする (Report by te@isl.ntt.co.jp)。 1998-05-17 Yuuichi Teranishi * Tiny toolbars for XEmacsen。 * important マーク "$" 付きのメッセージは、expire されても消さない. * Summary で "i" を押すと、replicate-unreplicated-msgs を実行。 * "U", "u", "N" マークを新設。 * Summary で undo を disable。 * refile 時にファイル先を覚える wl-refile.el。 1998-05-15 Yuuichi Teranishi * Copyright 表示を各ファイルに加える。 * [elmo] mule2.3@19.28 のダサい string-match でもうごくように imap4 で search all の結果を取り出す regexp を変更。 * empty-trash のとき goto-folder で 'force-update するようにした。 1998-05-15 Yuuichi Teranishi * v0.1.1 - "Amanda". internal release. * 00README.ja, sample.addresses, sample.folders。 * wl-vars.el の整理。 * はやりにのって X-MimeOLE: を加えるようにしてみた。 * XEmacs の 'dragdrop に対応。wl-dnd.el 1998-05-08 Yuuichi Teranishi * wl-folder.el 再帰的 folder パーサ。 1998-05-01 Yuuichi Teranishi * Wanderlust としてパッケージ化 (v0.1.0)。変更が多すぎて記録できず。 (wl-draft.el/wl-address.el/wl-highlight.el の追加, SEMI/tm の API への対応, mule2.3 で動くようにする, 等) 1998-04-17 Yuuichi Teranishi * nntp で 存在しないグループの max-of-folder がこけるバグとり。 1998-04-13 Yuuichi Teranishi * create-summary-line で From が nil の場合に対処。Date も。 * folder-quit で kill-buffer に引数渡すの忘れてた。 * nntp で同じグループへの操作が続いた場合にこけるバグとり。 * Makefile で lp.el の依存関係を修正 (Report by te@isl.ntt.co.jp)。 1998-03-26 Yuuichi Teranishi * v0.09 * Summary の文字化けを解消、でも mule2.3 でうごかなくなった。 * update したとき、減ったメッセージがバッファから消えないバグをとる。 * v0.08 * IMAP4 に対応。 1998-03-20 Yuuichi Teranishi * folder diff を integer list の比較に帰着させることにより高速化。 1998-03-19 Yuuichi Teranishi * v0.07 * Mule-2.3 に対応。 * update と scan-all を統合。 * あとで見直したいメッセージにつけるマーク、"$" -- important mark を 新設。 * update が必要かどうかのチェックを list の比較に帰着させて高速化。 * インデックスのキャッシュ用に buffer-local-variable を設け、 同じバッファに対する2回目以降の更新操作を高速化。 * mt で現在のスレッドに一括 "*" マーク。 * c で全てのメッセージを一括して既読に。 1998-03-16 Yuuichi Teranishi * v0.06 * 表示幅を一定にする。 * update を軽くする。 * メッセージが減ったことも update。 * cache インサート時にマークをリジューム。 * font-lock の regexp を変更。 1998-03-13 Yuuichi Teranishi * v0.05 * 未読マーク、"!"。 * update scan。 * font-lock。 * 曜日の英語/日本語切替えを可能に。 * Petname。 1998-03-10 Yuuichi Teranishi * v0.04 * 曜日を日本語で表示。 * フィールド値の獲得に失敗しないように overview 作成時の coding-system-for-read を 'junet に拘束。 1998-03-10 Yuuichi Teranishi * v0.03 * インデックスの elisp オブジェクト化により高速化。 * Date を出す * 同じスレッドでも、違う Subject なら表示 1998-03-06 Yuuichi Teranishi * v0.02 * スレッドの間違いを直す * indent-level をカスタマイズできるようにする。 1998-03-05 Yuuichi Teranishi * v0.01 Summary をスレッド表示できるだけのプロトタイプ。 wanderlust-wanderlust-769699d/etc/ChangeLog.2000066400000000000000000001331631406661363500211010ustar00rootroot000000000000001999-05-18 Tsunehiko Baba * New File: [ChangeLog.en]. 1999-05-18 A. SAGATA * Fix: mouse-2 does not work in Message buffer. 1999-05-18 Yuuichi Teranishi * 1.0.0 pre2 - "Kokomo-pre2". * Fix: region of hilighting varies when the number of unread messages is decreased. (pointed out by Toshihiko Koadama ). * Change: C-cC-s in draft and keybind of menubar is set as local-set-key in each draft bufer. * Fix: wl-summary-mark-as-read-all does not work well when target messages is hidden in close threads. (pointed out by Hajime Ohsawa ). 1999-05-18 Masahiro MURATA * Fix: insert mail body into a different position from position specified by wl-draft-prepared-config-alist in wl-summary-reply-with-citation. 1999-05-17 Ken'ichi OKADA * Change: [bbdb-wl.el]. corresponding to change from wl-folder-exit-hook to wl-exit-hook. 1999-05-17 Yuuichi Teranishi * pre 1.0.0 - "Kokomo-pre". * Change: not use replace-match(). 1999-05-17 Ken'ichi OKADA * Add: [wl-ja.texi] about POP-before-SMTP. * Change: corresponding to POP-before-SMTP. 1999-05-17 OKUNISHI Fujikazu * Change: add elmo-multi-get-msg-filename(). * Change: wl-message-refer-article-or-url() corresponds to "mailto:". 1999-05-17 Masahiro MURATA * Fix: not change wl-folder-buffer-cur-{path|entity-id}, when wl-summary-goto-folder is executed at interactive. * Change: not expire when, 2nd and 3rd elements of wl-expire-alist is nil. 1999-05-17 Ken'ichi OKADA * Add: [wl-ja.texi] about AUTHINFO. 1999-05-17 A.SAGATA * Fix: hilighting at a line pointed by a mouse. 1999-05-17 Yuuichi Teranishi * Change: remove BETA. * Fix: toobar is not available at Folders on XEmacs. * Fix: merging partial does not work well when Subjects are written in Japanese. * 0.10.3 - "Jumpin' Jack Flash". 1999-05-16 Yuuichi Teranishi * Fix: not consider WL_PREFIX, ELMO_PREFIX when doing "make uninstall". * Change: not use (point-at-bol), (point-at-eol) for Mule2.3. * Change: wl-folder-exit-hook -> wl-exit-hook。 * Change: rename wl-folder-exit -> wl-exit。 * Change: update ja.Emacs. * Add: [wl-ja.texi] about wl-summary-print-message. 1999-05-16 Masahiro MURATA * Fix: not delete a message buffer when there are no unread messages, even if wl-auto-select-first is t. 1999-05-15 Yuuichi Teranishi * Add: [wl-ja.texi] about highlight、internal Folder. * Change: defvars in wl-highlight move into wl-vars, and is set as defcustom. * Fix: error happens when selecting nntp Folder in unplugged. (pointed out by MARUYAMA Yoshio ). * Fix: some inconvinience related to Stick Summary happen when wl-stay-folder-window is t. * Change: hilighting a line pointed by a mouse on Summary from begging of line to end. * Change: change an order of initizalization and messages in wl-init. not check existence of basic Folder with prefix-arg. * Change: save view cache when exiting Sticky Summary. 1999-05-14 OKUNISHI Fujikazu * Fix: not call wl-mail-setup-hook when doing wl-summary-reedit(). 1999-05-14 Masahiro MURATA * Fix: modificaton of wl-summary-next-folder-or-exit() is not considered in case that wl-auto-select-first is t. * Change: change of move command is enable when wl-summary-next-no-unread is t. 1999-05-14 Ken'ichi OKADA * Add: [wl-ja.texi] about wl-draft-write-current-newsgroup. 1999-05-13 A.SAGATA * Change: hilight mouse-face without useing mode-motion-hook. * Change: add wl-version-show. 1999-05-13 Koichiro Ohba * Add: [wl-ja.texi] about Sticky Summary. 1999-05-13 Ken'ichi OKADA * Fix: select an unexpected window after doing wl-summary-forward at a Folder wl-summary-stick does. 1999-05-13 Masahiro MURATA * Change: do wl-template without using recursive-edit. 1999-05-13 Yuuichi Teranishi * Change: add 'x-face as a sub function of wl-draft-config-alist. * Change: [wl-template] hilight select buffer. 1999-05-13 Mito * Change: do (wl-summary-toggle-disp-msg 'off) in wl-summary-next-folder-or-exit() in order to avoid the event that previous message is displayed when moveing to other folders. * Fix: error happens when calling wl-summary-toggle-disp-msg() if its arg is off. 1999-05-13 Masahiro MURATA * Fix: error happens when NNTP Folder is updated by wl-folder-update-recursive-current-entity. 1999-05-13 Yuuichi Teranishi * Fix: caching does not work in pop3 and imap4, nntp when elmo-*-use-cache is nil. (pointed out by Masahiro MURATA ). 1999-05-12 OKUNISHI -GTO- Fujikazu * Fix: not read messages in localnews. args of elmo-localnews-local-file-p() is not enough. 1999-05-12 Yuuichi Teranishi * 0.10.2 - "I'm Your Man". 1999-05-12 A. SAGATA * Add: [wl-ja.texi] about some commands. 1999-05-12 Koichiro Ohba * Add: [sample.dot.wl] about auto-refile configuration. * Add: [wl-ja.texi] about wl-summary-auto-refile-skip-marks. 1999-05-12 Masahiro MURATA * Fix: checking newsgroups with upper case letters fails. 1999-05-12 Yuuichi Teranishi * Fix: read message is not cached in localdir. * New Variables: wl-ps-print-buffer-func. assign a function in ps-print. default is 'ps-print-buffer-with-faces. (requested by Mito ). * Change: display an error message if same name exists between group and petname when analyzing .folders. 1999-05-11 Masahiro MURATA * Change: update sample.dot.wl. * Fix: description about access group and so on. 1999-05-11 OKUNISHI -GTO- Fujikazu * Fix: when messages targeted for "$" in filter Folder are local files, they are marked but not cached. 1999-05-11 Yuuichi Teranishi * Change: implement partial unification functions for tm. * Fix: wl-defface does not work on Nemacs. * Change: speed up wl-summary-exec. * Fix: not assign 'D' on Summary. * Fix: when deleting messages in imap4, the case they are not deleted from msgdb exists in some thread circumstances. * Change: do (sit-for 0) in order to display results at once in wl-folder-check-one-entity. * Change: wl-message-redisplay-hook is unwind-protected in order to make a cursor position a return to Summary when doing C-g at a prompt like bbdb. 1999-05-10 Tomokazu Matsumaru * Fix: hang up POP3 Folder with a lot of messages. 1999-05-10 Yuuichi Teranishi * New Variable: wl-folder-sync-range-alist, wl-default-sync-range. change default of sync in each folder is enable. (requested by Toshihiro KAMISHIMA ). * Fix: "make" command fails on Mule 2.3. (pointed out by Toshihiko Koadama ). * Fix: display letters in an unexpected code because wl-vars.el is written by EUC. (pointed out by Masahiro MURATA ). * 0.10.1 - "Harlem Shuffle". 1999-05-09 Yuuichi Teranishi * Fix: (maybe) make current Folder strange when doing C-g while select-folder in imap4. (pointed by Mizuhara ). * New Variable: elmo-archive-use-cache、elmo-nntp-use-cache, elmo-imap4-use-cache、elmo-pop3-use-cache. determine each read message to cache or not * Change: do away with wl-no-cache-folder-list. * Change: cache is enable at once after marking as important-mark. 1999-05-08 Koichiro Ohba * Change: [wl-ja.texi] typo and so on. 1999-05-08 OKUNISHI Fujikazu * Change: [wl-ja.texi] typo and so on. 1999-05-05 OKUNISHI Fujikazu * Fix: a cursor does not return to Summary from message buffer after wl-message-prev-page() in the case that ^L is used for starting a new page. * Change: do rename-file() for *.elc files when doing "make install". * Change: because mode-motion-hook is particular for XEmacs, delete error messages when it is byte-compiled on GNU Emacs. 1999-05-05 OKUNISHI -GTO- Fujikazu * Fix: errors happens in wl-summary-refile-region, wl-summary-copy-region, wl-thread-refile, wl-thread-copy. 1999-05-05 Masahiro MURATA * Fix: [elmo-{nntp|imap4|pop3}.el] case-fold-search is not enable in target buffer. 1999-05-04 Masahiro MURATA * Fix: variables of wl-draft-config-alist are not enable when wl-draft-send is aborted once and retried. 1999-05-01 OKAZAKI Tetsurou * Change: in NNTP Folder enable to read newsgroup having top categories whose initials are numeral. 1999-04-30 Masahiro MURATA * New Function: wl-defface. define face as portable. 1999-04-30 Yuuichi Teranishi * Fix: duplicate a name part of folder when re-editing drafts on edit from Summary. (pointed out by OKAZAKI Tetsurou ). * Fix: asking where to jump when doing s->rescan in empty Folder occurs. (pointed out by OKAZAKI Tetsurou ). * Change: [bbdb-wl] add (require 'wl). * Fix: asking where to jump when doing wl-thread-open-close at a message with no children and no parents of threads. * New Commands: wl-summary-drop-unsync, wl-folder-drop-unsync-current-entity. make all not synchronous messages no existence. assing as 'D'. 1999-04-28 Masahiro MURATA * New Variable: wl-draft-prepared-config-alist. extend some functions in wl-draft-config-alist. * New File: [wl-template]. new feature to select or insert template on draft buffer. 1999-04-28 Yuuichi Teranishi * Change: use wl-draft-mode-map except excepting Nemacs. (advised by Masahiro MURATA ) 1999-04-13 Masahiro MURATA * Fix: case-fold-search on Summery buffer is always treated as nil. * Fix: return value when elmo-nntp-open-connection fails is different from it written in docstring. 1999-04-28 Mito * Fix: mail send command fails when wl-draft-buffer-cur-summary-buffer is #. 1999-04-27 Mito * Change: execute confirmation when printing out by '#' on Summary. 1999-04-27 Ken'ichi OKADA * Fix: wl-summary-refile-region works wrong. 1999-04-27 Yuuichi Teranishi * Fix: not work on Nemacs. * Fix: problems happen when custom does not exist. * Fix: merge forgotten patches (including modification for POP3 hang-up problem). (pointed out by A.SAGATA ). * 0.10.0 - "Got My Mind Set On You". * Fix: localnews is not treated as local in wl-summary-local-p. (reported by Kentaro Toda ) 1999-04-26 Yuuichi Teranishi * Change: implement each backend function of elmo-internal.el. * Fix: modify (get-buffer wl-summary-buffer-name) all over for correspondence to Sticky Summary. * New command: wl-summary-stick. change present summary to be sticky. assign it as \M-s. 1999-04-23 Yuuichi Teranishi * Change: rewrite partial unification functions for SEMI. * Change: [bbdb-wl]. corresponding to Sticky Summary. * Fix: wl-default-draft-cite works wrong. (set a wrong citation title when a cursor on Summary get out of position.) 1999-04-23 A. SAGATA * Fix: jump to right message-id by clicking center of left message-id when body has two message-id at one line. 1999-04-23 Ken'ichi OKADA * Fix: error happens if it is empty when doing wl-thread-{copy,refile} at end of line on wl-summary mode. 1999-04-22 Yuuichi Teranishi * Change: moves to Sticky Summary when moving to Folder with prefix arg. (former "wl-folder-goto-folder、wl-summary-goto-folder" changes to wl-folder-goto-folder-subr、wl-summary-goto-folder-subr respectively.) * Change: not re-highlight on draft-buffer by "^L" when wl-highlight-body-too is nil. (modified by A.SAGATA ). * Change: Sticky Summary. (requested by Mito ). * Change: mmelmo-imap4 succeeds to mmelmo. 1999-04-21 A. SAGATA * Fix: some bugs in wl-folder-close-parent-entity. * Change: extend functions of wl-thread-open-close in order to close its parents when having no children. * Change: wl-folder-close-parent-entity -> wl-folder-open-close. * Change: assign wl-folder-open-close as "/". 1999-04-21 Mito * Change: expand nested aliases. 1999-04-21 Yuuichi Teranishi * Fix: not set cursor at a first message in wl-summary-goto-folder when wl-summary-move-order is 'new and the message is marked as "$" and no marks excepting "$" exists in Folder. * Fix: doing wl-summary-cursor-down twice(!) in wl-summary-goto-folder. 1999-04-21 Kazuyuki IENAGA * corresponding to custom. 1999-04-21 Masahiro MURATA * Fix: not enable to get get information of folders with host name in the case that server append extra messages to response against group commands, ex. leafnode. 1999-04-20 Yuuichi Teranishi * New File: [elmo-internal.el]. Folder for browsing internal data. 1999-04-19 A. SAGATA * New Variable: wl-draft-highlight-and-recenter. recenter after hilighting by C-l on draft. * Fix: [elmo-nntp.el]. args of elmo-nntp-search are wrong. 1999-04-19 Takaaki MORIYAMA * Change: enable to specify port number in folder definition of nntp. 1999-04-19 Yuuichi Teranishi * Change: delete keybind \M-O (wl-summary-copy-prev-destination) to avoid the problems as to a cursor on vt-100. (pointed out by SUGANO KEI , advised by A.SAGATA ). * Fix: each message number is always set as 0 when the number of messages is beyond 6 digits. (pointed out by A.SAGATA ). 1999-04-19 Ken'ichi OKADA * Fix: not display additional messages on offline when visiting destination Folder after doing offline refile/copy. * Change: execute processing of unread messages on offline. 1999-04-19 A. SAGATA * Change: delete keybind \M-O in Summary. 1999-04-17 Koichiro Ohba * Add: [wl-ja.texi]. about wl-summary-auto-refile. * Add: [wl-ja.texi]. about wl-summary-auto-refile. * Change: [sample.dot.wl]. disable to add Mail-Followup-To and Mail-Reply-To by itself. 1999-04-14 Yuuichi Teranishi * Change: changes mode of draft buffer to wl-draft-mode that mail-mode derived. (advised by Shuhei KOBAYASHI ) * New Variable: [WL-ELS] WL_PREFIX、ELMO_PREFIX. install wl and elmo modules using each values as relative directory from ELISPDIR. default is "". (advised by Shuhei KOBAYASHI ). * Fix: when *.elc files compiled by other meacs exists, "make clean" does not work on other emacs because of loading WL-ELS. * Fix: POP hangs up when multiple messages exist. (reported by Ishikawa Ichiro ). 1999-04-13 OKAZAKI Tetsurou * Fix: [elmo-nntp.el]. about typo in docstring. 1999-04-12 A. SAGATA * Fix: all bodies change to signature-face when re-edting by "E" summary buffer. * Change: hilight at a line pointed by mouse in summary mode and folder mode on XEmacs only. 1999-04-12 Yuuichi Teranishi * Fix: when on draft a line begins from TAB and the next field is empty bug to delete the line happens. (pointed put by A.SAGATA ). * Fix: buffer displaying in wrong code remains when doing C-g at once after typing 'q' on Summary. (pointed out by Abe ). * Fix: pick up Japanese Subject fails on XEmacs. (pointed out by A.SAGATA ). * Add: [ChangeLog]. forget to add a modification against the problem elmo-nntp-get-folders-info hangs up on 4/2. (pointed out by Nakagawa Makoto ). * 0.9.8 - "Faith". 1999-04-10 Yuuichi Teranishi * New Variable: elmo-msgid-replace-string-alist. define rules of conversion from message-id to cache file name. 1999-04-09 Yuuichi Teranishi * Fix: [elmo-imap4.el]. LOGIN certification fails when password includes brank space. (reported by Tadashi KUMANO ). 1999-04-07 Ken'ichi OKADA * Change: [NNTP] corresponding to AUTHINFO. 1999-04-07 Yuuichi Teranishi * Change: re-load by C-u even if caches exist. * Change: enable to start up by C-g even if network is not connected when initializing. 1999-04-06 SHIMADA Mitsunobu * Fix: the bugs to fail to delete or refile mails in Maildir occur. 1999-04-03 OKAZAKI Tetsurou * Fix: [wl-ja.texi]. description about default value of wl-insert-mail-(followup|reply)-to is wrong. 1999-04-02 Masahiro MURATA * New Variable: elmo-nntp-get-folders-securely. when non-nil, modification to avoid elmo-nntp-get-folders-info not returing is enable. default is nil. 1999-04-02 Nakagawa Makoto * Fix: the bug that elmo-nntp-get-folders-info does not return and hangs up occurs on cnews(?). 1999-03-31 Yuuichi Teranishi * Change: change petname-alist to obarray. * New Variable: wl-summary-divide-thread-when-subject-changed. makes thread when subject changes if it is t. (requested by akira yamada ). * New Variable: wl-summary-subject-filter-func. assign a function to process before comparison with subjects. * Change: not funcall wl-summary-from-func and wl-summary-subject-func, wl-summary-subject-filter-func and fset them at startup. * Change: change wl-draft-config-exec-flag to buffer local variable. * Fix: error happens by M->j->q on Summary. (pointed out by Ken'ichi OKADA ). * Change: default of face for signature is set as colorful fonts. 1999-03-30 Ken'ichi OKADA * Change: disable to do 'd' at an empty line. * Fix: if there are multiple articles with target message-id in same folder, elmo-imap4-delete-msg-by-id fails when doing elmo-dop-queue-flush after deleting one of messages. 1999-03-29 A. SAGATA * Change: detect signature region wiser. * Change: hilight signature. 1999-03-26 Yuuichi Teranishi * Fix: summary is wrongly displayed when doing goto-folder to present (same) folder. (pointed out by OKUNISHI Fujikazu ). * New Variable: wl-draft-clone-local-variable-regexp. default is "^mime". copy values of local variables matching its value to sending buffer. 1999-03-26 Ken'ichi OKADA * New Command: wl-summary-write-current-newsgroup. do completiton of Newsgroup: field and prepare draft buffer when posting messages to the current-folder newsgroup in Summary mode. assign 'W'. 1999-03-25 Hidekazu NAKAMURA * Fix: not call wl-mail-setup-hook in wl-summary-forward(). 1999-03-25 Yuuichi Teranishi * Fix: merge MURATA's patch that lambda expression is available in wl-draft-config-alist. 1999-03-25 Masahiro MURATA * Fix: not decode file created by only one message in wl-summary-temp-mark-uudecode. 1999-03-24 Yuuichi Teranishi * Fix: not send messages when default-case-fold-search is nil. (pointed out by Kenji Kuzuhara ). 1999-03-24 Ken'ichi OKADA * New Command: wl-folder-close-parent-entity. assign M-SPC. * New Variable: wl-draft-config-exec-flag. execute wl-draft-config-exec only once. 1999-03-21 Yuuichi Teranishi * Fix: [im-wl.el] (again). message-id is wrongly added when wl-insert-message-id is nil. (pointed out by Ishikawa Ichiro ). * Fix: (again) warning messages appear on xemacs with (featurep 'xpm) and -nw option when startup. (pointed out by A.SAGATA ). 1999-03-18 A.SAGATA * Add: [wl-ja.texi]. about completion. * Change: when doing completion of headers like "To:" or "Cc:" in draft completion from lower case letters is enable. 1999-03-18 Yuuichi Teranishi * 0.9.7 - "Everything She Wants". * Fix: abort creating msgdb when there are some messages with strange date in multi Folder. 1999-03-17 A.SAGATA * Add: a function to edit petname interactively. 1999-03-17 Yuuichi Teranishi * Fix: can do nothing in present folder when aborting to refile messages to non-existent IMAP folder. (pointed out by Abe ). * Change: dot distinguish between groups and normal Folders in wl-folder-next-unsync. * Fix: messages is incomplete when doing syncing by toolbar button on XEmacs. 1999-03-12 Tsunehiko Baba * Fix: [00README]. 1999-03-12 Masato Taruishi * Add: [00README]. 1999-03-12 Yuuichi Teranishi * Change: if a partial failure occurs in refile or copy, it does not affect the whole action. * Change: [wl-ja.texi]. change construction of each section to be obvious in using pTeX. (pointed out by Morifuji ) 1999-03-09 Yuuichi Teranishi * Change: fix confusing problem that cursor moving to end of buffer while doing refile. 1999-03-06 Ishikawa Ichiro * Fix: [im-wl.el]. message-id is wrongly added when wl-insert-message-id is nil. 1999-03-04 Yuuichi Teranishi * Change: [tm-wl.el]. not use (fset 'mime-preview/x-face-function-use-highlight-headers nil) in tm-wl-setup. (pointed out by A.SAGATA ). * New Command: wl-summary-refile-prev-destination. assign 'M-o'. (requested by A.SAGATA ). * New Command: wl-summary-copy-prev-destination. assign 'M-O'. 1999-03-05 A.SAGATA * Fix: '\n' is wrongly inserted into User-Agent: when using tm. * Change: corresponding to subject like [???, 0000]. 1999-03-04 A.SAGATA * Fix: warning messages appear on xemacs with (featurep 'xpm) and -nw option when startup. * New Variable: wl-auto-insert-x-face. default is t. * Change: when wl-auto-insert-x-face is t and ~/.xface exists it is automatically inserted. (as usual, default) * Change: insertion of X-Face: by wl-draft-insert-x-face-field is enable when making draft. * Change: error messages are displayed if ~/.xface does not exist when doing C-c C-a. 1999-03-03 A.SAGATA * New Hook: hook wl-summary-refile-hook. 1999-03-03 Hajime MORITO * Change: [wl-ja.texi]. remove errors in using ptex. * Fix: [wl-ja.texi]. not display '{','}'. 1999-03-03 Yuuichi Teranishi * 0.9.6 - "Dirty Diana". * Change: [elmo] avoid the problem that expiring cache is disable when there is a strange cache file. * New Variable: wl-summary-auto-refile-skip-marks. unread messages is not target of auto-refile. (requested by Koichiro Ohba ). * Fix: set extra(!) unread flag when displaying messages in imap4 * Change: [wl-ja.texi]. delete about wl-summary-wday-use-japanese. add about wl-summary-weekday-name-lang. (pointed out by Kunihiro Ishiguro ). * Add: [wl-ja.texi]. about wl-summary-fix-timezone. (pointed out by Iba ). 1999-03-01 Hermit-chan * Fix: errors happen if M-x wl-draft is done before M-x wl when wl-draft-folder is configured. 1999-03-01 Akihiro Motoki * Fix: [wl-highlight.el, ChangeLog]. typo. 1999-03-01 Yuuichi Teranishi * Fix: not distinguish between all events excepting XEmacs key in wl-ask-folder. 1999-02-28 Masahiro MURATA * Change: extend expression of wl-draft-config-alist. 1999-02-26 TSUMURA Tomoaki * Change: [wl-refile.el]. do downcase in getting extra-field. * Change: [wl-refile.el]. delete unnecessary variables. 1999-02-26 OKAZAKI Tetsurou * Fix: menues of Summary 1999-02-25 OKUNISHI Fujikazu * Fix: fail to check unread messages in filter Folder. 1999-02-10 OKUNISHI Fujikazu * Change: avoid font-lock being enable in draft. 1999-02-24 Yuuichi Teranishi * 0.9.5 - "California Girls". 1999-02-25 Masahiro MURATA * Change: not display minus number and do synchronization when wl-folder-notify-deleted is 'sync. 1999-02-24 Yuuichi Teranishi * New Variable: wl-folder-notify-deleted. display minus number when messages are deleted. default is nil. * Change: execute wl-summary-auto-refile by default in closing threads. execute it in opening all threads if with Prefix argument. * New Variable: wl-x-face-file. default is "~/.xface". 1999-02-16 Ken'ichi OKADA * New Variables: elmo-passwd-alist-{load,save}. load/save password from/to file configured by new variable elmo-passwd-alist-file-name. 1999-02-11 Tsunehiko Baba * Add: [wl-ja.texi]. about "~/.xface". 1999-02-06 TSUMURA Tomoaki * Change: concatinate "\n" firstly before insert header by wl-draft-replace-field. 1999-02-06 Ken'ichi OKADA * Change: in imap unread information is reported to destination of copy. 1999-02-05 Yuuichi Teranishi * New Variable: wl-highlight-refile-destination-face. face for destination of refile. * Fix: [wl-ja.texi]. about '$'. (advised by GOTO ) 1999-02-04 Yuuichi Teranishi * Fix: hilighting is wrong after checking unread messages in folders on XEmacs. 1999-02-03 Ken'ichi OKADA * New Variable: wl-folder-prefetch-entity. assign 'I'. 1999-02-03 Teruki SHIGITANI * Change: [sample.dot.wl]. function to refer folder name in my-wl-summary-from-func-petname is called in summary-mode only. 1999-02-03 TSUMURA Tomoaki * New Functions: wl-summary-auto-refile, wl-refile-rule-alist. 1999-02-02 IMAI Takeshi * Fix: errors happen when doing refile to imap folder in wl-expire. 1999-01-29 Akihiro Motoki * Change: do widen when views in Summary mode is saved into cache. 1999-01-22 Masahiro MURATA * Change: extend wl-auto-check-folder-name. 1999-01-19 Masahiro MURATA * Change: update summary information before doing expire in folder mode. * Fix: errors happen because of omission of reserve-marked-msg when no messages to expire exist. * Change: give consideration to year change in elmo-datevec-substitute. 1999-01-19 Yuuichi Teranishi * New Variables: wl-auto-uncheck-folder-list, wl-auto-check-folder-list. skip checking group when startup. checking archive folders is skipped by default. (requested by Akihiro Motoki ). * Fix: [elmo-nntp.el]. getting message-id from server does not work well. 1999-01-18 Yuuichi Teranishi * Add: [wl-ja.texi]. about mA, mf and so on. * Change: not jump to groups having no unread messages in wl-folder-{prev,next}-unread. (if with Prefix ARG, jumps). (pointed out by Ken'ichi OKADA ). * Change: avoid errors when no folders exist in wl-folder-check-entity. (pointed out by Ishikawa Ichiro ). 1999-01-16 OKUNISHI Fujikazu * New Variable: wl-summary-temp-mark-uudecode. * Change: [wl-ja.texi]. about @item->@defvar. 1999-01-15 OKUNISHI Fujikazu * Fix: errors happen because of doing reference to non-existent property when non-existent folders in ~/.foders is specified in wl-{folder|summary}-goto-folder. 1999-01-15 TSUMURA Tomoaki * Change: [elmo-archive.el]. check footer in header-regexp. * CHange: [elmo-archive.el]. make compression rate of rar high. 1999-01-15 Masahiro MURATA * Fix: wl-expire does not work on Emacs based on 19.28. * Fix: [wl-fldmgr.el]. wl-fldmgr-add does not work on Emacs-19. 1999-01-14 Masahiro MURATA * Fix: not create hierarchical structure of access groups on Emacs-19 or before. * Fix: [wl-fldmgr.el]. errors happen when inserting folder into empty folder. * Change: [wl-expire.el]. stop process in displaying error when calling elmo fails. 1999-01-14 Yuuichi Teranishi * Change: implement wl-summary-temp-mark-prefetch, which does not work well, again. (pointed out by Ken'ichi OKADA ). * Fix: a subject of mail prepared in draft buffer is displayed in way of including ESC code when trying to reply mails with Japanese subject on Meadow. (pointed out by Koji IIDA ). 1999-01-13 TSUMURA Tomoaki * Change: LHA archive is enable on Windows. 1999-01-13 Yuuichi Teranishi * 0.9.4 - "Broken Wings". * Fix: not load information of all folders when both wl-folder-init-no-load-access-folders and wl-folder-init-load-access-folders are nil. * Fix: fetch errors happen when visiting to same folder after leaving from multi folder in NNTP. 1999-01-13 Masahiro MURATA * Change: change wl-folder-entity-alist and wl-folder-entity-id-name-alist to obarray (hashtable). * Change: merge wl-folder-entity-alist and elmo-folder-info-alist. * Change: fasten display update when checking. abolish variable wl-folder-check-fast. * Change: definition of folder of access group loaded in initialization is enable. * Change: getting lists of access group in hierarchical structure is enable. * Change: change mark of unsubscribe folders to '#'. * Change: display elapse time in case that processing of operations in folder mode take a lot of time. 1999-01-13 Yuuichi Teranishi * Change: make wl-tmp-dir if it does not exist. (pointed out by Tadashi Kadowaki ). * Change: make wl-queue-folder when startup if it does not exist. 1999-01-12 Ken'ichi OKADA * Fix: xpm is not in center in wl-demo in case that window-width is 100, for example. 1999-01-12 TSUMURA Tomoaki * Change: [elmo-archive.el]. add parameter of rar and fix for windows-nt. 1999-01-12 Yuuichi Teranishi * Change: [elmo-nntp.el]. display all newsgroups by "-/". (pointed out by Ichiro Ishikawa ). (notes: this chenge is overwritten by MURATA's patch on 1999-1-13). * Fix: behaviour in filter folder at unplugged is wrong. * Add: 'mA' (reply with multiple citation to messages with temporary mark). 'mf' (multiple forward messages with temporary mark). (北目さん の御要望に基づく)。 * Fix: cache is not saved when leaving from Summary after being at unplugged. * Change: [elmo-nntp.el]. corresponding to Cancel-Lock. 1999-01-08 Yuuichi Teranishi * Change: [wl-dnd.el]. adjust it to API on XEmacs21.2.8. 1999-01-08 Masahiro MURATA * Fix: not include parent folders in elmo-localdir-list-folders-subr. 1999-01-06 Ken'ichi OKADA * New Hook: wl-highlight-message-hook. 1999-01-05 OKUNISHI Fujikazu * Change: [elmo-util.el]. specification of elmo-default-imap4-server in a form such as "hoge%imap_server@gw" is enable. 1999-01-05 Hironori Fukuchi * Fix: sending process fails though the message "sending...done" is displayed in minibuffer when non-existent address is written in To field. 1999-01-03 OKUNISHI Fujikazu * Fix: To: field is always set as nil because of type in wl-draft-edit-string. 1998-12-31 OKUNISHI Fujikazu * Fix: wrongly duplicate parent folder having sub directory in elmo-localdir-list-folders-subr. * Change: wl-break-pages is restricted by being always nil in wl-summary-redisplay-no-mime. * Change: return value of two or more lower directories in elmo-localdir-list-folders-subr even if file system does not have concept of link count. (it is enable on OS/2 version variant and Mule for Win32 by default). * Change: delete uselessness functions not called. 1998-12-27 Masahiro MURATA * Fix: errors happen when folder having the same name as group exists before the group. 1998-12-27 OKUNISHI Fujikazu * Change: [wl-folder.el]. not move to all folders and only do catchup for folders with new/unread messages in wl-folder-mark-as-read-all-current-entity (for speed up). 1998-12-25 Yuuichi Teranishi * Fix: modification to fix display of summary in wrong code does not work on Emacs 20.2 or below including Meadow. (pointed out by Tsunehiko Baba ). 1998-12-24 Yuuichi Teranishi * 0.9.3 - "Last Christmas". Christmas limited version(?). 1998-12-23 Masahiro MURATA * Change: fix not to use "/" as pass separator. * CHange: replace delq with delete if possible. 1998-12-21 Masahiro MURATA * New File: [wl-expire.el]. add a new feature to delete or move old messages automatically. * Change: be to autoload wl-fldmgr.el. * Change: [wl-folder.el]. arrange and speed up some commands related with automatic open of groups. * Change: not load LOGO files excepting XEmacs in byte-compiling wl-demo.el. * Fix: [elmo-archive.el]. errors happen if directories do not exist in elmo-archive-list-folders when elmo-archive-treat-file is non-nil. * Fix: last two patches in [WL 838] is not used. 1998-12-21 Yuuichi Teranishi * Change: avoid wrong type argument errors when errors happen in sending process on XEmacs. (pointed out by Toshihiro KAMISHIMA ). 1998-12-18 Yuuichi Teranishi * Change: show an atmosphere like Christmas. * Change: use decoded letters as arg of wl-draft. (based on modification by Hidekazu NAKAMURA ). * Fix: display summary in wrong code on Emacs 20.2 or below including Meadow. (pointed out by Hidekazu NAKAMURA , Fujii ). 1998-12-17 Hidekazu NAKAMURA * Change: avoid result being "Re: Re:" in case of encoding letters including "Re:". 1998-12-17 Yuuichi Teranishi * 0.9.2 - "Addicted To Love". 1998-12-17 Masahiro MURATA * Fix: [wl-fldmgr.el]. possible to destory wl-folder-entity-id-name-alist when an empty folder is deleted. * Change: [elmo-archive.el]. to use a function in method is enable. * Change: [elmo-archive.el]. to add or to delete messages is enable in 'tgz. change suffix of 'tgz to ".tar.gz". * Fix: [elmo-archive.el]. not give consideration to prefix in elmo-archive-msgdb-create-as-numlist-subr2. 1998-12-16 Yuuichi Teranishi * Change: replace contents of commands in menu for mail with it for wl in draft buffer. * Change: define open-network-stream-as-binary if it is not defined so that smtp.el works well when the latest version apel is not used. * Change: adjust smtp.el to the latest version FLIM. 1998-12-16 Masahiro MURATA * Fix: [wl-fldmgr.el]. wl-folder-newsgroups-hashtb is always nil when adding not nntp folders. 1998-12-16 Hidekazu NAKAMURA * Change: [WL-ELS]. not install smtp.el when using SEMI. 1998-12-15 Yuuichi Teranishi * Change: put date parts of In-Reply-To: in "". * Change: storage of summary created by wl-summary-rescan is executed in finishment of summary not but of scan. * New Variable: wl-folder-thread-indent-set-alist. enable to select indent letters of thread in each folder. change to use wl-thread-indent-level, wl-thread-have-younger-brother-str, wl-thread-youngest-child-str, wl-thread-vertical-str, wl-thread-horizontal-str, wl-thread-space-str as default value when nothing is matched by using rules defined by it. * New Variable: wl-folder-weekday-name-lang-alist. enable to select method to display day of the week in each folder. change to use wl-summary-weekday-name-lang as default value when nothing is matched by rules defined by it. * Fix: [elmo-nntp.el, elmo-imap4.el, elmo-msgdb.el]. display Chinese or Hangul letters in wrong code because of wrong creattion of Subject or From for saving msgdb. * Change: to {insert|store} cache of summary is done in as-binary-{input|output}-file, and to do encode/decode is done in mime-charst of each buffer. * Change: call elmo-create-folder even when wl-draft-folder does not exist in wl-init. * Change: become wl-generate-user-agent-string corresponding to Nemacs. insert version information of tm. * Fix: insert child thread into an unexpected position if target message is hidden in close thread when deleting messages. (maybe) * Change: [bbdb-wl.el]. do require necessary modules in byte-compiling. * Change: put smtp-via-smtp in (as-binary-process). (based on reports by Toshihiko Kodama and others). * Change: [wl-ja.texi]. @directory is enable by default. (pointed out by SENDA Shigeya ). 1998-12-13 Yuuichi Teranishi * New File: [wl-mule.el, wl-nemacs.el]. * Change: merge wl-nemacs and a main trunk. 1998-12-10 Masahiro MURATA * Fix: not refer Reference field instead of In-Reply-To field if In-Reply-To field contains no message-id. 1998-12-11 Yuuichi Teranishi * 0.9.1 - "Yankee Rose". 1998-12-10 Masahiro MURATA * Change: change name of draft buffer ("1" -> "+draft/1"). * New Variable: wl-jump-to-draft-buffer. * Change: processing of matching in wl-draft-config-alist continues when is succeeded once. * Add Hook: wl-draft-config-exec-hook. * New Variable: wl-draft-always-delete-myself. * Fix: elmo-archive-list-folder always returns nil wrongly when prefix of archive folder includes numeral. * Change: elmo-*-copy-msgs returns non-nil if suceeded. * Change: not execute deletion if processing of copy in elmo-move-msgs fails. 1998-12-10 Yuuichi Teranishi * Change: use elmo-match-string, elmo-match-buffer if possible. * Change: default value os wl-insert-mail-followup-to, wl-insert-mail-reply-to is nil. * Change: [wl-ja.info]. work well on Emacs 20.3. * Change: start up by "M-x wl-draft" work well. * Change: reduce warning messages in byte-compiling on Mule. 1998-12-10 TSUMURA Tomoaki * Fix: not update number-alist of msgdb after pack-number. 1998-12-10 Yuuichi Teranishi * Change: insert Bcc: field regardless of value of mail-self-blind when wl-bcc is defined (adjustment to an action of wl-fcc). 1998-12-10 Akihiro Motoki * New Variable: wl-bcc. put value of wl-bcc into Bcc: field when non-nil. 1998-12-10 SENDA Shigeya * Change: [wl-ja.texi]. fix for XEmacs. * Fix: [wl-ja.texi]. one vindex is lack. * Change: [WL-ELS]. install info when choosing install-package on XEmacs. 1998-12-10 Yuuichi Teranishi * Fix: when in the middle of thread there are any messages in close thread hereafter threads do not be inserted. 1998-12-09 Masahiro MURATA * Add Variables: elmo-move-msgs, elmo-copy-msgs, elmo-append-msg. move or copy in keeping number in source folder by elmo-{move|copy}-msg and copy in keeping number specified by elmo-append-msg. * Change: deal with multiple message once when copying from 'localdir to 'archive. 1998-12-09 Yuuichi Teranishi * 0.9.0 - "With Or Without You". * Change: [elmo-archive.el]. delete warning in byte-compiling. 1998-12-09 OKUNISHI Fujikazu * New File: [elmo-archive.el] "v0.16 [981208/alpha]". * Change: make folders of dst-spec in copy-msgs if not. (pointed out by Masayuki TERADA ). * Fix: regexp-quote() of suffix is not executed in get-archive-name when elmo-archive-treat-file is non-nil. 1998-12-09 Yuuichi Teranishi * Change: call elmo-create-folder if target folder does not exist in wl-folder-check-entity. * Change: call elmo-create-folder if wl-trash-folder does not exist in wl-init. (pointed out by OKUNISHI Fujikazu ). 1998-12-08 Yuuichi Teranishi * Change: reduce warnings in byte-compiling on XEmacs, Emacs. * Fix: errors happen because of wrong dealing with parent in processing of mime-entity in mmelmo-imap4. 1998-12-07 Yuuichi Teranishi * Fix: [00README.ja] address of ML is still old. 1998-12-06 Masahiro MURATA * Fix: ignore hereto of wl-summary-cursor-up when wl-summary-buffer-view is 'thread. * Fix: return value is wrongly nil if no success-mark exist and cursor goes into position of failure-mark when hereto is non-nil in wl-thread-jump-to-next-unread, wl-thread-jump-to-prev-unread. * Change: display progress of process in deletion of summary update. 1998-12-06 OKUNISHI Fujikazu * Change: remove debug code and display elapse time in elmo-localdir-pack-number. * Change: use SPEC in elmo-call-func in order to avoid free var based on data scope problem (for deletion of byte-compile warning). 1998-12-05 OKUNISHI Fujikazu * Fix: [wl-ja.texi]. some errors. 1998-12-05 Masahiro MURATA * New Variable: elmo-archive-treat-file. targets of archive folder are files when non-nil. 1998-12-04 Masahiro MURATA * Fix: temporary buffers created by elmo still remains after finishing WL. * Change: after doing wl-summary-rescan cursor goes into same position as before. * Change: two periods are not side by side in display of summary update. * Change: enable to compele value of Since and Before in wl-summary-pick. * Change: arrage lists of completing-read. * Change: not display messages if there are no marks excepting marks with low pirority by wl-summary-move-order even when wl-auto-select-first is t. * Change: return value is t when deletion by elmo-archive-delete-msgs is success. 1998-12-04 Yuuichi Teranishi * Change: call wl-summary-unread-message-hook in wl-summary-mark-as-read. 1998-12-04 Ken'ichi OKADA * New Hook: wl-summary-unread-message-hook. call it when reading unread messages. 1998-12-03 Masahiro MURATA * Fix: not update display after checking archive folder in folder mode. 1998-12-03 Yuuichi Teranishi * Change: make a branch for wl_nemacs corresponding to Nemacs. * Change: replace old smtp.el with smtp.el in flim-1.12. adjust to its API. (deletion of smtp-do-bcc, change of args of smtp-via-smtp). * Fix: always ignore wl-insert-message-id in im-wl.el. * Fix: errors display in a large size in wl-summary-prefetch-msg. * Change: speed up all operations of multi folder by replacement append with nconc. 1998-12-02 OKUNISHI Fujikazu Hironori Fukuchi * Fix: [wl-ja.texi]. fix some errors. 1998-12-02 Yuuichi Teranishi * alpha -> beta. * Change: move old ChangeLog to etc directory. wanderlust-wanderlust-769699d/etc/ChangeLog.2.ja000066400000000000000000001552061406661363500214740ustar00rootroot000000000000001999-05-18 Yuuichi Teranishi * 1.0.0 - "Kokomo" 1999-05-18 Tsunehiko Baba * 新規ファイル ChangeLog.en 追加。 1999-05-18 A. SAGATA * Message で mouse-2 が動かなくなっていたのを修正。 1999-05-18 Yuuichi Teranishi * 1.0.0 pre2 - "Kokomo-pre2" * Folder で グループの中の未読数が減るとハイライトの範囲が変わ ってしまうのを修正。 (小玉さん の御指摘) * Draft の C-cC-s と menubar のキーバインドはドラフトバッファ毎に local-set-key するようにした。 * wl-summary-mark-as-read-all が,スレッドが閉じた状態で隠れて いるメッセージに対して効かなくなっていたのを修正。 (大澤さん の御指摘) 1999-05-18 Masahiro MURATA (村田全寛) * wl-summary-reply-with-citation では wl-draft-prepared-config-alist での本文挿入位置が狂うのを修正 した。 1999-05-17 岡田 健一 * [bbdb.el] wl-folder-exit-hook -> wl-exit-hook に対応。 1999-05-17 Yuuichi Teranishi * pre 1.0.0 - "Kokomo-pre" * replace-match () を使わないようにした。 1999-05-17 岡田 健一 * POP-before-SMTP のドキュメント追加。 * POP-before-SMTP に対応。 1999-05-17 OKUNISHI Fujikazu * elmo-multi-get-msg-filename() が存在しなかったので追加。 * wl-message-refer-article-or-url() で mailto: を通す。 1999-05-17 Masahiro MURATA (村田全寛) * wl-summary-goto-folder を interactive で実行した場合, wl-folder-buffer-cur-{path|entity-id} が変更されないのを修正し た。 * wl-expire-alist の 2,3番目の要素のいずれかが nil の場合は expire しないようにした。 1999-05-17 岡田 健一 * AUTHINFO に関する部分のドキュメント追加。 1999-05-17 A.SAGATA * マウス行ハイライトのバグ修正。 1999-05-17 Yuuichi Teranishi * あちこちから BETA を取る。 * XEmacs で Folder に toolbar が付かなくなっていたのを修正。 * サブジェクトが日本語だと partial のマージがうまくいかないのを修正。 * 0.10.3 - "Jumpin' Jack Flash" 1999-05-16 Yuuichi Teranishi * make uninstall が WL_PREFIX, ELMO_PREFIX を考慮していなかったのを 修正。 * Mule2.3 向けに (point-at-bol), (point-at-eol) を使わないようにした。 * 名前変更 wl-folder-exit-hook -> wl-exit-hook。 * 名前変更 wl-folder-exit -> wl-exit。 * ja.Emacs を更新。 * [wl-ja.texi] wl-summary-print-message の説明追加。 1999-05-16 Masahiro MURATA (村田全寛) * wl-auto-select-first が t であっても未読がない場合, メッセージバッファが消えないのを修正。 1999-05-15 Yuuichi Teranishi * [wl-ja.texi] highlight、internal フォルダの説明を追加。 * wl-highlight からいくつかの defvar を wl-vars に移し、 defcustom にした。 * unplugged で nntp フォルダを選択するとエラーが出るのを修正。 (丸山さん より御指摘) * wl-stay-folder-window が t のとき、Sticky Summary が絡むと キャッシュが更新されないなどの不具合が発生していたのを修正。 * Summary のマウス行のハイライトを行頭から行末までにした。 * wl-init の初期化の順序とメッセージを一部変更。 prefix-arg つきでは、基本フォルダの存在をチェックしないようにした。 * Sticky Summary を exit するときに、ビューキャッシュも セーブするようにした。 1999-05-14 OKUNISHI Fujikazu * wl-summary-reedit() した時に wl-mail-setup-hook が参照されない のを修正。 1999-05-14 Masahiro MURATA (村田全寛) * wl-summary-next-folder-or-exit() の修正が wl-auto-select-first が t の場合が考慮されてないのを修正。 * wl-summary-next-no-unread が t のときの移動コマンドを変更でき るようにした。 1999-05-14 岡田 健一 * [wl-ja.texi] wl-draft-write-current-newsgroup のドキュメント追加。 1999-05-13 A.SAGATA * mode-motion-hook を用いずに mouse-face のhighlight を行う事にした。 * wl-version-show を追加した。 1999-05-13 Koichiro Ohba * [wl-ja.texi] Sticky Summary の説明を追加。 1999-05-13 岡田 健一 * wl-summary-stickしたフォルダで,wl-summary-forwardした後, 変なウインドウに行ってしまうのを修正。 1999-05-13 Masahiro MURATA (村田全寛) * wl-template が recursive-edit を使わないようにした。 1999-05-13 Yuuichi Teranishi * wl-draft-config-alist のサブ関数に 'x-face を追加。 * [wl-template] select バッファをハイライトするようにした。 1999-05-13 Mito * フォルダを移動しても、直前のメッセージが表示されたままなのを 避けるため wl-summary-next-folder-or-exit() で (wl-summary-toggle-disp-msg 'off) するようにした。 * wl-summary-toggle-disp-msg() で arg に off を指定して呼 び出した場合エラーが出るのを修正。 1999-05-13 Masahiro MURATA (村田全寛) * NNTP フォルダを wl-folder-update-recursive-current-entity で更 新するとエラーになるのを修正した。 1999-05-13 Yuuichi Teranishi * pop3, imap4, nntp で、elmo-*-use-cache が nil のときに uncached になってしまうのを修正。 (村田さん の御指摘) 1999-05-12 OKUNISHI -GTO- Fujikazu * localnews が読めなくなっていたバグを修正。また、 elmo-localnews-local-file-p() の引数が足りなかったのを修正。 1999-05-12 Yuuichi Teranishi * 0.10.2 - "I'm Your Man" 1999-05-12 A. SAGATA * [wl-ja.texi] いくつかのコマンドの説明を追加。 1999-05-12 Koichiro Ohba * [sample.dot.wl] auto-refile 設定を追加。 * [wl-ja.texi] wl-summary-auto-refile-skip-marks の説明を追加。 1999-05-12 Masahiro MURATA (村田全寛) * 大文字のニュースグループ名のチェックに失敗するのを修正。 1999-05-12 Yuuichi Teranishi * localdir で既読メッセージが uncached になってしまうのを修正。 * 新規変数 wl-ps-print-buffer-func。ps-print で使う関数を指定。 default は 'ps-print-buffer-with-faces。 (水戸さん の御要望に基づく)。 * .folders 解析時にグループと petname に同じ名前がでてきたら エラーを出すようにした。 1999-05-11 Masahiro MURATA (村田全寛) * sample.dot.wl を更新。 * アクセスグループの記述の修正他。 1999-05-11 OKUNISHI -GTO- Fujikazu * フィルタフォルダで "$" をつける対象がローカルファイルである 場合に、マークはつくがキャッシュできないバグを修正。 1999-05-11 Yuuichi Teranishi * tm 向け partial 結合関数を実装。 * Nemacs で wl-defface が動かなかったのを修正。 * wl-summary-exec を高速化。 * Summary に 'D' を割り振るのを忘れていた。 * imap4 のメッセージ削除時、スレッドの具合によっては msgdb から 削除されない場合があったのを修正。 * wl-folder-check-one-entity ですぐに結果が表示されるよう (sit-for 0) するようにした。 * wl-message-redisplay-hook を unwind-protect し、 bbdb などの prompt で C-g したときにも Summary にカーソルが戻るようにした。 1999-05-10 Tomokazu Matsumaru * たくさんメッセージがある POP3 フォルダがハングする問題を修正。 1999-05-10 Yuuichi Teranishi * 新規変数 wl-folder-sync-range-alist, wl-default-sync-range。 フォルダごとに sync のデフォルトを変えられるようにした。 (神嶌さんより御要望) * Mule 2.3 で make に失敗するのを修正。 (小玉さん の御指摘) * wl-vars.el が euc になっていてスレッド枝が文字化けするのを修正。 (村田さん の御指摘) * 0.10.1 - "Harlem Shuffle" 1999-05-09 Yuuichi Teranishi * imap4 で、select-folder 中に C-g すると、カレントフォルダが おかしくなるのを修正(したつもり)。 (水原@表千家 さんの御指摘) * 新規変数、elmo-archive-use-cache、elmo-nntp-use-cache elmo-imap4-use-cache、elmo-pop3-use-cache。 それぞれ、読んだ時にメッセージをキャッシュするかどうかを設定。 * wl-no-cache-folder-list -> 廃止。 * important-mark を付けた瞬間にキャッシュするようにした。 1999-05-08 Koichiro Ohba * [wl-ja.texi] typo 他の修正。 1999-05-08 OKUNISHI Fujikazu * [wl-ja.texi] typo 他の修正。 1999-05-05 OKUNISHI Fujikazu * ^L で改頁されてる時に限り wl-message-prev-page() するとカー ソルがメッセージバッファからサマリへ戻らないバグを修正。 * make install 時には *.elc は rename-file() する。 * mode-motion-hook は XEmacs 固有なため、GNU Emacs でバイトコ ンパイルするとエラーメッセージが出るのを黙らせる。 1999-05-05 OKUNISHI -GTO- Fujikazu * wl-summary-refile-region, wl-summary-copy-region, wl-thread-refile, wl-thread-copy がバグっていたのを修正。 1999-05-05 Masahiro MURATA (村田全寛) * elmo-{nntp|imap4|pop3}.el で case-fold-search が操作対象バッファ で有効になっていなかったのを修正した。 1999-05-04 Masahiro MURATA (村田全寛) * wl-draft-send を1度中断した後に送信を行うと, wl-draft-config-alist の変数が適用されない問題を修正した。 1999-05-01 OKAZAKI Tetsurou * NNTP フォルダで top カテゴリの頭文字が数字になっている ニュースグループを読める様にした。 1999-04-30 Masahiro MURATA (村田全寛) * face をポータブルに定義する関数、wl-defface を定義。 1999-04-30 Yuuichi Teranishi * 編集中のドラフトを Summary から reedit するとバッファ名の フォルダ名部分が増殖してしまうのを修正。 (岡崎さん OKAZAKI Tetsurou より御指摘) * 空フォルダで s->rescan するとどこにジャンプするか訊いてしまう のを修正。 (岡崎さん OKAZAKI Tetsurou より御指摘) * [bbdb-wl] (require 'wl) するようにした。 * Thread の子も親もないメッセージで wl-thread-open-close すると どこにジャンプするか訊いてしまうのを修正。 * 新規コマンド、wl-summary-drop-unsync, wl-folder-drop-unsync-current-entity。 全ての未同期メッセージを、なかったことにする。 'D' に割り当て。 1999-04-28 Masahiro MURATA (村田全寛) * 新規変数 wl-draft-prepared-config-alist。 wl-draft-config-alist に幾つかの機能拡張を行った。 * 新規ファイル wl-template。 ドラフトにテンプレートを選択・挿入する機能を追加した。 1999-04-28 Yuuichi Teranishi * Nemacs 以外は wl-draft-mode-map を使うようにした。 (村田さん より御助言) 1999-04-13 Masahiro MURATA (村田全寛) * Summary バッファの case-fold-search が常に nil になってしまうのを 修正。 * elmo-nntp-open-connection が失敗したときの返り値が docstring と 異なっていたのを修正。 1999-04-28 Mito * wl-draft-buffer-cur-summary-buffer が # になった ときに送信コマンドが失敗してしまうのを修正。 1999-04-27 Mito * Summary から '#' でプリントする時に確認を求めるようにした。 1999-04-27 岡田 健一 * wl-summary-refile-region がおかしくなってたのを修正。 1999-04-27 Yuuichi Teranishi * Nemacs で動かなくなっていたのを修正。 * custom がない環境で問題があったのを修正。 * いくつか忘れていたパッチのマージ (pop3 がハングする問題の修正含む)。 (嵯峨田さん より御指摘) * 0.10.0 - "Got My Mind Set On You" * localnews が wl-summary-local-p で local 扱いされていなかったのを 修正(戸田さん より御報告) 1999-04-26 Yuuichi Teranishi * elmo-internal.el の各バックエンド関数を実装。 * Sticky Summary 対応のため、 (get-buffer wl-summary-buffer-name) をしらみつぶしに修正。 * 現在のサマリを sticky にする新規コマンド、wl-summary-stick を追加。 \M-s にバインド。 1999-04-23 Yuuichi Teranishi * SEMI で partial を結合する関数を書き直した。 * [bbdb-wl] Sticky Summary に対応。 * wl-default-draft-cite がバグっていたのを修正。 (サマリのカーソル位置がずれていると、間違った citation title を つけてしまう) 1999-04-23 A. SAGATA * body の一つの行に二つ message-idがあるときに、左のmessage-idを 真中クリックすると右の message-id に飛んでしまうのを修正。 1999-04-23 岡田 健一 * wl-summaryモードの最下行の空行で,wl-thread-{copy,refile}すると, エラーが出るのを修正。 1999-04-22 Yuuichi Teranishi * prefix arg つきでフォルダ移動すると、Sticky Summary に 移動するようにした。 (これまでの wl-folder-goto-folder、wl-summary-goto-folder を それぞれ wl-folder-goto-folder-subr、wl-summary-goto-folder-subr に変更) * wl-highlight-body-too が nil の時に draft-buffer で"^L" しても re-highlight しないようにした。 (嵯峨田さん の修正)。 * しつこいサマリ、Sticky Summary。 (水戸さん の御要望に基づく)。 * mmelmo-imap4 は mmelmo を継承するようにした。 1999-04-21 A. SAGATA * wl-folder-close-parent-entity にバグがあったのを修正。 * wl-thread-open-close の機能を拡張し、子がない場合は親を close するようにした。 * wl-folder-close-parent-entity -> wl-folder-open-close * wl-folder-open-close を "/" にバインド。 1999-04-21 Mito * ネストしてる alias も展開するようにした。 1999-04-21 Yuuichi Teranishi * wl-summary-move-order が 'new、かつ最初のメッセージのマークが "$" かつフォルダ内に "$" 以外のマークがないとき、 wl-summary-goto-folder で最初のメッセージにカーソルが行かない のを修正。 * wl-summary-goto-folder で明らかに2回 wl-summary-cursor-down を 行っていた(!)のを修正。 1999-04-21 Kazuyuki IENAGA * custom に対応。 1999-04-21 Masahiro MURATA (村田全寛) * leafnode など group コマンドのレスポンスに余分なメッセージを付 けるサーバでは,ホスト名を付加したフォルダの情報が取得できない バグを修正した。 1999-04-20 Yuuichi Teranishi * 新規ファイル elmo-internal.el。 内部データをブラウズするためのフォルダ。 1999-04-19 A. SAGATA * 新規関数 wl-draft-highlight-and-recenter。ドラフトで C-l すると、 ハイライト後 recenter。 * [elmo-nntp] elmo-nntp-search の引数が違っていたのを修正。 1999-04-19 Takaaki MORIYAMA * nntp の folder 定義にポート指定をできるようにした。 1999-04-19 Yuuichi Teranishi * wl-summary-copy-prev-destination を \M-O に割り振っていたのが vt-100のカーソルまわりで問題があったのでキーバインドを外した。 (すがのさん より御指摘、 嵯峨田さん より御助言)。 * nntp でメッセージ番号が 6 桁を越えると番号が全部 0 になって しまうのを修正(嵯峨田さんの御指摘)。 1999-04-19 岡田 健一 * オフライン・リファイル/コピーのあと、リファイル/コピー先のフォル ダを訪れると、オフラインでもメッセージが追加されているように見えない のを修正。 * オフライン時の未読処理もするように修正。 1999-04-19 A. SAGATA * サマリの \M-O のバインドを外す。 1999-04-17 Koichiro Ohba * wl-summary-auto-refile のドキュメント追加。 * wl-summary-auto-refile のキーバインド追加。 * sample.dot.wl で Mail-Followup-To と Mail-Reply-To を自前で付け ているのを修正。 1999-04-14 Yuuichi Teranishi * ドラフトバッファのモードを mail-mode を derive した wl-draft-mode にした。 (小林さん の御助言) * [WL-ELS] 新規変数 WL_PREFIX、ELMO_PREFIX を設け、 それぞれの値を ELISPDIR からの相対ディレクトリとして wl, elmo モジュールをインストールするようにした。default は ""。 (小林さん の御助言) * "make clean" が WL-ELS を load してしまうので、他の emacs で compile した *.elc のある source tree で別の emacs で動かないのを 修正。 * 複数メッセージがあると POP がハングしてしまうのを修正。 (石川さん より御報告) 1999-04-13 OKAZAKI Tetsurou * [elmo-nntp] docstring の typo 修正。 1999-04-12 A. SAGATA * summary bufferで、"E" を押して reedit すると、body が全部 signature-face になってしまうのを修正。 * summary mode と folder mode の時に、mouse 行を highlight させる(xemacsのみ)。 1999-04-12 Yuuichi Teranishi * ドラフトで、タブで始まる行の次のフィールドが空だと、 タブで始まる行までもが消されてしまうバグを修正 (嵯峨田さんの御指摘)。 * Summary で 'q' を押した後すかさず C-g すると文字化けした バッファが残ってしまうのを修正(阿部さん の御指摘)。 * XEmacs で日本語 Subject の pick が失敗するのを修正 (嵯峨田さんの御指摘)。 * 4/2 の elmo-nntp-get-folders-info がハングしてしまう修正を ChangeLog に加えるのを忘れていたので追加。 (中川さん より御指摘)。 * 0.9.8 - "Faith" 1999-04-10 Yuuichi Teranishi * 新規変数、elmo-msgid-replace-string-alist Message-id ->キャッシュのファイル名の変換ルールを設定。 1999-04-09 Yuuichi Teranishi * [elmo-imap4] LOGIN でパスワードに空白文字があるばあいに 認証に失敗するのを修正。 (熊野さん より御報告) 1999-04-07 岡田 健一 * [NNTP] AUTHINFO に対応。 1999-04-07 Yuuichi Teranishi * C-u . で、キャッシュがあっても再読み込みするようにした。 * 初期化時、ネットワークにつながっていなくても C-g を押せば 起動できるようにした。 1999-04-06 SHIMADA Mitsunobu * Maildir のメールの削除、リファイルに失敗する場合があったのを修正。 1999-04-03 OKAZAKI Tetsurou * [wl-ja.texi] 変数 wl-insert-mail-(followup|reply)-to の初期設定値 の間違いを修正。 1999-04-02 Masahiro MURATA (村田全寛) * 新規変数 elmo-nntp-get-folders-securely。Non-nil にすると elmo-nntp-get-folders-info が戻ってこなくなるのを修正する変更が 有効になる。default は nil。 1999-04-02 nakagawa@pochi.tis.co.jp (中川 誠) * cnews(?) だと elmo-nntp-get-folders-info が戻ってこなくなり、 ハングしてしまうのを修正。 1999-03-31 Yuuichi Teranishi * petname-alist を obarray 化。 * 新規変数 wl-summary-divide-thread-when-subject-changed。 t ならサブジェクトが変わったときにスレッドを切るようにした。 (やまだあきらさん の御要望) * 新規変数 wl-summary-subject-filter-func サブジェクト比較前に 処理を行う関数を指定。 * wl-summary-from-func, wl-summary-subject-func, wl-summary-subject-filter-func を funcall するのをやめ、 起動時に fset するようにした。 * wl-draft-config-exec-flag をバッファローカル変数にした。 * Summary で M->j->q するとエラーが発生するのを修正。 (岡田さんの御指摘) * signature の face のデフォルトを色つきフォントにした。 1999-03-30 岡田 健一 * 空行で'd'できないようにした。 * 該当のMessage-Idの記事が同じフォルダに複数あるときにそのうち一つを オフラインで削除して elmo-dop-queue-flush すると, elmo-imap4-delete-msg-by-idが失敗するのを修正。 1999-03-29 A. SAGATA * signature 領域の検出を賢くした。 * signature をハイライトするようにした。 1999-03-26 Yuuichi Teranishi * 現在いる(同じ)フォルダに誤って goto-folder すると、サマリが 化けてしまう問題を修正(奥西さん の御指摘)。 * 変数 wl-draft-clone-local-variable-regexp (デフォルトは "^mime") にマッチするローカル変数の値を送信バッファにコピーするようにした。 1999-03-26 岡田 健一 * 新規コマンド wl-summary-write-current-newsgroup () Summaryモードで,current-folderのニュースグループに投稿するときに, Newsgroup: フィールドをあらかじめ補間してからdraftバッファを用意 する。"W" にバインド。 1999-03-25 Hidekazu NAKAMURA * wl-summary-forward() で、wl-mail-setup-hook が呼ばれなかった のを修正。 1999-03-25 Yuuichi Teranishi * 村田さんによる wl-draft-config-alist に lambda 式を書けるようにする パッチをマージしわすれていたのをマージ。 1999-03-25 Masahiro MURATA (村田全寛) * wl-summary-temp-mark-uudecode でメッセージ1つだけのファイル がデコードできないのを修正。 1999-03-24 Yuuichi Teranishi * default-case-fold-search が nil の場合、メッセージが送信されない のを修正(葛原さんの御指摘)。 1999-03-24 岡田 健一 * 新規コマンド wl-folder-close-parent-entity、M-SPC にバインド。 * 新規変数 wl-draft-config-exec-flag を設け、wl-draft-config-exec は 一度しか実行されないようにした。 1999-03-21 Yuuichi Teranishi * [im-wl.el] (再) wl-insert-message-id を nil に設定しても、Message-Id をつけてしまう修正(石川さん の御指摘)。 * (再)(featurep 'xpm) の xemacs を -nw であげたときに wl を起動すると warning が出る修正(嵯峨田さんの御指摘)。 1999-03-18 A.SAGATA * wl-ja.texi に説明を追加。 * ドラフトで、 "To:" や "Cc:" のヘッダ自体の補完をするときに、 小文字からでも補完するようにした。 1999-03-18 Yuuichi Teranishi * 0.9.7 - "Everything She Wants" * multi フォルダにへんな日付けのメッセージがあると msgdb 生成が 中断されてしまうのを修正。 1999-03-17 A.SAGATA * petname をインタラクティブに編集する関数を追加。 1999-03-17 Yuuichi Teranishi * IMAP の存在しないフォルダにリファイルしようとしてやめると、その後 現在のフォルダが操作不能になってしまうバグを修正。 (阿部さん の御指摘)。 * wl-folder-next-unsync がグループと通常フォルダを区別しないよう にした。 * XEmacs のツールバーボタンを押して sync したときにメッセージが 中途半端だったのを修正。 1999-03-12 Tsunehiko Baba * 00README を修正。 1999-03-12 Masato Taruishi * 00README を追加。 1999-03-12 Yuuichi Teranishi * refile, copy が一部失敗しても全体に影響しないようにした。 * wl-ja.texi を ptex でフォーマットして見やすいようsection 割りを 構成しなおす (森藤さん より御指摘)。 1999-03-09 Yuuichi Teranishi * まぎらわしいのでリファイル中、カーソルがバッファ末尾に 移動しないようにした。 1999-03-06 Ishikawa Ichiro * [im-wl.el] wl-insert-message-id を nil に設定しても、Message-Id をつけてしまうのを修正。 1999-03-04 Yuuichi Teranishi * tm-wl.el の tm-wl-setup() で、 (fset 'mime-preview/x-face-function-use-highlight-headers nil) していたのをやめる。 (嵯峨田さん より御指摘) * 新規コマンド wl-summary-refile-prev-destination "M-o" にバインド。 (嵯峨田さん より御要望) * 新規コマンド wl-summary-copy-prev-destination "M-O" にバインド。 1999-03-05 A.SAGATA * tm を使っている時に User-Agent: に '\n' が入ってしまうのを修正。 * Subject を [???, 0000] のようにつける ML に対応。 1999-03-04 A.SAGATA * (featurep 'xpm) の xemacs を -nw であげたときに wl を起動すると warning が出るのを修正。 * 変数 wl-auto-insert-x-face の追加。(default = t) * wl-auto-insert-x-face t でかつ、~/.xface があるときは自動的に挿入。 (今まで通り,default) * draft 作成時に wl-draft-insert-x-face-fieldで X-Face: を挿入可能 とした。(C-c C-a にバインド) * C-c C-a の時に、 ~/.xface が無ければ error message を発生させる ようにした。 1999-03-03 A.SAGATA * 新規 hook wl-summary-refile-hook を追加。 1999-03-03 Hajime MORITO * [wl-ja.texi] ptex で整形するとエラーになるのを修正。 * [wl-ja.texi] '{','}' が表示されていない部分を修正。 1999-03-03 Yuuichi Teranishi * 0.9.6 - "Dirty Diana" * [elmo] へんな cache ファイルがあったときに cache の expire が 動かなかったのを回避。 * 新規変数 wl-summary-auto-refile-skip-marks。未読メッセージは auto-refile の対象から外した。 (大場さん より御要望) * imap4 でメッセージを表示したときに余分に未読フラグをセット していた(!)のを修正。 * [wl-ja.texi] wl-summary-wday-use-japanese の記述を削除。 wl-summary-weekday-name-lang の説明を追加。 (石黒さん より御指摘) * [wl-ja.texi] wl-summary-fix-timezone の記述を追加。 (射場さん より御指摘) 1999-03-01 Hermit-chan * wl-draft-folder を設定している場合、 M-x wl する前に M-x wl-draft すると、error になるのを修正。 1999-03-01 Akihiro Motoki * wl-highlight と ChangeLog の typo 修正。 1999-03-01 Yuuichi Teranishi * 関数 wl-ask-folder が XEmacs のキー以外のイベントをすべて 同じとみなしてしまうのを修正。 1999-02-28 Masahiro MURATA (村田全寛) * wl-draft-config-alist の書式を拡張。 1999-02-26 TSUMURA Tomoaki * [wl-refile] extra-field を取るときに downcase するようにした。 * [wl-refile] いらない変数を削除。 1999-02-26 OKAZAKI Tetsurou * Summary のメニューを修正。 1999-02-25 OKUNISHI Fujikazu * フィルタフォルダの未読チェックが失敗するのを修正。 1999-02-10 OKUNISHI Fujikazu * draft で font-lock が有効になるのを回避。 1999-02-24 Yuuichi Teranishi * 0.9.5 - "California Girls" 1999-02-25 Masahiro MURATA (村田全寛) * wl-folder-notify-deleted が 'sync なら負の数を表示せず 同期させるようにした。 1999-02-24 Yuuichi Teranishi * 新規変数 wl-folder-notify-deleted。メッセージが削除されていたとき に負の数字を表示して知らせるかどうか。default は nil にした。 * wl-summary-auto-refile をデフォルトではスレッドを閉じたまま 処理するようにした。Prefix argument つきなら全スレッドを開いて から実行。 * 新規変数 wl-x-face-file。デフォルトは "~/.xface"。 1999-02-16 岡田 健一 * 新規関数 elmo-passwd-alist-{load,save}。 新規変数 elmo-passwd-alist-file-name に設定されたファイル{から|へ} パスワードを{ロード|セーブ}する。 1999-02-11 Tsunehiko Baba * [wl-ja.texi] に "~/.xface" の説明を追加。 1999-02-06 TSUMURA Tomoaki * wl-draft-replace-field () で header を insert するときに "\n" を先に concatinate してから insert するようにした。 1999-02-06 岡田 健一 * imap で未読情報をコピー先にも引き継ぐようにした。 1999-02-05 Yuuichi Teranishi * refile の宛先用の face、wl-highlight-refile-destination-face を新設。 * [wl-ja.texi] '$' の説明文を修正。 (後藤(と)さん より御助言) 1999-02-04 Yuuichi Teranishi * XEmacs でフォルダの未読チェック後ハイライトがおかしくなる場合が あったのを修正。 1999-02-03 岡田 健一 * 新規関数 wl-folder-prefetch-entity。"I" にバインド。 1999-02-03 Teruki SHIGITANI * [sample.dot.wl] my-wl-summary-from-func-petname の folder 名を参照する部分を summary-mode でのみ呼ばれるようにした。 1999-02-03 TSUMURA Tomoaki * 関数 wl-summary-auto-refile, wl-refile-rule-alist の追加。 1999-02-02 IMAI Takeshi * wl-expire で imap 先に refile するとエラーになるのを修正。 1999-01-29 Akihiro Motoki * Summaryモードの view を cache にセーブするとき, widen するように変更。 1999-01-22 Masahiro MURATA (村田全寛) * wl-auto-check-folder-name の拡張。 1999-01-19 Masahiro MURATA (村田全寛) * フォルダモードで expire をする時に,サマリ情報をupdateしてから expire が行えるようにした。 * reserve-marked-msg を省いた結果,expireするメッセージがなく なると,エラーが起こるのを修正した。 * elmo-datevec-substitute において年をまたぐ場合を考慮した。 1999-01-19 Yuuichi Teranishi * 新規変数 wl-auto-uncheck-folder-list, wl-auto-check-folder-list。 起動時のグループチェックでチェックをスキップするかどうか設定できる ようにした。(元木さん より御要望) デフォルトでは archive フォルダのチェックをスキップ。 * [elmo-nntp] サーバから Message-ID をもらう部分がバグっていたのを 修正。 1999-01-18 Yuuichi Teranishi * wl-ja.texi を更新 (mA, mf の説明追加等)。 * wl-folder-{prev,next}-unread で unread でないgroupへは飛ばない ようにした(Prefix ARG つきなら group へも飛ぶ)。 (岡田さん の御指摘) * wl-folder-check-entity でフォルダがなくなっていたときなど エラーで止まってしまうのを回避。 (石川さん より御指摘) 1999-01-16 OKUNISHI Fujikazu * 新規関数 wl-summary-temp-mark-uudecode。 * wl-ja.texi を変更 (@item->@defvar 等)。 1999-01-15 OKUNISHI Fujikazu * wl-{folder|summary}-goto-folder() で ~/.folders にないフォル ダを指定した場合にも、存在しない property を参照しようとして こけるバグを修正。 1999-01-15 TSUMURA Tomoaki * [elmo-archive] header-regexp で footer も check。 * [elmo-archive] rar の圧縮率を上げた。 1999-01-15 Masahiro MURATA (村田全寛) * 19.28ベースの Emacs で wl-expire が出来なかったのを修正した。 * elmo-date で年をまたいだ指定が行えるようにした。 * [fldmgr] Emacs-19 で wl-fldmgr-add が正常に動作しなかったのを 修正した。 1999-01-14 Masahiro MURATA (村田全寛) * Emacs-19 以前ではアクセスグループの階層構造が作られないのを修 正した。 * [fldmgr] 空のグループにフォルダを挿入するとエラーになるのを修 正した。 * [expire] elmo の呼出しで失敗した場合はエラーで止めるようにした。 1999-01-14 Yuuichi Teranishi * wl-summary-temp-mark-prefetch が動かなくなっていたので再実装。 (岡田さん の御指摘) * Meadowで日本語 Subjectのメールに返事を書こうとすると, ドラフトに用意されたメールのサブジェクトが,エスケープ コード丸出しで化けてしまうのを修正。 (飯田さん の御指摘) 1999-01-13 TSUMURA Tomoaki * Windows で LHA archive が動くように修正。 1999-01-13 Yuuichi Teranishi * 0.9.4 - "Broken Wings" * wl-folder-init-no-load-access-folders と wl-folder-init-load-access-folders の両方が nil のとき、 全てのフォルダ情報をロードしなかったのを修正。 * NNTP の multi フォルダを脱出後、同じフォルダに行き直すと、 fetch error が発生する場合があったのを修正。 1999-01-13 Masahiro MURATA (村田全寛) * wl-folder-entity-alist と wl-folder-entity-id-name-alist を obarray (hashtable) にした。 * wl-folder-entity-alist と elmo-folder-info-alist を統合した。 * check 時の表示更新を高速化した。また,変数 wl-folder-check-fast を廃止した。 * 初期化時にロードするアクセスグループのフォルダを指定できるように した。 * アクセスグループのリストを階層構造で取得できるようにした。 * unsubscribeされたフォルダを表示するときのマークを '#' に変えた。 * フォルダモードでの操作で時間がかかるものは経過を表示するように した。 1999-01-13 Yuuichi Teranishi * wl-tmp-dir がなければ起動時につくるようにした。 (門脇さん より御指摘) * wl-queue-folder がなければ起動時に作るようにした。 1999-01-12 岡田 健一 * window-width が 100 の時などに,wl-demo で xpm が真ん中にでない のを修正。 1999-01-12 TSUMURA Tomoaki * [elmo-archive] rar のパラメータ追加と windows-nt 向け修正。 1999-01-12 Yuuichi Teranishi * [elmo-nntp] "-/" で全ニュースグループを表示するようにした。 (石川さん より御指摘) (しかし 1999-1-13 の村田さんパッチでこの変更は上書き。) * unplugged で filter フォルダの動作がおかしかったのを修正。 * 'mA' (一時マークつきメッセージに対するマルチ引用つきリプライ), 'mf' (一時マークつきメッセージのマルチフォワード)。 (北目さん の御要望に基づく)。 * unplugged にしたあとサマリを脱出するとキャッシュがセーブされない バグを修正。 * [elmo-nntp] Cancel-Lock に対応したつもり。 1999-01-08 Yuuichi Teranishi * wl-dnd.el XEmacs21.2.8 の API に合わせた。 1999-01-08 Masahiro MURATA (村田全寛) * elmo-localdir-list-folders-subr() で 親フォルダが含まれなくなってしまうのを修正。 1999-01-06 岡田 健一 * 新規 hook,wl-highlight-message-hook 追加. 1999-01-05 OKUNISHI Fujikazu * [elmo-util] elmo-default-imap4-server を "hoge%imap_server@gw" のような形式でも指定できるようにした。 1999-01-05 Hironori Fukuchi * Toに存在しないアドレスを書いて送信すると、ミニバッファには sending...doneと表示され、正常に送信されたかのように見えるが 実際には送信に失敗してしまうバグを修正。 1999-01-03 OKUNISHI Fujikazu * wl-draft-edit-string() で To: フィールドが常に nil にされて しまうバグ (typo) を修正。 1998-12-31 OKUNISHI Fujikazu * elmo-localdir-list-folders-subr() でサブディレクトリが存在す る親フォルダが重複してしまうバグを修正。 * wl-summary-redisplay-no-mime() では wl-break-pages を nil に 束縛する。 * elmo-localdir-list-folders-subr() で link count 概念のないファ イルシステムでも二階層以上下層のディレクトリも返すようにした (初期値では OS/2 版 variant と Mule for Win32 のみ)。 * 実際に呼ばれてない無駄な関数を消した。 1998-12-27 Masahiro MURATA (村田全寛) * 同じ名前のフォルダがグループよりも前に存在するとエラーが発生するのを 修正。 1998-12-27 OKUNISHI Fujikazu * [wl-folder] wl-folder-mark-as-read-all-current-entity() で全 てのフォルダに移動せず、新規/未読が存在するフォルダだけを catchup するようにした(高速化のため)。 1998-12-25 Yuuichi Teranishi * Meadow 等の Emacs20.2 以下でサマリが文字化けするバグの修正を 反映し忘れていた。 (ばばさん より御指摘)。 1998-12-24 Yuuichi Teranishi * 0.9.3 - "Last Christmas" クリスマス限定版(?) 1998-12-23 Masahiro MURATA (村田全寛) * パスセパレータとして "/" を使っていたのを修正した。 * delete の使用で delq で済むところは置き換えた。 1998-12-21 Masahiro MURATA (村田全寛) * 新規ファイル wl-expire。 古いメッセージを自動的に削除・移動する機能を追加した。 * wl-fldmgr を autoload 化した。 * wl-folder で幾つかのコマンド(グループの自動open関係)の整理・高 速化を行った。 * wl-demo.el のバイトコンパイルで XEmacs 以外ではロゴファイルを 読み込まないようにした。 * [elmo-archive] elmo-archive-treat-file が non-nil のとき, elmo-archive-list-folders でディレクトリが存在しない場合にエラー になることがあるのを修正した。 * [WL 838] にある後ろの2つのパッチが当たっていなかったのを反映し た。 1998-12-21 Yuuichi Teranishi * 送信時に XEmacs でエラーが発生すると wrong type argument エラーが 発生するのを回避。(神嶌さんより御指摘) 1998-12-18 Yuuichi Teranishi * クリスマスらしい気分を出してみた。 * wl-draft の引数はデコードされた文字列とすることにした。 (中村さん の修正に基づく変更) * Meadow 等の Emacs20.2 以下でサマリが文字化けするバグの修正。 (中村さん、 藤井さん より御報告) 1998-12-17 Hidekazu NAKAMURA * "Re:" を含めてエンコードされる場合に "Re: Re:" となってしまう のを回避。 1998-12-17 Yuuichi Teranishi * 0.9.2 - "Addicted To Love" 1998-12-17 Masahiro MURATA (村田全寛) * [fldmgr] 空のグループを削除すると, wl-folder-entity-id-name-alist が壊れる場合があるのを修正した。 * [elmo-archive] method に関数が定義できるようにした。 * [elmo-archive] 'tgz 形式でも追加と削除が行えるようにした。 また,'tgz の suffix を ".tar.gz" に変更した。 * [elmo-archive] elmo-archive-msgdb-create-as-numlist-subr2() が prefix を考慮してなかったのを修正。 1998-12-16 Yuuichi Teranishi * Draft バッファで、Mail 用メニューのコマンドの内容を wl のものに置き換えるようにした。 * smtp.el が最新の apel でなくとも動作するよう、 open-network-stream-as-binary が未定義なら定義するようにした。 * smtp.el を最新の FLIM のものに合わせた。 1998-12-16 Masahiro MURATA (村田全寛) * [fldmgr] nntpでないフォルダを追加すると, wl-folder-newsgroups-hashtb が nil になるのを修正した。 1998-12-16 Hidekazu NAKAMURA * SEMI を利用する場合 smtp.el をインストールしないよう WL-ELS を 変更。 1998-12-15 Yuuichi Teranishi * In-Reply-To: の日付部分を "" で括るようにした。 * wl-summary-rescan で生成されたサマリの保存は、スキャン終了時では なくサマリ終了時にまとめてやるようにした。 * 新規変数 wl-folder-thread-indent-set-alist。フォルダごとに スレッドのインデント文字列を選べるようにした。 wl-thread-indent-level, wl-thread-have-younger-brother-str, wl-thread-youngest-child-str, wl-thread-vertical-str, wl-thread-horizontal-str, wl-thread-space-str は これにマッチしない場合の default 値として用いるよう変更。 * 新規変数 wl-folder-weekday-name-lang-alist。フォルダごとに 曜日表示の言語を選べるようにした。 wl-summary-weekday-name-lang はこれにマッチしない場合の default 値として用いるよう変更。 * elmo-nntp.el,elmo-imap4.el,elmo-msgdb.el で、msgdb に保存する Subject, From の文字列の作り方が間違っていたため、中国語やハングル が化けてしまっていたのを修正。 * Summary の cache の{挿入|保存}を as-binary-{input|output}-file で行なうようにし、バッファごとの mime-charset で{encode|decode}する ようにした。 * wl-init で wl-draft-folder が存在しないときも elmo-create-folder () を呼ぶようにした。 * wl-generate-user-agent-string を Nemacs 対応。 ついでに tm のバージョン情報も入れるようにした。 * メッセージ削除時、当該メッセージが閉じたスレッドに隠れていたときに、 子どもスレッドをおかしな位置に挿入してしまうことがあるのを修正 (したつもり…)。 * bbdb-wl.el でバイトコンパイルに必要なモジュールを require する ようにした。 * smtp-via-smtp を (as-binary-process) で括った。 (小玉 さん 他よりいただいた 御報告に基づく) * [wl-ja.texi] デフォルトで @directory が有効になるようにした。 (千田さん より御指摘) 1998-12-13 Yuuichi Teranishi * 新規ファイル wl-mule.el, wl-nemacs.el。 * wl-nemacs ブランチをマージ。 1998-12-10 Masahiro MURATA (村田全寛) * message-id が含まれていない In-Reply-To フィールドがあると,代 わりに Reference フィールドがあっても参照されないバグを修正。 1998-12-11 Yuuichi Teranishi * 0.9.1 - "Yankee Rose" 1998-12-10 Masahiro MURATA (村田全寛) * ドラフトバッファの名前を変更した。("1" -> "+draft/1") * 新規関数 wl-jump-to-draft-buffer。 * wl-draft-config-alist の処理で1つマッチしても続けて処理を行う ようにした。 * wl-draft-config-exec-hook を追加。 * 新規変数 wl-draft-always-delete-myself。 * アーカイブフォルダの prefix に数字が含まれていた場合, elmo-archive-list-folder が常に nil を返すのを修正した。 * elmo-*-copy-msgs は成功すれば non-nil を返すようにした。 * elmo-move-msgs でのコピーに失敗すれば削除を実行しないようにし た。 1998-12-10 Yuuichi Teranishi * elmo-match-string, elmo-match-buffer を使えるところは使うようにした。 * wl-insert-mail-followup-to, wl-insert-mail-reply-to の default を nil にした。 * wl-ja.info を Emacs 20.3 で作るようにした。 * "M-x wl-draft" でも正しく起動できるようにした。 * Mule もバイトコンパイル時の Warning を減らした。 1998-12-10 TSUMURA Tomoaki * pack-number 後に、msgdb の number-alist が更新されてなかった のを修正。 1998-12-10 Yuuichi Teranishi * wl-bcc が設定されていれば mail-self-blind の値に関係なく Bcc: を 挿入するようにした (wl-fcc と動作を合わせた)。 1998-12-10 Akihiro Motoki * 新規変数 wl-bcc。non-nil のときは wl-bcc の値が Bcc: に入る。 1998-12-10 SENDA Shigeya * XEmacs 向けに wl-ja.texi を修正。 * wl-ja.texi で vindexが一つ抜けていたのを修正。 * WL-ELS で xemacs の install-package のとき info がインストール されるようにした。 1998-12-10 Yuuichi Teranishi * スレッドの途中で、閉じたスレッドのメッセージがあった時、 そのメッセージ以降のスレッドが挿入されないバグがあったのを修正。 1998-12-09 Masahiro MURATA (村田全寛) * elmo-move-msgs, elmo-copy-msgs でオプション指定により,フォル ダ元の番号のまま移動,コピーする機能の追加。関連して, elmo-append-msg もオプションで指定した番号で追加する機能の追加。 * 'localdir から 'archive にコピーする場合は1度に複数のメッセー ジを処理するようにした。 1998-12-09 Yuuichi Teranishi * 0.9.0 - "With Or Without You" * elmo-archive.el のバイトコンパイル時に Warning が出ないように した。 1998-12-09 OKUNISHI Fujikazu * elmo-archive.el "v0.16 [981208/alpha]"。 * copy-msgs() で dst-spec のフォルダがなければ作るようにした (寺田さん Masayuki TERADA のご指摘)。 * elmo-archive-treat-file が non-nil の時に get-archive-name() で suffix が regexp-quote() されてないバグを修正。 1998-12-09 Yuuichi Teranishi * wl-folder-check-entity で対象フォルダがまだ 存在しないときは elmo-create-folder () を呼ぶようにした。 * wl-init で wl-trash-folder が存在しないときは elmo-create-folder () を呼ぶようにした。 (奥西さん の御指摘) 1998-12-08 Yuuichi Teranishi * XEmacs, Emacs でバイトコンパイラが生成する Warning を減らした。 * mmelmo-imap4 の mime-entity 生成部分で parent の扱いが間違ってい たためエラーが発生する場合があったのを修正。 1998-12-07 Yuuichi Teranishi * 00README.ja のメーリングリストアドレスが古いままだったのを修正。 1998-12-06 Masahiro MURATA (村田全寛) * wl-summary-buffer-view が 'thread の時,wl-summary-cursor-up の hereto が無視されていたのを修正した。 * wl-thread-jump-to-next-unread, wl-thread-jump-to-prev-unreadで hereto が non-nil のとき,success-mark がなくカーソルが failure-mark の位置にあると,戻り値が nil になるのを修正した。 * サマリのアップデート時の削除で処理の進捗を表示するようにした。 1998-12-06 OKUNISHI Fujikazu * elmo-localdir-pack-number() のデバッグコード除去と経過表示。 * data scope 問題で free var にならないように elmo-call-func() で SPEC を通すようにした(byte-compile warning を消すため)。 1998-12-05 OKUNISHI Fujikazu * wl-ja.texi のいくつかのあやまりを修正。 1998-12-05 Masahiro MURATA (村田全寛) * 新規変数 elmo-archive-treat-file。non-nil の場合 は archive フォルダがファイルを対象とするようにした。 1998-12-04 Masahiro MURATA (村田全寛) * elmo で作成する一時バッファが WL を終了しても残る場合があるの を修正した。 * wl-summary-rescan 実行後も,カーソル位置を実行前と同じメッセー ジの位置に移動するようにした。 * サマリのアップデート表示でピリオドが2つかさならないようにした。 * wl-summary-pick で Since と Before の値を入力するときは候補が 補完できるようにした。 * completing-read のリストを整理した。 * wl-auto-select-first が t のときでも,wl-summary-move-order の 指定で優先度が低いマークしかない場合はメッセージを表示しないよ うにした。 * elmo-archive-delete-msgs が削除に成功したとき t を返すようにした。 1998-12-04 Yuuichi Teranishi * wl-summary-unread-message-hook を wl-summary-mark-as-read () の中で呼ぶよう変更。 1998-12-04 岡田 健一 * 未読記事が読まれたときに呼ばれる wl-summary-unread-message-hook を追加。 1998-12-03 Masahiro MURATA (村田全寛) * folder mode でアーカイブフォルダを check しても表示が更新されな いときがあるのを修正。 1998-12-03 Yuuichi Teranishi * wl_nemacs ブランチを作成、Nemacs 対応開始。 * smtp.el を flim-1.12 付属の smtp.el と入れ換え、 変更された API に合わせた (smtp-do-bcc の削除、smtp-via-smtp の引数の変更)。 * im-wl.el でも変数 wl-insert-message-id がまるっきり無視されていた のを修正。 * wl-summary-prefetch-msg 時、大きなメッセージでエラーがでてしまう エラーを修正。 * 頻繁に使われていた append を nconc に置き換えることで multi フォルダの動作を全般に高速化。 1998-12-02 OKUNISHI Fujikazu Hironori Fukuchi * wl-ja.texi のいくつかのあやまりを修正。 1998-12-02 Yuuichi Teranishi * alpha -> beta。 * これまでの ChangeLog を etc に移動。 wanderlust-wanderlust-769699d/etc/ChangeLog.3000066400000000000000000003064121406661363500211010ustar00rootroot000000000000002000-03-24 Yuuichi Teranishi * 1.1.0 - "Overjoyed" 2000-03-23 Yuuichi Teranishi * wl-refile.el (wl-refile-guess-func-list): Fixed defvar. (Pointed out by KOYAMA Tetsuji ) * 1.1.0pre6 - "Overjoyed-pre6" * wl-folder.el (wl-create-folder-entity-from-buffer): Fixed localnews definition problem. (Pointed out by AOXI Tenghe and others) 2000-03-23 OKAZAKI Tetsurou * wl-summary.el (wl-summary-mode-menu-spec): Changed wl-draft to wl-summary-write. (wl-summary-msg-marked-as-target): Renamed from wl-summary-msg-marked-as-temp. * wl-thread.el (wl-thread-close-all): Renamed local variable. 2000-03-22 Akihiro MOTOKI * wl-refile.el (wl-refile-guess-func-list): New variable. (wl-refile-guess): Use wl-refile-guess-func-list. 2000-03-22 Yuuichi Teranishi * wl-mime.el: Reduced byte compile warnings. * wl-xmas.el,wl-mule.el,wl-nemacs.el (wl-make-modeline): Defined. XEmacs shows plugged icon by default. (Advised by Daiki Ueno ) * wl-util.el (wl-make-modeline-subr): Renamed from wl-make-modeline. * utils/bbdb-wl.el (bbdb-wl-update-record): Fixed sticky summary problem. (bbdb-wl-update-record, bbdb-wl-get-update-record): Avoid raw buffer to be multibyte. * wl-draft.el (wl-draft-reply): Likewise. * 1.1.0pre5 - "Overjoyed-pre5" 2000-03-21 Yuuichi Teranishi * NEWS.ja: New file. * elmo-maildir.el (elmo-maildir-list-folders): Bind elmo-have-link-count as nil. (Advised by Masahiro MURATA ) * wl-summary.el (wl-summary-edit-addresses-subr): Downcase addresses. 2000-03-18 TAKAHASHI Kaoru * NEWS: New file. 2000-03-17 Yuuichi Teranishi * wl-message.el (wl-message-follow-current-entity): Refer original buffer. (Pointed out by OKAZAKI Tetsurou ) * elmo-maildir.el (elmo-maildir-list-folders): Check if directory is Maildir. (Pointed out by ) 2000-03-15 Yuuichi Teranishi * wl-folder.el (wl-create-folder-entity-from-buffer): Fixed space regexp. * wl-summary.el (wl-summary-edit-addresses): Get address from original buffer. (wl-summary-prefetch): Don't bind wl-prefetch-threshold as nil. 2000-03-14 Yuuichi Teranishi * 1.1.0pre4 - "Overjoyed-pre4" * Fixed error messages in all files (don't finish message with ".") * elmo/elmo-archive.el (elmo-archive-copy-msgs): Don't use filename when same-number is non-nil in maildir. * wl-expire.el (wl-expire-archive-get-folder): Use elmo-replace-msgid-as-filename instead of elmo-safe-filename. * wl-folder.el (wl-folder-goto-folder-subr): Set default as wl-default-folder. (Adviced by okada@opaopa.org (Kenichi OKADA)) * wl-folder.el (wl-create-folder-entity-from-buffer): Allow white space in folder name. * wl-summary.el (wl-summary-jump-to-msg-by-message-id): Use wl-thread-jump-to-msg when message was found in current folder. 2000-03-13 Yuuichi Teranishi * wl-vars.el (wl-summary-skip-mark-list): New variable. * wl-summary.el (wl-summary-prefetch): Set wl-prefetch-threshold nil only when interactive-p. (Pointed out by Akihiro MOTOKI ) (wl-summary-exec-subr): Fixed mark counting bug. (Pointed out by OKAZAKI Tetsurou ) (wl-summary-next, wl-summary-prev): Use wl-summary-skip-mark-list. (wl-summary-move-cached-regex): defmacro->defun. * etc/ja.Emacs: Update. * elmo-imap4.el (elmo-imap4-search): Regard from-msgs. * elmo-maildir.el (elmo-maildir-search): Fixed. * mmelmo-imap4-1.el (mmelmo-imap4-parse-bodystructure-string): Fixed literal parsing. 2000-03-13 Masahiro MURATA * wl-expire.el: Fixed problem of expiring in filter folder. * wl-fldmgr.el: Inhibited newline character in folder name or petname. 2000-03-12 Masahiro MURATA * wl-fldmgr.el (wl-fldmgr-get-path-from-buffer): Fixed problem when wl-desktop group is closed. 2000-03-11 Masahiro MURATA * wl-folder.el (wl-folder-mode-menu-spec): Updated. 2000-03-08 TAKAHASHI Kaoru * wl-vars.el (wl-score-files-dir): Renamed from wl-score-files-directory. * wl-score.el (wl-score-edit-file, wl-score-load-file, wl-score-change-score-file): Ditto. 2000-03-08 Yuuichi Teranishi * wl-vars.el (wl-mime-charset): Set default value as x-ctext. 2000-03-08 okada@opaopa.org (Kenichi OKADA) * elmo-nntp.el (elmo-nntp-list-folders): Fixed problem when root name is "". 2000-03-07 Yuuichi Teranishi * 1.1.0pre3 - "Overjoyed-pre3" * elmo-imap4.el (elmo-imap4-create-msgdb-from-overview-string): Use local unread information. * elmo2.el (elmo-delete-folder): Added maildir folder. (elmo-move-msgs): Local unread information was not taken over. * elmo-maildir.el (elmo-maildir-delete-folder): Rewrite. * mmelmo.el (mime-parse-parameters-from-list): Moved from mmelmo-imap4.el. * wl-message.el (wl-mmelmo-message-redisplay): Bind mime-display-header-hook as nil. * wl-mime.el (wl-mime-display-message): Fixed SEMI version detection. (wl-summary-burst): Don't refer mime-message-structure. (wl-mime-entity-read-field): New alias/macro. (wl-mime-combine-message/partial-pieces): Use wl-mime-entity-read-field. (mime-edit-user-agent-value): Workaround for duplicated XEmacs beta version (for SEMI 1.13.4 or earlier). 2000-03-06 katsuta@cced.mt.nec.co.jp * elmo-util.el (elmo-buffer-field-condition-match): Fix problem when std11-field-body returns nil. 2000-03-04 okada@opaopa.org (Kenichi OKADA) * wl-summary.el (wl-summary-prefetch-msg): Don't refer mark. 2000-03-06 Yuuichi Teranishi * wl-summary.el (wl-summary-read-folder): Use default when "". * wl-fldmgr.el, wl-folder.el, etc: Begin message with upcase character. * wl-draft.el (wl-draft-yank-original): Fix problem in citation from kill-ring. * mmelmo-1.el (insert-header): Use mmelmo-insert-sorted-header-from-buffer. (insert-text-content): New method. Add (run-hooks 'mmelmo-entity-content-inserted-hook). * utils/bbdb-wl.el (bbdb-wl-show-bbdb-buffer): New function. Added to wl-summary-toggle-disp-folder-message-resumed-hook. * 1.1.0pre2 - "Overjoyed-pre2" * elmo-maildir.el (elmo-maildir-sequence-number-internal): New variable. (elmo-maildir-make-unique-string): Definition for v19. Don't use elmo-maildir-sequence-number-internal. (elmo-maildir-temporal-filename): Don't wait 2 seconds. (toplevel): Added (eval-when-compile (require 'cl). * wl-summary.el (wl-summary-buffer-number-column-detect): Don't use return value of re-search-forward. 2000-03-06 okada@opaopa.org (Kenichi OKADA) * elmo-pop3.el (elmo-pop3-port-label): Fixed typo (port->ssl). * elmo-nntp.el (elmo-nntp-sync-number-alist): Fixed bug that unread number sometimes becomes negative. 2000-03-06 Yuuichi Teranishi * wl-summary.el (wl-summary-switch-to-clone-buffer): Take over wl-summary-buffer-number-column, wl-summary-buffer-number-regexp. (wl-summary-write): New command. Binded to 'w'. * wl-draft.el (wl-draft): Added behaviors for wl-summary-write. 2000-03-05 Yuuichi Teranishi * elmo-cache.el (elmo-cache-list-folder-subr): Ignore directories. * wl-summary.el (wl-summary-insert-line): New function. (wl-summary-insert-summary, wl-summary-update-thread): Use `wl-summary-insert-line'. * wl-thread.el (wl-thread-update-line-on-buffer-sub): Ditto. * WL-MK (wl-info-lang): Install each element when listp. * elmo/elmo-maildir.el (elmo-maildir-append-msg): Use same name with tmp in new. (elmo-maildir-list-folders): Contain root. 2000-03-04 okada@opaopa.org (Kenichi OKADA) * wl-summary.el (wl-summary-buffer-set-folder): Deleted column setting. (wl-summary-goto-folder-subr): Dynamic detecting of column number. (wl-summary-target-mark-forward): Fixed order of forward. (wl-summary-cleanup-temp-marks): Delete target marks. 2000-02-29 Ryota Nishikawa * wl-draft.el (wl-draft-send-mail-with-pop-before-smtp): Workaround for error which occurs in offline status. 2000-03-04 Yuuichi Teranishi * wl-thread.el (wl-thread-update-children-number): Renamed from wl-thread-update-children-number. New hook, wl-thread-update-children-number-hook. 2000-03-04 Masahiro MURATA wl-folder.el (wl-folder-sync-entity, wl-folder-mark-as-read-all-entity, wl-folder-prefetch-entity): Fixed highlighing in sticky summary. 2000-03-03 Yuuichi Teranishi * elmo2.el (elmo-move-msgs): Skip saving unread info when target is 'null. * elmo-maildir.el (elmo-maildir-make-unique-string): Renamed from elmo-maildir-create-unique-string. (Adviced by OKAZAKI Tetsurou ) * 1.1.0 pre1 - "Overjoyed-pre1" 2000-03-02 Yuuichi Teranishi * wl-draft.el (wl-draft-reply-buffer): New buffer local variable. (wl-draft-reply): Set `wl-draft-reply-buffer'. (wl-draft-config-exec): Refer `wl-draft-reply-buffer'. (wl-draft-reply): Eliminated. * WL-MK, WL-CFG (wl-info-lang): New variable. * wl.texi: New file. * Makefile, WL-MK, WL-CFG: ELISPDIR->LISPDIR. (Adviced by TAKAHASHI Kaoru ) * elmo-maildir.el: Rewrite. * elmo-util.el, elmo-msgdb.el, elmo-vars.el: Define maildir's spec as '.'. * wl-folder.el, wl-summary.el, elmo-pop3.el, etc: Upcase messages' first character. * elmo-vars.el (elmo-maildir-folder-path): New variable. * elmo-internal.el (elmo-internal-list-folders): Return 'cache and 'mark in root. 2000-03-02 okada@opaopa.org (Kenichi OKADA) * elmo-nntp.el: Fixed starttls. * elmo-nntp.el, elmo-imap4.el: Fixed a bug that elmo-list-folders deletes "!". 2000-03-01 TAKAHASHI Kaoru * wl-score.el: Use "Invalid" instead of "Illegal" in error message. 2000-03-01 okada@opaopa.org (Kenichi OKADA) * wl-summary.el (wl-summary-refile-subr): Adjust target name for cache. * elmo-nntp.el: starttls feature. (experimental) 2000-03-01 Yuuichi Teranishi * elmo-cache2.el: Merged to elmo-cache.el. * elmo-internal.el, elmo-util.el, elmo-msgdb.el: Tread 'cache' as a part of internal. 2000-03-01 okada@opaopa.org (Kenichi OKADA) * elmo-cache2.el: New backend 'cache'. 2000-02-29 IMAI Takeshi * wl-expire.el (wl-folder-expire-entity): Fixed highlighing in sticky summary. 2000-02-28 Yuuichi Teranishi * elmo2.el (elmo-move-msgs): Take over unread status. Added `unread-marks' argument. * wl-summary.el (wl-summary-exec): Take over unread marks to elmo-move-msgs. (wl-summary-edit-petname): Now To and Cc are also candidate. (wl-summary-edit-addresses): Renamed from `wl-summary-edit-petname'. (wl-summary-edit-petname): Eliminated. (wl-summary-mark-as-unread): Consider cache status. * wl-vars.el (wl-summary-toggle-disp-folder-message-resumed-hook) (wl-summary-line-inserted-hook): New hook. (wl-summary-print-destination): Put 'wl-summary-destination property. * wl-thread.el, wl-summary.el: Call wl-summary-line-inserted-hook. * utils/bbdb-wl.el: Popup in wl-summary-toggle-disp-folder-message-resumed-hook. 2000-02-28 Masahiro MURATA * Scoring in wl-folder-sync-current-entity. * wl-summary-buffer-disp-msg sometimes wrong in sticky summary. 2000-02-25 okada@opaopa.org (Kenichi OKADA) * wl-message.el (wl-message-refer-article-or-url): Don't call wl-summary-redisplay when wl-summary-jump-to-msg-by-message-id failed. * wl-vars.el (wl-local-domain): Changed initial setting. * wl.el (wl-check-environment): Regard wl-local-domain as local domain without hostname. * wl-util.el (wl-draft-make-message-id-string): Ditto. 2000-02-25 Yuuichi Teranishi * wl-expire.el (wl-folder-expire-entity): Call wl-summary-save-status. 2000-02-24 Yuuichi Teranishi * wl-vars.el (wl-draft-send-hook): New hook. * wl-draft.el (wl-draft-send): Call wl-draft-send-hook. (Demand from Kenichi Sato ) 2000-02-23 Yuuichi Teranishi * elmo-cache.el (elmo-cache-save): Added (condition-case), a workaround for long file name. (Report by Mikya Tani ) * wl-draft.el: Consider FCC IMAP's modified utf7. (Pointed out by HIRATA Naoto ) 2000-02-21 Yuuichi Teranishi * wl-address.el (wl-address-header-extract-address): Don't regard '\n' as a e-mail address character. (Pointed out by Tomotaka SUWA ) * mmelmo.el (mmelmo-header-max-column): New variable. (Demand by Kenichi Sato ) (mmelmo-header-inserted-hook): New hook. (mmelmo-entity-content-inserted-hook): New hook. * mmelmo-2.el (mime-insert-text-content): New entity method. Call mmelmo-entity-content-inserted-hook. * mmelmo.el (mmelmo-insert-sorted-header-from-buffer): Moved from elmo-util.el and use `mmelmo-header-max-column'. Call mmelmo-header-inserted-hook. 2000-02-18 Yuuichi Teranishi * wl-message.el (wl-mmelmo-message-redisplay): Use wl-mime-display-message. (Pointed out by Toshihiko Kodama ) * wl-mime.el (wl-mime-display-message): New macro/alias. * 2.2.18 - "Please Forgive Me" * wl-summary.el (wl-summary-move-cached-regex): Added ignoring expression of 'D' mark for unplugged status. * elmo-msgdb.el (elmo-msgdb-expand-path): Downcase IMAP4's INBOX (Pointed out by Takeshi Chiba ). * wl-folder.el (wl-create-folder-entity-from-buffer): Changed expression of detecting access group for '}'. * wl-message.el (wl-mmelmo-message-redisplay): Pass major-mode to mime-display-message. 2000-02-18 Daiki Ueno * wl-demo.el: Fixed for Emacs 21. 2000-02-17 Yuuichi Teranishi * mmelmo-imap4-2.el (mime-entity-buffer): Don't change current buffer. Fetch skipped part. * mmelmo-imap4-2.el (mime-write-entity-content): New method. Fetch skipped part. * mmelmo-imap4-2.el (mmelmo-imap4-fetched): New buffer local variable. * elmo-imap4.el (elmo-imap4-server-namespace): New buffer local variable. (elmo-imap4-open-connection): Set elmo-imap4-server-namespace. (elmo-imap4-parse-namespace): New function. (elmo-imap4-process-folder-list): Use elmo-imap4-server-namespace. (elmo-imap4-extra-namespace-alist): New variable. * wl-util.el (wl-string-member, wl-string-match-member, wl-string-delete-match, wl-string-match-assoc, wl-string-rassoc): Renamed to elmo-* and define as defalias. 2000-02-17 Yuuichi Teranishi * bbdb-wl.el: Added wl-summary-toggle-disp-folder-off-hook's setting. 2000-02-16 Daiki Ueno * wl-demo.el: Caluculate frame's font parameter. 2000-02-14 Yuuichi Teranishi * wl-summary.el (wl-summary-toggle-disp-folder): New implementation. (Pointed out by Shigeru OKUMURA ) * wl-draft.el (wl-draft-insert-x-face-field-here): Delete white spaces. (Pointed out by Akihiro MOTOKI ) 2000-02-12 Akihiro MOTOKI * elmo/elmo-localdir.el (elmo-localdir-msgdb-create-overview-entity-from-file): Pass value of `current-time-zone' to `timezone-make-date-arpa-standard'. 2000-02-10 Yuuichi Teranishi * elmo/mmelmo-imap4-2.el (mmelmo-imap4-node-id-to-string): "header" -> "0". * elmo/mmelmo-imap4-1.el (mmelmo-imap4-node-id-to-string): Ditto. (Pointed out by TSUMURA Tomoaki ) * wl-message.el (wl-message-follow-current-entity): wl-draft-reply pass summary buffer to `wl-draft-reply'. * wl-summary.el (wl-summary-reply): pass current-buffer to `wl-draft-reply'. (wl-summary-msgdb-load-async): enclose mailbox with "". * elmo-imap4.el: Ditto. 2000-02-09 UENO Kazuaki * wl-draft.el (wl-draft-queue-flush): Use `elmo-dop-flush-confirm'. 2000-02-09 Yuuichi Teranishi * wl-draft.el (wl-draft): Changed initialization order. (Adviced by Taiji.Can@atesoft.advantest.co.jp) 2000-02-08 Masahiro MURATA * wl-score.el (wl-summary-score-update-all-lines): Consider folder type when putting read-uncached mark. 2000-02-08 Yuuichi Teranishi * wl-summary.el (wl-summary-target-mark-prefetch): Fixed for uncached message's mark. (Pointed out by Hironori Fukuchi ) * wl-summary.el (wl-summary-target-mark-prefetch): Display progress. Remain '*' marks if not prefetched. * wl-dnd.el (start-drag): defined with static-cond. * elmo2.el (elmo-buffer-cache-message): Fixed the bug of `Quit'ting while reading. * elmo-filter.el (elmo-filter-list-folder-important): Don't call 'elmo-search'. (Adviced by Akihiro MOTOKI ) 2000-02-07 Daiki Ueno * wl-xmas.el (wl-highlight-folder-current-line): Don't use set-extent-properties. * wl-draft.el (wl-smtp-extension-bind): Fixed. 2000-02-07 Akihiro MOTOKI * elmo-util.el (elmo-buffer-field-condition-match): Compare field value after `eword-decode-string'. 2000-02-07 Yuuichi Teranishi * wl-dnd.el: Eliminated byte-compile warnings. (Pointed out by okada@opaopa.org (Kenichi OKADA).) * utils/sasl/sha1.el, utils/sasl/md5-el.el, utils/sasl/hex-util.el, utils/sasl/sha1-el.el: Update. (Pointed out by okada@opaopa.org (Kenichi OKADA).) * wl-vars.el (wl-demo-use-bitmap): Renamed to wl-demo-display-logo. (wl-demo-display-logo): New variable. * wl-demo.el: Use wl-demo-display-logo. 2000-02-07 okada@opaopa.org (Kenichi OKADA) * wl-vars.el (wl-demo-use-bitmap): Changed initial value. 2000-02-07 Yuuichi Teranishi * 2.2.17 - "One Of Us" * elmo-util.el (elmo-y-or-n-p): New function. * elmo-vars.el (elmo-dop-flush-confirm): New variable. * elmo-dop.el (elmo-dop-queue-flush): Use elmo-y-or-n-p, elmo-dop-flush-confirm. * elmo-imap4.el (elmo-delete-msgids): Display progress. Call expunge once at last. 2000-02-07 Daiki Ueno * wl-folder.el, wl-xmas.el: Display icons although a frame is opened by XEmacsen invoked with -nw argument. 2000-02-06 Yuuichi Teranishi * wl-highlight.el (wl-highlight-summary-target-face): New face (Renamed from ...-temp-face). * wl-vars.el (wl-demo-use-bitmap): Moved from wl-demo.el. Defined as defcustom. Initial value is (module-installed-p 'bitmap). * wl-demo.el (wl-demo-use-bitmap): Moved to wl-vars.el. * elmo-vars.el: Require 'poe, eliminated bytecompiling warnings. * wl-nemacs.el (buffer-disable-undo, rassoc, delete, string-to-number, window-live-p, completing-read, accept-process-output, get-buffer-window): Eliminated. 2000-02-04 TAKAHASHI Kaoru * wl-demo.el (wl-demo): Check wl-demo-use-bitmap at run-time. 2000-02-04 Yuuichi Teranishi * INSTALL, INSTALL.ja: Changed tm-8's URL. * utils/hmac -> utils/sasl. * WL-ELS: HMAC->SASL. * WL-MK: HMAC->SASL. 2000-02-04 Yuuichi Teranishi * elmo-localdir.el (elmo-localdir-msgdb-create-overview-entity-from-file): Use `timezone-make-date-arpa-standard' instead of `format-time-string'. * elmo-vars.el (elmo-time-format): Eliminated. 2000-02-03 Yuuichi Teranishi * elmo-dop.el (elmo-dop-queue-flush): Added canceling process of append-operations. * wl-summary.el (wl-summary-refile-prev-destination, wl-summary-copy-prev-destination): Fixed. (Reported by IMAI Takeshi ) 2000-02-02 Akihiro MOTOKI * wl-vars.el (wl-prefetch-confirm-threshold): Eliminated and separated to `wl-prefetch-confirm' and `wl-prefetch-threshold'. (wl-prefetch-confirm, wl-prefetch-threshold): New variable. * wl-summary.el (wl-summary-prefetch-msg): Use wl-prefetch-confirm, wl-prefetch-threshold. 2000-02-02 Daiki Ueno * wl-draft.el (wl-smtp-features): `smtp-authenticate-type' is changed to symbol. 2000-01-31 okada@opaopa.org (Kenichi OKADA) * elmo-nntp.el (elmo-nntp-get-folders-info): Fixed. 2000-01-31 Daiki Ueno * wl-demo.el: Display wl-logo.xpm in Emacs21. 2000-01-30 TAKAHASHI Kaoru * INSTALL, INSTALL.ja: Fixed. 2000-01-30 OKUNISHI -GTO- Fujikazu * WL-ELS: Add elmo-database to ELMO-MODULES if open-database is already defined. 2000-01-30 Akihiro MOTOKI * elmo-loacaldir.el (elmo-localdir-msgdb-create-overview-entity-from-file): If Date: field does not exist, get file's modified time. * elmo-msgdb.el (elmo-msgdb-create-overview-from-buffer): Added argument time. * elmo-vars.el (elmo-time-format): New variable. 2000-01-29 okada@opaopa.org (Kenichi OKADA) * wl-summary.el (wl-summary-jump-to-msg-by-message-id): Added selecting NNTP server option. (wl-summary-jump-to-msg-by-message-id-via-nntp) Now server can be specified like "-:username@servername:8119!". * elmo-nntp.el (elmo-nntp-folder-postfix): Added argument `ssl'. 2000-01-29 OKUNISHI -GTO- Fujikazu * elmo-vars.el (elmo-database-dl-module, elmo-database-dl-handle): New variable. (toplevel): if elmo-database-dl-handle is non-nil, dynamic_call emacs_database_init. (elmo-use-database): Set elmo-use-database when open-database is bound. * WL-ELS: If 'dynamic-link is bound, add elmo-database to ELMO-MODULES. 2000-01-28 TAKAHASHI Kaoru * wl-demo.el (wl-demo): Fix copyright information. 2000-01-27 Takeshi Chiba * mmelmo-imap4-2.el ([luna]mime-entity-buffer): section "0" -> "header". 2000-01-27 Yuuichi Teranishi * mmelmo-imap4-2.el (mmelmo-imap4-node-id-to-string): section "0" -> "header". * mmelmo-imap4-1.el: Ditto. 2000-01-26 OKAZAKI Tetsurou * elmo-imap4.el (elmo-imap4-create-folder): UW imapd-4.7 cannot create new folder. 2000-01-26 Yuuichi Teranishi * mmelmo-imap4-2.el (mmelmo-imap4-parse-bodystructure-string): Retrieve BODYSTRUCTURE. (mmelmo-imap4-parse-bodystructure-object): Don't cause error when content-type subtype is NIL. * mmelmo-imap4-1.el: Ditto. * utils/hmac/unique-id.el: New file. * WL-ELS (HMAC-MODULES): Added scram-md5, digest-md5, unique-id. * wl-dnd.el (wl-dnd-drop-func): Fixed. * 2.2.16 - "No Son Of Mine" 2000-01-25 Yuuichi Teranishi * wl-vars.el (wl-summary-reserve-mark-list): New variable. * wl-summary.el: temp-mark -> target-mark changed name. Use `wl-summary-reserve-mark-list' in mark commands. * wl-score.el, wl-thread.el: Ditto. * wl-folder.el (toplevel): require 'wl. 2000-01-24 Yuuichi Teranishi * wl-mule.el, wl-xmas.el, wl-nemacs.el (wl-summary-format-date): Moved to wl-summary.el. * utils/hmac/lisp/sasl.el, utils/hmac/lisp/digest-md5.el, utils/hmac/lisp/scram-md5.el: Update to latest SLIM. * wl-fldmgr.el (wl-fldmgr-ext): Changed confirm message. * doc/TODO.ja: Updated. 2000-01-22 OKAZAKI Tetsurou * wl-folder.el (toplevel): Fixed menu. 2000-01-21 okada@opaopa.org (Kenichi OKADA) * elmo-imap4.el: Added DIGEST-MD5 authentication. * elmo-pop3: Added CRAM-MD5, DIGEST-MD5, SCRAM-MD5 authentication. 2000-01-21 Yuuichi Teranishi * wl-summary.el (toplevel): Changed binding position for region commands. (wl-summary-prefetch-region): Prefetch hided messages. (Reported by OKAZAKI Tetsurou ) * elmo: Added argument no-see to append-msg, move-msgs. * elmo-pipe: Specify 'no-see at elmo-msg-move. * wl-folder.el (wl-folder-mimic-kill-buffer): New command. (toplevel): Bind ` wl-folder-mimic-kill-buffer' to C-xk, `wl-save' to C-xC-s. 2000-01-19 Yuuichi Teranishi * wl-nemacs.el (accept-process-output): New function. * Makefile: Modified comment. 2000-01-17 Yuuichi Teranishi * elmo-util.el (elmo-folder-identical-system-p): Don't treat folders which have same mailbox name and different server as identical folder. (Pointed out by Tatsuya Matsui ) * wl-address.el (wl-complete-field-body-or-tab): Eliminated argument. 2000-01-13 Yuuichi Teranishi * wl-vars.el (wl-prefetch-confirm-threshold, wl-cache-fetch-threshold): New variables. * wl-summary.el (wl-summary-prefetch-msg): Use `wl-prefetch-confirm-threshold'. (wl-cache-prefetch-message): Use `wl-cache-fetch-threshold'. 2000-01-13 okada@opaopa.org (Kenichi OKADA) * wl-message.el (wl-message-decide-backend, wl-normal-message-redisplay): Force fetch if `wl-fetch-confirm-threshold' is nil. 2000-01-11 okada@opaopa.org (Kenichi OKADA) * wl-draft.el (wl-draft-delete): Conscious that `wl-draft-buffer-file-name' is nil. 2000-01-11 Nishimoto Masaki * wl-draft.el (wl-draft-save-and-exit): Fix the bug that kills unexpected buffer. 2000-01-11 Yuuichi Teranishi * 2.2.15 - "More Than Words" 2000-01-11 Yoichi NAKAYAMA * samples/ja/dot.folders, samples/en/dot.folders: Added description about 'access group'. 2000-01-11 Yuuichi Teranishi * wl-mime.el, tm-wl.el (wl-draft-preview-message): Display all header. * wl-summary.el (wl-summary-mode): Don't set tab-width. (Pointed out by Yoshinari NOMURA ) (wl-summary-copy, wl-summary-refile): Inhibited copying to `wl-draft-folder'. (Pointed out by okada@opaopa.org (Kenichi OKADA)) (wl-summary-overview-entity-compare-by-date): Ignore error. (Pointed out by MIZUHARA Bun ) * wl.el (wl-plugged-mode): Don't set inhibit-read-only. (Pointed out by Shuhei KOBAYASHI ) * wl-vars.el (wl-draft-reedit-hook): New hook. * wl-draft.el (wl-draft-save, wl-draft-mimic-kill-buffer): New function. (wl-draft): Don't use buffer names which are already used. (wl-draft-reedit): run-hook `wl-draft-reedit-hook' instead of `wl-mail-setup-hook'. (Requirement by okada@opaopa.org (Kenichi OKADA)) * wl-xmas.el, wl-mule.el (wl-draft-key-setup): Binded `wl-draft-save' to `C-xC-s', `wl-draft-mimic-kill-buffer' to `C-xk'. * wl-nemacs.el (wl-draft-overload-functions): Ditto. 2000-01-09 TAKAHASHI Kaoru * wl-mule.el, wl-util.el: Fix run time (require 'static). * wl.el (wl-save): Add docstring. 2000-01-08 Mito * wl-score.el (wl-score-guess-like-gnus): Enclosed with (when (stringp fld-name)..). 2000-01-08 Masahiro MURATA * wl-draft.el (wl-draft-config-info-operation): New function. (wl-draft-delete, wl-draft-save-and-exit, wl-draft-reedit): Use `wl-draft-config-info-operation'. 2000-01-08 Yuuichi Teranishi * wl-demo.el (toplevel): Eliminated warnings when bitmap is not installed. (wl-demo-use-bitmap): New variable. * WL-CFG: Added example of setting wl-demo-use-bitmap to nil. * wl-nemacs.el (toplevel): Quit timezone emulating (Assume APEL 10). * wl-demo.el, wl-draft.el, wl-folder.el, wl-util.el, wl-message.el, wl-summary.el (toplevel): set the return value of make-local-variable. (Adviced by Shuhei KOBAYASHI ) 2000-01-07 Daiki Ueno * wl-draft.el (wl-smtp-features, wl-smtp-parse-extension): Fixed. 2000-01-07 Yuuichi Teranishi * wl-draft.el (wl-user-agent-compose): call wl-draft interactively. (Pointed out by Atsushi Tada ) * Makefile (EMACS): set default to `emacs'. (XEMACS): New variable. (package, install-package): Use $(XEMACS). * 2.2.14 - "Layla" * wl-summary.el (wl-summary-mode): Quit setting default-directory. * wl-vars.el (wl-tmp-dir): set default as "~/tmp/"(cf. WL-ML 3735). 2000-01-06 Daiki Ueno * wl-draft.el (wl-smtp-features): New variable. (wl-smtp-extension-bind): New macro. * wl-summary.el (wl-summary-mode-map): Binded `wl-summary-prev-page' to backspace. 2000-01-06 Kentaro Yoshitomi * elmo-maildir.el (elmo-maildir-create-folder): Fixed a bug which occurs when directory ends with "/". 2000-01-06 okada@opaopa.org (Kenichi OKADA) * wl-draft.el: sync up with SLIM's smtp.el. 2000-01-06 Yuuichi Teranishi * wl-util.el (wl-load-profile): Moved from wl.el. * COPYING: New file (renamed from etc/copyright). * wl-vars.el (wl-smtp-connection-type): Renamed from wl-smtp-use-tls. * wl-draft.el (wl-draft-send-mail-with-smtp): Bind smtp-connection-type with wl-smtp-connection-type. (wl-draft-queue-save-filename): fixed typo. * wl-vars.el (wl-cs-*): Changed definitions for Nemacs. * all files: Updated copyright information and checkdoc fix. 2000-01-05 TAKAHASHI Kaoru * wl-ja.texi: Add copyright and permissions text. 2000-01-05 Yuuichi Teranishi * wl-score.el (wl-summary-score-update-all-lines): Mark as read-uncached when marked by scoring. * elmo-util.el (elmo-imap4-get-spec): Fixed a bug which occurs when elmo-default-imap4-ssl is t. (Reported by Taro FUNAKI ) * tm-wl.el (wl-draft-yank-current-message-entity): Fixed binding of mime-viewer/following-method-alist. (Reported by Taiji.Can@atesoft.advantest.co.jp) 2000-01-04 OKUNISHI -GTO- Fujikazu * wl-message.el (wl-message-decode): Decode with wl-cs-autoconv when 'no-mime. 1999-12-31 Kentaro Yoshitomi * elmo-maildir.el, elmo-util.el: Implemented create, delete and copy method of Maildir. 1999-12-29 Yuuichi Teranishi * wl-draft.el (wl-draft): Call `wl-load-profile'. (Pointed out by Masahiro MURATA ) * elmo-imap4.el (elmo-imap4-make-number-set-list): New function. (elmo-imap4-msgdb-create): Use `elmo-imap4-make-number-set-list'. (elmo-imap4-mark-set-on-msgs): Ditto. 1999-12-11 okada@opaopa.org (Kenichi OKADA) * wl-summary.el (wl-summary-get-sync-range): Don't claim unplugged in pop3. 1999-12-28 Nishimoto Masaki * elmo-msgdb.el (elmo-msgdb-expand-path): fixed wrong expansion. 1999-12-28 Yuuichi Teranishi * 2.2.13 - "Keep The Faith" 1999-12-27 Yuuichi Teranishi * elmo-util.el (elmo-network-get-spec): New variable. (elmo-*-get-spec): Rewrote so that 'user' can contain '@'. (okada@opaopa.org (Kenichi OKADA)'s demand.) * elmo-imap4.el (elmo-imap4-create-msgdb-from-overview-string): Corresponded to Emacsen that cannot treat float. * elmo-pop3.el (elmo-pop3-get-connection): Changed argument. * check-paren fix. 1999-12-21 Koga Masato * wl-draft.el (wl-draft-reedit): Obey to `wl-draft-use-frame'. 1999-12-21 Yuuichi Teranishi * elmo-vars.el (elmo-imap4-use-modified-utf7): New variable. 1999-12-20 Yuuichi Teranishi * wl-mime.el, tm-wl.el (wl-mime-save-content): Remember last saved directory. * wl.el (wl-save): New command. Save current folder status. (A demand from JINMEI Tatuya .) * wl-folder.el (wl-folder-mode-map): Binded `wl-save' to "\M-s". * elmo-util.el (elmo-imap4-get-spec): Use `utf7-encode-string'. * elmo-imap4.el (elmo-imap4-list-folders): Use `utf7-decode-string'. * elmo/utf7.el: New file. 1999-12-20 Daiki Ueno * elmo-imap4.el (elmo-imap4-open-connection): Fixed starttls. * wl-draft.el: featurep->boundp. 1999-12-17 Yuuichi Teranishi * wl-vars.el (wl-search-mime-charset): New variable. * wl-summary.el (wl-summary-pick): Use `wl-search-mime-charset'. 1999-12-16 TAKAHASHI Kaoru * WL-MK (wl-texinfo-format): Add `@direntry' emulation for old texinfmt.el. 1999-12-16 Yuuichi Teranishi * wl-draft.el (wl-draft-config-exec): Re-highlight draft. (Pointed out by Motomichi Matsuzaki ) * wl-summary.el (toplevel): Changed key bind order of `wl-summary-temp-mark-region'. (okada@opaopa.org (Kenichi OKADA)'s report.) 1999-12-16 okada@opaopa.org (Kenichi OKADA) * wl-summary.el (wl-summary-mark-as-important-region, wl-summary-mark-as-unread-region, wl-thread-mark-as-important, wl-thread-mark-as-unread, wl-summary-temp-mark-mark-as-important, wl-summary-temp-mark-mark-as-unread): New functions. (wl-summary-save-region): Eliminated bogus process. (wl-summary-prefetch-region): Use `elmo-cache-exists-p' instead of `wl-summary-message-uncached-marks'. * wl-thread.el (wl-thread-get-children-msgs-uncached): Ditto. 1999-12-14 okada@opaopa.org (Kenichi OKADA) * Changed behavior of TLS in pop and imap when server does not provide TLS feature. 1999-12-14 TSUMURA Tomoaki * dot.wl: Added an example setting; wl-default-folder shows ML-name and ML-count and other folder shows ML-count. 1999-12-14 Yuuichi Teranishi * mmelmo-imap4-2.el (mmelmo-imap4-parse-bodystructure-string): Fix: Parse fails if JIS filename is contained. * wl-summary.el (wl-summary-copy): Fixed bug. (Reported by Hiroshi Watanabe ) 1999-12-12 Yuuichi Teranishi * wl-summary.el (wl-summary-goto-folder-subr): Changed timing to be sticky (Adviced by Masahiro MURATA ). * wl-vars.el (wl-folder-sync-range-alist): Changed range of draft and queue folder. 1999-12-11 okada@opaopa.org (Kenichi OKADA) * wl-summary.el (wl-summary-get-sync-range): Don't claim unplugged in pop3. 1999-12-10 OKUNISHI -GTO- Fujikazu * Eliminated defalias for elmo function in wl modules. 1999-12-07 okada@opaopa.org (Kenichi OKADA) * elmo-nntp.el: Changed behavior when elmo-nntp-max-number-precedes-list-active is `t' and list-active is not provided. 1999-12-07 TAKAHASHI Kaoru * INSTALL.ja: Fixed. * wl-summary.el (wl-summary-always-sticky-folder-p): New macro. (wl-summary-goto-folder-subr): Use `wl-summary-always-sticky-folder-p'. 1999-12-07 Akihiro MOTOKI * wl-vars.el (wl-summary-always-sticky-folder-list): New variable. * wl-summary.el (wl-summary-stick): New optional argument. (wl-summary-goto-folder-subr): Folders that match `wl-summary-always-sticky-folder-list' stick automatically. 1999-12-07 Yuuichi Teranishi * INSTALL.ja: Changed to ISO-2022-JP. * wl-draft.el (wl-draft-send-mail-with-smtp): Fixed binding of (default-)?case-fold-search. (Reported by Atsushi Tada , , etc.) (wl-draft-send): Don't use `with-current-buffer'. * 2.2.12 - "Joyride" 1999-12-07 Katsumi Yamaoka * etc/icons/wl-logo.xbm: Christmas version. 1999-12-07 Yuuichi Teranishi * elmo-imap4.el (elmo-imap4-parse-overview-string): Fix: Cannot parse number when elmo-imap4-use-uid is nil. * utils/hmac/scram-md5.el, utils/hmac/hmac-util.el: Removed. * wl-summary.el (wl-summary-mark-as-unread): Fixed wrong-type-argument error. * wl-folder.el (wl-folder-empty-trash): Fix: Summary information is incleased everytime. (Reported by OKAZAKI Tetsurou ) 1999-12-07 Masahiro MURATA * wl-draft.el (wl-draft-condig-exec): Set wl-draft-config-exec-flag as nil only if wl-draft-config-alist was applied. 1999-12-06 Shigeru OKUMURA * WL-ELS (HMAC-MODULES): Updated. 1999-12-06 Tsunehiko Baba * INSTALL: New file. 1999-12-06 Yuuichi Teranishi * elmo-imap4.el (elmo-imap4-create-msgdb-from-overview-string): Fix: filter does not work correctly. (Reported by Kazuyoshi Mii ) * 2.2.11 - "Iris" * utils/hmac/elisp/*.el: Sync up with slim-1.13.4 * elmo-imap4.el (elmo-imap4-open-connection): Use `sasl-cram-md5' for cram-md5. (toplevel): (require 'sasl) instead of (require 'hmac-md5). Eliminated eval-when-compile. 1999-12-05 Yuuichi Teranishi * wl-summary.el (wl-summary-mark-as-read): Avoid marking messages which is not in msgdb. * wl-summary.el (wl-summary-pick): Notify if no message was picked from msgdb. 1999-12-04 Yuuichi Teranishi * elmo-msgdb.el (elmo-msgdb-overview-get-parent-entity): Changed argument. * wl-vars.el (wl-smtp-posting-server): Set default value as nil. (Adviced by okada@opaopa.org (Kenichi OKADA)) * elmo-imap4.el (elmo-imap4-create-msgdb-from-overview-string): downcase extra-field name. (Pointed out by Takaaki MORIYAMA ) * elmo-util.el (elmo-collect-field(-from-string)?): Argument `downcase-field-name' is added. 1999-12-03 TSUMURA Tomoaki * wl-folder.el (wl-folder-empty-trash): Fix: Summary information is incleased everytime. 1999-12-03 Nishimoto Masaki * wl-summary.el (wl-summary-default-from): Newsgroup name is not displayed. 1999-12-03 TAKAHASHI Kaoru * INSTALL.ja: New file. * wl-summary.el (wl-summary-reedit): When reedit draft for news arcticle, don't add To: header. 1999-12-03 Yuuichi Teranishi * elmo-util.el (elmo-mime-string): Enclose with elmo-set-work-buf. (Pointed out by Mikiya Tani ) * etc/icons/wl-logo.xpm: Christmas version. * elmo-imap4.el (elmo-imap4-make-attributes-object): Nemacs causes error in read. * elmo-dop.el (elmo-dop-list-folder): correspond to pipe feature. (Pointed out by OKAZAKI Tetsurou ) 1999-12-03 sen_ml@eccosys.com * utils/wl-mailto.el: 0.5. 1999-12-02 Yuuichi Teranishi * mmelmo-imap4-1.el: eliminated buffer read only error. * wl-mime.el, tm-wl.el: Changed key bind of wl-draft-preview-message. (Based of the report by Makoto.Nakagawa@jp.compaq.com) * utils/ssl.el: Sync up to newest version. (Adviced by okada@opaopa.org (Kenichi OKADA)) * elmo-util.el (elmo-mime-string, elmo-decode-mime-charset-string): New function. * elmo-imap4.el: FETCH analyzing module is replaced. 1999-12-02 Hironori Fukuchi * wl-xmas.el: If (featurep 'dragdrop) is nil, wl-dnd-set-drop-target causes error. 1999-12-02 okada@opaopa.org (Kenichi OKADA) * elmo-util.el: encolsed (require 'starttld) by condition-case. 1999-12-01 okada@opaopa.org (Kenichi OKADA) * Fix: Error occurs when wl-smtp-posting-user is nil in smtp auth. * Fixed an error which occurs when nntp port number is specified. 1999-11-27 Masahiro MURATA * wl-draft.el (wl-draft-reedit): eliminated judgement by `(interactive-p)' because it is not interactive. * New command: wl-fldmgr-delete. * Rename: wl-fldmgr-rename-group -> wl-fldmgr-rename. * New function: elmo-folder-creatable-p. * Create directory when `#mh' type folder is created in IMAP4 folder. * wl-folder-check-one-entity creates folder if it does't exist. * New macro: wl-folder-clear-entity-info. 1999-11-25 TAKAHASHI Kaoru * wl-message.el (wl-message-narrow-to-page): Fixed `beginning-of-buffer' error occurs, when read "^L\n^L" inclueded message. 1999-11-25 Yuuichi Teranishi * wl-summary.el (wl-summary-mode): Eliminated argument. * wl-address.el (wl-address-petname-add-or-change): Fix: When there's no newline character in the last line of `.addresses', wrong entry is added. * elmo-imap4-[12].el (mmelmo-imap4-parse-bodystructure-entity): Use mime-parse-parameters-from-list. 1999-11-24 Tetsuya Uemura * x-face-xmas-mew-display-x-face -> x-face-xmas-wl-display-x-face 1999-11-22 okada@opaopa.org (Kenichi OKADA) * wl-vars.el (wl-smtp-authenticate-type, wl-smtp-use-tls): New variable. * wl-draft.el (wl-draft-send-mail-with-smtp): Added SMTP TLS feature. 1999-11-21 okada@opaopa.org (Kenichi OKADA) * When wl-summary-jump-to-msg-internal is called via wl-summary-jump-to-msg-by-message-id-via-nntp, `scan-type' becomes `update'. 1999-11-22 Daiki Ueno * elmo-imap4.el, elmo-pop3.el: Added STARTTLS feature. 1999-11-20 Masahiro MURATA * wl-draft.el (wl-draft-send-mail-with-smtp): Bind process-connection-type nil. 1999-11-20 OKUNISHI -GTO- Fujikazu * elmo-util.el (elmo-open-network-stream): Bind process-connection-type nil. 1999-11-20 Nishimoto Masaki * Fixed an error when an important message is marked-as-important by scoring, it disappeared. 1999-11-19 Hironori Fukuchi * tm-wl.el: fixed typo. 1999-11-18 Yasuo OKABE * Signal an error when no message is displayed at wl-draft-insert-message. 1999-11-17 Yuuichi Teranishi * wl-vars.el: New variable wl-summary-showto-folder-regexp. * wl-summary.el (wl-summary-default-from): renamed from my-wl-summary-from-func-petname in sample/../dot.wl (adviced from Masahiro MURATA ) * wl-summary.el (wl-summary-simple-from): wl-summary-default-from renamed. 1999-11-17 Masahiro MURATA * wl-message.el (wl-message-get-buffer-create): Fixed an error which occurs when sticky message is displayed. 1999-11-17 sen_ml@eccosys.com * wl-mailto.el: 0.5-pre1. 1999-11-16 Yuuichi Teranishi * elmo-util.el (elmo-delete-cr-get-content-type): If Content-Type does not exist, return t. * 2.2.9 - "Gonna Make You Sweat" 1999-11-15 Katsumi Yamaoka * wl-util.el (wl-unique-id): Don't use current-time and timezone. 1999-11-14 Masahiro MURATA * wl-draft.el, wl-summary.el: Set vaiable wl-draft-reply t in reply, wl-draft-forward t in forward. * wl-folder.el, wl.el: Make wl-make-plugged-alist only when wl-folder made folder list. 1999-11-14 OKAZAKI Tetsurou * elmo-pipe.el (elmo-pipe-use-cache-p): Implemented. * elmo2.el (elmo-folder-number-get-spec): Fixed. 1999-11-13 Yuuichi Teranishi * wl-draft.el: insert-mail is implemented. * If 'a' is pushed on MIME button, its part is cited in draft. * wl-user-agent.el: Removed. * wl-draft.el: Merged wl-user-agent.el. * wl-mime.el, tm-wl.el: Rearranged API to MIME modules. 1999-11-12 okada@opaopa.org (Kenichi OKADA) * Fix: elmo-imap4.el: If folder does not exist, wl-folder-check-current-entity fails. * wl-draft.el: wl-draft-config-list, wl-template-alist can specify `header', `header-file'. 1999-11-12 Katsumi Yamaoka * wl-util.el (wl-draft-make-message-id-string, wl-unique-id, wl-number-base36): New functions. (wl-unique-id-char): New internal variable. * wl-mule.el (wl-draft-make-message-id-string): Remove. * wl-nemacs.el (wl-draft-make-message-id-string): Remove. * wl-xmas.el (wl-draft-make-message-id-string): Remove. * wl-draft.el (wl-draft-send-mail-with-smtp): Funcall `smtp-server' if it is a function; leave the handling of Resent-* fields to `smtp'. 1999-11-12 Yuuichi Teranishi * wl-draft (wl-draft-get-fcc-list): Create folder when FCC contains new folder. * Rename: wl-draft-config-body-goto-{top|bottom} -> wl-draft-body-goto-{top|bottom} * Rename: wl-summary-confirm-folder-existence -> wl-folder-confirm-existence. (Adviced by Masahiro MURATA ) * Rename: wl-mime-edit-preview-message-hook -> wl-draft-preview-message-hook * elmo-nntp.el (elmo-nntp-string-to-vector): Eliminated. * elmo-util.el (elmo-tokenize-string): Eliminated. Replaced with split-string * wl-highlight.el: New face, wl-highlight-logo-face for logo. 1999-11-11 Katsumi Yamaoka * wl-demo.el: Corresponded to bitmap-mule. * wl-logo.xbm: New file. * elmo-nntp.el (elmo-nntp-string-to-vector): Unlimit the length of vector. (elmo-nntp-parse-overview-string): Don't specify the 2nd arg of `elmo-nntp-string-to-vector'. 1999-11-11 Yuuichi Teranishi * elmo-imap4.el: Searching fails if Message-ID contains '%'. (Adviced by OKAZAKI Tetsurou ) * wl-message.el, mmelmo-[12].el: Rearranged read-only setting. * Rename: wl-draft-save-and-hide -> wl-draft-save-and-exit. Binded to C-c C-z. 1999-11-11 Yasuo OKABE * wl-summary.el (wl-summary-temp-mark-forward): Enclose as multipart/digest if multiple messages are included. 1999-11-11 okada@opaopa.org (Kenichi OKADA) * New variable wl-nntp-posting-port, wl-nntp-posting-ssl. wl-nntp-posting-{user,server,port,ssl} corresponds to elmo-default-nntp-{user,server,port,ssl}. * Set the initial value of wl-nntp-posting-* as nil. If they are nil, use elmo-default-nntp-* value. * utils/bbdb-wl.el: If bbdb-use-pop-up is nil, error occurs. * wl-draft.el: New function wl-draft-save-and-hide. 1999-11-10 okada@opaopa.org (Kenichi OKADA) * wl-demo.el: calculate the displayed position of wl-logo.xpm. 1999-11-10 Tsutomu Okada * wl-message.el (wl-message-refer-article-or-url): Not to move cursor to message buffer with mouse-button-2. 1999-11-10 Yuuichi Teranishi * wl-summary.el (wl-summary-set-message-buffer-or-redisplay): Sticky Message sometimes provides wrong message. (Reported by Mito ) * wl-util.el (wl-string): alias to elmo-string. * elmo-util.el (elmo-string): New function. * New variable: wl-smtp-posting-port. * Binded wl-summary-resend-bounced-mail to "\eE". 1999-11-10 OKAZAKI Tetsurou * WL-ELS: fixed typo. 1999-11-10 kurati@bigfoot.com * When new folder is created, add it to the completion candidate. * FCC: If new folder is specified, confirm to create it. * auto-refile: If new folder is specified, confirm to create it. 1999-11-10 Yasuo OKABE * wl-summary.el (wl-summary-resend-message, wl-summary-resend-bounced-mail): New command. * wl-draft.el (wl-draft-dispatch-message): Dont send via nntp if dispatched message includes Resent-to header. 1999-11-09 okada@opaopa.org (Kenichi OKADA) * wl-summary.el (wl-summary-jump-to-msg-internal): message is not displayed in some cases. * wl-summary.el (wl-summary-jump-to-msg-by-message-id-via-nntp): If there are multiple newsgroup candidates, newsgroup in the wl-folder-newsgroups-hashtb is preceded. 1999-11-09 Yuuichi Teranishi * 2.2.8 - "Free As A Bird" 1999-11-08 Yuuichi Teranishi * Fix: wl-draft.el (wl-draft-send): C-cC-s becomes insert-signature after sending. (Reported by Akihiro MOTOKI ) * WL-MK: (fset 'file-executable-p 'file-exists-p) for Nemacs. * WL-MK, WL-CFG: Changed default value of WL_PREFIX and ELMO_PREFIX to "wl". * New variable: wl-user-mail-address-list. * New function: wl-address-user-mail-address-p Judge whether an address is user's or not using wl-user-mail-address-list and wl-from. * wl-summary.el (wl-summary-cancel-message, wl-summary-supersedes-message): Use wl-address-user-mail-address-p to judge whether an address is user's or not. (Based on the changes by okada@opaopa.org (Kenichi OKADA)) * wl-refile.el (wl-refile-learn, wl-refile-guess-by-history): Ditto. * wl-draft.el (wl-draft-make-mail-followup-to, wl-draft-reply wl-draft-delete-myself-from-cc): Ditto. * elmo-filter.el (elmo-filter-list-folder-unread, elmo-filter-list-folder-important): filtering was not valid. (Reported by Kazuyoshi Mii ) 1999-11-08 okada@opaopa.org (Kenichi OKADA) * Altered the initialization of POP-before-SMTP variables. 1999-11-07 okada@opaopa.org (Kenichi OKADA) * elmo-nntp.el: Use `list' if `list active' was in vain. 1999-11-07 Masahiro MURATA * Eliminated wl-draft-prepared-confi-alist and unified with wl-draft-config-alist. * Take over local variables in wl-template-select. * Process Fcc after the message sending is finished. * Changed from user-mail-address to wl-envelope-from in wl-draft-queue-save-variables. * Fix: An error occurs in wl-draft-insert-from-field when user-mail-address is nil. 1999-11-06 Tetsuya Uemura * Display mode map by describe-mode. 1999-11-06 TAKAHASHI Kaoru * wl-folder.el (wl-folder-mode-map): Change key bind of wl-fldmgr-copy-region. 1999-11-06 Hironori Fukuchi * wl-summary.el (wl-summary-stick): parenthesis position is invalid. 1999-11-06 Yasuo OKABE * utils/wl-user-agent.el: altered to unify the behavior with sendmail-user-agent. 1999-11-06 sen_ml@eccosys.com * utils/wl-user-agent.el: 0.5. 1999-11-05 Yuuichi Teranishi * elmo-imap4.el: Rearranged all modules. * elmo-imap4.el: New variable `elmo-imap4-debug'. Non-nil forces debug information appair on "*IMAP4 DEBUG*" buffer. * elmo-imap4.el, elmo-pop3.el, elmo-nntp.el: Number of times of copying entire message is suppressed. * elmo-imap4.el: Lock the process until the response is returned from server. * wl-summary.el: Auto refile failes if wl-refile-rule-alist is nil. * WL-MK: install-package does not install info. (Reported by "MATSUBAYASHI 'Shaolin' Kohji" ) * elmo-cache.el (elmo-cache-search): Corresponded to partial caching. (Reported by Yasuo OKABE ) 1999-11-04 okada@opaopa.org (Kenichi OKADA) * Rearranged POP-before-SMTP variables. * New variable: elmo-default-pop3-user, wl-pop-before-smtp-user, wl-pop-before-smtp-server, wl-pop-before-smtp-port, wl-pop-before-smtp-ssl, wl-pop-before-smtp-authenticate-type. * elmo-pop-before-smtp-* -> wl-pop-before-smtp-* 1999-11-04 Yuuichi Teranishi * wl-mime.el (wl-mime-edit-preview-message): New hook: wl-mime-edit-preview-message-hook. * elmo-util.el: Suppressed warnings. * wl-summary.el (wl-summary-sync-marks): Make mark synchronization faster. * elmo-pipe.el (elmo-pipe-max-of-folder): Unread number is not valid in IMAP4 folders. (Reported by Toshihiko Kodama ) 1999-11-03 Yuuichi Teranishi * 2.2.7 - "Escapade" * WL-MK: install-info causes strange INFODIR message. * Fix: Error occurs the first prefetch from Folder. (Reported by Kenichi OKADA ) * mmelmo: changed mime-elmo-entity as subclass of mime-buffer-entity to avoid effects on other MUAs. * wl-thread.el: Number is not highlighted when message is appended to the closed thread. * Some functions are corresponded with pipe-folder. 1999-11-03 Masahiro MURATA * Change: folder petname can be used for folder name completion. * Fix: If wl-force-fetch-folders is non-nil, access groups cannot be opened in the unplugged status. * wl-fldmgr.el: inhibited to call `wl-fldmgr-set-petname' in the end of line. * wl.el: If there is no change in wl-plugged-mode, wl-toggle-plugged is not called. * rearranged buffer removal of wl-exit and wl-folder-suspend. * wl-folder.el: some functions are replaced with wl-folder-buffer-group-p. * wl-summary.el: some functions are replaced with wl-summary-entity-info-msg. * Change: changed wl-reset-plugged-alist's default value to t. * Fix: plugged status is reset. 1999-11-03 TAKAHASHI Kaoru * wl-summary.el (wl-summary-reedit): When reedit draft for news arcticle, don't add To: header. 1999-11-03 Kenichi OKADA * wl-summary.el (wl-summary-write-current-newsgroup): use elmo-folder-get-primitive-folder-list. * New command: wl-folder-write-current-newsgroup * elmo-util.el (elmo-folder-get-primitive-folder-list, elmo-folder-get-primitive-spec-list): changed for pipe-folder. * Fix: wl-toggle-plugged fails if the network downed before elmo-pop3-flush-connection. 1999-11-03 sike@ic.netlaputa.ne.jp * Fix: the problem when Message-Id contains newline. 1999-11-02 Yuuichi Teranishi * 2.2.6 - "Diamonds And Pearls" * Set plug status to wl-plugged in wl-init. (Pointed out by Yasuo OKABE ) * WL-MK: rewrote for Nemacs. * Rename: wl-address-complete-address -> wl-complete-field-body * Rename: wl-address-complete-address-or-tab -> wl-complete-field-body-or-tab 1999-11-01 Yuuichi Teranishi * Change: simplified the icon init function. * elmo-pipe: New module. 1999-11-01 OKAZAKI Tetsurou * Fix: typo in WL-ELS. * Fix: new WL-MK causes error when byte-compiling wl-user-agent.el and wl-mailto.el. 1999-10-29 Takaaki MORIYAMA * Remove wl-save-status from kill-emacs-hook in wl-exit. 1999-10-28 OKUNISHI -GTO- Fujikazu * new file: WL-ELS. * WL-MK: rewrote for install.el. 1999-10-28 okada@opaopa.org (Kenichi OKADA) * Fix: wl-ja.texi: key binding of wl-template-select was wrong. * Fix: synchronize unread number for INN 2.3. 1999-10-28 TAKAHASHI Kaoru * Fix: wl-ja.texi: many fixes. 1999-10-27 Yuuichi Teranishi * Change: binded 'Z' in Folder to `wl-status-update'. * Fix: wl-summary-goto-last-displayed-msg doesn't jump to previously displayed message when only one message was displayed. 1999-10-26 kurati * Change: FCC: is also target of completion. 1999-10-26 Yuuichi Teranishi * Change: Sync important mark though folder is in the unplugged status. * Change: Check existence of folder before auto-refile. (Demanding feature by Toshihiko Kodama ) * Fix: Mark expunged message as read on IMAP4 server. 1999-10-22 OKAZAKI Tetsurou * Fix: marking of thread causes strange behavior when cursor is not at the beginning of line. * Change: Don't move cursor when same folder is specified in wl-thread-refile. * Change: Changed message when wl-summary-jump-to-parent-message failed. * Change: Changed region adjusting of wl-summary-exec-region to intuitive way. 1999-10-25 Masahiro MURATA * Fix: wl-fldmgr causes error when group folder is added. * Change: define wl-defface statically. * Change: wl-folder-buffer-search-entity matches unread status unknown. * Fix: wl-summary-redisplay-no-mime does not set wl-summary-buffer-disp-msg and wl-current-summary-buffer. 1999-10-25 Yuuichi Teranishi * Change: Check domain name at startup time. * New variable: wl-local-domain. For those systems that doesn't return FQDN. * Change: Deleted horizontal scrollbar for Folder in XEmacs. (Pointed out by "MATSUBAYASHI 'Shaolin' Kohji" ) * New function: wl-mime-edit-preview-message. * Change: Move cursor on readable message when entered to Summary in the unplugged status. * Fix: typo in WL-CFG utils. (Pointed out by Taiji.Can@atesoft.advantest.co.jp) * Fix: cannot make info. (Pointed out by Kazufumi Hayasaka ) * 2.2.5 - "Come Undone" 1999-10-24 Mikio Nakajima * Fix: simplified double negative. 1999-10-24 Masahiro MURATA * Fix: If FCC is unplugged folder, append to dop-queue. * Change: New elmo-dop-queue operation "append-operations". * Change: wl-summary-flush-pending-append-operations takes over existing message's unread status. 1999-10-24 Yuuichi Teranishi * New file: WL-CFG. * Fix: FCC to IMAP4 Folder is ignored in the offline status. (Reported by Masafumi NAKANE ) * Fix: refile-alist cannot be shared between Emacs and XEmacs. (Reported by Takuro KITAME ) * wl-ja.texi: fixed original site of tm, semi. * Fix: If there are IMAP4 folders which have same name and different servers, wrong folder is sometimes updated its unread number. (Reported by Kazuyoshi Mii ) 1999-10-23 Kenichi OKADA * Fix: queued functions not in elmo-dop-merge-funcs are discarded. 1999-10-23 Masahiro MURATA * Change: Plugged status: display label of every port. * Change: Plugged status: displaying dop-queue displayed more in detail. * Fix: elmo-dop-queue-merge sometimes set elmo-dop-queue to nil. 1999-10-23 okada@opaopa.org (Kenichi OKADA) * Change: elmo-prefetch-msgs displays the progress. 1999-10-23 Yuuichi Teranishi * Set wl-mime-save-content as Wanderlust specific method on SEMI. * Fix: FLIM-1.12.x fails to merge partial messages. * WL-MK: Rewrote configuration process. 1999-10-22 TAKAHASHI Kaoru * Rename: wl-score-edit-exit-function -> wl-score-edit-exit-func 1999-10-22 Takuro KITAME * Fix: etc/ja.Emacs: Some values are duplicated. 1999-10-22 Kenichi OKADA * Add: [wl-ja.texi] Added explanations of wl-summary-save-*, wl-summary-jump-to-msg-by-message-id-via-nntp, offline prefetch, wl-folder-jump-to-current-entity, cram-md5, and SSL. 1999-10-22 Masahiro MURATA * Fix: Set md5 CODING to 'binary for XEmacs built-in function. * Fix: Move from sticky summary to other by "g", temp mark face is not recovered. * New variable: wl-prog-uudecode-no-stdout-option. Non-nil forces save with filename specified in uuencode stream. 1999-10-21 okada@opaopa.org (Kenichi OKADA) * Merge offline queue. 1999-10-21 Yuuichi Teranishi * Change: Don't use std11.el in wl-address-header-extract-address. 1999-10-20 Masahiro MURATA * Change: Don't reset `elmo-plugged-alist' when startup. 1999-10-20 Yuuichi Teranishi * Fix: Emacs 20.2 causes buffer-read-only error on Folder mode. (Reported by Yasuhiro Ohta Adviced by TSUMURA Tomoaki ) * Fix: Check the feature of scrollbar and toolbar on XEmacs. (Adviced by Shigeru OKUMURA ) 1999-10-20 Kenichi OKADA * Fix: An error occurs when message with invalid header is refiled. * Fix: Access grop content is not appeared automatically at first open operation. 1999-10-19 Yuuichi Teranishi * Fix: 'E' in Folder causes error at wl-folder-toggle-disp-summary. (Reported by Shigeru OKUMURA ) * Change: Don't use 'eval-after-load' for timezone y2k. * 2.2.4 - "Black Or White" 1999-10-19 okada@opaopa.org (Kenichi OKADA) * Fix: prefetching removes mark in summary although it was canceled. * Change: Offline Prefetch. 1999-10-18 Yuuichi Teranishi * Change: inhibit 'm f' command in the last line of Folder mode. * Change: reduced warnings in byte-compile. * Added hmac package and ssl.el in utils subdirectory. (If wl-install-hmac is Non-nil, hmac package is installed.) * Change: corresponded to FLIM-1.12. * Fix: IMAP4 folder claims in unplugged status. * Change: Ask update number in summary if message number is larger than wl-summary-update-confirm-threshold. * New variable: wl-summary-update-confirm-threshold 1999-10-18 okada@opaopa.org (Kenichi OKADA) * New variable: wl-summary-search-via-nntp. if Non-nil, call wl-summary-jump-to-msg-by-message-id-via-nntp in wl-summary-jump-to-msg-by-message-id. If 'confirm, it confirms. * New variable: wl-summary-jump-to-msg-by-message-id-via-nntp Search message by Message-ID via NNTP and change folder. 1999-10-15 Yuuichi Teranishi * Change: call elmo-commit in elmo-imap4-server-diff. * New function: elmo-commit. * Fix: wl-folder-check-one-entity removed useless folder check. * elmo-imap4-max-of-folder: new implementation. * elmo-imap4-folder-exists-p: new implementation. 1999-10-14 Mikio Nakajima * Fix: wl-ja.texi: typo (@kbd {l} -> @kbd{l}). 1999-10-14 TAKAHASHI Kaoru * Fix: wl-local-variable-p does not work on xemacs. 1999-10-14 Yuuichi Teranishi * Fix: flag on server was not changed when cached message was read. (Pointed out by Taiji.Can@atesoft.advantest.co.jp) * Change: Use std11.el in wl-address-header-extract-address. 1999-10-14 Masafumi NAKANE * Fixed Typo: exit-> exist. 1999-10-13 okada@opaopa.org (Kenichi OKADA) * Change: unplugged.xpm: added red. 1999-10-13 OKAZAKI Tetsurou * Fix: elmo-filter-get-spec change was not completed (elmo-folder-diff). 1999-10-13 Masahiro MURATA * Fix: lighten wl-plugged-mode. * Fix: wl-draft-raw-send wl-draft-config-alist was binded to nil. 1999-10-13 Sasaki Toshiya * Change: wl-folder-use-sever-diff-p If multi-folder contains IMAP4 folder, then t. 1999-10-13 Yuuichi Teranishi * Change: Set filename in 'm U' (wl-summary-temp-mark-uudecode). * Change: Wheel works in Folder mode. * Fix: tm-wl.el was not completed. (Pointed out by Toshihiko Kodama ) * Change: wl-ja.texi: added explanation of 'OR'. * Change: removed dependency for time-stamp.el. 1999-10-12 Yuuichi Teranishi * 2.2.3 - "Always" * read-directroy-name -> wl-read-directory-name. 1999-10-12 okada@opaopa.org (Kenichi OKADA) * New commands: wl-summary-save-region (ry), wl-thread-save (ty), wl-summary-temp-mark-save (my). 1999-10-11 Masahiro MURATA * New variable: wl-draft-sendlog Sending log is saved when this value is non-nil. * New plugged system-II. 1999-10-10 Yuuichi Teranishi * New command: wl-summary-temp-mark-pick (binded to m?). * New variable: elmo-imap4-disuse-server-flag-mailbox-regexp. * Rename: wl-address-file-name -> wl-address-file. * Rename: wl-score-default-file-name -> wl-score-default-file. * New variable: wl-summary-auto-sync-marks. Non-nil forces summary to synchronize unread/important marks at 's'. * Change: default value for wl-stirict-diff-folders is changed to nil. * Change: important marks are synchronized in server. * Change: IMAP4 Folder synchronizes unread status with server. * New command: wl-summary-sync-marks. * Change: IMAP4 Folder server can display side diff. * New variable: wl-folder-use-server-diff. 1999-10-08 Yuuichi Teranishi * New variable: wl-envelope-from which sets envelope from. If nil, wl-from is used as envelope from. 1999-10-04 Yuuichi Teranishi * Change: defined easy saving method as default (for SEMI). * Change: wl-draft-send kills sending-buffer only when it is buffer-live-p. * Change: Folder existence is checked only when folder checking was failed. * Fix: wheel causes error when cursor is on message buffer. 1999-10-04 okada@opaopa.org (Kenichi OKADA) * Change: C-u SPC calls wl-folder-update-recursive-current-entity on group folder. 1999-10-04 Yuuichi Teranishi * Fix: filtered IMAP4 folder queues needless remove process. (Pointed out by OKAZAKI Tetsurou ) 1999-10-04 okada@opaopa.org (Kenichi OKADA) * Fix: wl-folder-update-recursive-current-entity does not work when access group has petname. 1999-10-03 TSUMURA Tomoaki * Fix: keys (mail addresses) are downcased when they are registered to wl-refile-alist. 1999-10-02 Tetsuya Uemura * Change: If number is specified as prefix argument for C-l, the number is passed to recenter. 1999-10-01 Yuuichi Teranishi * Fix: Avoided mark as read entire message when part was fetched in IMAP4. 1999-09-30 OKUNISHI -GTO- Fujikazu * Fix: Emacs 20 with argument '-nw' could not print out. 1999-09-28 Masahiro MURATA * Fix: Summary sometimes appears on unexpected window when moving from Folder to Summary. * Fix: wl-plugged-change causes error. * Change: wl-plugged-change can be called from Summary. 1999-09-27 Yuuichi Teranishi * Change: quit loading wl.el in compile time. (Pointed out by Masahiro MURATA ) 1999-09-27 Masahiro MURATA * Fix: New plugged system sometimes causes an error. 1999-09-26 Masahiro MURATA * Change: New plugged system. 1999-09-24 OKUNISHI -GTO- Fujikazu * Fix: execute wl-summary-redisplay-internal () instead of wl-summary-set-message-buffer-or-redisplay() to affect wl-break-pages value in printing. * Fix: If wl-break-pages is t, next page does not printed. 1999-09-23 Kenichi OKADA * Change: set truncate-line t in folder-mode when wl-stay-folder-window is non-nil. 1999-09-23 OKAZAKI Tetsurou * Fix: elmo-filter-get-spec change was not completed (elmo-folder-diff). 1999-09-23 OKUNISHI -GTO- Fujikazu * Change: use file-name-absolute-p () for absolute path detecting. 1999-09-20 Masahiro MURATA * Fix: kill buffers of mime-view-caesar when exit summary. 1999-09-21 OKUNISHI -GTO- Fujikazu * Fix: elmo-safe-filename: corresponded to OS/2 filesystem. 1999-09-21 Yuuichi Teranishi * 2.2.2 - "You Could Be Mine" * Change: folders in Folder mode are saved ignoring wl-save-folder-list. * Change: 'tocc' field means 'To' or 'Cc' in filter spec. * Change: OR condition, NOT condition are now available in filter folder. * Change: wl-uniq-list -> elmo-uniq-list * Fix: wl-summary-save always complains "No message to save." * Change: move local-variable-p definition to wl-util.el. (according to the report from Masahiro MURATA ) 1999-02-02 IMAI Takeshi * Fix: cannot expire to IMAP folder. 1999-09-20 Masahiro MURATA * Fix: kill buffers of mime-view-caesar when exit summary. 1999-09-19 Shigeru OKUMURA * Fix: set process-buffer of open-network-stream as unibyte. 1999-09-19 OKAZAKI Tetsurou * Fix: wl-ja.texi 1999-09-17 HAYAKAWA akio * Change: consider multi folder as local folder if it contains only local folder. 1999-09-16 OKUNISHI -GTO- Fujikazu * typo fix. 1999-09-16 Masahiro MURATA * Change: recycle message window in one frame. * Change: resume message window status in wl-summary-goto-folder according to wl-summary-buffer-disp-msg. 1999-09-15 OKAZAKI Tetsurou * WL-MK: Fix: install-wl-package ignored wl-install-els for elmo modules. New function: wl-install-modules 1999-09-14 Yuuichi Teranishi * 2.2.1 - "Wild World" * typo: stickey -> sticky. * New function: wl-nemacs.el local-variable-p for Nemacs. * Rename: etc/ChangeLog.* -> etc/ChangeLog.*.ja * Rename: etc/ChangeLog.*.en -> etc/ChangeLog.* * Fix: XEmacs doesn't show logo. * Fix: install fails in XEmacs package. (Pointed out by Hidetomo Machi ) * Change: wl-ja.texi Sync up section MIME modules. * Change: keep info files. * New function: wl-kill-buffers * Change: delete Sticky Message buffer in wl-summary-force-exit and wl-exit. (Adviced by Masahiro MURATA ) 1999-09-14 Masahiro MURATA * Fix: wl-summary-read causes error in sticky summary under XEmacs-21.1.6. 1999-09-14 Koichiro Ohba * Fix: ja/dot.wl elmo-eword-decode-string is still used. 1999-09-13 Yuuichi Teranishi * Change: tm-wl.el defined some functions by defalias-maybe. * Remove: smtp.el flim or clime includes it. 1999-09-13 Yuuichi Teranishi * 2.2.0 - "Vogue" * smtp.el: Sync up with flim-1.13.2. * New variable: wl-install-els. If nil, el files are not installed(for WL-CFG). * Stickey Message changes for wl-draft-reply etc. * Rename: wl-drfat-buffer-cur-message-buffer -> wl-current-message-buffer(moved to wl-util.el) * Change: elmo-cross-device-link-error-p definition for MSDOS-mounted filesystem in UNIX. (According to the report from pf21 GOTO_Toshiya ) 1999-09-13 Mito * Change: Stickey Message. * Change: New guess module of score file. * Change: el files are also installed with elc files. 1999-09-12 Yuuichi Teranishi * New file: samples/en/dot.* * New directory: samples. * Move: etc/*.xpm -> etc/icons/*.xpm * Move: etc/TODO -> doc/TODO.ja 1999-09-12 OKAZAKI Tetsurou * Fix: filter syntax of since, before is changed. 1999-09-10 OKUNISHI -GTO- Fujikazu * im-wl-prog-imput-error-msg -> im-wl-dispatcher-error-msg. 1999-09-10 Yuuichi Teranishi * removed defmacro of convert-standard-filename. * removed defmacro of open-network-stream-as-binary. * removed defmacro of with-current-buffer, with-temp-buffer etc. * elmo-eword-decode-string -> abolished. 1999-09-09 Yuuichi Teranishi * New variable elmo-default-imap4-user. (According to the advice from Taiji.Can@atesoft.advantest.co.jp) * 2.1.5 - "Unbelievable" 1999-09-08 Yuuichi Teranishi * New variable: elmo-nntp-max-number-precedes-list-active. Non-nil precedes max number obtained by `list active' command in nntp. * New function: elmo-update-number which synchronizes max number of nntp folder when elmo-nntp-max-number-precedes-list-active is non-nil. (Based on Kenichi OKADA 's report.) 1999-09-06 Akihiro Motoki * Fix: elmo-localnews-append-msg has wrong number of arguments. 1999-09-06 Yuuichi Teranishi * [im-wl] Copy `im-wl-prog-imput-error-msg' value to process buffer. * Change: 'N','P' also ignores if current folder is (elmo-folder-local-p). (Adviced by Akihiro Motoki ) 1999-09-03 Akihiro Motoki * Fix: 'p' skipps unread message even in localdir. * New function: (elmo-folder-local-p) 1999-09-03 Yuuichi Teranishi * Change: key bind of wl-template-select is changed to `C-cC-j'. (Adviced by TSUMURA Tomoaki Masahiro MURATA ) 1999-08-31 Yuuichi Teranishi * Change: Message is changed for sending or queueing of draft. 1999-08-31 OKUNISHI -GTO- Fujikazu * Change: [im-wl] quit setting buffer in sub-process. 1999-08-30 Yuuichi Teranishi * Fix: [wl-ja.texi] now IMAP folder collects extra-fields. (Pointed out by Sasaki Toshiya) * Fix: Splited MIME message causes deadlock. (Pointed out by Mikio Nakajima ) 1999-08-30 OKUNISHI -GTO- Fujikazu * new im-wl.el 1999-08-27 Yuuichi Teranishi * Fix: `K'/`L' (wl-summary-increase/lower-score) proceeds to rule input status in the last line of Summary. (Adviced by TSUMURA Tomoaki ) * New variable: elmo-pop3-send-command-synchronously. Wait sending next command until server response is received. (According to Atsushi Tada 's patch) * Fix: mime-store-message/partial-piece causes error in recent SEMI. * Fix: Toolbar is not appeared in Draft mode in XEmacs. 1999-08-26 Teruki SHIGITANI * Fix: wl-summary-save causes error in the last line of summary. 1999-08-26 Yuuichi Teranishi * Change: default color for light background. * Fix: invalid filter syntax /last=200/ causes error. * Fix: imap access group could not specify root. 1999-08-25 Yuuichi Teranishi * 2.1.4 - "Tears In Heaven" * Change: [wl-ja.texi] Added explanation of C-u . in Summary. (Pointed out by susumu-w@ops.dti.ne.jp) 1999-08-24 Yuuichi Teranishi * Change: Cause error when refile or delete was failed in wl-summary-exit. * Fix: headers in split messages are not encoded. * Fix: Unread status is not reflected for messages read in unplugged status. * Fix: In unplugged status, previous message is displayed if uncached message is read. * Fix: temp-mark highlighting doesn't precedes persistent marks in wl-thread-open-close. (Pointed out by susumu-w@ops.dti.ne.jp) * Change: wl-thread-insert-message: don't use wl-summary-goto-top-of-current-thread. * Change: (wl-summary-goto-top-of-current-thread) new implementation. * Fix: wl-mail-setup-hook is not called when draft is created by "W". (Pointed out by Kenichi OKADA ) * Change: push -> wl-push. (Pointed out by Masahiro MURATA ) 1999-08-23 Yuuichi Teranishi * Change: quit defaliasing elmo-eword-decode-string. * Change: display version of flim in User-Agent when tm is used. * Fix: comparing function of partial ID. 1999-08-22 Masahiro MURATA * Fix: elmo-nntp.el (elmo-nntp-catchup-msgdb): if overview is not obtained, msgdb becomes (nil nil nil nil). 1999-08-20 OKUNISHI -GTO- Fujikazu * elmo-pop3.el: reorganized elmo-pop3-list-folder. 1999-08-20 Masahiro MURATA * New variable: wl-score-folder-alist-matchone. * Change: expanded syntax of wl-score-folder-alist. 1999-08-20 Mito * Change: [wl-score] if symbol 'guess' is specified instead of score file name in wl-score-folder-alist, file name is guessed from folder name. 1999-08-19 Masahiro MURATA * Fix: (wl-summary-switch-to-clone-buffer): added wl-summary-buffer-temp-mark-list, wl-summary-default-score, wl-summary-important-above, wl-summary-temp-above, wl-summary-mark-below, wl-summary-expunge-below to copy variables. 1999-08-18 Yuuichi Teranishi * Fix: Implemented wl-thread-exec. (Pointed out by "KJ.TASAKI" ) * Change: Check remaining temp-marks before sync-all. (Pointed out by Taiji.Can@atesoft.advantest.co.jp) * Fix: [elmo-vars.el] berkeley-db fix was not reflected. (Pointed out by Mikio Nakajima ) * Fix: y2k problem in timezone-parse-date. (Pointed out by Masahiro MURATA ) 1999-08-17 Mikio Nakajima * Fix: autload setting of interactive commands in wl-fldmgr.el. 1999-08-16 Masahiro MURATA * Change: Speed up scoring functions. * Change: wl-summary-sort-by-{from|subject}: faster implementation. * Change: wl-summary-switch-to-clone-buffer copies wl-current-score-file and wl-score-alist. * Added wl-as-mime-charset. * Change: Use wl-score-mode-mime-charset instead of wl-score-mode-coding-system. * Change: set default table size of elmo-make-hash to 1024. 1999-08-14 susumu-w@ops.dti.ne.jp * Fix: wl-thread-jump-to-msg causes error when called as command. * Change: bind "J" to wl-thread-jump-to-msg in Summary. * Change: localdir, localnew, maildir ignores unplugged status in cursor moving. * Change: t d doesn't take direction into account. * Fix: c-u t d marks previous thread. * Fix: 'd' displays next message, but t d does not. * Change: skip message marked with 'D' in n & p. 1999-08-14 Yuuichi Teranishi * Fix: [elmo] Cannot access remote folder of UW imapd. 1999-08-04 Yuuichi Teranishi * Fix: message body is not displayed in wl-queue-folder. (Pointed out by ) * 2.1.3 - "Sukiyaki" 1999-08-03 Kenichi OKADA * Change: Deleted extra Tab/Spaces from ChangeLogs. * Fix: typo in wl-vars.el. * Add: [wl-ja.texi] wl-folder-{prefetch|mark-as-read-all}-current-entity. 1999-08-03 Yuuichi Teranishi * Fix: even when queued messages caused error, they are deleted. (Pointed out by Mikio Nakajima ) * mmelmo-imap4.el: mime-goto-header-start-point, mime-goto-header-end-point, mime-entity-header-buffer, mime-entity-body-buffer is implemented. (Pointed out by Taiji.Can@atesoft.advantest.co.jp) * smtp.el: Trial new option: smtp-notify-success. * wl-mime.el: merging pertial mesages sometimes failed. (Pointed out by Shuichi Nishioka ) * Fix: Multipart message could not be re-edited. * Fix: temp mark processing is unwind-protected. (Pointed out by Mito , Masahiro MURATA , Taiji.Can@atesoft.advantest.co.jp) 1999-08-02 Mikio Nakajima * Fix: cannot toggle to online when POP3 connection is disappeared. * Fix: [wl-ja.texi] wl-toggle-plugged -> wl-draft-toggle-plugged. 1999-08-01 Mikio Nakajima * Fix: If XEmacs is build with configure --with-database=berkdb, elmo-database.el is not loaded although elmo-use-database is set as non-nil. 1999-07-30 Mito * Fix: Error causes when Summary's (window-height) is small. 1999-07-29 Masahiro MURATA * Change: copy from (localdir, maildir, localnews, archive) to (localdir, localnews, archive). * Fix: wl-summary-pick If multiple messages have same Message-ID, temp mark is put on only first message. * Change: correspond to `Followup-To: poster'. * New command: wl-summary-supersedes-message * wl-util.el (wl-string): Use set-text-properties instead of format. 1999-07-28 "A. SAGATA" * Fix: cannot reply to mails which are sent by user. 1999-07-27 Masahiro MURATA * New function: elmo-multiple-field-body and elmo-multiple-fields-body-list. 1999-07-26 Masahiro MURATA * Fix: elmo-localnews-copy-msgs is called although it is not defined. 1999-07-24 HAYAKAWA akio * Fix: error causes when wl-(un)plugged-hook is set. 1999-07-23 Kenichi OKADA * Fix: wl-mail-setup-hook is not called when draft is created by "W". 1999-07-22 Yuuichi Teranishi * Fix: wl-summary-cancel-message is not corresponded to Sticky Summary. 1999-07-16 Teruki SHIGITANI * Fix: [sample.dot.wl] To field is not decoded. 1999-07-15 Masahiro Murata * Fix: void-function wl-summary-rescore-msgs. 1999-07-15 Yuuichi Teranishi * Fix: elmo-imap4 also causes moji-bake in Emacs20 because of wrong multibyte settings. * 2.1.2 - "Rico Suave" 1999-07-14 Yuuichi Teranishi * Change: Skip checking when "I" in Summary is invoked with prefix-arg. * Fix: In elmo-nntp, multibyte setting for Emacs 20 was invalid. * Fix: messages with 'u' mark couldn't be set as unread. * Fix: 'M-x wl-draft' causes error in XEmacs. (pointed out by Taiji.Can@atesoft.advantest.co.jp) * Fix: wl-summary-highlight is ignored in wl-summary-update3. * Change: Display prefetched message number after "I". * Fix: Summary buffer is set as modified after prefetching. * Fix: messages marked with "U" cannot be prefetched by "I" in Folder. (susumu-w@ops.dti.ne.jp) 1999-07-14 Masahiro MURATA * Change: [wl-score] (wl-score-simplify-subject) use wl-score-simplify-fuzzy-regexp instead of wl-summary-subject-func. * Fix: multiple same cache is created in buffer-cache. 1999-07-13 Masahiro MURATA * delete-if -> elmo-delete-if. 1999-07-13 Yuuichi Teranishi * Fix: skipped prefetching messages are not taken into account in 'I'. (reported by susumu-w@ops.dti.ne.jp) * 2.1.1 - "Praying For Time" 1999-07-12 Yuuichi Teranishi * wl-draft-insert-signature -> eliminated. * wl-summary-prefetch-all-new -> eliminated. * Fix: when password prompt is interrupted by C-g, wrong-type-argument databasep nil sometimes occurs. (pointed out by "MATSUBAYASHI 'Shaolin' Kohji" ) * New variable: wl-summary-incorporate-marks. messages with specified marks are prefetched by 'I' in Summary. * Fix: delete '(elmo-set-buffer-multibyte nil)' from elmo-nntp.el and mmelmo.el (adviced by Shigeru OKUMURA ) * Fix: define dummy make-face function in wl-mule.el if not bounded. (adviced by HAYAKAWA akio , OKUNISHI -GTO- Fujikazu ) * Fix: pop3 folder caused in unplugged status. (pointed out by HAYAKAWA akio .) 1999-07-12 Masahiro MURATA * Fix: fetcing failed if elmo-msgdb-extra-fields is nil. 1999-07-11 Masahiro MURATA * save elmo-crosspost-message-alist. * Change: use elmo-object-load and elmo-object-save if possible. * Change: [Scoring] references or thread entries are not added automatically in wl-summary-rescan or sync-all. * extra field can be fetched in imap4 folders. 1999-07-10 Kenichi OKADA * Change: 'W' in localnews also completes Newsgrops field. 1999-07-08 OKUNISHI -GTO- Fujikazu * Fix: internal("'mark") was not work on Nemacs. 1999-07-07 Yuuichi Teranishi * Fix: custom group of wl-summary-mark-below is 'wl-score. (Pointed out by Masahiro MURATA ) * Change: In wl-summary-incorporate, use (wl-summary-prefetch-region (point-min) (point-max)) instead of wl-summary-prefetch-all-new. (Adviced by Masahiro MURATA ) * Fix: C-u . does not work in Summary. (pointed out by Hideo Matsumoto ) 1999-07-06 sen_ml@eccosys.com * rfc2368.el - version 0.3. 1999-07-06 Hideo Matsumoto * New variable: wl-draft-use-frame. If non-nil, a new frame is created for draft. 1999-07-06 Masahiro MURATA * Fix: quoted lambda in mapcar of wl-day-number. * Change: [wl-score.el] Simplify subject string matching in wl-summary-{increase|lower}-score. Changed to buffer local variable: wl-current-score-file and wl-score-alist. * Change: [wl-summary.el] timing of setting wl-summary-scored to nil. * Rename: wl-score-simplify-subject-fuzzy-regexp -> wl-score-simplify-fuzzy-regexp wl-score-simplify-buffer-fuzzy-step -> elmo-buffer-replace. * Change: [wl-ja.texi] score description is changed. * Fix: [wl-draft.el] added autoload setting. * Fix: [sample.dot.wl] deleted wl-summary-next-no-unread. added score setting. 1999-07-06 Yuuichi Teranishi * Fix: load timing for wl-nemacs.el etc. is changed. * Fix: defined rassoc for Nemacs. * Fix: Nemacs causes error when 'm' is typed in Folder mode. * Fix: default value for wl-use-scoring is set to nil in Nemacs. * New function: elmo-delete-if. replacement of delete-if. * Fix: Nemacs bytecompiler causes error (defvar nil nil). (pointed out by Taiji.Can@atesoft.advantest.co.jp) * 2.1.0 - "Ordinary World" 1999-07-05 Yuuichi Teranishi * Fix: partial messages couldn't be merged. (pointed out by Taiji.Can@atesoft.advantest.co.jp) * Change: wl-summary-rescore also uses wl-summary-rescore-partial-threshold. * Change: display processing message in wl-summary-score-update-all-lines. 1999-07-04 Masahiro MURATA * Add: New key wl-score.el: date, extra, followup, thread. * Change: File specified by `wl-score-default-file-name' is always loaded. * New Feature: Score editing in Summary, Score. * Change: [wl-vars.el] defcustoms are re-arranged. * Add: [wl-highlight.el] defface group. 1999-07-01 Yuuichi Teranishi * New Feature: New sync range: rescan-noscore. * Change: score takes effect on read messages in rescan/sync-all. * New variable: wl-summary-rescore-partial-threshold. for scoring in rescan, sync-all. * wl-edit-again-func->wl-edit-decode-message-func (adviced by tomo@etl.go.jp (MORIOKA Tomohiko).) * Change: eliminated japanese comment of elmo-util.el. * Change: Implementation of wl-refile-alist-setup is changed. 1999-06-29 TSUMURA Tomoaki * Change: Don't check wl-refile-(msgid-)alist is loaded or not every wl-refile-(msgid-)learn or wl-refile-guess-*. * Change: Don't execute wl-refile-alist-save every wl-refile-(msgid-)learn. * Change: return value of wl-refile-(msgid-)learn. 1999-06-29 Shuhei KOBAYASHI * Change: Enclosed require 'cl by eval-when-compile. 1999-06-29 OKUNISHI -GTO- Fujikazu * Fix: Nemacs couldn't exit folder by [Space] if unread was 0. * Fix: cl.el' member () overrides poe-18.el' member (). 1999-06-29 Yuuichi Teranishi * Change: corresponded to AIR MAIL(AIRCimapd release 2.00). (Based on the report from Sasaki Toshiya ) 1999-06-29 Yuuichi Teranishi * Change: changed the meaning of expunge to 'mark as read and eliminate from summary buffer'. * report expunged messages. 1999-06-28 Shuhei KOBAYASHI * Change: Eliminated to use md5-encode in elmo-pop3.el. 1999-06-28 OKUNISHI -GTO- Fujikazu * MK-MK: quoted (mapcar (lambda ..)) for Emacsen based on v18. * Fix: Nemacs installes wl-mule.elc. redefined defgroup(), defcustom(). * Fix: wl-summary.el, wl-demo.el: Avoided error for non-float Emacsen. * Fix: wl-nemacs.el: dummy completing-read() is added. read-char-exclusive() causes error. 1999-06-28 Masahiro MURATA * Fix: wl-summary-pick doesn't work correctly if default-case-fold-search is nil. * Fix: Although wl-auto-select-next is non-nil, doesn't change folder if there are more than two important marks. 1999-06-28 Yuuichi Teranishi * New function: wl-summary-delete-all-delete-marks. * Fix: (wl-summary-cleanup-temp-marks) was called twice. (pointed out by A.SAGATA ). 1999-06-27 Masahiro MURATA * Change: no scoring when changing folder by wl-summary-goto-folder-subr. * Change: Abolished wl-summary-next-no-unread. * Change: default value of wl-summary-move-order: 'new -> 'unread. 1999-06-27 OKUNISHI -GTO- Fujikazu * Fix: Nemacs causes (wrong-type-argument listp 1). * Fix: Nemacs causes error because of absense of timer function. 1999-06-27 Masahiro MURATA * Change: set coding system for score file as ctext (*ctext). 1999-06-26 Kenichi OKADA * Add: Handle "nntp:" and "news:" URL like "mailto:". (-> wl-utils.el) 1999-06-25 Masahiro MURATA * Fix: [wl-score.el] coding-system processing was wrong. 1999-06-25 Masahiro MURATA * New file: [wl-score.el] Scoring feature! * Change: [wl-summary.el] (wl-summary-sync-update3) Changed the timing of wl-folder-set-folder-updated. * Change: (wl-summary-update-crosspost) mark as read without opening thread. * New function: [wl-util.el] `wl-delete-alist'. * New macro: [wl-util.el] `wl-as-coding-system' and emulate function `pp'. 1999-06-24 pf21 GOTO_Toshiya * Add: [wl-ja.texi] added explanation of wl-thread-open-reading-thread. 1999-06-24 Kenichi OKADA * Fix: elmo-cache-expire causes error. 1999-06-24 sen_ml@eccosys.com * Fix: utils/rfc2368.el. 1999-06-24 Yuuichi Teranishi * 2.0.1 - "Now And Forever" * Fix(incompletely): wl-draft-reedit deletes lines before "--text follows this line--" in message body. (pointed out by Kenichi OKADA ) 1999-06-24 MAKINO Takashi * New function: wl-refile-guess-by-msgid. 1999-06-23 Akihiro Motoki * Fix: When (setq wl-stay-folder-window t) and started with 'wl-draft' command, wl-draft-send-and-exit and wl-draft-kill failes. 1999-06-23 Kenichi OKADA * Fix: [wl-ja.texi] wl-template-alist : file -> body-file 1999-06-23 Yuuichi Teranishi * Change: C-c C-y with prefix in Draft cites from cut buffer. * Change: elmo-imap4-int-string-to-list: abolished. (advised by Masahiro MURATA ) * Change: binded wl-summary-save to 'e' in Summary. * Change: removed unused let binding in wl-set-string-width. * Fix: Unplugged MH refile calls elmo-copy-msgs and elmo-append-msg. (pointed out by Koji IIDA ) 1999-06-22 Yuuichi Teranishi * Fix: wl-draft-prepared-config-exec was binded to C-c C-d and C-c C-e. * Change: set wl-completion-buf-name as standard "*Completions*". * Fix: wl-message-buffer-created-hook was not called correctly. (pointed out by Akihiro Motoki ) 1999-06-22 Masahiro MURATA * Fix: [elmo-nntp.el] XOVER size value was wrong. * Change: (elmo-nntp-string-to-vector): Renamed from `elmo-nntp-string-to-list'. * Change: [elmo-localdir.el] get file size by file-attributes. 1999-06-21 OKUNISHI -GTO- Fujikazu * Change: [elmo-pop3] elmo-pop3-max-of-folder: new implementation. 1999-06-21 OKUNISHI -GTO- Fujikazu * Change: display syntax errors in .wl. * tiny additional patch. 1999-06-19 Masahiro MURATA * ignore defface definition when (featurep 'tinycustom). 1999-06-18 Shigeru OKUMURA * Fix: nntp still causes moji-bake. 1999-06-18 Masahiro MURATA * Fix: '@' expands alias address correctly. 1999-06-16 Yuuichi Teranishi * New variable: wl-use-dnd. 1999-06-16 Masahiro MURATA * Change: [elmo-nntp] elmo-list-folder uses "LISTGROUP" command. * Change: [elmo-nntp] keep xover settings for each server. 1999-06-16 Shigeru OKUMURA * Fix: sjis or euc message causes moji-bake. 1999-06-16 Yuuichi Teranishi * Change: [elmo-imap4] corresponds cram-md5. 1999-06-15 Yuuichi Teranishi * Fix: [tm-wl.el] error: Split sender is not specified for `wl-draft-mode'. (pointed out by Toshihiko Kodama ) 1999-06-14 Yuuichi Teranishi * Fix: [wl-ja.texi] explanation for `wl-draft-enable-queuing' was duplicated. (pointed out by Toshihiko Kodama ) 1999-06-14 OKUNISHI -GTO- Fujikazu * Change: wl-detect-info-directory() detects directory more cleverly. 1999-06-13 Masahiro MURATA * buffer cache. * New variable: elmo-use-buffer-cache * buffer cache prefetching is implemented. * New variable: wl-cache-prefetch-folder-type-list. * New variable: elmo-buffer-cache-size. * New variable: wl-cache-prefetch-folder-list. * New variable: wl-summary-no-mime-folder-list. 1999-06-13 OKUNISHI -GTO- Fujikazu * WL-MK: Fix: wl-texinfo-format() requires 'wl-vars. Change: `WL_TEXINFO_NOTAGIFY' was abolished. Change: Don't keep back `wl-ja.info' in the source-tree when installing. 1999-06-13 Sen Nagata * New file: utils/wl-use-agent.el, utils/rfc2368.el 1999-06-11 Yuuichi Teranishi * Fix: argunemt for elmo-imap4-get-connection was invalid. (pointed out by ) * 2.0.0 - "Mmmbop" * Change: if wl-summary-partial-highlight-above-lines is nil, use wl-summary-highlight-partial-threshold to highlight summary lines. * Change: Updated util/wl-user-agent.el provided by Sen Nagata (pointed out by OKUNISHI -GTO- Fujikazu ). 1999-06-10 Kenichi OKADA * Fix: error occurs when accessing to imap4 or nntp access group if port number is not default value. 1999-06-10 Yuuichi Teranishi * Rename: ChangeLog.en -> ChangeLog ChangeLog -> ChangeLog.ja * Add: [wl-ja.texi] added explanation of variable `wl-plugged'. (adviced by Daisuke Ikeda ) 1999-06-09 Yuuichi Teranishi * New variable: elmo-default-pop3-ssl, elmo-default-nntp-ssl, elmo-default-imap4-ssl. * Rename: elmo-nntp-port -> elmo-default-nntp-port elmo-imap4-port -> elmo-default-imap4-port. (Adviced by Kenichi OKADA ) * Change: [elmo] use SSL if "!" is specified in the tail of folder name of imap4, nntp, pop3. * Fix: [elmo] connection cache for imap4, nntp, pop3 are conflicted. 1999-06-09 OKUNISHI -GTO- Fujikazu * New variable: elmo-default-pop3-server. * Fix: [mmelmo-imap4.el]. * Fix: [wl-ja.texi]. 1999-06-08 Kenichi OKADA * Change: port nunber can be specified in IMAP4 folder name. 1999-06-07 Akihiro Motoki * Fix: preserve message order in trash folder. * Change: wl-summary-pick can use field names in elmo-msgdb-extra-fields. 1999-06-07 Yuuichi Teranishi * Change: wl-summary-jump-to-parent-message() precedes In-Reply-To. (pointed out by A.SAGATA ). * Change: if From field matches wl-from, preserve To, Cc, Newsgroups in reply. (adviced by TSUMURA Tomoaki ) 1999-06-06 Masahiro MURATA * unread message is not highlighted in wl-folder-mark-as-read-all-entity, wl-folder-sync-entity, wl-folder-prefetch-entity on sticky summary. 1999-06-05 Masahiro MURATA * Fix: wl-folder-no-auto-check-folder-p precedes wl-auto-check-folder-list. * Fix: wl-summary-switch-to-clone-buffer doesn't copy wl-summary-buffer-new-count and wl-summary-buffer-unread-count. * Fix: wl-folder-empty-trash doesn't show summary. * Fix: wl-summary-goto-folder-subr causes error in recenter. * Fix: suppress warnings while byte-compiling bbdb-wl.el with bbdb2. * New variable: wl-folder-suspend-hook. 1999-06-06 OKUNISHI -GTO- Fujikazu * Fix: "V" requires sync update. also, "C-u V" requires sync update. 1999-06-04 OKUNISHI -GTO- Fujikazu * Fix: [wl-draft.el (wl-draft-reedit)] bind change-major-mode-hook to nil to avoid font-lock. * Fix: [wl-message.el (wl-message-refer-article-or-url)] move cursor in the summary buffer. 1999-06-03 Masahiro MURATA * Fix: when move from sticky summary, temp-mark is deleted but highlight remains. * Fix: make wl-summary-buffer-copy-list buffer-local-variables. * Change: when entering summary, use set-buffer instead of switch-to-buffer if function is not called interactive. 1999-06-03 Yuuichi Teranishi * Fix: implemented elmo-imap4-identical-name-space-p. (pointed out by Takaaki MORIYAMA ) 1999-06-03 "A. SAGATA" * Fix: strange behavior of wl-draft-exit when sticky summar exists. * Fix: mR and mf are duplicated in menubar. * Fix: wl-summary-jump-to-current-message. 1999-06-02 Yuuichi Teranishi * Change: [WL-MK] compile and install "bbdb-wl" if BBDB exists in install-package for XEmacs. * New variable: wl-summary-keep-cursor-command command list for keep cursor. * Change: [mmelmo.el, mmelmo-imap4.el] correspond to FLIM 1.13 API. 1999-06-02 OKUNISHI -GTO- Fujikazu * Change: [WL-MK] compile and install "bbdb-wl" if BBDB exists. 1999-06-02 Kenichi OKADA * Fix: suppressed warnings while byte-compiling elmo-pop3.el * Fix: [WL-MK] second make causes error after changing elmo-*.el 1999-06-02 Masahiro MURATA * Fix: new message is not highlighted in sticky summary updating. 1999-06-01 Yuuichi Teranishi * branched from 1.0.1. 1999-06-01 Masahiro MURATA * Change: if summary buffer already exists, don't update and keep cursor position when entering summary. * New variable: wl-ask-range if non-nil, 'g' uses value of wl-folder-sync-range-alist. * Change: store history of wl-summary-read-folder in wl-read-folder-hist. * New command: wl-summary-goto-last-visited-folder 1999-06-01 Yuuichi Teranishi * 1.0.1 - "The Look" * Change: deleted wl-ja.info from package. 1999-06-01 Sen Nagata * New file: [wl-user-agent.el] support interface of compose-mail. 1999-05-31 "A. SAGATA" * Change: when draft is finished by sending or quitting, resume folder window when wl-stay-folder-window is non-nil. 1999-05-31 Yuuichi Teranishi * Change: wl-folder-sync-range-alist takes effect when entered to folder from folder mode. (pointed out by Toshihiro KAMISHIMA ). * Fix: multi-reply/forward causes error when wl-draft-reply-buffer-style is 'full. (pointed out by A.SAGATA ). * Change: don't load msgdb when entered to the sticky summary. (advised by Masahiro MURATA ) * Fix: wl-summary-exit saves msgdb uselessly. 1999-05-29 OKUNISHI -GTO- Fujikazu * Fix: [wl-mime.el, tm-wl.el] regexp was not regexp-quote'ed in (tm-)wl-mime-combine-message/partial-pieces() 1999-05-28 Yuuichi Teranishi * Change: speed up elmo-localdir-search. 1999-05-26 Shuhei KOBAYASHI * Change: speed up elmo-archive-search. 1999-05-25 OKUNISHI -GTO- Fujikazu * Change: speed up elmo-move-msgs() for localdir, localnews. new variable `elmo-localdir-lockfile-list' must be specified for MDA like procmail. * Change: speed up some functions. 1999-05-24 Kenichi OKADA * Change: support SSL for POP3. * Change: in elmo-pop3-get-spec, change type of variable port from string to integer. * Fix: elmo-default-pop3-port,elmo-default-pop3-authenticate-type does not take effect. 1999-05-24 "A. SAGATA" * Fix: customize causes some mismatches. 1999-05-24 Yuuichi Teranishi * Change: wl-use-highlight-mouse-line' s default value is set to nil. 1999-05-21 OKUNISHI -GTO- Fujikazu * Rename: WL-ELS -> WL-MK 1999-05-20 Yuuichi Teranishi * Change: removed delete-other-windows () in wl-exit (). * Fix: Make wl-summary-force-exit interactive (pointed out by Ishikawa Ichiro ). 1999-05-20 Hidetoshi Shimokawa * Fix: highlight is not active on ttys when device-class is color. 1999-05-20 "A. SAGATA" * Add: [wl-ja.texi] about highlights. 1999-05-19 "A. SAGATA" * Add: wl-highlight-signature-separator. 1999-05-19 TSUMURA Tomoaki * Fix: wl-summary-jump-to-message-by-message-id does not work well when parent message is hidden in closed threads. 1999-05-19 Yuuichi Teranishi * Fix: wl-summary-msgdb-load-async. * Change: timing of set-buffer in wl-summary-goto-folder. * Fix: wl-summary-mark-as-read-all does not work well when target messages is hidden in closed threads. (pointed out by Hajime Ohsawa ). wanderlust-wanderlust-769699d/etc/ChangeLog.3.ja000066400000000000000000003772551406661363500215070ustar00rootroot000000000000002000-03-24 Yuuichi Teranishi * 1.1.0 - "Overjoyed" 2000-03-23 Yuuichi Teranishi * wl-refile.el (wl-refile-guess-func-list): 変数定義を修正。 (KOYAMA Tetsuji さんより御指摘) * 1.1.0pre6 - "Overjoyed-pre6" * wl-folder.el (wl-create-folder-entity-from-buffer): localnews の定義 があだ名定義になってしまうのを修正。 (AOXI Tenghe さん他より御指摘) 2000-03-23 OKAZAKI Tetsurou * wl-summary.el (wl-summary-mode-menu-spec): wl-draft を wl-summary-write に変更。 (wl-summary-msg-marked-as-target): wl-summary-msg-marked-as-temp から改名。 * wl-thread.el (wl-thread-close-all): 局所変数名を変更。 2000-03-22 Akihiro MOTOKI * wl-refile.el (wl-refile-guess-func-list): 新規変数。 (wl-refile-guess): wl-refile-guess-func-list を使うようにした。 2000-03-22 Yuuichi Teranishi * wl-mime.el: Byte compile の Warning を減らした。 * wl-xmas.el,wl-mule.el,wl-nemacs.el (wl-make-modeline): 定義。 XEmacs ではプラグのアイコン表示をデフォルトにした。 (Daiki Ueno さんより御助言) * wl-util.el (wl-make-modeline-subr): wl-make-modeline から改名。 * utils/bbdb-wl.el (bbdb-wl-update-record): Sticky summary 対応。 (bbdb-wl-update-record, bbdb-wl-get-update-record): raw buffer が multibyte にならないようにした。 * wl-draft.el (wl-draft-reply): 同様。 * 1.1.0pre5 - "Overjoyed-pre5" 2000-03-21 Yuuichi Teranishi * NEWS.ja: 新規ファイル。 * elmo-maildir.el (elmo-maildir-list-folders): elmo-have-link-count を nil に拘束 (Masahiro MURATA (村田全寛) さんの御助言)。 * wl-summary.el (wl-summary-edit-addresses-subr): アドレスを downcase するようにした。 2000-03-18 TAKAHASHI Kaoru * NEWS: 新規ファイル。 2000-03-17 Yuuichi Teranishi * wl-message.el (wl-message-follow-current-entity): オリジナルバッファを参照するようにした (OKAZAKI Tetsurou さんの御指摘)。 * elmo-maildir.el (elmo-maildir-list-folders): Maildir になっているかどうかチェックするようにした。 ( さんの御指摘) 2000-03-15 Yuuichi Teranishi * wl-folder.el (wl-create-folder-entity-from-buffer): 空白が2個以上 ある場合に解析に失敗するのを修正。 * wl-summary.el (wl-summary-edit-addresses): オリジナルバッファから アドレス情報を得るようにした。 (wl-summary-prefetch): wl-prefetch-threshold を nil に拘束するのは やめた。 2000-03-14 Yuuichi Teranishi * 1.1.0pre4 - "Overjoyed-pre4" * エラーメッセージの最後が "." で終らないようにした。 * elmo/elmo-archive.el (elmo-archive-copy-msgs): same-number のときに maildir ならファイル名そのままだと思わないようにした。 * wl-expire.el (wl-expire-archive-get-folder): elmo-safe-filename の 代わりに elmo-replace-msgid-as-filename を使うようにした. * wl-folder.el (wl-folder-goto-folder-subr): デフォルトを wl-default-folder とした. (okada@opaopa.org (岡田 健一 / Kenichi OKADA) さんの御助言) * wl-folder.el (wl-create-folder-entity-from-buffer): フォルダ名に空白が含まれていてもよいようにした。 * wl-summary.el (wl-summary-jump-to-msg-by-message-id): カレントフォルダでターゲットが見付かった場合は wl-thread-jump-to-msg を使うようにした. 2000-03-13 Yuuichi Teranishi * wl-vars.el (wl-summary-skip-mark-list): 新規変数。 * wl-summary.el (wl-summary-prefetch): interactive の場合だけ wl-prefetch-threshold を nil とするようにした。 (Akihiro MOTOKI さんの御指摘) (wl-summary-exec-subr): マーク総数の数え方が間違っていたのを修正 (OKAZAKI Tetsurou さんの御指摘)。 (wl-summary-next, wl-summary-prev): wl-summary-skip-mark-list を使う ようにした。 (wl-summary-move-cached-regex): defmacro->defun。 * etc/ja.Emacs: 更新。 * elmo-imap4.el (elmo-imap4-search): from-msgs を考慮するようにした。 * elmo-maildir.el (elmo-maildir-search): 修正。 * mmelmo-imap4-1.el (mmelmo-imap4-parse-bodystructure-string): literal の読み取り部分を修正。 2000-03-13 Masahiro MURATA (村田全寛) * wl-expire.el: Filter folder で expire 出来ない場合があるのを修正した。 * wl-fldmgr.el: 改行を含むフォルダ名やあだ名などを扱えないようにした。 2000-03-12 Masahiro MURATA (村田全寛) * wl-fldmgr.el (wl-fldmgr-get-path-from-buffer): wl-desktop group が閉じているときにエラーが出る場合があるのを修正。 2000-03-11 Masahiro MURATA (村田全寛) * wl-folder.el (wl-folder-mode-menu-spec): 追加、更新。 2000-03-08 TAKAHASHI Kaoru * wl-vars.el (wl-score-files-dir): wl-score-files-directory から改名。 * wl-score.el (wl-score-edit-file, wl-score-load-file, wl-score-change-score-file): 同上。 2000-03-08 Yuuichi Teranishi * wl-vars.el (wl-mime-charset): デフォルト値を x-ctext とした。 2000-03-08 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * elmo-nntp.el (elmo-nntp-list-folders): ルートフォルダ名が "" のときの不具合を修正。 2000-03-07 Yuuichi Teranishi * 1.1.0pre3 - "Overjoyed-pre3" * elmo-imap4.el (elmo-imap4-create-msgdb-from-overview-string): ローカルの未読情報を考慮し忘れていたのを修正。 * elmo2.el (elmo-delete-folder): maildir もフォルダ削除可能とした。 (elmo-move-msgs): ローカルの未読情報が引き継がれないのを修正。 * elmo-maildir.el (elmo-maildir-delete-folder): 書き直し。 * mmelmo.el (mime-parse-parameters-from-list): mmelmo-imap4.el から 移動。 * wl-message.el (wl-mmelmo-message-redisplay): mime-display-header-hook を nil に拘束。 * wl-mime.el (wl-mime-display-message): SEMI のバージョン判定が 間違っていたのを修正。 (wl-summary-burst): mime-message-structure を参照しないようにした。 (wl-mime-entity-read-field): 新規 alias/macro。 (wl-mime-combine-message/partial-pieces): wl-mime-entity-read-field を使うようにした。 (mime-edit-user-agent-value): XEmacs beta のバージョン表示が重複する のに対処 (For SEMI 1.13.4 or earlier)。 2000-03-06 katsuta@cced.mt.nec.co.jp * elmo-util.el (elmo-buffer-field-condition-match): std11-field-body が nil を返す場合に対処。 2000-03-04 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * wl-summary.el (wl-summary-prefetch-msg): マークを参照しない ようにした。 2000-03-06 Yuuichi Teranishi * wl-summary.el (wl-summary-read-folder): "" のときはデフォルトを使う ようにした。 * wl-fldmgr.el, wl-folder.el, etc: メッセージは大文字で 始まるようにした。 * wl-draft.el (wl-draft-yank-original): kill-ring からの yank が 動かなくなっていたのを修正。 * mmelmo-1.el (insert-header): mmelmo-insert-sorted-header-from-buffer を使うようにした。 (insert-text-content): 新規メソッド。 (run-hooks 'mmelmo-entity-content-inserted-hook) するようにした。 * utils/bbdb-wl.el (bbdb-wl-show-bbdb-buffer): 新規関数。 wl-summary-toggle-disp-folder-message-resumed-hook に追加。 * 1.1.0pre2 - "Overjoyed-pre2" * elmo-maildir.el (elmo-maildir-sequence-number-internal): 新規変数。 (elmo-maildir-make-unique-string): v19 向けに定義されていなかったのを修正。また、 elmo-maildir-sequence-number-internal を使うようにした。 (elmo-maildir-temporal-filename): 2 秒待たないようにした。 (toplevel): (eval-when-compile (require 'cl) を追加。 * wl-summary.el (wl-summary-buffer-number-column-detect): re-search-forward の返り値を使わないようにした。 2000-03-06 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * elmo-pop3.el (elmo-pop3-port-label): typo 修正 (port->ssl)。 * elmo-nntp.el (elmo-nntp-sync-number-alist): folder-modeで未読数がマイナスになったままになる場合があるのを修正。 2000-03-06 Yuuichi Teranishi * wl-summary.el (wl-summary-switch-to-clone-buffer): wl-summary-buffer-number-column, wl-summary-buffer-number-regexp を引き継ぐようにした。 (wl-summary-write): 新規コマンド。'w' にバインド。 * wl-draft.el (wl-draft): wl-summary-write 向けの動作を追加。 2000-03-05 Yuuichi Teranishi * elmo-cache.el (elmo-cache-list-folder-subr): ディレクトリを無視。 * wl-summary.el (wl-summary-insert-line): 新規関数。 (wl-summary-insert-summary, wl-summary-update-thread): `wl-summary-insert-line' を使うようにした。 * wl-thread.el (wl-thread-update-line-on-buffer-sub): 同上。 * WL-MK (wl-info-lang): list なら含まれる lang を全部インストールする ようにした。 * elmo/elmo-maildir.el (elmo-maildir-append-msg): new で tmp のファイル名をそのまま使うようにした。 (elmo-maildir-list-folders): ルートを含むようにした。 2000-03-04 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * wl-summary.el (wl-summary-buffer-set-folder): コラム数の設定を削除。 (wl-summary-goto-folder-subr): コラム数を動的に検出するようにした。 (wl-summary-target-mark-forward): フォワード順序を修正。 (wl-summary-cleanup-temp-marks): まとめ処理マークを削除するようにした。 2000-02-29 nisikawa@nisikawa.org (西川 亮太) * wl-draft.el (wl-draft-send-mail-with-pop-before-smtp): オフラインでメールを +queue にためる際にエラーが出るのに対処。 2000-03-04 Yuuichi Teranishi * wl-thread.el (wl-thread-update-children-number): wl-thread-update-children-number から改名。 新規 hook、wl-thread-update-children-number-hook を呼ぶようにした。 2000-03-04 Masahiro MURATA (村田全寛) wl-folder.el (wl-folder-sync-entity, wl-folder-mark-as-read-all-entity, wl-folder-prefetch-entity): Sticky 向けのハイライト設定の修正。 2000-03-03 Yuuichi Teranishi * elmo2.el (elmo-move-msgs): target が 'null のときは未読の保存を スキップするようにした。 * elmo-maildir.el (elmo-maildir-make-unique-string): elmo-maildir-create-unique-string から変更。 (OKAZAKI Tetsurou さんの御助言) * 1.1.0 pre1 - "Overjoyed-pre1" 2000-03-02 Yuuichi Teranishi * wl-draft.el (wl-draft-reply-buffer): 新規バッファローカル変数 (wl-draft-reply): `wl-draft-reply-buffer' を設定するようにした。 (wl-draft-config-exec): `wl-draft-reply-buffer' を参照するようにした。 (wl-draft-reply): 廃止。 * WL-MK, WL-CFG (wl-info-lang): 新規変数。 * wl.texi: 新規ファイル。 * Makefile, WL-MK, WL-CFG: ELISPDIR->LISPDIR。 (TAKAHASHI Kaoru さんより御提案) * elmo-maildir.el: 大幅に書き直し。 * elmo-util.el, elmo-msgdb.el, elmo-vars.el: maildir の記号を '.' とした。 * wl-folder.el, wl-summary.el, elmo-pop3.el, etc: メッセージが大文字で 始まるようにした。 * elmo-vars.el (elmo-maildir-folder-path): 新規変数。 * elmo-internal.el (elmo-internal-list-folders): 'cache と 'mark を 返却するようにした。 2000-03-02 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * elmo-nntp.el: starttls 部分の修正。 * elmo-nntp.el, elmo-imap4.el: list-folders で "!" マークが消えてしまうのを修正。 2000-03-01 TAKAHASHI Kaoru * wl-score.el: エラーメッセージの "Illegal" を "Invalid" に変えた。 2000-03-01 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * wl-summary.el (wl-summary-refile-subr): キャッシュフォルダへの リファイルで名前を適切なものに修正。 * elmo-nntp.el: starttls に対応(実験的)。 2000-03-01 Yuuichi Teranishi * elmo-cache2.el: elmo-cache.el にマージ。 * elmo-internal.el, elmo-util.el, elmo-msgdb.el: cache バックエンドを internal の一部として扱うようにした。 2000-03-01 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * elmo-cache2.el: 新規バックエンド 'cache' 追加。 2000-02-29 IMAI Takeshi * wl-expire.el (wl-folder-expire-entity): Sticky 向けの ハイライト設定の修正。 2000-02-28 Yuuichi Teranishi * elmo2.el (elmo-move-msgs): 未読情報を引き継ぐようにした。 引数 unread-marks 追加。 (elmo-msgdb-sync): 削除。 * wl-summary.el (wl-summary-exec): elmo-move-msgs に未読マークを渡すようにした。 (wl-summary-edit-petname): To や Cc も編集対象と なるようにした。 (wl-summary-edit-addresses): wl-summary-edit-petname から変名。 (wl-summary-edit-petname): 削除。 (wl-summary-mark-as-unread): キャッシュを有効かどうかを考慮。 * wl-vars.el (wl-summary-toggle-disp-folder-message-resumed-hook) (wl-summary-line-inserted-hook): 新規 hook。 (wl-summary-print-destination): 非可視領域に 'wl-summary-destination プロパティを追加するようにした。 * wl-thread.el, wl-summary.el: サマリ行が insert された後、 wl-summary-line-inserted-hook を呼ぶようにした。 * utils/bbdb-wl.el: wl-summary-toggle-disp-folder-message-resumed-hook でポップアップする ようにした。 2000-02-28 Masahiro MURATA (村田全寛) * wl-folder-sync-current-entity でも Scoring するようにした。 * stickyフォルダで wl-summary-buffer-disp-msg とバッファの表示が あっていないことがあるのを修正した。 2000-02-25 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * wl-message.el (wl-message-refer-article-or-url): wl-summary-jump-to-msg-by-message-idを呼ぶ際、記事を発見できなかった 場合は、wl-summary-redisplay しないようにした。 * wl-vars.el (wl-local-domain): 初期設定変更。 * wl.el (wl-check-environment): wl-local-domain を hostname を 除いた部分とみなすよう変更。 * wl-util.el (wl-draft-make-message-id-string): 同上。 2000-02-25 Yuuichi Teranishi * wl-expire.el (wl-folder-expire-entity): wl-summary-save-status を 呼ぶようにした。 2000-02-24 Yuuichi Teranishi * wl-vars.el (wl-draft-send-hook): 新規 hook。 * wl-draft.el (wl-draft-send): wl-draft-send-hook を呼ぶようにした。 (Kenichi Sato さんの御要望) 2000-02-23 Yuuichi Teranishi * elmo-cache.el (elmo-cache-save): ファイル名が長すぎてセーブに 失敗する場合に備えて (condition-case) で括るようにした。 (Mikya Tani さんの御報告) * wl-draft.el: FCC に IMAP の日本語フォルダが扱えなかったのを修正。 (HIRATA Naoto さんの御指摘) 2000-02-21 Yuuichi Teranishi * wl-address.el (wl-address-header-extract-address): '\n' をアドレス 文字列とみなしてしまう場合があるのを修正。 (Tomotaka SUWA (諏訪 友崇) さんの御指摘) * mmelmo.el (mmelmo-header-max-column): 新規変数。 (Kenichi Sato さんより御要望) (mmelmo-header-inserted-hook): 新規 hook. (mmelmo-entity-content-inserted-hook): 新規 hook. * mmelmo-2.el (mime-insert-text-content): 新規 entity メソッド。 mmelmo-entity-content-inserted-hook を呼ぶようにした。 * mmelmo.el (mmelmo-insert-sorted-header-from-buffer): elmo-util.el から移動、`mmelmo-header-max-column' を使うようにした。 また、mmelmo-header-inserted-hook を呼ぶようにした。 2000-02-18 Yuuichi Teranishi * wl-message.el (wl-mmelmo-message-redisplay): wl-mime-display-message を使うようにした。 (Toshihiko Kodama (小玉 利彦) さんの御指摘) * wl-mime.el (wl-mime-display-message): 新規 macro/alias. * 2.2.18 - "Please Forgive Me" * wl-summary.el (wl-summary-move-cached-regex): unplugged でも 'D' マークをスキップするようにした。 * elmo-msgdb.el (elmo-msgdb-expand-path): IMAP4 の INBOX を downcase するようにした(Takeshi Chiba さんの御指摘)。 * wl-folder.el (wl-create-folder-entity-from-buffer): アクセスフォルダ定義に '}' を含んでもよいようにした。 * wl-message.el (wl-mmelmo-message-redisplay): mime-display-message にメジャーモードを渡すようにした。 2000-02-18 Daiki Ueno * wl-demo.el: Emacs 21 対応の修正。 2000-02-17 Yuuichi Teranishi * mmelmo-imap4-2.el (mime-entity-buffer): カレントバッファが 変化しないようにした。 また、まだフェッチされていない場合、フェッチするようにした。 * mmelmo-imap4-2.el (mime-write-entity-content): 新規メソッド。セーブ時にスキップしたパートをフェッチする。 * mmelmo-imap4-2.el (mmelmo-imap4-fetched): 新規バッファローカル変数。 * elmo-imap4.el (elmo-imap4-server-namespace): 新規バッファローカル変数。 (elmo-imap4-open-connection): elmo-imap4-server-namespace を設定するようにした。 (elmo-imap4-parse-namespace): 新規関数。 (elmo-imap4-process-folder-list): elmo-imap4-server-namespace を使うようにした。 (elmo-imap4-extra-namespace-alist): 新規変数。 * wl-util.el (wl-string-member, wl-string-match-member, wl-string-delete-match, wl-string-match-assoc, wl-string-rassoc): elmo-* に改名、defalias とした。 2000-02-17 Yuuichi Teranishi * bbdb-wl.el: wl-summary-toggle-disp-folder-off-hook の設定を追加。 2000-02-16 Daiki Ueno * wl-demo.el: frame の font parameter で が 与えられている場合に、font-info から中央の座標を計算するようにした。 2000-02-14 Yuuichi Teranishi * wl-summary.el (wl-summary-toggle-disp-folder): ウィンドウサイズが 小さくなる場合があるのを修正。 (Shigeru OKUMURA さんの御指摘) * wl-draft.el (wl-draft-insert-x-face-field-here): 最初の空白を削除。 (Akihiro MOTOKI さんの御指摘) 2000-02-12 Akihiro MOTOKI * elmo/elmo-localdir.el (elmo-localdir-msgdb-create-overview-entity-from-file): `timezone-make-date-arpa-standard' に `current-time-zone' の値を 渡すようにした。 2000-02-10 Yuuichi Teranishi * elmo/mmelmo-imap4-2.el (mmelmo-imap4-node-id-to-string): "header" -> "0"。 * elmo/mmelmo-imap4-1.el (mmelmo-imap4-node-id-to-string): 同上。 (TSUMURA Tomoaki さんの御指摘) * wl-message.el (wl-message-follow-current-entity): wl-draft-reply の引数にサマリバッファを渡すようにした。 * wl-summary.el (wl-summary-reply): wl-draft-reply の引数に current-buffer を渡すようにした。 (wl-summary-msgdb-load-async): mailbox を "" で括るようにした。 * elmo-imap4.el: 同上。 2000-02-09 UENO Kazuaki * wl-draft.el (wl-draft-queue-flush): elmo-dop-flush-confirm を使うようにした。 2000-02-09 Yuuichi Teranishi * wl-draft.el (wl-draft): 初期化の順序変更。 (Taiji.Can@atesoft.advantest.co.jp さんの御報告に基づく) 2000-02-08 Masahiro MURATA (村田全寛) * wl-score.el (wl-summary-score-update-all-lines): 既読にしたメッセージに read-uncached mark を付ける時にフォルダ種別を 考慮するようにした。 2000-02-08 Yuuichi Teranishi * wl-summary.el (wl-summary-target-mark-prefetch): 既読未キャッシュマークが消えないのを修正。 (Hironori Fukuchi さんの御指摘) * wl-summary.el (wl-summary-target-mark-prefetch): プリフェッチの進捗を表示するようにした。また、 キャッシュしなかった場合は '*' マークを残すようにした。 * wl-dnd.el (start-drag): static-cond で定義しなおした。 * elmo2.el (elmo-buffer-cache-message): 読み出し中に quit すると違うメッセージを表示してしまうのを修正。 * elmo-filter.el (elmo-filter-list-folder-important): elmo-search の回数を減らした (Akihiro MOTOKI さんの御助言)。 2000-02-07 Daiki Ueno * wl-xmas.el (wl-highlight-folder-current-line): set-extent-properties を使わないようにした。 * wl-draft.el (wl-smtp-extension-bind): Fixed. 2000-02-07 Akihiro MOTOKI * elmo-util.el (elmo-buffer-field-condition-match): ヘッダの値を eword-decode-string でデコードしてから比較するようにした。 2000-02-07 Yuuichi Teranishi * wl-dnd.el: バイトコンパイル時の Warning を減らした。 (okada@opaopa.org (岡田 健一 / Kenichi OKADA) さんの御指摘) * utils/sasl/sha1.el, utils/sasl/md5-el.el, utils/sasl/hex-util.el, utils/sasl/sha1-el.el: 最新版に update。 (okada@opaopa.org (岡田 健一 / Kenichi OKADA) さんの御指摘) * wl-vars.el (wl-demo-use-bitmap): wl-demo-display-logo に変更。 (wl-demo-display-logo): 新規変数。 * wl-demo.el: wl-demo-display-logo を使うようにした。 2000-02-07 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * wl-vars.el (wl-demo-use-bitmap): 初期値設定方法を変えた。 2000-02-07 Yuuichi Teranishi * 2.2.17 - "One Of Us" * elmo-util.el (elmo-y-or-n-p): 新規関数。 * elmo-vars.el (elmo-dop-flush-confirm): 新規変数。 * elmo-dop.el (elmo-dop-queue-flush): elmo-y-or-n-p, elmo-dop-flush-confirm を使うようにした。 * elmo-imap4.el (elmo-delete-msgids): 進捗を表示するようにした。 また、expunge は最後に1回だけ実行するようにした。 2000-02-07 Daiki Ueno * wl-folder.el, wl-xmas.el: -nw で起動された XEmacs で frame を 開いた場合でもアイコンが表示されるようにした。 2000-02-06 Yuuichi Teranishi * wl-highlight.el (wl-highlight-summary-target-face): 新規 face。 (temp-face から改名) * wl-vars.el (wl-demo-use-bitmap): wl-demo.el から移動。 defcustom にした。また、初期値を (module-installed-p 'bitmap) とした。 * wl-demo.el (wl-demo-use-bitmap): wl-vars.el に移動。 * WL-CFG: wl-demo-use-bitmap を削除。 * elmo-vars.el: Require 'poe, バイトコンパイル時の warning を減らす。 * wl-nemacs.el (buffer-disable-undo, rassoc, delete, string-to-number, window-live-p, completing-read, accept-process-output, get-buffer-window): 削除。 2000-02-04 TAKAHASHI Kaoru * wl-demo.el (wl-demo): wl-demo-use-bitmap を実行時にチェックする ようにした。 2000-02-04 Yuuichi Teranishi * INSTALL, INSTALL.ja: tm-8 の URL を更新。 * utils/hmac -> utils/sasl に改名。 * WL-ELS: HMAC->SASL。 * WL-MK: HMAC->SASL。 2000-02-04 Yuuichi Teranishi * elmo-localdir.el (elmo-localdir-msgdb-create-overview-entity-from-file): format-time-string を使うのを止め、timezone-make-date-arpa-standard を使うようにした。 * elmo-vars.el (elmo-time-format): 削除。 2000-02-03 Yuuichi Teranishi * elmo-dop.el (elmo-dop-queue-flush): append-operations のキャンセル 処理を追加。 * wl-summary.el (wl-summary-refile-prev-destination, wl-summary-copy-prev-destination): Fixed. (IMAI Takeshi さんの御報告) 2000-02-02 Akihiro MOTOKI * wl-vars.el (wl-prefetch-confirm-threshold): 廃止し、 wl-prefetch-confirm と wl-prefetch-threshold に分離。 (wl-prefetch-confirm, wl-prefetch-threshold): 新規変数。 * wl-summary.el (wl-summary-prefetch-msg): wl-prefetch-confirm, wl-prefetch-threshold に従うようにした。 2000-02-02 Daiki Ueno * wl-draft.el (wl-smtp-features): smtp-authenticate-type が symbol になったのに対応。 2000-01-31 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * elmo-nntp.el (elmo-nntp-get-folders-info): Fixed. 2000-01-31 Daiki Ueno * wl-demo.el: Emacs21 で wl-logo.xpm を表示するようにした。 2000-01-30 TAKAHASHI Kaoru * INSTALL, INSTALL.ja: Fixed. 2000-01-30 OKUNISHI -GTO- Fujikazu * WL-ELS: 既に open-database が定義済みの場合も ELMO-MODULES に elmo-database を追加するようにした。 2000-01-30 Akihiro MOTOKI * elmo-loacaldir.el (elmo-localdir-msgdb-create-overview-entity-from-file): Date: フィールドがない場合は、ファイルの最終更新日を日付として表示する ようにした。 * elmo-msgdb.el (elmo-msgdb-create-overview-from-buffer): 引数 time を追加。 * elmo-vars.el (elmo-time-format): 新規変数。 2000-01-29 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * wl-summary.el (wl-summary-jump-to-msg-by-message-id): NNTP サーバを指定できるようにした。 (wl-summary-jump-to-msg-by-message-id-via-nntp) サーバ指定時に、単なるサーバ名だけでなく、 "-:username@servername:8119!"のような指定もできるようにした。 * elmo-nntp.el (elmo-nntp-folder-postfix): 引数 ssl 追加。 2000-01-29 OKUNISHI -GTO- Fujikazu * elmo-vars.el (elmo-database-dl-module, elmo-database-dl-handle): 新規変数。 (toplevel): elmo-database-dl-handle が non-nil なら emacs_database_init を dynamic_call するようにした。 (elmo-use-database): open-database があれば elmo-use-database を設定。 * WL-ELS: 'dynamic-link があれば ELMO-MODULES に elmo-database を追加。 2000-01-28 TAKAHASHI Kaoru * wl-demo.el (wl-demo): Fix copyright information. 2000-01-27 Takeshi Chiba * mmelmo-imap4-2.el ([luna]mime-entity-buffer): section "0" -> "header". 2000-01-27 Yuuichi Teranishi * mmelmo-imap4-2.el (mmelmo-imap4-node-id-to-string): section "0" -> "header". * mmelmo-imap4-1.el: 同上。 2000-01-26 OKAZAKI Tetsurou * elmo-imap4.el (elmo-imap4-create-folder): UW imapd-4.7 で新しく folder が作れない問題への対処。 2000-01-26 Yuuichi Teranishi * mmelmo-imap4-2.el (mmelmo-imap4-parse-bodystructure-string): BODYSTRUCTURE の取り出し方を修正。 (mmelmo-imap4-parse-bodystructure-object): content-type の subtype が NIL の場合を考慮するようにした。 * mmelmo-imap4-1.el: 同上。 * utils/hmac/unique-id.el: 新規ファイル。 * WL-ELS (HMAC-MODULES): scram-md5, digest-md5, unique-id を追加。 * wl-dnd.el (wl-dnd-drop-func): Fixed. * 2.2.16 - "No Son Of Mine" 2000-01-25 Yuuichi Teranishi * wl-vars.el (wl-summary-reserve-mark-list): 新規変数。 * wl-summary.el: temp-mark -> target-mark 名前変更。 一時マーク系コマンドで `wl-summary-reserve-mark-list' を使うようにした。 * wl-score.el, wl-thread.el: 同上。 * wl-folder.el (toplevel): require 'wl するようにした。 * elmo-util.el (elmo-imap4-encode-string): optional 引数を追加。 2000-01-24 Yuuichi Teranishi * wl-mule.el, wl-xmas.el, wl-nemacs.el (wl-summary-format-date): 削除、wl-summary.el へ移動。 * utils/hmac/lisp/sasl.el, utils/hmac/lisp/digest-md5.el, utils/hmac/lisp/scram-md5.el: 最新版に update。 * wl-fldmgr.el (wl-fldmgr-ext): 確認メッセージを変更。 * doc/TODO.ja: 更新。 2000-01-22 OKAZAKI Tetsurou * wl-folder.el (toplevel): Fixed menu. 2000-01-21 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * elmo-imap4.el: DIGEST-MD5 に対応。 * elmo-pop3: CRAM-MD5, DIGEST-MD5, SCRAM-MD5に対応。 2000-01-21 Yuuichi Teranishi * wl-summary.el (toplevel): リージョン系キーバインドの定義位置を変更。 (wl-summary-prefetch-region): 閉じたスレッドのメッセージをプリフェッチ しないのを修正。(OKAZAKI Tetsurou さん他より御報告) * elmo: append-msg, move-msgs メソッドに引数 no-see を追加。 * elmo-pipe: move-msgs で 'no-see を指定するようにした。 * wl-folder.el (wl-folder-mimic-kill-buffer): 新規コマンド。 (toplevel): C-xk に` wl-folder-mimic-kill-buffer' を、 C-xC-s に `wl-save' をそれぞれ割り当て。 2000-01-19 Yuuichi Teranishi * wl-nemacs.el (accept-process-output): 新規関数。 * Makefile: コメント修正。 2000-01-17 Yuuichi Teranishi * elmo-util.el (elmo-folder-identical-system-p): 別サーバで 同じ名前のメールボックスが同一視されてしまうのを修正。 (Tatsuya Matsui さんの御指摘) * wl-address.el (wl-complete-field-body-or-tab): 引数をなくした。 2000-01-13 Yuuichi Teranishi * wl-vars.el (wl-prefetch-confirm-threshold, wl-cache-fetch-threshold): 新規変数。 * wl-summary.el (wl-summary-prefetch-msg): wl-prefetch-confirm-threshold を使うようにした。 (wl-cache-prefetch-message): wl-cache-fetch-threshold を使うよう にした。 2000-01-13 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * wl-message.el (wl-message-decide-backend, wl-normal-message-redisplay): wl-fetch-confirm-threshold が nil なら確認しないようにした。 2000-01-11 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * wl-draft.el (wl-draft-delete): wl-draft-buffer-file-name が nil の時を考慮するようにした。 2000-01-11 Nishimoto Masaki * wl-draft.el (wl-draft-save-and-exit): 関係ないバッファを kill してしまうことがあるのを修正。 2000-01-11 Yuuichi Teranishi * 2.2.15 - "More Than Words" 2000-01-11 Yoichi NAKAYAMA * samples/ja/dot.folders, samples/en/dot.folders: 'アクセスグループ' の記述を加えた。 2000-01-11 Yuuichi Teranishi * wl-mime.el, tm-wl.el (wl-draft-preview-message): 全ヘッダを表示 するようにした。 * wl-summary.el (wl-summary-mode): tab-width を設定しないようにした。 (Yoshinari NOMURA さんの御指摘) (wl-summary-copy, wl-summary-refile): wl-draft-folder にコピー できないようにした (okada@opaopa.org (岡田 健一 / Kenichi OKADA)さんの御指摘)。 (wl-summary-overview-entity-compare-by-date): エラーを無視 (MIZUHARA Bun さんの御指摘)。 * wl.el (wl-plugged-mode): inhibit-read-only の設定を削除。 (Shuhei KOBAYASHI さんの御指摘) * wl-vars.el (wl-draft-reedit-hook): 新規 hook。 * wl-draft.el (wl-draft-save, wl-draft-mimic-kill-buffer): 新規関数。 (wl-draft): 既に使われているバッファ名は使わないようにした。 (wl-draft-reedit): wl-mail-setup-hook をrun-hookせず、かわりに wl-draft-reedit-hook を run-hook するようにした。 (okada@opaopa.org (岡田 健一 / Kenichi OKADA)さんの御指摘)。 * wl-xmas.el, wl-mule.el (wl-draft-key-setup): C-xC-s に wl-draft-save を、C-xk に wl-draft-mimic-kill-buffer を 割り当てた。 * wl-nemacs.el (wl-draft-overload-functions): 同上。 2000-01-09 TAKAHASHI Kaoru * wl-mule.el, wl-util.el: (require 'static) を (eval-when-compile (require 'static)) に変更。 * wl.el (wl-save): の docstring を追加。 2000-01-08 Mito * wl-score.el (wl-score-guess-like-gnus): (when (stringp fld-name)..) で括った。 2000-01-08 Masahiro MURATA (村田全寛) * wl-draft.el (wl-draft-config-info-operation): 新規関数。 (wl-draft-delete, wl-draft-save-and-exit, wl-draft-reedit): `wl-draft-config-info-operation' を使うようにした。 2000-01-08 Yuuichi Teranishi * wl-demo.el (toplevel): bitmap がインストールされていない場合に バイトコンパイルで出る Warning を減らした。 (wl-demo-use-bitmap): 新規変数。bitmap のデモを表示するかどうかを指定。 デフォルトは t。 * WL-CFG: wl-demo-use-bitmap を nil にする例を追加。 * wl-nemacs.el (toplevel): timezone のエミュレーションを止めた (APEL 10 〜 を前提)。 * wl-demo.el, wl-draft.el, wl-folder.el, wl-util.el, wl-message.el, wl-summary.el (toplevel): 未定義変数は make-local-variable で得られるシンボルに値を set するようにした。 (Shuhei KOBAYASHI さんの御助言) 2000-01-07 Daiki Ueno * wl-draft.el (wl-smtp-features, wl-smtp-parse-extension): 修正。 2000-01-07 Yuuichi Teranishi * wl-draft.el (wl-user-agent-compose): wl-draft を interactive に呼ぶ ようにした。(Atsushi Tada さんの御指摘) * Makefile (EMACS): デフォルトを emacs にした。 (XEMACS): 新規変数。 (package, install-package): $(XEMACS) を使うようにした。 * 2.2.14 - "Layla" * wl-summary.el (wl-summary-mode): default-directory を設定するのを やめた。 * wl-vars.el (wl-tmp-dir): デフォルトを"~/tmp/" とした (WL-ML 3735 のスレッド参照)。 2000-01-06 Daiki Ueno * wl-draft.el (wl-smtp-features): 新規変数。 (wl-smtp-extension-bind): 新規マクロ。 * wl-summary.el (wl-summary-mode-map): wl-summary-prev-page のキーバインドを backspace にも割当てた。 2000-01-06 Kentaro Yoshitomi * elmo-maildir.el (elmo-maildir-create-folder): ディレクトリ名が "/" で終るときに error になるのを修正。 2000-01-06 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * wl-draft.el: smtp.el 変数名の authenticate への変更に対応。 2000-01-06 Yuuichi Teranishi * wl-util.el (wl-load-profile): wl.el から移動。 * COPYING: 新規ファイル (etc/copyright から改名). * wl-vars.el (wl-smtp-connection-type): wl-smtp-use-tls から改名。 * wl-draft.el (wl-draft-send-mail-with-smtp): smtp-connection-type を wl-smtp-connection-type で bind するようにした。 (wl-draft-queue-save-filename): fixed typo. * wl-vars.el (wl-cs-*): Nemacs 向けの定義を変更。 * all files: 著作権表示の更新、checkdoc fix。 2000-01-05 TAKAHASHI Kaoru * wl-ja.texi: 著作権表示と複写許可表示を追加。 2000-01-05 Yuuichi Teranishi * wl-score.el (wl-summary-score-update-all-lines): スコアで読んだことにする場合に、未キャッシュとするようにした。 * elmo-util.el (elmo-imap4-get-spec): elmo-default-imap4-ssl が t の場合に対応していなかったのを修正。 (Taro FUNAKI さんより御報告) * tm-wl.el (wl-draft-yank-current-message-entity): mime-viewer/following-method-alist の修正もれを修正。 (Taiji.Can@atesoft.advantest.co.jp さんより御報告) 2000-01-04 OKUNISHI -GTO- Fujikazu * wl-message.el (wl-message-decode): 'no-mime のときに wl-cs-autoconv でデコードするようにした。 1999-12-31 Kentaro Yoshitomi * elmo-maildir.el, elmo-util.el: Maildir フォルダの作成、削除、 コピーへ対応。 1999-12-29 Yuuichi Teranishi * wl-draft.el (wl-draft): `wl-load-profile' を呼ぶようにした。 (Masahiro MURATA (村田全寛) さんの御指摘) * elmo-imap4.el (elmo-imap4-make-number-set-list): 新規関数。 (elmo-imap4-msgdb-create): `elmo-imap4-make-number-set-list' を使うようにした。 (elmo-imap4-mark-set-on-msgs): 同上。 1999-12-11 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * wl-summary.el (wl-summary-get-sync-range): offline 時に POP フォルダに入るたびに Unplugged と文句を 言われないようにした。 1999-12-28 Nishimoto Masaki * elmo-msgdb.el (elmo-msgdb-expand-path): アーカイブフォルダのパス 展開に失敗していたのを修正。 1999-12-28 Yuuichi Teranishi * 2.2.13 - "Keep The Faith" 1999-12-27 Yuuichi Teranishi * elmo-util.el (elmo-network-get-spec): 新規関数。 (elmo-*-get-spec): 書き直し、ユーザ名部に '@' を含められるようにした。 (okada@opaopa.org (岡田 健一 / Kenichi OKADA) さんの御指摘に基づく) * elmo-imap4.el (elmo-imap4-create-msgdb-from-overview-string): float が扱えない Emacs への対応。 * elmo-pop3.el (elmo-pop3-get-connection): 引数を変更。 * check-paren fix. 1999-12-21 Koga Masato * wl-draft.el (wl-draft-reedit): `wl-draft-use-frame' が効くようにした。 1999-12-21 Yuuichi Teranishi * elmo-vars.el (elmo-imap4-use-modified-utf7): 新規変数。 デフォルトは nil。 1999-12-20 Yuuichi Teranishi * wl-mime.el, tm-wl.el (wl-mime-save-content): 最後にセーブした ディレクトリを覚えるようにした。 * wl.el (wl-save): 新規コマンド。現在のフォルダ状態等をセーブする。 (JINMEI Tatuya さんより御要望) * wl-folder.el (wl-folder-mode-map): "\M-s" に `wl-save' をバインド。 * elmo-util.el (elmo-imap4-get-spec): `utf7-encode-string' を 使うようにした。 * elmo-imap4.el (elmo-imap4-list-folders): `utf7-decode-string' を使うようにした。 * elmo/utf7.el: 新規ファイル。 1999-12-20 Daiki Ueno * elmo-imap4.el (elmo-imap4-open-connection): starttls 対応の修正。 * wl-draft.el: featurep->boundp。 1999-12-17 Yuuichi Teranishi * wl-vars.el (wl-search-mime-charset): 新規変数。 * wl-summary.el (wl-summary-pick): `wl-search-mime-charset' を 使うようにした。 1999-12-16 TAKAHASHI Kaoru * WL-MK (wl-texinfo-format): 古い texinfmt.el を使ってい るときには `@direntry' をエミュレーションするようにした。 1999-12-16 Yuuichi Teranishi * wl-draft.el (wl-draft-config-exec): ハイライトしなおすようにした。 (Motomichi Matsuzaki さんの御指摘) * wl-summary.el (toplevel): `wl-summary-temp-mark-region' の キーバインド順を変えた (okada@opaopa.org (岡田 健一 / Kenichi OKADA) さんの御助言)。 1999-12-16 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * wl-summary.el (wl-summary-mark-as-important-region, wl-summary-mark-as-unread-region, wl-thread-mark-as-important, wl-thread-mark-as-unread, wl-summary-temp-mark-mark-as-important, wl-summary-temp-mark-mark-as-unread): New functions. (wl-summary-save-region): 無駄な処理を削除. (wl-summary-prefetch-region): wl-summary-message-uncached-marks で 判断するのをやめ、elmo-cache-exists-pを使うようにした。 * wl-thread.el (wl-thread-get-children-msgs-uncached): 同上。 1999-12-14 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * pop, imap の STARTTLS で、tls を使用するように指定しているのに, サーバが許可していない場合は,error を出すようにした。 1999-12-14 TSUMURA Tomoaki * dot.wl: wl-default-folder では ML-name と ML-count を表示し、 それ以外の folder では ML-count のみ表示する例を追加。 1999-12-14 Yuuichi Teranishi * mmelmo-imap4-2.el (mmelmo-imap4-parse-bodystructure-string): 生 JIS のファイル名があったりすると parse に失敗するのを修正。 * wl-summary.el (wl-summary-copy): 2回目のコピー指示が登録されないのを 修正。(Hiroshi Watanabe さんより御報告) 1999-12-12 Yuuichi Teranishi * wl-summary.el (wl-summary-goto-folder-subr): sticky にする タイミングを変更 (Masahiro MURATA (村田全寛) さんの御指摘)。 * wl-vars.el (wl-folder-sync-range-alist): デフォルトでドラフトと キューのレンジを "all" とした。 1999-12-11 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * wl-summary.el (wl-summary-get-sync-range): offline 時に POP フォルダに入るたびに Unplugged と文句を 言われないようにした。 1999-12-10 OKUNISHI -GTO- Fujikazu * elmo にある関数を defalias している wl の関数を elmo の関数に置き換えた。 1999-12-07 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * elmo-nntp.el: elmo-nntp-max-number-precedes-list-active が t かつ list-active が提供されていない場合の挙動を修正。 1999-12-07 TAKAHASHI Kaoru * INSTALL.ja: 修正。 * wl-summary.el (wl-summary-always-sticky-folder-p): 新規マクロ。 (wl-summary-goto-folder-subr): (wl-summary-always-sticky-folder-p) を使うようにした。 1999-12-07 Akihiro MOTOKI * wl-vars.el (wl-summary-always-sticky-folder-list): 新規変数。 * wl-summary.el (wl-summary-stick): Optional 引数を加えた。 (wl-summary-goto-folder-subr): wl-summary-always-sticky-folder-list にマッチするフォルダは自動的に Sticky になるようにした。 1999-12-07 Yuuichi Teranishi * INSTALL.ja: 文字コードを ISO-2022-JP にした。 * wl-draft.el (wl-draft-send-mail-with-smtp): (default-)?case-fold-search のバインド位置を変更。 (Atsushi Tada さん、 津金久倫 さん他より御報告) (wl-draft-send): with-current-buffer を使わないようにした。 * 2.2.12 - "Joyride" 1999-12-07 Katsumi Yamaoka * etc/icons/wl-logo.xbm: Christmas version. 1999-12-07 Yuuichi Teranishi * elmo-imap4.el (elmo-imap4-parse-overview-string): elmo-imap4-use-uid が nil のとき動かなかったのを修正。 * utils/hmac/scram-md5.el, utils/hmac/hmac-util.el: 削除。 * wl-summary.el (wl-summary-mark-as-unread): wrong-type-argument エラーが出るのを修正。 * wl-folder.el (wl-folder-empty-trash): サマリ増殖現象の修正もれ。 (OKAZAKI Tetsurou さんの御報告) 1999-12-07 Masahiro MURATA (村田全寛) * wl-draft.el (wl-draft-condig-exec): wl-draft-config-exec-flag は wl-draft-config-alist が適用された ときのみ nil にするよう変更。 1999-12-06 Shigeru OKUMURA * WL-ELS (HMAC-MODULES): 更新。 1999-12-06 Tsunehiko Baba * INSTALL: 新規ファイル。 1999-12-06 Yuuichi Teranishi * elmo-imap4.el (elmo-imap4-create-msgdb-from-overview-string): フィルタがうまく動かないのを修正。 (Kazuyoshi Mii さんより御報告) * 2.2.11 - "Iris" * utils/hmac/lisp/*.el: Sync up with slim-1.13.4. * elmo-imap4.el (elmo-imap4-open-connection): cram-md5 認証で sasl-cram-md5 を 使うようにした。 (toplevel): (require 'hmac-md5) ではなく、(require 'sasl) とする ようにした。また、eval-when-compile を外した。 1999-12-05 Yuuichi Teranishi * wl-summary.el (wl-summary-mark-as-read): msgdb に存在しない メッセージにはマークを付けないようにした。 * wl-summary.el (wl-summary-pick): msgdb 対象のときにひとつも pick できなかったときにメッセージを出すようにした。 1999-12-04 Yuuichi Teranishi * elmo-msgdb.el (elmo-msgdb-overview-get-parent-entity): 引数を変更。 * wl-vars.el (wl-smtp-posting-server): 初期値を nil とした。 (okada@opaopa.org (岡田 健一 / Kenichi OKADA) さんの御助言) * elmo-imap4.el (elmo-imap4-create-msgdb-from-overview-string): extra-field 名を downcase するようにした。 (Takaaki MORIYAMA さんより御指摘) * elmo-util.el (elmo-collect-field(-from-string)?): 引数 downcase-field-name を増やした。 1999-12-03 TSUMURA Tomoaki * wl-folder.el (wl-folder-empty-trash): サマリ増殖現象の修正。 1999-12-03 Nishimoto Masaki * wl-summary.el (wl-summary-default-from): Newsgroup 名が表示 されなかったのを修正。 1999-12-03 TAKAHASHI Kaoru * INSTALL.ja: 新規ファイル。 * draft 再編集時に、Newsgroups: ヘッダがあれば、To: を付加しないよ うにする修正のマージし忘れを修正。 1999-12-03 Yuuichi Teranishi * elmo-util.el (elmo-mime-string): elmo-set-work-buf で括るようにした。 (Mikiya Tani さんの御指摘) * 2.2.10 - "Human Touch" * etc/icons/wl-logo.xpm: Christmas version. * elmo-imap4.el (elmo-imap4-make-attributes-object): Nemacs で read が失敗してしまうのに対処。 * elmo-dop.el (elmo-dop-list-folder): pipe 対応忘れを修正。 (OKAZAKI Tetsurou さんの御指摘) 1999-12-03 sen_ml@eccosys.com * utils/wl-mailto.el: 0.5. 1999-12-02 Yuuichi Teranishi * mmelmo-imap4-1.el: buffer read only のエラーが出るのを修正。 * wl-mime.el, tm-wl.el: wl-draft-preview-message のキーバインドを変更。 (Makoto.Nakagawa@jp.compaq.com (中川 誠) さんの御報告に基づく) * utils/ssl.el: 最新版に入れ換え。 (okada@opaopa.org (岡田 健一 / Kenichi OKADA)さんの御指摘) * elmo-util.el (elmo-mime-string, elmo-decode-mime-charset-string): 新規関数。 * elmo-imap4.el: FETCH 結果解析処理部分を大幅に書き換えた。 1999-12-02 Hironori Fukuchi * wl-xmas.el: (featurep 'dragdrop) が nil のときに、 wl-dnd-set-drop-target がエラーを発生する場合があるのを修正。 1999-12-02 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * starttls.el がないとエラーが出るのを修正。 1999-12-01 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * smtp authのところで,wl-smtp-posting-userが nil でも error を出さないようにした。 * nntpフォルダでポート番号を指定するとエラーが出るのを修正 1999-11-27 Masahiro MURATA (村田全寛) * wl-draft.el (wl-draft-reedit): interactive でないのに wl-mail-setup-hook を呼ぶかどうかが (interactive-p) で判別されて いたのを修正。 * New command: wl-fldmgr-delete. * Rename: wl-fldmgr-rename-group -> wl-fldmgr-rename. * New function: elmo-folder-creatable-p. * imap4 で #mh タイプのフォルダを作るとき,必ずディレクトリが作 成されるようにした。 * wl-folder-check-one-entity で存在しないフォルダを作成するよう にした。 * New macro: wl-folder-clear-entity-info. 1999-11-25 TAKAHASHI Kaoru * wl-message.el (wl-message-narrow-to-page): "^L\n^L" を含むメッセー ジを読むときに `beginning-of-buffer' エラーが出ないようにした。 1999-11-25 Yuuichi Teranishi * wl-summary-mode の引数をなくした。 * wl-address.el (wl-address-petname-add-or-change): .addresses の最後の行に改行がない場合に対処。 * elmo-imap4-[12].el (mmelmo-imap4-parse-bodystructure-entity): mime-parse-parameters-from-list を使うようにした。 1999-11-24 Tetsuya Uemura * x-face-xmas-mew-display-x-face -> x-face-xmas-wl-display-x-face 1999-11-22 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * wl-vars.el (wl-smtp-authenticate-type, wl-smtp-use-tls): 新規変数。 * wl-draft.el (wl-draft-send-mail-with-smtp): SMTP の TLS 対応。 1999-11-21 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * wl-summary-jump-to-msg-internalが wl-summary-jump-to-msg-by-message-id-via-nntpから呼ばれるときに, scan-typeがupdateになるようにした。 1999-11-22 Daiki Ueno * elmo-imap4.el, elmo-pop3.el: STARTTLS 対応。 1999-11-20 Masahiro MURATA (村田全寛) * wl-draft.el (wl-draft-send-mail-with-smtp): connection を張る時に process-connection-type を nil に拘束した。 1999-11-20 OKUNISHI -GTO- Fujikazu * elmo-util.el (elmo-open-network-stream): connection を張る時に process-connection-type を nil に拘束した。 1999-11-20 Nishimoto Masaki * 既にimportantマークがついているメッセージに importantなスコアがつくとマークが消えてしまうのを修正。 1999-11-19 Hironori Fukuchi * tm-wl.el: fixed typo. 1999-11-18 Yasuo OKABE * 表示しているメッセージがない状態で wl-draft-insert-message を実 行するとエラーが出るようにした。 1999-11-17 Yuuichi Teranishi * wl-vars.el: 新規変数 wl-summary-showto-folder-regexp。 * wl-summary.el (wl-summary-default-from): my-wl-summary-from-func-petname にした。 (Masahiro MURATA (村田全寛) さんの御助言) * wl-summary.el (wl-summary-simple-from): wl-summary-default-from から名前変更。 1999-11-17 Masahiro MURATA (村田全寛) * wl-message.el (wl-message-get-buffer-create): sticky メッセージを表示するときにエラーになるのを修正した。 1999-11-17 sen_ml@eccosys.com * wl-mailto.el: 0.5-pre1. 1999-11-16 Yuuichi Teranishi * elmo-util.el (elmo-delete-cr-get-content-type): Content-Type がないときに t を返却するようにした。 * 2.2.9 - "Gonna Make You Sweat" 1999-11-15 Katsumi Yamaoka * wl-util.el (wl-unique-id): current-time と timezone を使わない版。 1999-11-14 Masahiro MURATA (村田全寛) * wl-draft.el, wl-summary.el: reply 時は wl-draft-reply を t に, forward 時は wl-draft-forward を t に設定するようにした。 * wl-folder.el, wl.el: wl-folder でフォルダリストを生成したときのみ, wl-make-plugged-alist を呼ぶようにした。 1999-11-14 OKAZAKI Tetsurou * elmo-pipe.el (elmo-pipe-use-cache-p): 実装。 * elmo2.el (elmo-folder-number-get-spec): 修正。 1999-11-13 Yuuichi Teranishi * wl-nemacs.el: current-time 実装を取り込んだ。 * wl-draft.el: insert-mail の実装。 * メッセージの MIME ボタンで 'a' を押したときに、そのパートを引用した ドラフトを用意するようにした。 * wl-draft.el: wl-user-agent.el をマージした。 * wl-mime.el, tm-wl.el: MIME module との API を整理しなおした。 1999-11-12 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * elmo-imap4.el: 存在しないフォルダに対して wl-folder-check-current-entity を実行するとエラーが出るのを修正。 * wl-draft.el: wl-draft-config-list, wl-template-alist で header, header-file も指定できるようにした。 1999-11-12 Katsumi Yamaoka * wl-util.el (wl-draft-make-message-id-string, wl-unique-id, wl-number-base36): New functions. (wl-unique-id-char): New internal variable. * wl-mule.el (wl-draft-make-message-id-string): Remove. * wl-nemacs.el (wl-draft-make-message-id-string): Remove. * wl-xmas.el (wl-draft-make-message-id-string): Remove. * wl-draft.el (wl-draft-send-mail-with-smtp): `smtp-server' が関数 だったら funcall するようにした; Resent-* フィールドの扱いを `smtp' に任せるようにした。 1999-11-12 Yuuichi Teranishi * wl-draft (wl-draft-get-fcc-list): FCC に指定されたフォルダが 存在しないときにエラーとせず、作成するかどうかきくようにした。 * Rename: wl-summary-confirm-folder-existence -> wl-folder-confirm-existence。 (Masahiro MURATA (村田全寛) さんの御助言に 基づく) * Rename: wl-mime-edit-preview-message-hook -> wl-draft-preview-message-hook * elmo-nntp.el (elmo-nntp-string-to-vector): 関数呼び出しにするのを 止めた。 * elmo-util.el (elmo-tokenize-string): 廃止。split-string で代用。 * wl-highlight.el: 新規 face、wl-highlight-logo-face。ロゴ用 face。 1999-11-11 Katsumi Yamaoka * wl-demo.el: bitmap-mule 対応。 * wl-logo.xbm: 新規ファイル。 * elmo-nntp.el (elmo-nntp-string-to-vector): vector の長さを無制限 にした。 (elmo-nntp-parse-overview-string): `elmo-nntp-string-to-vector' に 第2引数を与えるのをやめた。 1999-11-11 Yuuichi Teranishi * elmo-imap4.el: Message-ID に '%' が含まれていると検索に失敗するの を修正。 (OKAZAKI Tetsurou さんの御助言) * wl-message.el, mmelmo-[12].el: read-only の設定を整理。 * wl-draft-save-and-hide -> wl-draft-save-and-exit とし、 C-c C-z にバインドした。 1999-11-11 Yasuo OKABE * wl-summary.el (wl-summary-temp-mark-forward): マークされているメッセージが複数ならば全体を multipart/digest で囲む ようにした。 1999-11-11 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * 新規変数 wl-nntp-posting-port, wl-nntp-posting-ssl wl-nntp-posting-{user,server,port,ssl}と elmo-default-nntp-{user,server,port,ssl} を対応させるようにした。 * wl-nntp-posting-* の初期設定は nil とし、 nil のままなら elmo-default-nntp-* を利用するようにした。 * utils/bbdb-wl.el: (setq bbdb-use-pop-up nil) の場合、 サマリで ':' を押した後 q と押すとエラーが出るのを修正。 * wl-draft.el: 新規関数 wl-draft-save-and-hide。 1999-11-10 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * wl-demoで,wl-logo.xpmの表示位置をちゃんと計算するようにした。 1999-11-10 Tsutomu Okada (岡田 勉) * wl-message.el (wl-message-refer-article-or-url): メッセージバッファで mouse-button-2 を押してもカーソルが メッセージバッファに移動しないようにした。 1999-11-10 Yuuichi Teranishi * wl-summary.el (wl-summary-set-message-buffer-or-redisplay): Sticky Message があるとオリジナルバッファが実際と異なったままに なる場合があるのを修正。(Mito さんより御報告) * wl-util.el (wl-string): elmo-string への alias とした。 * elmo-util.el (elmo-string): 新規関数。 * 新規変数 wl-smtp-posting-port。 * wl-summary-resend-bounced-mail を "\eE" にバインド。 1999-11-10 OKAZAKI Tetsurou * WL-ELS の typo の修正もれの修正。 1999-11-10 kurati@bigfoot.com * refile でフォルダ作成したときにフォルダ名補完候補に加わるようにした。 * FCC: に新規フォルダを指定した時に作成するか聞くようにした。 * auto-refile のとき、存在しないフォルダがあった時に作成するか聞く。 1999-11-10 Yasuo OKABE * wl-summary.el (wl-summary-resend-message, wl-summary-resend-bounced-mail): 新規コマンド。 * wl-draft.el (wl-draft-dispatch-message): dispatch された メッセージが Resent-to ヘッダを含んでいた場合は Newsgroups ヘッダ を持っていてもニュースには送らない。 1999-11-09 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * wl-summary.el (wl-summary-jump-to-msg-internal): 記事が 表示されない場合があるのを修正。 * wl-summary.el (wl-summary-jump-to-msg-by-message-id-via-nntp): 移動先のニュースグループの候補が複数あるときに wl-folder-newsgroups-hashtb に含まれるものを優先するようにした。 1999-11-09 Yuuichi Teranishi * 2.2.8 - "Free As A Bird" 1999-11-08 Yuuichi Teranishi * wl-draft.el (wl-draft-send): 送信後、C-cC-s が insert-signature に なってしまうのを回避。(Akihiro MOTOKI さん より御報告) * WL-MK: Nemacs では (fset 'file-executable-p 'file-exists-p) とした。 * WL-MK, WL-CFG: WL_PREFIX と ELMO_PREFIX のデフォルトを "wl" とした。 * 新規変数 wl-user-mail-address-list。 ユーザのメールアドレスが複数あるときに自分かどうかの判定に用いられる。 * 新規関数 wl-address-user-mail-address-p wl-user-mail-address-list と wl-from を使って自分のアドレスかどうか 判別する。 * wl-summary.el (wl-summary-cancel-message, wl-summary-supersedes-message): wl-address-user-mail-address-p を使ってアドレス判定するようにした。 (okada@opaopa.org (岡田 健一 / Kenichi OKADA) さんの変更に基づく) * wl-refile.el (wl-refile-learn, wl-refile-guess-by-history): 同上。 * wl-draft.el (wl-draft-make-mail-followup-to, wl-draft-reply wl-draft-delete-myself-from-cc): 同上。 * elmo-filter.el (elmo-filter-list-folder-unread, elmo-filter-list-folder-important): フィルタ処理が間違っていた のを修正。(Kazuyoshi Mii さんより御報告) 1999-11-08 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * POP-before-SMTP 関連変数の初期化法を変更。 1999-11-07 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * elmo-nntp.el: list active が失敗したら,list を実行するようにした。 1999-11-07 Masahiro MURATA (村田全寛) * wl-draft-prepared-confi-alist を廃止し, wl-draft-config-alist と統合した。 * wl-template-select を実行したときでもローカル変数を継承するよ うにした。 * Fcc フォルダの処理を送信が成功した時に行うようにした。 * wl-draft-queue-save-variables の変数を user-mail-address から wl-envelope-from に変更した。 * wl-draft-insert-from-field において,user-mail-address が nil のときにエラーになるのを修正した。 1999-11-06 Tetsuya Uemura * describe-mode でモードマップが表示されるようにした。 1999-11-06 TAKAHASHI Kaoru * wl-folder.el (wl-folder-mode-map): wl-fldmgr-copy-region のキーバインドを変えた。 1999-11-06 Hironori Fukuchi * wl-summary.el (wl-summary-stick): 括弧の位置がずれていたのを修正。 1999-11-06 Yasuo OKABE * utils/wl-user-agent.el: sendmail-user-agent の動作に合わせた。 1999-11-06 sen_ml@eccosys.com * utils/wl-user-agent.el: 0.5. 1999-11-05 Yuuichi Teranishi * elmo-imap4.el: ソースをかなり整理した。 * elmo-imap4.el: 新規変数 elmo-imap4-debug。 Non-nil なら "*IMAP4 DEBUG*" バッファにデバッグ情報を出力する。 * elmo-imap4.el, elmo-pop3.el, elmo-nntp.el: メッセージ本体読み出し時のコピー回数を削減。 * elmo-imap4.el: コマンドの返答が最後まで得られるまでロックするように した。 * wl-summary.el: wl-refile-rule-alist が nil だとオートリファイルが エラーになるのを修正。 * WL-MK: install-package で info がインストールされないのを修正。 ("MATSUBAYASHI 'Shaolin' Kohji" さん より御報告) * elmo-cache.el (elmo-cache-search): 部分キャッシュの検索に対応 していなかったのを修正 (Yasuo OKABE さんの御指摘)。 1999-11-04 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * POP-before-SMTP の整理と拡張。 * 新規変数 elmo-default-pop3-user, wl-pop-before-smtp-user, wl-pop-before-smtp-server, wl-pop-before-smtp-port, wl-pop-before-smtp-ssl, wl-pop-before-smtp-authenticate-type。 * elmo-pop-before-smtp-* -> wl-pop-before-smtp-* 1999-11-04 Yuuichi Teranishi * wl-mime.el (wl-mime-edit-preview-message): 新規 hook: wl-mime-edit-preview-message-hook。 * elmo-util.el: バイトコンパイラの出す Warning を削減した。 * wl-summary.el (wl-summary-sync-marks): マーク同期処理を大幅に高速化。 * elmo-pipe.el (elmo-pipe-max-of-folder): 頻繁に削除される IMAP4 フォルダでは未読数がおかしくなるのを修正。 (Toshihiko Kodama (小玉 利彦) さんの御報告に基づく) 1999-11-03 Yuuichi Teranishi * 2.2.7 - "Escapade" * WL-MK: install-info すると INFODIR のメッセージがおかしくなるの を修正。 * 起動して最初に Folder モードから prefetch するとエラーが発生する のを修正 (岡田 健一 (Kenichi OKADA) さんより御報告)。 * mime-elmo-entity クラスを mime-buffer-entity クラスの サブクラスとし、他の MUA に影響が及ばないようにした。 * 閉じたスレッドにメッセージが追加されたときに番号部分が ハイライトされなかったのを修正。 * pipe に対応し忘れていた部分を対応させた。 1999-11-03 Masahiro MURATA (村田全寛) * フォルダ名の補完などで,folder petname を使用するようにした。 * wl-force-fetch-folders が non-nil の場合,アクセスグループが unplugged だと開けなくなるのを修正した。 * フォルダモードの最下行で wl-fldmgr-set-petname が出来ないよう にした。 * wl-plugged-mode で変更しなかった場合は,wl-toggle-plugged を呼 ばないようにした。 * wl-exit と wl-folder-suspend 時のバッファ消去を整理した。 * wl-folder.el: 一部を関数 wl-folder-buffer-group-p で置き換えた。 * wl-summary.el: 一部を関数 wl-summary-entity-info-msg で置き換 えた。 * wl-reset-plugged-alist のデフォルト値を t に変更した。 * wl-plugged-mode で plugged 状態を変更しても全部リセットされて しまうのを修正した。 1999-11-03 TAKAHASHI Kaoru * wl-summary.el (wl-summary-reedit): ニュース記事の再編 集時に、To: ヘッダを加えないようにした。 1999-11-03 岡田 健一 (Kenichi OKADA) * wl-summary-write-current-newsgroup で elmo-folder-get-primitive-folder-listを使うようにした。 * 新規コマンド wl-folder-write-current-newsgroup * elmo-folder-get-primitive-folder-list と elmo-folder-get-primitive-spec-list を pipe フォルダに対応させた. * elmo-pop3-flush-connectionする前に電話を切ると, wl-toggle-plugged できなくなるのを修正。 1999-11-03 sike@ic.netlaputa.ne.jp * Message-Id の途中で改行があっても大丈夫なようにした。 1999-11-02 Yuuichi Teranishi * 2.2.6 - "Diamonds And Pearls" * 起動時に plug status を wl-plugged に合わせるようにした。 (Yasuo OKABE さんの御指摘) * WL-MK: 大幅に書き換えた。 * Rename: wl-address-complete-address -> wl-complete-field-body * Rename: wl-address-complete-address-or-tab -> wl-complete-field-body-or-tab 1999-11-01 Yuuichi Teranishi * フォルダアイコン初期化関数を簡略化。 * elmo-pipe: New module. 1999-11-01 OKAZAKI Tetsurou * WL-ELS の typo 修正。 * wl-user-agent.el と wl-mailto.el の byte-compile 時に "Cannot open load file wl" のエラーが出るのを修正。 1999-10-29 Takaaki MORIYAMA * wl-exit で kill-emacs-hook から wl-save-status を消すようにした。 1999-10-28 OKUNISHI -GTO- Fujikazu * new file: WL-ELS。 * WL-MK: install.el を使うよう大幅に書き換えた。 1999-10-28 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * wl-ja.texi: wl-template-select のキーバインドが間違っていたのを 修正。 * INN 2.3 でも未読数が一致するようにした。 1999-10-28 TAKAHASHI Kaoru (高橋 郁) * wl-ja.texi: 大幅に修正。 1999-10-27 Yuuichi Teranishi * Folder モードでも 'Z' に wl-status-update をバインドした。 * Fix: wl-summary-goto-last-displayed-msg 1つしか表示したことがない時に前のメッセージに戻れなかったのを 修正。 1999-10-26 kurati * FCC: で補完が効くようにした。 1999-10-26 Yuuichi Teranishi * Unplugged 時でも重要マークの同期はするようにした。 * auto-refile の前に存在するかどうかチェックするようにした。 (Toshihiko Kodama (小玉 利彦) さんの御要望に基づく) * Fix: score で expunge したメッセージは IMAP4 サーバ上でも 読んだことにすることにした。 1999-10-22 OKAZAKI Tetsurou * サマリバッファ(スレッドモード)でカーソルが行頭にないときに スレッドに対する mark 操作をすると動作が変になるのを修正。 * wl-thread-refile で refile 先に refile 元と同じフォルダを (間違って)指定してエラーとなったときにカーソルを移動しない様にした。 * wl-summary-jump-to-parent-message で message の検索が失敗した時の メッセージを変えた。 * wl-summary-exec-region で行単位でない region を指定した時の region の補正方法が直観的でなかったのを変更した。 1999-10-25 Masahiro MURATA (村田全寛) * fldmgr: グループフォルダを追加するとエラーになるのを修正した。 * wl-defface の設定を static にした。 * wl-folder-buffer-search-entity, wl-folder-folder-name で 未読数など不明のフォルダにもマッチするようにした。 * wl-summary-redisplay-no-mime でも,wl-summary-buffer-disp-msg と wl-current-summary-buffer を設定するようにした。 1999-10-25 Yuuichi Teranishi * 起動時にドメイン名が正しいかチェックするようにした。 * 新規変数 wl-local-domain。FQDN を返さないシステム用のドメイン名 を設定。 * フォルダモードの横スクロールバーを消した。 ("MATSUBAYASHI 'Shaolin' Kohji" の 御報告に基づく) * 新規関数 wl-mime-edit-preview-message。プレビューの色つけ。 * unplugged かつ、キャッシュされた未読がないとき、 カーソルをアクセスできる最後のメッセージに合わせるようにした。 * WL-CFG の utils の指定の仕方がまちがっていたのを修正。 (Taiji.Can@atesoft.advantest.co.jp さんの御指摘) * make info に失敗するのを修正。 (Kazufumi Hayasaka さんの御指摘) * 2.2.5 - "Come Undone" 1999-10-24 Mikio Nakajima * double negative を simplify。 1999-10-24 Masahiro MURATA (村田全寛) * FCC が unplugged folder なら dop キューに追加するようにした。 * elmo-dop-queue に "append-operations" を追加した。 * wl-summary-flush-pending-append-operations において既読メッセー ジを引き継ぐようにした。 1999-10-24 Yuuichi Teranishi * WL-CFG としてそれっぽいのを用意してみた。 * オフライン送信で IMAP4 フォルダへの FCC が無視されるのを修正。 (Masafumi NAKANE さんより御報告) * Emacs と XEmacs で refile-alist を共有できなかったのを修正。 (Takuo KITAME / 北目拓郎 さんより御報告) * wl-ja.texi: tm, semi の配布元を修正。 * Folder モードで別サーバで同じ名前の IMAP4 フォルダがあったときに、 別のフォルダの未読数が書き変わってしまうことがあるのを修正。 (Kazuyoshi Mii さんより御報告) 1999-10-23 岡田 健一 (Kenichi OKADA) * elmo-dop-merge-funcs にない操作を,捨てるようになっていたのを 修正。 1999-10-23 Masahiro MURATA (村田全寛) * port の label を自動的に作成するようにした。 * dop queue の表示を少しだけ詳細にした。 * elmo-dop-queue-merge で elmo-dop-queue が nil になることがあるの を修正した。 1999-10-23 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * elmo-prefetch-msgs で,処理の進みぐあいをカウントするようにした. 1999-10-23 Yuuichi Teranishi * wl-mime-save-content を SEMI に登録するときに Wanderlust 専用 メソッドとするようにした。 * FLIM-1.12 系で partial のマージに失敗するのを修正。 * WL-MK: 大幅に書き直した。 1999-10-22 TAKAHASHI Kaoru * Rename: wl-score-edit-exit-function -> wl-score-edit-exit-func 1999-10-22 Takuo KITAME / 北目拓郎 * etc/ja.Emacs: いくつか値が重複していたのを修正。 1999-10-22 岡田 健一 (Kenichi OKADA) * [wl-ja.texi] wl-summary-save-* wl-summary-jump-to-msg-by-message-id-via-nntp オフラインprefetch wl-folder-jump-to-current-entity cram-md5,SSL の説明を追加。 1999-10-22 Masahiro MURATA (村田全寛) * XEmacs built-in の md5 を呼ぶときの CODING を 'binary にした。 * sticky summary から "g" で別のフォルダに移動すると, temp マークなどが消えるにも関わらず face が元に戻らないのを修正。 * 新規変数 wl-prog-uudecode-no-stdout-option。Non-nil なら 指定されたファイル名でセーブするようにした。 1999-10-21 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * オフライン処理キューのマージ処理。 1999-10-21 Yuuichi Teranishi * wl-address-header-extract-address で std11.el を利用しないように した。 1999-10-20 Masahiro MURATA (村田全寛) * wl-reset-plugged-alist が nil ならサーバ・ポート別のプラグ状態を 初期化しないようにした。 1999-10-20 Yuuichi Teranishi * Emacs 20.2 では、Folder モード初期化時に buffer-read-only のエラーが発生するのを修正。 (Yasuhiro Ohta さんより御報告、 TSUMURA Tomoaki さんより御助言) * XEmacs で scrollbar と toolbar のチェックをするようにした。 (Shigeru OKUMURA さんより御助言) 1999-10-20 岡田 健一 (Kenichi OKADA) * 不正なヘッダのメールをリファイルしようとするとエラーが発生するのを 修正。 * アクセスグループを最初に開いたときに内容が現れなくなっていた のを修正。 1999-10-19 Yuuichi Teranishi * Folder モードの 'E' で wl-folder-toggle-disp-summary がエラー を発生するのを修正。 (Shigeru OKUMURA さんの御報告) * timezone の y2k 対策で eval-after-load を使わないようにした。 * 2.2.4 - "Black Or White" 1999-10-19 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * wl-fetch-confirm-thresholdを越えるメッセージを prefetchしようとしたときに、'n'を押してキャンセルしても マークが空になってしまうバグの修正。 * Offline Prefetch。 1999-10-18 Yuuichi Teranishi * フォルダモードの最後の行で 'm f' できないようにした。 * バイトコンパイル時の Warning を減らした。 * hmac パッケージと ssl.el を utils/ に含めてみた。 (WL-CFG で wl-install-hmac が t ならインストールするようにした。) * FLIM-1.12 でも動くようにした。 * Unplugged 時に IMAP4 フォルダに移動するとエラーが出るのを修正. * サマリ更新時、wl-summary-update-confirm-threshold よりも更新数が 多いならば、一部分だけ更新にするかどうか、質問するようにした. * 新規変数 wl-summary-update-confirm-threshold. 1999-10-18 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * 新規変数 wl-summary-search-via-nntp。Non-nil で wl-summary-jump-to-msg-by-message-id から wl-summary-jump-to-msg-by-message-id-via-nntp を呼ぶ。 値が 'confirm なら、確認を求めてから呼び出す。 * 新規関数 wl-summary-jump-to-msg-by-message-id-via-nntp 指定された Message-ID のニュース記事を NNTP 経由で検索し、 フォルダ移動。 1999-10-16 Masahiro MURATA (村田全寛) * expire が number-or-marker-p error を発生する場合があるのを修正。 * filter 生成時に tocc で補完できるようにした。 * フォルダモードでの filter の作り方を変更。 1999-10-15 Yuuichi Teranishi * IMAP4 フォルダの未読数が正しく反映されるよう, elmo-imap4-server-diff 時に、elmo-imap4-commit するようにした。 * 新規関数 elmo-commit。サーバの状態をアップデートさせる。 * wl-folder-check-one-entity が無駄にフォルダの存在をチェックして いたのを修正。 * elmo-imap4-max-of-folder: new implementation. * elmo-imap4-folder-exists-p: new implementation. 1999-10-14 Mikio Nakajima * wl-ja.texi: fixed typo (@kbd {l} -> @kbd{l}). 1999-10-14 TAKAHASHI Kaoru * xemacs で wl-local-variable-p 他が動かないのを修正。 1999-10-14 Yuuichi Teranishi * キャッシュがあるといくら読んでも未読マークが消えなくなってしまうの を修正。 (Taiji.Can@atesoft.advantest.co.jp さんの御指摘) * wl-address-header-extract-address で std11.el を利用するようにした。 1999-10-14 Masafumi NAKANE * Fixed Typo: exit-> exist. 1999-10-13 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * unplugged.xpm: 赤を入れた。 1999-10-13 OKAZAKI Tetsurou * elmo-filter-get-spec の仕様変更に関係する修正洩れの修正洩れ を修正 (elmo-folder-diff)。 1999-10-13 Masahiro MURATA (村田全寛) * wl-plugged-mode のウィンドウ作成処理の負荷を軽くした。 * wl-draft-raw-send で wl-draft-config-alist を nil に 拘束しないようにした。 1999-10-13 Sasaki Toshiya * wl-folder-use-sever-diff-p: マルチフォルダで、一つでも IMAP4 フォルダがあれば t になるようにした。 1999-10-13 Yuuichi Teranishi * 'm U' (wl-summary-temp-mark-uudecode)で、出力先の ファイル名を指定できるようにした。 * フォルダモードもホイールに対応させた。 * tm-wl.el が編集中だったのを修正。 (Toshihiko Kodama (小玉 利彦) さん の御指摘) * wl-ja.texi: OR 条件の説明を追加。 * time-stamp に依存しないようにした。 1999-10-12 Yuuichi Teranishi * 2.2.3 - "Always" * read-directroy-name -> wl-read-directory-name。 1999-10-12 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * 新規関数 wl-summary-save-region (ry), wl-thread-save (ty), wl-summary-temp-mark-save (my)。 1999-10-11 Masahiro MURATA (村田全寛) * 新規変数 wl-draft-sendlog。non-nil なら送信ログを生成する。 * New plugged system 第2弾. 1999-10-10 Yuuichi Teranishi * 新規関数 wl-summary-temp-mark-pick (m? にバインド)。 一時マークがついたメッセージを対象として検索。 * 新規変数 elmo-imap4-disuse-server-flag-mailbox-regexp。 文字列がマッチしたメールボックスのフラグを使わない。 デフォルトは "^#mh"。 * wl-address-file-name -> wl-address-file。 * wl-score-default-file-name -> wl-score-default-file。 * 新規変数 wl-summary-auto-sync-marks。 Non-nil ならサマリ同期時に未読/重要マークも同期する。 デフォルトは t。 * wl-stirict-diff-folders のデフォルトを nil にした。 * サマリで重要マークを同期するようにした。 * IMAP4 フォルダで未読フラグを同期するようにした。 * 新規コマンド wl-summary-sync-marks。 * IMAP4 フォルダでサーバ側の未読数を表示できるようにした。 * 新規変数 wl-folder-use-server-diff。 1999-10-08 Yuuichi Teranishi * 新規変数 wl-envelope-from。envelope from を設定。 nil なら wl-from が envelope from となる。デフォルトは nil。 1999-10-04 Yuuichi Teranishi * Message バッファで 'e' を押したときのセーブ関数を ちょっとだけ親切なものをデフォルトとした (SEMI 用)。 * wl-draft-send で、sending-buffer が buffer-live-p の場合だけ kill-buffer するようにしてみた。 * 未読数チェック時、フォルダの存在をいちいち調べるのをやめ、 チェックに失敗したときにフォルダの存在を調べるようにした。 * メッセージバッファにカーソルがあるときにホイールを回すとエラー になるのを修正。 1999-10-04 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * グループフォルダ(非アクセスグループ)に対して, C-u SPC した時に,wl-folder-update-recursive-current-entity を 呼ぶようにした. 1999-10-04 Yuuichi Teranishi * filter された IMAP4 フォルダのオフライン処理で無駄な削除処理 キューが溜るのを修正。 (OKAZAKI Tetsurou さんの御指摘) 1999-10-04 okada@opaopa.org (岡田 健一 / Kenichi OKADA) * アクセスグープに Petname をつけると wl-folder-update-recursive-current-entity が動かなかったのを修正. 1999-10-03 TSUMURA Tomoaki * wl-refile-alist に登録する際の key (mail address) に downcase をかけるようにした。 1999-10-02 Tetsuya Uemura * ドラフトバッファでメールを作成中に、 C-u 0 C-l などで指定の位置にカーソルが行くように修正。 1999-10-01 Yuuichi Teranishi * IMAP4 のパートフェッチでは、そのメッセージを読んだことに しないようにした。 1999-09-30 OKUNISHI -GTO- Fujikazu * -nw で起動した Emacs 20 でプリントできないのを修正。 1999-09-28 Masahiro MURATA (村田全寛) * フォルダからサマリに移動する際,フォルダを表示していないウィン ドウにサマリが表示されることがあるのを修正した。 * ホストが2つ以下だと wl-plugged-change でエラーになるのを修正。 * サマリでも wl-plugged-change できるようにした。 1999-09-27 Yuuichi Teranishi * コンパイル時に wl.el を load しないようにした。 (Masahiro MURATA (村田全寛) さんの御指摘に 基づく) 1999-09-27 Masahiro MURATA (村田全寛) * New plugged system で error が発生する場合があるのを修正。 1999-09-26 Masahiro MURATA (村田全寛) * New plugged system. 1999-09-24 OKUNISHI -GTO- Fujikazu * wl-break-pages を nil に拘束しても wl-summary-set-message-buffer-or-redisplay() では再描画されないので、 wl-summary-redisplay-internal () を実行するようにした。 * wl-break-pages が t の時は改頁された後の部分がプリント出力 されないのを修正。 1999-09-23 岡田 健一 (Kenichi OKADA) * wl-stay-folder-window tで使っていると,行が折り返されて, 非常に見辛いので,truncate-line tにした。 1999-09-23 OKAZAKI Tetsurou * elmo-filter-get-spec の仕様変更に関係する修正洩れを修正 (elmo-folder-diff)。 1999-09-23 OKUNISHI -GTO- Fujikazu * localdir 等が絶対パスかどうかを file-name-absolute-p で判定し、 .elmo 以下に db を作るようにした。 1999-09-20 Masahiro MURATA (村田全寛) * mime-view-caesar で作られたバッファを消去するコードが 抹殺されてしまったのを復活。 1999-09-21 OKUNISHI -GTO- Fujikazu * 関数 elmo-safe-filename で OS/2 では "|<>" をファイル名として 使えないのに対応。 1999-09-21 Yuuichi Teranishi * 2.2.2 - "You Could Be Mine" * フォルダモードにあるフォルダは、wl-save-folder-list の値に 関係なくセーブするようにしてみた。 * filter でフィールド名に 'tocc' を指定すると to か cc に指定文字列が 含まれるメッセージを取り出すようにした。 * filter フォルダで OR 条件、NOT 条件を指定できるようにした。 * wl-uniq-list -> elmo-uniq-list 1999-09-20 Yuuichi Teranishi * timezone.el の y2k 対策の定義を変更。 * wl-summary-save で、セーブ後 "No message to save." と 言われるのを修正。 * local-variable-p の定義を wl-util.el へ移動。 (Masahiro MURATA (村田全寛) さんの御報告 に基づく) 1999-02-02 IMAI Takeshi * IMAP フォルダに expire できなかったのを修正。 1999-09-20 Masahiro MURATA (村田全寛) * mime-view-caesar で作られたバッファを消去するコードが 抹殺されてしまったのを復活。 1999-09-19 Shigeru OKUMURA * open-network-stream の process-buffer を unibyte に設定。 1999-09-19 OKAZAKI Tetsurou * wl-ja.texi の修正。 1999-09-17 HAYAKAWA akio * ローカルのフォルダだけで構成されているマルチフォルダ もローカルとみなすようにした。 1999-09-16 OKUNISHI -GTO- Fujikazu * typo fix. 1999-09-16 Masahiro MURATA (村田全寛) * 1つのフレームにおいてメッセージを表示するウィンドウは共有する ようにした。 * wl-summary-goto-folder した時に,wl-summary-buffer-disp-msg の値によりメッセージの表示を復元するようにした。 1999-09-15 OKAZAKI Tetsurou * make install で elmo 関係の el ファイルが無条件に インストールされてしまうのを修正。 * 新規関数 wl-install-modules。 1999-09-14 Yuuichi Teranishi * 2.2.1 - "Wild World" * typo: stickey -> sticky. * wl-nemacs.el: Nemacs 向けに local-variable-p を定義。 * Rename: etc/ChangeLog.* -> etc/ChangeLog.*.ja * Rename: etc/ChangeLog.*.en -> etc/ChangeLog.* * XEmacs でロゴが出ないのを修正。 * XEmacs のインストール関数がこわれていたのを修正。 (Hidetomo Machi さんの御指摘) * wl-ja.texi: MIME 用モジュールのインストールの項を更新。 * インストール時、作った info ファイルを消さないようにした。 * 新規関数 wl-kill-buffers。 * wl-summary-force-exit と wl-exit のときに Sticky Message を削除 するようにした。 (Masahiro MURATA (村田全寛) さんの御助言) 1999-09-14 Masahiro MURATA (村田全寛) * XEmacs-21.1.6 では sticky サマリで wl-summary-read がエラーにな るのを修正した。 1999-09-14 Koichiro Ohba * ja/dot.wl の elmo-eword-decode-string の変更洩れを修正。 1999-09-13 Yuuichi Teranishi * tm-wl.el: SEMI API にあわせて defalias-maybe した。 * よく考えたら smtp.el は flim|clime に含まれているので削除. 1999-09-13 Yuuichi Teranishi * 2.2.0 - "Vogue" * smtp.el: Sync up with flim-1.13.2。 * 新規変数 wl-install-els。nil なら el ファイルをインストールしない。 (for WL-CFG) * wl-draft-reply 等を Sticky Message 対応。 * wl-drfat-buffer-cur-message-buffer -> wl-current-message-buffer とし、wl-util.el に移動。 * elmo-cross-device-link-error-p を変更。 (pf21 GOTO_Toshiya さんの御報告に基づく) 1999-09-13 Mito * Sticky Message。 * Score ファイルの guess 方法の拡張。 * elc だけでなく el ファイルもインストールされるようにした。 1999-09-12 Yuuichi Teranishi * サンプルファイルは samples ディレクトリにまとめるようにした。 * サンプルファイル英語版を追加。 * etc/*.xpm -> etc/icons/*.xpm * etc/TODO -> doc/TODO.ja 1999-09-12 OKAZAKI Tetsurou * since, before 関係の修正。 1999-09-10 OKUNISHI -GTO- Fujikazu * im-wl-prog-imput-error-msg -> im-wl-dispatcher-error-msg。 1999-09-10 Yuuichi Teranishi * convert-standard-filename の defmacro を廃止。 * open-network-stream-as-binary の defmacro を削除。 * with-current-buffer, with-temp-buffer 等の defmacro を削除。 * elmo-eword-decode-string -> 廃止。 1999-09-09 Yuuichi Teranishi * 新規変数 elmo-default-imap4-user. (Taiji.Can@atesoft.advantest.co.jp さん の御助言に基づく) * 2.1.5 - "Unbelievable" 1999-09-08 Yuuichi Teranishi * 新規変数 elmo-nntp-max-number-precedes-list-active。 Non-nil なら list active で得られる数字を記事番号の最大値として扱う。 * 新規関数 elmo-update-number。 elmo-nntp-max-number-precedes-list-active が non-nil のときに サマリの同期時に、msgdb の更新がなくても記事番号の最大値を同期 させるようにした。 (岡田 健一 (Kenichi OKADA) さんの御指摘に基づく) 1999-09-06 Akihiro Motoki * elmo-localnews-append-msg の引数が足りなかったのを修正。 1999-09-06 Yuuichi Teranishi * [im-wl] im-wl-prog-imput-error-msg がバッファローカルになっても 大丈夫なよう、プロセスバッファに値をコピーするようにした。 * (elmo-folder-local-p) を使って、'N','P' も local なら plug 状態 に関係なく動作するようにした。 (Akihiro Motoki さんの御助言) 1999-09-03 Akihiro Motoki * 'p' が localdir でも未読メッセージをスキップしてしまうのを修正。 * 新規関数 (elmo-folder-local-p) 1999-09-03 Yuuichi Teranishi * テンプレート選択のキーバインドを C-cC-j にした。 (TSUMURA Tomoaki さん、 Masahiro MURATA (村田全寛) さんの御助言) 1999-08-31 Yuuichi Teranishi * ドラフトの送信時、キュー処理時のメッセージの出し方を変更。 1999-08-31 OKUNISHI -GTO- Fujikazu * [im-wl] サブプロセスの呼び出し時にバッファを変更せず、 プロセスの出力だけ" *Wl Watch*" に向けるようにした。 1999-08-30 Yuuichi Teranishi * [wl-ja.texi] extra-fields が IMAP フォルダで有効になっていたのを 反映。(Sasaki Toshiya さんの御指摘) * 分割された MIME encode されたメッセージを送ろうと思うと、 無限ループに陥ってしまうのを修正。 (Mikio Nakajima さんの御指摘) 1999-08-30 OKUNISHI -GTO- Fujikazu * new im-wl.el 1999-08-27 Yuuichi Teranishi * 最下行で `K'/`L' (wl-summary-increase/lower-score) すると, rule 入力に突入してしまうので if 文をひとつ被せた。 (TSUMURA Tomoaki さんの御助言) * EMWAC 等のサーバーでは、サーバーからの返答を待つ前にコマンドを 送ってしまうとその後サーバーからの応答がなくなってしまうらしいので、 新規変数 elmo-pop3-send-command-synchronously が non-nil なら サーバの返答を待つようにした。 (Atsushi Tada さんのパッチに基づく) * 最近の SEMI で mime-store-message/partial-piece が動かなく なったのを修正。 * XEmacs でドラフトモードのアイコンが出なくなっていたのを修正。 1999-08-26 Teruki SHIGITANI * サマリモードで最後の行(メッセージがない行)にカーソルをおい て "y" を入力する(wl-summary-saveを実行しようとする)と、メッ セージ番号が取れないためエラーとなるのを修正。 1999-08-26 Yuuichi Teranishi * 背景が明色の場合の色のデフォルトをちょっと変更してみた。 * フィルタ指定で /last=200/ としてしまうとまずいことになるのを修正. * % のアクセスグループとして root を指定できなかったのを修正. 1999-08-25 Yuuichi Teranishi * 2.1.4 - "Tears In Heaven" * [wl-ja.texi] Summary の C-u . の説明を追加 (susumu-w@ops.dti.ne.jp の御指摘)。 1999-08-24 Yuuichi Teranishi * フォルダ脱出時のマーク実行が失敗した場合、サマリにゴミが 残ってしまうので、失敗した場合はエラーを発生するようにした。 * split されたメッセージのヘッダが encode されないことがあるのを修正。 * Unplugged で,キャッシュされたIMAPフォルダの未読メッセージを 読んだことが,オンラインになった瞬間にサーバ側に反映されないのを 修正. * Unplugged で,ファイルキャッシュされていないメッセージを読むと, 前のメッセージが表示されてしまうのを修正. * 全般に, スレッドを開閉すると temp-mark より mark の方が優先 されて色がつくのを修正(susumu-w@ops.dti.ne.jp の御指摘). * wl-thread-insert-message: wl-summary-goto-top-of-current-thread を 使わないようにした。 * wl-summary-goto-top-of-current-thread: 書き直し。 * "W" でドラフトを作成したときに, wl-mail-setup-hook が呼ばれない修正がなされていなかった. (岡田 健一 (Kenichi OKADA) さんの御指摘) * push -> wl-push. (Masahiro MURATA (村田全寛) さんの御助言) 1999-08-23 Yuuichi Teranishi * elmo-eword-decode-string を defalias するのをやめる。 * tm で flim が使われていれば User-Agent にバージョンを表示. * partial merge 関数の ID 比較部分を修正. 1999-08-22 Masahiro MURATA (村田全寛) * elmo-nntp.el (elmo-nntp-catchup-msgdb): overview が得られなくて, msgdb が (nil nil nil nil) となる場合に対処。 1999-08-20 OKUNISHI -GTO- Fujikazu * elmo-pop3.el: elmo-pop3-list-folder を整理。 1999-08-20 Masahiro MURATA (村田全寛) * 新規変数 wl-score-folder-alist-matchone。 * wl-score-folder-alist の書式を拡張した。 1999-08-20 Mito * wl-score-folder-alist の score file を指定する所に guess というシンボルを指定した場合はそのフォルダ名から score file を推測するようにした。 1999-08-19 Masahiro MURATA (村田全寛) * (wl-summary-switch-to-clone-buffer): コピーする変数に wl-summary-buffer-temp-mark-list, wl-summary-default-score, wl-summary-important-above, wl-summary-temp-above, wl-summary-mark-below, wl-summary-expunge-below を追加した。 1999-08-18 Yuuichi Teranishi * 忘れ去られていた wl-thread-exec を実装。 ("KJ.TASAKI" さんの御指摘) * sync-all のときも temp-mark が残っていれば、実行するかどうか 確認するようにした。 (Taiji.Can@atesoft.advantest.co.jp さんの御指摘) * elmo-vars.el の berkeley-db の修正洩れ。 (Mikio Nakajima さんの御指摘) * timezone-parse-date の y2k 対策。 (Masahiro MURATA (村田全寛) さんの御指摘) 1999-08-17 Mikio Nakajima * wl-fldmgr.el の interactive command の autoload 設定を整理。 1999-08-16 Masahiro MURATA (村田全寛) * Scoring 処理を高速化した。 * wl-summary-sort-by-{from|subject} を高速化した。 * wl-summary-switch-to-clone-buffer で変数 wl-current-score-file と wl-score-alist もコピーするようにした。 * 関数 wl-as-mime-charset を追加した。 * Use wl-score-mode-mime-charset instead of wl-score-mode-coding-system. * elmo-make-hash のデフォルトテーブルサイズを 1024 とした。 1999-08-14 susumu-w@ops.dti.ne.jp * wl-thread-jump-to-msg が interactive で呼ばれるとエラーになる のを修正. * Summary の "J" に wl-thread-jump-to-msg を割り当て. * localdir, localnew, maildir において unplugged でも plugged と同じように n,p する. * t d では方向を考慮してくれないのを修正. * c-u t d で いっこ前のスレッドが D されてしまうのを修正. * d だと次のメッセージが表示されるが, t d だと表示されないのを修正. * n,p において, D が付いたメッセージを飛ばすようにした. 1999-08-14 Yuuichi Teranishi * [elmo] UW imapd のリモートフォルダにアクセスできなかったのを修正. 1999-08-04 Yuuichi Teranishi * wl-queue-folder に格納されたメッセージの本文が 表示されないのを修正(須崎 昇 さんの御指摘). * 2.1.3 - "Sukiyaki" 1999-08-03 岡田 健一 (Kenichi OKADA) * ChangeLog から余分な Tab/Space を削除。 * wl-vars.el の typo 修正。 * wl-ja.texi: wl-folder-{prefetch|mark-as-read-all}-current-entity の説明を追加。 1999-08-03 Yuuichi Teranishi * キューに溜ったメッセージの送信時にエラーが発生してもキューから 消えてしまうのを修正。 (Mikio Nakajima さんの御指摘) * mmelmo-imap4.el: mime-goto-header-start-point, mime-goto-header-end-point, mime-entity-header-buffer, mime-entity-body-buffer を実装。 (Taiji.Can@atesoft.advantest.co.jp さんの御指摘) * smtp.el: 試しに新規オプション smtp-notify-success をつけてみた。 * wl-mime.el: pertial のマージに失敗する場合があるのを修正。 (Shuichi Nishioka さんの御指摘) * reedit 時にマルチパートのメッセージを再編集できなくなっていたの を修正。 * 一時マークの処理を unwind-protect で囲まないようにし、 サマリ脱出時に一時マークの処理を C-g で中断できるようにした。 (Mito さん、 Masahiro MURATA (村田全寛) さん, Taiji.Can@atesoft.advantest.co.jp さんらの御指摘御助言に基づく) 1999-08-02 Mikio Nakajima * POP3 の接続が切れてしまったときにオフラインへのトグルが できないのを修正。 * wl-ja.texi で wl-toggle-plugged が wl-draft-toggle-plugged に なっていたのを修正。 1999-08-01 Mikio Nakajima * XEmacs の configure に --with-database=berkdb オプションを付け てコンパイルしている場合、elmo-use-database を non-nil にセットしても elmo-database.el が load されてないのを 修正。 1999-07-30 Mito * Summary の (window-height) が小さい時、SPC でエラーが出るのを修正。 1999-07-29 Masahiro MURATA (村田全寛) * (localdir, maildir, localnews, archive) -> (localdir, localnews, archive) というコピーや移動は直接 link(copy) するようにした。 * wl-summary-pick において,同じ Message-ID である複数のメッセー ジにマッチしても1つ目にしかtempマークが付かないのを修正した。 * Followup-To: poster に対応した。 * Superseds メッセージを作成するコマンド wl-summary-supersedes-message を新規作成した。 * wl-util.el (wl-string): Use set-text-properties instead of format. 1999-07-28 "A. SAGATA" * 先の elmo-multiple-field-body の修正で自分が出したメールに reply できなくなっていたのを修正。 1999-07-27 Masahiro MURATA (村田全寛) * New function: elmo-multiple-field-body and elmo-multiple-fields-body-list. 同名の複数のフィールドを取得す るようにした。 1999-07-26 Masahiro MURATA (村田全寛) * elmo-localnews-copy-msgs が未定義にも関わらず呼ばれるのを修正。 1999-07-24 HAYAKAWA akio * wl-(un)plugged-hook を定義するとエラーになってしまうのを修正。 1999-07-23 岡田 健一 (Kenichi OKADA) * "W"でドラフトを作成したときに wl-mail-setup-hook が呼ばれない のを修正。 1999-07-22 Yuuichi Teranishi * wl-summary-cancel-message を Sticky Summary に対応させた。 1999-07-16 Teruki SHIGITANI * sample.dot.wl内に、送信したメッセージのときは差出人の代わりにToや Newsgroupsを表示する機能を実現するコードで、To が mime-encodeされたままになってしまう不具合を修正。 1999-07-15 Masahiro Murata * Fix: void-function wl-summary-rescore-msgs. 1999-07-15 Yuuichi Teranishi * elmo-imap4 も Emacs20 の multibyte の設定がおかしくて 文字化けしていたのを修正。 * 2.1.2 - "Rico Suave" 1999-07-14 Yuuichi Teranishi * Summary での "I" も prefix-arg つきならチェックをスキップする ようにした。 * elmo-nntp で Emacs20 の multibyte の設定がおかしくて 文字化けしていたのを修正。 * 'u' のメッセージを読まなかったことにできなかったのを修正。 * XEmacs でいきなり wl-draft を実行するとエラーが発生を修正。 (Taiji.Can@atesoft.advantest.co.jp さんより御指摘) * 一部で wl-summary-highlight が無視されていたのを修正。 * フォルダのグループから "I" したときに合計を表示するようにした。 * プリフェッチするとサマリが modified になってしまうのを修正。 * フォルダから "U" のメッセージを "I" できないのを修正。 (susumu-w@ops.dti.ne.jp さんより御報告) 1999-07-14 Masahiro MURATA (村田全寛) * wl-score: (wl-score-simplify-subject) wl-summary-subject-func を呼ぶ代わりに wl-score-simplify-fuzzy-regexp を使用するようにした。 * バッファキャッシュ機能で同じキャッシュバッファが複数できるのを 修正した。 1999-07-13 Masahiro MURATA (村田全寛) * delete-if -> elmo-delete-if。 1999-07-13 Yuuichi Teranishi * 'I' で、サイズが大きくてプリフェッチをスキップしても プリフェッチした数に含まれてしまうのを修正。 (susumu-w@ops.dti.ne.jp さんより御報告) * 2.1.1 - "Praying For Time" 1999-07-12 Yuuichi Teranishi * wl-draft-insert-signature -> 廃止。 * wl-summary-prefetch-all-new -> 削除。 * C-g でパスワード入力を中断すると wrong-type-argument databasep nil が出ることがあるのを修正(したつもり)。 ("MATSUBAYASHI 'Shaolin' Kohji" さんの御報告に基づく) * 新規変数 wl-summary-incorporate-marks。 'I' でプリフェッチするマークを指定。デフォルトは、"N" と "U"。 * elmo-nntp.el と mmelmo.el から (elmo-set-buffer-multibyte nil) を削除 (Shigeru OKUMURA さんの御助言)。 * wl-mule.el に make-face が定義されていないときにダミー関数を定義。 (HAYAKAWA akio さん、 OKUNISHI -GTO- Fujikazu さんの 御助言に基づく) * pop3 フォルダが unplugged でエラーを発生するのを修正(したつもり)。 (HAYAKAWA akio さんの御指摘) 1999-07-12 Masahiro MURATA (村田全寛) * elmo-msgdb-extra-fields が nil のとき,fetch が失敗するのを修 正した。 1999-07-11 Masahiro MURATA (村田全寛) * elmo-crosspost-message-alist をファイルに保存するようにした。 * 変数値を保存する際は,なるべく elmo-object-load と elmo-object-save を使用するように変更した。 * Scoring 機能で wl-summary-rescan や sync-all 時には references や thread のエントリを自動追加しないようにした。 * imap4 フォルダで extra フィールドが取得できるようにした。 1999-07-10 岡田 健一 (Kenichi OKADA) * localnews でも 'W' で Newsgrops を補完してドラフトを作成できるよう にした。 1999-07-08 OKUNISHI -GTO- Fujikazu * Nemacs で internal("'mark") が読めなかったのを修正。 1999-07-07 Yuuichi Teranishi * wl-summary-mark-below のcustomのグループを 'wl-score に修正。 (Masahiro MURATA (村田全寛) さんの御指摘) * wl-summary-incorporate で、wl-summary-prefetch-all-new のかわりに (wl-summary-prefetch-region (point-min) (point-max)) を使うようにした。 (Masahiro MURATA (村田全寛) さんの御助言) * Summary の C-u . が効かなくなっていたのを修正。 (Hideo Matsumoto さんより御指摘) 1999-07-06 sen_ml@eccosys.com * rfc2368.el - version 0.3 1999-07-06 Hideo Matsumoto * 新規変数 wl-draft-use-frame。 draftを開くときに新しいframeを開く。 1999-07-06 Masahiro MURATA (村田全寛) * 関数 wl-day-number の mapcar にある lambda を quote。 * wl-score.el: wl-summary-{increase|lower}-score で Subject のマッ チ文字列を簡略化するようにした。 wl-current-score-file と wl-score-alist を buffer-local にした。 * wl-summary.el: wl-summary-scored を nil にする位置を変更した。 * Rename: wl-score-simplify-subject-fuzzy-regexp -> wl-score-simplify-fuzzy-regexp wl-score-simplify-buffer-fuzzy-step -> elmo-buffer-replace. * wl-ja.texi: スコア機能の変更。 * wl-draft.el: autoload 設定の追加。 * sample.dot.wl: wl-summary-next-no-unreadの削除。score機能の設 定追加。 1999-07-06 Yuuichi Teranishi * Summary の C-u . が効かなくなっていたのを修正。 (Hideo Matsumoto さんより御指摘) * Nemacs では wl-summary-{print|remove}-destination を ダミー関数にする。 * Nemacs 用に rassoc を定義。 * Nemacs の Folder モードで 'm' を押すとエラーになるのを修正。 * Nemacs では wl-use-scoring の default を nil にした。 * 新規関数 elmo-delete-if。replacement of delete-if。 * Nemacs でバイトコンパイルするとなぜか (defvar nil nil) のエラー が出るのを修正。 (Taiji.Can@atesoft.advantest.co.jp さんより御指摘) * 2.1.0 - "Ordinary World" 1999-07-05 Yuuichi Teranishi * partial をマージできなかったのを修正。 (Taiji.Can@atesoft.advantest.co.jp さんより御指摘) * wl-summary-rescore も wl-summary-rescore-partial-threshold に従う ようにしてみた。 * wl-summary-score-update-all-lines の処理中メッセージを出すように した。 1999-07-04 Masahiro MURATA (村田全寛) * wl-score.el: date, extra, followup, thread キーを追加した。 * `wl-score-default-file-name' で指定されたスコアファイルを必ず読み 込むようにした。 * サマリバッファ,およびスコア編集バッファでスコアファイルを作成する 機能を追加した。 * wl-vars.el: defcustom を整理した。 * wl-highlight.el: defface にグループを追加した。 1999-07-01 Yuuichi Teranishi * 新規 sync レンジ rescan-noscore。スコアを反映せず表示しなおす。 * rescan/sync-all では既読メッセージでも score を反映するようにした。 * 新規変数 wl-summary-rescore-partial-threshold。rescan, sync-all で スコア付けするメッセージ数の上限を指定。 * wl-edit-again-func->wl-edit-decode-message-func (tomo@etl.go.jp (守岡 知彦 / MORIOKA Tomohiko) さんの御助言) * elmo-util.el から日本語コメントを消す。 * wl-refile-alist-setup の実装を変更。 1999-06-29 TSUMURA Tomoaki * wl-refile-(msgid-)learn や, wl-refile-guess-* の中で, 毎回 wl-refile-(msgid-)alist が load されてるかどうか調べるのは 無駄なので起動時に必ず load するようにした。 * wl-refile-(msgid-)learn が一度呼ばれる毎に wl-refile-alist-save するのは, 無駄なので WL 終了時に一回だけ save するように した。 * wl-refile-(msgid-)learn の返り値を変更。 1999-06-29 Shuhei KOBAYASHI * cl の require を eval-when-compile で括り、順番を変える。 1999-06-29 OKUNISHI -GTO- Fujikazu * unread が 0 の時 [Space] でサマリから抜けられなかったのを修正。 * cl.el の member () が poe-18.el の member () を上書きしてしまう のを修正。 1999-06-29 Yuuichi Teranishi * AIR MAIL(AIRCimapd release 2.00) に対応。 (Sasaki Toshiya さんの御報告 に基づく) 1999-06-29 Yuuichi Teranishi * wl-score での expunge を「読んだことにして、 サマリバッファから消すだけ」とした。 * update 時に expunge したことを報告。 1999-06-28 Shuhei KOBAYASHI * elmo-pop3.el で md5-encode を使わないようにした。 1999-06-28 OKUNISHI -GTO- Fujikazu * MK-MK: (mapcar (lambda ..)) が v18 では動かないので quote する。 Nemacs でも wl-mule.elc がインストールされることになってたのを 修正。 defgroup(), defcustom() 問題回避コードを復活。 * wl-summary.el, wl-demo.el: float が使えない一部の Emacsen でのエラー回避。 * wl-nemacs.el: completing-read() は引数を五つまでしか受付けないので関数を置換 (極悪)。 read-char-exclusive() が存在しない場合にエラーにならないように する。 1999-06-28 Masahiro MURATA (村田全寛) * default-case-fold-search が nil のとき,wl-summary-pick が正常 に動作しないのを修正した。 * important マークが2つ以上あると,wl-auto-select-next がnon-nil のときに次の未読フォルダに移らないのを修正した。 1999-06-28 Yuuichi Teranishi * 関数 wl-summary-delete-all-delete-marks () 追加。 * (wl-summary-cleanup-temp-marks) がなぜか2回呼ばれていたのを修正。 (嵯峨田さん の御指摘) 1999-06-27 Masahiro MURATA (村田全寛) * folder モードで wl-summary-goto-folder-subr を一時的にサマリに移 動した時は,Scoring されないようにした。 * wl-summary-next-no-unread を削除し,wl-auto-select-next だけで制 御するようにした。 * wl-summary-move-order のデフォルト値を 'new から 'unread に変更 した。 1999-06-27 OKUNISHI -GTO- Fujikazu * Nemacs で (wrong-type-argument listp 1) が発生するのを修正。 * Nemacs が timer がなくてエラーになるのを condition-case で回避。 1999-06-27 Masahiro MURATA (村田全寛) * スコアファイルを ctext (*ctext) で読み書きするようにした。 1999-06-26 岡田 健一 (Kenichi OKADA) * mailto: と同様 nntp: news: に対応させる関数. (-> wl-utils.el に追加。) 1999-06-25 Masahiro MURATA * wl-score.el: coding-system がバグっていたのを修正。 1999-06-25 Masahiro MURATA * wl-score.el: 新規ファイル。Score 機能を追加した。 * wl-summary.el: (wl-summary-sync-update3) wl-folder-set-folder-updated のタイミングを変更した。 * (wl-summary-update-crosspost) スレッドをオープンせずに既読マー クを付けるように変更した。 * wl-util.el: New function `wl-delete-alist'. New macro `wl-as-coding-system'. Add emulate function `pp'. 1999-06-24 pf21 GOTO_Toshiya * [wl-ja.texi] wl-thread-open-reading-thread の説明追加。 1999-06-24 Kenichi OKADA * elmo-cache-expire がエラーを発生するのを修正。 1999-06-24 sen_ml@eccosys.com * utils/rfc2368.el のバグ修正。 1999-06-24 Yuuichi Teranishi * 2.0.1 - "Now And Forever" * body に --text follows this line-- があるとその行以前がなくなる のを修正(不完全)。 (岡田 健一 (Kenichi OKADA) さん の御指摘) 1999-06-24 MAKINO Takashi * 新規関数 wl-refile-guess-by-msgid。 1999-06-23 Akihiro Motoki * wl を起動していない状態 かつ (setq wl-stay-folder-window t)の場合、 wl-draft を行うと、wl-draft-send-and-exit も wl-draft-kill も 失敗するのを修正。 1999-06-23 岡田 健一 (Kenichi OKADA) * wl-ja.texi: wl-template-alist の説明: file -> body-file 1999-06-23 Yuuichi Teranishi * Draft で prefix つきで C-c C-y するとカットバッファから 引用するようにしてみた。 * elmo-imap4-int-string-to-list -> 廃止。 (Masahiro MURATA (村田全寛) さんの御助言) * 最近よく間違えるので Summary の 'e' を wl-summary-save に 割り当てた。 * wl-set-string-width から不要と思われる let を取った。 * Unplugged状態だと,MHフォルダ間でのrefileで,elmo-copy-msgs のあとに elmo-append-msg も呼ばれるのを修正。 (Koji IIDA / 飯田 浩二 さんより御指摘) 1999-06-22 Yuuichi Teranishi * mule/emacs で wl-draft-prepared-config-exec が C-c C-d と C-c C-e の両方に割りあてられていたのを修正。 * wl-completion-buf-name の値を emacs 標準の補完用バッファ *Completions* に合わせた。 * wl-message-buffer-created-hook を設定しても適切に hook が 呼ばれていないのを修正。 (Akihiro Motoki さんより御指摘) 1999-06-22 Masahiro MURATA (村田全寛) * elmo-nntp.el: XOVER での size の取得が誤っていたのを修正した。 (elmo-nntp-string-to-vector): Renamed from `elmo-nntp-string-to-list'. * elmo-localdir.el: ファイルサイズを file-attributes で取得するよ うにした。 1999-06-21 OKUNISHI -GTO- Fujikazu * elmo-pop3 の max-of-folder を効率化。 1999-06-21 OKUNISHI -GTO- Fujikazu * .wl の syntax 等のエラーをちゃんと吐かせる(ユーザに知らせる) ようにした。 * おまけ。 1999-06-19 Masahiro MURATA (村田全寛) * (featurep 'tinycustom) なら defface の定義を無視する。 1999-06-18 Shigeru OKUMURA * nntp の文字化けがまだ直っていなかったのを修正。 1999-06-18 Masahiro MURATA (村田全寛) * @ で正しくアドレスを expand するようにした。 1999-06-16 Yuuichi Teranishi * 新規変数 wl-use-dnd。ドラッグアンドドロップ機能をつかうかどうか。 1999-06-16 Masahiro MURATA (村田全寛) * [elmo-nntp] elmo-list-folder で "LISTGROUP" コマンドを使うよう にした。 * [elmo-nntp] xover の使用可否をサーバごとに保持するようにした。 1999-06-16 Shigeru OKUMURA * Content-Typeがsjisやeucだと mailやnewsが化けてしまうのを修正。 1999-06-16 Yuuichi Teranishi * [elmo-imap4] cram-md5 対応。 1999-06-15 Yuuichi Teranishi * tm で error: Split sender is not specified for `wl-draft-mode'. と出るのを修正。 (Toshihiko Kodama さんの御指摘) 1999-06-14 Yuuichi Teranishi * `wl-draft-enable-queuing' の説明がダブっていたのを修正。 (Toshihiko Kodama (小玉 利彦) さんより御助言) 1999-06-14 OKUNISHI -GTO- Fujikazu * wl-detect-info-directory() をちょっと賢くしてみた。 1999-06-13 Masahiro MURATA (村田全寛) * バッファキャッシュ。 新規変数 elmo-use-buffer-cache が non-nil ならキャッシュ。 デフォルトは t。 一旦読んだメッセージをバッファに残しておく機能。 * メッセージの先読み(cache-prefetch)。 メッセージを読んでいる間に次の(未読)メッセージを先読みして バッファキャッシュにためておく。 新規変数 wl-cache-prefetch-folder-type-list にあるフォルダを キャッシュする。デフォルトは '(nntp imap4)。 * 新規変数 elmo-buffer-cache-size。デフォルトは 10。 * 新規変数 wl-cache-prefetch-folder-list。デフォルトは nil。 * 新規変数 wl-summary-no-mime-folder-list。デフォルトは '("^\\+draft$")。mime解析せずに表示するフォルダの設定。 1999-06-13 OKUNISHI -GTO- Fujikazu * WL-MK: info 生成時の codesys の決定は wl-vars.el を利用する。 info の分割オプションを廃止。 info のインストール時には複写ではなく移動する。 1999-06-13 Sen Nagata * 新規ファイル utils/wl-use-agent.el, utils/rfc2368.el 1999-06-11 Yuuichi Teranishi * mmelmo-imap4-get-mime-entityの中の elmo-imap4-get-connectionの引数が少なかったのを修正。 (岡田健一さんの御助言) * 2.0.0 - "Mmmbop" * wl-summary-partial-highlight-above-lines が nil なら Summary 開始時のカーソルの位置に関係なく最後から wl-summary-highlight-partial-threshold 行だけハイライトする ようにした。 * Sen Nagata さん作の util/wl-user-agent.el を 最新版に更新。 (奥西さん より御指摘) 1999-06-10 岡田 健一 (Kenichi OKADA) * IAMP4とNNTPのアクセスグループで,ポート番号が デフォルトと違うとエラーが出るのを修正。 1999-06-10 Yuuichi Teranishi * ファイル名変更 ChangeLog.en -> ChangeLog ChangeLog -> ChangeLog.ja * [wl-ja.texi] wl-plugged の説明を追加。 (池田さん より御助言) 1999-06-09 Yuuichi Teranishi * 新規変数 elmo-default-pop3-ssl elmo-default-nntp-ssl elmo-default-imap4-ssl。non-nil なら "!" を付けなくても SSL を使う。 * 名前変更 elmo-nntp-port -> elmo-default-nntp-port elmo-imap4-port -> elmo-default-imap4-port。 (岡田さん の御助言) * [elmo] imap4, nntp, pop3 でフォルダ名の最後に "!" がついたら SSL を 使うようにした。 * [elmo] imap4, nntp, pop3 でポートを指定してないサーバとのセッションと ポートを指定した同じサーバとのセッションでコネクションが かちあわないようにした。 1999-06-09 OKUNISHI -GTO- Fujikazu * POP でも変数 elmo-default-pop3-server を新設、"&USER" だけで もアクセスできるようにした。 * mmelmo-imap4.el にポート番号指定の修正。 * [wl-ja.texi] 修正。 1999-06-08 岡田 健一 (Kenichi OKADA) * IMAP4 フォルダで port 番号を指定できるようにした。 1999-06-07 Akihiro Motoki * メールの順序が 削除前のフォルダと trashフォルダで逆になってしまう のを修正。 * wl-summary-pick で field-name として elmo-msgdb-extra-fields を指定 できるようにした。 1999-06-07 Yuuichi Teranishi * wl-summary-jump-to-parent-message() は、スレッドと同様 In-Reply-To を優先する。 (嵯峨田さん の御指摘) * From が wl-from にマッチするメッセージに返事を書くときは、 To, Cc, Newsgroups を保存する。 (津邑さん の御助言) 1999-06-06 Masahiro MURATA (村田全寛) * stickyサマリに対して,wl-folder-mark-as-read-all-entity, wl-folder-sync-entity, wl-folder-prefetch-entity を実行すると, 未読メッセージなどに highlight がつかないのを修正した。 1999-06-05 Masahiro MURATA (村田全寛) * wl-folder-no-auto-check-folder-p で wl-auto-check-folder-list を 優先させるようにした。 * wl-summary-switch-to-clone-buffer で wl-summary-buffer-new-count と wl-summary-buffer-unread-count が コピーされないのを修正した。 * wl-folder-empty-trash でサマリバッファが表示されないのを修正した。 * bbdb2 で bbdb-wl.el をコンパイルする時のwarningをなくした。 * interactive を nil にして wl-summary-goto-folder-subr した際, recenter でエラーが出ることがあるのを修正した。 * bbdb2 で bbdb-wl.el をコンパイルする時のwarningをなくした。 * wl-folder-suspend-hook を追加した。 1999-06-06 OKUNISHI -GTO- Fujikazu * "V" で仮想フォルダを作成するとサマリが表示されず、sync update しなければならない。また、更に "V" してから "C-u V" で元の仮想 フォルダに戻ると再びサマリが表示されなくなってしまう。 1999-06-04 OKUNISHI -GTO- Fujikazu * font-lock による弊害を避けるため、wl-draft-reedit() でも change-major-mode-hook を nil に束縛する。 * wl-message-refer-article-or-url() を実行した際、サマリのカー ソルが当該メッセージに移動しないバグを修正。 1999-06-03 Masahiro MURATA (村田全寛) * sticky サマリから移動する際,temp-mark がついているとその マークは消えても highlight が残ったままになるのを修正した。 * wl-summary-buffer-copy-list が buffer-local-variables になって いなかったのを修正した。 * サマリの移動時に interactive でない場合は switch-to-buffer で はなく,set-buffer するようにした。 1999-06-03 Yuuichi Teranishi * 関数 elmo-imap4-identical-name-space-p を実装するのを忘れていた。 (森山さん の御指摘) * [mmelmo.el, mmelmo-imap4.el] FLIM 1.13 API に対応。 1999-06-03 "A. SAGATA" * sticky summaryを使うと、draft終了後、別のsummaryに戻る事がある。 * menu に mR と mfが二つづつあったのを修正。 * wl-summary-jump-to-current-message がちょっと変だったのを修正。 1999-06-02 Yuuichi Teranishi * XEmacs package でも BBDB が存在すれば utils/bbdb-wl.el も bytecomp/install する。 * 新規変数 wl-summary-keep-cursor-command。 コマンドごとにカーソル位置をそのままにするかどうかを設定できる ようにした。 1999-06-02 OKUNISHI -GTO- Fujikazu * BBDB が存在すれば utils/bbdb-wl.el も bytecomp/install する。 1999-06-02 岡田 健一 (Kenichi OKADA) * elmo-pop3のバイトコンパイル時のヲーニングをとる。 * [WL-MK] 一度,makeしてelcを作った後に,elmo-*.elを変更して, もう一度makeすると,エラーになるのを修正。 1999-06-02 Masahiro MURATA (村田全寛) * sticky サマリでの update 時に,新規メッセージが highlight されなく なったのを修正した。 1999-06-01 Yuuichi Teranishi * 1.0.1 から分岐。 1999-06-01 Masahiro MURATA (村田全寛) * 移動先のバッファが既に存在していた場合の動作を変更し、 'g' で呼ばれた場合は update せずにカーソル位置を保持するようにした。 * 'g' で移動する際,wl-ask-range(新規変数) が nil なら, wl-folder-sync-range-alist の値を使用するようにした。 * wl-summary-read-folder で入力したフォルダ名のみの履歴を wl-read-folder-hist に記録するようにした。 * 交互にサマリを切り替える新規コマンド、 wl-summary-goto-last-visited-folder。(キーバインドには未割り当て) 1999-06-01 Yuuichi Teranishi * 1.0.1 - "The Look" * wl-ja.info をパッケージから削除。 1999-06-01 Sen Nagata * compose-mail のインターフェースをサポート。 (新規ファイル wl-user-agent.el を追加) 1999-05-31 "A. SAGATA" * wl-stay-folder-window が non-nil のとき、full window で draft を作成した後、 C-cC-k や C-cC-c で、draft を終了して summary mode に戻った時に、folder window が消えてしまわない ようにした。 1999-05-31 Yuuichi Teranishi * folder モードなどからフォルダ移動するとき、 wl-folder-sync-range-alist の値を反映するようにした。 (神嶌さん の御助言) * wl-draft-reply-buffer-style が 'full のとき、multi-reply/forward がエラーになるのを修正。 (嵯峨田さん の御指摘) * sticky summary に移動したときは msgdb をロードしないようにした。 (村田さん の御助言) * wl-summary-exit が無駄にセーブしてしまうのを修正。 1999-05-29 OKUNISHI -GTO- Fujikazu * [wl-mime.el, tm-wl.el] (tm-)wl-mime-combine-message/partial-pieces() で regexp が regexp-quote() されてなかったのを修正。 1999-05-28 Yuuichi Teranishi * elmo-localdir-search をこころもち高速化。 1999-05-26 Shuhei KOBAYASHI * elmo-archive-search をこころもち高速化。 1999-05-25 OKUNISHI -GTO- Fujikazu * 宛先が localdir, localnews の時でも elmo-move-msgs() を高速 化した。なお、procmail などの MDA を使っている場合、変数 `elmo-localdir-lockfile-list'(初期値は nil)に MDA が生成す るロックファイル名を指定する。 * いくつかの関数をこころもち高速化 1999-05-24 岡田 健一 (Kenichi OKADA) * POP3 を SSL に対応させた。 * elmo-pop3-get-specで port が string だったのを int にした。 * elmo-default-pop3-port,elmo-default-pop3-authenticate-typeを 反映していなかったのを修正。 1999-05-24 "A. SAGATA" * customize で幾つか `mismatch' が出ていたのを修正。 1999-05-21 OKUNISHI -GTO- Fujikazu * WL-ELS を WL-MK に改名。 * make install で Emacs が2回起動されないようにする。 1999-05-20 Yuuichi Teranishi * wl-exit () 中の delete-other-windows () を削除。 * wl-summary-force-exit を interactive にするのを忘れていた。 (石川さん Ishikawa Ichiro の御指摘) 1999-05-20 Hidetoshi Shimokawa * device-class が color の tty のときの不具合を修正。 1999-05-20 "A. SAGATA" * highlightをcustomに対応した. * ハイライト変数のinfoを追加した. 1999-05-19 "A. SAGATA" * wl-highlight-signature-separator を追加。 1999-05-19 TSUMURA Tomoaki * wl-summary-jump-to-message-by-message-id () が スレッドが閉じた状態で隠れているメッセージに飛ばないのを修正。 1999-05-19 Yuuichi Teranishi * wl-summary-msgdb-load-async () を修正。 * フォルダ移動時のバッファ切替えのタイミングを変更。 * wl-summary-mark-as-read-all が,スレッドが閉じた状態で隠れて いるメッセージに対して効かなくなっていたのを修正。 (大澤さん の御指摘) wanderlust-wanderlust-769699d/etc/VERSION000066400000000000000000000042421406661363500202320ustar00rootroot00000000000000[Wanderlust Version names] 0.01 -------- 0.02 -------- 0.03 -------- 0.04 -------- 0.05 -------- 0.06 -------- 0.07 -------- 0.08 -------- 0.09 -------- 0.1.0 -------- 0.1.1 Amanda 0.1.2 Beat It 0.1.3 Centerfold 0.1.4 Dancing In The Dark 0.2.0 Every Breath You Take 0.2.1 Freedom 0.3.0 Human Nature 0.3.1 Invisible Touch 0.3.2 Jump 0.3.3 Karma Chameleon 0.3.4 La Bamba 0.3.5 Miss Me Blind 0.3.6 Never Surrender 0.4.0 One More Try 0.4.1 Private Eyes 0.4.2 Rock Me Amadeus 0.4.3 Starting Over 0.4.4 Thriller 0.5.0 Uptown Girl 0.5.1 Valotte 0.5.2 Wild Boys 0.5.3 Xanadu 0.5.4 You Might Think 0.6.0 Angelia 0.6.1 Billie Jean 0.6.2 China Girl 0.6.3 Danger Zone 0.6.4 Easy Lover 0.6.5 Footloose 0.6.6 Get It On 0.7.0 Hungry Heart 0.7.1 In Too Deep 0.7.2 Joanna 0.7.3 Kyrie 0.7.4 Luka 0.8.0 Manic Monday 0.8.1 Nasty 0.8.2 Open Arms 0.8.3 Pop Life 0.8.4 Rosanna 0.8.5 Sussudio 0.8.6 True Colors 0.8.7 Union Of The Snake 0.8.8 Veronica 0.9.0 With Or Without You 0.9.1 Yankee Rose 0.9.2 Addicted To Love 0.9.3 Last Christmas 0.9.4 Broken Wings 0.9.5 California Girls 0.9.6 Dirty Diana 0.9.7 Everything She Wants 0.9.8 Faith 0.10.1 Harlem Shuffle 0.10.2 I'm Your Man 0.10.3 Jumpin' Jack Flash 1.0.0 Kokomo 1.0.1 The Look 1.0.2 Monkey 1.0.3 Notorious 2.0.0 Mmmbop 2.0.1 Now And Forever 2.1.0 Ordinary World 2.1.1 Praying For Time 2.1.2 Rico Suave 2.1.3 Sukiyaki 2.1.4 Tears In Heaven 2.1.5 Unbelievable 2.2.0 Vogue 2.2.1 Wild World 2.2.2 You Could Be Mine 2.2.3 Always 2.2.4 Black Or White 2.2.5 Come Undone 2.2.6 Diamonds And Pearls 2.2.7 Escapade 2.2.8 Free As A Bird 2.2.9 Gonna Make You Sweat 2.2.10 Human Touch 2.2.11 Iris 2.2.12 Joyride 2.2.13 Keep The Faith 2.2.14 Layla 2.2.15 More Than Words 2.2.16 No Son Of Mine 2.2.17 One Of Us 2.2.18 Please Forgive Me 1.1.0 Overjoyed 1.1.1 Purple Rain 1.1.2 Raspberry Beret 2.3.x Roam 2.4.0 Rio 2.4.1 Stand By Me 2.5.x Smooth 2.5.8 Smooth Criminal 2.6.0 Twist And Shout 2.6.1 Upside Down 2.7.x Too Funky 2.8.0 Something 2.8.1 Something 2.9.x Unchained Melody 2.10.0 Venus 2.10.1 Watching The Wheels 2.11.x Wonderwall 2.11.3 Wanted Dead Or Alive 2.12.0 Your Wildest Dreams 2.12.1 99 Luftballons 2.13.x You Oughta Know 2.14.0 Africa 2.15.x Almost Unrealwanderlust-wanderlust-769699d/etc/icons/000077500000000000000000000000001406661363500202735ustar00rootroot00000000000000wanderlust-wanderlust-769699d/etc/icons/access.xpm000066400000000000000000000010011406661363500222520ustar00rootroot00000000000000/* XPM */ static char * access_xpm[] = { "16 16 7 1", " c None", ". c #9E799A69FFFF", "X c #000000000000", "o c #FFFFEBADD75C", "O c #EFBEFFFFC71B", "R c #FFFF00000000", "+ c #FFFFFFFFFFFF", " ", " ........X ", " .oooooooX ", " .o......... ", " .o.OOOOOOOX ", " .o.O......... ", " .o.O.+++++++X ", " .o.O.+++++++X ", " .o.O.+.+..++X ", " .o.O.+++++++X ", " XX.O.+X+X.++X ", " .O.+++++XXX ", " XX.+++++X+X ", " RR RR.RR+++XX ", " RR RRXRRXXXX ", " "}; wanderlust-wanderlust-769699d/etc/icons/archive.xpm000066400000000000000000000010501406661363500224360ustar00rootroot00000000000000/* XPM */ static char * lha_xpm[] = { "16 16 9 1", " c None", ". c #61856595CF3C", "X c #E79DE79DE79D", "o c #BEFBBEFBBEFB", "O c #000000000000", "+ c #08200C300820", "@ c #965896589658", "# c #C71BC30BC71B", "$ c #FFFFEBAD79E7", " ", " ... ", " ... ", " ..... ", " XXXXX ... ", " XoooooX . ", " XooooOoXOXXOX+ ", " XoooOOoOOoOO@+ ", " X#oO$OO$OO$O@O ", " X#O$$O$$O$$O@O ", " X#O$$O$$O$$O@O ", " X#O$$O$$O$$O@O ", " X#O$OO$OO$Oo@O ", " X@OO@OO@OO@@@O ", " OOOOOOOOOOOOOO ", " "}; wanderlust-wanderlust-769699d/etc/icons/closed.xpm000066400000000000000000000007021406661363500222710ustar00rootroot00000000000000/* XPM */ static char * closed_xpm[] = { "16 16 4 1", " c None", ". c #000000000000", "X c #FFFFE38DB6DA", "o c #CF3CBAEA9658", " ", " ", " ..... ", " .XXXXX. ", ".XoooooX....... ", ".XooooooXXXXXXX.", ".Xooooooooooooo.", ".Xooooooooooooo.", ".Xooooooooooooo.", ".Xooooooooooooo.", ".Xooooooooooooo.", ".Xooooooooooooo.", ".Xooooooooooooo.", " .............. ", " ", " "}; wanderlust-wanderlust-769699d/etc/icons/draft.xpm000066400000000000000000000007531406661363500221260ustar00rootroot00000000000000/* XPM */ static char * draft_xpm[] = { "16 16 6 1", " c None", ". c #000000000000", "X c #EFBEFFFFC71B", "o c #FFFFFFFFFFFF", "O c #59656595C71B", "+ c #79E7B2CAF7DE", " ", " ........... ..", " .XXXXXXXXX. ..", " .XXXXXXXXX..o.", " .XXXXXXX.ooo.", " .XXXXXX.oooo.", " .......X.oooo.", " .OOOOO.X.ooo. ", " ........oo.o. ", " .+++.X.oo.o. ", " .+o+++..oo.o. ", " .+o+++++.o.oo. ", " .OoOOOOO...o.X.", " .OoOOOOO.X..XX.", " .OOOOOOO.X.XXX.", " .......X..... "}; wanderlust-wanderlust-769699d/etc/icons/elmo.xpm000066400000000000000000000006121406661363500217540ustar00rootroot00000000000000/* XPM */ static char * elmo2_xpm[] = { "18 13 3 1", " c None", ". c #71C66DB6FFFF", "X c #B6DAEFBEFFFF", " .. ", " . .. ", " .. ... ", " . ...... . ", " .......... ", " .....X.... ", " ....XX.X.. ", " ...X.XXX... ", " ...XXXXXX.... ", " ...XXXXXXX... ", " ...XXXXXXX... ", " ...XXXXX... ", " ........ "}; wanderlust-wanderlust-769699d/etc/icons/file.xpm000066400000000000000000000006751406661363500217500ustar00rootroot00000000000000/* XPM */ static char * file_xpm[] = { "16 16 5 1", " c None", ". c #000000", "+ c #FFFFFF", "@ c #CFD3CF", "# c #303030", " ", " ", " ......... ", " .++++++.+. ", " .++++++.++. ", " .++++++....@ ", " .++++++@@@.@ ", " .+++++++++.@ ", " .+++++++++.@ ", " .+++++++++.@ ", " #+++++++++#@ ", " #+++++++++#@ ", " #+++++++++#@ ", " ###########@ ", " @@@@@@@@@@@ ", " "}; wanderlust-wanderlust-769699d/etc/icons/filter.xpm000066400000000000000000000012521406661363500223060ustar00rootroot00000000000000/* XPM */ static char * filter_xpm[] = { "16 16 15 1", " c None", ". c #CF3CCF3CCF3C", "X c #E79DE79DE79D", "o c #CF3CEFBEFFFF", "O c #FFFF79E7A699", "+ c #FFFF34D371C6", "@ c #000000000000", "# c #BEFBE79DF7DE", "$ c #B6DADF7DF7DE", "% c #AEBAD75CEFBE", "& c #9E79A2899E79", "* c #A699CF3CEFBE", "= c #965892488617", "- c #618565956185", "; c #9E79C71BE79D", " ", " ..XX ", " .ooooX ", " .oOOO+o. ", " .oO+ooO+o.@", " .####O+##.@", " X$$$O+$$$.@", " X%%%%%%%%.@", " &X**O+**.=@", " -X;;;;.=@ ", " --&X...=@ ", " --&@&&&&@ ", " --&@ @@@@ ", " --&@ ", " &&@ ", " @@ "}; wanderlust-wanderlust-769699d/etc/icons/imap.xpm000066400000000000000000000010241406661363500217440ustar00rootroot00000000000000/* XPM */ static char * imap_xpm[] = { "16 16 8 1", " c None", ". c #E79DE79DE79D", "X c #C71BC30BC71B", "o c #BEFBBEFBBEFB", "O c #000000000000", "+ c #965896589658", "@ c #61856595CF3C", "# c #30C230C26185", " ", " ..... ", " .XoooX. ", " .Xoooooo.....O ", " .XoooooXXXXo+O ", " .XooooXXXXoo+O ", " .XooooXXXooo+O ", " .XooXXXXXXXX+O ", " .XoXXXXXXXXX+O ", " .++++++++++++O ", " OOOOOOOOOOOOOO ", " ", "@@@@##XXXX##@@@@", " @@@@ ", " @@ ", " @@@@@ "}; wanderlust-wanderlust-769699d/etc/icons/internal.xpm000066400000000000000000000011031406661363500226300ustar00rootroot00000000000000/* XPM */ static char * internal_xpm[] = { "16 16 10 1", " c None", ". c #000000000000", "X c #E79DCB2B9E79", "o c #CF3CBAEA9658", "O c #B6DAA6998617", "+ c #BEFBE79DF7DE", "@ c #FFFFFFFFFFFF", "# c #CF3CCF3CCF3C", "$ c #51445144FFFF", "% c #9E79A2899E79", " ", " ", " .... ", " .XXXX. ", " .XooooX...... ", " .Xooo...XXXXO. ", " .Xoo.+++.oooO. ", " .Xo.+@@++.ooO. ", " .Xo.+@@++.ooO. ", " .Xo.+++++.ooO. ", " .Xo#.+++.#ooO. ", " .Xoo#...$$ooO. ", " .OOOOOOOO$$OO. ", " .........$$. ", " %% ", " "}; wanderlust-wanderlust-769699d/etc/icons/letter.xpm000066400000000000000000000006201406661363500223160ustar00rootroot00000000000000/* XPM */ static char * jmail_xpm[] = { "18 13 4 1", " s None c None", ". c gray85", "X c yellow", "o c black", " ", " ", " .XXXXXXXXXXX. ", " XoXXXXXXXXXoXoo", " XXoXXXXXXXoXXoo", " XXXoXXXXXoXXXoo", " XXX.oXXXo.XXXoo", " XXXo.oXo.oXXXoo", " XXoXXXoXXXoXXoo", " XoXXXXXXXXXoXoo", " .XXXXXXXXXXX.oo", " ooooooooooooo", " ooooooooooooo"}; wanderlust-wanderlust-769699d/etc/icons/local.xpm000066400000000000000000000010001406661363500221020ustar00rootroot00000000000000/* XPM */ static char * local_xpm[] = { "16 16 7 1", " c None", ". c #000000000000", "X c #FFFFFFFFFFFF", "o c #CF3CD34CCF3C", "O c #E79DE79DE79D", "+ c #C71BC30BC71B", "@ c #965896589658", " ", " ", " ......... ", " .XXXXXX.X. ", " .XXXXXX.XX. ", " .XXXXXX....o ", " .XXXXXXooo.o ", " .XXXXXXXXX.o ", " .XXXXXXXXX.o ", " .XXXXXXXXX.o ", " OOOOOOOOOOO+++ ", " O++++++++++@@@ ", " O++++++++++@@@ ", " O++++++++++@@@ ", " .............. ", " "}; wanderlust-wanderlust-769699d/etc/icons/localnews.xpm000066400000000000000000000007321406661363500230120ustar00rootroot00000000000000/* XPM */ static char * localnews_xpm[] = { "16 16 5 1", " c None", ". c #000000000000", "X c #BEFBB2CA69A6", "o c #FFFFFFFFFFFF", "O c #EFBEE38D8617", " ", " ", " ............. ", ".X.oooooooooo. ", ".X.oX.X...o.o. ", "..X.ooooooooo. ", ".X..o..X..X.Xo. ", " .XX.oooooo.oo. ", " ..X.oXXXooooo. ", " ..X.oXXX.o.o.o.", " .X.OOOOOOOOOo.", " ..OOOOOOOOOO. ", " ........... ", " ", " ", " "}; wanderlust-wanderlust-769699d/etc/icons/maildir.xpm000066400000000000000000000010021406661363500224330ustar00rootroot00000000000000/* XPM */ static char * maildir_xpm[] = { "16 16 7 1", " c None", ". c #000000000000", "X c #FFFFFFFFFFFF", "o c #CF3CD34CCF3C", "O c #DF7DD75C79E7", "+ c #BEFBB2CA69A6", "@ c #A6999E795965", " ", " ", " ......... ", " .XXXXXX.X. ", " .XXXXXX.XX. ", " .XXXXXX....o ", " .XXXXXXooo.o ", " .XXXXXXXXX.o ", " .XXXXXXXXX.o ", " .XXXXXXXXX.o ", " OOOOOOOOOOO+++ ", " O++++++++++@@@ ", " O++++++++++@@@ ", " O++++++++++@@@ ", " .............. ", " "}; wanderlust-wanderlust-769699d/etc/icons/multi.xpm000066400000000000000000000007531406661363500221600ustar00rootroot00000000000000/* XPM */ static char * multi_xpm[] = { "16 16 6 1", " c None", ". c #9E799A69FFFF", "X c #000000000000", "o c #FFFFEBADD75C", "O c #EFBEFFFFC71B", "+ c #FFFFFFFFFFFF", " ", " ........X ", " .oooooooX ", " .o......... ", " .o.OOOOOOOX ", " .o.O......... ", " .o.O.+++++++X ", " .o.O.+++++++X ", " .o.O.+.+..++X ", " .o.O.+++++++X ", " XX.O.+X+X.++X ", " .O.+++++XXX ", " XX.+++++X+X ", " .+++++XX ", " XXXXXXX ", " "}; wanderlust-wanderlust-769699d/etc/icons/news.xpm000066400000000000000000000007251406661363500220010ustar00rootroot00000000000000/* XPM */ static char * news_xpm[] = { "16 16 5 1", " c None", ". c #000000000000", "X c #9E799A699E79", "o c #FFFFFFFFFFFF", "O c #CF3CD34CCF3C", " ", " ", " ............. ", ".X.oooooooooo. ", ".X.oX.X...o.o. ", "..X.ooooooooo. ", ".X..o..X..X.Xo. ", " .XX.oooooo.oo. ", " ..X.oXXXooooo. ", " ..X.oXXX.o.o.o.", " .X.OOOOOOOOOo.", " ..OOOOOOOOOO. ", " ........... ", " ", " ", " "}; wanderlust-wanderlust-769699d/etc/icons/nmz.xpm000066400000000000000000000012771406661363500216340ustar00rootroot00000000000000/* XPM */ static char * namazu_xpm[] = { "16 16 16 1", " c None", ". c #104008200000", "X c #000000000000", "o c #BEFB71C638E3", "O c #30C224924103", "+ c #28A220812081", "@ c #1040104028A2", "# c #104010401040", "$ c #186110400820", "% c #9E79596528A2", "& c #AEBA69A630C2", "* c #CF3CAAAAAEBA", "= c #082008200820", "- c #38E324921040", "; c #49242CB21861", ": c #410338E330C2", " ", " ...X ", " XooooX ", " XoooooX ", " XoooooooX ", " XoooooooX ", " XXoXoooooO ", " XXoXooooo+ X", " XoooooXXooX XX", " @##$%.o&ooXXoX", " X****#ooooooooX", " X*****XXoooooX ", " XXXX+***=oooX ", " X******=-;ooX ", " ::::::X -o# ", " $# "}; wanderlust-wanderlust-769699d/etc/icons/no-letter.xpm000066400000000000000000000006201406661363500227300ustar00rootroot00000000000000/* XPM */ static char * jmail_xpm[] = { "18 13 4 1", " s None c None", ". c gray55", "o c black", "x c gray95", " ", " ", " ooooooooooooox ", " o.xxxxxxxxx.ox ", " oxox oxox ", " ox ox ox ox ", " ox ox ox ox ", " ox oxoxoxox ox ", " oxox ox oxox ", " o.x .ox ", " ooooooooooooox ", " xxxxxxxxxxxxxx ", " "}; wanderlust-wanderlust-769699d/etc/icons/opened.xpm000066400000000000000000000007271406661363500223010ustar00rootroot00000000000000/* XPM */ static char * opened_xpm[] = { "16 16 5 1", " c None", ". c #000000000000", "X c #9E798E3869A6", "o c #FFFFE38DB6DA", "O c #CF3CBAEA9658", " ", " ", " .... ", " .XXXX. ", " ....XX....... ", " .oooo.XXXXXXXX.", ".oOOOOo......XX.", ".oOOOOOoooooo.X.", " .oOOOOOOOOOO.X.", " .oOOOOOOOOOOO..", " .oOOOOOOOOOOO..", " .oOOOOOOOOOOO.", " .oOOOOOOOOOOO.", " ............ ", " ", " "}; wanderlust-wanderlust-769699d/etc/icons/pipe.xpm000066400000000000000000000010511406661363500217530ustar00rootroot00000000000000/* XPM */ static char * pipe_xpm[] = { "16 16 9 1", " c None", ". c #9E799E79FFFF", "X c #51445144FFFF", "o c #2081208169A6", "O c #00000000FFFF", "+ c #D75CD75CD75C", "@ c #FFFF00000000", "# c #FFFFFFFFFFFF", "$ c #A699A289A699", " ", " ", " .XXXo ", " .XXXo ", " .XXXo ", "O+@+O.XXXo@+O+@ ", "+####.XXXo####+$", "@##.XXXXXXXo##O$", "+###.XXXXXo###+$", "O####.XXXo####@$", "+#####.Xo#####+$", "@######o######O$", "+#############+$", "O+@+O+@+O+@+O+@$", " $$$$$$$$$$$$$$$", " "}; wanderlust-wanderlust-769699d/etc/icons/plugged.xpm000066400000000000000000000013511406661363500224500ustar00rootroot00000000000000/* XPM */ static char *plugged[] = { "32 16 8 1", " c None", ". c #a6caf0", "# c #8fa5cf", "a c #717171", "b c #5d5d97", "c c #8488ca", "d c #9f9f9f", "e c #7f8080", " ", " ", " ... ", " .ccb.... ", " accb####. ", " .accb#####.. ", " eeeeeeeeaccb#####.eeeeeeee ", " dddddddcaccb#####.dedddddd ", " dddddddcaccb#####.dedddddd ", " eeeeeeeeaccb#####.eeeeeeee ", " aaccb####aaa ", " accbaaaaa ", " aaaaaaaa ", " aaa ", " ", " " }; wanderlust-wanderlust-769699d/etc/icons/pop.xpm000066400000000000000000000007761406661363500216310ustar00rootroot00000000000000/* XPM */ static char * pop_xpm[] = { "16 16 7 1", " c None", ". c #DF7DD75C79E7", "X c #BEFBB2CA69A6", "o c #000000000000", "O c #A6999E795965", "+ c #61856595CF3C", "@ c #30C230C26185", " ", " ..... ", " .XXXXX. ", " .XXXXXXX.....o ", " .XXXXXXXXXXXOo ", " .XXXXXXXXXXXOo ", " .XXXXXXXXXXXOo ", " .XXXXXXXXXXXOo ", " .XXXXXXXXXXXOo ", " .OOOOOOOOOOOOo ", " oooooooooooooo ", " ", "++++@@....@@++++", " ++++ ", " ++ ", " +++++ "}; wanderlust-wanderlust-769699d/etc/icons/queue.xpm000066400000000000000000000010251406661363500221430ustar00rootroot00000000000000/* XPM */ static char * queue_xpm[] = { "16 16 8 1", " c None", ". c #69A68E38EFBE", "X c #000000000000", "o c #FFFFFFFFFFFF", "O c #CF3CD34CCF3C", "+ c #E79DCB2B9E79", "@ c #CF3CBAEA9658", "# c #9E798E3869A6", " . ", " ... ", " ..... ", " ....... ", " ... ", " XX...XXX ", " Xo...oXoX ", " Xo...oXXXO ", " XoooooOOXO ", " XoooooooXO ", " XoooooooXO ", " XoooooooXO ", " +++++++++++@@ ", " +@@@@@@@@@@## ", " +@@@@@@@@@@## ", " XXXXXXXXXXXXX "}; wanderlust-wanderlust-769699d/etc/icons/shimbun.xpm000066400000000000000000000010351406661363500224650ustar00rootroot00000000000000/* XPM */ static char *shimbun[] = { /* width height num_colors chars_per_pixel */ " 16 16 5 1", /* colors */ ". c None", "# c #000000", "a c #9ec29e", "b c #ffffff", "c c #b1f5a0", /* pixels */ "................", "................", ".#############..", "#a#bbbbbbbbbb#..", "#a#ba#a###b#b#..", "##a#bbbbbbbbb#..", "#a##b##a##a#ab#.", ".#aa#bbbbbb#bb#.", ".##a#baaabbbbb#.", ".##a#baaa#b#b#b#", "..#a#cccccccccb#", "..##cccccccccc#.", "...###########..", "................", "................", "................" }; wanderlust-wanderlust-769699d/etc/icons/trash-e.xpm000066400000000000000000000007261406661363500223710ustar00rootroot00000000000000/* XPM */ static char * trash_xpm[] = { "16 16 5 1", " c None", ". c #000000000000", "X c #BEFBBEFBBEFB", "o c #E79DE79DE79D", "O c #71C671C671C6", " ", " ....... ", " .XXXXXXX. ", " .XXXXXXXXX. ", " ..XXXXXXX.. ", " .o.......O. ", " .oXoXXXOXO. ", " .oXoXXXOXO. ", " .oXoXXXOXO. ", " .oXoXXXOXO. ", " .oXoXXXOXO. ", " .oXoXXXOXO. ", " .oXoXXXOXO. ", " .XoXXXOX. ", " ....... ", " "}; wanderlust-wanderlust-769699d/etc/icons/trash.xpm000066400000000000000000000007531406661363500221470ustar00rootroot00000000000000/* XPM */ static char * trash_xpm[] = { "16 16 6 1", " c None", ". c #000000000000", "X c #BEFBBEFBBEFB", "o c #F7DEF7DEF7DE", "O c #E79DE79DE79D", "+ c #71C671C671C6", " ...... ", " .XXXXXX.. ", " .XXXXXXX. ", " .o.....XXX. ", " ..ooooo.... ", " .O.......+. ", " .OXOXXX+X+. ", " .OXOXXX+X+. ", " .OXOXXX+X+. ", " .OXOXXX+X+. ", " .OXOXXX+X+. ", " .OXOXXX+X+. ", " .OXOXXX+X+. ", " .XOXXX+X. ", " ....... ", " "}; wanderlust-wanderlust-769699d/etc/icons/unplugged.xpm000066400000000000000000000013561406661363500230200ustar00rootroot00000000000000/* XPM */ static char *unplugged_xpm[] = { "32 16 8 1", " c None", ". c #f0caa6", "# c #cfa58f", "a c #717171", "b c #975d5d", "c c #ca8884", "d c tomato", "e c #80807f", " ", " ", " .. . ", " .cc b.... ", " accccc b####. ", " .accccc b#####.. ", " eeeeaccccc b#####.eeeee ", " dddcacc b#####.deddd ", " dddcacc b#####.deddd ", " eeeeaccccc b#####.eeeee ", " aaccccc b####aaa ", " accccc baaaaa ", " aaa aaaaa ", " aa a ", " ", " " }; wanderlust-wanderlust-769699d/etc/icons/wl-alpha-logo.xbm000066400000000000000000001351751406661363500234620ustar00rootroot00000000000000#define wl_alpha_logo_width 464 #define wl_alpha_logo_height 160 static char wl_alpha_logo_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0xaa, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x15,0x11,0x2a,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x8a,0x88,0x88,0x84,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x80,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x48,0x20,0x52,0x24,0x21,0x28,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x80,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x22,0x95,0x84,0x42,0x94,0x82,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x6d, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x90,0x14,0x02,0x21,0x14,0x41,0x28,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x76,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x81, 0x54,0x14,0x41,0x14,0x01,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x6b,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x2a,0x41,0xa2, 0x94,0x42,0xb8,0x44,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x7d,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xa2,0x90,0x14,0x09,0x22,0x10, 0x3e,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x80,0xb7,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x14,0x25,0xa2,0xa4,0x88,0x0a,0xbf,0x42, 0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0xdd,0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x14,0xa2,0x88,0x08,0x40,0x04,0xa0,0x3e,0x08,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa0,0x6b,0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x52,0x15,0x44,0x52,0x95,0xc2,0x1f,0xb8,0xa2,0x22,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0xbd, 0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, 0x94,0xa0,0x22,0x09,0x22,0xe8,0x9f,0x32,0x08,0x80,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0xd7,0x76,0x00, 0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x49,0x4a, 0x94,0xa0,0x80,0xd2,0x7f,0x70,0x82,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x7a,0x7b,0x00,0x00,0x00, 0x00,0x00,0xa0,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x24,0x25,0x01,0x15, 0xf8,0x04,0x3f,0xf5,0x28,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x6a,0xad,0x6d,0x00,0x00,0x00,0x00,0x00, 0x58,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x93,0x92,0x54,0x42,0xfe,0x23, 0xff,0xe0,0x02,0x25,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x40,0xbb,0x77,0x3b,0x00,0x00,0x00,0x00,0x00,0xac,0x2a, 0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x54,0x48,0x22,0x14,0xef,0x17,0xff,0xea, 0x50,0x80,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf8,0xd7,0xaa,0x3d,0x00,0x00,0x00,0x00,0x00,0xab,0x75,0x00,0x00, 0x00,0x00,0x00,0x40,0x15,0x49,0x25,0x49,0x89,0x8f,0x4f,0xfe,0xe1,0x84,0x14, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x56,0xbd,0xfd,0x36,0x00,0x00,0x00,0x00,0x80,0xaa,0x56,0x00,0x00,0x00,0x00, 0x00,0x00,0xa5,0x24,0x92,0x00,0x94,0x57,0x3f,0xce,0xcb,0x11,0x40,0x11,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x6d,0x6b, 0xab,0x3d,0x00,0x00,0x00,0x00,0x40,0xb5,0xea,0x00,0x00,0x00,0x00,0x00,0xa0, 0x92,0x52,0x09,0xf8,0xdf,0xc3,0x5f,0x9e,0xc3,0x44,0x05,0x24,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xbb,0xdd,0xdd,0x1e, 0x00,0x00,0x00,0x00,0x40,0x55,0xd5,0x00,0x00,0x00,0x00,0x00,0xa8,0x54,0x8a, 0x04,0xff,0xc0,0x01,0x58,0x59,0xcf,0x10,0x50,0x60,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0xed,0x76,0x6b,0x1b,0x00,0x00, 0x00,0x00,0xb0,0xaa,0xea,0x00,0x00,0x00,0x00,0x00,0x54,0x4a,0x51,0xe6,0x7f, 0xc0,0x01,0x78,0x3a,0xce,0x43,0x02,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7d,0xb7,0xad,0xdd,0x1e,0x00,0x00,0x00,0x00, 0x50,0x57,0xed,0x00,0x00,0x00,0x00,0x00,0x25,0xa5,0xcc,0xf3,0x3f,0xc0,0x00, 0x78,0x38,0xfd,0x0b,0x10,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0xd7,0x6d,0xf7,0x6e,0x0f,0x00,0x00,0x00,0x00,0x68,0xb5, 0x75,0x00,0x00,0x00,0x00,0x80,0x94,0x52,0xf2,0xf8,0x1f,0xc0,0x00,0x70,0xb8, 0xf8,0x23,0x85,0xa4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0, 0x01,0xb6,0xfa,0xde,0xad,0xb5,0x0f,0x00,0x00,0x00,0x00,0xa8,0xaa,0x6a,0x00, 0x00,0x00,0x00,0xa0,0x52,0x09,0x08,0xe0,0x0f,0xc0,0x00,0x70,0x30,0xf2,0x4b, 0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xfd,0xdd, 0xaf,0xb5,0x76,0xdb,0x06,0x00,0x00,0x00,0x00,0x54,0x55,0x75,0x00,0x00,0x00, 0x00,0x90,0xaa,0xc4,0x3f,0x00,0x0e,0xc0,0x01,0xf0,0x30,0xe0,0x03,0x09,0x25, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x57,0xf7,0xda,0xee, 0xdb,0xb6,0x07,0x00,0x00,0x00,0x00,0xdb,0x5a,0x75,0x00,0x00,0x00,0x00,0x48, 0x4a,0xf2,0x3f,0x00,0x0e,0xc0,0x01,0xe0,0x70,0xc0,0x27,0x40,0x80,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xfa,0x5d,0x77,0xbb,0xb6,0xed, 0x03,0x00,0x00,0x00,0x00,0x55,0xab,0x3a,0x00,0x00,0x00,0x00,0x50,0x25,0xf1, 0x7f,0x00,0x1c,0x80,0x01,0xe0,0x70,0xc0,0x8f,0x14,0x12,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x5f,0xef,0xdd,0x6d,0xef,0xde,0x01,0x00, 0x00,0x00,0x00,0x6d,0x55,0x3b,0x00,0x00,0x00,0x00,0x4a,0xa9,0xfb,0x7c,0x00, 0x18,0x80,0x01,0xe0,0xf0,0xc0,0x27,0x40,0x40,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x80,0xea,0x75,0x77,0xdb,0xba,0xf5,0x00,0x00,0x00,0x00, 0x40,0xab,0x6a,0x1d,0x00,0x00,0x00,0x00,0xaa,0xd4,0x39,0x78,0x00,0x18,0x80, 0x03,0xe0,0xf0,0x81,0x87,0x0a,0x09,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xbf,0xbe,0xdd,0xee,0x6d,0x77,0x00,0x00,0x00,0x00,0xa0,0xd5, 0x56,0x1d,0x00,0x00,0x00,0x80,0x02,0xf2,0x1c,0x70,0x00,0x38,0x00,0x07,0xe0, 0xf8,0x03,0x10,0x20,0x20,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xea,0xd7,0xb6,0x5b,0xb7,0x3d,0x00,0x00,0x00,0x00,0x40,0xad,0xaa,0x0e, 0x00,0x00,0x00,0x00,0xf0,0x3d,0x1c,0x20,0x00,0x38,0x00,0x07,0xf0,0xf8,0x03, 0x44,0x82,0x04,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbf, 0xfa,0xef,0xee,0xda,0x1e,0x00,0x00,0x00,0x00,0xb0,0xd5,0x5a,0x0f,0x00,0x00, 0x00,0x00,0xff,0x1f,0x1c,0x00,0x00,0x38,0x00,0x0e,0x70,0xf8,0x00,0x10,0x10, 0x90,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xea,0xaf,0xba, 0x75,0xb7,0x0f,0x00,0x00,0x00,0x00,0xd0,0x5a,0xab,0x07,0x00,0x00,0x00,0xc0, 0xff,0x07,0x1c,0x00,0x00,0x30,0x00,0x3c,0x38,0x00,0x00,0x40,0x45,0x02,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x7a,0x6f,0xaf,0xed, 0x07,0x00,0x00,0x00,0x00,0x68,0xad,0xaa,0x03,0x00,0x00,0x00,0xe0,0xdf,0x0f, 0x3c,0x00,0x00,0x70,0x00,0x7c,0x3e,0x00,0x00,0x00,0x00,0x20,0x19,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0xdf,0xf5,0xfa,0xf6,0x01,0x00, 0x00,0x00,0x00,0x58,0x6b,0xd5,0x01,0x00,0x00,0x00,0xe8,0xef,0x0e,0xf8,0x7f, 0x00,0x70,0x00,0xf8,0x1f,0x00,0x00,0x20,0x29,0x09,0x18,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xea,0xae,0xaf,0xfd,0x00,0x00,0x00,0x00, 0x00,0x6e,0xad,0xf6,0x00,0x00,0x00,0xf8,0xd7,0x7b,0x1c,0xf0,0xff,0x00,0x70, 0x00,0xe0,0x0f,0x00,0x00,0x40,0x40,0x40,0x1a,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x50,0xbf,0x7b,0x75,0x3f,0x00,0x00,0x00,0x00,0x00,0xa8, 0x6a,0x75,0x00,0x00,0x00,0xff,0xab,0x1f,0x1c,0xe0,0xff,0x01,0xf0,0x00,0x00, 0x07,0x00,0x00,0x00,0x0a,0x09,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf0,0xd5,0xdd,0xae,0x0f,0x00,0x00,0x00,0x00,0x00,0xb7,0xad,0x3a, 0x00,0x00,0xe0,0xff,0x57,0x0f,0x0c,0x00,0xff,0x03,0xe0,0x3f,0x00,0x00,0x00, 0x00,0x80,0x20,0x80,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x40,0xff,0xb6,0xf7,0x03,0x00,0x00,0x00,0x00,0x80,0x5a,0xb5,0x1d,0x00,0x00, 0xf0,0xcf,0xaf,0x06,0x0e,0x00,0x80,0x03,0xf0,0x3f,0x00,0x00,0x00,0x00,0x00, 0x04,0x25,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x55, 0xef,0xda,0x01,0x00,0x00,0x00,0x00,0x80,0xaa,0xd5,0x0e,0x00,0xc0,0xf9,0x21, 0xd7,0x0e,0x0f,0x00,0x00,0x03,0xf8,0x1f,0x00,0x00,0x00,0x00,0x00,0x41,0x00, 0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x5b,0x7f, 0x00,0x00,0x00,0x00,0x00,0x40,0xdb,0x56,0x07,0x00,0xf8,0xe1,0x41,0xef,0x9e, 0x0f,0x00,0x00,0x07,0xfc,0x0f,0x00,0x00,0x00,0x00,0x00,0x10,0x29,0x35,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0xfd,0x3a,0x00,0x00, 0x00,0x00,0x00,0x40,0xad,0xda,0x03,0x00,0xfc,0xc1,0x51,0x75,0xfc,0x0f,0x00, 0x00,0x03,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x3a,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xaf,0x1f,0x00,0x00,0x00,0x00, 0x00,0x40,0x6b,0xeb,0x01,0x30,0xfc,0x80,0x15,0x3d,0xfc,0x0f,0xe0,0x80,0x03, 0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x92,0x35,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x07,0x00,0x00,0x00,0x00,0x00,0xb0, 0xb5,0xfa,0x00,0x3e,0xf0,0x80,0xc7,0x1e,0x3c,0x0f,0xe0,0xc1,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x02,0x40,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x94,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xdc,0x07,0x00,0x00,0x00,0x00,0x00,0x50,0xad,0x3d, 0x80,0x3f,0xe0,0x80,0xe3,0x0f,0x18,0x1e,0xc0,0xc3,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa8,0x44,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa2,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xee,0x01,0x00,0x00,0x00,0x00,0x00,0xe8,0xb6,0x1e,0x80,0x1f, 0xe0,0x80,0xff,0x07,0x18,0x3c,0xc0,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa0,0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x88,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf5,0x01,0x00,0x00,0x00,0x00,0x00,0xa8,0xaa,0x0f,0x80,0x1f,0xe0,0x80, 0xff,0x03,0x38,0x78,0xc0,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48, 0x52,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x68,0xdb,0x03,0x00,0x3e,0xe0,0x80,0xff,0x03, 0x38,0xf0,0x83,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x75, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x92,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x75,0x00,0x00, 0x00,0x00,0x00,0x00,0xb4,0xed,0x01,0x00,0x3c,0xe0,0x00,0xef,0x21,0x30,0xe0, 0x87,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa4,0x52,0x35,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x3f,0x00,0x00,0x00,0x00, 0x00,0x00,0x5a,0xf5,0x00,0x00,0x70,0xe0,0xa0,0x7e,0x30,0xf8,0xc0,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x35,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xa0,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x1d,0x00,0x00,0x00,0x00,0x00,0x00, 0x6c,0x6b,0x00,0x00,0xf0,0xe0,0x50,0x3e,0x30,0xf0,0x81,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xa4,0x3a,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xf0,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x7d, 0x00,0x00,0xe0,0xe1,0xa0,0x1e,0x70,0xf8,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x55,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa0,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18, 0x00,0x00,0x00,0xa8,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x35,0x00,0x00, 0xc0,0xe1,0x50,0x0d,0x70,0xf8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x28,0xaa,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0xe8, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x1c,0x00,0x00, 0x00,0xf8,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x3b,0x00,0x00,0xc0,0xe1, 0x54,0x0d,0x70,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x55,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xe5,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0xd4, 0x03,0x00,0x00,0x00,0x00,0x00,0xc0,0xbf,0x1d,0x00,0x00,0x80,0x61,0xa8,0x1d, 0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0xaa, 0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x60,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,0x00,0x00,0xfa,0x01,0x00, 0x00,0x00,0x00,0x00,0xc0,0xff,0x1e,0x00,0x00,0x80,0x67,0xaa,0xfd,0x7f,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0xaa,0x1e,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x7a,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x42,0x06,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0x00, 0x00,0xc0,0xc0,0x7f,0x0d,0x00,0x00,0x00,0x7f,0xd5,0xfc,0x1f,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x55,0x0d,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x12,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x00,0x00,0xf8, 0xb1,0xff,0x0f,0x00,0x00,0x00,0xfe,0x6a,0xfe,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0xaa,0x0e,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x88,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x03,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x00,0x00,0xf8,0xd5,0xfc, 0x0e,0x00,0x00,0x00,0xfc,0x75,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x48,0x55,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8, 0x01,0x00,0x00,0xc0,0x3f,0x00,0x00,0x00,0x00,0x70,0xf8,0x6c,0xfd,0x07,0x00, 0x00,0x00,0xfc,0x75,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x55,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x08, 0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe1,0x00,0x00, 0x00,0x40,0x1d,0x00,0x00,0x00,0x00,0x7e,0xf0,0xb7,0x9c,0x07,0x00,0x00,0x00, 0xf8,0x3a,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x92,0x2a,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa2,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xc0, 0x0f,0x00,0x00,0x00,0x00,0x7e,0xe0,0xaa,0xed,0x07,0x00,0x00,0x00,0xf8,0x1d, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0, 0xaa,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x30,0x00,0x00,0x00,0xf0,0x0e,0x00, 0x00,0x00,0x00,0x7f,0xe0,0x77,0x3c,0x07,0x00,0x00,0x00,0x70,0x1d,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x95,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xca,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x90,0x01,0x00,0x00,0x3a,0x00,0x00,0x00,0xb0,0x07,0x00,0x00,0x80, 0x07,0x7c,0xc8,0xae,0x4e,0x0f,0x00,0x00,0x00,0xa0,0x0e,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x85,0x01,0x00,0x00, 0x00,0x00,0xa0,0x00,0x00,0x80,0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc0,0x01,0x00,0x10,0x1c,0x00,0x00,0x00,0xd8,0x03,0x00,0x00,0xf0,0x1f,0x78, 0xd4,0xd7,0x3e,0x1f,0x00,0x00,0x00,0x50,0x07,0x00,0x00,0x38,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0xd2,0x01,0x00,0x50,0x01,0x00, 0xa8,0x01,0x00,0x20,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x00, 0x00,0x00,0x0e,0x00,0x00,0x00,0xf4,0x03,0x00,0x00,0xfc,0x3f,0x60,0xda,0x75, 0xfd,0x1f,0x00,0x00,0x00,0xa0,0x07,0x00,0x00,0x56,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xac,0xe2,0x00,0x00,0x24,0x0d,0x00,0xe4,0x01, 0x00,0x80,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0x00,0x00,0x00, 0x07,0x00,0x00,0x00,0xde,0x01,0x00,0x00,0xfe,0xfc,0xe0,0xc4,0xaf,0xfc,0x3f, 0x00,0x00,0x00,0xac,0x03,0x00,0x00,0xec,0x00,0x00,0x00,0x18,0x00,0x00,0x00, 0x00,0x00,0x40,0x15,0x54,0xe1,0x00,0x80,0xaa,0x1a,0x00,0xe9,0x00,0x00,0x28, 0x39,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x80,0x40,0x00,0x90,0x48,0x03,0x00, 0x00,0x00,0xf5,0x00,0x00,0x00,0x3e,0xf8,0xe0,0xf6,0x57,0xfe,0x3f,0x00,0x00, 0x00,0xa8,0x03,0x00,0x00,0xbb,0x01,0x00,0x00,0x6a,0x00,0x00,0x00,0x00,0x00, 0xd8,0x0f,0x56,0x68,0x00,0x40,0x52,0x19,0x80,0x64,0x00,0x00,0x40,0x1e,0x00, 0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xff,0x00,0x00,0x00,0x3e,0xe0,0xe0,0xff,0xeb,0xbe,0x70,0x00,0x00,0x00,0xd4, 0x01,0x00,0xbf,0xed,0x01,0x00,0x80,0xed,0x00,0x00,0x00,0x00,0x80,0xf6,0x00, 0x29,0x71,0x00,0xa0,0x2b,0x1d,0x00,0x2a,0x00,0x00,0x90,0x0e,0x00,0x80,0xd2, 0x00,0x00,0x00,0x00,0x40,0x42,0x01,0x24,0x09,0x00,0x0f,0x00,0x80,0x6a,0x00, 0x00,0x00,0x3c,0xe0,0xe0,0xff,0x5f,0xde,0xf1,0x01,0x00,0x00,0xea,0x00,0xf0, 0xfa,0xf6,0x01,0x00,0x80,0x76,0x00,0x2c,0x00,0x00,0xa0,0x1e,0x00,0x2d,0x34, 0x00,0xd4,0xa9,0x1a,0xc0,0x52,0x01,0x00,0x20,0x07,0x00,0x40,0xe0,0x00,0x00, 0x15,0x00,0x10,0x10,0x02,0x00,0x80,0xf0,0x03,0x00,0x80,0x7f,0x00,0x1f,0x00, 0x30,0xc0,0xec,0x9f,0xb7,0xae,0xf1,0x03,0x00,0x00,0xea,0x00,0xac,0xc7,0xdb, 0x00,0x00,0x60,0x7b,0x00,0xd7,0x00,0x00,0xa0,0x07,0x80,0x92,0x38,0x00,0x64, 0x40,0x1d,0x20,0x4a,0x02,0x00,0xc8,0x03,0x00,0x80,0x6a,0x00,0x40,0x30,0x00, 0x40,0x42,0x06,0xf0,0x70,0x7f,0x00,0x00,0xe0,0x3a,0xe0,0x1f,0x00,0x30,0xc0, 0xd6,0x03,0xd6,0xdc,0xf1,0x03,0x00,0x00,0x75,0x00,0xfb,0x80,0x7e,0x00,0x00, 0xd0,0x75,0xc0,0xfa,0x00,0x00,0xd8,0x03,0x00,0x0a,0x1c,0x00,0x1a,0xb0,0x0e, 0xa0,0x29,0x19,0x00,0xe4,0x01,0x00,0x20,0x70,0x00,0x10,0x3a,0x00,0x00,0x08, 0x04,0x00,0x30,0x00,0x00,0x00,0xa0,0x3f,0xe0,0x1f,0x00,0x70,0xe0,0xcd,0xc3, 0x6e,0x7e,0xf3,0x01,0x00,0x00,0x75,0xc0,0x7d,0xc0,0x55,0x00,0x00,0xb0,0x3e, 0x40,0xab,0x01,0x00,0xee,0x01,0x80,0x45,0x0e,0x80,0x0e,0x00,0x07,0x40,0x4a, 0x35,0x00,0x72,0x00,0x00,0x48,0x3d,0x00,0x40,0x19,0x00,0x40,0x81,0x0c,0x00, 0x3a,0x00,0x00,0x00,0xf0,0x1a,0xe0,0x0f,0x00,0x60,0xf0,0xfb,0x41,0x5e,0x7e, 0x23,0x00,0x00,0x80,0x3a,0xa0,0x1e,0x80,0xee,0x01,0x00,0x6c,0x1b,0xb0,0xd5, 0x01,0x00,0xe9,0x00,0x80,0x12,0x0e,0x80,0x0e,0xe8,0x03,0x20,0xa5,0x34,0x00, 0x38,0x00,0x00,0x20,0x1e,0x00,0x10,0x1c,0x00,0x20,0x24,0x08,0x00,0x18,0x00, 0x00,0x00,0x50,0x1c,0xc0,0x07,0x00,0xe0,0xfc,0xbe,0x83,0x0e,0xff,0x06,0x00, 0x00,0x80,0x3a,0xe8,0x1f,0x00,0x5b,0x03,0x00,0xb8,0x1d,0xd0,0xbe,0x01,0x80, 0x76,0x00,0x40,0x01,0x07,0x40,0x07,0xd4,0x01,0xd0,0x52,0x3a,0x00,0x3a,0x00, 0x00,0x88,0x07,0x00,0x44,0x0f,0x00,0x08,0x00,0x19,0x80,0x1c,0x00,0x00,0x00, 0x0c,0x1f,0x80,0x0f,0x00,0xe0,0x7f,0x8f,0x43,0xfe,0xff,0x06,0x00,0x00,0x00, 0x1d,0xbc,0x0e,0x00,0xbd,0x07,0x00,0xd6,0x0e,0xbc,0xd2,0x01,0x80,0x7a,0x00, 0xa0,0x49,0x03,0x40,0x03,0xf1,0x00,0x04,0x28,0x1d,0x00,0x1d,0x00,0x00,0xd2, 0x03,0x00,0x88,0x07,0x80,0x00,0x24,0x18,0x00,0x0c,0x00,0x00,0x00,0xe4,0x0f, 0x00,0x0e,0x00,0xe0,0xdf,0x07,0x83,0xfe,0x6f,0x0d,0x00,0x00,0x40,0x1d,0xea, 0x07,0x80,0xe9,0x06,0x00,0x7b,0x0f,0xf0,0xae,0x01,0x40,0x35,0x00,0x40,0x82, 0x03,0xa0,0x23,0x3d,0x00,0x00,0x90,0x0e,0x00,0x0c,0x00,0x00,0xe4,0x00,0x00, 0xc1,0x01,0x00,0x00,0x80,0x1c,0x40,0x0e,0x00,0x00,0x00,0xf4,0x1f,0x00,0x0e, 0x00,0xc0,0xff,0x03,0x47,0xfe,0xaa,0x0d,0x00,0x00,0xa0,0x0d,0xbe,0x06,0x40, 0xbc,0x0e,0x00,0xad,0x07,0x49,0xdb,0x01,0xa0,0x3b,0x00,0xb0,0xd0,0x01,0x90, 0xca,0x0f,0x00,0x00,0x40,0x07,0x00,0x0d,0x00,0x00,0x71,0x00,0x00,0xe8,0x00, 0x00,0x00,0x10,0x18,0x00,0x06,0x00,0x00,0x00,0xfb,0x1f,0x00,0x1e,0x00,0xc0, 0xd7,0x01,0x8f,0x5f,0xdb,0x1a,0x00,0x00,0xa0,0x0e,0xea,0x07,0x40,0xd0,0x0f, 0x80,0xd6,0x06,0x00,0xb5,0x01,0x50,0x35,0x00,0xd4,0xc4,0x00,0x50,0xff,0x00, 0x00,0x00,0xb0,0x03,0x00,0x0d,0x00,0x00,0x74,0x00,0x00,0x72,0x00,0x00,0x00, 0x40,0x0e,0x20,0x06,0x00,0x00,0x00,0xef,0x3f,0x00,0x1c,0x00,0xc0,0x7f,0x80, 0x5f,0xb5,0x6d,0x17,0x00,0x00,0xa0,0x8e,0x7f,0x07,0x20,0x68,0x0d,0x00,0xbb, 0x07,0x80,0xad,0x01,0xd0,0x3a,0x00,0x52,0xe1,0x00,0xc8,0x03,0x00,0x00,0x00, 0xc8,0x01,0x80,0x08,0x00,0x00,0x31,0x00,0x40,0x31,0x00,0x00,0x00,0x00,0x0c, 0x00,0x06,0x00,0x00,0x80,0x3a,0x3f,0x00,0x1c,0xc0,0xb8,0x3b,0x80,0x9f,0x6d, 0xb5,0x3a,0x00,0x00,0x40,0x87,0xaa,0x07,0x10,0xbc,0x0f,0xc0,0xd6,0x03,0x80, 0xd6,0x01,0x60,0x6d,0x00,0x52,0x75,0x00,0xa8,0x01,0x00,0x00,0x00,0xe0,0x00, 0x40,0x15,0x00,0x40,0x34,0x00,0x00,0x34,0x00,0x00,0x00,0x80,0x0e,0x88,0x04, 0x00,0x00,0x80,0x6f,0x7f,0x00,0x1c,0xc0,0x94,0x0f,0x80,0x8f,0xb6,0x56,0x6b, 0x00,0x00,0x60,0x87,0xff,0x06,0x0c,0xd4,0x0e,0x90,0x6d,0x03,0x00,0x7b,0x03, 0xac,0x55,0x80,0xa9,0x3a,0x00,0x50,0x03,0x00,0x40,0x00,0x74,0x00,0x08,0x22, 0x00,0x00,0x42,0x00,0xa0,0x32,0x00,0x00,0x00,0x00,0x07,0x00,0x0c,0x00,0x00, 0xc0,0x5a,0xff,0x00,0x1c,0xc0,0xbb,0x03,0x00,0x00,0xd5,0xbb,0x6d,0x00,0x00, 0xb0,0xc3,0x55,0x0f,0x15,0x7a,0x0f,0x48,0xb7,0x07,0x80,0x95,0x03,0xb1,0xaa, 0x69,0xa1,0x1a,0x00,0xaa,0x06,0x00,0x20,0x00,0x68,0x00,0x60,0x09,0x00,0x40, 0xd1,0x00,0x08,0x24,0x00,0x88,0x0a,0x20,0x03,0x48,0x10,0x00,0x00,0xa0,0x7f, 0xff,0x01,0x18,0xc0,0x97,0x3f,0x00,0x00,0x5b,0x55,0xd5,0x00,0x00,0x98,0x83, 0xfe,0xf5,0x0b,0xac,0x05,0xf3,0x5a,0x15,0x00,0xed,0x42,0xd9,0xb6,0xaa,0xd8, 0x2a,0x80,0x90,0x0a,0x00,0x88,0x00,0x65,0x80,0x1a,0x54,0x01,0x10,0x0a,0x00, 0xa2,0x40,0x80,0x04,0x18,0x80,0x03,0x00,0x01,0x00,0x08,0xe0,0x2a,0xd7,0x03, 0x38,0xc0,0x9b,0x7f,0x00,0x00,0xad,0xda,0xb6,0x01,0x00,0xd0,0xe3,0x57,0x5f, 0x07,0x77,0xef,0x4c,0xef,0x0e,0x80,0x56,0xad,0xaf,0xda,0xea,0x52,0x55,0x55, 0x56,0x25,0x00,0x42,0x40,0x6a,0x00,0x8e,0x42,0x14,0xa0,0x50,0x05,0x0c,0x14, 0xa0,0x41,0x12,0xc0,0x01,0x10,0x10,0x00,0x07,0xb0,0x7f,0xcf,0x03,0x38,0xd0, 0xdd,0x3f,0x00,0x00,0xf6,0x6d,0xab,0x01,0x00,0xa8,0xa1,0xfa,0xea,0x83,0xda, 0xaa,0xa7,0xb5,0x07,0x80,0x75,0xd7,0x6b,0x4b,0x75,0xa8,0xaa,0xaa,0x53,0xaa, 0xaa,0x3c,0x00,0x55,0xa9,0x47,0x91,0x42,0x3d,0x0a,0x50,0xaf,0x42,0xe5,0x00, 0x30,0xc8,0x00,0x00,0x02,0x80,0x03,0xd0,0x2a,0xef,0x07,0x70,0xce,0xdf,0x07, 0x00,0x00,0x98,0x56,0x6d,0x03,0x00,0xd4,0xe1,0xaf,0xff,0x01,0x6f,0xff,0x61, 0xbb,0x03,0x00,0xae,0xfa,0x50,0xb5,0x3a,0x52,0xab,0xea,0xa9,0xa9,0x92,0x1e, 0x40,0x91,0xca,0x03,0x2a,0x28,0x4e,0x51,0xa5,0x13,0x10,0x70,0x50,0x29,0x60, 0x00,0x48,0x40,0xe4,0x01,0x70,0x7f,0xff,0x0f,0x70,0xe0,0x0f,0x00,0x00,0x00, 0x68,0xbb,0xb5,0x06,0x00,0xd4,0xa1,0xfa,0xea,0xc0,0xf5,0xea,0xc0,0xd6,0x01, 0x00,0xd5,0x75,0xb0,0xad,0x9d,0x50,0x55,0xf5,0x50,0x55,0x55,0x0f,0xa0,0x4a, 0xe4,0x41,0x41,0x85,0x07,0x84,0xc8,0x41,0x45,0x3d,0x00,0x40,0x30,0x00,0x00, 0x08,0x70,0x00,0xd8,0x2b,0xff,0x1f,0xf0,0xff,0x03,0x00,0x00,0x00,0xb0,0x55, 0xad,0x0d,0x00,0xea,0xc0,0xaf,0x3f,0x80,0xae,0x3f,0xa0,0xed,0x00,0x00,0xbb, 0x3e,0x50,0xb5,0x0e,0xaa,0xaa,0x7a,0xa0,0x4a,0xaa,0x07,0x20,0x29,0x73,0x00, 0x14,0xd0,0x83,0x22,0xe4,0x20,0x10,0x0e,0x20,0x25,0x1d,0x00,0x20,0x02,0x3c, 0x00,0x78,0x7d,0xff,0x1f,0xf2,0xff,0x01,0x00,0x00,0x00,0x50,0xed,0x56,0x0d, 0x00,0xd4,0x80,0xfa,0x1e,0xc0,0xdb,0x1e,0x60,0x7b,0x00,0x00,0xd5,0x1e,0xd0, 0xaa,0xa7,0x50,0x55,0x3d,0x40,0xa9,0xd2,0x01,0xa0,0xa4,0x3c,0x00,0xa2,0xea, 0x00,0x48,0x79,0x00,0x85,0x07,0x00,0x00,0x0e,0x00,0x80,0x80,0x0e,0x00,0xd4, 0x2f,0x7f,0xfd,0xf9,0x7f,0x00,0x00,0x00,0x00,0xe0,0x56,0xeb,0x1a,0x00,0xea, 0x80,0xaf,0x07,0x80,0xf6,0x07,0xc0,0x3d,0x00,0x00,0xae,0x07,0x60,0xed,0x0b, 0xbc,0xaa,0x0e,0x80,0x2a,0xf5,0x00,0x40,0x95,0x1e,0x00,0x14,0x79,0x00,0x12, 0x1e,0x80,0xe0,0x03,0x40,0xc9,0x07,0x00,0x00,0x90,0x07,0x00,0x7c,0x75,0xd7, 0x3d,0xfb,0x3f,0x00,0x00,0x00,0x00,0x40,0x6b,0x35,0x37,0x00,0x75,0x00,0xfa, 0x01,0x80,0xfb,0x01,0x80,0x1e,0x00,0x00,0xf4,0x03,0x80,0xf6,0x40,0x9d,0xd5, 0x07,0x00,0x55,0x3d,0x00,0x80,0x54,0x0f,0x00,0x88,0x1e,0x00,0xa2,0x0f,0x00, 0xfa,0x00,0x00,0xe0,0x01,0x00,0x00,0xe2,0x01,0x00,0xa8,0x3f,0x7f,0xf9,0xfd, 0x0e,0x00,0x00,0x00,0x00,0x80,0xb5,0xad,0x29,0x00,0x6a,0x00,0x00,0x00,0x00, 0x3e,0x00,0x80,0x0f,0x00,0x00,0xf8,0x00,0x00,0x3f,0x14,0x0e,0xfe,0x01,0x00, 0xa6,0x0f,0x00,0x00,0xca,0x03,0x00,0xe0,0x03,0x00,0xf8,0x01,0x00,0x3e,0x00, 0x00,0x7e,0x00,0x00,0x00,0x7f,0x00,0x00,0xfc,0x6a,0xd7,0xfd,0xd7,0x07,0x00, 0x00,0x00,0x00,0x80,0xae,0xb6,0x6e,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x07,0x00,0x00,0x00,0xf0,0x01, 0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x3f,0xf7,0xfe,0xfb,0x01,0x00,0x00,0x00, 0x00,0x00,0x6a,0xd5,0xb2,0x00,0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0xd0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfc,0x95,0x5f,0x7b,0x7d,0x00,0x00,0x00,0x00,0x00,0x00, 0xaa,0x56,0xcd,0x81,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xac,0xbe,0xff,0xdf,0x3f,0x00,0x0c,0x03,0x00,0x00,0x00,0xd7,0x5a, 0x35,0x03,0x35,0x00,0x00,0x00,0x00,0x18,0x1c,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00, 0x00,0xc0,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf4,0x97,0xbf,0x6a,0x0f,0x00,0x08,0xe1,0xef,0x1f,0x80,0x53,0xe7,0xea,0xf2, 0x7f,0x10,0xfe,0xf8,0x00,0x38,0x1c,0xfe,0x70,0xe0,0xc0,0x00,0x03,0x7f,0x10, 0x7a,0x90,0x7f,0xfe,0xf8,0xc0,0x0f,0x03,0x0e,0x7f,0x00,0xc6,0x30,0x04,0x40, 0x00,0x82,0xc0,0x80,0x83,0x83,0x3f,0x86,0x00,0x00,0x00,0x00,0x00,0xb8,0xfa, 0xdf,0xff,0x03,0x00,0x98,0x20,0x02,0x07,0x80,0x54,0x57,0x3a,0x87,0x70,0x10, 0x22,0x28,0x01,0x38,0x06,0x02,0xac,0x58,0xc1,0xc1,0x0d,0x49,0x40,0xdb,0x10, 0x0c,0x92,0x28,0x63,0x80,0x83,0x1b,0x49,0x00,0x83,0x31,0x04,0x40,0x00,0xc2, 0xe0,0xe0,0x46,0x8c,0x24,0x86,0x00,0x00,0x00,0x00,0x00,0xdc,0x5f,0x75,0xf5, 0x00,0x00,0xd0,0x20,0x00,0x03,0x80,0x44,0xd5,0x0c,0x8a,0x71,0x10,0x02,0x08, 0x01,0x48,0x1a,0x02,0x04,0x08,0x40,0x21,0x00,0x01,0x14,0x43,0x11,0x0c,0x02, 0x08,0x23,0x80,0xc2,0x00,0x01,0x00,0x01,0x51,0x04,0xc0,0x07,0xc6,0xa1,0x30, 0x40,0x80,0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0xb0,0xea,0xdf,0x3f,0x00,0x00, 0x60,0xe0,0x03,0x03,0xc0,0x4c,0x49,0x4d,0x9b,0xd8,0x1f,0x3e,0xf8,0x01,0x58, 0x0b,0x3e,0x78,0xf0,0x20,0x21,0x00,0x1f,0xa1,0x43,0x13,0x0c,0x3e,0xf8,0xe1, 0x83,0x44,0x00,0x1f,0x00,0x01,0x91,0x04,0x40,0x06,0xa4,0x20,0x11,0xc0,0x83, 0x0f,0x92,0x00,0x00,0x00,0x00,0x00,0xe0,0x7f,0x75,0x0f,0x00,0x00,0x20,0x20, 0x01,0x03,0xc0,0x8f,0x75,0xa4,0xb6,0x5a,0x00,0x12,0xc8,0x40,0xd8,0x19,0x2a, 0x80,0x01,0xa3,0x22,0x0e,0x13,0xe4,0x43,0x16,0x0c,0x16,0x88,0x20,0xc0,0x44, 0x00,0x0b,0x00,0x81,0x11,0x05,0x40,0x00,0xaa,0x30,0x11,0x00,0x8d,0x09,0xa2, 0x00,0x00,0x00,0x00,0x00,0xa0,0xaa,0xff,0x01,0x00,0x00,0x20,0x20,0x00,0x03, 0x60,0x00,0x6b,0x8d,0xc2,0x58,0x10,0x02,0x88,0x28,0x99,0x18,0x02,0x00,0x01, 0xb2,0x22,0x08,0x01,0x71,0x42,0x18,0x0c,0x02,0x88,0x21,0x40,0xce,0x10,0x01, 0x00,0x83,0x10,0x07,0x40,0x00,0x98,0x90,0x33,0x04,0x88,0x00,0xe2,0x00,0x00, 0x00,0x00,0x00,0x80,0xff,0x3e,0x00,0x00,0x00,0x20,0xe0,0x0f,0x03,0x20,0x10, 0x48,0xfa,0xb3,0x5a,0x10,0xfe,0x08,0xa1,0x8a,0x18,0xfa,0xdc,0xb8,0x11,0xc4, 0x0d,0x7f,0x3c,0x42,0x08,0x0c,0xfe,0x08,0x61,0x20,0x88,0x1f,0x7f,0x00,0xfc, 0x10,0x06,0x40,0x1f,0x92,0x09,0xe2,0xc7,0x8d,0x3f,0xc2,0x00,0x00,0x00,0x00, 0x00,0x00,0xfe,0x03,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x00,0x00,0xaa,0x04, 0xc8,0x18,0x10,0x40,0x00,0xaa,0x0a,0x00,0x24,0x50,0xa0,0x00,0x80,0x00,0x21, 0x0f,0x02,0x10,0x00,0x90,0x00,0x00,0x00,0x00,0x04,0x48,0x00,0x00,0x00,0x00, 0x80,0x08,0x00,0x00,0x00,0x01,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x34,0x54,0x1e, 0x00,0x00,0x00,0x29,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0xd7,0x55,0x0d,0x00,0x00, 0x00,0x54,0x55,0x0a,0x00,0x00,0x00,0x00,0x00,0x20,0xe5,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x29,0x55,0x0d,0x00,0x00,0x00,0xa5, 0x4a,0x15,0x00,0x00,0x00,0x00,0x00,0x80,0x78,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0xad,0x55,0x0d,0x00,0x00,0x80,0x2a,0x29,0x29, 0x00,0x00,0x00,0x00,0x00,0x2a,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6a,0xad,0x0e,0x00,0x00,0x00,0x52,0xa5,0x64,0x00,0x00, 0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x54,0x55,0x0d,0x00,0x00,0x80,0x2a,0x55,0x55,0x00,0x00,0x00,0x00, 0x80,0xea,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x58,0xb5,0x0d,0x00,0x00,0x00,0xaa,0xaa,0xaa,0x00,0x00,0x00,0x00,0x48,0xf8, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0xaa, 0x1a,0x00,0x00,0x00,0x92,0x24,0x49,0x01,0x00,0x00,0x00,0x90,0x3e,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x56,0x15,0x00, 0x00,0x00,0xaa,0xaa,0xa4,0x02,0x00,0x00,0x00,0x85,0x0f,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0xaa,0x3a,0x00,0x00,0x00, 0x54,0x55,0x55,0x0a,0x00,0x00,0xa4,0xf0,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x6b,0x00,0x00,0x00,0x20,0x49, 0x95,0x12,0x00,0x90,0x10,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x6a,0x00,0x00,0x00,0x40,0x55,0x52,0x4a, 0x4a,0x22,0xc5,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6a,0xd5,0x00,0x00,0x00,0x80,0xaa,0x4a,0x55,0x21,0x89, 0xf8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa8,0xd5,0x00,0x00,0x00,0x00,0x4c,0x29,0x91,0x9a,0x52,0x1f,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x50,0xad,0x01,0x00,0x00,0x00,0xe0,0xa5,0x4a,0x44,0xf8,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0xb5, 0x01,0x00,0x00,0x00,0x00,0xfc,0xaa,0xfa,0x1f,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0xaa,0x03,0x00, 0x00,0x00,0x00,0x00,0xf8,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x55,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x55,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa8,0xaa,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa8,0x55,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa8,0x5a,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8, 0xaa,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x55,0x0d, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x6b,0x0d,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x55,0x0d,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0xaa,0x1a,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x50,0x55,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa0,0xad,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x50,0xb5,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x55, 0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xaa,0x3a,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x55,0x35,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0xd6,0x3a,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0x5a,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0xaa,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x55,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, 0xaa,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x35, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x3a,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x35,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x3a,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xaa,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x54,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x68,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0, 0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x0f,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; wanderlust-wanderlust-769699d/etc/icons/wl-alpha-logo.xpm000066400000000000000000002531301406661363500234700ustar00rootroot00000000000000/* XPM */ static char *wl-alpha-logo[] = { /* width height num_colors chars_per_pixel */ "491 176 26 1", /* colors */ ". c None", "a c #000000", "b c #030404", "c c #0c1112", "d c #1d2628", "e c #295eb6", "f c #3162bb", "g c #3864bc", "h c #3b4c6e", "i c #3f65bb", "j c #4d6abf", "k c #596cbf", "l c #6771c4", "m c #6c73c4", "n c #6e6cad", "o c #7574c5", "p c #837aca", "q c #917dca", "r c #a582c4", "s c #b28bd4", "t c #c090d3", "u c #c994d2", "v c #d09ad9", "w c #e02828", "x c #e8b3d9", "y c #ffffff", /* pixels */ "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "..................................................................................................................................................................................................................................ssssssssss...............................................................................................................................................................................................................................................................", ".......................................................................iii................................................................................................................................................sssssssssssssssssssssssss........................................................................................................................................................................................................................................................", "......................................................................iiiib..........................................................................................................................................sssssssssssssssssssssssssstttttsss....................................................................................................................................................................................................................................................", ".....................................................................iiiiicc......................................................................................................................................sssssssssssssssssssssssssstttssssttttttst................................................................................................................................................................................................................................................", "....................................................................giiiiidb..................................................................................................................................rrssssrssssssssssssssssststsssssstttsttsttutttr..............................................................................................................................................................................................................................................", "...................................................................iiiiiiidb................................................................................................................................rssssssssssrsrsssssssssssssssssssstsssttttttttttttur...........................................................................................................................................................................................................................................", ".................................................................iiigiiiijhb.............................................................................................................................rsssssrsssssssssssssssssssssssstssssssttssststttttuututuq.........................................................................................................................................................................................................................................", "................................................................gggiiiiiiieb...........................................................................................................................rrsrrrssssssssssssssssssssssssssssssststssttttttyy.uttutuuutr.......................................................................................................................................................................................................................................", "...............................................................iiigigiiiiieb........................................................................................................................qrrrrrssrrsrssssssssssrsssssssssssssssssssstsststyyywwatttttuuutrn.....................................................................................................................................................................................................................................", "..............................................................igggiiiiiiijhb......................................................................................................................qrrrrsrsrrsssssrssrssssssssssssssssssssssstststtstyywwwwattuuutuuuuvn....................................................................................................................................................................................................................................", "............................................................ggiiiigigiiiiidb....................................................................................................................rrqrrrrrrrsrsrssssssssssssssrssssssssssttssssstssttstwwwwwatttttutuuuutrh..................................................................................................................................................................................................................................", "...........................................................gggigggiiiiiiijdb...................................................................................................................rqrrrqrrsrsrsrssrssssssssssssssssssssssssssyyyyyytssttsawwwauuuuuuuuutvvuuh.................................................................................................................................................................................................................................", "..........................................................ggggiiiigiiiiiiidb.................................................................................................................rqqrrqrrrrrrrrssrsrssssssssssssssssstsssssssyywwwwwwttsttttwwatttttutuuuuvuuvn................................................................................................................................................................................................................................", "........................................................ggggigggggiiiiiiijdb...............................................................................................................qrqrrqqrrqrrsrssrrssssssrsssssssssssssssssssssswwwwwwwwstttttywwttutuuuuuuuuuvuvrh..............................................................................................................................................................................................................................", ".......................................................gfgggggiiiiggiiiiiibb...............................................lll...........................................................qqqqqqrqrqrrrrrrrsssssssssssrsssrsrsssyyyyyssstsssawwwwwwatstttywwwtuttututuuvuuuvurd.............................................................................................................................................................................................................................", ".....................................................fgggggiigggggiiiiiiijbb.............................................lllllmmi.......................................................qqqqrrrqrrrrrrqsrrrrrrsssssssssssssssyy.wwwwwyssssssywwwwww.tstttwwwatuuuuuuuuuuvvuvvrd............................................................................................................................................................................................................................", "...................................................ggfggggggiggiiiigiiiiiebb...........................................klllllllmlh....................................................qqqqqqqqrrqrrrqrrrrrsssrrsssssssrsssssyywwawwwwwwstsssywwwwwwwattttywaatttutuuuuuuuvuvvvrc...........................................................................................................................................................................................................................", "..................................................gffgfggggggiigggiigiiiidb...........................................lllllmmlmlmmd..................................................qqqqqqqqrqqrqqrrrqsssrrrsrsssrssssssssyywwaasawwwwwssssswwwwwwwwttttywwtuttuuuuuuvuuuvuuvvnc..........................................................................................................................................................................................................................", "................................................ffggfgfgggggiggiigiigiiiidb..........................................llnllllllmlmmeb...............................................qqqqqqqrqqrrqqrqrrrrrrrssssqrssssrssssrsywwaasssswwwwwssssywwaawwwwttttwwauutttutuuuuuuvvuvvvh..........................................................................................................................................................................................................................", "..............................................ffgggfggggggggggiggiiiiiiiibb.........................................klllllllmllmlmkb..............................................qqqqqqqqqrqqqqrrrrrrrrrsrrrssyyyyssssqnnyywwannrsssawwwasss.wwwstwwwatttywatttuuuuutvvvvuuvuvvvd.........................................................................................................................................................................................................................", "............................................fffgffggggfgfggggggiggiigiiiebb........................................lkklklllllllmlmlbc............................................qqpqqqqqrqrrrrrrrqrrrrrrrssyyyywwwwbbbbbcywwaa....cchdwwassusawwattwwwtttywauutuuuuuuuuuvvvvvvvvrc........................................................................................................................................................................................................................", "..........................................efffffffggffggggggigigiigiiiiidb........................................kkllllllllmmmlmmmbb..........................................pppqqqqqqqqrqqqqqqrrrrrrsryyyywwwwwwaa.....ywwa.........yww.hnstywasttwwwttyww.tuttuuuuuuuuuuvuvvvvhc.......................................................................................................................................................................................................................", "........................................fffefffffffggggggggggggggigigiiebb.......................................klkllllllllllmllmlbb.........................................pqqqqqqqqqqqqqrqrrqrqrrrnhyywwwwwwwwaa......ywaa.........ywwwa..hywastsswwwyywwwatuutuuuuuuvvuvuvvvvvd.......................................................................................................................................................................................................................", ".....................................effeffffffggfgfffggggggigiiigiiiiidbc.......................................lklkklllllllllmmmebb........................................ppqppqqqqqqqqrqqrqqrqpndbb.ywwwwwwwwaa.......ywa...........wwwa...ywwnttttwwwwwwwauuuuutvvvvuuvvvuvvvvrb......................................................................................................................................................................................................................", "..................................eeeeefeefeffffefgggffgggggggggiigigiebb.......................................klkllknkllllmlllllhb.......................................ppqpqqqqqqqqqqqrqqrryndbbc...awwwwwwwaa........ywa...........ywwa....wwa.rtttwwwwwwatuuuuuutuvvuuvvvvvvvvhc.....................................................................................................................................................................................................................", "...................eee........eeeeeeeefefefffffffgfffgggggggiggiggiiiidbc......................................knklkkllllllmlmmmmmdb......................................ppqppqpqqqqqqqqqyyyyyyw.........aaawwwa.........yww...........ywww....ywa...rttwwwwwauttuuuuuuuuvvvvvvvvvvtb.....................................................................................................................................................................................................................", "...................eeeeeeeeeeeeeeeefeegfffffffgfgfggggfggggggggiiigiiebb......................................llkkllllllllllllllmkbb.....................................ppppppqpqqqqqqqyyywwwwwwwa..........ywwa.........ywwa...........wwwa...yww.....ttwwwwauutuuuuuuuuuuvvvvvvvvvdc....................................................................................................................................................................................................................", "....................eeeeeeeeeeeeeeeefeeefefffffffggfgfggggggiiggggiiicbc.....................................kkkkkkkklllllllllmmlhbc....................................pqpppqppqqqqqqqqywwwwwwwwww...........www..........wwa...........ywwa...ywwa.....sywwwwtuutuuvvuvvvvuuvvvvvvvrb....................................................................................................................................................................................................................", "....................eeeeeeeeeeeeeeeeeffefeefffgfffffggggggggggiiiiggdbb......................................kklknllkkklllllmllmmcb....................................ppppqpqqpqqqqqqoyywwwaawwwwwa...........wwa.........ywa...........ywwa...ywww......ywwwwatuutuuvtuuuvvuuvvvvvvvcc...................................................................................................................................................................................................................", "....................eeeeeeeeeeeeeeeefeefeffeffffffggfffggggggiggggihbb......................................kkkkllkklllllllmllmlhbb...................................pppqpppqpqpqqqnhbywwaaa..wwwwa...........ywa.........yww...........ywwa...ywwww......wwwwauuuutuuutvvuvvvvvvvvvvhb...................................................................................................................................................................................................................", "....................eeeeeeeeeeeeeeeeeeeffffefffegffggggggggggggiiiebb......................................kkkkkkllkllklllllllmmcb...................................ppppppppqpqqqqhbbyywaa.....wwwa...........yww..........www..........ywwa..yywwwww......aaaattuuuuuvuuvuvvuvvvvvvvrb...................................................................................................................................................................................................................", ".....................eeeeeeeeeeeeeeeeefeefffffgfffgfgffggggiggiggebb......................................jkkkkkkknlklllllllmllhbb..................................ppppyyyyypqqpecbb.ywwa.......waa...........ywwa.........ywwa........yywwa..ywwwwwwa.......utuuuuuuvuuvuvvvvvvvvvvvvcc..................................................................................................................................................................................................................", ".....................eeeeeeeeeeeeeeffeffeffffffffgggggfgigggiggidbb.......................................jkkkklklklklnkllllllebb..................................pyyyyywwwwwpndbb...ywwa........a............ywwa..........www........ywwaa...wwwwaaa........uutuuuuuvuvuuuvvvvvvvvvvhb..................................................................................................................................................................................................................", ".....................eeeeeeeeeeeeeeeeeeefefefffggfgfffggggggggedbb.......................................kkkkklkkklkllllllllmkcbc.................................yyywwwwwwwwwwbbc....ywwa......................wwa...........wwwy.....yywaa....aaaaa...........uutuuuuuutvvvvvvvvvvvvvnb..................................................................................................................................................................................................................", "......................eeeeeeeeeeefeeeffefefeffffffggggfgggggiecbc.......................................kkkkkkkkkklkklllllllldbc.................................yywwwwwaaaawwww......ywww......................yww...........ywwww..yyywwa......................uutuvuuvuuvtuuvvvvvvvvrb..................................................................................................................................................................................................................", "......................eeeeeeeeeeeeeffeefefffffffffgfgfggggggdbbc........................................jkjkkkklnkklllllllllhbb.................................pywwwwwaaqpdbwwwa......wwwwyyyyyyyy.............ywwa...........wwwwwyywwwaa......................uuuuuuvuvvuvvvvvvvvvvvvbc.................................................................................................................................................................................................................", ".......................eeeeeeeeeeeeeeeeffffffffgffggggfgggecbb.........................................kjkkkknkllkkkkklklllebb.........................yyyyyy..pppwwwwaapncbb.www.......wwwwwwwwwwww............ywwa............awwwwwwwaa........................uuuvtuuuvvvvuvvvvvvvvvdb.................................................................................................................................................................................................................", ".......................eeeeeeeeeeeeeeffeeefeffffgfffffggedbbc.........................................jjkkkkkkkkklllllklllebb.......................yyyywwwwwwappppwwwwphbbc..ywwa.......wwwwwwwwwwww...........ywww..............aawwwaa..........................tuuuuuvuuvvvvvvvvvvvvhb.................................................................................................................................................................................................................", "........................eeeeeeeeeeefeefffeffffffffggggfdbbc...........................................kkkkkklkkkknkklllllebb.....................yyyywwwwwwwwwwpppppwwwabb....ywaa........aawwwwwwwwww...........wwwwyyyy............aaa...........................uuuvvuvvuuvvvvvvvvvvvhb.................................................................................................................................................................................................................", ".........................eeeeeeeeeeeeeeeefffffffggfffecbb............................................jjjkjkkkklkkkllklllebb.....................yywwwwwwaawwwwwapppppwwac....yywa............aaaaaawwwa.........yywwwwwwwwa.........................................tvuuutuvvvvvvvvvvvvvnb.................................................................................................................................................................................................................", "..........................eeeeeeeeeeeffffffeffffgfgecbb.............................................kkkkkkkkkklklkklkklebb................yy....ywwwwaaaa..awwwapppphyww....yywwa...................wwa........yywwwwwwwwaa.........................................uuuuuvuvuuvvvvvvvvvvnb.................................................................................................................................................................................................................", "...........................eeeeeeeeffeeeeeffffffffhbbc..............................................jjjkkjkkkkklkklkllhbb..............yyyywwa..awwwwa....pp.wwappphbywww..yywwwa...................yww.......yywwwwwwwwaa...........................................uuvvuvuvvvvvvvvvvusnb...............................................................................ss................................................................................................................................", ".............................eeeeeeeeefffeffffffedbb...............................................kkkkkkkkkkkkkknlkldbb..............yywwwwwa....wwwa...opopawappdbb.wwwwyywwwwa...................ywaa......ywwwaaaaaaa............................................vuuuuvvvuvvvvvvvupoodc.............................................................................sssrb..............................................................................................................................", "...............................eeeeeefeeeffffffecbc................................................jjjjkkkkkkkkkllkjdbb.........y......wwwwwaa.....wwa..oppppopandbb..ywwwwwwwwwa........yyy.......yywa........waaa..................................................uuuvvutvvvvvvvvupooohb............................................................................sssssbc.............................................................................................................................", "..................................ddddcceeefffebbc................................................kjkkjjkkkkkklkkkecbc.......yyyywa....awwwwa......yww.pooy.pppncbc...ywwwaawwwwa........ywww.....yywwa........aa.....................................................uuuvvuvuvvvvvvqoooohb...........................................................................ssssssbb.............................................................................................................................", ".......................................eeffegebb.................................................jjjkjkkkkkkkkkkkhbbc......yyywwwwa......wwwa......ywwaopyywapncbc.....wwaa..wwww.........wwww....ywwwa...............................................................vuuuuvvvvvvvvroooooob...........................................................................ssssssbb.............................................................................................................................", "......................................egfffeecbc.................................................kkjkjjkkkjnkkkjdbb........ywwwwwaa......ywwa......ywwwyyywwwncbc......ywa....wwww........ywwwwyyyywwaa...............................................................uuuvuuvuvvvvtooooooobb.........................................................................sssssrsbb.............................................................................................................................", "......................................feeefebb..................................................jjjjjkkjkjkkkkecbc..........wwwwwa.......ywwa......ywwwwwwwwwabc.......yww.....wwww.......ywwwwwwwwwaa................................................................vvvtvvvvvvvvpoooopoobb........................................................................ssssssssbb.............................................................................................................................", ".....................................effffecbc..................................................jjkjjkkkkkkkkhbbc...........awwwww.......ywwa......ywwwwwwwwwwc........ywwa.....wwwwyy.....wwwwaaaaaa.................................................................uuuuuuvvvvvroooooookbb........................................................................ssssssssbb.............................................................................................................................", "....................................eeeefecbc..................................................jjjkjjkjjkkkecbb...............wwwwa......ywwa.......wwwwaawwwaa.........wwa......wwwwww.....waaa.......................................................................uvvvvvuvvtoooooooohbc.......................................................................sssssssssbb.............................................................................................................................", "...................................feffeecbc...................................................jjjkkjkkkjkjbbc.................awww......ywwa......oowwwancaaa..y.a....yywwy......wwwwwa....aa.........................................................................uuutuvuuvpoooooooohb........................................................................sssssssrnbb.............................................................................................................................", "...................................efeefdbc...................................................kjjjjjkjjkkkhbc...................ywww.....ywwa.....oopywwacbc....ywa.....wwwww......wwaaa...............................................................................uuvvvvvvsmmooooooohb.......................................................................sssssssssnb................................................................................................x.............................", "..................................eeeeedbb....................................................jjjjjkjkjkkkbb.....................wwww....ywwa....ooooywwabb.....yww....yywwwww......aa.................................................................................uuuuuvvtoooooooooodb......................................................................srssssssssdb.............................................................................................xxxxxv...........................", ".................................eeeefhbb....................................................jkjjjkjkjkjkhbb......................wwwa...ywwa....ooooowwab......ywwa...ywwwwwaa........................................................................................vuvvvvvqmmoooooooobb......................................................................ssssrsrsssdb...........................................................................................xxxxxxxxbc.........................", "................................eeefeebb....................................................yyyyjjjjkjkjkcb.......................ywwa...ywwa...ooooopywa.......ywwa....wwwaaa.........................................................................................uuuuuusoommoooooohbb.....................................................................ssssssssssqbb..........................................................................................xxxxxxxxnbb.........................", "................................eeeeebb...................................................yyywwwwjjjkkjkhbb........................wwa...ywaa..oooooohyww....yyyywwa....aaaa...........................................................................................vuvvvvpmmoooooooodb......................................................................sssssssrsshbc.........................................................................................xxxxxxxxxcb..........................", "...............................eeeeecbc...................................................ywwwwwwwjjjkjjcb.........................ywwy..ywa...oooookcywwwyyyywwwwwa...................................................................................................uuuuvsoooooooooonbb.....................................................................ssssssssssscb..........................................................................................xxxxxxxxnbb..........................", "..............................eeeeedbc............................................yy......ywwwwwwwwjkjkebb..........................wwwwyywa..oooooocbywwwwwwwwwwaaa...................................................................................................vuvvtmomomoooooodbc.....................................................................sssrssssrshbb.........................................................................................xxxxxxxxubb...........................", "..............................eeeedbb..........................................yyyyww.....jwwwwwwwwwjjkdb............................wwwwwww.omoooodbyywwwwwwwaaaa.....................................................................................................uuuurmomomooooonbb.....................................................................ssssssssssqcb.........................................................................................xxxxxxxxucbc...........................", ".............................eeeeebb...........................................ywwwwwa...jjjaawwwwwwakebb.............................wwwwwwamoooohbyywwwwwaaaa........................................................................................................vuvummmomomooopcbc....................................................................sssssssssssdbc.........................................................................................xxxxxxxxhbc............................", "............................eeeeebb.....................................yy.....ywwwwaa.jjjjjjjywwwwwwkhbc.............................ywwwwwaooooncb.wwwaaaa...........................................................................................................vuupommooomooonbb.....................................................................ssssssssssnbb.........................................................................................xxxxxxxxhbb.............................", "...........................eeeeecbc..................................yyyywwa....wwwwa.jjjjjjjjywwaawwwbb...............................wwwwwaoooodbc..waa..............................................................................................................uusoooomoooooshbc....................................................................ssssrsssssnbb.........................................................................................xxxxxxxxnbb..............................", "...........................eeeedbb...................................ywwwwwa.....wwwajjjjjjjjjywaajywwwc...............................ywwwwaooohbb....a..............................................................................................................uuupmomomoomoqrbb.....................................................................rssssssssqcb..........................................................................................xxxxxxxnbb...............................", "..........................eeeeebb....................................ywwwwwa.....ywwajjjjjjjjjywajkkwwwa................................wwwaamokbb....................................................................................................................uvsmmmmoommoqvhbc....................................................................sssssssssqcbc.................................................................vvv.....................xxxxxxxrbb................................", ".........................eeeeecbc..........................yyyy......awwwwwa......wwajeejkjjjyywajjkywww.................................aaaooodbc....................................................................................................................uupmmommoooqvvcb............................................q........................ssssrssrpcbc.................................................................vvvvcc...................xxxxxxucbc................................", "........................eeeeedbc........................yyyywwwwy......wwwwa....ijywwebgjjjjjywwwyjjywwww................................mmmomhbb.....................................................................................................................usmmommomoqvvrbb...........................................qqqn.....................ssrsssssqcbc.................................................................vvvvhbb..................xvxxxxucbc.................................", "........................eeeeebb.......................yyywwwwwwwww......awwa...jjjywwadjjjjjjjwwwwwyywwwwa...............................ooookcb........................fff...........................................................................................upmmmmmooqvvvdbc...................pppppp.................qqqpcb....................rsssssspcbc................................................................vvvvvrbb...................xxxxxxdbc..................................", ".......................eeeeecbc......................yywwwwwaawwwww......ywa..jijjywwajjjjjjjjywwwwwwwwwww..............................omommdbc......................fffgge.........................................................................................vsmmmooomqvvvrbb.................ppppppppppd.............qqqrncbc...................ssssssspcbc....................s...........................................vvvvvvnbc...........vvvxvvvxxvxxxhbb...................................", "......................eeeeehbb.......................ywwwwaaa..wwwwwa....ywwjyyiyyywwwjjjjjjjyywwwwawwwwwwa............................momooibb.......................ggfgggb...........................ii................................................lllllmkn...upmmmmmmquvvvdbc...............pppppppppppphb...........qqqqqhbc...................rssssssqcbc...................ssssn........................................vuvvvvvvc...........vvvvxvxxxxxxxrhh........x...........................", ".....................eeeeeebb........................ywwwwa.....awwwa....ywwwywwywwwwwajjjjjjywwwaaabaaawww............................mmmmmdbc......................fggffggbb........................ijjjib...........................................klllkhcbbb....tmmmmmmqvvvvrbb..............oppppppppppppphb..........qqqqqqhb....................ssrrrsqcbc..................sssssssb......................................vvvvvvvvvrc.........vxxxvvxvxvxxxxxxxxxxxxxxxu...........................", ".....................eeeeedbc.........................wwwwa......ywwa....ywwwwwwwwwwwwajjjjjjywwaajjb...ywwwy.........................mmmoohbb...............eeeeeffffffgffebb......................iiiijjebc.......................................kllkjdbbc.......uqommooqvvvvvdbc.............ppohdhnppppppppdb.........qqqqqqqqn....................rsssrpcbc..................sssssstrbb...............tttt.................uuvuvvvvvvvrd........vvvvvvxvxxvvxxxxxxxxxxuhbbc..........................", "....................eeeeeebb........yyyy...............awwa.......wwa...iywwwwwwwaawwwajjjjjjywwajkjdb..ywwwww........................mmomocb............eeffeehdbbdfffgfggdbc.....................iijijiidb..........jjjjj.......................klllicbb..........ummmmmqvuvvvrbb............opp.bbc..ppppppppcb........qqqqqqqqqqqn.................sssssqcbc..................sssssssshbc..............tttuurb...............vvvvvvvvvvvvrc........vvxxxvxxvxxxxxxxxxrndbbc............................", "...................eeeeeedbc.....yyyywwwwa..............ywa.......ywa..iijwwwwaaaa..awwjjjjjjjwwajjjhb..ywwwwwa......................momomhbb..........eeeeedbbc...fffffffebb.....................ijijijjebb........jjjjjjjhc....................lkkkdbb............rllomquvuvvvdbc...........pop.bc....ppppppphbb.......qppqqqqqqqqqqqo...............rrsspcbc..................ssssssssrcb..............tttttutbc...............uvvvvvvvvvvvnc.........hhhrvxxxnnnnhhdbbbc...............................", "..................eeeeeeebb......ywwwwwwwa..............yww......yywaiiiiiywwwa.....iywajjjjjyywwjkjib..ywwwwaa......................mmmmmcb.........eeeeecbb......ffgfffghb.....................iiiiiiiidbc.......jjjjjjjjjb..................klklkcbc............upommpvvuvuuhbb...........popcb.......ppppphbb........pqqqqqqqqrqqqqqod............sssrnbbc...................sssssssrhbc.............ttttttthbb.............uuvtuvvvvvvvvvvd............xxxxrbb........................................", "..................eeeeeehbc......ywwwwwwaa...............wwa....yywwaiiiijywwaa....jjywajjjjjywwwwkjjhc..waaaa.......................mmmmhbb.......eeeefebbc.......fffgffgfe....................iiiiijjjhbb.......jjjjjjjjjjdb................kkkkjcbc.............smmlotuvvvvrcb...........opodb........pppphbb..........qqqqqqqqqqrrqqqdc...........rrsnbb....................ssssstsrcbc.............tttttturcb.............vv..brvvvvvvvvvvnb..........vvvvvdbc........................................", ".................eeeeeeedb........wwwwwaa................yww..yyywwaaiiiedbwww.....jiywwkjjjyywwwwwjjib...a.........................mmmmocb.......eeeeeebb..........fgfgfggged.................iiiijjiiicb.......jjjjjjjjjjjdb...............kkkllhbc.............uqmmmsuvuuvvhbc..........opohbc.......pppphbb..........qqpqqqqqqqqqqqqrdb..........rssnbb....................ssssssshbbc.............tttttturcbc............u...c..vvvvvvvvvvrb..........xxxxrbb.........................................", "................eeeeyyyebb.........wwwww.................ywwwyywwwwagiiecbcywwa....jjywwwyyyywwwwwwajjhc............................ommmhbb.....eeeeeeecbc..........fffgffggged................iiiiiiijhbb......jjjjjjjjjjjjhb..............klknkjbb..............ullmsuuvvuvnbb...........opnbb.......pppndbb..........pp.cbnoqqqqqqqqqhbb..........rrrcbc...................ssstssncbb...............stttttrcbc............u..c.....vvvvvvvvvvbc........vvvxxhbc.........................................", "...............eeyyyywwwbc..........awwwa................ywwwwwwwaaaiihbb...wwa....jiywwwwwwwwwaawaajkib...........................mmoomcb.....eeeeeeehbb............ffffgggfghc..............iiiiiiijebb......jjijjjjjjjjjjeb.............kkklkkhbc..............rmmouvuuuvrcb...........poocb......ppppnbbc..........p.......pqqqqqrrhbb...........qshbc....................ssssshbbc...............ttttttncbc............u..........vvvvvvvvvbb........vxxvxbb..........................................", "...............eyywwwwwww............ywwa.................wwwwwwaagiedbb....yww....jjywwwwwwaaaajjajjkjhc..........................mmmmhbb....eeeeeeeedb............gf.gfffggfgc.............igiiiijiihbc.....j..bhjjjjjjjjjeb.............kkklkkdb..............smmlruvvvuvhbc...........ooibb...oppppnbbb...........q.........qqqqqqdbb...........rrsbb....................ssssshbb................ststtthbb..........................vvvvvvvrbb........vvxvnbb..........................................", "..............ee.wwwwwwwwa...........ywww.................ywwwaaaiiecbc.....ywww...jj.wwwaaaajjjjkjkjjkkc.........................mlmmmdb.....eeeeeeeebb...........ff..efggffggdb............iiiiijiijcb.....j..c..jjjjjjjjjeb............kkkkklkdb.............qolmmsuuuuvnbb...........opppooppppnhcbbc........................qqqqdbb............srrbb....................ssssnbb................sttttthbb............................vvvvvvnbc.......xvxvxhb...........................................", ".............eeeeawwwwwwww............wwwa................ywwwaigihbbc.....yywwww..jjjaaaajjjjkjjjjkjkjkeb........................mlmoibb....eeeeeeeeebb...........f....ffgggggdb...........giiiiiiiiebb............jjjjjjjjeb...........jkkkkklkhb............mpplmmsuuuurbb............ooonhddbbbbc............................qqqdbb.............srrhb...................ssstsdbc...............ttstttnbb.............................vvvvvvdb........xvxvvhb...........................................", ".............eeeeeeawwwwwwa...........ywwa........y.......gwwaagedbb.......ywwwwwa.ijjjjjjjjjjjjjjjkkkkkkd........................mmmmdbc...eeeeeeeeeecb..........f.....fgfgfggdb...........iiiiiiijihbc............jjjjjjjjeb...........kkkkkkkkeb...........lptommmouuvvcbc...........opoodbc.................................qqqdbb.............rrsssd...................sssssdb................ssttttcb...............................vvvvrbb.......vvvvxxhb...........................................", "............eeeeeeeeywwwwww...........ywwa........ywa...gggywaiecbc.........wwwwaa.jjjjjjjjjjjjjjjjjjjjkkib......................mmmmkbb....eeeeeeeeeedb........fe.....gfggggggbb..........igiiiijiijdb.............jjjjjjjjjb...........kkkkknkkkhc.........lmtulllmmquuhbb............oopoib..................................qqnbb............r.rrrrssh.................ssssssnb...............tttstttcb............u..................vvvvdbc.......vxvvvvrb...........................................", "...........eeeeeeeeeywwwwwww..........ywwa........yww..ggggywwdbb...........aaaaa...jjjjjjjjjjjjjjjkjkkkkkhc.....................lmlmhbc...eeeeeeeeeeeec.......ef......gfffffgebb........i.iigiiiiiiidb.............jjjjjjjjjcb........jkkkkkklllllh.......lllstsmmmmmlqhbb............oopopohc....................pp..........qqqdb............r..rrrsrrsn................sssssssnc............ssssstssthb...........t.....uuu...........vvvnbb........vvxxxxxnc...............x..........................", "...........eeeeeeeeeywwaawwww..........wwa........ywwaggfggywwwyyy..................jjjjkjjjjjjjjjjjjjjkjkkd....................mlmlmdb....eeeeeeeeeeeeeh....fff.c....fgggggfgebc......ig..iiiiiiijiiehi............jjjjjjjjjhb......kk.kkkklkkkkkklej..lllllnutrlmmmmmmkd............o.oooopohd..................pp..........qqqqbb..........rr..drrrssrssrq.............sssssssssnh..........ssttttttstth.........uu..c..uuuvrd.........vvtcb.........vvvvvxvxnh............xx...........................", "..........eeeeeeeeeeywaaebwwww.........yww........ywwagggggywwwwwww..................jjjjjjjjjkjkjkkjkkkkkkjb...................lmmmibb....eeeeeeeeeeeeeeeeefee.b.....ffffffggeb.....gg..chiigiiiiiijiie.c..........jjjjjjjjjjh....jkj..kjkkkknkkllklllllllkhtuupmlllmmmmmn.........oo..ooppoppon...............pqq.c........qqqqqdb........qrr.cb.ssrrrsrsssssrr.......sssssssssssssrs......sss.ssssttttttn......tuu..c..uuuvuvhc.......vvvdbc........vvvvxxvxxvxr........xxx..c..........................", "..........eeeeeeeeeeywweehywwwa........ywwa.......ywwafggeyywwwwwwaa.................jjjjjjjjjjjjjjkjjkkkkkkec..................mmmmhbc...eeeeeeeeeeeeeeeeeefdbb.....fffggggffgdh.gggg.cb..iiggiiijiiiebb...........jjjjjjjjjjjjjjkjkdbckkkkklkkkklkkllklljdrttupmmmmllmmommmlmmmmooo.chooopoopopooo..........ppp..b.......qqqqqqqnb......rrrqhbb..rsrsrsrsrsssssssssssss.nssssssssssssssssssstchtttsttttttttttuuttscb....vvuuuuub.......vvnbb.........xvvvvxxxxvvxxxxxxxxxxxncb...........................", ".........eeeeeeeeeeeywwweyywwww.........www.....ffywwaggec.wwwwaaaa...................jjjjjjjjjjjjjjjkkjjkjkkd.................lllmlcb....eeeeeeeeeeeeeefeffdbb.....fgggfffgggggggggebbc..igiiiiiiiiiebb............jjjjjjjjjjjjkjkecbc.kkkkkkllklklllllljcnttutpllmlmmmmmoomooooooodbc.opoopppppppppppppppppppphbb........pqqqqqqqnnqqqrrqqqcbc...rrsrsrsssrssssssssssnbbnssssssssssssssssssnbbhssstststttttttttuhbb....uuuuvvvvhb.....vvvbb..........vxxvxvvvxxxxxxxxxxxxucbb............................", ".........eeeeeeeeeeeywwwwywwwwww........ywwa..ffgyywwaedbb.aaaaa.......................jjjjjjjjjjjkjjkkkkkjkkic................mmlmibb....eeeeeeeeeeeeeefeecbb......fgffggfgggggggedbb....iiiigiiiijebb..............jjjjjjjjjjkkjhbb...kkkknkklnlkkkklkkchutttuqmlmmmmmmmmooomoooodbb..ooopooopppppppppppppppndbb........qqqqqqqqqqqqqqqrqpcbc....rrrrsrrssrssssrsssshbb..sssssssssssssssssdbb..ttstststtttttturdbb.....uuuuuuuurc....vvvcb............vvvxxxxxxvxxxxxxxxnbbc.............................", "........eeeeeeeeeeeeywwwwwwwwwwww.......ywwwyyyyyywwwacbc..............................jkjjjjjjjjjjkkjjjkkkkkkec...............llmmhbc....eeeeeeeeeeeeeeeebbc......fffgfgfggfggggecbc.....ggiiiiiiiebb...............jjjjjjjjjjjjdbb....kkkkkkkkkklllllechutuuutslmmmmmmmmmmmmoomkcbb...opoopppppppopppppppppncbc........pqqqqqqqqqqrqrqrqnbbc.....rrssrsssssssssssrqdbb...ssssssssssssssssdbb...sststtttttttutncbc......uuvuuvvvvrh.vvv.cb.............vxvvvvvxxxxxxxxxuhbb...............................", "........eeeeeeeeeeeeywwwwwwwwwwwwa......ywwwwwwwwwwwwab.................................jjjjjjjjjjjkkkkjkkkkkkkhc.............mmmmmdb......eeeeeeeeeefeedbb........fffgffffgfgfedbb.......iggiiiijebb................jjjjjjjjjjicbb......kkkkkklkkkklkhbdttttttuumllllommmommmmokcbc.....ppoooopoppppppppppphbbc.........qppqqqqqqqqrqqqrhbb........rrsrrrsssssssssncbc....ssssstssssstssrcbb....tsttttttttttthbb.........uuuuuuuvuvuvvhbb..............vxvxxxvvxvxxxxxncbc................................", "........eeeeeeeeeeeeywwwwaaaaawwww....eyywwwwwwwwwwaaa...................................jjjjjjjjjkjjjjkkkkkkklld.............llllkbb......eeeeeeeeeeehbbc.........fffffgggfgedbbc........giiiiiiebb.................jjjjjjjjjhbbc.......kkkklkklllljdbcstttuuutthmmmmmmmmmmoooecbc.......ooppppppppppppppndbb...........pqqqqqqqqqqqqrodbb..........rrsssrsrssssqdbb.......sssssstssssshbbc......tsssttttttncbb..........tvvuvvvuvuvrcbb................vxvvvxxxxxxxtdbb..................................", ".......eeeeeeeeeeeeeywwaaaeeeeywwwaeeefywwwwwwaaaaaa......................................jjjjjkkjjkjkjkkjkkkkkkjc............mmmmebc.......eeeeeeeehcbb...........fffffffgedbbc...........iggiiebb...................jjjjjjedbb..........kkklkknkkhcbdsuttttttrdbemmllmomoommhbb..........oooopopppppppphbbc.............qqqqqqqqqqqqncbc............rrrsrssssphbbc.........sssssssssndbb.........ttsttttrhbbc............uuuuuvvvrhbbc..................vxxxxvxvxuhbbc...................................", ".......eeeeeeeeeeeeeywaaeeeeeeewwwwyefe.wwwaaaahcbc.......................................jjjjjkjkkjkjkjkkkkkkkkkec..........mlllldb..........eeehdbbb..............ffgfgedbbc.............iiiidbb....................jjjjihbbc............kkkkkjhcbb.utttutturcbc..mmmmmmmmhcbb............opppppppppphcbb................pqqqqqqqqohbbc..............rprsssndbbc............rsssssndbbc...........stssnhbbc...............uuvvurhbbc.....................vvvxxxrhbbc.....................................", ".......eeeeeeeeeeeeeywaeeeeeeeyywwwwweefaaaafecbb..........................................jjjjjjjkjkjkkkkklkkllllh..........mmmmmcb..................................edbbb.................iedbb.......................hdbbc................hdcbbc..tuttttttrcbc....jhehedbbb................hnpppnhdbbb....................nqqqrohcbc...................dbbbb.................hhhbbb................hcbbc...................hdbbbc.........................hhhbbbc.......................................", ".......eeeeeeeeeeeeeywweeeeeeeywwwwwaafeeffedbbc............................................jkjkkkjkjkkkkkkkklkkkkld.........lmmmkbb..........................................................c.....................................................ttttttturcbc.................................cbbbc.........................hddbbc......................................................................................................................................................................", ".......eeeeeeeeeeeeyywww.eeeeeewwaaaaefffehcbc...............................................kklkkjkkkkklkklkllllklkc........mmmmebc...............................................................................................................stuuututnbbc............................................................................................................................................................................................................................................", ".......eeeeeeeeeeeeywwwwwaeeeeefaaefeeeeedbb..................................................mmllnkjkkkklkklkkknlllic......mmommdb...............................................................................................................tttuuvvuhbb..............................................................................................................................................................................................................................................", ".......eeeeeeeeeeeeywwwwwaeeeeeeeeeeeeedbbc............cd....dd..............................ddpomkkkklllllllllmllmmohd.....ppppodc.....................................dd.....ddd...............................................................stuthcuvhcc...................................................................................ddddd.......................ddddddd.........................................................................................................................", ".......eeeeeeeeeeee.wwwaaaeeeeefeeefedbbc...............du...dxx..ddddddd.dddddddd..........dhhrqpmlkhhnmomhhmmlmkhhhkh..cddhhhhnccd.....c....cdddddd...ddddd...........ddh....dhnx...ddddddd....ddd......ddd......dd........dd......cdddddd....sttturdxhdcd.....c..dddddddd..ddddddd...ddddd......dddddd....dd.......ddd....ddddddd..........dhxxrhh....dd....d...........druurrrx...d.....d......dd.......ddd.....ddd.....ddddddd...dd....d..............................................................", ".......eeeeeeeeeeeeeaaaaeeeeeeeeeeedbbc.................hh..drx...drrrrrrx.rrhhrrrx.........drrhxpollhdhrophrvomndnrrhhd..rrdrrrrhddx....hx...drrrrrrx..drrrrd..........dhhu..dhnrx...drrrrrrx.ddrrnh...ddrrnh.....dhh.....cdnrhd....drrrrrnx.tttttturdxdd.dd....hx..rrhhrrrx.drrrrrnx..drrrrhh...dnxxxxux..dhdx....ddnrnd...drrrrrnx........dnx....hh...ddr...dx..........hx.........cu...ddr....dhdx....ddnrnd...d.rrhh...drrrrrnx..ddr...dx.............................................................", ".......eeeeeeeeeeeeeeeeeeeeeeeeeedbbc....................hnhnx....dx.........hhx............dxxhx.omlnrhnqphruondtxxuvhrd..vhrxvrhddx....hx...dx........dx...hr.........dnrn..hrnnx...dx.......dxx..ux..dux..ux....dxdx...d.xx..rx...dx.....xttttssuuhdx...dnh...hx....hhx....dx........dx...hh...dr........dxhr...dhxx..ux..dx..............dx......hx..drd...dx..........hrhhh......hh...dhr....dxhr...dhxx..ux..hx...xx..dx........drd...dx.............................................................", "........eeeeeeeeeeeeeeeeeeeeeeedbbc.......................hnx.....dhhdd......dhx...........dnx.hn..omnrthrqhruphhxsqqqhnrd.rhrxrhd.dhhhhhhx...dhhdd.....dhdddhx.........dhxhuhhxhnx...dhhdd.....dddd.....dddd.....dnxhr...dx.........dhddd..uuttttsrdddx...dxhh..hx....dhx....dhddd.....dhddddrx..dhhdd.....dx.h...dx........dhddd...........dx......hx..dx.h..hx..........hrrnhx.....nhr.d.hr....dx.h...dx........dhdd.....dhddd.....dx.h..hx.............................................................", ".........eeeeeeeeeeeeeeeeeeehcbbc.........................hux.....drrrrx.....dhx...........dhhhhhu..linurhrhrvphnxqqpphnxnhrhuxrhd.hxxxxrnx...drrrrx....drrnhxx...ppp...dhxhhhuxhnx...drrrrx.....urrhh....urrhh...drn.hx..dx..ddd....dnrrruxvttttthccddx...dx.hh.hx....dhx....dnrrrr....drrrhxx...drxxrx...dhr.hr..dx........dnrrrr..........dx.....dhx..dx.nh.hx..........hxxxxx.....n.h.dxhr...dhr.hr..dx.........xrrhd...dnrrrr....dx.nh.hx.............................................................", "..........eeeeeeeeeeeeeeeedbbc............................hu......dx.........dhx..........dhxxxxrn...hnuprhhrvqodxqpppdxxqnqdrxrdc.dx....hx...dx........dx..hr..qqppppqrhhx.hrx.hhx...dx............rhx......rhx.dhrnnhr..dr...xnr...drx.xxxutttrdbb..dx...dx..hhhx....dhx....drx.......dx..hn....dr.......drrnhh..dn....d...drx.............hh.....drx..dx..hhhx..........hx.........n.hd.xdr...drrnhh..dn....d........hx..drx.......dx..hhhx.............................................................", "............eeeeeeeeeeddbbc...............................dr......dnhdddd....dhx..........dx.....hx...nspprdrvppnhhnhhnxsppqdrvqcc.dx....hx...dnhdddd...dx...hxsqqppppqrhhx.hxx.dhx...dnhdddd..ddd.dd.x.ddd.dd.x.dx....dx..hhd.ddr...dhhnnhhvuthbbc...dx...dx...hnx....dhx....dhhdddd...dx...hr...dr......d.x...hr..hhddddr..dhhdddd..........ndddddnx...dx...hhx..........hnhhddd....h..hx.dr..d.x...hr..hhddddr..ddd.ddx..dhhdddd...dx...hhx.............................................................", "..............dddddbbbb....................................r.......rrrrrrx....rx...........x......u...huopprrupppurrrxxuqpponuvpcc..x....nu....rrrrrrx...u...nrqqqpppppqnrxsrx...rx....rrrrrrx..xrrrxx...xrrrxx...x.....u...rrr.xx...hrrrrrrxrdbb.....nx....u....rx.....rx.....rrrrrnx...r....r....r.......x.....r...xrrrxx...rrrrrnx..........xrrrxx.....r....ru..........nrrrrrru.......x..r...x.....r...xrrrxx...urrrxx...rrrrrnx...r....ru.............................................................", "........................................................................................................lmoquuoooopuuuppoomorushcc...........................svsqppppppqsvvsssq.....................................................tvxxxxxxrccc...........................................................................................................................................................................................................................................................", ".........................................................................................................kmooolmmmomooooommmopphb............................qqppppppppqqrrqrqrrh.................................................sstttuuundcc.............................................................................................................................................................................................................................................................", "..........................................................................................................kllllllllmmlmllmmmommhb...........................ppppppppppppqqqqqqqqqh..............................................ssssssttndcb...............................................................................................................................................................................................................................................................", "...........................................................................................................lklkllllllllmlllmmmmhb...........................ppppppppqqppppppqqqqqqc...........................................ssssssssrdbbc................................................................................................................................................................................................................................................................", ".............................................................................................................klklkkkllllllmlllmdb...........................ppppppppppppppqqpqqqqqnb........................................ssssssssrhbbc..................................................................................................................................................................................................................................................................", "..............................................................................................................lkllllllllllmmmlldb...........................opppppppppppppqqpppqqqqd......................................ssssssssrhbbc....................................................................................................................................................................................................................................................................", "...............................................................................................................kkklkllkllllllmmkb............................pppppppppppppppppqpqqqqd...................................ssssssssndbbc......................................................................................................................................................................................................................................................................", "................................................................................................................kklklllllllmllllhc...........................pppppppppppppppqppppqqqqd...............................sssssssssndbbc........................................................................................................................................................................................................................................................................", ".................................................................................................................kklkllllllllmmmmd............................pppppppppppppppqqqqqqqqqh...........................sssssssssqhcbbc..........................................................................................................................................................................................................................................................................", "..................................................................................................................klkklllllmlllllib............................pppppppppppqppqqpqqpqqqqnn.....................rrsssssssssndbbc.............................................................................................................................................................................................................................................................................", "....................................................................................................................llknllllllmmmldc............................pppppppppqpppppppqqqqqqqqpo..............rrrssssssssssqhcbbc...............................................................................................................................................................................................................................................................................", ".....................................................................................................................lllllllllllmmkb..............................nppppppppppqqqqpqqqqqqqqqqqqqqqqrqrrrrrrsrsssrsssqhdbbc..................................................................................................................................................................................................................................................................................", "......................................................................................................................lklllmmlmmllmhc...............................nppppppppppppqqqqqqqqqrqrqrrrrqrrrrrrsrsrsssnhcbbc.....................................................................................................................................................................................................................................................................................", ".......................................................................................................................llllllllmmmmib.................................nhnppppppqpppqqqqqqqqqqrqqqrqrrrrsrrrsnhdbbb.........................................................................................................................................................................................................................................................................................", "........................................................................................................................llllmlmllmlmdc....................................hhhqqpqqqqqqqqqqrqrqrqrrrqrrrnnddbbbc............................................................................................................................................................................................................................................................................................", "........................................................................................................................llllllmmlmlmib.........................................dddhhnnqqqqqqqqrnnnhddcbbbc.................................................................................................................................................................................................................................................................................................", "........................................................................................................................llllmlllmmmlmcc.................................................bbbbbbbbbc.........................................................................................................................................................................................................................................................................................................", "........................................................................................................................llllmmmllmmmmhb....................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................lllllllmmmmmmkb....................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................lllllmlllmlmmmdc...................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................llllllmmmlmlmmhb...................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................lllmllllmmmommkb...................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................llllllmmlmmmmmmdc..................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................lllmlllmlmmlmmmhb..................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................llllmlmlmllmmomhb..................................................................................................................................................................................................................................................................................................................................................................", ".........................................................................................................................lllmlmlmmmmmommb..................................................................................................................................................................................................................................................................................................................................................................", ".........................................................................................................................llllllmlmmmmmmmdb.................................................................................................................................................................................................................................................................................................................................................................", ".........................................................................................................................llllmlmlllmmmmmdb.................................................................................................................................................................................................................................................................................................................................................................", ".........................................................................................................................lllmlmlmmmlmmmmeb.................................................................................................................................................................................................................................................................................................................................................................", ".........................................................................................................................lllllmlmmmmmoomib.................................................................................................................................................................................................................................................................................................................................................................", "..........................................................................................................................lllllmlmmlmmmmmbc................................................................................................................................................................................................................................................................................................................................................................", "..........................................................................................................................lmlmlmlmmlmmommbb................................................................................................................................................................................................................................................................................................................................................................", "..........................................................................................................................llmlmlmlmmmmmmmdb................................................................................................................................................................................................................................................................................................................................................................", "..........................................................................................................................llllmlmmmlmmoomdb................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................llllmllmmmmmmodb................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................mmllmmlmmmmmmmdb................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................llmmllmolmmmmmdb................................................................................................................................................................................................................................................................................................................................................................", "............................................................................................................................llmmmlmmmmmomdb................................................................................................................................................................................................................................................................................................................................................................", "............................................................................................................................lllllmmmmoommdb................................................................................................................................................................................................................................................................................................................................................................", ".............................................................................................................................mmmmmlmmmmomdb................................................................................................................................................................................................................................................................................................................................................................", ".............................................................................................................................lllllolmmmmmcb................................................................................................................................................................................................................................................................................................................................................................", "..............................................................................................................................mmmmmmmmmombb................................................................................................................................................................................................................................................................................................................................................................", "..............................................................................................................................lllmmmmommhbb................................................................................................................................................................................................................................................................................................................................................................", "...............................................................................................................................mlmlmmmmmdb.................................................................................................................................................................................................................................................................................................................................................................", "................................................................................................................................mlmmmomhbb.................................................................................................................................................................................................................................................................................................................................................................", ".................................................................................................................................mmmmmicbc.................................................................................................................................................................................................................................................................................................................................................................", "...................................................................................................................................hddbbc..................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................." }; wanderlust-wanderlust-769699d/etc/icons/wl-alpha-xmas-logo.xbm000066400000000000000000001352141406661363500244220ustar00rootroot00000000000000#define wl_alpha_xmas_logo_width 464 #define wl_alpha_xmas_logo_height 160 static char wl_alpha_xmas_logo_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0xaa, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x15,0x11,0x2a,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x8a,0x88,0x88,0x84,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x80,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x48,0x20,0x52,0x24,0x21,0x28,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x80,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x22,0x95,0x84,0x42,0x94,0x82,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x6d, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x90,0x14,0x02,0x21,0x14,0x41,0x28,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x76,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x81, 0x54,0x14,0x41,0x14,0x01,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x6b,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x2a,0x41,0xa2, 0x94,0x42,0xb8,0x44,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x7d,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xa2,0x90,0x14,0x09,0x22,0x10, 0x3e,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x80,0xb7,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0xa8,0x14,0x25,0xa2,0x50,0x11,0x45,0xbf,0x42, 0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0xdd,0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x12,0xa2,0x88,0x08,0x05,0x08,0x10,0x3e,0x08,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa0,0x6b,0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x60,0x7d,0x15,0x44,0x52,0x50,0xc5,0x8f,0xba,0xa2,0x22,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0xbd, 0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, 0x8a,0xa0,0x22,0x84,0x8a,0xe0,0x5f,0x30,0x08,0x80,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0xd7,0x76,0x00, 0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x2d,0x95, 0x48,0x51,0x00,0xd5,0x3f,0x75,0x82,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x7a,0x7b,0x00,0x00,0x00, 0x00,0x00,0xa0,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x52,0x4a,0x12,0x09, 0xf8,0x20,0x3f,0xf0,0x28,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x6a,0xad,0x6d,0x00,0x00,0x00,0x00,0x00, 0x58,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x3b,0x11,0x45,0x44,0xfe,0x17, 0xff,0xea,0x02,0x25,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x40,0xbb,0x77,0x3b,0x00,0x00,0x00,0x00,0x00,0xac,0x2a, 0x00,0x00,0x00,0x00,0x00,0x00,0xd2,0x9d,0xa4,0x28,0x12,0xef,0x47,0xff,0xe0, 0x50,0x80,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x80,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf8,0xd7,0xaa,0x3d,0x00,0x00,0x00,0x00,0x00,0xab,0x75,0x00,0x00, 0x00,0x00,0x00,0x80,0x4a,0x4a,0x12,0x42,0x91,0x97,0x2f,0xfe,0xeb,0x84,0x14, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x56,0xbd,0xfd,0x36,0x00,0x00,0x00,0x00,0x80,0xaa,0x56,0x00,0x00,0x00,0x00, 0x00,0x40,0xa9,0x24,0x49,0x01,0x94,0x4f,0x9f,0xde,0xc3,0x11,0x40,0x11,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x20,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x6d,0x6b, 0xab,0x3d,0x00,0x00,0x00,0x00,0x40,0xb5,0xea,0x00,0x00,0x00,0x00,0x00,0xa0, 0x14,0xa9,0x24,0xf8,0xdf,0xc3,0x5f,0xbe,0xcb,0x84,0x2a,0x24,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x16, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xbb,0xdd,0xdd,0x1e, 0x00,0x00,0x00,0x00,0x40,0x55,0xd5,0x00,0x00,0x00,0x00,0x00,0x28,0xa5,0x44, 0x02,0xff,0xc0,0x01,0x58,0x19,0xc7,0x20,0x34,0x60,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x1a,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0xa8,0xed,0x76,0x6b,0x1b,0x00,0x00, 0x00,0x00,0xb0,0xaa,0xea,0x00,0x00,0x00,0x00,0x00,0x94,0x92,0x92,0xe6,0x7f, 0xc0,0x01,0x78,0xba,0xce,0x8b,0x68,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x11, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xd0,0x7d,0xb7,0xad,0xdd,0x1e,0x00,0x00,0x00,0x00, 0x50,0x57,0xed,0x00,0x00,0x00,0x00,0x00,0xaa,0x54,0xd5,0xf3,0x3f,0xc0,0x00, 0x78,0x38,0xfd,0x23,0x3c,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc8,0xd6,0x6d,0xf7,0x6e,0x0f,0x00,0x00,0x00,0x00,0x68,0xb5, 0x75,0x00,0x00,0x00,0x00,0x40,0x45,0x4a,0xf8,0xf8,0x1f,0xc0,0x00,0x70,0x38, 0xfa,0x8b,0x82,0xa4,0x01,0x00,0x00,0x00,0x00,0xc0,0x3a,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0, 0x01,0x26,0xff,0xde,0xad,0xb5,0x0f,0x00,0x00,0x00,0x00,0xa8,0xaa,0x6a,0x00, 0x00,0x00,0x00,0x80,0x54,0x09,0x08,0xe0,0x0f,0xc0,0x00,0x70,0x30,0xf4,0x03, 0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xfd,0xdb, 0xaa,0xb5,0x76,0xdb,0x06,0x00,0x00,0x00,0x00,0x54,0x55,0x75,0x00,0x00,0x00, 0x00,0xa0,0x92,0xc2,0x3f,0x00,0x0e,0xc0,0x01,0xf0,0x30,0xe8,0x57,0x8a,0x24, 0x03,0x00,0x00,0x00,0x00,0x80,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x57,0xdd,0xdf,0xee, 0xdb,0xb6,0x07,0x00,0x00,0x00,0x00,0xdb,0x5a,0x75,0x00,0x00,0x00,0x00,0xa8, 0xaa,0xf4,0x3f,0x00,0x0e,0xc0,0x01,0xe0,0x70,0xc0,0x03,0x20,0x80,0x02,0x00, 0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xfa,0xaf,0x76,0xbb,0xb6,0xed, 0x03,0x00,0x00,0x00,0x00,0x55,0xab,0x3a,0x00,0x00,0x00,0x00,0x50,0x4a,0xf2, 0x7f,0x00,0x1c,0x80,0x01,0xe0,0x70,0xc0,0xaf,0x84,0x12,0x06,0x00,0x00,0x00, 0x00,0x40,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x5f,0xf5,0xdb,0x6d,0xef,0xde,0x01,0x00, 0x00,0x00,0x00,0x6d,0x55,0x3b,0x00,0x00,0x00,0x00,0x4c,0xa9,0xfb,0x7c,0x00, 0x18,0x80,0x01,0xe0,0xf0,0xc0,0x07,0x10,0x40,0x06,0x00,0x00,0x00,0x00,0x80, 0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x80,0xea,0xff,0x6e,0xdb,0xba,0xf5,0x00,0x00,0x00,0x00, 0x40,0xab,0x6a,0x1d,0x00,0x00,0x00,0x00,0xa5,0xca,0x39,0x78,0x00,0x18,0x80, 0x03,0xe0,0xf0,0x81,0x97,0x02,0x09,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xbf,0xaa,0xfb,0xee,0x6d,0x77,0x00,0x00,0x00,0x00,0xa0,0xd5, 0x56,0x1d,0x00,0x00,0x00,0x00,0x02,0xf4,0x1c,0x70,0x00,0x38,0x00,0x07,0xe0, 0xf8,0x03,0x20,0x48,0x20,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd5,0xdf,0xad,0x5b,0xb7,0x3d,0x00,0x00,0x00,0x00,0x40,0xad,0xaa,0x0e, 0x00,0x00,0x00,0x40,0xf0,0x3b,0x1c,0x20,0x00,0x38,0x00,0x07,0xf0,0xf8,0x03, 0x04,0x01,0x04,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e, 0x75,0xf7,0xee,0xda,0x1e,0x00,0x00,0x00,0x00,0xb0,0xd5,0x5a,0x0f,0x00,0x00, 0x00,0x00,0xff,0x1f,0x1c,0x00,0x00,0x38,0x00,0x0e,0x70,0xf8,0x00,0x50,0x20, 0x91,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0xbf,0xad, 0x75,0xb7,0x0f,0x00,0x00,0x00,0x00,0xd0,0x5a,0xab,0x07,0x00,0x00,0x00,0xc0, 0xff,0x07,0x1c,0x00,0x00,0x30,0x00,0x3c,0x38,0x00,0x00,0x00,0x9e,0x00,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0xd5,0x7b,0xaf,0xed, 0x07,0x00,0x00,0x00,0x00,0x68,0xad,0xaa,0x03,0x00,0x00,0x00,0xe0,0xdf,0x0f, 0x3c,0x00,0x00,0x70,0x00,0x7c,0x3e,0x00,0x00,0x00,0x17,0x24,0x19,0x40,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0xff,0xd6,0xda,0xee,0x01,0x00, 0x00,0x00,0x00,0x58,0x6b,0xd5,0x01,0x00,0x00,0x00,0xf4,0xf7,0x0e,0xf8,0x7f, 0x00,0x70,0x00,0xf8,0x1f,0x00,0x00,0x00,0x97,0x00,0x18,0xa0,0x01,0x00,0x00, 0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x55,0xbf,0x77,0xca,0x00,0x00,0x00,0x00, 0x00,0x6e,0xad,0xf6,0x00,0x00,0x00,0xf8,0xd3,0x7b,0x1c,0xf0,0xff,0x00,0x70, 0x00,0xe0,0x0f,0x00,0x00,0x00,0x37,0x48,0x1a,0x90,0x04,0x00,0x00,0x00,0x00, 0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x00, 0xb8,0x01,0x00,0x00,0xa8,0xfe,0xea,0xad,0x75,0x00,0x00,0x00,0x00,0x00,0xa8, 0x6a,0x75,0x00,0x00,0x00,0xff,0xcf,0x1f,0x1c,0xe0,0xff,0x01,0xf0,0x00,0x00, 0x07,0x00,0x00,0xc0,0x98,0x02,0x18,0x48,0x06,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x80,0x6b,0x1b, 0x00,0x00,0xf0,0xab,0xbf,0xde,0x2a,0x00,0x00,0x00,0x00,0x00,0xb7,0xad,0x3a, 0x00,0x00,0xe0,0xff,0x57,0x0f,0x0c,0x00,0xff,0x03,0xe0,0x3f,0x00,0x00,0x00, 0x00,0x00,0x27,0x90,0x18,0xb0,0x05,0x00,0x00,0x00,0x00,0xc0,0x80,0x3b,0x00, 0x00,0x00,0x00,0x00,0xc0,0x0e,0x00,0x00,0x00,0x00,0x0c,0xf3,0x1b,0x00,0x00, 0xa0,0xfe,0xd5,0xf5,0x35,0x00,0x00,0x00,0x00,0x80,0x5a,0xb5,0x1d,0x00,0x00, 0xf0,0xcf,0xaf,0x06,0x0e,0x00,0x80,0x03,0xf0,0x3f,0x00,0x00,0x00,0x00,0x80, 0xa7,0x04,0x12,0x98,0x06,0x00,0x00,0x00,0x00,0x80,0x81,0x3e,0x00,0x00,0x00, 0x00,0x30,0xc6,0x0d,0x00,0x00,0x00,0x00,0x98,0xd1,0x18,0x00,0x00,0xc0,0xab, 0x7e,0x5b,0x4a,0x00,0x00,0x00,0x00,0x80,0xaa,0xd5,0x0e,0x00,0xc0,0xf9,0x21, 0xd7,0x0e,0x0f,0x00,0x00,0x03,0xf8,0x1f,0x00,0x00,0x00,0x00,0x80,0x27,0x40, 0x18,0x40,0x01,0x00,0x00,0x00,0x00,0xc0,0x01,0x1b,0x00,0x00,0x00,0x00,0x30, 0x06,0x07,0x00,0x00,0x00,0x00,0xdc,0x71,0x0f,0x00,0x00,0x00,0xfd,0xd5,0xfe, 0x6e,0x00,0x00,0x00,0x00,0x40,0xdb,0x6a,0x07,0x00,0xf8,0xe1,0x51,0xef,0x9e, 0x0f,0x00,0x00,0x07,0xfc,0x0f,0x00,0x00,0x00,0x00,0xc0,0x3f,0x13,0x35,0xe0, 0x01,0x00,0x00,0x00,0x00,0x80,0x01,0x0e,0xa0,0x00,0x00,0x00,0xa0,0x87,0x03, 0x00,0x00,0x00,0x00,0xb8,0x60,0x07,0x00,0x00,0x00,0x54,0xbf,0x3b,0x33,0x00, 0x00,0x00,0x00,0x40,0xad,0xf6,0x03,0x00,0xfc,0xc1,0x49,0x75,0xfc,0x0f,0x00, 0x00,0x03,0x3c,0x00,0x00,0x00,0x00,0x00,0xe0,0x3f,0x01,0x3a,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x81,0x07,0x94,0x01,0x00,0x00,0xb0,0x81,0x01,0x00,0x00, 0x00,0x00,0xe0,0xf0,0x01,0x00,0x00,0x00,0xe0,0xef,0x1e,0x00,0x00,0x00,0x00, 0x00,0xa0,0xb5,0x92,0x01,0x30,0xfc,0x80,0x11,0x3d,0xfc,0x0f,0xe0,0x80,0x03, 0x0c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3f,0x49,0x35,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x03,0x03,0xc0,0x01,0x00,0x00,0xf0,0xe1,0x01,0x00,0x00,0x00,0x00, 0x70,0xe3,0x00,0x00,0x00,0x00,0x00,0xb4,0x07,0x00,0x00,0x00,0x00,0x00,0xd0, 0xaa,0xc9,0x00,0x3e,0xf0,0x80,0xcb,0x1e,0x3c,0x0f,0xe0,0xc1,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0xf0,0xdf,0x01,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf6,0x01,0x94,0x01,0x00,0x00,0xc0,0xd1,0x00,0x00,0x00,0x00,0x00,0xb0,0xd3, 0x00,0x00,0x00,0x00,0x00,0xda,0x07,0x00,0x00,0x00,0x00,0x00,0x50,0xb7,0xb6, 0x80,0x3f,0xe0,0x80,0xe3,0x0f,0x18,0x1e,0xc0,0xc3,0x03,0x00,0x00,0x00,0x00, 0x00,0x1d,0xf0,0xff,0xff,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x00, 0xa2,0x01,0x00,0x00,0x80,0xfb,0x00,0x00,0x00,0x00,0x00,0xe0,0x7d,0x00,0x00, 0x00,0x00,0x00,0xee,0x01,0x00,0x00,0x00,0x00,0x00,0x68,0xad,0xd7,0x80,0x1f, 0xe0,0x80,0xff,0x07,0x18,0x3c,0xc0,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x17, 0xe0,0x13,0xaa,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x80,0x88,0x01, 0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x00, 0x00,0xfa,0x01,0x00,0x00,0x00,0x00,0x00,0xa8,0x6a,0x2b,0x80,0x1f,0xe0,0x80, 0xff,0x03,0x38,0x78,0xc0,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x10, 0xdb,0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x00,0xa4,0x01,0x00,0x00, 0x00,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x00,0x80,0xef, 0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0xdb,0x3f,0x00,0x3e,0xe0,0x80,0xff,0x03, 0x38,0xf0,0x83,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x38,0x1c,0x6d,0x1f, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x80,0x90,0x01,0x00,0x00,0x00,0x1b, 0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x00,0x80,0x7a,0x00,0x00, 0x00,0x00,0x00,0x00,0xd4,0xec,0x01,0x00,0x3c,0xe0,0x80,0xff,0x21,0x30,0xe0, 0x87,0xa1,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0xf8,0x3f,0xfb,0xd9,0x01,0x00, 0x00,0x00,0x30,0x00,0x00,0x1d,0x00,0x5a,0x00,0x60,0x00,0x00,0x1d,0x00,0x1c, 0x00,0x80,0xee,0xb6,0x1f,0x00,0x00,0x00,0x00,0xc0,0x3f,0x00,0x00,0x00,0x00, 0x00,0x00,0x5a,0xf7,0x00,0x00,0x70,0xe0,0x40,0x7e,0x30,0xf8,0xc0,0x07,0xd0, 0x00,0x00,0x00,0x00,0x00,0x00,0x16,0xf8,0x1f,0xb6,0x66,0x01,0x00,0x00,0x00, 0x60,0x00,0x00,0xeb,0xee,0x1e,0x0f,0xd8,0x01,0xd8,0xb6,0x03,0x1b,0x0e,0xb8, 0xff,0xff,0x1a,0x00,0x00,0x00,0x00,0x60,0x1d,0x00,0x00,0x00,0x00,0x00,0x00, 0xb4,0x6a,0x00,0x00,0xf0,0xe0,0xb0,0x3e,0x30,0xf0,0x81,0x01,0x48,0x02,0x00, 0x00,0x00,0x00,0x00,0x1d,0xf0,0x1f,0xbd,0xb2,0x03,0x00,0x00,0x00,0xd0,0x00, 0xf0,0xfd,0xff,0xeb,0x1a,0xb6,0x7e,0xfb,0xfb,0x77,0xed,0xdb,0xff,0x06,0x00, 0x1d,0x00,0x00,0x00,0x00,0xb0,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x7a, 0x00,0x00,0xe0,0xe1,0x90,0x1e,0x70,0xf8,0x03,0x00,0x24,0x03,0x00,0x00,0x00, 0x00,0x00,0x37,0xe0,0x1f,0xf7,0xd2,0x0f,0x00,0x00,0x00,0xbd,0x41,0xff,0x17, 0x00,0xff,0x77,0xdf,0xfb,0x0f,0x1d,0xfe,0xff,0xfd,0x87,0x0d,0x00,0x1b,0x18, 0x00,0x00,0x00,0xe8,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x37,0x00,0x00, 0xc0,0xe1,0xa0,0x0c,0x70,0xf8,0x01,0x00,0xd8,0x02,0x00,0x00,0x00,0x00,0x00, 0xda,0xbd,0xfb,0x3a,0xb1,0x1a,0x1d,0xd0,0xc1,0xff,0xdd,0x55,0x1d,0x50,0xdc, 0xff,0x7f,0xdd,0xdd,0x16,0x00,0x1f,0x1f,0x00,0xdb,0xee,0x1e,0x1c,0x00,0x00, 0x00,0xb8,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x3a,0x00,0x00,0xc0,0xe1, 0x58,0x0d,0x70,0x78,0x00,0x00,0x4c,0x03,0x00,0x00,0x00,0x00,0x00,0x6f,0xd7, 0x56,0xbf,0xda,0x6d,0xb7,0xbb,0xfe,0x41,0x6b,0xfb,0x1b,0x00,0xe1,0x00,0xc0, 0x6b,0x6b,0x1f,0x00,0x00,0x00,0x80,0x6d,0x5b,0x1b,0x0c,0x00,0x00,0x00,0xe8, 0x03,0x00,0x00,0x00,0x00,0x00,0xc0,0xbf,0x1d,0x00,0x00,0x80,0x61,0xa8,0x1d, 0x7e,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0xba,0xed,0x95, 0xe8,0xfe,0xfa,0xef,0x3f,0xc0,0xde,0x56,0x1d,0xa8,0x68,0x00,0x80,0xdd,0xde, 0x0a,0x00,0x00,0x00,0x00,0xb7,0xed,0x1d,0x0e,0x00,0x00,0x00,0xfe,0x01,0x00, 0x00,0x00,0x00,0x00,0xc0,0xff,0x1e,0x00,0x00,0x80,0x67,0xd6,0xfd,0x7f,0x00, 0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0xef,0x5e,0x7d,0xb4,0x15, 0x1f,0xf0,0x01,0x80,0x75,0xbb,0x0f,0x04,0x74,0x00,0x00,0xb6,0x75,0x0f,0x00, 0x00,0x00,0x00,0xed,0xb6,0x4e,0x06,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x00, 0x00,0xc0,0xe0,0x7f,0x0d,0x00,0x00,0x00,0x7f,0xd4,0xfc,0x1f,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0xbf,0xff,0x1b,0xdb,0x1f,0x18,0x00, 0x00,0x80,0xde,0x6d,0x07,0xa8,0x32,0x00,0x00,0xed,0xae,0x07,0x00,0x00,0x00, 0x00,0xbb,0xdd,0x0f,0x07,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0xf8, 0xd1,0xff,0x0f,0x00,0x00,0x00,0xfe,0x6b,0xfe,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xf0,0xd1,0x0f,0x3d,0xed,0x00,0x00,0x00,0x00,0x00, 0x6b,0xdb,0x01,0x42,0x38,0x00,0x00,0x5b,0xf7,0x02,0x00,0x00,0x00,0x00,0xd6, 0x6b,0x85,0x03,0x00,0x00,0x80,0x3b,0x00,0x00,0x00,0x00,0x00,0xf8,0x55,0xfd, 0x0e,0x00,0x00,0x00,0xfc,0x74,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x61,0x7f,0x96,0x76,0x00,0x00,0x00,0x00,0x80,0xb6,0x6f, 0x01,0x10,0x1d,0x00,0x80,0xfe,0xaf,0x03,0x20,0x02,0x00,0x00,0xbd,0xbe,0xc7, 0x01,0x00,0x00,0xc0,0x3e,0x00,0x00,0x00,0x00,0x70,0xf8,0x6a,0xfd,0x07,0x00, 0x00,0x00,0xfc,0x75,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xb0,0xb1,0x3f,0x9b,0x7b,0x00,0x00,0x00,0x00,0x80,0xdb,0xbf,0x83,0x4a, 0x0e,0x00,0x40,0x0f,0x70,0x03,0xa0,0x04,0x00,0x80,0xeb,0xf3,0xee,0x00,0x00, 0x00,0x40,0x1f,0x00,0x00,0x00,0x00,0x7e,0xf0,0x5d,0xbd,0x07,0x00,0x00,0x00, 0xf8,0x3a,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0xd6, 0xea,0xb6,0xfd,0x36,0x00,0x00,0x00,0x00,0x80,0xfe,0xf0,0x0d,0x90,0x06,0x00, 0xc0,0x07,0xb0,0x0d,0x58,0x07,0x00,0x00,0xff,0xc1,0x7b,0x00,0x00,0x00,0xc0, 0x0d,0x00,0x00,0x00,0x00,0x7e,0xe0,0xea,0xdc,0x07,0x00,0x00,0x00,0xf8,0x1d, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x7b,0xbf,0xdb, 0x56,0x1f,0x00,0x00,0x00,0x00,0xe0,0x07,0xc0,0x1f,0x25,0x07,0x00,0x60,0x01, 0xc0,0x0e,0xa0,0x02,0x00,0xc0,0x0d,0x00,0x3f,0x00,0x00,0x00,0x70,0x0f,0x00, 0x00,0x00,0x00,0x7f,0xe0,0xaf,0x2c,0x07,0x00,0x00,0x00,0xf0,0x1e,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0xd6,0xd5,0xb6,0xed,0x0d, 0x00,0x00,0x00,0x00,0xa0,0x01,0x00,0x56,0xc2,0x03,0x00,0xd0,0x01,0x00,0x1b, 0x50,0x03,0x80,0x61,0x07,0x00,0x34,0x00,0x00,0x00,0xd8,0x07,0x00,0x00,0x85, 0x07,0x7c,0xd8,0xb6,0x6e,0x0f,0x00,0x00,0x00,0xa0,0x8e,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x6d,0xbb,0xdd,0x5b,0x07,0x00,0x00, 0x00,0x00,0xf0,0x01,0x00,0xb8,0xd4,0x01,0x00,0xf0,0x00,0x00,0x1e,0xa0,0x04, 0xd0,0xd1,0x03,0x00,0x3c,0x00,0x00,0x00,0xf0,0x03,0x00,0x80,0xf6,0x1f,0x78, 0xc8,0x5b,0x3f,0x1f,0x00,0x00,0x00,0x50,0x07,0x05,0x00,0x38,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0x03,0x00,0x50,0x01,0x00, 0xf0,0x01,0x00,0x3c,0xe1,0x00,0x00,0x78,0x00,0x00,0x1c,0xe8,0x06,0xc4,0xf0, 0x00,0x00,0x3e,0x00,0x00,0x00,0xbc,0x03,0x00,0x40,0xf6,0x3f,0x60,0xd6,0x6f, 0xfd,0x1f,0x00,0x00,0x00,0x50,0x87,0x07,0x00,0x56,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x54,0xc2,0x00,0x00,0x92,0x0a,0x00,0xd4,0x01, 0x00,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x03,0xe0,0x00,0x00,0x10, 0x07,0x00,0x00,0x00,0xea,0x01,0x00,0x20,0xf9,0xfc,0xe0,0xc4,0xb3,0xfc,0x3f, 0x00,0x00,0x00,0xa8,0x03,0x00,0x00,0xec,0x00,0x00,0x00,0x18,0x00,0x00,0x00, 0x00,0x00,0x40,0x15,0x54,0xe9,0x00,0x80,0x54,0x1a,0x00,0xea,0x00,0x00,0xa8, 0x38,0x00,0x28,0x12,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x80,0x00,0x03,0x00, 0x00,0x00,0xff,0x00,0x00,0xc0,0x36,0xf8,0xe0,0xf6,0xaf,0xfe,0x3f,0x00,0x00, 0x00,0xd4,0x03,0x00,0x00,0xbb,0x01,0x00,0x00,0x6a,0x00,0x00,0x00,0x00,0x00, 0xb4,0x0f,0xaa,0x60,0x00,0x40,0xaa,0x1a,0x00,0x65,0x00,0x00,0x40,0x1e,0x00, 0x34,0x48,0x00,0x00,0x00,0x00,0x40,0x80,0x00,0x10,0x00,0x00,0x00,0x00,0x00, 0xea,0x00,0x00,0x60,0x3e,0xe0,0xe0,0xff,0x77,0xde,0x70,0x00,0x00,0x00,0xd4, 0x01,0x00,0xff,0xee,0x01,0x00,0x80,0xed,0x00,0x00,0x00,0x00,0x80,0xfa,0x00, 0x55,0x74,0x00,0xa0,0x4b,0x1d,0x80,0x52,0x00,0x00,0x28,0x0f,0x00,0x92,0xe2, 0x00,0x00,0x00,0x00,0x00,0x49,0x01,0x42,0x24,0x00,0x0f,0x00,0x80,0x7f,0x00, 0x00,0x00,0x3d,0xe0,0xe8,0xff,0xab,0xee,0xf1,0x01,0x00,0x00,0xd6,0x00,0xf0, 0xfa,0xf5,0x01,0x00,0x80,0x76,0x00,0x2c,0x00,0x00,0xa0,0x1e,0x00,0x15,0x30, 0x00,0xd4,0xa9,0x1a,0xa0,0x28,0x01,0x00,0x40,0x07,0x00,0xc9,0xe9,0x00,0x40, 0x12,0x00,0x20,0x00,0x02,0x00,0x00,0xe0,0x03,0x00,0x40,0x75,0x00,0x1f,0x80, 0x37,0xc0,0xe8,0x9f,0x6f,0xbf,0xf1,0x03,0x00,0x00,0xf5,0x00,0xac,0x87,0xde, 0x00,0x00,0x60,0x7b,0x00,0xd7,0x00,0x00,0xa0,0x07,0x00,0x95,0x3a,0x00,0x64, 0x90,0x1c,0x40,0x95,0x02,0x00,0x94,0x03,0x00,0xb6,0x60,0x00,0x00,0x31,0x00, 0x00,0x49,0x06,0x70,0xf1,0x7f,0x00,0x00,0xe0,0x3f,0xe0,0x1f,0x00,0x30,0xc0, 0xdf,0x83,0xb6,0xac,0xf1,0x03,0x00,0x00,0x6a,0x00,0xfb,0xc0,0x75,0x00,0x00, 0xd0,0x75,0xc0,0xfa,0x00,0x00,0xd8,0x03,0x80,0x0a,0x1c,0x00,0x1a,0x50,0x0f, 0xa0,0xa4,0x18,0x00,0xe0,0x01,0x00,0xd3,0x7a,0x00,0x20,0x3c,0x00,0x40,0x00, 0x04,0x00,0x30,0x00,0x00,0x00,0xa0,0x3a,0xe0,0x1f,0x00,0x70,0xe0,0xca,0x43, 0xae,0x7e,0xf3,0x01,0x00,0x00,0x75,0xc0,0x7d,0x40,0x5f,0x00,0x00,0xb0,0x3e, 0x40,0xab,0x01,0x00,0xec,0x01,0x00,0x25,0x0d,0x80,0x0e,0x40,0x07,0x40,0x12, 0x35,0x00,0x74,0x00,0x00,0x28,0x39,0x00,0x00,0x19,0x00,0xc0,0x94,0x0c,0x00, 0x38,0x00,0x00,0x00,0xd0,0x1f,0xe0,0x0f,0x00,0x60,0xf0,0xfd,0x81,0x5e,0xbe, 0x23,0x00,0x00,0x80,0x3a,0xa0,0x1e,0x80,0xea,0x01,0x00,0x6c,0x1b,0xb0,0xd5, 0x01,0x00,0xeb,0x00,0xc0,0x02,0x0e,0x80,0x0e,0xa8,0x03,0xa0,0xaa,0x34,0x00, 0x39,0x00,0x00,0x7c,0x1e,0x00,0x50,0x1c,0x00,0x20,0x00,0x08,0x80,0x1c,0x00, 0x00,0x00,0x70,0x1c,0xc0,0x07,0x00,0xe0,0xfc,0xbe,0xc3,0x0e,0xff,0x06,0x00, 0x00,0x00,0x3a,0xe8,0x1f,0x80,0x5d,0x03,0x00,0xb8,0x1d,0xd0,0xbe,0x01,0x00, 0x75,0x00,0x40,0x29,0x07,0x40,0x07,0xe4,0x01,0xc8,0xa5,0x3a,0x0a,0x3a,0x00, 0x00,0x88,0x07,0x00,0x08,0x0f,0x00,0x09,0x22,0x19,0x00,0x1c,0x00,0x00,0x00, 0x0c,0x1f,0x80,0x0f,0x00,0xe0,0x7f,0x8f,0x43,0xfe,0xff,0x06,0x00,0x00,0x80, 0x1d,0x7c,0x0d,0x00,0xb7,0x07,0x00,0xd6,0x0e,0xbc,0xd2,0x01,0xc0,0x7a,0x00, 0x40,0x01,0x03,0x40,0x03,0xf2,0x00,0x00,0x94,0x1c,0x0d,0x1c,0x00,0x00,0xd2, 0x03,0x00,0xa2,0x07,0x00,0x00,0x08,0x18,0x20,0x0c,0x00,0x00,0x00,0xe4,0x0f, 0x00,0x0e,0x00,0xe0,0xff,0x07,0x83,0xfe,0x77,0x0d,0x00,0x00,0x40,0x1d,0xaa, 0x07,0x80,0xec,0x06,0x00,0x7b,0x0f,0xf0,0xae,0x01,0x80,0x36,0x00,0xa0,0xa4, 0x03,0xa0,0x43,0x3d,0x00,0x02,0x50,0x0f,0x0a,0x0d,0x00,0x00,0xe0,0x00,0x00, 0xc4,0x01,0x00,0x00,0x80,0x1c,0x00,0x0e,0x00,0x00,0x00,0xf2,0x1f,0x00,0x0e, 0x00,0xc0,0xaf,0x03,0xc7,0xfe,0xae,0x0e,0x00,0x00,0xa0,0x0e,0xfe,0x07,0x80, 0xb8,0x0e,0x00,0xad,0x07,0x49,0xdb,0x01,0x60,0x3b,0x00,0x50,0xc1,0x01,0x90, 0xaa,0x0f,0x00,0x00,0x20,0x07,0x0f,0x0d,0x00,0x00,0x75,0x00,0x80,0xe0,0x00, 0x00,0x00,0x20,0x1a,0x00,0x06,0x00,0x00,0x00,0xfe,0x1f,0x00,0x1e,0x00,0xc0, 0xff,0x01,0x8f,0xde,0xb5,0x1b,0x00,0x00,0xa0,0x0e,0x55,0x07,0x40,0xd0,0x0f, 0x80,0xd6,0x06,0x00,0xb5,0x01,0x50,0x35,0x00,0xac,0xd0,0x00,0x50,0xff,0x00, 0x00,0x00,0xc0,0x03,0x80,0x0c,0x00,0x00,0x70,0x00,0x00,0x74,0x00,0x00,0x00, 0x00,0x0c,0x20,0x06,0x00,0x00,0x00,0xd7,0x3f,0x00,0x1c,0x00,0xe0,0x77,0x80, 0x5f,0xbb,0xda,0x14,0x00,0x00,0xa0,0x0e,0xff,0x07,0x20,0x78,0x0d,0x00,0xbb, 0x07,0x80,0xad,0x01,0xd0,0x3a,0x00,0x52,0xe5,0x00,0xc8,0x03,0x00,0x00,0x00, 0xd0,0x01,0x00,0x0a,0x00,0x00,0x35,0x00,0x80,0x32,0x00,0x00,0x00,0x20,0x0d, 0x00,0x06,0x00,0x00,0x80,0x7a,0x3f,0x00,0x1c,0xc0,0xa8,0x3d,0x80,0x9f,0xd5, 0x6d,0x3b,0x00,0x00,0x40,0x87,0xab,0x06,0x10,0xac,0x0f,0xc0,0xd6,0x03,0x80, 0xd6,0x01,0x50,0x6b,0x00,0xa2,0x72,0x00,0xa8,0x01,0x00,0x00,0x00,0xe8,0x00, 0x40,0x11,0x00,0x80,0x30,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x0e,0x40,0x04, 0x00,0x00,0xc0,0x5f,0x7f,0x00,0x1c,0xc0,0xb4,0x0f,0x80,0x0f,0x55,0xab,0x6d, 0x00,0x00,0x70,0x47,0xfd,0x07,0x0c,0xd8,0x0e,0x90,0x6d,0x03,0x00,0x7b,0x03, 0x68,0x55,0x40,0xd5,0x3a,0x00,0x50,0x03,0x00,0x40,0x00,0x64,0x00,0x08,0x2a, 0x00,0x00,0x4a,0x00,0x50,0x35,0x00,0x00,0x00,0x00,0x07,0x08,0x0c,0x00,0x00, 0x80,0x6a,0xff,0x00,0x1c,0xc0,0x9d,0x03,0x00,0x80,0x94,0xb5,0x6a,0x00,0x00, 0x88,0xc3,0x57,0x0d,0x15,0x76,0x0f,0x48,0xb7,0x07,0x80,0x95,0x03,0xaa,0xb6, 0x51,0xa9,0x1a,0x00,0xaa,0x06,0x00,0x20,0x00,0x70,0x00,0x60,0x01,0x00,0x40, 0xc1,0x00,0x04,0x20,0x00,0x08,0x09,0x40,0x03,0x20,0x10,0x00,0x00,0xe0,0x3f, 0xff,0x01,0x18,0xc0,0xb7,0x3f,0x00,0x00,0xeb,0xdd,0xd6,0x00,0x00,0xb0,0x83, 0xfa,0xf7,0x0b,0xac,0x05,0xf3,0x5a,0x15,0x00,0xed,0x82,0x69,0xab,0xda,0xa8, 0x2a,0x80,0x90,0x0a,0x00,0x88,0x00,0x6d,0x80,0x9a,0x54,0x01,0x20,0x2a,0x00, 0xa0,0x4a,0x80,0x44,0x18,0x80,0x03,0x00,0x01,0x00,0x08,0xa0,0x6a,0xdb,0x03, 0x38,0xc0,0x9b,0x7f,0x00,0x00,0xd5,0x6a,0xb5,0x01,0x00,0xa8,0xe3,0x5f,0x5d, 0x07,0x7b,0xef,0x4c,0xef,0x0e,0x80,0xb6,0x76,0xb7,0xda,0x6a,0x51,0x55,0x55, 0x56,0x25,0x00,0x42,0x40,0x62,0x00,0x0e,0x45,0x14,0xa4,0x10,0x05,0x1d,0x00, 0xa0,0x01,0x12,0xc0,0x01,0x10,0x08,0x00,0x07,0xe0,0x7f,0xcf,0x03,0x38,0xd8, 0xdd,0x3f,0x00,0x00,0xea,0xad,0xae,0x01,0x00,0xd4,0xa1,0xea,0xef,0x83,0xd6, 0xaa,0xa7,0xb5,0x07,0x80,0x55,0xdb,0xd3,0xaa,0x6a,0xa8,0xaa,0xaa,0x53,0xaa, 0xaa,0x3c,0x00,0x55,0xa9,0x87,0x90,0xa2,0x3a,0xa4,0x50,0x4f,0x55,0xe5,0x90, 0x30,0xd0,0x00,0x00,0x00,0x80,0x03,0x70,0x55,0xef,0x07,0x70,0xc6,0xdf,0x07, 0x00,0x00,0x94,0xb6,0x6b,0x03,0x00,0xd4,0xe1,0x7f,0xf5,0x81,0x7f,0xff,0x61, 0xbb,0x03,0x00,0xda,0xea,0xa8,0x56,0x3d,0x6a,0x55,0xd5,0xa9,0xa9,0x92,0x1e, 0xa0,0x92,0xca,0x43,0x2a,0x10,0x8e,0x02,0x8a,0x23,0x00,0x70,0x00,0x2a,0x60, 0x00,0x90,0x20,0xe0,0x01,0xa8,0x7f,0xff,0x0f,0x70,0xe0,0x0f,0x00,0x00,0x00, 0xdd,0x5b,0xb5,0x06,0x00,0xd4,0xa1,0xaa,0xff,0x40,0xd5,0xea,0xc0,0xd6,0x01, 0x00,0x6f,0x7d,0x70,0xb5,0x9d,0xa0,0x55,0x94,0x50,0x55,0x55,0x0f,0x40,0x49, 0xe4,0x01,0x41,0xa5,0x07,0x54,0xe1,0x01,0x55,0x3d,0x40,0x40,0x32,0x00,0x00, 0x02,0x72,0x00,0xf8,0x2a,0xff,0x1f,0xf0,0xff,0x03,0x00,0x00,0x00,0xf6,0x6a, 0xad,0x0d,0x00,0xd4,0xc0,0xff,0x3a,0x80,0xbb,0x3f,0xa0,0xed,0x00,0x00,0xb5, 0x3b,0x90,0xab,0x0e,0xaa,0xaa,0xeb,0xa0,0x4a,0xaa,0x07,0x20,0xaa,0x72,0x80, 0x14,0xc2,0x43,0x01,0xe8,0xa0,0x00,0x0e,0x80,0x24,0x1c,0x00,0x20,0x00,0x3c, 0x00,0x50,0x7f,0xff,0x1f,0xf2,0xff,0x01,0x00,0x00,0x00,0xa0,0xb6,0x56,0x0d, 0x00,0xea,0x80,0xaa,0x1f,0xc0,0xd6,0x1e,0x60,0x7b,0x00,0x00,0xd5,0x1e,0xe0, 0xac,0xa7,0xb0,0xaa,0x54,0x40,0xa9,0xd2,0x01,0x50,0x25,0x3d,0x00,0xa2,0xf4, 0x00,0xaa,0x7a,0x00,0xaa,0x07,0x20,0x80,0x0e,0x00,0x00,0x11,0x0e,0x00,0xfc, 0x55,0xff,0xfd,0xfb,0x7f,0x00,0x00,0x00,0x00,0x60,0xab,0xeb,0x1a,0x00,0xea, 0x80,0xff,0x07,0x80,0xfd,0x07,0xc0,0x3d,0x00,0x00,0xb6,0x07,0xa0,0xf6,0x0b, 0x5a,0x55,0x6b,0x80,0x2a,0xf5,0x00,0xa0,0x94,0x1e,0x00,0x14,0x78,0x00,0x10, 0x1e,0x80,0xc0,0x03,0x00,0x92,0x07,0x00,0x00,0xc0,0x07,0x00,0xac,0x7e,0xb7, 0x3e,0xf9,0x3f,0x00,0x00,0x00,0x00,0xa0,0x6d,0x35,0x37,0x00,0x75,0x00,0xea, 0x01,0x00,0xeb,0x01,0x80,0x1e,0x00,0x00,0xda,0x03,0x40,0xf5,0x90,0x1c,0xab, 0x94,0x00,0x55,0x3d,0x00,0x80,0x52,0x0f,0x00,0xa0,0x1f,0x00,0xa4,0x0f,0x00, 0xfa,0x00,0x00,0xe1,0x01,0x00,0x80,0xe0,0x01,0x00,0xf4,0x57,0xdf,0xf9,0xff, 0x0f,0x00,0x00,0x00,0x00,0x80,0xb6,0xad,0x29,0x00,0x6a,0x00,0x00,0x00,0x00, 0x3e,0x00,0x80,0x0f,0x00,0x00,0xf8,0x00,0x00,0x3f,0x04,0x0f,0xfe,0xdd,0x00, 0xa6,0x0f,0x00,0x00,0xca,0x03,0x00,0xe0,0x03,0x00,0xf8,0x01,0x00,0x3e,0x00, 0x00,0x7e,0x00,0x00,0x00,0x7f,0x00,0x00,0xb8,0x7a,0x77,0xfd,0xbb,0x07,0x00, 0x00,0x00,0x00,0x80,0xaa,0xb6,0x6e,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x07,0x00,0x66,0x00,0xf0,0x01, 0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xdc,0x1f,0xd7,0xff,0xed,0x01,0x00,0x00,0x00, 0x00,0x00,0x6b,0xd5,0xb2,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xec,0xaa,0x7f,0x7d,0x7f,0x00,0x00,0x00,0x00,0x00,0x00, 0xac,0x55,0xcd,0x81,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x74,0xbf,0xbf,0xdb,0x3d,0x00,0x0c,0x03,0x00,0x00,0x00,0xab,0x5a, 0x35,0x03,0x35,0x00,0x00,0x00,0x00,0x18,0x1c,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x20,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00, 0x00,0xc0,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb8,0xab,0xff,0xbe,0x0f,0x00,0x08,0xe1,0xef,0x1f,0x80,0xa7,0xe7,0xea,0xf2, 0x7f,0x10,0xfe,0xf8,0x00,0x38,0x1c,0xfe,0x70,0xe0,0xc0,0x00,0x03,0x7f,0x08, 0x7b,0x90,0x7f,0xfe,0xf8,0xc0,0x0f,0x03,0x0e,0x7f,0x00,0xc6,0x30,0x04,0xc0, 0x00,0x82,0xc0,0x80,0x83,0x83,0x3f,0x86,0x00,0x00,0x00,0x00,0x00,0xdc,0xdd, 0xb7,0xeb,0x03,0x00,0x98,0x60,0x04,0x07,0x80,0x54,0x57,0x3a,0x87,0x70,0x10, 0x02,0x28,0x01,0x38,0x06,0x02,0xac,0x58,0xc1,0xc1,0x0d,0x45,0x40,0xda,0x10, 0x1c,0x92,0x28,0x63,0x80,0x83,0x1b,0x49,0x00,0x83,0x31,0x04,0x40,0x00,0xc2, 0xe0,0xe0,0x46,0x8c,0x24,0x86,0x00,0x00,0x00,0x00,0x00,0xe8,0x76,0xdf,0xfe, 0x00,0x00,0xd0,0x20,0x00,0x03,0x80,0x44,0xd5,0x0c,0x8a,0x71,0x10,0x02,0x08, 0x01,0x48,0x1a,0x02,0x04,0x08,0x40,0x21,0x00,0x01,0x29,0x43,0x11,0x0c,0x02, 0x08,0x23,0x80,0xc2,0x00,0x01,0x00,0x01,0x51,0x04,0x40,0x07,0xc6,0xa1,0x30, 0x40,0x80,0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0x78,0xdf,0x75,0x3f,0x00,0x00, 0x60,0xe0,0x03,0x03,0xc0,0x4c,0x49,0xcd,0x96,0xd8,0x1f,0x3e,0xf8,0x01,0x58, 0x0b,0x3e,0x78,0xf0,0x20,0x21,0x00,0x1f,0x84,0x43,0x13,0x0c,0x3e,0xf8,0xe1, 0x83,0x44,0x00,0x1f,0x00,0x01,0x91,0x04,0x40,0x06,0xa4,0x20,0x11,0xc0,0x83, 0x0f,0x92,0x00,0x00,0x00,0x00,0x00,0xa0,0x75,0xdf,0x0f,0x00,0x00,0x20,0x20, 0x01,0x03,0x40,0x8f,0x75,0x24,0xb6,0x58,0x00,0x2a,0xc8,0x40,0xd8,0x19,0x2a, 0x80,0x01,0xa3,0x22,0x0e,0x13,0xf0,0x43,0x16,0x0c,0x16,0x88,0x20,0xc0,0x44, 0x00,0x0b,0x00,0x81,0x11,0x05,0x40,0x00,0xaa,0x30,0x11,0x00,0x8d,0x05,0xa2, 0x00,0x00,0x00,0x00,0x00,0xe0,0xdf,0xf5,0x01,0x00,0x00,0x20,0x20,0x00,0x03, 0x60,0x00,0x6b,0x4d,0xd3,0x5a,0x10,0x02,0x88,0x50,0x99,0x18,0x02,0x00,0x01, 0xb2,0x22,0x08,0x01,0x75,0x42,0x18,0x0c,0x02,0x88,0x61,0x40,0xce,0x10,0x01, 0x00,0x83,0x10,0x07,0x40,0x00,0x98,0x90,0x33,0x04,0x88,0x00,0xe2,0x00,0x00, 0x00,0x00,0x00,0x00,0x75,0x3f,0x00,0x00,0x00,0x20,0xe0,0x0f,0x03,0x20,0x10, 0x48,0xfa,0xa1,0x59,0x10,0xfe,0x08,0xa9,0x9a,0x18,0xfe,0xdc,0xb8,0x11,0xc4, 0x0d,0x7f,0x3c,0x42,0x08,0x0c,0xfe,0x08,0x21,0x20,0x88,0x1f,0x7f,0x00,0xfc, 0x10,0x06,0xc0,0x1f,0x92,0x09,0xe2,0xc7,0x8d,0x3f,0xc2,0x00,0x00,0x00,0x00, 0x00,0x00,0xfe,0x03,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x00,0x00,0xaa,0x04, 0xa8,0x1c,0x10,0x40,0x00,0x25,0x05,0x00,0x40,0x50,0xa0,0x00,0x80,0x00,0x41, 0x0e,0x02,0x10,0x00,0x90,0x00,0x00,0x00,0x00,0x04,0x48,0x00,0x00,0x00,0x00, 0x40,0x08,0x00,0x00,0x00,0x01,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x34,0x55,0x1c, 0x00,0x00,0x00,0xa8,0x12,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x57,0x55,0x0d,0x00,0x00, 0x00,0x55,0xa9,0x0a,0x00,0x00,0x00,0x00,0x00,0x20,0xe5,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x54,0x55,0x0d,0x00,0x00,0x00,0x92, 0x8a,0x14,0x00,0x00,0x00,0x00,0x00,0x80,0x78,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x40,0xab,0xaa,0x0e,0x00,0x00,0x80,0x55,0x6a,0x2a, 0x00,0x00,0x00,0x00,0x00,0x2a,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x28,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x75,0x5b,0x0d,0x00,0x00,0x00,0x4a,0x15,0x65,0x00,0x00, 0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd6,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x94,0xaa,0x0e,0x00,0x00,0x00,0xa9,0xd2,0x52,0x00,0x00,0x00,0x00, 0x80,0xea,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x6c,0xd5,0x0a,0x00,0x00,0x00,0x55,0x2a,0xaa,0x00,0x00,0x00,0x00,0x48,0xf8, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x56, 0x1d,0x00,0x00,0x00,0x4a,0x55,0x55,0x01,0x00,0x00,0x00,0x90,0x3e,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x5a,0x15,0x00, 0x00,0x00,0xa8,0xa4,0x92,0x02,0x00,0x00,0x00,0x85,0x0f,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0xaa,0x35,0x00,0x00,0x00, 0xa4,0x2a,0x49,0x0a,0x00,0x00,0xa4,0xf0,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x75,0x00,0x00,0x00,0x28,0xa5, 0xaa,0x12,0x00,0x20,0x11,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x56,0x00,0x00,0x00,0xa0,0x94,0x54,0x4a, 0x25,0x49,0xc4,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb4,0xea,0x00,0x00,0x00,0x80,0xaa,0x4a,0x29,0x51,0x12, 0xfd,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x09,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x54,0xd5,0x00,0x00,0x00,0x00,0x56,0x29,0xa5,0x2a,0xc9,0x1e,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa8,0xaa,0x01,0x00,0x00,0x00,0xe0,0xa5,0x54,0x84,0xd4,0x12,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x40,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0xab, 0x01,0x00,0x00,0x00,0x00,0xfc,0x8a,0xfa,0x3f,0x19,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa0,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x80,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x55,0x03,0x00, 0x00,0x00,0x00,0x00,0xf8,0x1f,0xc0,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x40,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0xad,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x60,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x0d, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0xb5,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x50,0x55,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa8,0xaa,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x68,0xab,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50, 0x55,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x24,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0xaa,0x0e, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x92,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x6d,0x0d,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x6c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0xaa,0x0a,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x55,0x1d,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xd0,0xaa,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x50,0x55,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x50,0xad,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x6a, 0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xaa,0x3a,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x55,0x35,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xab,0x3a,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x40,0x55,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0xb5,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x40,0x55,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, 0xd6,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x64,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x35, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x3a,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x35,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x3a,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xd4,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x58,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x50,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0, 0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x0f,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; wanderlust-wanderlust-769699d/etc/icons/wl-alpha-xmas-logo.xpm000066400000000000000000002532211406661363500244370ustar00rootroot00000000000000/* XPM */ static char *wl-alpha-xmas-logo[] = { /* width height num_colors chars_per_pixel */ " 491 176 28 1", /* colors */ ". c None", "a c #000000", "b c #030404", "c c #0c1112", "d c #1d2628", "e c #295eb6", "f c #3162bb", "g c #3864bc", "h c #3b4c6e", "i c #3f65bb", "j c #4d6abf", "k c #596cbf", "l c #6771c4", "m c #6c73c4", "n c #6e6cad", "o c #7574c5", "p c #837aca", "q c #917dca", "r c #a582c4", "s c #b28bd4", "t c #c090d3", "u c #c994d2", "v c #d09ad9", "w c #e02828", "x c #e8b3d9", "y c #f4a460", "z c #ff0000", "A c #ffffff", /* pixels */ "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................AaAa...............................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................aAaa...............................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................AaAa...............................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................aaaa...............................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "..................................................................................................................................................................................................................................ssssssssss...............................................................................................................................................................................................................................................................", ".......................................................................iii................................................................................................................................................sssssssssssssssssssssssss........................................................................................................................................................................................................................................................", "......................................................................iiiib..........................................................................................................................................sssssssssssssssssssssssssstttttsss....................................................................................................................................................................................................................................................", ".....................................................................iiiiicc......................................................................................................................................sssssssssssssssssssssssssstttssssttttttst................................................................................................................................................................................................................................................", "....................................................................giiiiidb..................................................................................................................................rrssssrssssssssssssssssststsssssstttsttsttutttr..............................................................................................................................................................................................................................................", "...................................................................iiiiiiidb................................................................................................................................rssssssssssrsrsssssssssssssssssssstsssttttttttttttur...........................................................................................................................................................................................................................................", ".................................................................iiigiiiijhb.............................................................................................................................rsssssrsssssssssssssssssssssssstssssssttssststttttuututuq.........................................................................................................................................................................................................................................", "................................................................gggiiiiiiieb...........................................................................................................................rrsrrrssssssssssssssssssssssssssssssststssttttttAA.uttutuuutr.......................................................................................................................................................................................................................................", "...............................................................iiigigiiiiieb........................................................................................................................qrrrrrssrrsrssssssssssrsssssssssssssssssssstsststAAAwwatttttuuutrn.....................................................................................................................................................................................................................................", "..............................................................igggiiiiiiijhb......................................................................................................................qrrrrsrsrrsssssrssrssssssssssssssssssssssstststtstAAwwwwattuuutuuuuvn....................................................................................................................................................................................................................................", "............................................................ggiiiigigiiiiidb...............................................................................................................Aa..Aarqrrrrrrrsrsrssssssssssssssrssssssssssttssssstssttstwwwwwatttttutuuuutrh..................................................................................................................................................................................................................................", "...........................................................gggigggiiiiiiijdb..............................................................................................................AAaAaAAarrqrrsrsrsrssrssssssssssssssssssssssssssAAAAAAtssttsawwwauuuuuuuuutvvuuh.................................................................................................................................................................................................................................", "..........................................................ggggiiiigiiiiiiidb..............................................................................................................aaAaAaaaqrrrrrrrrssrsrssssssssssssssssstsssssssAAwwwwwwttsttttwwatttttutuuuuvuuvn................................................................................................................................................................................................................................", "........................................................ggggigggggiiiiiiijdb...............................................................................................................AaAaAaqrrqrrsrssrrssssssrsssssssssssssssssssssswwwwwwwwstttttAwwttutuuuuuuuuuvuvrh..............................................................................................................................................................................................................................", ".......................................................gfgggggiiiiggiiiiiibb...............................................lll...........................................................qqaAaAaarqrrrrrrrsssssssssssrsssrsrsssAAAAAssstsssawwwwwwatstttAwwwtuttututuuvuuuvurd.............................................................................................................................................................................................................................", ".....................................................fgggggiigggggiiiiiiijbb.............................................lllllmmi.......................................................qqAAaAaAAarrrrqsrrrrrrsssssssssssssssAA.wwwwwAssssssAwwwwww.tstttwwwatuuuuuuuuuuvvuvvrd............................................................................................................................................................................................................................", "...................................................ggfggggggiggiiiigiiiiiebb...........................................klllllllmlh....................................................qqqqaAaaaAaarrqrrrrrsssrrsssssssrsssssAAwwawwwwwwstsssAwwwwwwwattttAwaatttutuuuuuuuvuvvvrc............................................................................................................................................AaAa...........................................................................", "..................................................gffgfggggggiigggiigiiiidb...........................................lllllmmlmlmmd..................................................qqqqqqaarqaaqqrrrqsssrrrsrsssrssssssssAAwwaasawwwwwssssswwwwwwwwttttAwwtuttuuuuuuvuuuvuuvvnc...........................................................................................................................................aAaa...........................................................................", "................................................ffggfgfgggggiggiigiigiiiidb..........................................llnllllllmlmmeb...............................................qqqqqqqrqqrrqqrqrrrrrrrssssqrssssrssssrsAwwaasssswwwwwssssAwwaawwwwttttwwauutttutuuuuuuvvuvvvh.........................................................................................................................................Aa.Aa.Aa.........................................................................", "..............................................ffgggfggggggggggiggiiiiiiiibb.........................................klllllllmllmlmkb..............................................qqqqqqqqqrqqqqrrrrrrrrrsrrrssAAAAssssqnnAAwwannrsssawwwasss.wwwstwwwatttAwatttuuuuutvvvvuuvuvvvd........................................................................................................................................aAAaAAaa.........................................................................", "............................................fffgffggggfgfggggggiggiigiiiebb........................................lkklklllllllmlmlbc............................................qqpqqqqqrqrrrrrrrqrrrrrrrssAAAAwwwwbbbbbcAwwaa....cchdwwassusawwattwwwtttAwauutuuuuuuuAaAavvvvvvrc.......................................................................................................................................AaaAaaAa.........................................................................", "..........................................efffffffggffggggggigigiigiiiiidb........................................kkllllllllmmmlmmmbb..........................................pppqqqqqqqqrqqqqqqrrrrrrsrAAAAwwwwwwaa.....Awwa.........Aww.hnstAwasttwwwttAww.tuttuuuuuaAaauvuvvvvhc......................................................................................................................................aa.Aa.aa.........................................................................", ".................................AaAa...fffefffffffggggggggggggggigigiiebb.......................................klkllllllllllmllmlbb.........................................pqqqqqqqqqqqqqrqrrqrqrrrnhAAwwwwwwwwaa......Awaa.........Awwwa..hAwastsswwwAAwwwatuutuuuuAaAauvuvvvvvd................................................Aa..Aa..................................................................................AaAa............................................................AaAa...........", ".................................aAaaeffeffffffggfgfffggggggigiiigiiiiidbc.......................................lklkklllllllllmmmebb........................................ppqppqqqqqqqqrqqrqqrqpndbb.Awwwwwwwwaa.......Awa...........wwwa...Awwnttttwwwwwwwauuuuutvvaaaavvvuvvvvrb..............................................AAaAaAAa.................................................................................aaaa............................................................aAaa...........", "...............................Aa.AaeAafeefeffffefgggffgggggggggiigigiebb.......................................klkllknkllllmlllllhb.......................................ppqpqqqqqqqqqqqrqqrrAndbbc...awwwwwwwaa........Awa...........Awwa....wwa.rtttwwwwwwatuuuuuutuvvuuvvvvvvvvhc.............................................aaAaAaaa.................................................................................................................................................AaAa...........", "...................eee........eaAAaAAaaefefffffffgfffgggggggiggiggiiiidbc......................................knklkkllllllmlmmmmmdb......................................ppqppqpqqqqqqqqqAAAAAAw.........aaawwwa.........Aww...........Awww....Awa...rttwwwwwauttuuuuuuuuvvvvvvvvvvtb..............................................AaAaAa..................................................................................................................................................aaaa...........", "...................eeeeeeeeeeeeAaaAaaAafffffffgfgfggggfggggggggiiigiiebb......................................llkkllllllllllllllmkbb.....................................ppppppqpqqqqqqqAAAwwwwwwwa..........Awwa.........Awwa...........wwwa...Aww.....ttwwwwauutuuuuuuuuuuvvvvvvvvvdc.............................................aAaAaa.................................................................................................................................................................", "....................eeeeeeeeeeeaaeAafaaefefffffffggfgfggggggiiggggiiicbc.....................................kkkkkkkklllllllllmmlhbc....................................pqpppqppqqqqqqqqAwwwwwwwwww...........www..........wwa...........Awwa...Awwa.....sAwwwwtuutuuvvuvvvvuuvvvvvvvrb............................................AAaAaAAa................................................................................................................................................................", "....................eeeeeeeeeeeeeAaAaffefeefffgfffffggggggggggiiiiggdbb......................................kklknllkkklllllmllmmcb....................................ppppqpqqpqqqqqqoAAwwwaawwwwwa...........wwa.........Awa...........Awwa...Awww......Awwwwatuutuuvtuuuvvuuvvvvvvvcc...........................................aAaaaAaa................................................................................................................................................................", "....................eeeeeeeeeeeeeaaaaeefeffeffffffggfffggggggiggggihbb......................................kkkkllkklllllllmllmlhbb...................................pppqpppqpqpqqqnhbAwwaaa..wwwwa...........Awa.........Aww...........Awwa...Awwww......wwwwauuuutuuutvvuvvvvvvvvvvhb............................................aa..aa.................................................................................................................................................................", "....................eeeeeeeeeeeeeeeeeeeffffefffegffggggggggggggiiiebb......................................kkkkkkllkllklllllllmmcb...................................ppppppppqpqqqqhbbAAwaa.....wwwa...........Aww..........www..........Awwa..AAwwwww......aaaattuuuuuvuuvuvvuvvvvvvvrb...................................................................................................................................................................................................................", ".....................eeeeeeeeeeeeeeeeefeefffffgfffgfgffggggiggiggebb......................................jkkkkkkknlklllllllmllhbb..................................ppppAAAAApqqpecbb.Awwa.......waa...........Awwa.........Awwa........AAwwa..Awwwwwwa.......utuuuuuuvuuvuvvvvvvvvvvvvcc..................................................................................................................................................................................................................", ".....................eeeeeeeeeeeeeeffeffeffffffffgggggfgigggiggidbb.......................................jkkkklklklklnkllllllebb..................................pAAAAAwwwwwpndbb...Awwa........a............Awwa..........www........Awwaa...wwwwaaa........uutuuuuuvuvuuuvvvvvvvvvvhb..................................................................................................................................................................................................................", ".....................eeeeeeeeeeeeeeeeeeefefefffggfgfffggggggggedbb.......................................kkkkklkkklkllllllllmkcbc.................................AAAwwwwwwwwwwbbc....Awwa......................wwa...........wwwA.....AAwaa....aaaaa...........uutuuAAAAtvvvvvvvvvvvvvnb..................................................................................................................................................................................................................", "......................eeeeeeeeeeefeeeffefefeffffffggggfgggggiecbc.......................................kkkkkkkkkklkklllllllldbc.................................AAwwwwwaaaawwww......Awww......................Aww...........Awwww..AAAwwa......................uutAAzyyauvtuuvvvvvvvvrb..................................................................................................................................................................................................................", "......................eeeeeeeeeeeeeffeefefffffffffgfgfggggggdbbc........................................jkjkkkklnkklllllllllhbb.................................pAwwwwwaaqpdbwwwa......wwwwAAAAAAAA.............Awwa...........wwwwwAAwwwaa......................uAAAzzzAavuvvvvvvvvvvvvbc........AaAa.....................................................AA.........................................................AA...................................................................................", ".......................eeeeeeeeeeeeeeeeffffffffgffgggAaggAacbb.........................................kjkkkknkllkkkkklklllebb.........................AAAAAA..pppwwwwaapncbb.www.......wwwwwwwwwwww............Awwa............awwwwwwwaa........................AAAzzzAavvvvuvvvvvvvvvdb........aAaa.....................................................Aya........................................................Aya..............................................AAA.AA..............................", ".......................eeeeeeeeeeeeeeffeeefeffffgfffAAaAaAAac.........................................jjkkkkkkkkklllllklllebb.......................AAAAwwwwwwappppwwwwphbbc..Awwa.......wwwwwwwwwwww...........Awww..............aawwwaa.........................AAAzzzAauuvvvvvvvvvvvvhb......Aa.Aa.Aa...................................................Aya.......................................................AAya..........................................AAA.AyyaAya.AA..........................", "........................eeeeeeeeeeefeefffeffffffffggaaAaAaaa..........................................kkkkkklkkkknkklllllebb.....................AAAAwwwwwwwwwwpppppwwwabb....Awaa........aawwwwwwwwww...........wwwwAAAA............aaa...........................aaAAAzavuuvvvvvvvvvvvhb......aAAaAAaa..........................................AA.......AyyaAAA................................................AA.Ayya.....................................AA...Ayya.ayyayyaAya.........................", ".........................eeeeeeeeeeeeeeeefffffffggfffAaAaAa..........................................jjjkjkkkklkkkllklllebb.....................AAwwwwwwaawwwwwapppppwwac....AAwa............aaaaaawwwa.........AAwwwwwwwwa........................................AAzzzAAavvvvvvvvvvvvvnb......AaaAaaAa..........................................Aya......Ayaayyya.....................................AA...AA...AyaAyya.....................................Aya..Ayaa.AyyyaaaAya.........................", "..........................eeeeeeeeeeeffffffeffffgfgecaAaAaa.........................................kkkkkkkkkklklkklkklebb................AA....Awwwwaaaa..awwwapppphAww....AAwwa...................wwa........AAwwwwwwwwaa........................................AzzzzAAavuuvvvvvvvvvvnb......aa.Aa.aa..........................................Ayya......ayyyyaa.....................................Aya.AAya...ayayaa.....................................AyyaAAya..AyyaaAAyaa.........................", "...........................eeeeeeeeffeeeeeffffffffhbAAaAaAAa........................................jjjkkjkkkkklkklkllhbb..............AAAAwwa..awwwwa....pp.wwappphbAwww..AAwwwa...................Aww.......AAwwwwwwwwaa........................................AAzzzzAAaAAvvvvvvvvvusnb........AaAa.............................................aya......Ayyyaa.......ss.............................AyaAAyya...Ayyaa.......................................ayaAyaa..AyaaAyyaa..........................", ".............................eeeeeeeeefffeffffffedbbaAaaaAaa.......................................kkkkkkkkkkkkAaAakldbb..............AAwwwwwa....wwwa...opopawappdbb.wwwwAAwwwwa...................Awaa......Awwwaaaaaaa........................................AAzzzzzzyyAAavvvvvvvupoodc.......aaaa.............................................Aya.....AAyyaa.......sssrb...........................AyaAyaaa..AAyaa.........................................ayaya...Ayyayaaa...........................", "...............................eeeeeefeeeffffffecbc..aa..aa........................................jjjjkkkkkkkkaAaajdbb.........A......wwwwwaa.....wwa..oppppopandbb..Awwwwwwwwwa........AAA.......AAwa........waaa.............................................AAzzzzzzzzzAAavvvvvvupooohb........................................................Aya.....Ayyaa.......sssssbc..........................Ayyyya...AAyya..........................................AyyyaA..Ayyyaa.............................", "..................................ddddcceeefffebbc................................................kjkkjjkkkkkAakAaeAac.......AAAAwa....awwwwa......Aww.pooA.pppncbc...Awwwaawwwwa........Awww.....AAwwa........aa...............................................AzzzzzzzzzzAAavvvvvvqoooohb.........................................................aya.AAAAyaa.......ssssssbb...........................aayaa..AAyyaa..........................................Ayyyyya.Ayaya..............................", ".......................................eeffegebb.................................................jjjkjkkkkkkkaAAaAAaa......AAAwwwwa......wwwa......AwwaopAAwapncbc.....wwaa..wwww.........wwww....Awwwa.............................................AAAAA.......AzzzzzzzzyyyyaAAAAAAAooooob.........................................................AyyaAyyyaa........ssssssbb.............................ayaAAAyyya............................................ayyyaaAAyyaa..............................", "......................................egfffeecbc.................................................kkjkjjkkkjnkAaaAaaAa......Awwwwwaa......Awwa......AwwwAAAwwwncbc......Awa....wwww........AwwwwAAAAwwaa.............................................Ayyyya.....AAzzzzzzzzaaaayyyyyyyyaAooobb........................................................Aayyyayaa........sssssrsbb..............................ayyyyaaaa.............................................aaayyyyaaa...............................", "......................................feeefebb..................................................jjjjjkkjkjkkkaacAa.aa.......wwwwwa.......Awwa......Awwwwwwwwwabc.......Aww.....wwww.......Awwwwwwwwwaa..............................................Ayyyya.....AAAzzzzzAAavvAyyyyyyyyyyaoobb........................................................Ayyyyaaa........ssssssssbb..............................Ayyyya..................................................Ayyyya.................................", ".....................................effffecbc..................................................jjkjjkkkkkkkkhbAaAa.........awwwww.......Awwa......Awwwwwwwwwwc........Awwa.....wwwwAA.....wwwwaaaaaa...............................................Ayyyya.....AAAAAAAAAAauuAyyyyyyyyaayakbb........................................................Ayyyya..........ssssssssbb..............................Ayyyya..................................................Ayyyya.................................", "....................................eeeefecbc..................................................jjjkjjkjjkkkecbbaaaa...........wwwwa......Awwa.......wwwwaawwwaa.........wwa......wwwwww.....waaa....................................................Ayyyya.....AzzzAAAAzzavvAyyyyyyyyaoayaAAA...................................AA..................Ayyyya.........ssAAAAsssbb...........AA.................Ayyyya............AAA..................AAAAAAAAAAAAAAAAAAyyzza.................................", "...................................feffeecbc...................................................jjjkkjkkkjkjbbc.................awww......Awwa......oowwwancaaa..A.a....AAwwA......wwwwwa....aa...AaAa...............................................Ayyyya.....AzzzzzzzzzatuAyyyyyaaaaooayyyya..................................Aya................AAyyyyaAAAAAAAAAAAAyyyarnAAAA......AAAAyaA..........AAAAAAyyyyaAAAA......AAAyya..AAAA......AAAAAAyyyyyyyyyyyyyyyyyyyzza.................................", "...................................efeefdbc...................................................kjjjjjkjjkkkhbc...................Awww.....Awwa.....oopAwwacbc....Awa.....wwwww......wwaaa.........aAaa...............................................Ayyyya......azzzzzzzzavvAyyyyyaoooooAyyyya..................................Ayya...........AAAAAyyyyyyyyyyyyyyyyyyyyyaAAAyyya....AAyyyyyyaAAAAAAAAAAyyyyyyyyyyyyyyaAAAAAAyyyaaAAAyyyaAAAAAAyyyyyyyaaaaaaaaaaaaaaayyyya...x.............................", "..................................eeeeedbb....................................................jjjjjkjkjkkkbb.....................wwww....Awwa....ooooAwwabb.....Aww....AAwwwww......aa.........Aa.Aa.Aa.............................................Ayyyya......AyzzzzzzzauuAyyyyyaoooooAyyyyyaA............................AAAAAyyya.....AAAAAAyyyyayyyyaaaaaaaaaaaayyyyyyyyyyyyaAAAAyayyyyyyyayyyayyyyaaaaayyyyaaaaayyyyyyyyyyyyyyyyyyyyyyyyyaaaaayyya............Ayyyyaxxxxxv...........................", ".................................eeeefhbb....................................................jkjjjkjkjkjkhbb......................wwwa...Awwa....ooooowwab......Awwa...Awwwwwaa................aAAaAAaa.............................................AyyyyyaAAAAAAyyzzzzzyaAAAyyyyaaoooooAyyyyayya...AAAAA.......AAAAA....AAAAyyyyyyyyaAAAAAyyyyyyaaaayyyya.......ssssaayyaaaayyyyyyayyyyyyyyyyyyaaaaaaaaaAAAAyyyya....aaaaaaayyyyaaaayyyyaaaaaaa...AyyyyaAAAAAAAAAAAAyyyyaxxxxxxbc.........................", "................................eeefeebb....................................................AAAAjjjjkjkjkcb.......................Awwa...Awwa...ooooopAwa.......Awwa....wwwaaa.................AaaAaaAa.............................................AyyyyyyyyyyyyyyyyyyyyyyyyyyyyaoooooAAyyyyyyyyaAAAyyyyaAAAAAAAyyyyaAAAAyyyaaaaaayyyyyyyyyyyyyyyyyyyyyya......sssssssaaaqbbaaaaaaaaaaaaaayyyyyyyyyyyyyyyyyyyyyya...........aaaaa...aaaaa.........Ayyyyyyyyyyyyyyyyyyyyyaxxxxxnbb.........................", "................................eeeeebb...................................................AAAwwwwjjjkkjkhbb........................wwa...Awaa..oooooohAww....AAAAwwa....aaaa...................aa.Aa.aa.............................................AyyyyyyyyyyyyyyyyyyyyyyyyyyyyaoooooAyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyaaaa....Ayyyyyyyyyyyyyyyyyyyyyya......sssssssrsshbc..............ayyyyyyyyyyyyyyyyyyyyaa..................................ayyyyyyyyyyyyyyyyyyyyaxxxxxcb..........................", "...............................eeeeecbc...................................................Awwwwwwwjjjkjjcb.........................AwwA..Awa...oooookcAwwwAAAAwwwwwa.............................AaAa................................................ayyyyyyyyyyyyyyyyyyyyyyyyyyyaooooAAyyyyyyyyyaaaayyyyaaaaaaaayyyyaaaaaa........ayyyyyyyyyyyyyyyyyyyyaa.....ssssssssssscb................ayyyyyyyyyyyyyyyyyyya...................................Ayyyyyyyyyyyyyyyyyyyaaxxxxnbb..........................", "..............................eeeeedbc............................................AA......Awwwwwwwwjkjkebb..........................wwwwAAwa..oooooocbAwwwwwwwwwwaaa.............................aaaa.................................................ayyyyyyyyyyyyyyyyyyyyyyyyyyaooAAAyyyyyyyyyya...aaaya.......aaaaa.............Ayyyyyyyyyyyyyyyyyyyaa......sssrssssrshbb................Ayyyyyyyyyyyyyyyyyyaa...................................Ayyyyyyyyyyyyyyyyyyyaxxxxubb...........................", "..............................eeeedbb..........................................AAAAww.....jwwwwwwwwwjjkdb............................wwwwwww.omoooodbAAwwwwwwwaaaa.....................................................................................aayyyyaaaayyyyazzaaaaayyyyaooAyyyyyyyaaaaaa......aa.........................Ayyyyyyyyyyyyyyyyyaaa......ssssssssssqcb.................Ayyyyyyyyyyyyyyyyyaa....................................Ayyyyyyyyyyyyyyyyyyaaxxxucbc...........................", ".............................eeeeebb...........................................Awwwwwa...jjjaawwwwwwakebb.............................wwwwwwamoooohbAAwwwwwaaaa.........................................................................................Ayyyya..AyyyyazzavumAyyyyaoAAyyyyyyaa......................................Ayyyyyyyyyyyyyyyyya.......sssssssssssdbc................AAyyyyyyyyyyyyyyyyya.....................................Ayyyyyyyyyyyyyyyyyyaxxxxhbc............................", "............................eeeeebb.....................................AA.....Awwwwaa.jjjjjjjAwwwwwwkhbc.............................Awwwwwaooooncb.wwwaaaa............................................................................................Ayyyya..AyyyyazzzapoAyyyyaAAyyyyyyya.......................................Ayyyyyyyyyyayyyyyya.......ssssssssssnbb................AAyyyyaaaaaaaaayyyyya..........Aa..Aa....................AAyyyyyyyyyaaayyyyyyaxxxhbb.............................", "...........................eeeeecbc..................................AAAAwwa....wwwwa.jjjjjjjjAwwaawwwbb...............................wwwwwaoooodbc..waa.......................................................................................AAAAAAAAAyyyyaAAAyyyyazzzzaAAyyyyaAyyyyyyyaa......................................AAyyyyyyyyaaaaayyyyyaA....ssssrsssssnbb................AAyyyyaa.......AyyyyyaA........AAaAaAAa...................Ayyyyyyyyyaa..aayyyyyaxnbb..............................", "...........................eeeedbb...................................Awwwwwa.....wwwajjjjjjjjjAwaajAwwwc...............................Awwwwaooohbb....a........................................................................................Ayyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyayyyyyyyaa......................................AAyyyyaaaaaa....aayyyyya...rssssssssqcb.................Ayyyaaa.........aayyyyya.......aaAaAaaa.................AAAyayyaaaaaa....xaayyyyabb...............................", "..........................eeeeebb....................................Awwwwwa.....AwwajjjjjjjjjAwajkkwwwa................................wwwaamokbb..............................................................................................Ayyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyaa......................................AAyyyaaa...........aaayyya.sssssssssqcbc................AAyyya.............aayyya........AaAaAa..........vvv.....Ayyyyyaa........xxxxaayyab................................", ".........................eeeeecbc..........................AAAA......awwwwwa......wwajeejkjjjAAwajjkAwww.................................aaaooodbc..AaAa........................................................................................Ayyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyaa.......................................Ayyyya................ayya.ssssrssrpcbc................AAyyyaa...............ayyya.......aAaAaa.........vvvvcc..AAyyyyaa.........xxxxxxayac................................", "........................eeeeedbc....................AaAaAAAAwwwwA......wwwwa....ijAwwebgjjjjjAwwwAjjAwwww................................mmmomhbb...aAaa........................................................................................Ayyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyaa........................................Ayyaaa................Ayyyasrsssssqcbc.................Ayyyaa.................ayya......AAaAaAAa.......vvvvhbb..Ayyyaaa.........xvxxxxucaya................................", "........................eeeeebb.....................aAaaAwwwwwwwww......awwa...jjjAwwadjjjjjjjwwwwwAAwwwwa...............................ooookcb....AaAa................fff......................................................................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..................pppppp.................qaaacb.................aaaasssssspcbc...................aaaa...................aaa......aAaaaAaa.....vvvvvrbb....aaaa...........xxxxxxdbcaa................................", ".......................eeeeecbc...................Aa.AawAawwaawwwww......Awa..jijjAwwajjjjjjjjAwwwwwwwwwww..............................omommdbc....aaaa..............fffgge.........................................................................................vsmmmooomqvvvrbb.................ppppppppppd.............qqqrncbc...................ssssssspcbc....................s................................aa..aa.....vvvvvvnbc...........vvvxvvvxxvxxxhbb...................................", "......................eeeeehbb....................aAAaAAaaaaa..wwwwwa....AwwjAAiAAAwwwjjjjjjjAAwwwwawwwwwwa............................momooibb.......................ggfgggb...........................ii................................................lllllmkn...upmmmmmmquvvvdbc...............pppppppppppphb...........qqqqqhbc...................rssssssqcbc............AaAa...ssssn........................................vuvvvvvvc...........vvvvxvxxxxxxxrhh........x...........................", ".....................eeeeeebb.....................AaaAaaAaa.....awwwa....AwwwAwwAwwwwwajjjjjjAwwwaaabaaawww............................mmmmmdbc......................fggffggbb........................ijjjib...........................................klllkhcbbb....tmmmmmmqvvvvrbb..............oppppppppppppphb..........qqqqqqhb....................ssrrrsqcbc.............aAaa.sssssssb......................................vvvvvvvvvrc.........vxxxvvxvxvxxxxxxxxxxxxxxxu...........................", ".....................eeeeedbc.....................aa.Aawaaa......Awwa....AwwwwwwwwwwwwajjjjjjAwwaajjb...AwwwA.........................mmmoohbb...............eeeeeffffffgffebb......................iiiijjebc.......................................kllkjdbbc.......uqommooqvvvvvdbc.............ppohdhnppppppppdb.........qqqqqqqqn....................rsssrpcbc............Aa.Aa.Aasssstrbb...............tttt.................uuvuvvvvvvvrd........vvvvvvxvxxvvxxxxxxxxxxuhbbc..........................", "....................eeeeeebb........AAAA............AaAawwa.......wwa...iAwwwwwwwaawwwajjjjjjAwwajkjdb..Awwwww........................mmomocb............eeffeehdbbdfffgfggdbc.....................iijijiidb..........jjjjj.......................klllicbb..........ummmmmqvuvvvrbb............opp.bbc..ppppppppcb........qqqqqqqqqqqn.................sssssqcbc.............aAAaAAaassssshbc..............tttuurb...............vvvvvvvvvvvvrc........vvxxxvxxvxxxxxxxxxrndbbc............................", "...................eeeeeedbc.....AAAAwwwwa..........aaaaAwa.......Awa..iijwwwwaaaa..awwjjjjjjjwwajjjhb..Awwwwwa......................momomhbb..........eeeeedbbc...fffffffebb.....................ijijijjebb........jjjjjjjhc....................lkkkdbb............rllomquvuvvvdbc...........pop.bc....ppppppphbb.......qppqqqqqqqqqqqo...............rrsspcbc..............AaaAaaAassssrcb..............tttttutbc...............uvvvvvvvvvvvnc.........hhhrvxxxnnnnhhdbbbc...............................", "..................eeeeeeebb......Awwwwwwwa..............Aww......AAwaiiiiiAwwwa.....iAwajjjjjAAwwjkjib..Awwwwaa......................mmmmmcb.........eeeeecbb......ffgfffghb.....................iiiiiiiidbc.......jjjjjjjjjb..................klklkcbc............upommpvvuvuuhbb...........popcb.......ppppphbb........pqqqqqqqqrqqqqqod............sssrnbbc...............aa.Aasaasssrhbc.............ttttttthbb.............uuvtuvvvvvvvvvvd............xxxxrbb........................................", "..................eeeeeehbc......Awwwwwwaa...............wwa....AAwwaiiiijAwwaa....jjAwajjjjjAwwwwkjjhc..waaaa.......................mmmmhbb.......eeeefebbc.......fffgffgfe....................iiiiijjjhbb.......jjjjjjjjjjdb................kkkkjcbc.............smmlotuvvvvrcb...........opodb........pppphbb..........qqqqqqqqqqrrqqqdc...........rrsnbb...................AaAasstsrcbc.............tttttturcb.............vv..brvvvvvvvvvvnb..........vvvvvdbc........................................", ".................eeeeeeedb........wwwwwaa................Aww..AAAwwaaiiiedbwww.....jiAwwkjjjAAwwwwwjjib...a.........................mmmmocb.......eeeeeebb..........fgfgfggged.................iiiijjiiicb.......jjjjjjjjjjjdb...............kkkllhbc.............uqmmmsuvuuvvhbc..........opohbc.......pppphbb..........qqpqqqqqqqqqqqqrdb..........rssnbb....................aaaassshbbc.............tttttturcbc............u...c..vvvvvvvvvvrb..........xxxxrbb.........................................", "................eeeeAAAebb.........wwwww.................AwwwAAwwwwagiiecbcAwwa....jjAwwwAAAAwwwwwwajjhc............................ommmhbb.....eeeeeeecbc..........fffgffggged................iiiiiiijhbb......jjjjjjjjjjjjhb..............klknkjbb..............ullmsuuvvuvnbb...........opnbb.......pppndbb..........pp.cbnoqqqqqqqqqhbb..AaAa....rrrcbc...................ssstssncbb...............stttttrcbc............u..c.....vvvvvvvvvvbc........vvvxxhbc.........................................", "...............eeAAAAwwwbc..........awwwa................Awwwwwwwaaaiihbb...wwa....jiAwwwwwwwwwaawaajkib...........................mmoomcb.....eeeeeeehbb............ffffgggfghc..............iiiiiiijebb......jjijjjjjjjjjjeb.............kkklkkhbc..............rmmouvuuuvrcb...........poocb......ppppnbbc..........p.......pqqqqqrrhbb...aAaa....qshbc....................ssssshbbc...............ttttttncbc............u..........vvvvvvvvvbb........vxxvxbb..........................................", "...............eAAwwwwwww............Awwa.................wwwwwwaagiedbb....Aww....jjAwwwwwwaaaajjajjkjhc..........................mmmmhbb....eeeeeeeedb............gf.gfffggfgc.............igiiiijiihbc.....j..bhjjjjjjjjjeb.............kkklkkdb..............smmlruvvvuvhbc...........ooibb...oppppnbbb...........q.........qqqqqqdbb....AaAa...rrsbb....................ssssshbb................ststtthbb..........................vvvvvvvrbb........vvxvnbb..........................................", "..............ee.wwwwwwwwa...........Awww.................Awwwaaaiiecbc.....Awww...jj.wwwaaaajjjjkjkjjkkc.........................mlmmmdb.....eeeeeeeebb...........ff..efggffggdb............iiiiijiijcb.....j..c..jjjjjjjjjeb............kkkkklkdb.............qolmmsuuuuvnbb...........opppooppppnhcbbc........................qqqqdbb.....aaaa...srrbb....................ssssnbb................sttttthbb............................vvvvvvnbc.......xvxvxhb...........................................", ".............eeeeawwwwwwww............wwwa................Awwwaigihbbc.....AAwwww..jjjaaaajjjjkjjjjkjkjkeb........................mlmoibb....eeeeeeeeebb...........f....ffgggggdb...........giiiiiiiiebb............jjjjjjjjeb...........jkkkkklkhb............mpplmmsuuuurbb............ooonhddbbbbc............................qqqdbb.............srrhb...................ssstsdbc...............ttstttnbb.............................vvvvvvdb........xvxvvhb...........................................", ".............eeeeeeawwwwwwa...........Awwa........A.......gwwaagedbb.......Awwwwwa.ijjjjjjjjjjjjjjjkkkkkkd........................mmmmdbc...eeeeeeeeeecb..........f.....fgfgfggdb...........iiiiiiijihbc............jjjjjjjjeb...........kkkkkkkkeb...........lptommmouuvvcbc...........opoodbc.................................qqqdbb.............rrsssd...................sssssdb................ssttttcb...............................vvvvrbb.......vvvvxxhb...........................................", "............eeeeeeeeAwwwwww...........Awwa........Awa...gggAwaiecbc.........wwwwaa.jjjjjjjjjjjjjjjjjjjjkkib......................mmmmkbb....eeeeeeeeeedb........fe.....gfggggggbb..........igiiiijiijdb.............jjjjjjjjjb...........kkkkknkkkhc.........lmtulllmmquuhbb............oopoib..................................qqnbb............r.rrrrssh.................ssssssnb...............tttstttcb............u..................vvvvdbc.......vxvvvvrb...........................................", "...........eeeeeeeeeAwwwwwww..........Awwa........Aww..ggggAwwdbb...........aaaaa...jjAajjAajjjjjjjkjkkkkkhc.....................lmlmhbc...eeeeeeeeeeeec.......ef......gfffffgebb........i.iigiiiiiiidb.............jjjjjjjjjcb........jkkkkkklllllh.......lllstsmmmmmlqhbb............oopopohc....................pp..........qqqdb............r..rrrsrrsn................sssssssnc............ssssstssthb...........t.....uuu...........vvvnbb........vvxxxxxnc...............x..........................", "...........eeeeeeeeeAwwaawwww..........wwa........AwwaggfggAwwwAAA..................jAAaAaAAajjjjjjjjjjkjkkd....................mlmlmdb....eeeeeeeeeeeeeh....fff.c....fgggggfgebc......ig..iiiiiiijiiehi............jjjjjjjjjhb......kk.kkkklkkkkkklej..lllllnutrlmmmmmmkd............o.oooopohd..................pp..........qqqqbb..........rr..drrrssrssrq.............sssssssssnh..........ssttttttstth.........uu..c..uuuvrd.........vvtcb.........vvvvvxvxnh............xx...........................", "..........eeeeeeeeeeAwaaebwwww.........Aww........AwwagggggAwwwwwww..................aaAaAaaajkjkjkkjkkkkkkjb...................lmmmibb....eeeeeeeeeeeeeeeeefee.b.....ffffffggeb.....gg..chiigiiiiiijiie.c..........jjjjjjjjjjh....jkj..kjkkkknkkllklllllllkhtuupmlllmmmmmn.........oo..ooppoppon...............pqq.c........qqqqqdb........qrr.cb.ssrrrsrsssssrr.......sssssssssssssrs......sss.ssssttttttn......tuu..c..uuuvuvhc.......vvvdbc........vvvvxxvxxvxr........xxx..c..........................", "..........eeeeeeeeeeAwweehAwwwa........Awwa.......AwwafggeAAwwwwwwaa.................jAaAaAajjjjjjjkjjkkkkkkec..................mmmmhbc...eeeeeeeeeeeeeeeeeefdbb.....fffggggffgdh.gggg.cb..iiggiiijiiiebb...........jjjjjjjjjjjjjjkjkdbckkkkklkkkklkkllklljdrttupmmmmllmmommmlmmmmooo.chooopoopopooo..........ppp..b.......qqqqqqqnb......rrrqhbb..rsrsrsrsrsssssssssssss.nssssssssssssssssssstchtttsttttttttttuuttscb....vvuuuuub.......vvnbb.........xvvvvxxxxvvxxxxxxxxxxxncb...........................", ".........eeeeeeeeeeeAwwweAAwwww.........www.....ffAwwaggec.wwwwaaaa...................aAaAaajjjjjjjjjkkjjkjkkd.................lllmlcb....eeeeeeeeeeeeeefeffdbb.....fgggfffgggggggggebbc..igiiiiiiiiiebb............jjjjjjjjjjjjkjkecbc.kkkkkkllklklllllljcnttutpllmlmmmmmoomooooooodbc.opoopppppppppppppppppppphbb........pqqqqqqqnnqqqrrqqqcbc...rrsrsrsssrssssssssssnbbnssssssssssssssssssnbbhssstststttttttttuhbb....uuuuvvvvhb.....vvvbb..........vxxvxvvvxxxxxxxxxxxxucbb............................", ".........eeeeeeeeeeeAwwwwAwwwwww........Awwa..ffgAAwwaedbb.aaaaa.....................AAaAaAAajjjjjkjjkkkkkjkkic................mmlmibb....eeeeeeeeeeeeeefeecbb......fgffggfgggggggedbb....iiiigiiiijebb..............jjjjjjjjjjkkjhbb...kkkknkklnlkkkklkkchutttuqmlmmmmmmmmoooAaooAabb..ooopooopppppppppppppppndbb........qqqqqqqqqqqqqqqrqpcbc....rrrrsrrssrssssrsssshbb..sssssssssssssssssdbb..ttstststtttttturdbb.....uuuuuuuurc....vvvcb............vvvxxxxxxvxxxxxxxxnbbc.............................", "........eeeeeeeeeeeeAwwwwwwwwwwww.......AwwwAAAAAAwwwacbc............................aAaaaAaajjjjjjkkjjjkkkkkkec...............llmmhbc....eeeeeeeeeeeeeeeebbc......fffgfgfggfggggecbc.....ggiiiiiiiebb...............jjjjjjjjjjjjdbb....kkkkkkkkkklllllechutuuutslmmmmmmmmmmmAAaAaAAa...opoopppppppopppppppppncbc........pqqqqqqqqqqrqrqrqnbbc.....rrssrsssssssssssrqdbb...ssssssssssssssssdbb...sststtttttttutncbc......uuvuuvvvvrh.vvv.cb.............vxvvvvvxxxxxxxxxuhbb...............................", "........eeeeeeeeeeeeAwwwwwwwwwwwwa......Awwwwwwwwwwwwab...............................aajjaajjjjjjjkkkkjkkkkkkkhc.............mmmmmdb......eeeeeeeeeefeedbb........fffgffffgfgfedbb.......iggiiiijebb................jjjjjjjjjjicbb......kkkkkklkkkklkhbdttttttuumllllommmommaaAaAaaa....ppoooopoppppppppppphbbc.........qppqqqqqqqqrqqqrhbb........rrsrrrsssssssssncbc....ssssstssssstssrcbb....tsttttttttttthbb.........uuuuuuuvuvuvvhbb..............vxvxxxvvxvxxxxxncbc................................", "........eeeeeeeeeeeeAwwwwaaaaawwww....eAAwwwwwwwwwwaaa...................................jjjjjjjjjkjjjjkkkkkkklld.............llllkbb......eeeeeeeeeeehbbc.........fffffgggfgedbbc........giiiiiiebb.................jjjjjjjjjhbbc.......kkkklkklllljdbcstttuuutthmmmmmmmmmmooAaAaAa......ooppppppppppppppndbb...........pqqqqqqqqqqqqrodbb..........rrsssrsrssssqdbb.......sssssstssssshbbc......tsssttttttncbb..........tvvuvvvuvuvrcbb................vxvvvxxxxxxxtdbb..................................", ".......eeeeeeeeeeeeeAwwaaaeeeeAwwwaeeefAwwwwwwaaaaaa......................................jjjjjkkjjkjkjkkjkkkkkkjc............mmmmebc.......eeeeeeeehcbb...........fffffffgedbbc...........iggiiebb...................jjjjjjedbb..........kkklkknkkhcbdsuttttttrdbemmllmomoommaAaAaa.......oooopopppppppphbbc.............qqqqqqqqqqqqncbc............rrrsrssssphbbc.........sssssssssndbb.........ttsttttrhbbc............uuuuuvvvrhbbc..................vxxxxvxvxuhbbc...................................", ".......eeeeeeeeeeeeeAwaaeeeeeeewwwwAefe.wwwaaaahcbc.......................................jjjjjkjkkjkjkjkkkkkkkkkec..........mlllldb..........eeehdbbb..............ffgfgedbbc.............iiiidbb....................jjjjihbbc............kkkkkjhcbb.utttutturcbc..mmmmmmmmhAAaAaAAa.......opppppppppphcbb................pqqqqqqqqohbbc..............rprsssndbbc............rsssssndbbc...........stssnhbbc...............uuvvurhbbc.....................vvvxxxrhbbc.....................................", ".......eeeeeeeeeeeeeAwaeeeeeeeAAwwwwweefaaaafecbb..........................................jjjjjjjkjkjkkkkklkkllllh..........mmmmmcb..................................edbbb.................iedbb.......................hdbbc................hdcbbc..tuttttttrcbc....jhehedbbaAaaaAaa.........hnpppnhdbbb....................nqqqrohcbc...................dbbbb.................hhhbbb................hcbbc...................hdbbbc.........................hhhbbbc.......................................", ".......eeeeeeeeeeeeeAwweeeeeeeAwwwwwaafeeffedbbc............................................jkjkkkjkjkkkkkkkklkkkkld.........lmmmkbb..........................................................c.....................................................ttttttturcbc..............aa..aa.............cbbbc.........................hddbbc......................................................................................................................................................................", ".......eeeeeeeeeeeeAAwww.eeeeeewwaaaaefffehcbc...............................................kklkkjkkkkklkklkllllklkc........mmmmebc...............................................................................................................stuuututnbbc............................................................................................................................................................................................................................................", ".......eeeeeeeeeeeeAwwwwwaeeeeefaaefeeeeedbb..................................................mmllnkjkkkklkklkkknlllic......mmommdb...............................................................................................................tttuuvvuhbb..............................................................................................................................................................................................................................................", ".......eeeeeeeeeeeeAwwwwwaeeeeeeeeeeeeedbbc............cd....dd..............................ddpomkkkklllllllllmllmmohd.....ppppodc.....................................dd.....ddd...............................................................stuthcuvhcc...................................................................................ddddd.......................ddddddd.........................................................................................................................", ".......eeeeeeeeeeee.wwwaaaeeeeefeeefedbbc...............du...dxx..ddddddd.dddddddd..........dhhrqpmlkhhnmomhhmmlmkhhhkh..cddhhhhnccd.....c....cdddddd...ddddd...........ddh....dhnx...ddddddd....ddd......ddd......dd........dd......cdddddd....sttturdxhdcd.....c..dddddddd..ddddddd...ddddd......dddddd....dd.......ddd....ddddddd..........dhxxrhh....dd....d...........druurrrx...d.....d......dd.......ddd.....ddd.....ddddddd...dd....d..............................................................", ".......eeeeeeeeeeeeeaaaaeeeeeeeeeeedbbc.................hh..drx...drrrrrrx.rrhhrrrx.........drrhxpollhdhrophrvomndnrrhhd..rrdrrrrhddx....hx...drrrrrrx..drrrrd..........dhhu..dhnrx...drrrrrrx.ddrrnh...ddrrnh.....dhh.....cdnrhd....drrrrrnx.tttttturdxdd.dd....hx..rrhhrrrx.drrrrrnx..drrrrhh...dnxxxxux..dhdx....ddnrnd...drrrrrnx........dnx....hh...ddr...dx..........hx.........cu...ddr....dhdx....ddnrnd...d.rrhh...drrrrrnx..ddr...dx.............................................................", ".......eeeeeeeeeeeeeeeeeeeeeeeeeedbbc....................hnhnx....dx.........hhx............dxxhx.omlnrhnqphruondtxxuvhrd..vhrxvrhddx....hx...dx........dx...hr.........dnrn..hrnnx...dx.......dxx..ux..dux..ux....dxdx...d.xx..rx...dx.....xttttssuuhdx...dnh...hx....hhx....dx........dx...hh...dr........dxhr...dhxx..ux..dx..............dx......hx..drd...dx..........hrhhh......hh...dhr....dxhr...dhxx..ux..hx...xx..dx........drd...dx.............................................................", "........eeeeeeeeeeeeeeeeeeeeeeedbbc.......................hnx.....dhhdd......dhx...........dnx.hn..omnrthrqhruphhxsqqqhnrd.rhrxrhd.dhhhhhhx...dhhdd.....dhdddhx.........dhxhuhhxhnx...dhhdd.....dddd.....dddd.....dnxhr...dx.........dhddd..uuttttsrdddx...dxhh..hx....dhx....dhddd.....dhddddrx..dhhdd.....dx.h...dx........dhddd...........dx......hx..dx.h..hx..........hrrnhx.....nhr.d.hr....dx.h...dx........dhdd.....dhddd.....dx.h..hx.............................................................", ".........eeeeeeeeeeeeeeeeeeehcbbc.........................hux.....drrrrx.....dhx...........dhhhhhu..linurhrhrvphnxqqpphnxnhrhuxrhd.hxxxxrnx...drrrrx....drrnhxx...ppp...dhxhhhuxhnx...drrrrx.....urrhh....urrhh...drn.hx..dx..ddd....dnrrruxvttttthccddx...dx.hh.hx....dhx....dnrrrr....drrrhxx...drxxrx...dhr.hr..dx........dnrrrr..........dx.....dhx..dx.nh.hx..........hxxxxx.....n.h.dxhr...dhr.hr..dx.........xrrhd...dnrrrr....dx.nh.hx.............................................................", "..........eeeeeeeeeeeeeeeedbbc............................hu......dx.........dhx..........dhxxxxrn...hnuprhhrvqodxqpppdxxqnqdrxrdc.dx....hx...dx........dx..hr..qqppppqrhhx.hrx.hhx...dx............rhx......rhx.dhrnnhr..dr...xnr...drx.xxxutttrdbb..dx...dx..hhhx....dhx....drx.......dx..hn....dr.......drrnhh..dn....d...drx.............hh.....drx..dx..hhhx..........hx.........n.hd.xdr...drrnhh..dn....d........hx..drx.......dx..hhhx.............................................................", "............eeeeeeeeeeddbbc...............................dr......dnhdddd....dhx..........dx.....hx...nspprdrvppnhhnhhnxsppqdrvqcc.dx....hx...dnhdddd...dx...hxsqqppppqrhhx.hxx.dhx...dnhdddd..ddd.dd.x.ddd.dd.x.dx....dx..hhd.ddr...dhhnnhhvuthbbc...dx...dx...hnx....dhx....dhhdddd...dx...hr...dr......d.x...hr..hhddddr..dhhdddd..........ndddddnx...dx...hhx..........hnhhddd....h..hx.dr..d.x...hr..hhddddr..ddd.ddx..dhhdddd...dx...hhx.............................................................", "..............dddddbbbb....................................r.......rrrrrrx....rx...........x......u...huopprrupppurrrxxuqpponuvpcc..x....nu....rrrrrrx...u...nrqqqpppppqnrxsrx...rx....rrrrrrx..xrrrxx...xrrrxx...x.....u...rrr.xx...hrrrrrrxrdbb.....nx....u....rx.....rx.....rrrrrnx...r....r....r.......x.....r...xrrrxx...rrrrrnx..........xrrrxx.....r....ru..........nrrrrrru.......x..r...x.....r...xrrrxx...urrrxx...rrrrrnx...r....ru.............................................................", "........................................................................................................lmoquuoooopuuuppoomorushcc...........................svsqppppppqsvvsssq.....................................................tvxxxxxxrccc...........................................................................................................................................................................................................................................................", ".........................................................................................................kmooolmmmomooooommmopphb............................qqppppppppqqrrqrqrrh.................................................sstttuuundcc.............................................................................................................................................................................................................................................................", "..........................................................................................................kllllllllmmlmllmmmommhb...........................ppppppppppppqqqqqqqqqh..............................................ssssssttndcb...........................................................................................................................................................................................................Aa..Aa..............................................", "...........................................................................................................lklkllllllllmlllmmmmhb...........................ppppppppqqppppppqqqqqqc...........................................ssssssssrdbbc...........................................................................................................................................................................................................AAaAaAAa.............................................", ".............................................................................................................klklkkkllllllmlllmdb...........................ppppppppppppppqqpqqqqqnb........................................ssssssssrhbbc.............................................................................................................................................................................................................aaAaAaaa.............................................", "..............................................................................................................lkllllllllllmmmlldb...........................opppppppppppppqqpppqqqqd......................................ssssssssrhbbc................................................................................................................................................................................................................AaAaAa..............................................", "...............................................................................................................kkklkllkllllllmmkb............................pppppppppppppppppqpqqqqd...................................ssssssssndbbc..................................................................................................................................................................................................................aAaAaa..............................................", "................................................................................................................kklklllllllmllllhc...........................pppppppppppppppqppppqqqqd...............................sssssssssndbbc...................................................................................................................................................................................................................AAaAaAAa.............................................", ".................................................................................................................kklkllllllllmmmmd............................pppppppppppppppqqqqqqqqqh...........................sssssssssqhcbbc.....................................................................................................................................................................................................................aAaaaAaa.............................................", "..................................................................................................................klkklllllmlllllib............................pppppppppppqppqqpqqpqqqqnn.....................rrsssssssssndbbc.........................................................................................................................................................................................................................aa..aa..............................................", "....................................................................................................................llknllllllmmmldc............................pppppppppqpppppppqqqqqqqqpo..............rrrssssssssssqhcbbc...............................................................................................................................................................................................................................................................................", ".....................................................................................................................lllllllllllmmkb..............................nppppppppppqqqqpqqqqqqqqqqqqqqqqrqrrrrrrsrsssrsssqhdbbc.........................................................Aa..Aa...................................................................................................................................................................................................................", "......................................................................................................................lklllmmlmmllmhc...............................nppppppppppppqqqqqqqqqrqrqrrrrqrrrrrrsrsAaAanhcbbc...........................................................AAaAaAAa..................................................................................................................................................................................................................", ".......................................................................................................................llllllllmmmmib.................................nhnppppppqpppqqqqqqqqqqrqqqrqrrrrsrrrsaAaabb...............................................................aaAaAaaa..................................................................................................................................................................................................................", "........................................................................................................................llllmlmllmlmdc....................................hhhqqpqqqqqqqqqqrqrqrqrrrqrrrnndAabAa.Aa................................................................AaAaAa...................................................................................................................................................................................................................", "....................................AaAa................................................................................llllllmmlmlmib.........................................dddhhnnqqqqqqqqrnnnhddcbbbcaAAaAAaa................................................................aAaAaa...................................................................................................................................................................................................................", "....................................aAaa................................................................................llllmlllmmmlmcc.................................................bbbbbbbbbc........AaaAaaAa...............................................................AAaAaAAa..................................................................................................................................................................................................................", "....................................AaAa................................................................................llllmmmllmmmmhb...................................................................aa.Aa.aa...............................................................aAaaaAaa..................................................................................................................................................................................................................", "....................................aaaa................................................................................lllllllmmmmmmkb.....................................................................AaAa..................................................................aa..aa...................................................................................................................................................................................................................", "........................................................................................................................lllllmlllmlmmmdc....................................................................aaaa............................................................................................................................................................AaAa...........................................................................................................................", "........................................................................................................................llllllmmmlmlmmhb....................................................................................................................................................................................................................................aAaa...........................................................................................................................", "........................................................AaAa............................................................lllmllllmmmommkb....................................................................................................................................................................................................................................AaAa...........................................................................................................................", "........................................................aAaa............................................................llllllmmlmmmmmmdc...................................................................................................................................................................................................................................aaaa...........................................................................................................................", "......................................................Aa.Aa.Aa..........................................................lllmlllmlmmlmmmhb..................................................................................................................................................................................................................................................................................................................................................................", "......................................................aAAaAAaa..........................................................llllmlmlmllmmomhb..................................................................................................................................................................................................................................................................................................................................................................", "......................................................AaaAaaAa...........................................................lllmlmlmmmmmommb..................................................................................................................................................................................................................................................................................................................................................................", "......................................................aa.Aa.aa...........................................................llllllmlmmmmmmmdb..........................................................................................................................................................................................................................................................................................................................................................AaAa...", "........................................................AaAa.............................................................llllmlmlllmmmmmdb..........................................................................................................................................................................................................................................................................................................................................................aAaa...", "........................................................aaaa.............................................................lllmlmlmmmlmmmmeb........................................................................................................................................................................................................................................................................................................................................................Aa.Aa.Aa.", ".........................................................................................................................lllllmlmmmmmoomib........................................................................................................................................................................................................................................................................................................................................................aAAaAAaa.", "..........................................................................................................................lllllmlmmlmmmmmbc.......................................................................................................................................................................................................................................................................................................................................................AaaAaaAa.", "..........................................................................................................................lmlmlmlmmlmmommbb.......................................................................................................................................................................................................................................................................................................................................................aa.Aa.aa.", "..........................................................................................................................llmlmlmlmmmmmmmdb.........................................................................................................................................................................................................................................................................................................................................................AaAa...", "..........................................................................................................................llllmlmmmlmmoomdb.........................................................................................................................................................................................................................................................................................................................................................aaaa...", "...........................................................................................................................llllmllmmmmmmodb...........................................................................................................................................................................................AaAa.................................................................................................................................................................", "...........................................................................................................................mmllmmlmmmmmmmdb...........................................................................................................................................................................................aAaa.................................................................................................................................................................", "...........................................................................................................................llmmllmolmmmmmdb.........................................................................................................................................................................................Aa.Aa.Aa...............................................................................................................................................................", "............................................................................................................................llmmmlmmmmmomdb.........................................................................................................................................................................................aAAaAAaa...............................................................................................................................................................", "............................................................................................................................lllllmmmmoommdb.........................................................................................................................................................................................AaaAaaAa...............................................................................................................................................................", ".............................................................................................................................mmmmmlmmmmomdb.........................................................................................................................................................................................aa.Aa.aa...............................................................................................................................................................", ".............................................................................................................................lllllolmmmmmcb...........................................................................................................................................................................................AaAa.................................................................................................................................................................", "..............................................................................................................................mmmmmmmmmombb...........................................................................................................................................................................................aaaa.................................................................................................................................................................", "..............................................................................................................................lllmmmmommhbb................................................................................................................................................................................................................................................................................................................................................................", "...............................................................................................................................mlmlmmmmmdb.................................................................................................................................................................................................................................................................................................................................................................", "................................................................................................................................mlmmmomhbb.................................................................................................................................................................................................................................................................................................................................................................", ".................................................................................................................................mmmmmicbc.................................................................................................................................................................................................................................................................................................................................................................", ".....Aa..Aa........................................................................................................................hddbbc..................................................................................................................................................................................................................................................................................................................................................................", "....AAaAaAAa...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "....aaAaAaaa.............................................................................................................................................................................................................................................................................................................................................................................................................AaAa..............................................................................", ".....AaAaAa..............................................................................................................................................................................................................................................................................................................................................................................................................aAaa..............................................................................", ".....aAaAaa..............................................................................................................................................................................................................................................................................................................................................................................................................AaAa..............................................................................", "....AAaAaAAa.............................................................................................................................................................................................................................................................................................................................................................................................................aaaa..............................................................................", "....aAaaaAaa..............................................................................................................................................AaAa.............................................................................................................................................................................................................................................................................................................................................", ".....aa..aa...............................................................................................................................................aAaa.............................................................................................................................................................................................................................................................................................................................................", "..........................................................................................................................................................AaAa.............................................................................................................................................................................................................................................................................................................................................", "..........................................................................................................................................................aaaa.............................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................." }; wanderlust-wanderlust-769699d/etc/icons/wl-beta-logo.xbm000066400000000000000000001351721406661363500233050ustar00rootroot00000000000000#define wl_beta_logo_width 464 #define wl_beta_logo_height 160 static char wl_beta_logo_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xa2,0xa8, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x14,0x04,0x2a,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x28,0xa1,0xa2,0x80,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x80,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x24,0x85,0x08,0x10,0x2a,0x28,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x80,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x49,0x28,0xa5,0x8a,0x80,0x82,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x6d, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x40,0x24,0x45,0x48,0x40,0x18,0x24,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x76,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x92, 0x10,0x85,0x2a,0xbc,0x08,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x6b,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x48,0x24,0xa5,0x28, 0x00,0x3f,0x42,0x44,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x7d,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x22,0x49,0x12,0x02,0x2a,0xbf, 0x28,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x80,0xb7,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x55,0x92,0xa4,0x14,0x01,0x3d,0x02,0x54, 0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x6d,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x94,0x08,0x09,0x11,0xc2,0xaf,0xb0,0x90,0x00,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa0,0xbb,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x52,0x52,0xa4,0xe8,0x1f,0x32,0x44,0x24,0x21,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x6d, 0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x8a,0x8a,0x24,0x01,0xc5,0x9f,0x68,0x11,0x02,0x84,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0xb7,0x6b,0x00, 0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x29,0x29, 0x09,0x7c,0xa8,0x3f,0xe2,0x84,0xa8,0x10,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x6d,0x7d,0x00,0x00,0x00, 0x00,0x00,0xa0,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0xa4,0xa4,0x10,0xff, 0x11,0x7f,0x68,0x50,0x00,0x82,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xb5,0xdb,0x76,0x00,0x00,0x00,0x00,0x00, 0x58,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x12,0x49,0x8a,0xff,0xa3,0xfe, 0x62,0x05,0x92,0x20,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xc0,0xdf,0xb6,0x3b,0x00,0x00,0x00,0x00,0x00,0x6a,0x35, 0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0xaa,0x92,0x82,0xa3,0x07,0xfe,0xc9,0xa0, 0x04,0x88,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x78,0xb5,0x6d,0x3d,0x00,0x00,0x00,0x00,0x00,0xad,0x6a,0x00,0x00, 0x00,0x00,0x00,0x40,0x25,0x49,0x40,0xd4,0x95,0x5e,0xfd,0xc1,0x0a,0xa0,0x02, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd6,0x6e,0xdb,0x36,0x00,0x00,0x00,0x00,0x00,0x55,0x6b,0x00,0x00,0x00,0x00, 0x00,0x80,0xa8,0x24,0x8c,0xc2,0x69,0x1d,0xac,0xc7,0xa0,0x0a,0x28,0x11,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x7a,0xdb, 0xbd,0x3b,0x00,0x00,0x00,0x00,0xc0,0x6a,0xd5,0x00,0x00,0x00,0x00,0x00,0x50, 0x95,0x82,0x7f,0xdc,0x1f,0xd8,0x0b,0xce,0x0b,0x20,0x01,0x24,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0xd7,0x76,0x6b,0x1d, 0x00,0x00,0x00,0x00,0x40,0xab,0xea,0x00,0x00,0x00,0x00,0x00,0x24,0x49,0xe0, 0xff,0xcf,0x00,0x10,0xf8,0xfe,0x91,0x04,0x90,0x60,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0xbd,0xdb,0xb6,0x1f,0x00,0x00, 0x00,0x00,0x50,0x55,0xd5,0x00,0x00,0x00,0x00,0x00,0x90,0x24,0xfd,0x7f,0xc0, 0x00,0x30,0x18,0xfc,0x43,0x50,0x05,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0xd7,0xb6,0x6d,0x1d,0x00,0x00,0x00,0x00, 0xa0,0xda,0xf6,0x00,0x00,0x00,0x00,0x00,0xaa,0xaa,0xfc,0x07,0xe0,0x00,0x30, 0x30,0xf8,0x13,0x02,0xa0,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0xba,0x7a,0x6f,0xb7,0x0f,0x00,0x00,0x00,0x00,0x70,0xab, 0x6a,0x00,0x00,0x00,0x00,0x80,0x4a,0x80,0x7c,0x07,0x40,0x00,0x30,0x30,0xf8, 0x47,0x11,0x09,0x82,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0, 0x01,0x5e,0xdf,0xd7,0xba,0xdb,0x0e,0x00,0x00,0x00,0x00,0x58,0x55,0x75,0x00, 0x00,0x00,0x00,0x40,0x09,0x5e,0x1e,0x07,0x80,0x00,0x30,0x30,0xf0,0x13,0x44, 0x20,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xfe,0xf5, 0x6b,0xbd,0x6d,0x6d,0x07,0x00,0x00,0x00,0x00,0x56,0xad,0x75,0x00,0x00,0x00, 0x00,0x50,0xe2,0xdf,0x07,0x02,0x80,0x00,0x60,0x30,0xf0,0x87,0x10,0x04,0x09, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xab,0x5e,0xbd,0x6b, 0xb7,0xbb,0x07,0x00,0x00,0x00,0x00,0xaa,0x55,0x75,0x00,0x00,0x00,0x00,0x48, 0xf9,0xdf,0x00,0x06,0x80,0x00,0x70,0x30,0xc0,0x27,0x42,0x41,0x80,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xfe,0xeb,0x6e,0xdd,0xdb,0xed, 0x03,0x00,0x00,0x00,0x00,0xb5,0xb6,0x3a,0x00,0x00,0x00,0x00,0xa0,0x7c,0x3e, 0x00,0x0e,0x80,0x01,0x70,0x60,0x80,0x83,0x08,0x14,0x25,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xab,0xbe,0xf5,0x77,0xbd,0xda,0x01,0x00, 0x00,0x00,0x80,0x56,0xd5,0x3a,0x00,0x00,0x00,0x00,0x54,0x9c,0x3b,0x00,0x0c, 0x80,0x01,0x70,0xf0,0x01,0x03,0x82,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x80,0xfe,0xeb,0xaf,0xda,0xd6,0xf7,0x00,0x00,0x00,0x00, 0x80,0x6a,0x55,0x1d,0x00,0x00,0x00,0x00,0x95,0xcc,0x3b,0x00,0x1c,0x00,0x03, 0x70,0xf0,0x07,0x00,0x28,0x92,0x28,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xab,0xbe,0xda,0x6f,0x7b,0x7d,0x00,0x00,0x00,0x00,0xa0,0xad, 0xaa,0x1e,0x00,0x00,0x00,0x00,0x54,0xfe,0x38,0x00,0x1c,0x00,0x03,0x70,0xf0, 0x03,0x00,0x00,0x00,0x02,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xfe,0xd7,0xbf,0xba,0xad,0x3b,0x00,0x00,0x00,0x00,0x60,0xd5,0xb6,0x0e, 0x00,0x00,0x00,0xfc,0x91,0x3e,0x00,0x00,0x18,0x00,0x07,0x70,0xf0,0x03,0x00, 0x50,0x49,0x88,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab, 0xfa,0x6a,0xd7,0xd7,0x1e,0x00,0x00,0x00,0x00,0xa0,0x5a,0x55,0x0f,0x00,0x00, 0x80,0xff,0x57,0x1d,0x00,0x00,0x38,0x00,0x06,0x38,0x00,0x00,0x00,0x00,0x10, 0x20,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x5f,0xff, 0xbb,0x7a,0x0f,0x00,0x00,0x00,0x00,0x58,0xab,0xaa,0x07,0x00,0x00,0xe0,0xff, 0x93,0x0d,0x00,0x00,0x38,0x00,0xfc,0x38,0x00,0x00,0x00,0x90,0x84,0x82,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0xea,0x55,0xed,0xde, 0x07,0x00,0x00,0x00,0x00,0xa8,0xd5,0xb6,0x03,0x00,0x00,0xf0,0x8b,0xd7,0x39, 0x00,0x00,0x70,0x00,0xf8,0x1f,0x00,0x00,0x00,0x00,0x20,0x08,0x18,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x7f,0xbb,0xb7,0xeb,0x01,0x00, 0x00,0x00,0x00,0x68,0x6d,0xd5,0x01,0x00,0x80,0xf0,0x25,0xf7,0xfc,0x1f,0x00, 0x70,0x00,0xf0,0x0f,0x00,0x00,0x00,0x40,0x85,0x40,0x1a,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0xd5,0x6e,0x6d,0xfd,0x00,0x00,0x00,0x00, 0x00,0xac,0xaa,0xea,0x00,0x00,0xfc,0xc0,0x29,0x7e,0xf8,0xff,0x00,0xf0,0x00, 0xc0,0x07,0x00,0x00,0x00,0x00,0x10,0x12,0x18,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf0,0xbf,0xdb,0xbb,0x3f,0x00,0x00,0x00,0x00,0x00,0xd6, 0x56,0x7b,0x00,0x00,0xfe,0xc1,0x29,0x1f,0xf0,0xf7,0x01,0xf0,0x04,0x80,0x00, 0x00,0x00,0x00,0x00,0x41,0x00,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb0,0xea,0xbd,0x6e,0x0f,0x00,0x00,0x00,0x00,0x00,0x5a,0xb5,0x3a, 0x00,0xe0,0xff,0x81,0x57,0x0f,0x00,0xe0,0x01,0xf0,0x1f,0x00,0x00,0x00,0x00, 0x00,0x00,0x08,0x49,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc0,0x7f,0xeb,0xf5,0x03,0x00,0x00,0x00,0x00,0x00,0x6b,0xab,0x1d,0x00,0xf8, 0xff,0x41,0x07,0x07,0x00,0xc0,0x01,0xf0,0x1f,0x00,0x00,0x00,0x00,0x00,0x00, 0x22,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xaa, 0x5f,0xef,0x01,0x00,0x00,0x00,0x00,0x80,0x55,0xb5,0x0e,0x00,0xf8,0x81,0x43, 0xc3,0x07,0x00,0x80,0x01,0xf8,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x24, 0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xf5,0x7a, 0x00,0x00,0x00,0x00,0x00,0x80,0xb6,0xad,0x07,0x78,0xf8,0x80,0x53,0xff,0x07, 0x00,0x00,0x01,0xfe,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0x36,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0xaf,0x3f,0x00,0x00, 0x00,0x00,0x00,0xc0,0x5a,0xd5,0x03,0x7e,0x70,0x00,0xa0,0xfe,0x03,0x00,0x80, 0x01,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x39,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0x1e,0x00,0x00,0x00,0x00, 0x00,0x40,0xd5,0xea,0x01,0x7e,0xe0,0x60,0x28,0xfe,0x07,0x60,0x80,0x03,0x3c, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x00,0x35,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xd4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x07,0x00,0x00,0x00,0x00,0x00,0x70, 0x57,0x1d,0x00,0x38,0xc0,0x70,0x54,0xfe,0x07,0xc0,0xc0,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x10,0xa4,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x88,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfa,0x07,0x00,0x00,0x00,0x00,0x00,0xa0,0x6a,0xdb, 0x0f,0x30,0xc0,0xfb,0x54,0x3d,0x0e,0xc0,0xe1,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x41,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa2,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xdc,0x01,0x00,0x00,0x00,0x00,0x00,0xb0,0xb5,0xde,0x0f,0x30, 0xc0,0xff,0xaa,0x1d,0x1c,0xc0,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x08,0xa4,0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x94,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xeb,0x01,0x00,0x00,0x00,0x00,0x00,0xd8,0xae,0xcf,0x07,0x30,0xc0,0x7f, 0xa5,0x19,0x3c,0xc0,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42, 0x50,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xfe, 0x00,0x00,0x00,0x00,0x00,0x00,0x54,0xd5,0x83,0x07,0x30,0xc0,0xff,0xea,0x1d, 0x70,0xc0,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x42,0x75, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x94,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x7b,0x00,0x00, 0x00,0x00,0x00,0x00,0xa8,0xf5,0x01,0x0e,0x30,0x80,0x7f,0xe1,0x18,0xf0,0xc1, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x58,0x35,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xc8,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x3e,0x00,0x00,0x00,0x00, 0x00,0x00,0x6e,0xed,0x00,0x0e,0x38,0x80,0x67,0x79,0x18,0xe0,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x35,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x80,0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x1f,0x00,0x00,0x00,0x00,0x00,0x00, 0xb4,0x76,0x00,0x0c,0x38,0x00,0xa3,0x1a,0x38,0xc0,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x14,0xa8,0x3a,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xd0,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x75, 0x00,0x18,0x38,0x00,0x53,0x39,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x40,0x56,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x80,0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18, 0x00,0x00,0x00,0xf8,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x3a,0x00,0x70, 0x30,0x00,0xaf,0x32,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa9,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0xc8, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x1c,0x00,0x00, 0x00,0xa8,0x03,0x00,0x00,0x00,0x00,0x00,0x80,0x6a,0x3d,0x00,0x60,0x30,0x00, 0x56,0x39,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x28,0xaa,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xe5,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x0c,0x00,0x00,0x00,0xf4, 0x03,0x00,0x00,0x00,0x00,0x80,0x83,0x56,0x1b,0x00,0x60,0x38,0x00,0x2e,0x7c, 0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55, 0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x70,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0xdc,0x01,0x00, 0x00,0x00,0x00,0xf0,0x47,0xb5,0x1d,0x00,0xc0,0x79,0x00,0x86,0x7f,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x55,0x1d,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x75,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0x00, 0x00,0xf0,0x8f,0xad,0x0e,0x00,0xc0,0x3f,0x00,0xfe,0x3f,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0xaa,0x0e,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x48,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x92,0x07,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0xe0, 0xff,0xd6,0x0e,0x00,0x80,0x7f,0x00,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0xaa,0x0e,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x15,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x03,0x00,0x00,0x80,0x3a,0x00,0x00,0x00,0x00,0x18,0x80,0x3f,0x6b, 0x0f,0x00,0x80,0x3f,0x00,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x48,0x55,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x40,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4, 0x01,0x00,0x00,0x80,0x3f,0x00,0x00,0x00,0xc0,0x7f,0x00,0x7f,0x5d,0x07,0x00, 0x00,0x3f,0x40,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x55,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95, 0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xe0,0x00,0x00, 0x00,0xc0,0x1d,0x00,0x00,0x00,0xe0,0x7f,0x80,0xff,0xaa,0x07,0x00,0x00,0x7e, 0x80,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa0,0x2a,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x48,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x60, 0x0f,0x00,0x00,0x00,0xfe,0x7f,0x80,0x7f,0x6d,0x03,0x00,0x00,0x3e,0x40,0x1d, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x95,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x32,0x00,0x00,0x00,0xb0,0x0f,0x00, 0x00,0x80,0xff,0x63,0x20,0xef,0xb6,0x03,0x00,0x00,0x3c,0x40,0x1d,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x95,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xc9,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x80,0x01,0x00,0x00,0x38,0x00,0x00,0x00,0xd8,0x07,0x00,0x00,0x80, 0xff,0x61,0x18,0xd7,0xd5,0x03,0x00,0x00,0x38,0xb0,0x0e,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0xc5,0x01,0x00,0x00, 0x00,0x00,0xa0,0x00,0x00,0x00,0xd2,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd0,0x01,0x00,0x00,0x1d,0x00,0x00,0x00,0xe8,0x03,0x00,0xc0,0x87,0x83,0xc1, 0xa8,0xcb,0xd9,0x01,0x00,0x00,0x10,0x40,0x07,0x00,0x00,0x38,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0xc5,0x01,0x00,0x50,0x01,0x00, 0xa8,0x01,0x00,0x40,0xe9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x00, 0x00,0x20,0x0e,0x00,0x00,0x00,0xb8,0x03,0x00,0xf8,0x87,0x83,0x01,0x5e,0xe7, 0xd3,0x01,0x00,0x00,0x00,0xb0,0x07,0x00,0x00,0x56,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x54,0xd1,0x00,0x00,0x8a,0x0a,0x00,0xe2,0x01, 0x00,0x50,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x08, 0x07,0x00,0x00,0x00,0xee,0x01,0x00,0xfe,0x0f,0x83,0x01,0x35,0xff,0xe7,0x01, 0x00,0x00,0x00,0x94,0x03,0x00,0x00,0xfa,0x00,0x00,0x00,0x18,0x00,0x00,0x00, 0x00,0x00,0x40,0x15,0x55,0xe1,0x00,0x00,0x69,0x1a,0x00,0xe8,0x00,0x00,0x80, 0x3a,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x80,0x44,0x00,0x10,0x81,0x03,0x00, 0x00,0x00,0xfd,0x00,0x80,0xff,0x0f,0x83,0xc1,0xbb,0xff,0xcf,0x00,0x00,0x00, 0x00,0xd4,0x03,0x00,0x00,0xd6,0x01,0x00,0x00,0x6a,0x00,0x00,0x00,0x00,0x00, 0xe8,0x0f,0xaa,0x70,0x00,0xa0,0x94,0x1a,0x00,0x6b,0x00,0x00,0x50,0x1c,0x00, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x04,0x00,0x00,0x00,0x00, 0xef,0x00,0xe0,0x1f,0x0e,0x06,0xa3,0x9e,0xff,0xbf,0x00,0x00,0x00,0x00,0xd4, 0x01,0x00,0xff,0xed,0x01,0x00,0x80,0xf6,0x00,0x00,0x00,0x00,0x00,0xfd,0x00, 0x55,0x74,0x00,0xa0,0x57,0x1a,0x80,0x48,0x00,0x00,0x28,0x0f,0x00,0x40,0xd5, 0x00,0x00,0x00,0x00,0x40,0x42,0x01,0x44,0x20,0x00,0x0f,0x00,0x80,0x7a,0x00, 0xe0,0x0f,0x1c,0x06,0x6b,0x0f,0x7f,0x9d,0x01,0x00,0x00,0x00,0xea,0x00,0xf0, 0x7a,0xf7,0x01,0x00,0x80,0x6d,0x00,0x2c,0x00,0x00,0xc0,0x1e,0x00,0x15,0x31, 0x00,0xc8,0xa1,0x1a,0x40,0x25,0x01,0x00,0x80,0x07,0x00,0x00,0xe0,0x00,0x00, 0x15,0x00,0x10,0x00,0x02,0x00,0x01,0xf2,0x03,0x00,0xc0,0x7f,0x00,0xc0,0x07, 0x08,0x06,0xb6,0x07,0x5f,0x7d,0x01,0x00,0x00,0x00,0xea,0x00,0xd4,0xc7,0xed, 0x00,0x00,0x60,0x7b,0x00,0xd7,0x00,0x00,0xb0,0x07,0x00,0x15,0x38,0x00,0x64, 0x50,0x1d,0x20,0x95,0x02,0x00,0xd4,0x03,0x00,0x40,0x75,0x00,0x40,0x30,0x00, 0x00,0x29,0x06,0x70,0xf0,0x7f,0x00,0x00,0xa0,0x0a,0x3e,0x80,0x03,0x00,0x00, 0xde,0x03,0xd7,0xfc,0x01,0x00,0x00,0x00,0x75,0x00,0xff,0x40,0x7b,0x00,0x00, 0xb0,0x7d,0xc0,0xf5,0x00,0x00,0xd4,0x03,0x80,0x4a,0x1d,0x00,0x1d,0x90,0x0e, 0xa0,0x52,0x18,0x00,0xe0,0x01,0x00,0x20,0x70,0x00,0x00,0x3a,0x00,0x40,0x80, 0x04,0x00,0x34,0x00,0x00,0x00,0xe0,0x21,0xff,0x00,0x03,0x00,0x80,0xf6,0x00, 0x6f,0xfd,0x03,0x00,0x00,0x00,0x75,0xc0,0x7a,0x80,0x5d,0x00,0x00,0xd0,0x3a, 0x40,0xad,0x01,0x00,0xea,0x01,0x00,0x05,0x0c,0x80,0x0e,0x50,0x07,0x20,0x49, 0x35,0x00,0x74,0x00,0x00,0x48,0x3d,0x00,0xa0,0x18,0x00,0xc0,0x04,0x0c,0x80, 0x38,0x00,0x00,0x00,0x50,0xfd,0xfd,0x01,0x83,0x01,0x80,0x76,0x40,0xb3,0xfc, 0x03,0x00,0x00,0x00,0x35,0x60,0x1f,0x00,0xeb,0x01,0x00,0x6c,0x1f,0xb0,0xd6, 0x01,0x00,0xed,0x00,0xc0,0x22,0x0e,0x40,0x0e,0xa0,0x03,0x90,0x2a,0x35,0x00, 0x3a,0x00,0x00,0x10,0x1e,0x00,0x10,0x1e,0x00,0x20,0x40,0x08,0x00,0x18,0x00, 0x00,0x00,0xf8,0xfd,0xc0,0x01,0xef,0x03,0xf0,0x3e,0x00,0x57,0xf3,0x06,0x00, 0x00,0x00,0x3d,0xd8,0x1d,0x80,0x5e,0x03,0x00,0xb8,0x1d,0x68,0xdb,0x01,0x00, 0x75,0x00,0x40,0x09,0x07,0x40,0x07,0xd4,0x01,0xc0,0xa5,0x38,0x00,0x39,0x00, 0x00,0xa2,0x07,0x00,0x88,0x0e,0x00,0x08,0x12,0x19,0x00,0x1d,0x00,0x00,0x00, 0x6c,0xfd,0xc0,0x01,0xff,0x03,0x50,0x0d,0x80,0xef,0xad,0x06,0x00,0x00,0xc0, 0x1a,0x74,0x0f,0x00,0xb5,0x07,0x00,0xd6,0x0e,0xb4,0xad,0x01,0x80,0x75,0x00, 0x40,0x81,0x03,0x40,0x03,0xf5,0x00,0x04,0x94,0x1e,0x00,0x1c,0x00,0x00,0xc8, 0x03,0x00,0xa2,0x07,0x00,0x00,0x00,0x18,0x20,0x0c,0x00,0x00,0x00,0xd8,0x77, 0x80,0x03,0xfe,0x07,0xde,0x0d,0x80,0xbf,0xea,0x0e,0x00,0x00,0x40,0x1d,0xde, 0x07,0x80,0xed,0x06,0x00,0x6d,0x0f,0x72,0xf5,0x01,0xc0,0x3a,0x00,0xa0,0xa4, 0x03,0xa0,0x43,0x3c,0x00,0x00,0x50,0x0e,0x80,0x0e,0x00,0x00,0xe2,0x00,0x00, 0xc4,0x01,0x00,0x00,0x90,0x1c,0x00,0x0e,0x00,0x00,0x00,0xfe,0x6e,0x80,0x01, 0xfe,0x07,0xea,0x0b,0x80,0xbf,0x36,0x0b,0x00,0x00,0x80,0x0e,0x74,0x07,0x40, 0x5c,0x0f,0x00,0xdb,0x06,0xc8,0x96,0x01,0xa0,0x36,0x00,0x50,0x81,0x01,0x90, 0xaa,0x0f,0x00,0x00,0x80,0x07,0x00,0x0d,0x00,0x00,0x74,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x1c,0x00,0x06,0x00,0x00,0x00,0x55,0xef,0x80,0x01,0x3c,0xc3, 0xfb,0xb9,0x00,0x5f,0xdb,0x1d,0x00,0x00,0xe0,0x0e,0xdf,0x07,0x40,0xf0,0x0d, 0x80,0xb6,0x07,0x00,0xeb,0x01,0xa0,0x3a,0x00,0xa8,0xe8,0x00,0x50,0xff,0x00, 0x00,0x00,0xb0,0x03,0x00,0x0c,0x00,0x00,0x71,0x00,0x00,0x75,0x00,0x00,0x00, 0x40,0x0c,0x40,0x06,0x00,0x00,0x00,0xff,0xcd,0xc0,0x03,0x1c,0x20,0x76,0xfc, 0xc1,0xea,0x55,0x15,0x00,0x00,0x00,0x8f,0x75,0x07,0x20,0xa8,0x0e,0x80,0x6d, 0x07,0x80,0xb5,0x01,0xb0,0x35,0x00,0xa6,0xe2,0x00,0xc8,0x03,0x00,0x00,0x00, 0xc0,0x01,0x80,0x0a,0x00,0x00,0x34,0x00,0x80,0x30,0x00,0x00,0x00,0x00,0x0e, 0x10,0x06,0x00,0x00,0x80,0xb6,0xcf,0xe0,0x03,0x1c,0x88,0x3e,0xfc,0x40,0xaf, 0xb6,0x3a,0x00,0x00,0xe0,0x86,0xbe,0x07,0x10,0xdc,0x0f,0x80,0xb6,0x03,0x80, 0x5e,0x01,0x50,0x6d,0x00,0xd1,0x72,0x00,0xa8,0x01,0x00,0x00,0x00,0xe8,0x00, 0x40,0x12,0x00,0x80,0x32,0x00,0x20,0x34,0x00,0x00,0x00,0x40,0x0e,0x00,0x04, 0x00,0x00,0xc0,0xef,0x8e,0xff,0x07,0x18,0xdc,0x0d,0x7e,0x00,0xb5,0xda,0x6d, 0x00,0x00,0x30,0x87,0xd7,0x06,0x0c,0xb4,0x0e,0xd0,0xdb,0x03,0x00,0xd5,0x03, 0xd4,0x6a,0x80,0xaa,0x3a,0x00,0x50,0x03,0x00,0x40,0x00,0x68,0x00,0x08,0x29, 0x00,0x40,0x60,0x00,0x00,0x31,0x00,0x00,0x00,0x00,0x07,0x80,0x0c,0x00,0x00, 0x80,0xba,0x9d,0xff,0x0f,0x18,0xab,0x07,0x3e,0x80,0x55,0xab,0x6a,0x00,0x00, 0xc8,0xc3,0xfa,0x0f,0x15,0x7a,0x0f,0x44,0x6d,0x07,0x80,0x6b,0x03,0x52,0xab, 0x69,0xa9,0x1a,0x00,0xa8,0x06,0x00,0x00,0x00,0x6a,0x00,0xa0,0x04,0x00,0x80, 0x8a,0x00,0xa8,0x24,0x00,0x08,0x09,0x00,0x03,0x20,0x10,0x00,0x00,0xe0,0xef, 0x9f,0x3f,0x1e,0x30,0x81,0x03,0x00,0x00,0xde,0xb5,0xd6,0x00,0x00,0x50,0xc3, 0x5f,0xf5,0x0b,0xd6,0x06,0x73,0xb7,0x15,0x00,0x5d,0x43,0x59,0xad,0xaa,0xa8, 0x2a,0x00,0x91,0x0a,0x00,0xa8,0x00,0x68,0x80,0x5a,0xaa,0x04,0x20,0x51,0x00, 0x00,0x10,0x80,0x44,0x18,0xa0,0x03,0x08,0x01,0x00,0x08,0x60,0xbb,0xba,0x0f, 0x3c,0x60,0xf4,0x03,0x00,0x00,0xb3,0xae,0xb5,0x01,0x00,0xd0,0xa3,0xea,0x5f, 0x07,0xba,0xcf,0x8c,0xda,0x0e,0x80,0xaa,0xad,0x6f,0xb5,0x6a,0x51,0xab,0xaa, 0x56,0x29,0x00,0x42,0x40,0x65,0x20,0x0e,0x21,0x49,0x24,0x04,0x85,0x4e,0x45, 0x90,0x01,0x12,0xc0,0x01,0x00,0x10,0x00,0x07,0xd0,0xee,0x3f,0x07,0x38,0xe0, 0xff,0x01,0x00,0x00,0xdc,0x6a,0xad,0x01,0x00,0xac,0xe1,0xbf,0xea,0x83,0xef, 0xba,0xe7,0xaf,0x07,0x80,0x6d,0xf5,0xab,0x55,0x75,0x54,0x55,0xd5,0x53,0xa5, 0xaa,0x3c,0x80,0xaa,0x84,0x87,0x4a,0x22,0x5d,0xa9,0x20,0x2f,0x10,0xe5,0x90, 0x30,0xc0,0x00,0x44,0x84,0x80,0x03,0xf0,0xbf,0x6a,0x07,0x38,0xe6,0xff,0x00, 0x00,0x00,0x54,0xb5,0x55,0x03,0x00,0xd4,0x41,0xd5,0xff,0x81,0x5a,0xef,0x41, 0xf5,0x03,0x00,0x56,0xeb,0xa8,0x6a,0xbb,0x68,0x55,0xd5,0x59,0x55,0x49,0x1e, 0x20,0x49,0xd5,0x43,0x28,0x49,0x0e,0x04,0x94,0x03,0x45,0x70,0x00,0x28,0x68, 0x00,0x10,0x00,0xe8,0x01,0xa8,0xea,0x7f,0x03,0xf8,0xf2,0x3f,0x00,0x00,0x00, 0xe8,0xae,0xb6,0x06,0x00,0xe8,0xe1,0x7f,0xf5,0x80,0xed,0xfa,0x60,0xdb,0x01, 0x00,0xeb,0x7a,0xd0,0x56,0x1d,0x50,0x55,0xf5,0x40,0x55,0x55,0x0f,0x80,0x24, 0xe9,0x01,0x45,0x92,0x47,0xa9,0xc2,0xa1,0x10,0x3d,0xa0,0x42,0x30,0x00,0x00, 0x11,0x71,0x00,0xf8,0x7f,0x55,0x07,0xf0,0x7b,0x0f,0x00,0x00,0x00,0xb0,0xd5, 0xaa,0x0d,0x00,0xd4,0x40,0xd5,0x3f,0x40,0x77,0x3f,0xa0,0xed,0x00,0x00,0x5d, 0x3d,0x50,0x5b,0x0f,0xa5,0xaa,0x7a,0x50,0x95,0xaa,0x07,0x50,0x95,0x74,0x80, 0x12,0xc9,0x03,0x22,0xf0,0x00,0x44,0x0e,0x00,0x10,0x1d,0x00,0x40,0x00,0x3c, 0x00,0xb0,0xd5,0xff,0x1e,0x70,0xf5,0x01,0x00,0x00,0x00,0x50,0x6d,0x6d,0x0d, 0x00,0xea,0xc0,0xff,0x1e,0xc0,0xad,0x1f,0xc0,0x76,0x00,0x00,0xaa,0x1f,0xb0, 0xaa,0x57,0x50,0x55,0x3d,0xa0,0x54,0xd2,0x01,0x50,0x52,0x3a,0x00,0xa8,0xe4, 0x80,0x88,0x7a,0x40,0x81,0x07,0x20,0x42,0x0e,0x00,0x00,0x49,0x0e,0x00,0x7c, 0x7f,0x55,0x25,0xde,0x7e,0x00,0x00,0x00,0x00,0xc0,0xb6,0xb6,0x1a,0x00,0xf4, 0x80,0xaa,0x07,0x80,0xf6,0x07,0x80,0x3d,0x00,0x00,0xb6,0x07,0x40,0xed,0x83, 0x7c,0xab,0x0e,0x40,0x53,0xf5,0x00,0x20,0xa9,0x1e,0x00,0x04,0x7a,0x00,0x44, 0x1e,0x00,0xd4,0x03,0x80,0x88,0x07,0x00,0x00,0x80,0x07,0x00,0xd4,0xdb,0xff, 0x8c,0xbf,0x3d,0x00,0x00,0x00,0x00,0x60,0xd5,0xd5,0x36,0x00,0x6b,0x00,0xfe, 0x01,0x80,0xfb,0x01,0xc0,0x1e,0x00,0x00,0xec,0x03,0x80,0xf5,0x14,0x1c,0xd5, 0x07,0x80,0x54,0x3d,0x00,0x40,0x45,0x0f,0x00,0x54,0x1f,0x00,0x92,0x0f,0x80, 0xf2,0x00,0x00,0xf0,0x01,0x00,0x40,0xf0,0x01,0x00,0xfc,0x76,0xab,0xde,0xef, 0x0f,0x00,0x00,0x00,0x00,0x40,0x5b,0x56,0x2b,0x00,0x75,0x00,0x00,0x00,0x00, 0x3e,0x00,0x80,0x0f,0x00,0x00,0xf8,0x00,0x00,0x3f,0x40,0x0f,0xfe,0x01,0x00, 0xaa,0x0f,0x00,0x00,0xd5,0x03,0x00,0xe0,0x03,0x00,0xf8,0x01,0x00,0x3e,0x00, 0x00,0x7e,0x00,0x00,0x00,0x7f,0x00,0x00,0xb4,0xdf,0xfe,0xfe,0xb7,0x07,0x00, 0x00,0x00,0x00,0x80,0xad,0x5b,0x75,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x07,0x00,0x00,0x00,0xf0,0x01, 0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xec,0xfa,0x57,0xfe,0xfa,0x01,0x00,0x00,0x00, 0x00,0x00,0xb5,0x6a,0xd5,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0xc0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbc,0x5f,0xfd,0xbe,0x7f,0x00,0x00,0x00,0x00,0x00,0x00, 0x54,0x55,0xab,0x81,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf4,0xea,0x57,0xef,0x3d,0x00,0x0c,0x03,0x00,0x00,0x00,0xab,0x55, 0x55,0x03,0x3a,0x00,0x00,0x00,0x00,0x18,0x1c,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x40,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00, 0x00,0xc0,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xdc,0x7f,0xfd,0x75,0x0f,0x00,0x08,0xe1,0xef,0x1f,0x80,0x57,0xdb,0xed,0xf3, 0x77,0x10,0xfe,0xf8,0x00,0x38,0x1c,0xfe,0x70,0xe0,0xc0,0x00,0x03,0x7f,0x20, 0x7a,0x90,0x7f,0xfe,0xf8,0xc0,0x0f,0x03,0x0e,0x7f,0x00,0xc6,0x30,0x04,0x40, 0x00,0x82,0xc0,0x80,0x83,0x83,0x3f,0x86,0x00,0x00,0x00,0x00,0x00,0xf4,0xd6, 0x6f,0xef,0x03,0x00,0x98,0xa1,0x44,0x0b,0x80,0x51,0x67,0x3a,0x86,0x70,0x10, 0x4a,0x28,0x01,0x28,0x06,0x4a,0xac,0x58,0xc1,0xc1,0x0d,0x4b,0x12,0xdb,0x10, 0x2d,0x96,0x28,0x63,0x80,0x83,0x13,0x49,0x00,0x83,0x31,0x04,0x40,0x00,0xc2, 0xe0,0xe0,0x46,0x8d,0x25,0x86,0x00,0x00,0x00,0x00,0x00,0xbc,0x7d,0xb5,0xfd, 0x00,0x00,0x70,0x20,0x00,0x03,0x80,0xa4,0x55,0x0c,0x8a,0x74,0x10,0x02,0x08, 0x01,0x28,0x1a,0x02,0x04,0x08,0x40,0x21,0x00,0x01,0x08,0x43,0x11,0x04,0x02, 0x08,0x22,0x80,0xc2,0x00,0x01,0x00,0x01,0x51,0x04,0xc0,0x07,0xc6,0xa0,0x30, 0x40,0x80,0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0xd0,0xdb,0xff,0x3f,0x00,0x00, 0x40,0xe0,0x03,0x01,0x40,0x8c,0x4a,0x4d,0x9b,0xd9,0x1f,0x3e,0xf8,0x01,0x58, 0x0b,0x3e,0x78,0xf0,0x20,0x21,0x00,0x1f,0xc1,0x43,0x13,0x0c,0x3e,0xf8,0xe1, 0x83,0x44,0x00,0x1f,0x00,0x01,0x91,0x04,0x40,0x05,0x24,0x21,0x11,0xc0,0x83, 0x0f,0x92,0x00,0x00,0x00,0x00,0x00,0x70,0xf7,0xaa,0x0f,0x00,0x00,0x20,0x20, 0x01,0x03,0xc0,0x0b,0x5b,0xaa,0xf6,0x58,0x00,0x12,0x88,0x40,0x48,0x19,0x02, 0xa0,0x41,0xa3,0x22,0x0e,0x03,0xe8,0x43,0x14,0x0c,0x12,0x98,0x20,0xc0,0x44, 0x00,0x0b,0x00,0x81,0x11,0x05,0x40,0x00,0xaa,0x30,0x11,0x00,0x8c,0x04,0xa2, 0x00,0x00,0x00,0x00,0x00,0xe0,0xbd,0xff,0x01,0x00,0x00,0x20,0x20,0x00,0x03, 0x60,0x10,0x69,0x4c,0xa2,0x59,0x10,0x02,0x88,0xa0,0x9a,0x18,0x02,0x00,0x01, 0xb2,0x26,0x08,0x11,0x75,0x42,0x14,0x0c,0x06,0x88,0x61,0x40,0xcd,0x10,0x01, 0x00,0x83,0x10,0x06,0x40,0x00,0x98,0x50,0x33,0x04,0x88,0x01,0xc2,0x00,0x00, 0x00,0x00,0x00,0x80,0x6f,0x3f,0x00,0x00,0x00,0x20,0xe0,0x0f,0x03,0x20,0x10, 0xd2,0xb2,0x93,0x5c,0x10,0xfe,0x08,0x29,0x99,0x08,0xfe,0xdc,0xb8,0x11,0xc4, 0x0d,0x6f,0x3c,0x42,0x18,0x0c,0xfe,0x08,0x21,0x20,0x88,0x1f,0x7f,0x00,0xfc, 0x10,0x06,0x40,0x1f,0x92,0x09,0xe2,0xc7,0x8d,0x3f,0x82,0x00,0x00,0x00,0x00, 0x00,0x00,0xfe,0x03,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x2a,0x4a, 0xd0,0x18,0x10,0x40,0x00,0x95,0x0a,0x10,0x50,0x40,0x80,0x00,0x00,0x00,0x41, 0x0e,0x02,0x00,0x00,0x90,0x00,0x00,0x00,0x00,0x04,0x48,0x00,0x00,0x20,0x00, 0x40,0x09,0x00,0x00,0x00,0x00,0x01,0x24,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0xaa,0x54,0x1c, 0x00,0x00,0x00,0xa0,0x44,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x95,0xaa,0x0e,0x00,0x00, 0x00,0xad,0x2a,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xe1,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x6a,0x55,0x0d,0x00,0x00,0x80,0x52, 0x92,0x14,0x00,0x00,0x00,0x00,0x00,0xa0,0x78,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x40,0xad,0x5a,0x0d,0x00,0x00,0x00,0x4a,0xa9,0x2a, 0x00,0x00,0x00,0x00,0x00,0x14,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x55,0xab,0x0e,0x00,0x00,0x80,0x2a,0x95,0x64,0x00,0x00, 0x00,0x00,0x80,0x42,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x6a,0x55,0x0d,0x00,0x00,0x00,0x55,0xa5,0x52,0x00,0x00,0x00,0x00, 0x00,0xd0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xac,0xb5,0x0d,0x00,0x00,0x00,0xa4,0x54,0xaa,0x00,0x00,0x00,0x00,0xa0,0xfa, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0xaa, 0x1a,0x00,0x00,0x00,0x95,0x4a,0x49,0x01,0x00,0x00,0x00,0x14,0x3d,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0xad,0x1a,0x00, 0x00,0x00,0x54,0x29,0xa5,0x02,0x00,0x00,0x80,0xc2,0x0f,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x55,0x35,0x00,0x00,0x00, 0x50,0xa5,0x54,0x0a,0x00,0x00,0x52,0xf4,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xda,0x6a,0x00,0x00,0x00,0x90,0x94, 0x92,0x12,0x00,0x40,0x08,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x6b,0x00,0x00,0x00,0x40,0x55,0x4a,0x49, 0x92,0x94,0xd2,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x56,0xd5,0x00,0x00,0x00,0x80,0x52,0xa9,0x54,0x49,0x22, 0xf9,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa8,0xda,0x00,0x00,0x00,0x00,0xae,0x4a,0x92,0x2a,0x55,0x1f,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd8,0xaa,0x01,0x00,0x00,0x00,0x60,0xa5,0x4a,0xa4,0xf8,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0xd5, 0x01,0x00,0x00,0x00,0x00,0xbc,0xa9,0xfa,0x1f,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x56,0x03,0x00, 0x00,0x00,0x00,0x00,0xf8,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0xaa,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0xaa,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x58,0x55,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0xad,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa8,0xb5,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50, 0x55,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0xaa,0x0e, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x55,0x0d,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0xab,0x0a,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x5a,0x1d,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x50,0xd5,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x60,0x55,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa0,0xaa,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x56, 0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xaa,0x3a,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x55,0x35,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0xda,0x3a,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0x55,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0xaa,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x40,0x55,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xab,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x5a,0x35, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x3a,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x35,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x3a,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xaa,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x54,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x68,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0, 0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x0f,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; wanderlust-wanderlust-769699d/etc/icons/wl-beta-logo.xpm000066400000000000000000002531271406661363500233240ustar00rootroot00000000000000/* XPM */ static char *wl-beta-logo[] = { /* width height num_colors chars_per_pixel */ "491 176 26 1", /* colors */ ". c None", "a c #000000", "b c #e02828", "c c #030404", "d c #0c1112", "e c #1d2628", "f c #295eb6", "g c #3162bb", "h c #3864bc", "i c #3b4c6e", "j c #3f65bb", "k c #4d6abf", "l c #596cbf", "m c #6771c4", "n c #6c73c4", "o c #6e6cad", "p c #7574c5", "q c #837aca", "r c #917dca", "s c #a582c3", "t c #b28bd4", "u c #c090d3", "v c #c994d2", "w c #d09ad9", "x c #e8b3d9", "y c #ffffff", /* pixels */ "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "..................................................................................................................................................................................................................................tttttttttt...............................................................................................................................................................................................................................................................", ".......................................................................jjj................................................................................................................................................ttttttttttttttttttttttttt........................................................................................................................................................................................................................................................", "......................................................................jjjjc..........................................................................................................................................ttttttttttttttttttttttttttuuuuuttt....................................................................................................................................................................................................................................................", ".....................................................................jjjjjdd......................................................................................................................................ttttttttttttttttttttttttttuuuttttuuuuuutu................................................................................................................................................................................................................................................", "....................................................................hjjjjjec..................................................................................................................................rrttttstttttttttttttttttututtttttuuutuutuuvuuus..............................................................................................................................................................................................................................................", "...................................................................jjjjjjjec................................................................................................................................rttttttttttststtttttttttttttttttttuyyyuuuuuuuuuuuuvs...........................................................................................................................................................................................................................................", ".................................................................jjjhjjjjkic.............................................................................................................................rtttttrttttttttttttttttttttttttutttttyybbytutuuuuuvvuvuvr.........................................................................................................................................................................................................................................", "................................................................hhhjjjjjjjfc...........................................................................................................................rrtrrrtttttttttttttttttttttttttttttttyyybbbbuuuuuuuvuuvuvvvus.......................................................................................................................................................................................................................................", "...............................................................jjjhjhjjjjjfc........................................................................................................................rrrrrrttrrtrttttttttttstttttttttttttttttybbbbbbautuuuuuuuuuuvvvuso.....................................................................................................................................................................................................................................", "..............................................................jhhhjjjjjjjkic......................................................................................................................rrrrrtrtrrtttttsttstttttttttttttttyyttttttybbbbbbauuuuuuuuuvvvuvvvvwo....................................................................................................................................................................................................................................", "............................................................hhjjjjhjhjjjjjec....................................................................................................................rrrrrrrrrrtrtrttttttttttttttstttttyyybyyytttttabbbbauuuuuuuuuuuuvuvvvvusi..................................................................................................................................................................................................................................", "...........................................................hhhjhhhjjjjjjjkec...................................................................................................................rrrrrrrrtrtrtrttrtttttttttttttttttyybbbbbbyttuttuabbautuuuuvvvvvvvvvvuwwvvi.................................................................................................................................................................................................................................", "..........................................................hhhhjjjjhjjjjjjjec.................................................................................................................rrrrrrrrrrrrrrttrtrtttttttttttttttttybbbbbbbbttttttybbauuuuuuuuuuuuvuvvvvwvvwo................................................................................................................................................................................................................................", "........................................................hhhhjhhhhhjjjjjjjkec...............................................................................................................rrrrrrrrrrrrtrttrrttttttsttyyyyyyttttttybbbbbbbatuttutybbuuuuuuuuuvuvvvvvvvvvwvwsi..............................................................................................................................................................................................................................", ".......................................................hghhhhhjjjjhhjjjjjjcc...............................................mmm...........................................................rrrrrrrrrrrrrrrrrttttttttttyyybbbbbyytttttybbbbbbbyuutuuybbauuuuuuuuvuuvuvuvvwvvvwvse.............................................................................................................................................................................................................................", ".....................................................ghhhhhjjhhhhhjjjjjjjkcc.............................................mmmmmnnj.......................................................rrrrrrrrrrrrrrrtrrrrrrtttttyybbbbbbbbbytutttybbbbbbbyttttybbatuuuuuuvuvvvvvvvvvvwwvwwse............................................................................................................................................................................................................................", "...................................................hhghhhhhhjhhjjjjhjjjjjfcc...........................................lmmmmmmmnmi....................................................rrrrrrrrrrrrrrrrrrrrtttrrttttybbbbbbbbbbbytttttybbbbbbbytuuybbauuuuuvuuuuuvuvvvvvvvwvwwwsd...........................................................................................................................................................................................................................", "..................................................hgghghhhhhhjjhhhjjhjjjjec...........................................mmmmmnnmnmnne..................................................rrrrrrrrrrrrrrrrrrtttrrrtstttyybbbaaaaabbbbyytttybbbbbbbbutttybbuuuuuuuuvuuvvvvvvwvvvwvvwwod..........................................................................................................................................................................................................................", "................................................gghhghghhhhhjhhjjhjjhjjjjec..........................................mmommmmmmnmnnfc...............................................rrrrrrrrrrrrrrrrrrryyyrttttrrttybbbaatststabbbbttttybbbbbbbayuuybbauuuuuuuvvuuuvuvvvvvvwwvwwwi..........................................................................................................................................................................................................................", "..............................................gghhhghhhhhhhhhhjhhjjjjjjjjcc.........................................lmmmmmmmnmmnmnlc..............................................rrrrrrrrrrrrrrrrryyyybbyyrrtttttybbbarooooooybbbatttybbaaabbbbytybbauuuuuvvuuuvvvvvuwwwwvvwvwwwe.........................................................................................................................................................................................................................", "............................................ggghgghhhhghghhhhhhjhhjjhjjjfcc........................................mllmlmmmmmmmnmnmcd............................................rrqrrrrrrrrrrrrryyybbbbbbbtrttooeybbaaccd.....ybbaddieybattvabbbyybbbuuuuuuvvvuvvvvvvvvvwwwwwwwwsd........................................................................................................................................................................................................................", "..........................................fggggggghhgghhhhhhjhjhjjhjjjjjec........................................llmmmmmmmmnnnmnnncc..........................................qqqrrrrrrrrrrrryyyybbbbbbbbbaecccc.ybba..........yba....ybbiioybbbbbbbbauuuuuuuuvuuvvvvvvvvvvwvwwwwid.......................................................................................................................................................................................................................", "........................................gggfggggggghhhhhhhhhhhhhhjhjhjjfcc.......................................lmlmmmmmmmmmmnmmnmcc.........................................qrrrrrrrrrrrrrrrybbbbbbbbbbbaa.....yybba..........ybb....ybba...ybbbbbbbbuuuuuvvuuvvuvvvvvvwwvwvwwwwwe.......................................................................................................................................................................................................................", ".....................................fggfgggggghhghggghhhhhhjhjjjhjjjjjecd.......................................mlmllmmmmmmmmmnnnfcc........................................qqrqqrrrrrrrrrrrrybbbbbbbbbaaa......ybbba..........ybba....ybb....ybbbbbbbauuuuuuuvvvvvuwwwwvvwwwvwwwwsc......................................................................................................................................................................................................................", "..................................fffffgffgfggggfghhhgghhhhhhhhhjjhjhjfcc.......................................lmlmmlolmmmmnmmmmmic.......................................qqrqrrrrrryyyyyrrrrybbbbaabbba.........ybaa..........ybba....ybba...ybbbbbbbbuuuuvvvuvvvvvvuvwwvvwwwwwwwwid.....................................................................................................................................................................................................................", "...................fff........ffffffffgfgfggggggghggghhhhhhhjhhjhhjjjjecd......................................lolmllmmmmmmnmnnnnnec......................................qqrqqrqyyyyybbbbrrroecaaaaybbba..........yb...........ybba....ybba....ybbbbbbaauuuuuuvuuvvvvvvvvwwwwwwwwwwuc.....................................................................................................................................................................................................................", "...................ffffffffffffffffgffhggggggghghghhhhghhhhhhhhjjjhjjfcc......................................mmllmmmmmmmmmmmmmmnlcc.....................................qqqqqqyyybbbbbbbbaieccd.....ybaa..........yba..........yybb....ybba....ybbbbbbbuuuvuvuvvuvvvvvvvvvvwwwwwwwwwed....................................................................................................................................................................................................................", "....................ffffffffffffffffgfffgfggggggghhghghhhhhhjjhhhhjjjdcd.....................................llllllllmmmmmmmmmnnmicd....................................qrqqqryybbbbbbbbbbacc........ybby..........yba..........ybbba...ybba......abbbbbatuuuuvuvvuvvwwvwwwwvvwwwwwwwsc....................................................................................................................................................................................................................", "....................fffffffffffffffffggfgffggghggggghhhhhhhhhhjjjjhhecc......................................llmlommlllmmmmmnmmnndc....................................qqqqrqrybbbbaaabbbbb..........ybbb..........ybb..........ybbba...yybbyy.....ybbbaa..uvuuvuvvuvvwuvvvwwvvwwwwwwwdd...................................................................................................................................................................................................................", "....................ffffffffffffffffgffgfggfgggggghhggghhhhhhjhhhhjicc......................................llllmmllmmmmmmmnmmnmicc...................................qqqrqqqrybbbaaoicabbba..........ybba.........ybba.........ybbba...ybbbbbyy....ybba....uvvuvvvvuvvvuwwvwwwwwwwwwwic...................................................................................................................................................................................................................", "....................fffffffffffffffffffggggfgggfhgghhhhhhhhhhhhjjjfcc......................................llllllmmlmmlmmmmmmmnndc...................................qqqqqqqqyybbaaiccdybbba..........ybbb..........ybb.........ybbba...ybbbbbbb......aa.....uuvuuvvvvvwvvwvwwvwwwwwwwsc...................................................................................................................................................................................................................", ".....................fffffffffffffffffgffggggghggghghgghhhhjhhjhhfcc......................................klllllllomlmmmmmmmnmmicc............................yyyyyyyyqqqqqqqybbbadcc..ybbba..........ybbba.........ybba........ybbba...ybbbbbbaa.............vuvvvvvvwvvwvwwwwwwwwwwwwdd..................................................................................................................................................................................................................", ".....................ffffffffffffffggfggfgggggggghhhhhghjhhhjhhjecc.......................................kllllmlmlmlmolmmmmmmfcc..........................yyyybbbbbbbyqqqqqqybbbac......aaa...........ybba.........ybbb.......yybbba...ybbbbbba...............vvuvvvvvwvwvvvwwwwwwwwwwic..................................................................................................................................................................................................................", ".....................fffffffffffffffffffgfgfggghhghggghhhhhhhhfecc.......................................lllllmlllmlmmmmmmmmnldcd........................yyybbbbbbbbbbbqqqqqqoybba.....................ybbb..........ybbayyyy..ybbbaa.....aaaaaa................vvuvvvvvvuwwwwwwwwwwwwwoc..................................................................................................................................................................................................................", "......................fffffffffffgfffggfgfgfgggggghhhhghhhhhjfdcd.......................................llllllllllmllmmmmmmmmecd........................yybbbbbbbbbbbbbaqqqqodybbay....................ybbba..........ybbbbbbyyybbba.............................vvuvwvvwvvwuvvwwwwwwwwsc..................................................................................................................................................................................................................", "......................fffffffffffffggffgfggggggggghghghhhhhheccd........................................klkllllmollmmmmmmmmmicc....................yy...ybbbbbbaaaaabbbbqrqeccyybbbyyyyyyy..............ybbb...........ybbbbbbbbbbaa.............................vvvvvvwvwwvwwwwwwwwwwwwcd.................................................................................................................................................................................................................", ".......................ffffffffffffffffgggggggghgghhhhghhhfdcc.........................................lkllllolmmlllllmlmmmfcc................yyyyyyb...ybbbbbaaqqqqybbbaodcc.ybbbbbbbbbbbyyy...........ybbba...........ybbbbbbbbaa...............................vvvwuvvvwwwwvwwwwwwwwwec.................................................................................................................................................................................................................", ".......................ffffffffffffffggfffgfgggghggggghhfeccd.........................................kklllllllllmmmmmlmmmfcc................yybbbbbba....abbbaqqqqqyybbaccd...ybbbbbbbbbbbbby..........ybbbb.yy..........abbbbbaa.................................uvvvvvwvvwwwwwwwwwwwwic.................................................................................................................................................................................................................", "........................fffffffffffgffgggfgggggggghhhhgeccd...........................................llllllmllllollmmmmmfcc.............yyyyybbbbbbbb....ybbbaqqqqqybbbac......ybbbbbbbabbbbb..........ybbbbaybyy.........ybaaaa..................................vvvwwvwwvvwwwwwwwwwwwic.................................................................................................................................................................................................................", ".........................ffffffffffffffffggggggghhgggfdcc............................................kkklkllllmlllmmlmmmfcc............yyybbbbbbbbbbbba....ybbbqqqqqybbba.........aaaaaaaybbbba.........ybbbbbbbbb...........a......................................uwvvvuvwwwwwwwwwwwwwoc.................................................................................................................................................................................................................", "..........................fffffffffffggggggfgggghghfdcc.............................................llllllllllmlmllmllmfcc.............ybbbbbbbbbbbbbba....qybbaqqyyybbba.................ybbba........yybbbbbbbbba.................................................vvvvvwvwvvwwwwwwwwwwoc.................................................................................................................................................................................................................", "...........................ffffffffggfffffggggggggiccd..............................................kkkllklllllmllmlmmicc......yyyyy...ybbbbbbaaaaaabbb...qqybbayyybbbbba..................ybba......yyybbbbbbbbbaa..................................................vvwwvwvwwwwwwwwwwvtoc...............................................................................tt................................................................................................................................", ".............................fffffffffgggfggggggfecc...............................................llllllllllllllomlmecc.....yyybbbb...ybbbbbaa....ybbba.pqpybbbbbbbbbbba..................yyba......ybbbbbbbbbbaa...................................................wvvvvwwwvwwwwwwwvqpped.............................................................................tttsc..............................................................................................................................", "...............................ffffffgfffggggggfdcd................................................kkkklllllllllmmlkecc......ybbbbbba...ybbbaa...yyy.aaapqqqqybbbbbbbbbaa........yyy.......ybba......ybbbbbbbaaaa....................................................vvvwwvuwwwwwwwwvqpppic............................................................................tttttcd.............................................................................................................................", "..................................eeeeddfffgggfccd................................................lkllkkllllllmlllfdcd.......ybbbbbba....ybbb...yybb...qppqqqybbbbbbbbbb.........ybby.....yybbb.......ybbbbaaa........................................................vvvwwvwvwwwwwwrppppic...........................................................................ttttttcc.............................................................................................................................", ".......................................ffggfhfcc.................................................kkklkllllllllllliyyyyyyy......abbbaa.....ybbayyybbba..pqqqqqybbbbbbbbbba.........ybby...yybbbaa........aaaa..........................................................wvvvvwwwwwwwwrppppppc...........................................................................ttttttcc.............................................................................................................................", "......................................fhgggffdcd.................................................llklkklllkolllkecybbbbbb.......ybba......ybbbbybbbbb.ppppqqqoybbbbaaabbby........ybbbyyyybbbba.......................................................................vvvwvvwvwwwwupppppppcc.........................................................................tttttstcc.............................................................................................................................", "......................................gfffgfcc..................................................kkkkkllklkllllfdcdybbbbbba......ybba......ybbbbbbbbbbaqqqqqpodybbbaa..ybbby.......ybbbbbbbbbbba.......................................................................wwwuwwwwwwwwqppppqppcc........................................................................ttttttttcc.............................................................................................................................", ".....................................fggggfdcd..................................................kklkklllllllliccd.ybbbbbaa......ybba......ybbbbbbbbbaapppqqodcyybba...ybbbby......ybbbbbbbbbbaa.......................................................................vvvvvvwwwwwrppppppplcc........................................................................ttttttttcc.............................................................................................................................", "....................................ffffgfdcd..................................................kkklkklkklllfdcc....ybbbba.......ybba......ybbbbbbbbbaqpqqqodcdybbba.....abbbyy....ybbbbbbabbaa.........................................................................vwwwwwvwwuppppppppicd.......................................................................tttttttttcc.............................................................................................................................", "...................................gfggffdcd...................................................kkkllklllklkccd.......abbb......yybba.......ybbbbbbbbaqpyyydcd..ybba.....ybbbbb....ybbbbaaa.aa..........................................................................vvvuvwvvwqppppppppic........................................................................tttttttsocc.............................................................................................................................", "...................................fgffgecd...................................................lkkkkklkklllicd........ybbba.....ybbba.......ybbbbaabbappybbcd...ybba......ybbbba.....aaaa...............................................................................vvwwwwwwtnnpppppppic.......................................................................tttttttttoc................................................................................................x.............................", "..................................fffffecc....................................................kkkkklklklllcc..........ybba.....ybbba........ybbaappaaqpybba....ybbbyy.....ybbba........................................................................................vvvvvwwuppppppppppec......................................................................tsttttttttec.............................................................................................xxxxxw...........................", ".................................ffffgicc....................................................klkkklklklklicc...........ybbyy...ybbba........ybba.ppppppybbb...yybbbbb.......aaa........................................................................................wvwwwwwrnnppppppppcc......................................................................ttttststttec...........................................................................................xxxxxxxxcd.........................", "................................fffgffcc.....................................................kkkkkkklklkldc.............ybbb....ybba........ybbbpppppqiyybba..ybbbbbba.................................................................................................vvvvvvtppnnppppppicc.....................................................................ttttttttttrcc..........................................................................................xxxxxxxxocc.........................", "................................fffffcc............................................yyyy.....kkkkkkkkllklicc..............ybba..yybba.........ybbappppiyybbba..ybbbbbba.................................................................................................wvwwwwqnnppppppppec......................................................................tttttttstticd.........................................................................................xxxxxxxxxdc..........................", "...............................fffffdcd.........................................yyyybbby....kklkkkkkklkkdc...............ybbay.ybbba.........ybbappyyyybbbbb...ybbbaaa.................................................................................................vvvvwtppppppppppocc.....................................................................tttttttttttdc..........................................................................................xxxxxxxxocc..........................", "..............................fffffecd..........................................ybbbbbbby..kkkkkkklklklfcc................ybbbyybbbb.........ybbayyybbbbbbbba....aaa...................................................................................................wvwwunpnpnppppppecd.....................................................................tttsttttsticc.........................................................................................xxxxxxxxvcc...........................", "..............................ffffecc...........................................ybbbbbbbbyykkkkkkkklkklec.................ybbbbbbbbaa.......yybbbbbbbbbbbbbaa..........................................................................................................vvvvrnpnpnpppppocc.....................................................................ttttttttttrdc.........................................................................................xxxxxxxxvdcd...........................", ".............................fffffcc...................................yyy.......ybbbbbbbbbkkklkkklkllfcc..................ybbbbbbbb........ybbbbbbbbbbbbbaa...........................................................................................................wvwvnnnpnpnpppqdcd....................................................................tttttttttttecd.........................................................................................xxxxxxxxicd............................", "............................fffffcc...............................yyyyyybbyy.......abbbbbbbakkkkkkkkklicd..................ybbbbbbbaa.......ybbbbbbbbbbaaaa............................................................................................................wvvqpnnpppnpppocc.....................................................................ttttttttttocc.........................................................................................xxxxxxxxicc.............................", "...........................fffffdcd..............................yybbbbbbbbb.......yybbbbbbbkkkkkklkkjcc....................ybbbbbba.......nnybbbbbbbaaa...............................................................................................................vvtppppnpppppticd....................................................................ttttstttttocc.........................................................................................xxxxxxxxocc..............................", "...........................ffffecc...........................yyyyybbbbbbbbbba......ybbbbbbbbakkkkkklkicd.....................ybbbbbb.......ppybbbaaaaa................................................................................................................vvvqnpnpnppnprscc.....................................................................sttttttttrdc..........................................................................................xxxxxxxocc...............................", "..........................fffffcc..........................yyybbbbbbbbbbbbbba......ybbbbbbbbakkkkkllkdc......................ybbbbbaa.....pnnnpaaa....................................................................................................................vwtnnnnppnnprwicd....................................................................tttttttttrdcd.................................................................www.....................xxxxxxxscc................................", ".........................fffffdcd..........................ybbbbbbbbbbbaaabba.....kkybbaaabbbylkkkklfcc.......................ybbbba......pppppecd....................................................................................................................vvqnnpnnppprwwdc............................................r........................ttttsttsqdcd.................................................................wwwwdd...................xxxxxxvdcd................................", "........................fffffecd..................yyyyyy...ybbbbbbbbbbaa.ybba...jkjyybbakkybbbkkklkkicd........................ybbba.....nnnpnicc.....................................................................................................................vtnnpnnpnprwwscc...........................................rrro.....................ttrtttttrdcd.................................................................wwwwicc..................xwxxxxvdcd.................................", "........................fffffcc................yyyybbbbb...ybbbaaaaabba...ybb..kkkkybbbakyybbbakkkkkdc..........................ybaa.....ppppldc........................ggg...........................................................................................vqnnnnnpprwwwecd...................qqqqqq.................rrrqdc....................rttttttqdcd................................................................wwwwwscc...................xxxxxxecd..................................", ".......................fffffdcd..............yyybbbbbbbba..ybbba...ybba.....aakjkkheybbbyybbbbbykkkjcc............................a.....pnpnnecd......................ggghhf.........................................................................................wtnnnpppnrwwwscc.................qqqqqqqqqqe.............rrrrodcd...................tttttttqdcd....................t...........................................wwwwwwocd...........wwwxwwwxxwxxxicc...................................", "......................ffffficc.............yyybbbbbbbbbbb...ybba...ybba.....kjkjkfdyybbbbbbbbbbbylkfcd.................................npnppjcc.......................hhghhhc...........................jj................................................mmmmmnlo...vqnnnnnnrvwwwecd...............qqqqqqqqqqqqic...........rrrrricd...................rttttttrdcd...................tttto........................................wvwwwwwwd...........wwwwxwxxxxxxxsii........x...........................", ".....................ffffffcc............yyybbbbbbbbbbbbba..ybba...ybba....jjjkkfccybbbbbbbbbbbbbylfc..................................nnnnnecd......................ghhgghhcc........................jkkkjc...........................................lmmmlidccc....unnnnnnrwwwwscc..............pqqqqqqqqqqqqqic..........rrrrrric....................ttrrrtrdcd..................tttttttc......................................wwwwwwwwwsd.........wxxxwwxwxwxxxxxxxxxxxxxxxv...........................", ".....................fffffecd............ybbbbbbbbaaaabbba...ybb....ybb...jkkjkicc.ybbbbbbbbbbbbbbkkc.................................nnnppicc...............fffffgggggghggfcc......................jjjjkkfcd.......................................lmmlkeccd.......vrpnnpprwwwwwecd.............qqpieioqqqqqqqqec.........rrrrrrrro....................rtttrqdcd..................ttttttuscc...............uuuu.................vvwvwwwwwwwse........wwwwwwxwxxwwxxxxxxxxxxviccd..........................", "....................ffffffcc.............ybbbbbbbaa...ybbb...ybba...ybbajjjjkfecc...ybbbbbaaaaabbbayec................................nnpnpdc............ffggffiecceggghghhecd.....................jjkjkjjec..........kkkkk.......................lmmmjdcc..........vnnnnnrwvwwwscc............pqq.ccd..qqqqqqqqdc........rrrrrrrrrrro.................tttttrdcd..................tttttttticd..............uuuvvsc...............wwwwwwwwwwwwsd........wwxxxwxxwxxxxxxxxxsoeccd............................", "...................ffffffecd.yyyyyy.......ybbbbbaa.....ybaa..ybba....ybbjkjjhdcd....ybbbaaakkkybbbbbyc...............................npnpnicc..........fffffeccd...gggggggfcc.....................jkjkjkkfcc........kkkkkkkid....................mlllecc............rmmpnrvwvwwwecd...........qpq.cd....qqqqqqqicc.......rqqrrrrrrrrrrrp...............rrttqdcd..................ttttttttsdc..............uuuuuvucd...............vwwwwwwwwwwwod.........iiiswxxxooooiiecccd...............................", "..................fffffffyy.yybbbbbyy......ybbbaa........a.....aa....ybbajjfccd.....ybbaakkkkkybbbbbbc...............................nnnnndc.........fffffdcc......gghggghic.....................jjjjjjjjecd.......kkkkkkkkkc..................lmlmldcd............vqpnnqwwvwvvicc...........qpqdc.......qqqqqicc........qrrrrrrrrrrrrrrpe............tttroccd...................tttttttsicd.............uuuuuuuicc.............vvwuvwwwwwwwwwwe............xxxxscc........................................", "..................ffffyyyybyybbbbbbbby......ybba...yyy..............hybbakecc......kybbakkkkkkybbbbbbad..............................nnnnicc.......ffffgfccd.......ggghgghgf....................jjjjjkkkicc.......kkkkkkkkkkec................llllkdcd.............tnnmpuvwwwwsdc...........pqpec........qqqqicc..........rrrrrrrrrrrrrrred...........rrtocc....................tttttutsdcd.............uuuuuuvsdc.............ww..cswwwwwwwwwwoc..........wwwwwecd........................................", ".................fffffybbbbbbbabbbbbbb......ybbayyyybby............jjybbaecc.......kybbalkkkkkybbbbbaac.............................nnnnpdc.......ffffffcc..........ghghghhhfe.................jjjjkkjjjdc.......kkkkkkkkkkkec...............lllmmicd.............vrnnntvwvvwwicd..........pqpicd.......qqqqicc..........rrqrrrrrrrrrrrrrec..........rttocc....................ttttttticcd.............uuuuuuvrdcd............v...d..wwwwwwwwwwsc..........xxxxscc.........................................", "................ffffffybbbbbbaa.aaabbba.....ybbbbybbbbb..........jjjhybbbcd........yybbbykkkkklkabbaakid............................pnnnicc.....fffffffdcd..........ggghgghhhfe................jjjjjjjkicc......kkkkkkkkkkkkic..............lmlolkcc..............vmmntvvwwvwocc...........pqocc.......qqqoecc..........qq.dcoprrrrrrrrricc..........rrsdcd...................tttuttodcc...............tuuuuusdcd............v..d.....wwwwwwwwwwcd........wwwxxicd.........................................", "...............fffffffybbbbbba....ybbba.....ybbbbbbbbbba........jhjjjjybba.........ybbbbbykkkkkkkkaakljc...........................nnppndc.....ffffffficc............gggghhhghid..............jjjjjjjkfcc......kkjkkkkkkkkkkfc.............lllmllicd..............rnnpvwvvvwsdc...........qppdc......qqqqoccd..........q.......qrrrrrrricc...........rticd....................ttttticcd...............uuuuuuodcd............v..........wwwwwwwwwcc........wxxwxcc..........................................", "...............ffffffffeabbbaa.....ybbb......ybbbbbbbbbb......hjjhhjfeybba.........ybbbbbbkkkkkkkkkkklkid..........................nnnnicc....ffffffffec............hg.hggghhghd.............jhjjjjkjjicd.....k..cikkkkkkkkkfc.............lllmllec..............tnnmrvwwwvwicd...........ppjcc...pqqqqoccc...........r.........rrrrrrecc...........rrtcc....................ttttticc................tutuuuicc..........................wwwwwwwscc........wwxwocc..........................................", "..............fffffffffecybba......ybbaa.....ybbbbbbbbbba....hjjhjjfdcdybayyy......ybbbbbaakkkkkklklkklld.........................nmnnnec.....ffffffffcc...........gg..fghhgghhec............jjjjjkjjkdc.....k..d..kkkkkkkkkfc............lllllmlec.............rpmnntvvvvwocc...........pqqqppqqqqoidccd........................rrrrecc............trrcc....................ttttocc................tuuuuuicc............................wwwwwwocd.......xwxwxic...........................................", ".............ffffffffffecybbb.....yybba.......ybbbbaabbaa..hhhhjhjiccdyybbbyby.....kybbbbakkkklkkkklklklfc........................nmnpjcc....fffffffffcc...........g....gghhhhhec...........hjjjjjjjjfcc............kkkkkkkkfc...........klllllmlic............nqqmnntvvvvscc............pppoieeccccd............................rrrecc.............trric...................tttutecd...............uutuuuocc.............................wwwwwwec........xwxwwic...........................................", ".............ffffffffffec.ybba...yybbbb.......ybbbaa..aa..hyyhhhfecc..ybbbbbbb.....jkkaaaakkkkkkkkklllllle........................nnnnecd...ffffffffffdc..........g.....ghghghhec...........jjjjjjjkjicd............kkkkkkkkfc...........llllllllfc...........mqupnnnpvvwwdcd...........pqppecd.................................rrrecc.............rrttte...................tttttec................ttuuuudc...............................wwwwscc.......wwwwxxic...........................................", "............ffffffffffffc.ybbayyyybbbbba......ybbba.....hhyybyjfdcd..yybbbbbbaa....kkkkkkkkkkkkkkkkkkkklljc......................nnnnlcc....ffffffffffec........gf.....hghhhhhhcc..........jhjjjjkjjkec.............kkkkkkkkkc...........lllllolllid.........mnuvmmmnnrvvicc............ppqpjc..................................rrocc............r.rrrrtti.................ttttttoc...............uuutuuudc............v..................wwwwecd.......wxwwwwsc...........................................", "...........fffffffffffffc..ybbbbbbbbbbbby......ybba....hhhybbbycc....ybbbbbbaa......kkkkkkkkkkkkkkklklllllid.....................mnmnicd...ffffffffffffd.......fg......hggggghfcc........j.jjhjjjjjjjec.............kkkkkkkkkdc........kllllllmmmmmi.......mmmtutnnnnnmricc............ppqpqpid....................qq..........rrrec............r..rrrtrrto................tttttttod............tttttuttuic...........u.....vvv...........wwwocc........wwxxxxxod...............x..........................", "...........fffffffffffffed.ybbbbbbbbbbbbby.....ybba..hhhghhybbbc.....ybbbbbaa.......kkkklkkkkkkkkkkkkkklklle....................nmnmnec....fffffffffffffi....ggg.d....ghhhhhghfcd......jh..jjjjjjjkjjfij............kkkkkkkkkic......ll.llllmllllllmfk..mmmmmovurmnnnnnnle............p.ppppqpie..................qq..........rrrrcc..........rr..errrttrttrr.............tttttttttoi..........ttuuuuuutuui.........vv..d..vvvwse.........wwudc.........wwwwwxwxoi............xx...........................", "..........fffffffffffffffc.ybbbbbbbaaabbbby.....ybbyhgyyyyyybbba.......aaaaa.........kkkkkkkkklklkllkllllllkc...................mnnnjcc....fffffffffffffffffgff.c.....gggggghhfc.....hh..dijjhjjjjjjkjjf.d..........kkkkkkkkkki....klk..lkllllollmmlmmmmmmmliuvvqnmmmnnnnno.........pp..ppqqpqqpo...............qrr.d........rrrrrec........rrr.dc.ttrrrtrtttttrr.......tttttttttttttst......ttt.ttttuuuuuuo......uvv..d..vvvwvwid.......wwwecd........wwwwxxwxxwxs........xxx..d..........................", "..........fffffffffffffffidybbbbbaaa..ybbbb......ybbyyybybbbbbba.....................kkkkkkkkkkkkkklkkllllllfd..................nnnnicd...ffffffffffffffffffgecc.....ggghhhhgghei.hhhh.dc..jjhhjjjkjjjfcc...........kkkkkkkkkkkkkklklecdlllllmllllmllmmlmmkesuuvqnnnnmmnnpnnnmnnnnppp.dipppqppqpqppp..........qqq..c.......rrrrrrroc......rrrricc..rtrtrtrtrttttttttttttt.otttttttttttttttttttudiuuutuuuuuuuuuuvvuutdc....wwvvvvvc.......wwocc.........xwwwwxxxxwwxxxxxxxxxxxodc...........................", ".........fffffffffffffffffe.ybbbaa.....ybbba....gybbbbbbbbbbbbaa......................kkkkkkkkkkkkkkkllkklklle.................mmmnmdc....ffffffffffffffgfggecc.....ghhhggghhhhhhhhhfccd..jhjjjjjjjjjfcc............kkkkkkkkkkkklklfdcd.llllllmmlmlmmmmmmkdouuvuqmmnmnnnnnppnpppppppecd.pqppqqqqqqqqqqqqqqqqqqqqicc........qrrrrrrroorrrrrrrrdcd...rrtrtrtttrttttttttttoccottttttttttttttttttoccitttututuuuuuuuuuvicc....vvvvwwwwic.....wwwcc..........wxxwxwwwxxxxxxxxxxxxvdcc............................", ".........ffffffffffffffffffeybbba......ybbba..ggyybbbbbbbbbbbaa........................kkkkkkkkkkklkklllllklljd................nnmnjcc....ffffffffffffffgffdcc......ghgghhghhhhhhhfecc....jjjjhjjjjkfcc..............kkkkkkkkkkllkicc...llllollmomllllmlldivuuuvrnmnnnnnnnnpppnppppecc..pppqpppqqqqqqqqqqqqqqqoecc........rrrrrrrrrrrrrrrrrqdcd....rrrrtrrttrttttstttticc..tttttttttttttttttecc..uutututuuuuuuuvsecc.....vvvvvvvvsd....wwwdc............wwwxxxxxxwxxxxxxxxoccd.............................", "........ffffffffffffffffffffybbaa......ybbbbgggyybbbbbbbbbbaaa.........................klkkkkkkkkkkllkkkllllllfd...............mmnnicd....ffffffffffffffffccd......ggghghghhghhhhfdcd.....hhjjjjjjjfcc...............kkkkkkkkkkkkecc....llllllllllmmmmmfdivuvvvutmnnnnnnnnnnnnppnldcc...pqppqqqqqqqpqqqqqqqqqodcd........qrrrrrrrrrrrrrrrroccd.....rrttrtttttttttttsrecc...ttttttttttttttttecc...ttutuuuuuuuuvuodcd......vvwvvwwwwsi.www.dc.............wxwwwwwxxxxxxxxxvicc...............................", "........ffffffffffffffffffffybbb........ybbaaggybbbbabbbbaaa............................kkkkkkkkkkkllllklllllllid.............nnnnnec......ffffffffffgffecc........ggghgggghghgfecc.......jhhjjjjkfcc................kkkkkkkkkkjdcc......llllllmllllmliceuuuuuuvvnmmmmpnnnpnnnnpldcd.....qqppppqpqqqqqqqqqqqiccd.........rqqrrrrrrrrrrrrricc........rrtrrrtttttttttodcd....tttttutttttuttsdcc....utuuuuuuuuuuuicc.........vvvvvvvwvwvwwicc..............wxwxxxwwxwxxxxxodcd................................", "........fffffffffffffffffffffybbaf...yyyybaaggfgybbaadaaaa...............................kkkkkkkkklkkkklllllllmme.............mmmmlcc......ffffffffffficcd.........ggggghhhghfeccd........hjjjjjjfcc.................kkkkkkkkkiccd.......llllmllmmmmkecdtuuuvvvuuinnnnnnnnnnpppfdcd.......ppqqqqqqqqqqqqqqoecc...........qrrrrrrrrrrrrrpecc..........rrtttrtrttttrecc.......ttttttuttttticcd......utttuuuuuuodcc..........uwwvwwwvwvwsdcc................wxwwwxxxxxxxuecc..................................", ".......fffffffffffffffffffffffybaffyyybbbbafgghgfeaa......................................kkkkkllkklklkllkllllllkd............nnnnfcd.......ffffffffidcc...........ggggggghfeccd...........jhhjjfcc...................kkkkkkfecc..........lllmllollidcetvuuuuuusecfnnmmnpnppnnicc..........ppppqpqqqqqqqqiccd.............rrrrrrrrrrrrodcd............rrrtrttttqiccd.........tttttttttoecc.........uutuuuusiccd............vvvvvwwwsiccd..................wxxxxwxwxviccd...................................", ".......ffffffffffffffffffffffyybbyyybbbbbaaggggidcd.......................................kkkkklkllklklklllllllllfd..........nmmmmec..........fffieccc..............gghghfeccd.............jjjjecc....................kkkkjiccd............lllllkidcc.vuuuvuuvsdcd..nnnnnnnnidcc............pqqqqqqqqqqidcc................qrrrrrrrrpiccd..............sqrtttoeccd............stttttoeccd...........tuttoiccd...............vvwwvsiccd.....................wwwxxxsiccd.....................................", ".......ffffffffffffffffffffffybbbbybbbbbbagggfdcc..........................................kkkkkkklklklllllmllmmmmi..........nnnnndc..................................feccc.................jfecc.......................ieccd................iedccd..uvuuuuuusdcd....kififeccc................ioqqqoieccc....................orrrrpidcd...................ecccc.................iiiccc................idccd...................iecccd.........................iiicccd.......................................", ".......ffffffffffffffffffffffybbbbbbbbbaaagfeccd............................................klklllklkllllllllmllllme.........mnnnlcc..........................................................d.....................................................uuuuuuuvsdcd.................................dcccd.........................ieeccd......................................................................................................................................................................", ".......ffffffffffffffffffffffybbbbbbbaaagfidcd...............................................llmllklllllmllmlmmmmlmld........nnnnfcd...............................................................................................................tuvvvuvuoccd............................................................................................................................................................................................................................................", ".......ffffffffffffffffffffffybbbbaaaafffecc..................................................nnmmolkllllmllmlllommmjd......nnpnnec...............................................................................................................uuuvvwwvicc..............................................................................................................................................................................................................................................", ".......ffffffffffffffffffffffffaaaaffffeccd............de....ee..............................eeqpnllllmmmmmmmmmnmmnnpie.....qqqqped.....................................ee.....eee...............................................................tuvuidvwidd...................................................................................eeeee.......................eeeeeee.........................................................................................................................", ".......ffffffffffffffffffffffffgfffgfeccd...............ev...exx..eeeeeee.eeeeeeee..........eiisrqnmliionpniinnmnliiili..deeiiiiodde.....d....deeeeee...eeeee...........eei....eiox...eeeeeee....eee......eee......ee........ee......deeeeee....tuuuvsexiede.....d..eeeeeeee..eeeeeee...eeeee......eeeeee....ee.......eee....eeeeeee..........eixxsii....ee....e...........esvvsssx...e.....e......ee.......eee.....eee.....eeeeeee...ee....e..............................................................", ".......ffffffffffffffffffffffffffffeccd.................ii..esx...essssssx.ssiisssx.........essixqpmmieirpqiswpnoeossiie..ssessssieex....ix...essssssx..esssse..........eiiv..eiosx...essssssx.eessoi...eessoi.....eii.....deosie....esssssox.uuuuuuvsexee.ee....ix..ssiisssx.esssssox..essssii...eoxxxxvx..eiex....eeosoe...esssssox........eox....ii...ees...ex..........ix.........dv...ees....eiex....eeosoe...e.ssii...esssssox..ees...ex.............................................................", ".......ffffffffffffffffffffffffffeccd....................ioiox....ex.........iix............exxix.pnmosiorqisvpoeuxxvwise..wisxwsieex....ix...ex........ex...is.........eoso..isoox...ex.......exx..vx..evx..vx....exex...e.xx..sx...ex.....xuuuuttvviex...eoi...ix....iix....ex........ex...ii...es........exis...eixx..vx..ex..............ex......ix..ese...ex..........isiii......ii...eis....exis...eixx..vx..ix...xx..ex........ese...ex.............................................................", "........fffffffffffffffffffffffeccd.......................iox.....eiiee......eix...........eox.io..pnosuisrisvqiixtrrriose.risxrie.eiiiiiix...eiiee.....eieeeix.........eixiviixiox...eiiee.....eeee.....eeee.....eoxis...ex.........eieee..vvuuuutseeex...exii..ix....eix....eieee.....eieeeesx..eiiee.....ex.i...ex........eieee...........ex......ix..ex.i..ix..........issoix.....ois.e.is....ex.i...ex........eiee.....eieee.....ex.i..ix.............................................................", ".........fffffffffffffffffffidccd.........................ivx.....essssx.....eix...........eiiiiiv..mjovrisiswqioxrrqqioxoirivxrie.ixxxxsox...essssx....essoixx...qqq...eixiiivxiox...essssx.....vssii....vssii...eso.ix..ex..eee....eosssvxwuuuuuiddeex...ex.ii.ix....eix....eossss....esssixx...esxxsx...eis.is..ex........eossss..........ex.....eix..ex.oi.ix..........ixxxxx.....o.i.exis...eis.is..ex.........xssie...eossss....ex.oi.ix.............................................................", "..........ffffffffffffffffeccd............................iv......ex.........eix..........eixxxxso...iovqsiiswrpexrqqqexxroresxred.ex....ix...ex........ex..is..rrqqqqrriix.isx.iix...ex............six......six.eisoois..es...xos...esx.xxxvuuusecc..ex...ex..iiix....eix....esx.......ex..io....es.......essoii..eo....e...esx.............ii.....esx..ex..iiix..........ix.........o.ie.xes...essoii..eo....e........ix..esx.......ex..iiix.............................................................", "............ffffffffffeeccd...............................es......eoieeee....eix..........ex.....ix...otqqseswqqoiioiioxtqqreswrdd.ex....ix...eoieeee...ex...ixtrrqqqqrriix.ixx.eix...eoieeee..eee.ee.x.eee.ee.x.ex....ex..iie.ees...eiiooiiwvuiccd...ex...ex...iox....eix....eiieeee...ex...is...es......e.x...is..iieeees..eiieeee..........oeeeeeox...ex...iix..........ioiieee....i..ix.es..e.x...is..iieeees..eee.eex..eiieeee...ex...iix.............................................................", "..............eeeeecccc....................................s.......ssssssx....sx...........x......v...ivpqqssvqqqvsssxxvrqqpovwqdd..x....ov....ssssssx...v...osrrrqqqqqrosxtsx...sx....ssssssx..xsssxx...xsssxx...x.....v...sss.xx...issssssxsecc.....ox....v....sx.....sx.....sssssox...s....s....s.......x.....s...xsssxx...sssssox..........xsssxx.....s....sv..........ossssssv.......x..s...x.....s...xsssxx...vsssxx...sssssox...s....sv.............................................................", "........................................................................................................mnprvvppppqvvvqqppnprvtidd...........................twtrqqqqqqrtwwtttr.....................................................uwxxxxxxsddd...........................................................................................................................................................................................................................................................", ".........................................................................................................lnpppmnnnpnpppppnnnpqqic............................rrqqqqqqqqrrrrrrrrri.................................................ttuuuvvvoedd.............................................................................................................................................................................................................................................................", "..........................................................................................................lmmmmmmmmnnmnmmnnnpnnic...........................qqqqqqqqqqqqrrrrrrrrri..............................................ttttttuuoedc...............................................................................................................................................................................................................................................................", "...........................................................................................................mlmlmmmmmmmmnmmmnnnnic...........................qqqqqqqqrrqqqqqqrrrrrrd...........................................ttttttttreccd................................................................................................................................................................................................................................................................", ".............................................................................................................lmlmlllmmmmmmnmmmnec...........................qqqqqqqqqqqqqqrrqrrrrroc........................................ttttttttsiccd..................................................................................................................................................................................................................................................................", "..............................................................................................................mlmmmmmmmmmmnnnmmec...........................pqqqqqqqqqqqqqrrqqqrrrre......................................ttttttttsiccd....................................................................................................................................................................................................................................................................", "...............................................................................................................lllmlmmlmmmmmmnnlc............................qqqqqqqqqqqqqqqqqrqrrrre...................................ttttttttoeccd......................................................................................................................................................................................................................................................................", "................................................................................................................llmlmmmmmmmnmmmmid...........................qqqqqqqqqqqqqqqrqqqqrrrre...............................tttttttttoeccd........................................................................................................................................................................................................................................................................", ".................................................................................................................llmlmmmmmmmmnnnne............................qqqqqqqqqqqqqqqrrrrrrrrri...........................tttttttttridccd..........................................................................................................................................................................................................................................................................", "..................................................................................................................lmllmmmmmnmmmmmjc............................qqqqqqqqqqqrqqrrqrrqrrrroo.....................rrtttttttttoeccd.............................................................................................................................................................................................................................................................................", "....................................................................................................................mmlommmmmmnnnmed............................qqqqqqqqqrqqqqqqqrrrrrrrrqp..............rrrttttttttttridccd...............................................................................................................................................................................................................................................................................", ".....................................................................................................................mmmmmmmmmmmnnlc..............................oqqqqqqqqqqrrrrqrrrrrrrrrrrrrrrrrrrrrrrrtrtttrtttrieccd..................................................................................................................................................................................................................................................................................", "......................................................................................................................mlmmmnnmnnmmnid...............................oqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrrrrrrrtrtrtttoidccd.....................................................................................................................................................................................................................................................................................", ".......................................................................................................................mmmmmmmmnnnnjc.................................oioqqqqqqrqqqrrrrrrrrrrrrrrrrrrrrtrrrtoieccc.........................................................................................................................................................................................................................................................................................", "........................................................................................................................mmmmnmnmmnmned....................................iiirrqrrrrrrrrrrrrrrrrrrrrrrrooeecccd............................................................................................................................................................................................................................................................................................", "........................................................................................................................mmmmmmnnmnmnjc.........................................eeeiioorrrrrrrrroooieedcccd.................................................................................................................................................................................................................................................................................................", "........................................................................................................................mmmmnmmmnnnmndd.................................................cccccccccd.........................................................................................................................................................................................................................................................................................................", "........................................................................................................................mmmmnnnmmnnnnic....................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................mmmmmmmnnnnnnlc....................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................mmmmmnmmmnmnnned...................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................mmmmmmnnnmnmnnic...................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................mmmnmmmmnnnpnnlc...................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................mmmmmmnnmnnnnnned..................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................mmmnmmmnmnnmnnnic..................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................mmmmnmnmnmmnnpnic..................................................................................................................................................................................................................................................................................................................................................................", ".........................................................................................................................mmmnmnmnnnnnpnnc..................................................................................................................................................................................................................................................................................................................................................................", ".........................................................................................................................mmmmmmnmnnnnnnnec.................................................................................................................................................................................................................................................................................................................................................................", ".........................................................................................................................mmmmnmnmmmnnnnnec.................................................................................................................................................................................................................................................................................................................................................................", ".........................................................................................................................mmmnmnmnnnmnnnnfc.................................................................................................................................................................................................................................................................................................................................................................", ".........................................................................................................................mmmmmnmnnnnnppnjc.................................................................................................................................................................................................................................................................................................................................................................", "..........................................................................................................................mmmmmnmnnmnnnnncd................................................................................................................................................................................................................................................................................................................................................................", "..........................................................................................................................mnmnmnmnnmnnpnncc................................................................................................................................................................................................................................................................................................................................................................", "..........................................................................................................................mmnmnmnmnnnnnnnec................................................................................................................................................................................................................................................................................................................................................................", "..........................................................................................................................mmmmnmnnnmnnppnec................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................mmmmnmmnnnnnnpec................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................nnmmnnmnnnnnnnec................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................mmnnmmnpmnnnnnec................................................................................................................................................................................................................................................................................................................................................................", "............................................................................................................................mmnnnmnnnnnpnec................................................................................................................................................................................................................................................................................................................................................................", "............................................................................................................................mmmmmnnnnppnnec................................................................................................................................................................................................................................................................................................................................................................", ".............................................................................................................................nnnnnmnnnnpnec................................................................................................................................................................................................................................................................................................................................................................", ".............................................................................................................................mmmmmpmnnnnndc................................................................................................................................................................................................................................................................................................................................................................", "..............................................................................................................................nnnnnnnnnpncc................................................................................................................................................................................................................................................................................................................................................................", "..............................................................................................................................mmmnnnnpnnicc................................................................................................................................................................................................................................................................................................................................................................", "...............................................................................................................................nmnmnnnnnec.................................................................................................................................................................................................................................................................................................................................................................", "................................................................................................................................nmnnnpnicc.................................................................................................................................................................................................................................................................................................................................................................", ".................................................................................................................................nnnnnjdcd.................................................................................................................................................................................................................................................................................................................................................................", "...................................................................................................................................ieeccd..................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................." }; wanderlust-wanderlust-769699d/etc/icons/wl-beta-xmas-logo.xbm000066400000000000000000001352111406661363500242450ustar00rootroot00000000000000#define wl_beta_xmas_logo_width 464 #define wl_beta_xmas_logo_height 160 static char wl_beta_xmas_logo_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0xaa, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x15,0x11,0x2a,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x8a,0x88,0x88,0x84,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x80,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x48,0x20,0x52,0x24,0x21,0x28,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x80,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x25,0x95,0x84,0x92,0x80,0x82,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x6d, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x90,0x10,0x02,0x21,0x40,0x58,0x28,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x76,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x8a, 0x54,0x4a,0x15,0x3c,0x02,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x6b,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x51,0x88,0x10, 0x42,0xff,0xa8,0x44,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x7d,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x92,0x84,0x42,0x44,0x14,0x7f, 0x02,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x80,0xb7,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0x58,0x49,0x52,0x28,0x09,0xa1,0x7e,0xa8,0x42, 0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0xdd,0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x32,0x25,0x09,0x45,0xc2,0x0f,0xfa,0x02,0x08,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa0,0x6b,0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x60,0x9d,0x94,0xa4,0x90,0xe4,0x5f,0x71,0x48,0xa2,0x22,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0xbd, 0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, 0xaa,0x4a,0x42,0x00,0xc8,0x3f,0x64,0x82,0x08,0x80,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0xd7,0x76,0x00, 0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x5d,0x22, 0x14,0x7c,0x82,0xbf,0xe2,0x28,0x82,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x7a,0x7b,0x00,0x00,0x00, 0x00,0x00,0xa0,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x32,0x99,0x01,0xff, 0x29,0x7f,0xe8,0x02,0x28,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x6a,0xad,0x6d,0x00,0x00,0x00,0x00,0x00, 0x58,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x5b,0x45,0xaa,0xff,0x03,0xfe, 0xe2,0xa9,0x02,0x25,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x40,0xbb,0x77,0x3b,0x00,0x00,0x00,0x00,0x00,0xac,0x2a, 0x00,0x00,0x00,0x00,0x00,0x00,0xd2,0x2d,0xa9,0x84,0xff,0xa7,0xfe,0xc9,0x00, 0x50,0x80,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x80,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf8,0xd7,0xaa,0x3d,0x00,0x00,0x00,0x00,0x00,0xab,0x75,0x00,0x00, 0x00,0x00,0x00,0x80,0x4a,0x94,0x10,0xd2,0x47,0x1f,0xfc,0xc3,0xab,0x84,0x14, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x56,0xbd,0xfd,0x36,0x00,0x00,0x00,0x00,0x80,0xaa,0x56,0x00,0x00,0x00,0x00, 0x00,0xa0,0x54,0x25,0x8c,0xc4,0xbb,0xbd,0xfc,0xd7,0x01,0x11,0x40,0x11,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x20,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x6d,0x6b, 0xab,0x3d,0x00,0x00,0x00,0x00,0x40,0xb5,0xea,0x00,0x00,0x00,0x00,0x00,0x40, 0x25,0x85,0x7f,0xd9,0x1f,0xf8,0x1b,0xcf,0x29,0x84,0x2a,0x24,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x16, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xbb,0xdd,0xdd,0x1e, 0x00,0x00,0x00,0x00,0x40,0x55,0xd5,0x00,0x00,0x00,0x00,0x00,0x28,0x92,0xe0, 0xff,0xcf,0x01,0x30,0xf8,0xfe,0x03,0x21,0x34,0x60,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x1a,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0xa8,0xed,0x76,0x6b,0x1b,0x00,0x00, 0x00,0x00,0xb0,0xaa,0xea,0x00,0x00,0x00,0x00,0x00,0x54,0xa9,0xfc,0x7f,0xc0, 0x01,0x30,0x38,0xfc,0x57,0x88,0x68,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x11, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xd0,0x7d,0xb7,0xad,0xdd,0x1e,0x00,0x00,0x00,0x00, 0x50,0x57,0xed,0x00,0x00,0x00,0x00,0x00,0x4a,0x95,0xfc,0x3f,0xe0,0x01,0x70, 0x30,0xf8,0x07,0x22,0x3c,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc8,0xd6,0x6d,0xf7,0x6e,0x0f,0x00,0x00,0x00,0x00,0x68,0xb5, 0x75,0x00,0x00,0x00,0x00,0x40,0x29,0x40,0xfd,0x0f,0xc0,0x01,0x70,0x70,0xf8, 0xaf,0x88,0x82,0xa4,0x01,0x00,0x00,0x00,0x00,0xc0,0x3a,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0, 0x01,0x26,0xff,0xde,0xad,0xb5,0x0f,0x00,0x00,0x00,0x00,0xa8,0xaa,0x6a,0x00, 0x00,0x00,0x00,0x20,0x05,0xbe,0x7e,0x0f,0x80,0x00,0x70,0x70,0xf0,0x0f,0x02, 0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xfd,0xdb, 0xaa,0xb5,0x76,0xdb,0x06,0x00,0x00,0x00,0x00,0x54,0x55,0x75,0x00,0x00,0x00, 0x00,0x90,0xe2,0xff,0x07,0x0e,0x80,0x01,0x60,0x70,0xf0,0xa7,0x50,0x8a,0x24, 0x03,0x00,0x00,0x00,0x00,0x80,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x57,0xdd,0xdf,0xee, 0xdb,0xb6,0x07,0x00,0x00,0x00,0x00,0xdb,0x5a,0x75,0x00,0x00,0x00,0x00,0xa0, 0xf8,0xff,0x00,0x06,0x80,0x01,0xf0,0x70,0xe0,0x1f,0x04,0x20,0x80,0x02,0x00, 0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xfa,0xaf,0x76,0xbb,0xb6,0xed, 0x03,0x00,0x00,0x00,0x00,0x55,0xab,0x3a,0x00,0x00,0x00,0x00,0xa8,0xfc,0x3f, 0x00,0x0e,0x80,0x01,0xf0,0x60,0x80,0x8f,0xa2,0x84,0x12,0x06,0x00,0x00,0x00, 0x00,0x40,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x5f,0xf5,0xdb,0x6d,0xef,0xde,0x01,0x00, 0x00,0x00,0x00,0x6d,0x55,0x3b,0x00,0x00,0x00,0x00,0x94,0xfc,0x7f,0x00,0x1c, 0x80,0x03,0xf0,0xf0,0x01,0x07,0x08,0x10,0x40,0x06,0x00,0x00,0x00,0x00,0x80, 0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x80,0xea,0xff,0x6e,0xdb,0xba,0xf5,0x00,0x00,0x00,0x00, 0x40,0xab,0x6a,0x1d,0x00,0x00,0x00,0x00,0x55,0xfc,0x7b,0x00,0x1c,0x00,0x03, 0xf0,0xf0,0x07,0x06,0xa2,0x02,0x09,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xbf,0xaa,0xfb,0xee,0x6d,0x77,0x00,0x00,0x00,0x00,0xa0,0xd5, 0x56,0x1d,0x00,0x00,0x00,0x00,0xaa,0xfe,0x78,0x00,0x3c,0x00,0x07,0xf0,0xf0, 0x0f,0x00,0x08,0x48,0x20,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xd5,0xdf,0xad,0x5b,0xb7,0x3d,0x00,0x00,0x00,0x00,0x40,0xad,0xaa,0x0e, 0x00,0x00,0x00,0xfc,0x51,0x3e,0x70,0x00,0x38,0x00,0x07,0xf0,0xf0,0x07,0x00, 0x20,0x01,0x04,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e, 0x75,0xf7,0xee,0xda,0x1e,0x00,0x00,0x00,0x00,0xb0,0xd5,0x5a,0x0f,0x00,0x00, 0x80,0xff,0x4b,0x1d,0x00,0x00,0x38,0x00,0x0e,0xf8,0xe0,0x07,0x00,0x00,0x20, 0x91,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0xbf,0xad, 0x75,0xb7,0x0f,0x00,0x00,0x00,0x00,0xd0,0x5a,0xab,0x07,0x00,0x00,0xe0,0xff, 0xaf,0x1d,0x00,0x00,0x78,0x00,0xfc,0x78,0x00,0x00,0x00,0x50,0x9e,0x00,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7a,0xd5,0x7b,0xaf,0xed, 0x07,0x00,0x00,0x00,0x00,0x68,0xad,0xaa,0x03,0x00,0x00,0xf0,0xff,0xd7,0x39, 0x00,0x00,0x70,0x00,0xf8,0x7f,0x00,0x00,0x00,0x00,0x17,0x24,0x19,0x40,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0xff,0xd6,0xda,0xee,0x01,0x00, 0x00,0x00,0x00,0x58,0x6b,0xd5,0x01,0x00,0x80,0xf0,0x2f,0xef,0xfc,0x1f,0x00, 0xf0,0x00,0xf0,0x3f,0x00,0x00,0x00,0x00,0x97,0x00,0x18,0xa0,0x01,0x00,0x00, 0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x55,0xbf,0x77,0xca,0x00,0x00,0x00,0x00, 0x00,0x6e,0xad,0xf6,0x00,0x00,0xfc,0xe1,0x53,0x7e,0xf8,0xff,0x00,0xf0,0x00, 0xe0,0x1f,0x00,0x00,0x00,0x00,0x37,0x48,0x1a,0x90,0x04,0x00,0x00,0x00,0x00, 0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x00, 0xb8,0x01,0x00,0x00,0xa8,0xfe,0xea,0xad,0x75,0x00,0x00,0x00,0x00,0x00,0xa8, 0x6a,0x75,0x00,0x00,0xfe,0xc1,0x2b,0x1f,0xf0,0xff,0x01,0xf0,0x05,0x80,0x0f, 0x00,0x00,0x00,0xc0,0x98,0x02,0x18,0x48,0x06,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x80,0x6b,0x1b, 0x00,0x00,0xf0,0xab,0xbf,0xde,0x2a,0x00,0x00,0x00,0x00,0x00,0xb7,0xad,0x3a, 0x00,0xe0,0xff,0x83,0x4b,0x0f,0xe0,0xef,0x03,0xf0,0x1f,0x00,0x01,0x00,0x00, 0x00,0x00,0x27,0x90,0x18,0xb0,0x05,0x00,0x00,0x00,0x00,0xc0,0x80,0x3f,0x00, 0x00,0x00,0x00,0x00,0xc0,0x0e,0x00,0x00,0x00,0x00,0x0c,0xf3,0x1b,0x00,0x00, 0xa0,0xfe,0xd5,0xf5,0x35,0x00,0x00,0x00,0x00,0x80,0x5a,0xb5,0x1d,0x00,0xf8, 0xff,0x43,0x17,0x0f,0x00,0xc0,0x03,0xf0,0x3f,0x00,0x00,0x00,0x00,0x00,0x80, 0xa7,0x04,0x12,0x98,0x06,0x00,0x00,0x00,0x00,0x80,0x81,0x35,0x00,0x00,0x00, 0x00,0x30,0xc6,0x0d,0x00,0x00,0x00,0x00,0x98,0xd1,0x18,0x00,0x00,0xc0,0xab, 0x7e,0x5b,0x4a,0x00,0x00,0x00,0x00,0x80,0xaa,0xd5,0x0e,0x00,0xf8,0xff,0x03, 0xc7,0x0f,0x00,0x80,0x03,0xf8,0x3f,0x00,0x00,0x00,0x00,0x00,0x80,0x27,0x40, 0x18,0x40,0x01,0x00,0x00,0x00,0x00,0xc0,0x01,0x1e,0x00,0x00,0x00,0x00,0x30, 0x06,0x07,0x00,0x00,0x00,0x00,0xdc,0x71,0x0f,0x00,0x00,0x00,0xfd,0xd5,0xfe, 0x6e,0x00,0x00,0x00,0x00,0x40,0xdb,0x6a,0x07,0x78,0xf8,0x83,0x67,0xff,0x0f, 0x00,0x00,0x03,0xfe,0x1f,0x00,0x00,0x00,0x00,0x00,0xc0,0x3f,0x13,0x35,0xe0, 0x01,0x00,0x00,0x00,0x00,0x80,0x01,0x0f,0xa0,0x00,0x00,0x00,0xa0,0x87,0x03, 0x00,0x00,0x00,0x00,0xb8,0xe0,0x07,0x00,0x00,0x00,0x54,0xbf,0x3b,0x33,0x00, 0x00,0x00,0x00,0x40,0xad,0xf6,0x03,0xfe,0xf0,0x01,0x2f,0xfe,0x0f,0x00,0x80, 0x03,0xfe,0x0f,0x00,0x00,0x00,0x00,0x00,0xe0,0x3f,0x01,0x3a,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x81,0x06,0x94,0x01,0x00,0x00,0xf0,0xc1,0x01,0x00,0x00, 0x00,0x00,0xe0,0xb0,0x01,0x00,0x00,0x00,0xe0,0xef,0x1e,0x00,0x00,0x00,0x00, 0x00,0xa0,0xb5,0x92,0x01,0xfe,0xe0,0x60,0xa8,0xfe,0x07,0x60,0x80,0x03,0xfc, 0x01,0x00,0x00,0x00,0x00,0x00,0xf0,0x3f,0x49,0x35,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x83,0x03,0xc0,0x01,0x00,0x00,0xb0,0xa1,0x01,0x00,0x00,0x00,0x00, 0xb0,0xe3,0x00,0x00,0x00,0x00,0x00,0xb4,0x07,0x00,0x00,0x00,0x00,0x00,0xd0, 0xaa,0xc9,0x00,0xfc,0xc0,0xf1,0x54,0xfe,0x0f,0xc0,0xc0,0x07,0x78,0x00,0x00, 0x00,0x00,0x00,0x00,0xf0,0xef,0x01,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd6,0x01,0x94,0x01,0x00,0x00,0xc0,0xe1,0x00,0x00,0x00,0x00,0x00,0x70,0xf3, 0x00,0x00,0x00,0x00,0x00,0xda,0x07,0x00,0x00,0x00,0x00,0x00,0x50,0xb7,0xb6, 0x0f,0x70,0xc0,0xfb,0x52,0xfd,0x0f,0xc0,0xe1,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0x1f,0xf0,0xff,0xff,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x00, 0xa2,0x01,0x00,0x00,0x80,0xfd,0x00,0x00,0x00,0x00,0x00,0xe0,0x7d,0x00,0x00, 0x00,0x00,0x00,0xee,0x01,0x00,0x00,0x00,0x00,0x00,0x68,0xad,0xd7,0x1f,0x70, 0xc0,0xff,0xa9,0x7d,0x1c,0xc0,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x1a, 0xe0,0x13,0xaa,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x80,0x88,0x01, 0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x00, 0x00,0xfa,0x01,0x00,0x00,0x00,0x00,0x00,0xa8,0x6a,0xeb,0x1f,0x70,0xc0,0xff, 0xab,0x39,0x3c,0xc0,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x10, 0xf7,0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x00,0xa4,0x01,0x00,0x00, 0x00,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x00,0x80,0xef, 0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0xdb,0xbf,0x0f,0x70,0xc0,0xff,0xd5,0x3d, 0x78,0xc0,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x38,0x1c,0xad,0x1f, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x80,0x90,0x01,0x00,0x00,0x00,0x15, 0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x00,0x80,0x7a,0x00,0x00, 0x00,0x00,0x00,0x00,0xd4,0xec,0x01,0x0f,0x70,0x80,0xff,0xe1,0x38,0xf0,0xc1, 0xdf,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0xf8,0x3f,0xfb,0xd9,0x01,0x00, 0x00,0x00,0x30,0x00,0x00,0x1b,0x00,0x5e,0x00,0x60,0x00,0x00,0x1f,0x00,0x1c, 0x00,0x80,0xf7,0xee,0x1e,0x00,0x00,0x00,0x00,0xc0,0x3f,0x00,0x00,0x00,0x00, 0x00,0x00,0x5a,0xf7,0x00,0x1e,0x78,0x80,0xff,0x7a,0x38,0xe0,0x83,0x07,0xd0, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0xf8,0x1f,0x6e,0xb5,0x01,0x00,0x00,0x00, 0x60,0x00,0x80,0x6d,0xef,0x1a,0x0f,0xdc,0x01,0xd8,0xda,0x03,0x1b,0x0f,0xbc, 0xfe,0xff,0x1b,0x00,0x00,0x00,0x00,0x60,0x1d,0x00,0x00,0x00,0x00,0x00,0x00, 0xb4,0x6a,0x00,0x1c,0x78,0x00,0xdf,0x39,0x38,0xc0,0x03,0x00,0x48,0x02,0x00, 0x00,0x00,0x00,0x00,0x1b,0xf0,0x1f,0xbb,0x62,0x03,0x00,0x00,0x00,0xf0,0x00, 0xd8,0xfe,0xff,0xed,0x1a,0xec,0xfe,0xfd,0xfd,0x7b,0xdd,0xea,0xfd,0x07,0x00, 0x1e,0x00,0x00,0x00,0x00,0xb0,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x7a, 0x00,0x18,0x78,0x00,0x57,0x3a,0xf8,0x80,0x03,0x00,0x24,0x03,0x00,0x00,0x00, 0x00,0x00,0x36,0xe0,0x1f,0x7d,0xd5,0x0f,0x00,0x00,0x00,0xaf,0xc1,0xfb,0x15, 0x00,0xfb,0xef,0x5b,0xfb,0x0f,0x17,0xfe,0xfb,0xff,0x07,0x0d,0x00,0x1b,0x18, 0x00,0x00,0x00,0xe8,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x37,0x00,0x70, 0x70,0x00,0xa7,0x72,0xfc,0x01,0x00,0x00,0xd8,0x02,0x00,0x00,0x00,0x00,0x00, 0x7d,0xbf,0x7b,0x57,0xf1,0x1a,0x1f,0xf0,0x61,0xff,0xb6,0xb6,0x1f,0x50,0xde, 0xff,0xff,0xd7,0x6e,0x1d,0x00,0x1f,0x1f,0x80,0xdb,0xb6,0x1d,0x1c,0x00,0x00, 0x00,0xb8,0x03,0x00,0x00,0x00,0x00,0x00,0x80,0xaa,0x3a,0x00,0xe0,0x70,0x00, 0x5e,0x79,0xfc,0x01,0x00,0x00,0x4c,0x03,0x00,0x00,0x00,0x00,0x00,0xd7,0xea, 0xd6,0xbd,0x52,0x6f,0xb5,0x57,0xf7,0x41,0x6f,0xef,0x1a,0x00,0xe1,0x00,0x40, 0x7d,0xdb,0x1e,0x00,0x00,0x00,0x80,0xb6,0x6d,0x1b,0x0c,0x00,0x00,0x00,0xe8, 0x03,0x00,0x00,0x00,0x00,0x80,0x83,0xb6,0x1d,0x00,0xe0,0x78,0x00,0x2e,0x7c, 0xf8,0x01,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0xbd,0xfd,0xb6, 0xf8,0xfa,0xfe,0xbf,0x3f,0xc0,0xda,0x5a,0x1f,0xa8,0x68,0x00,0x80,0xab,0xbd, 0x0b,0x00,0x00,0x00,0x00,0x7b,0xf7,0x1e,0x0e,0x00,0x00,0x00,0xfe,0x01,0x00, 0x00,0x00,0x00,0xf0,0x47,0xdb,0x1e,0x00,0xc0,0x79,0x00,0x8e,0xff,0x70,0x00, 0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x6b,0xab,0x5d,0x54,0x1f, 0x17,0xf0,0x01,0x80,0xbf,0xf7,0x0d,0x04,0x75,0x00,0x00,0xf6,0xeb,0x0e,0x00, 0x00,0x00,0x00,0xd6,0xad,0x4d,0x06,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x00, 0x00,0xf0,0x8f,0x55,0x0d,0x00,0xc0,0xff,0x00,0xfe,0xff,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xdf,0xff,0x37,0xef,0x1f,0x18,0x00, 0x00,0x80,0x6a,0x5d,0x07,0x50,0x30,0x00,0x00,0x5d,0xbd,0x07,0x00,0x00,0x00, 0x00,0xef,0xde,0x0f,0x07,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0xe0, 0xff,0x6e,0x0f,0x00,0x80,0x7f,0x00,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa0,0xb1,0x0f,0x1d,0xfa,0x00,0x00,0x00,0x00,0x00, 0xf7,0xeb,0x01,0x0a,0x3d,0x00,0x00,0xb7,0xd7,0x02,0x00,0x00,0x00,0x00,0xba, 0xb5,0x86,0x03,0x00,0x00,0x80,0x3b,0x00,0x00,0x00,0x00,0x18,0xc0,0x7f,0xb5, 0x0e,0x00,0x80,0xff,0x00,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd0,0xe1,0x5f,0x9b,0x57,0x00,0x00,0x00,0x00,0x80,0xad,0xbe, 0x01,0xa0,0x18,0x00,0x80,0xfd,0xbf,0x03,0x20,0x02,0x00,0x00,0xd7,0xef,0xc7, 0x01,0x00,0x00,0xc0,0x3e,0x00,0x00,0x00,0xc0,0x7f,0x00,0xff,0xdb,0x07,0x00, 0x00,0x7f,0x80,0xfe,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x70,0xb1,0x3f,0xdd,0x7a,0x00,0x00,0x00,0x00,0x00,0xfb,0x6f,0x03,0x15, 0x0e,0x00,0x80,0x0e,0x60,0x03,0xa0,0x04,0x00,0x80,0x7a,0x73,0xed,0x00,0x00, 0x00,0x40,0x1f,0x00,0x00,0x00,0xe0,0xff,0x80,0xff,0x55,0x07,0x00,0x00,0x7e, 0x40,0xfe,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0xd7, 0xdd,0x7e,0x5b,0x3f,0x00,0x00,0x00,0x00,0xc0,0xfe,0xf0,0x8e,0x40,0x07,0x00, 0xe0,0x07,0xf0,0x0d,0x58,0x07,0x00,0x80,0xff,0xc1,0x7f,0x00,0x00,0x00,0xc0, 0x0d,0x00,0x00,0x00,0xfe,0xff,0x80,0xff,0xb6,0x03,0x00,0x00,0xfe,0x40,0x1d, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x7a,0x6b,0xab, 0xf7,0x1a,0x00,0x00,0x00,0x00,0xc0,0x07,0xc0,0x1b,0x2a,0x07,0x00,0xa0,0x01, 0xc0,0x0f,0xa0,0x02,0x00,0x60,0x0d,0x00,0x3b,0x00,0x00,0x00,0x70,0x0f,0x00, 0x00,0x80,0xff,0xff,0x40,0xff,0xac,0x03,0x00,0x00,0x7c,0xa0,0x1e,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xdf,0xde,0x7d,0xad,0x0f, 0x00,0x00,0x00,0x00,0xb0,0x01,0x00,0x9e,0xc4,0x03,0x00,0xd0,0x01,0x00,0x1b, 0x50,0x03,0x80,0xa1,0x07,0x00,0x3c,0x00,0x00,0x00,0xd8,0x07,0x00,0x00,0x85, 0xff,0xe7,0x38,0xd7,0xd7,0x03,0x00,0x00,0x78,0xa0,0x8e,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xea,0xf5,0xd6,0xfb,0x06,0x00,0x00, 0x00,0x00,0xf0,0x01,0x00,0x34,0xd1,0x01,0x00,0xf0,0x00,0x00,0x1e,0xa0,0x04, 0xd0,0xe1,0x03,0x00,0x3c,0x00,0x00,0x00,0xf0,0x03,0x00,0xc0,0x86,0xff,0xc3, 0x94,0xcf,0xbb,0x01,0x00,0x00,0x70,0x50,0x07,0x05,0x00,0x38,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0x03,0x00,0x50,0x01,0x00, 0xf0,0x01,0x00,0xbc,0xe8,0x00,0x00,0x78,0x00,0x00,0x1c,0xe8,0x06,0xc4,0xf0, 0x00,0x00,0x3e,0x00,0x00,0x00,0xbc,0x03,0x00,0xd8,0x96,0x87,0x83,0x6b,0xe7, 0xd3,0x01,0x00,0x00,0x20,0xa8,0x87,0x07,0x00,0x56,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x28,0xc1,0x00,0x00,0x24,0x0d,0x00,0xca,0x01, 0x00,0x20,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x03,0xe0,0x00,0x00,0x10, 0x07,0x00,0x00,0x00,0xea,0x01,0x00,0x3e,0x19,0x87,0x03,0x3d,0xff,0xe7,0x01, 0x00,0x00,0x00,0xa8,0x03,0x00,0x00,0xec,0x00,0x00,0x00,0x18,0x00,0x00,0x00, 0x00,0x00,0xa0,0x0a,0xad,0xe2,0x00,0x80,0xaa,0x1a,0x00,0xf0,0x00,0x00,0x48, 0x38,0x00,0x28,0x08,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x80,0x00,0x03,0x00, 0x00,0x00,0xff,0x00,0x80,0xdf,0x16,0x87,0xc3,0xb7,0xff,0xcf,0x00,0x00,0x00, 0x00,0xa8,0x03,0x00,0x00,0xbb,0x01,0x00,0x00,0x6a,0x00,0x00,0x00,0x00,0x00, 0xa8,0x0f,0x54,0x68,0x00,0x40,0x52,0x19,0x00,0x6b,0x00,0x00,0x90,0x1e,0x00, 0xb4,0x64,0x00,0x00,0x00,0x00,0x40,0x80,0x00,0x10,0x04,0x00,0x00,0x00,0x00, 0xea,0x00,0xe0,0xff,0x1e,0x06,0x43,0x9d,0xff,0xbf,0x00,0x00,0x00,0x00,0xd6, 0x01,0x00,0xff,0xee,0x01,0x00,0x80,0xed,0x00,0x00,0x00,0x00,0x80,0xfa,0x00, 0xaa,0x70,0x00,0xa0,0x2b,0x1d,0x80,0x24,0x00,0x00,0x20,0x0f,0x00,0x92,0xc2, 0x00,0x00,0x00,0x00,0x00,0x49,0x01,0x44,0x10,0x00,0x0f,0x00,0x80,0x7f,0x00, 0xe0,0x3f,0x1d,0x0e,0x7f,0x0f,0xff,0xbf,0x01,0x00,0x00,0x00,0xe8,0x00,0xf0, 0xfa,0xf5,0x01,0x00,0x80,0x76,0x00,0x2c,0x00,0x00,0x40,0x1f,0x00,0x2b,0x34, 0x00,0xd4,0xa9,0x1a,0xa0,0x52,0x01,0x00,0x48,0x07,0x00,0xc9,0xe8,0x00,0x00, 0x12,0x00,0x10,0x00,0x02,0x00,0x00,0xe0,0x03,0x00,0x40,0x75,0x00,0xc0,0x9f, 0x3f,0x0e,0xae,0x07,0xbf,0x7d,0x01,0x00,0x00,0x00,0xed,0x00,0xac,0x87,0xde, 0x00,0x00,0x60,0x7b,0x00,0xd7,0x00,0x00,0x60,0x07,0x80,0x8a,0x38,0x00,0x64, 0x40,0x1d,0x40,0x4a,0x02,0x00,0x84,0x03,0x00,0xb6,0x65,0x00,0x80,0x30,0x00, 0x20,0x49,0x06,0x70,0xf1,0x7f,0x00,0x00,0xe0,0x0f,0x3e,0x80,0x0f,0x10,0x0c, 0xee,0x03,0xef,0xfc,0x01,0x00,0x00,0x00,0x75,0x00,0xfb,0xc0,0x75,0x00,0x00, 0xd0,0x75,0xc0,0xfa,0x00,0x00,0xd8,0x03,0x00,0x0a,0x1c,0x00,0x1a,0xa0,0x0e, 0x20,0x29,0x19,0x00,0xf0,0x01,0x00,0xd3,0x70,0x00,0x40,0x3c,0x00,0x40,0x00, 0x04,0x00,0x30,0x00,0x00,0x00,0xa0,0x20,0xff,0x00,0x07,0x00,0x80,0xfe,0x40, 0x5f,0xfd,0x03,0x00,0x00,0x00,0x75,0xc0,0x7d,0x40,0x5f,0x00,0x00,0xb0,0x3e, 0x40,0xab,0x01,0x00,0xec,0x01,0x80,0x45,0x0e,0x80,0x0e,0x20,0x07,0x40,0x55, 0x35,0x00,0x6a,0x00,0x00,0x28,0x3d,0x00,0x10,0x19,0x00,0xc0,0x94,0x0c,0x00, 0x38,0x00,0x00,0x00,0xd0,0xfd,0xff,0x01,0x87,0x01,0x40,0x7e,0x00,0xb7,0xfd, 0x03,0x00,0x00,0x00,0x35,0xa0,0x1e,0x80,0xea,0x01,0x00,0x6c,0x1b,0xb0,0xd5, 0x01,0x00,0xeb,0x00,0x80,0x12,0x0e,0x80,0x0e,0xd8,0x03,0x50,0x89,0x34,0x00, 0x38,0x00,0x00,0x7c,0x1e,0x00,0x40,0x1e,0x00,0x20,0x00,0x08,0x80,0x1c,0x00, 0x00,0x00,0x70,0xfd,0xfb,0x03,0xef,0x03,0xd0,0x3e,0x00,0x57,0xfd,0x07,0x00, 0x00,0x80,0x3a,0xe8,0x1f,0x80,0x5d,0x03,0x00,0xb8,0x1d,0xd0,0xbe,0x01,0x00, 0x75,0x00,0x40,0x41,0x07,0x40,0x07,0xd0,0x01,0xc8,0x65,0x3a,0x0a,0x3a,0x00, 0x00,0x84,0x07,0x00,0x14,0x0e,0x00,0x08,0x22,0x19,0x00,0x1c,0x00,0x00,0x00, 0xbc,0xfd,0xc1,0x03,0xff,0x07,0x68,0x1d,0x80,0xef,0xf6,0x06,0x00,0x00,0x40, 0x1d,0x7c,0x0d,0x00,0xb7,0x07,0x00,0xd6,0x0e,0xbc,0xd2,0x01,0xc0,0x7a,0x00, 0x40,0x09,0x03,0x40,0x03,0xed,0x00,0x00,0x14,0x1d,0x0d,0x1d,0x00,0x00,0xd0, 0x03,0x00,0x80,0x07,0x00,0x00,0x08,0x18,0x00,0x0c,0x00,0x00,0x00,0xe8,0xfe, 0x81,0x03,0xfe,0x07,0xba,0x1d,0x80,0x5f,0x5b,0x0d,0x00,0x00,0x40,0x1d,0xaa, 0x07,0x80,0xec,0x06,0x00,0x7b,0x0f,0xf0,0xae,0x01,0x80,0x36,0x00,0xa0,0xa2, 0x03,0xa0,0x43,0x3a,0x00,0x02,0xd0,0x0e,0x8a,0x0c,0x00,0x00,0xe5,0x00,0x00, 0xea,0x01,0x00,0x00,0x80,0x1c,0x40,0x0e,0x00,0x00,0x00,0xbe,0xef,0x80,0x07, 0xfe,0x0f,0xd6,0x1b,0x80,0xbf,0xaa,0x0d,0x00,0x00,0x80,0x0e,0xfe,0x07,0x80, 0xb8,0x0e,0x00,0xad,0x07,0x49,0xdb,0x01,0x60,0x3b,0x00,0xd8,0xc0,0x01,0x40, 0xd5,0x0f,0x00,0x00,0x20,0x07,0x0f,0x0e,0x00,0x00,0x70,0x00,0x00,0xe0,0x00, 0x00,0x00,0x20,0x1a,0x00,0x06,0x00,0x00,0x00,0xd6,0xed,0x80,0x03,0xfc,0xcf, 0xfb,0xb9,0x40,0xff,0xdd,0x1a,0x00,0x00,0xa0,0x0e,0x55,0x07,0x40,0xd0,0x0f, 0x80,0xd6,0x06,0x00,0xb5,0x01,0x50,0x35,0x00,0x50,0xca,0x00,0x50,0xff,0x00, 0x00,0x00,0xd0,0x03,0x00,0x0d,0x00,0x00,0x75,0x00,0x80,0x72,0x00,0x00,0x00, 0x00,0x0c,0x00,0x06,0x00,0x00,0x00,0x7b,0xcf,0xc1,0x03,0x7c,0x06,0x7d,0xfc, 0x41,0xbf,0x6a,0x1b,0x00,0x00,0xc0,0x0e,0xff,0x07,0x20,0x78,0x0d,0x00,0xbb, 0x07,0x80,0xad,0x01,0xd0,0x3a,0x00,0x56,0xe1,0x00,0xa8,0x03,0x00,0x00,0x00, 0xc0,0x01,0x80,0x08,0x00,0x00,0x30,0x00,0x40,0x30,0x00,0x00,0x00,0x20,0x0d, 0x20,0x06,0x00,0x00,0x80,0xdf,0xcd,0xe1,0x07,0x3c,0x98,0x3e,0xfc,0x83,0xaa, 0xad,0x35,0x00,0x00,0x50,0x87,0xab,0x06,0x10,0xac,0x0f,0xc0,0xd6,0x03,0x80, 0xd6,0x01,0x50,0x6b,0x00,0x51,0x75,0x00,0xa8,0x01,0x00,0x00,0x00,0xe8,0x00, 0x40,0x15,0x00,0x40,0x35,0x00,0x00,0x35,0x00,0x00,0x00,0x00,0x0e,0x08,0x04, 0x00,0x00,0xc0,0x6a,0x8f,0xff,0x07,0x38,0xd4,0x0d,0xfe,0x81,0xd5,0x56,0x6d, 0x00,0x00,0x50,0x47,0xfd,0x07,0x0c,0xd8,0x0e,0x90,0x6d,0x03,0x00,0x7b,0x03, 0x68,0x55,0x80,0xa4,0x3a,0x00,0x50,0x03,0x00,0x40,0x00,0x68,0x00,0x88,0x24, 0x00,0x00,0x40,0x00,0x40,0x30,0x00,0x00,0x00,0x00,0x07,0x40,0x0c,0x00,0x00, 0x40,0xff,0x9d,0xff,0x0f,0x38,0xad,0x07,0xfe,0x00,0x94,0x7b,0x6b,0x00,0x00, 0xa8,0xc3,0x57,0x0d,0x15,0x76,0x0f,0x48,0xb7,0x07,0x80,0x95,0x03,0xaa,0xb6, 0x69,0xb1,0x1a,0x00,0xaa,0x06,0x00,0x20,0x00,0x74,0x00,0x22,0x09,0x00,0x40, 0xd5,0x00,0x14,0x25,0x00,0x08,0x09,0x40,0x03,0x00,0x10,0x00,0x00,0xa0,0xab, 0x9e,0xff,0x1f,0xb0,0x81,0x07,0x7c,0x00,0xeb,0xaa,0xda,0x00,0x00,0xa8,0x83, 0xfa,0xf7,0x0b,0xac,0x05,0xf3,0x5a,0x15,0x00,0xed,0x82,0x69,0xab,0xd4,0xd4, 0x2a,0x80,0xa8,0x0a,0x00,0x88,0x00,0x65,0x80,0x98,0xa4,0x04,0x80,0x08,0x00, 0x80,0x40,0x80,0x44,0x18,0x80,0x03,0x10,0x01,0x00,0x08,0xe0,0xfd,0xb7,0x7f, 0x3c,0x60,0xf4,0x07,0x00,0x00,0xd5,0xd6,0xad,0x01,0x00,0xa8,0xe3,0x5f,0x5d, 0x07,0x7b,0xef,0x4c,0xef,0x0e,0x80,0xb6,0x76,0xb7,0x5a,0x6b,0x51,0x55,0x55, 0x56,0x25,0x00,0x42,0x80,0x68,0x20,0x4e,0x12,0x11,0x28,0x52,0x05,0x5d,0x14, 0xa0,0x01,0x15,0xc0,0x01,0x00,0x08,0x00,0x07,0xa0,0xae,0x3a,0x1f,0x78,0xe8, 0xff,0x07,0x00,0x00,0x6a,0xbb,0xb6,0x01,0x00,0xd0,0xa1,0xea,0xef,0x83,0xd6, 0xaa,0xa7,0xb5,0x07,0x80,0x55,0xdb,0xd3,0x6a,0x75,0xa8,0xaa,0xaa,0x4b,0xaa, 0xaa,0x3c,0x40,0x55,0x89,0x07,0xa9,0x44,0xbd,0x04,0x50,0x0f,0x42,0xe5,0x20, 0x30,0xd0,0x00,0x44,0x00,0x80,0x03,0xf0,0xf7,0x6f,0x0f,0x78,0xe4,0xff,0x03, 0x00,0x00,0x94,0x55,0x55,0x03,0x00,0xd4,0xe1,0x7f,0xf5,0x81,0x7f,0xff,0x61, 0xbb,0x03,0x00,0xda,0xea,0x58,0xab,0x3a,0x52,0x55,0xd5,0xa9,0xaa,0x92,0x1e, 0x80,0x24,0xe5,0x83,0x8a,0x28,0x0e,0xa8,0x8a,0x43,0x11,0x70,0x00,0x21,0x60, 0x00,0x10,0x20,0xe0,0x01,0xa8,0xba,0x7a,0x0f,0xf8,0xf3,0xff,0x01,0x00,0x00, 0xdd,0x6d,0xdb,0x06,0x00,0xd8,0xa1,0xaa,0xff,0x40,0xd5,0xea,0xc0,0xd6,0x01, 0x00,0x6f,0x7d,0x68,0xb5,0x1d,0x51,0x55,0x94,0xa8,0x52,0x55,0x0f,0x50,0x92, 0xd4,0x41,0x44,0x84,0x87,0x42,0xe0,0x21,0x44,0x3d,0x40,0x54,0x32,0x00,0x40, 0x02,0x72,0x00,0xf8,0xdf,0x5f,0x07,0xf0,0xfa,0x7f,0x00,0x00,0x00,0xf6,0xb6, 0x6d,0x0d,0x00,0xd4,0xc0,0xff,0x3a,0x80,0xbb,0x3f,0xa0,0xed,0x00,0x00,0xb5, 0x3b,0xa0,0xad,0x4e,0xd4,0xaa,0xeb,0xa0,0x4a,0xaa,0x07,0xa0,0xaa,0x72,0x00, 0x29,0xd2,0x03,0x91,0xea,0x10,0x11,0x0e,0x00,0x00,0x1c,0x00,0x00,0x00,0x3c, 0x00,0xa8,0xea,0xea,0x1e,0xf0,0xf5,0x1f,0x00,0x00,0x00,0x50,0xab,0xaa,0x0d, 0x00,0xea,0x80,0xaa,0x1f,0xc0,0xd6,0x1e,0x60,0x7b,0x00,0x00,0xd5,0x1e,0xb0, 0xaa,0x07,0x51,0xab,0x54,0xa0,0xaa,0xd2,0x01,0x20,0x49,0x3d,0x00,0x45,0xe9, 0x00,0x0a,0x78,0x80,0x84,0x07,0xa0,0x92,0x0e,0x00,0x00,0x11,0x0e,0x00,0xf4, 0x7f,0x5f,0x3d,0x7e,0x7b,0x00,0x00,0x00,0x00,0xc0,0xda,0xb6,0x1a,0x00,0xea, 0x80,0xff,0x07,0x80,0xfd,0x07,0xc0,0x3d,0x00,0x00,0xb6,0x07,0x40,0xed,0x57, 0x78,0x55,0x6b,0x80,0x2a,0xf5,0x00,0x80,0x2a,0x1e,0x00,0xa8,0x78,0x00,0xa0, 0x1e,0x00,0xe1,0x03,0x00,0x80,0x07,0x00,0x20,0xc0,0x07,0x00,0xbc,0xaa,0xf5, 0x8c,0xbf,0x3f,0x00,0x00,0x00,0x00,0x60,0x6d,0xd5,0x36,0x00,0x75,0x00,0xea, 0x01,0x00,0xeb,0x01,0x80,0x1e,0x00,0x00,0xda,0x03,0xc0,0xf6,0x00,0x9e,0xaa, 0x94,0x80,0x52,0x3d,0x00,0x80,0xa4,0x0f,0x00,0x08,0x1f,0x00,0x94,0x0f,0x00, 0xfa,0x00,0x00,0xf2,0x01,0x00,0x80,0xe0,0x01,0x00,0x68,0xff,0xbf,0xde,0xff, 0x0e,0x00,0x00,0x00,0x00,0x80,0xab,0xad,0x2a,0x00,0x6a,0x00,0x00,0x00,0x00, 0x3e,0x00,0x80,0x0f,0x00,0x00,0xf8,0x00,0x00,0x3f,0xa8,0x0e,0xff,0xdd,0x00, 0xaa,0x0f,0x00,0x00,0xd3,0x03,0x00,0xe0,0x03,0x00,0xf8,0x01,0x00,0x3e,0x00, 0x00,0x7e,0x00,0x00,0x00,0x7f,0x00,0x00,0xdc,0x55,0xd5,0xfe,0xdf,0x07,0x00, 0x00,0x00,0x00,0x00,0xb5,0x6a,0x6d,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x07,0x00,0x66,0x00,0xf0,0x01, 0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0xfe,0x7f,0xfe,0xff,0x01,0x00,0x00,0x00, 0x00,0x00,0xdb,0xb6,0xb5,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xd1,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x5c,0x57,0xd5,0xfe,0x77,0x00,0x00,0x00,0x00,0x00,0x00, 0x54,0xab,0xca,0x81,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf4,0xfb,0x7f,0xff,0x3e,0x00,0x0c,0x03,0x00,0x00,0x00,0x6b,0x55, 0x35,0x03,0x35,0x00,0x00,0x00,0x00,0x18,0x1c,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x10,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00, 0x00,0xc0,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x58,0xad,0xaa,0xbb,0x0f,0x00,0x08,0xe1,0xef,0x1f,0x80,0xa7,0xeb,0xea,0xf2, 0x7f,0x10,0xfe,0xf8,0x00,0x38,0x1c,0xfe,0x70,0xe0,0xc0,0x00,0x03,0x7f,0x80, 0x7a,0x90,0x7f,0xfe,0xf8,0xc0,0x0f,0x03,0x0e,0x7f,0x00,0xc6,0x30,0x04,0xc0, 0x00,0x82,0xc0,0x80,0x83,0x83,0x3f,0x86,0x00,0x00,0x00,0x00,0x00,0xec,0xf7, 0xff,0xed,0x03,0x00,0x98,0x60,0x04,0x07,0x80,0x54,0x57,0x3a,0x87,0x70,0x10, 0x02,0x28,0x01,0x38,0x06,0x02,0xac,0x58,0xc1,0xc1,0x0d,0x45,0x50,0xda,0x10, 0x1c,0x8a,0x18,0x63,0x80,0x83,0x1b,0x45,0x00,0x83,0x31,0x04,0x40,0x00,0xc2, 0xe0,0xe0,0x46,0x8c,0x24,0x86,0x00,0x00,0x00,0x00,0x00,0x7c,0xbd,0xaa,0xfe, 0x00,0x00,0xd0,0x20,0x00,0x03,0x80,0x44,0x55,0x0d,0x8a,0x71,0x10,0x02,0x08, 0x01,0x48,0x1a,0x02,0x04,0x08,0x40,0x21,0x00,0x01,0x04,0x43,0x11,0x08,0x02, 0x08,0x23,0x80,0xc2,0x00,0x01,0x00,0x01,0x51,0x04,0x40,0x07,0xc6,0xa1,0x30, 0x40,0x80,0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0xa8,0xd7,0xff,0x3f,0x00,0x00, 0x60,0xe0,0x03,0x03,0xc0,0x8c,0xca,0xcc,0x96,0xdc,0x1f,0x3e,0xf8,0x01,0x58, 0x0b,0x3e,0x78,0xf0,0x20,0x21,0x00,0x1f,0xd2,0x43,0x13,0x0c,0x3e,0xf8,0xe1, 0x83,0x44,0x00,0x1f,0x00,0x01,0x91,0x04,0x40,0x06,0xa4,0x20,0x11,0xc0,0x83, 0x0f,0x92,0x00,0x00,0x00,0x00,0x00,0xf0,0x7a,0x55,0x0f,0x00,0x00,0x20,0x20, 0x01,0x03,0x40,0x0f,0x5b,0x4c,0xb6,0x58,0x00,0x2a,0xc8,0x40,0xd8,0x19,0x2a, 0x80,0x01,0xa3,0x22,0x0e,0x93,0xe0,0x43,0x14,0x0c,0x26,0x88,0x20,0xc0,0x44, 0x00,0x13,0x00,0x81,0x11,0x05,0x40,0x00,0xaa,0x30,0x11,0x00,0x8d,0x05,0xa2, 0x00,0x00,0x00,0x00,0x00,0xa0,0xaf,0xff,0x01,0x00,0x00,0x20,0x20,0x00,0x03, 0x60,0x10,0xe9,0x4a,0xd3,0x59,0x10,0x02,0x88,0x50,0x99,0x18,0x02,0x00,0x01, 0xb2,0x22,0x08,0x01,0x7a,0x42,0x1c,0x0c,0x02,0x88,0x61,0x40,0xce,0x10,0x01, 0x00,0x83,0x10,0x07,0x40,0x00,0x98,0x90,0x33,0x04,0x88,0x00,0xe2,0x00,0x00, 0x00,0x00,0x00,0x80,0xfa,0x3e,0x00,0x00,0x00,0x20,0xe0,0x0f,0x03,0x20,0x10, 0x52,0xba,0xa1,0x58,0x10,0xfe,0x08,0xa9,0x9a,0x18,0xfe,0xdc,0xb8,0x11,0xc4, 0x0d,0x77,0x3c,0x42,0x08,0x0c,0xfe,0x08,0x21,0x20,0x88,0x1f,0x7f,0x00,0xfc, 0x10,0x06,0xc0,0x1f,0x92,0x09,0xe2,0xc7,0x8d,0x3f,0xc2,0x00,0x00,0x00,0x00, 0x00,0x00,0xfe,0x03,0x00,0x00,0x00,0x40,0x00,0x04,0x00,0x00,0x00,0xaa,0x44, 0xa8,0x1c,0x10,0x40,0x00,0x45,0x09,0x00,0x40,0x50,0xa0,0x00,0x80,0x00,0x49, 0x0e,0x02,0x10,0x00,0x90,0x10,0x00,0x00,0x00,0x04,0x48,0x00,0x00,0x00,0x00, 0x40,0x08,0x00,0x00,0x00,0x01,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x34,0xaa,0x1c, 0x00,0x00,0x00,0x30,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0xab,0x55,0x0d,0x00,0x00, 0x00,0x96,0xb4,0x0a,0x00,0x00,0x00,0x00,0x00,0x20,0xe5,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0xaa,0xaa,0x0e,0x00,0x00,0x80,0xd2, 0x8a,0x14,0x00,0x00,0x00,0x00,0x00,0x80,0x78,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x40,0x55,0x55,0x0d,0x00,0x00,0x80,0x2a,0x6a,0x2a, 0x00,0x00,0x00,0x00,0x00,0x54,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x28,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xb6,0x5a,0x0d,0x00,0x00,0x00,0x55,0x25,0x65,0x00,0x00, 0x00,0x00,0x00,0x02,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd6,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x54,0xab,0x0e,0x00,0x00,0x00,0x49,0x95,0x52,0x00,0x00,0x00,0x00, 0x80,0xe8,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd8,0x6a,0x0d,0x00,0x00,0x00,0x2a,0xa9,0xaa,0x00,0x00,0x00,0x00,0x50,0xfa, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0xaa, 0x1a,0x00,0x00,0x00,0xaa,0xaa,0x54,0x01,0x00,0x00,0x00,0x04,0x3d,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x55,0x15,0x00, 0x00,0x00,0x54,0xa5,0x92,0x02,0x00,0x00,0x40,0xa2,0x0f,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0xad,0x3a,0x00,0x00,0x00, 0xa4,0x54,0x4a,0x0a,0x00,0x00,0x84,0xf4,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x6a,0x6b,0x00,0x00,0x00,0x50,0x95, 0xaa,0x12,0x00,0x90,0x28,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x6a,0x00,0x00,0x00,0xa0,0xaa,0x52,0x4a, 0xa5,0x44,0xc4,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x56,0xd5,0x00,0x00,0x00,0x80,0x52,0x4a,0xa9,0x94,0x2a, 0xfd,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x09,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x58,0xd5,0x00,0x00,0x00,0x00,0x4c,0xa9,0x4a,0x52,0xa2,0x1e,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd0,0xaa,0x01,0x00,0x00,0x00,0xe0,0x4a,0xa4,0x4a,0xdd,0x12,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x40,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0xb5, 0x01,0x00,0x00,0x00,0x00,0xfc,0x15,0xf5,0x3f,0x19,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa0,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x80,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0xab,0x03,0x00, 0x00,0x00,0x00,0x00,0xf8,0x1f,0xc0,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x40,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x55,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x60,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x0d, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x55,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa8,0xaa,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa8,0x56,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa8,0x5a,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0, 0xaa,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x24,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x55,0x0d, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x92,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x6a,0x0d,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x6c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x55,0x0d,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xab,0x1a,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x50,0x55,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa0,0xaa,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x50,0xb5,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x56, 0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0xaa,0x3a,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x55,0x35,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xd5,0x3a,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0x5a,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0xab,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x40,0x55,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, 0xaa,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x64,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x35, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xda,0x3a,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x35,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x3a,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xaa,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x54,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x68,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0, 0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x0f,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; wanderlust-wanderlust-769699d/etc/icons/wl-beta-xmas-logo.xpm000066400000000000000000002532201406661363500242640ustar00rootroot00000000000000/* XPM */ static char *wl-beta-xmas-logo[] = { /* width height num_colors chars_per_pixel */ " 491 176 28 1", /* colors */ ". c None", "a c #000000", "b c #030404", "c c #0c1112", "d c #1d2628", "e c #295eb6", "f c #3162bb", "g c #3864bc", "h c #3b4c6e", "i c #3f65bb", "j c #4d6abf", "k c #596cbf", "l c #6771c4", "m c #6c73c4", "n c #6e6cad", "o c #7574c5", "p c #837aca", "q c #917dca", "r c #a582c3", "s c #b28bd4", "t c #c090d3", "u c #c994d2", "v c #d09ad9", "w c #e02828", "x c #e8b3d9", "y c #f4a460", "z c #ff0000", "A c #ffffff", /* pixels */ "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................AaAa...............................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................aAaa...............................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................AaAa...............................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................aaaa...............................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "..................................................................................................................................................................................................................................ssssssssss...............................................................................................................................................................................................................................................................", ".......................................................................iii................................................................................................................................................sssssssssssssssssssssssss........................................................................................................................................................................................................................................................", "......................................................................iiiib..........................................................................................................................................sssssssssssssssssssssssssstttttsss....................................................................................................................................................................................................................................................", ".....................................................................iiiiicc......................................................................................................................................sssssssssssssssssssssssssstttssssttttttst................................................................................................................................................................................................................................................", "....................................................................giiiiidb..................................................................................................................................qqssssrssssssssssssssssststsssssstttsttsttutttr..............................................................................................................................................................................................................................................", "...................................................................iiiiiiidb................................................................................................................................qssssssssssrsrsssssssssssssssssssstAAAttttttttttttur...........................................................................................................................................................................................................................................", ".................................................................iiigiiiijhb.............................................................................................................................qsssssqsssssssssssssssssssssssstsssssAAwwAststttttuututuq.........................................................................................................................................................................................................................................", "................................................................gggiiiiiiieb...........................................................................................................................qqsqqqsssssssssssssssssssssssssssssssAAAwwwwtttttttuttutuuutr.......................................................................................................................................................................................................................................", "...............................................................iiigigiiiiieb........................................................................................................................qqqqqqssqqsqssssssssssrsssssssssssssssssAwwwwwwatsttttttttttuuutrn.....................................................................................................................................................................................................................................", "..............................................................igggiiiiiiijhb......................................................................................................................qqqqqsqsqqsssssrssrsssssssssssssssAAssssssAwwwwwwatttttttttuuutuuuuvn....................................................................................................................................................................................................................................", "............................................................ggiiiigigiiiiidb...............................................................................................................Aa..AaqqqqqqqqqsqsqssssssssssssssrsssssAAAwAAAsssssawwwwattttttttttttutuuuutrh..................................................................................................................................................................................................................................", "...........................................................gggigggiiiiiiijdb..............................................................................................................AAaAaAAaqqqqqsqsqsqssqsssssssssssssssssAAwwwwwwAsstsstawwatsttttuuuuuuuuuutvvuuh.................................................................................................................................................................................................................................", "..........................................................ggggiiiigiiiiiiidb..............................................................................................................aaAaAaaaqqqqqqqqqssqsqsssssssssssssssssAwwwwwwwwssssssAwwattttttttttttutuuuuvuuvn................................................................................................................................................................................................................................", "........................................................ggggigggggiiiiiiijdb...............................................................................................................AaAaAaqqqqqqsqssqqssssssrssAAAAAAssssssAwwwwwwwastsstsAwwtttttttttutuuuuuuuuuvuvrh..............................................................................................................................................................................................................................", ".......................................................gfgggggiiiiggiiiiiibb...............................................lll...........................................................qqaAaAaaqqqqqqqqqssssssssssAAAwwwwwAAsssssAwwwwwwwAttsttAwwattttttttuttututuuvuuuvurd.............................................................................................................................................................................................................................", ".....................................................fgggggiigggggiiiiiiijbb.............................................lllllmmi.......................................................qqAAaAaAAaqqqqqsqqqqqqsssssAAwwwwwwwwwAstsssAwwwwwwwAssssAwwasttttttutuuuuuuuuuuvvuvvrd............................................................................................................................................................................................................................", "...................................................ggfggggggiggiiiigiiiiiebb...........................................klllllllmlh....................................................qqqqaAaaaAaaqqqqqqqqsssqqssssAwwwwwwwwwwwAsssssAwwwwwwwAsttAwwatttttutttttutuuuuuuuvuvvvrc............................................................................................................................................AaAa...........................................................................", "..................................................gffgfggggggiigggiigiiiidb...........................................lllllmmlmlmmd..................................................qqqqqqaaqqaaqqqqqqsssqqqsrsssAAwwwaaaaawwwwAAsssAwwwwwwwwtsssAwwttttttttuttuuuuuuvuuuvuuvvnc...........................................................................................................................................aAaa...........................................................................", "................................................ffggfgfgggggiggiigiigiiiidb..........................................llnllllllmlmmeb...............................................qqqqqqqqqqqqqqqqqqqAAAqssssqqssAwwwaasrsrsawwwwssssAwwwwwwwaAttAwwatttttttuutttutuuuuuuvvuvvvh.........................................................................................................................................Aa.Aa.Aa.........................................................................", "..............................................ffgggfggggggggggiggiiiiiiiibb.........................................klllllllmllmlmkb..............................................qqqqqqqqqqqqqqqqqAAAAwwAAqqsssssAwwwaqnnnnnnAwwwasssAwwaaawwwwAsAwwatttttuutttuuuuutvvvvuuvuvvvd........................................................................................................................................aAAaAAaa.........................................................................", "............................................fffgffggggfgfggggggiggiigiiiebb........................................lkklklllllllmlmlbc............................................qqpqqqqqqqqqqqqqAAAwwwwwwwsqssnndAwwaabbc.....AwwacchdAwassuawwwAAwwwttttttuuutuuuuuuuAaAavvvvvvrc.......................................................................................................................................AaaAaaAa.........................................................................", "..........................................efffffffggffggggggigigiigiiiiidb........................................kkllllllllmmmlmmmbb..........................................pppqqqqqqqqqqqqAAAAwwwwwwwwwadbbbb.Awwa..........Awa....AwwhhnAwwwwwwwwattttttttuttuuuuuaAaauvuvvvvhc......................................................................................................................................aa.Aa.aa.........................................................................", ".................................AaAa...fffefffffffggggggggggggggigigiiebb.......................................klkllllllllllmllmlbb.........................................pqqqqqqqqqqqqqqqAwwwwwwwwwwwaa.....AAwwa..........Aww....Awwa...AwwwwwwwwtttttuuttuutuuuuAaAauvuvvvvvd................................................Aa..Aa..................................................................................AaAa............................................................AaAa...........", ".................................aAaaeffeffffffggfgfffggggggigiiigiiiiidbc.......................................lklkklllllllllmmmebb........................................ppqppqqqqqqqqqqqqAwwwwwwwwwaaa......Awwwa..........Awwa....Aww....Awwwwwwwatttttttuuuuutvvaaaavvvuvvvvrb..............................................AAaAaAAa.................................................................................aaaa............................................................aAaa...........", "...............................Aa.AaeAafeefeffffefgggffgggggggggiigigiebb.......................................klkllknkllllmlllllhb.......................................ppqpqqqqqqAAAAAqqqqAwwwwaawwwa.........Awaa..........Awwa....Awwa...Awwwwwwwwttttuuutuuuuuutuvvuuvvvvvvvvhc.............................................aaAaAaaa.................................................................................................................................................AaAa...........", "...................eee........eaAAaAAaaefefffffffgfffgggggggiggiggiiiidbc......................................knklkkllllllmlmmmmmdb......................................ppqppqpAAAAAwwwwqqqndbaaaaAwwwa..........Aw...........Awwa....Awwa....Awwwwwwaattttttuttuuuuuuuuvvvvvvvvvvtb..............................................AaAaAa..................................................................................................................................................aaaa...........", "...................eeeeeeeeeeeeAaaAaaAafffffffgfgfggggfggggggggiiigiiebb......................................llkkllllllllllllllmkbb.....................................ppppppAAAwwwwwwwwahdbbc.....Awaa..........Awa..........AAww....Awwa....Awwwwwwwtttututuutuuuuuuuuuuvvvvvvvvvdc.............................................aAaAaa.................................................................................................................................................................", "....................eeeeeeeeeeeaaeAafaaefefffffffggfgfggggggiiggggiiicbc.....................................kkkkkkkklllllllllmmlhbc....................................pqpppqAAwwwwwwwwwwabb........AwwA..........Awa..........Awwwa...Awwa......awwwwwasttttutuutuuvvuvvvvuuvvvvvvvrb............................................AAaAaAAa................................................................................................................................................................", "....................eeeeeeeeeeeeeAaAaffefeefffgfffffggggggggggiiiiggdbb......................................kklknllkkklllllmllmmcb....................................ppppqpqAwwwwaaawwwww..........Awww..........Aww..........Awwwa...AAwwAA.....Awwwaa..tuttutuutuuvtuuuvvuuvvvvvvvcc...........................................aAaaaAaa................................................................................................................................................................", "....................eeeeeeeeeeeeeaaaaeefeffeffffffggfffggggggiggggihbb......................................kkkkllkklllllllmllmlhbb...................................pppqpppqAwwwaanhbawwwa..........Awwa.........Awwa.........Awwwa...AwwwwwAA....Awwa....tuutuuuutuuutvvuvvvvvvvvvvhb............................................aa..aa.................................................................................................................................................................", "....................eeeeeeeeeeeeeeeeeeeffffefffegffggggggggggggiiiebb......................................kkkkkkllkllklllllllmmcb...................................ppppppppAAwwaahbbcAwwwa..........Awww..........Aww.........Awwwa...Awwwwwww......aa.....ttuttuuuuuvuuvuvvuvvvvvvvrb...................................................................................................................................................................................................................", ".....................eeeeeeeeeeeeeeeeefeefffffgfffgfgffggggiggiggebb......................................jkkkkkkknlklllllllmllhbb............................AAAAAAAApppppppAwwwacbb..Awwwa..........Awwwa.........Awwa........Awwwa...Awwwwwwaa.............utuuuuuuvuuvuvvvvvvvvvvvvcc..................................................................................................................................................................................................................", ".....................eeeeeeeeeeeeeeffeffeffffffffgggggfgigggiggidbb.......................................jkkkklklklklnkllllllebb..........................AAAAwwwwwwwAppppppAwwwab......aaa...........Awwa.........Awww.......AAwwwa...Awwwwwwa...............uutuuuuuvuvuuuvvvvvvvvvvhb..................................................................................................................................................................................................................", ".....................eeeeeeeeeeeeeeeeeeefefefffggfgfffggggggggedbb.......................................kkkkklkkklkllllllllmkcbc........................AAAwwwwwwwwwwwppppppnAwwa.....................Awww..........AwwaAAAA..Awwwaa.....aaaaaa................uutuuAAAAtvvvvvvvvvvvvvnb..................................................................................................................................................................................................................", "......................eeeeeeeeeeefeeeffefefeffffffggggfgggggiecbc.......................................kkkkkkkkkklkklllllllldbc........................AAwwwwwwwwwwwwwappppncAwwaA....................Awwwa..........AwwwwwwAAAwwwa.............................uutAAzyyauvtuuvvvvvvvvrb..................................................................................................................................................................................................................", "......................eeeeeeeeeeeeeffeefefffffffffgfgfggggggdbbc........................................jkjkkkklnkklllllllllhbb....................AA...AwwwwwwaaaaawwwwpqpdbbAAwwwAAAAAAA..............Awww...........Awwwwwwwwwwaa.............................uAAAzzzAavuvvvvvvvvvvvvbc........AaAa.....................................................AA.........................................................AA...................................................................................", ".......................eeeeeeeeeeeeeeeeffffffffgffgggAaggAacbb.........................................kjkkkknkllkkkkklklllebb................AAAAAAw...AwwwwwaappppAwwwancbb.AwwwwwwwwwwwAAA...........Awwwa...........Awwwwwwwwaa...............................AAAzzzAavvvvuvvvvvvvvvdb........aAaa.....................................................Aya........................................................Aya..............................................AAA.AA..............................", ".......................eeeeeeeeeeeeeeffeeefeffffgfffAAaAaAAac.........................................jjkkkkkkkkklllllklllebb................AAwwwwwwa....awwwapppppAAwwabbc...AwwwwwwwwwwwwwA..........Awwww.AA..........awwwwwaa................................AAAzzzAauuvvvvvvvvvvvvhb......Aa.Aa.Aa...................................................Aya.......................................................AAya..........................................AAA.AyyaAya.AA..........................", "........................eeeeeeeeeeefeefffeffffffffggaaAaAaaa..........................................kkkkkklkkkknkklllllebb.............AAAAAwwwwwwww....AwwwapppppAwwwab......Awwwwwwwawwwww..........AwwwwaAwAA.........Awaaaa..................................aaAAAzavuuvvvvvvvvvvvhb......aAAaAAaa..........................................AA.......AyyaAAA................................................AA.Ayya.....................................AA...Ayya.ayyayyaAya.........................", ".........................eeeeeeeeeeeeeeeefffffffggfffAaAaAa..........................................jjjkjkkkklkkkllklllebb............AAAwwwwwwwwwwwwa....AwwwpppppAwwwa.........aaaaaaaAwwwwa.........Awwwwwwwww...........a.....................................AAzzzAAavvvvvvvvvvvvvnb......AaaAaaAa..........................................Aya......Ayaayyya.....................................AA...AA...AyaAyya.....................................Aya..Ayaa.AyyyaaaAya.........................", "..........................eeeeeeeeeeeffffffeffffgfgecaAaAaa.........................................kkkkkkkkkklklkklkklebb.............Awwwwwwwwwwwwwwa....pAwwappAAAwwwa.................Awwwa........AAwwwwwwwwwa................................................AzzzzAAavuuvvvvvvvvvvnb......aa.Aa.aa..........................................Ayya......ayyyyaa.....................................Aya.AAya...ayayaa.....................................AyyaAAya..AyyaaAAyaa.........................", "...........................eeeeeeeeffeeeeeffffffffhbAAaAaAAa........................................jjjkkjkkkkklkklkllhbb......AAAAA...Awwwwwwaaaaaawww...ppAwwaAAAwwwwwa..................Awwa......AAAwwwwwwwwwaa...............................................AAzzzzAAaAAvvvvvvvvvusnb........AaAa.............................................aya......Ayyyaa.......ss.............................AyaAAyya...Ayyaa.......................................ayaAyaa..AyaaAyyaa..........................", ".............................eeeeeeeeefffeffffffedbbaAaaaAaa.......................................kkkkkkkkkkkkAaAakldbb.....AAAwwww...Awwwwwaa....Awwwa.opoAwwwwwwwwwwwa..................AAwa......Awwwwwwwwwwaa...............................................AAzzzzzzyyAAavvvvvvvupoodc.......aaaa.............................................Aya.....AAyyaa.......sssrb...........................AyaAyaaa..AAyaa.........................................ayaya...Ayyayaaa...........................", "...............................eeeeeefeeeffffffecbc..aa..aa........................................jjjjkkkkkkkkaAaajdbb......Awwwwwwa...Awwwaa...AAA.aaaoppppAwwwwwwwwwaa........AAA.......Awwa......Awwwwwwwaaaa...............................................AAzzzzzzzzzAAavvvvvvupooohb........................................................Aya.....Ayyaa.......sssssbc..........................Ayyyya...AAyya..........................................AyyyaA..Ayyyaa.............................", "..................................ddddcceeefffebbc................................................kjkkjjkkkkkAakAaeAac.......Awwwwwwa....Awww...AAww...poopppAwwwwwwwwww.........AwwA.....AAwww.......Awwwwaaa..................................................AzzzzzzzzzzAAavvvvvvqoooohb.........................................................aya.AAAAyaa.......ssssssbb...........................aayaa..AAyyaa..........................................Ayyyyya.Ayaya..............................", ".......................................eeffegebb.................................................jjjkjkkkkkkkaAAaAAaaAAAA......awwwaa.....AwwaAAAwwwa..opppppAwwwwwwwwwwa.........AwwA...AAwwwaa........aaaa........................................AAAAA.......AzzzzzzzzyyyyaAAAAAAAooooob.........................................................AyyaAyyyaa........ssssssbb.............................ayaAAAyyya............................................ayyyaaAAyyaa..............................", "......................................egfffeecbc.................................................kkjkjjkkkjnkAaaAaaAawwww.......Awwa......AwwwwAwwwww.oooopppnAwwwwaaawwwA........AwwwAAAAwwwwa.....................................................Ayyyya.....AAzzzzzzzzaaaayyyyyyyyaAooobb........................................................Aayyyayaa........sssssrsbb..............................ayyyyaaaa.............................................aaayyyyaaa...............................", "......................................feeefebb..................................................jjjjjkkjkjkkkaacAaAaawwwwa......Awwa......AwwwwwwwwwwappppponcAwwwaa..AwwwA.......Awwwwwwwwwwwa.....................................................Ayyyya.....AAAzzzzzAAavvAyyyyyyyyyyaoobb........................................................Ayyyyaaa........ssssssssbb..............................Ayyyya..................................................Ayyyya.................................", ".....................................effffecbc..................................................jjkjjkkkkkkkkhbAaAawwwwwaa......Awwa......AwwwwwwwwwaaoooppncbAAwwa...AwwwwA......Awwwwwwwwwwaa.....................................................Ayyyya.....AAAAAAAAAAauuAyyyyyyyyaayakbb........................................................Ayyyya..........ssssssssbb..............................Ayyyya..................................................Ayyyya.................................", "....................................eeeefecbc..................................................jjjkjjkjjkkkecbbaaaaAwwwwa.......Awwa......AwwwwwwwwwapopppncbcAwwwa.....awwwAA....Awwwwwwawwaa......................................................Ayyyya.....AzzzAAAAzzavvAyyyyyyyyaoayaAAA...................................AA..................Ayyyya.........ssAAAAsssbb...........AA.................Ayyyya............AAA..................AAAAAAAAAAAAAAAAAAyyzza.................................", "...................................feffeecbc...................................................jjjkkjkkkjkjbbc.......awww......AAwwa.......AwwwwwwwwapoAAAcbc..Awwa.....Awwwww....Awwwwaaa.aa....AaAa...............................................Ayyyya.....AzzzzzzzzzatuAyyyyyaaaaooayyyya..................................Aya................AAyyyyaAAAAAAAAAAAAyyyarnAAAA......AAAAyaA..........AAAAAAyyyyaAAAA......AAAyya..AAAA......AAAAAAyyyyyyyyyyyyyyyyyyyzza.................................", "...................................efeefdbc...................................................kjjjjjkjjkkkhbc........Awwwa.....Awwwa.......AwwwwaawwaooAwwbc...Awwa......Awwwwa.....aaaa.........aAaa...............................................Ayyyya......azzzzzzzzavvAyyyyyaoooooAyyyya..................................Ayya...........AAAAAyyyyyyyyyyyyyyyyyyyyyaAAAyyya....AAyyyyyyaAAAAAAAAAAyyyyyyyyyyyyyyaAAAAAAyyyaaAAAyyyaAAAAAAyyyyyyyaaaaaaaaaaaaaaayyyya...x.............................", "..................................eeeeedbb....................................................jjjjjkjkjkkkbb..........Awwa.....Awwwa........AwwaaooaapoAwwa....AwwwAA.....Awwwa................Aa.Aa.Aa.............................................Ayyyya......AyzzzzzzzauuAyyyyyaoooooAyyyyyaA............................AAAAAyyya.....AAAAAAyyyyayyyyaaaaaaaaaaaayyyyyyyyyyyyaAAAAyayyyyyyyayyyayyyyaaaaayyyyaaaaayyyyyyyyyyyyyyyyyyyyyyyyyaaaaayyya............Ayyyyaxxxxxv...........................", ".................................eeeefhbb....................................................jkjjjkjkjkjkhbb...........AwwAA...Awwwa........Awwa.ooooooAwww...AAwwwww.......aaa................aAAaAAaa.............................................AyyyyyaAAAAAAyyzzzzzyaAAAyyyyaaoooooAyyyyayya...AAAAA.......AAAAA....AAAAyyyyyyyyaAAAAAyyyyyyaaaayyyya.......ssssaayyaaaayyyyyyayyyyyyyyyyyyaaaaaaaaaAAAAyyyya....aaaaaaayyyyaaaayyyyaaaaaaa...AyyyyaAAAAAAAAAAAAyyyyaxxxxxxbc.........................", "................................eeefeebb.....................................................jjjjjjjkjkjkcb.............Awww....Awwa........AwwwooooophAAwwa..Awwwwwwa.........................AaaAaaAa.............................................AyyyyyyyyyyyyyyyyyyyyyyyyyyyyaoooooAAyyyyyyyyaAAAyyyyaAAAAAAAyyyyaAAAAyyyaaaaaayyyyyyyyyyyyyyyyyyyyyya......sssssssaaaqbbaaaaaaaaaaaaaayyyyyyyyyyyyyyyyyyyyyya...........aaaaa...aaaaa.........Ayyyyyyyyyyyyyyyyyyyyyaxxxxxnbb.........................", "................................eeeeebb............................................AAAA.....jjjjjjjjkkjkhbb..............Awwa..AAwwa.........AwwaoooohAAwwwa..Awwwwwwa.........................aa.Aa.aa.............................................AyyyyyyyyyyyyyyyyyyyyyyyyyyyyaoooooAyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyaaaa....Ayyyyyyyyyyyyyyyyyyyyyya......sssssssrsshbc..............ayyyyyyyyyyyyyyyyyyyyaa..................................ayyyyyyyyyyyyyyyyyyyyaxxxxxcb..........................", "...............................eeeeecbc.........................................AAAAwwwA....jjkjjjjjjkjjcb...............AwwaA.Awwwa.........AwwaooAAAAwwwww...Awwwaaa...........................AaAa................................................ayyyyyyyyyyyyyyyyyyyyyyyyyyyaooooAAyyyyyyyyyaaaayyyyaaaaaaaayyyyaaaaaa........ayyyyyyyyyyyyyyyyyyyyaa.....ssssssssssscb................ayyyyyyyyyyyyyyyyyyya...................................Ayyyyyyyyyyyyyyyyyyyaaxxxxnbb..........................", "..............................eeeeedbc..........................................AwwwwwwwA..jjjjjjjkjkjkebb................AwwwAAwwww.........AwwaAAAwwwwwwwwa....aaa.............................aaaa.................................................ayyyyyyyyyyyyyyyyyyyyyyyyyyaooAAAyyyyyyyyyya...aaaya.......aaaaa.............Ayyyyyyyyyyyyyyyyyyyaa......sssrssssrshbb................Ayyyyyyyyyyyyyyyyyyaa...................................Ayyyyyyyyyyyyyyyyyyyaxxxxubb...........................", "..............................eeeedbb...........................................AwwwwwwwwAAjjjjjjjjkjjkdb.................Awwwwwwwwaa.......AAwwwwwwwwwwwwwaa..........................................................................................aayyyyaaaayyyyazzaaaaayyyyaooAyyyyyyyaaaaaa......aa.........................Ayyyyyyyyyyyyyyyyyaaa......ssssssssssqcb.................Ayyyyyyyyyyyyyyyyyaa....................................Ayyyyyyyyyyyyyyyyyyaaxxxucbc...........................", ".............................eeeeebb...................................AAA.......Awwwwwwwwwjjjkjjjkjkkebb..................Awwwwwwww........Awwwwwwwwwwwwwaa............................................................................................Ayyyya..AyyyyazzavumAyyyyaoAAyyyyyyaa......................................Ayyyyyyyyyyyyyyyyya.......sssssssssssdbc................AAyyyyyyyyyyyyyyyyya.....................................Ayyyyyyyyyyyyyyyyyyaxxxxhbc............................", "............................eeeeebb...............................AAAAAAwwAA.......awwwwwwwajjjjjjjjjkhbc..................Awwwwwwwaa.......Awwwwwwwwwwaaaa.............................................................................................Ayyyya..AyyyyazzzapoAyyyyaAAyyyyyyya.......................................Ayyyyyyyyyyayyyyyya.......ssssssssssnbb................AAyyyyaaaaaaaaayyyyya..........Aa..Aa....................AAyyyyyyyyyaaayyyyyyaxxxhbb.............................", "...........................eeeeecbc..............................AAwwwwwwwww.......AAwwwwwwwjjjjjjkjjibb....................Awwwwwwa.......mmAwwwwwwwaaa........................................................................................AAAAAAAAAyyyyaAAAyyyyazzzzaAAyyyyaAyyyyyyyaa......................................AAyyyyyyyyaaaaayyyyyaA....ssssrsssssnbb................AAyyyyaa.......AyyyyyaA........AAaAaAAa...................Ayyyyyyyyyaa..aayyyyyaxnbb..............................", "...........................eeeedbb...........................AAAAAwwwwwwwwwwa......Awwwwwwwwajjjjjjkjhbc.....................Awwwwww.......ooAwwwaaaaa..........................................................................................Ayyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyayyyyyyyaa......................................AAyyyyaaaaaa....aayyyyya...rssssssssqcb.................Ayyyaaa.........aayyyyya.......aaAaAaaa.................AAAyayyaaaaaa....xaayyyyabb...............................", "..........................eeeeebb..........................AAAwwwwwwwwwwwwwwa......Awwwwwwwwajjjjjkkjcb......................Awwwwwaa.....ommmoaaa..............................................................................................Ayyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyaa......................................AAyyyaaa...........aaayyya.sssssssssqcbc................AAyyya.............aayyya........AaAaAa..........vvv.....Ayyyyyaa........xxxxaayyab................................", ".........................eeeeecbc..........................Awwwwwwwwwwwaaawwa.....jjAwwaaawwwAkjjjjkebb.......................Awwwwa......ooooodbc..AaAa........................................................................................Ayyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyaa.......................................Ayyyya................ayya.ssssrssrpcbc................AAyyyaa...............ayyya.......aAaAaa.........vvvvcc..AAyyyyaa.........xxxxxxayac................................", "........................eeeeedbc..................AAAaAa...Awwwwwwwwwwaa.Awwa...ijiAAwwajjAwwwjjjkjjhbc........................Awwwa.....mmmomhbb...aAaa........................................................................................Ayyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyaa........................................Ayyaaa................Ayyyasqsssssqcbc.................Ayyyaa.................ayya......AAaAaAAa.......vvvvhbb..Ayyyaaa.........xvxxxxucaya................................", "........................eeeeebb................AAAAwaAaa...Awwwaaaaawwa...Aww..jjjjAwwwajAAwwwajjjjjcb..........................Awaa.....ooookcb....AaAa................fff......................................................................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..................pppppp.................qaaacb.................aaaasssssspcbc...................aaaa...................aaa......aAaaaAaa.....vvvvvrbb....aaaa...........xxxxxxdbcaa................................", ".......................eeeeecbc..............AAAwwAawAawAa.Awwwa...Awwa.....aajijjgdAwwwAAwwwwwAjjjibb............................a.....omommdbc....aaaa..............fffgge.........................................................................................vsmmmooomqvvvrbb.................ppppppppppd.............qqqqncbc...................ssssssspcbc....................s................................aa..aa.....vvvvvvnbc...........vvvxvvvxxvxxxhbb...................................", "......................eeeeehbb.............AAAwwwwaAAaAAaa..Awwa...Awwa.....jijijecAAwwwwwwwwwwwAkjebc.................................momooibb.......................ggfgggb...........................ii................................................lllllmkn...upmmmmmmquvvvdbc...............pppppppppppphb...........qqqqqhbc...................qssssssqcbc............AaAa...ssssn........................................vuvvvvvvc...........vvvvxvxxxxxxxrhh........x...........................", ".....................eeeeeebb............AAAwwwwwwAaaAaaAa..Awwa...Awwa....iiijjebbAwwwwwwwwwwwwwAkeb..................................mmmmmdbc......................fggffggbb........................ijjjib...........................................klllkhcbbb....tmmmmmmqvvvvrbb..............oppppppppppppphb..........qqqqqqhb....................ssqqqsqcbc.............aAaa.sssssssb......................................vvvvvvvvvrc.........vxxxvvxvxvxxxxxxxxxxxxxxxu...........................", ".....................eeeeedbc............AwwwwwwwwaaaAawaa...Aww....Aww...ijjijhbb.Awwwwwwwwwwwwwwjjb.................................mmmoohbb...............eeeeeffffffgffebb......................iiiijjebc.......................................kllkjdbbc.......uqommooqvvvvvdbc.............ppohdhnppppppppdb.........qqqqqqqqn....................qsssqpcbc............Aa.Aa.Aasssstrbb...............tttt.................uuvuvvvvvvvrd........vvvvvvxvxxvvxxxxxxxxxxuhbbc..........................", "....................eeeeeebb.............Awwwwwwwaa.AaAaww...Awwa...Awwaiiiijedbb...AwwwwwaaaaawwwaAdb................................mmomocb............eeffeehdbbdfffgfggdbc.....................iijijiidb..........jjjjj.......................klllicbb..........ummmmmqvuvvvrbb............opp.bbc..ppppppppcb........qqqqqqqqqqqn.................sssssqcbc.............aAAaAAaassssshbc..............tttuurb...............vvvvvvvvvvvvrc........vvxxxvxxvxxxxxxxxxrndbbc............................", "...................eeeeeedbc.AAAAAA.......Awwwwwaa..aaaawaa..Awwa....Awwijiigcbc....AwwwaaajjjAwwwwwAb...............................momomhbb..........eeeeedbbc...fffffffebb.....................ijijijjebb........jjjjjjjhc....................lkkkdbb............qllomquvuvvvdbc...........pop.bc....ppppppphbb.......qppqqqqqqqqqqqo...............qqsspcbc..............AaaAaaAassssrcb..............tttttutbc...............uvvvvvvvvvvvnc.........hhhrvxxxnnnnhhdbbbc...............................", "..................eeeeeeeAA.AAwwwwwAA......Awwwaa........a.....aa....Awwaiiebbc.....AwwaajjjjjAwwwwwwb...............................mmmmmcb.........eeeeecbb......ffgfffghb.....................iiiiiiiidbc.......jjjjjjjjjb..................klklkcbc............upommpvvuvuuhbb...........popcb.......ppppphbb........pqqqqqqqqqqqqqqod............sssqnbbc...............aa.Aasaasssrhbc.............ttttttthbb.............uuvtuvvvvvvvvvvd............xxxxrbb........................................", "..................eeeeAAAAwAAwwwwwwwwA......Awwa...AAA..............gAwwajdbb......jAwwajjjjjjAwwwwwwac..............................mmmmhbb.......eeeefebbc.......fffgffgfe....................iiiiijjjhbb.......jjjjjjjjjjdb................kkkkjcbc.............smmlotuvvvvrcb...........opodb........pppphbb..........qqqqqqqqqqqqqqqdc...........qqsnbb...................AaAasstsrcbc.............tttttturcb.............vv..brvvvvvvvvvvnb..........vvvvvdbc........................................", ".................eeeeeAwwwwwwwawwwwwww......AwwaAAAAwwA............iiAwwadbb.......jAwwakjjjjjAwwwwwaab.............................mmmmocb.......eeeeeebb..........fgfgfggged.................iiiijjiiicb.......jjjjjjjjjjjdb...............kkkllhbc.............uqmmmsuvuuvvhbc..........opohbc.......pppphbb..........qqpqqqqqqqqqqqqqdb..........qssnbb....................aaaassshbbc.............ttttttuqcbc............u...c..vvvvvvvvvvrb..........xxxxrbb.........................................", "................eeeeeeAwwwwwwaa.aaawwwa.....AwwwwAwwwww..........iiigAwwwbc........AAwwwAjjjjjkjawwaajhc............................ommmhbb.....eeeeeeecbc..........fffgffggged................iiiiiiijhbb......jjjjjjjjjjjjhb..............klknkjbb..............ullmsuuvvuvnbb...........opnbb.......pppndbb..........pp.cbnoqqqqqqqqqhbb..AaAa....qqrcbc...................ssstssncbb...............stttttrcbc............u..c.....vvvvvvvvvvbc........vvvxxhbc.........................................", "...............eeeeeeeAwwwwwwa....Awwwa.....Awwwwwwwwwwa........igiiiiAwwa.........AwwwwwAjjjjjjjjaajkib...........................mmoomcb.....eeeeeeehbb............ffffgggfghc..............iiiiiiijebb......jjijjjjjjjjjjeb.............kkklkkhbc..............qmmouvuuuvrcb...........poocb......ppppnbbc..........p.......pqqqqqqqhbb...aAaa....qshbc....................ssssshbbc...............ttttttncbc............u..........vvvvvvvvvbb........vxxvxbb..........................................", "...............eeeeeeeedawwwaa.....Awww......Awwwwwwwwww......giiggiedAwwa.........Awwwwwwjjjjjjjjjjjkjhc..........................mmmmhbb....eeeeeeeedb............gf.gfffggfgc.............igiiiijiihbc.....j..bhjjjjjjjjjeb.............kkklkkdb..............smmlquvvvuvhbc...........ooibb...oppppnbbb...........q.........qqqqqqdbb....AaAa...qqsbb....................ssssshbb................ststtthbb..........................vvvvvvvrbb........vvxvnbb..........................................", "..............eeeeeeeeedbAwwa......Awwaa.....Awwwwwwwwwwa....giigiiecbcAwaAAA......Awwwwwaajjjjjjkjkjjkkc.........................mlmmmdb.....eeeeeeeebb...........ff..efggffggdb............iiiiijiijcb.....j..c..jjjjjjjjjeb............kkkkklkdb.............qolmmsuuuuvnbb...........opppooppppnhcbbc........................qqqqdbb.....aaaa...sqqbb....................ssssnbb................sttttthbb............................vvvvvvnbc.......xvxvxhb...........................................", ".............eeeeeeeeeedbAwww.....AAwwa.......Awwwwaawwaa..ggggigihbbcAAwwwAwA.....jAwwwwajjjjkjjjjkjkjkeb........................mlmoibb....eeeeeeeeebb...........f....ffgggggdb...........giiiiiiiiebb............jjjjjjjjeb...........jkkkkklkhb............mpplmmsuuuurbb............ooonhddbbbbc............................qqqdbb.............sqqhb...................ssstsdbc...............ttstttnbb.............................vvvvvvdb........xvxvvhb...........................................", ".............eeeeeeeeeedb.Awwa...AAwwww.......Awwwaa..aa..gAAgggedbb..Awwwwwww.....ijjaaaajjjjjjjjjkkkkkkd........................mmmmdbc...eeeeeeeeeecb..........f.....fgfgfggdb...........iiiiiiijihbc............jjjjjjjjeb...........kkkkkkkkeb...........lptommmouuvvcbc...........opoodbc.................................qqqdbb.............qqsssd...................sssssdb................ssttttcb...............................vvvvrbb.......vvvvxxhb...........................................", "............eeeeeeeeeeeeb.AwwaAAAAwwwwwa......Awwwa.....ggAAwAiecbc..AAwwwwwwaa....jjjjjjjjjjjjjjjjjjjjkkib......................mmmmkbb....eeeeeeeeeedb........fe.....gfggggggbb..........igiiiijiijdb.............jjjjjjjjjb...........kkkkknkkkhc.........lmtulllmmquuhbb............oopoib..................................qqnbb............q.qqqqssh.................ssssssnb...............tttstttcb............u..................vvvvdbc.......vxvvvvrb...........................................", "...........eeeeeeeeeeeeeb..AwwwwwwwwwwwwA......Awwa....gggAwwwAbb....Awwwwwwaa......jjAajjAajjjjjjjkjkkkkkhc.....................lmlmhbc...eeeeeeeeeeeec.......ef......gfffffgebb........i.iigiiiiiiidb.............jjjjjjjjjcb........jkkkkkklllllh.......lllstsmmmmmlqhbb............oopopohc....................pp..........qqqdb............q..qqqsqqsn................sssssssnc............ssssstssthb...........t.....uuu...........vvvnbb........vvxxxxxnc...............x..........................", "...........eeeeeeeeeeeeedc.AwwwwwwwwwwwwwA.....Awwa..gggfggAwwwb.....Awwwwwaa.......jAAaAaAAajjjjjjjjjjkjkkd....................mlmlmdb....eeeeeeeeeeeeeh....fff.c....fgggggfgebc......ig..iiiiiiijiiehi............jjjjjjjjjhb......kk.kkkklkkkkkklej..lllllnutqlmmmmmmkd............o.oooopohd..................pp..........qqqqbb..........qq..dqqqssqssqq.............sssssssssnh..........ssttttttstth.........uu..c..uuuvrd.........vvtcb.........vvvvvxvxnh............xx...........................", "..........eeeeeeeeeeeeeeeb.AwwwwwwwaaawwwwA.....AwwAgfAAAAAAwwwa.......aaaaa.........aaAaAaaajkjkjkkjkkkkkkjb...................lmmmibb....eeeeeeeeeeeeeeeeefee.b.....ffffffggeb.....gg..chiigiiiiiijiie.c..........jjjjjjjjjjh....jkj..kjkkkknkkllklllllllkhtuupmlllmmmmmn.........oo..ooppoppon...............pqq.c........qqqqqdb........qqq.cb.ssqqqsqsssssqq.......sssssssssssssrs......sss.ssssttttttn......tuu..c..uuuvuvhc.......vvvdbc........vvvvxxvxxvxr........xxx..c..........................", "..........eeeeeeeeeeeeeeehcAwwwwwaaa..Awwww......AwwAAAwAwwwwwwa.....................jAaAaAajjjjjjjkjjkkkkkkec..................mmmmhbc...eeeeeeeeeeeeeeeeeefdbb.....fffggggffgdh.gggg.cb..iiggiiijiiiebb...........jjjjjjjjjjjjjjkjkdbckkkkklkkkklkkllklljdrttupmmmmllmmommmlmmmmooo.chooopoopopooo..........ppp..b.......qqqqqqqnb......qqqqhbb..qsqsqsqsqsssssssssssss.nssssssssssssssssssstchtttsttttttttttuuttscb....vvuuuuub.......vvnbb.........xvvvvxxxxvvxxxxxxxxxxxncb...........................", ".........eeeeeeeeeeeeeeeeed.Awwwaa.....Awwwa....fAwwwwwwwwwwwwaa......................aAaAaajjjjjjjjjkkjjkjkkd.................lllmlcb....eeeeeeeeeeeeeefeffdbb.....fgggfffgggggggggebbc..igiiiiiiiiiebb............jjjjjjjjjjjjkjkecbc.kkkkkkllklklllllljcnttutpllmlmmmmmoomooooooodbc.opoopppppppppppppppppppphbb........pqqqqqqqnnqqqqqqqqcbc...qqsqsqsssqssssssssssnbbnssssssssssssssssssnbbhssstststttttttttuhbb....uuuuvvvvhb.....vvvbb..........vxxvxvvvxxxxxxxxxxxxucbb............................", ".........eeeeeeeeeeeeeeeeeedAwwwa......Awwwa..ffAAwwwwwwwwwwwaa......................AAaAaAAajjjjjkjjkkkkkjkkic................mmlmibb....eeeeeeeeeeeeeefeecbb......fgffggfgggggggedbb....iiiigiiiijebb..............jjjjjjjjjjkkjhbb...kkkknkklnlkkkklkkchutttuqmlmmmmmmmmoooAaooAabb..ooopooopppppppppppppppndbb........qqqqqqqqqqqqqqqqqpcbc....qqqqsqqssqssssrsssshbb..sssssssssssssssssdbb..ttstststtttttturdbb.....uuuuuuuurc....vvvcb............vvvxxxxxxvxxxxxxxxnbbc.............................", "........eeeeeeeeeeeeeeeeeeeeAwwaa......AwwwwfffAAwwwwwwwwwwaaa.......................aAaaaAaajjjjjjkkjjjkkkkkkec...............llmmhbc....eeeeeeeeeeeeeeeebbc......fffgfgfggfggggecbc.....ggiiiiiiiebb...............jjjjjjjjjjjjdbb....kkkkkkkkkklllllechutuuutslmmmmmmmmmmmAAaAaAAa...opoopppppppopppppppppncbc........pqqqqqqqqqqqqqqqqnbbc.....qqssqsssssssssssrqdbb...ssssssssssssssssdbb...sststtttttttutncbc......uuvuuvvvvrh.vvv.cb.............vxvvvvvxxxxxxxxxuhbb...............................", "........eeeeeeeeeeeeeeeeeeeeAwww........AwwaaffAwwwwawwwwaaa..........................aajjaajjjjjjjkkkkjkkkkkkkhc.............mmmmmdb......eeeeeeeeeefeedbb........fffgffffgfgfedbb.......iggiiiijebb................jjjjjjjjjjicbb......kkkkkklkkkklkhbdttttttuumllllommmommaaAaAaaa....ppoooopoppppppppppphbbc.........qppqqqqqqqqqqqqqhbb........qqsqqqsssssssssncbc....ssssstssssstssrcbb....tsttttttttttthbb.........uuuuuuuvuvuvvhbb..............vxvxxxvvxvxxxxxncbc................................", "........eeeeeeeeeeeeeeeeeeeeeAwwae...AAAAwaaffefAwwaacaaaa...............................jjjjjjjjjkjjjjkkkkkkklld.............llllkbb......eeeeeeeeeeehbbc.........fffffgggfgedbbc........giiiiiiebb.................jjjjjjjjjhbbc.......kkkklkklllljdbcstttuuutthmmmmmmmmmmooAaAaAa......ooppppppppppppppndbb...........pqqqqqqqqqqqqqodbb..........qqsssqsqssssqdbb.......sssssstssssshbbc......tsssttttttncbb..........tvvuvvvuvuvrcbb................vxvvvxxxxxxxtdbb..................................", ".......eeeeeeeeeeeeeeeeeeeeeeeAwaeeAAAwwwwaeffgfedaa......................................jjjjjkkjjkjkjkkjkkkkkkjc............mmmmebc.......eeeeeeeehcbb...........fffffffgedbbc...........iggiiebb...................jjjjjjedbb..........kkklkknkkhcbdsuttttttrdbemmllmomoommaAaAaa.......oooopopppppppphbbc.............qqqqqqqqqqqqncbc............qqqsqssssphbbc.........sssssssssndbb.........ttsttttrhbbc............uuuuuvvvrhbbc..................vxxxxvxvxuhbbc...................................", ".......eeeeeeeeeeeeeeeeeeeeeeAAwwAAAwwwwwaaffffhcbc.......................................jjjjjkjkkjkjkjkkkkkkkkkec..........mlllldb..........eeehdbbb..............ffgfgedbbc.............iiiidbb....................jjjjihbbc............kkkkkjhcbb.utttutturcbc..mmmmmmmmhAAaAaAAa.......opppppppppphcbb................pqqqqqqqqohbbc..............rpqsssndbbc............rsssssndbbc...........stssnhbbc...............uuvvurhbbc.....................vvvxxxrhbbc.....................................", ".......eeeeeeeeeeeeeeeeeeeeeeAwwwwAwwwwwwafffecbb..........................................jjjjjjjkjkjkkkkklkkllllh..........mmmmmcb..................................edbbb.................iedbb.......................hdbbc................hdcbbc..tuttttttrcbc....jhehedbbaAaaaAaa.........hnpppnhdbbb....................nqqqqohcbc...................dbbbb.................hhhbbb................hcbbc...................hdbbbc.........................hhhbbbc.......................................", ".......eeeeeeeeeeeeeeeeeeeeeeAwwwwwwwwwaaafedbbc............................................jkjkkkjkjkkkkkkkklkkkkld.........lmmmkbb..........................................................c.....................................................ttttttturcbc..............aa..aa.............cbbbc.........................hddbbc......................................................................................................................................................................", ".......eeeeeeeeeeeeeeeeeeeeeeAwwwwwwwaaafehcbc...............................................kklkkjkkkkklkklkllllklkc........mmmmebc...............................................................................................................stuuututnbbc............................................................................................................................................................................................................................................", ".......eeeeeeeeeeeeeeeeeeeeeeAwwwwaaaaeeedbb..................................................mmllnkjkkkklkklkkknlllic......mmommdb...............................................................................................................tttuuvvuhbb..............................................................................................................................................................................................................................................", ".......eeeeeeeeeeeeeeeeeeeeeeeeaaaaeeeedbbc............cd....dd..............................ddpomkkkklllllllllmllmmohd.....ppppodc.....................................dd.....ddd...............................................................stuthcuvhcc...................................................................................ddddd.......................ddddddd.........................................................................................................................", ".......eeeeeeeeeeeeeeeeeeeeeeeefeeefedbbc...............du...dxx..ddddddd.dddddddd..........dhhrqpmlkhhnmomhhmmlmkhhhkh..cddhhhhnccd.....c....cdddddd...ddddd...........ddh....dhnx...ddddddd....ddd......ddd......dd........dd......cdddddd....sttturdxhdcd.....c..dddddddd..ddddddd...ddddd......dddddd....dd.......ddd....ddddddd..........dhxxrhh....dd....d...........druurrrx...d.....d......dd.......ddd.....ddd.....ddddddd...dd....d..............................................................", ".......eeeeeeeeeeeeeeeeeeeeeeeeeeeedbbc.................hh..drx...drrrrrrx.rrhhrrrx.........drrhxpollhdhqophrvomndnrrhhd..rrdrrrrhddx....hx...drrrrrrx..drrrrd..........dhhu..dhnrx...drrrrrrx.ddrrnh...ddrrnh.....dhh.....cdnrhd....drrrrrnx.tttttturdxdd.dd....hx..rrhhrrrx.drrrrrnx..drrrrhh...dnxxxxux..dhdx....ddnrnd...drrrrrnx........dnx....hh...ddr...dx..........hx.........cu...ddr....dhdx....ddnrnd...d.rrhh...drrrrrnx..ddr...dx.............................................................", ".......eeeeeeeeeeeeeeeeeeeeeeeeeedbbc....................hnhnx....dx.........hhx............dxxhx.omlnrhnqphruondtxxuvhrd..vhrxvrhddx....hx...dx........dx...hr.........dnrn..hrnnx...dx.......dxx..ux..dux..ux....dxdx...d.xx..rx...dx.....xttttssuuhdx...dnh...hx....hhx....dx........dx...hh...dr........dxhr...dhxx..ux..dx..............dx......hx..drd...dx..........hrhhh......hh...dhr....dxhr...dhxx..ux..hx...xx..dx........drd...dx.............................................................", "........eeeeeeeeeeeeeeeeeeeeeeedbbc.......................hnx.....dhhdd......dhx...........dnx.hn..omnrthrqhruphhxsqqqhnrd.qhrxqhd.dhhhhhhx...dhhdd.....dhdddhx.........dhxhuhhxhnx...dhhdd.....dddd.....dddd.....dnxhr...dx.........dhddd..uuttttsrdddx...dxhh..hx....dhx....dhddd.....dhddddrx..dhhdd.....dx.h...dx........dhddd...........dx......hx..dx.h..hx..........hrrnhx.....nhr.d.hr....dx.h...dx........dhdd.....dhddd.....dx.h..hx.............................................................", ".........eeeeeeeeeeeeeeeeeeehcbbc.........................hux.....drrrrx.....dhx...........dhhhhhu..linuqhrhrvphnxqqpphnxnhqhuxqhd.hxxxxrnx...drrrrx....drrnhxx...ppp...dhxhhhuxhnx...drrrrx.....urrhh....urrhh...drn.hx..dx..ddd....dnrrruxvttttthccddx...dx.hh.hx....dhx....dnrrrr....drrrhxx...drxxrx...dhr.hr..dx........dnrrrr..........dx.....dhx..dx.nh.hx..........hxxxxx.....n.h.dxhr...dhr.hr..dx.........xrrhd...dnrrrr....dx.nh.hx.............................................................", "..........eeeeeeeeeeeeeeeedbbc............................hu......dx.........dhx..........dhxxxxrn...hnuprhhrvqodxqpppdxxqnqdrxqdc.dx....hx...dx........dx..hr..qqppppqqhhx.hrx.hhx...dx............rhx......rhx.dhrnnhr..dr...xnr...drx.xxxutttrdbb..dx...dx..hhhx....dhx....drx.......dx..hn....dr.......drrnhh..dn....d...drx.............hh.....drx..dx..hhhx..........hx.........n.hd.xdr...drrnhh..dn....d........hx..drx.......dx..hhhx.............................................................", "............eeeeeeeeeeddbbc...............................dr......dnhdddd....dhx..........dx.....hx...nspprdrvppnhhnhhnxsppqdrvqcc.dx....hx...dnhdddd...dx...hxsqqppppqqhhx.hxx.dhx...dnhdddd..ddd.dd.x.ddd.dd.x.dx....dx..hhd.ddr...dhhnnhhvuthbbc...dx...dx...hnx....dhx....dhhdddd...dx...hr...dr......d.x...hr..hhddddr..dhhdddd..........ndddddnx...dx...hhx..........hnhhddd....h..hx.dr..d.x...hr..hhddddr..ddd.ddx..dhhdddd...dx...hhx.............................................................", "..............dddddbbbb....................................r.......rrrrrrx....rx...........x......u...huopprrupppurrrxxuqpponuvpcc..x....nu....rrrrrrx...u...nrqqqpppppqnrxsrx...rx....rrrrrrx..xrrrxx...xrrrxx...x.....u...rrr.xx...hrrrrrrxrdbb.....nx....u....rx.....rx.....rrrrrnx...r....r....r.......x.....r...xrrrxx...rrrrrnx..........xrrrxx.....r....ru..........nrrrrrru.......x..r...x.....r...xrrrxx...urrrxx...rrrrrnx...r....ru.............................................................", "........................................................................................................lmoquuoooopuuuppoomoqushcc...........................svsqppppppqsvvsssq.....................................................tvxxxxxxrccc...........................................................................................................................................................................................................................................................", ".........................................................................................................kmooolmmmomooooommmopphb............................qqppppppppqqqqqqqqqh.................................................sstttuuundcc.............................................................................................................................................................................................................................................................", "..........................................................................................................kllllllllmmlmllmmmommhb...........................ppppppppppppqqqqqqqqqh..............................................ssssssttndcb...........................................................................................................................................................................................................Aa..Aa..............................................", "...........................................................................................................lklkllllllllmlllmmmmhb...........................ppppppppqqppppppqqqqqqc...........................................ssssssssqdbbc...........................................................................................................................................................................................................AAaAaAAa.............................................", ".............................................................................................................klklkkkllllllmlllmdb...........................ppppppppppppppqqpqqqqqnb........................................ssssssssrhbbc.............................................................................................................................................................................................................aaAaAaaa.............................................", "..............................................................................................................lkllllllllllmmmlldb...........................opppppppppppppqqpppqqqqd......................................ssssssssrhbbc................................................................................................................................................................................................................AaAaAa..............................................", "...............................................................................................................kkklkllkllllllmmkb............................pppppppppppppppppqpqqqqd...................................ssssssssndbbc..................................................................................................................................................................................................................aAaAaa..............................................", "................................................................................................................kklklllllllmllllhc...........................pppppppppppppppqppppqqqqd...............................sssssssssndbbc...................................................................................................................................................................................................................AAaAaAAa.............................................", ".................................................................................................................kklkllllllllmmmmd............................pppppppppppppppqqqqqqqqqh...........................sssssssssqhcbbc.....................................................................................................................................................................................................................aAaaaAaa.............................................", "..................................................................................................................klkklllllmlllllib............................pppppppppppqppqqpqqpqqqqnn.....................qqsssssssssndbbc.........................................................................................................................................................................................................................aa..aa..............................................", "....................................................................................................................llknllllllmmmldc............................pppppppppqpppppppqqqqqqqqpo..............qqqssssssssssqhcbbc...............................................................................................................................................................................................................................................................................", ".....................................................................................................................lllllllllllmmkb..............................nppppppppppqqqqpqqqqqqqqqqqqqqqqqqqqqqqqsqsssqsssqhdbbc.........................................................Aa..Aa...................................................................................................................................................................................................................", "......................................................................................................................lklllmmlmmllmhc...............................nppppppppppppqqqqqqqqqqqqqqqqqqqqqqqqsqsAaAanhcbbc...........................................................AAaAaAAa..................................................................................................................................................................................................................", ".......................................................................................................................llllllllmmmmib.................................nhnppppppqpppqqqqqqqqqqqqqqqqqqqqsqqqsaAaabb...............................................................aaAaAaaa..................................................................................................................................................................................................................", "........................................................................................................................llllmlmllmlmdc....................................hhhqqpqqqqqqqqqqqqqqqqqqqqqqqnndAabAa.Aa................................................................AaAaAa...................................................................................................................................................................................................................", "....................................AaAa................................................................................llllllmmlmlmib.........................................dddhhnnqqqqqqqqqnnnhddcbbbcaAAaAAaa................................................................aAaAaa...................................................................................................................................................................................................................", "....................................aAaa................................................................................llllmlllmmmlmcc.................................................bbbbbbbbbc........AaaAaaAa...............................................................AAaAaAAa..................................................................................................................................................................................................................", "....................................AaAa................................................................................llllmmmllmmmmhb...................................................................aa.Aa.aa...............................................................aAaaaAaa..................................................................................................................................................................................................................", "....................................aaaa................................................................................lllllllmmmmmmkb.....................................................................AaAa..................................................................aa..aa...................................................................................................................................................................................................................", "........................................................................................................................lllllmlllmlmmmdc....................................................................aaaa............................................................................................................................................................AaAa...........................................................................................................................", "........................................................................................................................llllllmmmlmlmmhb....................................................................................................................................................................................................................................aAaa...........................................................................................................................", "........................................................AaAa............................................................lllmllllmmmommkb....................................................................................................................................................................................................................................AaAa...........................................................................................................................", "........................................................aAaa............................................................llllllmmlmmmmmmdc...................................................................................................................................................................................................................................aaaa...........................................................................................................................", "......................................................Aa.Aa.Aa..........................................................lllmlllmlmmlmmmhb..................................................................................................................................................................................................................................................................................................................................................................", "......................................................aAAaAAaa..........................................................llllmlmlmllmmomhb..................................................................................................................................................................................................................................................................................................................................................................", "......................................................AaaAaaAa...........................................................lllmlmlmmmmmommb..................................................................................................................................................................................................................................................................................................................................................................", "......................................................aa.Aa.aa...........................................................llllllmlmmmmmmmdb..........................................................................................................................................................................................................................................................................................................................................................AaAa...", "........................................................AaAa.............................................................llllmlmlllmmmmmdb..........................................................................................................................................................................................................................................................................................................................................................aAaa...", "........................................................aaaa.............................................................lllmlmlmmmlmmmmeb........................................................................................................................................................................................................................................................................................................................................................Aa.Aa.Aa.", ".........................................................................................................................lllllmlmmmmmoomib........................................................................................................................................................................................................................................................................................................................................................aAAaAAaa.", "..........................................................................................................................lllllmlmmlmmmmmbc.......................................................................................................................................................................................................................................................................................................................................................AaaAaaAa.", "..........................................................................................................................lmlmlmlmmlmmommbb.......................................................................................................................................................................................................................................................................................................................................................aa.Aa.aa.", "..........................................................................................................................llmlmlmlmmmmmmmdb.........................................................................................................................................................................................................................................................................................................................................................AaAa...", "..........................................................................................................................llllmlmmmlmmoomdb.........................................................................................................................................................................................................................................................................................................................................................aaaa...", "...........................................................................................................................llllmllmmmmmmodb...........................................................................................................................................................................................AaAa.................................................................................................................................................................", "...........................................................................................................................mmllmmlmmmmmmmdb...........................................................................................................................................................................................aAaa.................................................................................................................................................................", "...........................................................................................................................llmmllmolmmmmmdb.........................................................................................................................................................................................Aa.Aa.Aa...............................................................................................................................................................", "............................................................................................................................llmmmlmmmmmomdb.........................................................................................................................................................................................aAAaAAaa...............................................................................................................................................................", "............................................................................................................................lllllmmmmoommdb.........................................................................................................................................................................................AaaAaaAa...............................................................................................................................................................", ".............................................................................................................................mmmmmlmmmmomdb.........................................................................................................................................................................................aa.Aa.aa...............................................................................................................................................................", ".............................................................................................................................lllllolmmmmmcb...........................................................................................................................................................................................AaAa.................................................................................................................................................................", "..............................................................................................................................mmmmmmmmmombb...........................................................................................................................................................................................aaaa.................................................................................................................................................................", "..............................................................................................................................lllmmmmommhbb................................................................................................................................................................................................................................................................................................................................................................", "...............................................................................................................................mlmlmmmmmdb.................................................................................................................................................................................................................................................................................................................................................................", "................................................................................................................................mlmmmomhbb.................................................................................................................................................................................................................................................................................................................................................................", ".................................................................................................................................mmmmmicbc.................................................................................................................................................................................................................................................................................................................................................................", ".....Aa..Aa........................................................................................................................hddbbc..................................................................................................................................................................................................................................................................................................................................................................", "....AAaAaAAa...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "....aaAaAaaa.............................................................................................................................................................................................................................................................................................................................................................................................................AaAa..............................................................................", ".....AaAaAa..............................................................................................................................................................................................................................................................................................................................................................................................................aAaa..............................................................................", ".....aAaAaa..............................................................................................................................................................................................................................................................................................................................................................................................................AaAa..............................................................................", "....AAaAaAAa.............................................................................................................................................................................................................................................................................................................................................................................................................aaaa..............................................................................", "....aAaaaAaa..............................................................................................................................................AaAa.............................................................................................................................................................................................................................................................................................................................................", ".....aa..aa...............................................................................................................................................aAaa.............................................................................................................................................................................................................................................................................................................................................", "..........................................................................................................................................................AaAa.............................................................................................................................................................................................................................................................................................................................................", "..........................................................................................................................................................aaaa.............................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................." }; wanderlust-wanderlust-769699d/etc/icons/wl-draft-insert-signature-up.xpm000066400000000000000000000024031406661363500264630ustar00rootroot00000000000000/* XPM */ static char * wl_draft_insert_signature_up_xpm[] = { "32 32 3 1", " c None", ". c #000000000000", "X c #FFFFFFFFFFFF", " . ", " .. ", " .X. ", " .X. ", " .XX. ", " ..XXX. ", " .XXXX. ", " .XXXX. ", " .XXXX. ", " .XXXXX. ", " .XX.XX. ", " .XX.X. ", " .XX.X. ", " .X.XX. ", " ..X. ", " .. .. ", " . . ... . ", " . . . . . . ", " . .... ... . . ", " ... ... ... .... ", " .. .. ... ", " ", " ", " ", " . ", " ... ", " . . ... ... ", " ... . . . . . ", " . . . . . . ", " . . ... . . ", " ... . . . . ", " .. "}; wanderlust-wanderlust-769699d/etc/icons/wl-draft-kill-up.xpm000066400000000000000000000025441406661363500241210ustar00rootroot00000000000000/* XPM */ static char * wl_summary_delete_up_xpm[] = { "32 32 8 1", " c None", ". c #000000000000", "X c #E79DCB2B9E79", "o c #69A68E38EFBE", "O c #CF3CBAEA9658", "+ c #FFFFFFFFFFFF", "@ c #B6DAA6998617", "# c #965896589658", " ", " .... ", " .XXXX.. ", " o .XOOOXX.. ", " oo ..XOOOOOOO.. ", " ooooooo .++.XOOOOOOOO. ", " oooooooo .. ..@@@OOOO@. ", " ooooooooo.+.++...@@@@@. ", " oooooooo .++..++...... ", " ooooooo ...++.+.+#... ", " oo .XO.......@@. ", " o .XOXOOO@O@@@. ", " .XOXOOO@O@@@. ", " .XOXOOO@O@@@. ", " .XOXOOO@O@@@. ", " .XOXOOO@O@@@. ", " .XOXOOO@O@@@. ", " .XOXOOO@O@@@. ", " .XOXOOO@O@@@. ", " .XOXOOO@O@@@. ", " .XOXOOO@O@@@.## ", " ..XOOO@O@..#### ", " .......##### ", " ######### ", " . . ", " .... . . ", " . . . . . ... . ", " . . . . . . . . . . ", " . . ... . ... . ... ", " . . . . . . . ", " .... .. . .. . .. ", " "}; wanderlust-wanderlust-769699d/etc/icons/wl-draft-save-and-exit-up.xpm000066400000000000000000000025561406661363500256360ustar00rootroot00000000000000/* XPM */ static char * wl_draft_save_and_exit_up_xpm[] = { "32 32 8 1", " c None", ". c #000000000000", "X c #FFFFFFFFFFFF", "o c #59656595C71B", "O c #9E798E3869A6", "+ c #69A68E38EFBE", "@ c #FFFFE38DB6DA", "# c #CF3CBAEA9658", " ", " .................. ", " .XXXXXXXXXXXXXXXX. ", " .XooX XXXXXXXX.O ", " .XooXXXXXXXXXXXXX.O ", " .XXXX XXXXXXXX.O ", " .XXXXXXXXXXXXXXXX.O +++++ ", " .XXXXXXXXXXXXXXXX.O +++++ ", " .XXXXXXXXXXXXXXXX.O +++++ ", " .XXXXXXXXXXXXXXXX.O +++ ", " ..................O +++ ", " OOOOOOOOOOOOOOOOOO +++ ", " +++++++ ", " ...... +++++ ", " .OOOOOO. +++ ", " .....OOO......+. ", " .@@@@@...OOOOOOOO. ", " .@#####@@@.......O. ", " .@########@@@@@##.. ", " .@##############.. ", " .@###############. ", " .@##############. ", " .@##############. ", " .@#############. ", " ................ ", " ... ", " . .. . . .. ", " ... . . . . . ", " . ... . . .... ", " . . . . . . ", " ... .... . ... ", " "}; wanderlust-wanderlust-769699d/etc/icons/wl-draft-send-from-toolbar-down.xpm000066400000000000000000000025261406661363500270430ustar00rootroot00000000000000/* XPM */ static char * wl_draft_send_and_exit_down_xpm[] = { "32 32 7 1", " c None", ". c #000000000000", "X c #618596586185", "o c #0000FFFFFFFF", "O c #FFFFFFFF0000", "+ c #FFFFE38DA699", "@ c #9E799A699E79", " ", " ", " ", " ...... ... ", " .XXXXX... .oo. ", " .XXXXXXXX. ... ", " .XXOXXXX. . ", " .X....XX. ", " .......... .. ", " ........... .oo. ", " .++.+.++. . .. ", " .++.+.++. ", " .++.+.++. ", " .+++++++. ", " .+++++. ", " ....... ", " .X.XXXX.@@@@@@ ", " .XXX.XXXX.@@@@@@ ", " .XXXX.XXX.@@@@@ ", " .XXXXX.....@@@ ", " .XXXXXX....@@ ", " ...........@ ", " .... ", " ", " . ", " ... . ", " . . ... ... ", " ... . . . . . . ", " . ... . . . . ", " . . . . . . ", " ... .. . . ... ", " "}; wanderlust-wanderlust-769699d/etc/icons/wl-draft-send-from-toolbar-up.xpm000066400000000000000000000024771406661363500265250ustar00rootroot00000000000000/* XPM */ static char * wl_draft_send_and_exit_up_xpm[] = { "32 32 6 1", " c None", ". c #000000000000", "X c #618596586185", "o c #FFFFFFFF0000", "O c #FFFFE38DA699", "+ c #9E799A699E79", " ", " ", " ", " ...... ", " .XXXXX... ", " .XXXXXXXX. ", " .XXoXXXX. ", " .X....XX. ", " .......... ", " ........... ", " .OO.O.OO. ", " .OO.O.OO. ", " .OO.O.OO. ", " .OOOOOOO. ", " .OOOOO. ", " ....... ", " .X.XXXX.++++++ ", " .XXX.XXXX.++++++ ", " .XXXX.XXX.+++++ ", " .XXXXX.....+++ ", " .XXXXXX....++ ", " ...........+ ", " .... ", " ", " . ", " ... . ", " . . ... ... ", " ... . . . . . . ", " . ... . . . . ", " . . . . . . ", " ... .. . . ... ", " "}; wanderlust-wanderlust-769699d/etc/icons/wl-draft-up.xpm000066400000000000000000000025061406661363500231660ustar00rootroot00000000000000/* XPM */ static char * wl_draft_up_xpm[] = { "32 32 7 1", " c None", ". c #000000000000", "X c #EFBEFFFFC71B", "o c #FFFFFFFFFFFF", "O c #9E799A699E79", "+ c #59656595C71B", "@ c #79E7B2CAF7DE", " ", " ............... . ", " .XXXXXXXXXXXXX. .. ", " .XXXXXXXXXXXX..o. ", " .XXXXXXXXXXX..o. ", " .XXXXXXXXXXX.oo. ", " .XXXXXXXXXX..ooo. ", " .XXXXXXXXX.oooo. ", " .XXXXXXXX.oooo. ", " .XXXXXXXX.oooo. ", " .XXXXXXX.ooooo. ", " .XXXXXX.oo.oo.OOOOOO ", " .XXXXXX.oo.o.X.OOOOO ", " .XXXXXX.oo.o.X.OOO ", " .......XXXo.oo.XX.OO ", " .+++++.XXX..o.XXX.O ", " .......XXXX..XXXX.O OOOO ", " .@@@.XXXXX.XXXX.OOOOO ", " .@o@@@.XXXX.XXX.OOOOOO ", " .@o@@@@@........OOOOO ", " .+o+++++. . OOOOO ", " .+o+++++.OOOOOOO ", " .+++++++.OO ", " .......OOO ", " OOOOOOOOO ", " . . ", " .. . . . . . ", " . . . . . . . . ", " . . . ... . . . ", " . .. . . . ", " . . .. . . ", " "}; wanderlust-wanderlust-769699d/etc/icons/wl-draft-yank-original-up.xpm000066400000000000000000000025241406661363500257300ustar00rootroot00000000000000/* XPM */ static char * wl_draft_yank_original_up_xpm[] = { "32 32 7 1", " c None", ". c #000000000000", "X c #EFBEFFFFC71B", "o c #FFFFFFFFFFFF", "O c #9E799A699E79", "+ c #59656595C71B", "@ c #79E7B2CAF7DE", " ", " ............... .", " .XXXXXXXXXXXXX. ..", " .XXXXXXXXXXXX..o.", " ..............XOXOOOXXXXX..o. ", " .oooooooooooo.XXXXXXXXXXX.oo. ", " .o++o ooo.XXOXOOXXXX..ooo. ", " .o++oooooooo.XXXXXXXXX.oooo. ", " .oooo ooo.XXXXXXXX.oooo. ", " .ooooooooooo.XXXXXXXX.oooo. ", " .ooooooooooo.XXXXXXX.ooooo. ", " .oooooooooooo.XXXXXX.oo.oo.OOO", " .oooooooooooo.XXXXXX.oo.o.X.OO", " .oooooooooooo.XXXXXX.oo.o.X.OO", " ..................XXXo.oo.XX.O", " OOOOOOOOOO.+++++.XXX..o.XXX.O", " OOOOOOOOOO.......XXXX..XXXX.O", " .@@@.XXXXX.XXXX.OO", " .@o@@@.XXXX.XXX.OOO", " .@o@@@@@........OOOO", " .+o+++++. . OOOOO ", " .+o+++++.OOOOOOO ", " .+++++++.OO ", " .......OOO ", " . ", " .. . . ", " . . .. ... . . ", " . . . . . .. ", " .. ... . . .. ", " . . . . . . . ", " .. .. .. . . . ", " "}; wanderlust-wanderlust-769699d/etc/icons/wl-exit-up.xpm000066400000000000000000000025141406661363500230360ustar00rootroot00000000000000/* XPM */ static char * wl_folder_quit_up_xpm[] = { "32 32 7 1", " c None", ". c #000000000000", "X c #FFFFE38DB6DA", "o c #CF3CBAEA9658", "O c #AEBAB2CAAEBA", "+ c #B6DA965869A6", "@ c #69A68E38EFBE", " ", " ", " ", " ........... ", " .XXooooooo.OO ", " .X.......o.OO ", " .o.++++X.o.OO ", " .o.+oooX.o.OO ", " @ .o.+oooX.o.OO ", " @@ .o.+oooX.o.OO ", " @@@@@@@@@ .o.XXXXX.o.OO ", " @@@@@@@@@@ .o.......o.OO ", " @@@@@@@@@@@.XXooooooo.OO ", " @@@@@@@@@@O.XXooooooo.OO ", " @@@@@@@@@OO.o.......o.OO ", " OOOOOO@@OO .o.++++X.o.OO ", " OOOOOO@OO .o.+oooX.o.OO ", " OO .o.+oooX.o.OO ", " O .o.+oooX.o.OO ", " O .o.XXXXX.o.OO ", " .o.......o.OO ", " .ooooooooo.OO ", " ...........OO ", " OOOOOOOOOOOO ", " . . ", " .... . ", " . . . . ... ", " ... . . . . ", " . .. . . ", " . . . . . ", " .... . . . . ", " "}; wanderlust-wanderlust-769699d/etc/icons/wl-folder-check-current-entity-up.xpm000066400000000000000000000025511406661363500274060ustar00rootroot00000000000000/* XPM */ static char * wl_folder_check_entity_up_xpm[] = { "32 32 8 1", " c None", ". c #000000000000", "X c #FFFFE38DB6DA", "o c #E79DCB2B9E79", "O c #B6DAA6998617", "+ c #CF3CBAEA9658", "@ c #BEFB492471C6", "# c #AEBAAAAAAEBA", " ", " ", " ", " ............ ", " ...XXXXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXX. ", " .XXXXXXXXXXXXXXXXXX. ", " ....XXXXXXXXXXXX.... ", " .ooo............OOO. ", " .ooo++++++++++++OOO. ", " .ooo++++++++++++OOO. ", " .ooo++++@@@@@@++OOO. ", " .ooo+++@@@@@@@@+OOO. ", " .ooo+++@@@++@@@+OOO. ", " .ooo+++@@@++@@@+OOO. ", " .ooo+++++++@@@++OOO. ", " .ooo++++++@@@@+++OO. ", " #...++++++@@@+++...### ", " ####.....@@@....####### ", " ########@@@############ ", " #####@@@########### ", " ############# ", " @@@# ", " @@@# ", " . @@@# . ", " ... . . ", " . . ... . .. . . ", " . . . . . . .. ", " . . . ... . .. ", " . . . . . . . . ", " ... . . .. .. . . ", " "}; wanderlust-wanderlust-769699d/etc/icons/wl-folder-empty-trash-up.xpm000066400000000000000000000025231406661363500256130ustar00rootroot00000000000000/* XPM */ static char * wl_folder_empty_trash_up_xpm[] = { "32 32 7 1", " c None", ". c #000000000000", "X c #E79DCB2B9E79", "o c #CF3CBAEA9658", "O c #B6DAA6998617", "+ c #FFFFFFFFFFFF", "@ c #965896589658", " ", " .... ", " .XXXX.. ", " .XoooXX.. ", " .. .Xooooooo.. ", " . .Xoooooooo. ", " . ..XXXooooO. ", " . .OO...OOOOO. ", " .OOOOOO...... ", " ... ...OOOOOOO... ", " .+++. .Xo.......OO. ", " . ++.. .XoXoooOoOOO. ", " . +.+. .XoXoooOoOOO. ", " .. . .XoXoooOoOOO. ", " . .XoXoooOoOOO. ", " .XoXoooOoOOO. ", " .XoXoooOoOOO. ", " .XoXoooOoOOO. ", " .XoXoooOoOOO. ", " @@ .XoXoooOoOOO. ", " @@@@@ .XoXoooOoOOO.@@ ", " @@@ ..XoooOoO..@@@@ ", " .......@@@@@ ", " @@@@@@@@@ ", " . ", " .... . ", " . .... ... .... . ", " ... . . . . . . . . ", " . . . . . . . . . ", " . . . . . . . .. ", " .... . . . ... . . ", " . . "}; wanderlust-wanderlust-769699d/etc/icons/wl-folder-goto-draft-folder-up.xpm000066400000000000000000000025361406661363500266610ustar00rootroot00000000000000/* XPM */ static char * wl_folder_goto_draft_folder_up_xpm[] = { "32 32 7 1", " c None", ". c #69A68E38EFBE", "X c #000000000000", "o c #EFBEFFFFC71B", "O c #9E798E3869A6", "+ c #FFFFE38DB6DA", "@ c #CF3CBAEA9658", " ", " ", " ..... ", " .....XXXXXXXXX ", " .....ooooooooX ", " .........ooooooX ", " XXXXXX....... o ooX ", " XOOOOOOX.....ooooooooX ", " XXXXXXOOOX... o ooX ", " X++++++XOOOO.oooooooooX ", " X+@@@@@@+XXXXXXXXXoooooX ", " X+@@@@@@@+++++++++XoooX ", " X+@@@@@@@@@@@@@@@XoooX ", " X+@@@@@@@@@@@@@@@XoooX ", " X+@@@@@@@@@@@@@@@@XooX ", " X+@@@@@@@@@@@@@@@XooXO ", " X+@@@@@@@@@@@@@@@XooXO ", " X+@@@@@@@@@@@@@@@@XXXO ", " X+@@@@@@@@@@@@@@@XOOO ", " X+@@@@@@@@@@@@@@@XO ", " X+@@@@@@@@@@@@@@@XO ", " XXXXXXXXXXXXXXXXXO ", " OOOOOOOOOOOOOOOOOO ", " ", " XX X ", " XXX X X ", " X X X X XX XXX XXX ", " X X XX X X X ", " X X X XXX X X ", " X X X X X X X ", " XXX X XXXX X X ", " "}; wanderlust-wanderlust-769699d/etc/icons/wl-folder-jump-to-current-entity-no-sync-up.xpm000066400000000000000000000025111406661363500313040ustar00rootroot00000000000000/* XPM */ static char * wl_folder_jump_to_current_entity_up_xpm[] = { "32 32 6 1", " c None", ". c #69A68E38EFBE", "X c #000000000000", "o c #9E798E3869A6", "O c #FFFFE38DB6DA", "+ c #CF3CBAEA9658", " ", " ..... ", " ..... ", " ..... ", " ......... ", " XXXXXX....... ", " XooooooX..... ", " XXXXXXoooX...XXXXX ", " XOOOOOOXoooo.ooooooX ", " XO++++++OXXXXXXXXXooX ", " XO+++++++OOOOOOOOOXoX ", " XO+++++++++++++++XoX ", " XO+++++++++++++++XoX ", " XO++++++++++++++++XX ", " XO+++++++++++++++XX ", " XO+++++++++++++++XX ", " XO++++++++++++++++X ", " XO+++++++++++++++X ", " XO+++++++++++++++X ", " XO+++++++++++++++X ", " XXXXXXXXXXXXXXXXX ", " ", " ", " ", " X ", " XXXX X ", " X XXX XXX X X X ", " XXX X X X X X XX ", " X X X X XXX X ", " X X X X X X ", " XXXX X X X XX X ", " "}; wanderlust-wanderlust-769699d/etc/icons/wl-folder-jump-to-current-entity-up.xpm000066400000000000000000000025111406661363500277200ustar00rootroot00000000000000/* XPM */ static char * wl_folder_jump_to_current_entity_up_xpm[] = { "32 32 6 1", " c None", ". c #69A68E38EFBE", "X c #000000000000", "o c #9E798E3869A6", "O c #FFFFE38DB6DA", "+ c #CF3CBAEA9658", " ", " ..... ", " ..... ", " ..... ", " ......... ", " XXXXXX....... ", " XooooooX..... ", " XXXXXXoooX...XXXXX ", " XOOOOOOXoooo.ooooooX ", " XO++++++OXXXXXXXXXooX ", " XO+++++++OOOOOOOOOXoX ", " XO+++++++++++++++XoX ", " XO+++++++++++++++XoX ", " XO++++++++++++++++XX ", " XO+++++++++++++++XX ", " XO+++++++++++++++XX ", " XO++++++++++++++++X ", " XO+++++++++++++++X ", " XO+++++++++++++++X ", " XO+++++++++++++++X ", " XXXXXXXXXXXXXXXXX ", " ", " ", " ", " X ", " XXXX X ", " X XXX XXX X X X ", " XXX X X X X X XX ", " X X X X XXX X ", " X X X X X X ", " XXXX X X X XX X ", " "}; wanderlust-wanderlust-769699d/etc/icons/wl-folder-next-entity-up.xpm000066400000000000000000000030731406661363500256270ustar00rootroot00000000000000/* XPM */ static char * wl_folder_next_unsync_up_xpm[] = { "32 32 18 1", " c None", ". c #000000000000", "X c #8E38C30BFFFF", "o c #59656595C71B", "O c #965896589658", "+ c #596569A6C71B", "@ c #59656DB6CF3C", "# c #596571C6CF3C", "$ c #596575D6CF3C", "% c #618579E7D75C", "& c #61857DF7D75C", "* c #61857DF7DF7D", "= c #61858207DF7D", "- c #69A68A28E79D", "; c #61858617E79D", ": c #69A68E38EFBE", "> c #69A69248EFBE", ", c #69A69658F7DE", " ", " ", " ", " ", " ..... ", " .Xoo.O ", " .Xoo.O ", " .X++.O ", " .X@@.O ", " .X##.O ", " .X$$.O ", " .X%%.O ", " .X&&.O ", " .X**.O ", " ......X==...... ", " .X-;;;;;;;;;.OO ", " .X--------.OO ", " .X::::::.OO ", " .X>>>>.OO ", " .X,,.OO ", " .X.OO ", " .OO ", " OO ", " ", " . ", " . . . ", " .. . . . . ... ", " . . . . . . . . ", " . . . ... .. . ", " . .. . . . . ", " . . .. . . . ", " "}; wanderlust-wanderlust-769699d/etc/icons/wl-folder-prev-entity-up.xpm000066400000000000000000000030771406661363500256310ustar00rootroot00000000000000/* XPM */ static char * wl_folder_previous_unsync_up_xpm[] = { "32 32 18 1", " c None", ". c #000000000000", "X c #8E38C30BFFFF", "o c #69A69658F7DE", "O c #69A69248EFBE", "+ c #69A68E38EFBE", "@ c #69A68A28E79D", "# c #61858617E79D", "$ c #61858207DF7D", "% c #965896589658", "& c #61857DF7DF7D", "* c #61857DF7D75C", "= c #618579E7D75C", "- c #596575D6CF3C", "; c #596571C6CF3C", ": c #59656DB6CF3C", "> c #596569A6C71B", ", c #59656595C71B", " ", " ", " ", " ", " . ", " .X. ", " .Xoo. ", " .XOOOO. ", " .X++++++. ", " .X@@@@@@@@. ", " .X@#########. ", " ......X$$...... ", " %%%%.X&&.%%%%% ", " .X**.% ", " .X==.% ", " .X--.% ", " .X;;.% ", " .X::.% ", " .X>>.% ", " .X,,.% ", " .X,,.% ", " .....% ", " %%%%% ", " ", " ", " ... ", " . . . . . . . ", " . . .. . . . . ", " ... . ... . . ", " . . . . . ", " . . .. . ", " "}; wanderlust-wanderlust-769699d/etc/icons/wl-folder-read-up.xpm000066400000000000000000000031601406661363500242470ustar00rootroot00000000000000/* XPM */ static char * wl_folder_jump_to_current_entity_up_xpm[] = { "32 32 20 1", " c None", ". c #000000000000", "X c #8E38C30BFFFF", "o c #8617BEFBF7DE", "O c #8617BAEAF7DE", "+ c #8617B6DAF7DE", "@ c #FFFFFFFFFFFF", "# c #79E7AEBAEFBE", "$ c #79E7AEBAF7DE", "% c #79E7B2CAF7DE", "& c #79E7A699EFBE", "* c #79E7AAAAEFBE", "= c #71C6A289EFBE", "- c #71C69E79EFBE", "; c #71C69A69E79D", ": c #69A69658E79D", "> c #69A69248E79D", ", c #69A68A28E79D", "< c #965896589658", "1 c #AEBAAEBAAEBA", " ", " ", " .... ", " ..XXXX.. ", " .XoO+++Oo. ", " .Xo+@@#$%+o. ", " .Xo+$@@&&*$+o. ", " .XO%*=-;-=*%O. ", " .X+$&-:>:-&$+. ", " .X+#&;>,>;&#+. ", " ..X$&-:>:-&$.. ", " .<.%*=-;-=*.<. ", " .1..*&&&..1.< ", " .@@....11.<< ", " ..@@@1..<< ", " <.....<<< ", " <..<<<<<< ", " <..<<<< ", " <..<< ", " <..< ", " <..<< ", " @@.< ", " <<<< ", " <<<< ", " < . ", " ... . ", " . . . .. ... ", " . . . . . . . ", " ... ... ... . . ", " . . . . . . . ", " . . .. .. . ... ", " "}; wanderlust-wanderlust-769699d/etc/icons/wl-folder-select-entity-up.xpm000066400000000000000000000031601406661363500261250ustar00rootroot00000000000000/* XPM */ static char * wl_folder_select_entity_up_xpm[] = { "32 32 20 1", " c #BEFBBEFBBEFB", ". c #000000000000", "X c #8E38C30BFFFF", "o c #8617BEFBF7DE", "O c #8617BAEAF7DE", "+ c #8617B6DAF7DE", "@ c #FFFFFFFFFFFF", "# c #79E7AEBAEFBE", "$ c #79E7AEBAF7DE", "% c #79E7B2CAF7DE", "& c #79E7A699EFBE", "* c #79E7AAAAEFBE", "= c #71C6A289EFBE", "- c #71C69E79EFBE", "; c #71C69A69E79D", ": c #69A69658E79D", "> c #69A69248E79D", ", c #69A68A28E79D", "< c #965896589658", "1 c #AEBAAEBAAEBA", " ", " ", " .... ", " ..XXXX.. ", " .XoO+++Oo. ", " .Xo+@@#$%+o. ", " .Xo+$@@&&*$+o. ", " .XO%*=-;-=*%O. ", " .X+$&-:>:-&$+. ", " .X+#&;>,>;&#+. ", " ..X$&-:>:-&$.. ", " .<.%*=-;-=*.<. ", " .1..*&&&..1.< ", " .@@....11.<< ", " ..@@@1..<< ", " <.....<<< ", " <..<<<<<< ", " <..<<<< ", " <..<< ", " <..< ", " <..<< ", " @@.< ", " <<<< ", " <<<< ", " < ", " .... ", " . .. .. .... ", " . . . . . . . . ", " . . . . . . . . ", " . . . . . . . . ", " .... .. .. . . . ", " "}; wanderlust-wanderlust-769699d/etc/icons/wl-folder-sync-current-entity-up.xpm000066400000000000000000000031551406661363500273060ustar00rootroot00000000000000/* XPM */ static char * wl_folder_sync_current_entity_up_xpm[] = { "32 32 20 1", " c None", ". c #000000000000", "X c #FFFFE38DB6DA", "o c #E79DCB2B9E79", "O c #B6DAA6998617", "+ c #CF3CBAEA9658", "@ c #514471C6FFFF", "# c #59656DB6EFBE", "$ c #618569A6DF7D", "% c #69A66595D75C", "& c #79E76185C71B", "* c #AEBAAAAAAEBA", "= c #86175D75BEFB", "- c #96585965AEBA", "; c #9E7955559E79", ": c #A69951448E38", "> c #C71BC30BC71B", ", c #AEBA4D348617", "< c #BEFB492471C6", "1 c #C71B492469A6", " ", " ", " ", " ............ ", " ...XXXXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXX. ", " .XXXXXXXXXXXXXXXXXX. ", " ....XXXXXXXXXXXX.... ", " .ooo............OOO. ", " .ooo++++++++++++OOO. ", " .ooo++++++++++++OOO. ", " .ooo++++++++++++OOO. ", " .ooo+++++@@+++++OOO. ", " .ooo++++####++++OOO. ", " .ooo+++$$$$$$+++OOO. ", " .ooo++%%%%%%%%++OOO. ", " .ooo++++&&&&+++++OO. ", " *...++++====++++...*** ", " ****....----....******* ", " *******;;;;************ ", " **::::::::********* ", " >>,,,,,,********* ", " <<<< ", " 11 ", " ", " ... ", " . . . ... .. ", " ... . . . . . ", " . . . . . . ", " . .. . . . ", " ... . . . .. ", " . "}; wanderlust-wanderlust-769699d/etc/icons/wl-folder-zoom-entity-up.xpm000066400000000000000000000031471406661363500256370ustar00rootroot00000000000000/* XPM */ static char * wl_folder_select_entity_up_xpm[] = { "32 32 20 1", " c None", ". c #000000000000", "X c #8E38C30BFFFF", "o c #8617BEFBF7DE", "O c #8617BAEAF7DE", "+ c #8617B6DAF7DE", "@ c #FFFFFFFFFFFF", "# c #79E7AEBAEFBE", "$ c #79E7AEBAF7DE", "% c #79E7B2CAF7DE", "& c #79E7A699EFBE", "* c #79E7AAAAEFBE", "= c #71C6A289EFBE", "- c #71C69E79EFBE", "; c #71C69A69E79D", ": c #69A69658E79D", "> c #69A69248E79D", ", c #69A68A28E79D", "< c #965896589658", "1 c #AEBAAEBAAEBA", " ", " ", " .... ", " ..XXXX.. ", " .XoO+++Oo. ", " .Xo+@@#$%+o. ", " .Xo+$@@&&*$+o. ", " .XO%*=-;-=*%O. ", " .X+$&-:>:-&$+. ", " .X+#&;>,>;&#+. ", " ..X$&-:>:-&$.. ", " .<.%*=-;-=*.<. ", " .1..*&&&..1.< ", " .@@....11.<< ", " ..@@@1..<< ", " <.....<<< ", " <..<<<<<< ", " <..<<<< ", " <..<< ", " <..< ", " <..<< ", " @@.< ", " <<<< ", " <<<< ", " < ", " .... ", " . .. .. .... ", " . . . . . . . . ", " . . . . . . . . ", " . . . . . . . . ", " .... .. .. . . . ", " "}; wanderlust-wanderlust-769699d/etc/icons/wl-message-extract-content-up.xpm000066400000000000000000000025551406661363500266360ustar00rootroot00000000000000/* XPM */ static char * wl_message_extract_content_up_xpm[] = { "32 32 8 1", " c None", ". c #000000000000", "X c #FFFFE38DB6DA", "o c #E79DCB2B9E79", "O c #B6DAA6998617", "+ c #CF3CBAEA9658", "@ c #514471C6FFFF", "# c #AEBAAAAAAEBA", " ", " ", " ", " ............ ", " ...XXXXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXX. ", " .XXXXXXXXXXXXXXXXXX. ", " ....XXXXXXXXXXXX.... ", " .ooo............OOO. ", " .ooo++++++++++++OOO. ", " .ooo+++++++@++++OOO. ", " .ooo++++++@@++++OOO. ", " .ooo+++++@@@@@@@@@O@@ @@ @@ ", " .ooo++++@@@@@@@@@@O@@ @@ @@ ", " .ooo++++@@@@@@@@@@O@@ @@ @@ ", " .ooo+++++@@@@@@@@@O@@ @@ @@ ", " .ooo++++++@@++++OOO. ", " .ooo+++++++@++++OOO.## ", " .ooo++++++++++++OO+.#### ", " ...++++++++++++...##### ", " ............####### ", " ############## ", " ", " ", " . . ", " .... . . ", " . . . .... ... .. ... ", " ... . . . .. . . . ", " . .. . . ... . . ", " . . . . . . . . . ", " .... . . . . .. . .. . ", " "}; wanderlust-wanderlust-769699d/etc/icons/wl-message-next-content-up.xpm000066400000000000000000000030731406661363500261360ustar00rootroot00000000000000/* XPM */ static char * wl_folder_next_unsync_up_xpm[] = { "32 32 18 1", " c None", ". c #000000000000", "X c #8E38C30BFFFF", "o c #59656595C71B", "O c #965896589658", "+ c #596569A6C71B", "@ c #59656DB6CF3C", "# c #596571C6CF3C", "$ c #596575D6CF3C", "% c #618579E7D75C", "& c #61857DF7D75C", "* c #61857DF7DF7D", "= c #61858207DF7D", "- c #69A68A28E79D", "; c #61858617E79D", ": c #69A68E38EFBE", "> c #69A69248EFBE", ", c #69A69658F7DE", " ", " ", " ", " ", " ..... ", " .Xoo.O ", " .Xoo.O ", " .X++.O ", " .X@@.O ", " .X##.O ", " .X$$.O ", " .X%%.O ", " .X&&.O ", " .X**.O ", " ......X==...... ", " .X-;;;;;;;;;.OO ", " .X--------.OO ", " .X::::::.OO ", " .X>>>>.OO ", " .X,,.OO ", " .X.OO ", " .OO ", " OO ", " ", " . ", " . . . ", " .. . . . . ... ", " . . . . . . . . ", " . . . ... .. . ", " . .. . . . . ", " . . .. . . . ", " "}; wanderlust-wanderlust-769699d/etc/icons/wl-message-play-content-up.xpm000066400000000000000000000025001406661363500261170ustar00rootroot00000000000000/* XPM */ static char * wl_message_play_content_up_xpm[] = { "32 32 6 1", " c None", ". c #000000000000", "X c #BEFBBEFBBEFB", "o c #69A669A669A6", "O c #9E799A699E79", "+ c #D75C5D755965", " ", " ", " ", " ", " ............ ", " .XXXXXXXXXXXo. ", " .. .XOOOOOOOOOOo. ", " .. .XOOOOOO........ ", " .X..XOOOOOO.XXOOOO. ", " .O..XOOOOOO.oooooo. ", " .o..XOOOOOO........ ", " .o..XOOOOOOOOOOo. ", " .o..XOOOOOOOOOOo. ", " .. .XOOOOOOOOOOo. ", " .. .XOOOOOOOOOOo. ", " .oooooooooooo. ", " ............ + ", " ++ ", " ++ ++ ++ +++++++++ ", " ++ ++ ++ ++++++++++ ", " ++ ++ ++ ++++++++++ ", " ++ ++ ++ +++++++++ ", " ++ ", " + ", " . ", " ... . ", " . . . .. . . ", " . . . . . . ", " ... . ... . . ", " . . . . .. ", " . . .. . . ", " . "}; wanderlust-wanderlust-769699d/etc/icons/wl-message-prev-content-up.xpm000066400000000000000000000030771406661363500261400ustar00rootroot00000000000000/* XPM */ static char * wl_folder_previous_unsync_up_xpm[] = { "32 32 18 1", " c None", ". c #000000000000", "X c #8E38C30BFFFF", "o c #69A69658F7DE", "O c #69A69248EFBE", "+ c #69A68E38EFBE", "@ c #69A68A28E79D", "# c #61858617E79D", "$ c #61858207DF7D", "% c #965896589658", "& c #61857DF7DF7D", "* c #61857DF7D75C", "= c #618579E7D75C", "- c #596575D6CF3C", "; c #596571C6CF3C", ": c #59656DB6CF3C", "> c #596569A6C71B", ", c #59656595C71B", " ", " ", " ", " ", " . ", " .X. ", " .Xoo. ", " .XOOOO. ", " .X++++++. ", " .X@@@@@@@@. ", " .X@#########. ", " ......X$$...... ", " %%%%.X&&.%%%%% ", " .X**.% ", " .X==.% ", " .X--.% ", " .X;;.% ", " .X::.% ", " .X>>.% ", " .X,,.% ", " .X,,.% ", " .....% ", " %%%%% ", " ", " ", " ... ", " . . . . . . . ", " . . .. . . . . ", " ... . ... . . ", " . . . . . ", " . . .. . ", " "}; wanderlust-wanderlust-769699d/etc/icons/wl-message-quit-up.xpm000066400000000000000000000025141406661363500244710ustar00rootroot00000000000000/* XPM */ static char * wl_folder_quit_up_xpm[] = { "32 32 7 1", " c None", ". c #000000000000", "X c #FFFFE38DB6DA", "o c #CF3CBAEA9658", "O c #AEBAB2CAAEBA", "+ c #B6DA965869A6", "@ c #69A68E38EFBE", " ", " ", " ", " ........... ", " .XXooooooo.OO ", " .X.......o.OO ", " .o.++++X.o.OO ", " .o.+oooX.o.OO ", " @ .o.+oooX.o.OO ", " @@ .o.+oooX.o.OO ", " @@@@@@@@@ .o.XXXXX.o.OO ", " @@@@@@@@@@ .o.......o.OO ", " @@@@@@@@@@@.XXooooooo.OO ", " @@@@@@@@@@O.XXooooooo.OO ", " @@@@@@@@@OO.o.......o.OO ", " OOOOOO@@OO .o.++++X.o.OO ", " OOOOOO@OO .o.+oooX.o.OO ", " OO .o.+oooX.o.OO ", " O .o.+oooX.o.OO ", " O .o.XXXXX.o.OO ", " .o.......o.OO ", " .ooooooooo.OO ", " ...........OO ", " OOOOOOOOOOOO ", " . . ", " .... . ", " . . . . ... ", " ... . . . . ", " . .. . . ", " . . . . . ", " .... . . . . ", " "}; wanderlust-wanderlust-769699d/etc/icons/wl-message-read-up.xpm000066400000000000000000000031601406661363500244200ustar00rootroot00000000000000/* XPM */ static char * wl_folder_jump_to_current_entity_up_xpm[] = { "32 32 20 1", " c None", ". c #000000000000", "X c #8E38C30BFFFF", "o c #8617BEFBF7DE", "O c #8617BAEAF7DE", "+ c #8617B6DAF7DE", "@ c #FFFFFFFFFFFF", "# c #79E7AEBAEFBE", "$ c #79E7AEBAF7DE", "% c #79E7B2CAF7DE", "& c #79E7A699EFBE", "* c #79E7AAAAEFBE", "= c #71C6A289EFBE", "- c #71C69E79EFBE", "; c #71C69A69E79D", ": c #69A69658E79D", "> c #69A69248E79D", ", c #69A68A28E79D", "< c #965896589658", "1 c #AEBAAEBAAEBA", " ", " ", " .... ", " ..XXXX.. ", " .XoO+++Oo. ", " .Xo+@@#$%+o. ", " .Xo+$@@&&*$+o. ", " .XO%*=-;-=*%O. ", " .X+$&-:>:-&$+. ", " .X+#&;>,>;&#+. ", " ..X$&-:>:-&$.. ", " .<.%*=-;-=*.<. ", " .1..*&&&..1.< ", " .@@....11.<< ", " ..@@@1..<< ", " <.....<<< ", " <..<<<<<< ", " <..<<<< ", " <..<< ", " <..< ", " <..<< ", " @@.< ", " <<<< ", " <<<< ", " < . ", " ... . ", " . . . .. ... ", " . . . . . . . ", " ... ... ... . . ", " . . . . . . . ", " . . .. .. . ... ", " "}; wanderlust-wanderlust-769699d/etc/icons/wl-stable-logo.xbm000066400000000000000000001352001406661363500236340ustar00rootroot00000000000000#define wl_stable_logo_width 464 #define wl_stable_logo_height 160 static char wl_stable_logo_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xa2,0xa8, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x14,0x04,0x2a,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x28,0xa1,0xa2,0x80,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x80,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x24,0x85,0x08,0x10,0x2a,0x28,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x80,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x49,0x28,0xa5,0x8a,0x80,0x82,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x6d, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x40,0x24,0x45,0x48,0x40,0x2a,0x24,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x76,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x92, 0x10,0x85,0x2a,0x80,0x08,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x6b,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x48,0x24,0xa5,0x28, 0x80,0x2a,0x42,0x44,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x7d,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x22,0x49,0x12,0x82,0x2a,0x80, 0x28,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x80,0xb7,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x55,0x92,0xa4,0x54,0x00,0x25,0x02,0x54, 0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x6d,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x94,0x08,0x09,0x11,0x82,0xaa,0x88,0x90,0x00,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa0,0xbb,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x51,0x52,0x52,0xa4,0x28,0x00,0x22,0x44,0x24,0x21,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x6d, 0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x8a,0x8a,0x24,0x09,0x85,0xaa,0x08,0x11,0x02,0x84,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0xb7,0x6b,0x00, 0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x29,0x29, 0x89,0xa4,0x28,0x01,0xa2,0x84,0xa8,0x10,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0x6d,0x7d,0x00,0x00,0x00, 0x00,0x00,0xa0,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0xa4,0xa4,0x50,0x12, 0x12,0xaa,0x08,0x50,0x00,0x82,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xb5,0xdb,0x76,0x00,0x00,0x00,0x00,0x00, 0x58,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x12,0x49,0x0a,0x49,0xa1,0x00, 0x42,0x05,0x92,0x20,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xc0,0xdf,0xb6,0x3b,0x00,0x00,0x00,0x00,0x00,0x6a,0x35, 0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0xaa,0x92,0xa2,0x20,0x0a,0xaa,0x28,0xa0, 0x04,0x88,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x78,0xb5,0x6d,0x3d,0x00,0x00,0x00,0x00,0x00,0xad,0x6a,0x00,0x00, 0x00,0x00,0x00,0x40,0x25,0x49,0x48,0x14,0x95,0x50,0x01,0x82,0x0a,0xa0,0x02, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd6,0x6e,0xdb,0x36,0x00,0x00,0x00,0x00,0x00,0x55,0x6b,0x00,0x00,0x00,0x00, 0x00,0x80,0xa8,0x24,0x95,0xa2,0x68,0x0f,0xa8,0x28,0xa0,0x0a,0x28,0x11,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x7a,0xdb, 0xbd,0x3b,0x00,0x00,0x00,0x00,0xc0,0x6a,0xd5,0x00,0x00,0x00,0x00,0x00,0x50, 0x95,0x92,0x42,0xfc,0x1f,0xc0,0x0f,0x82,0x0a,0x20,0x01,0x24,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0xd7,0x76,0x6b,0x1d, 0x00,0x00,0x00,0x00,0x40,0xab,0xea,0x00,0x00,0x00,0x00,0x00,0x24,0x49,0x4a, 0xe9,0x0f,0x00,0x00,0xe0,0x28,0x90,0x04,0x90,0x60,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0xbd,0xdb,0xb6,0x1f,0x00,0x00, 0x00,0x00,0x50,0x55,0xd5,0x00,0x00,0x00,0x00,0x00,0x90,0x24,0x29,0x7e,0x00, 0x00,0x00,0x00,0x86,0x42,0x50,0x05,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xd7,0xd7,0xb6,0x6d,0x1d,0x00,0x00,0x00,0x00, 0xa0,0xda,0xf6,0x00,0x00,0x00,0x00,0x00,0xaa,0xaa,0xd4,0x07,0x00,0x00,0x00, 0x00,0x30,0x10,0x02,0xa0,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0xba,0x7a,0x6f,0xb7,0x0f,0x00,0x00,0x00,0x00,0x70,0xab, 0x6a,0x00,0x00,0x00,0x00,0x80,0x4a,0x92,0xfa,0x00,0x00,0x00,0x00,0x00,0x00, 0x45,0x11,0x09,0x82,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0, 0x01,0x5e,0xdf,0xd7,0xba,0xdb,0x0e,0x00,0x00,0x00,0x00,0x58,0x55,0x75,0x00, 0x00,0x00,0x00,0x40,0x29,0x49,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x44, 0x20,0x20,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xfe,0xf5, 0x6b,0xbd,0x6d,0x6d,0x07,0x00,0x00,0x00,0x00,0x56,0xad,0x75,0x00,0x00,0x00, 0x00,0x50,0x4a,0xd5,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x10,0x04,0x09, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xab,0x5e,0xbd,0x6b, 0xb7,0xbb,0x07,0x00,0x00,0x00,0x00,0xaa,0x55,0x75,0x00,0x00,0x00,0x00,0x48, 0xa5,0xf4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x42,0x41,0x80,0x02,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xfe,0xeb,0x6e,0xdd,0xdb,0xed, 0x03,0x00,0x00,0x00,0x00,0xb5,0xb6,0x3a,0x00,0x00,0x00,0x00,0xa0,0x54,0x3e, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x08,0x14,0x25,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xab,0xbe,0xf5,0x77,0xbd,0xda,0x01,0x00, 0x00,0x00,0x80,0x56,0xd5,0x3a,0x00,0x00,0x00,0x00,0x54,0x92,0x0f,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x80,0xfe,0xeb,0xaf,0xda,0xd6,0xf7,0x00,0x00,0x00,0x00, 0x80,0x6a,0x55,0x1d,0x00,0x00,0x00,0x00,0x95,0xca,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x28,0x92,0x28,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xab,0xbe,0xda,0x6f,0x7b,0x7d,0x00,0x00,0x00,0x00,0xa0,0xad, 0xaa,0x1e,0x00,0x00,0x00,0x00,0x55,0xf5,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xfe,0xd7,0xbf,0xba,0xad,0x3b,0x00,0x00,0x00,0x00,0x60,0xd5,0xb6,0x0e, 0x00,0x00,0x00,0x80,0x92,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x50,0x49,0x88,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab, 0xfa,0x6a,0xd7,0xd7,0x1e,0x00,0x00,0x00,0x00,0xa0,0x5a,0x55,0x0f,0x00,0x00, 0x00,0xa0,0x54,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10, 0x20,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x5f,0xff, 0xbb,0x7a,0x0f,0x00,0x00,0x00,0x00,0x58,0xab,0xaa,0x07,0x00,0x00,0x00,0x90, 0x92,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x84,0x82,0x08, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0xea,0x55,0xed,0xde, 0x07,0x00,0x00,0x00,0x00,0xa8,0xd5,0xb6,0x03,0x00,0x00,0x00,0x48,0xd5,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x18,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0x7f,0xbb,0xb7,0xeb,0x01,0x00, 0x00,0x00,0x00,0x68,0x6d,0xd5,0x01,0x00,0x00,0x00,0xa4,0xf4,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x85,0x40,0x1a,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0xd5,0x6e,0x6d,0xfd,0x00,0x00,0x00,0x00, 0x00,0xac,0xaa,0xea,0x00,0x00,0x00,0x00,0xa8,0x7a,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x12,0x18,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf0,0xbf,0xdb,0xbb,0x3f,0x00,0x00,0x00,0x00,0x00,0xd6, 0x56,0x7b,0x00,0x00,0x00,0x00,0x2a,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x41,0x00,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xb0,0xea,0xbd,0x6e,0x0f,0x00,0x00,0x00,0x00,0x00,0x5a,0xb5,0x3a, 0x00,0x00,0x00,0x00,0x55,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x08,0x49,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc0,0x7f,0xeb,0xf5,0x03,0x00,0x00,0x00,0x00,0x00,0x6b,0xab,0x1d,0x00,0x00, 0x00,0x40,0xa5,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x22,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xaa, 0x5f,0xef,0x01,0x00,0x00,0x00,0x00,0x80,0x55,0xb5,0x0e,0x00,0x00,0x00,0x40, 0xd5,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x24, 0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xf5,0x7a, 0x00,0x00,0x00,0x00,0x00,0x80,0xb6,0xad,0x07,0x00,0x00,0x00,0x50,0xe9,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0x36,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0xaf,0x3f,0x00,0x00, 0x00,0x00,0x00,0xc0,0x5a,0xd5,0x03,0x00,0x00,0x00,0xa0,0x7a,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x39,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0x1e,0x00,0x00,0x00,0x00, 0x00,0x40,0xd5,0xea,0x01,0x00,0x00,0x00,0x28,0x3d,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0x00,0x35,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xd4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x07,0x00,0x00,0x00,0x00,0x00,0x70, 0x57,0xfd,0x00,0x00,0x00,0x00,0x54,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x10,0xa4,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x88,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfa,0x07,0x00,0x00,0x00,0x00,0x00,0xa0,0x6a,0x3b, 0x00,0x00,0x00,0x00,0x54,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x41,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa2,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xdc,0x01,0x00,0x00,0x00,0x00,0x00,0xb0,0xb5,0x1e,0x00,0x00, 0x00,0x00,0xaa,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x08,0xa4,0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x94,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xeb,0x01,0x00,0x00,0x00,0x00,0x00,0xd8,0xae,0x0f,0x00,0x00,0x00,0x00, 0xa5,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42, 0x50,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc2,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xfe, 0x00,0x00,0x00,0x00,0x00,0x00,0x54,0xd5,0x03,0x00,0x00,0x00,0x80,0xea,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x42,0x75, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x94,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x7b,0x00,0x00, 0x00,0x00,0x00,0x00,0xa8,0xf5,0x01,0x00,0x00,0x00,0x40,0xf5,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x58,0x35,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xc8,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x3e,0x00,0x00,0x00,0x00, 0x00,0x00,0x6e,0xed,0x00,0x00,0x00,0x00,0x40,0x75,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x35,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x80,0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x1f,0x00,0x00,0x00,0x00,0x00,0x00, 0xb4,0x76,0x00,0x00,0x00,0x00,0xa0,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x14,0xa8,0x3a,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xd0,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x75, 0x00,0x00,0x00,0x00,0x50,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x40,0x56,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x80,0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18, 0x00,0x00,0x00,0xf8,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xdd,0x3a,0x00,0x00, 0x00,0x00,0xa8,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa9,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0xc8, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x1c,0x00,0x00, 0x00,0xa8,0x03,0x00,0x00,0x00,0x00,0x00,0x80,0x6a,0x3d,0x00,0x00,0x00,0x00, 0x50,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x28,0xaa,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xe5,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x0c,0x00,0x00,0x00,0xf4, 0x03,0x00,0x00,0x00,0x00,0x00,0x80,0x56,0x1b,0x00,0x00,0x00,0x00,0xac,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55, 0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x70,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0xdc,0x01,0x00, 0x00,0x00,0x00,0x00,0x40,0xb5,0x1d,0x00,0x00,0x00,0x00,0xa4,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x55,0x1d,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x75,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0x00, 0x00,0x00,0xa0,0xad,0x0e,0x00,0x00,0x00,0x00,0xda,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0xaa,0x0e,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x48,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x92,0x07,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00, 0xd0,0xd6,0x0e,0x00,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0xaa,0x0e,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x15,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x03,0x00,0x00,0x80,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x6b, 0x0f,0x00,0x00,0x00,0x80,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x48,0x55,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x40,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4, 0x01,0x00,0x00,0x80,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x6a,0x5d,0x07,0x00, 0x00,0x00,0x40,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0x55,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x95, 0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xe0,0x00,0x00, 0x00,0xc0,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0xbd,0xaa,0x07,0x00,0x00,0x00, 0x80,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa0,0x2a,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x48,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x60, 0x0f,0x00,0x00,0x00,0x00,0x00,0x40,0xd5,0x6d,0x03,0x00,0x00,0x00,0x40,0x1d, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54, 0x95,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x32,0x00,0x00,0x00,0xb0,0x0f,0x00, 0x00,0x00,0x00,0x00,0xa0,0xaf,0xb6,0x03,0x00,0x00,0x00,0x40,0x1d,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x95,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xc9,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x80,0x01,0x00,0x00,0x38,0x00,0x00,0x00,0xd8,0x07,0x00,0x00,0x00, 0x00,0x00,0xd8,0x76,0xd5,0x03,0x00,0x00,0x00,0xb0,0x0e,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0xc5,0x01,0x00,0x00, 0x00,0x00,0xa0,0x00,0x00,0x00,0xd2,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd0,0x01,0x00,0x00,0x1d,0x00,0x00,0x00,0xe8,0x03,0x00,0x00,0x00,0x00,0x00, 0xe8,0xab,0xdb,0x01,0x00,0x00,0x00,0x40,0x07,0x00,0x00,0x38,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0xc5,0x01,0x00,0x50,0x01,0x00, 0xa8,0x01,0x00,0x40,0xe9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x00, 0x00,0x20,0x0e,0x00,0x00,0x00,0xb8,0x03,0x00,0x00,0x00,0x00,0x00,0xde,0x5f, 0xd5,0x01,0x00,0x00,0x00,0xb0,0x07,0x00,0x00,0x56,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x54,0xd1,0x00,0x00,0x8a,0x0a,0x00,0xe2,0x01, 0x00,0x50,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x08, 0x07,0x00,0x00,0x00,0xee,0x01,0x00,0x00,0x00,0x00,0x00,0xf5,0xea,0xee,0x01, 0x00,0x00,0x00,0x94,0x03,0x00,0x00,0xfa,0x00,0x00,0x00,0x18,0x00,0x00,0x00, 0x00,0x00,0x40,0x15,0x55,0xe1,0x00,0x00,0x69,0x1a,0x00,0xe8,0x00,0x00,0x80, 0x3a,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x80,0x44,0x00,0x10,0x81,0x03,0x00, 0x00,0x00,0xfd,0x00,0x00,0x00,0x00,0x00,0xc0,0x7b,0x55,0xd5,0x00,0x00,0x00, 0x00,0xd4,0x03,0x00,0x00,0xd6,0x01,0x00,0x00,0x6a,0x00,0x00,0x00,0x00,0x00, 0xe8,0x0f,0xaa,0x70,0x00,0xa0,0x94,0x1a,0x00,0x6b,0x00,0x00,0x50,0x1c,0x00, 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x90,0x00,0x00,0x04,0x00,0x00,0x00,0x00, 0xef,0x00,0x00,0x00,0x00,0x00,0xa0,0x1e,0xdd,0xb6,0x00,0x00,0x00,0x00,0xd4, 0x01,0x00,0xff,0xed,0x01,0x00,0x80,0xf6,0x00,0x00,0x00,0x00,0x00,0xfd,0x00, 0x55,0x74,0x00,0xa0,0x57,0x1a,0x80,0x48,0x00,0x00,0x28,0x0f,0x00,0x40,0xd5, 0x00,0x00,0x00,0x00,0x40,0x42,0x01,0x44,0x20,0x00,0x0f,0x00,0x80,0x7a,0x00, 0x00,0x00,0x00,0x00,0x68,0x8f,0x6a,0xdb,0x01,0x00,0x00,0x00,0xea,0x00,0xf0, 0x7a,0xf7,0x01,0x00,0x80,0x6d,0x00,0x2c,0x00,0x00,0xc0,0x1e,0x00,0x15,0x31, 0x00,0xc8,0xa1,0x1a,0x40,0x25,0x01,0x00,0x80,0x07,0x00,0x00,0xe0,0x00,0x00, 0x15,0x00,0x10,0x00,0x02,0x00,0x01,0xf2,0x03,0x00,0xc0,0x7f,0x00,0x00,0x00, 0x00,0x00,0xb4,0x07,0x5b,0xd5,0x01,0x00,0x00,0x00,0xea,0x00,0xd4,0xc7,0xed, 0x00,0x00,0x60,0x7b,0x00,0xd7,0x00,0x00,0xb0,0x07,0x00,0x15,0x38,0x00,0x64, 0x50,0x1d,0x20,0x95,0x02,0x00,0xd4,0x03,0x00,0x40,0x75,0x00,0x40,0x30,0x00, 0x00,0x29,0x06,0x70,0xf0,0x7f,0x00,0x00,0xa0,0x3a,0x00,0x00,0x00,0x00,0x00, 0xdb,0x83,0xd6,0xb6,0x01,0x00,0x00,0x00,0x75,0x00,0xff,0x40,0x7b,0x00,0x00, 0xb0,0x7d,0xc0,0xf5,0x00,0x00,0xd4,0x03,0x80,0x4a,0x1d,0x00,0x1d,0x90,0x0e, 0xa0,0x52,0x18,0x00,0xe0,0x01,0x00,0x20,0x70,0x00,0x00,0x3a,0x00,0x40,0x80, 0x04,0x00,0x34,0x00,0x00,0x00,0xe0,0x3f,0x00,0x00,0x00,0x00,0x80,0xf6,0x80, 0x6d,0x5b,0x03,0x00,0x00,0x00,0x75,0xc0,0x7a,0x80,0x5d,0x00,0x00,0xd0,0x3a, 0x40,0xad,0x01,0x00,0xea,0x01,0x00,0x05,0x0c,0x80,0x0e,0x50,0x07,0x20,0x49, 0x35,0x00,0x74,0x00,0x00,0x48,0x3d,0x00,0xa0,0x18,0x00,0xc0,0x04,0x0c,0x80, 0x38,0x00,0x00,0x00,0x50,0x1d,0x00,0x00,0x00,0x00,0x80,0x7d,0xc0,0xb6,0xaa, 0x03,0x00,0x00,0x00,0x35,0x60,0x1f,0x00,0xeb,0x01,0x00,0x6c,0x1f,0xb0,0xd6, 0x01,0x00,0xed,0x00,0xc0,0x22,0x0e,0x40,0x0e,0xa0,0x03,0x90,0x2a,0x35,0x00, 0x3a,0x00,0x00,0x10,0x1e,0x00,0x10,0x1e,0x00,0x20,0x40,0x08,0x00,0x18,0x00, 0x00,0x00,0xf8,0x1f,0x00,0x00,0x00,0x00,0xf0,0x3e,0x40,0x5b,0xdb,0x06,0x00, 0x00,0x00,0x3d,0xd8,0x1d,0x80,0x5e,0x03,0x00,0xb8,0x1d,0x68,0xdb,0x01,0x00, 0x75,0x00,0x40,0x09,0x07,0x40,0x07,0xd4,0x01,0xc0,0xa5,0x38,0x00,0x39,0x00, 0x00,0xa2,0x07,0x00,0x88,0x0e,0x00,0x08,0x12,0x19,0x00,0x1d,0x00,0x00,0x00, 0x6c,0x1d,0x00,0x00,0x00,0x00,0x50,0x0f,0x40,0xed,0xad,0x06,0x00,0x00,0xc0, 0x1a,0x74,0x0f,0x00,0xb5,0x07,0x00,0xd6,0x0e,0xb4,0xad,0x01,0x80,0x75,0x00, 0x40,0x81,0x03,0x40,0x03,0xf5,0x00,0x04,0x94,0x1e,0x00,0x1c,0x00,0x00,0xc8, 0x03,0x00,0xa2,0x07,0x00,0x00,0x00,0x18,0x20,0x0c,0x00,0x00,0x00,0xd8,0x0f, 0x00,0x00,0x00,0x00,0xde,0x07,0x80,0xab,0xea,0x0e,0x00,0x00,0x40,0x1d,0xde, 0x07,0x80,0xed,0x06,0x00,0x6d,0x0f,0x72,0xf5,0x01,0xc0,0x3a,0x00,0xa0,0xa4, 0x03,0xa0,0x43,0x3c,0x00,0x00,0x50,0x0e,0x80,0x0e,0x00,0x00,0xe2,0x00,0x00, 0xc4,0x01,0x00,0x00,0x90,0x1c,0x00,0x0e,0x00,0x00,0x00,0xfe,0x0e,0x00,0x00, 0x00,0x00,0xea,0x03,0x40,0xb5,0x36,0x0b,0x00,0x00,0x80,0x0e,0x74,0x07,0x40, 0x5c,0x0f,0x00,0xdb,0x06,0xc8,0x96,0x01,0xa0,0x36,0x00,0x50,0x81,0x01,0x90, 0xaa,0x0f,0x00,0x00,0x80,0x07,0x00,0x0d,0x00,0x00,0x74,0x00,0x00,0xe0,0x00, 0x00,0x00,0x00,0x1c,0x00,0x06,0x00,0x00,0x00,0x55,0x0f,0x00,0x00,0x00,0xc0, 0xfb,0x01,0x80,0x5d,0xdb,0x1d,0x00,0x00,0xe0,0x0e,0xdf,0x07,0x40,0xf0,0x0d, 0x80,0xb6,0x07,0x00,0xeb,0x01,0xa0,0x3a,0x00,0xa8,0xe8,0x00,0x50,0xff,0x00, 0x00,0x00,0xb0,0x03,0x00,0x0c,0x00,0x00,0x71,0x00,0x00,0x75,0x00,0x00,0x00, 0x40,0x0c,0x40,0x06,0x00,0x00,0x00,0xff,0x0d,0x00,0x00,0x00,0xa0,0x76,0x00, 0xc0,0xea,0x55,0x15,0x00,0x00,0x00,0x8f,0x75,0x07,0x20,0xa8,0x0e,0x80,0x6d, 0x07,0x80,0xb5,0x01,0xb0,0x35,0x00,0xa6,0xe2,0x00,0xc8,0x03,0x00,0x00,0x00, 0xc0,0x01,0x80,0x0a,0x00,0x00,0x34,0x00,0x80,0x30,0x00,0x00,0x00,0x00,0x0e, 0x10,0x06,0x00,0x00,0x80,0xb6,0x0f,0x00,0x00,0x00,0x68,0x3f,0x00,0x40,0xaf, 0xb6,0x3a,0x00,0x00,0xe0,0x86,0xbe,0x07,0x10,0xdc,0x0f,0x80,0xb6,0x03,0x80, 0x5e,0x01,0x50,0x6d,0x00,0xd1,0x72,0x00,0xa8,0x01,0x00,0x00,0x00,0xe8,0x00, 0x40,0x12,0x00,0x80,0x32,0x00,0x20,0x34,0x00,0x00,0x00,0x40,0x0e,0x00,0x04, 0x00,0x00,0xc0,0xef,0x0e,0x00,0x00,0x00,0xdc,0x0e,0x00,0x00,0xb5,0xda,0x6d, 0x00,0x00,0x30,0x87,0xd7,0x06,0x0c,0xb4,0x0e,0xd0,0xdb,0x03,0x00,0xd5,0x03, 0xd4,0x6a,0x80,0xaa,0x3a,0x00,0x50,0x03,0x00,0x40,0x00,0x68,0x00,0x08,0x29, 0x00,0x40,0x60,0x00,0x00,0x31,0x00,0x00,0x00,0x00,0x07,0x80,0x0c,0x00,0x00, 0x80,0xba,0x1d,0x00,0x00,0x00,0xeb,0x07,0x00,0x80,0x55,0xab,0x6a,0x00,0x00, 0xc8,0xc3,0xfa,0x0f,0x15,0x7a,0x0f,0x44,0x6d,0x07,0x80,0x6b,0x03,0x52,0xab, 0x69,0xa9,0x1a,0x00,0xa8,0x06,0x00,0x00,0x00,0x6a,0x00,0xa0,0x04,0x00,0x80, 0x8a,0x00,0xa8,0x24,0x00,0x08,0x09,0x00,0x03,0x20,0x10,0x00,0x00,0xe0,0xef, 0x1f,0x00,0x00,0x40,0xdd,0x03,0x00,0x00,0xde,0xb5,0xd6,0x00,0x00,0x50,0xc3, 0x5f,0xf5,0x0b,0xd6,0x06,0x73,0xb7,0x15,0x00,0x5d,0x43,0x59,0xad,0xaa,0xa8, 0x2a,0x00,0x91,0x0a,0x00,0xa8,0x00,0x68,0x80,0x5a,0xaa,0x04,0x20,0x51,0x00, 0x00,0x10,0x80,0x44,0x18,0xa0,0x03,0x08,0x01,0x00,0x08,0x60,0xbb,0x3a,0x00, 0x00,0xa0,0xf7,0x00,0x00,0x00,0xb3,0xae,0xb5,0x01,0x00,0xd0,0xa3,0xea,0x5f, 0x07,0xba,0xcf,0x8c,0xda,0x0e,0x80,0xaa,0xad,0x6f,0xb5,0x6a,0x51,0xab,0xaa, 0x56,0x29,0x00,0x42,0x40,0x65,0x20,0x0e,0x21,0x49,0x24,0x04,0x85,0x4e,0x45, 0x90,0x01,0x12,0xc0,0x01,0x00,0x10,0x00,0x07,0xd0,0xee,0x3f,0x00,0x00,0x70, 0x7d,0x00,0x00,0x00,0xdc,0x6a,0xad,0x01,0x00,0xac,0xe1,0xbf,0xea,0x83,0xef, 0xba,0xe7,0xaf,0x07,0x80,0x6d,0xf5,0xab,0x55,0x75,0x54,0x55,0xd5,0x53,0xa5, 0xaa,0x3c,0x80,0xaa,0x84,0x87,0x4a,0x22,0x5d,0xa9,0x20,0x2f,0x10,0xe5,0x90, 0x30,0xc0,0x00,0x44,0x84,0x80,0x03,0xf0,0xbf,0x6a,0x00,0x00,0xbe,0x1f,0x00, 0x00,0x00,0x54,0xb5,0x55,0x03,0x00,0xd4,0x41,0xd5,0xff,0x81,0x5a,0xef,0x41, 0xf5,0x03,0x00,0x56,0xeb,0xa8,0x6a,0xbb,0x68,0x55,0xd5,0x59,0x55,0x49,0x1e, 0x20,0x49,0xd5,0x43,0x28,0x49,0x0e,0x04,0x94,0x03,0x45,0x70,0x00,0x28,0x68, 0x00,0x10,0x00,0xe8,0x01,0xa8,0xea,0xff,0x00,0x80,0x6a,0x0f,0x00,0x00,0x00, 0xe8,0xae,0xb6,0x06,0x00,0xe8,0xe1,0x7f,0xf5,0x80,0xed,0xfa,0x60,0xdb,0x01, 0x00,0xeb,0x7a,0xd0,0x56,0x1d,0x50,0x55,0xf5,0x40,0x55,0x55,0x0f,0x80,0x24, 0xe9,0x01,0x45,0x92,0x47,0xa9,0xc2,0xa1,0x10,0x3d,0xa0,0x42,0x30,0x00,0x00, 0x11,0x71,0x00,0xf8,0x7f,0x55,0x03,0xd0,0xdf,0x03,0x00,0x00,0x00,0xb0,0xd5, 0xaa,0x0d,0x00,0xd4,0x40,0xd5,0x3f,0x40,0x77,0x3f,0xa0,0xed,0x00,0x00,0x5d, 0x3d,0x50,0x5b,0x0f,0xa5,0xaa,0x7a,0x50,0x95,0xaa,0x07,0x50,0x95,0x74,0x80, 0x12,0xc9,0x03,0x22,0xf0,0x00,0x44,0x0e,0x00,0x10,0x1d,0x00,0x40,0x00,0x3c, 0x00,0xb0,0xd5,0xff,0x1d,0x7e,0xf5,0x01,0x00,0x00,0x00,0x50,0x6d,0x6d,0x0d, 0x00,0xea,0xc0,0xff,0x1e,0xc0,0xad,0x1f,0xc0,0x76,0x00,0x00,0xaa,0x1f,0xb0, 0xaa,0x57,0x50,0x55,0x3d,0xa0,0x54,0xd2,0x01,0x50,0x52,0x3a,0x00,0xa8,0xe4, 0x80,0x88,0x7a,0x40,0x81,0x07,0x20,0x42,0x0e,0x00,0x00,0x49,0x0e,0x00,0x7c, 0x7f,0x55,0xef,0xd5,0x7e,0x00,0x00,0x00,0x00,0xc0,0xb6,0xb6,0x1a,0x00,0xf4, 0x80,0xaa,0x07,0x80,0xf6,0x07,0x80,0x3d,0x00,0x00,0xb6,0x07,0x40,0xed,0x83, 0x7c,0xab,0x0e,0x40,0x53,0xf5,0x00,0x20,0xa9,0x1e,0x00,0x04,0x7a,0x00,0x44, 0x1e,0x00,0xd4,0x03,0x80,0x88,0x07,0x00,0x00,0x80,0x07,0x00,0xd4,0xdb,0xff, 0x5b,0xbb,0x3d,0x00,0x00,0x00,0x00,0x60,0xd5,0xd5,0x36,0x00,0x6b,0x00,0xfe, 0x01,0x80,0xfb,0x01,0xc0,0x1e,0x00,0x00,0xec,0x03,0x80,0xf5,0x14,0x1c,0xd5, 0x07,0x80,0x54,0x3d,0x00,0x40,0x45,0x0f,0x00,0x54,0x1f,0x00,0x92,0x0f,0x80, 0xf2,0x00,0x00,0xf0,0x01,0x00,0x40,0xf0,0x01,0x00,0xfc,0x76,0xab,0xf6,0xee, 0x0f,0x00,0x00,0x00,0x00,0x40,0x5b,0x56,0x2b,0x00,0x75,0x00,0x00,0x00,0x00, 0x3e,0x00,0x80,0x0f,0x00,0x00,0xf8,0x00,0x00,0x3f,0x40,0x0f,0xfe,0x01,0x00, 0xaa,0x0f,0x00,0x00,0xd5,0x03,0x00,0xe0,0x03,0x00,0xf8,0x01,0x00,0x3e,0x00, 0x00,0x7e,0x00,0x00,0x00,0x7f,0x00,0x00,0xb4,0xdf,0xfe,0xbd,0xb7,0x07,0x00, 0x00,0x00,0x00,0x80,0xad,0x5b,0x75,0x00,0x6a,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x07,0x00,0x00,0x00,0xf0,0x01, 0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xec,0xfa,0x57,0xd7,0xfa,0x01,0x00,0x00,0x00, 0x00,0x00,0xb5,0x6a,0xd5,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0xc0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xbc,0x5f,0xfd,0xbd,0x7f,0x00,0x00,0x00,0x00,0x00,0x00, 0x54,0x55,0xab,0x81,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf4,0xea,0x57,0xef,0x3d,0x00,0x0c,0x03,0x00,0x00,0x00,0xab,0x55, 0x55,0x03,0x3a,0x00,0x00,0x00,0x00,0x18,0x1c,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x40,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00, 0x00,0xc0,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xdc,0x7f,0xfd,0x75,0x0f,0x00,0x08,0xe1,0xef,0x1f,0x80,0x57,0xdb,0xed,0xf3, 0x77,0x10,0xfe,0xf8,0x00,0x38,0x1c,0xfe,0x70,0xe0,0xc0,0x00,0x03,0x7f,0x20, 0x7a,0x90,0x7f,0xfe,0xf8,0xc0,0x0f,0x03,0x0e,0x7f,0x00,0xc6,0x30,0x04,0x40, 0x00,0x82,0xc0,0x80,0x83,0x83,0x3f,0x86,0x00,0x00,0x00,0x00,0x00,0xf4,0xd6, 0x6f,0xef,0x03,0x00,0x98,0xa1,0x44,0x0b,0x80,0x51,0x67,0x3a,0x86,0x70,0x10, 0x4a,0x28,0x01,0x28,0x06,0x4a,0xac,0x58,0xc1,0xc1,0x0d,0x4b,0x12,0xdb,0x10, 0x2d,0x96,0x28,0x63,0x80,0x83,0x13,0x49,0x00,0x83,0x31,0x04,0x40,0x00,0xc2, 0xe0,0xe0,0x46,0x8d,0x25,0x86,0x00,0x00,0x00,0x00,0x00,0xbc,0x7d,0xb5,0xfd, 0x00,0x00,0x70,0x20,0x00,0x03,0x80,0xa4,0x55,0x0c,0x8a,0x74,0x10,0x02,0x08, 0x01,0x28,0x1a,0x02,0x04,0x08,0x40,0x21,0x00,0x01,0x08,0x43,0x11,0x04,0x02, 0x08,0x22,0x80,0xc2,0x00,0x01,0x00,0x01,0x51,0x04,0xc0,0x07,0xc6,0xa0,0x30, 0x40,0x80,0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0xd0,0xdb,0xff,0x3f,0x00,0x00, 0x40,0xe0,0x03,0x01,0x40,0x8c,0x4a,0x4d,0x9b,0xd9,0x1f,0x3e,0xf8,0x01,0x58, 0x0b,0x3e,0x78,0xf0,0x20,0x21,0x00,0x1f,0xc1,0x43,0x13,0x0c,0x3e,0xf8,0xe1, 0x83,0x44,0x00,0x1f,0x00,0x01,0x91,0x04,0x40,0x05,0x24,0x21,0x11,0xc0,0x83, 0x0f,0x92,0x00,0x00,0x00,0x00,0x00,0x70,0xf7,0xaa,0x0f,0x00,0x00,0x20,0x20, 0x01,0x03,0xc0,0x0b,0x5b,0xaa,0xf6,0x58,0x00,0x12,0x88,0x40,0x48,0x19,0x02, 0xa0,0x41,0xa3,0x22,0x0e,0x03,0xe8,0x43,0x14,0x0c,0x12,0x98,0x20,0xc0,0x44, 0x00,0x0b,0x00,0x81,0x11,0x05,0x40,0x00,0xaa,0x30,0x11,0x00,0x8c,0x04,0xa2, 0x00,0x00,0x00,0x00,0x00,0xe0,0xbd,0xff,0x01,0x00,0x00,0x20,0x20,0x00,0x03, 0x60,0x10,0x69,0x4c,0xa2,0x59,0x10,0x02,0x88,0xa0,0x9a,0x18,0x02,0x00,0x01, 0xb2,0x26,0x08,0x11,0x75,0x42,0x14,0x0c,0x06,0x88,0x61,0x40,0xcd,0x10,0x01, 0x00,0x83,0x10,0x06,0x40,0x00,0x98,0x50,0x33,0x04,0x88,0x01,0xc2,0x00,0x00, 0x00,0x00,0x00,0x80,0x6f,0x3f,0x00,0x00,0x00,0x20,0xe0,0x0f,0x03,0x20,0x10, 0xd2,0xb2,0x93,0x5c,0x10,0xfe,0x08,0x29,0x99,0x08,0xfe,0xdc,0xb8,0x11,0xc4, 0x0d,0x6f,0x3c,0x42,0x18,0x0c,0xfe,0x08,0x21,0x20,0x88,0x1f,0x7f,0x00,0xfc, 0x10,0x06,0x40,0x1f,0x92,0x09,0xe2,0xc7,0x8d,0x3f,0x82,0x00,0x00,0x00,0x00, 0x00,0x00,0xfe,0x03,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x2a,0x4a, 0xd0,0x18,0x10,0x40,0x00,0x95,0x0a,0x10,0x50,0x40,0x80,0x00,0x00,0x00,0x41, 0x0e,0x02,0x00,0x00,0x90,0x00,0x00,0x00,0x00,0x04,0x48,0x00,0x00,0x20,0x00, 0x40,0x09,0x00,0x00,0x00,0x00,0x01,0x24,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0xaa,0x54,0x1c, 0x00,0x00,0x00,0xa0,0x44,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x95,0xaa,0x0e,0x00,0x00, 0x00,0xad,0x2a,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xe1,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x6a,0x55,0x0d,0x00,0x00,0x80,0x52, 0x92,0x14,0x00,0x00,0x00,0x00,0x00,0xa0,0x78,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x40,0xad,0x5a,0x0d,0x00,0x00,0x00,0x4a,0xa9,0x2a, 0x00,0x00,0x00,0x00,0x00,0x14,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x55,0xab,0x0e,0x00,0x00,0x80,0x2a,0x95,0x64,0x00,0x00, 0x00,0x00,0x80,0x42,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x6a,0x55,0x0d,0x00,0x00,0x00,0x55,0xa5,0x52,0x00,0x00,0x00,0x00, 0x00,0xd0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xac,0xb5,0x0d,0x00,0x00,0x00,0xa4,0x54,0xaa,0x00,0x00,0x00,0x00,0xa0,0xfa, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0xaa, 0x1a,0x00,0x00,0x00,0x95,0x4a,0x49,0x01,0x00,0x00,0x00,0x14,0x3d,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0xad,0x1a,0x00, 0x00,0x00,0x54,0x29,0xa5,0x02,0x00,0x00,0x80,0xc2,0x0f,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x55,0x35,0x00,0x00,0x00, 0x50,0xa5,0x54,0x0a,0x00,0x00,0x52,0xf4,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xda,0x6a,0x00,0x00,0x00,0x90,0x94, 0x92,0x12,0x00,0x40,0x08,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x6b,0x00,0x00,0x00,0x40,0x55,0x4a,0x49, 0x92,0x94,0xd2,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x56,0xd5,0x00,0x00,0x00,0x80,0x52,0xa9,0x54,0x49,0x22, 0xf9,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa8,0xda,0x00,0x00,0x00,0x00,0xae,0x4a,0x92,0x2a,0x55,0x1f,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd8,0xaa,0x01,0x00,0x00,0x00,0x60,0xa5,0x4a,0xa4,0xf8,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0xd5, 0x01,0x00,0x00,0x00,0x00,0xbc,0xa9,0xfa,0x1f,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x56,0x03,0x00, 0x00,0x00,0x00,0x00,0xf8,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0xaa,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0xaa,0x02,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x58,0x55,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0xad,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa8,0xb5,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50, 0x55,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0xaa,0x0e, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x55,0x0d,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0xab,0x0a,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x5a,0x1d,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x50,0xd5,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x60,0x55,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa0,0xaa,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x56, 0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xaa,0x3a,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x55,0x35,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0xda,0x3a,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0x55,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0xaa,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x40,0x55,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xab,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x5a,0x35, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x3a,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x35,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x3a,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xaa,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x54,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x68,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0, 0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x0f,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; wanderlust-wanderlust-769699d/etc/icons/wl-stable-logo.xpm000066400000000000000000002531211406661363500236550ustar00rootroot00000000000000/* XPM */ static char *wl-logo26[] = { /* width height ncolors chars_per_pixel */ "491 176 26 1", /* colors */ ". c None", "a c #917DCA", "b c #295EB6", "c c #E3ABD8", "d c #C090D3", "e c #F6C8DC", "f c #596CBF", "g c #030404", "h c #9C82CC", "i c #837ACA", "j c #22529C", "k c #4D6ABF", "l c #0C1112", "m c #3F65BB", "n c #7574C5", "o c #D09AD9", "p c #C994D2", "q c #6771C4", "r c #6E6CAD", "s c #1D2628", "t c #AE82BD", "u c #3864BC", "v c #444A5E", "w c #6C73C4", "x c #B28BD4", "y c #3162BB", /* pixels */ "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "..................................................................................................................................................................................................................................xxxxxxxxxx...............................................................................................................................................................................................................................................................", ".......................................................................mmm................................................................................................................................................xxxxxxxxxxxxxxxxxxxxxxxxx........................................................................................................................................................................................................................................................", "......................................................................mmmmg..........................................................................................................................................xxxxxxxxxxxxxxxxxxxxxxxxxxdddddxxx....................................................................................................................................................................................................................................................", ".....................................................................mmmmmll......................................................................................................................................xxxxxxxxxxxxxxxxxxxxxxxxxxdddxxxxddddddxd................................................................................................................................................................................................................................................", "....................................................................ummmmmsg..................................................................................................................................hhxxxxtxxxxxxxxxxxxxxxxxdxdxxxxxxdddxddxddpdddt..............................................................................................................................................................................................................................................", "...................................................................mmmmmmmsg................................................................................................................................hxxxxxxxxxxtxtxxxxxxxxxxxxxxxxxxxxdxxxddddddddddddpt...........................................................................................................................................................................................................................................", ".................................................................mmmummmmkvg.............................................................................................................................hxxxxxhxxxxxxxxxxxxxxxxxxxxxxxxdxxxxxxddxxxdxdddddppdpdpa.........................................................................................................................................................................................................................................", "................................................................uuummmmmmmjg...........................................................................................................................hhxhhhxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdxdxxdddddddddpddpdpppdt.......................................................................................................................................................................................................................................", "...............................................................mmmumummmmmjg........................................................................................................................ahhhhhxxhhxhxxxxxxxxxxtxxxxxxxxxxxxxxxxxxxxdxxdxdxddddddddddpppdtr.....................................................................................................................................................................................................................................", "..............................................................muuummmmmmmkvg......................................................................................................................ahhhhxhxhhxxxxxtxxtxxxxxxxxxxxxxxxxxxxxxxxdxdxddxddddddddddpppdppppor....................................................................................................................................................................................................................................", "............................................................uummmmumummmmmsg....................................................................................................................hhahhhhhhhxhxhxxxxxxxxxxxxxxtxxxxxxxxxxddxxxxxdxxddxddddddddddddpdppppdtv..................................................................................................................................................................................................................................", "...........................................................uuumuuummmmmmmksg...................................................................................................................hahhhahhxhxhxhxxhxxxxxxxxxxxxxxxxxxxxxxxxxxxxdxxddxxddxddddppppppppppdooppv.................................................................................................................................................................................................................................", "..........................................................uuuummmmummmmmmmsg.................................................................................................................haahhahhhhhhhhxxhxhxxxxxxxxxxxxxxxxxdxxxxxxxxxxxxxxdddxddddddddddddpdppppoppor................................................................................................................................................................................................................................", "........................................................uuuumuuuuummmmmmmksg...............................................................................................................ahahhaahhahhxhxxhhxxxxxxtxxxxxxxxxxxxxxxxxxxxxxxxdxxdxxxddddddddddpdpppppppppopotv..............................................................................................................................................................................................................................", ".......................................................uyuuuuummmmuummmmmmgg...............................................qqq...........................................................aaaaaahahahhhhhhhxxxxxxxxxxxtxxxtxtxxxxxxxxxxxdxxxxddxdddddxddddddddpddpdpdppopppopts.............................................................................................................................................................................................................................", ".....................................................yuuuuummuuuuummmmmmmkgg.............................................qqqqqwwm.......................................................aaaahhhahhhhhhaxhhhhhhxxxxxxxxxxxxxxxxxxdxxxxxxxxxxxxxxxxxxxdxddddddpdppppppppppoopoots............................................................................................................................................................................................................................", "...................................................uuyuuuuuumuummmmummmmmjgg...........................................fqqqqqqqwqv....................................................aaaaaaaahhahhhahhhhhxxxhhxxxxxxxtxxxxxxxxxxxxxxxxxdxxxxxxdddddddddddpdddddpdpppppppopoootl...........................................................................................................................................................................................................................", "..................................................uyyuyuuuuuummuuummummmmsg...........................................qqqqqwwqwqwws..................................................aaaaaaaahaahaahhhaxxxhhhxtxxxtxxxxxxxxxxxxxxxxxxxxxxxxxxddxxxxddddddddddpddppppppopppoppoorl..........................................................................................................................................................................................................................", "................................................yyuuyuyuuuuumuummummummmmsg..........................................qqrqqqqqqwqwwjg...............................................aaaaaaahaahhaahahhhhhhhxxxxahxxxxtxxxxtxtxxxxxxxxxxxxdxxxxxxdddxdxddddddddppdddpdppppppoopooov..........................................................................................................................................................................................................................", "..............................................yyuuuyuuuuuuuuuumuummmmmmmmgg.........................................fqqqqqqqwqqwqwfg..............................................aaaaaaaaahaaaahhhhhhhhhxhhhxxxxxxxxxxarrrrrrrrrtxxxxxxxxxxxxdxxxdxdddddddppdddpppppdooooppopooos.........................................................................................................................................................................................................................", "............................................yyyuyyuuuuyuyuuuuuumuummummmjgg........................................qffqfqqqqqqqwqwqgl............................................aaiaaaaahahhhhhhhahhhhhhhxxhxxrrsssgggggl.........llvsrrxxxpxxddxddxdddddddpppdpppppppppooooooootl........................................................................................................................................................................................................................", "..........................................byyyyyyyuuyyuuuuuumumummummmmmsg........................................ffqqqqqqqqwwwqwwwgg..........................................iiiaaaaaaaahaaaaaahhhhhhxhxrvsgggg.........................vvrxdxxdxddddddddddddpddppppppppppopoooovl.......................................................................................................................................................................................................................", "........................................yyybyyyyyyyuuuuuuuuuuuuuumumummbgg.......................................fqfqqqqqqqqqqwqqwqgg.........................................iaaaaaaaaaaaaahahhahahhhrvsggg..................................vrxdxdxxddddddppddppdppppppoopopooooos.......................................................................................................................................................................................................................", ".....................................byybyyyyyyuuyuyyyuuuuuumummmummmmmsgl.......................................qfqffqqqqqqqqqwwwjgg........................................iiaiiaaaaaaaahaahaahairsggg.........................................rrddddddddddddpppppdooooppooopooootg......................................................................................................................................................................................................................", "..................................bbbbbybbybyyyybyuuuyyuuuuuuuuummumumjgg.......................................fqfqqfrfqqqqwqqqqqvg.......................................iiaiaaaaaaaaaaahaahhhrsggl...............................................tdddddddpppdppppppdpooppoooooooovl.....................................................................................................................................................................................................................", "...................bbj........bbbbbbbbybybyyyyyyyuyyyuuuuuuumuumuummmmsgl......................................frfqffqqqqqqwqwwwwwsg......................................iiaiiaiaaaaaaaaaaaarsggg....................................................tddddddddpddppppppppoooooooooodg.....................................................................................................................................................................................................................", "...................bbbbbbbbbbbbbbbbybbuyyyyyyyuyuyuuuuyuuuuuuuummmummjgg......................................qqffqqqqqqqqqqqqqqwfgg.....................................iiiiiiaiaaaaaaaaahvsggl........................................................dddpdpdppdppppppppppooooooooosl....................................................................................................................................................................................................................", "....................bbbbbbbbbbbbbbbbybbbybyyyyyyyuuyuyuuuuuummuuuummmlgl.....................................ffffffffqqqqqqqqqwwqvgl....................................iaiiiaiiaaaaaaaanvlgg............................................................xddddpdppdppoopooooppoooooootg....................................................................................................................................................................................................................", "....................bbbbbbbbbbbbbbbbbyybybbyyyuyyyyyuuuuuuuuuummmmuusgg......................................ffqfrqqfffqqqqqwqqwwlg....................................iiiiaiaaiaaaaaanvggl................................................................dpddpdppdppodpppooppoooooooll...................................................................................................................................................................................................................", "....................bbbbbbbbbbbbbbbbybbybyybyyyyyyuuyyyuuuuuumuuuumvgg......................................ffffqqffqqqqqqqwqqwqvgg...................................iiiaiiiaiaiaaarvggl...................................................................dppdppppdpppdoopoooooooooovg...................................................................................................................................................................................................................", "....................bbbbbbbbbbbbbbbbbbbyyyybyyybuyyuuuuuuuuuuuummmjgg......................................ffffffqqfqqfqqqqqqqwwlg...................................iiiiiiiiaiaaaavggl......................................................................ddpddpppppoppopoopoooooootg...................................................................................................................................................................................................................", ".....................bbbbbbbbbbbbbbbbbybbyyyyyuyyyuyuyyuuuumuumuujgg......................................kfffffffrqfqqqqqqqwqqvgg..................................iiiiiiiiiiaaijlgg.........................................................................pdppppppoppopooooooooooooll..................................................................................................................................................................................................................", ".....................bbbbbbbbbbbbbbyybyybyyyyyyyyuuuuuyumuuumuumsgg.......................................kffffqfqfqfqrfqqqqqqjgg..................................iiiiiiiiiiiirsgg............................................................................ppdpppppopopppoooooooooovg..................................................................................................................................................................................................................", ".....................bbbbbbbbbbbbbbbbbbbybybyyyuuyuyyyuuuuuuuubsgg.......................................fffffqfffqfqqqqqqqqwflgl.................................iiiiiiiiiiirvggl..............................................................................ppdppppppdooooooooooooorg..................................................................................................................................................................................................................", "......................bbbbbbbbbbbybbbyybybybyyyyyyuuuuyuuuuumjlgl.......................................ffffffffffqffqqqqqqqqsgl.................................iiiiiiiiiiirlgl.................................................................................ppdpoppoppodppooooooootg..................................................................................................................................................................................................................", "......................bbbbbbbbbbbbbyybbybyyyyyyyyyuyuyuuuuuusggl........................................kfkffffqrffqqqqqqqqqvgg.................................iiiiiiiiiaisgg...................................................................................ppppppopoopoooooooooooogl.................................................................................................................................................................................................................", ".......................bbbbbbbbbbbbbbbbyyyyyyyyuyyuuuuyuuujlgg.........................................fkffffrfqqfffffqfqqqjgg.................................iiiiiiiiiirlgg.....................................................................................pppodpppoooopooooooooosg.................................................................................................................................................................................................................", ".......................bbbbbbbbbbbbbbyybbbybyyyyuyyyyyuujsggl.........................................kkfffffffffqqqqqfqqqjgg.................................iiiiiiiiaivggl.......................................................................................dpppppoppoooooooooooovg.................................................................................................................................................................................................................", "........................bbbbbbbbbbbybbyyybyyyyyyyyuuuuysggl...........................................ffffffqffffrffqqqqqjgg.................................niiiiiiiirsgg.........................................................................................pppoopooppooooooooooovg.................................................................................................................................................................................................................", ".........................bbbbbbbbbbbbbbbbyyyyyyyuuyyyjlgg............................................kkkfkffffqfffqqfqqqjgg.................................iiiiiiiiirlgl...........................................................................................dopppdpooooooooooooorg.................................................................................................................................................................................................................", "..........................bbbbbbbbbbbyyyyyybyyyyuyujlgg.............................................ffffffffffqfqffqffqjgg.................................iiiiiiiiivggl............................................................................................pppppopoppoooooooooorg.................................................................................................................................................................................................................", "...........................bbbbbbbbyybbbbbyyyyyyyyvggl..............................................kkkffkfffffqffqfqqvgg.................................iiiiiiiiivgg...............................................................................................ppoopopoooooooooopxrg...............................................................................xx................................................................................................................................", ".............................bbbbbbbbbyyybyyyyyyjsgg...............................................ffffffffffffffrqfqsgg.................................niniiiiiisgg................................................................................................oppppooopooooooopinnsl.............................................................................xxxtg..............................................................................................................................", "...............................jjbbbbybbbyyyyyyjlgl................................................kkkkfffffffffqqfksgg.................................niiiiniirsgg.................................................................................................pppoopdoooooooopinnnvg............................................................................xxxxxgl.............................................................................................................................", "..................................sssslljbbyyyjggl................................................fkffkkffffffqfffjlgl.................................inniiiiirlgl...................................................................................................pppoopopooooooannnnvg...........................................................................xxxxxxgg.............................................................................................................................", ".......................................bbyybujgg.................................................kkkfkfffffffffffvggl..................................niiiiiirlgl....................................................................................................oppppoooooooohnnnnnng...........................................................................xxxxxxgg.............................................................................................................................", "......................................buyyybjlgl.................................................ffkfkkfffkrfffksgg...................................nnnniiirlgl.....................................................................................................pppoppopoooodnnnnnnngg.........................................................................xxxxxtxgg.............................................................................................................................", "......................................ybbbyjgg..................................................kkkkkffkfkffffjlgl...................................niiiiinrlgl......................................................................................................ooodooooooooinnnninngg........................................................................xxxxxxxxgg.............................................................................................................................", ".....................................byyyyjlgl..................................................kkfkkffffffffvggl...................................innnniirlgl.......................................................................................................ppppppooooohnnnnnnnfgg........................................................................xxxxxxxxgg.............................................................................................................................", "....................................bbbbyjlgl..................................................kkkfkkfkkfffjlgg.....................................niniiirlgl.........................................................................................................pooooopoodnnnnnnnnvgl.......................................................................xxxxxxxxxgg.............................................................................................................................", "...................................ybyybjlgl...................................................kkkffkfffkfkggl.....................................nninnnrlgl..........................................................................................................pppdpoppoinnnnnnnnvg........................................................................xxxxxxxtrgg.............................................................................................................................", "...................................bybbysgl...................................................fkkkkkfkkfffvgl.....................................nninniilgl...........................................................................................................ppooooooxwwnnnnnnnvg.......................................................................xxxxxxxxxrg................................................................................................c.............................", "..................................bbbbbsgg....................................................kkkkkfkfkfffgg.....................................nnnninnsgg............................................................................................................pppppoodnnnnnnnnnnsg......................................................................xtxxxxxxxxsg.............................................................................................ccccco...........................", ".................................bbbbyvgg....................................................kfkkkfkfkfkfvgg.....................................nnnnnnsgg.............................................................................................................opoooooawwnnnnnnnngg......................................................................xxxxtxtxxxsg...........................................................................................ccccccccgl.........................", "................................bbbybjgg.....................................................kkkkkkkfkfkflg.....................................nnnnnivgg..............................................................................................................ppppppxnnwwnnnnnnvgg.....................................................................xxxxxxxxxxagg..........................................................................................ccccccccrgg.........................", "................................bbbbjgg.....................................................kkkkkkkkffkfvgg....................................nnnnnnvgg...............................................................................................................opooooiwwnnnnnnnnsg......................................................................xxxxxxxtxxvgl.........................................................................................ccccccccclg..........................", "...............................bbbbjlgl.....................................................kkfkkkkkkfkklg.....................................nnnnnflg................................................................................................................ppppoxnnnnnnnnnnrgg.....................................................................xxxxxxxxxxxlg..........................................................................................ccccccccrgg..........................", "..............................bbbbbsgl.....................................................kkkkkkkfkfkfjgg....................................nnnnnnlgl................................................................................................................opoodwnwnwnnnnnnsgl.....................................................................xxxtxxxxtxvgg.........................................................................................ccccccccpgg...........................", "..............................bbbbsgg.....................................................kkkkkkkkkfkkfsg....................................nwnnnnsgg.................................................................................................................pppphwnwnwnnnnnrgg.....................................................................xxxxxxxxxxalg.........................................................................................ccccccccplgl...........................", ".............................bbbbjgg.....................................................kkkkkfkkkfkffjgg....................................wnnnnvgg..................................................................................................................opopwwwnwnwnnnilgl....................................................................xxxxxxxxxxxsgl.........................................................................................ccccccccvgl............................", "............................bbbbjgg....................................................kkkkkkkkkkkkkkfvgl...................................nnnnnrlg...................................................................................................................oppinwwnnnwnnnrgg.....................................................................xxxxxxxxxxrgg.........................................................................................ccccccccvgg.............................", "...........................bbbbblgl...................................................kkkkkkkkkkkkfkkmgg...................................wwnnnnsgl...................................................................................................................ppxnnnnwnnnnnxvgl....................................................................xxxxtxxxxxrgg.........................................................................................ccccccccrgg..............................", "...........................bbbbsgg...................................................kkkkkkkkkkkkkkfkvgl...................................nnnnnvgg...................................................................................................................pppiwnwnwnnwnatgg.....................................................................txxxxxxxxalg..........................................................................................cccccccrgg...............................", "..........................bbbbjgg..................................................kkkkkkkkkkkkkkkffklg...................................nwwwnfgg....................................................................................................................poxwwwwnnwwnaovgl....................................................................xxxxxxxxxalgl.................................................................ooo.....................ccccccctgg................................", ".........................bbbbjlgl.................................................kkkkjjkfkkkkfkkkkfjgg...................................nnnnnsgl....................................................................................................................ppiwwnwwnnnaoolg............................................a........................xxxxtxxtilgl.................................................................ooooll...................ccccccplgl................................", "........................bbbbbsgl................................................mkmkkjgukkkkkkkkkfkkvgl..................................wwwnwvgg.....................................................................................................................pxwwnwwnwnaootgg...........................................aaar.....................xxhxxxxxalgl.................................................................oooovgg..................coccccplgl.................................", "........................bbbbjgg................................................kkkkksgskkkkkkkkkkkkklg...................................nnnnflg........................yyy...........................................................................................piwwwwwnnaooosgl...................iiiiii.................aaailg....................hxxxxxxilgl................................................................oooootgg...................ccccccsgl..................................", ".......................bbbbblgl...............................................kmkkusggkkkkkkkkkkkkkmgg..................................nwnwwsgl......................yyyuuj.........................................................................................oxwwwnnnwaoootgg.................iiiiiiiiiis.............aaahrlgl...................xxxxxxxilgl....................x...........................................oooooorgl...........ooocoooccocccvgg...................................", "......................bbbbbvgg..............................................kmkmkblgl.kkkkkkkkkkkfkjgl.................................wnwnnmgg.......................uuyuuug...........................mm................................................qqqqqwfr...piwwwwwwapooosgl...............iiiiiiiiiiiivg...........aaaaavgl...................hxxxxxxalgl...................xxxxr........................................opooooool...........oooococcccccctvv........c...........................", ".....................bbbbbjgg..............................................mmmkkjggl.kkkkkkkkkkkkkfjg..................................wwwwwsgl......................yuuyyuugg........................mkkkmg...........................................fqqqfvlggg....dwwwwwwaooootgg..............niiiiiiiiiiiiivg..........aaaaaavg....................xxhhhxalgl..................xxxxxxxg......................................oooooooootl.........occcoocococccccccccccccccp...........................", ".....................bbbbbsgl.............................................mkkmkvgg...kkkkkkkkkfkkkkkg.................................wwwnnvgg...............bbbbbyyyyyyuyyjgg......................mmmmkkjgl.......................................fqqfksggl.......panwwnnaooooosgl.............iinvsvriiiiiiiisg.........aaaaaaaar....................hxxxhilgl..................xxxxxxdtgg...............dddd.................ppopooooooots........oooooococcooccccccccccpvggl..........................", "....................bbbbbjgg............................................mmmmkbsgg...kkkkkkkkkkkkkkfksg................................wwnwnlg............bbyybjvsggsyyyuyuusgl.....................mmkmkmmsg..........kkkkk.......................fqqqmlgg..........pwwwwwaopoootgg............nii.ggl..iiiiiiiilg........aaaaaaaaaaar.................xxxxxalgl..................xxxxxxxxvgl..............dddpptg...............ooooooooooootl........oocccoccoccccccccctrsggl............................", "...................bbbbbbsgl...........................................mmkmmulgl....kkkkkkkkkkkkkkkkvg...............................wnwnwvgg..........bbbbjsggl...yyyyyyyjgg.....................mkmkmkkjgg........kkkkkkkvl....................qfffsgg............hqqnwapopooosgl...........ini.gl....iiiiiiivgg.......aiiaaaaaaaaaaan...............hhxxilgl..................xxxxxxxxtlg..............dddddpdgl...............pooooooooooorl.........vvvtocccrrrrvvsgggl...............................", "..................bbbbbbjgg..........................................mmmmmmjggl.....mkkkkkkkkkkkkkfkmg...............................wwwwwlg.........bbbbjlgg......yyuyyyuvg.....................mmmmmmmmsgl.......kkkkkkkkkg..................fqfqflgl............pinwwioopoppvgg...........inilg.......iiiiivgg........iaaaaaaaahaaaaans............xxxhrggl...................xxxxxxxtvgl.............dddddddvgg.............ppodpoooooooooos............cccctgg........................................", "..................bbbbbbvgl.........................................ummmmksgg......kkkkkkkkkkkkkkkfkkvl..............................wwwwvgg.......bbbbyjggl.......yyyuyyuyj....................mmmmmkkkvgg.......kkkkkkkkkksg................ffffklgl.............xwwqndpooootlg...........ninsg........iiiivgg..........aaaaaaaaaahhaaasl...........hhxrgg....................xxxxxdxtlgl.............ddddddptlg.............oo..gtoooooooooorg..........ooooosgl........................................", ".................bbbbbbbsg.........................................mmmmmbsgg.......kmkkkfkkkkkkkkkfkkmg.............................wwwwnlg.......bbbbbjgg..........yuyuyuuujs.................mmmmkkmmmlg.......kkkkkkkkkkksg...............fffqqvgl.............pawwwxpoppoovgl..........ninvgl.......iiiivgg..........aaiaaaaaaaaaaaahsg..........hxxrgg....................xxxxxxxvggl.............ddddddphlgl............p...l..ooooooooootg..........cccctgg.........................................", "................bbbbbbbjgg.......................................mmmummjlgl........kkkkmkkkkkkfkkkffkkvl............................nwwwvgg.....bbbbbbblgl..........yyyuyyuuujs................mmmmmmmkvgg......kkkkkkkkkkkkvg..............fqfrfkgg..............pqqwxppooporgg...........nirgg.......iiirsgg..........ii.lgrnaaaaaaaaavgg..........hhtlgl...................xxxdxxrlgg...............xdddddtlgl............p..l.....oooooooooogl........oooccvgl.........................................", "...............bbbbbbbbjgl......................................mummmmvgg..........kmkkkkkkkkkkkkkkfkfmg...........................wwnnwlg.....bbbbbbbvgg............yyyyuuuyuvl..............mmmmmmmkbgg......kkmkkkkkkkkkkjg.............fffqffvgl..............hwwnpopppotlg...........innlg......iiiirggl..........i.......iaaaaahhvgg...........axvgl....................xxxxxvggl...............ddddddrlgl............p..........ooooooooogg........occocgg..........................................", "...............bbbbbbbbsg.....................................ummuumjsgg...........kkkkkkkkkkkkkkkkkkfkvl..........................wwwwvgg....bbbbbbbbsg............uy.uyyyuuyul.............mummmmkmmvgl.....k..gvkkkkkkkkkjg.............fffqffsg..............xwwqhpooopovgl...........nnmgg...niiiirggg...........a.........aaaaaasgg...........hhxgg....................xxxxxvgg................xdxdddvgg..........................oooooootgg........oocorgg..........................................", "..............bbbbbbbbbsg....................................ummummjlgl............kkkkkfkkkkkkkkfkfkkffl.........................wqwwwsg.....bbbbbbbbgg...........yy..jyuuyyuusg............mmmmmkmmklg.....k..l..kkkkkkkkkjg............fffffqfsg.............anqwwxpppporgg...........niiinniiiirvlggl........................aaaasgg............xhhgg....................xxxxrgg................xdddddvgg............................oooooorgl.......cococvg...........................................", ".............bbbbbbbbbbsg..................................uuuumumvggl.............kkkkmfkkkkkfkkkkfkfkfjg........................wqwnmgg....bbbbbbbbbgg...........y....yyuuuuusg...........ummmmmmmmjgg............kkkkkkkkjg...........kfffffqfvg............wiiqwwxpppptgg............nnnrvssggggl............................aaasgg.............xhhvg...................xxxdxsgl...............ddxdddrgg.............................oooooosg........cocoovg...........................................", ".............jbbbbbbbbbsg.................................uuuuuubsgg...............mkkkkkkkkkkkkkkkffffffs........................wwwwsgl...bbbbbbbbbblg..........y.....yuyuyuusg...........mmmmmmmkmvgl............kkkkkkkkjg...........ffffffffjg...........qidnwwwnppoolgl...........ninnsgl.................................aaasgg.............hhxxxs...................xxxxxsg................xxddddlg...............................ooootgg.......ooooccvg...........................................", "............bbbbbbbbbbbjg...............................uuuuummjlgl................kkkkkkkkkkkkkkkkkkkkffmg......................wwwwfgg....bbbbbbbbbbsg........yb.....uyuuuuuugg..........mummmmkmmksg.............kkkkkkkkkg...........fffffrfffvl.........qwdpqqqwwappvgg............nninmg..................................aargg............h.hhhhxxv.................xxxxxxrg...............dddxdddlg............p..................oooosgl.......ocooootg...........................................", "...........bbjbbbbbbbbbjg..............................uuuuummsgg...................kkkkkkkkkkkkkkkfkfffffvl.....................qwqwvgl...bbbbbbbbbbbjl.......by......uyyyyyujgg........m.mmummmmmmmsg.............kkkkkkkkklg........kffffffqqqqqv.......qqqxdxwwwwwqavgg............nnininvl....................ii..........aaasg............h..hhhxhhxr................xxxxxxxrl............xxxxxdxxdvg...........d.....ppp...........ooorgg........oocccccrl...............c..........................", "...........jbbbbbbbbbbbbsl...........................uuuyuuujsgg....................kkkkfkkkkkkkkkkkkkkfkffs....................wqwqwsg....bbbbbbbbbbbbjv....yyy.l....yuuuuuyujgl......mu..mmmmmmmkmmbvm............kkkkkkkkkvg......ff.ffffqffffffqjk..qqqqqrpdhqwwwwwwfs............n.nnnninvs..................ii..........aaaagg..........hh..shhhxxhxxha.............xxxxxxxxxrv..........xxddddddxddv.........pp..l..pppots.........oodlg.........ooooococrv............cc...........................", "..........bbbjbbbbbbbbbbjg.........................yuyuuuuuvggl......................kkkkkkkkkfkfkffkffffffkg...................qwwwmgg....bbbbbbbbbbbbbbbbbybb.g.....yyyyyyuujg.....uu..lvmmummmmmmkmmj.l..........kkkkkkkkkkv....kfk..fkffffrffqqfqqqqqqqfvdppiwqqqwwwwwr.........nn..nniiniinr...............iaa.l........aaaaasg........ahh.lg.xxhhhxhxxxxxhh.......xxxxxxxxxxxxxtx......xxx.xxxxddddddr......dpp..l..pppopovl.......ooosgl........ooooccoccoct........ccc..l..........................", "..........jbbbbbbbbbbbbbbvl.......................uuuyyuujsgg........................kkkkkkkkkkkkkkfkkffffffjl..................wwwwvgl...bbbbbbbbbbbbbbbbbbysgg.....yyyuuuuyyusv.uuuu.lg..mmuummmkmmmjgg...........kkkkkkkkkkkkkkfkfsglfffffqffffqffqqfqqkstddpiwwwwqqwwnwwwqwwwwnnn.lvnnninnininnn..........iii..g.......aaaaaaarg......hhhavgg..hxhxhxhxhxxxxxxxxxxxxx.rxxxxxxxxxxxxxxxxxxxdlvdddxddddddddddppddxlg....oopppppg.......oorgg.........cooooccccoocccccccccccrlg...........................", ".........jbbjbbbbbbbbbbbbbs.....................yyuuyuuujlgl..........................kkkkkkkkkkkkkkkffkkfkffs.................qqqwqlg....bbbbbbbbbbbbbbybyysgg.....yuuuyyyuuuuuuuuujggl..mummmmmmmmmjgg............kkkkkkkkkkkkfkfjlgl.ffffffqqfqfqqqqqqklrddpdiqqwqwwwwwnnwnnnnnnnsgl.ninniiiiiiiiiiiiiiiiiiiivgg........iaaaaaaarraaahhaaalgl...hhxhxhxxxhxxxxxxxxxxrggrxxxxxxxxxxxxxxxxxxrggvxxxdxdxdddddddddpvgg....ppppoooovg.....ooogg..........occocoooccccccccccccplgg............................", ".........bjbbjbbbbbbbbbbbbbs..................yyuyyuuujsgg.............................kkkkkkkkkkkfkkfffffkffml................wwqwmgg....bbbbbbbbbbbbbbybjlgg......yuyyuuyuuuuuuujsgg....mmmmummmmkjgg..............kkkkkkkkkkffkvgg...ffffrffqrqffffqfflvpdddpawqwwwwwwwwnnnwnnnnsgg..nnninnniiiiiiiiiiiiiiirsgg........aaaaaaaaaaaaaaahailgl....hhhhxhhxxhxxxxtxxxxvgg..xxxxxxxxxxxxxxxxxsgg..ddxdxdxdddddddptsgg.....pppppppptl....ooolg............oooccccccoccccccccrggl.............................", "........jbbjbbbbbbbbbbbbbbbbj...............yyyyyyuyujlgl..............................kfkkkkkkkkkkffkkkffffffjl...............qqwwvgl....bbbbbbbbbbbbbbbjggl......yyyuyuyuuyuuuujlgl.....uummmmmmmjgg...............kkkkkkkkkkkksgg....ffffffffffqqqqqjlvpdpppdxqwwwwwwwwwwwwnnwflgg...ninniiiiiiiniiiiiiiiirlgl........iaaaaaaaaaahahaharggl.....hhxxhxxxxxxxxxxxtasgg...xxxxxxxxxxxxxxxxsgg...xxdxddddddddpdrlgl......ppoppooootv.ooo.lg.............ocooooocccccccccpvgg...............................", "........bjbbjbbbbbbbbbbbbbbbbbj..........bybyyyyyyujsgg.................................kkkkkkkkkkkffffkfffffffvl.............wwwwwsg......bbbbbbbbbbybjsgg........yyyuyyyyuyuyjsgg.......muummmmkjgg................kkkkkkkkkkmlgg......ffffffqffffqfvgsddddddppwqqqqnwwwnwwwwnflgl.....iinnnniniiiiiiiiiiivggl.........aiiaaaaaaaahaaahvgg........hhxhhhxxxxxxxxxrlgl....xxxxxdxxxxxdxxtlgg....dxdddddddddddvgg.........pppppppopopoovgg..............ococccoococccccrlgl................................", "........bbjbbjbbbbbbbbbbbbbbbbbbjb....bbyyyyyybyuujlgl...................................kkkkkkkkkfkkkkfffffffqqs.............qqqqfgg......bbbbbbbbbbbvggl.........yyyyyuuuyujsggl........ummmmmmjgg.................kkkkkkkkkvggl.......ffffqffqqqqksglxdddpppddvwwwwwwwwwwnnnjlgl.......nniiiiiiiiiiiiiirsgg...........iaaaaaaaaaaaahnsgg..........hhxxxhxhxxxxasgg.......xxxxxxdxxxxxvggl......dxxxddddddrlgg..........doopooopopotlgg................ocooocccccccdsgg..................................", ".......bjbbbbbbbbbbbbbbbbbbbbbbbbbbbbbybyyybyyuyjsgg......................................kkkkkffkkfkfkffkffffffkl............wwwwjgl.......bbbbbbbbvlgg...........yyyyyyyujsggl...........muummjgg...................kkkkkkjsgg..........fffqffrffvlgsxpddddddtsgjwwqqwnwnnwwvgg..........nnnniniiiiiiiivggl.............aaaaaaaaaaaarlgl............hhhxhxxxxivggl.........xxxxxxxxxrsgg.........ddxddddtvggl............pppppoootvggl..................occccococpvggl...................................", ".......bbjbjbjbbbbbbbbbbbbbbbbbbbbbbbybybbyyyyyvlgl.......................................kkkkkfkffkfkfkfffffffffjl..........wqqqqsg..........jjjvsggg..............yyuyujsggl.............mmmmsgg....................kkkkmvggl............fffffkvlgg.pdddpddptlgl..wwwwwwwwvlgg............niiiiiiiiiivlgg................iaaaaaaaanvggl..............tihxxxrsggl............txxxxxrsggl...........xdxxrvggl...............ppooptvggl.....................oooccctvggl.....................................", ".......jbbbbbbbjbbbbbbbbbbbbbbbbbbbybbbyybyyyjlgg..........................................kkkkkkkfkfkfffffqffqqqqv..........wwwwwlg..................................jsggg.................mjsgg.......................vsggl................vslggl..dpddddddtlgl....kvjvjsggg................vriiirvsggg....................raaahnvlgl...................sgggg.................vvvggg................vlggl...................vsgggl.........................vvvgggl.......................................", ".......bjbjbjbbbbbbbbbbbbbbbbbbbbbbbbyybbyyjsggl............................................kfkfffkfkffffffffqffffqs.........qwwwfgg..........................................................l.....................................................dddddddptlgl.................................lgggl.........................vssggl......................................................................................................................................................................", ".......jbbbbbjbbbbbbbbbbbbbbbbbbbbbbbbyyybvlgl...............................................ffqffkfffffqffqfqqqqfqfl........wwwwjgl...............................................................................................................xdpppdpdrggl............................................................................................................................................................................................................................................", ".......jbjbjbbbbbbbbbbbbbbbbbbbybbbybbbbjsgg..................................................wwqqrfkffffqffqfffrqqqml......wwnwwsg...............................................................................................................dddppoopvgg..............................................................................................................................................................................................................................................", ".......bbbbbjbbbbbbbbbbbbbbbbbbbbbbbbbjsggl............ls....ss..............................ssinwffffqqqqqqqqqwqqwwnvs.....iiiinsl.....................................ss.....sss...............................................................xdpdvlpovll...................................................................................sssss.......................sssssss.........................................................................................................................", ".......bjbjbbbbbbbbbbbbbbbbbbbbybbbyjsggl...............sp...sce..sssssss.ssssssss..........svvtaiwqfvvrwnwvvwwqwfvvvfv..lssvvvvrlls.....l....lssssss...sssss...........ssv....svre...sssssss....sss......sss......ss........ss......lssssss....xdddptscvsls.....l..ssssssss..sssssss...sssss......ssssss....ss.......sss....sssssss..........svectvv....ss....s...........stppttte...s.....s......ss.......sss.....sss.....sssssss...ss....s..............................................................", ".......jbbbjbjbbbbbbbbbbbbbbbbbbbbjsggl.................vv..stc...stttttte.ttvvttte.........sttveinqqvsvhnivtonwrsrttvvs..ttsttttvsse....ve...stttttte..stttts..........svvp..svrte...stttttte.ssttrv...ssttrv.....svv.....lsrtvs....stttttrc.ddddddptscss.ss....ve..ttvvttte.stttttrc..sttttvv...sreeeepe..svse....ssrtrs...stttttrc........src....vv...sst...se..........ve.........lp...sst....svse....ssrtrs...s.ttvv...stttttrc..sst...se.............................................................", ".......jbjbbbbbbbbbbbbbbbbbbbbbbjsggl....................vrvrc....se.........vve............secvc.nwqrtvraivtpnrsdecpovts..ovtcotvsse....ve...se........se...vt.........srtr..vtrre...se.......sce..pe..spe..pc....scsc...s.ce..tc...se.....eddddxxppvse...srv...ve....vve....se........se...vv...st........scvt...svce..pc..se..............sc......ve..sts...sc..........vtvvv......vv...svt....scvt...svce..pc..ve...ce..se........sts...sc.............................................................", "........jbbjbbbbbbbbbbbbbbbbbbjsggl.......................vre.....svvss......sve...........sre.vr..nwrtdvtavtpivvcxaaavrts.hvtchvs.svvvvvve...svvss.....svsssve.........svcvpvvevre...svvss.....ssss.....ssss.....srevt...se.........svsss..ppddddxtssse...sevv..ve....sve....svsss.....svsssste..svvss.....sc.v...se........svsss...........sc......vc..se.v..vc..........vttrve.....rvt.s.vt....sc.v...se........svss.....svsss.....se.v..vc.............................................................", ".........jbbjbbbbbbbbbbbbbbjvlggl.........................vpe.....stttte.....sve...........svvvvvp..qmrphvtvtoivreaaiivrcrvhvpchvs.veeeetre...stttte....sttrvee...iii...svevvvpevre...stttte.....pttvv....pttvv...str.vc..se..sss....srtttpcodddddvllsse...se.vv.ve....sve....srtttt....stttvce...steetc...svt.vt..sc........srtttt..........sc.....sve..se.rv.ve..........veeeee.....r.v.sevt...svt.vt..sc.........cttvs...srtttt....se.rv.ve.............................................................", "..........bbjbbbbbbbbbbbjjsggl............................vp......se.........sve..........sveeeetr...vrpitvvtoanscaiiisccarastchsl.se....ve...se........se..vt..aaiiiiahvve.vte.vve...se............tve......tve.svtrrvt..st...ert...ste.cccpdddtsgg..sc...se..vvve....sve....ste.......se..vr....st.......sttrvv..sr....s...ste.............vv.....ste..se..vvve..........ve.........r.vs.est...sttrvv..sr....s........vc..ste.......se..vvve.............................................................", "............jbbbbbbbbjssggl...............................st......srvssss....sve..........se.....vc...rxiitstoiirvvrvvrcxiiastoall.se....ve...srvssss...se...vcxaaiiiiahvve.vce.sve...srvssss..sss.ss.e.sss.ss.e.se....sc..vvs.sst...svvrrvvopdvggl...sc...se...vre....sve....svvssss...se...vt...st......s.e...vt..vvsssst..svvssss..........rsssssrc...se...vve..........vrvvsss....v..vc.st..s.e...vt..vvsssst..sss.sse..svvssss...se...vve.............................................................", "..............sssssgggg....................................t.......tttttte....te...........c......p...vpniittpiiiptttcepaiinrpoill..c....rp....tttttte...p...rtaaaiiiiiartexte...tc....tttttte..etttcc...ctttcc...c.....p...ttt.ec...vttttttetsgg.....rc....p....tc.....te.....tttttrc...t....t....t.......c.....t...ctttce...tttttrc..........ctttec.....t....tp..........rttttttp.......e..t...c.....t...ctttce...ptttee...tttttrc...t....tp.............................................................", "........................................................................................................qwnappnnnnipppiinnwnhpxvll...........................xoxaiiiiiiaxooxxxa.....................................................docccccctlll...........................................................................................................................................................................................................................................................", ".........................................................................................................fwnnnqwwwnwnnnnnwwwniivg............................aaiiiiiiiiaahhahahhv.................................................xxdddppprsll.............................................................................................................................................................................................................................................................", "..........................................................................................................fqqqqqqqqwwqwqqwwwnwwvg...........................iiiiiiiiiiiiaaaaaaaaav..............................................xxxxxxddrslg...............................................................................................................................................................................................................................................................", "...........................................................................................................qfqfqqqqqqqqwqqqwwwwvg...........................iiiiiiiiaaiiiiiiaaaaaal...........................................xxxxxxxxhsggl................................................................................................................................................................................................................................................................", ".............................................................................................................fqfqfffqqqqqqwqqqwsg...........................iiiiiiiiiiiiiiaaiaaaaarg........................................xxxxxxxxtvggl..................................................................................................................................................................................................................................................................", "..............................................................................................................qfqqqqqqqqqqwwwqqsg...........................niiiiiiiiiiiiiaaiiiaaaas......................................xxxxxxxxtvggl....................................................................................................................................................................................................................................................................", "...............................................................................................................fffqfqqfqqqqqqwwfg............................iiiiiiiiiiiiiiiiiaiaaaas...................................xxxxxxxxrsggl......................................................................................................................................................................................................................................................................", "................................................................................................................ffqfqqqqqqqwqqqqvl...........................iiiiiiiiiiiiiiiaiiiiaaaas...............................xxxxxxxxxrsggl........................................................................................................................................................................................................................................................................", ".................................................................................................................ffqfqqqqqqqqwwwws............................iiiiiiiiiiiiiiiaaaaaaaaav...........................xxxxxxxxxavlggl..........................................................................................................................................................................................................................................................................", "..................................................................................................................fqffqqqqqwqqqqqmg............................iiiiiiiiiiiaiiaaiaaiaaaarr.....................hhxxxxxxxxxrsggl.............................................................................................................................................................................................................................................................................", "....................................................................................................................qqfrqqqqqqwwwqsl............................iiiiiiiiiaiiiiiiiaaaaaaaain..............hhhxxxxxxxxxxavlggl...............................................................................................................................................................................................................................................................................", ".....................................................................................................................qqqqqqqqqqqwwfg..............................riiiiiiiiiiaaaaiaaaaaaaaaaaaaaaahahhhhhhxhxxxhxxxavsggl..................................................................................................................................................................................................................................................................................", "......................................................................................................................qfqqqwwqwwqqwvl...............................riiiiiiiiiiiiaaaaaaaaahahahhhhahhhhhhxhxhxxxrvlggl.....................................................................................................................................................................................................................................................................................", ".......................................................................................................................qqqqqqqqwwwwmg.................................rvriiiiiiaiiiaaaaaaaaaahaaahahhhhxhhhxrvsggg.........................................................................................................................................................................................................................................................................................", "........................................................................................................................qqqqwqwqqwqwsl....................................vvvaaiaaaaaaaaaahahahahhhahhhrrssgggl............................................................................................................................................................................................................................................................................................", "........................................................................................................................qqqqqqwwqwqwmg.........................................sssvvrraaaaaaaahrrrvsslgggl.................................................................................................................................................................................................................................................................................................", "........................................................................................................................qqqqwqqqwwwqwll.................................................gggggggggl.........................................................................................................................................................................................................................................................................................................", "........................................................................................................................qqqqwwwqqwwwwvg....................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................qqqqqqqwwwwwwfg....................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................qqqqqwqqqwqwwwsl...................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................qqqqqqwwwqwqwwvg...................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................qqqwqqqqwwwnwwfg...................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................qqqqqqwwqwwwwwwsl..................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................qqqwqqqwqwwqwwwvg..................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................qqqqwqwqwqqwwnwvg..................................................................................................................................................................................................................................................................................................................................................................", ".........................................................................................................................qqqwqwqwwwwwnwwg..................................................................................................................................................................................................................................................................................................................................................................", ".........................................................................................................................qqqqqqwqwwwwwwwsg.................................................................................................................................................................................................................................................................................................................................................................", ".........................................................................................................................qqqqwqwqqqwwwwwsg.................................................................................................................................................................................................................................................................................................................................................................", ".........................................................................................................................qqqwqwqwwwqwwwwjg.................................................................................................................................................................................................................................................................................................................................................................", ".........................................................................................................................qqqqqwqwwwwwnnwmg.................................................................................................................................................................................................................................................................................................................................................................", "..........................................................................................................................qqqqqwqwwqwwwwwgl................................................................................................................................................................................................................................................................................................................................................................", "..........................................................................................................................qwqwqwqwwqwwnwwgg................................................................................................................................................................................................................................................................................................................................................................", "..........................................................................................................................qqwqwqwqwwwwwwwsg................................................................................................................................................................................................................................................................................................................................................................", "..........................................................................................................................qqqqwqwwwqwwnnwsg................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................qqqqwqqwwwwwwnsg................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................wwqqwwqwwwwwwwsg................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................qqwwqqwnqwwwwwsg................................................................................................................................................................................................................................................................................................................................................................", "............................................................................................................................qqwwwqwwwwwnwsg................................................................................................................................................................................................................................................................................................................................................................", "............................................................................................................................qqqqqwwwwnnwwsg................................................................................................................................................................................................................................................................................................................................................................", ".............................................................................................................................wwwwwqwwwwnwsg................................................................................................................................................................................................................................................................................................................................................................", ".............................................................................................................................qqqqqnqwwwwwlg................................................................................................................................................................................................................................................................................................................................................................", "..............................................................................................................................wwwwwwwwwnwgg................................................................................................................................................................................................................................................................................................................................................................", "..............................................................................................................................qqqwwwwnwwvgg................................................................................................................................................................................................................................................................................................................................................................", "...............................................................................................................................wqwqwwwwwsg.................................................................................................................................................................................................................................................................................................................................................................", "................................................................................................................................wqwwwnwvgg.................................................................................................................................................................................................................................................................................................................................................................", ".................................................................................................................................wwwwwmlgl.................................................................................................................................................................................................................................................................................................................................................................", "...................................................................................................................................vssggl..................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................." }; wanderlust-wanderlust-769699d/etc/icons/wl-stable-xmas-logo.xbm000066400000000000000000001352171406661363500246120ustar00rootroot00000000000000#define wl_stable_xmas_logo_width 464 #define wl_stable_xmas_logo_height 160 static char wl_stable_xmas_logo_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0xaa, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x15,0x11,0x2a,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x8a,0x88,0x88,0x84,0x02,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x80,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x48,0x20,0x52,0x24,0x21,0x28,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x80,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x22,0x95,0x84,0x42,0x94,0x82,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x6d, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x90,0x14,0x02,0x21,0x14,0x41,0x28,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x76,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x82, 0x54,0x14,0x41,0x14,0x02,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x6b,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x2a,0x29,0x41,0xa2, 0x94,0x82,0xa8,0x44,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x7d,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x90,0x14,0x09,0x22,0x50, 0x02,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x80,0xb7,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0xa8,0x24,0x45,0x88,0xa4,0x88,0x0a,0xa8,0x42, 0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0xdd,0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x52,0x92,0x24,0x52,0x40,0x44,0xa0,0x02,0x10,0x10,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa0,0x6b,0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x60,0x3d,0x29,0x91,0x04,0x95,0x92,0x0a,0x90,0x84,0x22,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0xbd, 0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, 0x9a,0x84,0x24,0x51,0x22,0x20,0x50,0x25,0x22,0x80,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0xd7,0x76,0x00, 0x00,0x00,0x00,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0xad,0x52, 0x88,0x88,0x48,0x15,0x05,0x80,0x90,0x14,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x7a,0x7b,0x00,0x00,0x00, 0x00,0x00,0xa0,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x52,0x94,0x22,0x45, 0x04,0x82,0xa0,0x2a,0x04,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x6a,0xd7,0x76,0x00,0x00,0x00,0x00,0x00, 0x58,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0xb4,0x9b,0x12,0x49,0x28,0xa2,0x28, 0x15,0x00,0x51,0x25,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x40,0xbb,0x6d,0x3b,0x00,0x00,0x00,0x00,0x00,0xac,0x2a, 0x00,0x00,0x00,0x00,0x00,0x00,0xd2,0x5d,0xa2,0x24,0x82,0x14,0x44,0x40,0x55, 0x04,0x80,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x80,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf8,0xd7,0xb6,0x3d,0x00,0x00,0x00,0x00,0x00,0xab,0x75,0x00,0x00, 0x00,0x00,0x00,0x80,0x4a,0x24,0x15,0x42,0x29,0xa1,0x12,0x15,0x00,0x91,0x14, 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xaa,0x7a,0xdb,0x36,0x00,0x00,0x00,0x00,0x80,0xaa,0x56,0x00,0x00,0x00,0x00, 0x00,0x40,0xa9,0x92,0xa0,0x14,0xd4,0x4e,0xa0,0x80,0x52,0x20,0x20,0x11,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x20,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xde,0xae, 0xbd,0x3d,0x00,0x00,0x00,0x00,0x40,0xb5,0xea,0x00,0x00,0x00,0x00,0x00,0x50, 0x4a,0x4a,0x16,0xf9,0x1f,0xc0,0x0f,0x55,0x04,0x0a,0x29,0x24,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x16, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xb5,0x75,0xeb,0x1e, 0x00,0x00,0x00,0x00,0x40,0x55,0xd5,0x00,0x00,0x00,0x00,0x00,0x24,0x25,0x55, 0xe1,0x0f,0x00,0x00,0xe0,0x00,0x51,0x81,0xb4,0x60,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x1a,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x58,0xef,0xde,0x5d,0x1b,0x00,0x00, 0x00,0x00,0x60,0xab,0xea,0x00,0x00,0x00,0x00,0x00,0x92,0x52,0x21,0x7e,0x00, 0x00,0x00,0x00,0x56,0x04,0x28,0x28,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x11, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xd0,0xeb,0xba,0x6b,0xeb,0x1e,0x00,0x00,0x00,0x00, 0x50,0xad,0xf5,0x00,0x00,0x00,0x00,0x00,0xa9,0x94,0xd4,0x07,0x00,0x00,0x00, 0x00,0x20,0x91,0x02,0x7d,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc8,0x7e,0x6f,0xbd,0x5d,0x0f,0x00,0x00,0x00,0x00,0x68,0xb5, 0x6a,0x00,0x00,0x00,0x00,0x40,0x54,0x4a,0xfa,0x00,0x00,0x00,0x00,0x00,0x80, 0x20,0x50,0x04,0xa0,0x01,0x00,0x00,0x00,0x00,0xc0,0x3a,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0, 0x01,0x26,0xab,0xb5,0xd7,0xb6,0x0f,0x00,0x00,0x00,0x00,0xa8,0x55,0x6d,0x00, 0x00,0x00,0x00,0x20,0x93,0x52,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x05, 0x21,0x09,0x01,0x00,0x00,0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xfe,0xdb, 0xfe,0xde,0xba,0x6d,0x07,0x00,0x00,0x00,0x00,0x56,0x55,0x75,0x00,0x00,0x00, 0x00,0x90,0x4a,0xca,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x20,0x08,0x20, 0x03,0x00,0x00,0x00,0x00,0x80,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x55,0xdd,0xab,0xb5, 0xed,0xb6,0x07,0x00,0x00,0x00,0x00,0xba,0xaa,0x75,0x00,0x00,0x00,0x00,0xa0, 0x54,0xf9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x4a,0xa2,0x84,0x02,0x00, 0x00,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xaf,0x7e,0xef,0xb6,0xed, 0x03,0x00,0x00,0x00,0x00,0xab,0xad,0x3a,0x00,0x00,0x00,0x00,0x54,0xa5,0x3e, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x01,0x06,0x00,0x00,0x00, 0x00,0x40,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x55,0xf5,0xd7,0x75,0x6f,0xdb,0x01,0x00, 0x00,0x00,0x00,0x55,0xb5,0x3a,0x00,0x00,0x00,0x00,0xa8,0x14,0x0f,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x15,0x50,0x06,0x00,0x00,0x00,0x00,0x80, 0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xff,0xbf,0xed,0xae,0xb5,0xf7,0x00,0x00,0x00,0x00, 0xc0,0x6a,0x55,0x1d,0x00,0x00,0x00,0x00,0x95,0xea,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x04,0x80,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xab,0x6a,0x5b,0xfb,0x6e,0x7d,0x00,0x00,0x00,0x00,0x40,0xad, 0x55,0x1d,0x00,0x00,0x00,0x80,0x52,0xf2,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x90,0x24,0x10,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xfd,0xff,0xfd,0x57,0xbb,0x3b,0x00,0x00,0x00,0x00,0xa0,0xab,0x6a,0x0f, 0x00,0x00,0x00,0x00,0x4a,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x42,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57, 0x55,0xaf,0xfa,0xd6,0x1e,0x00,0x00,0x00,0x00,0xb0,0x5a,0xad,0x0e,0x00,0x00, 0x00,0xc0,0xaa,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0xa0, 0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,0xff,0x75, 0xaf,0x7b,0x0f,0x00,0x00,0x00,0x00,0x50,0xd5,0xaa,0x07,0x00,0x00,0x00,0x50, 0xaa,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x28,0x09, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbe,0xaa,0xde,0xda,0xd6, 0x07,0x00,0x00,0x00,0x00,0xa8,0x5b,0xab,0x03,0x00,0x00,0x00,0xa0,0xd2,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x02,0x18,0x40,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0xff,0xb5,0xb7,0xee,0x01,0x00, 0x00,0x00,0x00,0xd8,0x6a,0xed,0x01,0x00,0x00,0x00,0x98,0xea,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x20,0x19,0xa0,0x01,0x00,0x00, 0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x55,0x7f,0x6d,0xca,0x00,0x00,0x00,0x00, 0x00,0x6e,0xad,0xea,0x00,0x00,0x00,0x00,0x54,0x7a,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x09,0x18,0x90,0x04,0x00,0x00,0x00,0x00, 0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x00, 0xb8,0x01,0x00,0x00,0xa8,0xff,0xd5,0xbb,0x75,0x00,0x00,0x00,0x00,0x00,0x54, 0x55,0x75,0x00,0x00,0x00,0x00,0xa5,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xc0,0x18,0x20,0x19,0x48,0x06,0x00,0x00,0x00,0x00,0x00,0x00, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x80,0x6b,0x1b, 0x00,0x00,0xf0,0xaa,0x6e,0xdd,0x2a,0x00,0x00,0x00,0x00,0x00,0x6b,0xdb,0x3a, 0x00,0x00,0x00,0x00,0x55,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa7,0x04,0x18,0xb0,0x05,0x00,0x00,0x00,0x00,0xc0,0x80,0x3f,0x00, 0x00,0x00,0x00,0x00,0xc0,0x0e,0x00,0x00,0x00,0x00,0x0c,0xf3,0x1b,0x00,0x00, 0x40,0xff,0xbb,0xeb,0x35,0x00,0x00,0x00,0x00,0x00,0xad,0x55,0x1f,0x00,0x00, 0x00,0x80,0xaa,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, 0x27,0x40,0x12,0x98,0x06,0x00,0x00,0x00,0x00,0x80,0x81,0x35,0x00,0x00,0x00, 0x00,0x30,0xc6,0x0d,0x00,0x00,0x00,0x00,0x98,0xd1,0x18,0x00,0x00,0xc0,0xab, 0xee,0x7e,0x4a,0x00,0x00,0x00,0x00,0x80,0xb5,0xaa,0x0e,0x00,0x00,0x00,0x40, 0xd2,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x27,0x12, 0x18,0x40,0x01,0x00,0x00,0x00,0x00,0xc0,0x01,0x1e,0x00,0x00,0x00,0x00,0x30, 0x06,0x07,0x00,0x00,0x00,0x00,0xdc,0x71,0x0f,0x00,0x00,0x00,0xfd,0xbb,0xf5, 0x6e,0x00,0x00,0x00,0x00,0x80,0xd6,0x6a,0x07,0x00,0x00,0x00,0xa0,0xea,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x3f,0x41,0x36,0xe0, 0x01,0x00,0x00,0x00,0x00,0x80,0x01,0x0f,0xa0,0x00,0x00,0x00,0xa0,0x87,0x03, 0x00,0x00,0x00,0x00,0xb8,0xe0,0x07,0x00,0x00,0x00,0x54,0x6d,0x3f,0x33,0x00, 0x00,0x00,0x00,0xc0,0x5a,0xf7,0x03,0x00,0x00,0x00,0x58,0x79,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x3f,0x09,0x39,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x81,0x06,0x94,0x01,0x00,0x00,0xf0,0xc1,0x01,0x00,0x00, 0x00,0x00,0xe0,0xb0,0x01,0x00,0x00,0x00,0xe0,0xff,0x1e,0x00,0x00,0x00,0x00, 0x00,0x40,0x6b,0xb6,0x01,0x00,0x00,0x00,0x48,0x3d,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x3f,0x23,0x35,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x83,0x03,0xc0,0x01,0x00,0x00,0xb0,0xa1,0x01,0x00,0x00,0x00,0x00, 0xb0,0xe3,0x00,0x00,0x00,0x00,0x00,0xa8,0x07,0x00,0x00,0x00,0x00,0x00,0x70, 0xad,0xc9,0x00,0x00,0x00,0x00,0xa4,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf0,0xff,0x01,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd6,0x01,0x94,0x01,0x00,0x00,0xc0,0xe1,0x00,0x00,0x00,0x00,0x00,0x70,0xf3, 0x00,0x00,0x00,0x00,0x00,0xde,0x07,0x00,0x00,0x00,0x00,0x00,0xa0,0x55,0xb6, 0x00,0x00,0x00,0x00,0x9a,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x1f,0xf0,0xff,0xfd,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfb,0x00, 0xa2,0x01,0x00,0x00,0x80,0xfd,0x00,0x00,0x00,0x00,0x00,0xe0,0x7d,0x00,0x00, 0x00,0x00,0x00,0xf4,0x01,0x00,0x00,0x00,0x00,0x00,0xd8,0xb6,0xd7,0x00,0x00, 0x00,0x00,0x64,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a, 0xe0,0x13,0x57,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x80,0x88,0x01, 0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x00, 0x00,0xdf,0x01,0x00,0x00,0x00,0x00,0x00,0xa8,0x5a,0x2b,0x00,0x00,0x00,0x00, 0xd5,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x10, 0xed,0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x00,0xa4,0x01,0x00,0x00, 0x00,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x00,0x80,0xf5, 0x00,0x00,0x00,0x00,0x00,0x00,0x68,0xeb,0x3f,0x00,0x00,0x00,0x80,0xd5,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x38,0x1c,0xba,0x1d, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x80,0x90,0x01,0x00,0x00,0x00,0x15, 0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x00,0xc0,0x7e,0x00,0x00, 0x00,0x00,0x00,0x00,0xb4,0xed,0x01,0x00,0x00,0x00,0x40,0xf4,0x00,0x00,0x00, 0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0xf8,0x3f,0xef,0xdb,0x01,0x00, 0x00,0x00,0x30,0x00,0x00,0x1b,0x00,0x5e,0x00,0x60,0x00,0x00,0x1f,0x00,0x1c, 0x00,0x80,0xf7,0xee,0x1e,0x00,0x00,0x00,0x00,0x40,0x3b,0x00,0x00,0x00,0x00, 0x00,0x00,0x5a,0xf5,0x00,0x00,0x00,0x00,0x80,0x75,0x00,0x00,0x00,0x00,0xd0, 0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0xf8,0x1f,0x7a,0xb5,0x01,0x00,0x00,0x00, 0x60,0x00,0x80,0x6d,0xef,0x1a,0x0f,0xdc,0x01,0xd8,0xda,0x03,0x1b,0x0f,0xbc, 0xfe,0xff,0x1b,0x00,0x00,0x00,0x00,0xc0,0x1f,0x00,0x00,0x00,0x00,0x00,0x00, 0x6c,0x6b,0x00,0x00,0x00,0x00,0x60,0x3a,0x00,0x00,0x00,0x00,0x48,0x02,0x00, 0x00,0x00,0x00,0x00,0x1b,0xf0,0x1f,0xb7,0x62,0x03,0x00,0x00,0x00,0xf0,0x00, 0xd8,0xfe,0xff,0xed,0x1a,0xec,0xfe,0xfd,0xfd,0x7b,0xdd,0xea,0xfd,0x07,0x00, 0x1e,0x00,0x00,0x00,0x00,0xf0,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x7d, 0x00,0x00,0x00,0x00,0xa0,0x1e,0x00,0x00,0x00,0x00,0x24,0x03,0x00,0x00,0x00, 0x00,0x00,0x36,0xe0,0x1f,0x7d,0xd5,0x0f,0x00,0x00,0x00,0xaf,0xc1,0xfb,0x15, 0x00,0xfb,0xef,0x5b,0xfb,0x0f,0x17,0xfe,0xfb,0xff,0x07,0x0d,0x00,0x1b,0x18, 0x00,0x00,0x00,0xa8,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x6d,0x35,0x00,0x00, 0x00,0x00,0xb0,0x0e,0x00,0x00,0x00,0x00,0xd8,0x02,0x00,0x00,0x00,0x00,0x00, 0x7d,0xbf,0xf7,0x36,0xf1,0x1a,0x1f,0xf0,0x61,0xff,0xb6,0xb6,0x1f,0x50,0xde, 0xff,0xff,0xd7,0x6e,0x1d,0x00,0x1f,0x1f,0x80,0xdb,0xb6,0x5d,0x1c,0x00,0x00, 0x00,0xf8,0x03,0x00,0x00,0x00,0x00,0x00,0x80,0x56,0x3b,0x00,0x00,0x00,0x00, 0x4c,0x07,0x00,0x00,0x00,0x00,0x4c,0x03,0x00,0x00,0x00,0x00,0x00,0xd7,0xea, 0xba,0xbb,0x52,0x6f,0xb5,0x57,0xf7,0x41,0x6f,0xef,0x1a,0x00,0xe1,0x00,0x40, 0x7d,0xdb,0x1e,0x00,0x00,0x00,0x80,0xb6,0x6d,0x1b,0x0c,0x00,0x00,0x00,0xa8, 0x03,0x00,0x00,0x00,0x00,0x00,0x80,0xba,0x1d,0x00,0x00,0x00,0x00,0xb0,0x03, 0x00,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0xed,0x5d,0xd7,0xbd, 0xf8,0xfa,0xfe,0xbf,0x3f,0xc0,0xda,0x5a,0x1f,0xa8,0x68,0x00,0x80,0xab,0xbd, 0x0b,0x00,0x00,0x00,0x00,0x7b,0xf7,0x1e,0x0e,0x00,0x00,0x00,0xfe,0x01,0x00, 0x00,0x00,0x00,0x00,0x40,0xd7,0x1e,0x00,0x00,0x00,0x00,0xcc,0x03,0x00,0x00, 0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0xef,0xbd,0x56,0x54,0x1f, 0x17,0xf0,0x01,0x80,0xbf,0xf7,0x0d,0x04,0x75,0x00,0x00,0xf6,0xeb,0x0e,0x00, 0x00,0x00,0x00,0xd6,0xad,0x0d,0x06,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0x00, 0x00,0x00,0xa0,0x5a,0x0d,0x00,0x00,0x00,0x00,0xea,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x7f,0xff,0x3b,0xef,0x1f,0x18,0x00, 0x00,0x80,0x6a,0x5d,0x07,0x50,0x30,0x00,0x00,0x5d,0xbd,0x07,0x00,0x00,0x00, 0x00,0xef,0xde,0x8f,0x07,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00, 0x50,0x6b,0x0f,0x00,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0xa1,0x4f,0x1e,0xfa,0x00,0x00,0x00,0x00,0x00, 0xf7,0xeb,0x01,0x0a,0x3d,0x00,0x00,0xb7,0xd7,0x02,0x00,0x00,0x00,0x00,0xba, 0xb5,0x86,0x03,0x00,0x00,0x80,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0xb5, 0x0e,0x00,0x00,0x00,0x80,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x50,0xf1,0x3f,0x9b,0x57,0x00,0x00,0x00,0x00,0x80,0xad,0xbe, 0x01,0xa0,0x18,0x00,0x80,0xfd,0xbf,0x03,0x20,0x02,0x00,0x00,0xd7,0xef,0xc7, 0x01,0x00,0x00,0x80,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0xdd,0x07,0x00, 0x00,0x00,0x40,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf0,0x51,0x3f,0xdd,0x7a,0x00,0x00,0x00,0x00,0x00,0xfb,0x6f,0x03,0x15, 0x0e,0x00,0x80,0x0e,0x60,0x03,0xa0,0x04,0x00,0x80,0x7a,0xb3,0xee,0x00,0x00, 0x00,0xc0,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0xb7,0x56,0x07,0x00,0x00,0x00, 0x80,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x57, 0xeb,0x6d,0x5b,0x3f,0x00,0x00,0x00,0x00,0xc0,0xfe,0xf0,0x8e,0x40,0x07,0x00, 0xe0,0x07,0xf0,0x0d,0x58,0x07,0x00,0x80,0xff,0xc1,0x7d,0x00,0x00,0x00,0x60, 0x0f,0x00,0x00,0x00,0x00,0x00,0x80,0xaa,0xb5,0x03,0x00,0x00,0x00,0x40,0x1d, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0xbd,0x5d,0xb7, 0xf7,0x1a,0x00,0x00,0x00,0x00,0xc0,0x07,0xc0,0x1b,0x2a,0x07,0x00,0xa0,0x01, 0xc0,0x0f,0xa0,0x02,0x00,0x60,0x0d,0x00,0x3b,0x00,0x00,0x00,0xb0,0x0f,0x00, 0x00,0x00,0x00,0x00,0xe0,0xde,0xd6,0x03,0x00,0x00,0x00,0x40,0x1d,0x05,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0xeb,0xf6,0x7b,0xad,0x0f, 0x00,0x00,0x00,0x00,0xb0,0x01,0x00,0x9e,0xc4,0x03,0x00,0xd0,0x01,0x00,0x1b, 0x50,0x03,0x80,0xa1,0x07,0x00,0x3c,0x00,0x00,0x00,0xd8,0x07,0x00,0x00,0x05, 0x00,0x00,0x58,0x6b,0xab,0x03,0x00,0x00,0x00,0xb0,0x8e,0x06,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x76,0xaf,0xd6,0xfb,0x06,0x00,0x00, 0x00,0x00,0xf0,0x01,0x00,0x34,0xd1,0x01,0x00,0xf0,0x00,0x00,0x1e,0xa0,0x04, 0xd0,0xe1,0x03,0x20,0x3c,0x00,0x00,0x00,0xb0,0x03,0x00,0x80,0x06,0x00,0x00, 0xd4,0x57,0xdd,0x01,0x00,0x00,0x00,0x40,0x07,0x05,0x00,0x38,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0x03,0x00,0x50,0x01,0x00, 0xf0,0x01,0x00,0xbc,0xe8,0x00,0x00,0x78,0x00,0x00,0x1c,0xe8,0x06,0xc4,0xf0, 0x00,0x80,0x3e,0x00,0x00,0x00,0xfc,0x03,0x00,0x40,0x12,0x00,0x00,0xea,0x7b, 0xeb,0x01,0x00,0x00,0x00,0xb0,0x87,0x07,0x00,0x56,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x28,0xc1,0x00,0x00,0x24,0x0d,0x00,0xc8,0x01, 0x00,0x40,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x03,0xe0,0x00,0x00,0x00, 0x07,0x00,0x00,0x00,0xd6,0x01,0x00,0x20,0x19,0x00,0x00,0xfd,0xac,0xda,0x01, 0x00,0x00,0x00,0xac,0x03,0x00,0x00,0xec,0x00,0x00,0x00,0x18,0x00,0x00,0x00, 0x00,0x00,0x40,0x15,0x56,0xe1,0x00,0x80,0xaa,0x1a,0x00,0xf5,0x00,0x00,0x90, 0x3a,0x00,0x28,0x08,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x10,0x09,0x03,0x00, 0x00,0x00,0xfa,0x00,0x00,0xc0,0x16,0x00,0xc0,0x7b,0xab,0xd7,0x00,0x00,0x00, 0x00,0xa8,0x03,0x00,0x00,0xbb,0x01,0x00,0x00,0x6a,0x00,0x00,0x00,0x00,0x00, 0xa8,0x0f,0xaa,0x68,0x00,0x40,0x52,0x19,0x80,0x64,0x00,0x00,0x48,0x1c,0x00, 0xb4,0x64,0x00,0x00,0x00,0x00,0x40,0x80,0x00,0x40,0x00,0x00,0x00,0x00,0x00, 0xef,0x00,0x00,0x60,0x1a,0x00,0x40,0x1d,0xdd,0xda,0x00,0x00,0x00,0x00,0xd4, 0x01,0x00,0xff,0xee,0x01,0x00,0x80,0xed,0x00,0x00,0x00,0x00,0x00,0xfd,0x00, 0x55,0x72,0x00,0xa0,0x2b,0x1d,0x00,0x2a,0x00,0x00,0x20,0x0f,0x00,0x92,0xc2, 0x00,0x00,0x00,0x00,0x00,0x49,0x01,0x04,0x21,0x00,0x0f,0x00,0x80,0x7b,0x00, 0x00,0x00,0x05,0x00,0x78,0x8f,0x6a,0xad,0x01,0x00,0x00,0x00,0xea,0x00,0xf0, 0xfa,0xf5,0x01,0x00,0x80,0x76,0x00,0x2c,0x00,0x00,0xc0,0x1e,0x00,0x2a,0x30, 0x00,0xd4,0xa9,0x1a,0xa0,0x49,0x01,0x00,0x88,0x07,0x00,0xc9,0xe8,0x00,0x00, 0x12,0x00,0x10,0x00,0x02,0x00,0x84,0xe0,0x03,0x00,0x40,0x7d,0x00,0x00,0x80, 0x07,0x00,0xd4,0x07,0xad,0xf5,0x01,0x00,0x00,0x00,0xea,0x00,0xd4,0x47,0xef, 0x00,0x00,0x60,0x7b,0x00,0xd7,0x00,0x00,0xb0,0x07,0x00,0x15,0x3a,0x00,0x64, 0x40,0x1d,0x40,0x54,0x02,0x00,0xa4,0x03,0x00,0xb6,0x65,0x00,0x80,0x30,0x00, 0x20,0x49,0x06,0xf0,0x50,0x7f,0x00,0x00,0xc0,0x3f,0x00,0x00,0x00,0x00,0x00, 0xdb,0x83,0xd7,0x9a,0x01,0x00,0x00,0x00,0x75,0x00,0xff,0x80,0x7a,0x00,0x00, 0xd0,0x7a,0xc0,0xfa,0x00,0x00,0xd4,0x03,0x80,0x8a,0x1c,0x00,0x1a,0xa0,0x0e, 0x50,0x25,0x19,0x00,0xe0,0x01,0x00,0xd3,0x70,0x00,0x40,0x3c,0x00,0x40,0x00, 0x04,0x00,0x30,0x00,0x00,0x00,0xe0,0x3a,0x00,0x00,0x00,0x00,0x00,0xf5,0x80, 0x7a,0x6f,0x03,0x00,0x00,0x00,0x75,0xc0,0x7a,0xc0,0x57,0x00,0x00,0xb0,0x3d, 0x40,0xab,0x01,0x00,0xea,0x01,0x40,0x25,0x0c,0x80,0x0e,0x20,0x07,0x80,0x92, 0x34,0x00,0x74,0x00,0x00,0x28,0x3d,0x00,0x10,0x19,0x00,0xc0,0x94,0x0c,0x00, 0x3a,0x00,0x00,0x00,0x50,0x1f,0x00,0x00,0x00,0x00,0xc0,0x7f,0xc0,0xaa,0xb2, 0x03,0x00,0x00,0x80,0x3a,0x60,0x1f,0x80,0xfa,0x01,0x00,0x6c,0x1b,0xb0,0xd5, 0x01,0x00,0xea,0x00,0x80,0x82,0x0e,0x80,0x0e,0xd8,0x03,0xa0,0x54,0x35,0x00, 0x39,0x00,0x00,0x7c,0x1e,0x00,0x40,0x1e,0x00,0x20,0x00,0x08,0x00,0x1c,0x00, 0x00,0x00,0xf8,0x1d,0x00,0x00,0x00,0x00,0x50,0x3d,0x40,0xad,0xad,0x06,0x00, 0x00,0x80,0x3a,0xd8,0x1d,0x00,0x57,0x03,0x00,0xd8,0x1e,0xd0,0xbe,0x01,0x80, 0x76,0x00,0x40,0x09,0x07,0x40,0x07,0xd0,0x01,0xd0,0xa5,0x3a,0x0a,0x3a,0x00, 0x00,0x84,0x07,0x00,0x14,0x0e,0x00,0x08,0x22,0x19,0x00,0x1c,0x00,0x00,0x00, 0xac,0x1e,0x00,0x00,0x00,0x00,0xe8,0x0e,0x80,0xd7,0xda,0x06,0x00,0x00,0x00, 0x1d,0x6c,0x0f,0x00,0xbd,0x07,0x00,0x6e,0x0f,0xbc,0xd2,0x01,0x80,0x7a,0x00, 0x40,0x21,0x03,0x40,0x03,0xed,0x00,0x04,0x54,0x1c,0x0d,0x1c,0x00,0x00,0xd0, 0x03,0x00,0x80,0x07,0x00,0x00,0x08,0x18,0x40,0x0c,0x00,0x00,0x00,0xf4,0x0f, 0x00,0x00,0x00,0x00,0xb6,0x07,0xc0,0x7a,0x6d,0x0d,0x00,0x00,0x40,0x1d,0xf6, 0x07,0x80,0xd5,0x06,0x00,0xda,0x0e,0xf0,0xae,0x01,0xc0,0x35,0x00,0xa0,0x84, 0x03,0xa0,0x43,0x3a,0x00,0x00,0x20,0x0f,0x0a,0x0d,0x00,0x00,0xe5,0x00,0x00, 0xd4,0x01,0x00,0x00,0x80,0x1c,0x00,0x0e,0x00,0x00,0x00,0x5c,0x0d,0x00,0x00, 0x00,0x00,0xda,0x03,0x80,0xaa,0xab,0x0f,0x00,0x00,0x40,0x0d,0x5a,0x07,0x40, 0x7c,0x0f,0x00,0x6f,0x07,0x49,0xf5,0x01,0xa0,0x3a,0x00,0x50,0xd1,0x01,0x40, 0xd5,0x0f,0x00,0x00,0x90,0x07,0x0f,0x0d,0x00,0x00,0x70,0x00,0x00,0xe2,0x00, 0x00,0x00,0x20,0x18,0x20,0x06,0x00,0x00,0x00,0xf7,0x0f,0x00,0x00,0x00,0xc0, 0xff,0x01,0xc0,0x56,0x6d,0x19,0x00,0x00,0xa0,0x0e,0xee,0x07,0x40,0xa8,0x0d, 0x00,0xb5,0x07,0x80,0x9b,0x01,0xa0,0x36,0x00,0xac,0xc0,0x00,0x50,0xff,0x00, 0x00,0x00,0xa0,0x03,0x80,0x0c,0x00,0x00,0x75,0x00,0x00,0x71,0x00,0x00,0x00, 0x00,0x0e,0x00,0x06,0x00,0x00,0x00,0xbd,0x0e,0x00,0x00,0x00,0x40,0x75,0x00, 0x40,0xed,0x56,0x1d,0x00,0x00,0x40,0x8f,0xbb,0x06,0x00,0xf0,0x0e,0x80,0x6d, 0x07,0x00,0xed,0x01,0xd0,0x3a,0x00,0xd2,0xea,0x00,0xa8,0x03,0x00,0x00,0x00, 0xd0,0x01,0x00,0x0a,0x00,0x00,0x30,0x00,0x80,0x34,0x00,0x00,0x00,0xa0,0x0c, 0x20,0x06,0x00,0x00,0x80,0xd7,0x0f,0x00,0x00,0x00,0xf8,0x3e,0x00,0x40,0x57, 0xeb,0x36,0x00,0x00,0xb0,0x86,0xee,0x07,0x18,0x5c,0x0f,0xc0,0xb6,0x03,0x80, 0x55,0x01,0x60,0x6b,0x00,0x52,0x71,0x00,0xa8,0x01,0x00,0x00,0x00,0xe8,0x00, 0x40,0x11,0x00,0x40,0x35,0x00,0x40,0x30,0x00,0x00,0x00,0x00,0x0e,0x80,0x04, 0x00,0x00,0xc0,0x7a,0x0d,0x00,0x00,0x00,0x54,0x0f,0x00,0x80,0x5c,0x3d,0x6b, 0x00,0x00,0xa0,0x87,0x7b,0x07,0x08,0xe8,0x0e,0x50,0xdb,0x03,0x80,0xb6,0x03, 0x58,0x55,0x40,0x51,0x3d,0x00,0x50,0x03,0x00,0x40,0x00,0x64,0x00,0x08,0x2a, 0x00,0x00,0x40,0x00,0x10,0x35,0x00,0x00,0x00,0x00,0x07,0x08,0x0c,0x00,0x00, 0x40,0xdf,0x1f,0x00,0x00,0x00,0xed,0x07,0x00,0x80,0x94,0xd5,0x6a,0x00,0x00, 0x50,0xc3,0xae,0x0d,0x17,0xbe,0x0f,0x88,0xad,0x06,0x00,0xdb,0x03,0xab,0xb6, 0x51,0x55,0x15,0x00,0xaa,0x06,0x00,0x20,0x00,0x70,0x00,0x60,0x01,0x00,0x40, 0xd5,0x00,0x40,0x20,0x00,0x08,0x09,0x40,0x03,0x20,0x10,0x00,0x00,0xc0,0xb5, 0x1a,0x00,0x00,0x80,0xdb,0x03,0x00,0x00,0xeb,0x6b,0xdb,0x00,0x00,0xa8,0x83, 0xf7,0xb7,0x09,0xd4,0x06,0xf3,0xf6,0x15,0x00,0xad,0x82,0xd8,0xaa,0xda,0xa8, 0x2a,0x80,0xa8,0x0a,0x00,0x88,0x00,0x6a,0x80,0x1a,0xaa,0x04,0x80,0x08,0x00, 0x24,0x4a,0x80,0x44,0x18,0x80,0x03,0x00,0x01,0x00,0x08,0x60,0xef,0x3f,0x00, 0x00,0xe0,0xfe,0x00,0x00,0x00,0x54,0xad,0xad,0x01,0x00,0xd0,0xe3,0x5d,0xfd, 0x07,0x77,0xcf,0x4c,0x5b,0x0f,0x80,0x6b,0xdb,0x6f,0xdb,0x6a,0xa8,0x55,0x55, 0x56,0x25,0x00,0x42,0x80,0x6a,0x20,0x4e,0x11,0x11,0x28,0x52,0x05,0x0d,0x01, 0xa0,0x01,0x12,0xc0,0x01,0x10,0x10,0x00,0x07,0xf0,0x7b,0x35,0x00,0x00,0x58, 0x7b,0x00,0x00,0x00,0xea,0x76,0xb5,0x01,0x00,0xac,0xa1,0xee,0xaf,0x83,0xba, 0xf5,0xa7,0x6d,0x07,0x00,0xb5,0xed,0x53,0x55,0x75,0xa9,0xaa,0xaa,0x4b,0xaa, 0xaa,0x3c,0x80,0x44,0x85,0x47,0x8a,0x44,0xbd,0x04,0x50,0xaf,0x54,0xe5,0x90, 0x30,0xd0,0x00,0x00,0x02,0x80,0x03,0xa0,0xae,0x7f,0x00,0x00,0xec,0x1e,0x00, 0x00,0x00,0x94,0xab,0x56,0x03,0x00,0xd4,0xe1,0x77,0xf5,0x01,0xd7,0xde,0xc1, 0xb6,0x03,0x00,0xae,0xea,0xb0,0x6a,0x3b,0x50,0x55,0xd5,0xa9,0xaa,0x92,0x1e, 0xa0,0xaa,0xd4,0x03,0x51,0x28,0x0e,0xa8,0x8a,0x03,0x00,0x70,0x00,0x2a,0x60, 0x00,0x48,0x40,0xe4,0x01,0xf8,0xfb,0xd5,0x00,0x80,0xb7,0x0f,0x00,0x00,0x00, 0xdd,0x5a,0xdb,0x06,0x00,0xe8,0xa1,0xba,0xff,0xc0,0xbd,0xf5,0xa0,0xed,0x01, 0x00,0x75,0x7b,0x58,0x57,0x9d,0xaa,0x56,0x94,0xa8,0x52,0x55,0x0f,0x90,0x24, 0xe9,0x81,0x8a,0x82,0x87,0x42,0xe0,0x51,0x55,0x3d,0xa0,0x40,0x30,0x00,0x00, 0x02,0x70,0x00,0xb0,0xae,0x7e,0x03,0x70,0xed,0x03,0x00,0x00,0x00,0xf6,0xed, 0x6a,0x0d,0x00,0xd4,0xc0,0xdf,0x3a,0x40,0x6b,0x3f,0xe0,0xf6,0x00,0x00,0xab, 0x3d,0xa0,0xb5,0x0e,0xa0,0xaa,0xeb,0xa0,0x4a,0xaa,0x07,0x40,0x95,0x74,0x00, 0x24,0xd4,0x03,0x91,0xea,0x00,0x00,0x0e,0x00,0x24,0x1d,0x00,0x20,0x10,0x3c, 0x00,0xe8,0xf7,0xd7,0x1d,0xae,0xf7,0x01,0x00,0x00,0x00,0xa0,0x56,0xad,0x0d, 0x00,0xea,0x40,0xb5,0x1f,0x80,0xdd,0x1f,0x40,0x7b,0x00,0x00,0xdd,0x1e,0x70, 0xd5,0xa7,0xda,0xaa,0x54,0xa0,0xaa,0xd2,0x01,0x20,0xa9,0x3a,0x00,0x91,0xe2, 0x00,0x0a,0x78,0xa0,0xaa,0x07,0x80,0x00,0x0e,0x00,0x00,0x81,0x0e,0x00,0xbc, 0xba,0x7a,0xef,0xf5,0x7d,0x00,0x00,0x00,0x00,0xa0,0xb5,0xb6,0x1a,0x00,0xec, 0x80,0xef,0x07,0xc0,0xee,0x07,0xc0,0x3d,0x00,0x00,0xaa,0x07,0xa0,0xd6,0x0b, 0x78,0x55,0x6b,0x80,0x2a,0xf5,0x00,0xa0,0x4a,0x1e,0x00,0x4a,0x7c,0x00,0xa0, 0x1e,0x00,0xc0,0x03,0x00,0xca,0x07,0x00,0x00,0x84,0x07,0x00,0xf4,0xdf,0xdf, 0xb5,0xae,0x3e,0x00,0x00,0x00,0x00,0xc0,0xda,0xd5,0x36,0x00,0x75,0x00,0xfc, 0x01,0x80,0xf5,0x01,0x80,0x1e,0x00,0x00,0xf4,0x03,0xc0,0xfa,0x40,0x9d,0xaa, 0x94,0x80,0x52,0x3d,0x00,0x80,0xa4,0x0f,0x00,0x24,0x1f,0x00,0x94,0x0f,0x80, 0xfa,0x00,0x00,0xe0,0x01,0x00,0x40,0xf0,0x01,0x00,0x5c,0xb5,0x6a,0xdf,0xdb, 0x0f,0x00,0x00,0x00,0x00,0x40,0xad,0x5a,0x2b,0x00,0x6a,0x00,0x00,0x00,0x00, 0x3e,0x00,0x80,0x0f,0x00,0x00,0xf8,0x00,0x00,0x3f,0x14,0x0e,0xff,0xdd,0x00, 0xaa,0x0f,0x00,0x00,0xd2,0x03,0x00,0xe0,0x03,0x00,0xf8,0x01,0x00,0x3e,0x00, 0x00,0x7e,0x00,0x00,0x00,0x7f,0x00,0x00,0xf4,0xef,0xff,0xf5,0xfe,0x07,0x00, 0x00,0x00,0x00,0x80,0xb7,0xad,0x6c,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0x07,0x00,0x66,0x00,0xf0,0x01, 0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x7b,0x55,0xbf,0xd5,0x01,0x00,0x00,0x00, 0x00,0x00,0x54,0xb5,0xb5,0x00,0x75,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0xd0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf4,0xad,0xff,0x6a,0x7f,0x00,0x00,0x00,0x00,0x00,0x00, 0xd4,0xd6,0xca,0x81,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x5c,0xff,0xaa,0xdf,0x3d,0x00,0x0c,0x03,0x00,0x00,0x00,0xab,0xaa, 0x36,0x03,0x35,0x00,0x00,0x00,0x00,0x18,0x1c,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa0,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00, 0x00,0xc0,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf4,0x55,0xff,0xf5,0x0f,0x00,0x08,0xe1,0xef,0x1f,0x80,0x6b,0xd7,0xea,0xf2, 0x7f,0x10,0xfe,0xf8,0x00,0x38,0x1c,0xfe,0x70,0xe0,0xc0,0x00,0x03,0x7f,0x08, 0x7a,0x90,0x7f,0xfe,0xf8,0xc0,0x0f,0x03,0x0e,0x7f,0x00,0xc6,0x30,0x04,0x40, 0x00,0x82,0xc0,0x80,0x83,0x83,0x3f,0x86,0x00,0x00,0x00,0x00,0x00,0x6c,0xff, 0xab,0xde,0x03,0x00,0x98,0x20,0x02,0x07,0x80,0x94,0x57,0x3a,0x87,0x70,0x10, 0x02,0x28,0x01,0x38,0x06,0x06,0xac,0x58,0xc1,0xc1,0x0d,0x41,0x20,0xdb,0x10, 0x1c,0x8a,0x18,0x63,0x80,0x83,0x1b,0x45,0x00,0x83,0x31,0x04,0x40,0x00,0xc2, 0xe0,0xe0,0x46,0x8d,0x24,0x86,0x00,0x00,0x00,0x00,0x00,0xdc,0x55,0xfd,0xfb, 0x00,0x00,0xd0,0x20,0x00,0x03,0x80,0xa4,0xd4,0x0c,0x8a,0x70,0x10,0x02,0x08, 0x01,0x48,0x1a,0x02,0x04,0x08,0x40,0x21,0x00,0x01,0x12,0x43,0x11,0x08,0x02, 0x08,0x23,0x80,0xc2,0x00,0x01,0x00,0x01,0x51,0x04,0xc0,0x07,0xc6,0xa0,0x30, 0x40,0x80,0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0xf8,0xfe,0xab,0x3e,0x00,0x00, 0x60,0xe0,0x03,0x03,0xc0,0x84,0x4a,0xcc,0x96,0xd9,0x1f,0x3e,0xf8,0x01,0x58, 0x0b,0x3e,0x78,0xf0,0x20,0x21,0x00,0x1f,0xc0,0x43,0x13,0x0c,0x3e,0xf8,0xe1, 0x83,0x44,0x00,0x1f,0x00,0x01,0x91,0x04,0x40,0x06,0xa4,0x21,0x11,0xc0,0x83, 0x0f,0x92,0x00,0x00,0x00,0x00,0x00,0xa0,0xab,0xfe,0x0f,0x00,0x00,0x20,0x20, 0x01,0x03,0xc0,0x0f,0xdb,0x26,0xb6,0x58,0x00,0x2a,0xc8,0x40,0xd8,0x19,0x22, 0x80,0x01,0xa3,0x22,0x0e,0x15,0xea,0x43,0x14,0x0c,0x16,0x88,0x20,0xc0,0x44, 0x00,0x13,0x00,0x81,0x11,0x05,0x40,0x00,0xaa,0x30,0x11,0x00,0x8c,0x05,0xa2, 0x00,0x00,0x00,0x00,0x00,0xe0,0xfe,0xeb,0x01,0x00,0x00,0x20,0x20,0x00,0x03, 0x60,0x10,0x61,0x8c,0xd3,0x5a,0x10,0x02,0x88,0x50,0x99,0x18,0x02,0x00,0x01, 0xb2,0x22,0x08,0x01,0x71,0x42,0x14,0x0c,0x02,0x88,0x21,0x40,0xce,0x10,0x01, 0x00,0x83,0x10,0x07,0x40,0x00,0x98,0x90,0x33,0x04,0x88,0x00,0xe2,0x00,0x00, 0x00,0x00,0x00,0x80,0x55,0x3f,0x00,0x00,0x00,0x20,0xe0,0x0f,0x03,0x20,0x10, 0x5a,0xfa,0xa1,0x59,0x10,0xfa,0x08,0xa9,0x8a,0x18,0xfe,0xdc,0xb8,0x11,0xc4, 0x0d,0x77,0x3c,0x42,0x18,0x0c,0xfe,0x08,0x61,0x20,0x88,0x1f,0x7f,0x00,0xfc, 0x10,0x06,0x40,0x1f,0x92,0x08,0xe2,0xc7,0x8d,0x3f,0xc2,0x00,0x00,0x00,0x00, 0x00,0x00,0xfe,0x03,0x00,0x00,0x00,0x40,0x00,0x02,0x00,0x00,0x00,0xa2,0x04, 0x94,0x1c,0x10,0x24,0x00,0x45,0x0a,0x00,0x20,0x50,0xa0,0x00,0x00,0x00,0x29, 0x0f,0x02,0x00,0x00,0x90,0x00,0x00,0x00,0x00,0x04,0x40,0x00,0x00,0x00,0x00, 0x80,0x08,0x00,0x01,0x00,0x01,0x02,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x5a,0x68,0x1c, 0x00,0x00,0x00,0x50,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x55,0x57,0x0d,0x00,0x00, 0x00,0x56,0x55,0x0a,0x00,0x00,0x00,0x00,0x00,0x40,0xe5,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x55,0x55,0x0d,0x00,0x00,0x00,0xa9, 0x4a,0x15,0x00,0x00,0x00,0x00,0x00,0x20,0x78,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0x56,0x55,0x0d,0x00,0x00,0x00,0x25,0x29,0x29, 0x00,0x00,0x00,0x00,0x00,0x14,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x28,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xda,0xaa,0x0e,0x00,0x00,0x00,0x55,0xa5,0x64,0x00,0x00, 0x00,0x00,0x80,0x42,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xd6,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xaa,0x5a,0x0d,0x00,0x00,0x80,0x2a,0x55,0x55,0x00,0x00,0x00,0x00, 0x00,0xd4,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x54,0xab,0x0d,0x00,0x00,0x00,0xa5,0x94,0xaa,0x00,0x00,0x00,0x00,0x50,0xf9, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0xaa, 0x1a,0x00,0x00,0x00,0xaa,0x52,0x49,0x01,0x00,0x00,0x00,0x09,0x3e,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x5a,0x15,0x00, 0x00,0x00,0xa8,0xaa,0xa4,0x02,0x00,0x00,0x00,0xc4,0x0f,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xba,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xab,0x3a,0x00,0x00,0x00, 0x94,0x4a,0x55,0x0a,0x00,0x00,0x52,0xf1,0x01,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0x6a,0x00,0x00,0x00,0x50,0x2a, 0x95,0x12,0x00,0x40,0x08,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x6b,0x00,0x00,0x00,0x40,0xa5,0x52,0x4a, 0x25,0x29,0xc5,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x54,0xd5,0x00,0x00,0x00,0x00,0x55,0x4a,0x29,0x92,0x04, 0xfd,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x09,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x54,0xd5,0x00,0x00,0x00,0x00,0x54,0x29,0xa5,0x54,0xb2,0x1e,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xa8,0xaa,0x01,0x00,0x00,0x00,0xe0,0xa5,0x94,0x92,0xda,0x12,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x40,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0xb5, 0x01,0x00,0x00,0x00,0x00,0xfc,0xaa,0xec,0x3f,0x19,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa0,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x80,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0xab,0x03,0x00, 0x00,0x00,0x00,0x00,0xf8,0x1f,0xc0,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x40,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x55,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x60,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x0d, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x55,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x06,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xa8,0xaa,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xd0,0x56,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa8,0x5a,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8, 0xaa,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x24,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x55,0x0d, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x92,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x6a,0x0d,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x6c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x55,0x0d,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa6,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x50,0xab,0x1a,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x60,0x55,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xa0,0xaa,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x50,0xd5,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x5b, 0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xaa,0x3a,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x55,0x35,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0xaa,0x3a,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x40,0x55,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0xdb,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x40,0x55,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, 0xaa,0x3a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x64,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x35, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x3a,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x35,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd4,0x3a,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x54,0x3b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa8,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xa8,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50, 0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x0f,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; wanderlust-wanderlust-769699d/etc/icons/wl-stable-xmas-logo.xpm000066400000000000000000002532601406661363500246270ustar00rootroot00000000000000/* XPM */ static char *wl-stable-xmas-logo[] = { /* width height num_colors chars_per_pixel */ " 491 176 30 1", /* colors */ ". c None", "a c #000000", "b c #030404", "c c #0c1112", "d c #1d2628", "e c #22529c", "f c #295eb6", "g c #3162bb", "h c #3864bc", "i c #3f65bb", "j c #444a5e", "k c #4d6abf", "l c #596cbf", "m c #6771c4", "n c #6c73c4", "o c #6e6cad", "p c #7574c5", "q c #837aca", "r c #917dca", "s c #9c82cc", "t c #ae82bd", "u c #b28bd4", "v c #c090d3", "w c #c994d2", "x c #d09ad9", "y c #e3abd8", "z c #f4a460", "A c #f6c8dc", "B c #ff0000", "C c #ffffff", /* pixels */ "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................CaCa...............................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................aCaa...............................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................CaCa...............................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................................aaaa...............................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "..................................................................................................................................................................................................................................uuuuuuuuuu...............................................................................................................................................................................................................................................................", ".......................................................................iii................................................................................................................................................uuuuuuuuuuuuuuuuuuuuuuuuu........................................................................................................................................................................................................................................................", "......................................................................iiiib..........................................................................................................................................uuuuuuuuuuuuuuuuuuuuuuuuuuvvvvvuuu....................................................................................................................................................................................................................................................", ".....................................................................iiiiicc......................................................................................................................................uuuuuuuuuuuuuuuuuuuuuuuuuuvvvuuuuvvvvvvuv................................................................................................................................................................................................................................................", "....................................................................hiiiiidb..................................................................................................................................ssuuuutuuuuuuuuuuuuuuuuuvuvuuuuuuvvvuvvuvvwvvvt..............................................................................................................................................................................................................................................", "...................................................................iiiiiiidb................................................................................................................................suuuuuuuuuututuuuuuuuuuuuuuuuuuuuuvuuuvvvvvvvvvvvvwt...........................................................................................................................................................................................................................................", ".................................................................iiihiiiikjb.............................................................................................................................suuuuusuuuuuuuuuuuuuuuuuuuuuuuuvuuuuuuvvuuuvuvvvvvwwvwvwr.........................................................................................................................................................................................................................................", "................................................................hhhiiiiiiieb...........................................................................................................................ssusssuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuvuvuuvvvvvvvvvwvvwvwwwvt.......................................................................................................................................................................................................................................", "...............................................................iiihihiiiiieb........................................................................................................................rsssssuussusuuuuuuuuuutuuuuuuuuuuuuuuuuuuuuvuuvuvuvvvvvvvvvvwwwvto.....................................................................................................................................................................................................................................", "..............................................................ihhhiiiiiiikjb......................................................................................................................rssssusussuuuuutuutuuuuuuuuuuuuuuuuuuuuuuuvuvuvvuvvvvvvvvvvwwwvwwwwxo....................................................................................................................................................................................................................................", "............................................................hhiiiihihiiiiidb...............................................................................................................Ca..Casrsssssssususuuuuuuuuuuuuuutuuuuuuuuuuvvuuuuuvuuvvuvvvvvvvvvvvvwvwwwwvtj..................................................................................................................................................................................................................................", "...........................................................hhhihhhiiiiiiikdb..............................................................................................................CCaCaCCassrssusususuusuuuuuuuuuuuuuuuuuuuuuuuuuuuuvuuvvuuvvuvvvvwwwwwwwwwwvxxwwj.................................................................................................................................................................................................................................", "..........................................................hhhhiiiihiiiiiiidb..............................................................................................................aaCaCaaarssssssssuususuuuuuuuuuuuuuuuuuvuuuuuuuuuuuuuuvvvuvvvvvvvvvvvvwvwwwwxwwxo................................................................................................................................................................................................................................", "........................................................hhhhihhhhhiiiiiiikdb...............................................................................................................CaCaCarssrssusuussuuuuuutuuuuuuuuuuuuuuuuuuuuuuuuvuuvuuuvvvvvvvvvvwvwwwwwwwwwxwxtj..............................................................................................................................................................................................................................", ".......................................................hghhhhhiiiihhiiiiiibb...............................................mmm...........................................................rraCaCaasrsssssssuuuuuuuuuuutuuututuuuuuuuuuuuvuuuuvvuvvvvvuvvvvvvvvwvvwvwvwwxwwwxwtd.............................................................................................................................................................................................................................", ".....................................................ghhhhhiihhhhhiiiiiiikbb.............................................mmmmmnni.......................................................rrCCaCaCCassssrussssssuuuuuuuuuuuuuuuuuuvuuuuuuuuuuuuuuuuuuuvuvvvvvvwvwwwwwwwwwwxxwxxtd............................................................................................................................................................................................................................", "...................................................hhghhhhhhihhiiiihiiiiiebb...........................................lmmmmmmmnmj....................................................rrrraCaaaCaassrsssssuuussuuuuuuutuuuuuuuuuuuuuuuuuvuuuuuuvvvvvvvvvvvwvvvvvwvwwwwwwwxwxxxtc............................................................................................................................................CaCa...........................................................................", "..................................................hgghghhhhhhiihhhiihiiiidb...........................................mmmmmnnmnmnnd..................................................rrrrrraasraarrsssruuusssutuuutuuuuuuuuuuuuuuuuuuuuuuuuuuvvuuuuvvvvvvvvvvwvvwwwwwwxwwwxwwxxoc...........................................................................................................................................aCaa...........................................................................", "................................................gghhghghhhhhihhiihiihiiiidb..........................................mmommmmmmnmnneb...............................................rrrrrrrsrrssrrsrsssssssuuuursuuuutuuuututuuuuuuuuuuuuvuuuuuuvvvuvuvvvvvvvvwwvvvwvwwwwwwxxwxxxj.........................................................................................................................................Ca.Ca.Ca.........................................................................", "..............................................gghhhghhhhhhhhhhihhiiiiiiiibb.........................................lmmmmmmmnmmnmnlb..............................................rrrrrrrrrsrrrrsssssssssusssuuuuuuuuuuroooooooootuuuuuuuuuuuuvuuuvuvvvvvvvwwvvvwwwwwvxxxxwwxwxxxd........................................................................................................................................aCCaCCaa.........................................................................", "............................................ggghgghhhhghghhhhhhihhiihiiiebb........................................mllmlmmmmmmmnmnmbc............................................rrqrrrrrsrsssssssrsssssssuusuuoodddbbbbbc.........ccjdoouuuwuuvvuvvuvvvvvvvwwwvwwwwwwwCaCaxxxxxxtc.......................................................................................................................................CaaCaaCa.........................................................................", "..........................................fggggggghhgghhhhhhihihiihiiiiidb........................................llmmmmmmmmnnnmnnnbb..........................................qqqrrrrrrrrsrrrrrrssssssusuojdbbbb.........................jjouvuuvuvvvvvvvvvvvvwvvwwwwwaCaawxwxxxxjc......................................................................................................................................aa.Ca.aa.........................................................................", ".................................CaCa...gggfggggggghhhhhhhhhhhhhhihihiifbb.......................................lmlmmmmmmmmmmnmmnmbb.........................................qrrrrrrrrrrrrrsrssrsrsssojdbbb..................................jouvuvuuvvvvvvwwvvwwvwwwwCaCawxwxxxxxd................................................Ca..Ca..................................................................................CaCa............................................................CaCa...........", ".................................aCaafggfgggggghhghggghhhhhhihiiihiiiiidbc.......................................mlmllmmmmmmmmmnnnebb........................................qqrqqrrrrrrrrsrrsrrsrqodbbb.........................................oovvvvvvvvvvvvwwwwwvxxaaaaxxxwxxxxtb..............................................CCaCaCCa.................................................................................aaaa............................................................aCaa...........", "...............................Ca.CafCagffgfggggfghhhgghhhhhhhhhiihihiebb.......................................lmlmmlolmmmmnmmmmmjb.......................................qqrqrrrrrrrrrrrsrrsssodbbc...............................................tvvvvvvvwwwvwwwwwwvwxxwwxxxxxxxxjc.............................................aaCaCaaa.................................................................................................................................................CaCa...........", "...................ffe........faCCaCCaafgfggggggghggghhhhhhhihhihhiiiidbc......................................lolmllmmmmmmnmnnnnndb......................................qqrqqrqrrrrrrrrrrrrodbbb....................................................tvvvvvvvvwvvwwwwwwwwxxxxxxxxxxvb..............................................CaCaCa..................................................................................................................................................aaaa...........", "...................ffffffffffffCaaCaaCaggggggghghghhhhghhhhhhhhiiihiiebb......................................mmllmmmmmmmmmmmmmmnlbb.....................................qqqqqqrqrrrrrrrrrsjdbbc........................................................vvvwvwvwwvwwwwwwwwwwxxxxxxxxxdc.............................................aCaCaa.................................................................................................................................................................", "....................fffffffffffaafCagaafgfggggggghhghghhhhhhiihhhhiiicbc.....................................llllllllmmmmmmmmmnnmjbc....................................qrqqqrqqrrrrrrrrpjcbb............................................................uvvvvwvwwvwwxxwxxxxwwxxxxxxxtb............................................CCaCaCCa................................................................................................................................................................", "....................fffffffffffffCaCaggfgffggghggggghhhhhhhhhhiiiihhdbb......................................llmlommlllmmmmmnmmnncb....................................qqqqrqrrqrrrrrrpjbbc................................................................vwvvwvwwvwwxvwwwxxwwxxxxxxxcc...........................................aCaaaCaa................................................................................................................................................................", "....................fffffffffffffaaaaffgfggfgggggghhggghhhhhhihhhhijbb......................................llllmmllmmmmmmmnmmnmjbb...................................qqqrqqqrqrqrrrojbbc...................................................................vwwvwwwwvwwwvxxwxxxxxxxxxxjb............................................aa..aa.................................................................................................................................................................", "....................fffffffffffffffffffggggfgggfhgghhhhhhhhhhhhiiiebb......................................llllllmmlmmlmmmmmmmnncb...................................qqqqqqqqrqrrrrjbbc......................................................................vvwvvwwwwwxwwxwxxwxxxxxxxtb...................................................................................................................................................................................................................", ".....................fffffffffffffffffgffggggghggghghgghhhhihhihhebb......................................klllllllomlmmmmmmmnmmjbb..................................qqqqqqqqqqrrqecbb.........................................................................wvwwwwwwxwwxwxxxxxxxxxxxxcc..................................................................................................................................................................................................................", ".....................ffffffffffffffggfggfgggggggghhhhhghihhhihhidbb.......................................kllllmlmlmlmolmmmmmmebb..................................qqqqqqqqqqqqodbb............................................................................wwvwwwwwxwxwwwxxxxxxxxxxjb..................................................................................................................................................................................................................", ".....................fffffffffffffffffffgfgfggghhghggghhhhhhhhfdbb.......................................lllllmlllmlmmmmmmmmnlcbc.................................qqqqqqqqqqqojbbc..............................................................................wwvwwCCCCvxxxxxxxxxxxxxob..................................................................................................................................................................................................................", "......................fffffffffffgfffggfgfgfgggggghhhhghhhhhiecbc.......................................llllllllllmllmmmmmmmmdbc.................................qqqqqqqqqqqocbc.................................................................................wwvCCBzzawxvwwxxxxxxxxtb..................................................................................................................................................................................................................", "......................fffffffffffffggffgfggggggggghghghhhhhhdbbc........................................klkllllmollmmmmmmmmmjbb.................................qqqqqqqqqrqdbb...................................................................................wCCCBBBCaxwxxxxxxxxxxxxbc........CaCa.....................................................CC.........................................................CC...................................................................................", ".......................ffffffffffffffffgggggggghgghhhCahhCacbb.........................................lkllllolmmlllllmlmmmebb.................................qqqqqqqqqqocbb.....................................................................................CCCBBBCaxxxxwxxxxxxxxxdb........aCaa.....................................................Cza........................................................Cza..............................................CCC.CC..............................", ".......................ffffffffffffffggfffgfgggghgggCCaCaCCac.........................................kklllllllllmmmmmlmmmebb.................................qqqqqqqqrqjbbc......................................................................................CCCBBBCawwxxxxxxxxxxxxjb......Ca.Ca.Ca...................................................Cza.......................................................CCza..........................................CCC.CzzaCza.CC..........................", "........................fffffffffffgffgggfgggggggghhaaCaCaaa..........................................llllllmllllollmmmmmebb.................................pqqqqqqqqodbb.........................................................................................aaCCCBaxwwxxxxxxxxxxxjb......aCCaCCaa..........................................CC.......CzzaCCC................................................CC.Czza.....................................CC...Czza.azzazzaCza.........................", ".........................ffffffffffffffffggggggghhgggCaCaCa..........................................kkklkllllmlllmmlmmmebb.................................qqqqqqqqqocbc..........................................................................................CCBBBCCaxxxxxxxxxxxxxob......CaaCaaCa..........................................Cza......Czaazzza.....................................CC...CC...CzaCzza.....................................Cza..Czaa.CzzzaaaCza.........................", "..........................fffffffffffggggggfgggghghecaCaCaa.........................................llllllllllmlmllmllmebb.................................qqqqqqqqqjbbc...........................................................................................CBBBBCCaxwwxxxxxxxxxxob......aa.Ca.aa..........................................Czza......azzzzaa.....................................Cza.CCza...azazaa.....................................CzzaCCza..CzzaaCCzaa.........................", "...........................ffffffffggfffffggggggggjbCCaCaCCa........................................kkkllklllllmllmlmmjbb.................................qqqqqqqqqjbb............................................................................................CCBBBBCCaCCxxxxxxxxxwuob........CaCa.............................................aza......Czzzaa.......uu.............................CzaCCzza...Czzaa.......................................azaCzaa..CzaaCzzaa..........................", ".............................fffffffffgggfggggggedbbaCaaaCaa.......................................llllllllllllCaCalmdbb.................................pqpqqqqqqdbb............................................................................................CCBBBBBBzzCCaxxxxxxxwqppdc.......aaaa.............................................Cza.....CCzzaa.......uuutb...........................CzaCzaaa..CCzaa.........................................azaza...Czzazaaa...........................", "...............................eeffffgfffggggggecbc..aa..aa........................................kkkkllllllllaCaakdbb.................................pqqqqpqqodbb............................................................................................CCBBBBBBBBBCCaxxxxxxwqpppjb........................................................Cza.....Czzaa.......uuuuubc..........................Czzzza...CCzza..........................................CzzzaC..Czzzaa.............................", "..................................ddddcceffgggebbc................................................lkllkklllllCalCaeCac.................................qppqqqqqocbc.............................................................................................CBBBBBBBBBBCCaxxxxxxrppppjb.........................................................aza.CCCCzaa.......uuuuuubb...........................aazaa..CCzzaa..........................................Czzzzza.Czaza..............................", ".......................................ffggfhebb.................................................kkklklllllllaCCaCCaa..................................pqqqqqqocbc..................................................................................CCCCC.......CBBBBBBBBzzzzaCCCCCCCpppppb.........................................................CzzaCzzzaa........uuuuuubb.............................azaCCCzzza............................................azzzaaCCzzaa..............................", "......................................fhgggfecbc.................................................llklkklllkolCaaCaaCa.................................ppppqqqocbc...................................................................................Czzzza.....CCBBBBBBBBaaaazzzzzzzzaCpppbb........................................................Cazzzazaa........uuuuutubb..............................azzzzaaaa.............................................aaazzzzaaa...............................", "......................................gfffgebb..................................................kkkkkllklklllaacCa.aa................................pqqqqqpocbc....................................................................................Czzzza.....CCCBBBBBCCaxxCzzzzzzzzzzappbb........................................................Czzzzaaa........uuuuuuuubb..............................Czzzza..................................................Czzzza.................................", ".....................................fggggecbc..................................................kklkklllllllljbCaCa.................................qppppqqocbc.....................................................................................Czzzza.....CCCCCCCCCCawwCzzzzzzzzaazalbb........................................................Czzzza..........uuuuuuuubb..............................Czzzza..................................................Czzzza.................................", "....................................ffffgecbc..................................................kkklkklkklllecbbaaaa.................................pqpqqqocbc......................................................................................Czzzza.....CBBBCCCCBBaxxCzzzzzzzzapazaCCC...................................CC..................Czzzza.........uuCCCCuuubb...........CC.................Czzzza............CCC..................CCCCCCCCCCCCCCCCCCzzBBa.................................", "...................................gfggfecbc...................................................kkkllklllklkbbc.....................................ppqpppocbc....................................CaCa...............................................Czzzza.....CBBBBBBBBBavwCzzzzzaaaappazzzza..................................Cza................CCzzzzaCCCCCCCCCCCCzzzatoCCCC......CCCCzaC..........CCCCCCzzzzaCCCC......CCCzza..CCCC......CCCCCCzzzzzzzzzzzzzzzzzzzBBa.................................", "...................................fgffgdbc...................................................lkkkkklkkllljbc.....................................ppqppqqcbc.....................................aCaa...............................................Czzzza......aBBBBBBBBaxxCzzzzzapppppCzzzza..................................Czza...........CCCCCzzzzzzzzzzzzzzzzzzzzzaCCCzzza....CCzzzzzzaCCCCCCCCCCzzzzzzzzzzzzzzaCCCCCCzzzaaCCCzzzaCCCCCCzzzzzzzaaaaaaaaaaaaaaazzzza...y.............................", "..................................fffffdbb....................................................kkkkklklklllbb.....................................ppppqppdbb....................................Ca.Ca.Ca.............................................Czzzza......CzBBBBBBBawwCzzzzzapppppCzzzzzaC............................CCCCCzzza.....CCCCCCzzzzazzzzaaaaaaaaaaaazzzzzzzzzzzzaCCCCzazzzzzzzazzzazzzzaaaaazzzzaaaaazzzzzzzzzzzzzzzzzzzzzzzzzaaaaazzza............Czzzzayyyyyx...........................", ".................................ffffgjbb....................................................klkkklklklkljbb.....................................ppppppdbb.....................................aCCaCCaa.............................................CzzzzzaCCCCCCzzBBBBBzaCCCzzzzaapppppCzzzzazza...CCCCC.......CCCCC....CCCCzzzzzzzzaCCCCCzzzzzzaaaazzzza.......uuuuaazzaaaazzzzzzazzzzzzzzzzzzaaaaaaaaaCCCCzzzza....aaaaaaazzzzaaaazzzzaaaaaaa...CzzzzaCCCCCCCCCCCCzzzzayyyyyybc.........................", "................................fffgfebb.....................................................kkkkkkklklklcb.....................................pppppqjbb......................................CaaCaaCa.............................................CzzzzzzzzzzzzzzzzzzzzzzzzzzzzapppppCCzzzzzzzzaCCCzzzzaCCCCCCCzzzzaCCCCzzzaaaaaazzzzzzzzzzzzzzzzzzzzzza......uuuuuuuaaarbbaaaaaaaaaaaaaazzzzzzzzzzzzzzzzzzzzzza...........aaaaa...aaaaa.........Czzzzzzzzzzzzzzzzzzzzzayyyyyobb.........................", "................................ffffebb.....................................................kkkkkkkkllkljbb....................................ppppppjbb.......................................aa.Ca.aa.............................................CzzzzzzzzzzzzzzzzzzzzzzzzzzzzapppppCzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaaaa....Czzzzzzzzzzzzzzzzzzzzzza......uuuuuuutuujbc..............azzzzzzzzzzzzzzzzzzzzaa..................................azzzzzzzzzzzzzzzzzzzzayyyyycb..........................", "...............................ffffecbc.....................................................kklkkkkkklkkcb.....................................ppppplcb..........................................CaCa................................................azzzzzzzzzzzzzzzzzzzzzzzzzzzappppCCzzzzzzzzzaaaazzzzaaaaaaaazzzzaaaaaa........azzzzzzzzzzzzzzzzzzzzaa.....uuuuuuuuuuucb................azzzzzzzzzzzzzzzzzzza...................................Czzzzzzzzzzzzzzzzzzzaayyyyobb..........................", "..............................fffffdbc.....................................................kkkkkkklklklebb....................................ppppppcbc..........................................aaaa.................................................azzzzzzzzzzzzzzzzzzzzzzzzzzappCCCzzzzzzzzzza...aaaza.......aaaaa.............Czzzzzzzzzzzzzzzzzzzaa......uuutuuuutujbb................Czzzzzzzzzzzzzzzzzzaa...................................Czzzzzzzzzzzzzzzzzzzayyyywbb...........................", "..............................ffffdbb.....................................................kkkkkkkkklkkldb....................................pnppppdbb.................................................................................................aazzzzaaaazzzzaBBaaaaazzzzappCzzzzzzzaaaaaa......aa.........................Czzzzzzzzzzzzzzzzzaaa......uuuuuuuuuurcb.................Czzzzzzzzzzzzzzzzzaa....................................Czzzzzzzzzzzzzzzzzzaayyywcbc...........................", ".............................ffffebb.....................................................kkkkklkkklkllebb....................................nppppjbb...................................................................................................Czzzza..CzzzzaBBaxwnCzzzzapCCzzzzzzaa......................................Czzzzzzzzzzzzzzzzza.......uuuuuuuuuuudbc................CCzzzzzzzzzzzzzzzzza.....................................Czzzzzzzzzzzzzzzzzzayyyyjbc............................", "............................ffffebb....................................................kkkkkkkkkkkkkkljbc...................................pppppocb....................................................................................................Czzzza..CzzzzaBBBaqpCzzzzaCCzzzzzzza.......................................Czzzzzzzzzzazzzzzza.......uuuuuuuuuuobb................CCzzzzaaaaaaaaazzzzza..........Ca..Ca....................CCzzzzzzzzzaaazzzzzzayyyjbb.............................", "...........................fffffcbc...................................................kkkkkkkkkkkklkkibb...................................nnppppdbc............................................................................................CCCCCCCCCzzzzaCCCzzzzaBBBBaCCzzzzaCzzzzzzzaa......................................CCzzzzzzzzaaaaazzzzzaC....uuuutuuuuuobb................CCzzzzaa.......CzzzzzaC........CCaCaCCa...................Czzzzzzzzzaa..aazzzzzayobb..............................", "...........................ffffdbb...................................................kkkkkkkkkkkkkklkjbc...................................pppppjbb.............................................................................................Czzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzazzzzzzzaa......................................CCzzzzaaaaaa....aazzzzza...tuuuuuuuurcb.................Czzzaaa.........aazzzzza.......aaCaCaaa.................CCCzazzaaaaaa....yaazzzzabb...............................", "..........................ffffebb..................................................kkkkkkkkkkkkkkkllkcb...................................pnnnplbb..............................................................................................Czzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaa......................................CCzzzaaa...........aaazzza.uuuuuuuuurcbc................CCzzza.............aazzza........CaCaCa..........xxx.....Czzzzzaa........yyyyaazzab................................", ".........................ffffecbc.................................................kkkkeeklkkkklkkkklebb...................................pppppdbc..CaCa........................................................................................Czzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaa.......................................Czzzza................azza.uuuutuutqcbc................CCzzzaa...............azzza.......aCaCaa.........xxxxcc..CCzzzzaa.........yyyyyyazac................................", "........................fffffdbc....................CaCa........................ikikkebhkkkkkkkkklkkjbc..................................nnnpnjbb...aCaa........................................................................................Czzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzaa........................................Czzaaa................Czzzausuuuuurcbc.................Czzzaa.................azza......CCaCaCCa.......xxxxjbb..Czzzaaa.........yxyyyywcaza................................", "........................ffffebb.....................aCaa.......................kkkkkdbdkkkkkkkkkkkkkcb...................................pppplcb....CaCa................ggg......................................................................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..................qqqqqq.................raaacb.................aaaauuuuuuqcbc...................aaaa...................aaa......aCaaaCaa.....xxxxxtbb....aaaa...........yyyyyydbcaa................................", ".......................fffffcbc...................Ca.Ca.Ca....................kikkhdbbkkkkkkkkkkkkkibb..................................pnpnndbc....aaaa..............ggghhe.........................................................................................xunnnpppnrxxxtbb.................qqqqqqqqqqd.............rrrsocbc...................uuuuuuuqcbc....................u................................aa..aa.....xxxxxxobc...........xxxyxxxyyxyyyjbb...................................", "......................fffffjbb....................aCCaCCaa..................kikikfcbc.kkkkkkkkkkklkebc.................................npnppibb.......................hhghhhb...........................ii................................................mmmmmnlo...wqnnnnnnrwxxxdbc...............qqqqqqqqqqqqjb...........rrrrrjbc...................suuuuuurcbc............CaCa...uuuuo........................................xwxxxxxxc...........xxxxyxyyyyyyytjj........y...........................", ".....................fffffebb.....................CaaCaaCa.................iiikkebbc.kkkkkkkkkkkkkleb..................................nnnnndbc......................ghhgghhbb........................ikkkib...........................................lmmmljcbbb....vnnnnnnrxxxxtbb..............pqqqqqqqqqqqqqjb..........rrrrrrjb....................uusssurcbc.............aCaa.uuuuuuub......................................xxxxxxxxxtc.........xyyyxxyxyxyyyyyyyyyyyyyyyw...........................", ".....................fffffdbc.....................aa.Ca.aa................ikkikjbb...kkkkkkkkklkkkkkb.................................nnnppjbb...............fffffgggggghggebb......................iiiikkebc.......................................lmmlkdbbc.......wrpnnpprxxxxxdbc.............qqpjdjoqqqqqqqqdb.........rrrrrrrro....................suuusqcbc............Ca.Ca.Cauuuuvtbb...............vvvv.................wwxwxxxxxxxtd........xxxxxxyxyyxxyyyyyyyyyywjbbc..........................", "....................fffffebb........................CaCa................iiiikfdbb...kkkkkkkkkkkkkklkdb................................nnpnpcb............ffggfejdbbdggghghhdbc.....................iikikiidb..........kkkkk.......................lmmmicbb..........wnnnnnrxwxxxtbb............pqq.bbc..qqqqqqqqcb........rrrrrrrrrrro.................uuuuurcbc.............aCCaCCaauuuuujbc..............vvvwwtb...............xxxxxxxxxxxxtc........xxyyyxyyxyyyyyyyyytodbbc............................", "...................ffffffdbc........................aaaa...............iikiihcbc....kkkkkkkkkkkkkkkkjb...............................npnpnjbb..........ffffedbbc...gggggggebb.....................ikikikkebb........kkkkkkkjc....................mllldbb............smmpnrwxwxxxdbc...........qpq.bc....qqqqqqqjbb.......rqqrrrrrrrrrrrp...............ssuuqcbc..............CaaCaaCauuuutcb..............vvvvvwvbc...............wxxxxxxxxxxxoc.........jjjtxyyyoooojjdbbbc...............................", "..................ffffffebb..........................................iiiiiiebbc.....ikkkkkkkkkkkkklkib...............................nnnnncb.........ffffecbb......gghggghjb.....................iiiiiiiidbc.......kkkkkkkkkb..................lmlmlcbc............wqpnnqxxwxwwjbb...........qpqcb.......qqqqqjbb........qrrrrrrrrsrrrrrpd............uuusobbc...............aa.Cauaauuutjbc.............vvvvvvvjbb.............wwxvwxxxxxxxxxxd............yyyytbb........................................", "..................ffffffjbc.........................................hiiiikdbb......kkkkkkkkkkkkkkklkkjc..............................nnnnjbb.......ffffgebbc.......ggghgghge....................iiiiikkkjbb.......kkkkkkkkkkdb................llllkcbc.............unnmpvwxxxxtcb...........pqpdb........qqqqjbb..........rrrrrrrrrrssrrrdc...........ssuobb...................CaCauuvutcbc.............vvvvvvwtcb.............xx..btxxxxxxxxxxob..........xxxxxdbc........................................", ".................fffffffdb.........................................iiiiifdbb.......kikkklkkkkkkkkklkkib.............................nnnnpcb.......fffffebb..........ghghghhhed.................iiiikkiiicb.......kkkkkkkkkkkdb...............lllmmjbc.............wrnnnuwxwwxxjbc..........pqpjbc.......qqqqjbb..........rrqrrrrrrrrrrrrsdb..........suuobb....................aaaauuujbbc.............vvvvvvwscbc............w...c..xxxxxxxxxxtb..........yyyytbb.........................................", "................fffffffebb.......................................iiihiiecbc........kkkkikkkkkklkkkllkkjc............................pnnnjbb.....fffffffcbc..........ggghgghhhed................iiiiiiikjbb......kkkkkkkkkkkkjb..............lmlolkbb..............wmmnuwwxxwxobb...........pqobb.......qqqodbb..........qq.cboprrrrrrrrrjbb..CaCa....sstcbc...................uuuvuuocbb...............uvvvvvtcbc............w..c.....xxxxxxxxxxbc........xxxyyjbc.........................................", "...............ffffffffebc......................................ihiiiijbb..........kikkkkkkkkkkkkkklklib...........................nnppncb.....fffffffjbb............gggghhhghjc..............iiiiiiikfbb......kkikkkkkkkkkkeb.............lllmlljbc..............snnpwxwwwxtcb...........qppcb......qqqqobbc..........q.......qrrrrrssjbb...aCaa....rujbc....................uuuuujbbc...............vvvvvvocbc............w..........xxxxxxxxxbb........xyyxybb..........................................", "...............ffffffffdb.....................................hiihhiedbb...........kkkkkkkkkkkkkkkkkklkjc..........................nnnnjbb....ffffffffdb............hg.hggghhghc.............ihiiiikiijbc.....k..bjkkkkkkkkkeb.............lllmlldb..............unnmswxxxwxjbc...........ppibb...pqqqqobbb...........r.........rrrrrrdbb....CaCa...ssubb....................uuuuujbb................uvuvvvjbb..........................xxxxxxxtbb........xxyxobb..........................................", "..............fffffffffdb....................................hiihiiecbc............kkkkklkkkkkkkklklkkllc.........................nmnnndb.....ffffffffbb...........gg..eghhgghhdb............iiiiikiikcb.....k..c..kkkkkkkkkeb............lllllmldb.............rpmnnuwwwwxobb...........pqqqppqqqqojcbbc........................rrrrdbb.....aaaa...ussbb....................uuuuobb................uvvvvvjbb............................xxxxxxobc.......yxyxyjb...........................................", ".............ffffffffffdb..................................hhhhihijbbc.............kkkkilkkkkklkkkklklkleb........................nmnpibb....fffffffffbb...........g....gghhhhhdb...........hiiiiiiiiebb............kkkkkkkkeb...........klllllmljb............nqqmnnuwwwwtbb............pppojddbbbbc............................rrrdbb.............ussjb...................uuuvudbc...............vvuvvvobb.............................xxxxxxdb........yxyxxjb...........................................", ".............efffffffffdb.................................hhhhhhfdbb...............ikkkkkkkkkkkkkkklllllld........................nnnndbc...ffffffffffcb..........g.....ghghghhdb...........iiiiiiikijbc............kkkkkkkkeb...........lllllllleb...........mqvpnnnpwwxxcbc...........pqppdbc.................................rrrdbb.............ssuuud...................uuuuudb................uuvvvvcb...............................xxxxtbb.......xxxxyyjb...........................................", "............fffffffffffeb...............................hhhhhiiecbc................kkkkkkkkkkkkkkkkkkkkllib......................nnnnlbb....ffffffffffdb........gf.....hghhhhhhbb..........ihiiiikiikdb.............kkkkkkkkkb...........lllllollljc.........mnvwmmmnnrwwjbb............ppqpib..................................rrobb............s.ssssuuj.................uuuuuuob...............vvvuvvvcb............w..................xxxxdbc.......xyxxxxtb...........................................", "...........ffefffffffffeb..............................hhhhhiidbb...................kkCakkCakkkkkkklkllllljc.....................mnmnjbc...fffffffffffec.......fg......hggggghebb........i.iihiiiiiiidb.............kkkkkkkkkcb........kllllllmmmmmj.......mmmuvunnnnnmrjbb............ppqpqpjc....................qq..........rrrdb............s..sssussuo................uuuuuuuoc............uuuuuvuuvjb...........v.....www...........xxxobb........xxyyyyyoc...............y..........................", "...........effffffffffffdc...........................hhhghhhedbb....................kCCaCaCCakkkkkkkkkklklld....................nmnmndb....ffffffffffffej....ggg.c....ghhhhhghebc......ih..iiiiiiikiifji............kkkkkkkkkjb......ll.llllmllllllmek..mmmmmowvsmnnnnnnld............p.ppppqpjd..................qq..........rrrrbb..........ss..dsssuusuusr.............uuuuuuuuuoj..........uuvvvvvvuvvj.........ww..c..wwwxtd.........xxvcb.........xxxxxyxyoj............yy...........................", "..........fffeffffffffffeb.........................ghghhhhhjbbc......................aaCaCaaaklklkllkllllllkb...................mnnnibb....fffffffffffffffffgff.b.....gggggghheb.....hh..cjiihiiiiiikiie.c..........kkkkkkkkkkj....klk..lkllllollmmlmmmmmmmljvwwqnmmmnnnnno.........pp..ppqqpqqpo...............qrr.c........rrrrrdb........rss.cb.uusssusuuuuuss.......uuuuuuuuuuuuutu......uuu.uuuuvvvvvvo......vww..c..wwwxwxjc.......xxxdbc........xxxxyyxyyxyt........yyy..c..........................", "..........effffffffffffffjc.......................hhhgghhedbb........................kCaCaCakkkkkkklkkllllllec..................nnnnjbc...ffffffffffffffffffgdbb.....ggghhhhgghdj.hhhh.cb..iihhiiikiiiebb...........kkkkkkkkkkkkkklkldbclllllmllllmllmmlmmkdtvvwqnnnnmmnnpnnnmnnnnppp.cjpppqppqpqppp..........qqq..b.......rrrrrrrob......sssrjbb..sususususuuuuuuuuuuuuu.ouuuuuuuuuuuuuuuuuuuvcjvvvuvvvvvvvvvvwwvvucb....xxwwwwwb.......xxobb.........yxxxxyyyyxxyyyyyyyyyyyocb...........................", ".........effefffffffffffffd.....................gghhghhhecbc..........................aCaCaakkkkkkkkkllkklklld.................mmmnmcb....ffffffffffffffgfggdbb.....ghhhggghhhhhhhhhebbc..ihiiiiiiiiiebb............kkkkkkkkkkkklklecbc.llllllmmlmlmmmmmmkcovvwvqmmnmnnnnnppnpppppppdbc.pqppqqqqqqqqqqqqqqqqqqqqjbb........qrrrrrrroorrrssrrrcbc...ssususuuusuuuuuuuuuuobbouuuuuuuuuuuuuuuuuuobbjuuuvuvuvvvvvvvvvwjbb....wwwwxxxxjb.....xxxbb..........xyyxyxxxyyyyyyyyyyyywcbb............................", ".........feffefffffffffffffd..................gghgghhhedbb...........................CCaCaCCakkkkklkklllllkllic................nnmnibb....ffffffffffffffgfecbb......ghgghhghhhhhhhedbb....iiiihiiiikebb..............kkkkkkkkkkllkjbb...llllollmomllllmllcjwvvvwrnmnnnnnnnnpppCappCabb..pppqpppqqqqqqqqqqqqqqqodbb........rrrrrrrrrrrrrrrsrqcbc....ssssussuusuuuutuuuujbb..uuuuuuuuuuuuuuuuudbb..vvuvuvuvvvvvvvwtdbb.....wwwwwwwwtc....xxxcb............xxxyyyyyyxyyyyyyyyobbc.............................", "........effeffffffffffffffffe...............gggggghghecbc............................aCaaaCaakkkkkkllkkkllllllec...............mmnnjbc....fffffffffffffffebbc......ggghghghhghhhhecbc.....hhiiiiiiiebb...............kkkkkkkkkkkkdbb....llllllllllmmmmmecjwvwwwvumnnnnnnnnnnnCCaCaCCa...pqppqqqqqqqpqqqqqqqqqocbc........qrrrrrrrrrrsrsrsrobbc.....ssuusuuuuuuuuuuutrdbb...uuuuuuuuuuuuuuuudbb...uuvuvvvvvvvvwvocbc......wwxwwxxxxtj.xxx.cb.............xyxxxxxyyyyyyyyywjbb...............................", "........feffefffffffffffffffffe..........fgfgggggghedbb...............................aakkaakkkkkkkllllkllllllljc.............nnnnndb......ffffffffffgfedbb........ggghgggghghgedbb.......ihhiiiikebb................kkkkkkkkkkicbb......llllllmllllmljbdvvvvvvwwnmmmmpnnnpnnaaCaCaaa....qqppppqpqqqqqqqqqqqjbbc.........rqqrrrrrrrrsrrrsjbb........ssusssuuuuuuuuuocbc....uuuuuvuuuuuvuutcbb....vuvvvvvvvvvvvjbb.........wwwwwwwxwxwxxjbb..............xyxyyyxxyxyyyyyocbc................................", "........ffeffeffffffffffffffffffef....ffggggggfghhecbc...................................kkkkkkkkklkkkklllllllmmd.............mmmmlbb......fffffffffffjbbc.........ggggghhhghedbbc........hiiiiiiebb.................kkkkkkkkkjbbc.......llllmllmmmmkdbcuvvvwwwvvjnnnnnnnnnnppCaCaCa......ppqqqqqqqqqqqqqqodbb...........qrrrrrrrrrrrrspdbb..........ssuuususuuuurdbb.......uuuuuuvuuuuujbbc......vuuuvvvvvvocbb..........vxxwxxxwxwxtcbb................xyxxxyyyyyyyvdbb..................................", ".......fefffffffffffffffffffffffffffffgfgggfgghgedbb......................................kkkkkllkklklkllkllllllkc............nnnnebc.......ffffffffjcbb...........ggggggghedbbc...........ihhiiebb...................kkkkkkedbb..........lllmllolljcbduwvvvvvvtdbennmmnpnppnnaCaCaa.......ppppqpqqqqqqqqjbbc.............rrrrrrrrrrrrocbc............sssusuuuuqjbbc.........uuuuuuuuuodbb.........vvuvvvvtjbbc............wwwwwxxxtjbbc..................xyyyyxyxywjbbc...................................", ".......ffefefefffffffffffffffffffffffgfgffgggggjcbc.......................................kkkkklkllklklklllllllllec..........nmmmmdb..........eeejdbbb..............gghghedbbc.............iiiidbb....................kkkkijbbc............lllllkjcbb.wvvvwvvwtcbc..nnnnnnnnjCCaCaCCa.......pqqqqqqqqqqjcbb................qrrrrrrrrpjbbc..............tqsuuuodbbc............tuuuuuodbbc...........uvuuojbbc...............wwxxwtjbbc.....................xxxyyytjbbc.....................................", ".......efffffffefffffffffffffffffffgfffggfgggecbb..........................................kkkkkkklklklllllmllmmmmj..........nnnnncb..................................edbbb.................iedbb.......................jdbbc................jdcbbc..vwvvvvvvtcbc....kjejedbbaCaaaCaa.........joqqqojdbbb....................orrrspjcbc...................dbbbb.................jjjbbb................jcbbc...................jdbbbc.........................jjjbbbc.......................................", ".......fefefeffffffffffffffffffffffffggffggedbbc............................................klklllklkllllllllmllllmd.........mnnnlbb..........................................................c.....................................................vvvvvvvwtcbc..............aa..aa.............cbbbc.........................jddbbc......................................................................................................................................................................", ".......efffffeffffffffffffffffffffffffgggfjcbc...............................................llmllklllllmllmlmmmmlmlc........nnnnebc...............................................................................................................uvwwwvwvobbc............................................................................................................................................................................................................................................", ".......efefefffffffffffffffffffgfffgffffedbb..................................................nnmmolkllllmllmlllommmic......nnpnndb...............................................................................................................vvvwwxxwjbb..............................................................................................................................................................................................................................................", ".......fffffefffffffffffffffffffffffffedbbc............cd....dd..............................ddqpnllllmmmmmmmmmnmmnnpjd.....qqqqpdc.....................................dd.....ddd...............................................................uvwvjcwxjcc...................................................................................ddddd.......................ddddddd.........................................................................................................................", ".......fefeffffffffffffffffffffgfffgedbbc...............dw...dyA..ddddddd.dddddddd..........djjtrqnmljjonpnjjnnmnljjjlj..cddjjjjoccd.....c....cdddddd...ddddd...........ddj....djoA...ddddddd....ddd......ddd......dd........dd......cdddddd....uvvvwtdyjdcd.....c..dddddddd..ddddddd...ddddd......dddddd....dd.......ddd....ddddddd..........djAytjj....dd....d...........dtwwtttA...d.....d......dd.......ddd.....ddd.....ddddddd...dd....d..............................................................", ".......efffefeffffffffffffffffffffedbbc.................jj..dty...dttttttA.ttjjtttA.........dttjAqpmmjdjspqjtxpnodottjjd..ttdttttjddA....jA...dttttttA..dttttd..........djjw..djotA...dttttttA.ddttoj...ddttoj.....djj.....cdotjd....dtttttoy.vvvvvvwtdydd.dd....jA..ttjjtttA.dtttttoy..dttttjj...doAAAAwA..djdA....ddotod...dtttttoy........doy....jj...ddt...dA..........jA.........cw...ddt....djdA....ddotod...d.ttjj...dtttttoy..ddt...dA.............................................................", ".......efeffffffffffffffffffffffedbbc....................jojoy....dA.........jjA............dAyjy.pnmotjorqjtwpodvAywxjtd..xjtyxtjddA....jA...dA........dA...jt.........doto..jtooA...dA.......dyA..wA..dwA..wy....dydy...d.yA..ty...dA.....AvvvvuuwwjdA...doj...jA....jjA....dA........dA...jj...dt........dyjt...djyA..wy..dA..............dy......jA..dtd...dy..........jtjjj......jj...djt....dyjt...djyA..wy..jA...yA..dA........dtd...dy.............................................................", "........effeffffffffffffffffffedbbc.......................joA.....djjdd......djA...........doA.jo..pnotvjtrjtwqjjyurrrjotd.sjtysjd.djjjjjjA...djjdd.....djdddjA.........djyjwjjAjoA...djjdd.....dddd.....dddd.....doAjt...dA.........djddd..wwvvvvutdddA...dAjj..jA....djA....djddd.....djddddtA..djjdd.....dy.j...dA........djddd...........dy......jy..dA.j..jy..........jttojA.....ojt.d.jt....dy.j...dA........djdd.....djddd.....dA.j..jy.............................................................", ".........effeffffffffffffffejcbbc.........................jwA.....dttttA.....djA...........djjjjjw..miowsjtjtxqjoArrqqjoyojsjwysjd.jAAAAtoA...dttttA....dttojAA...qqq...djAjjjwAjoA...dttttA.....wttjj....wttjj...dto.jy..dA..ddd....dotttwyxvvvvvjccddA...dA.jj.jA....djA....dotttt....dtttjyA...dtAAty...djt.jt..dy........dotttt..........dy.....djA..dA.oj.jA..........jAAAAA.....o.j.dAjt...djt.jt..dy.........yttjd...dotttt....dA.oj.jA.............................................................", "..........ffefffffffffffeedbbc............................jw......dA.........djA..........djAAAAto...jowqtjjtxrpdyrqqqdyyrordtysdc.dA....jA...dA........dA..jt..rrqqqqrsjjA.jtA.jjA...dA............tjA......tjA.djtoojt..dt...Aot...dtA.yyywvvvtdbb..dy...dA..jjjA....djA....dtA.......dA..jo....dt.......dttojj..do....d...dtA.............jj.....dtA..dA..jjjA..........jA.........o.jd.Adt...dttojj..do....d........jy..dtA.......dA..jjjA.............................................................", "............effffffffeddbbc...............................dt......dojdddd....djA..........dA.....jy...ouqqtdtxqqojjojjoyuqqrdtxrcc.dA....jA...dojdddd...dA...jyurrqqqqrsjjA.jyA.djA...dojdddd..ddd.dd.A.ddd.dd.A.dA....dy..jjd.ddt...djjoojjxwvjbbc...dy...dA...joA....djA....djjdddd...dA...jt...dt......d.A...jt..jjddddt..djjdddd..........odddddoy...dA...jjA..........jojjddd....j..jy.dt..d.A...jt..jjddddt..ddd.ddA..djjdddd...dA...jjA.............................................................", "..............dddddbbbb....................................t.......ttttttA....tA...........y......w...jwpqqttwqqqwtttyAwrqqpowxqcc..y....ow....ttttttA...w...otrrrqqqqqrotAutA...ty....ttttttA..Atttyy...ytttyy...y.....w...ttt.Ay...jttttttAtdbb.....oy....w....ty.....tA.....tttttoy...t....t....t.......y.....t...ytttyA...tttttoy..........ytttAy.....t....tw..........ottttttw.......A..t...y.....t...ytttyA...wtttAA...tttttoy...t....tw.............................................................", "........................................................................................................mnprwwppppqwwwqqppnpswujcc...........................uxurqqqqqqruxxuuur.....................................................vxyyyyyytccc...........................................................................................................................................................................................................................................................", ".........................................................................................................lnpppmnnnpnpppppnnnpqqjb............................rrqqqqqqqqrrssrsrssj.................................................uuvvvwwwodcc.............................................................................................................................................................................................................................................................", "..........................................................................................................lmmmmmmmmnnmnmmnnnpnnjb...........................qqqqqqqqqqqqrrrrrrrrrj..............................................uuuuuuvvodcb...........................................................................................................................................................................................................Ca..Ca..............................................", "...........................................................................................................mlmlmmmmmmmmnmmmnnnnjb...........................qqqqqqqqrrqqqqqqrrrrrrc...........................................uuuuuuuusdbbc...........................................................................................................................................................................................................CCaCaCCa.............................................", ".............................................................................................................lmlmlllmmmmmmnmmmndb...........................qqqqqqqqqqqqqqrrqrrrrrob........................................uuuuuuuutjbbc.............................................................................................................................................................................................................aaCaCaaa.............................................", "..............................................................................................................mlmmmmmmmmmmnnnmmdb...........................pqqqqqqqqqqqqqrrqqqrrrrd......................................uuuuuuuutjbbc................................................................................................................................................................................................................CaCaCa..............................................", "...............................................................................................................lllmlmmlmmmmmmnnlb............................qqqqqqqqqqqqqqqqqrqrrrrd...................................uuuuuuuuodbbc..................................................................................................................................................................................................................aCaCaa..............................................", "................................................................................................................llmlmmmmmmmnmmmmjc...........................qqqqqqqqqqqqqqqrqqqqrrrrd...............................uuuuuuuuuodbbc...................................................................................................................................................................................................................CCaCaCCa.............................................", ".................................................................................................................llmlmmmmmmmmnnnnd............................qqqqqqqqqqqqqqqrrrrrrrrrj...........................uuuuuuuuurjcbbc.....................................................................................................................................................................................................................aCaaaCaa.............................................", "..................................................................................................................lmllmmmmmnmmmmmib............................qqqqqqqqqqqrqqrrqrrqrrrroo.....................ssuuuuuuuuuodbbc.........................................................................................................................................................................................................................aa..aa..............................................", "....................................................................................................................mmlommmmmmnnnmdc............................qqqqqqqqqrqqqqqqqrrrrrrrrqp..............sssuuuuuuuuuurjcbbc...............................................................................................................................................................................................................................................................................", ".....................................................................................................................mmmmmmmmmmmnnlb..............................oqqqqqqqqqqrrrrqrrrrrrrrrrrrrrrrsrssssssusuuusuuurjdbbc.........................................................Ca..Ca...................................................................................................................................................................................................................", "......................................................................................................................mlmmmnnmnnmmnjc...............................oqqqqqqqqqqqqrrrrrrrrrsrsrssssrssssssusuCaCaojcbbc...........................................................CCaCaCCa..................................................................................................................................................................................................................", ".......................................................................................................................mmmmmmmmnnnnib.................................ojoqqqqqqrqqqrrrrrrrrrrsrrrsrssssusssuaCaabb...............................................................aaCaCaaa..................................................................................................................................................................................................................", "........................................................................................................................mmmmnmnmmnmndc....................................jjjrrqrrrrrrrrrrsrsrsrsssrsssoodCabCa.Ca................................................................CaCaCa...................................................................................................................................................................................................................", "....................................CaCa................................................................................mmmmmmnnmnmnib.........................................dddjjoorrrrrrrrsooojddcbbbcaCCaCCaa................................................................aCaCaa...................................................................................................................................................................................................................", "....................................aCaa................................................................................mmmmnmmmnnnmncc.................................................bbbbbbbbbc........CaaCaaCa...............................................................CCaCaCCa..................................................................................................................................................................................................................", "....................................CaCa................................................................................mmmmnnnmmnnnnjb...................................................................aa.Ca.aa...............................................................aCaaaCaa..................................................................................................................................................................................................................", "....................................aaaa................................................................................mmmmmmmnnnnnnlb.....................................................................CaCa..................................................................aa..aa...................................................................................................................................................................................................................", "........................................................................................................................mmmmmnmmmnmnnndc....................................................................aaaa............................................................................................................................................................CaCa...........................................................................................................................", "........................................................................................................................mmmmmmnnnmnmnnjb....................................................................................................................................................................................................................................aCaa...........................................................................................................................", "........................................................CaCa............................................................mmmnmmmmnnnpnnlb....................................................................................................................................................................................................................................CaCa...........................................................................................................................", "........................................................aCaa............................................................mmmmmmnnmnnnnnndc...................................................................................................................................................................................................................................aaaa...........................................................................................................................", "......................................................Ca.Ca.Ca..........................................................mmmnmmmnmnnmnnnjb..................................................................................................................................................................................................................................................................................................................................................................", "......................................................aCCaCCaa..........................................................mmmmnmnmnmmnnpnjb..................................................................................................................................................................................................................................................................................................................................................................", "......................................................CaaCaaCa...........................................................mmmnmnmnnnnnpnnb..................................................................................................................................................................................................................................................................................................................................................................", "......................................................aa.Ca.aa...........................................................mmmmmmnmnnnnnnndb..........................................................................................................................................................................................................................................................................................................................................................CaCa...", "........................................................CaCa.............................................................mmmmnmnmmmnnnnndb..........................................................................................................................................................................................................................................................................................................................................................aCaa...", "........................................................aaaa.............................................................mmmnmnmnnnmnnnneb........................................................................................................................................................................................................................................................................................................................................................Ca.Ca.Ca.", ".........................................................................................................................mmmmmnmnnnnnppnib........................................................................................................................................................................................................................................................................................................................................................aCCaCCaa.", "..........................................................................................................................mmmmmnmnnmnnnnnbc.......................................................................................................................................................................................................................................................................................................................................................CaaCaaCa.", "..........................................................................................................................mnmnmnmnnmnnpnnbb.......................................................................................................................................................................................................................................................................................................................................................aa.Ca.aa.", "..........................................................................................................................mmnmnmnmnnnnnnndb.........................................................................................................................................................................................................................................................................................................................................................CaCa...", "..........................................................................................................................mmmmnmnnnmnnppndb.........................................................................................................................................................................................................................................................................................................................................................aaaa...", "...........................................................................................................................mmmmnmmnnnnnnpdb...........................................................................................................................................................................................CaCa.................................................................................................................................................................", "...........................................................................................................................nnmmnnmnnnnnnndb...........................................................................................................................................................................................aCaa.................................................................................................................................................................", "...........................................................................................................................mmnnmmnpmnnnnndb.........................................................................................................................................................................................Ca.Ca.Ca...............................................................................................................................................................", "............................................................................................................................mmnnnmnnnnnpndb.........................................................................................................................................................................................aCCaCCaa...............................................................................................................................................................", "............................................................................................................................mmmmmnnnnppnndb.........................................................................................................................................................................................CaaCaaCa...............................................................................................................................................................", ".............................................................................................................................nnnnnmnnnnpndb.........................................................................................................................................................................................aa.Ca.aa...............................................................................................................................................................", ".............................................................................................................................mmmmmpmnnnnncb...........................................................................................................................................................................................CaCa.................................................................................................................................................................", "..............................................................................................................................nnnnnnnnnpnbb...........................................................................................................................................................................................aaaa.................................................................................................................................................................", "..............................................................................................................................mmmnnnnpnnjbb................................................................................................................................................................................................................................................................................................................................................................", "...............................................................................................................................nmnmnnnnndb.................................................................................................................................................................................................................................................................................................................................................................", "................................................................................................................................nmnnnpnjbb.................................................................................................................................................................................................................................................................................................................................................................", ".................................................................................................................................nnnnnicbc.................................................................................................................................................................................................................................................................................................................................................................", ".....Ca..Ca........................................................................................................................jddbbc..................................................................................................................................................................................................................................................................................................................................................................", "....CCaCaCCa...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "....aaCaCaaa.............................................................................................................................................................................................................................................................................................................................................................................................................CaCa..............................................................................", ".....CaCaCa..............................................................................................................................................................................................................................................................................................................................................................................................................aCaa..............................................................................", ".....aCaCaa..............................................................................................................................................................................................................................................................................................................................................................................................................CaCa..............................................................................", "....CCaCaCCa.............................................................................................................................................................................................................................................................................................................................................................................................................aaaa..............................................................................", "....aCaaaCaa..............................................................................................................................................CaCa.............................................................................................................................................................................................................................................................................................................................................", ".....aa..aa...............................................................................................................................................aCaa.............................................................................................................................................................................................................................................................................................................................................", "..........................................................................................................................................................CaCa.............................................................................................................................................................................................................................................................................................................................................", "..........................................................................................................................................................aaaa.............................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................", "..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................." }; wanderlust-wanderlust-769699d/etc/icons/wl-summary-delete-up.xpm000066400000000000000000000025441406661363500250250ustar00rootroot00000000000000/* XPM */ static char * wl_summary_delete_up_xpm[] = { "32 32 8 1", " c None", ". c #000000000000", "X c #E79DCB2B9E79", "o c #69A68E38EFBE", "O c #CF3CBAEA9658", "+ c #FFFFFFFFFFFF", "@ c #B6DAA6998617", "# c #965896589658", " ", " .... ", " .XXXX.. ", " o .XOOOXX.. ", " oo ..XOOOOOOO.. ", " ooooooo .++.XOOOOOOOO. ", " oooooooo .. ..@@@OOOO@. ", " ooooooooo.+.++...@@@@@. ", " oooooooo .++..++...... ", " ooooooo ...++.+.+#... ", " oo .XO.......@@. ", " o .XOXOOO@O@@@. ", " .XOXOOO@O@@@. ", " .XOXOOO@O@@@. ", " .XOXOOO@O@@@. ", " .XOXOOO@O@@@. ", " .XOXOOO@O@@@. ", " .XOXOOO@O@@@. ", " .XOXOOO@O@@@. ", " .XOXOOO@O@@@. ", " .XOXOOO@O@@@.## ", " ..XOOO@O@..#### ", " .......##### ", " ######### ", " . . ", " .... . . ", " . . . . . ... . ", " . . . . . . . . . . ", " . . ... . ... . ... ", " . . . . . . . ", " .... .. . .. . .. ", " "}; wanderlust-wanderlust-769699d/etc/icons/wl-summary-dispose-up.xpm000066400000000000000000000025451406661363500252320ustar00rootroot00000000000000/* XPM */ static char * wl_summary_dispose_up_xpm[] = { "32 32 8 1", " c None", ". c #000000000000", "X c #E79DCB2B9E79", "o c #69A68E38EFBE", "O c #CF3CBAEA9658", "+ c #FFFFFFFFFFFF", "@ c #B6DAA6998617", "# c #965896589658", " ", " .... ", " .XXXX.. ", " o .XOOOXX.. ", " oo ..XOOOOOOO.. ", " ooooooo .++.XOOOOOOOO. ", " oooooooo .. ..@@@OOOO@. ", " ooooooooo.+.++...@@@@@. ", " oooooooo .++..++...... ", " ooooooo ...++.+.+#... ", " oo .XO.......@@. ", " o .XOXOOO@O@@@. ", " .XOXOOO@O@@@. ", " .XOXOOO@O@@@. ", " .XOXOOO@O@@@. ", " .XOXOOO@O@@@. ", " .XOXOOO@O@@@. ", " .XOXOOO@O@@@. ", " .XOXOOO@O@@@. ", " .XOXOOO@O@@@. ", " .XOXOOO@O@@@.## ", " ..XOOO@O@..#### ", " .......##### ", " ######### ", " . ", " .... ", " . . . .. ... .. .. . ", " . . . . . . . . . . . ", " . . . ... . . . . ... ... ", " . . . . . . . . . . ", " .... . .. ... .. .. .. ", " . "}; wanderlust-wanderlust-769699d/etc/icons/wl-summary-exit-up.xpm000066400000000000000000000025141406661363500245310ustar00rootroot00000000000000/* XPM */ static char * wl_folder_quit_up_xpm[] = { "32 32 7 1", " c None", ". c #000000000000", "X c #FFFFE38DB6DA", "o c #CF3CBAEA9658", "O c #AEBAB2CAAEBA", "+ c #B6DA965869A6", "@ c #69A68E38EFBE", " ", " ", " ", " ........... ", " .XXooooooo.OO ", " .X.......o.OO ", " .o.++++X.o.OO ", " .o.+oooX.o.OO ", " @ .o.+oooX.o.OO ", " @@ .o.+oooX.o.OO ", " @@@@@@@@@ .o.XXXXX.o.OO ", " @@@@@@@@@@ .o.......o.OO ", " @@@@@@@@@@@.XXooooooo.OO ", " @@@@@@@@@@O.XXooooooo.OO ", " @@@@@@@@@OO.o.......o.OO ", " OOOOOO@@OO .o.++++X.o.OO ", " OOOOOO@OO .o.+oooX.o.OO ", " OO .o.+oooX.o.OO ", " O .o.+oooX.o.OO ", " O .o.XXXXX.o.OO ", " .o.......o.OO ", " .ooooooooo.OO ", " ...........OO ", " OOOOOOOOOOOO ", " . . ", " .... . ", " . . . . ... ", " ... . . . . ", " . .. . . ", " . . . . . ", " .... . . . . ", " "}; wanderlust-wanderlust-769699d/etc/icons/wl-summary-forward-up.xpm000066400000000000000000000024731406661363500252300ustar00rootroot00000000000000/* XPM */ static char * wl_summary_forward_up_xpm[] = { "32 32 6 1", " c None", ". c #000000000000", "X c #FFFFFFFFFFFF", "o c #59656595C71B", "O c #9E799A699E79", "+ c #D75C38E34103", " ", " .................. ", " .XXXXXXXXXXXXXXXX. ", " .XooX XXXXXXXX.O ", " .XooXXXXXXXXXXXXX.O ", " .XXXX XXXXXXXX.O ", " .XXXXXXXXXXXXXXXX.O + ", " .XXXXXXXXXXXXXXXX.O++ ", " .XXXXXXXXXXXXXXXX.+++++ ", " .XXXXXXXXXXXXXXXX.O++ + ", " .XXXXXXXXXXXXXXXX.O + + ", " ..................O + ", " OOOOOOOOOOOOOOOOOO + ", " OOOOOOOOOO.................. ", " .XXXXXXXXXXXXXXXX. ", " .XooX XXXXXXXX.O", " .XooXXXXXXXXXXXXX.O", " .XXXX XXXXXXXX.O", " .XXXXXXXXXXXXXXXX.O", " .XXXXXXXXXXXXXXXX.O", " .XXXXXXXXXXXXXXXX.O", " .XXXXXXXXXXXXXXXX.O", " .XXXXXXXXXXXXXXXX.O", " ..................O", " OOOOOOOOOOOOOOOO.O", " .... OOOOOOOOOOOOOOOO.O", " . .. . .. . . .. . . ... ", " ... . . .. . . . . .. . . ", " . . . . . . . ... . . . ", " . . . . . . . . . . . ", " . .. . . . .. .. ... ", " "}; wanderlust-wanderlust-769699d/etc/icons/wl-summary-jump-to-current-message-up.xpm000066400000000000000000000025401406661363500302540ustar00rootroot00000000000000/* XPM */ static char * wl_summary_jump_to_current_message_up_xpm[] = { "32 32 7 1", " c None", ". c #000000000000", "X c #EFBEFFFFC71B", "o c #CF3CBAEA9658", "O c #F7DEFFFFBEFB", "+ c #AEBAB2CAAEBA", "@ c #69A68E38EFBE", " ", " ", " ............ ", " .X.oOOOOOOOO.++ ", " .X.oOOOOOOOOO.++ ", " .XX.oOOOOOOOOO.++ ", " .X...oOOOOOOOOO.++ ", " ..ooooOO+O+++OO.++ ", " .oOOOOOOOOOOOOO.++ ", " .OOOOOOOOOOOOOO.++ ", " @ .OO++OOOO++++OO.++ ", " @@.OOOOOOOOOOOOOO.++ ", " @@@@@@@OOOOOOOOOOOOOO.++ ", " @@@@@@@@O+OO++OOO++OO.++ ", " @@@@@@@@@OOOOOOOOOOOO.++ ", " @@@@@@@@OOOOOOOOOOOOO.++ ", " @@@@@@@OO++OO++O+++OO.++ ", " @@.OOOOOOOOOOOOOO.++ ", " @ .OOOOOOOOOOOOOO.++ ", " .OOOOOOOOOOOOOO.++ ", " .OOOOOOOOOOOOOO.++ ", " .OOOOOOOOOOOOOO.++ ", " ...............++ ", " ++++++++++++++++ ", " +++++++++.++++++ ", " .... . ", " . ... ... . . . ", " ... . . . . . .. ", " . . . . ... . ", " . . . . . . ", " .... . . . .. . ", " "}; wanderlust-wanderlust-769699d/etc/icons/wl-summary-next-page-up.xpm000066400000000000000000000030731406661363500254510ustar00rootroot00000000000000/* XPM */ static char * wl_folder_next_unsync_up_xpm[] = { "32 32 18 1", " c None", ". c #000000000000", "X c #8E38C30BFFFF", "o c #59656595C71B", "O c #965896589658", "+ c #596569A6C71B", "@ c #59656DB6CF3C", "# c #596571C6CF3C", "$ c #596575D6CF3C", "% c #618579E7D75C", "& c #61857DF7D75C", "* c #61857DF7DF7D", "= c #61858207DF7D", "- c #69A68A28E79D", "; c #61858617E79D", ": c #69A68E38EFBE", "> c #69A69248EFBE", ", c #69A69658F7DE", " ", " ", " ", " ", " ..... ", " .Xoo.O ", " .Xoo.O ", " .X++.O ", " .X@@.O ", " .X##.O ", " .X$$.O ", " .X%%.O ", " .X&&.O ", " .X**.O ", " ......X==...... ", " .X-;;;;;;;;;.OO ", " .X--------.OO ", " .X::::::.OO ", " .X>>>>.OO ", " .X,,.OO ", " .X.OO ", " .OO ", " OO ", " ", " . ", " . . . ", " .. . . . . ... ", " . . . . . . . . ", " . . . ... .. . ", " . .. . . . . ", " . . .. . . . ", " "}; wanderlust-wanderlust-769699d/etc/icons/wl-summary-next-up.xpm000066400000000000000000000030731406661363500245370ustar00rootroot00000000000000/* XPM */ static char * wl_folder_next_unsync_up_xpm[] = { "32 32 18 1", " c None", ". c #000000000000", "X c #8E38C30BFFFF", "o c #59656595C71B", "O c #965896589658", "+ c #596569A6C71B", "@ c #59656DB6CF3C", "# c #596571C6CF3C", "$ c #596575D6CF3C", "% c #618579E7D75C", "& c #61857DF7D75C", "* c #61857DF7DF7D", "= c #61858207DF7D", "- c #69A68A28E79D", "; c #61858617E79D", ": c #69A68E38EFBE", "> c #69A69248EFBE", ", c #69A69658F7DE", " ", " ", " ", " ", " ..... ", " .Xoo.O ", " .Xoo.O ", " .X++.O ", " .X@@.O ", " .X##.O ", " .X$$.O ", " .X%%.O ", " .X&&.O ", " .X**.O ", " ......X==...... ", " .X-;;;;;;;;;.OO ", " .X--------.OO ", " .X::::::.OO ", " .X>>>>.OO ", " .X,,.OO ", " .X.OO ", " .OO ", " OO ", " ", " . ", " . . . ", " .. . . . . ... ", " . . . . . . . . ", " . . . ... .. . ", " . .. . . . . ", " . . .. . . . ", " "}; wanderlust-wanderlust-769699d/etc/icons/wl-summary-prev-page-up.xpm000066400000000000000000000030771406661363500254530ustar00rootroot00000000000000/* XPM */ static char * wl_folder_previous_unsync_up_xpm[] = { "32 32 18 1", " c None", ". c #000000000000", "X c #8E38C30BFFFF", "o c #69A69658F7DE", "O c #69A69248EFBE", "+ c #69A68E38EFBE", "@ c #69A68A28E79D", "# c #61858617E79D", "$ c #61858207DF7D", "% c #965896589658", "& c #61857DF7DF7D", "* c #61857DF7D75C", "= c #618579E7D75C", "- c #596575D6CF3C", "; c #596571C6CF3C", ": c #59656DB6CF3C", "> c #596569A6C71B", ", c #59656595C71B", " ", " ", " ", " ", " . ", " .X. ", " .Xoo. ", " .XOOOO. ", " .X++++++. ", " .X@@@@@@@@. ", " .X@#########. ", " ......X$$...... ", " %%%%.X&&.%%%%% ", " .X**.% ", " .X==.% ", " .X--.% ", " .X;;.% ", " .X::.% ", " .X>>.% ", " .X,,.% ", " .X,,.% ", " .....% ", " %%%%% ", " ", " ", " ... ", " . . . . . . . ", " . . .. . . . . ", " ... . ... . . ", " . . . . . ", " . . .. . ", " "}; wanderlust-wanderlust-769699d/etc/icons/wl-summary-prev-up.xpm000066400000000000000000000030771406661363500245410ustar00rootroot00000000000000/* XPM */ static char * wl_folder_previous_unsync_up_xpm[] = { "32 32 18 1", " c None", ". c #000000000000", "X c #8E38C30BFFFF", "o c #69A69658F7DE", "O c #69A69248EFBE", "+ c #69A68E38EFBE", "@ c #69A68A28E79D", "# c #61858617E79D", "$ c #61858207DF7D", "% c #965896589658", "& c #61857DF7DF7D", "* c #61857DF7D75C", "= c #618579E7D75C", "- c #596575D6CF3C", "; c #596571C6CF3C", ": c #59656DB6CF3C", "> c #596569A6C71B", ", c #59656595C71B", " ", " ", " ", " ", " . ", " .X. ", " .Xoo. ", " .XOOOO. ", " .X++++++. ", " .X@@@@@@@@. ", " .X@#########. ", " ......X$$...... ", " %%%%.X&&.%%%%% ", " .X**.% ", " .X==.% ", " .X--.% ", " .X;;.% ", " .X::.% ", " .X>>.% ", " .X,,.% ", " .X,,.% ", " .....% ", " %%%%% ", " ", " ", " ... ", " . . . . . . . ", " . . .. . . . . ", " ... . ... . . ", " . . . . . ", " . . .. . ", " "}; wanderlust-wanderlust-769699d/etc/icons/wl-summary-read-up.xpm000066400000000000000000000031601406661363500244710ustar00rootroot00000000000000/* XPM */ static char * wl_folder_jump_to_current_entity_up_xpm[] = { "32 32 20 1", " c None", ". c #000000000000", "X c #8E38C30BFFFF", "o c #8617BEFBF7DE", "O c #8617BAEAF7DE", "+ c #8617B6DAF7DE", "@ c #FFFFFFFFFFFF", "# c #79E7AEBAEFBE", "$ c #79E7AEBAF7DE", "% c #79E7B2CAF7DE", "& c #79E7A699EFBE", "* c #79E7AAAAEFBE", "= c #71C6A289EFBE", "- c #71C69E79EFBE", "; c #71C69A69E79D", ": c #69A69658E79D", "> c #69A69248E79D", ", c #69A68A28E79D", "< c #965896589658", "1 c #AEBAAEBAAEBA", " ", " ", " .... ", " ..XXXX.. ", " .XoO+++Oo. ", " .Xo+@@#$%+o. ", " .Xo+$@@&&*$+o. ", " .XO%*=-;-=*%O. ", " .X+$&-:>:-&$+. ", " .X+#&;>,>;&#+. ", " ..X$&-:>:-&$.. ", " .<.%*=-;-=*.<. ", " .1..*&&&..1.< ", " .@@....11.<< ", " ..@@@1..<< ", " <.....<<< ", " <..<<<<<< ", " <..<<<< ", " <..<< ", " <..< ", " <..<< ", " @@.< ", " <<<< ", " <<<< ", " < . ", " ... . ", " . . . .. ... ", " . . . . . . . ", " ... ... ... . . ", " . . . . . . . ", " . . .. .. . ... ", " "}; wanderlust-wanderlust-769699d/etc/icons/wl-summary-reply-up.xpm000066400000000000000000000025161406661363500247150ustar00rootroot00000000000000/* XPM */ static char * wl_summary_reply_up_xpm[] = { "32 32 7 1", " c None", ". c #000000000000", "X c #EFBEFFFFC71B", "o c #FFFFFFFFFFFF", "O c #59656595C71B", "+ c #9E799A699E79", "@ c #79E7B2CAF7DE", " ", " ............... .", " .XXXXXXXXXXXXX. ..", " .XXXXXXXXXXXX..o.", " ..............XXXXXXXXXXX..o. ", " .oooooooooooo.XXXXXXXXXXX.oo. ", " .oOOo ooo.XXXXXXXXXX..ooo. ", " .oOOoooooooo.XXXXXXXXX.oooo. ", " .oooo ooo.XXXXXXXX.oooo. ", " .ooooooooooo.XXXXXXXX.oooo. ", " .ooooooooooo.XXXXXXX.ooooo. ", " .oooooooooooo.XXXXXX.oo.oo.+++", " .oooooooooooo.XXXXXX.oo.o.X.++", " .oooooooooooo.XXXXXX.oo.o.X.++", " ..................XXXo.oo.XX.+", " ++++++++++.OOOOO.XXX..o.XXX.+", " ++++++++++.......XXXX..XXXX.+", " .@@@.XXXXX.XXXX.++", " .@o@@@.XXXX.XXX.+++", " .@o@@@@@........++++", " .OoOOOOO. . +++++ ", " .OoOOOOO.+++++++ ", " .OOOOOOO.++ ", " .......+++ ", " . ", " ... . ", " . . . ... . . . ", " . . . . . . . . . ", " ... ... . . . . . ", " . . . . . . .. ", " . . .. ... . . ", " . . "}; wanderlust-wanderlust-769699d/etc/icons/wl-summary-reply-with-citation-up.xpm000066400000000000000000000025341406661363500274760ustar00rootroot00000000000000/* XPM */ static char * wl_summary_reply_with_citation_up_xpm[] = { "32 32 7 1", " c None", ". c #000000000000", "X c #EFBEFFFFC71B", "o c #FFFFFFFFFFFF", "O c #9E799A699E79", "+ c #59656595C71B", "@ c #79E7B2CAF7DE", " ", " ............... .", " .XXXXXXXXXXXXX. ..", " .XXXXXXXXXXXX..o.", " ..............XOXOOOXXXXX..o. ", " .oooooooooooo.XXXXXXXXXXX.oo. ", " .o++o ooo.XXOXOOXXXX..ooo. ", " .o++oooooooo.XXXXXXXXX.oooo. ", " .oooo ooo.XXXXXXXX.oooo. ", " .ooooooooooo.XXXXXXXX.oooo. ", " .ooooooooooo.XXXXXXX.ooooo. ", " .oooooooooooo.XXXXXX.oo.oo.OOO", " .oooooooooooo.XXXXXX.oo.o.X.OO", " .oooooooooooo.XXXXXX.oo.o.X.OO", " ..................XXXo.oo.XX.O", " OOOOOOOOOO.+++++.XXX..o.XXX.O", " OOOOOOOOOO.......XXXX..XXXX.O", " .@@@.XXXXX.XXXX.OO", " .@o@@@.XXXX.XXX.OOO", " .@o@@@@@........OOOO", " .+o+++++. . OOOOO ", " .+o+++++.OOOOOOO ", " .+++++++.OO ", " .......OOO ", " . . ", " ... . ", " . . . . ... . ", " . . . . . . ", " .... . . . ... ", " . . . . . . ", " . ... . . .. ", " "}; wanderlust-wanderlust-769699d/etc/icons/wl-summary-set-flags-up.xpm000066400000000000000000000024371406661363500254510ustar00rootroot00000000000000/* XPM */ static char * wl_summary_set_flags_up_xpm[] = { "32 32 6 1", " c None", ". c #93805A", "+ c #000000", "@ c #E4EAB4", "# c #B22E2E", "$ c #9E9A9E", " ", " ", " .++++ ", " .+@@@++ ", " .+@@@@@+++ ++++ ", " .+@@@@@@@@++++@@@+ ", " .+@@@@@@@@@@@@@@@+ ", " .+@@@@@@@@@@@@@@@+ ", " .+###@@@@@@@@@@@@+ ", " .+#####@@@@@@@@@+$$$$", " .+##########@@@@@+$$$$", " .+###############+$$ ", " .+##############+$$ ", " .+++############+$ ", " .+ +##########+$$ ", " .+ $$$+++++++###+$ ", " .+ $$$$$$$$$$+++$$ ", " .+$$ $$$$$ ", " .+$$ ", " .+$ ", " .+$ ", " .+$ ", " ", " ", " ++++ + ", " + + ", " + + ++ +++ ", " +++ + + + + ", " + + +++ + + ", " + + + + +++ ", " + + ++ + + ", " ++ "}; wanderlust-wanderlust-769699d/etc/icons/wl-summary-sync-force-update-up.xpm000066400000000000000000000031551406661363500271120ustar00rootroot00000000000000/* XPM */ static char * wl_folder_sync_current_entity_up_xpm[] = { "32 32 20 1", " c None", ". c #000000000000", "X c #FFFFE38DB6DA", "o c #E79DCB2B9E79", "O c #B6DAA6998617", "+ c #CF3CBAEA9658", "@ c #514471C6FFFF", "# c #59656DB6EFBE", "$ c #618569A6DF7D", "% c #69A66595D75C", "& c #79E76185C71B", "* c #AEBAAAAAAEBA", "= c #86175D75BEFB", "- c #96585965AEBA", "; c #9E7955559E79", ": c #A69951448E38", "> c #C71BC30BC71B", ", c #AEBA4D348617", "< c #BEFB492471C6", "1 c #C71B492469A6", " ", " ", " ", " ............ ", " ...XXXXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXX. ", " .XXXXXXXXXXXXXXXXXX. ", " ....XXXXXXXXXXXX.... ", " .ooo............OOO. ", " .ooo++++++++++++OOO. ", " .ooo++++++++++++OOO. ", " .ooo++++++++++++OOO. ", " .ooo+++++@@+++++OOO. ", " .ooo++++####++++OOO. ", " .ooo+++$$$$$$+++OOO. ", " .ooo++%%%%%%%%++OOO. ", " .ooo++++&&&&+++++OO. ", " *...++++====++++...*** ", " ****....----....******* ", " *******;;;;************ ", " **::::::::********* ", " >>,,,,,,********* ", " <<<< ", " 11 ", " ", " ... ", " . . . ... .. ", " ... . . . . . ", " . . . . . . ", " . .. . . . ", " ... . . . .. ", " . "}; wanderlust-wanderlust-769699d/etc/icons/wl-write-current-folder-up.xpm000066400000000000000000000025061406661363500261510ustar00rootroot00000000000000/* XPM */ static char * wl_draft_up_xpm[] = { "32 32 7 1", " c None", ". c #000000000000", "X c #EFBEFFFFC71B", "o c #FFFFFFFFFFFF", "O c #9E799A699E79", "+ c #79E7B2CAF7DE", "@ c #CF3CBAEA9658", " ", " ............... .", " .XXXXXXXXXXXXX. ..", " ..... .XXXXXXXXXXXX..o.", " .OOOOO. .XOXOOOXXXXX..o. ", " .....OOO.....XXXXXXXXXXX.oo. ", " .@@@@@.OOOOO.XXXXXXXXXX..ooo. ", " .@@@@@@@......XXXXXXXXX.oooo. ", " .@@@@@@@@@@@@.XXXXXXXX.oooo. ", " .@@@@@@@@@@@.XXXXXXXX.oooo. ", " .@@@@@@@@@@@.XXXXXXX.ooooo. ", " .@@@@@@@@@@@@.XXXXXX.oo.oo.OOO", " .@@@@@@@@@@@.XXXXXX.oo.o.X.OO", " .@@@@@@@@@@@.XXXXXX.oo.o.X.OO", " .@@@@@@@@@.......XXXo.oo.XX.O", " ..........OOOOO.XXX..o.XXX.O", " .......XXXX..XXXX.O", " .+++.XXXXX.XXXX.OO", " .+o+++.XXXX.XXX.OOO", " .+o+++++........OOOO", " ..o...... . OOOOO ", " ..o......OOOOOOO ", " .........OO ", " .......OOO ", " ", " .. ", " . . . . .. .. .. ", " . . . . . . . ", " . .. . . .... . . ", " . . . . . . . ", " .. ... ... .. .. ", " "}; wanderlust-wanderlust-769699d/etc/ja.Emacs000066400000000000000000000152401406661363500205260ustar00rootroot00000000000000Emacs*XlwMenu.folder.labelString: フォルダ Emacs*XlwMenu.enterCurrentFolder.labelString: フォルダへ移動 Emacs*XlwMenu.prevFolder.labelString: 前のフォルダ Emacs*XlwMenu.nextFolder.labelString: 次のフォルダ Emacs*XlwMenu.checkCurrentFolder.labelString: 最新メッセージのチェック Emacs*XlwMenu.syncCurrentFolder.labelString: サマリを更新 Emacs*XlwMenu.dropCurrentFolder.labelString: 未同期をなくす Emacs*XlwMenu.prefetchCurrentFolder.labelString: プリフェッチ Emacs*XlwMenu.flushQueue.labelString: キューにあるメッセージを送信 Emacs*XlwMenu.addFolder.labelString: フォルダを追加 Emacs*XlwMenu.addGroup.labelString: グループを追加 Emacs*XlwMenu.setPetname.labelString: あだ名をつける Emacs*XlwMenu.exit.labelString: 終了 Emacs*XlwMenu.togglePlugStatus.labelString: オンライン/オフライン Emacs*XlwMenu.changePlugStatus.labelString: プラグ状態管理 Emacs*XlwMenu.saveCurrentStatus.labelString: 現在の状態をセーブ Emacs*XlwMenu.markAsReadAllCurrentFolder.labelString: すべて読んだことにする Emacs*XlwMenu.expireCurrentFolder.labelString: Expire (自動削除/アーカイブ) Emacs*XlwMenu.folderManager.labelString: フォルダ編集 Emacs*XlwMenu.rename.labelString: 名前変更 Emacs*XlwMenu.openAllUnreadFolder.labelString: 全ての未読フォルダを開く Emacs*XlwMenu.updateStatus.labelString: 状態を更新 Emacs*XlwMenu.emptyTrash.labelString: ゴミ箱を空にする Emacs*XlwMenu.emptyTrash.labelString: ゴミ箱を空にする Emacs*XlwMenu.unsubscribe.labelString: 購読をやめる(アクセス型) Emacs*XlwMenu.displayAll.labelString: すべて表示(アクセス型) Emacs*XlwMenu.summary.labelString: サマリ Emacs*XlwMenu.read.labelString: 読み進める Emacs*XlwMenu.prevPage.labelString: 前のページ Emacs*XlwMenu.nextPage.labelString: 次のページ Emacs*XlwMenu.prev.labelString: 前のメッセージ Emacs*XlwMenu.next.labelString: 次のメッセージ Emacs*XlwMenu.up.labelString: 前の未読メッセージ Emacs*XlwMenu.down.labelString: 次の未読メッセージ Emacs*XlwMenu.parentMessage.labelString: 親メッセージへ移動 Emacs*XlwMenu.setDeleteMark.labelString: 削除マークをつける Emacs*XlwMenu.setRefileMark.labelString: リファイルマークをつける Emacs*XlwMenu.setTargetMark.labelString: まとめ処理用マークをつける Emacs*XlwMenu.unmark.labelString: 一時マークを消す Emacs*XlwMenu.unmarkAll.labelString: すべての一時マークを消す Emacs*XlwMenu.enterTheMessage.labelString: メッセージへ移動 Emacs*XlwMenu.markAsImportant.labelString: しおり(重要マークをつける) Emacs*XlwMenu.markAsUnread.labelString: 読まなかったことにする Emacs*XlwMenu.cancelPostedNews.labelString: ニュース記事をキャンセルする Emacs*XlwMenu.supersedesMessage.labelString: ニュース記事を上書きする Emacs*XlwMenu.resendBouncedMail.labelString: エラーメールを再送する Emacs*XlwMenu.resendMessage.labelString: 再送する Emacs*XlwMenu.sync.labelString: 同期をとる Emacs*XlwMenu.execute.labelString: リファイル/コピー/削除マークを実行 Emacs*XlwMenu.goToOtherFolder.labelString: 他のフォルダへ移動 Emacs*XlwMenu.pick.labelString: 検索してマーク Emacs*XlwMenu.markAsReadAll.labelString: 全部読んだことにする Emacs*XlwMenu.stick.labelString: スティッキーサマリにする Emacs*XlwMenu.messageOperation.labelString: メッセージの操作 Emacs*XlwMenu.threadOperation.labelString: スレッドの操作 Emacs*XlwMenu.regionOperation.labelString: リージョンの操作 Emacs*XlwMenu.markOperation.labelString: まとめ処理用マークの操作 Emacs*XlwMenu.markAsRead.labelString: 読んだことにする Emacs*XlwMenu.setCopyMark.labelString: コピーマークを付ける Emacs*XlwMenu.toggleDisplayMessage.labelString: メッセージの表示をトグル Emacs*XlwMenu.displayFolder.labelString: フォルダ一覧を表示 Emacs*XlwMenu.pipeMessage.labelString: パイプする Emacs*XlwMenu.writingMessages.labelString: メッセージを書く Emacs*XlwMenu.writeAMessage.labelString: メッセージを書く Emacs*XlwMenu.reply.labelString: 返事を書く Emacs*XlwMenu.replyWithCitation.labelString: 引用して返事を書く Emacs*XlwMenu.forward.labelString: 転送する Emacs*XlwMenu.prefetch.labelString: プリフェッチ Emacs*XlwMenu.printMessage.labelString: 印刷する Emacs*XlwMenu.openOrClose.labelString: スレッドを開閉 Emacs*XlwMenu.openAll.labelString: スレッドを全部開く Emacs*XlwMenu.closeAll.labelString: スレッドを全部閉じる Emacs*XlwMenu.exitCurrentFolder.labelString: 現在のサマリを終了 Emacs*XlwMenu.toggleThreading.labelString: スレッド表示の On/Off Emacs*XlwMenu.sort.labelString: ソート Emacs*XlwMenu.byNumber.labelString: メッセージ番号でソート Emacs*XlwMenu.byDate.labelString: 日付けでソート Emacs*XlwMenu.byFrom.labelString: 送信者でソート Emacs*XlwMenu.bySubject.labelString: サブジェクトでソート Emacs*XlwMenu.scoreOperation.labelString: スコア操作 Emacs*XlwMenu.switchCurrentScoreFile.labelString: スコアファイルを変更 Emacs*XlwMenu.editCurrentScoreFile.labelString: 現在のスコアファイルを編集 Emacs*XlwMenu.editScoreFile.labelString: スコアファイルを編集 Emacs*XlwMenu.setMarkBelow.labelString: 得点が低いメッセージにマーク Emacs*XlwMenu.setExpungeBelow.labelString: 得点が低いメッセージを消す Emacs*XlwMenu.rescoreBuffer.labelString: スコア評価をやり直す。 Emacs*XlwMenu.increaseScore.labelString: 得点を上げる Emacs*XlwMenu.lowerScore.labelString: 得点を下げる Emacs*XlwMenu.plugged.labelString: プラグ管理 Emacs*XlwMenu.togglePlugged.labelString: プラグのオン/オフ Emacs*XlwMenu.togglePlugged.labelString: プラグのオン/オフ Emacs*XlwMenu.toggleAllPlugged.labelString: 全プラグのオン/オフ Emacs*XlwMenu.toggleAllPlugged.labelString: 全プラグのオン/オフ Emacs*XlwMenu.prevPort.labelString: 上のポートヘ Emacs*XlwMenu.nextPort.labelString: 下のポートへ Emacs*XlwMenu.prevServer.labelString: 上のサーバヘ Emacs*XlwMenu.nextServer.labelString: 下のサーバヘ wanderlust-wanderlust-769699d/samples/000077500000000000000000000000001406661363500200515ustar00rootroot00000000000000wanderlust-wanderlust-769699d/samples/en/000077500000000000000000000000001406661363500204535ustar00rootroot00000000000000wanderlust-wanderlust-769699d/samples/en/dot.addresses000066400000000000000000000005511406661363500231410ustar00rootroot00000000000000# # ~/.addresses sample file. # # Lines begin with '#' are comment. # Empty lines are ignored. # # Format of each line: # email-address "petname" "realname" # # petname is used for Summary displaying. realname is used for To: field. # teranisi@gohome.org "YT" "Yuuichi Teranishi" foo@example.com "Mr. Foo" "John Foo" bar@example.org "Mr. Bar" "Michael Bar" wanderlust-wanderlust-769699d/samples/en/dot.folders000066400000000000000000000023561406661363500226270ustar00rootroot00000000000000# # ~/.folders sample file. # # For further information, see section "Folders" in the Info. # # Lines begin with '#' are comment. # Empty lines are ignored. # ## incoming mail box for IMAP users # %inbox ## incoming mail box for POP users # &USERNAME@POP3.EXAMPLE.COM ## [ pipe folder might be useful for some users ] ## [ which get mails and take them in. ] # |&USERNAME@POP3.EXAMPLE.COM|+inbox ## trash, draft and queue +trash +draft +queue ## `$' marked important messages 'flag/important ## MH folder +inbox ## IMAP folder # %inbox.emacs.wl # %inbox.emacs.apel-ja ## MH folder via IMAP # %#mh/inbox ## NNTP folder # -fj.os.bsd.freebsd # -fj.mail.reader.mew # -fj.news.reader.gnus ## [ other NNTP server ] # -jlug.ml.users@NEWS.EXAMPLE.NET # -emacs.auc-tex@NEWS.EXAMPLE.ORG # -ring.openlab.skk@NEWS.EXAMPLE.COM ## group definition ## [ folders between curly bracket are treated as in a group. ] # Emacsen{ # +to/wl # +to/mew-dist # +to/apel-ja ## [ You can define multi level group. ] # XEmacs{ # +to/xemacs-beta # +to/xemacs-beta-ja # +to/xemacs-mule # } # } ## access group ## [ If there is '/' in the end of line, all subfolders are added to group. ] ## [ Use `C-u RET' for update access group. ] + / ## access group for IMAP user # % / wanderlust-wanderlust-769699d/samples/en/dot.wl000066400000000000000000000276051406661363500216170ustar00rootroot00000000000000;;; dot.wl -- sample setting file for Wanderlust -*- emacs-lisp -*- ;; [[ Requirement Setting ]] ;; Following must be included in ~/.emacs ;; (No need if installed as XEmacs package.) (autoload 'wl "wl" "Wanderlust" t) (autoload 'wl-other-frame "wl" "Wanderlust on new frame." t) (autoload 'wl-draft "wl-draft" "Write draft with Wanderlust." t) ;; Icon directory ;; (No need if installed as XEmacs package.) ;(setq wl-icon-directory "/usr/local/lib/emacs/etc") ;; [[ SEMI Setting ]] ;; Disable inline display of HTML part. ;; Put before load `mime-setup' (setq mime-setup-enable-inline-html nil) ;; Don't split large message. (setq mime-edit-split-message nil) ;; If lines of message are larger than this value, treat it as `large'. ;(setq mime-edit-message-default-max-lines 1000) ;;; [[ Private Setting ]] ;; Header From: ;(setq wl-from "Your Name ") ;; If (system-name) does not return FQDN, ;; set following as a local domain name without hostname. ;(setq wl-local-domain "example.com") ;; User's mail addresses. (setq wl-user-mail-address-list (list (wl-address-header-extract-address wl-from) ;; "e-mail2@example.com" ;; "e-mail3@example.net" ... )) ;; Subscribed mailing list. (setq wl-subscribed-mailing-list '("wl@ml.gentei.org" "apel-ja@m17n.org" "emacs-mime-ja@m17n.org" ;; "ml@example.com" ... )) ;;; [[ Server Setting ]] ;; Default IMAP4 server (setq elmo-imap4-default-server "localhost") ;; Default POP server (setq elmo-pop3-default-server "localhost") ;; SMTP server (setq wl-smtp-posting-server "localhost") ;; Default NNTP server (setq elmo-nntp-default-server "localhost") ;; NNTP server name for posting (setq wl-nntp-posting-server elmo-nntp-default-server) ;; IMAP authenticate type setting (setq elmo-imap4-default-authenticate-type 'clear) ; raw ;(setq elmo-imap4-default-authenticate-type 'cram-md5) ; CRAM-MD5 ;; POP-before-SMTP ;(setq wl-draft-send-mail-function 'wl-draft-send-mail-with-pop-before-smtp) ;;; [[ Basic Setting ]] ;; Default folder for `wl-summary-goto-folder'. ;(setq wl-default-folder "+inbox") ;; Default string for folder name completion. ;(setq wl-default-spec "+") ;; Folder Carbon Copy ;(setq wl-fcc "+outbox") ;; Confirm before exitting Wanderlust. (setq wl-interactive-exit t) ;; Confirm before sending message. (setq wl-interactive-send t) ;; Create opened thread. ;(setq wl-thread-insert-opened t) ;; Keep folder window beside summary. (3 pane) ;(setq wl-stay-folder-window t) ;; Truncate long lines. ;(setq wl-message-truncate-lines t) ;(setq wl-draft-truncate-lines t) ;; Following line is needed for XEmacs older than 21.4.6. ;(setq truncate-partial-width-windows nil) ;; Open new frame for draft buffer. ;(setq wl-draft-use-frame t) ;; Don't limit indent for thread view ;(setq wl-summary-indent-length-limit nil) ;(setq wl-summary-width nil) ;; Divide thread by change of subject. ;(setq wl-summary-divide-thread-when-subject-changed t) ;; Change format of thread view ;(setq wl-thread-indent-level 2) ;(setq wl-thread-have-younger-brother-str "+" ; wl-thread-youngest-child-str "+" ; wl-thread-vertical-str "|" ; wl-thread-horizontal-str "-" ; wl-thread-space-str " ") ;; display first message automatically. ;(setq wl-auto-select-first t) ;; goto next folder when exit from summary. ;(setq wl-auto-select-next t) ;; skip folder if there is no unread message. ;(setq wl-auto-select-next 'skip-no-unread) ;; jump to unread message in 'N' or 'P'. ;(setq wl-summary-move-order 'unread) ;; notify mail arrival ;(setq wl-biff-check-folder-list '("%inbox")) ;(setq wl-biff-notify-hook '(ding)) ;;; [[ Network ]] ;; cache setting. ;; (messages in localdir, localnews, maildir are not cached.) ;(setq elmo-archive-use-cache nil) ;(setq elmo-nntp-use-cache t) ;(setq elmo-imap4-use-cache t) ;(setq elmo-pop3-use-cache t) ;; Enable disconnected operation in IMAP folder. (setq elmo-enable-disconnected-operation t) ;; Store draft message in queue folder if message is sent in unplugged status. (setq wl-draft-enable-queuing t) ;; when plug status is changed from unplugged to plugged, ;; queued message is flushed automatically. (setq wl-auto-flush-queue t) ;; offline at startup. ;(setq wl-plugged nil) ;; change plug status by server or port at startup. ;(add-hook 'wl-make-plugged-hook ; '(lambda () ; ;; Add or Change plug status for SERVER and PORT. ; (elmo-set-plugged plugged(t/nil) server port) ; ;; When omit port, SEVERS all port was changes. ; ;; (Can't add plug status without PORT) ; (elmo-set-plugged plugged(t/nil) server) ; )) ;;; [[ Special Setting ]] ;; open unread group folder after checking. ;(add-hook 'wl-folder-check-entity-hook ; 'wl-folder-open-unread-folder) ;; Jump to unfiltered folder by `wl-summary-exit'. It is useful for people who ;; use filtered folder as a temporary folder created by `wl-summary-virtual'. ;(add-hook 'wl-summary-prepared-hook ; '(lambda () ; (setq wl-summary-buffer-exit-function ; (when (eq 'filter ; (elmo-folder-type-internal wl-summary-buffer-elmo-folder)) ; 'wl-summary-unvirtual)))) ;; Change summary display function. ;; Set extra field use with `elmo-message-entity-field'. ;; And use with auto-refile. (setq elmo-msgdb-extra-fields '(;; Use with elsp-header in elmo-spam. "x-spam-flag" ;; Virtual field defined by `modb-entity-field-extractor-alist' "ml-info")) ;; ML message displays ML name and ML sequence number in subject. (setq wl-summary-line-format "%n%T%P%M/%D(%W)%h:%m %t%[%17(%c %f%) %] %#%~%s") ;; Set summary line format according to folder name. ;(setq wl-folder-summary-line-format-alist ; '(("^%inbox\\.emacs\\.wl$" . ; "%-5l%T%P%M/%D %h:%m %-4S %[ %17f %] %t%C%s") ; ("^%" . "%T%P%M/%D %h:%m %-4S %[ %17f %] %t%C%s") ; ("^+" . "%n%T%P%M/%D %h:%m %-4S %[ %17f %] %t%C%s"))) ;; imput asynchronously. ;; (utils/im-wl.el is needed to be installed. ;; Don't forget setting ~/.im/Config (Smtpservers). ;; note that wl-draft-enable-queuing is not valid.) ;(autoload 'wl-draft-send-with-imput-async "im-wl") ;(setq wl-draft-send-function 'wl-draft-send-with-imput-async) ;; non-verbose User-Agent: field ;(setq wl-generate-mailer-string-function ; 'wl-generate-user-agent-string-1) ;; When you encrypt message by PGP, include your public key. ;; (to make the message visible from yourself) ;(setq pgg-encrypt-for-me t) ;;; [[ Template ]] ;; template ;(setq wl-template-alist ; '(("default" ; ("From" . wl-from) ; ("Organization" . "organization for default") ; (body . "Hello, this is XXX \n")) ; body ; ("report" ; ("To" . "boss@example.com") ; ("Subject" . "Report") ; (top . "Sir, here is my report\n") ; insert in top. ; (bottom-file . "~/work/report.txt") ; insert file in bottom ; ) ; )) ;; Change headers in draft sending time. ;(setq wl-draft-config-alist ; '((reply ; see reply buffer ; "^To: .*test-notsend-wl@lists\\.airs\\.net" ; (template . "default")) ; template ; ("^To: .*test-notsend-wl@lists\\.airs\\.net" ; ding ; function ; ("From" . wl-from) ; variable ; ("Organization" . "organization")) ; string ; ("^Newsgroups: test.*" ; ("Organization" . "organization for nntp.")) ; )) ;; Change headers in draft preparation time. ;(add-hook 'wl-mail-setup-hook ; '(lambda () ; (unless wl-draft-reedit; ; don't apply when reedit. ; (wl-draft-config-exec wl-draft-config-alist)))) ;; [[ Reply ]] ;; header value setting for mail reply. ;; Wide window for draft buffer. ;(setq wl-draft-reply-buffer-style 'full) ;; Remove fullname in reply message header. ;(setq wl-draft-reply-use-address-with-full-name nil) ;; "a" (without-argument) reply to author (Reply-To or From). ;; if 'X-ML-Name' and 'Reply-To' exists, reply to 'Reply-To'. ;(setq wl-draft-reply-without-argument-list ; '((("X-ML-Name" "Reply-To") . (("Reply-To") nil nil)) ; ("X-ML-Name" . (("To" "Cc") nil nil)) ; ("Followup-To" . (nil nil ("Followup-To"))) ; ("Newsgroups" . (nil nil ("Newsgroups"))) ; ("Reply-To" . (("Reply-To") nil nil)) ; ("Mail-Reply-To" . (("Mail-Reply-To") nil nil)) ; (wl-draft-self-reply-p . (("To") ("Cc") nil)) ; ("From" . (("From") nil nil)))) ;; old defaults < 2.11.0 ;(setq wl-draft-reply-without-argument-list ; '(((wl-draft-self-reply-p ; "Followup-To") . (("To") ("Cc") ("Followup-To"))) ; ((wl-draft-self-reply-p ; "Newsgroups") . (("To") ("Cc") ("Newsgroups"))) ; ((wl-draft-self-reply-p ; "From") . (("To") ("Cc") nil)) ; ("Followup-To" . (nil nil ("Followup-To"))) ; ("Mail-Followup-To" . (("Mail-Followup-To") nil ("Newsgroups"))) ; ("Reply-To" . (("Reply-To") ("To" "Cc" "From") ("Newsgroups"))) ; ("From" . (("From") ("To" "Cc") ("Newsgroups"))))) ;(setq wl-draft-reply-with-argument-list ; '(((wl-draft-self-reply-p ; "Followup-To") . (("To") ("Cc") ("Followup-To"))) ; ((wl-draft-self-reply-p ; "Newsgroups") . (("To") ("Cc") ("Newsgroups"))) ; ((wl-draft-self-reply-p ; "From") . (("To") ("Cc") nil)) ; ("Reply-To" . (("Reply-To") nil nil)) ; ("Mail-Reply-To" . (("Mail-Reply-To") nil nil)) ; ("From" . (("From") nil nil)))) ;;; [[ Message Display Settings ]] ;; Hidden header field in message buffer. (setq wl-message-ignored-field-list '(".*Received:" ".*Path:" ".*Id:" "^References:" "^Replied:" "^Errors-To:" "^Lines:" "^Sender:" ".*Host:" "^Xref:" "^Content-Type:" "^Precedence:" "^Status:" "^X-VM-.*:")) ;; Displayed header field in message buffer. ;; This value precedes `wl-message-ignored-field-list' (setq wl-message-visible-field-list '("^Message-Id:")) ;; Reassemble partial messages automatically in displaying. ;(setq wl-message-auto-reassemble-message/partial t) ;; X-Face (when window-system (cond ((and (featurep 'xemacs) ; for XEmacs (module-installed-p 'x-face)) (autoload 'x-face-xmas-wl-display-x-face "x-face") (setq wl-highlight-x-face-function 'x-face-xmas-wl-display-x-face)) ;; for Emacs21 ((and (not (featurep 'xemacs)) (= emacs-major-version 21) (module-installed-p 'x-face-e21)) (autoload 'x-face-decode-message-header "x-face-e21") (setq wl-highlight-x-face-function 'x-face-decode-message-header)) ;; for Emacs 19.34, Emacs 20.x ((module-installed-p 'x-face-mule) ;; x-face-mule distributed with bitmap-mule 8.0 or later (autoload 'x-face-decode-message-header "x-face-mule") (setq wl-highlight-x-face-function 'x-face-decode-message-header)) )) ;; Scoring. ;; "all.SCORE" file is used regardless of wl-score-folder-alist. ;(setq wl-score-folder-alist ; '(("^-comp\\." ; "news.comp.SCORE" ; "news.SCORE") ; ("^-" ; "news.SCORE"))) ;; rule for auto refile. ;(setq wl-refile-rule-alist ; '( ; ("x-ml-name" ; ("^Wanderlust" . "+wl") ; ("^Elisp" . "+elisp")) ; ("From" ; ("foo@example\\.com" . "+foo")))) ;; Marks to skip auto-refile (default is "N" "U" "!"). ;; nil means all message is auto-refiled. ;(setq wl-summary-auto-refile-skip-marks nil) ;;; [[ Spam Filter Settings ]] ;; Use bogofilter as a back end. ;(setq elmo-spam-scheme 'bogofilter) ;(require 'wl-spam) ;; In moving to summary, judge whether a message is a spam. ;(setq wl-spam-auto-check-folder-regexp-list '("\\+inbox")) ;; Judge *first* whether a message is a spam ;; when `o' (wl-summary-refile) is performed in a summary buffer. ;(unless (memq 'wl-refile-guess-by-spam wl-refile-guess-functions) ; (setq wl-refile-guess-functions ; (cons #'wl-refile-guess-by-spam ; wl-refile-guess-functions))) ;; Judge *first* whether a message is a spam ;; when `C-o' (wl-summary-auto-refile) is performed in a summary buffer. ;(unless (memq 'wl-refile-guess-by-spam wl-auto-refile-guess-functions) ; (setq wl-auto-refile-guess-functions ; (cons #'wl-refile-guess-by-spam ; wl-auto-refile-guess-functions))) ;; When you want to give priority to refile-rule (same as spamfilter-wl.el ;; or bogofilter-wl.el), please confirm the setup here. ;(unless (memq 'wl-refile-guess-by-spam wl-auto-refile-guess-functions) ; (setq wl-auto-refile-guess-functions ; (append wl-auto-refile-guess-functions ; '(wl-refile-guess-by-spam)))) ;;; dot.wl ends here wanderlust-wanderlust-769699d/samples/ja/000077500000000000000000000000001406661363500204435ustar00rootroot00000000000000wanderlust-wanderlust-769699d/samples/ja/dot.addresses000066400000000000000000000006351406661363500231340ustar00rootroot00000000000000# # ~/.addresses アドレス帳ファイルサンプル # # '#' で始まる行はコメント。 # 空行は無視。 # # 書式: # メールアドレス "あだ名" "本名" # # あだ名はサマリの表示に、本名は To: フィールドに使われます。 # teranisi@gohome.org "てらにし" "寺西裕一" foo@example.com "ふーさん" "John Foo" bar@example.org "ばーさん" "Michael Bar" wanderlust-wanderlust-769699d/samples/ja/dot.folders000066400000000000000000000032301406661363500226070ustar00rootroot00000000000000# # ~/.folders フォルダ定義ファイルサンプル # # 個々のフォルダの書式については Info の Folders セクションを参照のこと。 # # '#' で始まる行はコメント。 # 空行は無視される。 # ## IMAP ユーザのメールボックス # %inbox ## POP ユーザのメールボックス # &USERNAME@POPSERVER.EXAMPLE.COM ## [ POP ユーザにはパイプフォルダが役に立ちます ] ## [ パイプフォルダを使えば、メールを取り込むことが可能です ] # |&USERNAME@POPSERVER.EXAMPLE.COM|+inbox ## ゴミ箱・草稿・送信箱 +trash +draft +queue ## 重要マーク `$' のついたメッセージをまとめる 'flag/important ## MH フォルダ +inbox ## IMAP フォルダ # %inbox.emacs.wl # %inbox.emacs.apel-ja ## IMAP サーバ越しに MH folder にアクセス # %#mh/inbox ## NNTP フォルダ # -fj.os.bsd.freebsd # -fj.mail.reader.mew # -fj.news.reader.gnus ## [ 他の NNTP サーバ上のニューズグループ ] # -jlug.ml.users@NEWS.EXAMPLE.NET # -emacs.auc-tex@NEWS.EXAMPLE.ORG # -ring.openlab.skk@NEWS.EXAMPLE.COM ## グループの定義 ## [ フォルダを波括弧でくくってグループにする ] # Emacsen{ # +to/wl # +to/mew-dist # +to/apel-ja ## [ グループの入れ子も可能 ] # XEmacs{ # +to/xemacs-beta # +to/xemacs-beta-ja # +to/xemacs-mule # } # } ## アクセスグループ ## [ 行末に '/' がつくと、そのフォルダに含まれるサブフォルダ全てが ] ## [ ひとつのグループとなる。] ## [ `C-u RET' でアクセスグループを開くと更新できる。 ] + / ## IMAP フォルダのアクセスグループの例 # % / wanderlust-wanderlust-769699d/samples/ja/dot.wl000066400000000000000000000337261406661363500216100ustar00rootroot00000000000000;;; dot.wl -- sample setting file for Wanderlust -*- emacs-lisp -*- ;; [[ 動作に必要な設定 ]] ;; まず、次の設定を ~/.emacs などに書いてください。 ;; XEmacs の package としてインストールされている場合は必要ありません。 (autoload 'wl "wl" "Wanderlust" t) (autoload 'wl-other-frame "wl" "Wanderlust on new frame." t) (autoload 'wl-draft "wl-draft" "Write draft with Wanderlust." t) ;; アイコンを置くディレクトリ ;; XEmacs の package としてインストールされている場合は必要ありません。 ;(setq wl-icon-directory "/usr/local/lib/emacs/etc") ;; [[ SEMI の設定 ]] ;; HTML パートを表示しない ;; mime-setup がロードされる前に記述する必要があります。 (setq mime-setup-enable-inline-html nil) ;; 大きいメッセージを送信時に分割しない (setq mime-edit-split-message nil) ;; 大きいメッセージとみなす行数の設定 ;(setq mime-edit-message-default-max-lines 1000) ;;; [[ 個人情報の設定 ]] ;; From: の設定 ;(setq wl-from "Your Name ") ;; (system-name) が FQDN を返さない場合、 ;; `wl-local-domain' にホスト名を除いたドメイン名を設定してください。 ;(setq wl-local-domain "example.com") ;; 自分のメールアドレスのリスト (setq wl-user-mail-address-list (list (wl-address-header-extract-address wl-from) ;; "e-mail2@example.com" ;; "e-mail3@example.net" ... )) ;; 自分の参加しているメーリングリストのリスト (setq wl-subscribed-mailing-list '("wl@ml.gentei.org" "apel-ja@m17n.org" "emacs-mime-ja@m17n.org" ;; "ml@example.com" ... )) ;;; [[ サーバの設定 ]] ;; IMAP サーバの設定 (setq elmo-imap4-default-server "localhost") ;; POP サーバの設定 (setq elmo-pop3-default-server "localhost") ;; SMTP サーバの設定 (setq wl-smtp-posting-server "localhost") ;; ニュースサーバの設定 (setq elmo-nntp-default-server "localhost") ;; 投稿先のニュースサーバ (setq wl-nntp-posting-server elmo-nntp-default-server) ;; IMAP サーバの認証方式の設定 (setq elmo-imap4-default-authenticate-type 'clear) ; 生パスワード ;(setq elmo-imap4-default-authenticate-type 'cram-md5) ; CRAM-MD5 ;; POP-before-SMTP ;(setq wl-draft-send-mail-function 'wl-draft-send-mail-with-pop-before-smtp) ;;; [[ 基本的な設定 ]] ;; `wl-summary-goto-folder' の時に選択するデフォルトのフォルダ ;(setq wl-default-folder "+inbox") ;; フォルダ名補完時に使用するデフォルトのスペック ;(setq wl-default-spec "+") ;; Folder Carbon Copy ;(setq wl-fcc "+outbox") ;; 終了時に確認する (setq wl-interactive-exit t) ;; メール送信時には確認する (setq wl-interactive-send t) ;; スレッドは常に開く ;(setq wl-thread-insert-opened t) ;; サマリバッファの左にフォルダバッファを表示する (3ペイン表示) ;(setq wl-stay-folder-window t) ;; 長い行を切り縮める ;(setq wl-message-truncate-lines t) ;(setq wl-draft-truncate-lines t) ;; XEmacs (21.4.6 より前) の場合、以下も必要。 ;(setq truncate-partial-width-windows nil) ;; ドラフトを新しいフレームで書く ;(setq wl-draft-use-frame t) ;; スレッド表示のインデントを無制限にする。 ;(setq wl-summary-indent-length-limit nil) ;(setq wl-summary-width nil) ;; サブジェクトが変わったらスレッドを切って表示 ;(setq wl-summary-divide-thread-when-subject-changed t) ;; スレッドの見た目を変える ;(setq wl-thread-indent-level 2) ;(setq wl-thread-have-younger-brother-str "+" ; wl-thread-youngest-child-str "+" ; wl-thread-vertical-str "|" ; wl-thread-horizontal-str "-" ; wl-thread-space-str " ") ;; サマリ移動後に先頭メッセージを表示する ;(setq wl-auto-select-first t) ;; サマリ内の移動で未読メッセージがないと次のフォルダに移動する ;(setq wl-auto-select-next t) ;; 未読がないフォルダは飛ばす(SPCキーだけで読み進める場合は便利) ;(setq wl-auto-select-next 'skip-no-unread) ;; 未読メッセージを優先的に読む ;(setq wl-summary-move-order 'unread) ;; 着信通知の設定 ;(setq wl-biff-check-folder-list '("%inbox")) ;(setq wl-biff-notify-hook '(ding)) ;;; [[ ネットワーク ]] ;; フォルダ種別ごとのキャッシュの設定 ;; (localdir, localnews, maildir はキャッシュできない) ;(setq elmo-archive-use-cache nil) ;(setq elmo-nntp-use-cache t) ;(setq elmo-imap4-use-cache t) ;(setq elmo-pop3-use-cache t) ;; オフライン(unplugged)操作を有効にする(現在はIMAPフォルダのみ) (setq elmo-enable-disconnected-operation t) ;; unplugged 状態で送信すると,キュー(`wl-queue-folder')に格納する (setq wl-draft-enable-queuing t) ;; unplugged から plugged に変えたときに,キューにあるメッセージを送信する (setq wl-auto-flush-queue t) ;; 起動時はオフライン状態にする ;(setq wl-plugged nil) ;; 起動時にポートごとのplug状態を変更する ;(add-hook 'wl-make-plugged-hook ; '(lambda () ; ;; server,portのplug状態を新規追加もしくは変更する ; (elmo-set-plugged plugged値(t/nil) server port) ; ;; port を省略するとserverの全portが変更される ; ;; (port を省略して新規の追加はできない) ; (elmo-set-plugged plugged値(t/nil) server) ; )) ;;; [[ 特殊な設定 ]] ;; グループをcheckした後に未読があるフォルダのグループを自動的に開く ;(add-hook 'wl-folder-check-entity-hook ; 'wl-folder-open-unread-folder) ;; `wl-summary-exit' によりフィルタされる前のフォルダに飛ぶ。フィルタフォルダを ;; `wl-summary-virtual' で生成される一時的なフォルダとして使う場合に有用。 ;(add-hook 'wl-summary-prepared-hook ; '(lambda () ; (setq wl-summary-buffer-exit-function ; (when (eq 'filter ; (elmo-folder-type-internal wl-summary-buffer-elmo-folder)) ; 'wl-summary-unvirtual)))) ;; サマリ表示関数を変更する ;; `elmo-message-entity-field' で参照したいフィールド。 ;; 自動リファイルで参照したいフィールドも設定する。 (setq elmo-msgdb-extra-fields '(;; elsp-header で参照するフィールド "x-spam-flag" ;; `modb-entity-field-extractor-alist' で定義された仮想フィールド "ml-info")) ;; ML のメッセージであれば,サマリの Subject 表示に ;; ML名 や MLにおけるメッセージ番号も表示する (setq wl-summary-line-format "%n%T%P%M/%D(%W)%h:%m %t%[%17(%c %f%) %] %#%~%s") ;; フォルダ毎にサマリの表示形式を変える設定 ;(setq wl-folder-summary-line-format-alist ; '(("^%inbox\\.emacs\\.wl$" . ; "%-5l%T%P%M/%D %h:%m %-4S %[ %17f %] %t%C%s") ; ("^%" . "%T%P%M/%D %h:%m %-4S %[ %17f %] %t%C%s") ; ("^+" . "%n%T%P%M/%D %h:%m %-4S %[ %17f %] %t%C%s"))) ;; imput により非同期で送信する ;; (utils/im-wl.el をインストールしておく必要があります。 ;; また,~/.im/Config の設定(Smtpservers)を忘れないことと, ;; wl-draft-enable-queuing の機能が働かなくなることに注意。) ;(autoload 'wl-draft-send-with-imput-async "im-wl") ;(setq wl-draft-send-function 'wl-draft-send-with-imput-async) ;; 短い User-Agent: フィールドを使う ;(setq wl-generate-mailer-string-function ; 'wl-generate-user-agent-string-1) ;; PGP で暗号化する時に自分の公開鍵も含める。 ;; (そのメッセージを自分でも読めるように) ;(setq pgg-encrypt-for-me t) ;;; [[ テンプレート ]] ;; テンプレートの設定 ;(setq wl-template-alist ; '(("default" ; ("From" . wl-from) ; ("Organization" . "デフォルトの組織名") ; (body . " ○○です。\n")) ; 本文 ; ("report" ; ("To" . "boss@example.com") ; ("Subject" . "報告") ; (top . "今週の報告です。\n") ; 本文先頭への挿入 ; (bottom-file . "~/work/report.txt") ; 本文末尾へファイルの挿入 ; ) ; )) ;; ドラフトバッファの内容により From や Organization などのヘッダを自 ;; 動的に変更する ;(setq wl-draft-config-alist ; '((reply ; 返信元のバッファを見る ; "^To: .*test-notsend-wl@lists\\.airs\\.net" ; (template . "default")) ; テンプレート ; ("^To: .*test-notsend-wl@lists\\.airs\\.net" ; ding ; 関数 ; ("From" . wl-from) ; 変数 ; ("Organization" . "組織名")) ; 文字列 ; ("^Newsgroups: test.*" ; ("Organization" . "ニュース投稿時の組織名")) ; )) ;; ドラフト作成時(返信時)に,自動的にヘッダを変更する ;(add-hook 'wl-mail-setup-hook ; '(lambda () ; (unless wl-draft-reedit ; 再編集時は適用しない ; (wl-draft-config-exec wl-draft-config-alist)))) ;;; [[ 返信時の設定 ]] ;; 返信時のウィンドウを広くする ;(setq wl-draft-reply-buffer-style 'full) ;; 返信時のヘッダに相手の名前を入れない。 ;(setq wl-draft-reply-use-address-with-full-name nil) ;; メールの返信時に宛先を付ける方針の設定 ;; 下記変数の alist の要素 ;; ("返信元に存在するフィールド" . ;; ('Toフィールド' 'Ccフィールド' 'Newsgroupsフィールド')) ;; "a" (without-argument)では Reply-To: や From: などで指定された唯一人 ;; または唯一つの投稿先に返信する。また,X-ML-Name: と Reply-To: がつい ;; ているなら Reply-To: 宛にする。 ;(setq wl-draft-reply-without-argument-list ; '((("X-ML-Name" "Reply-To") . (("Reply-To") nil nil)) ; ("X-ML-Name" . (("To" "Cc") nil nil)) ; ("Followup-To" . (nil nil ("Followup-To"))) ; ("Newsgroups" . (nil nil ("Newsgroups"))) ; ("Reply-To" . (("Reply-To") nil nil)) ; ("Mail-Reply-To" . (("Mail-Reply-To") nil nil)) ; (wl-draft-self-reply-p . (("To") ("Cc") nil)) ; ("From" . (("From") nil nil)))) ;; 2.11.0 以前のデフォルト設定 ;(setq wl-draft-reply-without-argument-list ; '(((wl-draft-self-reply-p ; "Followup-To") . (("To") ("Cc") ("Followup-To"))) ; ((wl-draft-self-reply-p ; "Newsgroups") . (("To") ("Cc") ("Newsgroups"))) ; ((wl-draft-self-reply-p ; "From") . (("To") ("Cc") nil)) ; ("Followup-To" . (nil nil ("Followup-To"))) ; ("Mail-Followup-To" . (("Mail-Followup-To") nil ("Newsgroups"))) ; ("Reply-To" . (("Reply-To") ("To" "Cc" "From") ("Newsgroups"))) ; ("From" . (("From") ("To" "Cc") ("Newsgroups"))))) ;(setq wl-draft-reply-with-argument-list ; '(((wl-draft-self-reply-p ; "Followup-To") . (("To") ("Cc") ("Followup-To"))) ; ((wl-draft-self-reply-p ; "Newsgroups") . (("To") ("Cc") ("Newsgroups"))) ; ((wl-draft-self-reply-p ; "From") . (("To") ("Cc") nil)) ; ("Reply-To" . (("Reply-To") nil nil)) ; ("Mail-Reply-To" . (("Mail-Reply-To") nil nil)) ; ("From" . (("From") nil nil)))) ;;; [[ メッセージ表示の設定 ]] ;; 隠したいヘッダの設定 (setq wl-message-ignored-field-list '(".*Received:" ".*Path:" ".*Id:" "^References:" "^Replied:" "^Errors-To:" "^Lines:" "^Sender:" ".*Host:" "^Xref:" "^Content-Type:" "^Precedence:" "^Status:" "^X-VM-.*:")) ;; 表示するヘッダの設定 ;; 'wl-message-ignored-field-list' より優先される (setq wl-message-visible-field-list '("^Message-Id:")) ;; 分割されたメッセージは自動的に結合する ;(setq wl-message-auto-reassemble-message/partial t) ;; X-Face を表示する (when window-system (cond ((and (featurep 'xemacs) ; for XEmacs (module-installed-p 'x-face)) (autoload 'x-face-xmas-wl-display-x-face "x-face") (setq wl-highlight-x-face-function 'x-face-xmas-wl-display-x-face)) ;; for Emacs21 ((and (not (featurep 'xemacs)) (= emacs-major-version 21) (module-installed-p 'x-face-e21)) (autoload 'x-face-decode-message-header "x-face-e21") (setq wl-highlight-x-face-function 'x-face-decode-message-header)) ;; for Emacs 19.34, Emacs 20.x ((module-installed-p 'x-face-mule) ;; x-face-mule distributed with bitmap-mule 8.0 or later (autoload 'x-face-decode-message-header "x-face-mule") (setq wl-highlight-x-face-function 'x-face-decode-message-header)) )) ;; スコア機能の設定 ;; `wl-score-folder-alist' の設定に関わらず必ず "all.SCORE" は使用される。 ;(setq wl-score-folder-alist ; '(("^-comp\\." ; "news.comp.SCORE" ; "news.SCORE") ; ("^-" ; "news.SCORE"))) ;; 自動リファイルのルール設定 ;(setq wl-refile-rule-alist ; '( ; ("x-ml-name" ; ("^Wanderlust" . "+wl") ; ("^Elisp" . "+elisp")) ; ("From" ; ("foo@example\\.com" . "+foo")))) ;; 自動リファイルしない永続マークを設定 ;; 標準では "N" "U" "!" になっており、未読メッセージを自動リファイルし ;; ません。nil ですべてのメッセージが対象になります。 ;(setq wl-summary-auto-refile-skip-marks nil) ;;; [[ spam 用の設定 ]] ;; バックエンドに bogofilter を使う事を設定 ;(setq elmo-spam-scheme 'bogofilter) ;(require 'wl-spam) ;; 移動した時に自動で spam かどうかチェックするフォルダを設定 ;(setq wl-spam-auto-check-folder-regexp-list '("\\+inbox")) ;; サマリバッファで `o' (wl-summary-refile) した時, *最初*に spam かど ;; うかを判定する様にする ;(unless (memq 'wl-refile-guess-by-spam wl-refile-guess-functions) ; (setq wl-refile-guess-functions ; (cons #'wl-refile-guess-by-spam ; wl-refile-guess-functions))) ;; サマリバッファで `C-o' (wl-summary-auto-refile) した時, *最初*に ;; spam かどうかを判定する様にする ;(unless (memq 'wl-refile-guess-by-spam wl-auto-refile-guess-functions) ; (setq wl-auto-refile-guess-functions ; (cons #'wl-refile-guess-by-spam ; wl-auto-refile-guess-functions))) ;; refile-rule を優先したい場合 (spamfilter-wl.el や bogofilter-wl.el ;; と同じ設定) は, こっちの設定を有効にする ;(unless (memq 'wl-refile-guess-by-spam wl-auto-refile-guess-functions) ; (setq wl-auto-refile-guess-functions ; (append wl-auto-refile-guess-functions ; '(wl-refile-guess-by-spam)))) ;;; dot.wl ends here wanderlust-wanderlust-769699d/tests/000077500000000000000000000000001406661363500175475ustar00rootroot00000000000000wanderlust-wanderlust-769699d/tests/ChangeLog.1000066400000000000000000000256471406661363500214760ustar00rootroot000000000000002020-07-13 Kazuhiro Ito * test-elmo-util.el (test-elmo-number-list-to-number-set-1): Add new tests for elmo-number-list-to-number-set. 2017-09-22 Kazuhiro Ito * test-elmo-imap4.el (test-elmo-imap4-parse-greeting-ok) (test-elmo-imap4-parse-greeting-preauth) (test-elmo-imap4-parse-greeting-bye): Use insert insead of insert-string. Quote expression for lunit-assert. * test-elmo-localdir.el: Require wl-folder.el. * test-elmo-util.el: Require elmo-passwd.el. (test-elmo-remove-passwd-1, test-elmo-remove-passwd-2) (test-elmo-remove-passwd-3, test-elmo-passwd-alist-clear-1): Adapt to recent change. Only alist storage type will be tested. 2012-09-23 David Maus * test-elmo-util.el (test-elmo-get-message-id-from-field): Add test for extracting message ids. 2012-09-09 David Maus * test-elmo-date.el: Remove `lexical-binding' file variable. * test-elmo-imap4.el: Ditto. * test-elmo-localdir.el: Ditto. * test-elmo-util.el: Ditto. * test-rfc2368.el: Ditto. * test-utf7.el: Ditto. * test-wl-draft.el: Ditto. * test-wl-util.el: Ditto. 2011-05-30 TAKAHASHI Kaoru * test-wl-address.el: New file. 2011-04-07 TAKAHASHI Kaoru * test-elmo-date.el: Add `lexical-binding' file variable. * test-elmo-imap4.el: Ditto. * test-elmo-localdir.el: Ditto. * test-elmo-util.el: Ditto. * test-rfc2368.el: Ditto. * test-utf7.el: Ditto. * test-wl-draft.el: Ditto. * test-wl-util.el: Ditto. 2011-04-06 TAKAHASHI Kaoru * test-dist.el: Add `lexical-binding' file variable. (test-wl-modules-trailing-whitespace, test-elmo-modules-exists) (test-elmo-modules-trailing-whitespace) (test-util-modules-exists) (test-util-modules-trailing-whitespace, test-wl-icon-exists): Fix let style for `lexical-binding'. 2010-08-31 TAKAHASHI Kaoru * test-dist.el (test-elmo-modules-trailing-whitespace) (test-util-modules-trailing-whitespace) (test-wl-modules-trailing-whitespace): New testcases. 2010-01-22 TAKAHASHI Kaoru * test-utf7.el (test-utf7-encode-string-alpha): Fix indent. * test-elmo-date.el (test-elmo-date-get-week): Add assert. 2010-01-01 TAKAHASHI Kaoru * test-elmo-util.el (test-elmo-delete-cr-1): New testcase. * test-elmo-date.el (test-elmo-time-parse-date-string-1) (test-elmo-time-parse-date-string-2): New testcase. 2009-08-01 TAKAHASHI Kaoru * test-elmo-imap4.el: New file. (test-elmo-imap4-parse-greeting-ok): New testcase. (test-elmo-imap4-parse-greeting-preauth): Ditto. (test-elmo-imap4-parse-greeting-bye): Ditto. * test-utf7.el (toplevel): Use `fboundp' instead of `boundp'. Fix (require 'utf7) order for Mule-UCS. (test-utf7-decode-string-plus): New testcase. (test-utf7-decode-string-noconv): Ditto. (test-utf7-encode-string-plus): Ditto. (test-utf7-encode-string-noconv): Ditto. (test-utf7-decode-string-nihongo): Rename from `test-utf7-decode-string'. Use `make-char'. (test-utf7-encode-string-nihongo): Rename from `test-utf7-encode-string'. Use `make-char'. (test-utf7-decode-string-alpha): New testcase. (test-utf7-encode-string-alpha): Ditto. (test-utf7-decode-string-smiling-face): Ditto. (test-utf7-encode-string-smiling-face): Ditto. 2008-02-19 TAKAHASHI Kaoru * test-wl-util.el (test-wl-unique-id-by-user): New testcase. (test-wl-inverse-alist): Ditto. 2008-02-15 TAKAHASHI Kaoru * test-elmo-date.el: New file. 2006-11-03 Yoichi NAKAYAMA * test-wl-draft.el: New file. 2005-02-27 Yuuichi Teranishi * test-elmo-util.el (test-elmo-same-list-p): New function. (test-elmo-same-diff-p): Ditto. (test-elmo-list-diff): Use it. 2005-02-27 Tetsurou Okazaki * test-elmo-util.el (test-elmo-list-diff): New testcase. 2004-10-11 Hiroya Murata * test-elmo-util.el (test-elmo-number-set-delete-1): New testcase. (test-elmo-number-set-delete-2): Ditto. (test-elmo-number-set-delete-3): Ditto. (test-elmo-number-set-delete-4): Ditto. (test-elmo-number-set-delete-5): Ditto. (test-elmo-number-set-delete-6): Ditto. (test-elmo-number-set-delete-7): Ditto. (test-elmo-number-set-delete-8): Ditto. (test-elmo-number-set-delete-list-1): Ditto. 2004-10-04 Yuuichi Teranishi * test-utf7.el (toplevel): Enable utf-translate-cjk-mode explicitly. 2004-05-05 Yuuichi Teranishi * test-elmo-localdir.el (test-elmo-folder-expand-msgdb-path-4): Remove. * test-utf7.el (toplevel): Setup utf-translate-cjk-mode or require 'un-define if available. 2004-02-21 TAKAHASHI Kaoru * test-rfc2368.el: New file. * test-elmo-util.el (test-elmo-number-set-member-1): Use `equal'. (test-elmo-number-set-member-2): New testcase. 2004-02-19 TAKAHASHI Kaoru * test-elmo-util.el (lunit-test-case-setup): Set `print-length', `print-level', and `case-fold-search'. (lunit-test-case-teardown): Check file existence before remove. (test-elmo-object-save-2, test-elmo-save-string-1) (test-elmo-uniq-list-1, test-elmo-uniq-list-2) (test-elmo-uniq-list-3, test-elmo-list-insert-1) (test-elmo-list-insert-2, test-elmo-delete-char-1) (test-elmo-concat-path-1) (test-elmo-remove-passwd-1, test-elmo-remove-passwd-2) (test-elmo-remove-passwd-3, test-elmo-passwd-alist-clear-1) (test-elmo-address-quote-specials-1) (test-elmo-address-quote-specials-2, test-elmo-elmo-flatten-1) (test-elmo-number-set-member-1, test-elmo-number-set-append-list-1) (test-elmo-number-set-append-1) (test-elmo-number-set-to-number-list-1): New testcases. Add docstring. 2004-02-18 TAKAHASHI Kaoru * test-elmo-util.el (test-elmo-object-save-1): New testcase. (lunit-test-case-setup, lunit-test-case-teardown): Add temporary-file stuff. * test-elmo-localdir.el (test-elmo-folder-expand-msgdb-path-4): New testcase. (test-elmo-folder-expand-msgdb-path-2): Change order. 2004-01-11 Hiroya Murata * test-dist.el (test-version-status-icon-xpm): Follow the redefined `wl-demo-icon-name' as function. (test-version-status-icon-xbm): Ditto. 2003-11-30 Hiroya Murata * check-modules.el (test-spamfilter): Check `spamf-corpus-name'. 2003-07-31 Yoichi NAKAYAMA * check-modules.el (test-shimbun): Check `shimbun-server'. 2003-02-10 TAKAHASHI Kaoru * check-modules.el (test-semi-mime-edit): Check `mime-make-text-tag'. 2003-01-28 TAKAHASHI Kaoru * check-modules.el (test-apel-version): Renamed from `check-modules-apel-version'. (test-modules-charsets-mime-charset-alist): Ditto. (test-x-face-xmas, test-x-face-mule): Ditto. (test-flim-mime-entity, test-flim-mime-content-information): Ditto. (test-flim-encoded-word, test-flim-content-transfer-encoding): Ditto. (test-flim-mailcap, test-flim-std11, test-flim-smtp): Ditto. (test-semi-mime-edit, test-semi-mime-view, test-semi-mime-play): Ditto. * check-base64.el (test-base64-encode-1): Renamed from `check-base64-encode-1'. (test-base64-encode-2, test-base64-encode-3): Ditto. (test-base64-encode-4, test-base64-encode-5): Ditto. 2003-01-17 TAKAHASHI Kaoru * test-elmo-localdir.el: New file. (test-elmo-folder-expand-msgdb-path-1): New testcase. (test-elmo-folder-expand-msgdb-path-2): Ditto. (test-elmo-folder-expand-msgdb-path-3): Ditto. * test-dist.el (test-wl-modules-exists): Fix void variable. (test-elmo-modules-exists): Ditto. 2003-01-12 TAKAHASHI Kaoru * check-modules.el (check-modules-semi-mime-edit): Check `mime-create-tag'. 2003-01-06 TAKAHASHI Kaoru * test-dist.el (test-wl-demo-copyright-notice): Check always. 2002-12-11 TAKAHASHI Kaoru * test-dist.el (test-version-toplevel-changelog): Fixed regexp. 2002-10-27 TAKAHASHI Kaoru * test-dist.el (test-version-readme): New testcase. (test-wl-demo-copyright-notice): Ditto. 2002-10-24 TAKAHASHI Kaoru * check-modules.el (check-modules-flim-content-transfer-encoding): Fixed `mime-encode-string' testcase. 2002-07-12 TAKAHASHI Kaoru * check-modules.el (check-modules-charsets-mime-charset-alist): New testcase. 2002-05-23 TAKAHASHI Kaoru * check-modules.el (check-modules-x-face-mule): New testcase. (check-modules-x-face-decode-message-header): New function. 2002-01-01 TAKAHASHI Kaoru * test-dist.el (test-refcard-version): Check version.tex. 2001-12-12 TAKAHASHI Kaoru * test-dist.el (test-codename, test-version-wl-changelog) (test-version-elmo-changelog, test-version-toplevel-changelog) (test-refcard-version): New testcases. * check-modules.el (check-modules-apel-version): Update require APEL version. 2001-11-25 TAKAHASHI Kaoru * check-base64.el (toplevel): Remove (require 'wl). * check-modules.el (check-modules-flim-mime-entity) (check-modules-flim-mime-content-information) (check-modules-flim-encoded-word) (check-modules-flim-content-transfer-encoding) (check-modules-flim-mailcap, check-modules-flim-std11) (check-modules-flim-smtp) (check-modules-semi-mime-edit, check-modules-semi-mime-view) (check-modules-semi-mime-play): New testcases. 2001-10-28 TAKAHASHI Kaoru * check-modules.el (check-modules-x-face-xmas-wl-display-x-face-was-argument-required): Fixed docstring. 2001-10-27 TAKAHASHI Kaoru * check-modules.el (check-modules-x-face-xmas): New testcase. For old x-face utility. (check-modules-x-face-xmas-wl-display-x-face-was-argument-required): New function. 2001-08-30 Yuuichi Teranishi * test-env.el: Removed (Separated to check-*.el). * check-base64.el: New file. * check-modules.el: Ditto. * test-env.el (test-base64-encode-string-has-no-line-break-argument, test-base64-encode-region-has-no-line-break-argument): New functions. (test-base64-encode-4, test-base64-encode-5): Use them. 2001-08-29 Yuuichi Teranishi * test-env.el (test-base64-encode-4, test-base64-encode-5): New testcases. 2001-08-29 TAKAHASHI Kaoru * test-utf7.el: New file. (test-utf7-encode-string, test-utf7-decode-string): New testcases. * test-env.el: New file. (test-apel-version, test-base64-encode-1) (test-base64-encode-2, test-base64-encode-3): New testcases. 2001-08-28 TAKAHASHI Kaoru * test-wl-util.el: New file. (test-wl-parse-addresses-1, test-wl-unique-id): New testcases. * test-elmo-util.el: New file. (test-elmo-replace-string-as-filename-1): New testcase. * test-dist.el: New file. (test-wl-modules-exists, test-elmo-modules-exists) (test-util-modules-exists, test-wl-icon-exists) (test-version-status-icon-xpm, test-version-status-icon-xbm) (test-texi-version): New testcases. wanderlust-wanderlust-769699d/tests/check-base64.el000066400000000000000000000027741406661363500222420ustar00rootroot00000000000000(require 'lunit) (luna-define-class check-base64 (lunit-test-case)) ;; mel-b-ccl on XEmacs 21.1 ;; (luna-define-method test-base64-encode-1 ((case check-base64)) (require 'elmo-util) (lunit-assert (string= "QQ==" (elmo-base64-encode-string "A")))) (luna-define-method test-base64-encode-2 ((case check-base64)) (require 'elmo-util) (lunit-assert (string= "QUE=" (elmo-base64-encode-string "AA")))) (luna-define-method test-base64-encode-3 ((case check-base64)) (require 'elmo-util) (lunit-assert (string= "QUFB" (elmo-base64-encode-string "AAA")))) ;; Old base64 module on XEmacs 21.1 ;; (defun check-base64-encode-string-has-no-line-break-argument () (require 'elmo-util) (condition-case nil (elmo-base64-encode-string "" t) (wrong-number-of-arguments))) (luna-define-method test-base64-encode-4 ((case check-base64)) (lunit-assert (check-base64-encode-string-has-no-line-break-argument))) ;; (defun check-base64-encode-region-has-no-line-break-argument () (require 'mel) (condition-case nil (with-temp-buffer (funcall (mel-find-function 'mime-encode-region "base64") (point-min) (point-max) t) t) (wrong-number-of-arguments))) (luna-define-method test-base64-encode-5 ((case check-base64)) (lunit-assert (check-base64-encode-region-has-no-line-break-argument))) wanderlust-wanderlust-769699d/tests/check-modules.el000066400000000000000000000146641406661363500226270ustar00rootroot00000000000000(require 'lunit) (require 'wl) (luna-define-class check-modules (lunit-test-case)) ;;; ;;; environment test for user (not for developer) ;;; ;; APEL (luna-define-method test-apel-version ((case check-modules)) (require 'apel-ver) (lunit-assert (product-version>= (product-find 'apel-ver) '(10 3)))) (luna-define-method test-modules-charsets-mime-charset-alist ((case check-modules)) (require 'mcharset) (lunit-assert (not (memq nil charsets-mime-charset-alist)))) ;; X-Face on XEmacs (luna-define-method test-x-face-xmas ((case check-modules)) (when (and (locate-library "x-face") (featurep 'xemacs)) (lunit-assert (check-modules-x-face-xmas-wl-display-x-face-was-argument-required)))) (defun check-modules-x-face-xmas-wl-display-x-face-was-argument-required () "When `x-face-xmas-wl-display-x-face' has non-optional argument, return nil." (require 'x-face-xmas) (condition-case nil (with-temp-buffer (x-face-xmas-wl-display-x-face) t) (wrong-number-of-arguments))) ;; x-face-mule (luna-define-method test-x-face-mule ((case check-modules)) (when (and (locate-library "x-face-mule") (not (featurep 'xemacs)) (not (locate-library "x-face-e21"))) (require 'x-face-mule) (lunit-assert (fboundp 'x-face-decode-message-header)) (lunit-assert (check-modules-x-face-decode-message-header)))) (defun check-modules-x-face-decode-message-header () "When `x-face-decode-message-header' has non-optional argument, return nil." (require 'x-face-mule) (condition-case nil (with-temp-buffer (x-face-decode-message-header) t) (wrong-number-of-arguments))) ;; MIME entity (FLIM API Version 1.14 Draft Release 3) (luna-define-method test-flim-mime-entity ((case check-modules)) (require 'mime) (lunit-assert (fboundp 'mime-open-entity)) ; [Required] (lunit-assert (fboundp 'mime-entity-children)) ; [Required] (lunit-assert (fboundp 'mime-entity-fetch-field)) ; [Required] (lunit-assert (fboundp 'mime-insert-text-content)) ; [Required] (lunit-assert (boundp 'default-mime-charset)) ; [Required] (lunit-assert (fboundp 'mime-entity-content)) ; [Required] (lunit-assert (fboundp 'mime-write-entity-content)) ; [Required] (lunit-assert (fboundp 'mime-insert-entity)) ; [Required] (lunit-assert (fboundp 'mime-write-entity)) ; [Required] (lunit-assert (fboundp 'mime-insert-entity-body)) ; [Required] (lunit-assert (fboundp 'mime-write-entity-body))) ; [Required] ;; MIME content information (FLIM API Version 1.14 Draft Release 3) (luna-define-method test-flim-mime-content-information ((case check-modules)) (require 'mime) (lunit-assert (fboundp 'mime-content-type-primary-type)) ; [Required] (lunit-assert (fboundp 'mime-content-type-subtype)) ; [Required] (lunit-assert (fboundp 'mime-content-type-parameter)) ; [Required] (lunit-assert (fboundp 'mime-content-disposition-type)) ; [Required] (lunit-assert (fboundp 'mime-content-disposition-parameter))) ; [Required] ;; encoded-word (FLIM API Version 1.14 Draft Release 3) (luna-define-method test-flim-encoded-word ((case check-modules)) (require 'mime) (lunit-assert (fboundp 'mime-decode-field-body)) ; [Required] (lunit-assert (fboundp 'mime-encode-field-body))) ; [Required] ;; Content-Transfer-Encoding (FLIM API Version 1.14 Draft Release 3) (luna-define-method test-flim-content-transfer-encoding ((case check-modules)) (require 'mel) ;; mime-decode-string (string encoding) [Required] (lunit-assert (fboundp 'mime-decode-string)) (lunit-assert (fboundp (mel-find-function 'mime-decode-string "base64"))) ;; mime-encode-string (string encoding) [Required] (lunit-assert (fboundp (mel-find-function 'mime-encode-string "base64"))) (lunit-assert (fboundp 'base64-decode-string)) ; [Required] (lunit-assert (fboundp 'base64-encode-string)) ; [Required] (lunit-assert (fboundp 'mime-write-decoded-region)) ; [Required] (lunit-assert (fboundp 'mime-insert-encoded-file)) ; [Required] (lunit-assert (fboundp 'binary-write-decoded-region)) ; [Required] (lunit-assert (fboundp 'binary-insert-encoded-file))) ; [Required] ;; Mailcap (FLIM API Version 1.14 Draft Release 3) (luna-define-method test-flim-mailcap ((case check-modules)) (require 'mime-conf) (lunit-assert (fboundp 'mime-parse-mailcap-buffer)) ; [Required] (lunit-assert (boundp 'mime-mailcap-file)) ; [Required] (lunit-assert (fboundp 'mime-parse-mailcap-file)) ; [Required] (lunit-assert (fboundp 'mime-format-mailcap-command))) ; [Required] ;; STD 11 (FLIM API Version 1.14 Draft Release 3) (luna-define-method test-flim-std11 ((case check-modules)) (require 'std11) (lunit-assert (fboundp 'std11-narrow-to-header)) ; [Required] (lunit-assert (fboundp 'std11-fetch-field)) ; [Required] (lunit-assert (fboundp 'std11-field-body)) ; [Required] (lunit-assert (fboundp 'std11-unfold-string))) ; [Required] ;; SMTP (FLIM API Version 1.14 Draft Release 3) (luna-define-method test-flim-smtp ((case check-modules)) (require 'smtp) (lunit-assert (fboundp 'smtp-send-buffer))) ; [Suggest] ;; SEMI (luna-define-method test-semi-mime-edit ((case check-modules)) (require 'mime-edit) (lunit-assert (fboundp 'mime-find-file-type)) (lunit-assert (fboundp 'mime-edit-content-beginning)) (lunit-assert (fboundp 'mime-edit-content-end)) (lunit-assert (fboundp 'mime-edit-preview-message)) (lunit-assert (fboundp 'mime-create-tag)) (lunit-assert (fboundp 'mime-make-text-tag))) (luna-define-method test-semi-mime-view ((case check-modules)) (require 'mime-view) (lunit-assert (fboundp 'mime-display-message)) (lunit-assert (fboundp 'mime-maybe-hide-echo-buffer)) (lunit-assert (fboundp 'mime-preview-original-major-mode)) (lunit-assert (fboundp 'mime-preview-follow-current-entity)) (lunit-assert (fboundp 'mime-view-mode)) (lunit-assert (fboundp 'mime-display-text/plain)) (lunit-assert (fboundp 'mime-entity-situation))) (luna-define-method test-semi-mime-play ((case check-modules)) (require 'mime-play) (lunit-assert (fboundp 'mime-store-message/partial-piece))) ;; emacs-w3m >= 1.3.4 (luna-define-method test-shimbun ((case check-modules)) (when (locate-library "shimbun") (require 'shimbun) (lunit-assert (fboundp 'shimbun-server)))) ;; spamfilter.el >= 0.10 (luna-define-method test-spamfilter ((case check-modules)) (when (locate-library "spamfilter") (require 'spamfilter) (lunit-assert (fboundp 'spamf-corpus-name)))) wanderlust-wanderlust-769699d/tests/test-dist.el000066400000000000000000000157111406661363500220160ustar00rootroot00000000000000;; -*- lexical-binding: t -*- (require 'lunit) (require 'wl) (require 'cl) ; mapc (luna-define-class test-dist (lunit-test-case)) ;; WL-MODULES (defvar test-dist-wl-lost-module-list nil) (luna-define-method test-wl-modules-exists ((case test-dist)) (setq test-dist-wl-lost-module nil) (mapc (lambda (module) (let ((filename (concat (symbol-name module) ".el"))) (unless (file-exists-p (expand-file-name filename WLDIR)) (add-to-list 'test-dist-wl-lost-module-list filename)))) WL-MODULES) (lunit-assert (null test-dist-wl-lost-module-list))) (defvar test-dist-wl-bad-module-list nil) (luna-define-method test-wl-modules-trailing-whitespace ((case test-dist)) (setq test-dist-wl-bad-module-list nil) (mapc (lambda (module) (let ((filename (format "%s.el%s" (symbol-name module) (if (eq 'wl-news module) ".in" "")))) (with-temp-buffer (insert-file-contents (expand-file-name filename WLDIR)) (when (re-search-forward "[ \t]$" nil t) (add-to-list 'test-dist-wl-bad-module-list filename))))) WL-MODULES) (lunit-assert (null test-dist-wl-bad-module-list))) ;; ELMO-MODULES (defvar test-dist-elmo-lost-module-list nil) (luna-define-method test-elmo-modules-exists ((case test-dist)) (setq test-dist-elmo-lost-module-list nil) (mapc (lambda (module) (let ((filename (concat (symbol-name module) ".el"))) (unless (file-exists-p (expand-file-name filename ELMODIR)) (add-to-list 'test-dist-elmo-lost-module-list filename)))) ELMO-MODULES) (lunit-assert (null test-dist-elmo-lost-module-list))) (defvar test-dist-elmo-bad-module-list nil) (luna-define-method test-elmo-modules-trailing-whitespace ((case test-dist)) (setq test-dist-elmo-bad-module-list nil) (mapc (lambda (module) (let ((filename (format "%s.el" (symbol-name module)))) (with-temp-buffer (insert-file-contents (expand-file-name filename ELMODIR)) (when (re-search-forward "[ \t]$" nil t) (add-to-list 'test-dist-elmo-bad-module-list filename))))) ELMO-MODULES) (lunit-assert (null test-dist-elmo-bad-module-list))) ;; UTILS-MODULES (defvar test-dist-util-lost-module-list nil) (luna-define-method test-util-modules-exists ((case test-dist)) (setq test-dist-util-lost-module-list nil) (mapc (lambda (module) (let ((filename (concat (symbol-name module) ".el"))) (unless (file-exists-p (expand-file-name filename UTILSDIR)) (add-to-list 'test-dist-util-lost-module-list symbol)))) UTILS-MODULES) (lunit-assert (null test-dist-util-lost-module-list))) (defvar test-dist-util-bad-module-list nil) (luna-define-method test-util-modules-trailing-whitespace ((case test-dist)) (setq test-dist-util-bad-module-list nil) (mapc (lambda (module) (let ((filename (format "%s.el" (symbol-name module)))) (with-temp-buffer (insert-file-contents (expand-file-name filename UTILSDIR)) (when (re-search-forward "[ \t]$" nil t) (add-to-list 'test-dist-util-bad-module-list filename))))) UTILS-MODULES) (lunit-assert (null test-dist-util-bad-module-list))) ;; Icons (defvar test-dist-wl-lost-icon-list nil) (luna-define-method test-wl-icon-exists ((case test-dist)) (setq test-dist-wl-lost-icon-list nil) (mapatoms (lambda (symbol) (let ((name (symbol-name symbol)) (value (and (boundp symbol) (symbol-value symbol)))) (when (and (string-match "^wl-.*-icon$" name) (stringp value) (string-match "xpm$" value)) (unless (file-exists-p (expand-file-name value ICONDIR)) (add-to-list 'test-dist-wl-lost-icon-list symbol)))))) (lunit-assert (null test-dist-wl-lost-icon-list))) (luna-define-method test-version-status-icon-xpm ((case test-dist)) (require 'wl-demo) (lunit-assert (file-exists-p (expand-file-name (concat (wl-demo-icon-name) ".xpm") ICONDIR)))) (luna-define-method test-version-status-icon-xbm ((case test-dist)) (require 'wl-demo) (lunit-assert (file-exists-p (expand-file-name (concat (wl-demo-icon-name) ".xbm") ICONDIR)))) ;; verstion.texi (luna-define-method test-texi-version ((case test-dist)) (require 'wl-version) (lunit-assert (string= (product-version-string (product-find 'wl-version)) (with-temp-buffer (insert-file-contents (expand-file-name "version.texi" DOCDIR)) (re-search-forward "^@set VERSION \\([0-9\.]+\\)$") (match-string 1))))) ;; version.tex (luna-define-method test-refcard-version ((case test-dist)) (require 'wl-version) (lunit-assert (string= (product-version-string (product-find 'wl-version)) (with-temp-buffer (insert-file-contents (expand-file-name "version.tex" DOCDIR)) (re-search-forward "^\\\\def\\\\versionnumber{\\([0-9\.]+\\)}$") (match-string 1))))) ;; wl/ChangeLog (luna-define-method test-version-wl-changelog ((case test-dist)) (require 'wl-version) (lunit-assert (string= (product-version-string (product-find 'wl-version)) (with-temp-buffer (insert-file-contents (expand-file-name "ChangeLog" WLDIR)) (re-search-forward "^\t\\* Version number is increased to \\([0-9\\.]+[0-9]\\).$") (match-string 1))))) ;; elmo/ChangeLog (luna-define-method test-version-elmo-changelog ((case test-dist)) (require 'elmo-version) (lunit-assert (string= (product-version-string (product-find 'elmo-version)) (with-temp-buffer (insert-file-contents (expand-file-name "ChangeLog" ELMODIR)) (re-search-forward "^\t\\* elmo-version.el (elmo-version): Up to \\([0-9\\.]+[0-9]\\).$") (match-string 1))))) ;; ChangeLog (toplevel) (luna-define-method test-version-toplevel-changelog ((case test-dist)) (require 'wl-version) (when (and (string= (wl-version-status) "stable") ;; pre release version don't check. (not (string-match "pre" (product-code-name (product-find 'wl-version))))) (with-temp-buffer (insert-file-contents (expand-file-name "ChangeLog" "./")) (re-search-forward "^\t\\* \\([0-9\\.]+\\) - \"\\([^\"]+\\)\"$") (lunit-assert (string= (product-version-string (product-find 'wl-version)) (match-string 1))) (lunit-assert (string= (product-code-name (product-find 'wl-version)) (match-string 2)))))) ;; README, README.ja (toplevel) (luna-define-method test-version-readme ((case test-dist)) (require 'wl-version) (when (string= (wl-version-status) "stable") (mapc (lambda (file) (with-temp-buffer (insert-file-contents (expand-file-name file "./")) (re-search-forward "checkout -r wl-\\([0-9]+\\)_\\([0-9]+\\) wanderlust") (lunit-assert (= (string-to-number (match-string 1)) (nth 0 (product-version (product-find 'wl-version))))) (lunit-assert (= (string-to-number (match-string 2)) (nth 1 (product-version (product-find 'wl-version))))))) '("README" "README.ja")))) ;; copyright notice (luna-define-method test-wl-demo-copyright-notice ((case test-dist)) (require 'wl-demo) (lunit-assert (string-match (format-time-string "%Y" (current-time)) wl-demo-copyright-notice))) wanderlust-wanderlust-769699d/tests/test-elmo-date.el000066400000000000000000000041211406661363500227130ustar00rootroot00000000000000(require 'lunit) (require 'elmo-date) (luna-define-class test-elmo-date (lunit-test-case)) (luna-define-method test-elmo-date-get-week ((case test-elmo-date)) "Check around singularity date. leap year and 2038-01-19." (lunit-assert (string= "Fri" (let ((elmo-lang "en")) (elmo-date-get-week 1582 10 15)))) (lunit-assert (string= "Tue" (let ((elmo-lang "en")) (elmo-date-get-week 2000 2 29)))) (lunit-assert (string= "Tue" (let ((elmo-lang "en")) (elmo-date-get-week 2038 1 19)))) (lunit-assert (string= "Wed" (let ((elmo-lang "en")) (elmo-date-get-week 2038 1 20)))) (lunit-assert (string= "Sun" (let ((elmo-lang "en"))(elmo-date-get-week 2100 2 28)))) (lunit-assert (string= "Mon" (let ((elmo-lang "en"))(elmo-date-get-week 2100 3 1))))) (luna-define-method test-elmo-time-parse-date-string-1 ((case test-elmo-date)) "" (lunit-assert ;; [RFC5322] Appendix A.1.1. (equal '(13429 44762) (elmo-time-parse-date-string "Date: Fri, 21 Nov 1997 09:55:06 -0600"))) (lunit-assert ;; [RFC5322] Appendix A.1.2. (equal '(16129 19413) (elmo-time-parse-date-string "Date: Tue, 1 Jul 2003 10:52:37 +0200"))) ;; (lunit-assert ;; ;; leapsec ;; (elmo-time-parse-date-string ;; "Date: Thu, 1 Jan 2009 08:59:60 +0900")) (lunit-assert ;; [RFC5322] Appendix A.1.3. (equal '(-424 63838) (elmo-time-parse-date-string "Date: Thu, 13 Feb 1969 23:32:54 -0330")))) (luna-define-method test-elmo-time-parse-date-string-2 ((case test-elmo-date)) "Obsolete Date: format" (lunit-assert ;; [RFC5322] Appendix A.5. (equal '(14403 4992) (elmo-time-parse-date-string (concat "Date: Thu,\n" " 13\n" " Feb\n" " 1969\n" " 23:32\n" " -0330 (Newfoundland Time)")))) (lunit-assert ;; [RFC5322] Appendix A.6.2. (equal '(13429 23162) (elmo-time-parse-date-string "Date: 21 Nov 97 09:55:06 GMT"))) (lunit-assert ;; [RFC5322] Appendix A.6.3. (equal '(13428 52452) (elmo-time-parse-date-string "Date : Fri, 21 Nov 1997 09(comment): 55 : 06 -0600")))) wanderlust-wanderlust-769699d/tests/test-elmo-imap4.el000066400000000000000000000022301406661363500230070ustar00rootroot00000000000000(require 'lunit) (require 'elmo-imap4) (luna-define-class test-elmo-imap4 (lunit-test-case)) (luna-define-method test-elmo-imap4-parse-greeting-ok ((case test-elmo-imap4)) (with-temp-buffer (setq case-fold-search nil) (let (elmo-imap4-status) (insert "* OK [CAPABILITY IMAP4 IMAP4rev1 LITERAL+ ID" " LOGINDISABLED AUTH=DIGEST-MD5 AUTH=CRAM-MD5 SASL-IR]" " mail.example.org Cyrus IMAP v2.3.13 server ready\n") (goto-char (point-min)) (lunit-assert '(eq 'nonauth (elmo-imap4-parse-greeting)))))) (luna-define-method test-elmo-imap4-parse-greeting-preauth ((case test-elmo-imap4)) (with-temp-buffer (setq case-fold-search nil) (let (elmo-imap4-status) (insert "* PREAUTH IMAP4rev1 server logged in as Smith\n") (goto-char (point-min)) (lunit-assert '(eq 'auth (elmo-imap4-parse-greeting)))))) (luna-define-method test-elmo-imap4-parse-greeting-bye ((case test-elmo-imap4)) (with-temp-buffer (setq case-fold-search nil) (let (elmo-imap4-status) (insert "* BYE LOGOUT received\n") (goto-char (point-min)) (lunit-assert '(eq 'closed (elmo-imap4-parse-greeting)))))) wanderlust-wanderlust-769699d/tests/test-elmo-localdir.el000066400000000000000000000017151406661363500235750ustar00rootroot00000000000000(require 'lunit) (require 'elmo-localdir) (require 'wl-folder) (luna-define-class test-elmo-localdir (lunit-test-case)) (luna-define-method test-elmo-folder-expand-msgdb-path-1 ((case test-elmo-localdir)) (lunit-assert (string= (elmo-folder-expand-msgdb-path (wl-folder-get-elmo-folder (concat "+" (expand-file-name "~/Mail/inbox")))) (elmo-folder-expand-msgdb-path (wl-folder-get-elmo-folder "+~/Mail/inbox"))))) (luna-define-method test-elmo-folder-expand-msgdb-path-2 ((case test-elmo-localdir)) (lunit-assert (string= (expand-file-name "localdir/inbox" elmo-msgdb-directory) (elmo-folder-expand-msgdb-path (wl-folder-get-elmo-folder "+inbox"))))) (luna-define-method test-elmo-folder-expand-msgdb-path-3 ((case test-elmo-localdir)) (lunit-assert (not (string= (elmo-folder-expand-msgdb-path (wl-folder-get-elmo-folder "+/inbox")) (elmo-folder-expand-msgdb-path (wl-folder-get-elmo-folder "+inbox")))))) wanderlust-wanderlust-769699d/tests/test-elmo-util.el000066400000000000000000000310361406661363500227600ustar00rootroot00000000000000(require 'lunit) (require 'elmo-util) (require 'elmo-passwd) (luna-define-class test-elmo-util (lunit-test-case)) ;; setup & teardown (defvar test-elmo-temoporary-file) (luna-define-method lunit-test-case-setup ((case test-elmo-util)) (setq test-elmo-temoporary-file (make-temp-file temporary-file-directory))) (luna-define-method lunit-test-case-teardown ((case test-elmo-util)) (when (file-exists-p test-elmo-temoporary-file) (delete-file test-elmo-temoporary-file))) (luna-define-method test-elmo-replace-string-as-filename-1 ((case test-elmo-util)) "Revert checking replace and recover." (lunit-assert (let ((str "/foo//./../bar/")) (string= str (elmo-recover-string-from-filename (elmo-replace-string-as-filename str)))))) ;; object save & load (luna-define-method test-elmo-object-save-1 ((case test-elmo-util)) "Check `print-length' let bindings." (let ((list '(1 2 3 4 5 6 7 8 9 10 11 12)) (print-length 1)) (elmo-object-save test-elmo-temoporary-file list) (lunit-assert (equal list (elmo-object-load test-elmo-temoporary-file))))) (luna-define-method test-elmo-object-save-2 ((case test-elmo-util)) "Check `print-level' let bindings." (let ((list '(1 (2 :foo (nil . :bar)))) (print-level 1)) (elmo-object-save test-elmo-temoporary-file list) (lunit-assert (equal list (elmo-object-load test-elmo-temoporary-file))))) (luna-define-method test-elmo-save-string-1 ((case test-elmo-util))) ;; list functions (luna-define-method test-elmo-uniq-list-1 ((case test-elmo-util)) (lunit-assert (eq nil (elmo-uniq-list nil))) (lunit-assert (equal '(1) (elmo-uniq-list '(1)))) (lunit-assert (equal '(1) (elmo-uniq-list '(1 1)))) (lunit-assert (equal '(1) (elmo-uniq-list '(1 1 1))))) (luna-define-method test-elmo-uniq-list-2 ((case test-elmo-util)) (lunit-assert (equal '(1 2 3 4 5 6 nil) (elmo-uniq-list '(1 2 3 4 1 5 6 nil nil 1 1 2)))) (lunit-assert (equal '("foo") (elmo-uniq-list '("foo" "foo"))))) (luna-define-method test-elmo-uniq-list-3 ((case test-elmo-util)) "Check using DELETE-FUNCTION" (lunit-assert (equal '("foo" "foo") (elmo-uniq-list '("foo" "foo") #'delq))) (lunit-assert (equal '(:foo) (elmo-uniq-list '(:foo :foo) #'delq)))) (luna-define-method test-elmo-list-insert-1 ((case test-elmo-util)) (lunit-assert (equal '(1 2 3 4 5) (elmo-list-insert '(1 2 3 5) 4 3))) (lunit-assert (equal '(1 2 3 5 9) (elmo-list-insert '(1 2 3 5) 9 :notfound))) ;;; memq vs. member ;;; (equal '(1 2 "3" 5 4) ;;; (elmo-list-insert '(1 2 "3" 5) 4 "3")) ) (luna-define-method test-elmo-list-insert-2 ((case test-elmo-util)) "Check not copied" (let* ((list1 '(1 2 3 4 5)) (list2 list1)) (elmo-list-insert list1 4 3) (lunit-assert (eq list1 list2)))) ;;; memq vs. member ;;; (equal '(1 2 "3" 5 4) ;;; (elmo-list-insert '(1 2 "3" 5) 4 "3")) (defun test-elmo-same-list-p (list1 list2) (let ((clist1 (copy-sequence list1)) (clist2 (copy-sequence list2))) (while list2 (setq clist1 (delq (car list2) clist1)) (setq list2 (cdr list2))) (while list1 (setq clist2 (delq (car list1) clist2)) (setq list1 (cdr list1))) (equal (list clist1 clist2) '(nil nil)))) (defun test-elmo-same-diff-p (diff1 diff2) (and (test-elmo-same-list-p (car diff1) (car diff2)) (test-elmo-same-list-p (nth 1 diff1) (nth 1 diff2)))) (luna-define-method test-elmo-list-diff ((case test-elmo-util)) (let ((list1 '(1 2 3)) (list2 '(1 2 3 4)) (list3 '(1 2 4)) (list4 '(4 5 6)) (list5 '(3 4 5 6))) (lunit-assert (test-elmo-same-diff-p '(nil nil) (elmo-list-diff nil nil))) (lunit-assert (test-elmo-same-diff-p '(nil (1 2 3)) (elmo-list-diff nil list1))) (lunit-assert (test-elmo-same-diff-p '((1 2 3) nil) (elmo-list-diff list1 nil))) (lunit-assert (test-elmo-same-diff-p '(nil nil) (elmo-list-diff list1 list1))) (lunit-assert (test-elmo-same-diff-p '(nil (4)) (elmo-list-diff list1 list2))) (lunit-assert (test-elmo-same-diff-p '((3) (4)) (elmo-list-diff list1 list3))) (lunit-assert (test-elmo-same-diff-p '((1 2 3) (4 5 6)) (elmo-list-diff list1 list4))) (lunit-assert (test-elmo-same-diff-p '((1 2) (5 6)) (elmo-list-diff list3 list4))) (lunit-assert (test-elmo-same-diff-p '((1 2) (3 5 6)) (elmo-list-diff list3 list5))))) (luna-define-method test-elmo-delete-char-1 ((case test-elmo-util)) (lunit-assert (string= "f" (elmo-delete-char ?o "foo"))) (lunit-assert (string= "f\nf" (elmo-delete-char ?o "foo\nfoo"))) (lunit-assert (string= "" (elmo-delete-char ?o "oo"))) (lunit-assert (string= "" (elmo-delete-char ?o "")))) (luna-define-method test-elmo-concat-path-1 ((case test-elmo-util)) (lunit-assert (string= "/home/foo" (elmo-concat-path "/home" "foo"))) (lunit-assert (string= (elmo-concat-path "/home/" "foo") (elmo-concat-path "/home//" "foo")))) (luna-define-method test-elmo-remove-passwd-1 ((case test-elmo-util)) "Check shred password." (let* ((elmo-passwd-storage-type 'alist) elmo-passwd-storage (storage (elmo-passwd-storage)) (key '("AAA" "test" "PLAIN" "example.com" 30)) (password "cGFzc3dk")) (elmo-passwd-alist-set-alist-internal storage (list (cons (elmo-passwd-alist-generate-key storage key) password))) (elmo-remove-passwd key) (lunit-assert (string= "\0\0\0\0\0\0\0\0" password)))) (luna-define-method test-elmo-remove-passwd-2 ((case test-elmo-util)) "Check remove target pair only. Not rassoc." (let* ((elmo-passwd-storage-type 'alist) elmo-passwd-storage (storage (elmo-passwd-storage)) (keys '((nil "AAA" "test1" "PLAIN" "example.com" 30) ("KEY2" "BBB" "test2" "PLAIN" "example.com" 30) ("KEY3" "CCC" "test3" "PLAIN" "example.com" 30) ("KEY4" "DDD" "test4" "PLAIN" "example.com" 30)))) (elmo-passwd-alist-set-alist-internal storage (mapcar (lambda (elt) (cons (elmo-passwd-alist-generate-key storage (cdr elt)) (or (car elt) (elmo-passwd-alist-generate-key storage (cdr (cadr keys)))))) keys)) (elmo-remove-passwd (cdr (cadr keys))) (lunit-assert (equal (mapcar (lambda (elt) (cons (elmo-passwd-alist-generate-key storage (cdr elt)) (or (car elt) (elmo-passwd-alist-generate-key storage (cdr (cadr keys)))))) (cons (car keys) (cddr keys))) (elmo-passwd-alist-alist-internal storage))))) (luna-define-method test-elmo-remove-passwd-3 ((case test-elmo-util)) "Multiple same key." (let* ((elmo-passwd-storage-type 'alist) elmo-passwd-storage (storage (elmo-passwd-storage)) (keys '(("KEY1" "AAA" "test1" "PLAIN" "example.com" 30) ("KEY2" "BBB" "test2" "PLAIN" "example.com" 30) ("KEY3" "BBB" "test2" "PLAIN" "example.com" 30) ("KEY4" "CCC" "test3" "PLAIN" "example.com" 30)))) (elmo-passwd-alist-set-alist-internal storage (mapcar (lambda (elt) (cons (elmo-passwd-alist-generate-key storage (cdr elt)) (car elt))) keys)) (elmo-remove-passwd (cdr (cadr keys))) (lunit-assert (equal (mapcar (lambda (elt) (cons (elmo-passwd-alist-generate-key storage (cdr elt)) (or (car elt) (elmo-passwd-alist-generate-key storage (cdr (cadr keys)))))) (list (car keys) (nth 3 keys))) (elmo-passwd-alist-alist-internal storage))))) (luna-define-method test-elmo-passwd-alist-clear-1 ((case test-elmo-util)) "Check shred ALL password." (let* ((elmo-passwd-storage-type 'alist) elmo-passwd-storage (storage (elmo-passwd-storage)) (password1 "cGFzc3dk") (password2 (copy-sequence password1)) (key1 '("AAA" "test1" "PLAIN" "example.com" 30)) (key2 '("BBB" "test2" "PLAIN" "example.com" 30)) (elmo-passwd-alist (list (cons "key1" password1) (cons "key2" password2)))) (elmo-passwd-alist-set-alist-internal storage (list (cons (elmo-passwd-alist-generate-key storage key1) password1) (cons (elmo-passwd-alist-generate-key storage key2) password2))) (elmo-passwd-alist-clear) (lunit-assert (string= "\0\0\0\0\0\0\0\0" password1)) (lunit-assert (string= "\0\0\0\0\0\0\0\0" password2)))) (luna-define-method test-elmo-address-quote-specials-1 ((case test-elmo-util)) "" (lunit-assert (string= "\"dot.atom.text\"" (elmo-address-quote-specials "dot.atom.text"))) (lunit-assert (string= "\"...\"" (elmo-address-quote-specials "...")))) (luna-define-method test-elmo-address-quote-specials-2 ((case test-elmo-util)) "" (lunit-assert (string= "atext!#$%&'*+-/=?^_`{|}~" (elmo-address-quote-specials "atext!#$%&'*+-/=?^_`{|}~")))) (luna-define-method test-elmo-elmo-flatten-1 ((case test-elmo-util)) "" (lunit-assert (equal '(1 2 3 4 5) (elmo-flatten '(1 2 (3 4 5)))))) (luna-define-method test-elmo-number-set-member-1 ((case test-elmo-util)) "Check edge." (lunit-assert (equal '((1 . 99)) (elmo-number-set-member 1 '((1 . 99))))) (lunit-assert (equal '((1 . 99)) (elmo-number-set-member 99 '((1 . 99)))))) (luna-define-method test-elmo-number-set-member-2 ((case test-elmo-util)) "Check edge." (lunit-assert (null (elmo-number-set-member 0 '((1 . 99))))) (lunit-assert (null (elmo-number-set-member 100 '((1 . 99)))))) (luna-define-method test-elmo-number-set-append-list-1 ((case test-elmo-util)) "Simple testcase." (lunit-assert (equal '((1 . 100)) (elmo-number-set-append-list '((1 . 99)) '(100))))) (luna-define-method test-elmo-number-set-append-1 ((case test-elmo-util)) "Simple testcase." (lunit-assert (equal '((1 . 100)) (elmo-number-set-append '((1 . 99)) 100)))) (luna-define-method test-elmo-number-set-delete-1 ((case test-elmo-util)) "Check edge." (lunit-assert (equal '(2 3) (elmo-number-set-delete '(1 2 3) 1)))) (luna-define-method test-elmo-number-set-delete-2 ((case test-elmo-util)) "Normal case." (lunit-assert (equal '(1 3) (elmo-number-set-delete '(1 2 3) 2)))) (luna-define-method test-elmo-number-set-delete-3 ((case test-elmo-util)) "Check edge." (lunit-assert (equal '(1 2) (elmo-number-set-delete '(1 2 3) 3)))) (luna-define-method test-elmo-number-set-delete-4 ((case test-elmo-util)) "Check edge." (lunit-assert (equal '((2 . 100)) (elmo-number-set-delete '((1 . 100)) 1)))) (luna-define-method test-elmo-number-set-delete-5 ((case test-elmo-util)) "Check edge." (lunit-assert (equal '(1 (3 . 100)) (elmo-number-set-delete '((1 . 100)) 2)))) (luna-define-method test-elmo-number-set-delete-6 ((case test-elmo-util)) "Normal case." (lunit-assert (equal '((1 . 49) (51 . 100)) (elmo-number-set-delete '((1 . 100)) 50)))) (luna-define-method test-elmo-number-set-delete-7 ((case test-elmo-util)) "Check edge." (lunit-assert (equal '((1 . 98) 100) (elmo-number-set-delete '((1 . 100)) 99)))) (luna-define-method test-elmo-number-set-delete-8 ((case test-elmo-util)) "Check edge." (lunit-assert (equal '((1 . 99)) (elmo-number-set-delete '((1 . 100)) 100)))) (luna-define-method test-elmo-number-set-delete-list-1 ((case test-elmo-util)) "Simple testcase." (lunit-assert (equal '((1 . 99)) (elmo-number-set-delete-list '((1 . 100)) '(100))))) (luna-define-method test-elmo-number-set-to-number-list-1 ((case test-elmo-util)) "Simple testcase." (lunit-assert (equal '(1 2 3 4 5 6 7 8 9) (elmo-number-set-to-number-list '((1 . 9))))) (lunit-assert (equal '(1) (elmo-number-set-to-number-list '(1))))) (luna-define-method test-elmo-number-list-to-number-set-1 ((case test-elmo-util)) "Simple testcase." (lunit-assert (equal '((1 . 9)) (elmo-number-list-to-number-set '(1 2 3 4 5 6 7 8 9)))) (lunit-assert (equal '(1) (elmo-number-list-to-number-set '(1))))) (luna-define-method test-elmo-delete-cr-1 ((case test-elmo-util)) (lunit-assert (string= "" (elmo-delete-cr ""))) (lunit-assert (string= "\n" (elmo-delete-cr "\r\n"))) (lunit-assert (string= "\n\n" (elmo-delete-cr "\r\n\n"))) (lunit-assert (string= "\n\n" (elmo-delete-cr "\r\n\r\n")))) (luna-define-method test-elmo-get-message-id-from-field ((case test-elmo-util)) (let ((fixtures '((:header "" :expected "") (:header "\n" :expected "") (:header "(Comment) (Comment)" :expected "") (:header "INVALID" :expected nil)))) (dolist (elmo-always-prefer-std11-parser '(nil t)) (dolist (fixture fixtures) (lunit-assert (equal (plist-get fixture :expected) (elmo-get-message-id-from-field (plist-get fixture :header)))))))) wanderlust-wanderlust-769699d/tests/test-rfc2368.el000066400000000000000000000031601406661363500221430ustar00rootroot00000000000000(require 'lunit) (require 'rfc2368) (luna-define-class test-rfc2368 (lunit-test-case)) (luna-define-method test-rfc2368-parse-mailto-url-1 ((case test-rfc2368)) "To field only." (lunit-assert (equal '(("To" . "chris@example.com")) (rfc2368-parse-mailto-url "mailto:chris@example.com")))) (luna-define-method test-rfc2368-parse-mailto-url-2 ((case test-rfc2368)) "RFC2368 example in 2. Syntax of a mailto URL " (lunit-assert (equal (rfc2368-parse-mailto-url "mailto:addr1%2C%20addr2") (rfc2368-parse-mailto-url "mailto:?to=addr1%2C%20addr2"))) (lunit-assert (equal (rfc2368-parse-mailto-url "mailto:?to=addr1%2C%20addr2") (rfc2368-parse-mailto-url "mailto:addr1?to=addr2")))) (luna-define-method test-rfc2368-parse-mailto-url-3 ((case test-rfc2368)) "With Subject field." (lunit-assert (equal '(("To" . "infobot@example.com") ("Subject" . "current-issue")) (rfc2368-parse-mailto-url "mailto:infobot@example.com?subject=current-issue")))) (luna-define-method test-rfc2368-parse-mailto-url-4 ((case test-rfc2368)) "Space in Subject field." (lunit-assert (equal '(("To" . "infobot@example.com") ("Body" . "send current-issue")) (rfc2368-parse-mailto-url "mailto:infobot@example.com?body=send%20current-issue")))) (luna-define-method test-rfc2368-parse-mailto-url-5 ((case test-rfc2368)) "CRLF in body." (lunit-assert (equal '(("To" . "infobot@example.com") ("Body" . "send current-issue\nsend index")) (rfc2368-parse-mailto-url (concat "mailto:infobot@example.com?body=send%20current-\n" "issue%0D%0Asend%20index"))))) wanderlust-wanderlust-769699d/tests/test-utf7.el000066400000000000000000000054271406661363500217430ustar00rootroot00000000000000(require 'lunit) (require 'utf7) (luna-define-class test-utf7 (lunit-test-case)) (luna-define-method test-utf7-encode-string-nihongo ((case test-utf7)) (lunit-assert (string= "+ZeVnLIqe-A" (utf7-encode (string (make-char 'japanese-jisx0208 70 124) (make-char 'japanese-jisx0208 75 92) (make-char 'japanese-jisx0208 56 108) ?A))))) (luna-define-method test-utf7-encode-string-smiling-face ((case test-utf7)) (lunit-assert (string= "Hi Mom -+Jjo--!" (utf7-encode (concat "Hi Mom -" (string (make-char 'mule-unicode-2500-33ff 35 58)) "-!"))))) (luna-define-method test-utf7-encode-string-alpha ((case test-utf7)) (lunit-assert (string= "A+ImIDkQ-." (utf7-encode (concat "A" (string (make-char 'mule-unicode-0100-24ff 121 34) (make-char 'mule-unicode-0100-24ff 38 113)) "."))))) (luna-define-method test-utf7-encode-string-plus ((case test-utf7)) (lunit-assert (string= "+-" (utf7-encode "+")))) (luna-define-method test-utf7-encode-string-noconv ((case test-utf7)) (lunit-assert (string= "" (utf7-encode ""))) (lunit-assert (string= "a" (utf7-encode "a"))) (lunit-assert (string= "-" (utf7-encode "-"))) (lunit-assert (string= "=" (utf7-encode "=")))) (luna-define-method test-utf7-decode-string-nihongo ((case test-utf7)) (lunit-assert (string= (string (make-char 'japanese-jisx0208 70 124) (make-char 'japanese-jisx0208 75 92) (make-char 'japanese-jisx0208 56 108)) (utf7-decode "+ZeVnLIqe-")))) (luna-define-method test-utf7-decode-string-smiling-face ((case test-utf7)) (lunit-assert (string= (concat "Hi Mom -" (string (make-char 'mule-unicode-2500-33ff 35 58)) "-!") (utf7-decode "Hi Mom -+Jjo--!")))) (luna-define-method test-utf7-decode-string-alpha ((case test-utf7)) (lunit-assert (string= (concat "A" (string (make-char 'mule-unicode-0100-24ff 121 34) (make-char 'mule-unicode-0100-24ff 38 113)) ".") (utf7-decode "A+ImIDkQ."))) ; omit `-' ;; (lunit-assert (string= (concat "A" (string (make-char 'mule-unicode-0100-24ff 121 34) (make-char 'mule-unicode-0100-24ff 38 113)) ".") (utf7-decode "A+ImIDkQ-.")))) (luna-define-method test-utf7-decode-string-plus ((case test-utf7)) (lunit-assert (string= "+" (utf7-decode "+-"))) (lunit-assert (string= "++" (utf7-decode "+-+-"))) (lunit-assert (string= "+++" (utf7-decode "+-+-+-"))) (lunit-assert (string= "++++" (utf7-decode "+-+-+-+-")))) (luna-define-method test-utf7-decode-string-noconv ((case test-utf7)) (lunit-assert (string= "" (utf7-decode ""))) (lunit-assert (string= "a" (utf7-decode "a"))) (lunit-assert (string= "-" (utf7-decode "-"))) (lunit-assert (string= "=" (utf7-encode "=")))) wanderlust-wanderlust-769699d/tests/test-wl-address.el000066400000000000000000000010721406661363500231130ustar00rootroot00000000000000;; -*- lexical-binding: t -*- (require 'lunit) (require 'wl-address) (luna-define-class test-wl-address (lunit-test-case)) (luna-define-method test-wl-address-header-extract-address-1 ((case test-wl-address)) (lunit-assert (string= "m-sakura@example.org" (wl-address-header-extract-address "Mine Sakurai ")))) (luna-define-method test-wl-address-header-extract-address-2 ((case test-wl-address)) (lunit-assert (string= "m-sakura@example.org" (wl-address-header-extract-address "m-sakura@example.org (Mine Sakurai)")))) wanderlust-wanderlust-769699d/tests/test-wl-draft.el000066400000000000000000000062631406661363500225750ustar00rootroot00000000000000(require 'lunit) (require 'wl-draft) (luna-define-class test-wl-draft (lunit-test-case)) (luna-define-method test-wl-draft-deduce-address-list-1 ((case test-wl-draft)) (lunit-assert (equal '("foo@example.com" "bar@example.com") (with-temp-buffer (insert "To: foo@example.com, bar@example.com ") (wl-draft-deduce-address-list (current-buffer) (point-min) (point-max)))))) (luna-define-method test-wl-draft-deduce-address-list-2 ((case test-wl-draft)) (lunit-assert (equal '("foo@example.com" "bar@example.com") (with-temp-buffer (insert "To: foo@example.com Cc: bar@example.com ") (wl-draft-deduce-address-list (current-buffer) (point-min) (point-max)))))) ;; RFC 2822 A.1.2. Different types of mailboxes (luna-define-method test-wl-draft-deduce-address-list-rfc2822-example-1 ((case test-wl-draft)) (lunit-assert (equal '("mary@x.test" "jdoe@example.org" "one@y.test" "boss@nil.test" "sysservices@example.net") (with-temp-buffer (insert "From: \"Joe Q. Public\" To: Mary Smith , jdoe@example.org, Who? Cc: , \"Giant; \\\"Big\\\" Box\" Date: Tue, 1 Jul 2003 10:52:37 +0200 Message-ID: <5678.21-Nov-1997@example.com> ") (wl-draft-deduce-address-list (current-buffer) (point-min) (point-max)))))) ;; RFC 2822 A.1.3. Group addresses (luna-define-method test-wl-draft-deduce-address-list-rfc2822-example-2 ((case test-wl-draft)) (lunit-assert (equal '("c@a.test" "joe@where.test" "jdoe@one.test") (with-temp-buffer (insert "From: Pete To: A Group:Chris Jones ,joe@where.test,John ; Cc: Undisclosed recipients:; Date: Thu, 13 Feb 1969 23:32:54 -0330 Message-ID: ") (wl-draft-deduce-address-list (current-buffer) (point-min) (point-max)))))) ;; RFC 2822 A.3. Resent messages (luna-define-method test-wl-draft-deduce-address-list-rfc2822-example-3 ((case test-wl-draft)) (lunit-assert (equal '("j-brown@other.example") (with-temp-buffer (insert "Resent-From: Mary Smith Resent-To: Jane Brown Resent-Date: Mon, 24 Nov 1997 14:22:01 -0800 Resent-Message-ID: <78910@example.net> From: John Doe To: Mary Smith Subject: Saying Hello Date: Fri, 21 Nov 1997 09:55:06 -0600 Message-ID: <1234@local.machine.example> ") (wl-draft-deduce-address-list (current-buffer) (point-min) (point-max)))))) ;; obs-phrase (luna-define-method test-wl-draft-deduce-address-list-rfc2822-obs-1 ((case test-wl-draft)) (lunit-assert (equal '("foo@example.com") (with-temp-buffer (insert "To: foo.bar ") (wl-draft-deduce-address-list (current-buffer) (point-min) (point-max)))))) ;; multiple occurrences of destination address fields (luna-define-method test-wl-draft-deduce-address-list-rfc2822-obs-2 ((case test-wl-draft)) (lunit-assert (equal '("foo@example.com" "bar@example.com") (with-temp-buffer (insert "To: foo@example.com To: bar@example.com ") (wl-draft-deduce-address-list (current-buffer) (point-min) (point-max)))))) wanderlust-wanderlust-769699d/tests/test-wl-util.el000066400000000000000000000016011406661363500224410ustar00rootroot00000000000000(require 'lunit) (require 'wl-util) (luna-define-class test-wl-util (lunit-test-case)) (luna-define-method test-wl-parse-addresses-1 ((case test-wl-util)) (lunit-assert (equal '("foo@example.com" "bar@example.com") (wl-parse-addresses "foo@example.com, bar@example.com")))) ;; Message-ID (luna-define-method test-wl-unique-id ((case test-wl-util)) (lunit-assert (not (string= (wl-unique-id) (progn (sleep-for 1) (wl-unique-id)))))) (luna-define-method test-wl-unique-id-by-user ((case test-wl-util)) (lunit-assert (let (user-login-name) (not (string= (progn (setq user-login-name "_alice") (wl-unique-id)) (progn (setq user-login-name "_bob") (wl-unique-id))))))) (luna-define-method test-wl-inverse-alist ((case test-wl-util)) (lunit-assert (equal '((cc c) (aa a)) (wl-inverse-alist '(a c) '((a . aa) (a . bb) (c . cc)))))) wanderlust-wanderlust-769699d/utils/000077500000000000000000000000001406661363500175455ustar00rootroot00000000000000wanderlust-wanderlust-769699d/utils/ChangeLog.1000066400000000000000000000254631406661363500214700ustar00rootroot000000000000002020-07-16 Kazuhiro Ito * ptexinfmt.el: Assume Emacs 24.5 or later. Support @U. Add workaround for @headitem by defining alias to @item. 2020-06-18 Kazuhiro Ito * wl-addrbook.el (wl-address-extract-user, wl-addrbook-strsafe): Use elmo-replace-char-in-string. 2020-06-17 Kazuhiro Ito Obsolete elmo-replace-in-string. Use replace-regexp-in-string. * wl-addrbook.el (wl-address-extract-user, wl-addrbook-strsafe): Likewise. 2020-06-02 Kazuhiro Ito Use lexical binding. * ssl.el: Likewise. * wl-addrbook.el: Likewise. * wl-complete.el: Likewise. * wl-mailto.el: Likewise. 2020-05-30 Kazuhiro Ito Adapt to recent changes. * wl-addrbook.el: Use elmo-set-work-buf instead of wl-set-work-buf. Use match-string-no-properties instead of elmo-match-buffer. Use elmo-parse-addresses instead of wl--parse-addresses. (wl-draft-learn-alias): Remove "'" from lambda expression. * wl-complete.el (wl-draft-on-value-p): Use match-string-no-properties instead of elmo-match-buffer. * wl-mailto.el (wl-mailto-compose-message-from-mailto-url): Use elmo-assoc-ignore-case instead of assoc-ignore-case. Emacs does not have assoc-ignore-case. 2020-05-29 Kazuhiro Ito * bbdb-wl.el: Removed. * ssl.el: Remove cl dependencies. Assume Emacs 24 or later. 2020-05-24 Kazuhiro Ito * rfc2368.el: Romoved. 2018-05-26 Kazuhiro Ito * ssl.el (ssl-program-arguments): Fix docstring. 2018-03-12 Kazuhiro Ito * ssl.el (open-ssl-stream): Use set-process-query-on-exit-flag function if available (Cf. [wl-en:6542]). 2017-12-11 Kazuhiro Ito * wl-addrbook.el (wl-addrbook-insert-file) (wl-addrbook-make-alist, wl-summary-addrbook-add): Use match-string and elmo-match-buffer instead of wl-match-string and wl-match-buffer. * wl-complete.el (wl-draft-on-value-p): Likewise. 2014-11-15 Kazuhiro Ito Remove '1' argument for forward-char, backward-char and forward-line. Use following-char and preceding-char preferredly. * wl-addrbook.el (wl-addrbook-insert-file): Likewise. * wl-complete.el (wl-delete-backward-char, wl-delete-value): Likewise. 2012-04-12 Katsumi Yamaoka * ptexinfmt.el (texinfo-format-syntax-table): Modify character syntax of " and \ to w, as a workaround. (texinfo-format-comma): Support @comma. (texinfo-format-parse-args): Tweak it so as to work for @comma. 2011-04-20 TAKAHASHI Kaoru * ptexinfmt.el: Fix description comment style. 2011-04-13 TAKAHASHI Kaoru * ptexinfmt.el: Use lexical binding. (ptexinfmt-broken-facility): Rename _dummy argument. (texinfo-enclosure-list, texinfo-alias-list): Add defvar stub for lexical binding. 2010-09-02 TAKAHASHI Kaoru * ptexinfmt.el (texinfo-multitable-widths): Use `make-char' instead of KANJI literal. 2010-08-31 TAKAHASHI Kaoru * wl-addrbook.el: Delete traing whitespace. * wl-complete.el: Ditto. * rfc2368.el: Ditto. * ssl.el: Ditto. 2010-08-24 TAKAHASHI Kaoru * ptexinfmt.el (texinfo-format-verb): Use (delete-char -1) instead of (delete-backward-char 1); For Emacs24. * wl-addrbook.el (wl-addrbook-insert-file): Use (delete-char -1) instead of (delete-backward-char 1) or (backward-deletechar 1). 2010-08-04 David Maus * ssl.el (open-ssl-stream, condition-case): Don't use old-style backquotes. 2010-01-06 TAKAHASHI Kaoru * wl-addrbook.el (wl-summary-addrbook-add): Use `with-current-buffer' instead of `save-excursion' & `set-buffer'. 2008-04-22 TAKAHASHI Kaoru * ptexinfmt.el: Fix Comments. (texinfo-format-geq, texinfo-format-leq,): Support @geq and @leq. 2008-02-19 TAKAHASHI Kaoru * bbdb-wl.el: Add (eval-when-compile (require 'static)). 2008-02-14 TAKAHASHI Kaoru * wl-mailto.el: Use `string-to-number' instead of `string-to-int'. 2008-02-11 TAKAHASHI Kaoru * wl-addrbook.el (wl-addrbook-hashtb): Use quote instead of backquote. (wl-alias-next, wl-alias-get): New backquote style. 2007-11-10 Katsumi Yamaoka * ptexinfmt.el (texinfo-copying-text, texinfo-copying) (texinfo-insertcopying, texinfo-format-scan): Move from infohack.el. 2007-11-09 Katsumi Yamaoka * ptexinfmt.el (ptexinfmt-broken-facility, ptexinfmt-defun-if-broken) (ptexinfmt-defun-if-void, ptexinfmt-defvar-if-void): Don't use old-style backquotes. (texinfo-format-cedilla-accent): Quote `,'. 2007-11-09 TAKAHASHI Kaoru * ptexinfmt.el: Fix comment. 2007-09-21 TAKAHASHI Kaoru * ptexinfmt.el: Support @fonttextsize, @textdegree. 2005-09-02 TAKAHASHI Kaoru * ptexinfmt.el: Support @frenchspacing, @euro, @sansserif. (texinfo-format-ordf): Fix typo. 2005-08-08 Hiroya Murata * wl-addrbook.el (wl-addrbook-setup): Set `wl-summary-get-petname-function' instead of `wl-summary-from-function'. 2005-08-05 Hiroya Murata * wl-addrbook.el (wl-addrbook-get-names): Abolish. (wl-summary-addrbook-from): Ditto. (wl-addrbook-get-nickname): New function. 2005-02-24 Katsumi Yamaoka * ptexinfmt.el (texinfo-multitable-widths): Reverse the logic that shows whether it is broken. 2004-12-12 Yuuichi Teranishi * rfc2368.el (rfc2368-unhexify-string): Rewrite (%0D%0A -> \n). (rfc2368-parse-mailto-url): Remove newline. 2004-12-12 Hiroya Murata * rfc2368.el (rfc2368-unhexify-string): Treat `A' - `F' and not use `{2}' for compatibility with emacs20.7. 2004-08-02 TAKAHASHI Kaoru * ptexinfmt.el (slanted): Rename @s to @slanted. 2004-07-20 TAKAHASHI Kaoru * ptexinfmt.el: Support @s. 2004-05-22 Hiroya Murata * bbdb-wl.el (bbdb-wl-get-addresses-1): Use set-buffer-multibyte instead of elmo-set-buffer-multibyte. (bbdb-wl-get-addresses-2): Ditto. (bbdb-wl-update-records): Ditto. (bbdb-extract-field-value): Ditto. 2004-05-08 Yoichi NAKAYAMA * rfc2368.el: Sync with cvs version of emacs. (rfc2368-unhexify-string): Don't use replace-regexp-in-string. (rfc2368-parse-mailto-url): Unhexify prequery, change concat order. 2004-04-12 TAKAHASHI Kaoru * ptexinfmt.el: Support @indicateurl, @LaTeX, @ordf, @ordm. @url is now a synonym for @uref. 2004-02-11 TAKAHASHI Kaoru * ptexinfmt.el: Support @docbook, @ifdocbook, @ifnotdocbook, and @registeredsymbol. 2004-01-18 Yoichi NAKAYAMA * ssl.el (toplevel): Don't include cl at run time. (ref. Emacs Lisp Coding Conventions section in elisp-info) 2003-10-15 Yuuichi Teranishi * im-wl.el (wl-draft-send-with-imput-async): Follow the changes in draft (Not tested). 2003-09-23 Hiroya Murata * wl-addrbook.el (wl-summary-addrbook-from): Use elmo-message-entity-field. 2003-07-01 TAKAHASHI Kaoru * ptexinfmt.el: @verb, @tie, @/ support. (ptexinfmt-broken-facility): Abolish NO-NOTICE argument. Use `ptexinfmt-disable-broken-notice-flag' instead. 2002-12-03 Katsumi Yamaoka * ptexinfmt.el: Modify it not to use APEL functions. 2002-10-10 KOBAYASHI Shinji * bbdb-wl.el (bbdb-wl-get-addresses-1): Call `bbdb-wl-canonicalize-full-name-function' after decoding full-name string. (bbdb-wl-get-addresses-2): Ditto. 2002-09-05 TAKAHASHI Kaoru * ptexinfmt.el: discard @documentdescription. Support @ifplaintext, @ifnotplaintext, @ifhtml. Remove obsolete commands. (texinfo-format-ifhtml, texinfo-format-ifplaintext): New function. 2002-06-03 KOBAYASHI Shinji * bbdb-wl.el (bbdb-wl-canonicalize-spaces-and-dots): Remove the preceding spaces. 2002-06-03 TAKAHASHI Kaoru * ptexinfmt.el: discard @cartouche. @anchor discard for Mule 2.3. Support @., @:, @-. (texinfo-format-inforef): New function. 2002-05-30 Yuuichi Teranishi * bbdb-wl.el (bbdb-wl-canonicalize-full-name-function): New variable. (bbdb-wl-canonicalize-spaces-and-dots): New function. (bbdb-wl-get-addresses-1): Use bbdb-wl-canonicalize-full-name-function. (bbdb-wl-get-addresses-2): Ditto. 2002-05-20 Yoichi NAKAYAMA * im-wl.el: wl-draft-send-func -> wl-draft-send-function in the example settings. 2002-04-28 TAKAHASHI Kaoru * bbdb-wl.el (bbdb-wl-setup): Add `bbdb-offer-save' to `wl-save-hook'. Use `bbdb-initialize' instead of require bbdb-autoloads. 2002-01-28 Hiroya Murata * bbdb-wl.el (bbdb-wl-get-addresses-2): Bind unbound local variable. 2002-01-28 Yuuichi Teranishi * bbdb-wl.el (bbdb-wl-get-addresses-1): New function. (bbdb-wl-get-addresses-2): Ditto. (bbdb-wl-get-addresses): Select bbdb-wl-get-addresses-1 or bbdb-wl-get-addresses-2 according to the bbdb-version. (bbdb-wl-address-headers-spec): New function. (bbdb-wl-show-all-recipients): Use it. (bbdb-wl-show-sender): Ditto. (bbdb-wl-setup): Include defvars for bbdb-get-addresses-headers. 2002-01-17 Kenichi OKADA * im-wl.el (wl-draft-send-with-imput-async): Use `wl-message-id-function'. 2002-01-07 Hiroya Murata * bbdb-wl.el (bbdb-wl-ignore-folder-regexp): New variable. (bbdb-wl-get-update-record): Changed to check `bbdb-wl-ignore-folder-regexp'. 2002-01-07 Kenichi OKADA * wl-mailto.el (wl-mailto-url-at-point): defun at compile time. 2001-12-12 Yuuichi Teranishi * bbdb-wl.el (bbdb-wl-setup): Added autoload magic. 2001-12-12 TAKAHASHI Kaoru * bbdb-wl.el (bbdb-wl-setup): require bbdb-autoloads if exists. Use `load' instead of `require' bbdb-autoloads for BBDB 2.20. 2001-10-06 Hiroya Murata * bbdb-wl.el (bbdb-wl-get-petname): Fixed docstring. (bbdb-wl-from-func): Ditto. 2001-09-14 Katsumi Yamaoka * bbdb-wl.el (bbdb-wl-extract-field-value-internal): Enclose the function definition with `eval-and-compile'. (bbdb-wl-pop-up-bbdb-buffer): Use `bbdb-display-layout' and `bbdb-pop-up-display-layout' instead of the macro `bbdb-pop-up-elided-display' for the development version of BBDB. (bbdb-get-addresses-headers): Define it before it is referred to. 2001-09-11 Yuuichi Teranishi * bbdb-wl.el (bbdb-wl-exit): Use `bbdb-offer-save' instead of `bbdb-save-db'. wanderlust-wanderlust-769699d/utils/im-wl.el000066400000000000000000000154521406661363500211230ustar00rootroot00000000000000;;; im-wl.el -- IM/Nifty4U+ interface for Wanderlust. (not completed.) ;; Copyright (C) 1998,1999 OKUNISHI Fujikazu ;; Copyright (C) 1998,1999 Yuuichi Teranishi ;; Author: OKUNISHI Fujikazu ;; Yuuichi Teranishi ;; Keywords: mail, news, Wanderlust, IM, Nifty4U+ ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; General settings: ;; (autoload 'wl-draft-send-with-imput-async "im-wl") ;; (setq wl-draft-send-function 'wl-draft-send-with-imput-async) ;; ;; for Nifty4U+ users: ;; (add-hook 'wl-mail-setup-hook '(lambda () (require 'im-wl))) ;; (setq wl-draft-config-alist ;; '(("^Newsgroups: nifty\\..*" ;; ;; to avoid header-encoding. ;; ;; [cf. slrn-ja-0.9.4.6.jp4/doc/README.macros.euc] ;; ;(eword-field-encoding-method-alist . '((t . iso-2022-jp-2))) ;; (wl-draft-send-function . 'wl-draft-send-with-imput-async) ;; (im-wl-dispatcher . '("~/nifty4u-plus/inews-nifty4u" "-h")) ;; (im-wl-dispatcher-error-msg ;; . (format "^%s :" (expand-file-name (car im-wl-dispatcher))))))) ;;; Code: ;;;(require 'emu) ;;; Variables: (defvar im-wl-dispatcher '("imput" "-h" "-watch" "--debug=no" "-verbose" "--Queuing=yes") "Program to post an article and its arguments. This is most commonly `imput(impost)' or `inews-nifty4u'.") (defvar im-wl-dispatcher-error-msg (format "^%s: ERROR:" (car im-wl-dispatcher)) "Error message of dispatcher.") (defvar im-wl-default-temp-file-name "~/.imput-temp" "Default temporary file name (for async).") ;; xxx for Emacs18/19.x (or (boundp 'shell-command-switch) (defvar shell-command-switch "-c")) ;; Buffer local variables (For async). (defvar im-wl-buffer-editing-buffer nil) (defvar im-wl-buffer-sending-buffer nil) (defvar im-wl-buffer-kill-when-done nil) (make-variable-buffer-local 'im-wl-buffer-editing-buffer) (make-variable-buffer-local 'im-wl-buffer-sending-buffer) (make-variable-buffer-local 'im-wl-buffer-kill-when-done) ;;;###autoload (defun wl-draft-send-with-imput-async (editing-buffer kill-when-done) "Send the message in the current buffer with imput asynchronously." (let (buffer-process process-connection-type watch-buffer (sending-buffer (current-buffer)) (error-msg-regexp im-wl-dispatcher-error-msg) (number wl-draft-buffer-message-number) msg) (with-current-buffer editing-buffer (if (elmo-message-file-p (wl-folder-get-elmo-folder wl-draft-folder) number) (setq msg (elmo-message-file-name (wl-folder-get-elmo-folder wl-draft-folder) number)) (with-temp-file (setq msg (make-temp-file "im-wl")) (elmo-message-fetch (wl-folder-get-elmo-folder wl-draft-folder) number (elmo-make-fetch-strategy 'entire) nil (current-buffer))))) ;; current buffer is raw buffer. (save-excursion (goto-char (point-max)) ;; require one newline at the end. (or (= (preceding-char) ?\n) (insert ?\n)) ;; Change header-delimiter to be what imput expects. (let (delimline (case-fold-search t)) (save-restriction (std11-narrow-to-header mail-header-separator) ;; Insert Message-ID: 'cause wl-do-fcc() does not take care.. (goto-char (point-min)) (when (and wl-insert-message-id (not (re-search-forward "^Message-ID[ \t]*:" nil t))) (insert (concat "Message-ID: " (funcall wl-message-id-function) "\n"))) ;; Insert date field. (goto-char (point-min)) (or (re-search-forward "^Date[ \t]*:" nil t) (wl-draft-insert-date-field))) (run-hooks 'wl-mail-send-pre-hook) ;; X-PGP-Sig, Cancel-Lock (goto-char (point-min)) (re-search-forward (concat "^" (regexp-quote mail-header-separator) "\n") nil t) (replace-match "\n") (forward-char -1) (setq delimline (point-marker)) ;; ignore any blank lines in the header (goto-char (point-min)) (while (and (re-search-forward "\n\n\n*" delimline t) (< (point) delimline)) (replace-match "\n")) ;; Find and handle any FCC fields. ;; 'cause imput can NOT handle `Fcc: %IMAP'. (goto-char (point-min)) (if (re-search-forward "^FCC:" delimline t) (wl-draft-do-fcc delimline)))) (set-buffer-modified-p t) (as-binary-output-file (write-region (point-min)(point-max) msg nil t)) ;; The local variables must be binded to 'watch-buffer. (set-buffer (setq watch-buffer (generate-new-buffer " *Wl Watch*"))) (setq im-wl-buffer-sending-buffer sending-buffer) (setq im-wl-buffer-editing-buffer editing-buffer) (setq im-wl-buffer-kill-when-done kill-when-done) (setq im-wl-dispatcher-error-msg error-msg-regexp) ;; Variables specified in wl-draft-config-alist are buffer-local, so ;; we have to run subprocess under the editing-buffer. ;; The filter function can find 'watch-buffer by process-buffer(). (set-buffer sending-buffer) (setq buffer-process ;; start-process-shell-command() is Emacs19/20's function. (start-process "DISPATCHER" watch-buffer shell-file-name shell-command-switch (format "%s < %s" (mapconcat 'identity im-wl-dispatcher " ") msg))) (set-process-sentinel buffer-process 'im-wl-watch-process-async) (message "Sending a message in background") (if kill-when-done (wl-draft-hide editing-buffer)))) (defun im-wl-watch-process-async (process event) (let ((process-buffer (process-buffer process)) editing-buffer kill-when-done raw-buffer) (set-buffer process-buffer) (setq editing-buffer im-wl-buffer-editing-buffer) (setq kill-when-done im-wl-buffer-kill-when-done) (setq raw-buffer im-wl-buffer-sending-buffer) (goto-char (point-min)) (if (null (re-search-forward im-wl-dispatcher-error-msg nil t)) (progn ;; sent successfully. (kill-buffer raw-buffer) (kill-buffer process-buffer) (if kill-when-done (wl-draft-delete editing-buffer))) (ding) (message "Send failed") (kill-buffer raw-buffer) (switch-to-buffer editing-buffer) (condition-case () (progn (split-window-vertically) (select-window (next-window))) (error)) ; ignore error. (switch-to-buffer process-buffer) (beginning-of-line)))) (provide 'im-wl) ;;; im-wl.el ends here wanderlust-wanderlust-769699d/utils/ptexinfmt.el000066400000000000000000000243661406661363500221200ustar00rootroot00000000000000;;; ptexinfmt.el --- portable Texinfo formatter -*- lexical-binding: t -*- ;; Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, ;; 1994, 1995, 1996, 1997 Free Software Foundation, Inc. ;; Copyright (C) 1999 Yoshiki Hayashi ;; Copyright (C) 2000 TAKAHASHI Kaoru ;; Author: TAKAHASHI Kaoru ;; Yoshiki Hayashi ;; Katsumi Yamaoka ;; Maintainer: TAKAHASHI Kaoru ;; Created: 7 Jul 2000 ;; Keywords: maint, tex, docs, emulation, compatibility ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the GNU General Public License as ;; published by the Free Software Foundation; either version 2, or (at ;; your option) any later version. ;; This program is distributed in the hope that it will be useful, but ;; WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;; General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ;; Boston, MA 02110-1301, USA. ;;; Commentary: ;; Original code: Yoshiki Hayashi ;; makeinfo.el (gnujdoc project) ;; Support texinfmt.el 2.32 or later. ;; Modified by Yamaoka not to use APEL functions. ;; Unimplemented command: ;; @abbr{ABBREVIATION} ;; @float ... @end float, @caption{TEXT}, @shortcaption{TEXT}, @listoffloats ;; @deftypecv[x] ;; @headitem ;; @quotation (optional arguments) ;; @acronym{ACRONYM[, MEANING]} (optional argument) ;; @dofirstparagraphindent ;; @indent ;; @verbatiminclude FILENAME ;; @\ ;; @definfoenclose phoo,//,\\ ;; @deftypeivar CLASS DATA-TYPE VARIABLE-NAME ;; @deftypeop CATEGORY CLASS DATA-TYPE NAME ARGUMENTS... ;; @allowcodebreaks false ;; @thischapternum ;; @quotedblleft @quotedblright ;; @quoteleft @quoteright @quotedblbase @quotesinglbase ;; @guillemetleft @guillemetright @guilsinglleft @guilsinglright. ;; @clicksequence, @click, @clickstyle, @arrow ;;; Code: (require 'texinfmt) ;; Work around a problem that double-quotes at bol disappear: ;; @dfn{FOO} => FOO", ``BAR'' => BAR", \BAZ/ => BAZ/ (modify-syntax-entry ?\" "w" texinfo-format-syntax-table) (modify-syntax-entry ?\\ "w" texinfo-format-syntax-table) ;;; Broken (defvar ptexinfmt-disable-broken-notice-flag t "If non-nil disable notice, when call `ptexinfmt-broken-facility'. This is last argument in `ptexinfmt-broken-facility'.") (put 'ptexinfmt-broken-facility 'lisp-indent-function 'defun) (defmacro ptexinfmt-broken-facility (facility docstring assertion &optional _dummy) "Declare a symbol FACILITY is broken if ASSERTION is nil. DOCSTRING will be printed if ASSERTION is nil and `ptexinfmt-disable-broken-notice-flag' is nil." `(let ((facility ',facility) (docstring ,docstring) (assertion (eval ',assertion))) (put facility 'broken (not assertion)) (if assertion nil (put facility 'broken-docstring docstring) (if ptexinfmt-disable-broken-notice-flag nil (message "BROKEN FACILITY DETECTED: %s" docstring))))) (put 'ptexinfmt-defun-if-broken 'lisp-indent-function 'defun) (defmacro ptexinfmt-defun-if-broken (&rest args) "Redefine a function just like `defun' if it is considered broken." (let ((name (list 'quote (car args)))) (setq args (cdr args)) `(prog1 ,name (if (get ,name 'broken) (defalias ,name (function (lambda ,@args))))))) (put 'ptexinfmt-defun-if-void 'lisp-indent-function 'defun) (defmacro ptexinfmt-defun-if-void (&rest args) "Define a function just like `defun' unless it is already defined." (let ((name (list 'quote (car args)))) (setq args (cdr args)) `(prog1 ,name (if (fboundp ,name) nil (defalias ,name (function (lambda ,@args))))))) (put 'ptexinfmt-defvar-if-void 'lisp-indent-function 'defun) (defmacro ptexinfmt-defvar-if-void (&rest args) "Define a variable just like `defvar' unless it is already defined." (let ((name (car args))) (setq args (cdr args)) `(prog1 (defvar ,name) (if (boundp ',name) nil (defvar ,name ,@args))))) (defvar texinfo-enclosure-list) (defvar texinfo-alias-list) ;; @uref{URL[, TEXT][, REPLACEMENT]} (ptexinfmt-broken-facility texinfo-format-uref "Parse twice @uref argument." (condition-case nil (with-temp-buffer (let (texinfo-enclosure-list texinfo-alias-list) (texinfo-mode) (insert "@uref{mailto:foo@@noncommand.example.com}\n") (texinfo-format-expand-region (point-min) (point-max)) t)) (error nil))) ;;; Hardcopy and HTML (discard) ;; size (put 'letterpaper 'texinfo-format 'texinfo-discard-line) (put 'fonttextsize 'texinfo-format 'texinfo-discard-line-with-args) ;; flags (put 'frenchspacing 'texinfo-format 'texinfo-discard-line-with-args) ;; @slanted{TEXT} (makeinfo 4.8 or later) (put 'slanted 'texinfo-format 'texinfo-format-noop) ;; @sansserif{TEXT} (makeinfo 4.8 or later) (put 'sansserif 'texinfo-format 'texinfo-format-noop) ;; @tie{} (makeinfo 4.3 or later) (put 'tie 'texinfo-format 'texinfo-format-tie) (ptexinfmt-defun-if-void texinfo-format-tie () (texinfo-parse-arg-discard) (insert " ")) ;;; Conditional ;; @ifnotdocbook ... @end ifnotdocbook (makeinfo 4.7 or later) (put 'ifnotdocbook 'texinfo-format 'texinfo-discard-line) (put 'ifnotdocbook 'texinfo-end 'texinfo-discard-command) ;; @docbook ... @end docbook (makeinfo 4.7 or later) (put 'docbook 'texinfo-format 'texinfo-format-docbook) (ptexinfmt-defun-if-void texinfo-format-docbook () (delete-region texinfo-command-start (progn (re-search-forward "@end docbook[ \t]*\n") (point)))) ;; @ifdocbook ... @end ifdocbook (makeinfo 4.7 or later) (put 'ifdocbook 'texinfo-format 'texinfo-format-ifdocbook) (ptexinfmt-defun-if-void texinfo-format-ifdocbook () (delete-region texinfo-command-start (progn (re-search-forward "@end ifdocbook[ \t]*\n") (point)))) ;;; Marking ;; @indicateurl{INDICATEURL} (put 'indicateurl 'texinfo-format 'texinfo-format-code) ;; @LaTeX{} (put 'LaTeX 'texinfo-format 'texinfo-format-LaTeX) (ptexinfmt-defun-if-void texinfo-format-LaTeX () (texinfo-parse-arg-discard) (insert "LaTeX")) ;; @registeredsymbol{} (put 'registeredsymbol 'texinfo-format 'texinfo-format-registeredsymbol) (ptexinfmt-defun-if-void texinfo-format-registeredsymbol () (texinfo-parse-arg-discard) (insert "(R)")) ;;; Accents and Special characters ;; @euro{} ==> Euro (put 'euro 'texinfo-format 'texinfo-format-euro) (ptexinfmt-defun-if-void texinfo-format-euro () (texinfo-parse-arg-discard) (insert "Euro ")) ;; @ordf{} ==> a Spanish feminine (put 'ordf 'texinfo-format 'texinfo-format-ordf) (ptexinfmt-defun-if-void texinfo-format-ordf () (texinfo-parse-arg-discard) (insert "a")) ;; @ordm{} ==> o Spanish masculine (put 'ordm 'texinfo-format 'texinfo-format-ordm) (ptexinfmt-defun-if-void texinfo-format-ordm () (texinfo-parse-arg-discard) (insert "o")) ;; @. (put '\. 'texinfo-format 'texinfo-format-\.) (ptexinfmt-defun-if-void texinfo-format-\. () (texinfo-discard-command) (insert ".")) ;; @: (put '\: 'texinfo-format 'texinfo-format-\:) (ptexinfmt-defun-if-void texinfo-format-\: () (texinfo-discard-command)) ;; @- (put '\- 'texinfo-format 'texinfo-format-soft-hyphen) (ptexinfmt-defun-if-void texinfo-format-soft-hyphen () (texinfo-discard-command)) ;; @/ (put '\/ 'texinfo-format 'texinfo-format-\/) (ptexinfmt-defun-if-void texinfo-format-\/ () (texinfo-discard-command)) ;; @textdegree{} (put 'textdegree 'texinfo-format 'texinfo-format-textdegree) (ptexinfmt-defun-if-void texinfo-format-textdegree () (insert "o" (texinfo-parse-arg-discard)) (goto-char texinfo-command-start)) ;; @geq{} (put 'geq 'texinfo-format 'texinfo-format-geq) (ptexinfmt-defun-if-void texinfo-format-geq () (insert ">=" (texinfo-parse-arg-discard)) (goto-char texinfo-command-start)) ;; @leq{} (put 'leq 'texinfo-format 'texinfo-format-leq) (ptexinfmt-defun-if-void texinfo-format-leq () (insert "<=" (texinfo-parse-arg-discard)) (goto-char texinfo-command-start)) ;; @U{XXXX} (put 'U 'texinfo-format 'texinfo-format-U) (ptexinfmt-defun-if-void texinfo-format-U () (let ((args (texinfo-format-parse-args))) (texinfo-discard-command) (insert (string-to-number (nth 0 args) 16)))) ;;; Cross References ;; @ref{NODE-NAME, ...} ;; @xref{NODE-NAME, ...} (put 'ref 'texinfo-format 'texinfo-format-xref) ;;; Indent ;; @exampleindent INDENT (makeinfo 4.0 or later) ;; @paragraphindent INDENT (makeinfo 4.0 or later) ;; INDENT: asis, 0, n ;; @firstparagraphindent WORD (makeinfo 4.6 or later) ;; WORD: none, insert ;;; @multitable ... @end multitable ;; Workaround for @headitem (unless (get 'headitem 'texinfo-format) (put 'headitem 'texinfo-format 'texinfo-item)) ;; @comma (if (fboundp 'texinfo-format-comma) nil (put 'comma 'texinfo-format 'texinfo-format-comma) (defun texinfo-format-comma () (texinfo-parse-arg-discard) (insert ",") (put-text-property (1- (point)) (point) 'ignore t)) ;; Redefine this function so as to work for @comma (defun texinfo-format-parse-args () (let ((start (1- (point))) next beg end args) (search-forward "{") (save-excursion (texinfo-format-expand-region (point) (save-excursion (up-list 1) (1- (point))))) ;; The following does not handle cross references of the form: ;; `@xref{bullet, , @code{@@bullet}@{@}}.' because the ;; re-search-forward finds the first right brace after the second ;; comma. (while (/= (preceding-char) ?\}) (skip-chars-forward " \t\n") (setq beg (point)) ;;; (re-search-forward "[},]") ;; Ignore commas that are derived from @comma{}. (while (and (re-search-forward "[},]" nil t) (get-text-property (match-beginning 0) 'ignore))) ;;; (setq next (point)) (forward-char -1) (skip-chars-backward " \t\n") (setq end (point)) (cond ((< beg end) (goto-char beg) (while (search-forward "\n" end t) (replace-match " ")))) (push (if (> end beg) (buffer-substring-no-properties beg end)) args) (goto-char next)) ;;(if (eolp) (forward-char 1)) (setq texinfo-command-end (point)) (nreverse args)))) (provide 'ptexinfmt) ;;; ptexinfmt.el ends here wanderlust-wanderlust-769699d/utils/ssl.el000066400000000000000000000157411406661363500207000ustar00rootroot00000000000000;;; ssl.el,v --- ssl functions for emacsen without them builtin -*- lexical-binding: t -*- ;; Author: wmperry ;; Created: 1999/10/14 12:44:18 ;; Version: 1.2 ;; Keywords: comm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Copyright (c) 1995, 1996 by William M. Perry ;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc. ;;; ;;; This file is part of GNU Emacs. ;;; ;;; GNU Emacs is free software; you can redistribute it and/or modify ;;; it under the terms of the GNU General Public License as published by ;;; the Free Software Foundation; either version 2, or (at your option) ;;; any later version. ;;; ;;; GNU Emacs is distributed in the hope that it will be useful, ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; GNU General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with GNU Emacs; see the file COPYING. If not, write to the ;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;;; Boston, MA 02111-1307, USA. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (require 'cl-lib) (defgroup ssl nil "Support for `Secure Sockets Layer' encryption." :group 'comm) (defcustom ssl-certificate-directory "~/.w3/certs/" "*Directory to store CA certificates in" :group 'ssl :type 'directory) (defcustom ssl-rehash-program-name "c_rehash" "*Program to run after adding a cert to a directory . Run with one argument, the directory name." :group 'ssl :type 'string) (defcustom ssl-view-certificate-program-name "x509" "*The program to run to provide a human-readable view of a certificate." :group 'ssl :type 'string) (defcustom ssl-view-certificate-program-arguments '("-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) (defcustom ssl-certificate-directory-style 'ssleay "*Style of cert database to use, the only valid value right now is `ssleay'. This means a directory of pem encoded certificates with hash symlinks." :group 'ssl :type '(choice (const :tag "SSLeay" :value ssleay) (const :tag "OpenSSL" :value openssl))) (defcustom ssl-certificate-verification-policy 0 "*How far up the certificate chain we should verify." :group 'ssl :type '(choice (const :tag "No verification" :value 0) (const :tag "Verification required" :value 1) (const :tag "Reject connection if verification fails" :value 3) (const :tag "SSL_VERIFY_CLIENT_ONCE" :value 5))) (defcustom ssl-program-name "openssl" "*The program to run in a subprocess to open an SSL connection." :group 'ssl :type 'string) (defcustom ssl-program-arguments '("s_client" "-quiet" "-host" host "-port" service "-verify" (int-to-string ssl-certificate-verification-policy) "-CApath" ssl-certificate-directory) "*Arguments that should be passed to the program `ssl-program-name'. This should be used if your SSL program needs command line switches to specify any behaviour (certificate file locations, etc). The special symbols 'host and 'service may be used in the list of arguments and will be replaced with the hostname and service/port that will be connected to." :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" (base64-encode-string der) "\n-----END CERTIFICATE-----\n")) (exit-code 0)) (with-current-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))) (if (/= exit-code 0) nil (let ((vals nil)) (goto-char (point-min)) (while (re-search-forward "^\\([^=\n\r]+\\)\\s *=\\s *\\(.*\\)" nil t) (push (cons (match-string 1) (match-string 2)) vals)) 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" ;; 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 (apply 'call-process-region (point-min) (point-max) ssl-view-certificate-program-name nil tmpbuf t ssl-view-certificate-program-arguments)) (switch-to-buffer tmpbuf) (goto-char (point-min)) (or (recenter) t) (yes-or-no-p "Accept this CA to vouch for secure server identities? ") (kill-buffer tmpbuf))))) (if (not response) nil (if (not (file-directory-p ssl-certificate-directory)) (make-directory ssl-certificate-directory)) (cl-case ssl-certificate-directory-style (ssleay (base64-encode-region (point-min) (point-max)) (goto-char (point-min)) (insert "-----BEGIN CERTIFICATE-----\n") (goto-char (point-max)) (insert "-----END CERTIFICATE-----\n") (let ((f (expand-file-name (concat (file-name-sans-extension (buffer-name)) ".pem") ssl-certificate-directory))) (write-file f) (call-process ssl-rehash-program-name nil nil nil (expand-file-name ssl-certificate-directory)))))))) (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 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 (number-to-string service))) (let* ((process-connection-type nil) (proc (apply 'start-process name buffer ssl-program-name (mapcar (lambda (elt) (eval `(let ((host ,host) (service ,service)) ,elt))) ssl-program-arguments)))) (set-process-query-on-exit-flag proc nil) proc)) (provide 'ssl) wanderlust-wanderlust-769699d/utils/wl-addrbook.el000066400000000000000000000501131406661363500222740ustar00rootroot00000000000000;; wl-addrbook.el --- Aliases and personal information -*- lexical-binding: t -*- ;; Author: Masahiro MURATA ;; Kazu Yamamoto ;; Keywords: mail, net news ;;; Commentary: ;; Insert the following lines in your ~/.wl ;; ;; (require 'wl-addrbook) ;; (wl-addrbook-setup) ;; Original code: Kazu Yamamoto ;; mew-addrbook.el (Mew developing team) ;;; Code: (require 'wl-util) (defvar wl-addrbook-file "~/.im/Addrbook" "*Addrbook file for completion") (defvar wl-addrbook-expand-max-depth 5 "*A value to limit alias(addrbook) expansion loop.") (defvar wl-addrbook-comment-regexp "^;.*$\\|#.*$" "*Regular expression for \".im/Addrbook\".") (defvar wl-addrbook-override-by-newone t "If non-nil, the 'user' entry in 'wl-alias-auto-alist' is override by a new entry of (user different-address). This means that addresses in To: and Cc: in Draft mode are always learned with an exception 'user' is defined in Addrbook. If nil, the old 'user' entry remains.") ;;(defvar wl-anonymous-recipients ":;") (defvar wl-addrbook-hashtb nil) (defvar wl-addrbook-strip-domainpart t "*If *non-nil*, a shortname is created by stripping its domain part.") (defvar wl-addrbook-alist nil "(key addr) or (key (addr1, addr2) nickname name)") (defvar wl-alias-auto-alist nil "(key addr)") (defvar wl-alias-auto-file-name "auto-alias") (defvar wl-summary-use-addrbook-from-func t) ;;; utils (defun wl-uniq-alist (alst) "Distractively uniqfy elements of ALST." (let ((tmp alst)) (while tmp (setq tmp (setcdr tmp (wl-delete-alist2 (car (car tmp)) (cdr tmp)))))) alst) (defun wl-delete-alist2 (key alist) "Destructively delete elements whose first member is equal to key" (if (null key) alist (let (ret) (while (equal (car (nth 0 alist)) key) (setq alist (cdr alist))) (setq ret alist) (while alist (if (equal (car (nth 1 alist)) key) (setcdr alist (cdr (cdr alist))) (setq alist (cdr alist)))) ret))) (defun wl-get-next (LIST MEM) (let (frst next crnt) (setq frst (car LIST)) (setq LIST (cdr LIST)) (setq next (car LIST)) (if (equal frst MEM) (if next next frst) (catch 'loop (while LIST (setq crnt next) (setq LIST (cdr LIST)) (setq next (car LIST)) (if (equal crnt MEM) (throw 'loop (if next next frst)))))))) (defun wl-address-extract-user (addr) "Extracts username from ADDR" (if (string-match "@.*:" addr) ;; xxx what's this? (setq addr (substring addr (match-end 0) nil)) (setq addr (elmo-replace-char-in-string ? ?_ addr t)) (setq addr (substring addr 0 (string-match "%" addr))) (setq addr (substring addr 0 (string-match "@" addr))) ;; just for refile: "To: recipients:;" -> recipients ;;(setq addr (substring addr 0 (string-match wl-anonymous-recipients addr))) ;; removing Notes domain (setq addr (substring addr 0 (string-match "/" addr))))) (defun wl-address-parse-address-list (addrs) (mapcar 'wl-address-header-extract-address (elmo-parse-addresses addrs))) ;; hash table for wl-addrbook-alist (defmacro wl-addrbook-hashtb () '(or wl-addrbook-hashtb (setq wl-addrbook-hashtb (elmo-make-hash 1021)))) (defsubst wl-addrbook-get-record-by-addr (addr &optional _alist) (elmo-get-hash-val (downcase addr) (wl-addrbook-hashtb))) (defsubst wl-addrbook-get-record-by-alias (alias &optional _alist) (elmo-get-hash-val (format "#%s" (downcase alias)) (wl-addrbook-hashtb))) (defun wl-addrbook-make-hashtb () (let ((ht (wl-addrbook-hashtb)) (alist wl-addrbook-alist) list addrs addr) (while alist (setq list (car alist) alist (cdr alist)) ;; key is alias (if (car list) (elmo-set-hash-val (format "#%s" (downcase (car list))) list ht)) (when (listp (setq addrs (nth 1 list))) (while addrs (setq addr (car addrs) addrs (cdr addrs)) ;; key is address (elmo-set-hash-val (downcase addr) list ht)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Address book ;;; (defun wl-addrbook-setup () (require 'wl-complete) ;; replace wl-address-init function. (setq wl-address-init-function 'wl-addrbook-init) ;; (when wl-summary-use-addrbook-from-func (setq wl-summary-get-petname-function 'wl-addrbook-get-nickname)) (define-key wl-summary-mode-map "\C-c\C-a" 'wl-summary-addrbook-add) (define-key wl-draft-mode-map "\C-i" 'wl-draft-addrbook-header-comp-or-tab) (define-key wl-draft-mode-map "\e\t" 'wl-draft-addrbook-expand) (define-key wl-draft-mode-map "\C-c\t" 'wl-draft-circular-comp) (add-hook 'mail-send-hook 'wl-draft-learn-alias)) (defun wl-addrbook-init () (message "Updating addrbook...") (or wl-alias-auto-alist (if wl-alias-auto-file-name (setq wl-alias-auto-alist (elmo-object-load (expand-file-name wl-alias-auto-file-name elmo-msgdb-directory))))) (setq wl-addrbook-alist (wl-addrbook-make-alist)) ;; wl-alias-auto-alist is used independently so must use copy-alist (if wl-addrbook-alist (nconc wl-addrbook-alist (copy-alist wl-alias-auto-alist)) (setq wl-addrbook-alist (copy-alist wl-alias-auto-alist))) ;; (if wl-addrbook-alist ;; (nconc wl-addrbook-alist (wl-petname-make-alist)) ;; (setq wl-addrbook-version (wl-petname-make-alist))) (setq wl-addrbook-alist (wl-uniq-alist wl-addrbook-alist)) (wl-addrbook-make-hashtb) (add-hook 'kill-emacs-hook (function wl-addrbook-clean-up)) (add-hook 'wl-exit-hook (function wl-addrbook-clean-up)) (message "Updating addrbook...done")) (defun wl-addrbook-clean-up () (remove-hook 'kill-emacs-hook (function wl-addrbook-clean-up)) (remove-hook 'wl-exit-hook (function wl-addrbook-clean-up)) (when wl-alias-auto-file-name (elmo-object-save (expand-file-name wl-alias-auto-file-name elmo-msgdb-directory) wl-alias-auto-alist) (setq wl-alias-auto-alist nil) (setq wl-addrbook-hashtb nil))) ;; (defmacro wl-alias-get (key) `(wl-addrbook-alias-get ,key wl-addrbook-alist)) (defmacro wl-alias-next (key) `(wl-addrbook-alias-next ,key wl-addrbook-alist)) (defalias 'wl-addrbook-alias-hit 'wl-addrbook-get-record-by-alias) (defun wl-addrbook-alias-get (key alist) (let ((addrs (wl-addrbook-alias-get1 key alist 0))) (cond ((stringp addrs) addrs) ((listp addrs) (mapconcat (lambda (x) x) (nreverse addrs) ", ")) (t key)))) (defun wl-addrbook-alias-get1 (key alist n) "Expand KEY to addresses according ALIST. If addresses is a list, that follows one-of convention and return the first member of the list. If addresses is a string, expands it recursively." (let* ((crnt (nth 1 (wl-addrbook-alias-hit key alist))) (keys (and (stringp crnt) (elmo-parse crnt "\\([^, \t]+\\)"))) ret tmp) (cond ((> n wl-addrbook-expand-max-depth) key) ((null crnt) key) ((listp crnt) (car crnt)) (t (while keys (setq tmp (wl-addrbook-alias-get1 (car keys) alist (1+ n))) (if (listp tmp) (setq ret (nconc tmp ret)) (setq ret (cons tmp ret))) (setq keys (cdr keys))) ret)))) (defun wl-addrbook-alias-next (key alist) (let* ((addrs (nth 1 (wl-addrbook-get-record-by-addr key alist)))) (if (and addrs (listp addrs)) (wl-get-next addrs key)))) (defun wl-addrbook-alias-add (addr) (if (and (stringp addr) (string-match "@" addr)) (let* ((user (wl-address-extract-user addr)) (match-auto (assoc user wl-alias-auto-alist)) (match-adbk (assoc user wl-addrbook-alist))) (cond (match-auto (cond ((equal addr (nth 1 match-auto)) ;; move the entry to the top for the recent-used-first. (setq wl-alias-auto-alist (cons match-auto (delete match-auto wl-alias-auto-alist)))) (wl-addrbook-override-by-newone ;; override match-auto by (user addr) (setq wl-addrbook-alist (cons (list user addr) (delete match-auto wl-addrbook-alist))) (setq wl-alias-auto-alist (cons (list user addr) (delete match-auto wl-alias-auto-alist)))) (t ;; the old entry remains ))) (match-adbk ;; do nothing ) (t (setq wl-addrbook-alist (cons (list user addr) wl-addrbook-alist)) (setq wl-alias-auto-alist (cons (list user addr) wl-alias-auto-alist))))))) (defun wl-addrbook-alias-delete (addr) (if (and (stringp addr) (string-match "@" addr)) (let* ((user (wl-address-extract-user addr)) (ent (assoc user wl-addrbook-alist))) (if (and ent (equal (cdr ent) addr)) (progn (setq wl-addrbook-alist (delete ent wl-addrbook-alist)) (setq wl-alias-auto-alist (delete ent wl-alias-auto-alist))))))) ;; (defun wl-addrbook-shortname-get (addr) (nth 0 (wl-addrbook-get-record-by-addr addr))) (defun wl-addrbook-nickname-get (addr) (nth 2 (wl-addrbook-get-record-by-addr addr))) (defun wl-addrbook-name-get (addr) (nth 3 (wl-addrbook-get-record-by-addr addr))) ;; (defun wl-addrbook-insert-file (file cregexp &optional unquote) (let* ((case-fold-search t) (coding-system-for-read 'undecided) (pars (elmo-parse file "\\([^, ]+\\)")) ;; parents (files pars) ;; included par chr path beg qchar) ;; include parents files (while pars (setq par (car pars)) (setq pars (cdr pars)) (if (not (file-readable-p par)) () (insert-file-contents par) (setq path (file-name-directory par)) ;; include children files (while (re-search-forward "^\<[ \t]*\\([^ \t\n]+\\).*$" nil t) (setq chr (expand-file-name (match-string-no-properties 1) path)) (delete-region (match-beginning 0) (match-end 0)) (if (and (file-readable-p chr) (not (member chr files))) (progn (insert-file-contents chr) (setq files (cons chr files))))) (goto-char (point-max)))) ;; remove commets (goto-char (point-min)) (while (re-search-forward cregexp nil t) (delete-region (match-beginning 0) (match-end 0))) ;; concat continuation lines (goto-char (point-min)) (while (re-search-forward "\\\\\n" nil t) (delete-region (match-beginning 0) (match-end 0))) ;; concat separated lines by comma (goto-char (point-min)) (while (re-search-forward ",[ \t]*$" nil t) (end-of-line) (forward-char) (delete-char -1) (delete-horizontal-space)) ;; unquote, replace white spaces to "\0". (if unquote (catch 'quote (goto-char (point-min)) (while (re-search-forward "[\"']" nil t) (setq qchar (preceding-char)) ;; (point) is for backward compatibility (delete-char -1) ; delete quote (setq beg (point)) (if (not (re-search-forward (char-to-string qchar) nil t)) (throw 'quote nil) ;; error (delete-char -1) ; delete quote (save-restriction (narrow-to-region beg (point)) (goto-char (point-min)) (while (re-search-forward "[ \t]+" nil t) (replace-match "\0")) (goto-char (point-max))))))) ;; just in case ;; remove optional white spaces (goto-char (point-min)) (while (re-search-forward "[ \t]+" nil t) (replace-match " ")))) (defun wl-addrbook-strsafe (var) (if (or (string-equal "" var) (string-equal "*" var)) nil (elmo-replace-char-in-string 0 ? var))) (defun wl-addrbook-make-alist () (let (alias colon addrs nick name alist) (elmo-set-work-buf (wl-addrbook-insert-file wl-addrbook-file wl-addrbook-comment-regexp 'unquote) (goto-char (point-min)) (while (re-search-forward "^ ?\\([^ \n:]+\\) ?\\(:?\\) ?\\([^ \n]+\\)" nil t) (setq alias (wl-addrbook-strsafe (match-string-no-properties 1))) (setq colon (match-string-no-properties 2)) (setq addrs (wl-addrbook-strsafe (match-string-no-properties 3))) (if (equal colon ":") (setq alist (cons (list alias addrs) alist)) (and addrs (setq addrs (elmo-parse addrs "\\([^, \t\r\n]+\\)"))) (if (looking-at " ?\\([^ \n]*\\) ?\\([^ \n]*\\)") (progn (setq nick (wl-addrbook-strsafe (match-string-no-properties 1))) (setq name (wl-addrbook-strsafe (match-string-no-properties 2)))) (setq nick nil) (setq name nil)) (setq alist (cons (list alias addrs nick name) alist)))) (nreverse alist)))) (defun wl-draft-learn-alias () (interactive) (let ((recipients (mapconcat 'identity (delq nil (std11-field-bodies '("To" "Cc"))) ","))) (mapcar (lambda (addr) (wl-addrbook-alias-add (wl-address-header-extract-address addr))) (elmo-parse-addresses recipients)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Addrbook mode ;;; (defvar wl-addrbook-mode-map nil) (if wl-addrbook-mode-map () ;;(setq wl-addrbook-mode-map (make-sparse-keymap)) ;;(set-keymap-parent wl-addrbook-mode-map text-mode-map) (setq wl-addrbook-mode-map (copy-keymap text-mode-map)) (define-key wl-addrbook-mode-map "\C-c\C-c" 'wl-addrbook-register) (define-key wl-addrbook-mode-map "\C-c\C-q" 'wl-addrbook-kill)) (defvar wl-addrbook-mode-alias "Alias") (defvar wl-addrbook-mode-personalinfo "Personal Info") (defconst wl-addrbook-buffer-name "*WL Addrbook*") (defun wl-summary-addrbook-add (&optional personalinfo) "Adding the value of From: or To: in Message mode to Addrbook. When executed with '\\[universal-argument]', it will add personal information. Otherwise, it will add an alias." (interactive "P") (wl-summary-redisplay) (let ((buf wl-message-buffer) shortname address addrs name) (with-current-buffer buf (setq address (std11-field-body "From")) (if (wl-address-user-mail-address-p address) (setq address (std11-field-body "To"))) (if (null address) (message "No address to be registered") (setq addrs (wl-address-header-extract-address address)) (if wl-addrbook-strip-domainpart (setq shortname (wl-address-extract-user addrs)) (setq shortname addrs)) (if (string-match "\\(.*\\)<.*>" address) (progn (setq name (match-string 1 address)) (setq name (replace-regexp-in-string "[ \t]$" "" name t t)))) (wl-addrbook-prepare-template personalinfo shortname addrs nil name))))) (defun wl-addrbook-prepare-template (personalinfop shortname addrs &optional nickname name) (delete-other-windows) (switch-to-buffer (get-buffer-create wl-addrbook-buffer-name)) (erase-buffer) (insert "#If you want to register this entry, type " (substitute-command-keys "'\\\\[wl-addrbook-register]'.\n") "#If you want to NOT register this entry, type " (substitute-command-keys "'\\\\[wl-addrbook-kill]'.\n")) (wl-addrbook-insert-template "Shortname" shortname) (wl-addrbook-insert-template "Addresses" addrs) (cond (personalinfop (wl-addrbook-insert-template "Nickname" nickname) (wl-addrbook-insert-template "Name" name) (wl-addrbook-mode wl-addrbook-mode-personalinfo)) (t (wl-addrbook-mode wl-addrbook-mode-alias))) (wl-addrbook-insert-template "Comments" nil) (goto-char (point-min)) (search-forward ": " nil t)) (defun wl-addrbook-insert-template (key val) (let ((buffer-read-only nil) (inhibit-read-only t) (beg (point))) (insert key ": ") (put-text-property beg (point) 'read-only t) (put-text-property (1- (point)) (point) (if wl-on-xemacs 'end-open 'rear-nonsticky) t) (and val (insert val)) (insert "\n"))) (defun wl-addrbook-mode (mname) "\\ Mew Addrbook mode:: major mode to resistor Addrbook. The keys that are defined for this mode are: \\[wl-addrbook-register] Register information in Addrbook mode to Addrbook. \\[wl-addrbook-kill] Kill Addrbook mode. " (interactive) (setq major-mode 'wl-addrbook-mode) (setq mode-name mname) (setq mode-line-buffer-identification (format "Wanderlust: %s" mname)) (use-local-map wl-addrbook-mode-map) (run-hooks 'wl-addrbook-mode-hook) (setq buffer-undo-list nil)) (defun wl-addrbook-register () "Register information in Addrbook mode to Addrbook." (interactive) (let ((shortname (std11-field-body "Shortname")) (addrs (std11-field-body "Addresses")) (nickname (std11-field-body "Nickname")) (name (std11-field-body "Name")) (comments (std11-field-body "Comments")) (mode mode-name) buf addrsl errmsg not-uniq) (cond ((equal mode wl-addrbook-mode-alias) (cond ((and (null shortname) (null addrs)) (setq errmsg "Must fill both Shortname and Addresses.")) ((null shortname) (setq errmsg "Must fill Shortname.")) ((null addrs) (setq errmsg "Must fill Addresses.")))) (t (cond ((null addrs) (setq errmsg "Must fill Addresses.")) ((and (null shortname) (null nickname) (null name)) (setq errmsg "Must fill Shortname or Nickname or Name.")) ((and name (string-match "^\"[^\"]*[^\000-\177]" name)) (setq errmsg "Remove quote around non-ASCII Name."))))) (if errmsg (message errmsg) (save-excursion (setq buf (find-file-noselect wl-addrbook-file)) (set-buffer buf) (goto-char (point-min)) (if (and shortname (re-search-forward (concat "^" (regexp-quote shortname) "[ \t]*:?[ \t]+") nil t)) (setq not-uniq t)) (if not-uniq () ;; see later ;; All errors are checked. (goto-char (point-max)) (if (not (bolp)) (insert "\n")) (cond ((equal mode wl-addrbook-mode-alias) (setq wl-addrbook-alist (cons (list shortname addrs) wl-addrbook-alist)) (insert shortname ":\t" addrs)) (t (setq addrsl (wl-address-parse-address-list addrs)) (setq wl-addrbook-alist (cons (list shortname addrsl nickname name) wl-addrbook-alist)) (if (null shortname) (setq shortname "*")) (if (and nickname (string-match "^[^\" \t]+[ \t]+.*$" nickname)) (setq nickname (concat "\"" nickname "\""))) (if (and name (string-match "^[^\" \t]+[ \t]+.*$" name)) (setq name (concat "\"" name "\""))) (if name (insert shortname "\t" addrs "\t" (or nickname "*") "\t" name) (if nickname (insert shortname "\t" addrs "\t" nickname) (insert shortname "\t" addrs))))) (if comments (insert "\t#" comments "\n") (insert "\n")) (save-buffer))) (wl-addrbook-make-hashtb) ;; Addrbook buffer (kill-buffer buf) (if not-uniq (message "Shortname is already used. Change Shortname.") (wl-addrbook-kill 'no-msg) (message "Registered to Addrbook."))))) (defun wl-addrbook-kill (&optional no-msg) "Kill Addrbook mode." (interactive "P") (kill-buffer (current-buffer)) (or no-msg (message "Not registered."))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Show nick name of Addrbook in summary. ;;; (defun wl-addrbook-get-nickname (mailbox) "For `wl-summary-get-petname-function'." (wl-addrbook-nickname-get (wl-address-header-extract-address mailbox))) (provide 'wl-addrbook) ;;; Copyright Notice: ;; Copyright (C) 1999-2001 Mew developing team. ;; Copyright (C) 2001 Masahiro Murata ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; wl-addrbook.el ends here wanderlust-wanderlust-769699d/utils/wl-complete.el000066400000000000000000000304011406661363500223150ustar00rootroot00000000000000;;; wl-complete.el --- Completion magic for Wanderlust -*- lexical-binding: t -*- ;; Author: Masahiro MURATA ;; Kazu Yamamoto ;; Keywords: mail, net news ;;; Commentary: ;; Insert the following lines in your ~/.wl ;; ;; (require 'wl-addrbook) ;; (wl-addrbook-setup) ;; Original code: Kazu Yamamoto ;; mew-complete.el (Mew developing team) ;;; Code: (require 'wl-util) (require 'wl-addrbook) (defvar wl-mail-domain-list nil) (defvar wl-from-list nil) (defvar wl-complete-lwsp "^[ \t]") (defvar wl-complete-address-separator ":, \t\n") (defvar wl-field-completion-switch '(("To:" . wl-addrbook-complete-address) ("Cc:" . wl-addrbook-complete-address) ("Dcc:" . wl-addrbook-complete-address) ("Bcc:" . wl-addrbook-complete-address) ("Reply-To:" . wl-addrbook-complete-address) ("Mail-Reply-To:" . wl-addrbook-complete-address) ("Return-Receipt-To:" . wl-addrbook-complete-address) ("Newsgroups:" . wl-complete-newsgroups) ("Followup-To:" . wl-complete-newsgroups) ("Fcc:" . wl-complete-folder)) "*Completion function alist concerned with the key.") (defvar wl-field-circular-completion-switch '(("To:" . wl-circular-complete-domain) ("Cc:" . wl-circular-complete-domain) ("Dcc:" . wl-circular-complete-domain) ("Bcc:" . wl-circular-complete-domain) ("Reply-To:" . wl-circular-complete-domain) ("From:" . wl-circular-complete-from)) "*Circular completion function alist concerned with the key.") (defvar wl-field-expansion-switch '(("To:" . wl-addrbook-expand-address) ("Cc:" . wl-addrbook-expand-address) ("Dcc:" . wl-addrbook-expand-address) ("Bcc:" . wl-addrbook-expand-address) ("Reply-To:" . wl-addrbook-expand-address)) "*expansion function alist concerned with the key.") ;;; Code: (defun wl-string-match-assoc (key alist &optional case-ignore) (let (a (case-fold-search case-ignore)) (catch 'loop (while alist (setq a (car alist)) (if (and (consp a) (stringp (car a)) (string-match key (car a))) (throw 'loop a)) (setq alist (cdr alist)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Low level functions ;;; (defsubst wl-draft-on-header-p () (< (point) (save-excursion (goto-char (point-min)) (search-forward (concat "\n" mail-header-separator "\n") nil 0) (point)))) (defun wl-draft-on-value-p (switch) (if (wl-draft-on-header-p) (save-excursion (beginning-of-line) (while (and (< (point-min) (point)) (looking-at wl-complete-lwsp)) (forward-line -1)) (if (looking-at "\\([^:]*:\\)") (elmo-string-match-assoc (match-string-no-properties 1) switch t) nil)))) ;; what a case reachs here? ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Completion function: C-i ;;; (defun wl-draft-addrbook-header-comp-or-tab (_force) (interactive "P") (let ((case-fold-search t) func) (if (wl-draft-on-field-p) (wl-complete-field) (if (and (wl-draft-on-header-p) (setq func (wl-draft-on-value-p wl-field-completion-switch))) (funcall (cdr func)) (indent-for-tab-command))))) (defun wl-complete-newsgroups () (interactive) (wl-complete-field-body wl-folder-newsgroups-hashtb)) ;;(wl-address-complete-address wl-folder-newsgroups-hashtb)) (defun wl-complete-folder () "Folder complete function for Fcc:." (interactive) (let ((word (wl-delete-backward-char))) (if (null word) (wl-complete-window-show (list "+" "%")) (wl-complete word wl-folder-entity-hashtb "folder" nil)))) (defun wl-addrbook-complete-address () "Complete and expand address aliases. First alias key is completed. When completed solely or the @ character is inserted before the cursor, the alias key is expanded to its value." (interactive) (let ((word (wl-delete-backward-char))) (if (null word) (tab-to-tab-stop) (if (string-match "@." word) (insert (or (wl-alias-next word) word)) (wl-complete word wl-addrbook-alist "alias" ?@ nil nil (function wl-addrbook-alias-get) (function wl-addrbook-alias-hit)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Circular completion: C-cC-i ;;; (defun wl-draft-circular-comp () "Switch function for circular complete functions." (interactive) (let ((func (wl-draft-on-value-p wl-field-circular-completion-switch))) (if func (funcall (cdr func)) (message "No circular completion here")))) (defun wl-circular-complete-domain () "Circular completion of domains for To:, Cc:, etc. If the @ character does not exist, the first value of wl-mail-domain-list is inserted. If exists, the next value of wl-mail-domain-list concerned with the string between @ and the cursor is inserted." (interactive) (let ((word (wl-delete-backward-char "@"))) (cond ((equal word nil) ;; @ doesn't exist. (if (null wl-mail-domain-list) (message "For domain circular completion, set wl-mail-domain-list") (insert "@") (insert (car wl-mail-domain-list)) (wl-complete-window-delete))) ((equal word t) ;; just after @ (if (null wl-mail-domain-list) (message "For domain circular completion, set wl-mail-domain-list") (insert (car wl-mail-domain-list)) (wl-complete-window-delete))) (t ;; can't use wl-get-next since completion is necessary sometime. (wl-complete word (wl-slide-pair wl-mail-domain-list) "domain" t)) ;; use cdr ))) (defun wl-circular-complete (msg clist cname &optional here) "General circular complete function to call wl-complete." (interactive) (let ((str (wl-delete-value here))) (if (null str) (if (car clist) (insert (car clist)) (message "For circular completion, set %s" cname)) (wl-complete str (wl-slide-pair clist) msg t)))) ;; use cdr (defun wl-circular-complete-from () "Circular complete function for From:." (interactive) (wl-circular-complete "from" wl-from-list "wl-from-list")) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Expansion : M-C-i ;;; (defun wl-draft-addrbook-expand () "Switch function for expand functions." (interactive) (let ((func (wl-draft-on-value-p wl-field-expansion-switch))) (if func (funcall (cdr func)) (message "No expansion here")))) (defun wl-addrbook-expand-address () "Address expansion fuction for To:, Cc:, etc. \"user@domain\" will be expands \"name \" if the name exists." (interactive) (let ((word (wl-delete-backward-char)) name) (if (null word) (message "No address here") (setq name (wl-addrbook-name-get word)) (insert (if name (format "%s <%s>" name word) word))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Hart function for completions ;;; (eval-and-compile (fset 'wl-complete-hit (symbol-function 'assoc))) (defun wl-complete-get (key alist) (cdr (wl-complete-hit key alist))) (defun wl-complete (WORD ALIST MSG EXPAND-CHAR &optional TRY ALL GET HIT) (let* ((ftry (or TRY (function try-completion))) (fall (or ALL (function all-completions))) (fget (or GET (function wl-complete-get))) (fhit (or HIT (function wl-complete-hit))) (cmp (funcall ftry WORD ALIST)) (all (funcall fall WORD ALIST)) (len (length WORD)) subkey) (cond ;; already completed ((eq cmp t) (if EXPAND-CHAR ;; may be "t" (insert (funcall fget WORD ALIST)) ;; use cdr (insert WORD)) ;; use car (wl-complete-window-delete)) ;; EXPAND ((and (characterp EXPAND-CHAR) (char-equal (aref WORD (1- len)) EXPAND-CHAR) (setq subkey (substring WORD 0 (1- len))) (funcall fhit subkey ALIST)) (insert (funcall fget subkey ALIST)) ;; use cdr (wl-complete-window-delete)) ;; just one candidate ((equal 1 (length all)) (insert cmp) (wl-complete-window-delete) (if (window-minibuffer-p (get-buffer-window (current-buffer))) (wl-complete-temp-minibuffer-message " [Sole completion]") (message "Sole completion"))) ;; two or more candidates ((stringp cmp) ;; (length all) > 1 (insert cmp) (wl-complete-window-show all) (if (and EXPAND-CHAR (funcall fhit cmp ALIST)) (message (substitute-command-keys "To expand %s, type %c then '\\\\[wl-draft-addrbook-header-comp-or-tab]'.") cmp EXPAND-CHAR))) ;; no candidate (t (insert WORD) (if (window-minibuffer-p (get-buffer-window (current-buffer))) (wl-complete-temp-minibuffer-message (concat " No matching " MSG)) (message "No matching %s" MSG)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Minibuf magic ;;; (defun wl-complete-temp-minibuffer-message (m) (let ((savemax (point-max))) (save-excursion (goto-char (point-max)) (insert m)) (let ((inhibit-quit t)) (sit-for 2) (delete-region savemax (point-max)) (if quit-flag (setq quit-flag nil unread-command-events 7))))) ;; ;; Extracting completion key ;; (defun wl-delete-backward-char (&optional here) "Delete appropriate preceeding word and return it." (interactive) (let ((case-fold-search t) (start nil) (end (point)) (regex (concat "[^" wl-complete-address-separator "]"))) (save-excursion (while (and (not (bobp)) (string-match regex (buffer-substring-no-properties (1- (point)) (point)))) (backward-char)) (if (and here (not (re-search-forward (regexp-quote here) end t))) nil ;; "here" doesn't exist. (setq start (point)) (if (= start end) (if here t nil) ;; just after "here", just after separator (prog1 (buffer-substring-no-properties start end) (delete-region start end))))))) (defun wl-delete-value (&optional here) (beginning-of-line) (if (not (looking-at "[^:]+:")) () (goto-char (match-end 0)) (if (looking-at "[ \t]") (forward-char) (insert " ")) (if (eolp) nil (let ((start (point)) ret) (end-of-line) (if (and here (re-search-backward (regexp-quote here) start t)) (progn (setq start (1+ (point))) (end-of-line))) (setq ret (buffer-substring-no-properties start (point))) (delete-region start (point)) ret)))) ;; ;; Making alist ;; (defun wl-slide-pair (x) (let ((ret nil) (first (car x))) (cond ((eq x 0) nil) ((eq x 1) (cons first first)) (t (while (cdr x) (setq ret (cons (cons (nth 0 x) (nth 1 x)) ret)) (setq x (cdr x))) (setq ret (cons (cons (car x) first) ret)) (nreverse ret))))) (provide 'wl-complete) ;;; Copyright Notice: ;; Copyright (C) 1997-2001 Mew developing team. ;; Copyright (C) 2001 Masahiro Murata ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; wl-complete.el ends here wanderlust-wanderlust-769699d/utils/wl-mailto.el000066400000000000000000000070421406661363500217770ustar00rootroot00000000000000;;; wl-mailto.el -- some mailto support for wanderlust -*- lexical-binding: t -*- ;;; Copyright (C) 1999 Sen Nagata ;; Author: Sen Nagata ;; Version: 0.5 ;; License: GPL 2 ;; Warning: not optimized at all ;; This file is not a part of GNU Emacs. ;;; Commentary: ;; ;; required elisp packages: ;; ;; -wl (>= 0.9.6?) ;; ;; -rfc2368.el ;; -thingatpt.el or browse-url.el ;; ;; installation: ;; ;; -put this file (and rfc2368.el) in an appropriate directory (so Emacs ;; can find it) ;; ;; ;; -put: ;; ;; (add-hook 'wl-init-hook (lambda () (require 'wl-mailto))) ;; ;; in .emacs or .wl ;; ;; details: ;; ;; this package provides a number of interactive functions ;; (commands) for the user. each of the commands ultimately creates a ;; draft message based on some information. the names of the commands ;; and brief descriptions are: ;; ;; 1) wl-mailto-compose-message-from-mailto-url ;; make a draft message from a user-specified mailto: url ;; ;; 2) wl-mailto-compose-message-from-mailto-url-at-point ;; make a draft message from a mailto: url at point ;; ;; usage: ;; ;; -invoke wl ;; -try out the commands mentioned above in 'details' ;;; History: ;; ;; 0.5 ;; ;; wl-user-agent functionality merged into wl-draft.el, so removed ;; dependency ;; ;; 1999-06-24: ;; ;; incorporated a patch from Kenichi OKADA for ;; wl-mailto-compose-message-from-mailto-url-at-point ;; ;; 1999-06-11: ;; ;; fixed a typo ;; ;; 0.4 ;; ;; 1999-06-01: ;; ;; checkdoc checking ;; xemacs compatibility ;; ;; 1999-05-31: ;; ;; rewrote to use rfc2368.el and wl-user-agent.el ;;; Code: (defconst wl-mailto-version "wl-mailto.el 0.5") ;; how should we handle the dependecy on wl? ;; will this work? (eval-when-compile (require 'wl) (defun wl-mailto-url-at-point ())) ;; use rfc2368 support -- should be usable for things other than wl too (require 'rfc2368) ;; yucky compatibility stuff -- someone help me w/ this, please... (if (and (string-match "^XEmacs \\([0-9.]+\\)" (emacs-version)) (< (string-to-number (match-string 1 (emacs-version))) 21)) ;; for xemacs versions less than 21, use browse-url.el (progn (require 'browse-url) (fset 'wl-mailto-url-at-point 'browse-url-url-at-point)) ;; for everything else, use thingatpt.el (progn (require 'thingatpt) (fset 'wl-mailto-url-at-point (lambda () (thing-at-point 'url))))) (defun wl-mailto-compose-message-from-mailto-url (url &optional _dummy) "Compose a message from URL (RFC 2368). The optional second argument, DUMMY, exists to match the interface provided by `browse-url-mail' (w3) -- DUMMY does not do anything." (interactive "sURL: ") (if (string-match rfc2368-mailto-regexp url) (let* ((other-headers (rfc2368-parse-mailto-url url)) (to (cdr (elmo-assoc-ignore-case "to" other-headers))) (subject (cdr (elmo-assoc-ignore-case "subject" other-headers)))) (wl-user-agent-compose to subject other-headers)) (message "Not a mailto: url."))) ;; prepare a message from a mailto: url at point (defun wl-mailto-compose-message-from-mailto-url-at-point () "Draft a new message based on URL (RFC 2368) at point." (interactive) (let ((url (wl-mailto-url-at-point))) (if (and url (string-match rfc2368-mailto-regexp url)) (wl-mailto-compose-message-from-mailto-url url) ;; tell the user that we didn't find a mailto: url at point (message "No mailto: url detected at point.")))) ;; since this will be used via 'require'... (provide 'wl-mailto) ;;; wl-mailto.el ends here wanderlust-wanderlust-769699d/wanderlust-pkg.el000066400000000000000000000002421406661363500216740ustar00rootroot00000000000000(define-package "wanderlust" "2.15.9" "Yet Another Message Interface on Emacsen" '((emacs "24.5") (apel "10.8") (flim "1.14.9") (semi "1.14.7"))) wanderlust-wanderlust-769699d/wl/000077500000000000000000000000001406661363500170275ustar00rootroot00000000000000wanderlust-wanderlust-769699d/wl/ChangeLog.1000066400000000000000000015405421406661363500207530ustar00rootroot000000000000002020-08-20 Kazuhiro Ito Change non-ASCII text files's coding-system to UTF-8 * ChangeLog: Likewise. * wl-news.el.in: Likewise. * wl-vars.el: Likewise. 2020-07-04 Kazuhiro Ito * wl-summary.el (wl-summary-cursor-move-surface, wl-summary-up) (wl-summary-down): Fix dynmic binding dependencies. 2020-06-27 Kazuhiro Ito * wl-folder.el (wl-folder-check-entity): Run wl-folder-check-entity-hook and wl-folder-check-entity-pre-hook with argument ENTITY. * wl-vars.el (wl-folder-check-entity-pre-hook) (wl-folder-check-entity-hook): Update docstring. 2020-06-24 Kazuhiro Ito * wl-address.el (wl-address-add-or-change): Build regexp out of loop. * wl-addrmgr.el (wl-addrmgr-replace-field): Likewise. * wl-draft.el (wl-draft-parse-mailbox-list): Likewise. 2020-06-18 Kazuhiro Ito * wl-qs.el (wl-quicksearch-escape-query-string): Unite two calls for replace-regexp-in-string. 2020-06-17 Kazuhiro Ito * wl-qs.el (wl-quicksearch-escape-query-string): Likewise. Obsolete elmo-replace-in-string. Use replace-regexp-in-string. * wl-summary.el (wl-summary-default-subject-filter): Likewise. 2020-06-14 Kazuhiro Ito Replace char-to-string by list for concat function's arguments. That is slightly faster on my environment. * wl-score.el (wl-score-get-header-entry) (wl-score-edit-insert-header): Likewise. * wl-util.el (wl-number-base36): Likewise. 2020-06-03 Kazuhiro Ito * wl-highlight.el (invisible): Require invisible.el. 2020-06-03 Kazuhiro Ito * wl-address.el (wl-address-add-or-change): Minor refactorings. * wl.el (wl-plugged-toggle): Ditto. 2020-06-03 Kazuhiro Ito * wl-vars.el (wl-use-dnd): Obsolete. 2020-06-03 Kazuhiro Ito * wl-folder.el (wl-folder-set-entity-info): Define as inlune funcion. 2020-06-02 Kazuhiro Ito Use lexical binding in all *.el files except wl-news.el[.in]. 2020-06-01 Kazuhiro Ito * wl-draft.el (wl-draft-prepare-edit, wl-draft-reedit): Make write-file-functions buffer-local. 2020-05-30 Kazuhiro Ito * wl-acap.el: Adjust dependency. * wl-action.el (wl-summary-unmark-all): Use string-to-list directly. * wl-draft.el: Adjust dependency. * wl-highlight.el: Adjust dependency. (wl-highlight-get-face-by-name): Do not use find-face. * wl-news.el.in (wl-news-default-previous-version): Assume Emacs 24 or later. * wl-summary.el (wl-summary-goto-folder-subr): Use insert-file-contents-literally directly. (wl-summary-sync-update): Drop XEmacs related codes. * wl-vars.el: Adjust dependency. (wl-draft-truncate-lines, wl-message-truncate-lines): Use truncate-lines always. * wl.el: Assume Emacs 24 or later. 2020-05-29 Kazuhiro Ito Remove cl dependencies except where lexical-let is used. * wl-address.el: Likewise. * wl-demo.el: Likewise. * wl-draft.el: Likewise. * wl-folder.el: Likewise. * wl-message.el: Likewise. * wl-mime.el: Likewise. * wl-score.el: Likewise. * wl-spam.el: Likewise. * wl-summary.el: Likewise. * wl-thread.el: Likewise. * wl-util.el: Likewise. * wl.el: Likewise. 2020-05-28 Kazuhiro Ito Remove Meadow support. * wl-message.el (wl-summary-wheel-dispatcher) (wl-message-wheel-dispatcher): Removed. 2020-05-28 Kazuhiro Ito Adjust dependencies. * wl-action.el (wl-summary): Adjust dependencies. * wl-draft.el: Adjust dependencies. (wl-draft-mode-map): Declare explicitly. (wl-draft-insert-signature, wl-draft-toolbar) (wl-e21-setup-draft-toolbar, wl-draft-overload-menubar) (wl-draft-mode-setup, wl-draft-key-setup) (wl-draft-overload-functions): Moved from wl-e21.el. (wl-draft-real-time-highlight) (wl-draft-jit-highlight-function) (wl-draft-idle-highlight-idle-time) (wl-draft-idle-highlight-function): Moved ro wl-vars.el. * wl-e21.el: Adjust dependencies. Most function and variables are moved to related modules. * wl-folder.el (wl-folder-internal-icon-list, wl-folder-toolbar) (wl-e21-setup-folder-toolbar, wl-folder-toggle-icon-list) (wl-e21-highlight-folder-group-line) (wl-e21-highlight-folder-by-numbers) (wl-highlight-folder-current-line, wl-folder-init-icons) (wl-setup-folder): Moved from wl-e21.el * wl-folder.elo: Adjust dependencies. * wl-highlight.el: Adjust dependencies. (wl-highlight-summary-current-line): Remove code for XEmacs. * wl-message.el: Adjust dependencies. (wl-message-toolbar, wl-e21-setup-message-toolbar) (wl-setup-message, wl-message-define-keymap) (wl-message-wheel-dispatcher, wl-summary-wheel-dispatcher) (wl-message-wheel-up, wl-message-wheel-down): Moved from wl-e21.el. * wl-mime.el: Adjust dependencies. * wl-refile.el: Adjust dependencies. * wl-score.el (wl-current-score-file): Adjust dependencies. * wl-summary.el: Adjust dependencies. (wl-summary-toolbar, wl-e21-setup-summary-toolbar) (wl-setup-summary): Moved from wl-e21.el. * wl-template.el: Adjust dependencies. * wl-util.el: Adjust dependencies. (wl-read-event-char): Moved from wl-e21.el. * wl-vars.el (wl-draft-real-time-highlight) (wl-draft-jit-highlight-function) (wl-draft-idle-highlight-idle-time) (wl-draft-idle-highlight-function): Moved from wl-draft.el * wl.el: Adjust dependencies. 2020-05-26 Kazuhiro Ito Obsolete aliased functions. Use bundled function with Emacs or alies target preferably. * wl-action.el: Likewise. * wl-address.el: Likewise. * wl-addrmgr.el: Likewise. * wl-demo.el: Likewise. * wl-draft.el: Likewise. * wl-e21.el: Likewise. * wl-expire.el: Likewise. * wl-fldmgr.el: Likewise. * wl-folder.el: Likewise. * wl-highlight.el: Likewise. * wl-message.el: Likewise. * wl-refile.el: Likewise. * wl-score.el: Likewise. * wl-spam.el: Likewise. * wl-summary.el: Likewise. * wl.el: Likewise. 2020-05-24 Kazuhiro Ito Drop old platforms support. Now supported Emacsen are version 24 and later. * wl-acap.el: Assuse Emacs 24 or later. * wl-action.el: Likewise. * wl-demo.el: Likewise. * wl-draft.el: Likewise. * wl-e21.el: Likewise. * wl-expire.el: Likewise. * wl-folder.el: Likewise. * wl-highlight.el: Likewise. * wl-message.el: Likewise. * wl-mime.el: Likewise. * wl-spam.el: Likewise. * wl-summary.el: Likewise. * wl-thread.el: Likewise. * wl-util.el: Likewise. * wl-vars.el: Likewise. * wl-version.el: Likewise. * wl.el: Likewise. * wl-dnd.el Removed. * wl-mule.el Removed. * wl-xmas.el Removed. 2020-01-24 Kazuhiro Ito * wl-expire.el (wl-expire-archive-number2): Add notice for `elmo-localdir-folder-path' and `elmo-archive-folder-path' variable. 2020-01-23 Kazuhiro Ito * wl-summary.el (wl-summary-insert-headers): Handle the case that elmo-message-entity returns nil. 2019-09-18 Kazuhiro Ito Minor refactorings. * wl-thread.el (wl-thread-entity-get-number): Use car instead of nth. (wl-thread-reparent-children): Remove redundant progn. (wl-thread-entity-insert-as-top) (wl-thread-entity-insert-as-children) (wl-thread-entity-get-children-num) (wl-thread-entity-get-descendant) (wl-thread-entity-make-number-list-from-children) (wl-thread-entity-get-younger-brothers, wl-thread-insert-entity): Use wl-thread-entity-get-number instead of car. 2019-09-17 Kazuhiro Ito * wl-thread.el (wl-thread-set-entity): New inline function. (wl-thread-entity-insert-as-top) (wl-thread-entity-insert-as-children, wl-thread-resume-entity): Use it. 2019-09-17 Kazuhiro Ito * wl-thread.el: Require wl-action.el. Sort functions to suppress byte compiler warnings. 2019-09-17 Kazuhiro Ito * wl-thread.el (wl-thread-entity-insert-as-children) (wl-thread-close, wl-thread-make-indent-string): Minor refactorings. 2019-09-16 Kazuhiro Ito * wl-thread.el (wl-thread-entity-make-number-list-from-children) (wl-thread-reparent-children): Fix the case wl-thread-get-entity returns nil. Cf. https://github.com/wanderlust/wanderlust/issues/168 2019-08-12 Kazuhiro Ito Remove local \M-s key bindings. \M-s has been globally defined as search-map since Emacs 23. Cf. [wl-en:06688] * wl-summary.el (wl-summary-mode-map): Change wl-summary-stick's key binding from \M-s to \M-S. * wl-folder.el (wl-folder-mode-map): Remove definition of \M-s. Is is redundant. 2019-07-25 Kazuhiro Ito * wl-util.el (wl-window-deletable-p): Fix the case window-deletable-p function returns 'frame'. 2019-06-23 Kazuhiro Ito Minor refactoring. Mainly bind multiple if conditions into one. * wl-summary.el (wl-summary-toggle-disp-folder) (wl-summary-toggle-disp-msg, wl-summary-redisplay-internal): Likewise. * wl-address.el (wl-complete-window-delete): Likewise. 2019-06-22 Erik Hetzner * wl-util.wl (wl-window-deletable-p): Add function. * wl-addrmgr.wl (wl-addrmgr-quit-yes): Use `wl-window-deletable-p' to check if window is deletable. * wl-draft.wl (wl-draft-hide): Likewise. 2019-04-06 Kazuhiro Ito * wl-message.el (wl-message-buffer-display): Do not handle signals in wl-message-display-internal for debuggability. 2019-02-03 Kazuhiro Ito * wl-score.el (wl-string>): Use string> if available. 2019-02-03 Kazuhiro Ito * wl-addrmgr.el (wl-addrmgr-add, wl-addrmgr-delete) (wl-addrmgr-edit): Use elmo-string instead of wl-string. 2019-02-02 Kazuhiro Ito Support plain / SSL / STARTTLS connection via SOCKS for SMTP. Built-in GnuTLS library is required for SSL and STARTTLS connection. Each Connection type's symbol is "socks", "socks-ssl" and "socks-starttls" respectively. * wl-draft.el (wl-smtp-extension-bind): Refer to elmo-network-starttls-stream-type-list and elmo-network-stream-type-alist more generally. 2019-01-12 Kazuhiro Ito * wl-summary.el (wl-summary-cursor-move-surface): Fix that neither wl-summary-prev nor wl-summary-cursor-move-surface works when wl-summary-skip-mark-list is nil. Cf. https://github.com/wanderlust/wanderlust/issues/157 2018-12-09 Kazuhiro Ito * wl-message.el (wl-message-select-buffer): Fix error when resize-mini-windows is non-nil with a vertically narrow frame. Cf. [wl-en:06603] 2018-11-17 Kazuhiro Ito * wl-vars.el (wl-draft-reply-buffer-style) (wl-draft-buffer-style): Fix docstring. 2018-11-15 Kazuhiro Ito * wl-draft.el (wl-draft-do-reply-buffer-window-styling): Refactored. (wl-draft-do-buffer-window-styling): Refactored. Fix error when called from Folder buffer without any opened Summary buffer and wl-draft-buffer-style is 'msg-split' or 'msg-split-horiz'. 2018-11-15 Greg A. Woods * wl-draft.el (wl-draft-do-reply-buffer-window-styling) (wl-draft-do-buffer-window-styling): New functions. (wl-draft-create-buffer): Use them. (wl-draft): Add comment. (wl-draft-create-buffer): Add comment. (wl-jump-to-draft-buffer): Apply wl-draft-reply-buffer-style's draft style when called from Summary or Folder mode. * wl-summary.el (wl-summary-reply): Minor fix. (wl-summary-write): Add comment. * wl-vars.el (wl-draft-reply-buffer-style): Accept new symbol 'split-horiz'. (wl-draft-buffer-style): Accept new symbol 'split-horiz', 'msg-split' and 'msg-split-horiz'. 2018-03-17 Kazuhiro Ito * wl-summary.el (wl-summary-target-mark-reply-with-citation): Remove let-binding of change-major-mode-hook. Cf. https://github.com/wanderlust/wanderlust/issues/150 * wl-draft.el (wl-draft-create-buffer, wl-draft-prepare-edit) (wl-draft-reedit): Likewise. 2018-02-03 Kazuhiro Ito * wl-vars.el (wl-summary-redisplay-hook): Define explicitly. 2018-02-03 Kazuhiro Ito * wl-draft.el: Prune functions provided temporarily to avoid compile warnings in the end. * wl-message.el (dolist): Likewise. * wl-summary.el (dolist): Likewise. * wl-util.el (dolist): Likewise. * wl-xmas.el (dolist): Likewise. 2017-12-11 Kazuhiro Ito * wl-util.el (wl-match-string): Obsolete. Call match-string directly. (wl-match-buffer): Obsolete. Call elmo-match-buffer. (wl-make-date-string): Likewise. * wl-address.el (wl-ldap-register-dn-string) (wl-address-make-alist-from-alias-file) (wl-address-make-address-list) (wl-address-header-extract-address) (wl-address-header-extract-realname): Likewise. * wl-address.el (wl-ldap-register-dn-string): Likewise. * wl-fldmgr.el (wl-fldmgr-get-path-from-buffer) (wl-fldmgr-cut-region, wl-fldmgr-cut, wl-fldmgr-copy-region) (wl-fldmgr-rename, wl-fldmgr-sort, wl-fldmgr-unsubscribe) (wl-fldmgr-access-display-all, wl-fldmgr-set-petname): Likewise. * wl-folder.el (wl-folder-jump-to-current-entity) (wl-folder-update-recursive-current-entity) (wl-create-folder-entity-from-buffer) (wl-folder-update-diff-line, wl-folder-open-folder-sub) (wl-folder-open-all, wl-folder-open-close): Likewise. * wl-refile.el (wl-refile-get-account-part-from-address): Likewise. * wl-summary.el (wl-summary-message-number) (wl-summary-proc-wday, wl-summary-jump-to-parent-message): Likewise. * wl-util.el (wl-make-date-string): Likewise. * wl-xmas.el (wl-make-date-string): Likewise. 2017-12-09 Kazuhiro Ito * wl-summary.el (wl-summary-line-number): Refactored. 2017-12-06 Kazuhiro Ito * wl-draft.el (wl-draft-yank-from-mail-reply-buffer): Check whether mail-yank-hook is defined. Cf. https://github.com/wanderlust/wanderlust/issues/145 2017-09-16 Kazuhiro Ito * wl-message.el (wl-message-redisplay): Report error on hook functions. * wl-summary.el (wl-summary-insert-line): Ditto. 2017-03-25 Kazuhiro Ito * wl-news.el.in: Remove EOL type from coding cookie for old Emacsen on Windows. 2017-03-23 Kazuhiro Ito * wl-draft.el (wl-smtp-password-key): Make list as key. 4th argument SERVICE is required. (wl-smtp-extension-bind, wl-draft-send-mail-with-smtp): Likewise. 2017-03-19 Kazuhiro Ito * wl-util.el (wl-simple-display-progress): Display decimal fraction percentage in the case of large total number. Do not report when total number is non-positive number. 2017-02-04 Kazuhiro Ito Suggested by Pascal Haakmat * wl-vars.el (wl-biff-new-mail-hook): New hook. * wl-util.el (wl-biff-notify): Run wl-biff-new-mail-hook when new mail has arrived. Cf. [wl-en:06109], https://github.com/wanderlust/wanderlust/pull/137 2017-02-04 Kazuhiro Ito * wl-util.el (wl-biff-start, wl-biff-launch-handler) (wl-biff-event-handler): Fix idle timer related issues. Cf. [wl-en:06357] 2016-12-18 Piotr Trojanek * wl-mime.el (wl-mime-pgp-decrypt-region): fix grammar in message for missing PGP support. (wl-mime-pgp-verify-region): Likewise. (wl-mime-pgp-kill-decrypted-buffers): simplify MAPC and LAMBDA with DOLIST. 2016-12-10 Pascal Haakmat * wl-util.el (wl-biff-launch-handler): Do the post processing always. Cf. [wl-en:06335] 2016-11-28 Piotr Trojanek * wl-thread.el (wl-thread-insert-top): rewrite with dolist; remove repeated calls to length; reindent. (wl-thread-get-parent-list): rewrite with dolist; replace append with consing followed by nreverse. (wl-thread-cleanup-symbols): rewrite with dolist. (wl-thread-delete-line-from-buffer): replace explicit ELSE branch by WHEN; limit scope of LET. 2016-11-26 Piotr Trojanek * wl-summary.el (wl-summary-line-formatter): remove unreferenced variable. (wl-summary-sync-update): simplify detection of for zero-length list. * wl-folder.el (wl-folder-create-folder-entity): remove useless setq. 2016-11-13 Kazuhiro Ito * wl-demo.el (wl-demo-image-type-alist, wl-demo-insert-image) (wl-demo-setup-properties): Use defined constant for checking environment. * wl-draft.el (wl-draft-highlight-and-recenter): Likewise. * wl-message.el (wl-message-buffer-prefetch-clear-timer): Likewise. * wl-util.el (wl-ask-folder, wl-set-string-width) (wl-region-exists-p, wl-deactivate-region, wl-read-buffer): Likewise. * wl-vars.el (wl-biff-state-indicator-on) (wl-biff-state-indicator-off, wl-highlight-folder-with-icon) (wl-demo-display-logo): Likewise. 2016-11-11 Kazuhiro Ito * wl-vars.el (wl-message-truncate-lines) (wl-draft-truncate-lines): Refer to truncate-lines if default-truncate-lines is not bound. Cf. [wl-en:6329], https://github.com/wanderlust/wanderlust/issues/132 2016-10-30 Kazuhiro Ito * wl-vars.el (wl-draft-send-confirm-type): Revert default value on XEmacs. wl-y-or-n-p-with-scroll can't handle wl-read-event-char's return value on XEmacs. Cf. [wl:14661] 2016-10-18 Tatsuya Kinoshita * wl-summary.el (wl-summary-mode-menu-spec): Fix error on XEmacs. 2016-09-22 Kazuhiro Ito * wl-util.el (wl-regexp-opt, wl-expand-newtext): Obsolete. use elmo-regexp-opt, elmo-expand-newtext respectively. * wl-draft.el (wl-draft-setup): Likewise. * wl-expire.el (wl-expire-archive-number1) (wl-expire-archive-number2, wl-expire-archive-date) (wl-expire-localdir-date, wl-expire-folder): Likewise. * wl-refile.el (wl-refile-evaluate-rule): Likewise. * wl-summary.el (wl-summary-cursor-move-surface): Likewise. 2016-09-11 Kazuhiro Ito * wl-spam.el (wl-summary-register-as-spam-all) (wl-summary-register-as-good-all): Confirm before execution. Cf. https://github.com/wanderlust/wanderlust/issues/125 2016-08-29 Piotr Trojanek * wl-summary.el (wl-summary-mode-menu-spec): add summary menu entry for wl-summary-delete-region. 2016-08-27 Piotr Trojanek * wl-util.el (wl-delete-duplicates): remove useless re-initialization of hashtable vector. 2016-08-21 Piotr Trojanek * wl-addrmgr.el: Fix docstrings. 2016-07-14 Kazuhiro Ito * wl-vars.el (wl-biff-use-idle-timer): Update docstring. (wl-biff-check-delay): New customizable variable. (wl-biff-check-interval): Change variable type from integer to number. * wl-util.el (wl-biff-launch-handler) [Emacs]: New function. (timer-next-integral-multiple-of-time) [Emacs]: Removed. (wl-biff-start) [Emacs]: Run non-repeat timer. Use wl-biff-launch-handler instead of wl-biff-event-handler when wl-biff-use-idle-timer is nil. (wl-biff-event-handler) [Emacs]: Start next timer here. 2016-07-13 Kazuhiro Ito * wl-util.el (wl-biff-start, wl-biff-stop, wl-biff-event-handler) [Emacs]: Periodically check new mail even when wl-biff-use-idle-timer is non-nil and Emacs keeps idle for a long time on Emacs 22 or later. 2016-07-13 Kazuhiro Ito * wl-util.el (wl-biff-event-handler): Handle errors of wl-biff-check-folders function. 2016-04-30 Kazuhiro Ito * wl.el (wl-init): Add `elmo-quit' into kill-emacs-hook. (wl-exit): Remove `elmo-quit' from kill-emacs-hook. Cf. http://emacs.stackexchange.com/questions/21819/wanderlust-save-restore-queued-operations-accross-sessions 2016-04-03 Kazuhiro Ito * wl-summary.el (wl-summary-pack-number): Do not rescan if current folder does not support packing numbers. 2016-04-01 Kazuhiro Ito * wl-util.el (wl-read-buffer): Remove 4th argument PREDICATE, because Wanderlust doesn't use it and Emacs 24 and earlier don't support it. 2016-03-31 Kazuhiro Ito Suppress too frequent progress report. * wl-vars.el (wl-progress-update-interval): New variable. * wl-util.el (wl-progress-next-update-time): New variable. (wl-progress-set-next-update-time): Ne wfunction. (wl-progress-callback-function): Use them. 2016-03-30 Kazuhiro Ito * wl-summary.el (wl-summary-sync-update): Revert the last change. (wl-summary-delete-messages-on-buffer): Exit loop when all target message are deleted. * wl-vars.el (wl-display-progress-threshold): Ditto. 2016-03-16 Kazuhiro Ito * wl-summary.el (wl-summary-sync-update): Add MESSAGE argument for elmo-list-diff. 2016-03-15 Kazuhiro Ito * wl-vars.el (wl-display-progress-threshold): Define value for elmo-list-diff. 2016-03-13 Kazuhiro Ito * wl-summary.el (wl-summary-jump-to-msg): Refactored. 2016-03-13 Kazuhiro Ito * wl-summary.el (wl-summary-delete-messages-on-buffer): Report progress. Improve performance of deleting many messages on sequential view. 2016-03-13 Kazuhiro Ito Fix duplicated default value in promprt for read-buffer function. * wl-util.el (wl-read-buffer): New function. * wl-draft.el (wl-draft-mimic-kill-buffer): Use it * wl-folder.el (wl-folder-mimic-kill-buffer): Use it. 2016-03-09 Kazuhiro Ito * wl-summary.el (wl-summary-rescan, wl-summary-sync-update): Fix miscount of TOTAL value for elmo-with-progress-display. (wl-summary-insert-line, wl-summary-insert-thread): Do not call elmo-progress-notify here. (wl-summary-insert-message): Call elmo-progress-notify here. 2016-03-05 Kazuhiro Ito * wl-vars.el (wl-message-buffer-name): Define type. 2016-03-05 Kazuhiro Ito * wl-score.el (wl-score-set-mark-below) (wl-score-set-expunge-below, wl-score-get-header-entry): Use elmo-read-number. * wl-thread.el (wl-thread-jump-to-msg): Likewise. 2016-03-02 Kazuhiro Ito * wl-demo.el (wl-demo): Minor refactoring. 2016-03-02 Kazuhiro Ito * wl-draft.el (wl-draft-insert-get-message): User DEF parameter for completing-read. * wl-summary.el (wl-summary-input-range): Remove redundant use of internal variable. 2016-01-30 Kazuhiro Ito * wl-mime.el (wl-draft-yank-current-message-entity): Move point to the beginning of a message buffer before calling mime-preview-follow-current-entity. It prevents wl-summary-reply-with-citation from citing hidden entity. 2015-12-28 Kazuhiro Ito * wl-summary.el (wl-summary-target-mark-threads): New function. (wl-summary-mode-map): Assign "mT" to it. 2015-11-19 Yasushi SHOJI * wl-folder.el (wl-folder-goto-folder-subr): Let-bind this-command variable to the current value. This change fixes the problem with ido-migemo. Cf. https://github.com/wanderlust/wanderlust/issues/109 2015-10-03 Kazuhiro Ito * wl-qs.el (wl-quicksearch-goto-search-folder-subr): Set INTERACTIVE argument for wl-summary-goto-folder-subr. 2015-10-03 Kazuhiro Ito * wl-qs.el: Do not modify elmo-imap4-search-keys. 2015-10-03 Kazuhiro Ito * wl-qs.el (wl-quicksearch-goto-search-folder-subr): Use default scan-type for wl-summary-goto-folder-subr. 2015-10-03 Kazuhiro Ito * wl-qs.el (wl-quicksearch): New customization group. (wl-quicksearch-folder): Fix :type. (wl-quicksearch-gmail-servers): New variable. (wl-quicksearch-goto-search-folder): Use Gmail's raw search only for imap servers its name is matched with wl-quicksearch-gmail-servers. 2015-10-03 Kazuhiro Ito * wl-qs.el (wl-quicksearch-goto-search-folder): Ask gmail query only when plugged. 2015-10-03 Kazuhiro Ito Fix the case quicksearch is caled from Summary buffer. * wl-qs.el (wl-quicksearch-goto-search-folder-subr): New function. (wl-quicksearch-goto-search-folder): use it instead of direct calling wl-folder-goto-folder-subr. 2015-10-03 Kazuhiro Ito * wl-qs.el: Remove key definitions. (wl-quicksearch-goto-search-folder-wrapper): Add autoload cokkie. * wl.el: Define autload for wl-quicksearch-goto-search-folder-wrapper. * wl-folder.el (wl-folder-mode-menu-spec, wl-folder-mode-map): Add key bindings for wl-quicksearch-goto-search-folder-wrapper. * wl-summary.el (wl-summary-mode-menu-spec, wl-summary-mode-map): Likewise. 2015-10-03 Kazuhiro Ito * wl-qs.el (wl-quicksearch-goto-search-folder): [elmo-folder] Fix error. 2015-09-13 Erik Hetzner * wl-qs.el: New file. Adds a quick search feature for searching an email archive. 2015-08-09 Kazuhiro Ito * wl-draft.el (wl-draft-jit-highlight, wl-draft-idle-highlight): Integrated into new variable `wl-draft-real-time-highlight'. (wl-draft-jit-highlight): New function. (wl-draft-idle-highlight): Renamed to wl-draft-real-time-highlight. (wl-draft-real-time-highlight): New variable and function. (wl-draft-yank-from-mail-reply-buffer) (wl-draft-prepare-edit, wl-draft-reedit, wl-draft-config-exec) (wl-draft-highlight, wl-user-agent-compose-internal) (wl-draft-idle-highlight-timer) (wl-draft-idle-highlight-set-timer): Adjusted. * wl-e21.el (wl-draft-mode-setup): Adjusted. Register `wl-draft-jit-highlight' for jit-lock highlighting. * wl-highlight.el (wl-highlight-message): Adjusted. * wl-template.el (wl-template-apply): Adjusted. 2015-07-25 David Maus * wl.el (wl-init): Do not set `elmo-no-subject' and `elmo-no-from' if respective wl-* variables are of the wrong type. 2015-07-25 David Maus * wl.el (wl-check-environment): Warn if `wl-summary-no-from-message' or `wl-summary-no-subject-message' is not a string. 2015-07-18 David Maus * wl.el (wl-init): Retain default value of `elmo-no-subject' and `elmo-no-from' when respective wl-* variables are nil. 2015-07-11 Kenichi OKADA * wl-folder.el (wl-folder-suspend): Hide all related buffers. 2015-06-18 Juliusz Chroboczek * wl-draft.el (wl-draft-default-jit-highlight): Extend region to EOL, completes previous fix for Emacs 25. 2015-05-24 Juliusz Chroboczek * wl-draft.el (wl-draft-default-jit-highlight): Move to BOL before fontifying, this fixes Emacs 25. 2015-03-08 Kazuhiro Ito * wl.el (wl-check-environment): Checking Message-ID part is almost rewritten. 2015-03-07 Kazuhiro Ito * wl.el (wl-check-environment): Check wl-from more strictly. 2015-03-01 David Maus * wl-summary.el (wl-summary-save): Make sure that filename is inside `wl-save-dir'. (wl-summary-save): Use absolute filename when checking if a file with the same name already exists. 2015-02-21 Kazuhiro Ito * wl-mime.el (wl-draft-show-attributes-buffer): Allocate one more line for the case that wl-draft-preview-attributes-buffer-lines is negative. 2015-02-21 Kazuhiro Ito * wl-mime.el (wl-draft-attribute-nntp-posting-function) (wl-draft-attribute-nntp-posting-user) (wl-draft-attribute-nntp-posting-stream-type) (wl-draft-attribute-show-nntp-settings-functions) (wl-draft-attribute-nntp-method-table) (wl-draft-attribute-nntp-method) (wl-draft-attribute-nntp-settings): New functions and varaibles. * wl-vars.el (wl-draft-preview-attributes-list): Adjusted to use them. 2015-02-21 Kazuhiro Ito Suppress PGP processing while previewing. If you need a previous behavior, set wl-draft-preview-process-pgp to t. * wl-vars.el (wl-draft-preview-process-pgp): New variable. (wl-draft-preview-attributes-list): Display PGP processing information. * wl-mime.el (wl-draft-attribute-pgp-processings): New function. (wl-draft-preview-pgp-processing): New buffer-local variable. (wl-draft-preview-message): Suppress PGP processings when wl-draft-preview-process-pgp is nil. 2015-02-11 Kazuhiro Ito * wl-vars.el (wl-default-draft-cite-date-format-string): Set default to t. (wl-default-draft-cite-no-date-string) (wl-default-draft-cite-no-author-string): New variables. (wl-default-draft-cite-header-format-string): Strip leading "On " from default. (wl-default-draft-cite-time-locale): Fix typo of docstring. * wl-draft.el (wl-default-draft-cite): Adjusted for above changes. 2015-02-03 Kazuhiro Ito * wl-vars.el (wl-default-draft-cite-time-locale): New variable. * wl-draft.el (wl-default-draft-cite): Override system-time-locale with wl-default-draft-cite-time-locale. 2015-02-03 Kazuhiro Ito Citation header is now customizable. * wl-vars.el (wl-default-draft-cite-header-format-string): New variable. * wl-draft.el (wl-default-draft-cite): Use it. 2015-02-03 Kazuhiro Ito * wl-vars.el (wl-default-draft-cite-date-format-string): When non-string and non-nil, specify to call wl-make-date-stirng function. * wl-draft.el (wl-default-draft-cite): Likewise. 2015-02-02 Kazuhiro Ito * wl-e21.el (wl-make-date-string): Accept optional argument TIME. * wl-util.el (wl-make-date-string): Likewise. * wl-xmas.el (wl-make-date-string): Likewise. 2015-02-02 Kazuhiro Ito * wl-vars.el (wl-default-draft-cite-date-format-string): Contains only date representing string. Nil means to use original header's date field (previous behavior). * wl-draft.el (wl-default-draft-cite): Fix format string for citation header according to the above change. Handle the case that wl-default-draft-cite-date-format-string is nil. 2015-01-26 Erik Hetzner * wl-draft.el (wl-default-draft-cite): Fix typo. 2015-01-22 Erik Hetzner * wl-draft.el (wl-default-draft-cite): Support custom date format string. (wl-default-draft-cite): Use it. 2014-11-09 Erik Hetzner * wl-vars.el (wl-icon-directory): Support loading icons from icons/ dir in package (for MELPA). 2014-11-15 Kazuhiro Ito Remove '1' argument for forward-char, backward-char and forward-line. Use following-char and preceding-char preferredly. * wl-action.el (wl-summary-target-mark-set-action) (wl-summary-collect-temp-mark) (wl-summary-exec-action-resend-subr, wl-summary-remove-argument) (wl-summary-collect-numbers-region, wl-summary-print-argument) (wl-summary-unmark-region, wl-summary-mark-region-subr) (wl-summary-delete-all-mark): Likewise. * wl-address.el (wl-address-make-alist-from-alias-file): Likewise. * wl-draft.el (wl-draft-get-header-delimiter, wl-draft-save) (wl-draft-delete-fields, wl-draft-get-fcc-list) (wl-draft-body-goto-top, wl-user-agent-insert-body): Likewise. * wl-fldmgr.el (wl-fldmgr-cut-region, wl-fldmgr-copy-region): Likewise. * wl-folder.el (wl-folder-next-entity) (wl-folder-next-entity-skip-invalid, wl-folder-move-path) (wl-folder-check-region, wl-folder-sync-region) (wl-folder-mark-as-read-all-region): Likewise. * wl-highlight.el (wl-highlight-folder) (wl-highlight-folder-path, wl-highlight-summary) (wl-highlight-signature-search-simple, wl-highlight-message): Likewise. * wl-message.el (wl-message-narrow-to-page) (wl-message-uu-substring, wl-message-header-narrowing-1): Likewise. * wl-score.el (wl-score-string, wl-score-followup): Likewise. * wl-summary.el (wl-summary-update-mark-and-highlight-window) (wl-summary-prefetch-region-no-mark) (wl-summary-number-list-from-region) (wl-summary-resume-cache-status, wl-summary-update-status-marks) (wl-summary-jump-to-msg, wl-summary-make-number-list) (wl-summary-goto-bottom-of-sub-thread) (wl-summary-delete-all-temp-marks) (wl-summary-cursor-move-surface, wl-summary-save-region): Likewise. * wl-thread.el (wl-thread-open-all) (wl-thread-delete-line-from-buffer, wl-thread-delete-message) (wl-thread-goto-bottom-of-sub-thread) (wl-thread-remove-argument-region) (wl-thread-print-argument-region, wl-thread-close) (wl-thread-update-indent-string-region): Likewise. * wl-util.el (wl-set-string-width, pp-to-string): Likewise. * wl.el (wl-plugged-drawing, wl-plugged-redrawing-switch) (wl-plugged-change, wl-plugged-toggle) (wl-plugged-move-to-previous): Likewise. 2014-11-15 Kazuhiro Ito * wl-fldmgr.el (wl-fldmgr-delete-entity-hashtb): Remove redundant code. * wl-summary.el (wl-summary-sync-update): Likewise. 2014-11-14 Kazuhiro Ito * wl-util.el (wl-biff-event-handler): Do not skip idle-timer. Avoid direct access for timer's parameter if possible. Cf. https://github.com/wanderlust/wanderlust/pull/52 https://github.com/wanderlust/wanderlust/pull/84 https://github.com/wanderlust/wanderlust/pull/85 2014-11-08 Kazuhiro Ito * wl-folder.el (wl-folder-pick): Call elmo-folder-search with setting NUMBERS to t. * wl-summary.el (wl-summary-pick): Call elmo-folder-search with setting NUMBERS to t if FROM-LIST is not specified. 2014-10-27 Kazuhiro Ito * wl-mime.el (wl-mime-pgp-verify-region-with-epg): Set epa-info-buffer's buffer to the current buffer when the buffer is displyed. 2014-09-06 Kazuhiro Ito * wl-action.el (wl-summary-get-dispose-folder): Minor refactoring. 2014-07-12 Kazuhiro Ito * wl-util.el (wl-repeat-string): Refactored. 2014-07-07 Kazuhiro Ito * wl-util.el (wl-draft-make-message-id-from-address-delimiter): New customizable variable. (wl-draft-make-message-id-from-address): Use it. Default delimiter is changed from "%" to "-". 2014-07-06 Kazuhiro Ito * wl-draft.el (wl-draft-send-mail-with-sendmail): Set buffer-file-coding-system to raw-text. let-bind select-safe-coding-system-function to nil before calling sendmail-send-it. Cf. https://github.com/wanderlust/wanderlust/issues/66 2014-07-03 Juliusz Chroboczek * wl-draft.el: Require wl-util, since we're using macros from there. 2014-06-09 David Maus * wl-draft.el (wl-draft-do-fcc): Open fcc folder before appending the message. 2014-05-30 Kazuhiro Ito * wl-refile.el (wl-refile-guess-by-msgid): Add the comment for old msgdb. 2014-05-25 David Maus * wl-draft.el (wl-draft-save, wl-draft-reedit) (wl-draft-buffer-change-number): Use draft folder petname if defined. * wl-util.el (wl-collect-draft): Use draft folder petname if defined. 2014-05-24 Kazuhiro Ito * wl-refile.el (wl-refile-guess-by-msgid): Check type of references field's value. 2014-05-18 Kazuhiro Ito * wl-summary.el (wl-summary-insert-thread): Report progress. 2014-05-18 Kazuhiro Ito * wl-summary.el (wl-summary-sync-update): Do not sort elmo-list-diff's result. 2014-05-17 Kazuhiro Ito * wl-refile.el (wl-refile-guess-by-msgid): Assume references field's value is list. 2014-05-17 Kazuhiro Ito * wl-summary.el (wl-summary-default-subject-filter): Minor refactoring. 2014-05-17 Kazuhiro Ito * wl-summary.el (wl-summary-delete-messages-on-buffer) (wl-summary-sync-update): Use elmo-sort-uniq-number-list instead of elmo-uniq-list. 2014-02-22 Kazuhiro Ito * wl-util.el (wl-biff-check-folder): Never return nil. 2014-02-08 Kazuhiro Ito * wl-mime.el (wl-mime-preview-application/pgp): Handle errors in decryption. 2014-01-06 Kazuhiro Ito * wl-mime.el (wl-draft-preview-message): Hide attribute whose value is nil. (wl-draft-attribute-show-smtp-settings-functions) (wl-draft-attribute-smtp-settings) (wl-draft-attribute-show-pop-before-smtp-settings-functions) (wl-draft-attribute-pop-before-smtp-settings) (wl-draft-attribute-hide-send-mail-method-functions) (wl-draft-attribute-send-mail-method-table) (wl-draft-attribute-send-mail-method): New functions and variables. * wl-vars.el (wl-draft-preview-attributes-list): Use them by default. 2014-01-04 Kazuhiro Ito * wl-mime.el (wl-draft-show-attributes-buffer): when wl-draft-preview-attributes-buffer-lines is negative or non-integer, calculate buffer's height from number of attributes. * wl-vars.el (wl-draft-preview-attributes-buffer-lines): Likewise. Now default is t. 2013-12-25 Kazuhiro Ito * wl-draft.el: Use NOERROR option of require funciton instead of condition-case. * wl-folder.el: Likewise. * wl-mime.el: Likewise. * wl-summary.el: Likewise. * wl-util.el: Likewise. 2013-12-23 Herbert J. Skuhra * wl.el (TOP, wl-init): Fix the case that wl-news.el does not exist, mostly run in expanded place. 2013-06-19 Kazuhiro Ito * wl-news.el.in: Explicitly specify file coding. * wl-vars.el: Likewise. 2013-02-11 Kazuhiro Ito * wl-e21.el (wl-draft-overload-menubar): Use wl-draft-insert-signature instead of insert-signature. * wl-mime.el (wl-mime-setup): Respect mime-setup-use-signature's value. * wl-mule.el (wl-draft-overload-menubar): Use mime-edit-insert-signature when mime-setup-use-signature is nil. 2013-02-11 Kazuhiro Ito * wl-e21.el (wl-draft-insert-signature): Define as alias to mime-edit-insert-signature when mime-setup-use-signature is nil. * wl-xmas.el (wl-draft-insert-signature): Likewise. 2012-12-31 Kazuhiro Ito * wl-mime.el (wl-mime-pgp-decrypted-buffers): New variable. (wl-mime-pgp-kill-decrypted-buffers): New function. (wl-mime-preview-application/pgp): Keep decrypted content until the message buffer is killed. 2012-11-17 Kazuhiro Ito * wl-util.el (wl-search-condition-fields): Add "Raw-Body". * wl-vars.el (wl-fldmgr-make-filter-default): Add entry for "Raw-Body" search. 2012-09-15 Kazuhiro Ito * wl-addrmgr.el (wl-addrmgr-mode): Set the value of bidi-paragraph-direction to left-to-right when needed. * wl-folder.el (wl-folder-mode): Ditto. * wl-summary.el (wl-summary-mode): Ditto. 2012-09-03 Kazuhiro Ito * wl-summary.el (wl-summary-put-alike): Require second argument COUNT. (wl-summary-insert-headers): Fix slowness on large summary and duplicated entries when last message is not a child of thread. Do not call unfolding function. 2012-08-28 David Maus * wl-action.el (wl-summary-read-folder): Use default folder if read folder is `wl-default-spec'. 2012-08-26 David Maus * wl-summary.el (wl-summary-input-range): Pass default value to `completing-read'. * wl-util.el (wl-read-search-condition-internal): Dto. * wl-action.el (wl-summary-read-folder): Dto. 2012-08-26 Kazuhiro Ito * wl-action.el (wl-summary-auto-refile): Use zerop instead of eq with 0. * wl-draft.el (wl-draft-send): Likewise. * wl-folder.el (wl-folder-update-unread): Likewise. * wl-summary.el (wl-summary-sync-update): Likewise. * wl-util.el (wl-url-nntp): Likewise. * wl.el (wl-plugged-toggle): Likewise. 2012-08-26 Kazuhiro Ito * wl.el (wl-plugged-toggle): Call `match-string' directly instead of `elmo-match-string'. * wl-address.el (wl-address-expand-aliases): Likewise. * wl-expire.el (wl-expire-archive-get-max-number): Likewise. * wl-folder.el (wl-create-folder-entity-from-buffer): Likewise. * wl-util.el (wl-url-news, wl-url-nntp): Likewise * wl-version.el (wl-extended-emacs-version) (wl-extended-emacs-version2, wl-extended-emacs-version3): Likewise. Do not require elmo-date.el 2012-08-20 Kazuhiro Ito * wl-vars.el (wl-message-id-hash-function): New customizable variable. * wl-util.el (wl-draft-make-message-id-from-address): New function. (wl-draft-make-message-id-string): Use it. 2012-08-19 Kazuhiro Ito * wl-vars.el (wl-unique-id-suffix): Fix docstring. 2012-08-19 Kazuhiro Ito * wl-util.el (wl-draft-make-message-id-string): When wl-message-id-use-message-from is non-nil, make string from buffer's From field value prior to wl-from. Use lexical analyzer to extract mailing address. * wl-vars.el (wl-message-id-use-message-from): New customizable variable. Obsolete `wl-message-id-use-wl-from'. 2012-08-01 Kazuhiro Ito * wl-draft.el (wl-draft-forward, wl-draft-reply) (wl-draft-add-in-reply-to, wl-draft-send-mail-with-qmail) (wl-draft-send-mail-with-smtp, wl-draft-send-mail-with-sendmail): Use elmo-get-message-id-from-header or elmo-get-message-id-from-buffer. * wl-summary.el (wl-summary-cancel-message) (wl-summary-supersedes-message): Likewise. 2012-07-31 David Maus * wl-draft.el (wl-smtp-extension-bind): Declare edebug spec to aid macro debugging. 2012-07-26 Kazuhiro Ito * wl-draft.el (wl-draft-self-reply-p): Do not assume buffer is narrowed to header. 2012-07-25 Kazuhiro Ito * wl-draft.el (wl-draft-self-reply-p): Call std11-fetch-field directly. 2012-06-16 Kazuhiro Ito * wl-draft.el (wl-draft-save): Delete the old draft after encoding to avoid data loss by Emacs crash. 2012-06-14 Kazuhiro Ito * wl-draft.el (wl-draft-idle-highlight-set-timer): Require timer.el. 2012-05-06 Kazuhiro Ito * wl-template.el (wl-template-select): Do not modify wl-draft-config-exec-flag (Reverted the change on 2011-01-09 by David Maus). We can make wl-draft-config-exec not to modify messages by a template which binds wl-draft-config-exec-flag to nil. 2012-04-28 Kazuhiro Ito * wl-highlight.el (wl-highlight-message): Check eobp after skipping invisible region. 2012-03-18 David Maus * wl-mime.el: Remove hard dependency on mime-pgp. * wl.el (wl-init): Remove hard dependency on wl-news. 2012-04-14 Kazuhiro Ito * wl-draft.el (wl-draft-config-exec): Suppress real-time highlighting. * wl-template.el (wl-template-apply): Likewise. * wl-highlight.el (wl-highlight-message): Refined. Fix the case of too big headers with body-only option. Avoid stop highlighting the case of wl-highlight-force-citation-header-regexp and/or wl-highlight-citation-prefix-regexp are nil. Highlight mail-header-separator only once. Skip invisible regions. 2012-04-12 Kazuhiro Ito Real-time draft highlighting is supported. * wl-draft.el (wl-draft-highlight): New function. Highlighting part of wl-draft-highlight-and-recenter are separated from it. (wl-draft-highlight-and-recenter): Likewise. (wl-draft-idle-highlight, wl-draft-idle-highlight-idle-time) (wl-draft-idle-highlight-function) (wl-draft-idle-highlight-timer): New variables. (wl-draft-idle-highlight, wl-draft-default-idle-highlight) (wl-draft-idle-highlight-timer) (wl-draft-idle-highlight-set-timer): New functions. * wl-e21.el (wl-draft-mode-setup): Enable idle highlighting. * wl-xmas.el (wl-draft-mode-setup): Ditto. 2012-04-07 Kazuhiro Ito * wl-draft.el (wl-smtp-extension-bind): Use elmo-get-network-stream-type. >>>>>>> master 2012-02-18 David Maus * wl-summary.el (wl-summary-save) (wl-summary-target-mark-uudecode): Fix incorrect usage of `read-file-name'. 2012-02-12 David Maus * wl-mime.el (wl-mime-save-content): Fix incorrect usage of `read-file-name'. 2012-01-01 TAKAHASHI Kaoru * wl-demo.el (wl-demo-copyright-notice): Add 2012. 2011-12-31 Kazuhiro Ito * wl-summary.el (wl-summary-target-mark-operation): Use wl-summary-set-persistent-mark-internal. 2011-09-12 Kazuhiro Ito * wl-vars.el (wl-draft-config-alist): Update ML's address. * wl-news.el.in (wl-news-send-news): Update bot's address. 2011-07-20 Katsumi Yamaoka * wl-e21.el (wl-e21-make-toolbar-buttons): No need to take care of the tool-bar default bindings for Emacs 24. 2011-07-15 Herbert J. Skuhra * wl-folder.el (wl-folder-open-unread-folder): Fix typo in message. 2011-07-10 David Maus * wl-draft.el (wl-draft-send-mail-with-sendmail): New function. Send mail with sendmail package. * wl-vars.el (wl-draft-send-mail-function): Add function to list of prepared send mail functions. 2011-06-19 Kazuhiro Ito * wl-folder.el (wl-folder-buffer-search-entity): Build search string out of loop. * wl-vars.el (wl-draft-send-confirm-type): Change default value to scroll-by-SPC/BS. * wl-util.el (wl-y-or-n-p-with-scroll): Do not use case(). 2011-06-05 David Maus * wl-draft.el (wl-draft-save): Obtain number of appended draft message by `elmo-folder-append-buffer', handle case UID of appended message could not be found. 2011-06-03 Erik Hetzner * wl-vars.el (wl-summary-line-format): Document missing control strings. 2011-05-24 Kazuhiro Ito * wl-summary.el (wl-summary-view-old-p): Small refining. * wl-thread.el (wl-thread-make-number-list): Do not assume `wl-thread-entity-list' is non-nil. 2011-05-23 Kazuhiro Ito * wl-mime.el: Do not require mime-pgp.el * wl-draft.el: Do not define autoload for `open-ssl-stream'. (wl-template): Require elmo-net.el. (wl-smtp-extension-bind): Respect `elmo-network-stream-type-alist' for over SSL/TLS connection. 2011-01-30 TAKAHASHI Kaoru * wl-demo.el (wl-demo-copyright-notice): Add 2011. 2011-01-29 David Maus * wl-draft.el (wl-user-agent-compose): Add optional argument RETURN-ACTION, introduced to `compose-mail' in Emacs 24. 2011-01-09 David Maus * wl-template.el (wl-template-select): Reset draft config exec flag when selecting template. 2010-10-18 Katsumi Yamaoka * wl-summary.el (wl-summary-mode): Check with fboundp before calling `make-local-hook'. * wl-mime.el (wl-draft-preview-message): Ditto. 2010-09-18 Katsumi Yamaoka * wl-demo.el: Prune functions provided temporarily to avoid compile warnings in the end. 2010-09-08 Tetsurou Okazaki * wl-spam.el (wl-spam-register-spam-messages): Put spam mark on the registered messages unless specified folder is a spam folder. Add docstring. (wl-spam-register-good-messages): Remove spam mark from the registered messages. Add docstring. (wl-summary-register-as-spam) (wl-summary-register-as-spam-region, wl-thread-register-as-spam) (wl-summary-register-as-spam-all) (wl-summary-target-mark-register-as-spam) (wl-summary-register-as-good) (wl-summary-register-as-good-region, wl-thread-register-as-good) (wl-summary-register-as-good-all) (wl-summary-target-mark-register-as-good): Add docstring. 2010-08-31 TAKAHASHI Kaoru * wl-summary.el: Delete trailing whitespace. 2010-08-27 Kenichi Okada * wl-summary.el (wl-summary-prefetch-msg): Make the confirmation message human-readable. 2010-08-26 TAKAHASHI Kaoru * wl-e21.el (wl-draft-insert-signature): Fix comment style. (wl-highlight-folder-current-line): Ditto. * wl-xmas.el (wl-draft-insert-signature): Ditto. (wl-highlight-folder-current-line): Ditto. 2010-08-24 TAKAHASHI Kaoru * wl-address.el (wl-address-make-alist-from-alias-file): Use `(delete-char -1)' instead of `(delete-backward-char 1)' that deletes region in Emacs 24. See delete-active-region described in NEWS. * wl-draft.el (wl-draft-insert-mail-header-separator): Ditto. * wl-summary.el (wl-summary-update-persistent-mark): Ditto. 2010-08-14 David Maus * wl-summary.el (wl-summary-mode-menu-spec): Add menu option to edit draft message when in draft folder. 2010-07-21 Katsumi Yamaoka * wl-summary.el (wl-summary-put-temp-mark): Use (delete-char -1) instead of (delete-backward-char 1) that deletes region in Emacs 24. See delete-active-region described in NEWS. 2010-05-25 Tetsurou Okazaki * wl-spam.el (wl-summary-register-as-spam-region) (wl-thread-register-as-spam, wl-summary-register-as-good-region) (wl-thread-register-as-good): New functions. (wl-spam-setup): Bind "rks", "rkn", "tks" and "tkn". 2010-04-28 Vitaly Mayatskikh * wl-e21.el (wl-e21-setup-toolbar): Don't define vector with images for the icon if there is only one image. 2010-03-17 Katsumi Yamaoka * wl-draft.el (wl-user-agent-insert-body): Make sure body ends with newline. (wl-user-agent-compose, wl-user-agent-compose-internal): Fix regexps so as to match header tokens strictly. 2010-02-16 Tetsurou Okazaki * wl-spam.el (wl-summary-test-spam): Call `wl-summary-unmark-spam' for the message not classified as spam. (wl-summary-test-spam-messages): New function. (wl-summary-test-spam-region): Use `wl-summary-test-spam-messages' instead of `wl-spam-map-spam-messages'. 2010-02-08 Tetsurou Okazaki * wl-action.el (wl-summary-action-unmark-docstring): New inline function. (wl-summary-define-mark-action): Define unmark functions. (wl-summary-unmark): Add the second argument `mark'. (wl-summary-delete-all-mark): Pass `mark' to `wl-summary-unmark'. 2010-01-25 Vitaly Mayatskikh * wl-draft.el (wl-draft-send-confirm-with-preview): Inhibit pgp autodecryption for draft preview. 2010-01-19 Vitaly Mayatskikh * wl-summary.el (toplevel): New function `wl-summary-toggle-mime-buttons' and keybinding to toggle visibility of MIME buttons in message view mode. 2010-01-15 Vitaly Mayatskikh * Version number is increased to 2.15.9. 2010-01-06 TAKAHASHI Kaoru * wl-score.el (wl-score-followup): Remove verbose comment (same as docstring). * wl-summary.el (wl-summary-update-persistent-mark-on-event): Revert `save-excursion' for `wl-summary-jump-to-msg'. 2010-01-05 TAKAHASHI Kaoru * wl.el (wl-toggle-plugged, wl-plugged-dop-queue-info) (wl-plugged-exit, wl-exit): Fix comment-out style. Use three semicolons, that should start at the left margin. See. also (Info-goto-node "(elisp)Comment Tips"). * wl-acap.el (wl-acap-store): Ditto. * wl-action.el (wl-summary-unset-mark): Ditto. * wl-address.el (wl-address-ldap-search): Ditto. * wl-demo.el (wl-demo-insert-image): Ditto. * wl-dnd.el (wl-dnd-set-drag-starter): Ditto. * wl-draft.el (wl-draft-normal-send-func, wl-draft-send) (wl-draft-previous-history-element): Ditto. * wl-e21.el (wl-draft-key-setup, wl-draft-overload-functions): Ditto. * wl-folder.el (toplevel, wl-folder-mode-menu-spec) (wl-folder-mode-map, wl-folder-get-prev-folder) (wl-folder-jump-to-current-entity, wl-folder-check-entity) (wl-folder-check-entity-async) (wl-create-folder-entity-from-buffer): Ditto. * wl-fldmgr.el (toplevel): Ditto. * wl-message.el (wl-message-buffer-cache-sort) (wl-message-redisplay, wl-message-buffer-prefetch-clear-timer): Ditto. * wl-mule.el (wl-draft-key-setup, wl-draft-overload-functions): Ditto. * wl-summary.el (toplevel, wl-summary-mode) (wl-summary-edit-addresses, wl-summary-sync-update) (wl-summary-stick): Ditto. * wl-thread.el (toplevel, wl-thread-insert-message) (wl-thread-insert-entity-sub, wl-thread-open-close): Ditto. * wl-util.el (toplevel): Ditto. * wl-xmas.el (wl-draft-key-setup, wl-draft-overload-functions): Ditto. 2010-01-04 TAKAHASHI Kaoru * Version number is increased to 2.15.8. * wl-message.el (wl-message-uu-substring): Suppress compile warnings; Use `with-current-buffer' instead of `save-excursion' & `set-buffer'. * wl-mime.el (wl-draft-yank-current-message-entity) (wl-mime-preview-follow-no-mime) (wl-mime-preview-follow-current-region): Ditto. * wl-summary.el (wl-summary-update-persistent-mark-on-event) (wl-summary-switch-to-clone-buffer) (wl-summary-target-mark-forward) (wl-summary-target-mark-reply-with-citation) (wl-summary-target-mark-uudecode): Ditto. * wl-addrmgr.el (wl-addrmgr-replace-field): Use `point-at-bol'. * wl-action.el (wl-summary-remove-argument): Explicit `point-at-bol'. * wl-summary.el (wl-summary-narrow-to-region) (wl-summary-insert-line): Use `point-at-bol', `point-at-eol'. * wl.el (wl-plugged-sending-queue-status): Use `number-to-string' instead of `int-to-string'. * wl-dnd.el (wl-dnd-start-drag): Ditto. * wl-score.el (wl-score-insert-help, wl-summary-increase-score): Ditto. * wl-summary.el (wl-summary-jump-to-msg, wl-summary-save): Ditto. * wl-util.el (wl-url-nntp): Ditto. * wl.el (wl-plugged-set-variables, wl-plugged-dop-queue-info) (wl-plugged-dop-queue-status): Don't quote `lambda'. * wl-thread.el (wl-thread-delete-message): Ditto * wl-summary.el (wl-summary-edit-addresses) (wl-summary-edit-addresses-collect-candidate-fields) (wl-summary-search-by-subject): Ditto. * wl-mime.el (wl-mime-node-id-to-string): Ditto. * wl-fldmgr.el (wl-fldmgr-add-completion-all-completions) (wl-fldmgr-add-completion-subr): Ditto. * wl-draft.el (wl-smtp-extension-bind) (wl-draft-insert-get-message, wl-draft-default-headers) (wl-jump-to-draft-buffer): Ditto. * wl-summary.el (wl-summary-cursor-move-surface, wl-summary-up) (wl-summary-down): Ditto. * wl-message.el (wl-message-buffer-prefetch-subr): Ditto. * wl-draft.el (wl-draft-reply, wl-draft-write-sendlog): Ditto. * wl-folder.el (wl-folder-make-save-access-list) (wl-folder-update-access-group, wl-folder-pick): Ditto. 2010-01-02 TAKAHASHI Kaoru * wl-draft.el (wl-draft-default-headers): Suppress warning "defsubst `wl-draft-default-headers' was used before it was defined"; Use `defun' instead of `defsubst'. * wl-address.el (wl-address-header-extract-address) (wl-address-header-extract-realname): Fix mail-address in docstring. * wl-expire.el (wl-expire-make-sortable-date): Macro to inline-function. * wl-folder.el (wl-folder-unread-regex, wl-folder-buffer-group-p): Macro to function. (wl-folder-get-entity-from-buffer): Macro to function. * wl-util.el (wl-match-string, wl-match-buffer): Macro to function. * wl-summary.el (wl-summary-message-status): Macro to inline-function. * wl.el (wl-plugged-string): Macro to function. * wl-highlight.el (wl-delete-all-overlays): Macro to function. * wl-summary.el (wl-summary-get-alike): Macro to inline-function. (wl-summary-buffer-folder-name, wl-summary-sticky-buffer-name): Macro to function. * wl-thread.el (wl-thread-open, wl-thread-close): Use `point-at-bol', `point-at-eol'. * wl.el (wl-plugged-server-indent, wl-plugged-drawing) (wl-plugged-redrawing-switch, wl-plugged-toggle): Use `(string-to-char " ")' instead of `? ', `?\ '. * wl-action.el (wl-summary-print-argument): Ditto. * wl-address.el (wl-complete-field-body): Ditto. * wl-demo.el (wl-demo-insert-image): Ditto. * wl-summary.el (wl-summary-edit-addresses-subr): Ditto. * wl-util.el (wl-ask-folder, wl-set-string-width) (wl-y-or-n-p-with-scroll): Ditto. * wl-addrmgr.el(wl-addrmgr-mark-write): Use `string-to-char' instead of `? '. Use `point-at-bol' and `point-at-eol'. Remove verbose point move. * wl-address.el (wl-address-add-or-change): Use `point-at-bol' and `point-at-eol'. * wl-addrmgr.el (wl-addrmgr-unmark, wl-addrmgr-address-entry): Ditto. 2010-01-01 TAKAHASHI Kaoru * wl-util.el (wl-count-lines): Use `point-at-bol' instead of `(beginning-of-line) (point)'. * wl-fldmgr.el (wl-fldmgr-make-indent): Change from macro to function. (wl-fldmgr-delete-line): Change from macro to function. Use `point-at-bol' and `point-at-eol'. * wl.el (toplevel): Use `mapc' instead of `mapcar'. Don't use `function' for lambda. * wl.el (wl-plugged-server-indent): Change from macro to function. * wl-score.el (wl-score-put-alike): Explicit add `alike' argument. * wl-draft.el (wl-draft-config-body-goto-header) (wl-draft-body-goto-top, wl-draft-body-goto-bottom): Change from macro to function. * wl-score.el (wl-score-get-alike): Change from macro to inline-function. * wl-util.el (wl-collect-summary, wl-kill-buffers): Use `mapc' instead of `mapcar'. Don't use `function' for lambda. (wl-read-search-condition-internal): Don't use `function' for lambda. (wl-kill-buffers): Change from macro to function. (wl-count-lines): Change from macro to inline-function. * wl-draft.el (wl-draft-reply): Use `elmo-parse' instead of `wl-parse'. * wl-draft.el (wl-draft-do-fcc): Use `with-temp-buffer'. * wl.el (wl-plugged-change): Suppress compile warnings; Use `with-current-buffer' instead of `save-excursion' & `set-buffer'. * wl-action.el (wl-summary-exec-action-resend-subr): Ditto. * wl-address.el (wl-complete-window-show): Ditto. * wl-message.el (wl-message-select-buffer): Ditto. * wl-template.el (wl-template-show): Ditto. * wl-util.el (wl-collect-summary): Ditto. * wl-draft.el (wl-draft-add-in-reply-to, wl-draft-delete) (wl-draft-send-mail-with-smtp, wl-draft-send, wl-draft-do-fcc) (wl-draft-generate-clone-buffer, wl-draft-config-exec): Ditto. * wl-score.el (wl-score-insert-help, wl-score-edit-get-header) (wl-score-edit-insert-number): Ditto. * wl-util.el (wl-collect-summary): Use `eq' instead of `equal' for symbol. * wl-action.el (wl-summary-auto-refile): Use `goto-char' instead of `goto-line'. * wl-demo.el (wl-demo-copyright-notice): Add 2010. 2009-12-16 Lloyd Zusman * wl-summary.el (wl-summary-detect-mark-position): Force the temporary buffer to enable the use of multibyte characters within searches [wl-en:2460]. 2009-07-31 TAKAHASHI Kaoru * wl-summary.el (wl-summary-display-raw): Use `goto-char' instead of `beginning-of-buffer'. 2009-05-26 Vitaly Mayatskikh * wl-summary.el (wl-summary-display-raw): New function, display message in raw format. 2009-05-26 TAKAHASHI Kaoru * Version number is increased to 2.15.7. 2009-03-16 Tetsurou Okazaki * wl-summary.el (wl-summary-previous-message-number): New function. (wl-summary-next-message-number): Ditto. (wl-summary-default-get-next-msg): Use `wl-summary-previous-message-number' and `wl-summary-next-message-number'. (wl-summary-get-prev-unread-folder): Use `with-current-buffer' instead of `save-excursion'. Inline temporary variable `cur-id'. (wl-summary-get-next-unread-folder): Ditto. (wl-summary-get-next-folder): Ditto. (wl-summary-get-prev-folder): Ditto. Remove a local variable `last-entity'. 2009-01-01 TAKAHASHI Kaoru * wl-demo.el (wl-demo-copyright-notice): Add 2009. 2008-09-05 Kenichi Okada * wl-summary.el (wl-summary-buffer-folder-name) (wl-draft-config-body-goto-header): Use backquote instead of quote. * wl-draft.el (wl-draft-body-goto-top) (wl-draft-body-goto-bottom) (wl-draft-config-body-goto-header): Ditto. 2008-03-30 Tetsurou Okazaki * wl-mime.el (wl-message-decrypt-pgp-nonmime): Upcase "pgp" in the error message. (wl-message-verify-pgp-nonmime): Cause an error if no PGP signed region is found. 2008-03-07 TAKAHASHI Kaoru * wl-expire.el: Fix Comentary section. 2008-02-25 TAKAHASHI Kaoru * wl-mime.el: Add (eval-when-compile (require 'mmbuffer)). Require mime-parse, elmo-mime, and wl-util. * wl-summary.el: Add (eval-when-compile (require 'elmo-filter)). * wl-util.el: Add (eval-when-compile (require 'elmo-pop3)). 2008-02-20 TAKAHASHI Kaoru * wl-template.el: Require elmo-util and wl-vars. * wl-mime.el (wl-mime-display-header): Revert last change. Remove `delete-matching-lines "^$"'. 2008-02-19 TAKAHASHI Kaoru * wl-mime.el (wl-define-dummy-functions): Split `eval-when-compile' form for avoid error; when `make compile-strict. * wl-util.el: Move (eval-when-compile (require 'static)). * wl-dnd.el: Add (eval-when-compile (require 'static)). * wl-message.el: Ditto. * wl-mime.el (wl-message-delete-current-part): Use `insert-buffer-substring' instead of `insert-buffer'. * wl-summary.el (wl-summary-switch-to-clone-buffer): Ditto. * wl-draft.el (wl-draft-generate-clone-buffer) (wl-draft-do-mime-bcc): Ditto. * wl-address.el: Add (eval-when-compile (require 'cl)). * wl-addrmgr.el: Ditto. * wl-mime.el: Ditto. * wl-util.el: Ditto. * wl-score.el: Ditto. 2008-02-18 TAKAHASHI Kaoru * wl.el (wl-plugged-toggle): Use `string-to-number' instead of `string-to-int'. * wl-util.el (wl-unique-id): Use `string-to-number' instead of `string-to-int'. * wl-thread.el (wl-thread-jump-to-msg, wl-thread-set-parent): Use `string-to-number' instead of `string-to-int'. * wl-summary.el (wl-summary-get-list-info) (wl-summary-message-number): Use `string-to-number' instead of `string-to-int'. * wl-score.el (wl-score-overview-entity-get-lines) (wl-score-set-mark-below, wl-score-set-expunge-below) (wl-summary-increase-score, wl-score-get-header-entry): Use `string-to-number' instead of `string-to-int'. * wl-folder.el (wl-folder-update-diff-line): Use `string-to-number' instead of `string-to-int'. * wl-expire.el (wl-expire-archive-number2): Use `string-to-number' instead of `string-to-int'. * wl-draft.el (wl-jump-to-draft-folder): Use `string-to-number' instead of `string-to-int'. * wl-dnd.el (wl-dnd-drop-func): Use `string-to-number' instead of `string-to-int'. 2008-02-17 TAKAHASHI Kaoru * wl-util.el (wl-match-string, wl-match-buffer) (wl-as-coding-system, wl-as-mime-charset, wl-concat-list) (wl-kill-buffers, wl-local-variable-p) (wl-line-formatter-setup): New backquote style. (wl-count-lines): Use quote instead of backquote. * wl-summary.el (wl-summary-buffer-folder-name) (wl-summary-get-alike): Use quote instead of backquote. (wl-summary-sticky-buffer-name, wl-summary-put-alike): New backquote style. * wl-message.el (wl-message-buffer-cache-buffer-get) (wl-message-buffer-cache-folder-get) (wl-message-buffer-cache-message-get) (wl-message-buffer-cache-entry-make) (wl-message-buffer-cache-hit): New backquote style. * wl-folder.el (wl-folder-buffer-group-p): Use quote instead of backquote. (wl-folder-unread-regex, wl-folder-entity-exists-p) (wl-folder-clear-entity-info) (wl-folder-get-entity-info, wl-folder-set-entity-info) (wl-folder-elmo-folder-cache-get) (wl-folder-elmo-folder-cache-put): New backquote style. * wl-fldmgr.el (wl-fldmgr-get-entity-id): New backquote style. (wl-fldmgr-assign-id): Ditto. (wl-fldmgr-delete-line): Use quote instead of backquote. (wl-fldmgr-make-indent): Use `string-to-char' instead of `? '. * wl-draft.el (wl-smtp-extension-bind, wl-draft-sent-message-p) (wl-draft-set-sent-message): New backquote style. (wl-draft-body-goto-top, wl-draft-body-goto-bottom) (wl-draft-config-body-goto-header): Use quote instead of backquote. 2008-02-16 TAKAHASHI Kaoru * wl-address.el (wl-address-concat-token): Fix typo. 2008-02-15 TAKAHASHI Kaoru * wl-score.el (wl-score-put-alike): Use quote instead of backquote. (wl-score-get-alike): Ditto. * wl-vars.el: New backquote style. (wl-message-header-button-alist): Use quote instead of backquote. * wl.el (wl-plugged-string): New backquote style. * wl-address.el (wl-address-concat-token): New backquote style. * wl-expire.el (wl-expire-make-sortable-date): New backquote style. 2008-02-13 Tetsurou Okazaki * wl-highlight.el (wl-highlight-folder-opened-regexp) (wl-highlight-folder-closed-regexp): Include the beginning of a line. * wl-folder.el (wl-folder-group-regexp): Remove a redundant character in the character alternative. 2008-02-11 TAKAHASHI Kaoru * Version number is increased to 2.15.6. 2008-02-10 Daiki Ueno * wl-mime.el (wl-mime-pgp-decrypt-region-with-epg): Don't use optional 3rd argument of epg-context-set-progress-callback; it was temporarily removed in the Emacs trunk due to copyright problem. (wl-mime-pgp-verify-region-with-epg): Ditto. 2008-01-01 TAKAHASHI Kaoru * wl-demo.el (wl-demo-copyright-notice): Add 2008. 2007-12-15 Yoichi NAKAYAMA * wl-util.el (wl-biff-check-folders): Set biff flag. (from Naoto Morishima [wl:14031]) 2007-11-09 TAKAHASHI Kaoru * wl.el (wl-plugged-server-indent): Use quote instead of backquote. 2007-08-05 TAKAHASHI Kaoru * wl-score.el (wl-score-insert-header): Add guard for `std11-unfold-string'. (wl-score-ov-entity-get): Call 'elmo-message-entity-field' with TYPE artgument when TO or CC field. 2007-04-06 Hiroya Murata * wl-summary.el (wl-summary-goto-folder-subr): Call `elmo-folder-close' instead of `elmo-folder-commit' if discard current summary. 2007-03-08 Hiroya Murata * wl-util.el (wl-read-shell-commande): New function or alias. * wl-summary.el (wl-summary-pipe-message): Use `wl-read-shell-command' instead of `read-string'. (wl-summary-target-mark-pipe): Ditto. 2007-02-13 Yoichi NAKAYAMA * wl-summary.el (wl-summary-reply): Fix docstring. * wl-draft.el (wl-draft-reply): Ditto. 2007-02-05 Hiroya Murata * wl-mime.el (wl-summary-extract-attachments): New command. (wl-summary-extract-attachments-1): New internal function. 2007-01-14 Hiroya Murata * wl-expire.el (wl-expire-folder): New function (split from wl-summary-expire). (wl-summary-expire): Use it. Add argument `all' instead of remove `nolist'. Cause an error only if this function is calling interactively. 2007-01-09 Hiroya Murata * wl-expire.el (wl-expire-refile): Display progress message. (wl-summary-expire): Simplify. * wl-summary.el (wl-summary-delete-messages-on-buffer): Remove unused argument `deleting-info'. 2007-01-07 Hiroya Murata * wl-vars.el (wl-message-popup-buffers): New user option. * wl-mime.el (wl-message-delete-mime-out-buf): Abolish. (wl-message-delete-popup-windows): New function that substitues above one. (wl-mime-setup): Follow the above change. 2007-01-01 TAKAHASHI Kaoru * wl-demo.el (wl-demo-copyright-notice): Add 2007. 2006-12-08 Tetsurou Okazaki * wl-spam.el (wl-spam-setup): Bind "rkm" to wl-summary-spam-region and "tkm" to wl-thread-spam. 2006-12-02 Yoichi NAKAYAMA * wl-thread.el (wl-thread-entity-insert-as-children): Use wl-thread-entity-set-children. (wl-thread-insert-message, wl-thread-insert-entity-sub, wl-thread-insert-entity, wl-thread-close, wl-thread-open): Use wl-thread-entity-get-*. 2006-11-23 Hiroya Murata * wl-mime.el (wl-epg-progress-callback): New function. (wl-mime-pgp-decrypt-region-with-epg): Display progress message with `elmo-with-progress-display'. Set a progress callback function to epg-context. (wl-mime-pgp-verify-region-with-epg): Ditto. 2006-11-22 Hiroya Murata * wl-util.el (wl-completing-read-multiple): Define as an alias of `completing-read-multiple' if emacs-version is not less than 22. 2006-11-12 Hiroya Murata * wl-mime.el (wl-mime-pgp-verify-region-with-epg): Follow the API change. 2006-11-09 Hiroya Murata * wl-summary.el (wl-summary-sync-update): Move `wl-thread-update-indent-string-thread' to outside of `elmo-with-progress-display'. 2006-11-05 Yoichi NAKAYAMA * wl-message.el (wl-message-exit): Check buffer existence. 2006-10-31 Hiroya Murata * wl-util.el (wl-simple-display-progress): New function. (wl-display-progress-with-gauge): Ditto. (wl-progress-callback-function): Ditto. * wl.el (wl-init): Set `elmo-progress-callback-function' as `wl-progress-callback-function' * wl-vars.el (wl-display-progress-threshold): New user option. (wl-display-progress-function): Ditto. * Version number is increased to 2.15.5. 2006-09-28 Yoichi NAKAYAMA * wl-thread.el (wl-thread-close-children): New function. (wl-thread-open-children): Ditto. * wl-action.el (wl-summary-set-mark): Redo the last change by using it. * wl-action.el (wl-summary-set-mark): Undo the last change. Forbid interactive call. 2006-09-28 Hiroya Murata * wl-mime.el (wl-define-dummy-functions): New macro. (wl-mime-pgp-decrypt-region-with-epg): Renamed from `wl-mime-pgp-decrypt-region'. (wl-mime-pgp-verify-region-with-epg): Renamed from `wl-mime-pgp-verify-region'. (wl-mime-pgp-decrypt-region-with-pgg): Renamed from `wl-mime-pgp-decrypt-region'. (wl-mime-pgp-verify-region-with-pgg): Renamed from `wl-mime-pgp-verify-region'. (wl-mime-pgp-decrypt-region): New function; To select dispatch function at runtime. (wl-mime-pgp-verify-region): Ditto. * wl-vars.el (wl-use-pgp-module): New user option. 2006-09-25 Yoichi NAKAYAMA * wl-action.el (wl-summary-set-mark): If the cursor is on folded thread, open it (suggested by Greg A. Woods [wl-en:1861]). 2006-09-22 Yoichi NAKAYAMA * wl-summary.el (wl-summary-cleanup-temp-marks): Cleanup correctly even if there are target marks only. 2006-09-21 Hiroya Murata * Version number is increased to 2.15.4. 2006-09-01 Hiroya Murata * wl-folder.el (wl-folder-check-one-entity): Simplify. 2006-08-28 Yoichi NAKAYAMA * wl-message.el (wl-message-buffer-prefetch-timer): Removed unused variable. 2006-07-26 Tetsurou Okazaki * wl-spam.el (wl-thread-test-spam): New function. (wl-spam-setup): Bind "tkc". 2006-07-24 Hiroya Murata * wl-expire.el (wl-folder-expire-entity): Rewite without `wl-summary-goto-folder-subr'. (wl-folder-expire-current-entity): Don't kill summary buffer. 2006-07-21 Hiroya Murata * wl-folder.el (wl-folder-sync-entity): Rewrite without `wl-summary-goto-folder-subr'. (wl-folder-mark-as-read-all-entity): Likewise. * wl-summary.el (wl-summary-sync): Accept symbol for `range'. 2006-06-22 Yoichi NAKAYAMA * wl-thread.el (wl-thread-force-open): Arranged. 2006-06-19 Yoichi NAKAYAMA * wl-folder.el (wl-folder-complete-filter-condition): Remove ! from regexp. * wl-util.el (wl-search-condition-fields): Remove "AND","OR". (wl-read-search-condition-internal): Append them. 2006-06-19 Hiroya Murata * wl-vars.el (wl-additional-search-condition-fields): New user option. * wl-util.el (wl-search-condition-fields): New function; export from `wl-read-search-condition-internal'. (wl-read-search-condition-internal): Use it. * wl-folder.el (wl-folder-complete-filter-condition): Ditto. 2006-06-10 Hiroya Murata * wl-summary.el (wl-summary-define-sort-command): New function. (wl-summary-sort-by-date, wl-summary-sort-by-number) (wl-summary-sort-by-subject, wl-summary-sort-by-from) (wl-summary-sort-by-list-info, wl-summary-sort-by-size): Remove; define by `wl-summary-define-sort-command' at runtime. * wl.el (wl-init): Call wl-summary-define-sort-command. 2006-06-04 Hiroya Murata * wl-mime.el (wl-message-decrypt-pgp-nonmime): Keep text properties at the decrypting region. 2006-06-03 Hiroya Murata * wl-util.el (wl-find-region): New function. * wl-mime.el (wl-mime-pgp-decrypt-region): Return the decoded coding system. (wl-message-decrypt-pgp-nonmime): Use wl-find-region. Put text property `wl-mime-decoded-coding-system'. (wl-message-verify-pgp-nonmime): Use wl-find-region. Use text property `wl-mime-decoded-coding-system' to encode text. * wl-mime.el (wl-mime-pgp-decrypt-region): Display a progress message. (wl-mime-pgp-verify-region): Ditto. 2006-05-26 Hiroya Murata * wl-mime.el (wl-mime-pgp-verify-region): Does not use temporary buffer. Use epa-display-verify-result. 2006-05-18 Yoichi NAKAYAMA * wl-draft.el (wl-draft-send): Continue even if setting parent flag was failed. 2006-05-15 Hiroya Murata * wl-message.el (wl-message-flag-indicator): Fixed the problem of returning string only of parentheses. 2006-05-13 Hiroya Murata * wl-summary.el (wl-summary-write): Add argument `folder'. (wl-summary-write-current-folder): Change argument `folder' from optional to require. (wl-summary-get-buffer): Return the buffer associated folder only. * wl-folder.el (wl-folder-set-persistent-mark): Follow the above change. (wl-folder-toggle-disp-summary): Ditto. * wl-draft.el (wl-draft-create-buffer): Don't use folder of current summary as parent-folder. 2006-05-13 Yoichi NAKAYAMA * wl-draft.el (wl-draft-reedit): Don't overwrite wl-draft-parent-folder. 2006-05-04 Hiroya Murata * wl-mime.el (wl-mime-pgp-decrypt-region): New function. (wl-mime-pgp-verify-region): Ditto. (wl-message-decrypt-pgp-nonmime): Use the above function. (wl-message-verify-pgp-nonmime): Likewise. (wl-mime-preview-application/pgp): Likewise. 2006-04-20 Kenichi Okada * wl-folder.el (wl-make-plugged-alist): Add `wl-smtp-posting-port'. Fix about the order of `wl-nntp-posting-port' and `wl-nntp-posting-stream-type'. * wl.el (wl-plugged-port-label-alist): Add smtp. 2006-02-26 Hiroya Murata * wl-summary.el (wl-summary-message-status): New macro. * wl-vars.el (wl-summary-persistent-mark-priority-list): Add `killed'. (wl-summary-killed-mark): New user option. * wl-thread.el (wl-thread-update-line-on-buffer-sub): Follow the API change. (wl-thread-insert-entity-sub): Ditto. (wl-thread-recover-messages): New command. * wl-summary.el (wl-summary-update-mark-and-highlight-window): Don't call `wl-highlight-summary-current-line' directly. (wl-summary-buffer-attach): Connect to signal `status-changed' instead of `cache-changed'. (wl-summary-buffer-detach): Follow the above change. (wl-summary-detect-mark-position): Follow the API change. (wl-summary-rescan-message): Ditto. (wl-summary-insert-sequential): Ditto. (wl-summary-update-thread): Ditto. (wl-summary-message-mark): Ditto. (wl-summary-persistent-mark): Ditto. (wl-summary-create-line): Ditto. (wl-summary-prefetch-region-no-mark): Call `wl-summary-persistent-mark' with number. (wl-summary-recover-messages-region): New command. (wl-summary-target-mark-recover): Ditto. (wl-summary-recover-message): Ditto. (wl-summary-persistent-mark-string): Add argument `status' instead of remove arguments `flags' and `cached'. Treat killed status. (wl-summary-update-persistent-mark): Remove optional argument `flags'. * wl-highlight.el (wl-highlight-summary-displaying-face): New face. (wl-highlight-summary-line-face-spec): Treat killed status. (wl-highlight-summary-line-string): Follow the API change. (wl-highlight-summary-current-line): Ditto. * Version number is increased to 2.15.3. 2006-02-24 Hiroya Murata * wl-draft.el (wl-draft-find-reply-headers): Use functionp instead of symbolp to test whether the condition is function. 2006-02-24 Yoichi NAKAYAMA * wl-draft.el (wl-draft-send-confirm): Bind wl-draft-send-hook to nil. 2006-02-23 Hiroya Murata * wl-summary.el (wl-summary-buffer-message-ring): New internal variable. (wl-summary-buffer-last-displayed-msg): Abolish. (wl-summary-push-message): New function. (wl-summary-pop-message): Ditto. (wl-summary-goto-folder-subr): Reset `wl-summary-buffer-message-ring'. (wl-summary-pop-to-last-message): New command. (wl-summary-goto-last-displayed-msg): Call wl-summary-pop-to-last-message if optional argument is non-nil or the last command is itself. (wl-summary-redisplay-internal): Push last message number into `wl-summary-buffer-message-ring'. * wl-vars.el (wl-summary-message-ring-max): New user option. 2006-02-22 Hiroya Murata * wl-draft.el (wl-draft-find-reply-headers): New function (extract from `wl-draft-reply'). (wl-draft-reply): Use it. (wl-draft-find-reply-headers): Avoid compile warning. 2006-02-14 Yoichi NAKAYAMA * wl-thread.el (wl-thread-jump-to-msg): Add docstring. 2006-02-09 Hiroya Murata * wl-message.el (wl-message-flag-indicator): New function. (wl-message-redisplay): Use it. 2006-02-09 Yoichi NAKAYAMA * wl-draft.el (wl-smtp-extension-bind): Don't bind smtp-end-of-line. 2006-01-31 Hiroya Murata * wl-util.el (wl-y-or-n-p-with-scroll): Use `wl-read-event-char' instead of `read-event'. * wl-xmas.el (wl-read-event-char): Add optional argument `prompt'. * wl-mule.el (wl-read-event-char): Ditto. * wl-e21.el (wl-read-event-char): Ditto. 2006-01-30 Yoichi NAKAYAMA * wl-vars.el (wl-draft-send-confirm-type): Change default value. 2006-01-28 Hiroya Murata * wl-vars.el (wl-draft-send-confirm-type): New user option. * wl-util.el (wl-y-or-n-p-with-scroll): New function. * wl-draft.el (wl-draft-send-confirm): Confirmation by `wl-draft-send-confirm-type' 2006-01-26 Yoichi NAKAYAMA * wl-draft.el (wl-draft-save, wl-draft-buffer-change-number): Avoid error when the buffer name is already used. 2006-01-23 Yoichi NAKAYAMA * wl-vars.el (wl-message-buffer-prefetch-folder-type-list): Follow the change of elmo-nmz -> elmo-search. (wl-highlight-summary-line-help-echo-alist): Ditto. (wl-search-folder-icon): Renamed from `wl-nmz-folder-icon'. (wl-nmz-folder-icon): Define as obsolete. * wl-e21.el (wl-folder-internal-icon-list): Follow it. * wl-xmas.el (wl-folder-internal-icon-list): Ditto. 2006-01-22 Hiroya Murata * wl-summary.el (wl-summary-get-list-info): Rewrite with `elmo-find-list-match-value' 2006-01-15 Yoichi NAKAYAMA * wl-summary.el (wl-summary-get-list-info): Optimize. Use List-Id and List-Post also. 2006-01-14 Hiroya Murata * wl-draft.el (wl-draft-send-confirm): Scroll up/down by SPC/BS. 2006-01-01 TAKAHASHI Kaoru * wl-demo.el (wl-demo-copyright-notice): Add 2006. 2005-12-11 Hiroya Murata * wl-util.el (wl-completing-read-multiple-1): New internal function. (wl-completing-read-multiple-2): Ditto. (wl-completing-read-multiple): Define use above functions. * wl-summary.el (wl-summary-sort): Removed the workaround for a bug of `completing-read-multiple' about default value. * wl-xmas.el (wl-completing-read-multiple): Removed. * wl-mule.el (wl-completing-read-multiple): Ditto. * wl-e21.el (wl-completing-read-multiple): Ditto. 2005-12-10 Hiroya Murata * wl-util.el (wl-filter-associations): New function. * wl-spam.el (wl-spam-undecided-folder-list): New user option. (wl-spam-ignored-folder-list): Ditto. (wl-spam-ignored-folder-regexp-list): Set default value as nil. (wl-spam-string-member-p): New function. (wl-spam-domain): Use it. (wl-spam-split-numbers): New function. (wl-spam-apply-partitions): Ditto. (wl-spam-register-spam-messages): Use `folder' instead of `wl-summary-buffer-elmo-folder'. (wl-spam-register-good-messages): Ditto. (wl-summary-exec-action-spam): Decide a domain by real folder of message. (wl-summary-exec-action-refile-with-register): Likewise. 2005-11-12 Hiroya Murata * wl-e21.el (wl-e21-find-image): New function. (wl-e21-setup-toolbar): Use it instead of `find-image'. (wl-e21-highlight-folder-group-line): Ditto. (wl-folder-init-icons): Ditto. (wl-plugged-init-icons): Ditto. (wl-biff-init-icons): Ditto. 2005-11-09 Hiroya Murata * wl-util.el (wl-collect-draft): Rewrite with `dolist'. (wl-inhibit-save-drafts): New internal variable. (wl-disable-auto-save): Ditto. (wl-save-drafts): Treat above variables. (wl-auto-save-drafts): New function. (wl-set-save-drafts): Split to `wl-start-save-drafts' and `wl-stop-save-drafts'. (wl-start-save-drafts): New function. (wl-stop-save-drafts): Ditto. (wl-set-auto-save-draft): New command. * wl-draft.el (wl-draft): Use `wl-start-save-drafts' instead of `wl-set-save-drafts'. 2005-10-16 Hiroya Murata * wl-mime.el (wl-mime-combine-message/partial-pieces): Use `make-local-variable' instead of `make-variable-buffer-local'. 2005-10-14 Yoichi NAKAYAMA * wl.el (wl-exit): Call elmo-passwd-alist-clear at the end. 2005-10-14 Yoichi NAKAYAMA * wl-vars.el (wl-folder-hierarchy-access-folders): Fix regexp. 2005-10-13 Hiroya Murata * wl-mime.el (wl-summary-burst-subr): Disable multibyte characters of working buffer. 2005-10-05 Hiroya Murata * wl-mime.el (wl-draft-attribute-nntp-posting-port): Fixed typo. * wl-mime.el (wl-draft-attribute-recipients): Added mime-bcc field value into recipients; Bind `wl-draft-remove-group-list-contents' as nil. 2005-09-24 Hiroya Murata * wl-summary.el (wl-summary-sort): Fixed the last change. * wl-summary.el (wl-summary-sort-function-from-spec): New function. (wl-summary-sort-messages): Ditto. (wl-summary-rescan): Use it. (wl-summary-sort): Use `wl-completing-read-multiple' instead of `completing-read'; Append candidates for reverse order. 2005-09-17 Hiroya Murata * Version number is increased to 2.15.2. 2005-09-02 Yoichi NAKAYAMA * wl-util.el (wl-read-search-condition-internal): Add "Larger" and "Smaller". * wl-folder.el (wl-folder-complete-filter-condition): Ditto. 2005-08-04 Yoichi NAKAYAMA * wl-vars.el (wl-summary-showto-folder-regexp): Update docstring. 2005-07-17 Hiroya Murata * wl-vars.el (wl-draft-additional-header-alist): Add into the customize group `wl-draft'. (wl-draft-add-in-reply-to): Move customize group from `wl' to `wl-draft'. (wl-draft-add-references): Ditto. * wl-action.el (wl-summary-print-argument): Rename argument from `folder' to `data'. 2005-06-24 Hiroya Murata * wl-summary.el (wl-summary-rescan-message): Call `wl-thread-cleanup-symbols' before insert thread. 2005-06-12 Hiroya Murata * wl.el (wl-init): Set `elmo-get-folder-function' as `wl-folder-make-elmo-folder'. * wl-spam.el (wl-summary-exec-action-spam): Use `wl-folder-make-elmo-folder' instead of `elmo-make-folder'. * wl-folder.el (wl-folder-make-elmo-folder): New function. (wl-draft-get-folder): Use `wl-folder-make-elmo-folder' instead of `elmo-make-folder'. (wl-folder-get-elmo-folder): Ditto. (wl-folder-create-subr): Simplify. 2005-06-05 Hiroya Murata * wl-mime.el (wl-message-verify-pgp-nonmime): Fix the last change. 2005-06-04 Hiroya Murata * wl-mime.el (wl-message-verify-pgp-nonmime): Verify encoded contents in message buffer instead of original buffer. If optional argument specified, ask coding system for encode. 2005-06-02 Tetsurou Okazaki * wl-spam.el (wl-summary-test-spam-region): New function. (wl-spam-setup): Bind "rkc". 2005-05-10 Yoichi NAKAYAMA * wl-fldmgr.el (wl-fldmgr-add): Undo the last change. 2005-04-22 Tetsurou Okazaki * wl-spam.el (wl-summary-test-spam): Fix typo. (wl-message-check-spam): Ditto. 2005-04-16 Hiroya Murata * wl-summary.el (wl-summary-default-from): Simplify. 2005-04-10 Hiroya Murata * wl-action.el (wl-summary-exec-action-refile): Simplify. (wl-summary-exec-action-copy): Ditto. (wl-summary-auto-refile): Check existence of temporary mark. 2005-04-09 Hiroya Murata * wl-summary.el (wl-summary-create-line): Use `elmo-time-to-datevec'. * wl-expire.el (wl-expire-archive-date): Ditto. (wl-expire-localdir-date): Ditto. * wl-util.el (wl-day-number): Abolish. * wl-score.el (wl-score-headers): Use `elmo-time-to-days' instead of `wl-day-number'. (wl-score-followup): Ditto. (wl-score-add-followups): Ditto. (wl-score-get-latest-msgs): Ditto. (wl-score-get-header-entry): Ditto. (wl-score-edit-insert-date): Ditto. 2005-04-08 Hiroya Murata * wl-summary.el (wl-summary-print-message-with-ps-print): Call `elmo-message-entity-field' with 2nd argument `type'. 2005-04-04 Tetsurou Okazaki * wl-action.el (wl-summary-exec): Reduce loop strength in a dolist loop. 2005-04-03 Hiroya Murata * wl-thread.el (wl-thread-delete-message): Delete descendant numbers from `wl-summary-buffer-number-list' if `deep' is non-nil. 2005-04-03 Yuuichi Teranishi * wl-xmas.el (wl-folder-internal-icon-list): Fix last change. 2005-03-27 Yoichi NAKAYAMA * wl-xmas.el (wl-folder-internal-icon-list): Added entry for `Access folder'. 2005-03-27 Hiroya Murata * wl-vars.el (wl-access-folder-icon): New user option. * wl-e21.el (wl-folder-internal-icon-list): Added entry for `Access folder'. 2005-03-22 Hiroya Murata * wl-summary.el (wl-summary-buffer-set-folder): Use `wl-folder-mime-charset'. * wl-folder.el (wl-draft-get-folder): Call `elmo-make-folder' with `mime-charset'. (wl-folder-get-elmo-folder): Ditto. (wl-folder-mime-charset): New function. 2005-03-20 Hiroya Murata * wl-util.el (wl-parse-addresses): Define alias of `elmo-parse-addresses' (move to `elmo-util.el'). * wl-summary.el (wl-summary-default-from): Follow the API change. (wl-summary-overview-entity-compare-by-date): Ditto. (wl-summary-overview-entity-compare-by-from): Ditto. (wl-summary-get-list-info): Get value of `ml-info' field from entity at first. (wl-summary-rescan-message): Treat prefix argument. (wl-summary-prefetch-msg): Follow the API change. (wl-summary-search-by-subject): Ditto. (wl-summary-insert-thread): Ditto. (wl-summary-line-subject): Ditto. (wl-summary-line-from): Ditto. (wl-summary-create-line): Ditto. (wl-summary-print-message-with-ps-print): Ditto. * wl-score.el (wl-score-ov-entity-get): Ditto. (wl-score-followup): Ditto. (wl-score-add-followups): Use `elmo-message-entity-field' instead of `car'. (wl-score-get-latest-msgs): Follow the API change. (wl-score-get-header): Ditto. * wl-refile.el (wl-refile-learn): Ditto. (wl-refile-subject-learn): Ditto. (wl-refile-get-field-value): Ditto. (wl-refile-guess-by-history): Ditto. (wl-refile-guess-by-subject): Ditto. * wl-mime.el (wl-mime-combine-message/partial-pieces): Ditto. * wl-expire.el (wl-expire-date-p): Removed. (wl-expire-archive-date): Follow the API change. (wl-expire-localdir-date): Ditto. (wl-summary-expire): Ditto. * Version number is increased to 2.15.1. 2005-03-20 Yoichi NAKAYAMA * wl-fldmgr.el (wl-fldmgr-add): Create folder after testing parent group is access or not (it is not strict, like wl-fldmgr-rename). 2005-03-17 Yoichi NAKAYAMA * wl-thread.el (wl-thread-update-line-on-buffer-sub): Avoid duplicate call of `wl-summary-print-argument' on the wrong line. 2005-03-17 Hiroya Murata * wl-summary.el (wl-summary-jump-to-msg): Don't interactive input even if argument `number' is nil. (wl-summary-insert-line): Print action argument if current message has it. 2005-03-16 Hiroya Murata * wl-draft.el (wl-draft-forward): Call `wl-draft' with number. (wl-draft-reply): Ditto. (wl-draft): Add optional argument `parent-number' and call `wl-draft-create-buffer' with it. (wl-draft-create-buffer): Add optional argument `parent-number'. Set wl-draft-parent-number as it. 2005-03-13 Yoichi NAKAYAMA * wl-folder.el (wl-folder-set-persistent-mark): If summary buffer is not for given folder, don't use it. 2005-03-13 Yuuichi Teranishi * Version number is increased to 2.15.0. 2005-03-11 Hiroya Murata * wl.el (wl-init): Call `elmo-global-flags-initialize'. * wl-highlight.el (wl-highlight-summary-flagged-face): New face. (wl-highlight-get-face-by-name): New internal function. (wl-highlight-summary-line-face-spec): Use it and fixed. 2005-03-10 Hiroya Murata * wl-summary.el (wl-summary-sync-update): Use `elmo-message-entity-field' instead of `car' to get message-id from overview entity. * wl-summary.el (wl-summary-rescan-message): Call `wl-highlight-summary-displaying' when displaying a message. 2005-03-07 Yoichi NAKAYAMA * wl-draft.el (wl-draft-config-info-filename): Extracted from `wl-draft-config-info-operation'. (wl-draft-buffer-change-number): New function. (wl-draft-rename-saved-config): Ditto. * wl.el (wl-init): Connect slot for message-number-changed. (toplevel): Add autoload for wl-draft-rename-saved-config. 2005-03-05 Hiroya Murata * wl-summary.el (wl-summary-buffer-attach): Connect to signal `update-overview' (wl-summary-buffer-detach): Disconnect from it. (wl-summary-rescan-message): Use command. * wl-message.el (wl-message-buffer-display): Use `with-current-buffer' instead of `save-excursion'. 2005-03-04 Hiroya Murata * wl-mime.el (wl-draft-preview-attributes-list): Protect wl-draft-preview-attributes-list from distraction. 2005-02-27 Yuuichi Teranishi * wl-summary.el (wl-summary-sync-update): Sort the return value of `elmo-list-diff'. 2005-02-27 Hiroya Murata * wl-summary.el (wl-summary-edit-addresses-collect-candidate-fields): Use `elmo-with-enable-multibyte' instead of `elmo-set-work-buf'. * wl-draft.el (wl-draft-yank-original): Use `with-temp-buffer' instead of `elmo-set-work-buf'. * wl-address.el (wl-address-make-alist-from-alias-file): Ditto. (wl-address-make-address-list): Ditto. * Version number is increased to 2.13.3. 2005-02-25 Hiroya Murata * wl-vars.el (wl-message-auto-reassemble-message/partial): New user option. * wl-summary.el (wl-summary-toggle-mime): Treat numeric prefix argument `5'. * wl-message.el (wl-message-display-no-merge-p): New function. (wl-message-buffer-display): Check whether the message is reassembled and follow the API change. 2005-02-24 Hiroya Murata * wl-action.el (wl-summary-exec-action-resend-subr): Disable multibyte on working buffer and removed unnecessary `buffer-disable-undo'. 2005-02-18 Hiroya Murata * wl-util.el (wl-read-search-condition-internal): Fixed the last change. 2005-02-18 Yoichi NAKAYAMA * wl-util.el (wl-read-search-condition-internal): Protect elmo-global-flags from distraction. 2005-02-18 Hiroya Murata * wl.el (wl-exit): Call `elmo-clear-signal-slots'. * wl-summary.el (wl-summary-buffer-event-handler): Abolish. (wl-summary-event-handler): Ditto. (wl-summary-update-persistent-mark-on-event): New function (renamed from `elmo-event-handler-flag-changed'). (wl-summary-buffer-attach): New function. (wl-summary-buffer-detach): Rewrite by `elmo-signal'. (wl-summary-buffer-set-folder): Use `wl-summary-buffer-attach' instead of `elmo-folder-add-handler'. * Version number is increased to 2.13.2. 2005-02-14 Hiroya Murata * wl-news.el.in (wl-news-mode-map): Bind commands of outline-mode and "\177" to the `wl-news-previous-page'. (wl-news-mode): Defined by `define-derived-mode' instead of `defun'. (wl-news-previous-page): New function. 2005-02-11 Hiroya Murata * wl-summary.el (wl-summary-save): Use `write-region-as-binary' instead of `write-region' and simplify. 2005-02-09 Hiroya Murata * wl-template.el (wl-template-select): Cause error if `wl-template-alist' is nil. 2005-02-06 TAKAHASHI Kaoru * wl-news.el.in: Set file variable `no-byte-compile'. 2005-02-06 Hiroya Murata * wl-summary.el (elmo-event-handler-flag-changed): Does not check whether a target message is within displaying area. (elmo-event-handler-cache-changed): Ditto. 2005-02-01 Tetsurou Okazaki * wl-thread.el (wl-thread-entity-get-descendant): Change `defsubst' to `defun'. Use `nconc' instead of `append' to collect descendant message numbers. 2005-01-30 TAKAHASHI Kaoru * wl-thread.el (wl-thread-save-top-list) (wl-thread-save-entities): Use `with-temp-buffer'. * wl-news.el.in (wl-news-previous-version-load): (wl-news-previous-version-save): Ditto. * wl-summary.el (wl-summary-load-file-object) (wl-summary-save-view-cache): Ditto. 2005-01-30 Hiroya Murata * wl-util.el (toplevel): Require 'elmo-flag'. (wl-read-search-condition): New function (Renamed from `elmo-read-search-condition'). (wl-read-search-condition-internal): Likewise. * wl-summary.el (wl-summary-decide-flag): Cause error if flag is invalid. (wl-summary-pick): Use `wl-read-search-condition' instead of `elmo-read-search-condition'. (wl-summary-virtual): Ditto. * wl-folder.el (wl-folder-virtual): Ditto. (wl-folder-pick): Ditto. * wl-fldmgr.el (wl-fldmgr-make-filter): Ditto. 2005-01-28 Hiroya Murata * wl-summary.el (wl-summary-reedit): Call `wl-summary-message-string' with argument `use-cache' as `'maybe'. 2005-01-23 Hiroya Murata * wl-mime.el (toplevel): Require wl-vars. * wl-message.el (toplevel): Require cl at compile. * wl-draft.el (toplevel): Require elmo. 2005-01-20 Yoichi NAKAYAMA * wl-message.el (wl-message-buffer-prefetch): Count is a number and do nothing when it is not positive. (wl-message-buffer-prefetch-next): Ditto. 2005-01-19 Yoichi NAKAYAMA * wl-summary.el (wl-summary-goto-folder-subr): Avoid error for `wl-message-buffer-prefetch-depth' is nil though it is illegal. (wl-summary-redisplay-internal): Ditto. * wl-summary.el (wl-summary-goto-folder-subr): Protect current message (the condition is borrowed from `wl-check-variables-2'). (wl-summary-redisplay-internal): Ditto. 2005-01-17 Hiroya Murata * wl-mime.el (wl-draft-nntp-attribute): New function. (wl-draft-attribute-nntp-posting-server): Use it. (wl-draft-attribute-nntp-posting-port): Ditto. * wl-mime.el (wl-draft-preview-attributes-list): New function. (wl-draft-show-attributes-buffer): Ditto. (wl-draft-hide-attributes-buffer): Ditto. (wl-draft-attribute-newsgroups): Ditto. (wl-draft-attribute-nntp-posting-server): Ditto. (wl-draft-attribute-nntp-posting-port): Ditto. (wl-draft-preview-message): Use there functions. * wl-vars.el (wl-draft-preview-attributes-list): Change default value. 2005-01-11 Hiroya Murata * wl-draft.el (wl-draft-insert-get-message): Follow the API change. (wl-draft-reedit): Ditto. (wl-draft-queue-flush): Ditto. * wl-mime.el (wl-message-request-partial): Ditto. (wl-message-delete-current-part): Use `elmo-message-fetch-string' instead of `elmo-message-fetch'. * wl-action.el (wl-summary-exec-action-resend-subr): Ditto. * wl-summary.el (wl-summary-message-string): Ditto. 2005-01-07 Hiroya Murata * wl-util.el (wl-current-message-buffer): Follow the API change. * wl-summary.el (wl-summary-redisplay-internal): Call `wl-summary-mark-as-read' with 2nd argument as nil and update unread count instead of persistent mark. * wl-message.el (wl-message-buffer-mime-entity): New buffer local variable. (wl-message-redisplay): Follow the API change. (wl-message-buffer-display): Managed mime-entity directly and return preview buffer only. (wl-message-display-internal): Rewrite. (wl-message-buffer-prefetch-subr): Not save return value of `wl-message-buffer-display'. * Version number is increased to 2.13.1. 2005-01-05 Hiroya Murata * wl-addrmgr.el (wl-addrmgr-pickup-entry-list): Call 'elmo-multiple-fields-body-list' with boundary specified. 2005-01-05 Yoichi NAKAYAMA * wl-vars.el (wl-summary-resend-use-cache): New variable. * wl-action.el (wl-summary-exec-action-resend-subr): Use file cache if `wl-summary-resend-use-cache' is non-nil. 2005-01-02 Yoichi NAKAYAMA * wl-vars.el (wl-pop-before-smtp-stream-type): Fix range. (wl-nntp-posting-stream-type): Ditto. 2005-01-01 TAKAHASHI Kaoru * wl-demo.el (wl-demo-copyright-notice): Add 2005. 2005-01-01 Ron Isaacson * wl-util.el (wl-save-drafts): Avoid error on redisplaying message. 2004-12-25 Hiroya Murata * wl-summary.el (wl-summary-buffer-unsync-mark-number-list): Abolish. (wl-summary-buffer-persistent-mark-version): New internal variable. (wl-summary-update-mark-and-highlight-window): Check by wl-summary-persistent-mark-invalid-p. (wl-summary-update-status-marks): Ditto. (elmo-event-handler-flag-changed): Rewrite. (elmo-event-handler-cache-changed): Define. (wl-summary-prefetch-msg): Does not update persistent mark here. (wl-summary-delete-cache): Ditto. (wl-summary-resume-cache-status): Ditto. (wl-summary-jump-to-msg): Add arguments `beg' and `end'. (wl-summary-persistent-mark-invalid-p): New function. (wl-summary-validate-persistent-mark): Ditto. (wl-summary-validate-persistent-mark-string): Ditto. (wl-summary-invalidate-persistent-mark): Ditto. (wl-summary-update-persistent-mark): Call `wl-summary-validate-persistent-mark'. (wl-summary-create-line): Call `wl-summary-validate-persistent-mark-string'. * wl-message.el (wl-message-buffer-prefetch-subr): Set cache status as t if cache used. 2004-12-24 Yoichi NAKAYAMA * wl-fldmgr.el (wl-fldmgr-set-petname): Check wl-folder-group-alist only if the target is group. * wl-folder.el (wl-folder-append-petname): Don't check group name. 2004-12-23 Yoichi NAKAYAMA * wl-folder.el (wl-folder-buffer-search-entity): Check real name. 2004-12-22 Yuuichi Teranishi * wl-vars.el (wl-smtp-authenticate-realm): New user option. * wl-draft.el (wl-smtp-extension-bind): Use wl-smtp-authenticate-realm. 2004-12-15 Yuuichi Teranishi * wl-e21.el (wl-draft-mode-setup): Avoid global-font-lock-mode (Thanks to Yoichi NAKAYAMA). 2004-12-15 Yoichi NAKAYAMA * wl-util.el (wl-save-drafts): Restore echo area. 2004-12-12 Yuuichi Teranishi * Version number is increased to 2.13.0. * wl-util.el (wl-biff-check-folder-async): Use wl-folder-entity-exists-p instead of elmo-folder-exists-p. 2004-12-12 Hiroya Murata * wl-message.el (wl-message-display-internal): Does not put wl-message-display-type property on message buffer. (wl-message-buffer-display-type): New function. * wl-mime.el (wl-draft-yank-current-message-entity): Use it. * wl-summary.el (wl-summary-mode): Use `dolist' to add `wl-summary-buffer-detach'. (wl-summary-message-display-type): Use `wl-summary-buffer-display-type'. 2004-12-12 Yuuichi Teranishi * wl-summary.el (wl-summary-mode): Set kill-buffer-hook as buffer-local. * wl-mime.el (wl-draft-preview-message): Use make-local-hook for kill-buffer-hook instead of make-local-variable. (wl-draft-preview-message): Set `local' argument of add-hook as t. 2004-12-12 Scott Renfro * wl-summary.el (wl-summary-default-subject-filter): Fixed greedy regex for square-branket. 2004-12-11 Hiroya Murata * wl-mime.el (wl-mime-preview-follow-no-mime): Call `wl-message-mime-analysis-p' with argument `header'. 2004-12-11 Yuuichi Teranishi * wl-mime.el (wl-draft-yank-current-message-entity): Switch to no-mime following method according to wl-message-display-type property. (wl-mime-preview-follow-no-mime): Use wl-message-mime-analysis-p. * wl-message.el (wl-message-display-internal): Put wl-message-display-type property on message buffer. * wl-message.el (wl-message-mime-analysis-p): Fixed misspelling. (wl-message-display-internal): Ditto; * wl-summary.el (wl-summary-toggle-mime): Ditto. 2004-12-11 Hiroya Murata * wl-message.el (wl-message-make-display-type): New function. (wl-message-display-type-property): Ditto. (wl-message-mime-analysys-p): Ditto. (wl-message-display-all-header-p): Ditto. (wl-message-redisplay): Removed argument `as-is', `all-header' and added `display-type'. (wl-message-buffer-display): Likewise. (wl-message-display-internal): Likewise. (wl-message-buffer-display-type): Abolish. (wl-message-buffer-prefetch-subr): Follow the API changed. * wl-summary.el (wl-summary-buffer-display-header-mode): Renamed from wl-summary-buffer-display-all-header and changed default value. (wl-summary-message-display-type): New function. (wl-summary-buffer-display-mime-mode): Ditto. (wl-summary-buffer-display-header-mode): Ditto. (wl-summary-toggle-mime): Rewrite with above functions. (wl-summary-toggle-all-header): Ditto. (wl-summary-redisplay): Force redisplay with default mode. (wl-summary-redisplay-internal): Renamed argument from `mode', `all-header' to `mime-mode', `header-mode'. Use `wl-message-make-display-type'. * wl-vars.el (wl-summary-mode-line-format): Removed `[%m]'. (wl-message-mode-line-format-spec-alist): Changed definition for `m'. 2004-12-11 Yuuichi Teranishi * wl-draft.el (wl-draft-send): Allow parent-folder as "". 2004-12-11 Yoichi NAKAYAMA * wl-draft.el (wl-draft-forward): Call wl-draft-forward-make-subject in original message buffer. (wl-draft-reply): Call wl-draft-reply-make-subject in original message buffer. 2004-12-10 Yoichi NAKAYAMA * wl-draft.el (wl-draft-forward): Don't jump into temp-buffer. 2004-12-10 Yoichi NAKAYAMA * wl-vars.el (wl-summary-line-format): Add reference to wl-summary-width. 2004-12-07 Tetsurou Okazaki * wl-action.el (wl-summary-exec-action-refile): Display a done message when actions succeeded. (wl-summary-exec-action-copy): Likewise. 2004-12-07 Yoichi NAKAYAMA * wl-summary.el (wl-summary-forward): Don't call set-buffer since there is switch-to-buffer at the end of wl-message-select-buffer. (wl-summary-reply): Ditto. 2004-12-06 Yoichi NAKAYAMA * wl-summary.el (wl-summary-forward): Put subject in original message buffer as argument of wl-draft-forward. * wl-draft.el (wl-draft-forward): Decode subject as in wl-draft-reply. 2004-12-05 Yoichi NAKAYAMA * wl-fldmgr.el (wl-fldmgr-unsubscribe): Show message if it is not a folder under access group. 2004-12-01 Yoichi NAKAYAMA * wl-message.el (wl-message-buffer-prefetch-subr): Fix argument of wl-message-buffer-display. * wl-util.el (wl-set-save-drafts): Fix typo. 2004-12-01 Katsumi Yamaoka * wl-demo.el (wl-demo-insert-image): Use :file instead of :data to make an xbm image on XEmacs; use wl-highlight-demo-face instead of wl-highlight-logo-face to set the bg color of an xbm image; fixed the way to measure the width of a bitmap image; don't put face on ascii and bitmap images; put the mark which should not use the variable-pitch face on ascii and bitmap images. (wl-demo-setup-properties): Don't use the variable-pitch face on ascii and bitmap images; made it work on Emacs 20 and earlier. (wl-demo-insert-text): End with a newline at the bottom; don't put face on text. * wl-highlight.el (wl-highlight-logo-face): Specified bg colors. 2004-11-26 Yoichi NAKAYAMA * wl-util.el (toplevel): Don't check existence of `timer-activate'. * wl-util.el (wl-save-drafts): Moved from sample setting. (wl-set-save-drafts): New function to set idle timer. * wl-draft.el (wl-draft): Call it. * wl-vars.el (wl-auto-save-drafts-interval): New variable. 2004-11-23 Yuuichi Teranishi * wl-util.el (wl-current-message-buffer): Fixed bug when yank from a summary which has toggle display status off. 2004-11-23 Hiroya Murata * wl-draft.el (wl-draft-do-fcc): No cache save. 2004-11-16 Hiroya Murata * wl-summary.el (elmo-event-handler-flag-changed): Use `set-buffer' instead of `with-current-buffer'. 2004-11-14 Hiroya Murata * wl-summary.el (wl-summary-after-resize-function): New function. (wl-summary-mode): Add `wl-summary-after-resize-function' to window-size-change-functions. 2004-11-12 Hiroya Murata * wl-draft.el (wl-draft-create-buffer): Bind `change-major-mode-hook' after current buffer is changed. * wl-summary.el (wl-summary-buffer-detach): New function. (wl-summary-buffer-set-folder): Call it. (wl-summary-mode): Add `wl-summary-buffer-detach' to change-major-mode-hook and kill-buffer-hook. (wl-summary-exit): Does not call `elmo-folder-remove-handler'. (wl-summary-switch-to-clone-buffer): Ditto. (wl-summary-goto-folder-subr): Ditto. 2004-11-11 TAKAHASHI Kaoru * wl-summary.el (wl-summary-mode): Set `show-trailing-whitespace' after boundp check. 2004-11-07 Hiroya Murata * wl-summary.el (wl-summary-mimic-kill-buffer): New command. (wl-summary-mode-map): Substitute `wl-summary-mimic-kill-buffer' for `kill-buffer'. * wl-summary.el (wl-summary-switch-to-clone-buffer): Remove event handler of current buffer from elmo-folder. 2004-11-07 Yoichi NAKAYAMA * wl-fldmgr.el (wl-fldmgr-sort): Confirm before sorting. 2004-11-06 Hiroya Murata * wl-summary.el (wl-summary-buffer-event-handler): New internal variable. (wl-summary-event-handler): New class. (elmo-event-handler-flag-changed): Define to update persistent mark. (wl-summary-buffer-set-folder): Register event handler to elmo-folder. (wl-summary-exit): Unregister event handler. (wl-summary-goto-folder-subr): Ditto. (wl-summary-mark-as-read-all): Does not call `wl-summary-update-persistent-mark' directly. (wl-summary-mark-as-read-internal): Ditto. (wl-summary-set-persistent-mark-internal): Ditto. (wl-summary-set-flags-internal): Ditto. * Version number is increased to 2.11.33. 2004-10-28 TAKAHASHI Kaoru * wl-summary.el (wl-summary-mode): Set `show-trailing-whitespace' to nil. 2004-10-24 Hiroya Murata * wl-spam.el (wl-spam-setup): Add hook `wl-summary-auto-check-spam' to `wl-summary-sync-updated-hook' instead of `wl-summary-prepare-hook'. * wl-summary.el (wl-summary-set-flags): Allow flag operation even if folder type is `'flag'. (wl-summary-mark-as-important): Ditto. 2004-10-16 Hiroya Murata * wl-address.el (wl-address-minibuffer-history): New variable. (wl-address-minibuffer-local-map): New keymap. (wl-address-read-from-minibuffer): New function. * wl-action.el (wl-summary-get-resend-address): Use `wl-address-read-from-minibuffer' instead of `completing-read'. 2004-10-11 Hiroya Murata * Version number is increased to 2.11.32. 2004-10-10 Yoichi NAKAYAMA * wl-vars.el (wl-mime-charset): Change default value for XEmacs without mule to iso-8859-1. (wl-draft-add-in-reply-to): Add note in description. (wl-draft-add-references): Ditto. 2004-10-10 Yuuichi Teranishi * wl-vars.el (wl-summary-mode-line-format-spec-alist): Changed definition for `m'. (wl-summary-mode-line-format): Add '[%m]'. (wl-message-mode-line-format-spec-alist): Ditto. (wl-summary-display-mime-mode-list): New variable. * wl-summary.el (wl-summary-buffer-display-mime-mode): Renamed from wl-summary-buffer-display-as-is. (wl-summary-buffer-display-all-header): New buffer local variable. (wl-summary-mode-map): Bind "H" to the 'wl-summary-toggle-all-header'. (wl-summary-goto-folder-subr): Setup wl-summary-buffer-display-mime-mode instead of wl-summary-buffer-display-as-is. (wl-summary-unset-persistent-mark): Don't use term 'Flag' here. (wl-summary-set-persistent-mark): Ditto. (wl-summary-set-message-buffer-or-redisplay): Just call `wl-summary-redisplay-internal' without optional arguments. (wl-summary-toggle-mime): Rewrite. (wl-summary-redisplay): Don't use `wl-summary-buffer-display-as-is'. (wl-summary-toggle-all-header): New function. (wl-summary-redisplay-internal): Treat mime mode. * wl-mime.el (wl-draft-yank-current-message-entity): Pass mode to wl-mime-preview-follow-no-mime. (wl-mime-preview-follow-no-mime): Bind elmo-mime-display-header-analysis accodring to the display-mode. * wl-message.el (wl-message-buffer-display-type): Rewrite. (wl-message-buffer-display): Changed argument name from `as-is' to `mode'. (wl-message-display-internal): Ditto; Bind elmo-mime-display-header-analysis according to the mode. (wl-message-display-internal): Put wl-message-display-mime-mode property on entire buffer. 2004-10-03 Yuuichi Teranishi * wl-draft.el (wl-draft-do-fcc): Undo last change. 2004-09-29 Yuuichi Teranishi * wl-summary.el (wl-summary-overview-entity-compare-by-from): Don't extract mail address. (wl-summary-mark-as-read-all): Dont' treat `read' flag. * wl-draft.el (wl-draft-do-fcc): Don't treat `read' flag. * wl-score.el (wl-summary-score-update-all-lines): Ditto. 2004-09-28 Yoichi NAKAYAMA * wl-fldmgr.el (wl-fldmgr-exit): Display length of wl-fldmgr-cut-entity-list on confirmation. 2004-09-27 Yoichi NAKAYAMA * wl-mime.el (mime-edit-temp-message-buffer): Remove definition. (wl-mime-quit-preview): Check existence of mime-edit-temp-message-buffer here. 2004-09-26 Yoichi NAKAYAMA * wl-fldmgr.el (wl-fldmgr-delete): Remove folder entity after deletion. * wl-draft.el (wl-draft-send-confirm): Check major-mode before calling wl-mime-quit-preview. 2004-09-25 Hiroya Murata * wl-summary.el (wl-summary-pick): If call it with prefix argument, set `delete-marks' as non-nil. Pick from only visible messages. (wl-summary-check-target-mark): New function. (wl-summary-target-mark-mark-as-read): Use it. (wl-summary-target-mark-mark-as-unread): Ditto. (wl-summary-target-mark-operation): Ditto. (wl-summary-target-mark-set-flags): Ditto. (wl-summary-target-mark-save): Ditto. (wl-summary-target-mark-pick): Ditto. (wl-summary-target-mark-forward): Ditto. (wl-summary-target-mark-reply-with-citation): Ditto. (wl-summary-target-mark-print): Ditto. (wl-summary-target-mark-uudecode): Ditto. * wl-summary.el (wl-summary-toggle-mime): Added optional argument `no-mime'. if it is non-nil, call `wl-summary-redisplay-no-mime' with `ask-coding' is non-nil. 2004-09-24 Hiroya Murata * wl-thread.el (wl-thread-set-parent): If parent is a message which is identified by references, set linked as nil. 2004-09-24 Yuuichi Teranishi * wl-vars.el (wl-summary-mode-line-format-spec-alist): Added spec "m". (wl-message-mode-line-format-spec-alist): Ditto. (wl-message-mode-line-format): Ditto. (wl-summary-mode-line-format): Ditto for docstring. (wl-summary-no-mime-folder-list): Fix typo. * wl-util.el (wl-current-message-buffer): Call `wl-message-buffer-display' with `as-is' and `all-header' as nil. * wl-summary.el (wl-summary-buffer-display-as-is): New buffer-local variable. (wl-summary-mode-map): Bind 'M' as `wl-summary-toggle-mime' instead of `wl-summary-redisplay-no-mime'. (wl-summary-goto-folder-subr): Set up wl-summary-buffer-display-as-is. (wl-summary-toggle-mime): New function. (wl-summary-redisplay-all-header): Rewrite. (wl-summary-redisplay-no-mime): Ditto. (wl-summary-redisplay-internal): Added argument `as-is' and `all-header'. * wl-refile.el (wl-refile-default-from-folder-path-separator): New variable. (wl-refile-guess-functions): Added wl-refile-guess-by-from at the bottom. (wl-refile-guess-by-history): Don't use wl-refile-guess-by-from. (wl-refile-guess-by-from): Rewrite to fix the bug which inserts "/" unconditionally. * wl-mime.el (wl-draft-yank-current-message-entity): Use wl-mime-preview-follow-no-mime for as-is content. (wl-mime-preview-follow-no-mime): New function. (wl-mime-preview-follow-current-region): Fixed parenthesis. * wl-message.el (wl-message-redisplay): Removed argument `display-type' and added `as-is', `all-header'. (wl-message-buffer-display): Ditto. (wl-message-buffer-display-type): New function. 2004-09-21 Yoichi NAKAYAMA * wl-vars.el (wl-message-header-button-alist): Change default value. (wl-message-body-button-alist): Ditto. 2004-09-20 Yoichi NAKAYAMA * wl.el (wl-exit): Run elmo-passwd-alist-clear. 2004-09-19 Hiroya Murata * wl-summary.el (wl-summary-get-available-flags): Rewrite. 2004-09-19 Yoichi NAKAYAMA * wl-summary.el (wl-summary-sync-marks): Remove condition which is always true. 2004-09-15 Yoichi NAKAYAMA * wl-mime.el (wl-mime-preview-follow-current-region): Avoid error on null entity. 2004-09-13 Yoichi NAKAYAMA * wl-vars.el (wl-draft-reply-default-position): Fix range. 2004-09-13 Hiroya Murata * wl-vars.el (wl-summary-resend-hook): New hook. * wl-action.el (wl-summary-exec-action-resend-subr): Run `wl-summary-resend-hook'. 2004-09-12 Yuuichi Teranishi * wl-vars.el (wl-draft-forward-hook): Setup to put forwarded flag. (wl-summary-persistent-mark-priority-list): Add `forwarded'. (wl-summary-uncached-mark): Renamed from wl-summary-read-uncached-mark. (wl-summary-new-cached-mark): Changed default value to 'n'. (wl-summary-unread-cached-mark): Changed default value to 'u'. (wl-summary-answered-cached-mark): Changed default value to 'a'. (wl-folder-sync-range-alist): Remove spec for 'flag. (wl-summary-force-prefetch-folder-list): New user option. * wl-summary.el (wl-summary-mode-map): Bind 'M-k' to `wl-summary-toggle-persistent-mark'. (wl-summary-update-mark-and-highlight-window): Don't highlight when number is nil. (wl-summary-mark-as-answered-region): Set interactive argument of `wl-summary-set-persistent-mark-internal'. (wl-summary-mark-as-important-region): Ditto. (wl-summary-unset-persistent-mark): Ditto. (wl-summary-set-persistent-mark): Ditto. (wl-summary-mark-as-answered): Ditto. (wl-summary-mark-as-important): Ditto. (wl-summary-set-persistent-mark-internal): Do nothing when `elmo-message-flag-available-p' is nil. (wl-summary-toggle-persistent-mark): New function. (wl-summary-goto-folder-subr): Call `wl-summary-force-prefetch' when the folder matches `wl-summary-force-prefetch-folder-list'. * wl-highlight.el (wl-highlight-summary-current-line): Do nothing when number is nil. (wl-highlight-summary-forwarded-face): New face. 2004-09-12 Yuuichi Teranishi * Version number is increased to 2.11.31. 2004-09-11 Yoichi NAKAYAMA * wl-util.el (wl-biff-check-folders): Ignore non-existent folder. (wl-biff-check-folder-async): Ditto. * wl-vars.el (wl-biff-check-folder-list): Fix tag. 2004-09-08 Tetsurou Okazaki * wl-summary.el (wl-summary-rescan): Implement reverse sorting. Add an argument `reverse'. All callers are updated. (wl-summary-sort): Add a prefix argument `reverse' to specify reverse sorting. (wl-summary-sort-by-date, wl-summary-sort-by-number) (wl-summary-sort-by-subject, wl-summary-sort-by-from) (wl-summary-sort-by-list-info, wl-summary-sort-by-size): Likewise. 2004-09-08 Hiroya Murata * wl-message.el (wl-message-redisplay): Does not narrow header if disply-type is all-header or as-is. * wl-summary.el (wl-summary-enter-handler): Use `wl-thread-jump-to-msg' instead of `wl-summary-jump-to-msg'. 2004-09-06 Yoichi NAKAYAMA * wl-draft.el (wl-draft-reply): Save wl-draft-config-variables after adding wl-draft-parent-variables. (wl-draft-forward): Ditto. 2004-09-05 Hiroya Murata * wl-summary.el (wl-summary-sync-marks): Call `wl-summary-set-persistent-mark' and `wl-summary-unset-persistent-mark' with 4th argument `no-server'. (wl-summary-set-persistent-mark-internal): Add 4th argument `no-server'. (wl-summary-unset-persistent-mark): Ditto. (wl-summary-set-persistent-mark): Ditto. (wl-summary-add-flags-internal): Abolish. (wl-summary-remove-flags-internal): Ditto. (wl-summary-mark-as-important-internal): Ditto. (wl-summary-mark-as-important): Use `wl-summary-set-persistent-mark' instead of `wl-summary-add-flags-internal'. (wl-summary-mark-as-important-region): Ditto. * wl-score.el (wl-summary-score-update-all-lines): Ditto. * wl-summary.el (wl-summary-get-available-flags): New function. (wl-summary-sync-marks): Use it and simplified. (wl-summary-unset-persistent-mark): Use `wl-summary-get-available-flags'. (wl-summary-set-persistent-mark): Ditto. 2004-09-05 Yuuichi Teranishi * wl-folder.el (wl-folder-entity-assign-id): Fix for folder entity id. 2004-09-04 Hiroya Murata * wl-summary.el (wl-summary-enter-handler): If argument is not a number, call `wl-summary-prev-line-content'. Show message when the message is not found. 2004-09-04 Yuuichi Teranishi * wl-summary.el (wl-summary-mode-map): Bind enter key to the wl-summary-enter-handler. (wl-summary-enter-handler): New command. * wl-vars.el (wl-summary-persistent-mark-priority-list): Update docstring and custom spec. * wl-summary.el (wl-summary-unset-persistent-mark): Treat global flags too; Don't treat Cached and New. (wl-summary-set-persistent-mark): Ditto. * wl-folder.el (wl-folder-set-persistent-mark): Renamed from `wl-folder-set-flag'. * wl-draft.el (wl-draft-send): Use `wl-folder-set-persistent-mark' instead of `wl-folder-set-flag'. * wl-summary.el (wl-summary-unset-persistent-mark): Ignore case for completion. (wl-summary-set-persistent-mark): Ditto. * wl-draft.el (wl-draft-send-confirm): Call `wl-mime-quit-preview' instead of `wl-draft-quit-preview'. * wl-mime.el (toplevel): Avoid compile warning. (wl-mime-quit-preview): New function (formarly defined as `wl-draft-quit-preview'). (wl-draft-preview-message): Use `wl-mime-quit-preview' for quitting method. * wl-draft.el: Move wl-draft-quit-preview to wl-mime.el. * wl-folder.el (wl-folder-set-flag): Renamed from `wl-draft-set-flag-on-parent'. * wl-draft.el (wl-draft-quit-preview): New function. (wl-draft-send-confirm): Call it instead of `mime-preview-quit'. (wl-draft-send): Call `wl-folder-set-flag' instead of `wl-draft-set-flag-on-parent'. (wl-draft-set-flag-on-parent): Renamed to `wl-folder-set-flag'. 2004-09-03 Hiroya Murata * wl-draft.el (wl-draft-forward): Fixed parenthesis. (wl-draft-send): Ditto. 2004-09-03 Yuuichi Teranishi * wl-vars.el (wl-draft-reply-hook): Changed default value. (wl-draft-kill-pre-hook): Set default value as nil. (wl-summary-reply-hook): Ditto. (wl-draft-kill-flags): Abolish. * wl-draft.el (wl-draft-parent-flag): New buffer local variable. (wl-draft-parent-variables): Renamed from wl-draft-reply-saved-variables and added wl-draft-parent-flag. (wl-draft-forward): Call wl-draft-config-info-operation with 'save argument; Add wl-draft-parent-variables to wl-draft-config-variables. (wl-draft-reply): Likewise. (wl-draft-kill-flags): Abolish. (wl-draft-send): Call wl-draft-set-flag-on-parent. (wl-draft-set-flag-on-parent): New function. (wl-draft-setup-parent-flag): Ditto. 2004-09-02 Tetsurou Okazaki * wl-draft.el (wl-draft-kill-flags): Avoid error when `wl-draft-parent-folder' is "". 2004-09-02 Yuuichi Teranishi * wl-summary.el (wl-summary-mode-map): Treat digits as prefix args. (wl-summary-digit-jump): New function. (Adviced by John Owens and Hiroya Murata) * wl-e21.el (wl-message-define-keymap): Bind "w" as wl-draft. (Adviced by John Owens) * wl-xmas.el (wl-message-define-keymap): Ditto. * wl-mule.el (wl-message-define-keymap): Ditto. 2004-08-31 Hiroya Murata * wl-vars.el (wl-summary-mode-line-format-spec-alist): Follow the change of return value of elmo-folder-count-flags. * wl-summary.el (wl-summary-prefetch-msg): Ditto. (wl-summary-mark-as-read-internal): Ditto. (wl-summary-set-persistent-mark-internal): Ditto. (wl-summary-folder-info-update): Ditto. (wl-summary-sync-update): Fixed the last change. * wl-score.el (wl-summary-score-update-all-lines): Ditto. 2004-09-01 Yuuichi Teranishi * wl-vars.el (wl-draft-kill-pre-hook): New hook. (wl-draft-kill-flags): Fixed docstring. * wl-draft.el (wl-draft-kill-flags): New function. (wl-draft-kill): Run `wl-draft-kill-pre-hook'. 2004-08-31 Yuuichi Teranishi * wl-vars.el (wl-reply-hook): Abolish. (wl-draft-reply-hook): New hook. (wl-summary-reply-hook): Ditto. (wl-draft-forward-hook): Ditto. (wl-summary-forward-hook): Ditto. (wl-draft-kill-flags): New variable. * wl-summary.el (wl-summary-mark-as-answered-region): Use wl-summary-set-persistent-mark-internal. (wl-summary-sync-marks): Use elmo-preserved-flags. (wl-summary-update-persistent-mark): Make it interactive. (wl-summary-set-persistent-mark-internal): New inline function. (wl-summary-mark-as-answered): Use it. (wl-summary-mark-as-unanswered): Ditto. (wl-summary-unset-persistent-mark): New function. (wl-summary-set-persistent-mark): Ditto. (wl-summary-reply): Don't set answered flag; Run wl-summary-reply-hook instead. (wl-summary-forward): Call wl-draft-forward with number. Run wl-summary-forward-hook. * wl-highlight.el (wl-summary-persistent-mark-face): New face. (wl-highlight-summary-line-face-spec): Use it as a default persistent mark face. * wl-draft.el (wl-draft-forward): Added optional argument number; Set wl-draft-parent-number; Run wl-draft-forward-hook. (wl-draft-reply): Run wl-draft-reply-hook instead of wl-reply-hook. (wl-draft-kill): Use wl-draft-kill-flags. * wl-vars.el (wl-summary-answered-uncached-mark): Fixed typo. * wl-folder.el (wl-folder-check-one-entity): Follow the change of return value of elmo-folder-count-flags. * wl-score.el (wl-summary-score-update-all-lines): Ditto. * wl-summary.el (wl-summary-count-unread): Ditto. (wl-summary-sync-update): Follow the change above. (wl-summary-force-prefetch): New function. 2004-08-25 Tetsurou Okazaki * wl-folder.el (wl-folder-set-folder-updated): Initialize the local variable `buf' with `let' instead of `setq'. 2004-08-21 Yoichi NAKAYAMA * wl-mime.el (wl-message-delete-current-part): If filename exists, add Content-Disposition heaeder on the deleted part. 2004-08-05 Yoichi NAKAYAMA * wl-draft.el (wl-draft-save): Encode address list under edit by `eword-encode-unstructured-field-body'. * wl-draft.el (toplevel): Require eword-encode, cl (at compile). 2004-08-01 Yoichi NAKAYAMA * wl-summary.el (wl-summary-set-message-buffer-or-redisplay): Set wl-current-summary-buffer. 2004-07-29 Tetsurou Okazaki * wl-action.el (wl-summary-exec): Fix the bug whereby a non null `numbers' is ignored. 2004-07-25 Yoichi NAKAYAMA * wl-folder.el (wl-folder-open-folder): Avoid error. Reported by John Owens, [wl-en:815] * wl.el (wl): Set timer for biff process even if prefix argument is given or auto-checking is quitted. * wl-util.el (wl-biff-start): Don't call `wl-biff-check-folders' immediately. * wl.el (wl): Call `wl-biff-check-folders' explicitly. (wl-toggle-plugged): Ditto. * wl-vars.el (wl-biff-use-idle-timer): New variable. * wl-util.el (wl-biff-start): Use idle timer if `wl-biff-use-idle-timer' is non-nil. 2004-07-21 Yoichi NAKAYAMA * wl-highlight.el (wl-highlight-message): Fix description. 2004-07-16 Yoichi NAKAYAMA * wl-demo.el (wl-demo-setup-properties): Avoid error for XEmacs on tty. 2004-07-12 Yoichi NAKAYAMA * wl-action.el (wl-summary-exec): Print failure count. 2004-07-11 Yoichi NAKAYAMA * wl-summary.el (wl-summary-redisplay-internal): Change `defsubst' to `defun', remove interactive form. Set elmo-message-fetch-confirm when force-reload is non-nil. 2004-07-10 Hiroya Murata * wl-summary.el (toplevel): Removed unnecessary autoload. 2004-07-11 Yoichi NAKAYAMA * wl-message.el (wl-message-exit): Switch to mime-mother-buffer if the buffer is generated from another message buffer. 2004-07-06 Yoichi NAKAYAMA * wl-fldmgr.el (wl-fldmgr-save-access-list): New function extracted from `wl-fldmgr-save-folders'. (wl-fldmgr-delete): Call it after deletion. 2004-07-03 Hiroya Murata * wl-e21.el (wl-plugged-set-folder-icon): Follow the change for multi-tty support. 2004-07-01 Tetsurou Okazaki * wl-folder.el (wl-folder-update-group): Change `defsubst' to `defun'. 2004-06-27 Tetsurou Okazaki * wl-summary.el (wl-summary-rescan): Remove unused variables. (wl-summary-sync-update): Ditto. Narrow the scope of local variables. 2004-06-26 Hiroya Murata * wl-fldmgr.el (wl-delete-entity-sub): Add folder name to unsubscribe list only if argument CLEAR is nil. 2004-06-25 Yoichi NAKAYAMA * wl-draft.el (wl-draft-reply): Decode subject before removing Re: prefix. 2004-06-23 Tetsurou Okazaki * wl-summary.el (wl-summary-sort-by-size): New command. 2004-06-23 Hiroya Murata * wl-summary.el (wl-summary-number-list-from-region): New function. (wl-summary-mark-as-read-region): Use it. (wl-summary-mark-as-unread-region): Ditto. (wl-summary-set-flags-region): Ditto and add optional argument remove. (wl-summary-mark-as-answered-region): Ditto. (wl-summary-mark-as-important-region): Ditto. (wl-summary-target-mark-mark-as-important): Added optional argument remove. (wl-summary-target-mark-mark-as-answered): Ditto. (wl-summary-target-mark-set-flags): Ditto. 2004-06-22 Hiroya Murata * wl-summary.el (wl-summary-set-flags-region): Call `wl-summary-set-flags-internal' with number list instead of call one by each message. (wl-summary-target-mark-set-flags): Likewise. 2004-06-21 Hiroya Murata * wl-summary.el (wl-summary-target-mark-operation): Add optional argument `inverse' and use `wl-summary-delete-all-target-marks'. (wl-summary-target-mark-mark-as-important): Refine to toggle mark. (wl-summary-target-mark-mark-as-answered): Likewise. 2004-06-22 Yoichi NAKAYAMA * wl-summary.el (wl-summary-target-mark-forward): Use `wl-summary-delete-all-target-marks' instead of `wl-summary-delete-all-temp-marks'. (wl-summary-target-mark-reply-with-citation): Ditto. (wl-summary-target-mark-uudecode): Ditto. (wl-summary-target-mark-set-flags): Ditto and remove needless cursor move. 2004-06-21 Yoichi NAKAYAMA * wl-summary.el (wl-summary-target-mark-forward): Protect wl-summary-buffer-target-mark-list from nreverse. (wl-summary-target-mark-reply-with-citation): Ditto. 2004-06-20 Yoichi NAKAYAMA * wl-thread.el (wl-thread-update-indent-string-thread): Use `elmo-display-progress-threshold'. 2004-06-19 Hiroya Murata * wl-summary.el (wl-summary-update-mark-and-highlight-window): No check `wl-summary-highlight'. (wl-summary-window-scroll-functions): Respect value of `wl-summary-highlight'. (wl-summary-sync-update): Run hooks `wl-summary-buffer-window-scroll-functions' at any time. 2004-06-20 Yoichi NAKAYAMA * wl-summary.el (wl-summary-exec-with-confirmation): Extracted from `wl-summary-cleanup-temp-marks'. (wl-summary-cleanup-temp-marks): Abolish argument. * wl.el (wl-save-status): Revert previous change. (wl-execute-temp-marks): New function, call `wl-summary-exec-with-confirmation'. * wl-folder.el (wl-folder-mode-map): Bind "x" to it. (wl-folder-save-and-exec-marks): Abolished. 2004-06-19 Yoichi NAKAYAMA * wl-e21.el (wl-e21-display-image-p): Respect `wl-highlight-folder-with-icon'. (wl-e21-highlight-folder-group-line): Highlight mouse line even if wl-e21-display-image-p is nil. * wl-summary.el (wl-summary-update-mark-and-highlight-window): Respect value of `wl-summary-highlight'. * wl.el (wl-save-status): Remove unused variable. * wl-folder.el (wl-folder-save-and-exec-marks): New function. (wl-folder-mode-map): Bind it to "x". 2004-06-18 Yoichi NAKAYAMA * wl-summary.el (wl-summary-sync-update): Utilize lazy-highlight. * wl-thread.el (wl-thread-get-parent-list): Don't check disconnected ancestors, neglecting needless work in `wl-thread-update-indent-string-thread'. * wl.el (wl-save): Take prefix argument to execute remaining marks. * wl-summary.el (wl-summary-cleanup-temp-marks): Abolish unused argument, add argument default-keep to keep marks by default. * Version number is increased to 2.11.30. * wl-vars.el (wl-draft-reply-with-argument-list): Fix customization type and docstring. (wl-draft-reply-without-argument-list): Ditto. 2004-06-13 Hiroya Murata * wl-vars.el (wl-summary-mark-action-list): Fix customization type. * wl-spam.el (wl-spam-mark-action-list): Ditto. 2004-06-14 Yoichi NAKAYAMA * wl-vars.el (wl-summary-mark-action-list): Fix customization type. 2004-06-12 Yoichi NAKAYAMA * wl-draft.el (wl-draft-config-exec): Narrow the range of save-excursion so as not to include run-hooks. 2004-06-11 Yoichi NAKAYAMA * wl-summary.el (wl-summary-cleanup-temp-marks): defsubst->defun. Clarify that marks are going to be cleared. 2004-06-09 Hiroya Murata * wl-summary.el (wl-summary-persistent-mark-string): Decide mark according to 3rd element of wl-summary-flag-mark. * wl-vars.el (wl-summary-flag-alist): Add description for mark. 2004-06-07 Hiroya Murata * wl-action.el (wl-summary-target-mark-all): Don't set wl-summary-buffer-target-mark-list by elmo-folder-list-messages. 2004-06-06 Yoichi NAKAYAMA * wl-vars.el (wl-reply-subject-prefix): The value can be function. (wl-forward-subject-prefix): Ditto. * wl-draft.el (wl-draft-forward-make-subject): Change accordingly. (wl-draft-reply-make-subject): Ditto. * wl-draft.el (wl-draft-forward-make-subject): Extracted from `wl-draft-forward'. (wl-draft-reply-make-subject): Ditto from `wl-draft-reply'. 2004-06-04 Yoichi NAKAYAMA * wl-action.el (wl-summary-target-mark-set-action): Stop if target message does not exist. 2004-06-04 Tsutomu OKADA * wl-vars.el (wl-subject-re-prefix-regexp): Renamed from `wl-subject-prefix-regexp'. (wl-subject-forward-prefix-regexp): New variable. * wl-draft.el (wl-draft-strip-subject-regexp): Renamed from `wl-draft-strip-subject-re' and take regexp as argument. (wl-draft-forward): Use it. (wl-draft-reply): Ditto. 2004-05-30 ARISAWA Akihiro * wl-e21.el (wl-highlight-plugged-current-line): Change for emacs multi-tty support. 2004-05-29 ARISAWA Akihiro * wl-e21.el (wl-e21-display-image-p): Don't call `display-images-p'. (wl-e21-highlight-folder-group-line): Change for emacs multi-tty support. (wl-highlight-folder-current-line): Ditto. (wl-folder-init-icons): Ditto. 2004-05-26 Yoichi NAKAYAMA * wl-summary.el (wl-summary-cursor-move-surface): Avoid error on the last line of summary in unplugged mode. 2004-05-26 Tetsurou Okazaki * wl-vars.el (wl-refile-rule-alist): Doc fix. 2004-05-23 Yoichi NAKAYAMA * wl-vars.el (wl-user-mail-address-regexp): New variable. * wl-address.el (wl-address-user-mail-address-p): Use it. (wl-address-delete-user-mail-addresses): Ditto. Suggested by David Bremner , [wl-en:463] * wl-address.el (wl-address-user-mail-address-p): defsubst->defun. (wl-address-delete-user-mail-addresses): Ditto. * wl-address.el (wl-address-delete-user-mail-addresses): New function. * wl-refile.el (wl-refile-guess-by-history): Use it. * wl-draft.el (wl-draft-delete-myself-from-cc): Ditto. (wl-draft-make-mail-followup-to): Ditto and fix logic. * wl-draft.el (wl-draft-edit-string): To judge sender address, use wl-address-user-mail-address-p. 2004-05-22 Yoichi NAKAYAMA * wl-folder.el (wl-folder-open-close): Keep cursor on the line after opening group. 2004-05-22 Hiroya Murata * wl-draft.el (wl-draft-reply): Use set-buffer-multibyte instead of elmo-set-buffer-multibyte. * wl-message.el (wl-original-message-mode): Ditto. * wl-score.el (wl-score-insert-header): Ditto. * wl-summary.el (wl-summary-edit-addresses-collect-candidate-fields): Ditto. (wl-summary-goto-folder-subr): Ditto. (wl-summary-insert-headers): Ditto. * wl-util.el (wl-set-string-width): Ditto. * Version number is increased to 2.11.29. 2004-05-20 Yoichi NAKAYAMA * wl-vars.el (wl-use-flag-folder-help-echo): Avolished. (wl-highlight-summary-line-help-echo-alist): New variable. * wl-highlight.el (wl-highlight-summary-line-flag-folder): Divide into `wl-highlight-summary-line-help-echo' and `wl-highlight-flag-folder-help-echo'. (wl-highlight-summary-line-string): Change accordingly. (wl-highlight-summary-current-line): Ditto. 2004-05-18 Yoichi NAKAYAMA * wl-highlight.el (wl-highlight-message): Ignore white spaces at the beginning of field body (Thanks to Markus Knittig). * wl-draft.el (wl-draft-insert-current-message): Also check summary buffer, remove unnecessary tag. 2004-05-17 Yoichi NAKAYAMA * wl-draft.el (wl-draft-insert-current-message): Cause error also when wl-message-buffer is nil. * wl-folder.el (wl-folder): Abolish unused argument. Call wl-folder-init when wl-folder-entity is nil. * wl.el (wl): Change accordingly. 2004-05-16 Hiroya Murata * wl-draft.el (wl-draft-yank-from-mail-reply-buffer): Convert to multibyte string before insert into draft buffer. (wl-draft-create-buffer): Always enable multibyte characters for draft buffer. * Version number is increased to 2.11.28. 2004-05-12 Yoichi NAKAYAMA * wl-folder.el (wl-folder-open-close): Handle blank line. (wl-folder-jump-to-current-entity): Ditto. 2004-05-09 Hiroya Murata * Version number is increased to 2.11.27. 2004-04-29 Yoichi NAKAYAMA * wl-thread.el (wl-thread-insert-message): When the thread is devided by wl-summary-max-thread-depth, insert line at the end of buffer. 2004-04-18 Hiroya Murata * Version number is increased to 2.11.26. 2004-04-18 Yoichi NAKAYAMA * wl-vars.el (wl-draft-sendlog-max-size): Add nil to range. 2004-04-17 Yoichi NAKAYAMA * wl-draft.el (wl-draft-send-mail-with-pop-before-smtp): Fix value of stream-type and session. 2004-04-16 Hiroya Murata * Version number is increased to 2.11.25. 2004-04-16 Tetsurou Okazaki * wl-summary.el (wl-summary-sync-update): Remove duplicated period in a quit message. 2004-04-10 Yoichi NAKAYAMA * wl-summary.el (wl-summary-redisplay-all-header): Set cached. (wl-summary-redisplay-no-mime-internal): Ditto. 2004-04-03 Yoichi NAKAYAMA * wl-draft.el (wl-smtp-extension-bind): Support smtp over ssl. * wl-vars.el (wl-smtp-connection-type): Ditto. 2004-04-03 Colin Rafferty * wl-highlight.el (wl-highlight-message): Change to strict regexp for the separator line and quote mail-header-separator. 2004-04-02 Hiroya Murata * wl-spam.el (wl-message-check-spam): Fixed problem no display result message. * wl-addrmgr.el (wl-addrmgr-address-entry-list): Call `elmo-multiple-fields-body-list' with boundary as mail-header-separator. 2004-04-01 Yoichi NAKAYAMA * wl-refile.el (wl-refile-guess-by-from): Use elmo-concat-path. 2004-03-27 Yuuichi Teranishi * wl-util.el (wl-list-diff): Remove unused function. * wl-draft.el (wl-draft-send-confirm): Discard input before confirmation. 2004-03-13 Hiroya Murata * wl-vars.el (wl-summary-persistent-mark-priority-list): Changed order of flag and new. 2004-02-21 Hiroya Murata * wl-vars.el (wl-refile-policy-alist): Abolished. * wl-action.el (wl-summary-set-action-refile): Follow the change above. 2004-02-19 Katsumi Yamaoka * wl-highlight.el (wl-highlight-signature-search): Don't use re-search-backward for a long word since it is possible to crash XEmacs because of a bug. 2004-02-15 Tetsurou Okazaki * wl-message.el (wl-message-buffer-prefetch-p): Change `defsubst' to `defun'. 2004-02-13 Yuuichi Teranishi * wl-summary.el (wl-summary-goto-folder-subr): Don't give 'no-check argument for wl-summary-sync-force-update. 2004-02-12 Yuuichi Teranishi * wl-summary.el (wl-summary-mode-map): Revival of wl-summary-mark-as-important related bindings; Bind 'F','tF','mF','rF','m&'. (wl-summary-mark-as-important-region): Revival. (wl-summary-target-mark-mark-as-important): Ditto. (wl-summary-target-mark-operation): New function. (wl-summary-target-mark-mark-as-answered): Use it. (wl-summary-decide-flag): Don't set Important as default. (wl-summary-mark-as-important-internal): Revival. (wl-summary-mark-as-important): Ditto. * wl-thread.el (wl-thread-mark-as-important): Ditto. * wl-highlight.el (wl-highlight-summary-line-face-spec): Use find-face instead of facep. 2004-02-10 Yuuichi Teranishi * wl-dnd.el (wl-dnd-drop-func): Fix. * wl-message.el (wl-message-header-narrowing-widen-at-mouse): Use mouse-set-point instead of posn-point. * wl-xmas.el (wl-completing-read-multiple): Define as function. * wl-mule.el (wl-completing-read-multiple): Ditto. 2004-02-10 Hiroya Murata * wl-demo.el (face-background-name): Defalias to avoid compile warning. 2004-02-10 Yuuichi Teranishi * wl-summary.el (wl-summary-decide-flag): Use wl-completing-read-multiple instead of completing-read-multiple. * wl-mule.el,wl-e21.el,wl-xmas.el (wl-completing-read-multiple): New alias. * wl-demo.el (wl-demo-setup-properties)[XEmacs]: Use face-background-name instead of face-background. * wl-vars.el (wl-summary-save-file-suffix): New user option. * wl-summary.el (wl-summary-save): Use it. (wl-summary-mode-menu-spec): Added wl-summary-sort-by-size. * wl-mime.el (wl-mime-save-content): Fix last change. 2004-02-10 Len Trigg * wl-summary.el (wl-summary-overview-entity-compare-by-size): New function. (wl-summary-sort-specs): Added sort. * wl-mime.el (wl-mime-save-content): Expand file name. 2004-02-10 Yuuichi Teranishi * wl-mime.el (wl-draft-preview-message): Fixed typo. * wl-vars.el (wl-draft-always-delete-myself): Ditto. 2004-02-09 Hiroya Murata * wl-highlight.el (wl-highlight-summary-line-face-spec): Make face for flag if it is not defined. 2004-02-09 Yuuichi Teranishi * wl-e21.el (wl-highlight-folder-current-line): Use elmo-folder-type-internal when elmo-folder-type returns nil. * wl-xmas.el (wl-highlight-folder-current-line): Ditto. * wl.el (wl-init): Setup faces accoding to wl-summary-flag-alist. * wl-xmas.el (wl-summary-toolbar): Setup wl-summary-set-flags. * wl-e21.el (wl-summary-toolbar): Ditto. * wl-vars.el (wl-demo-background-color): Abolished. (wl-summary-persistent-mark-priority-list): Renamed from wl-summary-flag-priority-list. (wl-summary-flag-alist): New user option. (wl-summary-flag-mark): Renamed from wl-summary-important-mark. (wl-message-mode-line-format-spec-alist): Added 'F'. (wl-message-mode-line-format): Likewise. (wl-summary-expire-reserve-marks): Use wl-summary-flag-mark instead of wl-summary-important-mark. (wl-file-folder-icon): New variable. * wl-thread.el (wl-thread-set-flags): Renamed from wl-thread-mark-as-important. * wl-summary.el: Define `elmo-global-flag-list' to avoid byte-compile warning. (wl-summary-mode-menu-spec): Follow the change of `wl-summary-mark-as-important', `wl-thread-set-flags', and so on. (wl-summary-mode-map): Follow the change of `wl-summary-mark-as-important', `wl-thread-set-flags', and so on. (wl-summary-detect-mark-position): Follow the variable name change. (wl-summary-set-flags-region): New function for the replacement of wl-summary-mark-as-important-region. (wl-summary-sync-marks): Sync all global-flags. (wl-summary-auto-select-msg-p): Use elmo-message-has-global-flag-p instead of elmo-message-flagged-p. (wl-summary-persistent-mark-string): Follow the variable name change; Put wl-summary-flag-mark if the message has global-flag. (wl-summary-target-mark-set-flags): Renamed from wl-summary-target-mark-mark-as-important. (wl-summary-decide-flag): New function. (wl-summary-set-flags-internal): Renamed from wl-summary-mark-as-important-internal. (wl-summary-add-flags-internal): New function. (wl-summary-remove-flags-internal): Ditto. (wl-summary-set-flags): Renamed from wl-summary-mark-as-important. (wl-summary-mark-as-unimportant): Abolish. (wl-summary-move-spec-alist): Changed `important' to `digest'. (wl-summary-next-message): List flagged messages in the msgdb. * wl-score.el (wl-summary-score-update-all-lines): Use wl-summary-add-flags-internal instead of * wl-mime.el (wl-mime-display-header): Follow the variable name change. * wl-message.el (wl-message-buffer-cur-display-type): Renamed from wl-message-buffer-cur-flag (To avoid misunderstanding). (wl-message-buffer-require-all-header): Renamed from wl-message-buffer-all-header-flag (Ditto). (wl-message-buffer-flag-indicator): New variable. (wl-message-redisplay): Changed local varibale name from `flag' to `display-type'; Set up wl-message-buffer-flag-indicator. (wl-message-buffer-display): Changed varibale name from `flag' to `display-type'. (wl-message-display-internal): Likewise. * wl-highlight.el (wl-highlight-demo-face): Define default background color. (wl-highlight-summary-line-face-spec): Highlight flagged messages. * wl-e21.el (wl-folder-internal-icon-list): Added file folder icon. * wl-demo.el (wl-demo-xpm-set-background): Abolish. (wl-demo-setup-properties): Renamed from `wl-demo-set-background-color'. (wl-demo): Follow the change above. * Version number is increased to 2.11.24. 2004-02-06 Hiroya Murata * wl-summary.el (wl-summary-toggle-thread): Call `wl-summary-rescan' with disable-thread as non-nil. (Thanks to KOBAYASHI Shinji ) 2004-02-01 Yuuichi Teranishi * wl-demo.el (wl-demo-set-background-color)[Emacs21]: Set slant and foreground property of the face. (wl-demo-insert-text): Don't set up face property here. (wl-demo): Call wl-demo-set-background-color, anyway. 2004-02-01 Yoichi NAKAYAMA * wl-vars.el (wl-demo-background-color): The value can be nil. 2004-01-29 Yuuichi Teranishi * wl-summary.el (wl-summary-setup-mouse)[non-xemacs]: Bind mouse-wheel1 to wl-summary-wheel-dispatcher. * wl-e21.el (wl-message-define-keymap): Bind mouse-wheel1 to wl-message-wheel-dispatcher. (wl-message-wheel-dispatcher): New function. (wl-summary-wheel-dispatcher): Ditto. 2004-01-28 Yuuichi Teranishi * wl-action.el (wl-summary-target-mark-all): List messages which are not in the killed-list. * wl-summary.el (wl-summary-mark-as-important-internal): Cause an error only when the folder is 'flag/important. * wl-address.el (wl-complete-field-body): Complete if the last character is a space. 2004-01-28 Hiroya Murata * wl-folder.el (wl-folder-clear-entity-info): Use elmo-clear-hash-val. * wl-fldmgr.el (wl-fldmgr-rename): Set wl-folder-info-alist-modified as t. 2004-01-25 Yoichi NAKAYAMA * wl-fldmgr.el (wl-fldmgr-unsubscribe): Avoid compile warning. 2004-01-21 Yoichi NAKAYAMA * wl-folder.el (wl-folder-jump-to-current-entity): Cosmetic fix. (wl-folder-buffer-last-visited-entity-id): New buffer local variable. (wl-folder-revisit-last-visited-folder): New function. (wl-folder-mode-map): Bind it to "C-i". (wl-folder-set-current-entity-id): Set last visited folder. * wl-summary.el (wl-summary-exit): Ditto. 2004-01-15 Katsumi Yamaoka * wl-draft.el (wl-draft-highlight-and-recenter): Redraw frame just before calling `recenter' in order to cope with an XEmacs bug. 2004-01-12 Yoichi NAKAYAMA * wl-vars.el (wl-folder-hierarchy-access-folders): Add "^'$" to the default value. 2004-01-11 Hiroya Murata * wl-summary.el (wl-summary-mark-as-read-all): Follow the API change. (wl-summary-sync-marks): Ditto. (wl-summary-mark-as-read-internal): Ditto. (wl-summary-mark-as-answered-internal): Ditto. (wl-summary-mark-as-important-internal): Ditto. (wl-summary-reply): Ditto. * wl-draft.el (wl-draft-kill): Use `elmo-folder-unset-flag' instead of `elmo-folder-unflag-answered'. * Version number is increased to 2.11.23. * wl-spam.el (wl-summary-exec-action-refile-with-register): Fixed the last change. 2004-01-11 Kenichi Okada * wl-spam.el (wl-summary-exec-action-refile-with-register): Specify "spam" or "good". 2004-01-11 Yuuichi Teranishi * wl-spam.el (wl-summary-exec-action-spam): Call wl-folder-confirm-existence for spam folder. (wl-spam-setup): Bind "mk". 2004-01-07 Hiroya Murata * wl-action.el (wl-summary-refile-prev-destination): Avoid warning. 2004-01-07 Yoichi NAKAYAMA * wl-action.el (wl-summary-set-action-refile): Don't proceed if destination folder is empty. 2004-01-07 Yuuichi Teranishi * wl-summary.el (wl-summary-buffer-prev-copy-destination): Abolish. (wl-summary-mode-map): Bound "t\M-o", "m\M-o" and "r\M-o". * wl-action.el (wl-summary-refile-prev-destination): Rewrite. (wl-summary-refile-prev-destination-region): New function. (wl-thread-refile-prev-destination): Ditto. (wl-summary-target-mark-refile-prev-destination): Ditto. 2004-01-05 Yuuichi Teranishi * wl-vars.el (wl-demo-image-filter-alist): Set default value to nil. (wl-demo-background-color): Changed default value. * wl-highlight.el (wl-highlight-demo-face): Changed default foreground color. * wl-demo.el (wl-demo-set-background-color): New function. (wl-demo): Call it. 2004-01-03 Yoichi NAKAYAMA * wl-address.el (wl-address-delete): Avoid mis-deleting. * wl-address.el (wl-address-add-or-change): Don't add empty address. 2004-01-01 TAKAHASHI Kaoru * wl-demo.el (wl-demo-copyright-notice): Add 2004. 2003-12-26 Yuuichi Teranishi * wl-vars.el (wl-demo-image-filter-alist): New variable (wl-demo-background-color): Ditto. * wl-demo.el (wl-demo-xpm-set-background): New function. (wl-demo-image-filter): Ditto. (wl-demo-insert-image)[XEmacs,Emacs21]: Use it. * wl-vars.el (wl-demo-icon-name-alist): New variable. * wl-demo.el (wl-demo-icon-name): Define as function. (wl-demo-insert-image): Use it. 2003-12-19 Tetsurou Okazaki * wl-vars.el (wl-draft-mime-bcc-body): Customization type fix. 2003-12-18 Yoichi NAKAYAMA * wl-mime.el (wl-message-verify-pgp-nonmime): Remove kludge. 2003-12-14 Yuuichi Teranishi * wl-action.el (wl-summary-delete-all-mark): Fix for "*". 2003-12-14 Hiroya Murata * wl-thread.el (wl-thread-mark-as-answered): New function. * wl-summary.el (wl-summary-mode-menu-spec): Add "Mark as answered" entry. (wl-summary-mode-map): Bind wl-summary-mark-as-answered-region to "r&" and wl-thread-mark-as-answered to "t&". (wl-summary-mark-as-important-region): Refine to toggle mark. (wl-summary-mark-as-answered-region): New function. (wl-summary-mark-as-answered-internal): Changed to optional 2nd and 3rd argument. (wl-summary-mark-as-important-internal): Likewise. 2003-12-08 Hiroya Murata * wl-template.el (wl-template-preview): New internal variable. (wl-template-preview-p): New function. (wl-template-show): Bind `wl-template-preview' as t. 2003-12-05 Hiroya Murata * wl-mime.el (wl-mime-combine-message/partial-pieces): Call `elmo-message-entity-field' with 3rd argument which is non-nil. 2003-12-04 Hiroya Murata * wl-mime.el (wl-mime-combine-message/partial-pieces): Fixed bug; Removed duplicate local bind `folder'. 2003-11-30 Hiroya Murata * wl-spam.el (wl-spam-folder): Renamed from `wl-spam-folder-name'. 2003-11-29 Hiroya Murata * wl-message.el (wl-message-buffer-cur-summary-buffer): Remove duplicate definition. 2003-11-29 Yuuichi Teranishi * wl-util.el (wl-current-message-buffer): If wl-message-buffer is non-nil, use it; Don't fetch message if there's no message in the current cursor position. 2003-11-29 Yoichi NAKAYAMA * wl-util.el (wl-region-exists-p): Use region-active-p. (wl-deactivate-region): New function. * wl-message.el (wl-message-redisplay): Deactivate region. * wl-summary.el (wl-summary-reply): Call `wl-summary-set-message-buffer-or-redisplay' instead of `wl-summary-redisplay-internal', don't move point. 2003-11-29 Hiroya Murata * wl-util.el (wl-region-exists-p): Remove duplicate definition. (wl-url-nntp): Use `wl-summary-jump-to-msg' instead of searching by regexp. 2003-11-27 Hiroya Murata * wl-spam.el (wl-spam-save-status): Dose not initialize processor if no need. 2003-11-22 Hiroya Murata * wl-spam.el (wl-spam-auto-check-folder-regexp-list): Changed default value to nil. (wl-spam-setup): Added `wl-summary-auto-check-spam' to `wl-summary-prepare-hook'; Replace refile action to `wl-summary-exec-action-refile-with-register'. * Version number is increased to 2.11.22. 2003-11-20 Hiroya Murata * wl-summary.el (wl-summary-detect-mark-position): Set `wl-summary-buffer-weekday-name-lang'. 2003-11-19 Tetsurou Okazaki * wl-summary.el (wl-summary-prefetch-msg): Undo the last change. (wl-summary-mark-as-read-all): Ditto. (wl-summary-delete-messages-on-buffer): Ditto. (wl-summary-sync-update): Ditto. (wl-summary-mark-as-read-internal): Ditto. (wl-summary-mark-as-answered-internal): Ditto. (wl-summary-update-folder-info): Abolished. 2003-11-19 Hiroya Murata * wl-summary.el (wl-summary-mark-as-read-all): Use `wl-summary-update-folder-info' instead of `wl-folder-update-unread'. 2003-11-18 Tetsurou Okazaki * wl-summary.el (wl-summary-update-folder-info): New function derived from `wl-summary-folder-info-update'. (wl-summary-delete-messages-on-buffer): Use `wl-summary-update-folder-info' instead of `wl-summary-folder-info-update'. (wl-summary-sync-update): Use `wl-summary-update-folder-info' instead of `wl-folder-set-folder-updated'. (wl-summary-mark-as-read-internal): Use `wl-summary-update-folder-info' instead of `wl-folder-update-unread'. (wl-summary-mark-as-answered-internal, wl-summary-prefetch-msg): Pass the value of `wl-summary-buffer-unread-count' for the second parameter of `wl-folder-update-unread'. * Version number is increased to 2.11.21. 2003-11-17 Tetsurou Okazaki * wl-folder.el (wl-folder-entity-hashtb-set): Narrow the scope of a local variable. 2003-11-15 Hiroya Murata * wl-spam.el (wl-summary-mark-spam): Show message only if call interactively. * wl-summary.el (wl-summary-mark-as-important-internal): New internal function. (wl-summary-mark-as-important): Use it. (wl-summary-mark-as-unimportant): New function. (wl-summary-sync-marks): Follow the API change. * wl-score.el (wl-summary-score-update-all-lines): Ditto. * wl-mime.el (wl-summary-burst): Check target folder is writable. 2003-11-14 Tetsurou Okazaki * wl-folder.el (wl-folder-update-unread): Re-indent. Narrow the scope of a local variable. 2003-11-12 Hiroya Murata * wl-addrmgr.el (wl-addrmgr-pickup-entry-list): New function. (wl-addrmgr-merge-entries): Ditto. (wl-addrmgr): Added to address entry which exists in draft buffer if no entry is in original. 2003-11-09 Yuuichi Teranishi * wl-batch.el: New file. 2003-11-09 TAKAHASHI Kaoru * wl-vars.el (wl-use-semi): Remove unused variable. 2003-11-05 Yuuichi Teranishi * wl-vars.el (wl-summary-new-cached-mark): Changed default value to "?". 2003-11-05 Hiroya Murata * wl-vars.el (wl-summary-new-uncached-mark): Renamed from wl-summary-new-mark. (wl-summary-new-cached-mark): New user option. (wl-summary-score-marks): Follow the change above. (wl-summary-auto-refile-skip-marks): Ditto. (wl-summary-incorporate-marks): Ditto. (wl-summary-expire-reserve-marks): Ditto. * wl-spam.el (wl-spam-auto-check-marks): Ditto. * wl-summary.el (wl-summary-detect-mark-position): Ditto. (wl-summary-persistent-mark-string): Distinguished between cached and uncached mark when the message is new. 2003-11-02 Hiroya Murata * wl-spam.el (wl-spam-domain): Renamed from `wl-spam-folder-guess-domain'. (wl-summary-exec-action-spam): Register as spam if domain of the source folder is good. (wl-summary-exec-action-refile-with-register): Register message if domain of the source folder is not undecided. 2003-10-31 Hiroya Murata * wl-summary.el (wl-summary-insert-thread): Fixed the logic to detect thread loop. 2003-10-27 Hiroya Murata * wl-spam.el (wl-spam-setup): Modify wl-summary-reserve-mark-list and wl-summary-skip-mark-list. 2003-10-26 Hiroya Murata * wl-spam.el (wl-summary-exec-action-spam): Fixed. * wl-vars.el (wl-summary-mark-action-list): Fixed type spec. * wl-spam.el (toplevel): Require wl-highlight. (wl-spam-auto-check-policy-alist): Abolish. (wl-spam-auto-check-folder-regexp-list): New user option. (wl-spam-auto-check-marks): Ditto. (wl-spam-mark-action-list): Ditto. (wl-highlight-summary-spam-face): New face. (wl-spam-auto-check-message-p): New function. (wl-spam-map-spam-messages): Fixed message. (wl-spam-register-spam-messages): Ditto. (wl-spam-register-good-messages): Ditto. (wl-summary-spam-map): Add and remove keybind. (wl-summary-target-mark-spam): Abolish. (wl-summary-refile-spam): Ditto. (wl-summary-test-spam): New function. (wl-summary-mark-spam): Ditto. (wl-summary-auto-check-spam): Follow the above change. (wl-summary-exec-action-spam): New function. (wl-summary-exec-action-refile-with-register): Fixed message. (wl-message-check-spam): New function. (wl-spam-setup): Ditto. (toplevel): Call it if this file is loaded interactivity. * Version number is increased to 2.11.20. 2003-10-25 Hiroya Murata * wl-spam.el (wl-spam-save-status): Call elmo-spam-save-status when new optional argument `force' is non nil or modified. 2003-10-21 Hiroya Murata * wl.el (toplevel): Require wl-spam when compile. (wl-save-status): Call wl-spam-save-status. * wl-spam.el (wl-spam-register-spam-messages): New function. (wl-spam-register-good-messages): Ditto. (wl-spam-save-status): Ditto. (wl-summary-mode-map): Bind wl-summary-target-mark-register-as-spam to "ms" and wl-summary-target-mark-register-as-good to "mn". (wl-summary-register-as-spam): Abolish optional argument; Use wl-spam-register-spam-messages. (wl-summary-register-as-spam-all): Use wl-spam-register-spam-messages. (wl-summary-register-as-good): Abolish optional argument; Use wl-spam-register-good-messages. (wl-summary-register-as-good-all): Use wl-spam-register-good-messages. (wl-summary-target-mark-register-as-spam): New funtion. (wl-summary-target-mark-register-as-good): Ditto. 2003-10-20 Hiroya Murata * wl-spam.el: New file. 2003-10-20 Hiroya Murata * wl-refile.el (wl-refile-guess): Added second argument `functions'. * wl-action.el (wl-auto-refile-guess-functions): New variable. (wl-summary-auto-refile): Call wl-refile-guess with wl-auto-refile-guess-functions instead of wl-refile-guess-by-rule. 2003-10-17 Hiroya Murata * wl-summary.el (wl-summary-pack-number): Call wl-summary-rescan with disable-thread argument non-nil. 2003-10-16 Hiroya Murata * wl-summary.el (wl-summary-rescan): Added optional argument disable-thread. (wl-summary-sync): Call wl-summary-rescan with argument disable-thread. (wl-summary-input-range): Added new range `rescan-thread'. 2003-10-16 Yuuichi Teranishi * wl-util.el (wl-get-assoc-list-value): Fixed last change. 2003-10-16 Hiroya Murata * wl-summary.el (wl-thread-saved-entity-hashtb-internal): New internal variable. (wl-summary-rescan): Saved wl-thread-entity-hashtb; Bind wl-summary-search-parent-by-subject-regexp and wl-summary-divide-thread-when-subject-changed as nil. (wl-summary-insert-sequential): If entity is nil, nothing to do. (wl-summary-insert-thread): Search parent entity from wl-thread-saved-entity-hashtb-internal; Fixed logic to detect thread loop. 2003-10-15 Yuuichi Teranishi * wl.el (wl-check-environment): Don't check wl-draft-folder is file. * wl-vars.el (wl-folder-sync-range-alist): Changed default value. * wl-util.el (wl-require-update-all-folder-p): New function. (wl-get-assoc-list-value): Added `function' to match directive. (wl-collect-draft): Rewrite. * wl-summary.el (wl-summary-sync-update): Clear faces when both wl-summary-lazy-highlight and wl-summary-lazy-update-mark are non-nil. (wl-summary-get-sync-range): Call wl-get-assoc-list-value with match argument as function. (wl-summary-input-range): Ditto. * wl-folder.el (wl-draft-get-folder): New function. (wl-folder-get-elmo-folder): Consider draft folder. * wl-draft.el (wl-draft-buf-name, wl-draft-buffer-file-name): Abolish. (wl-draft-buffer-message-number): New buffer local variable. (wl-draft-folder-internal): New internal variable. (wl-draft-delete): Rewrite. (wl-draft-save): Ditto. (wl-draft-create-buffer): Use wl-draft-get-folder instead of wl-folder-get-elmo-folder. (wl-draft-config-info-operation): Ditto. (wl-jump-to-draft-folder): Ditto. (wl-draft-prepare-edit): Set up auto-save-file-name-transforms. (wl-draft-reedit): Rewrite. * Version number is increased to 2.11.19. 2003-10-09 Tetsurou Okazaki * wl-summary.el (wl-summary-search-by-subject): Remove unused local variable. 2003-10-09 Hiroya Murata * wl-summary.el (wl-summary-prefetch-msg): Bind wl-message-entity; Use ignore-errors instead of unwind-protect. 2003-10-03 Tetsurou Okazaki * wl-thread.el (wl-thread-delete-message): Rewrite the procedure for updating `wl-thread-entity-list'. 2003-10-02 Tetsurou Okazaki * wl-thread.el (wl-thread-delete-message): Omit redundant nil parameter from calling `wl-thread-entity-get-older-brothers' and `wl-thread-entity-get-younger-brothers'. Replace nested `append' with a single one. 2003-10-02 Hiroya Murata * wl-summary.el (wl-summary-mode): Don't use the return value of `make-local-hook'. 2003-10-02 Tetsurou Okazaki * wl-thread.el (wl-thread-entity-get-older-brothers): Use `let' instead of `let*'. (wl-thread-delete-message): Likewise. Split and narrow the scope of local variables. 2003-10-01 Hiroya Murata * wl-summary.el (wl-summary-buffer-window-scroll-functions): Renamed from wl-summary-window-scroll-functions. (wl-summary-window-scroll-functions): Don't set to variable. (wl-summary-display-top): Use run-hooks. (wl-summary-display-bottom): Ditto. (wl-summary-toggle-disp-msg): Ditto. (wl-summary-mode): Set wl-summary-buffer-window-scroll-functions; Use it instead of wl-summary-window-scroll-functions. (wl-summary-goto-folder-subr): Don't call wl-summary-window-scroll-functions, use wl-summary-buffer-window-scroll-functions instead. 2003-09-30 Hiroya Murata * wl-summary.el (wl-summary-mode): Use make-local-hook instead of make-local-variable. 2003-09-29 Yuuichi Teranishi * wl-summary.el (wl-summary-update-mark-and-highlight-window): Call set-buffer-modified-p. (wl-summary-display-top): Call wl-summary-window-scroll-functions. (wl-summary-display-bottom): Ditto. (wl-summary-toggle-disp-msg): Ditto. 2003-09-29 Hiroya Murata * wl-score.el (wl-score-ov-entity-get): Treat extra field. * wl-summary.el (wl-summary-prefetch-msg): Fixed. (wl-summary-forward): Use elmo-message-entity-field instead of elmo-message-field. * wl-summary.el (wl-summary-update-mark-and-highlight-window): Fixed. 2003-09-28 Hiroya Murata * wl-summary.el (wl-summary-window-scroll-functions): No use `append'. 2003-09-28 Yuuichi Teranishi * wl-summary.el (wl-summary-update-mark-and-highlight-window): New function. (wl-summary-window-scroll-functions): Call it when both wl-summary-lazy-highlight and wl-summary-lazy-update-mark are non-nil. (wl-summary-temp-mark): Added optional argument number. (wl-summary-message-mark): Added optional argument flag. (wl-summary-persistent-mark): Added optional argument number and flag. (wl-summary-update-persistent-mark): Ditto. (wl-summary-update-status-marks): Set "r" for interactive spec. * wl-highlight.el (wl-highlight-summary-current-line): Added optional argument number and flag. * wl-action.el (wl-summary-registered-temp-mark): Do nothing when wl-summary-buffer-temp-mark-list is nil. 2003-09-28 Hiroya Murata * wl-summary.el (wl-summary-buffer-unsync-mark-number-list): New internal variable (buffer local). (wl-summary-window-scroll-functions): New function. (wl-summary-mode): Use it insteaf of wl-summary-lazy-highlight. (wl-summary-rescan): Set wl-summary-buffer-unsync-mark-number-list as nil. (wl-summary-update-status-marks): Added arguments beg, end and check. (wl-summary-update-mark-window): Use function. (wl-summary-sync-update): Follow the change above. (wl-summary-switch-to-clone-buffer): Copy wl-summary-buffer-unsync-mark-number-list. (wl-summary-goto-folder-subr): Set wl-summary-buffer-unsync-mark-number-list and use wl-summary-window-scroll-functions instead of wl-summary-lazy-highlight. * wl-vars.el (wl-summary-lazy-update-mark): New user option. 2003-09-27 Hiroya Murata * wl-summary.el (wl-summary-sync-update): Undo last chagne. * wl-summary.el (wl-summary-update-persistent-mark): Call wl-summary-set-message-modified. * wl-summary.el (wl-summary-sync-update): Don't call wl-summary-update-status-marks. * Version number is increased to 2.11.18. 2003-09-26 Yuuichi Teranishi * wl-message.el (wl-message-prev-page): Use save-selected-window. (wl-message-next-page): Ditto. 2003-09-26 Tetsurou Okazaki * wl-action.el (wl-summary-collect-numbers-region): Remove unused local variable. Change the order of a collected list into the same as the specified range. Remove nil from a collected list. 2003-09-26 Hiroya Murata * wl-summary.el (wl-summary-insert-headers): Set visible-only argument for elmo-folder-list-messages. 2003-09-24 Hiroya Murata * wl-score.el (wl-summary-score-update-all-lines): Follow the API change (wl-summary-count-unreads return a list instead of a cons cell). 2003-09-24 Tetsurou Okazaki * wl-summary.el (wl-summary-delete-messages-on-buffer): Use `wl-summary-folder-info-update'. 2003-09-23 Hiroya Murata * wl-summary.el (wl-summary-set-message-modified): No use elmo-folder-set-message-modified and wl-summary-set-mark-modified. (wl-summary-set-mark-modified): Abolish. (wl-summary-mark-modified-p): Ditto. (wl-summary-save-view): Follow the change above. * wl-expire.el (wl-summary-expire): Likewise. 2003-09-22 Yuuichi Teranishi * wl-summary.el (wl-summary-detect-mark-position): Use modb-entity-handler. (wl-summary-save-view-cache): Don't cause an error when dir is nil. * Version number is increased to 2.11.17. 2003-09-21 Yuuichi Teranishi * wl-summary.el (wl-summary-overview-entity-compare-by-from): Decode entity field value. (wl-summary-prefetch-msg): Ditto. (wl-summary-print-message-with-ps-print): Ditto. 2003-09-21 Yuuichi Teranishi * wl-summary.el (wl-summary-detect-mark-position): Use generic msgdb for dummy entity. (wl-summary-insert-thread): Use elmo-message-entity-field. (wl-summary-update-thread): Use elmo-message-entity-field and elmo-message-entity-number. (wl-summary-line-number): Use elmo-message-entity-number. (wl-summary-line-size): Use elmo-message-entity-field. (wl-summary-line-subject): Ditto. (wl-summary-line-from): Ditto. (wl-summary-line-attached): Ditto. (wl-summary-create-line): Ditto. (wl-summary-create-line): Use elmo-message-entity-number. (wl-summary-print-message-with-ps-print): Use elmo-message-entity-field. 2003-09-21 Yuuichi Teranishi * wl-summary.el (wl-summary-detect-mark-position): Follow the API change in elmo-msgdb-make-message-entity. (wl-summary-buffer-set-folder): Don't call wl-summary-detect-mark-position here. (wl-summary-rescan): Call elmo-message-entity-number. (wl-summary-sync-update): Ditto. (wl-summary-goto-folder-subr): Call wl-summary-detect-mark-position. * wl-score.el (wl-score-header-index): Redefine 2th element. (wl-score-overview-entity-get-extra): Abolish. (wl-score-ov-entity-get): Rewrite. (wl-score-string-index<, wl-score-string-func<): Abolish. (wl-score-string<): New function. (wl-score-string-sort): Use it. * wl-refile.el (wl-refile-guess-by-history): Use elmo-message-entity-field. (wl-refile-guess-by-from): Ditto. (wl-refile-guess-by-msgid): Ditto. * Version number is increased to 2.11.16. 2003-09-21 Yoichi NAKAYAMA * wl-folder.el (wl-folder-confirm-existence): Don't call file-exists-p if msgdb-path is nil. * wl-summary.el, wl-draft.el, wl-action.el: Rename `wl-read-folder-hist' to `wl-read-folder-history'. 2003-09-20 TAKAHASHI Kaoru * wl-draft.el (wl-draft-kill): Use `yes-or-no-p' instead of `y-or-n-p'. 2003-09-19 Hiroya Murata * wl-score.el (wl-score-headers): Don't use elmo-folder-do-each-message-entity. * Version number is increased to 2.11.15. 2003-09-19 Yuuichi Teranishi * wl-summary.el (wl-summary-delete-all-msgs): Use elmo-folder-move-messages instead of elmo-folder-delete-messages and elmo-folder-detach-messages. (wl-summary-sync-marks): Use elmo-folder-list-global-flag-messages. * wl-expire.el (wl-expire-delete): Ditto. (wl-expire-refile-with-copy-reserve-msg): Ditto. 2003-09-18 Yuuichi Teranishi * wl-vars.el (wl-message-use-header-narrowing): New user option. (wl-message-header-narrowing-fields): Ditto. (wl-message-header-narrowing-lines): Ditto. (wl-message-header-narrowing-string): Ditto. * wl-summary.el (wl-summary-mode-map): Bind wl-summary-toggle-header-narrowing to "C-cC-f". (wl-summary-toggle-header-narrowing): New function. * wl-message.el (wl-message-buffer-create): Call wl-message-header-narrowing-setup. (wl-message-redisplay): Call wl-message-header-narrowing. (wl-message-header-narrowing): New function. (wl-message-header-narrowing-map): New keymap. (wl-message-header-narrowing-widen-map): New keymap. (wl-message-header-narrowing-again-at-mouse): New function. (wl-message-header-narrowing-1): Ditto. (wl-message-header-narrowing-widen-at-mouse): Ditto. (wl-message-header-narrowing-setup): Ditto. (wl-message-header-narrowing-toggle): Ditto. * wl-highlight.el (wl-message-header-narrowing-face): New face. * wl-vars.el (wl-folder-sync-range-alist): Set default range for 'flag as all. (wl-use-flag-folder-help-echo): New user option. * wl-summary.el (wl-summary-detect-mark-position): Bind wl-summary-highlight as nil. (wl-summary-set-mark-modified): Follow the API change. (wl-summary-mark-modified-p): Ditto. (wl-summary-mark-as-read-all): Ditto. (wl-summary-sync-marks): Don't call elmo-folder-list-messages-with-global-mark. (wl-summary-mark-as-read-internal): Follow the API change. (wl-summary-mark-as-answered-internal): Ditto. (wl-summary-mark-as-important): Cause an error when 'flag folder; Follow the API change. (wl-summary-create-line): Call with number argument. (wl-summary-reply): Follow the API change. * wl-highlight.el (wl-highlight-summary-line-flag-folder): New function. (wl-highlight-summary-line-string): Call it when wl-use-flag-folder-help-echo is non-nil. (wl-highlight-summary-current-line): Ditto. (elmo-flag-folder-referrer): Added autoload setting. * wl-draft.el (wl-draft-kill): Follow the API change. * Version number is increased to 2.11.14. 2003-09-17 Hiroya Murata * wl-draft.el (wl-draft-do-fcc): Follow the API change. 2003-09-15 Hiroya Murata * Version number is increased to 2.11.13. 2003-09-14 Hiroya Murata * wl-draft.el (wl-draft-previous-history-element): Fixed unbalanced parenthesis and bind unbound local variables. 2003-09-14 Yoichi NAKAYAMA * wl-draft.el (wl-draft-previous-history-element): New function. (wl-draft-next-history-element): Ditto. * wl-e21.el, wl-xmas.el, wl-mule.el (wl-draft-key-setup): Bind them to M-p and M-n. 2003-09-14 Hiroya Murata * Version number is increased to 2.11.12. 2003-09-14 Yoichi NAKAYAMA * wl-draft.el (wl-draft-hide): Select buffer-window. 2003-09-13 Mito * wl-summary.el (wl-summary-narrow-to-region): New function. (wl-summary-prefetch-region-no-mark, wl-summary-mark-as-read-region) (wl-summary-mark-as-unread-region, wl-summary-mark-as-important-region) (wl-summary-save-region): Use it. * wl-action.el (wl-summary-collect-numbers-region) (wl-summary-unmark-region, wl-summary-mark-region-subr): Ditto. 2003-09-13 Hiroya Murata * wl-folder.el (wl-folder-count-incorporates): Don't use `elmo-msgdb-mark-load' * Version number is increased to 2.11.11. 2003-09-13 Yoichi NAKAYAMA * wl-draft.el (wl-draft-fcc-append-read-folder-hist): New variable. (wl-draft-do-fcc): Append fcc'ed folder to wl-read-folder-hist. 2003-09-06 Yuuichi Teranishi * wl-mime.el (wl-draft-preview-message): Use `format' to print value. 2003-09-05 Hiroya Murata * Version number is increased to 2.11.10. 2003-09-04 Hiroya Murata * wl-mime.el (wl-draft-attribute-value): Fixed. 2003-09-03 Hiroya Murata * wl-util.el (wl-copy-local-variables): New function. * wl-mime.el (wl-draft-attribute-recipients): New function. (wl-draft-attribute-envelope-from): Ditto. (wl-draft-attribute-smtp-posting-server): Ditto. (wl-draft-attribute-smtp-posting-port): Ditto. (wl-draft-attribute-value): Ditto. (wl-draft-preview-message): Use it to get value for attributes. Reflect result of `wl-draft-config'. * wl-summary.el (wl-summary-target-mark-mark-as-read): Fixed typo and call `wl-summary-mark-as-read' before to call `wl-summary-unset-mark'. (wl-summary-target-mark-mark-as-unread): Likewise. (wl-summary-target-mark-mark-as-important): Don't bind mlist. 2003-09-02 Yuuichi Teranishi * wl-mime.el (wl-draft-preview-message): Use actual value for attributes; Fix for small window. 2003-08-28 Hiroya Murata * wl-refile.el (wl-refile-get-field-value): Call `elmo-message-entity-field' with 3rd argument is non-nil. 2003-08-26 Yuuichi Teranishi * wl-vars.el (wl-draft-preview-attributes): New user option. (wl-draft-preview-attributes-list): Ditto. (wl-draft-preview-attributes-buffer-lines): Ditto. (wl-draft-preview-attributes-buffer-name): Ditto. * wl-mime.el (wl-draft-preview-message): Display attributes. 2003-08-26 Hiroya Murata * wl-summary.el (wl-summary-detect-mark-position): Bind wl-summary-flag-priority-list to '(new). 2003-08-23 Hiroya Murata * wl-highlight.el (wl-highlight-summary-line-face-spec): New funtion. (wl-highlight-summary-line-string): Use it. (wl-highlight-summary-current-line): Ditto. 2003-08-23 Yuuichi Teranishi * wl-summary.el (wl-summary-update-persistent-mark): Highlight the line even when the mark string is not changed. * wl-thread.el (wl-thread-update-line-on-buffer-sub): Follow the argument change in the wl-summary-create-line. (wl-thread-insert-entity-sub): Ditto. * wl-summary.el (wl-summary-detect-mark-position): Follow the argument change in the wl-summary-create-line. (wl-summary-insert-sequential): Ditto. (wl-summary-update-thread): Ditto. (wl-summary-persistent-mark-string): New inline function. (wl-summary-message-mark): Use it. (wl-summary-create-line): Abolish argument wl-persistent-mark and added wl-flags, wl-cached. * wl-highlight.el (wl-highlight-summary-line-string): Changed argument mark to flags. (wl-highlight-summary-current-line): Decide the face not by the persistent mark but flags. 2003-08-22 Hiroya Murata * wl-vars.el (wl-summary-new-mark, wl-summary-important-mark, wl-summary-unread-uncached-mark, wl-summary-unread-cached-mark, wl-summary-read-uncached-mark): Revive. (wl-summary-answered-cached-mark, wl-summary-answered-uncached-mark): New user option. (wl-summary-score-marks): Follow the change above. (wl-summary-auto-refile-skip-marks): Ditto. (wl-summary-incorporate-marks): Ditto. (wl-summary-expire-reserve-marks): Ditto. (wl-summary-flag-priority-list): New user option. * wl-summary.el (wl-summary-sync-marks): Follow the variable name changes. (wl-summary-auto-select-msg-p): Use elmo-message-flagged-p instead of elmo-message-mark. (wl-summary-mark-as-read-internal): Ditto. (wl-summary-mark-as-answered): Ditto. (wl-summary-mark-as-important): Ditto. (wl-summary-redisplay-internal): Ditto. (wl-summary-redisplay-no-mime-internal): Ditto. (wl-summary-message-mark): New function. (wl-summary-insert-sequential): Use wl-summary-message-mark instead of elmo-message-mark. (wl-summary-update-thread): Ditto. (wl-summary-persistent-mark): Ditto. (wl-summary-cursor-move-surface): Use elmo-message-accessible-p instead of elmo-message-mark. * wl-thread.el (wl-thread-update-line-on-buffer-sub): Use wl-summary-message-mark instead of elmo-message-mark. (wl-thread-insert-entity-sub): Ditto. (wl-thread-get-children-msgs-uncached): Ditto. * wl-highlight.el (wl-highlight-summary-line-string): Follow the variable name changes. (wl-highlight-summary-current-line): Ditto. * wl-action.el (wl-summary-no-auto-refile-message-p): Use wl-summary-message-mark instead of elmo-message-mark. * wl-expire.el (wl-expire-message-p): Ditto. * wl-score.el (wl-score-headers): Ditto. * Version number is increased to 2.11.9. * wl-summary.el (wl-summary-buffer-msgdb): Abolish. (wl-summary-sync-update): Follow the change above. (wl-summary-switch-to-clone-buffer): Ditto. (wl-summary-open-folder): Ditto. 2003-08-20 Hiroya Murata * wl-summary.el (wl-summary-cursor-move-surface): Don't skip `elmo-msgdb-answered-cached-mark' when the folder is unplugged. * Version number is increased to 2.11.8. * wl-summary.el (wl-summary-buffer-msgdb): Abolish. * wl-expire.el (wl-expire-refile): Follow the API change on `elmo-folder-move-messages'. (wl-expire-refile-with-copy-reserve-msg): Ditto. * wl-action.el (wl-summary-move-mark-list-messages): Ditto. (wl-summary-exec-action-refile): Ditto. (wl-summary-exec-action-copy): Ditto. (wl-summary-no-auto-refile-message-p): No use `wl-summary-buffer-msgdb'. (wl-summary-auto-refile): Ditto. 2003-08-19 Yoichi NAKAYAMA * wl-summary.el (wl-summary-sync): Fix regexp for last: and first:. 2003-08-19 Yuuichi Teranishi * wl-summary.el (wl-summary-sync): Treat no-sync. * wl-vars.el (wl-folder-sync-range-alist): Removed first: and last:. (wl-default-sync-range): Ditto. 2003-08-18 Hiroya Murata * wl-refile.el (wl-refile-subject-learn): Call `elmo-message-entity-field' with 3rd argument is non-nil. (wl-refile-guess-by-subject): Use `elmo-message-entity-field' instead of `elmo-msgdb-overview-entity-get-subject'. 2003-08-12 Yuuichi Teranishi * wl-summary.el (wl-summary-goto-folder-subr): Rescan if scan-type is rescan. (wl-summary-delete-all-temp-marks): Remove scored mark too when new optional argument force is non-nil. (wl-summary-save-view-cache): Call it with force argument non-nil. * wl-action.el (wl-summary-unset-mark): Added optional argument FORCE. 2003-08-12 Hiroya Murata * wl-action.el (wl-summary-print-argument): Fixed last change. 2003-08-11 Hiroya Murata * wl-summary.el (wl-summary-target-mark-mark-as-read): Fixed and simplified. (wl-summary-target-mark-mark-as-unread): Likewise. (wl-summary-target-mark-mark-as-important): Likewise. 2003-08-11 Yoichi NAKAYAMA * wl-thread.el (wl-thread-msg-mark-as-important): Abolished. * wl-summary.el (wl-summary-mark-as-important): Arranged. (wl-summary-mark-as-important-region): Change accordingly. (wl-summary-target-mark-mark-as-important): Ditto. 2003-08-09 Hiroya Murata * wl-vars.el (wl-summary-print-argument-within-window): New variable. * wl-action.el (wl-summary-print-argument): Print argument to right side of window if `wl-summary-print-argument-within-window' is non-nil. 2003-08-09 Yuuichi Teranishi * wl-action.el (wl-summary-set-mark): Use `wl-summary-message-visible-p' to check visibility of the message and jump to message only when the message line is visible and have different number; Call wl-summary-unset-mark with number argument. (wl-summary-unset-mark): Use `wl-summary-message-visible-p' to check visibility of the message and jump to message only when the message line is visible and have different number; 2003-08-09 Hiroya Murata * Version number is increased to 2.11.7. * wl.el (wl-check-variables-2): Don't check wl-summary-line-format and wl-folder-summary-line-format. * wl-summary.el (wl-summary-message-visible-p): New inline function. (wl-summary-put-temp-mark): Rename from wl-summary-mark-line. (wl-summary-set-score-mark): Use it. (wl-summary-target-mark-mark-as-read): Ditto. (wl-summary-target-mark-mark-as-unread): Ditto. (wl-summary-target-mark-mark-as-important): Ditto. (wl-summary-target-mark-msgs): Simplified. (wl-summary-detect-mark-position): Fixed problem when summary-line-format no contain persisten/temp mark spec. (wl-summary-temp-mark): Ditto. (wl-summary-persistent-mark): Ditto. (wl-summary-update-persistent-mark): Ditto. * wl-action.el (wl-summary-set-mark): Ditto. (wl-summary-unset-mark): Ditto. All other related portions are changed. 2003-08-07 Yuuichi Teranishi * Version number is increased to 2.11.6. 2003-08-05 Yuuichi Teranishi * wl-util.el (wl-current-message-buffer): Define as function; Don't use the value of wl-messge-buffer. * wl-summary.el (wl-summary-redisplay-no-mime-internal): Update persistent mark. * wl-mime.el (wl-draft-yank-current-message-entity): If there's no current message, cause an error. 2003-08-03 Hiroya Murata * wl-summary.el (wl-summary-set-message-modified): Use elmo-folder-set-message-modified instead of elmo-folder-set-message-modified-internal. 2003-08-03 Yuuichi Teranishi * wl-summary.el (wl-summary-sync): Call wl-summary-sync-marks interactively. (wl-summary-sync): nokill->entirely. (wl-summary-sync-marks): Fixed message. (wl-summary-input-range): Added mark, nokill->entirely. * wl-score.el (wl-summary-score-update-all-lines): Set expunged messages as read. 2003-08-02 Yuuichi Teranishi * wl-summary.el (wl-summary-input-range): Abolish all-noscore and update-noscore. (wl-summary-sync): Follow the change above. 2003-08-02 Hiroya Murata * wl-action.el (wl-summary-target-mark-all): Use elmo-folder-list-messages. 2003-08-02 Yuuichi Teranishi * wl-summary.el (wl-summary-rescan): Added argument disable-kill (wl-summary-rescan): Set wl-summary-scored as nil. (wl-summary-sync-force-update): Follow the change above. (wl-summary-sync): Ditto. (wl-summary-sync-update): Added argument disable-killed. (wl-summary-insert-headers): Set visible-only argument for elmo-folder-list-messages. (wl-summary-input-range): Added update-nokill, update-noscore, all-nokill, all-noscore and mark. * Version number is increased to 2.11.5. * wl-draft.el (wl-draft): Set buffer-undo-list as nil. 2003-08-01 Yoichi NAKAYAMA * wl-summary.el (wl-summary-prefetch-msg): Update persistent mark. (wl-summary-prefetch-region-no-mark): Change accordingly. * wl-action.el (wl-summary-exec-action-prefetch): Ditto. 2003-07-31 Yoichi NAKAYAMA * wl-address.el (wl-complete-field-to): Abolished. (wl-complete-address): Completion function for completing-read. * wl-action.el (wl-summary-get-resend-address): Use it. * wl-summary.el (wl-summary-update-persistent-mark): Renamed from wl-summary-update-mark and abolish unused argument. (wl-summary-prefetch-region-no-mark, wl-summary-mark-as-read-all) (wl-summary-delete-cache, wl-summary-resume-cache-status) (wl-summary-update-status-marks, wl-summary-mark-as-read-internal) (wl-summary-mark-as-important, wl-summary-redisplay-internal) (wl-summary-mark-as-answered-internal, wl-summary-reply): Use it. * wl-draft.el (wl-draft-kill): Ditto. * wl-summary.el: Remove unused binding of case-fold-search. (wl-summary-replace-status-marks): Abolished. 2003-07-29 Yuuichi Teranishi * wl-action.el (wl-summary-set-mark): Cause an error when no message is specified or folder length is zero. 2003-07-29 Hiroya Murata * wl-expire.el (wl-folder-expire-current-entity): Specify folder type. (wl-folder-archive-current-entity): Ditto. 2003-07-28 Yuuichi Teranishi * wl-summary.el (wl-summary-update-mark): Ignore errors while retrieving message mark. (wl-summary-redisplay-internal): Ditto. * wl-message.el (wl-message-buffer-display): Ignore errors while retrieving message-id field. * wl-expire.el (wl-summary-expire): Fixed 2nd argument for `wl-append'. (Reported by Shinichiro HIDA ) (wl-expire-refile-with-copy-reserve-msg): Follow the change in the order of the arguments for `wl-expire-message-p'. (Reported by Shinichiro HIDA ) * wl-summary.el (wl-summary-target-mark-reply-with-citation): Check return value of wl-summary-reply. (wl-summary-reply): Recover window configuration when an error occured. 2003-07-27 Yoichi NAKAYAMA * wl-summary.el (wl-summary-resend-message): Abolished, the feature is inherited by wl-summary-resend (put resend mark). 2003-07-27 Hiroya Murata * wl-summary.el (wl-summary-toggle-disp-msg): Set wl-message-buffer to nil when the message is hide. 2003-07-26 Hiroya Murata * .cvsignore: New file. 2003-07-26 Yoichi NAKAYAMA * wl-action.el (wl-summary-action-docstring): Add more info. (wl-summary-target-mark, wl-summary-target-mark-region): Remove duplicate definition. (wl-summary-define-mark-action): Functions wl-summary-*-region keep current position. (wl-summary-unregister-target-mark): Store result to the variable. 2003-07-24 Yuuichi Teranishi * Version number is increased to 2.11.4. 2003-07-24 Yuuichi Teranishi * wl-summary.el (wl-summary-cleanup-temp-marks): Use wl-summary-delete-all-temp-marks. (wl-summary-delete-all-temp-marks-on-buffer): Abolish. * wl-action.el (wl-summary-set-mark): Changed terminology refile-destination -> action-argument. (wl-summary-unset-mark): Ditto. (wl-summary-remove-argument): Ditto. (wl-summary-print-argument): Ditto. * wl-thread.el (wl-thread-update-line-on-buffer-sub): Ditto. (wl-thread-remove-argument-region): Ditto. (wl-thread-print-argument-region): Ditto. (wl-thread-close): Ditto. (wl-thread-open): Ditto. * wl-highlight.el (wl-highlight-action-argument-face): Ditto. (wl-highlight-refile-destination-face is abolished) (wl-highlight-action-argument-string): Ditto. (wl-highlight-summary-current-line): Highlight action argument. * wl-highlight.el (wl-highlight-summary-deleted-face): Changed default color for light backgrounds. (wl-highlight-summary-answered-face): Ditto. 2003-07-22 Yuuichi Teranishi * wl-summary.el (wl-summary-rescan): Use numbers in the msgdb. * wl-score.el (wl-summary-score-update-all-lines): Use wl-summary-set-mark. (wl-summary-score-update-all-lines): Kill expunged messages. * wl-expire.el (wl-expire-hide): Use elmo-folder-kill-messages. 2003-07-21 Yuuichi Teranishi * wl-score.el (wl-summary-score-update-all-lines): Don't use msgdb directly. (wl-score-overview-entity-get-lines): Ditto. (wl-score-overview-entity-get-xref): Ditto. (wl-score-get-latest-msgs): Ditto. (wl-summary-rescore): Ditto. * wl-summary.el (wl-summary-mode-map): Bind wl-summary-mark-as-answered to "&". (wl-summary-mark-as-answered-internal): New inline function. (wl-summary-mark-as-answered): New function. (wl-summary-mark-as-unanswered): Ditto. (wl-summary-sync-marks): Modified for answered-mark synching. 2003-07-20 Hiroya Murata * wl-action.el (wl-summary-set-mark): Fixed last change. 2003-07-20 Yuuichi Teranishi * wl-summary.el (wl-summary-mark-as-read-internal): Fixed the behavior of wl-summary-unread-message-hook (Pointed out by akira yamada ). 2003-07-19 Hiroya Murata * wl-e21.el (wl-summary-toolbar): Follow the rename of wl-summary-delete. * wl-xmas.el (wl-summary-toolbar): Ditto. * wl-action.el (wl-summary-set-mark): Don't override current temp-mark. * wl-refile.el (wl-refile-get-field-value): Fixed and simplified. 2003-07-19 Yuuichi Teranishi * wl-refile.el (wl-refile-learn): Don't use msgdb. (wl-refile-msgid-learn): Ditto. (wl-refile-get-field-value): Ditto. * wl-mime.el (wl-mime-combine-message/partial-pieces): Don't use msgdb. * wl-expire.el (wl-expire-message-p): Renamed from wl-expire-msg-p. (wl-expire-delete-reserved-messages): Renamed from wl-expire-reserve-marked-msgs-from-list. (wl-expire-delete): Removed argument `msgdb'. (wl-expire-refile): Ditto. (wl-expire-refile-with-copy-reserve-msg): Ditto. (wl-expire-archive-number-delete-old): Ditto; Use folder instead of mark-alist as argument. (wl-expire-archive-number1): Removed argument `msgdb'. (wl-expire-archive-number2): Ditto. (wl-expire-archive-date): Ditto. (wl-expire-localdir-date): Ditto. (wl-expire-hide): Ditto. (wl-archive-number1): Ditto. (wl-archive-number2): Ditto. (wl-archive-date): Ditto. (wl-archive-folder): Ditto. All other related portions are changed. 2003-07-19 Yoichi NAKAYAMA * wl-draft.el (wl-draft-send-confirm): Change message. Now up/down mean move up and down. (suggested by Takashi Kawachi) 2003-07-18 Yuuichi Teranishi * wl-acap.el (toplevel): Don't require un-define. 2003-07-18 Yuuichi Teranishi * wl-thread.el (wl-thread-delete-message): Always update wl-summary-buffer-number-list. * wl-action.el (wl-summary-print-destination): Do nothing when folder is nil. 2003-07-18 Hiroya Murata * wl-summary.el (wl-summary-prefetch-region-no-mark): Update persistent mark when prefetch is succeeded. 2003-07-17 Yuuichi Teranishi * wl-expire.el (wl-expire-delete): Use elmo-folder-detach-messages instead of elmo-msgdb-delete-msgs. (wl-expire-refile-with-copy-reserve-msg): Ditto. (wl-expire-hide): Ditto. * wl-summary.el (wl-summary-delete-all-msgs): Ditto. * wl-thread.el (wl-thread-update-line-on-buffer-sub): Don't use elmo-msgdb interface. (wl-thread-get-exist-children): Likewise. (wl-thread-insert-message): Likewise. (wl-thread-msg-mark-as-important): Likewise. (wl-thread-insert-entity-sub): Likewise. (wl-thread-get-children-msgs-uncached): Likewise. * wl-summary.el (wl-summary-sync-all-init): Use elmo-folder-length. (wl-summary-prefetch-msg): Don't use elmo-msgdb interface. (wl-summary-sync-update): Likewise. (wl-summary-auto-select-msg-p): Likewise. (wl-summary-update-thread): Likewise. (wl-summary-mark-as-important): Likewise. (wl-summary-jump-to-msg-internal): Likewise. (wl-summary-redisplay-internal): Likewise. (wl-summary-print-message-with-ps-print): Likewise. (wl-summary-folder-info-update): Likewise. * wl-folder.el (wl-folder-check-one-entity): elmo-folder-count-flags instead of wl-summary-count-unread. * wl-draft.el (wl-draft-normal-send-func): Fixed last change. * wl-action.el (wl-summary-define-mark-action): Fixed region function. * wl-summary.el (wl-summary-set-message-modified): Call wl-summary-set-mark-modified. (wl-summary-delete-messages-on-buffer): Call wl-folder-set-folder-updated instead of wl-folder-update-unread. (wl-summary-sync-update): Call elmo-folder-length instead of elmo-folder-messages. (wl-summary-insert-headers): Don't call elmo-folder-list-message-entities. 2003-07-17 Hiroya Murata * wl-action.el (wl-summary-define-mark-action): Call `wl-summary-set-mark' with argument `data'. (wl-summary-auto-refile): Fixed order of arguments when call `wl-summary-refile'. 2003-07-16 Yuuichi Teranishi * wl-vars.el (wl-summary-mark-action-list): Define resend action. * wl-summary.el (wl-summary-mode-map): Bind resend action. * wl-highlight.el (wl-highlight-summary-disposed-face): New face (Renamed from wl-highlight-summary-deleted-face). (wl-highlight-summary-resend-face): New face. (wl-highlight-summary-deleted-face): Renamed from wl-highlight-summary-erased-face. * wl-address.el (wl-complete-field-to): Added optional argument prompt. * wl-action.el (wl-summary-get-resend-address): New function. (wl-summary-exec-action-resend): Ditto. (wl-summary-exec-action-resend-subr): Ditto. * w-thread.el (wl-thread-copy): Removed definition. (wl-thread-refile): Ditto. (wl-thread-delete): Ditto. (wl-thread-target-mark): Ditto. * wl-action.el (wl-summary-register-target-mark): Fixed argument. (wl-summary-target-mark-set-action): Fixed. (wl-summary-define-mark-action): Fixed quotation. (wl-summary-move-mark-list-messages): Display message. (wl-summary-define-mark-action): Define thread functions. (wl-summary-exec-action-refile): Changed message. (wl-summary-exec): Ditto. 2003-07-15 Mito * wl-summary.el (wl-summary-entity-info-msg): Don't replace '%' to '%%'. 2003-07-15 Yuuichi Teranishi * wl.el (toplevel): Require wl-action. (wl-init): Call wl-summary-define-mark-action. * wl-vars.el (wl-summary-mark-action-list): Changed specification. * wl-summary.el (wl-summary-mode-menu-spec): Follow the rename of wl-summary-delete and wl-summary-erase. (wl-summary-mode-map): Ditto. * wl-vars.el (wl-dispose-folder-alist): Renamed from wl-delete-folder-alist. * wl-summary.el (wl-summary-prefetch-region-no-mark): Use wl-summary-prefetch-msg instead of wl-summary-prefetch. (toplevel): Moved mark & action related functions to the wl-action.el. * wl-highlight.el (wl-highlight-summary-line-string): Follow the change in wl-summary-mark-action-list. (wl-highlight-summary-current-line): Ditto. * wl-draft.el (wl-draft-normal-send-func): Fixed bug for removing empty lines. * wl-action.el: New file. 2003-07-14 Yuuichi Teranishi * wl-summary.el (wl-summary-target-mark-replace): New function. (wl-summary-target-mark-prefetch): Use it. (wl-summary-target-mark-delete): Ditto. (toplevel): Rearranged definition order. (wl-summary-mode-map): Bind wl-summary-erase-region to "rD". (wl-summary-target-mark-erase): Rewrite. (wl-summary-erase-region): New function. (wl-summary-exec-action-erase): Changed message. (wl-summary-move-mark-list-messages): New function. (wl-summary-exec-action-delete): Use it. (wl-summary-exec-action-erase): Ditto. * wl-vars.el (wl-summary-reserve-mark-list): Added "d" and "i". (wl-summary-skip-mark-list): Added "d". * wl-summary.el (wl-summary-cursor-move-surface): Bind case-fold-search while searching. * wl-vars.el (wl-summary-mark-action-list): Moved from wl-summary.el and define using defcustom; Define 4th element as a face. * wl-summary.el (wl-summary-incorporate): Use `wl-summary-prefetch-region-no-mark' instead of `wl-summary-prefetch-region'. (wl-summary-prefetch-region-no-mark): Revival of old `wl-summary-prefetch-region'. (wl-summary-mark-action-list): Moved to wl-vars.el * wl-highlight.el (wl-highlight-summary-current-line): Decide face according to the `wl-summary-mark-action-list'. (wl-highlight-summary-current-line): Ditto; Removed destination highlighting. * wl-highlight.el (wl-highlight-summary-prefetch-face): New face. (wl-highlight-summary-line-string): Highlight for "i" mark. (wl-highlight-summary-current-line): Ditto. * wl-thread.el (wl-thread-print-destination-region): Avoid error when no destination. * wl-summary.el (wl-summary-prefetch-msg): If cache file already exists, just go ahead. (wl-summary-prefetch-region): Rewrite. (wl-summary-prefetch): Ditto. (wl-summary-mark-action-list): Define mark "i" and prefetch action. (wl-summary-exec-action-prefetch): New function. (wl-summary-target-mark-prefetch): Rewrite. 2003-07-13 Yuuichi Teranishi * wl-highlight.el (wl-highlight-summary-erased-face): New face. (wl-highlight-summary-line-string): Added "d" and "D". (wl-highlight-summary-current-line): Ditto. * wl-thread.el (wl-thread-update-line-on-buffer-sub): Follow the change in wl-summary.el. (wl-thread-insert-entity-sub): Ditto. (wl-thread-remove-destination-region): Ditto. (wl-thread-print-destination-region): Ditto. * wl-summary.el (wl-summary-buffer-refile-list, wl-summary-buffer-delete-list, wl-summary-buffer-copy-list): Abolish. (wl-summary-buffer-temp-mark-list): New buffer local variable. All other related portions are changed. (wl-summary-mark-action-list): New variable. (wl-summary-set-mark): New function. (wl-summary-register-target-mark): Ditto. (wl-summary-unregister-target-mark): Ditto. (wl-summary-have-target-mark-p): Ditto. (wl-summary-register-temp-mark): Ditto. (wl-summary-unregister-temp-mark): Ditto. (wl-summary-registered-temp-mark): Ditto. (wl-summary-collect-temp-mark): Ditto. (wl-summary-unset-mark): Ditto. (wl-summary-set-target-mark): Ditto. (wl-summary-unset-target-mark): Ditto. (wl-summary-set-action-generic): Ditto. (wl-summary-unset-action-generic): Ditto. (wl-summary-exec-action-delete): Ditto. (wl-summary-exec-action-erase): Ditto. (wl-summary-set-action-refile): Ditto. (wl-summary-set-action-refile-subr): Ditto. (wl-summary-unset-action-refile): Ditto. (wl-summary-make-destination-numbers-list): Ditto. (wl-summary-exec-action-refile): Ditto. (wl-summary-set-action-copy): Ditto. (wl-summary-unset-action-copy): Ditto. (wl-summary-exec-action-copy): Ditto. (wl-summary-collect-numbers-region): Ditto. (wl-summary-delete): Rewrite. (wl-summary-erase): Ditto. (wl-summary-remove-destination): Ditto. (wl-summary-exec): Ditto. (wl-summary-exec-region): Ditto. (wl-summary-target-mark-erase): Ditto. (wl-summary-refile): Ditto. (wl-summary-copy): Ditto. (wl-summary-unmark): Ditto. (wl-summary-delete-all-mark): Ditto. (wl-summary-mark-line): Don't highlight. (wl-summary-target-mark-delete): Use wl-summary-register-temp-mark. (wl-summary-target-mark-refile-subr): Rewrite. (wl-summary-copy-prev-destination): Abolish. 2003-07-12 Yoichi NAKAYAMA * wl-vars.el (wl-thread-indent-level, wl-thread-*-str): Choose default values along the value of wl-on-mule. (from Tatsuya Kinoshita [wl-en:421]) * wl-vars.el (wl-highlight-thread-indent-string-regexp): Remove. It is not used anywhere. 2003-06-16 Yoichi NAKAYAMA * wl-summary.el (wl-summary-print-destination): Keep position. (wl-summary-cursor-move-surface): Keep horizontal position. 2003-05-30 Yoichi NAKAYAMA * wl-draft.el (wl-draft-send-mail-with-smtp): Catch quitting and write sendlog. 2003-05-28 Yoichi NAKAYAMA * wl-summary.el (wl-summary-goto-folder-subr): Don't restrict `wl-summary-highlight'. 2003-05-26 Yoichi NAKAYAMA * wl-highlight.el (wl-highlight-summary-current-line): Remove trivial condition for temp-mark. 2003-05-24 Yoichi NAKAYAMA * wl-message.el (wl-message-buffer-cache-add): Create new buffer when it hits killed buffer. 2003-05-12 Yoichi NAKAYAMA * wl-draft.el, wl-expire.el, wl-mime.el, wl-summary.el, wl-util.el * wl-news.el.in: `message' and `error' take format string. 2003-05-11 Yoichi NAKAYAMA * wl-folder (wl-folder-insert-entity): Display a message, `...done', when the work finish. (from Tatsuya Kinoshita [wl:10866]) 2003-05-04 Hiroya Murata * wl-message.el (wl-message-redisplay): Remove unused local variables (Reported by NAKAJIMA Mikio ). 2003-04-30 Yoichi NAKAYAMA * wl-summary.el (wl-summary-replace-status-marks): Disable interactive use. (wl-summary-reedit): Check message existence at first. (wl-summary-mark-line): Fix doc, return value is indefinite. * wl-highlight.el (wl-highlight-message): Arranged. * wl-highlight.el (wl-highlight-summary-current-line): Abolish unused 1st and 2nd arguments. Abolish 3rd argument `temp-too' and check temp-mark by wl-summary-temp-mark always. (wl-highlight-summary): Change accordingly. * wl-summary.el (wl-summary-mark-as-read-all) (wl-summary-delete-cache, wl-summary-set-score-mark) (wl-summary-mark-as-unread, wl-summary-unmark) (wl-summary-mark-line, wl-summary-mark-as-read) (wl-summary-mark-as-important): Ditto. * wl-highlight.el (wl-highlight-summary-window): Re-calculate the end of the window if possible. * wl-summary.el (wl-summary-sync-update): Support lazy highlighting. (wl-summary-toggle-disp-msg): Ditto. 2003-04-09 Yoichi NAKAYAMA * wl-util.el (wl-as-coding-system): Define for non-mule too. 2003-04-05 Hiroya Murata * wl-summary.el (wl-summary-mark-as-important): Fixed the last change. 2003-04-02 Yuuichi Teranishi * wl-summary.el (wl-summary-rescan): Follow the changes in wl-score API. (wl-summary-sync-update): Ditto. * wl-score.el (wl-score-get-score-alist): Changed argument. (wl-summary-rescore-msgs): Likewise. (wl-summary-score-headers): Likewise. (wl-score-headers): Likewise; Use elmo-folder-do-each-message-entity, etc. (wl-summary-score-effect): Follow the changes above. (wl-summary-rescore): Ditto. (wl-score-get-latest-msgs): Follow the changes in elmo-msgdb API. (wl-score-get-overview): Abolish. * wl-summary.el (wl-summary-default-from): Follow the API change in elmo-msgdb. (wl-summary-count-unread): Ditto. (wl-summary-detect-mark-position): Ditto. (wl-summary-overview-entity-compare-by-date): Ditto. (wl-summary-overview-entity-compare-by-number): Ditto. (wl-summary-overview-entity-compare-by-from): Ditto. (wl-summary-overview-entity-compare-by-subject): Ditto. (wl-summary-get-list-info): Ditto. (wl-summary-rescan): Ditto. (wl-summary-jump-to-msg-by-message-id): Ditto. (wl-summary-sync-update): Ditto; Removed comment. (wl-summary-insert-thread-entity): Renamed to wl-summary-insert-thread. (wl-summary-insert-message): Use wl-summary-insert (wl-summary-insert-sequential): Changed argument msgdb to folder. (wl-summary-insert-headers): Changed argument overview to folder. (wl-summary-search-by-subject): Likewise. (wl-summary-insert-thread): Renamed from wl-summary-insert-thread-entity and changed argument msgdb to folder. * wl-folder.el (wl-folder-check-one-entity): Treat elmo-imap4-bye-error too. * wl-fldmgr.el (wl-add-entity-sub): Use elmo-string-member instead of wl-string-member. 2003-03-25 Yuuichi Teranishi * wl-draft.el (wl-draft-do-fcc): Follow the changes in elmo-folder-append-buffer. (wl-draft-queue-append): Likewise. * wl-mime.el (wl-message-delete-current-part): Ditto. (wl-summary-burst-subr): Ditto. * wl-news.el.in (wl-news-send-news): Ditto. 2003-03-24 Yuuichi Teranishi * wl-summary.el (wl-summary-mark-as-read-internal): New inline function. (wl-summary-mark-as-read, wl-summary-mark-as-unread): Use it. (wl-summary-update-mark): Enclose with save-excursion. (wl-summary-mark-as-read-internal): Fixed last change. (wl-summary-mark-as-important): Use 3rd argument of elmo-folder-unmark-important, elmo-folder-mark-as-important; Don't use elmo-msgdb-set-mark. (wl-summary-redisplay-internal): If msgdb flag is already read, just update the mark on buffer. 2003-03-30 Yoichi NAKAYAMA * wl-fldmgr.el (wl-fldmgr-delete): Move confirmation to elmo side, cut visible folder when elmo-folder-delete returns non-nil value. 2003-03-30 Yoichi NAKAYAMA * wl-draft.el (wl-draft-send-confirm): Display more info (advised by Kenichi OKADA ). 2003-03-28 Yoichi NAKAYAMA * wl-folder.el (wl-folder-open-all): Fix to get proper entity. 2003-03-19 Yoichi NAKAYAMA * wl-fldmgr.el (wl-fldmgr-sort, wl-fldmgr-access-display-all): Fixed the last change, search group entity by its real name. (Thanks to: KOBAYASHI Shinji) 2003-03-12 Yoichi NAKAYAMA * wl-fldmgr.el (wl-fldmgr-rename,wl-fldmgr-sort) (wl-fldmgr-access-display-all): Don't refer visible name. * wl-expire.el (wl-folder-archive-current-entity) (wl-folder-expire-current-entity): Ditto. * wl-folder.el (wl-folder-jump-to-current-entity) (wl-folder-update-recursive-current-entity,wl-folder-next-unsync) (wl-folder-open-folder-sub,wl-folder-open-all) (wl-folder-write-current-folder): Ditto. (wl-folder-insert-entity): Don't use petname for normal group. * wl-fldmgr.el (wl-fldmgr-insert-folders-buffer): car of the name is the real name. * wl-folder.el (wl-folder-folder-name, wl-folder-entity-name): Abolished. 2003-03-06 Kenichi OKADA * wl-draft.el (wl-draft-create-buffer): Add `wl-summary-reply-with-citation' 2003-03-02 Jeremy Shaw * wl-draft.el (wl-draft-reply): Fixed. 2003-02-28 Yoichi NAKAYAMA * wl-draft.el (wl-draft-send-confirm): Rewritten. Invoke preview when `wl-draft-send-confirm-with-preview' is non-nil. You can scroll up/down by j/k. (wl-draft-send-confirm-with-preview): New variable (default=t). 2003-02-26 Yoichi NAKAYAMA * wl-fldmgr.el (wl-fldmgr-folders-header): Add more comment. (wl-fldmgr-save-folders): Fix comment. 2003-02-18 Yoichi NAKAYAMA * wl-folder.el (wl-folder-update-recursive-current-entity): Fix along the last change in `wl-folder-buffer-group-p'. 2003-02-17 Yoichi NAKAYAMA * wl-folder.el (wl-folder-buffer-search-group): Ignore non-group folder. * wl-vars.el (wl-delete-folder-alist): Add shimbun folder to the default value. * wl-mime.el (wl-summary-burst): Update summary only when target folder equals current folder. 2003-02-16 Yoichi NAKAYAMA * wl-thread.el (wl-thread-set-parent): Reconstruct number-list. 2003-02-14 Yoichi NAKAYAMA * wl-vars.el (wl-folder-hierarchy-access-folders): Change default value. 2003-02-14 Katsumi Yamaoka * wl-xmas.el (wl-xmas-highlight-folder-group-line): Use `map-extents' instead of `extent-at' repeatedly. (wl-highlight-folder-current-line): Ditto. * wl-highlight.el: Remove useless dummy functions. 2003-02-14 Yoichi NAKAYAMA * wl-folder.el (wl-folder-buffer-group-p): Rewritten. (wl-folder-put-folder-property): New function to put text property. (wl-folder-jump-to-current-entity, wl-folder-entity-assign-id) (wl-folder-insert-entity, wl-folder-update-diff-line) (wl-folder-update-diff-line, wl-folder-pick): Change accordingly. * wl-e21.el, wl-xmas.el, wl-mule.el (wl-highlight-folder-current-line): Ditto. * wl-fldmgr.el (wl-fldmgr-get-path-from-buffer, wl-fldmgr-cut) (wl-fldmgr-copy-region, wl-fldmgr-copy, wl-fldmgr-delete) (wl-fldmgr-rename, wl-fldmgr-sort, wl-fldmgr-unsubscribe) (wl-fldmgr-access-display-all, wl-fldmgr-set-petname): Ditto. 2003-02-14 Yoichi NAKAYAMA * Version number is increased to 2.11.3. 2003-02-13 Yoichi NAKAYAMA * wl-summary.el (wl-summary-mark-as-read): Run hook within dolist. Resume current-buffer since it is assumed by remaining tasks. 2003-02-12 Yoichi NAKAYAMA * wl-folder.el (wl-folder-complete-folder-candidate): New variable. (wl-folder-completion-function): Abolished. (wl-folder-complete-folder): New function. (wl-folder-complete-filter-condition): Ditto. * wl-summary.el (wl-summary-read-folder): Change accordingly. * wl-fldmgr.el (wl-fldmgr-add): Ditto. 2003-02-11 Yoichi NAKAYAMA * wl-draft.el (wl-draft-send-confirm): New function. (wl-draft-send): Use it. * wl-summary.el (wl-summary-jump-to-msg-by-message-id): Bind cursor-in-echo-area while confirming. * wl-summary.el (wl-summary-virtual): Call wl-summary-virtual-hook. * wl-summary.el (wl-summary-jump-to-msg-by-message-id): Force searching via nntp if wl-summary-search-via-nntp is 'force. Otherwise, invoke searching in nntp folder only. * wl-vars.el (wl-summary-search-via-nntp): Change accordingly. * wl-draft.el (wl-draft-remove-text-plain-tag): Specify subtype explicitly for mime-make-text-tag. 2003-02-10 TAKAHASHI Kaoru * wl-draft.el (wl-draft-remove-text-plain-tag): Use `mime-make-text-tag' instead of `mime-create-tag'. 2003-02-10 Yoichi NAKAYAMA * wl-fldmgr.el (wl-fldmgr-rename): Do nothing on the last line. (wl-fldmgr-add-completion-subr): Rewrite conditional. 2003-02-08 Yoichi NAKAYAMA * wl-score.el (wl-score-save): Bind print-length and print-level. (wl-score-pretty-print): Ditto. (wl-score-edit-insert-header-entry): Ditto. * wl-draft.el (wl-draft-send): Remove duplicate "Bcc" and add "From" entry to be treated with wl-draft-eword-encode-address-list. * wl-mime.el (wl-draft-preview-message): Ditto. * wl-summary.el (wl-summary-mark-as-read): Take list of numbers. (wl-summary-mark-as-unread): Ditto. (wl-summary-mark-as-read-region): Change accordingly. (wl-summary-mark-as-unread-region): Ditto. (wl-summary-target-mark-mark-as-read): Ditto. (wl-summary-target-mark-mark-as-unread): Ditto. 2003-02-08 Yoichi NAKAYAMA * Version number is increased to 2.11.2. 2003-01-29 Yoichi NAKAYAMA * wl-news.el.in (wl-news-previous-version-save): Bind print-length and print-level. * wl-thread.el (wl-thread-save-entities): Ditto. (wl-thread-save-top-list): Bind print-length. 2003-01-28 Yoichi NAKAYAMA * wl-highlight.el (wl-highlight-summary-line-string): Use wl-summary-score-below-mark, wl-summary-score-over-mark. (wl-highlight-summary-current-line): Ditto. 2003-01-27 Yoichi NAKAYAMA * wl-draft.el (wl-draft-insert-from-field): Encode wl-from and insert it. 2003-01-21 Kenichi OKADA * wl-vars.el (wl-message-id-use-wl-from): Change defalut to t. 2003-01-20 Yoichi NAKAYAMA * wl-mime.el (wl-message-delete-current-part): Avoid error on message without msgid. Rewrite with elmo-folder-move-messages. Set wl-message-buffer to nil. * wl-summary.el (wl-summary-erase-subr): New function. Use elmo-folder-move-messages. (wl-summary-erase): Call it. (wl-summary-target-mark-erase): Ditto. 2003-01-14 Yoichi NAKAYAMA * wl-summary.el (wl-summary-exec-subr): Unset wl-message-buffer if it is not up-tp-date. 2003-01-12 Yoichi NAKAYAMA * wl-folder.el (wl-folder-empty-trash): Set and show up summary buffer after calling `wl-summary-goto-folder-subr' without the argument `interactive'. (wl-folder-set-current-entity-id): Enclose by save-current-buffer. 2003-01-12 TAKAHASHI Kaoru * wl-draft.el (wl-draft-remove-text-plain-tag): Use `mime-create-tag'. Use `string=' instead of `looking-at'. 2003-01-11 Yoichi NAKAYAMA * wl-news.el.in (wl-news-send-news): Add 3rd argument `folder' to avoid compile warning. * wl-summary.el (wl-summary-goto-folder-subr): Fix logic: set entity-id when folder is given. * wl-folder.el (wl-folder-set-current-entity-id): Don't use save-excursion, use save-selected-window instead. Select folder buffer window if exists. (To correct behavior with wl-folder-move-cur-folder.) 2003-01-10 Masahiro Murata * wl-draft.el (wl-draft-reedit): Avoid error on Meadow [wl:11209]. 2003-01-06 Mito * wl-summary.el (wl-summary-line-list-info): Use %f to make list-count instead of %d. 2003-01-06 Yoichi NAKAYAMA * wl-news.el.in (wl-news-buffer-oldest-version): New local variable. (wl-news): Set it. (wl-news-append-to-folder): Use it. * wl-news.el.in (wl-news-send-news): Append to specified folder instead of wl-default-folder. (wl-news-append-to-folder): Show error message with specified folder. * wl-vars.el: Follow "Left Margin Convention" in Emacs Manual. In most major modes, Emacs assumes that any opening delimiter found at the left margin is the start of a top-level definition, or defun. Therefore, *never put an opening delimiter at the left margin unless it should have that significance.* * wl-draft.el (wl-draft-reply): List in r-list can contain function. 2003-01-05 NAKAJIMA Mikio * wl-draft.el (wl-draft-self-reply-p): Add doc string. 2003-01-01 TAKAHASHI Kaoru * wl-demo.el (wl-demo-copyright-notice): Add 2003. 2002-12-31 Ron Isaacson * wl-summary.el (wl-summary-mark-collect): Revive missing return for sequential numbering case. 2002-12-25 Yoichi NAKAYAMA * wl-vars.el (wl-draft-reply-with-argument-list): Change default value. (wl-draft-reply-without-argument-list): Ditto. (wl-draft-reply-myself-with-argument-list): Abolish. (wl-draft-reply-myself-without-argument-list): Ditto. * wl-draft.el (wl-draft-self-reply-p): New function. (wl-draft-reply-list-symbol): Merge into `wl-draft-reply'. 2002-12-24 Yoichi NAKAYAMA * wl-e21.el (toplevel): Do not set wl-folder-mode-map. (avoid error for the case without byte-compiling) 2002-12-23 Kenichi OKADA * wl-news.el.in (wl-news-append-to-folder): New function. (wl-news-exit): Rewrite. (wl-news-discard-and-mail): Merge to `wl-news-exit'. 2002-12-22 Kenichi OKADA * wl-draft.el (wl-draft-reply-position): New function. (wl-draft-reply-position): Fix. * wl-summary.el (wl-summary-reply): Use `wl-draft-reply-position'. (wl-summary-target-mark-reply-with-citation): Ditto. (wl-summary-reply-with-citation): Ditto. * wl-vars.el (wl-draft-reply-default-position): New variable. 2002-12-22 Kenichi OKADA * wl-draft.el (wl-draft-send): Preview when interactive send. 2002-12-22 Kenichi OKADA * wl-draft.el (wl-draft-reply): Set default position. * wl-summary.el (wl-summary-reply): Ditto. (wl-summary-reply-with-citation): Ditto. (wl-summary-target-mark-reply-with-citation): Ditto. 2002-12-21 Yoichi NAKAYAMA * wl-news.el.in (wl-news-lang): Set default value according to current-language-environment. (wl-news-append-news): Do nothing when news-list is nil. 2002-12-21 Kenichi OKADA * wl-news.el.in (wl-news-mode-map): Add new keybind. (wl-news): Change message. (wl-news-exit): Check buffer. (wl-news-force-exit): New function. (wl-news-show-all): New function. (wl-news-discard-and-exit): Fix. 2002-12-21 Yoichi NAKAYAMA * wl-vars.el (wl-summary-weekday-name-lang): Set default value according to current-language-environment. * wl-news.el.in (wl-news): If arg, show all NEWS after wl-news-default-previous-version. 2002-12-21 Kenichi OKADA * wl-news.el.in (wl-news-check): Rewritten. (wl-news-previous-version-load): Change data type. (wl-news-previous-version-save): Change data type. (wl-news-append-news): Add return value. (wl-news-check-news): New function. (wl-news-already-current-p): New function. (wl-news-send-news): Rewritten. (wl-news-mode-map): Add new keybind. (wl-news): Rewritten. (wl-news-exit): Rewritten. (wl-news-discard-and-mail): New function. (wl-news-send-to-address): Abolished. * wl.el (wl-init): Delete a message. 2002-12-21 Kenichi OKADA * wl-news.el.in (wl-news-exit): Update previous version. * wl.el (wl-folder-mode-menu-spec): Add 'Wanderlust NEWS'. 2002-12-21 Kenichi OKADA * wl-news.el.in (wl-news): Add `delete-other-windows'. 2002-12-21 Kenichi OKADA * wl-news.el.in (wl-news): New function. (wl-news-mode): New function. (wl-news-next-line): New function. (wl-news-next-page): New function. (wl-news-exit): New function. (wl-news-buf-name): New variable. (wl-news-mode-map): New variable. (wl-news-winconf): New variable. (wl-news-append-news): Add an option. 2002-12-20 Kenichi OKADA * wl-news.el.in (wl-news-send-news): Add 'Date' header. 2002-12-20 Yoichi NAKAYAMA * wl-news.el.in (wl-news-send-to-address): New variable. (wl-news-send-news): Use it. (wl-news-check): Call wl-news-send-news if wl-news-send-to-address. Return updating status. * wl.el (wl-init): Show message when wl-news-check returns non-nil. 2002-12-20 Kenichi OKADA * wl-news.el.in (wl-news-send-news): Delete Organization and X-Face. 2002-12-20 Kenichi OKADA * wl-news.el.in (wl-news-check): Fix for `wl-news-lang'. (wl-news-append-news): New function. (wl-news-send-news): New function. 2002-12-20 Kenichi OKADA * Version number is increased to 2.11.1. 2002-12-19 Kenichi OKADA * wl-news.el.in : New file. 2002-12-19 Kenichi OKADA * wl-vars.el (wl-draft-reply-with-argument-list): Change default value. (wl-draft-reply-without-argument-list): Ditto. 2002-12-19 Kenichi OKADA * wl-vars.el (wl-message-buffer-prefetch-depth): Change default value. (wl-message-buffer-prefetch-idle-time): Ditto. (wl-message-buffer-prefetch-folder-type-list): Ditto. 2002-12-13 Yuuichi Teranishi * wl-thread.el (wl-thread-insert-message): Use wl-summary-max-thread-depth. * wl-summary.el (wl-summary-insert-thread-entity): Refined loop detection. * wl-message.el (wl-message-buffer-display): Back to the first page when cache is hit. 2002-12-12 Yuuichi Teranishi * wl-vars.el (wl-summary-max-thread-depth): New user option. * wl-summary.el (wl-summary-insert-thread-entity): If the thread depth is reached to wl-summary-max-thread-depth, divide the thread. 2002-12-08 Kenichi OKADA * wl-draft.el (wl-draft-send-mail-with-smtp): Fix logic for elmo-remove-passwd. 2002-12-04 Yuuichi Teranishi * wl-folder.el (wl-folder-sync-entity): Fixed problem when the folder is sticky. (wl-folder-mark-as-read-all-entity): Ditto. (wl-folder-prefetch-entity): Ditto. 2002-12-04 Yasutaka SHINDOH * wl-demo.el (wl-demo-icon-name): Cope with Medow. 2002-12-03 Yoichi NAKAYAMA * wl-summary.el (wl-summary-target-mark-erase): Simplify. Delete messages on buffer for unplugged operation. (wl-summary-erase): Ditto. 2002-11-25 Yoichi NAKAYAMA * wl-vars.el (wl-summary-search-parent-by-subject-regexp): It can take nil so as not to search parent by subject. 2002-11-20 Yoichi NAKAYAMA * wl-folder.el (wl-folder-get-prev-folder): Ignore nemacs. (wl-folder-get-next-folder): Ditto. (wl-folder-get-path): Ditto. 2002-11-17 Yoichi NAKAYAMA * wl-mime.el (wl-message-verify-pgp-nonmime): With arg, ask coding system and encode the region with it before verifying. 2002-11-15 Yoichi NAKAYAMA * wl-mime.el (wl-message-verify-pgp-nonmime): Encode by the coding system of the echo buffer before decoding. 2002-11-14 Yoichi NAKAYAMA * wl-mime.el (wl-message-verify-pgp-nonmime): Verify sign in the original contents. 2002-11-13 Yuuichi Teranishi * wl-util.el (wl-biff-check-folder): Call elmo-pop3-get-session with argument 'any-exists. 2002-11-13 Yoichi NAKAYAMA * wl-mime.el (wl-message-decrypt-pgp-nonmime): Fix the last change. Use `wl-cs-autoconv'. 2002-11-12 Yoichi NAKAYAMA * wl-mime.el (wl-message-decrypt-pgp-nonmime): Decode PGP output by `mime-view-automatic-conversion'. * wl-mime.el (wl-message-decrypt-pgp-nonmime): New function. (wl-message-verify-pgp-nonmime): Ditto. * wl-e21.el, wl-mule.el, wl-xmas.el (wl-message-define-keymap): Bind them to C-c:d and C-c:v respectively. Merge following code by Teranishi-san from [wl-en:00167]. * wl-mime.el (wl-mime-preview-application/pgp): New function. (wl-mime-preview-application/pgp-encrypted): Ditto. (wl-mime-setup): Add entry. 2002-11-10 Yoichi NAKAYAMA * wl-summary.el (wl-summary-target-mark-erase): New function. Bind it to "mD". 2002-11-09 Yuuichi Teranishi * wl-vars.el (wl-draft-write-file-function): Fix. (wl-draft-reedit-hook): Changed default value. * wl-draft.el (wl-draft-edit-string): Set cursor point for wl-draft-reedit-hook. (wl-draft-remove-text-plain-tag): New function. (wl-draft-reedit): Set cursor point for wl-draft-reedit-hook. * wl-vars.el (wl-draft-write-file-function): New user option. * wl-draft.el (wl-draft-prepare-edit): Use it for local-write-file-hooks. (wl-draft-reedit): Ditto; use exact match for text/plain tag. * wl-draft.el (wl-draft-create-buffer): Cosmetic fix. (wl-draft-insert-mail-header-separator): Return the body beginning point. (wl-draft-reedit): Remove the mime-edit tag if the first part is text/plain. (wl-draft-reedit): Fixed argument for wl-draft-buffer-style. 2002-11-08 Yoichi NAKAYAMA * wl-summary.el (wl-summary-erase): New function to erase message without moving it to trash. Bind to "D". * wl-draft.el (wl-user-agent-compose): Set wl-draft-buffer-style as `keep' unless switch-function. 2002-11-07 Yoichi NAKAYAMA * wl-draft.el (wl-draft-create-buffer): Rewrite the part to hide message buffer by using `wl-summary-toggle-disp-msg'. * wl-summary.el (wl-summary-resend-bounced-mail): Hide message buffer window. (wl-summary-supresedes-message): Ditto. * wl-summary.el (wl-summary-reedit): Hide message buffer window. Do not delete other windows. * wl-draft.el (wl-draft-edit-string): Do not delete other windows. (wl-draft-reedit): Switch buffer with `wl-draft-buffer-style'. (wl-draft-create-buffer): Set reply-or-forward also for target mark commands. 2002-11-07 Yuuichi Teranishi * wl-draft.el (wl-user-agent-compose): Delete special case for switch-to-buffer-other-window. * wl-summary.el (wl-summary-reply): Don't treat switch buffer here. (wl-summary-forward): Ditto. * wl-vars.el (wl-draft-buffer-style): Added choice of keep and function. (wl-draft-buffer-style): New use option. * wl-draft.el (wl-draft-create-buffer): Abolish argument `full'. (wl-draft): Follow the change above. (wl-draft-create-buffer): Use wl-draft-reply-buffer-style and wl-draft-buffer-style. (wl-user-agent-compose): Bind wl-draft-buffer-style with switch-function. 2002-11-01 Tomotaka SUWA * wl-address.el (wl-address-make-completion-entry): Extracted from `wl-address-make-completion-list'. (wl-address-enable-strict-loading): New variable. (wl-address-make-completion-list): Revive petname duplication inquiry, and enable it if `wl-address-enable-strict-loading'. (Note: this should be fixed in future. Ref: [wl:10773],[wl:10455]) 2002-10-29 Yuuichi Teranishi * wl-message.el (wl-message-get-original-buffer): Avoid 'Selecting deleted buffer' error when original buffer is killed. 2002-10-28 Yuuichi Teranishi * wl-summary.el (wl-summary-next-message): Use elmo-message-accessible-p instead of elmo-message-cached-p. 2002-10-27 Yuuichi Teranishi * wl-util.el (wl-regexp-opt): Define as an alias for elmo-regexp-opt. * wl-thread.el (wl-thread-open-all-unread): Use elmo-folder-list-flagged instead of elmo-folder-list-messages-mark-match. * wl-summary.el (wl-summary-sync-marks): Use elmo-folder-list-flagged instead of elmo-folder-list-messages-mark-match. (wl-summary-move-spec-alist): New variable. (wl-summary-move-spec-plugged-alist, wl-summary-move-spec-unplugged-alist): Abolish. (wl-summary-next-message): Follow the change above. (wl-summary-save-view-cache): Call wl-summary-delete-all-temp-marks with 'no-msg' argument. * wl-message.el (wl-message-buffer-prefetch-move-spec-alist): New variable. (wl-message-buffer-prefetch-move-spec-plugged-alist, wl-message-buffer-prefetch-move-spec-unplugged-alist): Abolish. (wl-message-buffer-prefetch-get-next): Follow the change above. 2002-10-26 Yuuichi Teranishi * wl-version.el (wl-version): Changed codename. * Version number is increased to 2.11.0. 2002-10-24 Hiroya Murata * wl-draft.el (wl-draft-reply-saved-variables): New constant. (wl-draft-reply): Append `wl-draft-reply-saved-variables' to `wl-draft-config-variables'. (wl-draft-kill): Fixed problem when the draft is reedit. 2002-10-24 Yuuichi Teranishi * wl-draft.el (wl-draft-highlight-and-recenter): Restore buffer-modified status (Thanks to Tomotaka SUWA ). 2002-10-22 Yuuichi Teranishi * wl-util.el (wl-region-exists-p): New function. * wl-mime.el (wl-draft-yank-current-message-entity): Use it; Remove defvars for byte-compile warnings. 2002-10-22 Hiroya Murata * wl-mime.el (toplevel): Fixed last change; use defvar instead of defvar-maybe. Removed unused bind. 2002-10-21 Yoichi NAKAYAMA * wl-draft.el (wl-draft-forward): If wl-draft-use-frame, select summary buffer window before creating new frame. (wl-draft-reply): Ditto. 2002-10-21 Hiroya Murata * wl-mime.el (toplevel): Avoid byte-compile warnings. 2002-10-21 Yoichi NAKAYAMA * wl-mime.el (wl-draft-yank-current-message-entity): Fix logic. 2002-10-18 Hiroya Murata * wl-mime.el (wl-message-delete-current-part): Use `delete-region' instead of `kill-region'. 2002-10-18 Yuuichi Teranishi * wl-highlight.el (wl-highlight-summary-answered-face): New face. (wl-highlight-summary-line-string): Use it. (wl-highlight-summary-current-line): Ditto. * wl-mime.el (wl-message-delete-current-part): Check the class of mime-entity. * wl-draft.el (wl-draft-reedit): Set wl-draft-parent-folder. * wl-summary.el (wl-summary-make-number-list): Initialize. (wl-summary-update-mark): New function. (wl-summary-reply): Put `answered' mark on the message. (wl-summary-reply): Set `number' argument to wl-draft-reply. * wl-draft.el (wl-draft-parent-number): New buffer local variable. (wl-draft-reply): Added optional argument `number'; Set wl-draft-parent-number. (wl-draft-kill): Delete answered mark if it is a reply. 2002-10-18 Yoichi NAKAYAMA * wl-mime.el (wl-mime-preview-follow-current-region): New function that originates in mime-preview-follow-current-entity. (wl-draft-yank-current-message-entity): Use it if region is active. * wl-mime.el (wl-message-delete-current-part): Remove restriction. * wl-e21.el (wl-message-define-keymap): Bind "D" for `wl-message-delete-current-part'. * wl-mule.el (wl-message-define-keymap): Ditto. * wl-xmas.el (wl-message-define-keymap): Ditto. 2002-10-16 Yoichi NAKAYAMA * wl-mime.el (wl-message-delete-current-part): New function. (wl-mime-node-id-to-string): Ditto. * wl-mime.el (wl-message-delete-current-part): Use existing original buffer which corresponds current mime-view buffer. (fetched buffer might have different structure, possibly) * wl-mime.el (wl-message-delete-current-part): Quit if the message content differs from the actual message. 2002-10-12 Yuuichi Teranishi * wl-summary.el (wl-summary-insert-headers): Put alike hash in reverse order. (wl-summary-search-by-subject): Search parent message from tail; Check the existence of the parent message on the current thread tree. (wl-summary-update-thread): Check whether the line is inserted. 2002-10-10 Yoichi NAKAYAMA * wl-vars.el (wl-summary-line-format): Undo last change. * wl-summary.el (wl-summary-print-destination): Do not put invisible property when `wl-summary-width' is nil. (wl-summary-line-subject-minimum-length): Abolished. (wl-summary-line-subject): Ditto. 2002-10-09 Yoichi NAKAYAMA * wl-vars.el (wl-summary-line-format): Change default value. (wl-summary-subject-length-limit): Abolished. * wl-summary.el (wl-summary-line-subject): Ditto. 2002-10-09 Hiroya Murata * wl-template.el (wl-template-select): Added optional argument. If optional argument is specified, reverse `wl-template-visible-select'. 2002-10-06 Yoichi NAKAYAMA * wl-mime.el (wl-summary-burst): Get elmo folder correctly. Take prefix argument to force asking the destination folder. 2002-09-26 Hiroya Murata * wl-summary.el (wl-summary-prefetch-msg): If mark is changed, count and update status. 2002-09-24 Yuuichi Teranishi * wl-summary.el (wl-summary-redisplay-internal): If `elmo-message-use-cache-p' is non-nil, call `elmo-message-set-cached' after fetching. 2002-09-24 Hiroya Murata * wl-summary.el (wl-summary-mark-as-read-all): Bind new-mark. (wl-summary-mark-as-read): Don't call elmo-message-set-cached. * wl-vars.el (toplevel): Require 'elmo-msgdb. 2002-09-20 Yuuichi Teranishi * wl-summary.el (wl-summary-buffer-mark-modified): Abolish (All other related portions are changed). (wl-summary-mark-as-read-all): Rewrite. 2002-09-19 Yuuichi Teranishi * wl-summary.el (wl-summary-sync-marks): Set no-modeline argument of `wl-summary-mark-as-read'. (wl-summary-mark-as-unread): Rewrite. (wl-summary-mark-as-read): Added no-modeline argument. (wl-summary-resume-cache-status): Rewrite. (wl-summary-exec-subr): Remove unused local variable. 2002-09-23 Yoichi NAKAYAMA * wl-summary.el (wl-summary-cursor-move-surface): Add missing logic to call `wl-summary-buffer-prev-folder-function'. (pointed out by Kazuhiro NISHIYAMA [mhc:01644]) 2002-09-18 Yuuichi Teranishi * wl-draft.el (wl-draft-reply): Avoid error when buf and summary-buf is nil. 2002-09-17 Yoichi NAKAYAMA * wl-mime.el (wl-mime-decrypt-application/pgp-encrypted): New function, a wrapper for `mime-decrypt-application/pgp-encrypted'. (wl-mime-setup): Add its entry. 2002-09-17 Yuuichi Teranishi * wl-summary.el (wl-summary-prefetch-msg): Use elmo-message-set-cached. (wl-summary-delete-cache): Likewise. (wl-summary-mark-as-read): Rewrite. 2002-09-16 Yuuichi Teranishi * wl-folder.el (wl-folder-check-one-entity): Follow the API change on `wl-summary-count-unread'. * wl-summary.el (wl-summary-sync-marks): Treat global-mark here. * wl-version.el (wl-version): Set codename for `elmo-mark' branch. 2002-09-13 Yuuichi Teranishi * wl-vars.el (wl-summary-unread-mark, wl-summary-important-mark, wl-summary-new-mark, wl-summary-unread-uncached-mark, wl-summary-unread-cached-mark, wl-summary-read-uncached-mark): Renamed to the elmo-msgdb-*-mark. (wl-summary-score-marks): Follow the change above. (wl-summary-auto-refile-skip-marks): Ditto. (wl-summary-incorporate-marks): Ditto. (wl-summary-expire-reserve-marks): Ditto. * wl-thread.el (wl-thread-open-all-unread): Follow the variable name changes. (wl-thread-insert-top): Changed updating message. * wl-summary.el (wl-summary-buffer-answered-count): New buffer local variable. (wl-summary-count-unread): Count answered marks. (wl-summary-rescan): Call wl-summary-insert-message instead of wl-summary-append-message-func-internal. (wl-summary-rescan): Don't call wl-summary-make-number-list. (wl-summary-prefetch-msg): Follow the variable name changes. (wl-summary-prefetch-region): Ditto. (wl-summary-mark-as-read-all): Follow the API changes; Don't call elmo-folder-replace-marks. (wl-summary-delete-cache): Follow the variable name changes. (wl-summary-resume-cache-status): Ditto. (wl-summary-update-status-marks): New function. (wl-summary-insert-message): New function. (wl-summary-sync-marks): Follow the variable name changes. (wl-summary-sync-update): Synchronize to the msgdb, too; Changed update messages. (wl-summary-make-number-list): Rewrite. (wl-summary-insert-sequential): Update wl-summary-buffer-number-list. (wl-summary-mark-as-unread): Follow the API changes. (wl-summary-exec-subr): Follow the variable name changes. (wl-summary-mark-as-read): Ditto. (wl-summary-move-spec-plugged-alist): Ditto. (wl-summary-move-spec-unplugged-alist): Ditto. (wl-summary-cursor-move-surface): Ditto. * wl-highlight.el (wl-highlight-summary-line-string): Follow the variable name changes. (wl-highlight-summary-current-line): Ditto. * wl-expire.el (wl-expire-refile): Follow the API change in elmo-folder-move-messages. (wl-expire-refile-with-copy-reserve-msg): Ditto. (wl-summary-archive): Use elmo-folder-msgdb instead of elmo-msgdb-load. 2002-09-13 Yoichi NAKAYAMA * wl-mime.el (wl-draft-preview-message): Restore the position before evaluating wl-draft-send-hook in preview buffer. 2002-09-12 Yoichi NAKAYAMA * wl-addrmgr.el (wl-addrmgr-apply-exec): Call wl-draft interactively when it creates new draft buffer. * wl-folder.el (wl-folder-flush-queue): Call elmo-dop-queue-flush without argument. * wl-draft.el (wl-draft-config-sub-eval-insert): New function. Evaluate content and if the value is string, insert it. (wl-draft-config-sub-body,wl-draft-config-sub-top, wl-draft-config-sub-bottom,wl-draft-config-sub-header, wl-draft-config-sub-header-top,wl-draft-config-sub-part-top, wl-draft-config-sub-part-bottom): Use it. * wl-summary.el (wl-summary-cleanup-temp-marks): Ask execution with the folder name. The question was unintelligible when it is called from wl-save-status. 2002-09-11 Yoichi NAKAYAMA * wl-summary.el (wl-summary-save-view-cache): Avoid error on xemacs without mule (`mime-charset-to-coding-system' in mcs-ltn1 cannot take second argument). 2002-09-05 Yoichi NAKAYAMA * wl-summary.el (wl-summary-line-attached): Bind case-fold-search as t. Since type and subtype are not case sensitive (RFC 2045). 2002-09-04 Yoichi NAKAYAMA * wl-vars.el (wl-message-mode-line-format): New variable. (wl-message-mode-line-format-spec-alist): Ditto. * wl-message.el (wl-message-buffer-mode-line-formatter): Ditto. (wl-message-redisplay): Use wl-message-mode-line-format. 2002-09-04 Yuuichi Teranishi * wl-mime.el (wl-draft-preview-message): Bind wl-draft-parent-folder. 2002-09-03 Yoichi NAKAYAMA * wl-summary.el (wl-summary-default-from): Write description. 2002-09-03 Yuuichi Teranishi * wl-vars.el (wl-ldap-objectclass): Abolish. * wl-address.el (wl-ldap-search-attribute-type-list): Added 'email'. (wl-ldap-make-filter): Removed condition for objectclass. (wl-ldap-make-matched-value-list): Remove meaningless process. (wl-ldap-alias-safe-string): Changed regexp for space/tab matching. (wl-address-ldap-search): Don't add `*' to `pat' string; use ignore-errors; added `email'; use `ldap-default-host' if non-nil and `wl-ldap-server'is nil; use `ldap-default-port' if non-nil and `wl-ldap-port' is nil; use `ldap-default-base' if non-nil and `wl-ldap-base' is nil. 2002-09-02 Yoichi NAKAYAMA * wl-draft.el (wl-draft-parent-folder): Write description. * wl-vars.el (wl-draft-config-alist): Refer `wl-draft-parent-folder' 2002-09-02 Yuuichi Teranishi * wl-draft.el (wl-draft-create-buffer): Set `wl-draft-parent-folder' as "" (zero-length string) if no parent. (wl-draft-hide): Fixed logic for wl-draft-use-frame. 2002-08-27 Yuuichi Teranishi * wl-address.el (wl-address-make-completion-list): Skip duplication checking. (wl-address-make-address-list): use `cons' and `nreverse' instead of `append'. 2002-08-26 TAKAHASHI Kaoru * wl-draft.el (wl-draft-insert-x-face-field): Use `goto-char' instead of `beginning-of-buffer'. 2002-08-22 Katsumi Yamaoka * wl-xmas.el (wl-message-wheel-down): Fix parentheses. 2002-08-22 Yuuichi Teranishi * wl-xmas.el, wl-mule.el, wl-e21.el (wl-message-wheel-up): Refer wl-message-buffer-name. (wl-message-wheel-down): Ditto. 2002-08-21 Yuuichi Teranishi * wl-vars.el (wl-message-buffer-name): New user option. * wl-summary.el (wl-summary-read-folder): Use wl-folder-entity-hashtb directly instead of making alist dinamically. * wl-message.el (wl-message-buffer-cache-name): Abolish. (wl-message-buffer-create): Use wl-message-buffer-name instead of wl-message-buffer-cache-name. (wl-message-buffer-cache-clean-up): Ditto. * wl-folder.el (wl-folder-set-entity-info): Use elmo-string. * Version number is increased to 2.9.15. 2002-08-06 Yuuichi Teranishi * wl-vars.el (wl-summary-default-view-alist): New user option. * wl-summary.el (wl-summary-goto-folder-subr): Use it. * wl-draft.el (wl-draft-make-mail-followup-to): Ignore case while deleting address. (wl-draft-delete-myself-from-cc): Ditto. * wl-fldmgr.el (wl-fldmgr-sort): Added optional argument. If optional argument is specified, reverse sort order. * wl-draft.el (wl-draft-get-fcc-list): Allow multiple Fcc folders. 2002-07-24 Yuuichi Teranishi * wl-thread.el (wl-thread-insert-message): Return parent number if exists. (wl-thread-update-indent-string-region): Use wl-thread-update-line-on-buffer-sub instead of wl-thread-update-line-on-buffer. 2002-07-23 KAMO Tomoyuki * wl-folder.el (wl-folder-open-all): Call wl-highlight-folder-path. (wl-folder-close-all): Ditto. 2002-07-09 KAMO Tomoyuki * wl-summary.el (wl-summary-get-list-info): Process delivered-to: and mailing-list:. (wl-summary-overview-entity-compare-by-list-info): Treat empty field value. (wl-summary-line-list-info): Print mailing-list name even when list-number is empty. 2002-07-18 Yoichi NAKAYAMA * wl-draft.el (wl-draft-edit-string): Don't set buffer-read-only. * wl-draft.el (wl-draft-confirm): Abolished since not used. (wl-draft-open-file): Ditto. (wl-draft-random-alphabet): Ditto. * wl-summary.el (wl-summary-mode-map): Remove already abolished bindings. 2002-07-14 Yoichi NAKAYAMA * wl-draft.el (wl-draft-config-exec): Fixed docstring. * wl-vars.el (wl-draft-config-alist): Ditto. 2002-07-12 Yuuichi Teranishi * Version number is increased to 2.9.14. * wl.el (wl): Don't set wl-init as nil when error occured while auto-checking folders. * wl-util.el (wl-expand-newtext): Re-define as an alias for `elmo-expand-newtext'. 2002-07-11 Yoichi NAKAYAMA * wl-folder.el (wl-folder-goto-folder-subr): Keep value of `this-command' so that `wl-folder-goto-folder' contained in `wl-summary-keep-cursor-command' work. 2002-07-10 Yoichi NAKAYAMA * wl-summary.el (wl-summary-jump-to-parent-message): Keep message buffer displaying state. 2002-07-05 Yoichi NAKAYAMA * wl-vars.el (wl-summary-default-view): New variable to specify default value for `wl-summary-buffer-view' instead of using set-default. * wl-summary.el (wl-summary-goto-folder-subr): Ditto. 2002-07-03 Yoichi NAKAYAMA * wl-summary.el (wl-summary-resend-bounced-mail): Loosen regexp. * wl-vars.el (wl-rejected-letter-start): Add pattern for qmail. 2002-07-01 Akihiro MOTOKI * wl-vars.el (wl-forward-subject-prefix): New variable. * wl-draft.el (wl-draft-forward): Use it. 2002-06-21 Yoichi NAKAYAMA * wl-message.el (wl-message-prev-page): When it is called without lines argument, scroll down by wl-message-scroll-amount lines. (wl-message-next-page): Ditto. * wl-vars.el (wl-message-scroll-amount): Change default value to preserve current behavior. 2002-06-20 Hiroya Murata * wl-summary.el (wl-summary-prefetch-msg): Bind `wl-message-entity' to call `wl-summary-from-function'. 2002-06-19 Yoichi NAKAYAMA * wl-message.el (wl-message-buffer-create): Run wl-message-buffer-created-hook. 2002-06-19 Yuuichi Teranishi * wl-summary.el (wl-summary-sort-specs): New variable. (wl-summary-default-sort-spec): Ditto. (wl-summary-sort): Rewrite. (wl-summary-sort-by-list-info): New function. 2002-06-18 KAMO Tomoyuki * wl-summary.el (wl-summary-get-list-info): New function. (wl-summary-sort): Rewrite. (wl-summary-line-list-info): Ditto. (wl-summary-line-list-count): Ditto. (wl-summary-refile-region): Fixed docstring. 2002-06-17 Yuuichi Teranishi * wl-summary.el (wl-summary-read-folder): Use copy-sequence `wl-folder-entity-hashtb' as completion table. 2002-06-14 Katsumi Yamaoka * wl-draft.el (wl-draft-beginning-of-line): Set zmacs-region-stays only when this command is called interactively; silence the byte- compiler. 2002-06-14 TAKAHASHI Kaoru * wl-draft.el (wl-draft-beginning-of-line): Keep the region active in XEmacs. 2002-06-13 KAMO Tomoyuki * wl-draft.el (wl-draft-beginning-of-line): Treat the header with plural lines. 2002-06-11 Yoichi NAKAYAMA * wl-draft.el (wl-draft-beginning-of-line): Move to the beginning of current line when the cursor is on the header name. (preserve behavior to move to b.o.h. and b.o.l. mutually) 2002-06-06 KAMO Tomoyuki * wl-util.el (wl-read-directory-name): Return displayed directory as the default value also on XEmacs. 2002-05-30 Yuuichi Teranishi * wl-summary.el (wl-summary-line-list-count): Use ".0f" for ml-count formatting. 2002-05-26 Yuuichi Teranishi * wl-highlight.el (wl-highlight-summary): Added optional `lazy' argument and when it is non-nil, check face property before highlighting for each line. (wl-highlight-summary-window): Set it. 2002-05-22 Yuuichi Teranishi * wl-vars.el (wl-draft-disable-bcc-for-mime-bcc): New user option. (wl-draft-disable-fcc-for-mime-bcc): Ditto. * wl-draft.el (wl-draft-deduce-address-list): Disable bcc while mime-bcc if wl-draft-disable-bcc-for-mime-bcc is non-nil. (wl-draft-get-fcc-list): Likewise. 2002-05-21 Yuuichi Teranishi * wl-thread.el (wl-thread-indent-regexp): Abolished. (wl-thread-entity-cur): Ditto. * wl-summary.el (wl-summary-buffer-set-folder): Removed wl-thread-indent-regexp setting. (wl-summary-sync-update): Removed wl-thread-entity-cur setting. * wl-summary.el (wl-summary-display-top): Highlight summary window when wl-summary-lazy-highlight. (wl-summary-display-bottom): Ditto. * wl-thread.el (wl-thread-open-close): Likewise. * wl-draft.el (wl-draft-do-mime-bcc): Decode field body of original from and subject; Bind wl-draft-use-frame; Enclose with save-window-excursion; Use wl-draft-create-buffer instead of with-temp-buffer; Use wl-draft-prepare-edit; Use insert-buffer instead of wl-draft-yank-from-mail-reply-buffer; Use wl-draft-send instead of wl-draft-raw-send. 2002-05-20 Yoichi NAKAYAMA * wl-draft.el (wl-draft-do-mime-bcc): Preserve original from instead of using wl-from. 2002-05-20 Yuuichi Teranishi * wl-draft.el (wl-draft-do-mime-bcc): Use generate-new-buffer and insert-buffer instead of clone-buffer. (wl-draft-doing-mime-bcc): New variable. (wl-draft-do-mime-bcc): Bind wl-draft-doing-mime-bcc to avoid infinite loop. (wl-draft-do-mime-bcc): Use wl-from for From field value. * wl-vars.el (wl-draft-mime-bcc-field-name): New user option. (wl-draft-mime-bcc-body): Ditto. * wl-draft.el (wl-draft-setup): Setup wl-draft-mime-bcc-field-name. (wl-message-mail-p): Added wl-draft-mime-bcc-field-name. (wl-draft-dispatch-message): Call wl-draft-mime-bcc-field and wl-draft-do-mime-bcc. (wl-draft-mime-bcc-field): New function. (wl-draft-do-mime-bcc): Ditto. * wl-address.el (wl-address-complete-header-list): New variable. (wl-address-complete-header-regexp): Changed default value. * Version number is increased to 2.9.13. 2002-05-19 Yuuichi Teranishi * wl-summary.el (wl-summary-mark-as-read): Set msgdb mark only when it is differed. 2002-05-18 Hiroya Murata * wl-summary.el (wl-summary-line-list-info): Rewrite. (wl-summary-line-list-count): Ditto. 2002-05-18 Kenichi OKADA * wl-vars.el (wl-nntp-posting-config-alist): New variable. (wl-nntp-posting-function): New variable. * wl-draft.el (wl-draft-elmo-nntp-send): Change for `wl-nntp-posting-config-alist'. 2002-05-17 Yoichi NAKAYAMA * wl-draft.el (wl-draft-send-mail-with-smtp): Remove staff for older FLIM. 2002-05-16 Tatsuya Kinoshita * wl-summary.el (wl-summary-target-mark-refile-sub): Remove a nuisance funcall. 2002-05-16 Yuuichi Teranishi * wl-address.el (wl-complete-field-body): Bind `completion-ignore-case' as t for `try-completion'. 2002-05-15 Yuuichi Teranishi * wl-summary.el (wl-summary-default-from): Use wl-address-header-extract-address instead of std11-extract-address-components. (wl-summary-simple-from): Ditto. (wl-summary-goto-folder-subr): Check wl-summary-cache-use. (wl-summary-insert-headers): Show message. (wl-summary-create-line): Set 4th argument of wl-set-string-width for whole line. (wl-summary-default-from): Revert last change. (wl-summary-simple-from): Ditto. (wl-summary-mark-as-read): Argument rearrangement and re-written. (wl-summary-mark-as-read-region): Follow the change above. (wl-summary-sync-marks): Ditto. (wl-summary-target-mark-mark-as-read): Ditto. (wl-summary-redisplay-internal): Ditto. (wl-summary-redisplay-no-mime-internal): Ditto. (wl-summary-redisplay-all-header): Ditto. (wl-summary-mark-as-read): Removed argument `cached'; Use current cache status to set cache mark. (wl-summary-redisplay-internal): Follow the change above. (wl-summary-redisplay-no-mime-internal): Ditto. (wl-summary-redisplay-all-header): Ditto. * wl-score.el (wl-summary-score-update-all-lines): Ditto. * wl-util.el (wl-set-string-width): Added 4th argument ignore-invalid; Don't call itself recursively (Adviced by Yamaoka-san). 2002-05-14 Yoichi NAKAYAMA * wl-summary.el (wl-summary-save-view-cache): In temporary buffer, bind wl-summary-highlight as nil to avoid error caused by missing local variables. 2002-05-14 Yuuichi Teranishi * wl-vars.el (wl-invalid-character-message): New user option. * wl-util.el (wl-set-string-width): If truncated string-width is larger than specified width, use `wl-invalid-character-message'. 2002-05-14 KAMO Tomoyuki * wl-summary.el (wl-summary-prefetch-msg): If wl-prefetch-confirm is nil and arg is non-nil, do prefetch. 2002-05-11 Yuuichi Teranishi * wl-vars.el (wl-summary-check-line-format): New user option. (wl-summary-line-format-file): Ditto. * wl-summary.el (wl-summary-buffer-line-format): New buffer local variable. (wl-summary-buffer-set-folder): Set wl-summary-buffer-line-format. (wl-summary-goto-folder-subr): Use `wl-summary-line-format-changed-p' and `wl-summary-view-old-p' to check whether do a rescan or not. (wl-summary-view-old-p): New function. (wl-summary-line-format-changed-p): Ditto. (wl-summary-line-format-save): Ditto. (wl-summary-save-view-cache): Call `wl-summary-line-format-save'. * wl-util.el (wl-set-string-width): Avoid using negative number for make-string. 2002-05-10 Hiroya Murata * wl-summary.el (wl-summary-line-list-info): Revised format of the return value. * wl-util.el (wl-set-string-width): Added optional argument `padding' (All other related portions are changed). (wl-line-parse-format): If the first letter of column number is `0', zero-padding the result (ex: "%05l"). * wl-summary.el (wl-summary-line-list-count): Fixed parenthesis. 2002-05-10 Yuuichi Teranishi * wl-summary.el (wl-summary-delete-messages-on-buffer): Fix for sequential summary view. 2002-05-10 Katsumi Yamaoka * wl-summary.el (wl-summary-save-view-cache): Use a base codesys if it doesn't have a -unix version. 2002-05-10 Yuuichi Teranishi * wl-summary.el (wl-summary-jump-to-msg): Fix. 2002-05-09 Yuuichi Teranishi * wl-draft.el (wl-draft-create-contents): Treat 'Body field as draft content. (wl-draft): Follow the change above. * wl-vars.el (wl-summary-line-format-spec-alist): Added @. * wl.el (wl-check-variables-2): Check whether wl-summary-line-format and wl-folder-summary-line-format-alist contain %T and %P. * wl-vars.el (wl-summary-mode-line-format-spec-alist): New variable. (wl-summary-mode-line-format): New user option. (wl-summary-line-format-spec-alist): Added l, T, P, n. (wl-summary-line-format): Changed default value. (wl-summary-lazy-highlight): Changed default value. * wl-thread.el (wl-thread-update-line-on-buffer-sub): Follow the change in wl-summary-create-line. (wl-thread-insert-entity-sub): Ditto. * wl-summary.el (wl-summary-buffer-folder-indicator): Abolished. (wl-summary-buffer-unread-status): Ditto. (wl-summary-buffer-temp-mark-column): New buffer-local variable. (wl-summary-buffer-persistent-mark-column): Ditto. (wl-summary-buffer-mode-line-formatter): Ditto. (wl-summary-buffer-mode-line): Ditto. (wl-summary-message-regexp): Abolished. (All other related portions are changed.) (wl-summary-detect-mark-position): New function. (wl-summary-buffer-set-folder): Setup wl-summary-buffer-mode-line-formatter. (wl-summary-mode): Setup selective-display; Setup pre-idle-hook when xemacs. (wl-summary-update-modeline): Rewrite. (wl-summary-jump-to-msg): Define as function; Changed regexp for searching messages. (wl-summary-message-number): Rewrite. (wl-summary-goto-folder-subr): Decode with `unix' EOL; Do rescan when old type summary cache. (wl-summary-goto-folder-subr): Call sit-for to rehighlight on XEmacs. (wl-summary-remove-destination): Use '\r' to detect EOL. (wl-summary-print-destination): Ditto. (wl-summary-temp-mark): New inline function. (wl-summary-persistent-mark): Ditto. (wl-summary-line-number): New function. (wl-summary-line-list-info): Renamed from wl-summary-line-list-info. (wl-summary-line-list-count): New function. (wl-summary-create-line): Added argument persistent-mark. (All other related portions are changed) (wl-summary-create-line): Insert '\r'. (wl-summary-save-view-cache): Encode whth `unix' EOL. (wl-summary-cursor-move-surface): New inline function. (wl-summary-prev): Use it. (wl-summary-next): Ditto. * wl-highlight.el (wl-highlight-summary-current-line): Don't use wl-summary-message-regexp. (wl-highlight-summary): Delete progress message. (wl-highlight-summary-window): Do highlight only when wl-summary-mode. * Version number is increased to 2.9.12. 2002-05-08 Yoichi NAKAYAMA * wl-summary.el (wl-summary-line-subject-minimum-length): New variable (nil: no minimum). (wl-summary-line-subject): Add some spaces after subject by wl-summary-line-subject-minimum-length. 2002-05-08 Hiroya Murata * wl-vars.el (wl-summary-line-format-spec-alist): Redefined `c' and removed `F'. (wl-folder-summary-line-format-alist): Fixed docstring (Follow the change above). 2002-05-07 Yoichi NAKAYAMA * wl-summary.el (wl-summary-line-list-count): Reverted. (example setting in samples/*/dot.wl is also updated) 2002-05-07 Yuuichi Teranishi * wl-vars.el (wl-summary-line-format-spec-alist): Added '~'. * wl-util.el (wl-line-parse-format): Set up wl-line-string. * wl-vars.el (wl-summary-line-format): Addes some description to the docstring. * wl-summary.el (wl-summary-line-open-bracket): Abolished. (wl-summary-line-close-bracket): Ditto. (wl-summary-line-children-number): Ditto. (wl-summary-line-thread-indent): Ditto. (wl-summary-line-children-and-from): Ditto. * wl-vars.el (wl-summary-line-format-spec-alist): Redefine '[', ']', 't', 'c', 'F' and added 'C'. * wl-util.el (wl-set-string-width): Accept negative value. (wl-line-parse-format): Added "%number(" and "%)". 2002-05-07 Yoichi NAKAYAMA * wl-summary.el (wl-summary-line-list-count): Change format of the return value. 2002-05-03 Daiki Ueno * wl-draft.el (wl-draft-beginning-of-line): New command imported from the recent message.el. (wl-draft-point-in-header-p): Ditto. * wl-mule.el (wl-draft-mode-map): Bind "\C-a" to wl-draft-beginning-of-line. * wl-e21.el (wl-draft-mode-map): Ditto. * wl-xmas.el (wl-draft-mode-map): Ditto. * wl-folder.el: Sort macrodefs by dependencies. 2002-05-03 Yuuichi Teranishi * wl-summary.el (wl-summary-prev): Fixed regexp. (wl-summary-next): Ditto. 2002-05-02 Yoichi NAKAYAMA * wl-summary.el (wl-summary-line-day-of-week): Ignore error. 2002-05-02 Yuuichi Teranishi * wl-summary.el (wl-summary-create-line): Bind variable `entity' for backward compatibility. 2002-05-02 Yoichi NAKAYAMA * wl-summary.el (wl-summary-line-list-count): New function, merged from my-wl-summary-subject-func-ml in samples/*/dot.wl. * wl-vars.el (wl-summary-line-format-spec-alist): Add entry for list counts. 2002-05-02 Yuuichi Teranishi * wl-summary.el (wl-summary-create-line): Ignore errors while timezone-fix-time. * wl-acap.el (wl-acap-create-folder-entity): Bind unbound variable. * wl-summary.el (wl-summary-sync-update): Ditto. (wl-summary-default-from): Use wl-message-entity instead of entity. * wl-summary.el (wl-summary-create-line): Fix. * wl-vars.el (wl-summary-line-format-spec-alist): New variable. (wl-summary-line-format): New user option. (wl-folder-summary-line-format-alist): Ditto. (wl-summary-from-width): Abolished. * wl-util.el (toplevel): Require 'bytecomp. (wl-line-parse-format): New function. (wl-line-formatter-setup): New macro. * wl-summary.el (wl-summary-buffer-number-regexp): Abolished. (wl-summary-buffer-line-formatter): New buffer local variable. (wl-summary-switch-to-clone-buffer): Follow the change above. (wl-summary-message-regexp): Fix. (wl-summary-from-func-internal): Abolished. (wl-summary-subject-func-internal): Ditto. (wl-summary-subject-filter-func-internal): Ditto. (All other related portions are changed.) (wl-summary-buffer-set-folder): Set up wl-summary-buffer-number-column and wl-summary-buffer-line-formatter (All other related portions are changed.) (wl-summary-buffer-number-column-detect): Abolished. (All other related portions are changed.) (wl-summary-delete-all-status-marks-on-buffer): Removed. (wl-summary-delete-all-temp-marks-on-buffer): Use wl-summary-message-regexp instead of wl-summary-buffer-number-regexp. (wl-summary-target-mark-delete): Ditto. (wl-summary-target-mark-refile-subr): Ditto. (wl-summary-target-mark-mark-as-read): Ditto. (wl-summary-target-mark-mark-as-unread): Ditto. (wl-summary-target-mark-mark-as-important): Ditto. (wl-summary-target-mark-save): Ditto. (wl-summary-replace-status-marks): Renamed from wl-summary-set-status-marks-on-buffer; Use wl-summary-message-regexp instead of wl-summary-buffer-number-regexp. (wl-summary-sync-update): Follow the change above. (wl-summary-goto-previous-message-beginning): New function. (wl-summary-mark-as-unread): Use it. (wl-summary-mark-as-important): Ditto. (wl-summary-line-formatter): New variable. (wl-summary-line-year): New function. (wl-summary-line-day): Ditto. (wl-summary-line-day-of-week): Ditto. (wl-summary-line-hour): Ditto. (wl-summary-line-minute): Ditto. (wl-summary-line-open-bracket): Ditto. (wl-summary-line-close-bracket): Ditto. (wl-summary-line-children-number): Ditto. (wl-summary-line-thread-indent): Ditto. (wl-summary-line-size): Ditto. (wl-summary-line-subject): Ditto. (wl-summary-line-from): Ditto. (wl-summary-line-children-and-from): Ditto. (wl-summary-create-line): Rewritten. (wl-summary-format-date): Abolished. * wl-highlight.el (wl-highlight-summary-current-line): Use wl-summary-message-regexp instead of wl-summary-buffer-number-regexp; Use thread structure to detect thread top message. * wl-draft.el (wl-default-draft-cite): Don't use wl-summary-from-func-internal. * wl-refile.el (wl-refile-subject-learn): Don't use wl-summary-subject-filter-func-internal. (wl-refile-guess-by-subject): Ditto. * wl-e21.el (wl-e21-toolbar-configurations): Changed default parameters. * wl-thread.el (wl-thread-update-indent-string-region): Use wl-thread-update-line-on-buffer instead of wl-thread-update-indent-string. (wl-thread-update-children-number): Redefine using wl-thread-update-line-on-buffer. (wl-thread-update-indent-string): Abolished. * Version number is increased to 2.9.11. 2002-05-01 Yuuichi Teranishi * wl-e21.el (wl-modeline-biff-state-on): Put risky-local-variable property for wl-modeline-biff-state-on, wl-modeline-biff-state-off, wl-modeline-plug-state-on and wl-modeline-plug-state-off. * wl-folder.el (wl-folder-buffer-search-entity): Bind case-fold-search as nil. * wl-thread.el (wl-thread-open-all-unread): Use elmo-folder-list-messages-mark-match. (wl-thread-insert-message): Removed argument `mark-alist'. (wl-thread-msg-mark-as-important): Use elmo-msgdb-get-mark and elmo-msgdb-set-mark. (wl-thread-get-children-msgs-uncached): Likewise. (wl-thread-get-exist-children): Added argument include-self. (wl-thread-delete-message): Follow the change above. * wl-summary.el (wl-summary-count-unread): Removed argument. (wl-summary-rescan): Follow the change above. (wl-summary-mark-as-read-region): Ditto (wl-summary-mark-as-unread-region): Ditto. (wl-summary-delete-messages-on-buffer): Ditto. (wl-summary-sync-update): Ditto. (wl-summary-switch-to-clone-buffer): Ditto. (wl-summary-goto-folder-subr): Ditto. (wl-summary-target-mark-mark-as-read): Ditto. (wl-summary-target-mark-mark-as-unread): Ditto. (wl-summary-target-mark-mark-as-important): Ditto. (wl-summary-insert-thread-entity): Removed argument `mark-alist'. (wl-summary-update-thread): Removed argument `mark-alist'. (wl-summary-sync-marks): Use elmo-folder-list-messages-mark-match. (wl-summary-mark-as-read-all): Use elmo-folder-replace-marks. (wl-summary-resume-cache-status): Likewise. (wl-summary-prefetch-msg): Use elmo-msgdb-get-mark and elmo-msgdb-set-mark. (wl-summary-mark-as-read-all): Likewise. (wl-summary-delete-cache): Ditto. (wl-summary-auto-select-msg-p): Ditto. (wl-summary-mark-as-unread): Ditto. (wl-summary-no-auto-refile-message-p): Ditto. (wl-summary-mark-as-read): Ditto. (wl-summary-mark-as-important): Ditto. (wl-summary-auto-refile): Follow the change above. (wl-summary-delete-all-marks): Removed. (wl-summary-resume-marks-and-highlight): Ditto. (wl-summary-resume-marks): Ditto. (wl-summary-delete-important-msgs-from-list): Ditto. (wl-summary-delete-canceled-msgs-from-list): Ditto. * wl-folder.el (wl-folder-check-one-entity): Removed argument for wl-summary-count-unread. * wl-score.el (wl-summary-score-update-all-lines): Ditto. (wl-summary-score-update-all-lines): Use elmo-msgdb-set-mark. 2002-04-30 Yuuichi Teranishi * wl-summary.el (wl-summary-summary-line-already-exists-p): Abolished. (wl-summary-insert-sequential): Renamed from wl-summary-insert-summary. (wl-summary-create-line): Renamed from wl-summary-overview-create-summary-line; Argument rearrangement. (wl-summary-update-thread): Follow the change above. * wl-thread.el (wl-thread-update-line-on-buffer-sub): Likewise. (wl-thread-insert-entity-sub): Likewise. * wl-summary.el (wl-summary-append-message-func-internal): Removed argument `overview', `mark-alist' and added `msgdb'. * wl-thread.el (wl-thread-insert-message): Remove argument `overview'. * wl-summary.el (wl-summary-insert-summary): Changed argument. (wl-summary-rescan): Follow the change above. (wl-summary-sync-update): Ditto. (wl-summary-insert-thread-entity): Ditto; Don't use `let*' in every while loop; Detect infinite loop of threads. (wl-summary-update-thread): Removed argument `overview'. * wl-thread.el (wl-thread-insert-message): Ditto. * Version number is increased to 2.9.10. * wl-message.el (wl-message-redisplay): Ignore errors while wl-message-redisplay-hook. 2002-04-27 Yoichi NAKAYAMA * wl-draft.el (wl-draft-mimic-kill-buffer): Don't save draft. 2002-04-23 Yuuichi Teranishi * wl.el (wl): inhibit-quit while wl-folder. 2002-04-19 Yuuichi Teranishi * wl-draft.el (wl-default-draft-cite): Bind elmo-mime-charset while msgdb access. 2002-04-17 Hiroya Murata * wl-summary.el (wl-summary-auto-refile): Don't stop mark process even if no folder is not created. 2002-04-16 Yuuichi Teranishi * wl-vars.el (wl-folder-mime-charset-alist): Added @2ch. * wl-summary.el (wl-summary-goto-top-of-current-thread): New implementation. (wl-summary-target-mark-thread): Ditto. * wl-message.el (wl-message-display-internal): Bind elmo-mime-charset. 2002-04-12 TAKAHASHI Kaoru * wl-util.el (wl-display-bytes): Remove unused function. 2002-04-11 Yoichi NAKAYAMA * wl.el (wl-check-environment): Cause error when wl-from is nil, seems critical one (partially reverse the change in 2002/03/17). 2002-04-09 Yoichi NAKAYAMA * wl-util.el (wl-sendlog-time): Merge into wl-draft-write-sendlog. * wl-draft.el (wl-draft-write-sendlog): Ditto. 2002-04-03 Hiroya Murata * wl-summary.el (wl-summary-refile-subr): Cause an error if FOLDER is not writable. (wl-summary-sync-update): Call `wl-folder-confirm-existence' with plugged status instead of `'force' as 2nd argument. * wl-folder.el (wl-folder-create-subr): Cause an error if FOLDER is not creatable. * Version number is increased to 2.9.9. 2002-04-03 Kenichi OKADA * wl-summary.el (wl-summary-suspend): New function. 2002-04-03 Kenichi OKADA * wl.el (wl): Do not check variables if check is nil. * wl-utils.el (wl-collect-draft): New function. * wl-folder.el (wl-folder-suspend): Put summary buffers and draft buffers at the end of buffer list. * wl-draft.el (wl-jump-to-draft-folder): Use `wl-collect-draft'. 2002-04-02 Hiroya Murata * wl-message.el (wl-message-buffer-prefetch-get-next): Use while loop instead of recursive call. * wl-addrmgr.el (wl-addrmgr-quit-yes): Call get-buffer-window with 2nd argument. 2002-03-24 Yoichi NAKAYAMA * wl-draft.el (wl-draft-create-contents): Don't take neither (function . args) nor (string . something) any more. * wl-version.el (wl-generate-user-agent-string): Return string without header symbol. * wl-draft.el (wl-draft-default-headers): Use it. * wl-draft.el (wl-draft-trim-ccs): Renamed from `wl-draft-insert-ccs' and return field value instead of inserting the header. Abolish cc argument. * wl-draft.el (wl-draft-default-headers): Use it for Bcc and Fcc. * wl-draft.el (wl-draft-default-headers): Use cons with symbol car rather than one with string car. * wl-vars.el (wl-draft-additional-header-alist): New variable. * wl-draft.el (wl-draft-create-contents): Add it after the default headers. * wl-draft.el (wl-draft-create-contents): For the case of (symbol-or-string . function) insert header only when the function returns string value. 2002-03-21 Yoichi NAKAYAMA * wl-vars.el (wl-draft-fields): "FCC" -> "Fcc". * wl-address.el (wl-folder-complete-header-regexp): Ditto. 2002-03-20 Yoichi NAKAYAMA * wl.el (wl-check-environment): Don't check Message-ID when `wl-insert-message-id' is nil. Revive checking if `wl-message-id-domain' contains "@". 2002-03-19 Yoichi NAKAYAMA * wl.el (wl-check-environment): Merge examination for "@" at inappropriate position into the first string-match. * wl-summary.el (wl-summary-target-mark-print): New function. (wl-summary-pipe-message-subr): Extracted from `wl-summary-pipe-message'. (wl-summary-target-mark-pipe): New function. (wl-summary-mode-map): Bind `wl-summary-target-mark-print' and `wl-summary-target-mark-pipe'. 2002-03-18 Yoichi NAKAYAMA * wl.el (wl-check-environment): Rewrite around Message-ID check. 2002-03-17 Yoichi NAKAYAMA * wl.el (wl-check-environment): Use elmo-warning instead of error for non-critical ones. Remove trash folder check. (wl): Don't ignore error in wl-check-environment. * wl-summary.el (wl-summary-get-delete-folder): Add trash folder check, which is moved from `wl-check-environment'. (Adviced by Teranishi-san [X-Mail-Count: 9661]) 2002-03-17 Yoichi NAKAYAMA * wl-summary.el (wl-summary-write-current-folder): If it cannot guess anything, call wl-summary-write. (wl-summary-write): Create draft with blank To field. * wl-draft.el (wl-draft): Undo unnecessary part of the last change. 2002-03-17 Yoichi NAKAYAMA * wl-draft.el (wl-draft): Call wl-draft-create-buffer with the argument full as well for wl-folder-write-current-folder. If wl-*-write-current-folder cannot guess addressee, add blank To header. Rewrite condition for positioning cursor. 2002-03-15 Yoichi NAKAYAMA * wl-folder.el (wl-folder-jump-to-next-summary): If the window of summary buffer is present, use it. (wl-folder-jump-to-previous-summary): Ditto. 2002-03-13 Yoichi NAKAYAMA * wl-draft.el (wl-draft-create-contents): Fix docstring. * wl-summary.el (wl-summary-mode-map): Exchange bindings for wl-summary-previous-buffer and wl-summary-next-buffer. * wl-folder.el (wl-folder-mode-map): Bind wl-folder-jump-to-next-summary and wl-folder-jump-to-previous-summary. (wl-folder-jump-to-next-summary): New function. (wl-folder-jump-to-previous-summary): Ditto. * wl-draft.el (wl-draft): Rearranged. 2002-03-12 Yoichi NAKAYAMA * wl-draft.el (wl-draft-create-contents): Treat symbol as a name of header. (wl-draft): Collect arguments for the header as header-alist. (wl-draft-forward): Arrange arguments for wl-draft. (wl-draft-reply): Ditto. (wl-draft-edit-string): Ditto. * wl-summary.el (wl-summary-write): Ditto. (wl-summary-write-current-folder): Ditto. * Version number is increased to 2.9.8. 2002-03-11 Yoichi NAKAYAMA * wl-xmas.el (wl-draft-overload-menubar): Add menu properly. * wl-mule.el (wl-draft-overload-menubar): Taken from wl-e21.el. * wl-summary.el (wl-summary-write-current-folder): Call wl-draft even if the guess failed. * wl-e21.el (wl-folder-toolbar): Remove "Guess" icon. (wl-summary-toolbar): Remove "Guess" icon and use "New" icon for wl-summary-write-current-folder. * wl-xmas.el: Ditto. 2002-03-11 Yuuichi Teranishi * wl-summary.el (wl-summary-next-page): Force display message if message is not displayed yet. (wl-summary-prev-page): Ditto. 2002-03-11 Jérôme Marant * wl-folder.el (wl-folder-mode-menu-spec): Fixed typo. 2002-03-10 Yoichi NAKAYAMA * wl-e21.el (wl-draft-overload-menubar): Use define-key-after to add "Preview Message" and "Save Draft and Exit". 2002-03-10 Yoichi NAKAYAMA * wl-addrmgr.el (wl-addrmgr-quit-yes): Put cursor on draft buffer if addrmgr is called from draft in splitted window. * wl-e21.el (wl-draft-overload-menubar): Undo last change. * wl-mule.el: Ditto. * wl-xmas.el: Ditto. 2002-03-09 Yoichi NAKAYAMA * wl-folder.el (wl-folder-mode-menu-spec): Fix docstring. * wl-e21.el (wl-folder-toolbar): Add "Go to draft folder" entry. * wl-xmas.el (wl-folder-toolbar): Ditto. 2002-03-08 Yoichi NAKAYAMA * wl-e21.el (wl-draft-overload-menubar): Add wl-draft-preview-message and wl-draft-save-and-exit. (wl-draft-toolbar): Add wl-draft-save-and-exit. * wl-xmas.el: Ditto. * wl-mule.el: Ditto. * wl-folder.el (wl-folder-goto-draft-folder): New function. (wl-folder-mode-menu-spec): Add wl-folder-goto-draft-folder entry. 2002-03-08 Yuuichi Teranishi * wl-summary.el (wl-summary-save-view-cache): Clone temporal mark lists for saving buffer. 2002-03-07 Yoichi NAKAYAMA * wl-draft.el (wl-draft): Abolish summary-buf argument and use parent-folder argument instead of it. (wl-draft-create-buffer): Ditto. (wl-draft-forward): Ditto. (wl-draft-reply): Ditto. * wl-summary.el (wl-summary-write): Ditto. (wl-summary-write-current-folder): Ditto. * wl-draft.el (wl-draft-create-buffer): If called by W (Folder), don't set wl-draft-buffer-cur-summary-buffer so as to go back to Folder buffer after composing. 2002-03-07 Katsumi Yamaoka * wl-draft.el (wl-draft-insert-x-face-field-here): Strip X-Face header if the file `wl-x-face-file' already contains it. 2002-03-06 Yoichi NAKAYAMA * wl-folder.el (wl-folder-mode-menu-spec): Add "Write for current folder" entry. * wl-summary.el (wl-summary-mode-menu-spec): Ditto. * wl-e21.el (wl-folder-toolbar): Ditto. * wl-xmas.el (wl-folder-toolbar): Ditto. 2002-03-05 Yoichi NAKAYAMA * wl-folder.el (wl-folder-goto-folder-sticky): Simply call wl-folder-goto-folder with sticky argument. (wl-folder-mode-map): Bind wl-folder-goto-folder-sticky to "G". 2002-03-05 Yuuichi Teranishi * wl-summary.el (wl-summary-mode-map): Bind wl-summary-next-buffer and wl-summary-previous-buffer. (wl-summary-next-buffer): New function. (wl-summary-previous-buffer): Ditto. 2002-03-05 Yoichi NAKAYAMA * wl-folder.el (wl-folder-mode-map): Bind [(shift return)] for wl-folder-jump-to-current-entity-with-arg. (wl-folder-jump-to-current-entity-with-arg): Simply call with arg `wl-folder-jump-to-current-entity'. * wl-summary.el (wl-summary-mode-map): Bind "G" for `wl-summary-goto-folder-sticky'. (wl-summary-goto-folder-sticky): Simply call with the sticky arg `wl-summary-goto-folder'. (wl-summary-goto-folder-subr): Add 7th argument force-exit. Unless force-exit, do not clean temp. marks for sticky summary. (wl-summary-goto-folder): Now the prefix argument means force-exit. 2002-03-05 Yuuichi Teranishi * wl-summary.el (wl-summary-mark-as-important): Refetch if cache is not entire. 2002-03-04 Yuuichi Teranishi * wl-summary.el (wl-summary-mode-map): Bind wl-summary-save-status to `C-x C-s'. (wl-summary-save-status): New command. (wl-summary-exit): Don't clean-up temp marks when sticky. (Applied patch from Nakayama-san [wl: 09548]) (wl-summary-delete-all-temp-marks): Added optional argument no-msg; Do nothing when no mark data. (wl-summary-save-view-cache): Copy local variables to the temp buffer; Call `wl-summary-delete-all-temp-marks' before saving. 2002-03-04 Mito * wl-mime.el (wl-mime-save-content): Don't save if answered "no". 2002-02-28 Yoichi NAKAYAMA * wl.el (wl-check-environment): Also cause error when (system-name) returns "localhost.localdomain". (Although it doesn't affect because of condition-case, see change in 2002-01-23 by Teranisi-san.) 2002-02-26 Yoichi NAKAYAMA * wl-folder.el (wl-folder-update-newest): Use wl-string-match-member instead of wl-match-member with wl-folder-hierarchy-access-folders. * wl-vars.el (wl-folder-hierarchy-access-folders): Change default value. 2002-02-24 Yuuichi Teranishi * wl-draft.el (wl-draft-reply): If r-to-list is a function, call it; Likewise r-cc-list and r-ng-list. 2002-02-20 Yuuichi Teranishi * wl-draft.el (wl-draft-send): Use mime-header-encode-method-alist only if it is bound as variable. * wl-mime.el (wl-draft-preview-message): Ditto. 2002-02-19 Yuuichi Teranishi * wl-message.el (wl-message-add-buttons-to-header): Eliminated needless `goto-char'. * wl-summary.el (wl-summary-set-message-buffer-or-redisplay): Call `wl-summary-redisplay-no-mime-internal' instead of `wl-summary-redisplay-no-mime'. (wl-summary-redisplay-no-mime): Changed argument; Call `wl-summary-redisplay-no-mime-internal'. * wl-mime.el (wl-draft-preview-message): Bind `mime-header-encode-method-alist' locally. * wl-draft.el (wl-draft-eword-encode-address-list): New function. (wl-draft-std11-parse-addresses): Added the first address check. (wl-draft-send): Bind `mime-header-encode-method-alist' locally. * Version number is increased to 2.9.7. 2002-02-16 Kenichi OKADA * wl-draft.el (wl-draft-send-mail-with-smtp): Check error. 2002-02-15 Daiki Ueno * wl-demo.el (wl-demo-insert-image): Don't touch the specifiers related to scrollbar support, if there is no such a feature compiled in. 2002-02-11 Hiroya Murata * wl-message.el (wl-message-buffer-prefetch-next): Don't call `wl-message-buffer-prefetch-get-next' if FOLDER is not a target for prefetch. 2002-02-07 Kenichi OKADA * wl-summary.el (wl-summary-pick): Fix for no match. 2002-02-01 Kenichi OKADA * wl-draft.el (wl-draft-save): Override `mime-header-encode-method-alist'. 2002-02-01 Kenichi OKADA * wl-folder.el (wl-folder-pick): New function. Define key as "?". 2002-02-01 Kenichi OKADA * wl-draft.el (wl-draft-send-mail-with-pop-before-smtp): Fix for unplugged. 2002-02-01 Kenichi OKADA * wl-folder.el (wl-folder-virtual): New function. Define key as "V". 2002-02-01 Kenichi OKADA * wl-fldmgr.el (wl-fldmgr-make-filter): Make filter folder of multi folder if entity is group. 2002-02-01 Kenichi OKADA * wl-message.el (wl-message-buffer-prefetch-debug): Default value is nil. 2002-02-01 Kenichi OKADA * wl-summary.el (wl-summary-pick): Fix for killed messages. (wl-summary-target-mark-msgs): Return the number of marked messages. 2002-01-26 ARISAWA Akihiro * wl-summary.el (wl-summary-sync): Fixed problem when "last:" or "first:" is specified. 2002-01-25 Yoichi NAKAYAMA * wl-vars.el (wl-from): Use return value of function user-full-name instead of the variable user-full-name since XEmacs-20.4 doesn't set this variable. 2002-01-25 Yuuichi Teranishi * wl.el (wl-other-frame): If wl-folder-use-frame is non-nil, call `wl' directly. 2002-01-25 pf21 GOTO_Toshiya * wl-draft.el (wl-draft-reedit): Removed duplicated switch-to-buffers. 2002-01-25 Katsumi Yamaoka * wl.el (wl-other-frame): Removed garbages. 2002-01-25 Yuuichi Teranishi * wl-e21.el (wl-draft-key-setup): Don't bind C-x C-s * wl-xmas.el (wl-draft-key-setup): Ditto. * wl-mule.el (wl-draft-key-setup): Ditto. * wl-draft.el (wl-draft-create-buffer): Don't clear buffer-file-name. (wl-draft-reedit): Ditto. (wl-draft-prepare-edit): Add `wl-draft-save' to `local-write-file-hooks'. (wl-draft-prepare-edit): Call clear-visited-file-modtime. (wl-draft-reedit): Set buffer-file-name. (wl-draft-reedit): Add `wl-draft-save' to `local-write-file-hooks'. * wl.el (wl-exit): If wl-delete-startup-frame-function is non-nil, call it. (wl-delete-startup-frame-function): New variable. (wl-other-frame): New function (Original was written by Yamaoka san [wl: 09239]). * wl-folder.el (wl-folder): Set up `wl-delete-startup-frame-function' if `wl-folder-use-frame'. 2002-01-24 Kenichi OKADA * wl-message.el (wl-message-buffer-prefetch-p): Check plugged. 2002-01-24 Kenichi OKADA * wl-message.el (wl-message-buffer-prefetch-move-spec-plugged-alist): New variable. (wl-message-buffer-prefetch-move-spec-unplugged-alist): New variable. (wl-message-buffer-prefetch-get-next): Use them. * wl-demo.el (wl-demo-copyright-notice): Add 2002. 2002-01-24 Yuuichi Teranishi * wl-summary.el (wl-summary-reedit): Don't enclose wl-draft-reedit with unwind-protect. * wl-draft.el (wl-draft-reedit): Rewrite. (wl-jump-to-draft-buffer): Don't use `buffer-file-name'. (wl-draft-save): Insert header separator if it does not exist; Removed condition-case. * wl-summary.el (wl-summary-reedit): Revert last change. * wl-draft.el (wl-draft-save): Rewrite. (wl-draft-create-buffer): Set buffer-file-name as nil. * wl-summary.el (wl-summary-reedit): Don't care about draft folder. * wl-thread.el (wl-thread-get-depth-of-current-line): Rewrite. * wl-vars.el (wl-summary-no-mime-folder-list): Changed default value to nil. 2002-01-24 Kenichi OKADA * wl-message.el (wl-message-buffer-prefetch): Require `count'. If count is nil, do not prefetch. (wl-message-buffer-prefetch-next): Next. 2002-01-24 Kenichi OKADA * wl-draft.el (wl-draft-prepare-edit): Use `wl-draft-save'. 2002-01-24 Kenichi OKADA * wl-draft.el (wl-draft-insert-mail-header-separator): Use `delete-backward-char' (wl-draft-prepare-edit): Check major-mode. (wl-draft-decode-header): Rewrite. (wl-draft): Fix. 2002-01-24 Kenichi OKADA * wl-message.el (wl-message-buffer-prefetch-subr): Fix. 2002-01-23 Kenichi OKADA * wl-message.el (wl-message-buffer-prefetch-p): Check size. (wl-message-buffer-prefetch-get-next): Remove size checking. (wl-message-buffer-prefetch): call `wl-message-buffer-prefetch-p'. 2002-01-23 Kenichi OKADA * wl-draft.el (wl-draft-decode-body): Remove `debug'. (wl-draft-default-headers): Fix. 2002-01-23 Yoichi NAKAYAMA * wl-draft.el (wl-draft-default-headers): Insert return value of `wl-generate-mailer-string-function'. 2002-01-23 Yuuichi Teranishi * wl-draft.el (wl-draft-decode-body): Give an argument for delete-char. (wl-draft-insert-mail-header-separator): Ditto. * wl.el (wl): Enclose `wl-check-environment' with `condition-case' again (Reverted the change on 2002-01-17 by OKADA san). 2002-01-23 Kenichi OKADA * wl-draft.el (wl-draft): Rewrite. (wl-draft-create-buffer): New function. (wl-draft-create-contents): Ditto. (wl-draft-prepare-edit): Ditto. (wl-draft-decode-header): Ditto. (wl-draft-decode-body): Ditto. (wl-draft-check-new-line): Ditto. (wl-draft-default-headers): Ditto. (wl-draft-insert-mail-header-separator): Ditto. 2002-01-23 Kenichi OKADA * Version number is increased to 2.9.6. 2002-01-23 Kenichi OKADA * wl-draft.el (wl-draft-delete-field): Optional argument. (wl-draft-delete-fields): Ditto. 2002-01-23 Kenichi OKADA * wl-message.el (toplevel): Eliminated byte-compile warning. for `itimer-function', `delete-timer' and `itimer-list'. 2002-01-23 Kenichi OKADA * wl-vars.el (wl-message-buffer-prefetch-threshold): New variable. * wl-message.el (wl-message-buffer-prefetch-get-next): Use `wl-message-buffer-prefetch-threshold'. * wl-summary.el (wl-summary-redisplay-internal): Remove the check of `wl-message-buffer-prefetch-depth'. 2002-01-23 Kenichi OKADA * wl-message.el (wl-message-buffer-prefetch-get-next): Check the size of article. (wl-message-buffer-prefetch-subr): Remove size check. 2002-01-22 Yoichi NAKAYAMA * wl-vars.el (wl-plugged): Make customizable. 2002-01-22 Kenichi OKADA * wl-message.el (wl-message-buffer-prefetch-clear-timer): New function. (wl-message-buffer-prefetch-set-timer): New function. (wl-message-buffer-prefetch-get-next): New function. (wl-message-buffer-prefetch): New function. (wl-message-buffer-prefetch-next): Rewrite. (wl-message-buffer-prefetch-subr): Rewrite. * wl-vars.el (wl-auto-prefetch-first): New variable. * wl-summary.el (wl-summary-goto-folder-subr): Call `wl-message-buffer-prefetch' if `wl-auto-prefetch-first' is non-nil. 2002-01-22 Kenichi OKADA * wl-score.el (wl-summary-score-update-all-lines): Do not call `wl-summary-unread-message-hook'. 2002-01-22 Kenichi OKADA * wl-summary.el (wl-summary-input-range): New range `cache-status'. (wl-summary-sync): Call `wl-summary-resume-cache-status' if range is `cache-status'. 2002-01-22 Kenichi OKADA * wl-message.el (wl-message-buffer-prefetch-subr): Improve debug message. 2002-01-22 Kenichi OKADA * wl-draft.el (wl-draft-send-mail-with-smtp): run-hook `wl-mail-send-pre-hook'. (wl-draft-send-mail-with-qmail): Ditto. (wl-draft-normal-send-func): Delete `wl-mail-send-pre-hook'. 2002-01-22 Kenichi OKADA * wl-message.el (wl-message-buffer-prefetch-subr): Fix for cancel-function-timers bug. (wl-message-buffer-prefetch-debug): Default value is t. 2002-01-22 Kenichi OKADA * wl-message.el (wl-message-buffer-prefetch-next): Rewrite. (wl-message-buffer-prefetch-subr): Rewrite. Rename from `wl-message-buffer-prefetch'. 2002-01-21 Yoichi NAKAYAMA * wl-vars.el (wl-draft-cite-function): Moved from `wl-draft.el'. (wl-default-draft-cite-decorate-author): Ditto. * wl-draft.el (wl-draft-cite-function): Removed. (wl-default-draft-cite-decorate-author): Ditto. 2002-01-21 Yoichi NAKAYAMA * wl-draft.el (wl-default-draft-cite-decorate-author): New variable. (wl-default-draft-cite): Do not arrange author name if the value of `wl-default-draft-cite-decorate-author' is nil. 2002-01-21 Yuuichi Teranishi * wl-mime.el (wl-mime-save-content): Use `message' instead of `error'. * wl-folder.el (wl-folder-check-one-entity): Don't care `elmo-folder-use-flag-p'. 2002-01-21 Kenichi OKADA * wl-folder (wl-folder-check-one-entity): Fix problem if unread is nil. 2002-01-19 Yoichi NAKAYAMA * wl-address.el (wl-address-make-completion-list): Check whether the address is a group list. * wl-addrmgr.el (wl-addrmgr-mark-check): Ditto. 2002-01-19 Hiroya Murata * wl-folder.el (wl-folder-check-one-entity): Fixed problem; The number of the messages of new and unread does not count correctly. * wl-summary.el (wl-summary-count-unread): Changed to return `(new . unread)' instead of total. (wl-summary-sync-update): Follow the change above. * wl-score.el (wl-summary-score-update-all-lines): Likewise. 2002-01-19 Yoichi NAKAYAMA * wl-address.el (wl-address-make-completion-list): Do not enclose address by " <" and ">" if associated realname is "". * wl-addrmgr.el (wl-addrmgr-mark-check): Ditto. This is against the promblem with group list in .addresses pointed out by Tomotaka SUWA . 2002-01-19 Yoichi NAKAYAMA * wl-draft.el (wl-draft-write-sendlog): The first argument of message is a format control string. * wl-expire.el (wl-expire-append-log): Ditto. * wl-mime.el (wl-summary-burst-subr): Ditto. * wl-mule.el (wl-face-spec-set-match-display): Ditto. * wl-summary.el (wl-summary-edit-addresses-subr): Ditto. 2002-01-19 Kenichi OKADA * wl-vars.el (wl-message-buffer-prefetch-depth): Default is 3. wl.el (wl-check-variables): Rename from `wl-check-type'. (wl-check-variables-alist): Rename from `wl-check-type-variables'. (wl-check-variables-2): New function. (wl): Call `wl-check-variables-2'. 2002-01-19 Yoichi NAKAYAMA * wl-fldmgr.el (wl-fldmgr-rename): Fixed around message appear after renaming folder in access group. 2002-01-19 Kenichi OKADA * wl-vars.el (wl-message-buffer-prefetch-depth): New variable. (wl-message-buffer-prefetch-idle-time): Moved from `wl-message.el' * wl-message.el (wl-message-buffer-prefetch-next): Rewrite. (wl-message-buffer-prefetch): Rewrite. (wl-message-buffer-prefetch-idle-time): Removed. * wl-summary.el (wl-summary-redisplay-internal): Prepare prefetch with `wl-message-buffer-prefetch-depth'. Error check for `wl-message-buffer-prefetch-depht'. 2002-01-19 Kenichi OKADA * Version number is increased to 2.9.5. * wl-summary.el (wl-summary-prefetch-msg): Fix for buffer-cache. 2002-01-19 Kenichi OKADA * wl-vars.el (wl-fldmgr-allow-rename-access-group): New variable. * wl-fldmgr.el (wl-fldmgr-rename): Allow rename for access group. Based on the patch written by Yoichi NAKAYAMA 2002-01-18 Kenichi OKADA * wl-draft.el (wl-draft-raw-send): Fix for `wl-news-send-pre-hook' 2002-01-17 Kenichi OKADA * wl-utils.el (wl-message-id-function): New variable. * wl-draft.el (wl-draft-insert-required-fields): Use `wl-message-id-function'. 2002-01-17 Kenichi OKADA * wl-vars.el (wl-message-id-use-wl-from): New variable. * wl-utils.el (wl-draft-make-message-id-string): Use `wl-from' for domain part of Message-ID if `wl-message-id-use-wl-from' if non-nil. * wl.el (wl-check-environment): Fix for `wl-message-id-use-wl-from' 2002-01-17 Kenichi OKADA * wl.el (wl): Call `wl-check-type' Do not 'condition-case'. 2002-01-17 Kenichi OKADA * wl.el (wl-check-type): New function. (wl-check-type-variables): New variable. 2002-01-17 Kenichi OKADA * wl-vars.el (wl-pop-before-smtp-authenticate-type): Fix. 2002-01-17 Kenichi OKADA * wl-draft.el (wl-smtp-password-key): New function. (wl-smtp-extension-bind): Use `wl-smtp-password-key' (wl-draft-send-mail-with-smtp): Ditto. (wl-draft-send-mail-with-pop-before-smtp): Fix. 2002-01-12 Kenichi OKADA * wl-vars.el (wl-unique-id-suffix): Move from `wl-utils.el' * wl-utils.el (wl-unique-id-suffix): Remove. 2002-01-07 Kenichi OKADA * Version number is increased to 2.9.4. 2002-01-06 Kenichi OKADA * wl-utils.el (wl-unique-id-suffix): New variable. (wl-unique-id): Use `wl-unique-id-suffix' 2002-01-06 Hiroya Murata * wl-summary.el (wl-summary-pick): Use `elmo-folder-search' instead of `elmo-msgdb-search'. * Version number is increased to 2.9.3. 2002-01-05 OKAZAKI Tetsurou * wl-summary.el (wl-summary-refile-subr): Remove `interactive'. 2001-12-29 Kenichi OKADA * wl-draft.el (wl-sent-message-queued): New buffer-local variable. (wl-draft-dispatch-message): Changed for send-later. (wl-draft-queue-flush): Ditto. (wl-draft): Clear `wl-sent-message-queued'. (wl-draft-reedit): Ditto. (wl-draft-queue-info-operation): Added `wl-sent-message-queued' * wl-vars.el (wl-draft-force-queuing): New variable. (wl-draft-force-queuing-mail): New variable. (wl-draft-force-queuing-news): New variable. 2001-12-24 Yuuichi Teranishi * wl-draft.el (wl-draft-hide): Removed `interactive'. (Pointed out by YAMASHITA Junji ) 2001-12-23 Hiroya Murata * Version number is increased to 2.9.2. 2001-12-21 Katsumi Yamaoka * wl-draft.el (wl-draft-elide-region): New user command. * wl-vars.el (wl-draft-elide-ellipsis): New user option. * wl-e21.el (wl-draft-key-setup): Bind the key `C-c C-d' to the command `wl-draft-elide-region'. * wl-mule.el: Ditto. * wl-xmas.el: Ditto. 2001-12-20 Yuuichi Teranishi * wl-util.el (wl-biff-check-folder): Fix for non-pop3 folders. (wl-biff-check-folder-async): Removed needless let. 2001-12-19 Yuuichi Teranishi * wl-util.el (wl-biff-check-folders): Set `no-cache' argument of wl-folder-get-elmo-folder. (wl-biff-check-folder): Set `biff' argument of `wl-folder-check-one-entity'. (wl-biff-check-folder-async): Setup `biff' slot of folder. * wl-folder.el (wl-folder-get-elmo-folder): Added `no-cache' argument. (wl-folder-check-one-entity): Added `biff' argument; Setup `biff' slot of folder. * Version number is increased to 2.9.1. 2001-12-18 Yuuichi Teranishi * wl-fldmgr.el (wl-fldmgr-add-completion-all-completions): Removed comment out and fixed. (wl-fldmgr-add-completion-subr): Ditto. * wl-summary.el (wl-summary-exit): Changed order of saving summary view and msgdb. * wl.el (wl-toggle-plugged): Save summary view. 2001-12-17 Yuuichi Teranishi * wl-summary.el (wl-summary-open-folder): Bind `elmo-mime-charset'. 2001-12-17 Hiroya Murata * wl-addrmgr.el (wl-addrmgr-mode): Fixed docstring. 2001-12-17 Katsumi Yamaoka * wl-e21.el (wl-e21-toolbar-configurations): Replace `auto-resize-tool-bar' to `auto-resize-tool-bars'. Pavel Janik has realized this in the emacs-w3m list. * wl-demo.el (wl-demo-insert-image): Retry to read *.img file only if it was failed. (wl-demo): Disable undo in the demo buffer. 2001-12-15 Yuuichi Teranishi * wl-version.el (wl-version): Changed codename. * Version number is increased to 2.9.0. 2001-12-14 Takuo KITAME * wl-acap.el (wl-acap-init): Fixed `y-or-n-p' prompts. * wl-folder.el (wl-folder-sync-current-entity, wl-folder-create-subr) (wl-folder-mark-as-read-all-current-entity): Ditto. 2001-12-13 Yuuichi Teranishi * wl-vars.el (wl-from-width): Define as obsolete variable. (wl-subject-length-limit): Ditto. * wl.el (wl-plugged-dop-queue-status): Shrink queue list. * wl-expire.el (wl-folder-expire-entity): Follow the last change on wl-summary-save-view. * wl.el (wl-save-status): Ditto. (Pointed out by MAKINO Takashi ) * wl-summary.el (wl-summary-save-view): Removed unused argument. (wl-summary-exit): Follow the change above. (wl-summary-goto-folder-subr): Ditto. * wl-folder.el (wl-folder-create-subr): Don't use `elmo-folder-creatable-p'. 2001-12-12 Yuuichi Teranishi * wl-demo.el (wl-demo-icon-name): Use X'mas logo on Dec 25 too. 2001-12-12 Katsumi Yamaoka * wl-demo.el (wl-demo-image-type-alist): Add bitmap, prefer xbm rather than bitmap on Emacs 21. (wl-demo-insert-image): Decode bitmap data line by line when Emacs 21 is running (cf. mule-ja:08245); make Emacs 21 use BITMAP-MULE for xbm if the new redisplay engine is not available. 2001-12-11 Yuuichi Teranishi * wl-folder.el (wl-folder-init-hook): New hook. (wl-folder-init): Run `wl-folder-init-hook'. 2001-12-11 Katsumi Yamaoka * wl-demo.el (wl-demo-insert-image): Fixed the face name for xbm. 2001-12-11 Yuuichi Teranishi * wl-acap.el (wl-acap-cache-filename): New variable. (wl-acap-exit): Resume elmo-msgdb-directory only if it is preserved. (wl-acap-init): Use cache if no ACAP server found. 2001-12-11 TAKAHASHI Kaoru * wl-acap.el (wl-acap-original-msgdb-directory): Renamed from `wl-acap-original-msgdb-dir'. * wl-vars.el (wl-icon-directory): Renamed from `wl-icon-dir'. (wl-score-files-directory): Renamed from `wl-score-files-dir'. * wl-mime.el (wl-mime-save-directory): Renamed from `wl-mime-save-dir'. 2001-12-11 Katsumi Yamaoka * wl-vars.el (wl-icon-dir): Fixed the docstring. * wl-demo.el: Require `path-util'. (wl-demo-bitmap-mule-available-p): New internal variable. (wl-demo-image-type-alist): Use it; don't require `bitmap', use `module-installed-p' instead. (wl-demo-insert-image): Use *.img file for a bitmap image. (wl-demo): Don't call the ascii demo recursively. 2001-12-11 TAKAHASHI Kaoru * Version number is increased to 2.7.7. 2001-12-11 Yuuichi Teranishi * wl.el (wl-exit): Eliminated byte-compile warning. 2001-12-10 Hiroya Murata * wl-vars.el (wl-summary-update-confirm-threshold): Defined as obsolete variable using `elmo-define-obsolete-variable'. (wl-fetch-confirm-threshold): Ditto. (wl-cache-prefetch-folder-type-list): Ditto. (wl-cache-prefetch-folder-list): Ditto. 2001-12-10 Katsumi Yamaoka * wl-demo.el: Rewrote to make it read a logo file at the run-time. (wl-demo-icon-name): Use Xmas logo at the end of the year. (wl-demo-insert-image): New function. (wl-demo-insert-text): New function. (wl-demo-image-type-alist): Redefine as a function. (wl-demo): Use `wl-demo-insert-image' and `wl-demo-insert-text'. (wl-demo-with-temp-file-buffer): Removed. (wl-logo-xpm): Removed. (wl-logo-xbm): Removed. (wl-logo-bitmap): Removed. 2001-10-30 Nishimoto Masaki * wl-expire.el (wl-expire-localdir-date-folder-name-fmt): New variable. (wl-expire-localdir-get-folder-function): New user option. (wl-expire-localdir-get-folder): New function. (wl-expire-localdir-date): Ditto. 2001-12-10 TAKAHASHI Kaoru * wl-folder.el (wl-folder-check-one-entity): Fixed car of return value. Refactoring `wl-folder-notify-deleted' is nil case. Fixed unread number mismatch when all-unread < unread. 2001-12-08 Yuuichi Teranishi * wl-vars.el (wl-summary-update-confirm-threshold): Abolished. (wl-fetch-confirm-threshold): Ditto. * wl-summary.el (wl-summary-confirm-appends): Removed. (wl-summary-sync-update): Don't refer `wl-summary-update-confirm-threshold' (It is now abolished). * wl-message.el (wl-message-display-internal): Don't refer `wl-fetch-confirm-threshold' (It is now abolished). 2001-12-07 Katsumi Yamaoka * wl-demo.el (wl-logo-xpm): Use Xmas logo temporally. 2001-12-07 Yoichi NAKAYAMA * wl-vars.el (wl-summary-from-width): Rename from wl-from-width. (wl-summary-subject-length-limit): Rename from wl-subject-length-limit. Change default value to nil. (wl-summary-indent-length-limit): The value can be nil, nil means unlimited. * wl-summary.el: Don't set limit for indent length if the value of wl-summary-indent-length-limit is nil. If the value of wl-summary-width is nil, it means only that the width of summary is unlimited (nil doesn't mean that the indent length is unlimited). * wl-thread.el: Ditto. 2001-12-06 Hiroshi Tsutsui * wl-vars.el (wl-summary-update-confirm-threshold): The value can be nil, nil means never confirm. * wl-summary.el (wl-summary-confirm-appends): Ditto. 2001-12-06 Yoichi NAKAYAMA * wl-vars.el (wl-subject-length-limit): This value can be nil (nil means unlimited). 2001-12-05 Yuuichi Teranishi * wl-draft.el (wl-draft-write-sendlog): Use `write-region-as-binary'; Use `with-temp-buffer'. 2001-12-02 Yuuichi Teranishi * wl-folder.el (wl-folder-get-entity-id): Ignore nemacs (rewrite with new backquote style). (wl-folder-get-entity-from-buffer): Ditto. 2001-12-02 Hiroya Murata * wl-version.el (nemacs-version): Eliminated. (wl-extended-emacs-version2): Ignore nemacs. (wl-extended-emacs-version3): Ditto. 2001-11-30 Tatsuya Kinoshita * wl-vars.el (wl-draft-add-references): Set default value as nil. (wl-draft-add-in-reply-to): New variable. * wl-draft.el (wl-draft-add-references, wl-draft-add-in-reply-to): Divided from `wl-draft-add-references'; add support `In-Reply-To'. (wl-draft-yank-from-mail-reply-buffer): Use `wl-draft-add-in-reply-to'. (wl-draft-insert-current-message): Ditto. 2001-12-01 Hiroya Murata * wl-vars.el (wl-folder-process-duplicates-alist): Fixed typo (kill->hide). (wl-message-buffer-prefetch-folder-type-list): Added elements `mark' and `cache' instead of `internal'. 2001-11-30 Yuuichi Teranishi * wl-acap.el (wl-acap-init): If initialization via ACAP is interrupted, resume msgdb directory. 2001-11-28 Yuuichi Teranishi * wl.el (wl-exit): Call `wl-acap-exit'. * wl-summary.el (wl-summary-message-string): New function. (wl-summary-reedit): Use it. (wl-summary-resend-bounced-mail): Remove needless let. (wl-summary-supersedes-message): Ditto. (wl-summary-save): Ditto. * wl-acap.el (wl-acap-original-msgdb-dir): New variable. (wl-acap-init): Set it. (wl-acap-exit): New function. 2001-11-26 TAKAHASHI Kaoru * wl.el (wl-init): Revert (require 'mime-setup). move from toplevel. 2001-11-24 TAKAHASHI Kaoru * wl-summary.el (wl-summary-write-current-folder): Remove unused local variables. Add error when guess function return invalid value. 2001-11-23 TAKAHASHI Kaoru * wl-folder.el (wl-folder-guess-mailing-list-by-refile-rule): Change local variable name. (wl-folder-guess-mailing-list-by-folder-name): Ditto. (wl-folder-get-newsgroups): Return nil when non-news folder. * wl-summary.el (wl-summary-write-current-folder): State through when guess-list return nil. (wl-summary-write-current-folder-functions): Fixed docstring. * wl.el (wl-exit): Changed confirm message. * wl.el (wl-init): (require 'mime-setup) move to toplevel. * wl-draft.el (wl-draft): Remove verbose `featurep'. * wl-e21.el: Removed kludge for Emacs 21 prerelease versions. 2001-11-23 Hiroya Murata * wl-vars.el (wl-message-buffer-prefetch-folder-type-list): New user option (Renamed from wl-cache-prefetch-folder-type-list). (wl-message-buffer-prefetch-folder-list): New user option (Renamed from wl-cache-prefetch-folder-list). * wl-message.el (wl-message-buffer-prefetch-folder-type-list): Move to wl-vars.el. (wl-message-buffer-prefetch-p): Changed to enable `wl-message-buffer-prefetch-folder-list'. * wl-summary.el (wl-summary-target-mark-prefetch): Added argument `ignore-cache'. 2001-11-23 Kenichi OKADA * wl-draft.el (wl-draft-config-sub-func-alist): Added `part-top' and `part-bottom'. (wl-draft-config-sub-part-top): New function. (wl-draft-config-sub-part-bottom): New function. 2001-11-20 Yoichi NAKAYAMA * wl-draft.el (wl-draft-reply): Call wl-draft with parent folder. 2001-11-19 Kenichi OKADA * wl-folder.el (wl-folder-get-newsgroups): Fix. 2001-11-19 Yoichi NAKAYAMA * wl-draft.el (wl-draft): Added 14th argument `parent-folder'. * wl-summary.el (wl-summary-write): Call wl-draft with 14th argument. (wl-summary-write-current-folder): Ditto. 2001-11-19 Yuuichi Teranishi * wl-folder.el (wl-folder-get-newsgroups): Use `elmo-folder-newsgroups'. 2001-11-18 Kenichi OKADA * wl-draft.el (wl-draft-config-sub-header-top): New fucntion. (wl-draft-config-sub-func-alist): Added `wl-draft-config-sub-header-top'. `wl-draft-config-sub-header-bottom'. 2001-11-14 TAKAHASHI Kaoru * wl-folder.el (wl-folder-get-newsgroups): Fixed probrem when localnews folder. 2001-11-12 Yoichi NAKAYAMA * wl-summary.el (wl-summary-mode): Undo last change. * wl-folder.el (wl-folder-mode): Ditto. 2001-11-09 Yoichi NAKAYAMA * wl-summary.el (wl-summary-mode): Locally set truncate-partial-window-width to nil. (for XEmacs) * wl-folder.el (wl-folder-mode): Ditto. 2001-11-09 Yuuichi Teranishi * wl-util.el (wl-set-string-width) [Emacs]: New implementation. 2001-11-08 Yuuichi Teranishi * wl-util.el (wl-biff-check-folder-async-callback): Fixed unread number. * wl-folder.el (wl-folder-check-one-entity): Use `new' value of diff. * wl-util.el (wl-biff-check-folder-async-callback): Ditto. * Version number is increased to 2.7.6. 2001-11-05 Yuuichi Teranishi * wl-summary.el (wl-summary-insert-summary): Renamed dummy argument. 2001-11-01 Yuuichi Teranishi * wl-summary.el (wl-summary-sync-update): Enclose network related portion with `unwind-protect'. 2001-10-31 Hiroya Murata * wl-fldmgr.el (wl-fldmgr-add): Fixed problem when `name' is list. 2001-10-29 Yuuichi Teranishi * wl-message.el (wl-message-add-buttons-to-body): Exchenged 3rd and 4th element. * wl-vars.el (wl-message-body-button-alist): Ditto. * wl-vars.el (wl-message-body-button-alist): Set 4th element as the max match length. (Pointed out by Akihiro MOTOKI .) * wl-message.el (wl-message-add-buttons-to-body): Use 3rd element value for the max match length; Use 4th element value for the button string regexp group. * wl-acap.el (wl-acap-find-acap-service): If multiple ACAP server candidate exists, prompt to select. 2001-10-15 NAKAJIMA Mikio * wl-summary.el (wl-summary-jump-to-msg): Search before calibration point by `beginning-of-line'. 2001-10-11 Yoichi NAKAYAMA * wl-fldmgr.el (wl-fldmgr-make-group): Check folder name only for access group. 2001-10-11 Yuuichi Teranishi * wl-message.el (wl-message-display-internal): Bind `default-mime-charset'. * wl-fldmgr.el (wl-fldmgr-make-group): Check folder name error. * wl-draft.el (wl-draft-reply): Decode newsgroup field. * Version number is increased to 2.7.5. 2001-10-10 Hiroya Murata * wl-expire.el (wl-summary-archive): Fixed; Use `elmo-folder-name-internal'. 2001-10-08 Hiroya Murata * wl-expire.el (wl-expire-refile): Remove ALL and DONE arguments from `elmo-folder-move-messages' caller. (wl-expire-refile-with-copy-reserve-msg): Ditto. * wl-summary.el (wl-summary-exec-subr): Likewise (All other related portions are changed). 2001-10-06 Hiroya Murata * wl-summary.el (wl-summary-exec-subr): Setup and clear progress counter. 2001-10-05 Yoichi NAKAYAMA * wl-draft.el (wl-draft): Make truncate-partial-width-windows buffer local and set it to nil. * wl-message.el (wl-message-redisplay): Ditto. 2001-10-03 Yuuichi Teranishi * wl-summary.el (wl-summary-mark-as-important): If message is already cached, set messag as read, otherwise encache and mark as read. 2001-10-02 Yoichi NAKAYAMA * wl-summary.el (wl-summary-jump-to-current-message): Don't go to point-min. 2001-10-02 Katsumi Yamaoka * wl-xmas.el (wl-message-define-keymap): Return a keymap. * wl-mule.el (wl-message-define-keymap): Fixed parenthesis; return a keymap. 2001-10-02 Yuuichi Teranishi * wl-e21.el (wl-message-define-keymap): Don't set widget-keymap as parent. * wl-mule.el (wl-message-define-keymap): Ditto. * wl-xmas.el (wl-message-define-keymap): Fixed parenthesis. * wl-xmas.el (wl-message-display-internal-hook): Define. (wl-xmas-setup-message-toolbar): Define as function. (wl-setup-message): Define as alias for wl-xmas-setup-message-toolbar. (wl-message-overload-functions): Abolished. (wl-message-define-keymap): New function. * wl-vars.el (wl-message-display-internal-hook): New variable. (wl-message-header-button-alist): New variable (Renamed from wl-highlight-message-header-button-alist). (wl-message-body-button-alist): Ditto. * wl-mule.el (wl-message-define-keymap): New function. (wl-message-overload-functions): Abolished. * wl-message.el (wl-message-add-buttons-to-body): New function. (wl-message-redisplay): Don't call wl-message-overload-functions; Call wl-message-add-buttons-to-header and wl-message-add-buttons-to-body. (wl-message-display-internal): Set keymap argument for elmo-mime-display-as-is, elmo-mime-message-display; Run wl-message-display-internal-hook. (wl-message-refer-article-or-url): Abolished. * wl-highlight.el (wl-highlight-headers): Don't call wl-highlight-message-add-buttons-to-header. (wl-highlight-message-add-buttons-to-header): Abolished. * wl-e21.el (wl-message-display-internal-hook): Define. (wl-e21-setup-toolbar): Deleted duplicated binding. (wl-e21-setup-message-toolbar): Define as function. (wl-setup-message): Define as alias for wl-e21-setup-message-toolbar. (wl-message-define-keymap): New function. (wl-message-overload-functions): Abolished. 2001-10-01 Yuuichi Teranishi * wl-draft.el (wl-draft-queue-flush): Call elmo-folder-open-internal and elmo-folder-close. * wl.el (wl): Call `wl-check-environment' before `wl-plugged-init'. 2001-09-28 TAKAHASHI Kaoru * wl.el (wl-toggle-plugged): Use `not' instead of `null' for boolean value. * wl-draft.el (wl-draft-do-fcc): Ditto. 2001-09-26 Kenichi OKADA * wl-vars.el (wl-fcc-force-as-read): New variable. * wl-draft.el (wl-draft-do-fcc): If `wl-fcc-force-as-read' is non-nil, mark copied message as read. 2001-09-26 Kenichi OKADA * wl-draft.el (wl-draft-send-mail-with-pop-before-smtp): Fixed. 2001-09-26 TAKAHASHI Kaoru * wl-summary.el (wl-summary-switch-to-clone-buffer): Use `wl-summary-target-above' instead of obsolete variable `wl-summary-temp-above'. * wl-vars.el (toplevel): Use `elmo-define-obsolete-variable' instead of `make-obsolete-variable'. * wl-refile.el (toplevel): Ditto. 2001-09-26 Yuuichi Teranishi * wl-draft.el (wl-draft-yank-from-mail-reply-buffer): Push mark with third argument t. (wl-draft): Set first argument for wl-plugged-init as t. * wl-vars.el (wl-biff-state-indicator-off): Fixed default value definition. 2001-09-26 TAKAHASHI Kaoru * wl-vars.el: Tabify. (wl-biff-notify-hook): Use `ding' instead of `beep'. * wl-draft.el (wl-draft-send): Fixed docstring and confirm message. 2001-09-26 Yoichi NAKAYAMA * wl-vars.el (wl-biff-notify-hook): Remove duplicate definition and set default to beep. 2001-09-25 Yoichi NAKAYAMA * wl-vars.el (wl-draft-truncate-lines): New variable. * wl-draft.el (wl-draft): Use wl-draft-truncate-lines instead of wl-message-truncate-lines for truncate-lines. 2001-09-25 Yuuichi Teranishi * wl-message.el (wl-message-display-internal): Call `wl-highlight-message' after `elmo-mime-display-as-is'. * wl-mime.el (wl-mime-display-text/plain): New function. (wl-mime-display-header): Ditto. (wl-mime-setup): Register `wl-mime-display-text/plain' as a body-presentation-method for text/plain; Register `wl-mime-display-header' as a header-presentation-method; Don't set up `elmo-message-text-content-inserted-hook' and `elmo-message-header-inserted-hook'. * wl-message.el (wl-message-buffer-all-header-flag): New buffer local variable. (wl-message-display-internal): Set `wl-message-buffer-all-header-flag' as t if flag is 'all-header; Don't bind `elmo-message-ignored-field-list', `elmo-message-visible-field-list' and `elmo-message-sorted-field-list'. 2001-09-24 Katsumi Yamaoka * wl-vars.el: (wl-biff-state-indicator-off): Changed default value for xemacs with non-mule environment. 2001-09-23 TAKAHASHI Kaoru * wl-draft.el (wl-draft-strip-subject-re, wl-draft-kill) (wl-draft-send-mail-with-qmail, wl-draft-get-fcc-list) (wl-draft-do-fcc, wl-draft-queue-flush): Checkdoc. 2001-09-21 TAKAHASHI Kaoru * wl-vars.el (wl-interactive-send): Set default value as t. 2001-09-21 Yuuichi Teranishi * wl-addrmgr.el (wl-addrmgr-method-list): New variable. (wl-addrmgr-method-list): Abolished. (wl-addrmgr-change-method): Follow above change. * wl-draft.el (wl-draft): Call `wl-plugged-init'. 2001-09-21 Yoichi NAKAYAMA * wl-vars.el (wl-message-truncate-lines): Change default value to default-truncate-lines. * wl-draft.el (wl-draft): Set truncate-lines as in wl-message. 2001-09-20 Yoichi NAKAYAMA * wl-vars.el (wl-message-truncate-lines): New variable. * wl-message.el (wl-message-redisplay): Set truncate-lines using wl-message-truncate-lines. 2001-09-20 TAKAHASHI Kaoru * wl-acap.el (wl-acap-init): Remove period from error message. (wl-acap-find-acap-service): Remove period from message. 2001-09-20 Yuuichi Teranishi * wl.el (wl-check-environment): Undo last change. * wl-vars.el (wl-from): Changed default value. * wl-util.el (toplevel): Don't require tm-edit. * wl-draft.el (wl-draft): Changed order of `elmo-init' and `wl-folder-init'; Don't set mark on mail body. (wl-draft-reedit): Ditto. * wl-address.el (wl-address-quote-specials): Define as an alias for elmo-address-quote-specials. 2001-09-18 Yuuichi Teranishi * wl.el (wl-check-environment): If `wl-from' is nil, use default value. * wl-vars.el (wl-from): Set default value as nil. (wl-organization): Set default value as ORGANIZATION environment variable. * wl-draft.el (wl-smtp-extension-bind): Check value of wl-smtp-connection-type. * wl-acap.el (wl-acap-init): If ACAP service is not found, cause an error. 2001-09-18 TAKAHASHI Kaoru * Version number is increased to 2.7.4. * wl-highlight.el (wl-highlight-headers): Remove BEG and END arguments from `wl-highlight-x-face-function' caller. Use x-face-1.3.6.12 or later. 2001-09-17 Reuben Thomas * wl-addrmgr.el (wl-fldmgr-delete): Fix docstring. 2001-09-17 Yoichi NAKAYAMA * wl-vars.el (wl-summary-width): Fix type to accept nil. (wl-fcc): Fix to accept function. (Reported by Reuben Thomas ). 2001-09-16 TAKAHASHI Kaoru * wl-acap.el (toplevel): Added `product-provide' declare. * wl-addrmgr.el (toplevel): Fixed `product-provide' declare style. 2001-09-14 Yuuichi Teranishi * wl.el (wl): Changed order of calling `elmo-init' and `elmo-folder-init'. 2001-09-13 Hiroya Murata * wl-mime.el (wl-summary-burst): Extract message when content-type of root entity is not only `multipart' but also `message/rfc822'. (wl-summary-burst-subr): Ditto. 2001-09-13 Yuuichi Teranishi * wl-vars.el (toplevel): Require 'custom. (wl-trash-folder): Added to `wl-setting' group. * wl-addrmgr.el (wl-addrmgr-goto-top): Fixed problem when no entry exists. (wl-addrmgr-draw): Insert empty line when no entry exists. * wl-mule.el (wl-message-wheel-up): Fixed. (wl-message-wheel-down): Ditto. 2001-09-12 Hiroya Murata * wl-draft.el (wl-draft-config-exec-sub): Fixed problem when config is an anonymous lambda expression. 2001-09-11 Katsumi Yamaoka * wl-vars.el (wl-biff-state-indicator-on): Use `*iso-2022-jp*' when Mule 2 is running. 2001-09-11 Yuuichi Teranishi * wl-e21.el (wl-highlight-folder-current-line): Fixed regexp. 2001-09-10 Yuuichi Teranishi * wl-draft.el (wl-draft-std11-parse-addresses): Ignore trailing spaces (Adviced by NAKAJIMA Mikio ). * wl-address.el (wl-address-specials-regexp): Eliminated. (wl-address-quote-specials): Rewrite. 2001-09-05 Katsumi Yamaoka * wl-xmas.el (wl-highlight-folder-current-line): Use Perl style shy-groups for regexp. * wl-e21.el (wl-highlight-folder-current-line): Use Posix style character classes and Perl style shy-groups for regexp. (wl-highlight-plugged-current-line): Use Posix style character classes for regexp. (wl-e21-highlight-folder-by-numbers): Ditto. (wl-e21-display-image-p): Use `display-images-p' instead of `display-graphic-p'. (display-images-p): Make an alias to `display-graphic-p' if it is not available. It is for Emacs version prior to 21.0.105. * wl-demo.el (wl-demo): Use `display-images-p' instead of `display-graphic-p'. (wl-demo-image-type-alist): Ditto. (display-images-p): Make an alias to `display-graphic-p' if it is not available. It is for Emacs version prior to 21.0.105. 2001-09-04 TAKAHASHI Kaoru * wl-version.el (wl-generate-user-agent-string-1): Remove tm support. (wl-generate-user-agent-string): Ditto. * wl-version.el (wl-version): Update docsting. (wl-version-status): Ditto. 2001-09-03 TAKAHASHI Kaoru * wl-e21.el (make-mode-line-mouse-map): Import from Emacs 21.0.105. For Emacs 21.0.104 or earlier. 2001-09-03 Takuo KITAME * wl-e21.el (wl-plugged-init-icons): Use `make-mode-line-mouse-map' instead of `make-mode-line-mouse2-map'. (wl-biff-init-icons): Ditto. 2001-08-31 Yuuichi Teranishi * wl-highlight.el (wl-highlight-summary-current-line): Fixed highlighting refile/copy destination. * wl-acap.el (wl-acap-init): Decode string by wl-acap-coding-system. (wl-acap-store): Encode string by wl-acap-coding-system. 2001-08-30 Yuuichi Teranishi * wl-acap.el (toplevel): Check and require 'un-define before 'xemacs-ucs; Added checking for UTF-2000. 2001-08-29 Yuuichi Teranishi * wl-acap.el (toplevel): Require 'un-define before 'wl; Don't enclose with `eval-and-compile'. * wl.el (wl): Call `elmo-init' and `wl-folder-init' unless wl-init is non-nil. * wl-draft.el (wl-draft): Ditto. * wl-folder.el (wl-folder): Don't call `wl-folder-init' here. * wl-acap.el (toplevel): Require 'wl. (wl-acap-store): Call `elmo-init'. * wl.el (wl): Changed position of `wl-check-environment'. (toplevel): Added autoload setting for wl-acap. * wl-vars.el (wl-setting): New custom group. (wl-from): Added wl-setting group. (wl-user-mail-address-list): Ditto. (wl-organization): Ditto. (wl-subscribed-mailing-list): Ditto. (wl-envelope-from): Ditto. (wl-smtp-posting-user): Ditto. (wl-smtp-posting-server): Ditto. (wl-smtp-posting-port): Ditto. (wl-smtp-authenticate-type): Ditto. (wl-pop-before-smtp-user): Ditto. (wl-pop-before-smtp-server): Ditto. (wl-pop-before-smtp-port): Ditto. (wl-pop-before-smtp-authenticate-type): Ditto. (wl-nntp-posting-server): Ditto. (wl-nntp-posting-user): Ditto. (wl-nntp-posting-port): Ditto. (wl-fetch-confirm-threshold): Ditto. (wl-prefetch-threshold): Ditto. (wl-thread-insert-opened): Ditto. (wl-ldap-server): Ditto. (wl-ldap-port): Ditto. (wl-ldap-base): Ditto. (wl-ldap-objectclass): Ditto. (wl-use-ldap): Ditto. (wl-draft-config-alist): Ditto. (wl-draft-config-matchone): Ditto. (wl-template-alist): Ditto. (wl-message-sort-field-list): Ditto. (wl-message-ignored-field-list): Ditto. (wl-message-visible-field-list): Ditto. (wl-interactive-send): Ditto. (wl-summary-move-order): Ditto. (wl-auto-select-first): Ditto. (wl-auto-select-next): Ditto. (wl-interactive-save-folders): Ditto. * wl-folder.el (wl-folder): Moved position of `wl-folder-init'; Initialization codes are moved from wl-local-folder-init. (wl-local-folder-init): Follow the change above. (wl-folder-init): Call `wl-acap-init' when `wl-use-acap' is non-nil. * wl-acap.el: New file. * Version number is increased to 2.7.3. 2001-08-21 Kenichi OKADA * wl-addrmgr.el (wl-addrmgr-apply-exec): Fix for already-list. 2001-08-21 Kenichi OKADA * wl-addrmgr.el (wl-addrmgr-draw): Fix for already-list. (wl-addrmgr-address-entry-list): Ditto. 2001-08-21 Yuuichi Teranishi * wl-e21.el (wl-draft-mode-map): Removed binding for `wl-draft-insert-x-face-field'. * wl-mule.el (wl-draft-mode-map): Ditto. * wl-xmas.el (wl-draft-mode-map): Ditto. * wl-vars.el (wl-cs-noconv): Ignore nemacs. (wl-cs-autoconv): Ditto. (wl-cs-local): Ditto. (wl-use-scoring): Ditto. (wl-mime-charset): Ditto. (wl-folder-check-async): Ditto. * wl.el (toplevel): Ignore nemacs and tm. (wl-exit): Ditto. * wl-summary.el (wl-summary-setup-mouse): Ignore nemacs. (wl-summary-mode-map): Added binding for `wl-addrmgr'. (wl-summary-edit-addresses-subr): Use wl-address-add-or-change instead of wl-address-petname-add-or-change. (wl-summary-edit-addresses-subr): Use wl-address-delete instead of wl-address-petname-delete. * wl-util.el (wl-as-coding-system): Ignore nemacs. * wl-mime.el (wl-draft-preview-message): Kill raw preview buffer if error occured. * wl-message.el (require): Remove tm support. * wl-highlight.el (defin-hilit, defun-hilit2): Eliminated. * wl-folder.el (wl-folder-setup-mouse): Ignore nemacs. (wl-folder-jump-to-current-entity): Ditto. (wl-folder-mode-map): Added binding for `wl-addrmgr'. * wl-e21.el (wl-draft-key-setup): Replaced binding (C-cC-a)for `wl-draft-insert-x-face-field' to `wl-addrmgr'. Changed binding for `wl-draft-insert-x-face-field' to C-cC-x. * wl-mule.el (wl-draft-key-setup): Ditto. * wl-xmas.el (wl-draft-key-setup): Ditto. * wl-draft.el (toplevel): Added autoload setting for wl-addrmgr. (wl-draft-std11-parse-addresses): New function. (wl-draft-parse-mailbox-list): Use it. (wl-draft): Ignore nemacs. (wl-draft-reedit): Ditto. * wl-addrmgr.el: New file. (Original is wl-rcpt.el written by "Kitamoto Tsuyoshi ". Thanks Kitamoto-san.) * wl-address.el (wl-address-make-address-list): Modified parsing process. (wl-address-delete): Renamed from `wl-address-petname-delete'; Modify wl-address-list too. (wl-address-add-or-change): Renamed from `wl-address-petname-add-or-change'; Rewote for wl-addrmgr. 2001-08-15 YAMASHITA Junji * wl-highlight.el (wl-highlight-summary-current-line): Work with transient-mark-mode 2001-08-15 Yuuichi Teranishi * Version number is increased to 2.7.2. * wl.el (wl-plugged-dop-queue-info): Use elmo-dop-queue-method-name instead of elmo-dop-queue-method. 2001-08-06 SAITO Atsunori * wl-vars.el (wl-ldap-objectclass): New user option. * wl-address.el (wl-ldap-make-filter): Use it. 2001-08-03 Yuuichi Teranishi * wl-fldmgr.el (wl-fldmgr-rename): Fixed second argument. 2001-08-02 Yuuichi Teranishi * wl-folder.el (wl-folder): redisplay after folder insertion. * wl-demo.el (wl-demo): Don't delete toolbar on emacs-21. * wl-summary.el (wl-summary-sync-update): Change status mark only when new-msgdb exists. (Advised by Akihiro MOTOKI .) 2001-07-23 Yuuichi Teranishi * wl-summary.el (wl-summary-open-folder): New function. (wl-summary-goto-folder-subr): Use it. (wl-summary-mark-as-important): Fix; Encache only when no cache exists. 2001-07-17 Yuuichi Teranishi * wl-draft.el (wl-draft-yank-from-mail-reply-buffer): Use with-current-buffer. 2001-07-14 Hiroya Murata * wl-score.el (wl-score-insert-help): Check `wl-message-buffer' before call `get-buffer'. Fixed parenthesis. (wl-score-get-header-entry): Clear message and help window when keyboard quit. (wl-score-edit-insert-header): Ditto. 2001-07-14 Yuuichi Teranishi * wl-draft.el (wl-message-mail-p): Test resent-to: field. (Fix by Peter M~ller Neergaard ) (wl-default-draft-cite): Fix. * wl-score.el (wl-score-insert-help): Fixed parenthesis. (Pointed out by ABE Yasushi ) 2001-07-12 Yuuichi Teranishi * wl-message.el (wl-message-prev-page): Do same bahavior as summary when it is called in the message buffer. (wl-message-next-page): Ditto. 2001-07-09 Yuuichi Teranishi * wl-summary.el (wl-summary-forward): Use cache if it is not section cache. 2001-07-05 Yuuichi Teranishi * wl-vars.el: Changed file coding system to ISO-2022-JP. Removed redundant require of elmo-vars. (wl-biff-state-indicator-on): Changed default value for xemacs with non-mule environment. * wl-summary.el (wl-summary-exec-subr): Fixed problem when wl-message-buffer is nil; Hide progress bar after moving messages. 2001-07-04 Yuuichi Teranishi * wl-summary.el (wl-summary-exec-subr): Delete message buffer only when message at cursor point is deleted. 2001-07-02 Yuuichi Teranishi * wl-vars.el: Changed file coding system to euc-japan. Added -*-coding:-*- magic to the first line. * wl-summary.el (wl-summary-search-by-subject): Fixed bug; Search parent from the first message. * Version number is increased to 2.7.1. 2001-06-28 OHASHI Akira * wl-vars.el: Fix file coding system to ISO-2022-JP. 2001-06-27 Yuuichi Teranishi * wl-summary.el (wl-summary-exec-subr): Hide message buffer after refile/delete execution. * wl-vars.el (wl-summary-fix-timezone): Changed default value to nil; Fixed docstring. 2001-06-26 Yuuichi Teranishi * wl-summary.el (wl-summary-sync-update): If sync-result is non-nil, do update process; Don't update marks when update process is interrupted. 2001-06-25 Yuuichi Teranishi * wl-summary.el (wl-summary-reply): Fixed problem when wl-draft-use-frame is non-nil. (wl-summary-forward): Ditto. * wl-folder.el (wl-folder-sync-entity): Bind wl-summary-use-frame as nil. (wl-folder-mark-as-read-all-entity): Ditto. (wl-folder-prefetch-entity): Ditto. * wl.el (wl): Check environment before wl-init. * wl-summary.el (wl-summary-collect-unread): Eliminated. (wl-summary-mark-as-read-all): Use elmo-folder-list-unreads instead of wl-summary-collect-unread. (wl-summary-reply): Split message window. 2001-06-21 Yuuichi Teranishi * wl-vars.el (wl): Set custom-manual link as "wl-ja" only if current language environment is japanese, * wl-folder.el (wl-folder-jump-to-current-entity): Call wl-folder-select-buffer when wl-summary-use-frame is non-nil. (wl-folder-goto-folder-subr): Ditto. * wl-draft.el (wl-draft-dispatch-message): Call `elmo-file-cache-get-path'. 2001-06-20 Yuuichi Teranishi * wl-summary.el (wl-summary-cursor-move): If return value of wl-summary-next-message is not number, don't jump. 2001-06-19 Yuuichi Teranishi * wl-summary.el (wl-summary-buffer-next-message-function): New variable. (wl-summary-next-message): Call wl-summary-buffer-next-message-function if it is bound. * wl-e21.el (wl-plugged-set-folder-icon): Don't propertize image string. * wl.el (wl-plugged-dop-queue-info): Fix to check stream-type. (wl-plugged-drawing): Ditto. 2001-06-18 Yuuichi Teranishi * wl-util.el (wl-biff-check-folder): Use own buffer for pop3 biff process. (wl-biff-check-folder-async): Enclose wl-biff-check-folder with unwind-protect. * wl.el (wl-init): Require mime-setup. (wl-check-environment): Don't require mime-setup. * wl-util.el (wl-biff-check-folder): Use elmo-folder-type-internal instead of elmo-folder-type. * wl-message.el (wl-message-buffer-prefetch-debug): Set default value as nil. 2001-06-15 Yuuichi Teranishi * Version number is increased to 2.7.0. * wl-version.el (wl-version): Changed codename. * wl-summary.el (wl-summary-delete-cache): Fixed. * wl-folder.el (wl-folder-guess-mailing-list-by-folder-name): Workaround for net folders. (According to the patch from ABE Yasushi ) * wl-vars.el (wl-folder-process-duplicates-alist): Changed default value to nil (According to the patch from Yoichi NAKAYAMA ). * wl-util.el (wl-biff-check-folder): Call elmo-folder-check instead of elmo-folder-close. 2001-06-06 Peter M~ller Neergaard * wl-summary.el (wl-summary-resend-bounced-mail): Modified regexp for postfix. 2001-06-13 Yuuichi Teranishi * wl-summary.el (wl-summary-resend-message): Fixed. * wl-draft.el (wl-draft-edit-string): Fetch From: field value and Call wl-draft with `from' argument if its address is included in `wl-user-mail-address-list'. (wl-draft): Added `from' argument. * wl.el (wl-exit): Delete current frame if wl-folder-use-frame is non-nil. (wl): Don't show demo if wl-demo is nil. * wl-summary.el (wl-summary-exit): Renamed wl-folder-use-frame to wl-summary-use-frame. * wl-vars.el (wl-summary-use-frame): New user option. (wl-folder-use-frame): Changed docstring. * wl-folder.el (wl-folder): Make new frame if wl-folder-use-frame is non-nil. (wl-folder-select-buffer): Renamed wl-folder-use-frame to wl-summary-use-frame. * wl-vars.el (wl-folder-use-frame): New user option. * wl-summary.el (wl-summary-exit): Back to folder frame if wl-folder-use-frame is non-nil. (wl-summary-redisplay-internal): Ignore cache if current folder is draft folder, (wl-summary-redisplay-no-mime): Ditto. (wl-summary-redisplay-all-header): Ditto. * wl-folder.el (wl-folder-select-buffer): Switch to other frame if wl-folder-use-frame is non-nil. 2001-06-06 Yuuichi Teranishi * wl-summary.el (wl-summary-sync-update): Bind elmo-folder-update-threshold. (wl-summary-mark-as-important): Enclosed server mark processing with `save-match-data'. * wl-mime.el (wl-mime-setup): Set mime-setup-signature-key-alist only when it is already defined. 2001-05-24 Masahiro MURATA * wl-expire.el (wl-expire-archive-get-folder): Fixed problem that name of folder exclude localdir is wrong. * wl-folder.el (wl-folder-sync-entity): Set `wl-summary-always-sticky-folder-list' as nil. (wl-folder-mark-as-read-all-entity): Ditto. (wl-folder-prefetch-entity): Ditto. 2001-05-23 Kenichi OKADA * wl-draft.el (wl-draft): use `wl-summary-write-current-folder' instead of `wl-summary-write-current-newsgroup'. 2001-05-19 Masahiro MURATA * wl-summary.el (wl-summary-auto-select-msg-p): New function. (wl-summary-goto-folder-subr): If `wl-auto-select-first' is non-nil and selected message is important, do not display. 2001-05-16 Kenichi OKADA * wl.el (wl): Omit `wl-check-environment' if wl-init is nil. 2001-05-10 Yuuichi Teranishi * wl.el (wl-plugged-dop-queue-info): Fixed for new queue structure. * wl-summary.el (wl-summary-mark-as-important): Set message number using wl-summary-message-number. 2001-05-10 Hiroya Murata * wl-summary.el (wl-summary-exec-subr): Fixed problem when destination folder is 'null. 2001-05-09 Kenichi OKADA * wl-folder.el (wl-folder-guess-mailing-list-by-refile-rule-subr): New function. (wl-folder-guess-mailing-list-by-folder-name-subr): New function. (wl-folder-guess-mailing-list-by-refile-rule): Fix for multi folder. (wl-folder-guess-mailing-list-by-folder-name): Ditto. 2001-05-08 Yuuichi Teranishi * wl-mime.el (wl-mime-setup): Added setting for `mime-setup-signature-key-alist' to avoid overriding key bind for `wl-draft-send'. * wl-e21.el (wl-draft-overload-functions): Don't override key binding for `wl-draft-send'. * wl-mule.el (wl-draft-overload-functions): Ditto. * wl-xmas.el (wl-draft-overload-functions): Ditto. * wl-draft.el (wl-draft-send): Ditto. * wl-message.el (wl-message-display-internal): Fixed typo (elmo-fetch-threshold->elmo-message-fetch-threshold). (Patch is provided by ). 2001-05-09 Kenichi OKADA * wl-folder.el (wl-folder-guess-mailing-list-by-refile-rule): Fix. 2001-05-08 Kenichi OKADA * wl.el (wl): Fix for wl-demo. 2001-05-08 Kenichi OKADA * wl-summary.el (wl-summary-supersedes-message): Use 'message-buf' 2001-05-08 Kenichi OKADA * wl-folder.el (wl-folder-prefetch-entity): Use `wl-folder-get-elmo-folder'. (wl-folder-count-incorporates): Do not use `wl-folder-get-elmo-folder'. 2001-05-08 Kenichi OKADA * wl-xmas.el (wl-plugged-set-folder-icon): Use `elmo-folder-type' instead of `elmo-folder-get-type'. 2001-05-01 TAKAHASHI Kaoru * wl-summary.el (wl-summary-write-current-folder): Set cursor position on Subject: field. (Advised by Mito ) 2001-04-27 Hiroya Murata * wl-folder.el (wl-folder-prefetch-entity): Use `wl-folder-get-elmo-folder'. 2001-04-26 Yuuichi Teranishi * wl-vars.el (wl-folder-process-duplicates-alist): New user option. * wl-summary.el (wl-summary-buffer-set-folder): Set up `process-duplicates' slot. * wl-highlight.el (wl-highlight-message): Don't highlight as signature if detection failed. 2001-04-25 TAKAHASHI Kaoru * wl-version.el (wl-version-status): Set to "alpha". 2001-04-23 Yuuichi Teranishi * wl-summary.el (wl-summary-set-message-buffer-or-redisplay): Check wl-message-buffer lives before set-buffer. 2001-04-22 Masahiro MURATA * wl-expire.el (wl-summary-expire): Fixed problem that do not expire called in folder mode. * wl-var.el (wl-summary-exit-pre-hook): New variable. * wl-summary.el (wl-summary-exit-pre-hook): Run `wl-summary-exit-pre-hook' before exit summary mode. 2001-04-22 TAKAHASHI Kaoru * wl-version.el (wl-version-status): New variable. (wl-version-status-alist): Removed. (wl-version-status): Rule included. 2001-04-19 Yuuichi Teranishi * wl-vars.el (wl-folder-mime-charset-alist): Setup default value for @sponichi. * wl-draft.el (wl-draft-insert-current-message): Fixed problem when `mail-reply-buffer' is buffer-local variable. (Reported by ). 2001-04-17 Yuuichi Teranishi * wl-vars.el (toplevel): Require 'elmo-util. 2001-04-16 Yuuichi Teranishi * wl-summary.el (wl-summary-message-regexp): Fixed number regexp. (All other related portions are changed) * wl.el (wl-plugged-change): Use '<' instead of '<='. * wl-folder.el (wl-folder-check-one-entity): Fixed last change again. 2001-04-14 Hiroya Murata * wl-folder.el (wl-folder-check-one-entity): Fixed last change. 2001-04-13 Yuuichi Teranishi * wl-summary.el (wl-summary-target-mark-reply-with-citation): Fixed. Delete other windows to avoid an error. Use `point-marker' instead of `point' to remember the start point of body. * wl.el (wl-plugged-toggle-all): Fixed argument for `elmo-set-plugged'. * wl-folder.el (wl-folder-check-one-entity): Adjust unread message number not to exceed all message number. 2001-04-12 Yoichi NAKAYAMA * wl-e21.el (wl-biff-init-icons): Don't use `call-interactively' to call the command `wl-biff-check-folders' in `mode-line-mouse2-map'. 2001-04-09 Yuuichi Teranishi * wl-summary.el (wl-summary-sync-force-update): Added argument no-check. (wl-summary-sync-update): Ditto. (wl-summary-goto-folder-subr): Call wl-summary-sync-force-update with `no-check'. * wl-message.el (wl-message-buffer-prefetch-timer): New variable. (wl-message-buffer-prefetch-next): Don't run timer if timer is already running. 2001-04-07 Masahiro MURATA * wl-expire.el (wl-expire-archive-get-folder): Added argument `dst-folder-arg'. (wl-expire-archive-number1): Diito. (wl-expire-archive-number2): Diito. (wl-expire-archive-Date): Diito. (wl-archive-number1): Diito. (wl-archive-number2): Diito. (wl-archive-date): Diito. (wl-archive-folder-p): New function. (wl-summary-expire): Support of expand folder name at wl-expire-alist. * wl-util.el (wl-expand-newtext): Renamed from `wl-refile-expand-newtext'. 2001-04-05 Hiroya Murata * wl-summary.el (wl-summary-prefetch-msg): Fiexd. Call `elmo-msgdb-overview-get-entity' with `msgdb' instead of `(elmo-msgdb-get-overview msgdb)'. (wl-summary-prefetch): Bind match data before call `wl-summay-prefetch-msg'. (wl-summary-goto-folder-subr): Call `wl-summary-toggle-disp-msg' with 'off if `wl-summary-buffer-disp-msg' is non-nil. Fixed problem that couldn't show only one new or unread message when enter folder. (wl-summary-reply): Don't call `split-window-vertically' and other window. 2001-04-03 Yuuichi Teranishi * wl-expire.el (wl-expire-refile): Fixed. 2001-04-02 Yuuichi Teranishi * wl-vars.el (wl-biff-unnotify-hook): New variable. * wl-util.el (wl-biff-notify): Run `wl-biff-unnotify-hook' when biff notification is removed. * wl.el (wl): Changed position of `elmo-init'. * wl-draft.el (wl-default-draft-cite): Use date field on the citation buffer. * wl-vars.el (wl-shimbun-folder-icon): New variable. * wl-xmas.el (wl-folder-internal-icon-list): Added `wl-folder-shimbun-image'. * wl-e21.el (wl-folder-internal-icon-list): Added `wl-folder-shimbun-image'. 2001-03-31 Yuuichi Teranishi * wl.el (wl-init): Eliminated argument. (wl): Rewrite. * wl-summary.el (wl-summary-prefetch-msg): Use `elmo-message-encache'. (wl-summary-sync-update): Use Use `elmo-folder-msgdb' instead of `elmo-folder-msgdb-internal'. (wl-summary-sync-update): Ditto. (wl-summary-flush-pending-append-operations): Eliminated. (wl-summary-delete-all-msgs): Set msgdb instead of folder. (wl-summary-goto-folder-subr): Set load-msgdb argument of `elmo-folder-open'. * wl-mime.el (wl-summary-burst): Fixed. * wl-folder.el (wl-folder-info-save): Check data type. * wl-expire.el (wl-expire-delete): Set msgdb instead of folder. (wl-expire-refile-with-copy-reserve-msg): Use `elmo-folder-msgdb' instead of `elmo-folder-msgdb-internal'. (wl-expire-hide): Ditto. * wl-draft.el (wl-draft): Removed argument for `wl-init'. 2001-03-20 TAKAHASHI Kaoru * wl-folder.el (wl-folder-write-current-folder): Support petname. 2001-03-11 Kenichi OKADA * wl-draft.el (wl-draft-do-fcc): Fix for `wl-draft-use-cache' 2001-03-11 TAKAHASHI Kaoru * wl-folder.el (wl-folder-guess-mailing-list-by-folder-name): Fixed `match-beginning' argument mismatch. 2001-03-05 Katsumi Yamaoka * wl-demo.el (wl-demo): Reset `tab-width' and `tab-stop-list' to the default value. 2001-03-01 Yuuichi Teranishi * wl-folder.el (wl-make-plugged-alist): Use `wl-nntp-posting-port' instead of `elmo-nntp-default-port'. * wl-vars.el: Fixed some doc strings. 2001-02-28 Yuuichi Teranishi * wl-summary.el (wl-summary-prefetch-msg): Use `elmo-msgdb-overview-get-entity' instead of `assoc'. * wl-vars.el: Define *-func as obsolete variable using `elmo-define-obsolete-variable'. * wl-message.el (wl-message-buffer-prefetch-threshold): Eliminated. (wl-message-buffer-prefetch): Use `elmo-message-fetch-threshold' instead of `wl-message-buffer-prefetch-threshold'. * wl-summary.el (wl-summary-buffer-message-redisplay-func): Removed. * wl-vars.el (wl-cache-prefetch-get-next-func): Ditto. * wl-draft.el (wl-caesar-region-func): Ditto. * wl-summary.el (wl-summary-exec-subr): Fixed `copy'; Keep unread status in elmo-folder-move-messages. (wl-summary-sync-update): Set `wl-summary-buffer-msgdb'. 2001-02-27 TAKAHASHI Kaoru * wl-summary.el (wl-summary-buffer-exit-function): Renamed from `wl-summary-buffer-exit-func' (wl-summary-buffer-message-redisplay-function): Renamed from `wl-summary-buffer-message-redisplay-func' (wl-summary-buffer-next-folder-function): Renamed from `wl-summary-buffer-next-folder-func'. (wl-summary-buffer-prev-folder-function): Renamed from `wl-summary-buffer-prev-folder-func'. (wl-summary-get-petname-function): Renamed from `wl-summary-get-petname-func'. * wl-score.el (wl-score-edit-exit-function): Renamed from `wl-score-edit-exit-func'. * wl-message.el (wl-message-buffer-prefetch-get-next-function): Renamed from `wl-message-buffer-prefetch-get-next-function'. * wl-util.el (wl-load-profile-function): Renamed from `wl-load-profile-func'. * wl-folder.el (wl-folder-completion-function): Renamed from `wl-folder-completion-func'. (wl-folder-init-function): Renamed from `wl-folder-init-func'. * wl-vars.el (wl-expire-archive-get-folder-function): Renamed from `wl-expire-archive-get-folder-func'. (wl-draft-send-function): Renamed from `wl-draft-send-func'. (wl-draft-send-mail-function): Renamed from `wl-draft-send-mail-func'. (wl-draft-send-news-function): Renamed from `wl-draft-send-news-func'. (wl-fldmgr-sort-function): Renamed from `wl-fldmgr-sort-func'. (wl-generate-mailer-string-function): Renamed from `wl-generate-mailer-string-func'. (wl-highlight-signature-search-function): Renamed from `wl-highlight-signature-search-func'. (wl-highlight-x-face-function): Renamed from `wl-highlight-x-face-func' (wl-print-buffer-function): Renamed from `wl-print-buffer-func'. (wl-ps-print-buffer-function): Renamed from `wl-ps-print-buffer-func' (wl-summary-from-function): Renamed from `wl-summary-from-func'. (wl-summary-subject-function): Renamed from `wl-summary-subject-func'. (wl-summary-subject-filter-function): Renamed from `wl-summary-subject-filter-func'. * wl-draft.el (wl-draft-queue-flush-send-function): Renamed from `wl-draft-queue-flush-send-func' (wl-draft-cite-function): Renamed from `wl-draft-cite-func' * wl-address.el (wl-address-init-function): Renamed from `wl-address-init-func'. 2001-02-27 Yuuichi Teranishi * wl-draft.el (wl-draft-queue-flush): Don't call `elmo-dop-unlock-message'. * wl-draft.el (wl-draft-queue-append): Don't call `elmo-dop-lock-message'. * wl-summary.el (wl-summary-buffer-msgdb): Revival (for compatibility). (wl-summary-buffer-folder-name): Ditto. (wl-summary-message-regexp): Added '-' (all other related portions are changed). (wl-summary-goto-folder-subr): Set wl-summary-buffer-msgdb and wl-summary-buffer-folder-name. 2001-02-26 "A. SAGATA" * wl-folder.el (wl-folder-check-one-entity): Fixed problem that the number of mails in the folder buffer is not updated by wl-biff. 2000-02-26 Kenichi OKADA * wl-summary.el (wl-summary-default-subject-filter): Fix for `Re>'. * wl-vars.el (wl-summary-search-parent-by-subject-regexp): Ditto. 2001-03-01 Yuuichi Teranishi * wl-summary.el (wl-summary-next-message): Return next message number when wl-summary-move-order is nil. 2001-02-28 Akihiro MOTOKI * wl-summary.el (wl-summary-move-spec-plugged-alist): Renamed from `wl-summary-move-spec-alist'. (wl-summary-move-spec-unplugged-alist): New variable (Move spec for unplugged status). (wl-summary-next-message): Use `wl-summary-move-spec-plugged-alist' if plugged, `wl-summary-move-spec-unplugged-alist' is unplugged. 2001-03-01 OKAZAKI Tetsurou * wl-e21.el (wl-draft-overload-menubar): "FCC" -> "Fcc". * wl-mule.el (wl-draft-overload-menubar): Ditto. 2001-02-28 OKAZAKI Tetsurou * wl-mime.el (wl-draft-preview-message): Use `function' instead of simple quotation to quote the anonymous function. * tm-wl.el (wl-draft-preview-message): Ditto. 2001-02-25 OKAZAKI Tetsurou * wl-highlight.el (wl-highlight-summary-displaying): Optimize; Eliminate redundant `save-excursion'. (wl-highlight-summary-current-line): Ditto. * wl-highlight.el (wl-highlight-summary-current-line): Avoid accessing match data when `looking-at' failed. * wl-draft.el (wl-draft-delete): Use `match-string' instead of `elmo-match-string' where users don't care about the speed. (wl-draft-save): Ditto. 2001-02-24 Yuuichi Teranishi * wl-util.el (wl-regexp-opt): New function. * wl-summary.el (wl-summary-delete-messages-on-buffer): Delete number from `wl-summary-buffer-number-list'. (wl-summary-goto-folder-subr): Load msgdb before resuming summary view; Call `wl-summary-rescan' if `wl-summary-cache-use' is nil. (wl-summary-move-spec-alist): Changed default setting. 2001-02-23 Yoichi NAKAYAMA * wl-vars.el (wl-biff-notify-hook): New hook. * wl-util.el (wl-biff-notify): Run `wl-biff-notify-hook' at the arrival of new mail. (Based on the patch from Hironori Fukuchi and advice by Yuuichi Teranishi ) 2001-02-23 Yuuichi Teranishi * wl-summary.el (wl-summary-default-get-next-msg): Fix (num => msg). 2001-02-22 Yuuichi Teranishi * wl-summary.el (wl-summary-default-get-next-msg): Fix. * Version number is increased to 2.5.8. * wl-thread.el (toplevel): require 'cl. (wl-thread-resume-entity): Call wl-thread-make-number-list. (wl-thread-make-number-list): New function. (wl-thread-entity-make-number-list-from-children): Ditto. (wl-thread-entity-insert-as-top): Update wl-summary-buffer-number-list. (wl-thread-entity-insert-as-children): Likewise. (wl-thread-delete-message): Likewise. (wl-meaning-of-mark): Eliminated. (wl-thread-next-failure-mark-p): Ditto. (wl-thread-entity-get-mark): Ditto. (wl-thread-meaning-alist-get-result): Ditto. (wl-thread-entity-check-prev-mark): Ditto. (wl-thread-entity-check-next-mark): Ditto. (wl-thread-entity-check-prev-mark-from-older-brother): Ditto. (wl-thread-entity-get-prev-marked-entity): Ditto. (wl-thread-get-prev-unread): Ditto. (wl-thread-jump-to-prev-unread): Ditto. (wl-thread-get-next-unread): Ditto. (wl-thread-jump-to-next-unread): Ditto. (wl-thread-entity-check-next-mark-from-younger-brother): Ditto. (wl-thread-entity-get-next-marked-entity): Ditto. * wl-summary.el (wl-summary-buffer-number-list): New bufer-local variable. (wl-summary-switch-to-clone-buffer): Clone `wl-summary-buffer-number-list'. (wl-summary-goto-folder-subr): Use `wl-summary-next-message'. (wl-summary-cursor-move-regex): Eliminated. (wl-summary-cursor-up): Rewrite. (wl-summary-cursor-down): Ditto. (wl-summary-mode-spec-alist): New variable. (wl-summary-next-message): New inline function. (wl-summary-cursor-move): New function. (wl-summary-default-get-next-msg): Rewrite. (wl-summary-sync-all-init): Setup `wl-summary-number-list'. (wl-summary-rescan): Ditto. (wl-summary-sync-all-init): Ditto. (wl-summary-goto-folder-subr): Call `wl-summary-make-number-list' if summary is not thread view. (wl-summary-sync-update): Ditto. (wl-summary-rescan): Ditto. (wl-summary-make-number-list): New function. * wl-draft.el: "FCC" -> "Fcc". 2001-02-21 Yuuichi Teranishi * wl-highlight.el (wl-highlight-summary-window): Call `set-buffer-modified-p'. * wl.el (wl-init): Don't call `elmo-crosspost-message-alist-load'. (wl): Call `elmo-init' and fix. * wl-draft.el, wl-folder.el, wl-summary.el, wl-util.el: Use new variables. * wl-folder.el (wl-folder): Call `sit-for' before `wl-folder-init'. 2001-02-20 Yuuichi Teranishi * wl-vars.el (wl-biff-notify-hook): Set default value as '(beep). 2001-02-20 Katsumi Yamaoka * wl-demo.el (wl-demo-image-type-alist): Use ' instead of `. 2001-02-20 Katsumi Yamaoka * wl-e21.el (wl-e21-setup-draft-toolbar): Don't refer to `wl-use-toolbar' nor `display-graphic-p'. (wl-e21-setup-message-toolbar): Ditto. (wl-e21-setup-summary-toolbar): Ditto. (wl-e21-setup-folder-toolbar): Ditto. (wl-biff-init-icons): Rewrite using `wl-e21-display-image-p'. (wl-plugged-init-icons): Ditto. (wl-folder-init-icons): Use `wl-e21-display-image-p' instead of `display-graphic-p'. (wl-plugged-set-folder-icon): Ditto. (wl-highlight-plugged-current-line): Ditto. (wl-highlight-folder-current-line): Ditto. (wl-e21-highlight-folder-group-line): Ditto. (wl-e21-setup-toolbar): Ditto. (wl-e21-display-image-p): New macro. * wl-demo.el (wl-demo): Simplified. (wl-demo-image-type-alist): Use `image-type-available-p' for checking whether the image type `xbm' is available. 2000-02-20 Yuuichi Teranishi * wl-summary.el (wl-summary-sync): Rename 'all-shown' to `all-visible'. (wl-summary-input-range): Ditto. 2001-02-20 Yuuichi Teranishi * wl-summary.el (wl-summary-edit-addresses): Use `wl-summary-get-original-buffer' (wl-summary-mark-as-unread): Don't call `wl-summary-set-crosspost'. (wl-summary-jump-to-msg-by-message-id-via-nntp): Use `elmo-nntp-parse-newsgroup' instead of `wl-parse-newsgroups'. (wl-summary-get-newsgroups): Eliminated. (wl-summary-set-crosspost): Ditto. (wl-summary-is-crosspost-folder): Ditto. (wl-crosspost-alist-load): Ditto. (wl-crosspost-alist-save): Ditto. * wl-folder.el (wl-folder-create-newsgroups-hashtb): Call `elmo-setup-subscribed-newsgroups' instead of `elmo-nntp-make-groups-hashtb'. (wl-folder-suspend): Call `elmo-crosspost-message-alist-save' instead of `wl-crosspost-alist-save'. * wl-mime.el (wl-summary-burst): Use `elmo-folder-writable-p' instead of `elmo-folder-message-appendable-p'. (wl-mime-header-presentation-method): Eliminated. * wl-message.el (wl-message-prev-page): Don't pass -1 to `recenter'. (Error occurs in emacs21). * wl-draft.el (wl-draft-queue-flush): Fix (fetch message to the current buffer). * wl.el (wl-save-status): Call `elmo-crosspost-message-alist-save' instead of `wl-crosspost-alist-save'. (wl-init): `elmo-crosspost-message-alist-load' instead of `wl-crosspost-alist-load' * wl-util.el (wl-parse): Eliminated (Renamed to `elmo-parse'). (wl-parse-newsgroups): Likewise. (wl-biff-notify): Run `wl-biff-notify-hook'. 2001-02-21 Yuuichi Teranishi * wl-vars.el (wl-summary-lazy-highlight): New variable. * wl-summary.el (wl-summary-mode): Set up window-scroll-functions when `wl-summary-lazy-highlight' is non-nil. (wl-summary-goto-folder-subr): Highlight only when `wl-summary-lazy-highlight' is non-nil. * wl-highlight.el (wl-highlight-summary): Fixed docstring; Don't display progress and highlight temp-mark when `wl-summary-lazy-highlight' is non-nil. (wl-highlight-summary-window): New function. (Based on the patch from Akihiro MOTOKI ) 2000-02-20 Kenichi OKADA * wl-summary.el (wl-summary-sync): Change `all-visible' from `all-shown' (wl-summary-input-range): Ditto. 2001-02-20 Katsumi Yamaoka * wl-e21.el (wl-highlight-folder-current-line): Call `wl-folder-init-icons' when folder icons have not been initialized. * wl-vars.el (wl-demo-display-logo): Add `bitmap' to the selection. * wl-demo.el: Work also with BITMAP-MULE under Emacs 21. (wl-demo-image-type-alist): New macro. 2001-02-19 Katsumi Yamaoka * wl-e21.el (wl-biff-init-icons): Don't generate icons if the display does not support graphics. (wl-plugged-init-icons): Ditto. (wl-folder-init-icons): Ditto. * wl-demo.el (wl-demo): Chech closely whether the display supports graphics. 2001-02-09 Yuuichi Teranishi * wl-summary.el (wl-summary-get-original-buffer): New function. (wl-summary-set-crosspost): Use it. (wl-summary-target-mark-uudecode): Ditto. (wl-summary-reedit): Ditto. (wl-summary-resend-bounced-mail): Ditto. (wl-summary-update-crosspost): Eliminated (It may be incorporated into `elmo-folder-append-msgdb' method of elmo-nntp-folder class). * wl-message.el (wl-message-buffer-display): Added argumnet `unread'. (wl-message-display-internal): Ditto. 2001-02-07 Yuuichi Teranishi * wl-draft.el (wl-draft-parse-msg-id-list-string): Fix. 2001-02-06 Yuuichi Teranishi * wl-summary.el (wl-summary-save-view): Renamed from `wl-summary-save-status'. 2000-02-20 Kenichi OKADA * wl-summary.el (wl-summary-sync): Added `all-shown' 2000-02-20 Kenichi OKADA * wl-summary.el (wl-summary-input-range): Added `all-shown' 2000-02-19 Kenichi OKADA * wl-summary.el (wl-summary-sync-update3): Bind 'nohide as t if sync-all. 2001-02-19 OKAZAKI Tetsurou * wl-highlight.el (wl-highlight-summary-line-string): Use `zerop' instead of `= 0'. (wl-highlight-summary): Use `zerop' instead of `eq 0'. * wl-template.el (wl-template-next): Use `=' instead of `eq' for comparing numbers. (wl-template-prev): Use `zerop' instead of `eq 0'. * wl-draft.el (wl-draft-insert-current-message): Use `with-current-buffer' instead of `save-excursion'. Use `zerop' instead of `eq 0'. 2001-02-17 Kenichi OKADA * wl-draft.el (wl-draft-insert-ccs): New function. (wl-draft): Use `wl-draft-insert-ccs' for Bcc and FCC. * wl-vars.el (wl-draft-delete-myself-from-bcc-fcc): New variable. 2001-02-15 Yuuichi Teranishi * wl-summary.el (wl-cache-prefetch-message): Fixed last change. 2001-02-14 Yuuichi Teranishi * wl-expire.el (wl-expire-refile): Don't call elmo-msgdb-add-msgs-to-seen-list; Pass wl-expire-add-seen-list to elmo-folder-move-messages. (wl-expire-refile-with-copy-reserve-msg): Ditto. 2001-01-19 Yuuichi Teranishi * wl-message.el (wl-message-prev-page): Ignore errors while scroll-down. 2001-01-14 Yuuichi Teranishi * wl-mime.el: Use elmo-original-message-mode instead of mmelmo-original-mode. * wl-fldmgr.el: Use `wl-folder-get-elmo-folder' instead of `elmo-folder-get-spec'; (wl-fldmgr-add-completion-all-completions): Use `elmo-folder-list-subfolders' instead of `elmo-list-folders'. * wl-e21.el (wl-plugged-set-folder-icon): Use `elmo-folder-type' instead of `elmo-folder-get-type'. * wl-draft.el: Use `wl-folder-get-elmo-folder' instead of `elmo-folder-get-spec'; Use `elmo-folder-msgdb-path' instead of `elmo-msgdb-expand-path'; Use `elmo-folder-append-message' instead of `elmo-append-msg'; Use `elmo-folder-list-messages' instead of `elmo-list-folder'; Use `elmo-message-fetch' instead of `elmo-read-msg-with-cache' or `elmo-read-msg-no-cache'; Use `elmo-message-file-name' instead of `elmo-get-msg-filename'; Use `elmo-folder-delete-messages' instead of `elmo-delete-msgs'. (wl-default-draft-cite): Use `elmo-msgdb-overview-get-entity'. (wl-draft-dispatch-message): Use `elmo-file-cache-save' instead of `elmo-cache-save'; (wl-draft-reedit): Use `elmo-message-file-name'. * wl-expire.el: Use `elmo-folder-name-internal'; Use `elmo-folder-list-messages' instead of `elmo-list-folder'; Use macro `wl-summary-buffer-msgdb' instead of variable `wl-summary-buffer-msgdb'; Use `wl-folder-get-elmo-folder' instead of `elmo-folder-get-spec'; Use macro `wl-summary-buffer-folder-name' instead of variable `wl-summary-buffer-folder-name'. * wl-score.el: Likewise. * wl-message.el: Rewrite for new message buffer cache mechanism. (wl-message-buffer-cache-buffer-get): New macro. (wl-message-buffer-cache-folder-get): Ditto. (wl-message-buffer-cache-message-get): Ditto. (wl-message-buffer-cache-entry-make): Ditto. (wl-message-buffer-cache-hit): Ditto. (wl-message-buffer-cache-sort): New function. (wl-message-buffer-cache-add): Ditto. (wl-message-buffer-cache-delete): Ditto. (wl-message-buffer-cache-clean-up): Ditto. (wl-message-buffer-window): Rewrite. (wl-message-select-buffer): Renamed from `wl-select-buffer'. (wl-message-buffer-display): New function. (wl-message-display-internal): New function. 2001-01-12 Yuuichi Teranishi * wl-folder.el: Use `elmo-folder-name-internal'; Use `wl-folder-get-elmo-folder'; Use `elmo-folder-list-messages' instead of `elmo-list-folder'; Use `elmo-folder-get-primitive-list' instead of `elmo-folder-get-primitive-spec-list'; Use `elmo-folder-list-subfolders' instead of `elmo-list-folders'; Use `elmo-folder-msgdb-path' instead of `elmo-msgdb-expand-path'; Use `elmo-folder-create' instead of `elmo-create-folder'. (wl-folder-create-newsgroups-from-nntp-access2): Abolish. (wl-folder-get-elmo-folder): New macro. (wl-folder-elmo-folder-cache-get): Ditto. (wl-folder-elmo-folder-cache-put): Ditto. (wl-folder-suspend): Call `elmo-quit'. * wl.el: Use `elmo-folder-msgdb-path' instead of `elmo-msgdb-expand-path'; Use `elmo-folder-list-messages' instead of `elmo-list-folder'; Use `elmo-net-port-info' instead of `elmo-folder-portinfo'; Use `wl-folder-get-elmo-folder' instead of `elmo-folder-get-spec'. (toplevel): require 'cl. (wl-exit): Call `wl-message-buffer-cache-clean-up' and `elmo-quit'. * wl-summary.el: Rewrite to use new elmo interface. 2001-02-06 Yuuichi Teranishi * wl-mime.el (wl-draft-preview-message): Run `wl-draft-send-hook' before collecting recipients information; Bind `wl-draft-config-exec-flag' while running `wl-draft-send-hook'. * tm-wl.el (wl-draft-preview-message): Ditto. 2001-02-05 Yuuichi Teranishi * wl-mime.el (wl-draft-preview-message): Fixed problem that wrong recipients are displayed when forwarded message. 2001-02-01 Yuuichi Teranishi * Version number is increased to 2.5.7. 2001-01-29 Katsumi Yamaoka * wl-message.el (wl-message-next-page): Bind `window-pixel-scroll-increment' to nil while scrolling up. 2001-01-27 TAKAHASHI Kaoru * wl-vars.el (wl-save-hook): New hook. * wl.el (wl-save): Call `wl-save-hook'. 2001-01-27 TAKAHASHI Kaoru * wl-draft.el (wl-draft-reply-list-symbol): Remove FROM argument. Argument WITH-ARG instead of NO-ARG (negative mean). (wl-draft-reply): WITH-ARG instead of NO-ARG. * wl-summary.el (wl-summary-reply): Fixed `wl-draft-reply' call point. * wl-message.el (wl-message-follow-current-entity): Likewise. 2001-01-26 TAKAHASHI Kaoru * wl-draft.el (wl-draft-reply-list-symbol): Change argument order. FROM was optional argument. (wl-draft-reply): Fixed `wl-draft-reply-list-symbol' call point. 2001-01-23 TAKAHASHI Kaoru * Version number is increased to 2.5.6. 2001-01-23 TAKAHASHI Kaoru * wl-version.el (wl-version-show): Removed. (wl-version): Add `interactive'. 2001-01-22 YAMASHITA Junji * wl-summary.el (wl-summary-get-petname-func): New variable. (wl-summary-default-from): funcall `wl-summary-get-petname-func' instead of `wl-address-get-petname-1'. (wl-summary-simple-from): Ditto. * wl-address.el (wl-address-get-petname-1): Define as function. 2001-01-22 Yuuichi Teranishi * wl-draft.el (wl-draft-reply): Fixed problem when there's no subject field in the original message. (Pointed out by "HIROSE, Masaaki" ) 2001-01-19 Akihiro MOTOKI * wl-expire.el (wl-expire-hide): Call `wl-expire-delete-reserve-marked-msgs-from-list'. 2001-01-19 Yuuichi Teranishi * wl-draft.el (wl-draft-reply): Use `mime-find-field-decoder' to find decoder for To, Cc, and Subject. 2001-01-30 Yuuichi Teranishi * wl-summary.el (wl-cache-prefetch-next): Revert the logic for checking `elmo-use-buffer-cache'. (wl-summary-mark-as-important): Fixed typo in comment. 2001-01-22 Yuuichi Teranishi * wl-draft.el (wl-draft-reply): Fixed problem when there's no subject field in the original message. (Pointed out by "HIROSE, Masaaki" ) 2001-01-19 Akihiro MOTOKI * wl-expire.el (wl-expire-hide): Call `wl-expire-delete-reserve-marked-msgs-from-list'. 2001-01-19 Yuuichi Teranishi * wl-draft.el (wl-draft-reply): Use `mime-find-field-decoder' to find decoder for To, Cc, and Subject. 2001-01-18 Yuuichi Teranishi * Version number is increased to 2.5.5. * wl-address.el (wl-address-specials-regexp): New constant. (wl-address-quote-specials): Use it. 2001-01-17 Yuuichi Teranishi * wl-summary.el (wl-summary-rescan): Call `wl-summary-buffer-number-column-detect'. (Advised by Akihiro MOTOKI ) * wl-message.el (wl-message-mode-map): Define. (wl-message-decode): Use it as local-map. 2001-01-16 Yuuichi Teranishi * wl-score.el (wl-score-guess-like-gnus): Abolished. (wl-score-get-score-files): Don't use `wl-score-guess-like-gnus'. 2001-01-12 Yuuichi Teranishi * wl-xmas.el (wl-read-event-char): Move from wl-util.el. * wl-mule.el (wl-read-event-char): Ditto. * wl-e21.el (wl-read-event-char): Ditto. * wl-nemacs.el (wl-read-event-char): Ditto. (read-event): Removed. * wl-util.el (toplevel): Removed dummy definition of `read-event'. (wl-read-event-char, wl-xmas-read-event-char): Removed. 2001-01-10 Katsumi Yamaoka * wl-nemacs.el (elmo-archive-call-process): Moved to elmo-archive.el. 2001-01-02 TAKAHASHI Kaoru * wl-draft.el (wl-draft-reply-list-symbol): New function. (wl-draft-reply): Use it. Fixed "No match field" error message. * wl-draft.el (wl-draft-insert-from-field): Use (length "From: ") instead of magic-number 6. Use `not' instead of `null' for symbol `nil' check (not empty list). (wl-draft-insert-x-face-field): Fixed paren style. * wl-draft.el (wl-draft-insert-x-face-field-here): Use `when' for one-branch conditional statement, instead of `and' and `if'. (wl-draft-forward): Likewise. (wl-draft-add-references): Likewise. (wl-draft-yank-from-mail-reply-buffer): Likewise. * wl-draft.el (wl-draft-delete-myself-from-cc): Refactoring nested conditional steatment. Use `cond' instead of `if'. (wl-draft-confirm): Likewise. 2001-01-01 TAKAHASHI Kaoru * wl-version.el (wl-version-show): Use `product-string-1' instead of `wl-version'. * wl-fldmgr.el (wl-fldmgr-folders-header): Likewise. * wl-demo.el (wl-demo-copyright-notice): Add 2001. 2000-12-31 TAKAHASHI Kaoru * wl-highlight.el (wl-highlight-headers): Revert `wl-highlight-x-face-func' argument (`beg' and `end'). 2000-12-29 TAKAHASHI Kaoru * wl.el (toplevel): Move `product-provide' declare. * wl-demo.el (toplevel): Ditto. * wl-dnd.el (toplevel): Ditto. * wl-highlight.el (toplevel): Ditto. * wl-message.el (toplevel): Ditto. * wl-refile.el (toplevel): Ditto. * wl-util.el (toplevel): Ditto. 2000-12-26 Yuuichi Teranishi * wl-thread.el (wl-thread-open-all): Rewrite to open all threads and keep cursor position. (Advised by OKAZAKI Tetsurou ) (wl-thread-close-all): keep cursor position. 2000-12-24 TAKAHASHI Kaoru * wl-version.el (wl-version-status-alist): Use `zerop' instead of (eq x 0). (wl-generate-user-agent-string-1): Fix conditional statement. 2000-11-27 Kenichi OKADA * wl.el (wl-check-environment): Additional check for 'wl-local-domain' and `wl-message-id-domain'. 2000-11-19 Kenichi OKADA * wl-draft.el (toplevel): Delete defvar for sasl-*. 2000-11-19 Kenichi OKADA * wl-draft.el (wl-smtp-extension-bind): Use `smtp-sasl-properties' instead of `smtp-sasl-user-realm'. 2000-11-19 Kenichi OKADA * wl-draft.el (wl-smtp-extension-bind): Rewrite for new SASL API. 2000-12-19 Katsumi Yamaoka * wl-draft.el (wl-draft-reply): Bind `mime-header-lexical-analyzer' to the default value as well as `eword-lexical-analyzer'. 2000-12-19 TAKAHASHI Kaoru * wl-version.el (wl-extended-emacs-version, wl-extended-emacs-version2, wl-extended-emacs-version3): Use `elmo-match-string' instead of `wl-match-string'. 2000-12-15 TAKAHASHI Kaoru * wl-summary.el (wl-summary-mode): Use \\{wl-summary-mode-map} in docstring. 2000-12-10 Hironori Fukuchi * wl-summary.el (wl-summary-toggle-thread): Docstring typo fix. 2000-12-15 TAKAHASHI Kaoru * wl-highlight.el (wl-highlight-headers): Remove `wl-highlight-x-face-func' argument (`beg' and `end'). 2000-12-15 Yuuichi Teranishi * wl-summary.el (wl-summary-mark-as-important): Remove cache if folder is local. 2000-12-06 Taro Kawagishi * wl-summary.el (wl-summary-edit-addresses-subr): Call `try-completion' to get existing e-mail address string. 2000-12-13 TAKAHASHI Kaoru * wl-version.el (wl-generate-user-agent-string): Commentary. (wl-generate-user-agent-string-1): Use `when' for one-branch conditional statement, instead of `and' and `if'. (wl-extended-emacs-version, wl-extended-emacs-version2, wl-extended-emacs-version3): Ditto. 2000-12-12 Yuuichi Teranishi * wl-summary.el (wl-summary-sync-all-init): New inline function. (wl-summary-sync): Enclose `wl-summary-sync-update3' with condition-case; Remove initialization. (wl-summary-confirm-appends): Don't enclose with `condition-case'. (wl-summary-sync-update3): Added argument `sync-all'; Eliminated local variable `msgdb'; Call `wl-summary-sync-all-init' when `sync-all' is non-nil. Call `wl-summary-confirm-appends' before `wl-summary-sync-all-init'. (Pointed out by "HIROSE, Masaaki" ) 2000-12-12 KOGURO Naoki * wl-draft.el (wl-draft-send-mail-with-pop-before-smtp): Close POP connection before call `wl-draft-send-mail-with-smtp'. 2000-11-30 Yuuichi Teranishi * Version number is increased to 2.5.4. 2000-11-27 Kenichi OKADA * wl.el (wl-check-environment): Additional check for 'wl-local-domain' and `wl-message-id-domain'. 2000-11-28 Yuuichi Teranishi * wl-folder.el (wl-folder-sync-entity): Bind name of summary/message buffer as command specific. (wl-folder-mark-as-read-all-entity): Ditto. (wl-folder-prefetch-entity): Ditto. (wl-folder-drop-unsync-entity): Ditto. * wl-vars.el (wl-prog-uudecode-arg): Changed default to nil. (wl-prog-uudecode-no-stdout-option): Changed default to t. (Advised by YAMASHITA Junji ) * wl-summary.el (wl-summary-toggle-disp-folder): Removed needless save-excursion. 2000-11-22 Yuuichi Teranishi * Version number is increased to 2.5.3. * wl-summary.el (wl-summary-save-view-cache): Delete duplicated `write-region'; Use `write-region-as-binary' instead of `as-binary-output-file' and `write-region'. 2000-11-20 Katsumi Yamaoka * wl-e21.el (wl-make-date-string): Bind `system-time-locale' to "C". 2000-11-20 Yuuichi Teranishi * wl-draft.el (wl-draft-send-mail-with-smtp): Use `smtp-send-buffer' instead of `smtp-via-smtp'. 2000-11-19 Kenichi OKADA * wl-draft.el (toplevel): Delete defvar for sasl-*. 2000-11-19 Kenichi OKADA * wl-draft.el (wl-smtp-extension-bind): Use `smtp-sasl-properties' instead of `smtp-sasl-user-realm'. 2000-11-19 Kenichi OKADA * wl-draft.el (wl-smtp-extension-bind): Rewrite for new SASL API. 2000-11-19 Kenichi OKADA * Version number is increased to 2.5.2. 2000-11-17 Yuuichi Teranishi * wl-util.el (toplevel): Don't define wl-biff if `timer-activate' does not exist. (wl-biff-stop): Call `cancel-timer' if timer already exists. (wl-biff-start): Call `timer-activate' if timer already exists. * wl-mule.el (wl-message-overload-functions): Call `set-keymap-parent' only when it is bound as function. 2000-11-15 Yuuichi Teranishi * Version number is increased to 2.5.1. 2000-11-14 Yuuichi Teranishi * wl-thread.el (wl-thread-update-line-on-buffer-sub): Print refile/copy destination. 2000-11-13 Yuuichi Teranishi * wl.el (wl-toggle-plugged): Don't call `wl-biff-start' if queue-flush-only is non-nil. * wl-util.el (wl-biff-check-folder-async): Fix close parenthesis. * wl-summary.el (wl-summary-refile-subr): Use folder realname while checking cache folder. 2000-11-09 TAKAHASHI Kaoru * wl-folder.el (wl-folder-guess-mailing-list-by-folder-name): Use `regexp-quote'. 2000-11-08 TAKAHASHI Kaoru * wl-folder.el (wl-folder-guess-mailing-list-by-folder-name): New function. * wl-summary.el (wl-summary-write-current-folder-functions): Change default value. Use it. 2000-11-08 Yuuichi Teranishi * Version number is increased to 2.5.0. * wl-version.el (wl-version): Changed codename. 2000-11-06 Kenichi OKADA * wl-summary.el (wl-summary-cancel-message): Fetch again if no Newsgroups. (wl-summary-supersedes-message): Ditto. 2000-11-05 TAKAHASHI Kaoru * wl-refile.el (wl-refile-guess-functions): Renamed from `wl-refile-guess-func-list'. 2000-11-02 Yuuichi Teranishi * wl-folder.el (wl-folder-guess-mailing-list-by-refile-rule): Fixed problem when no rule was matched. 2000-11-01 Akihiro MOTOKI * wl-summary.el (wl-summary-get-mark): Fixed `wl-summary-buffer-target-mark' check logic. 2000-11-01 TAKAHASHI Kaoru * wl-folder.el (wl-folder-write-current-folder): Added group folder check. * wl-summary.el (wl-summary-write-current-folder): Renamed from `wl-summary-write-current-newsgroup'. (wl-summary-write-current-folder-functions): New variable. * wl-folder.el (wl-folder-get-newsgroups): New function. (wl-folder-guess-mailing-list-by-refile-rule): New function. (wl-folder-write-current-folder): Renamed from `wl-folder-write-current-newsgroup'. 2000-11-01 TAKAHASHI Kaoru * Version number is increased to 2.3.93. 2000-11-01 Yuuichi Teranishi * wl-address.el (wl-ldap-register-dn-string): Flatten dn-list. (wl-ldap-make-matched-value-list): Ditto. (wl-ldap-alias-safe-string): Split e-mail address. * wl-summary.el (wl-summary-read-folder): Fixed problem when petname folder default was selected. (Fix by HIROSE Yuuji ) (wl-summary-auto-refile): Use `wl-folder-get-realname'. 2000-10-31 Yuuichi Teranishi * wl-nemacs.el (wl-draft-overload-functions): Bind 'C-c C-e' to `wl-draft-config-exec'. * wl-mime.el (wl-draft-preview-message): Run `wl-draft-send-hook' instead of calling `wl-draft-config-exec'; Process group-list and show recipients in minibuffer. * tm-wl.el (wl-draft-preview-message): Ditto. 2000-10-31 TAKAHASHI Kaoru * wl.el (toplevel): Added (C) to copyright notice, and sync Author header. * tm-wl.el (toplevel): Ditto. * wl-address.el (toplevel): Ditto. * wl-demo.el (toplevel): Ditto. * wl-dnd.el (toplevel): Ditto. * wl-draft.el (toplevel): Ditto. * wl-e21.el (toplevel): Ditto. * wl-expire.el (toplevel): Ditto. * wl-folder.el (toplevel): Ditto. * wl-highlight.el (toplevel): Ditto. * wl-message.el (toplevel): Ditto. * wl-mime.el (toplevel): Ditto. * wl-mule.el (toplevel): Ditto. * wl-nemacs.el (toplevel): Ditto. * wl-refile.el (toplevel): Ditto. * wl-score.el (toplevel): Ditto. * wl-summary.el (toplevel): Ditto. * wl-template.el (toplevel): Ditto. * wl-thread.el (toplevel): Ditto. * wl-util.el (toplevel): Ditto. * wl-vars.el (toplevel): Ditto. * wl-xmas.el (toplevel): Ditto. 2000-10-31 Katsumi Yamaoka * wl.el (wl-init): Added comment about `wl-init-hook'. * wl-folder.el (wl-make-plugged-alist): Removed useless comment. * wl-vars.el (wl-init-hook): Added docs. (wl-make-plugged-hook): Removed useless docs. * wl-e21.el (toplevel): Removed commented `wl-make-plugged-hook'. * wl-xmas.el (toplevel): Ditto. 2000-10-31 TAKAHASHI Kaoru * wl-address.el (toplevel): Fixed multiple Author header format. * wl-demo.el (toplevel): Ditto. * wl-draft.el (toplevel): Ditto. * wl-folder.el (toplevel): Ditto. * wl-summary.el (toplevel): Ditto. * wl-thread.el (toplevel): Ditto. * wl-util.el (toplevel): Ditto. * wl-vars.el (toplevel): Ditto. * wl-version.el (toplevel): Ditto. * wl-xmas.el (toplevel): Ditto. * wl.el (toplevel): Ditto. * wl-version.el (toplevel): Added require `elmo-version' for `product-version-as-string'. 2000-10-31 Yuuichi Teranishi * wl-vars.el (wl-draft-send-hook): Changed default value to '(wl-draft-config-exec). * wl-draft.el (wl-draft-send): Don't call `wl-draft-config-exec' explicitly. (wl-draft): Set `wl-draft-config-exec-flag' before running `wl-mail-setup-hook'. * wl-xmas.el (toplevel): Add `wl-plugged-init-icons' and `wl-biff-init-icons' to `wl-init-hook' instead of `wl-make-plugged-hook'. (Because if `wl-draft' command is invoked at first, they are not initialized) Updated copyright notice. * wl-e21.el (toplevel): Ditto; * wl-demo.el (toplevel): Updated copyright notice. * wl-address.el (toplevel): Ditto. * wl-draft.el (toplevel): Ditto. * wl-version.el (toplevel): Ditto. * wl-folder.el (toplevel): Ditto. * wl-summary.el (toplevel): Ditto. * wl-thread.el (toplevel): Ditto. * wl-util.el (toplevel): Ditto. * wl-vars.el (toplevel): Ditto. * wl.el (toplevel): Ditto. 2000-10-30 Yuuichi Teranishi * wl-highlight.el (wl-highlight-message): Fixed problem of highlighting failure which occured when the last field contains multiple lines in the draft buffer. * wl.el (wl-toggle-plugged): Call `wl-biff-stop' if unplugged, `wl-biff-start' if plugged. * wl-util.el (wl-biff-check-folder): New function. (wl-biff-check-folders): Don't set session name prefix. Use `wl-biff-check-folder' instead of `wl-folder-check-one-entity'. (wl-biff-check-folder-async): Ditto. * wl-address.el (wl-ldap-alias-safe-string): Replace '@' to '/' in email address. 2000-10-07 Yasushi Shoji * wl-vars.el (wl-subject-prefix-regexp): New variable. * wl-draft.el (wl-draft-strip-subject-re): New function. * wl-draft.el (wl-draft-reply): Use it. 2000-10-30 Yuuichi Teranishi * wl-message.el (wl-mmelmo-message-redisplay): Use `mime-display-message' instead of `wl-mime-display-message'. * wl-mime.el (toplevel): Removed compatibility workaround for SEMI 1.13.4. or earlier and FLIM 1.12.7 or earlier. (wl-mime-display-message): Abolished. (wl-mime-entity-read-field): Ditto. (wl-mime-combine-message/partial-pieces): Use `mime-entity-read-field' instead of `wl-mime-entity-read-field'. 2000-10-27 OKAZAKI Tetsurou * wl-template.el: Doc fixes. 2000-10-26 Katsumi Yamaoka * wl-e21.el (wl-message-overload-functions): Do nothing if `current-local-map' is not available. (wl-e21-setup-message-toolbar): Allow the argument `keymap'. 2000-10-26 TAKAHASHI Kaoru * wl-fldmgr.el (wl-fldmgr-save-folders): Fixed permission lateral representation. * wl-fldmgr.el (wl-fldmgr-folders-header): Include version number. (wl-fldmgr-save-folders): Don't use `format' when insert `wl-fldmgr-folders-header'. 2000-10-26 Katsumi Yamaoka * wl-demo.el (wl-demo): Don't use `fancy-splash-insert'. 2000-10-26 Yuuichi Teranishi * wl-highlight.el (wl-highlight-message): Use `std11-field-end' to detect end point of the header field. Refer `wl-highlight-max-header-size'. * wl-vars.el (wl-highlight-max-header-size): New variable. * wl-highlight.el (wl-highlight-headers): Added argument `for-draft'. * wl-draft.el (wl-draft-yank-from-mail-reply-buffer): Set `for-draft' argument of wl-highlight-headers. (wl-draft): Ditto. (wl-draft-reedit): Ditto. (wl-user-agent-compose-internal): Ditto. 2000-10-24 Daiki Ueno * wl-message.el (wl-message-add-button): Use overlay. 2000-10-24 Yuuichi Teranishi * wl-draft.el (wl-draft-parse-mailbox-list): Don't insert extra space. * wl-address.el (wl-address-string-without-group-list-contents): Fixed problem when group-list content is nothing. (Reported by Mito ) 2000-10-18 SAITO Atsunori * wl-summary.el (wl-summary-print-destination): Adjust line length. 2000-10-20 TAKAHASHI Kaoru * tm-wl.el (toplevel): Use product-provide. 2000-10-20 Yuuichi Teranishi * Version number is increased to 2.3.92. 2000-10-19 Katsumi Yamaoka * wl-demo.el (wl-demo): Use `fancy-splash-insert' for inserting a title text, use `display' property for left margin under Emacs 21. * wl-e21.el (wl-biff-init-icons): Don't use `propertize' without properties. (wl-plugged-init-icons): Ditto. 2000-10-19 TAKAHASHI Kaoru * wl.el (wl-save-status, wl-init): Remove last period in "...done." message. * tm-wl.el (wl-summary-burst): Ditto. * wl-summary.el (wl-summary-rescan, wl-summary-mark-as-read-all, wl-summary-resume-cache-status, wl-summary-resume-marks-and-highlight, wl-summary-resume-marks, wl-summary-sync-update3, wl-summary-highlight-msgs, wl-summary-flush-pending-append-operations, wl-summary-delete-all-msgs, wl-summary-delete-all-temp-marks, wl-summary-jump-to-parent-message, wl-summary-drop-unsync): Ditto. * wl-thread.el (wl-thread-resume-entity, wl-thread-close-all, wl-thread-open-all): Ditto. * wl-score.el (wl-summary-score-update-all-lines): Ditto. * wl-mime.el (wl-summary-burst): Ditto. * wl-highlight.el (wl-highlight-summary): Ditto. * wl-folder.el (wl-folder-update-newest, wl-local-folder-init, wl-folder-open-all, wl-folder-update-access-group): Ditto. * wl-draft.el (wl-draft-send, wl-draft-queue-append): Ditto. * wl-address.el (wl-local-address-init): Ditto. 2000-10-19 Katsumi Yamaoka * wl-e21.el (wl-biff-init-icons): Use `propertize' instead of `add-text-properties'. (wl-plugged-init-icons): Ditto. (wl-folder-init-icons): Use `propertize' instead of `put-text-property'. (wl-plugged-set-folder-icon): Ditto. (wl-e21-highlight-folder-group-line): Ditto. 2000-10-18 Yuuichi Teranishi * wl-version.el (wl-version-status-alist): New variable. (wl-version-status): New function. * wl-vars.el (wl-draft-reply-without-argument-list): Added "From" to "Cc" part of the case "Reply-To". * wl-draft.el (wl-draft-reply): Use result of `eword-extract-address-components'. * wl-demo.el (wl-demo-icon-name): New constant. (wl-logo-xpm): Use it. (wl-logo-xbm): Ditto. (wl-logo-bitmap): Ditto. * Version number is increased to 2.3.91. 2000-10-18 TAKAHASHI Kaoru * wl-version.el (wl-generate-user-agent-string): Fixed docstring. (wl-extended-emacs-version, wl-extended-emacs-version2, wl-extended-emacs-version3): Remove `interactive'. Fixed docstring. * wl-version.el (wl-generate-user-agent-string-1): New function. (wl-generate-user-agent-string): Use it. * wl-version.el (wl-generate-user-agent-string-1): Ignore `mime-edit-insert-user-agent-field'. (wl-generate-user-agent-string): Check `mime-edit-insert-user-agent-field' and `mime-editor/version'. * wl-version.el (wl-generate-user-agent-string-1): Use `cond' instead of `if', when verbose case. 2000-10-18 Kenichi OKADA * wl-expire.el (wl-summary-expire): Fix. 2000-10-18 Kenichi OKADA * wl.el (wl-check-environment): Don't check `wl-trash-folder' and `elmo-lost+found-folder' if 'wl-draft. * wl-draft.el (wl-draft): Call `wl-init' with 'wl-draft. 2000-10-17 Kenichi OKADA * wl-expire.el (wl-summary-expire): Change messages. * wl-summary.el (wl-summary-delete-messages-on-buffer): Use `deleing-info' instead of "Deleting..." 2000-10-15 Osamu Yamane * wl-summary.el (wl-summary-refile-subr): Fix. 2000-10-15 Kenichi OKADA * wl-summary.el (wl-summary-refile-subr): Check dst-spec-plugged if pipe folder. 2000-10-17 Kenichi OKADA * wl-vars.el (wl-draft-use-cache): Default `nil'. 2000-10-17 Kenichi OKADA * wl-expire.el (wl-expire-hide): New function. (wl-summary-expire): Add `hide'. 2000-10-17 Yuuichi Teranishi * wl-vars.el (wl-draft-reply-without-argument-list): Changed default value to consider `Reply-To:'. (Advised by TAKAHASHI Kaoru ) * Version number is increased to 2.3.90. * wl-summary.el (wl-summary-msgdb-load-async): Enclose elmo-imap4-get-session with unwind-protect. Don't cause error. (wl-summary-sync-marks): Don't check plugged nor folder type. (wl-summary-save-view-cache): Abolished argument `keep-current-buffer' (Always keep current buffer). 2000-10-16 Akihiro MOTOKI * wl-highlight.el (wl-highlight-message-add-buttons-to-header): Enclose with `save-excursion'. 2000-10-16 TAKAHASHI Kaoru * wl-version.el (wl-version): Remove interactive. 2000-10-15 TAKAHASHI Kaoru * wl-version.el (wl-generate-user-agent-string): Use `product-string-verbose' instead of `product-string-1'. 2000-10-15 Kenichi OKADA * wl-vars.el (wl-draft-use-cache): New variable. * wl-draft.el (wl-draft-dispatch-message): Sending message is cached, if wl-draft-use-cache is non-nil. 2000-10-15 Kenichi OKADA * wl-summary (wl-summary-prefetch): Don't prefetch if cached. (wl-summary-prefetch-msg): force prefetch if called with optional argument. 2000-10-13 Yuuichi Teranishi * wl-thread.el (wl-thread-msg-mark-as-read): Abolished. (wl-thread-msg-mark-as-unread): Ditto. * wl-summary.el (wl-summary-sync-marks): Delete argument 'no-cache. (wl-summary-mark-as-unread): Check return value of `elmo-mark-as-read'. (wl-summary-mark-as-read): Invert the meaning of 6 th argument. Don't set mark in summary if return value of `elmo-mark-as-read' is nil. Use `wl-summary-mark-as-read' instead of `wl-thread-msg-mark-as-read'. (wl-summary-mark-as-read-region): Use `wl-summary-mark-as-read' instead of `wl-thread-msg-mark-as-read'. (wl-summary-mark-as-unread-region): Ditto. (wl-summary-target-mark-mark-as-read): Ditto. * wl-score.el (wl-summary-score-update-all-lines): Ditto. 2000-10-12 Yuuichi Teranishi * wl-xmas.el (wl-highlight-folder-current-line): Remove previous face. * wl-mule.el (wl-highlight-folder-current-line): Ditto. 2000-10-11 Yuuichi Teranishi * wl-highlight.el (wl-highlight-folder-group-line): Remove previous face. 2000-10-11 OKAZAKI Tetsurou * wl-util.el (toplevel): Use `wl-on-xemacs' instead of `running-xemacs'. 2000-10-11 TAKAHASHI Kaoru * wl-version.el (toplevel): Use `product-version-as-string' for set verstion-string, if defined. * wl-version.el (wl-version-show): Insert string at point, when call with argument. * wl-version.el (wl-generate-user-agent-string): Use `product-string-1' instead of `wl-appname', `wl-version' and `wl-codename'. 2000-10-10 TAKAHASHI Kaoru * wl-address.el (toplevel): Use product-provide. * wl-demo.el (toplevel): Ditto. * wl-dnd.el (toplevel): Ditto. * wl-draft.el (toplevel): Ditto. * wl-e21.el (toplevel): Ditto. * wl-expire.el (toplevel): Ditto. * wl-fldmgr.el (toplevel): Ditto. * wl-folder.el (toplevel): Ditto. * wl-highlight.el (toplevel): Ditto. * wl-message.el (toplevel): Ditto. * wl-mime.el (toplevel): Ditto. * wl-mule.el (toplevel): Ditto. * wl-nemacs.el (toplevel): Ditto. * wl-refile.el (toplevel): Ditto. * wl-score.el (toplevel): Ditto. * wl-summary.el (toplevel): Ditto. * wl-template.el (toplevel): Ditto. * wl-thread.el (toplevel): Ditto. * wl-util.el (toplevel): Ditto. * wl-vars.el (toplevel): Ditto. * wl-xmas.el (toplevel): Ditto. * wl.el (toplevel): Ditto. 2000-10-10 TAKAHASHI Kaoru * wl-fldmgr.el (wl-fldmgr-save-folders): Use (wl-version t) instead of product. * wl-version.el (wl-version): Compile time evalution elmo-version. 2000-10-10 Kenichi OKADA * wl-summary.el (wl-summary-sync-force-update): Append queue `mark-as-read'if unplugged. 2000-10-10 TAKAHASHI Kaoru * wl-version.el: New file. Use product.el. * wl.el: add (require 'wl-version). * wl-fldmgr.el (wl-fldmgr-save-folders): Use `product-string-1' for ~/.folders header. (wl-fldmgr-folders-header): Changed. * wl-demo.el (wl-demo): Use product.el. * wl-vars.el (wl-appname, wl-version, wl-codename): Move to wl-version.el. * wl-util.el (wl-version, wl-version-show): Ditto. * wl-util.el (wl-generate-user-agent-string, wl-extended-emacs-version, wl-extended-emacs-version2, wl-extended-emacs-version3): Move to wl-version.el. * wl-util.el (mule-version, nemacs-version, emacs-beta-version, xemacs-codename, mime-edit-insert-user-agent-field, mime-edit-user-agent-value, mime-editor/version, mime-editor/codename): Compile warning killer move to wl-version.el 2000-10-09 Kenichi OKADA * wl-summary.el (wl-summary-refile-subr): Fix. 2000-10-09 Yuuichi Teranishi * wl-summary.el (wl-summary-sync-marks): Changed argument for `elmo-list-folder-unread' and `elmo-list-folder-important'. 2000-10-08 Kenichi OKADA * wl.el (wl-check-environment): Check too many `@'. 2000-10-08 Mikio Nakajima * wl-thread.el (wl-thread-delete-message): Fix parentheses. 2000-10-07 TAKAHASHI Kaoru * wl-vars.el (wl-draft-reply-myself-with-argument-list, wl-draft-reply-myself-without-argument-list): Add variables. * wl-draft.el (wl-draft-reply): Use it. 2000-10-06 Daiki Ueno * wl-fldmgr.el (wl-fldmgr-add-completion-all-completions): Pass the 5th argument of `elmo-network-get-spec'. * wl-thread.el (wl-thread-reparent-children): New inline function. (wl-thread-delete-message): Use it. * wl-score.el (wl-score-headers): Abolish local variable `buffers'. (wl-summary-score-update-all-lines): Don't use `dolist'. 2000-10-06 TAKAHASHI Kaoru * wl-score.el (toplevel): Remove (provide 'elmo-msgdb). And add (require 'elmo-msgdb) for inline function. 2000-10-06 Kenichi OKADA * wl-vars.el (wl-draft-queue-save-variables): Add variables. 2000-10-06 Kenichi OKADA * wl-score.el (wl-score-headers): Fix for the confusing macro `elmo-kill-buffer'. 2000-10-05 Katsumi Yamaoka * wl-summary.el: Don't use the 3rd argument of `require' because it might be ignored by some wrappers (e.g. jam-zcat, efs, etc.). * wl-util.el: Ditto. * wl-draft.el: Ditto. 2000-10-05 Katsumi Yamaoka * wl-demo.el (wl-demo): Don't pass by the XEmacs routine when window system is not used. 2000-10-04 Daiki Ueno * wl-thread.el: Don't use `mapcar' only for iteration. (wl-thread-resume-entity): Ditto. (wl-thread-delete-message): Ditto. * wl-summary.el: Bind `dragdrop-drop-functions', `scrollbar-height' and `mail-reply-buffer'; specify 3rd argument of `require' for `timezone', `easymenu' and `ps-print'; don't use `mapcar' only for iteration. * wl-util.el: Bind `mule-version', `nemacs-version', `emacs-beta-version', `xemacs-codename', `mime-edit-insert-user-agent-field', `mime-edit-user-agent-value', `mime-editor/version' and `mime-editor/codename'; specify 3rd argument of `require' for `tm-edit' and `pp'; don't use `mapcar' only for iteration. * wl-score.el: Don't use `mapcar' only for iteration. (wl-score-simplify-buffer-fuzzy): Ditto. (wl-score-simplify-subject): Ditto. (wl-score-headers): Ditto. (wl-summary-score-update-all-lines): Ditto. * wl-mime.el: Bind `xemacs-betaname', `xemacs-codename', `enable-multibyte-characters' and `mule-version'. * wl-message.el: Bind `mmelmo-imap4-skipped-parts'; don't use `mapcar' only for iteration. * wl-demo.el: Don't use `mapcar' only for iteration. * wl-folder.el: Don't use `mapcar' only for iteration. (wl-folder-open-all): Ditto. (wl-folder-count-incorporates): Ditto. * wl-fldmgr.el (wl-add-entity): Don't use `mapcar' only for iteration. (wl-add-entity-sub): Ditto; use `delq' instead of `delete'. * wl-draft.el: Bind `x-face-add-x-face-version-header', `mail-reply-buffer', `mail-from-style', `smtp-authenticate-*' and `smtp-connection-type'; specify 3rd argument of `require' for `timezone'; don't use `mapcar' only for iteration. (wl-draft-clone-local-variables): Don't use `mapcar'. (wl-draft-generate-clone-buffer): Ditto. (wl-user-agent-compose-internal): Ditto. * wl-xmas.el (wl-folder-init-icons): Use `dolist' instead of `mapcar'. * wl.el (wl-toggle-plugged): Don't use `mapcar' only for iteration. (wl-save-status): Ditto. * wl-address.el (wl-local-address-init): Don't use `mapcar' only for iteration. 2000-10-04 Yuuichi Teranishi * wl-vars.el (wl-summary-pick-field-default): Added `Last', `First' and removed `Date'. (wl-fldmgr-make-filter-default): New user option. * wl-fldmgr.el (wl-fldmgr-make-filter): Simplify. Use `elmo-read-search-condition' and `wl-fldmgr-make-filter-default' (wl-fldmgr-filter-completion-alist): Abolish. * wl.el (wl): Don't check servers if arg is non-nil. * wl-draft.el (wl-draft-reply): Set only message-id string to In-Reply-To field. 2000-10-03 Yuuichi Teranishi * wl-summary.el (wl-summary-pick): Rewrite. * wl-draft.el (wl-draft-forward): Get references field from original buffer. (wl-draft-forward): Use `wl-draft-parse-msg-id-list-string'. 2000-10-02 A. SAGATA * wl-draft.el (wl-draft-forward): Add references field. 2000-10-03 Yuuichi Teranishi * wl-draft.el (wl-draft-parse-msg-id-list-string): New function. (wl-draft-reply): Use it. 2000-10-02 Katsumi Yamaoka * wl-vars.el (wl-icon-dir): Default to $(data-directory)/wl/icons/ when Emacs 21 is running. * wl-e21.el (wl-e21-make-toolbar-buttons): Invalidate the default bindings. 2000-09-29 Katsumi Yamaoka * wl-e21.el (wl-e21-setup-toolbar): Make the background color of XPM icons transparent. * wl-demo.el (wl-demo): Hide toolbar while showing a logo under Emacs 21. 2000-09-29 Yuuichi Teranishi * wl.el (wl-toggle-plugged): Set `wl-biff-check-folders-running' as nil. * wl-summary.el (wl-summary-sync-force-update): Save seen-list only when it is persistent. (wl-summary-sync-marks): Changed argument for `elmo-list-folder-unread' and `elmo-list-folder-important'. (wl-summary-virtual): Use `elmo-read-search-condition'. (wl-summary-redisplay-internal): If folder is local, mark as read even when folder is plugged. 2000-09-28 Katsumi Yamaoka * wl-e21.el (wl-e21-make-toolbar-buttons): Don't modify the value of `tool-bar-lines' in the frame parameters. (after-make-frame-functions, post-command-hook): Don't modify the value. (wl-e21-switch-toolbar-after-make-frame, wl-e21-switch-toolbar, wl-e21-tool-bar-lines): Removed. 2000-09-28 Katsumi Yamaoka * wl-highlight.el (wl-highlight-folder-path): Put overlay properties `evaporate' and `wl-momentary-overlay' as well. (wl-highlight-summary-displaying): Ditto. (wl-delete-all-overlays): Don't delete overlay which does not have a property `wl-momentary-overlay'. * wl-e21.el (wl-biff-init-icons, wl-plugged-init-icons): Refer to `display-mouse-p' and `display-graphic-p'. (wl-folder-init-icons): Don't search for XBM or the other files. (wl-plugged-set-folder-icon): Make icons if and only if `display-graphic-p' returns non-nil. (wl-highlight-plugged-current-line): Use `before-string' overlay property to show icon images. (wl-highlight-folder-current-line): Ditto. (wl-e21-highlight-folder-group-line): Ditto. (wl-e21-highlight-folder-by-numbers): Ditto. (wl-e21-insert-image): Removed. (wl-e21-setup-*-toolbar): Refer to `display-graphic-p'. (wl-e21-make-toolbar-buttons): Set the value that Emacs itself said. (wl-e21-switch-toolbar-after-make-frame): Renamed from `wl-e21-force-switch-toolbar'. (wl-e21-make-icon-image): Removed. (wl-e21-setup-toolbar): Don't search for XBM files. (wl-use-toolbar): Don't refer to `display-graphic-p' to determine the default value. 2000-09-27 Yuuichi Teranishi * wl-util.el (wl-biff-check-folder-async): Set `wl-biff-check-folders-running' even when it is not an IMAP folder. 2000-09-26 Katsumi Yamaoka * wl-e21.el (after-make-frame-functions): Add `wl-e21-force-switch-toolbar'. (wl-e21-force-switch-toolbar): New function force to switch the toolbar appearance automatically. (post-command-hook): Add `wl-e21-switch-toolbar'. (wl-e21-switch-toolbar): New function to switch the toolbar appearance automatically. (wl-e21-tool-bar-lines): New buffer local variable. 2000-09-25 Yuuichi Teranishi * wl-util.el (wl-biff-check-folders-running): New variable. (wl-biff-check-folders): Set and check `wl-biff-check-folders-running'. (wl-biff-check-folder-async-callback): Set `wl-biff-check-folders-running'. (wl-biff-check-folders): Enclose `wl-folder-check-one-entity' with unwind-protect. * wl.el (wl): Call `wl-biff-start' before `wl-folder-auto-check'. Enclose `wl-folder-auto-check' with unwind-protect. * wl-util.el (wl-biff-start) [Emacs19+]: require 'timer. (toplevel) [Emacs19+]: Removed autoload setting for "timer". * wl.el (wl): Call `wl-folder-auto-check' after `wl-plugged-init'. * wl-util.el (wl-biff-notify): New inline function. (wl-biff-check-folders): Bind `elmo-network-session-name-prefix' locally. Call `wl-biff-check-folder-async' if length of `wl-biff-check- folder-list' is 1. Use `wl-biff-notify'. (wl-biff-check-folder-async-callback): New function. (wl-biff-check-folder-async): Ditto. * wl-folder.el (wl-folder): Don't check folders. (wl-folder-auto-check): New function. 2000-09-24 A. SAGATA * wl-util.el (wl-biff-start) [Emacs19+]: Use `timer-next-integral-multiple-of-time'. (wl-biff-check-folders): Use `wl-default-folder' if `wl-biff-check-folder-list' is nil. 2000-09-24 OKAZAKI Tetsurou * wl-summary.el (wl-summary-set-crosspost): Use `elmo-list-delete' instead of `elmo-delete-lists'. 2000-09-22 Katsumi Yamaoka * wl.el (wl-plugged-toggle-all): Set the value of `wl-modeline-plug-status' instead of `wl-plug-state-indicator'. (wl-plugged-toggle): Ditto. (wl-toggle-plugged): Ditto. (wl-plugged-init): Ditto. * wl-xmas.el (wl-biff-init-icons): Set icons data to `wl-modeline-biff-state-off' and `wl-modeline-biff-state-on' instead of `wl-biff-state-indicator-off' and `wl-biff-state-indicator-on'; don't modify the value and the type of `wl-biff-state-indicator-off' and `wl-biff-state-indicator-on'. (wl-plugged-init-icons): Set icons data to `wl-modeline-plug-state-off' and `wl-modeline-plug-state-on' instead of `wl-plug-state-indicator-off' and `wl-plug-state-indicator-on'; don't modify the value and the type of `wl-plug-state-indicator-off' and `wl-plug-state-indicator-on'. * wl-vars.el (wl-modeline-biff-state-off, wl-modeline-biff-state-on, wl-modeline-biff-status, wl-modeline-plug-state-off, wl-modeline-plug-state-on, wl-modeline-plug-status): New internal variables. (wl-biff-state-indicator-off, wl-biff-state-indicator-on, wl-biff-check-interval, wl-biff-check-folder-list): Change customization group from `wl-folder' to `wl-highlight'. (wl-plug-state-indicator-off, wl-plug-state-indicator-on, wl-show-plug-status-on-modeline): Defcustomized. * wl-util.el (wl-biff-check-folders): Set the value of the flag `wl-modeline-biff-status' instead of `wl-biff-state-indicator'. (wl-mode-line-buffer-identification): Set both ON and OFF data with a flag to `mode-line-buffer-identification'. * wl-e21.el (wl-biff-init-icons): Set icons data to `wl-modeline-biff-state-off' and `wl-modeline-biff-state-on' instead of `wl-biff-state-indicator-off' and `wl-biff-state-indicator-on'. (wl-plugged-init-icons): Set icons data to `wl-modeline-plug-state-off' and `wl-modeline-plug-state-on' instead of `wl-plug-state-indicator-off' and `wl-plug-state-indicator-on'. 2000-09-20 Hiroya Murata * wl-util.el (wl-mode-line-buffer-identification): Don't breed excessive titles. 2000-09-20 Katsumi Yamaoka * wl.el (wl-plugged-mode): Use revised `wl-mode-line-buffer-identification'. (wl-plugged-init): Don't use `force-mode-line-update'. * wl-xmas.el (wl-draft-overload-functions): Use revised `wl-mode-line-buffer-identification'. (wl-setup-summary): Renamed from `wl-xmas-setup-summary'. (wl-setup-folder): Renamed from `wl-xmas-setup-folder'. (TopLevel): Add `wl-setup-summary' to `wl-summary-mode-hook'; add `wl-plugged-init-icons' and `wl-biff-init-icons' to `wl-make-plugged-hook'; add `wl-folder-init-icons' and `wl-setup-folder' to `wl-folder-mode-hook'. * wl-vars.el (wl-use-highlight-mouse-line): Activate it for Emacs 19 as well. (wl-mode-line-display-priority-list): New user option. (wl-biff-state-indicator-off, wl-biff-state-indicator-on): Defcustomized. (wl-make-plugged-hook, wl-summary-mode-hook, wl-folder-mode-hook): Add docs. * wl-util.el (wl-biff-start): Call `wl-biff-check-folders' at the start. (wl-mode-line-buffer-identification): Revised as a function. * wl-summary.el (wl-summary-mode): Use revised `wl-mode-line-buffer-identification'; don't call `wl-e21-setup-summary' nor `wl-xmas-setup-summary' directly. (TopLevel): Don't bind `wl-e21-setup-summary' nor `wl-xmas-setup-summary'. * wl-nemacs.el (wl-draft-overload-functions): Use revised `wl-mode-line-buffer-identification'. * wl-mule.el (wl-draft-overload-functions): Use revised `wl-mode-line-buffer-identification'. * wl-folder.el (wl-make-plugged-alist): Don't call `wl-biff-init-icons' nor `wl-plugged-init-icons' directly. (wl-folder): Don't call `wl-folder-init-icons' directly. (wl-folder-mode): Don't call `wl-e21-setup-folder' nor `wl-xmas-setup-folder' directly; use revised `wl-mode-line-buffer-identification'. (TopLevel): Don't bind `wl-biff-init-icons', `wl-plugged-init-icons', `wl-folder-init-icons', `wl-e21-setup-folder' nor `wl-xmas-setup-folder'. * wl-e21.el (wl-draft-overload-functions): Use revised `wl-mode-line-buffer-identification'. (wl-setup-summary): Renamed from `wl-e21-setup-summary'. (wl-setup-folder): Renamed from `wl-e21-setup-folder'. (TopLevel): Add `wl-setup-summary' to `wl-summary-mode-hook'; add `wl-plugged-init-icons' and `wl-biff-init-icons' to `wl-make-plugged-hook'; add `wl-folder-init-icons' and `wl-setup-folder' to `wl-folder-mode-hook'. 2000-09-18 A. SAGATA Katsumi Yamaoka * wl.el (wl): Call `wl-biff-start'. (wl-exit): Call `wl-biff-stop'. (wl-plugged-mode): Show biff in modeline. (wl-unplugged-glyph, wl-plugged-glyph): Removed. * wl-xmas.el (wl-draft-overload-functions): Show biff in modeline. (wl-biff-init-icons): New function. (wl-plugged-init-icons): Don't make too much keymaps. (wl-biff-nomail-glyph, wl-biff-mail-glyph): New variables. * wl-vars.el (wl-biff-nomail-icon, wl-biff-mail-icon, wl-biff-state-indicator-off, wl-biff-state-indicator-on): New variables. (wl-biff-check-interval, wl-biff-check-folder-list): New user options. * wl-util.el (wl-biff-check-folders, wl-biff-event-handler, wl-biff-start, wl-biff-stop): New functions. (timer-next-integral-multiple-of-time): Defined with `defun-maybe'. (wl-biff-timer-name): New variable. * wl-summary.el (wl-summary-mode): Show biff in modeline. * wl-nemacs.el (wl-draft-overload-functions): Show biff in modeline. (wl-plugged-init-icons, wl-folder-init-icons): Removed. * wl-mule.el (wl-draft-overload-functions): Show biff in modeline. (wl-plugged-init-icons, wl-folder-init-icons): Removed. * wl-folder.el (wl-make-plugged-alist): Call `wl-biff-init-icons'. (TopLevel): Bind `wl-biff-init-icons', `wl-plugged-init-icons' and `wl-folder-init-icons' to `ignore' if they are not available. (wl-folder-mode): Show biff in modeline. * wl-e21.el (wl-draft-overload-functions): Show biff in modeline. (wl-biff-init-icons): New function. (wl-plugged-init-icons): Don't make too much keymaps. (wl-biff-nomail-image, wl-biff-mail-image): New variables. 2000-09-15 OKAZAKI Tetsurou * wl-vars.el (wl-strict-diff-folders): Customization Type and doc fix. Define as a list of regular expressions for folders or nil. * wl-folder.el (wl-folder-check-one-entity): Use `wl-string-match-member' instead of `wl-string-member' for `wl-strict-diff-folders'. 2000-09-14 Katsumi Yamaoka * wl-xmas.el (wl-xmas-highlight-folder-group-line): New function. (wl-highlight-folder-current-line): Use it; new implementation. (wl-xmas-setup-draft-toolbar, wl-xmas-setup-message-toolbar, wl-xmas-setup-summary-toolbar, wl-xmas-setup-folder-toolbar): Use `defsubst' instead of `defun'. * wl-vars.el (wl-highlight-folder-by-numbers): Renamed from `wl-highlight-group-folder-by-numbers'; made it can also be a number. See info for more details. * wl-summary.el: Bind `wl-xmas-setup-summary' when XEmacs is not running. * wl-nemacs.el (wl-xmas-setup-*, wl-delete-all-overlays): No need to bind them. * wl-mule.el (wl-xmas-setup-*): No need to bind them. (wl-highlight-folder-current-line): New implementation. * wl-highlight.el (wl-highlight-folder-group-line): New implementation. (wl-delete-all-overlays): Rewrite as a marco. (TopLevel): Require `wl-e21' when Emacs 21 is running. * wl-folder.el: Bind `wl-xmas-setup-folder' when XEmacs is not running. (wl-folder-*-glyph): No need to bind them. * wl-e21.el (wl-e21-highlight-folder-group-line): Renamed from `wl-e21-highlight-folder-group-icon'; rewrite. (wl-e21-setup-draft-toolbar, wl-e21-setup-message-toolbar): Use `defsubst' instead of `defun'. (wl-folder-mode-map): Bind it when compiling. 2000-09-13 Yuuichi Teranishi * wl.el (wl): Initialize plug-related settings before `wl-init'. * wl-draft.el (wl-draft): funcall `wl-fcc' if it is a function. 2000-09-13 Katsumi Yamaoka * wl-folder.el (wl-folder-entity-assign-id): Undo the last change. 2000-09-11 Katsumi Yamaoka * wl-e21.el (wl-e21-highlight-folder-group-icon): New function. (wl-highlight-folder-current-line): Use it. * wl-folder.el (wl-folder-entity-assign-id): Don't put text props in `id-name'. 2000-09-08 Katsumi Yamaoka * wl.el: Require `wl-e21' when Emacs 21 is running. * wl-vars.el (wl-highlight-folder-with-icon): Activate it by default when Emacs 21 is running. (wl-use-highlight-mouse-line): Ditto. (wl-on-emacs21): New constant. (wl-on-emacs20): Removed. * wl-summary.el (wl-summary-mode): Call `wl-e21-setup-summary' when Emacs 21 is running. * wl-folder.el (wl-folder-mode): Call `wl-e21-setup-folder' when Emacs 21 is running. * wl-e21.el: New file. 2000-09-08 Daiki Ueno * wl.el (wl-plugged-init): Refer `wl-plug-state-indicator-on' indirectly. (wl-toggle-plugged): Ditto. (wl-plugged-toggle): Ditto. (wl-plugged-toggle-all): Ditto. * wl-vars.el (wl-plug-state-indicator): Refer `wl-plug-state-indicator-on' indirectly. 2000-08-31 Yuuichi Teranishi * wl-summary.el (wl-summary-sync-update3): Call `elmo-commit'. Call `wl-folder-confirm-existence'. * wl-folder.el (wl-folder-confirm-existence): Added optional argument `force'. 2000-08-30 OKAZAKI Tetsurou * wl-summary.el (wl-summary-refile-subr): Assume `copy-or-refile' as symbol. (wl-summary-refile): Follow up above change. (wl-summary-copy): Ditto. Doc fix. 2000-08-29 Yuuichi Teranishi * wl-summary.el (wl-summary-pick): Don't bind `elmo-search-mime-charset'. * wl-vars.el (wl-highlight-message-header-button-alist): Define default using old backquote style. (wl-search-mime-charset): Abolished. * wl-highlight.el (wl-highlight-headers): Call `point' after `re-search-forward'(for Nemacs). * wl-summary.el (wl-summary-msgdb-load-async): Follow up the changes for elmo-imap4.el. 2000-08-29 Daiki Ueno * wl-message.el (wl-mmelmo-message-redisplay): Bind `wl-message-ignored-field-list' instead of `mime-view-ignored-field-list'. * wl-folder.el (wl-folder-goto-top-of-current-folder):Simplified. Add interactive spec. (wl-folder-goto-bottom-of-current-folder): Ditto. (wl-folder-mode-map): Bind them. * wl-vars.el (wl-message-ignored-field-list): New variable. (wl-message-visible-field-list): New variable. * wl-mime.el (wl-mime-header-presentation-method): New function. (wl-mime-setup): Set header-presentation-method. 2000-08-28 Daiki Ueno * wl-nemacs.el (wl-draft-overload-functions): Set `mode-line-buffer-identification' instead of using `wl-make-modeline'. * wl.el (wl-plugged-mode): Set `mode-line-buffer-identification' instead of using `wl-make-modeline'. * wl-xmas.el (wl-plugged-init-icons): Set up `wl-plug-state-indicator-on' and `wl-plug-state-indicator-off'. (wl-make-modeline): Abolish. (wl-draft-overload-functions): Set `mode-line-buffer-identification' instead of using `wl-make-modeline'. * wl-util.el (wl-make-modeline-subr): Abolish. (wl-mode-line-buffer-identification): New alias. * wl-summary.el (wl-summary-buffer-folder-indicator): New. (wl-summary-make-modeline): Abolish. (wl-summary-buffer-set-folder): Set `wl-summary-buffer-folder-indicator'. (wl-summary-mode): Set `mode-line-buffer-identification' instead of using `wl-make-modeline'. (wl-summary-switch-to-clone-buffer): Don't set `mode-line-buffer-identification'. (wl-summary-goto-folder-subr): Ditto. * wl-mule.el (wl-draft-overload-functions): Set `mode-line-buffer-identification' instead of using `wl-make-modeline'. * wl-folder.el (wl-folder-mode): Set `mode-line-buffer-identification' instead of using `wl-make-modeline'. (wl-folder): Don't set `mode-line-buffer-identification'. 2000-08-28 OKAZAKI Tetsurou * wl-refile.el (wl-refile-learn): Simplified. Use `memq' instead of `member' for `wl-refile-guess-func-list' look-ups. Use `cons' instead of `add-to-list' to update `wl-refile-alist'. 2000-08-28 Daiki Ueno * wl-mime.el (wl-message-button-dispatcher-internal): Rename from `wl-message-button-dispatcher'. * tm-wl.el (wl-message-button-dispatcher-internal): Ditto. * wl-message.el (wl-message-button-dispatcher): Use it. * wl-vars.el (wl-highlight-message-header-button-alist): Add "In-Reply-To". * wl-highlight.el (wl-highlight-message-add-buttons-to-header): Bind `case-fold-search' to t. 2000-08-28 Daiki Ueno * wl-xmas.el (wl-message-overload-functions): Initialize `wl-message-button-map'. * wl-mule.el (wl-message-overload-functions): Initialize `wl-message-button-map'. * wl-vars.el (wl-highlight-message-header-button-alist): New. * wl-message.el (wl-message-button-map): New keymap. (wl-message-add-button): New function. (wl-message-button-dispatcher): New function. (wl-message-button-refer-article): New function. * wl-highlight.el (wl-highlight-message-add-buttons-to-header): New function. (wl-highlight-headers): Use it. 2000-08-28 Daiki Ueno * wl-summary.el (wl-summary-default-from): Use `wl-address-get-petname-1'. (wl-summary-simple-from): Ditto. * wl-address.el (wl-address-get-petname-1): New inline function. (wl-address-get-petname): Use it. 2000-08-27 Daiki Ueno * wl-summary.el (wl-summary-default-from): Return full-name part from the address if no petname was found. (wl-summary-simple-from): Ditto. * wl-address.el (wl-address-get-petname): Return nil if no petname associated with the address was found. 2000-08-23 Masahiro MURATA * wl-folder.el (wl-folder-open-all): Remove progress gauge when display is finished. 2000-08-23 TAKAHASHI Kaoru * wl-folder.el (wl-folder-confirm-existence): Fixed typo in `elmo-folder-exists-p' argument. 2000-08-23 Daiki Ueno * wl-folder.el (wl-folder-confirm-existence): Check existence of the folder. 2000-08-23 Yuuichi Teranishi * wl-summary.el (wl-summary-msgdb-load-async): Rewrite. * wl-draft.el (wl-draft-send-mail-with-pop-before-smtp): Use `elmo-pop3-get-session' instead of `elmo-pop3-get-connection'. 2000-08-22 Daiki Ueno * wl-folder.el (wl-folder-create-subr): New function. (wl-folder-confirm-existence): Use it. (wl-folder-check-one-entity): Use it. Check the error symbol is derived from 'elmo-open-error. * wl-summary.el (wl-summary-read-folder): Don't pass the argument `ignore-error'. 2000-08-21 TAKAHASHI Kaoru * wl-util.el (toplevel): Add (eval-when-compile (require 'elmo-util)). (Maybe `provide' is typo.) 2000-08-21 Yuuichi Teranishi * wl-util.el (toplevel): Removed (provide 'elmo-util). (I don't know why this was needed.) * wl-summary.el (wl-summary-jump-to-msg-by-message-id-via-nntp): Follow up changes for stream-type. * wl-draft.el (wl-draft-send-mail-with-pop-before-smtp): Ditto. (wl-draft-elmo-nntp-send): Ditto. * wl-vars.el (wl-pop-before-smtp-stream-type): New variable. (wl-nntp-posting-stream-type): Ditto. (wl-pop-before-smtp-ssl): Abolished. (wl-nntp-posting-ssl): Ditto. * wl-address.el (wl-address-quote-specials): New function. (wl-address-make-completion-list): Use `wl-address-quote-specials'. * wl-draft.el (wl-draft-reply): Ditto. 2000-08-16 TAKAHASHI Kaoru * wl-draft.el (wl-user-agent-compose): Add (require 'wl) for use function `wl-string-match-assoc'. 2000-08-10 Yuuichi Teranishi * wl-vars.el (wl-draft-remove-group-list-contents): New user option. * wl-draft.el (wl-draft-deduce-address-list): New function. (wl-draft-parse-mailbox-list): Ditto. (wl-draft-send-mail-with-smtp): Use `wl-draft-deduce-address-list' instead of `smtp-deduce-address-list'. (wl-draft-on-field-p): Follow group list. * wl-address.el (wl-address-concat-token): New function. (wl-address-string-without-group-list-contents): Ditto. (wl-complete-field-body): Fixed problem of completion by japanese petname. (wl-address-make-completion-list): Rewrite. 2000-08-11 Taro Kawagishi * wl-address.el (wl-address-make-completion-list): Completion by petname. (wl-complete-field-body): Likewise. 2000-08-08 Yuuichi Teranishi * wl-draft.el (wl-draft-reply): Fixed problem when to or cc contains invalid address syntax. 2000-07-26 Kenichi OKADA * wl-folder.el (wl-folder-check-entity-async): Use `elmo-nntp-spec-hostname'. 2000-08-02 OKAZAKI Tetsurou * wl-summary.el (wl-summary-msgdb-load-async): Use `elmo-imap4-mailbox' for `elmo-imap4-send-command'. 2000-07-31 Yuuichi Teranishi * wl-draft.el (wl-draft-reply): Set argument `content-transfer-encoding' as nil. 2000-07-26 Takaaki MORIYAMA * wl-refile.el (wl-refile-learn): Move hit element to the top of `wl-refile-alist'. 2000-07-26 Kenichi OKADA * wl-draft.el (wl-draft): Added argument `content-transfer-encoding'. (wl-draft-edit-string): Ditto. (wl-draft-forward): Ditto. * wl-summary.el (wl-summary-write): Ditto. 2000-07-24 Yuuichi Teranishi * wl-summary.el (wl-summary-sync-update3): Call `wl-summary-buffer-number-column-detect'. (wl-summary-buffer-number-column-detect): Search from point-min. 2000-07-19 Yuuichi Teranishi * wl-draft.el (wl-draft-reply): Fixed problem when mail-followup-to contains an address which is not included in original to or cc. 2000-07-19 Kenichi OKADA * wl-summary.el (wl-summary-target-mark-uudecode): Error when begin-line does not exist. * wl-message.el (wl-message-uu-substring): Ditto. 2000-07-18 Yuuichi Teranishi * wl-summary.el (wl-summary-mode): Call `kill-all-local-variables' to clear local variables. (wl-summary-exit): Call `elmo-commit'. (wl-summary-switch-to-clone-buffer): Call `wl-summary-buffer-set-folder' after `wl-summary-mode'. (wl-summary-goto-folder-subr): Ditto. * wl-vars.el (wl-folder-sync-range-alist): Changed default value for POP folder. 2000-07-17 Yuuichi Teranishi * tm-wl.el, wl-address.el, wl-demo.el, wl-dnd.el, wl-draft.el, wl-draft.el.orig, wl-expire.el, wl-fldmgr.el, wl-folder.el, wl-highlight.el, wl-message.el, wl-mime.el, wl-mule.el, wl-nemacs.el, wl-refile.el, wl-refile.el.orig, wl-score.el, wl-summary.el, wl-summary.el.orig, wl-template.el, wl-thread.el, wl-util.el, wl-vars.el, wl-xmas.el, wl.el (toplevel): Deleted time-stamp line. * wl-draft.el (wl-draft-reply): Bind `eword-lexical-analyzer' locally. 2000-07-12 Hironori Fukuchi * wl-summary.el (wl-summary-search-by-subject): Search parent message from the latest one. 2000-07-13 Yuuichi Teranishi * wl-draft.el (wl-draft-reply): Insert address with full-name. (Thanks to MAKINO Takashi ) * wl-vars.el (wl-draft-reply-use-address-with-full-name): New user option. * wl-summary.el (wl-summary-sync-update3): Use `elmo-list-bigger-diff' if elmo-nntp-use-killed-list is nil. Use `elmo-msgdb-append-to-killed-list'. (Append numbers confirmed as disappeared to the killed list.) (wl-summary-confirm-appends): Don't display negative number. 2000-07-07 Kenichi OKADA * wl-summary.el (TopLevel): Define-maybe `ps-print-preprint'. 2000-07-11 Yuuichi Teranishi * wl-summary.el (wl-summary-sync): Call `elmo-clear-killed' when range is `all'. (wl-summary-sync-update3): Use `elmo-list-diff' instead of `elmo-list-bigger-diff'. 2000-07-04 Yuuichi Teranishi * wl-summary.el (wl-summary-buffer-exit-func): New buffer local variable. (wl-summary-exit): Call `wl-summary-buffer-exit-func' if non-nil. 2000-07-10 Katsumi Yamaoka * wl-demo.el (wl-demo): Fix the last change. 2000-07-07 Katsumi Yamaoka * wl-demo.el (wl-demo): Don't use `eval'. 2000-07-07 Kenichi OKADA * wl-summary.el (wl-summary-buffer-thread-modified): New buffer-local variable. (wl-summary-set-thread-modified): New function. (wl-summary-thread-modified-p): New function. (wl-summary-save-status): Use function `wl-summary-thread-modified-p'. (wl-summary-yank-saved-message): Use function `wl-summary-set-thread-modified' (wl-summary-switch-to-clone-buffer): Add `wl-summary-buffer-thread-modified'. * wl-vars.el (wl-summary-buffer-message-saved-hook): New variable. (wl-summary-buffer-mark-saved-hook): Ditto. * wl-summary.el (wl-summary-msgdb-save): New hook `wl-summary-buffer-message-saved-hook' and `wl-summary-buffer-mark-saved-hook'. 2000-07-04 Katsumi Yamaoka * wl-demo.el (wl-demo): Simplified `fringe' face manipulation. 2000-07-04 Katsumi Yamaoka * wl-demo.el (wl-demo): Make `kill-buffer-hook' buffer-local; don't hide scroll bars under FSF Emacsen because it may incur an undesirable redrawing. 2000-07-04 Kenichi OKADA * wl-draft.el (wl-draft-edit-string): Call `wl-draft-reedit-hook' instead of `wl-mail-setup-hook'. 2000-07-03 Katsumi Yamaoka * wl-demo.el (wl-demo): Hide scroll bars, etc. first. 2000-07-01 OKAZAKI Tetsurou * wl-summary.el (wl-summary-msgdb-load-async): Call `elmo-imap4-spec-mailbox' instead of `elmo-imap4-spec-folder'. 2000-06-30 Katsumi Yamaoka * wl-demo.el (wl-demo): Don't show scroll bars, gutter tabs or fringes in demo buffer; center bitmap logo correctly even if old Mule is used. 2000-06-27 MAKINO Takashi * wl.el (wl-save-status): Call `wl-refile-alist-save' without argument. * wl-refile.el (wl-refile-subject-alist): New variable. (wl-refile-subject-alist-file-name): Ditto. (wl-refile-alist-setup): Rewrite. (wl-refile-alist-save): Use `elmo-object-save'. Eliminated arguments. (wl-refile-learn): Check `wl-refile-guess-func-list'. (wl-refile-guess-by-subject): New function. (wl-refile-guess-func-list): Added it. 2000-06-29 Katsumi Yamaoka * wl-demo.el (wl-demo-with-temp-file-buffer): New macro. (wl-logo-bitmap, wl-logo-xbm, wl-logo-xpm): Use it. 2000-06-28 Yuuichi Teranishi * wl-summary.el (wl-summary-buffer-prev-folder-func): New buffer-local variable. (wl-summary-buffer-next-folder-func): Ditto. (wl-summary-down): Call `wl-summary-buffer-next-folder-func' if non-nil. (wl-summary-up): Call `wl-summary-buffer-prev-folder-func' if non-nil. (wl-summary-next): Call `wl-summary-buffer-next-folder-func' if non-nil. (wl-summary-prev): Call `wl-summary-buffer-prev-folder-func' if non-nil. 2000-06-23 Katsumi Yamaoka * wl-demo.el (wl-demo): Don't set the value of `fill-column' permanently in the demo buffer. 2000-06-22 Yuuichi Teranishi * wl-mime.el (wl-summary-burst-subr): Use `mime-entity-body' and `mime-entity-fetch-field'. * wl.el (wl-exit): Delete plugged buffer. * wl-xmas.el (wl-draft-overload-menubar): Override menubar only when XEmacs has menubar feature. 2000-06-19 Katsumi Yamaoka * wl-demo.el (wl-demo): Don't use `end-of-line' with arg 0. It cannot arrive at the beginning of the buffer under old Emacsen. 2000-06-19 Yuuichi Teranishi * wl-address.el (wl-address-ldap-search): Call `ldap-search-entries' with `withdn' argument t. (wl-complete-field-body): Bind completion-ignore-case as t. Clear ldap search hash when it was sole completion. Use elmo-string for pattern string. (wl-ldap-alias-safe-string): Eliminated needless let. 2000-06-16 Shun-ichi GOTO * wl-address.el (wl-ldap-alias-dn-level): New variable. (wl-ldap-alias-sep): New constant. (wl-ldap-search-attribute-type-list): Ditto. (wl-ldap-get-value): New function. (wl-ldap-make-filter): Ditto. (wl-ldap-make-matched-value-list): Ditto. (wl-ldap-alias-safe-string): Ditto. (wl-ldap-register-dn-string): Ditto. (wl-address-ldap-search): Rewrite. 2000-06-17 Masahiro MURATA * wl-thread.el (wl-thread-delete-msgs): Fixed problem when closed thread is deleted. (wl-thread-delete-line-from-buffer): Ditto. (wl-thread-get-exist-children): New function. 2000-06-15 Katsumi Yamaoka * wl-demo.el (wl-demo): Made it to select various image types. (wl-logo-bitmap, wl-logo-xbm, wl-logo-xpm): Renamed and divided from `wl-title-logo'. (wl-logo-ascii): New variable. (TopLevel): Require `wl-highlight'; no need to require `wl-xmas'. (wl-demo-copyright-notice): New constant. * wl-vars.el (wl-demo-display-logo): Made it can be a image type. 2000-06-15 TAKAHASHI Kaoru * wl-vars.el (wl-summary-target-above): Renamed from wl-summary-temp-above. * wl-score.el (wl-score-get-score-alist): Use it. (wl-summary-score-update-all-lines): Use it. * wl-summary.el: Ditto. (make-variable-buffer-local). 2000-06-15 Yuuichi Teranishi * wl-vars.el (wl-ldap-port): New user option. * wl-address.el (wl-address-ldap-search): Renamed from wl-ldap-search. Rewite whole implementation. (wl-complete-field-body): Fixed. 2000-06-14 Yuuichi Teranishi * wl-address.el (wl-ldap-search-internal): Renamed to `wl-ldap-search'. Choose implementation at compile time. 2000-06-13 Takeshi Chiba * wl-address.el (wl-ldap-search-internal): New function. (wl-complete-field-to): Use it. 2000-06-12 Yuuichi Teranishi * wl-address.el (wl-ldap-search): Use `with-temp-buffer'. Use `let' instead of `let*'. Require 'wl-vars. * wl-vars.el (wl-ldap-server): Moved from wl-address.el. Define as defcustom. (wl-ldap-base): Ditto. (wl-use-ldap): Ditto. 2000-06-09 Takeshi Chiba * wl-address.el (wl-ldap-search): New function. (wl-complete-field-body): Use `wl-ldap-search'. (wl-ldap-server): New variable. (wl-ldap-base): Ditto. (wl-use-ldap): Ditto. 2000-06-08 OKAZAKI Tetsurou * wl-score.el (wl-score-guess-like-gnus): Use `elmo-string' (Pointed out by Mito ). * wl-summary.el (wl-summary-redisplay-no-mime): Update buffer-local variables like `wl-summary-redisplay-internal'. (wl-summary-redisplay-all-header): Likewise. Update Summary view too. 2000-06-05 Yuuichi Teranishi * wl-summary.el (wl-summary-jump-to-parent-message): Consider prefix argument. * wl-thread.el (wl-thread-update-line-msgs): Fixed problem when closed thread is deleted. 2000-05-31 Yasushi ABE * wl-summary.el (wl-summary-jump-to-parent-message): Consider thread modification. 2000-06-03 OKAZAKI Tetsurou * wl-message.el (wl-message-normal-get-original-buffer): Use `save-excursion'. * wl-vars.el (wl-smtp-posting-server): Customization Type fix. (wl-summary-showto-folder-regexp): Ditto. 2000-05-31 OKAZAKI Tetsurou * wl-util.el (wl-delete-alist): Doc fix. (wl-delete-associations): New function. (wl-inverse-alist): New function. * wl-summary.el (wl-summary-exec-subr): Rename parameters. Split temporary variables. Use `wl-delete-associations' and `wl-inverse-alist'. (wl-summary-delete-copy-marks-on-buffer): Rename the parameter. 2000-05-30 Yuuichi Teranishi * wl-folder.el (wl-folder-prefetch-entity): Execute prefetching if new count is unknown. 2000-05-27 Masahiro MURATA * wl-vars.el (wl-summary-insert-headers-hook): New variable. * wl-thread.el (wl-thread-cleanup-symbols): If entity is exists, delete entity. (wl-thread-set-parent): If insert as top, set linked as nil. * wl-summary.el (wl-summary-delete-messages-on-buffer): Call `wl-thread-cleanup-symbols' when view mode is thread. 2000-05-26 OKAZAKI Tetsurou * wl-folder.el (wl-folder-create-folder-entity): Use with-current-buffer. (wl-local-folder-init): Call set-buffer to make sure we are in the Folder buffer. Don't touch buffer-local variables here. (wl-folder-mode): Initialize buffer-local variables here. * wl-folder.el (wl-folder-get-path): Use let instead of let*. (wl-folder-entity-assign-id): Ditto. (wl-folder-create-entity-hashtb): Ditto. (wl-local-folder-init): Ditto. (wl-folder-create-group-alist): Initialize `cur-alist' with let. 2000-05-24 TAKAHASHI Kaoru * wl-summary.el (wl-summary-default-from): Fix probrem when std11-extract-address-components return (nil "foo@bar"). 2000-05-24 OKAZAKI Tetsurou * wl-draft.el (wl-draft-clone-local-variables): Remove redundant `setq'. 2000-05-19 Yuuichi Teranishi * wl-draft.el (wl-draft-yank-from-mail-reply-buffer): Bind wl-highlight-x-face-func as nil while highlighting header. 2000-05-21 OKAZAKI Tetsurou * wl-folder.el (wl-folder-buffer-cur-path): Make buffer-local. 2000-05-21 Masahiro MURATA * wl-summary.el (wl-summary-switch-to-clone-buffer): Remove elmo-msgdb-overview-hashtb from copy-variables. (wl-summary-refile-subr): Use `elmo-msgdb-overview-get-entity' instead of `elmo-msgdb-overview-get-entity-by-number'. (wl-summary-auto-refile): Ditto. * wl-thread.el (wl-thread-update-line-on-buffer-sub): Use `elmo-msgdb-overview-get-entity' instead of `elmo-msgdb-search-overview-entity'. Use `elmo-msgdb-overview-get-entity' instead of `elmo-msgdb-overview-get-entity-by-number'. (wl-thread-insert-entity-sub): Ditto. (wl-thread-insert-message): Ditto. * wl-message.el (wl-mmelmo-message-redisplay): Change argument of `elmo-msgdb-overview-get-entity'. (wl-normal-message-redisplay): Ditto. 2000-05-20 Masahiro MURATA * wl-thread.el (wl-thread-cleanup-symbols): Fix delete entity from `wl-thread-entities'. (wl-thread-delete-message): Fix remove top message from `wl-thread-entity-list'. * wl-summary.el (wl-summary-delete-messages-on-buffer): Don't use wl-append(nconc), because update-list is broken on Meadow. * wl-summary.el (wl-summary-insert-thread-entity): Changed delayed updating process. (wl-summary-rescan): Ditto. (wl-summary-sync-update3): Ditto. * wl-thread.el (wl-thread-set-parent): Renamed from `wl-summary-set-parent'. (wl-thread-insert-message): Updating buffer faster. (wl-thread-delete-message): Updating buffer faster. * wl-score.el (wl-summary-score-update-all-lines): Changed interval for display progress gauge. 2000-05-19 TAKAHASHI Kaoru * wl-vars.el (wl-summary-always-sticky-folder-list): `t' means all folder always-sticky. * wl-summary.el (wl-summary-always-sticky-folder-p): defun instead of defmacro. 2000-05-18 Yuuichi Teranishi * wl-vars.el (wl-draft-add-references): New user option. * wl-draft.el (wl-draft-add-references): New function. (wl-draft-yank-from-mail-reply-buffer): Use it. (wl-draft-insert-current-message): Bind `wl-draft-add-references' as nil. 2000-05-12 Masahiro MURATA * wl-thread.el (wl-thread-update-line-msgs): Called `wl-thread-update-line-on-buffer-sub'. (wl-thread-update-line-on-buffer): Delete routine of inserting thread. (wl-thread-update-line-on-buffer-sub): Routine of inserting thread moved from `wl-thread-update-line-on-buffer'. Add threshold for displaying progress gauge. * wl-summary.el (wl-summary-delete-messages-on-buffer): Change argument of `wl-thread-update-line-msgs'. Add threshold for displaying progress gauge. * wl-folder.el: Add threshold for displaying progress gauge. * wl-score.el: Ditto. * wl-expire.el (wl-summary-expire): Display deleting info. 2000-05-12 Yuuichi Teranishi * wl-thread.el (wl-thread-update-line-msgs): Added optional argument `no-msg'. * wl-summary.el (wl-summary-delete-messages-on-buffer): Set no-msg argument of `wl-thread-update-line-msgs'. (wl-summary-set-parent): Added optional argument `parent-number'. (wl-summary-buffer-saved-message): New buffer local variable. (wl-summary-save-current-message): New command. (wl-summary-yank-saved-message): Ditto. (wl-summary-mode-map): Added key binding for `wl-summary-save-current-message' (\ew) and `wl-summary-yank-saved-message' (\C-y). (wl-summary-yank-saved-message): Inhibit setting itself as a parent. 2000-05-11 Yuuichi Teranishi * wl-summary.el (wl-summary-mode-map): Added key binding for `wl-summary-set-parent' (ts). 2000-05-10 Masahiro MURATA * wl-summary.el (wl-summary-insert-thread-entity): Search same subject faster. If thread number is reverse, delayed updating thread. (wl-summary-search-by-subject): Ditto. (wl-summary-put-alike): Ditto. (wl-summary-get-alike): Ditto. (wl-summary-insert-headers): Insert header of all overview in buffer. (wl-summary-rescan): Delayed updating thread. Kill search subject buffer for wl-summary-search-by-subject. (wl-summary-sync-update3): Ditto. (wl-summary-exit): Ditto. (wl-summary-goto-bottom-of-current-thread): Change for linked thread. (wl-summary-overview-create-summary-line): Change line for linked thread. * wl-summary.el (wl-summary-update-thread): Use wl-thread-maybe-get-children-num. (wl-summary-set-parent): If change parent, move sub thread. (wl-summary-redisplay-internal): Add horizontal recenter. (wl-summary-redisplay-no-mime): Add horizontal recenter. * wl-thread.el (wl-thread-entity-get-linked): New function. (wl-thread-entity-set-linked): New function. (wl-thread-create-entity): Add linked element. (wl-thread-entity-insert-as-top): Use wl-append. (wl-thread-maybe-get-children-num): If closing thread, return children msgs. (wl-thread-update-line-msgs): Displaying progress message. (wl-thread-update-line-on-buffer-sub): Use wl-thread-maybe-get-children-num. (wl-thread-update-line-on-buffer): If update line is not exists, insert thread. (wl-thread-delete-message): If delete top msg of thread, search parent by subject. (wl-thread-insert-entity): Use wl-thread-maybe-get-children-num. * wl-highlight.el (wl-highlight-summary-current-line): change sregexp for linked thread. * wl-util.el (wl-count-lines): Count lines. (wl-horizontal-recenter): horizontal recenter. * wl-score.el (wl-score-put-alike): Use wl-count-lines (wl-score-get-alike): Ditto. * wl-vars.el (wl-summary-search-parent-by-subject-regexp): Changed. (wl-subject-length-limit): New variable. (wl-highlight-thread-indent-string-regexp): Changed for linked thread. 2000-05-10 Yuuichi Teranishi * wl-vars.el (wl-summary-search-parent-by-subject-regexp): New variable (revival). * wl-summary.el (wl-summary-insert-thread-entity): Search parent by subject matching if there's no in-reply-to nor references field (revival). 2000-05-10 Yuuichi Teranishi * wl-thread.el (wl-thread-close-all): Fixed typo in display-progress message. 2000-05-09 Yuuichi Teranishi * wl-summary.el (wl-summary-reply): Return t if there was a message at cursor point. Added unwind-protect. (wl-summary-reply-with-citation): Cite only when wl-summary-reply returns t. (wl-summary-cancel-message): Do nothing when there's no message at cursor point. (wl-summary-forward): Ditto. (wl-summary-jump-to-parent-message): Ditto. (wl-summary-reedit): Ditto. (wl-summary-edit-addresses): Ditto. (wl-summary-pipe-message): Ditto. (wl-summary-print-message-with-ps-print): Ditto. (wl-summary-print-message): Ditto. (wl-summary-mark-as-important): Ditto. (wl-summary-mark-as-unread): Ditto. * wl-summary.el (wl-summary-reply): Cause an error when there's no message at cursor point. (wl-summary-reply-with-citation): Remove unwind-protect. * wl-summary.el (wl-summary-insert-thread-entity): Eliminated subject searching feature. * wl-vars.el (wl-summary-search-parent-by-subject-regexp): Eliminated. 2000-04-28 Yuuichi Teranishi * wl-vars.el (wl-summary-search-parent-by-subject-regexp): New variable. * wl-summary.el (wl-summary-insert-thread-entity): Search parent by subject matching if there's no in-reply-to nor references field. * wl-summary.el (wl-summary-set-parent): New command (No key binding). * wl-folder.el (wl-folder-insert-entity): Remove progress gauge when display is finished. (wl-folder-open-all): Ditto. (wl-folder-update-access-group): Ditto. * wl-summary.el (wl-summary-delete-messages-on-buffer): Ditto. * wl-thread.el (wl-thread-close-all): Ditto. * wl-summary.el (wl-summary-delete-messages-on-buffer): Remove progress gauge only when it was displayed. * wl-folder.el (wl-folder-insert-entity): Ditto. 2000-04-26 Yuuichi Teranishi * wl-summary.el (wl-summary-incorporate): Enclose `wl-summary-sync-force-update' with save-excursion. 2000-04-21 Yuuichi Teranishi * wl-summary.el (wl-summary-prefetch-region): Pass current cursor point to `pos-visible-in-window-p' after moving cursor to the started point. 2000-04-20 Katsumi Yamaoka * wl-vars.el (wl-ignored-forwarded-headers): New user option. * wl-draft.el (wl-draft-insert-current-message): Delete useless fields from the forwarding message. (wl-draft-yank-from-mail-reply-buffer): Allow the optional argument `ignored-fields'. 2000-04-20 Yuuichi Teranishi * wl-mime.el (wl-message-request-partial): Eliminated argument `msgdb'. Don't pass `msgdb' argument to `elmo-read-msg-no-cache'. (wl-mime-combine-message/partial-pieces): Likewise. * tm-wl.el (wl-message-request-partial): Likewise. (wl-mime-combine-message/partial-pieces): Likewise. 2000-04-17 Yoshiki Hayashi * wl-summary.el (wl-summary-sync-marks): Remove progress gauge when display is finished. 2000-04-17 HARAGUCHI Shuugou * wl-summary.el (wl-summary-goto-folder-subr): Fix problem when wl-summary-partial-highlight-above-lines is nil. 2000-04-18 Yuuichi Teranishi * wl-summary.el (wl-summary-prefetch-region): Redisplay only when cursor point is visible. 2000-04-15 Yuuichi Teranishi * wl-expire.el (wl-expire-archive-get-max-number): Don't use `file-name-directory'. 2000-04-14 Yuuichi Teranishi * wl-expire.el (wl-expire-archive-get-max-number): Use `file-name-directory'. 2000-04-13 Yuuichi Teranishi * wl-summary.el (wl-summary-sync-marks): Re-display progress only when there is progress. 2000-04-13 Mito * wl-summary.el (wl-summary-sync-marks): Display progress. 2000-04-13 Yuuichi Teranishi * wl-summary.el (wl-summary-move-cached-regex): Eliminated. (wl-summary-prev): Move cursor regardless of unread status. (wl-summary-next): Ditto. 2000-04-10 Yuuichi Teranishi * wl-mime.el (wl-summary-burst-subr): Renamed from `wl-burst'. Added argument `target' and `number'. * tm-wl.el (wl-summary-burst-subr): New function. (wl-summary-burst): Use it. 2000-04-10 Mito * wl-mime.el (wl-burst): New function. (wl-summary-burst): Use it. 2000-04-07 A. SAGATA * wl-address.el (wl-address-petname-add-or-change): Use e-mail address as petname when there's no candidate. 2000-04-07 Yuuichi Teranishi * wl-vars.el (wl-fldmgr-add-complete-with-current-folder-list): New variable. * wl-fldmgr.el (wl-fldmgr-add): Use it. * wl.el (wl-plugged-init): Flush queues if started with plugged status. * wl-folder.el (wl-folder-flush-queue): Flush operation queue too. 2000-04-05 Yuuichi Teranishi * wl-refile.el (wl-refile-expand-newtext): Add `original' argument. Use substring of `original' instead of buffer-substring. (wl-refile-evaluate-rule): Set `original' argument of wl-refile-expand-newtext. * wl-summary.el (wl-summary-auto-refile-check-refile-rule-alist-subr, wl-summary-auto-refile-check-refile-rule-alist): Eliminated. (wl-summary-auto-refile): Check existence of destination folder just before marking. 2000-04-05 TAKAHASHI Kaoru * wl-refile.el (wl-refile-evaluate-rule): Fixed problem when wl-refile-get-field-value return nil. 2000-04-04 Daiki Ueno * wl-refile.el (wl-refile-expand-newtext): New function imported from Gnus. (wl-refile-evaluate-rule): Use it. 2000-04-04 Yuuichi Teranishi * wl-summary.el (wl-summary-print-destination): Duplicate folder string to avoid putting text-property on original string. * wl-refile.el (wl-refile-get-field-value): New function. (wl-refile-evaluate-rule): New function; Evaluate refile rule recursively. (wl-refile-guess-by-rule): Use wl-refile-evaluate-rule. * wl-summary.el (wl-summary-auto-refile-check-refile-rule-alist-subr): New function; Check existence of a target folder recursively. (wl-summary-auto-refile-check-refile-rule-alist): Use wl-summary-auto-refile-check-refile-rule-alist-subr. 2000-03-30 Yuuichi Teranishi * wl-demo.el (wl-title-logo): Refer wl-icon-dir. * wl-folder.el (wl-create-folder-entity-from-buffer): Fixed problem when '}' character is contained in folder name. * wl-xmas.el (wl-make-modeline): Consider plugged status. 2000-03-29 Daiki Ueno * wl-fldmgr.el (wl-fldmgr-add-completion-hashtb): New variable. (wl-fldmgr-add-completion-all-completions): Use wl-fldmgr-add-completion-hashtb. 2000-03-28 Daiki Ueno * wl-fldmgr.el (wl-fldmgr-add-completion-all-completions, wl-fldmgr-add-completion-subr): New functions. * wl-folder.el (wl-folder-completion-func): New variable. * wl-summary.el (wl-summary-read-folder): Use wl-folder-completion-func. * wl-refile.el: Eliminate throw & catch. * wl.el (wl-plugged-sending-queue-status): Fixed. 2000-03-27 Mikio Nakajima * wl-draft.el (wl-draft): Put category property on mail-header-separator. wanderlust-wanderlust-769699d/wl/wl-acap.el000066400000000000000000000273331406661363500207050ustar00rootroot00000000000000;;; wl-acap.el --- ACAP support for Wanderlust. -*- lexical-binding: t -*- ;; Copyright (C) 2001 Yuuichi Teranishi ;; Author: Yuuichi Teranishi ;; Keywords: mail, net news ;; This file is part of Wanderlust (Yet Another Message Interface on Emacsen). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;;; Code: ;; ;;(cond ;; ((and (not (featurep 'utf-2000)) ;; (module-installed-p 'un-define)) ;; (require 'un-define)) ;; ((and (featurep 'xemacs) ;; (not (featurep 'utf-2000)) ;; (module-installed-p 'xemacs-ucs)) ;; (require 'xemacs-ucs))) (require 'cus-edit) (require 'wl-vars) (require 'wl) (require 'elmo-vars) (require 'acap) (require 'slp) (defconst wl-acap-dataset-class "vendor.wanderlust") (defconst wl-acap-entry-name "settings") (defcustom wl-acap-user (or (getenv "USER") (getenv "LOGNAME") (user-login-name)) "ACAP user." :type 'string :group 'wl) (defcustom wl-acap-server nil "ACAP server. If nil, SLP is used to find ACAP server. If nil and SLP is not available, localhost is assumed." :type 'string :group 'wl) (defcustom wl-acap-port nil "ACAP server port. Only valid when `wl-acap-server' is non-nil. If nil, default acap port is used." :type 'string :group 'wl) (defcustom wl-acap-authenticate-type 'cram-md5 "ACAP authenticate type." :type 'symbol :group 'wl) (defcustom wl-acap-stream-type nil "ACAP stream type." :type 'symbol :group 'wl) (defcustom wl-acap-extra-options nil "Extra options to be saved on ACAP server." :type '(repeat symbol) :group 'wl) (defcustom wl-acap-cache-filename "acap-cache" "ACAP setting cache file." :type 'string :group 'wl) ;; Encoding string as BASE64 is temporal solution. ;; As far as I know, current implementation of ACAP server ;; (cyrus-smlacapd 0.5) does not accept literal argument for STORE. (defvar wl-acap-base64-encode-options '(wl-template-alist wl-draft-config-alist) "Options which should be encoded with base64 to store ACAP server.") (defcustom wl-acap-coding-system 'utf-8 "Coding system for ACAP." :type 'symbol :group 'wl) (defvar wl-acap-original-msgdb-directory nil) (defun wl-acap-exit () "End ACAP session." (when wl-acap-original-msgdb-directory (setq elmo-msgdb-directory wl-acap-original-msgdb-directory))) (defun wl-acap-init () "A candidate for `wl-folder-init-function'." (setq wl-acap-original-msgdb-directory nil) (condition-case err ; catch error and quit. (let ((service (wl-acap-find-acap-service)) proc entries settings type caches msgdb-dir) (if (null (car service)) (if (setq caches (delq nil (mapcar (lambda (dirent) (let ((dir (elmo-localdir-folder-directory-internal (elmo-make-folder dirent)))) (if (file-exists-p (setq dir (expand-file-name wl-acap-cache-filename dir))) dir))) (elmo-folder-list-subfolders (elmo-make-folder (concat "+" (expand-file-name "acap" elmo-msgdb-directory))))))) (if (y-or-n-p "No ACAP service found. Try cache? ") (let (selected rpath alist) (setq alist (mapcar (lambda (dir) (setq rpath (nreverse (split-string dir "/"))) (cons (concat (nth 1 rpath) "@" (nth 2 rpath)) dir)) caches) selected (cdr (assoc (completing-read "Select ACAP cache: " alist nil t) alist)) msgdb-dir (file-name-directory selected) entries (elmo-object-load selected))) (error "No ACAP service found")) (error "No ACAP service found")) (setq proc (acap-open (car service) wl-acap-user (upcase (symbol-name wl-acap-authenticate-type)) (cdr service))) (setq entries (acap-response-entries (acap-search proc (concat "/" wl-acap-dataset-class "/~/") '((RETURN ("*")))))) (when entries (elmo-object-save (expand-file-name (concat "acap/" (car service) "/" wl-acap-user "/" wl-acap-cache-filename) elmo-msgdb-directory) entries))) (while entries (when (string= (acap-response-entry-entry (car entries)) wl-acap-entry-name) (setq settings (car (acap-response-entry-return-data-list (car entries))) entries nil)) (setq entries (cdr entries))) (setq settings (delq 'wl-acap-ignored (mapcar (lambda (x) (let ((sym (wl-acap-symbol (car x)))) (cond ((and sym (eq sym 'wl-folders)) ;; Folders. (setq wl-folder-entity (wl-acap-create-folder-entity (cadr x))) 'wl-acap-ignored) ((and sym (boundp sym)) (setq type (custom-variable-type sym)) (cons sym (when (cadr x) (cond ((or (eq (car type) 'string) (and (eq (car type) 'choice) (memq 'string type))) (if (memq sym wl-acap-base64-encode-options) (wl-acap-base64-decode-string (cadr x)) (decode-coding-string (cadr x) wl-acap-coding-system))) (t (if (cadr x) (read (if (memq sym wl-acap-base64-encode-options) (wl-acap-base64-decode-string (cadr x)) (read (concat "\"" (decode-coding-string (cadr x) wl-acap-coding-system) "\"")))))))))) (t 'wl-acap-ignored)))) settings))) ;; Setup options. (dolist (setting settings) (set (car setting) (cdr setting))) ;; Database directory becomes specific to the ACAP server. (setq wl-acap-original-msgdb-directory elmo-msgdb-directory) (setq elmo-msgdb-directory (or msgdb-dir (expand-file-name (concat "acap/" (car service) "/" wl-acap-user) elmo-msgdb-directory))) (when proc (acap-close proc))) ((error quit) (when wl-acap-original-msgdb-directory (setq elmo-msgdb-directory wl-acap-original-msgdb-directory)) (signal (car err) (cdr err))))) (defun wl-acap-create-folder-entity (string) (with-temp-buffer (message "Initializing folder...") (let (folders entity) (setq string (elmo-base64-decode-string string)) (setq string (decode-coding-string string wl-acap-coding-system)) (insert string) (goto-char (point-min)) (while (and (not (eobp)) (setq entity (wl-create-folder-entity-from-buffer))) (unless (eq entity 'ignore) (wl-append folders (list entity)))) (message "Initializing folder...done") (list wl-folder-desktop-name 'group folders)))) (defun wl-acap-find-acap-service () (or (and wl-acap-server (cons wl-acap-server wl-acap-port)) (with-temp-buffer (message "Searching ACAP server...") (prog1 (let ((response (condition-case nil (slp-findsrvs "acap") (error))) selected) (when response (if (> (length (slp-response-body response)) 1) (progn (setq selected (completing-read "Select ACAP server: " (mapcar (lambda (body) (list (concat (slp-response-srv-url-host body) (when (slp-response-srv-url-port body) (concat ":" (slp-response-srv-url-port body)))))) (slp-response-body response))) response (catch 'done (dolist (entry (slp-response-body response)) (when (string= (concat (slp-response-srv-url-host entry) (when (slp-response-srv-url-port entry) (concat ":" (slp-response-srv-url-port entry)))) selected) (throw 'done entry)))))) (setq response (car (slp-response-body response)))) (cons (slp-response-srv-url-host response) (slp-response-srv-url-port response)))) (message "Searching ACAP server...done"))) (cons "localhost" nil))) (defun wl-acap-name (option) (let ((name (symbol-name option)) prefix) (cond ((string-match "^wl-" name) (setq name (substring name (match-end 0)) prefix "wl")) ((string-match "^elmo-" name) (setq name (substring name (match-end 0)) prefix "elmo"))) (concat wl-acap-dataset-class "." prefix "." (mapconcat 'capitalize (split-string name "-") "")))) (defun wl-acap-symbol (name) (let (case-fold-search li) (when (string-match (concat "^" (regexp-quote wl-acap-dataset-class) "\\.\\([^\\.]+\\)\\.") name) (setq li (list (match-string 1 name)) name (substring name (match-end 0))) (while (string-match "^[A-Z][a-z0-9]*" name) (setq li (cons (match-string 0 name) li)) (setq name (substring name (match-end 0)))) (intern (mapconcat 'downcase (nreverse li) "-"))))) (defun wl-acap-list-options () (nconc (mapcar 'car (append (custom-group-members 'wl-setting nil) (custom-group-members 'elmo-setting nil))) wl-acap-extra-options)) (defun wl-acap-store-folders (proc) (with-temp-buffer (insert-file-contents wl-folders-file) (acap-store proc (list (concat "/" wl-acap-dataset-class "/~/" wl-acap-entry-name) (concat wl-acap-dataset-class ".wl.Folders") (wl-acap-base64-encode-string (buffer-string)))))) (defun wl-acap-base64-encode-string (string) (elmo-base64-encode-string (encode-coding-string string wl-acap-coding-system) 'no-line-break)) (defun wl-acap-base64-decode-string (string) (decode-coding-string (elmo-base64-decode-string string ) wl-acap-coding-system)) (defun wl-acap-store () "Store Wanderlust configuration to the ACAP server." (interactive) (wl-load-profile) (elmo-init) (let ((service (wl-acap-find-acap-service)) proc settings type) (setq proc (acap-open (car service) wl-acap-user (upcase (symbol-name wl-acap-authenticate-type)) (cdr service))) (dolist (option (wl-acap-list-options)) (setq settings (cons (wl-acap-name option) settings) settings (cons (when (symbol-value option) (setq type (custom-variable-type option)) (cond ((or (eq (car type) 'string) (and (eq (car type) 'choice) (memq 'string type))) (if (memq option wl-acap-base64-encode-options) (wl-acap-base64-encode-string (symbol-value option)) (encode-coding-string (symbol-value option) wl-acap-coding-system))) (t (if (memq option wl-acap-base64-encode-options) (wl-acap-base64-encode-string (prin1-to-string (symbol-value option))) (encode-coding-string (prin1-to-string (symbol-value option)) wl-acap-coding-system))))) settings))) (unwind-protect (progn (message "Storing settings...") (acap-store proc (nconc (list (concat "/" wl-acap-dataset-class "/~/" wl-acap-entry-name)) (nreverse settings))) (message "Storing folders...") (wl-acap-store-folders proc) ;;; Does not work correctly?? ;;; (acap-setacl proc (list ;;; (concat ;;; "/" wl-acap-dataset-class "/~/")) ;;; "anyone" "") ; protect. ) (acap-close proc)) (if (called-interactively-p 'interactive) (message "Store completed.")))) (require 'product) (product-provide (provide 'wl-acap) (require 'wl-version)) ;;; wl-acap.el ends here wanderlust-wanderlust-769699d/wl/wl-action.el000066400000000000000000001004021406661363500212430ustar00rootroot00000000000000;;; wl-action.el --- Mark and actions in the Summary mode for Wanderlust. -*- lexical-binding: t -*- ;; Copyright (C) 2003 Yuuichi Teranishi ;; Author: Yuuichi Teranishi ;; Keywords: mail, net news ;; This file is part of Wanderlust (Yet Another Message Interface on Emacsen). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'wl-summary) (require 'cl-lib) (defsubst wl-summary-action-mark (action) (nth 0 action)) (defsubst wl-summary-action-symbol (action) (nth 1 action)) (defsubst wl-summary-action-argument-function (action) (nth 2 action)) (defsubst wl-summary-action-set-function (action) (nth 3 action)) (defsubst wl-summary-action-exec-function (action) (nth 4 action)) (defsubst wl-summary-action-face (action) (nth 5 action)) (defsubst wl-summary-action-docstring (action) (concat (nth 6 action) "\nThis function is defined by `wl-summary-define-mark-action'.")) (defsubst wl-summary-action-unmark-docstring (action) (concat "Unmark `" (wl-summary-action-mark action) "' from the current line." "\nIf NUMBER is non-nil, unmark the summary line specified by NUMBER." "\nThis function is defined by `wl-summary-define-mark-action'.")) ;; Set mark (defun wl-summary-set-mark (&optional set-mark number interactive data) "Set temporary mark SET-MARK on the message with NUMBER. NUMBER is the message number to set the mark on. INTERACTIVE is set as t if it have to run interactively. DATA is passed to the set-action function of the action as an argument. Return number if put mark succeed" (let* ((set-mark (or set-mark (completing-read "Mark: " wl-summary-mark-action-list))) (current (wl-summary-message-number)) (action (assoc set-mark wl-summary-mark-action-list)) visible cur-mark) (when (zerop (elmo-folder-length wl-summary-buffer-elmo-folder)) (error "Set mark failed")) (prog1 (save-excursion ;; Put mark (if number ;; Jump to message if cursor is not on the message. (when (and (setq visible (wl-summary-message-visible-p number)) (not (eq number current))) (wl-summary-jump-to-msg number)) (setq visible t number current)) (setq cur-mark (nth 1 (wl-summary-registered-temp-mark number))) (unless number (error "No message")) (if (wl-summary-reserve-temp-mark-p cur-mark) (when interactive (error "Already marked as `%s'" cur-mark)) (when (and interactive (null data) (wl-summary-action-argument-function action)) (setq data (funcall (wl-summary-action-argument-function action) (wl-summary-action-symbol action) number))) ;; Unset the current mark. (wl-summary-unset-mark number) ;; Set action. (funcall (wl-summary-action-set-function action) number (wl-summary-action-mark action) data) (when visible (wl-summary-put-temp-mark set-mark) (wl-summary-maybe-highlight-current-line) (when data (wl-summary-print-argument number data))) (when (and (eq wl-summary-buffer-view 'thread) interactive) (wl-thread-open-children number)) (set-buffer-modified-p nil) ;; Return value. number)) ;; Move the cursor. (if interactive (if (eq wl-summary-move-direction-downward nil) (wl-summary-prev) (wl-summary-next)))))) (defun wl-summary-register-target-mark (number _mark _data) (or (memq number wl-summary-buffer-target-mark-list) (setq wl-summary-buffer-target-mark-list (cons number wl-summary-buffer-target-mark-list)))) (defun wl-summary-unregister-target-mark (number) (setq wl-summary-buffer-target-mark-list (delq number wl-summary-buffer-target-mark-list))) (defun wl-summary-have-target-mark-p (number) (memq number wl-summary-buffer-target-mark-list)) (defun wl-summary-target-mark-set-action (action) (unless (eq (wl-summary-action-symbol action) 'target-mark) (unless wl-summary-buffer-target-mark-list (error "no target")) (save-excursion (goto-char (point-min)) (let ((numlist wl-summary-buffer-number-list) number mlist data) ;; use firstly marked message. (when (wl-summary-action-argument-function action) (while numlist (if (memq (car numlist) wl-summary-buffer-target-mark-list) (setq number (car numlist) numlist nil)) (setq numlist (cdr numlist))) (wl-summary-jump-to-msg number) (setq data (funcall (wl-summary-action-argument-function action) (wl-summary-action-symbol action) number))) (while (not (eobp)) (when (string= (wl-summary-temp-mark) "*") (let (wl-summary-buffer-disp-msg) (when (setq number (wl-summary-message-number)) (wl-summary-set-mark (wl-summary-action-mark action) nil nil data) (setq wl-summary-buffer-target-mark-list (delq number wl-summary-buffer-target-mark-list))))) (forward-line)) (setq mlist wl-summary-buffer-target-mark-list) (while mlist (wl-summary-register-temp-mark (car mlist) (wl-summary-action-mark action) data) (setq wl-summary-buffer-target-mark-list (delq (car mlist) wl-summary-buffer-target-mark-list)) (setq mlist (cdr mlist))))))) ;; wl-summary-buffer-temp-mark-list specification ;; ((1 "D" nil)(2 "o" "+fuga")(3 "O" "+hoge")) (defun wl-summary-register-temp-mark (number mark mark-info) (let ((elem (assq number wl-summary-buffer-temp-mark-list))) (setq wl-summary-buffer-temp-mark-list (delq elem wl-summary-buffer-temp-mark-list))) (setq wl-summary-buffer-temp-mark-list (cons (list number mark mark-info) wl-summary-buffer-temp-mark-list))) (defun wl-summary-unregister-temp-mark (number) (let ((elem (assq number wl-summary-buffer-temp-mark-list))) (setq wl-summary-buffer-temp-mark-list (delq elem wl-summary-buffer-temp-mark-list)))) (defun wl-summary-registered-temp-mark (number) (and wl-summary-buffer-temp-mark-list (assq number wl-summary-buffer-temp-mark-list))) (defun wl-summary-collect-temp-mark (mark &optional begin end) (if (or begin end) (save-excursion (save-restriction (let (mark-list) (narrow-to-region (or begin (point-min))(or end (point-max))) (goto-char (point-min)) ;; for thread... (if (eq wl-summary-buffer-view 'thread) (let (number entity mark-info) (while (not (eobp)) (setq number (wl-summary-message-number) entity (wl-thread-get-entity number) mark-info (wl-summary-registered-temp-mark number)) ;; toplevel message mark. (when (string= (nth 1 mark-info) mark) (setq mark-list (cons mark-info mark-list))) ;; When thread is closed...children should also be checked. (unless (wl-thread-entity-get-opened entity) (dolist (msg (wl-thread-get-children-msgs number)) (setq mark-info (wl-summary-registered-temp-mark msg)) (when (string= (nth 1 mark-info) mark) (setq mark-list (cons mark-info mark-list))))) (forward-line))) (let (number mark-info) (while (not (eobp)) (setq number (wl-summary-message-number) mark-info (wl-summary-registered-temp-mark number)) (when (string= (nth 1 mark-info) mark) (setq mark-list (cons mark-info mark-list))) (forward-line)))) mark-list))) (let (mark-list) (dolist (mark-info wl-summary-buffer-temp-mark-list) (when (string= (nth 1 mark-info) mark) (setq mark-list (cons mark-info mark-list)))) mark-list))) ;; Unset mark (defun wl-summary-unset-mark (&optional number _interactive force) "Unset temporary mark of the message with NUMBER. NUMBER is the message number to unset the mark. If not specified, the message on the cursor position is treated. Optional INTERACTIVE is non-nil when it should be called interactively. If optional FORCE is non-nil, remove scored mark too. Return number if put mark succeed" (interactive) (save-excursion (beginning-of-line) (let ((buffer-read-only nil) visible mark action) (if number ;; Jump to message (when (and (setq visible (wl-summary-message-visible-p number)) (not (eq number (wl-summary-message-number)))) (wl-summary-jump-to-msg number)) (setq visible t number (wl-summary-message-number))) (setq mark (wl-summary-temp-mark)) ;; Remove from temporal mark structure. (wl-summary-unregister-target-mark number) (wl-summary-unregister-temp-mark number) ;; Delete mark on buffer. (when visible (unless (string= mark " ") (wl-summary-put-temp-mark (or (unless force (wl-summary-get-score-mark number)) " ")) (setq action (assoc mark wl-summary-mark-action-list)) (wl-summary-maybe-highlight-current-line) (when (wl-summary-action-argument-function action) (wl-summary-remove-argument))) (set-buffer-modified-p nil)))) ;;; Move the cursor. ;;; (if (or interactive (called-interactively-p 'interactive)) ;;; (if (eq wl-summary-move-direction-downward nil) ;;; (wl-summary-prev) ;;; (wl-summary-next)))) ) (defun wl-summary-make-destination-numbers-list (mark-list) (let (dest-numbers dest-number) (dolist (elem mark-list) (setq dest-number (assoc (nth 2 elem) dest-numbers)) (if dest-number (unless (memq (car elem) (cdr dest-number)) (nconc dest-number (list (car elem)))) (setq dest-numbers (nconc dest-numbers (list (list (nth 2 elem) (car elem))))))) dest-numbers)) (defun wl-summary-move-mark-list-messages (mark-list folder-name message) (if (null mark-list) (message "No marks") (save-excursion (let ((start (point)) (refiles (mapcar 'car mark-list)) result) ;; begin refile... (goto-char start) ; avoid moving cursor to ; the bottom line. (elmo-with-progress-display (elmo-folder-move-messages (length refiles)) message (setq result nil) (condition-case nil (setq result (elmo-folder-move-messages wl-summary-buffer-elmo-folder refiles (if (eq folder-name 'null) 'null (wl-folder-get-elmo-folder folder-name)))) (error nil)) (when result ; succeeded. ;; update buffer. (wl-summary-delete-messages-on-buffer refiles) ;; update wl-summary-buffer-temp-mark-list. (dolist (mark-info mark-list) (setq wl-summary-buffer-temp-mark-list (delq mark-info wl-summary-buffer-temp-mark-list))))) (wl-summary-set-message-modified) ;; Return the operation failed message numbers. (if result 0 (length refiles)))))) (defun wl-summary-get-refile-destination-subr (action number learn) (let* ((number (or number (wl-summary-message-number))) (msgid (and number (elmo-message-field wl-summary-buffer-elmo-folder number 'message-id))) (entity (and number (elmo-message-entity wl-summary-buffer-elmo-folder number))) folder tmp-folder) (catch 'done (when (null entity) (message "Cannot decide destination.") (throw 'done nil)) (when (null number) (message "No message.") (throw 'done nil)) (setq folder (wl-summary-read-folder (or (wl-refile-guess entity) wl-trash-folder) (format "for %s " action))) ;; Cache folder hack by okada@opaopa.org (when (and (eq (elmo-folder-type-internal (wl-folder-get-elmo-folder (wl-folder-get-realname folder))) 'cache) (not (string= folder (setq tmp-folder (concat "'cache/" (elmo-cache-get-path-subr (elmo-msgid-to-cache msgid))))))) (setq folder tmp-folder) (message "Force refile to %s." folder)) (if (string= folder (wl-summary-buffer-folder-name)) (error "Same folder")) (if (or (not (elmo-folder-writable-p (wl-folder-get-elmo-folder folder))) (string= folder wl-queue-folder) (string= folder wl-draft-folder)) (error "Don't set as target: %s" folder)) ;; learn for refile. (when learn (wl-refile-learn entity folder)) folder))) ;;; Actions (defun wl-summary-define-mark-action () (interactive) (dolist (action wl-summary-mark-action-list) (fset (intern (format "wl-summary-%s" (wl-summary-action-symbol action))) `(lambda (&optional number data) ,(wl-summary-action-docstring action) (interactive) (wl-summary-set-mark ,(wl-summary-action-mark action) number (called-interactively-p 'interactive) data))) (fset (intern (format "wl-summary-unmark-%s" (wl-summary-action-symbol action))) `(lambda (&optional number) ,(wl-summary-action-unmark-docstring action) (interactive) (wl-summary-unmark number ,(wl-summary-action-mark action)))) (fset (intern (format "wl-summary-%s-region" (wl-summary-action-symbol action))) `(lambda (beg end) ,(wl-summary-action-docstring action) (interactive "r") (save-excursion (goto-char beg) (wl-summary-mark-region-subr (quote ,(intern (format "wl-summary-%s" (wl-summary-action-symbol action)))) beg end (if (quote ,(wl-summary-action-argument-function action)) (funcall (function ,(wl-summary-action-argument-function action)) (quote ,(wl-summary-action-symbol action)) (wl-summary-message-number))))))) (fset (intern (format "wl-summary-target-mark-%s" (wl-summary-action-symbol action))) `(lambda () ,(wl-summary-action-docstring action) (interactive) (wl-summary-target-mark-set-action (quote ,action)))) (fset (intern (format "wl-thread-%s" (wl-summary-action-symbol action))) `(lambda (arg) ,(wl-summary-action-docstring action) (interactive "P") (wl-thread-call-region-func (quote ,(intern (format "wl-summary-%s-region" (wl-summary-action-symbol action)))) arg) (if arg (wl-summary-goto-top-of-current-thread)) (if (not wl-summary-move-direction-downward) (wl-summary-prev) (wl-thread-goto-bottom-of-sub-thread) (if wl-summary-buffer-disp-msg (wl-summary-redisplay))))))) (defun wl-summary-get-dispose-folder (folder) (if (string= folder wl-trash-folder) 'null (let* ((type (or (wl-get-assoc-list-value wl-dispose-folder-alist folder) 'trash))) (cond ((stringp type) type) ((memq type '(remove null)) 'null) (t;; (equal type 'trash) (let ((trash-folder (wl-folder-get-elmo-folder wl-trash-folder))) (unless (elmo-folder-exists-p trash-folder) (if (y-or-n-p (format "Trash Folder %s does not exist, create it? " wl-trash-folder)) (elmo-folder-create trash-folder) (error "Trash Folder is not created")))) wl-trash-folder))))) ;; Dispose action. (defun wl-summary-exec-action-dispose (mark-list) (wl-summary-move-mark-list-messages mark-list (wl-summary-get-dispose-folder (wl-summary-buffer-folder-name)) "Disposing messages")) ;; Delete action. (defun wl-summary-exec-action-delete (mark-list) (wl-summary-move-mark-list-messages mark-list 'null "Deleting messages")) ;; Refile action (defun wl-summary-set-action-refile (number mark data) (when (null data) (error "Destination folder is empty")) (wl-summary-register-temp-mark number mark data) (setq wl-summary-buffer-prev-refile-destination data)) (defun wl-summary-get-refile-destination (action number) "Decide refile destination." (wl-summary-get-refile-destination-subr action number t)) (defun wl-summary-exec-action-refile (mark-list) (save-excursion (let ((start (point)) (failures 0) dst-msgs) ;; begin refile... (setq dst-msgs (wl-summary-make-destination-numbers-list mark-list)) (goto-char start) ; avoid moving cursor to the bottom line. (elmo-with-progress-display (elmo-folder-move-messages (length mark-list)) "Refiling messages" (dolist (pair dst-msgs) (if (condition-case nil (elmo-folder-move-messages wl-summary-buffer-elmo-folder (cdr pair) (wl-folder-get-elmo-folder (car pair))) (error nil)) (progn ;; update buffer. (wl-summary-delete-messages-on-buffer (cdr pair)) (setq wl-summary-buffer-temp-mark-list (wl-delete-associations (cdr pair) wl-summary-buffer-temp-mark-list))) (setq failures (+ failures (length (cdr pair))))))) failures))) ;; Copy action (defun wl-summary-get-copy-destination (action number) (wl-summary-get-refile-destination-subr action number nil)) (defun wl-summary-exec-action-copy (mark-list) (save-excursion (let ((start (point)) (failures 0) dst-msgs) ;; begin refile... (setq dst-msgs (wl-summary-make-destination-numbers-list mark-list)) (goto-char start) ; avoid moving cursor to the bottom line. (elmo-with-progress-display (elmo-folder-move-messages (length mark-list)) "Copying messages" (dolist (pair dst-msgs) (if (condition-case nil (elmo-folder-move-messages wl-summary-buffer-elmo-folder (cdr pair) (wl-folder-get-elmo-folder (car pair)) 'no-delete) (error nil)) (progn ;; update buffer. (wl-summary-delete-copy-marks-on-buffer (cdr pair)) (setq wl-summary-buffer-temp-mark-list (wl-delete-associations (cdr pair) wl-summary-buffer-temp-mark-list))) (setq failures (+ failures (length (cdr pair))))))) failures))) ;; Prefetch. (defun wl-summary-exec-action-prefetch (mark-list) (save-excursion (let* ((count 0) (length (length mark-list)) (mark-list-copy (copy-sequence mark-list)) (failures 0)) (dolist (mark-info mark-list-copy) (message "Prefetching...(%d/%d)" (setq count (+ 1 count)) length) (if (wl-summary-prefetch-msg (car mark-info)) (progn (wl-summary-unset-mark (car mark-info)) (sit-for 0)) (cl-incf failures))) (message "Prefetching...done") 0))) ;; Resend. (defun wl-summary-get-resend-address (_action _number) "Decide resend address." (wl-address-read-from-minibuffer "Resend message to: ")) (defun wl-summary-exec-action-resend (mark-list) (let ((failure 0)) (dolist (mark-info mark-list) (if (condition-case nil (progn (wl-summary-exec-action-resend-subr (car mark-info) (nth 2 mark-info)) t) (error)) (wl-summary-unmark (car mark-info)) (cl-incf failure))) failure)) (defun wl-summary-exec-action-resend-subr (number address) "Resend the message with NUMBER to ADDRESS." (message "Resending message to %s..." address) (let ((folder wl-summary-buffer-elmo-folder)) (with-current-buffer (get-buffer-create " *wl-draft-resend*") ;; We first set up a normal mail buffer. (set-buffer-multibyte nil) (erase-buffer) (setq wl-sent-message-via nil) ;; Insert our usual headers. (wl-draft-insert-from-field) (wl-draft-insert-date-field) (insert "To: " address "\n") (goto-char (point-min)) ;; Rename them all to "Resent-*". (while (re-search-forward "^[A-Za-z]" nil t) (backward-char) (insert "Resent-")) (widen) (forward-line) (delete-region (point) (point-max)) (let ((beg (point))) ;; Insert the message to be resent. (insert ;; elmo-message-fetch is erase current buffer before fetch message (elmo-message-fetch-string folder number (if wl-summary-resend-use-cache (elmo-make-fetch-strategy 'entire 'maybe nil (elmo-file-cache-get-path (elmo-message-field folder number 'message-id))) (elmo-make-fetch-strategy 'entire)) 'unread)) (goto-char (point-min)) (search-forward "\n\n") (backward-char) (save-restriction (narrow-to-region beg (point)) (wl-draft-delete-fields wl-ignored-resent-headers) (goto-char (point-max))) (insert mail-header-separator) ;; Rename all old ("Previous-")Resent headers. (while (re-search-backward "^\\(Previous-\\)*Resent-" beg t) (beginning-of-line) (insert "Previous-")) ;; Quote any "From " lines at the beginning. (goto-char beg) (when (looking-at "From ") (replace-match "X-From-Line: "))) (run-hooks 'wl-summary-resend-hook) ;; Send it. (wl-draft-dispatch-message) (kill-buffer (current-buffer))) (message "Resending message to %s...done" address))) ;;; (defun wl-summary-remove-argument () (save-excursion (let ((inhibit-read-only t) (buffer-read-only nil) (buf (current-buffer)) sol eol rs re) (setq sol (point-at-bol)) (beginning-of-line) (search-forward "\r") (backward-char) (setq eol (point)) (setq rs (next-single-property-change sol 'wl-summary-action-argument buf eol)) (setq re (next-single-property-change rs 'wl-summary-action-argument buf eol)) (put-text-property rs re 'wl-summary-action-argument nil) (put-text-property rs re 'invisible nil) (goto-char re) (delete-char (- eol re))))) (defun wl-summary-collect-numbers-region (begin end) "Return a list of message number in the region specified by BEGIN and END." (save-excursion (save-restriction (let (numbers) (wl-summary-narrow-to-region (or begin (point-min))(or end (point-max))) (goto-char (point-min)) ;; for thread... (if (eq wl-summary-buffer-view 'thread) (let (number entity) (while (not (eobp)) (setq numbers (cons (setq number (wl-summary-message-number)) numbers) entity (wl-thread-get-entity number)) ;; When thread is closed...children should also be checked. (unless (wl-thread-entity-get-opened entity) (dolist (msg (wl-thread-get-children-msgs number)) (setq numbers (cons msg numbers)))) (forward-line))) (while (not (eobp)) (setq numbers (cons (wl-summary-message-number) numbers)) (forward-line))) (nreverse (delq nil numbers)))))) (defun wl-summary-exec (&optional numbers) (interactive) (let ((failures 0) collected pair action modified) (dolist (action wl-summary-mark-action-list) (setq collected (cons (cons (wl-summary-action-mark action) nil) collected))) (dolist (mark-info wl-summary-buffer-temp-mark-list) (setq pair (when (or (null numbers) (memq (nth 0 mark-info) numbers)) (assoc (nth 1 mark-info) collected))) (if pair (setcdr pair (cons mark-info (cdr pair))))) ;; collected is a pair of ;; mark-string and a list of mark-info (dolist (pair collected) (when (cdr pair) (setq action (assoc (car pair) wl-summary-mark-action-list)) (when (wl-summary-action-exec-function action) (setq modified t) (setq failures (+ failures (funcall (wl-summary-action-exec-function action) (cdr pair))))))) (when modified (wl-summary-set-message-modified)) (run-hooks 'wl-summary-exec-hook) ;; message buffer is not up-to-date (unless (and wl-message-buffer (eq (wl-summary-message-number) (with-current-buffer wl-message-buffer wl-message-buffer-cur-number))) (wl-summary-toggle-disp-msg 'off) (setq wl-message-buffer nil)) (set-buffer-modified-p nil) (when (> failures 0) (message "%d execution(s) were failed" failures)))) (defun wl-summary-exec-region (beg end) (interactive "r") (wl-summary-exec (wl-summary-collect-numbers-region beg end))) (defun wl-summary-read-folder (default &optional purpose ignore-error no-create init) (let ((fld (completing-read (format "Folder name %s(%s): " (or purpose "") default) 'wl-folder-complete-folder nil nil (or init wl-default-spec) 'wl-read-folder-history default))) (when (string= fld wl-default-spec) (setq fld default)) (setq fld (substring-no-properties (wl-folder-get-realname fld))) (if (string-match "\n" fld) (error "Not supported folder name: %s" fld)) (unless no-create (if ignore-error (condition-case nil (wl-folder-confirm-existence (wl-folder-get-elmo-folder fld)) (error)) (wl-folder-confirm-existence (wl-folder-get-elmo-folder fld)))) fld)) (defun wl-summary-print-argument (_msg-num data) "Print action argument on line." (when data (wl-summary-remove-argument) (save-excursion (let ((inhibit-read-only t) (data (copy-sequence data)) (buffer-read-only nil) len rs re) (setq len (string-width data)) (if (< len 1) () ;;(end-of-line) (beginning-of-line) (search-forward "\r") (backward-char) (setq re (point)) (let ((width (cond (wl-summary-width (1- wl-summary-width)) (wl-summary-print-argument-within-window (1- (window-width))))) (c (current-column)) (padding 0)) (if (and width (> (+ c len) width)) (progn (move-to-column width) (setq c (current-column)) (while (> (+ c len) width) (backward-char) (setq c (current-column))) (when (< (+ c len) width) (setq data (concat " " data))) (setq rs (point)) (put-text-property rs re 'invisible t)) (when (and width (> (setq padding (- width len c)) 0)) (setq data (concat (make-string padding (string-to-char " ")) data))) (setq rs (1- re)))) (put-text-property rs re 'wl-summary-action-argument t) (goto-char re) (wl-highlight-action-argument-string data) (insert data) (set-buffer-modified-p nil)))))) (defsubst wl-summary-reserve-temp-mark-p (mark) "Return t if temporal MARK should be reserved." (member mark wl-summary-reserve-mark-list)) ;; Refile prev destination (defun wl-summary-refile-prev-destination () "Refile message to previously refiled destination." (interactive) (funcall (symbol-function 'wl-summary-refile) (wl-summary-message-number) wl-summary-buffer-prev-refile-destination) (if (and (called-interactively-p 'interactive) (eq wl-summary-move-direction-downward nil)) (wl-summary-prev) (wl-summary-next))) (defun wl-summary-refile-prev-destination-region (beg end) "Refile messages in the region to previously refiled destination." (interactive "r") (wl-summary-mark-region-subr 'wl-summary-refile beg end wl-summary-buffer-prev-refile-destination)) (defun wl-thread-refile-prev-destination (arg) "Refile messages in the thread to previously refiled destination." (interactive "P") (wl-thread-call-region-func 'wl-summary-refile-prev-destination-region arg)) (defun wl-summary-target-mark-refile-prev-destination () "Refile messages with target mark to previously refiled destination." (interactive) (let ((elem wl-summary-mark-action-list) action) (while elem (when (eq (wl-summary-action-symbol (car elem)) 'refile) (setq action (car elem)) (setq elem nil)) (setq elem (cdr elem))) (wl-summary-target-mark-set-action (list (car action) 'refile-prev-destination (lambda (&rest _args) wl-summary-buffer-prev-refile-destination) (nth 2 action) (nth 3 action) (nth 4 action) (nth 6 action))))) (defsubst wl-summary-no-auto-refile-message-p (number) (member (wl-summary-message-mark wl-summary-buffer-elmo-folder number) wl-summary-auto-refile-skip-marks)) (defvar wl-auto-refile-guess-functions '(wl-refile-guess-by-rule) "*List of functions which is used for guessing refile destination folder.") (defun wl-summary-auto-refile (&optional open-all) "Set refile mark automatically according to 'wl-refile-guess-by-rule'." (interactive "P") (message "Marking...") (save-excursion (if (and (eq wl-summary-buffer-view 'thread) open-all) (wl-thread-open-all)) (let* ((spec (wl-summary-buffer-folder-name)) checked-dsts (count 0) number dst thr-entity) (goto-char (point-min)) (while (not (eobp)) (setq number (wl-summary-message-number)) (dolist (number (cons number (and (eq wl-summary-buffer-view 'thread) ;; process invisible children. (not (wl-thread-entity-get-opened (setq thr-entity (wl-thread-get-entity number)))) (wl-thread-entity-get-descendant thr-entity)))) (when (and (not (wl-summary-no-auto-refile-message-p number)) (not (wl-summary-reserve-temp-mark-p (nth 1 (wl-summary-registered-temp-mark number)))) (setq dst (wl-folder-get-realname (wl-refile-guess (elmo-message-entity wl-summary-buffer-elmo-folder number) wl-auto-refile-guess-functions))) (not (equal dst spec)) (let ((pair (assoc dst checked-dsts)) ret) (if pair (cdr pair) (setq ret (condition-case nil (progn (wl-folder-confirm-existence (wl-folder-get-elmo-folder dst)) t) (error))) (setq checked-dsts (cons (cons dst ret) checked-dsts)) ret))) (if (funcall (symbol-function 'wl-summary-refile) number dst) (cl-incf count)) (message "Marking...%d message(s)." count))) (forward-line)) (if (zerop count) (message "No message was marked.") (message "Marked %d message(s)." count))))) (defun wl-summary-unmark (&optional number mark) "Unmark temporary marks of the current line. If NUMBER is non-nil, remove the mark of the summary line specified by NUMBER. If MARK is non-nil, remove only the specified MARK from the summary line." (interactive) (if (or (null mark) (string= mark (wl-summary-temp-mark number))) (wl-summary-unset-mark number (called-interactively-p 'interactive)))) (defun wl-summary-unmark-region (beg end) (interactive "r") (save-excursion (save-restriction (wl-summary-narrow-to-region beg end) (goto-char (point-min)) (if (eq wl-summary-buffer-view 'thread) (progn (while (not (eobp)) (let* ((number (wl-summary-message-number)) (entity (wl-thread-get-entity number))) (if (wl-thread-entity-get-opened entity) ;; opened...unmark line. (wl-summary-unmark) ;; closed (wl-summary-delete-marks-on-buffer (wl-thread-get-children-msgs number)))) (forward-line))) (while (not (eobp)) (wl-summary-unmark) (forward-line)))))) (defun wl-summary-mark-region-subr (function beg end data) (save-excursion (save-restriction (wl-summary-narrow-to-region beg end) (goto-char (point-min)) (if (eq wl-summary-buffer-view 'thread) (progn (while (not (eobp)) (let* ((number (wl-summary-message-number)) (entity (wl-thread-get-entity number)) (wl-summary-move-direction-downward t) children) (if (wl-thread-entity-get-opened entity) ;; opened...delete line. (funcall function nil data) ;; closed (setq children (wl-thread-get-children-msgs number)) (while children (funcall function (pop children) data))) (forward-line)))) (while (not (eobp)) (funcall function nil data) (forward-line)))))) (declare-function ;; Defined by wl-summary-define-mark-action function. wl-summary-target-mark-region "wl-action.el" (beg end)) (defun wl-summary-target-mark-all () (interactive) (wl-summary-target-mark-region (point-min) (point-max))) (defun wl-summary-delete-all-mark (mark) (goto-char (point-min)) (while (not (eobp)) (wl-summary-unmark nil mark) (forward-line)) (if (string= mark "*") (setq wl-summary-buffer-target-mark-list nil) (let (deleted) (dolist (mark-info wl-summary-buffer-temp-mark-list) (when (string= (nth 1 mark-info) mark) (setq deleted (cons mark-info deleted)))) (dolist (delete deleted) (setq wl-summary-buffer-temp-mark-list (delq delete wl-summary-buffer-temp-mark-list)))))) (defun wl-summary-unmark-all () "Unmark all according to what you input." (interactive) (let ((unmarks (string-to-list (read-from-minibuffer "Unmark: "))) cur-mark) (save-excursion (while unmarks (setq cur-mark (char-to-string (car unmarks))) (wl-summary-delete-all-mark cur-mark) (setq unmarks (cdr unmarks)))))) (defun wl-summary-target-mark-thread () (interactive) (wl-thread-call-region-func 'wl-summary-target-mark-region t)) (require 'product) (product-provide (provide 'wl-action) (require 'wl-version)) ;;; wl-action.el ends here wanderlust-wanderlust-769699d/wl/wl-address.el000066400000000000000000000625431406661363500214300ustar00rootroot00000000000000;;; wl-address.el --- Tiny address management for Wanderlust. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Copyright (C) 1998,1999,2000 Shun-ichi GOTO ;; Copyright (C) 1998,1999,2000 Takeshi Chiba ;; Author: Yuuichi Teranishi ;; Shun-ichi GOTO ;; Takeshi Chiba ;; Keywords: mail, net news ;; This file is part of Wanderlust (Yet Another Message Interface on Emacsen). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'wl-util) (require 'wl-vars) (require 'std11) (defvar wl-address-complete-header-list '("To:" "From:" "Cc:" "Bcc:" "Mail-Followup-To:" "Reply-To:" "Return-Receipt-To:")) (defvar wl-address-complete-header-regexp nil) ; auto-generated. (defvar wl-newsgroups-complete-header-regexp "^\\(Newsgroups\\|Followup-To\\):") (defvar wl-folder-complete-header-regexp "^\\(Fcc\\):") (defvar wl-address-list nil) (defvar wl-address-completion-list nil) (defvar wl-address-petname-hash nil) (defvar wl-address-enable-strict-loading t) (defvar wl-address-ldap-search-hash nil) (eval-when-compile (require 'pldap)) (defvar wl-ldap-alias-dn-level nil "Level of dn data to make alias postfix. Valid value is nit, t, 1 or larget integer. If this value nil, minimum alias postfix is made depends on uniqness with other candidates. In this implementation, it's same to 1. If t, always append all dn data. If number, always append spcified level of data but maybe appended more uniqness. If invalid value, treat as nil. For example, following dn data is exsist, alias of each level is shown bellow. Match: Goto dn: CN=Shun-ichi GOTO,OU=Mew,OU=Emacs,OU=Lisper,O=Programmers Inc. nil => Goto/Shun-ichi_GOTO 1 => Goto/Shun-ichi_GOTO 2 => Goto/Shun-ichi_GOTO/Mew 3 => Goto/Shun-ichi_GOTO/Mew/Emacs 4 => Goto/Shun-ichi_GOTO/Mew/Emacs/Lisper 5 => Goto/Shun-ichi_GOTO/Mew/Emacs/Lisper/Programmers_Inc_ 6 => Goto/Shun-ichi_GOTO/Mew/Emacs/Lisper/Programmers_Inc_ t => Goto/Shun-ichi_GOTO/Mew/Emacs/Lisper/Programmers_Inc_ If level 3 is required for uniqness with other candidates, nil => Goto/Shun-ichi_GOTO/Mew/Emacs ... appended more 1 => Goto/Shun-ichi_GOTO/Mew/Emacs ... appended more 2 => Goto/Shun-ichi_GOTO/Mew/Emacs ... appended more 3 => Goto/Shun-ichi_GOTO/Mew/Emacs 4 => Goto/Shun-ichi_GOTO/Mew/Emacs/Lisper (so on...)") (defconst wl-ldap-alias-sep "/") (defconst wl-ldap-search-attribute-type-list '("sn" "cn" "mail" "email")) (defun wl-ldap-get-value (type entry) "" (let* ((values (cdr (assoc type entry))) (ret (car values))) (if (and ret (not ldap-ignore-attribute-codings)) (while values (if (not (string-match "^[\000-\177]*$" (car values))) (setq ret (car values) values nil) (setq values (cdr values))))) ret)) (defun wl-ldap-get-value-list (type entry) "" (cdr (assoc type entry))) (defun wl-ldap-make-filter (pat type-list) "Make RFC1558 quiery filter for PAT from ATTR-LIST. Each are \"OR\" combination, and PAT is beginning-match." (concat "(|" (mapconcat (lambda (x) (format "(%s=%s*)" x pat)) ; fixed format type-list "") ")")) (defun wl-ldap-make-matched-value-list (regexp type-list entry) "Correct matching WORD with value of TYPE-LIST in ENTRY. Returns matched uniq string list." (let (type val values result) ;; collect matching value (while entry (setq type (car (car entry)) values (mapcar (function wl-ldap-alias-safe-string) (cdr (car entry))) values (elmo-flatten values) entry (cdr entry)) (if (member type type-list) (while values (setq val (car values) values (cdr values)) (if (and (string-match regexp val) (not (member val result))) (setq result (cons val result)))))) result)) (defun wl-ldap-alias-safe-string (str) "Modify STR for alias. Replace space/tab in STR into '_' char. Replace '@' in STR into list of mailbox and sub-domains." (while (string-match "[ \t]+" str) (setq str (concat (substring str 0 (match-beginning 0)) "_" (substring str (match-end 0))))) (if (string-match "\\(@\\)[^/@]+" str) (setq str (split-string str "[@\\.]"))) str) (defun wl-ldap-register-dn-string (hash dn &optional str dn-list) "" (let (sym dnsym value level) (setq dnsym (intern (upcase dn) hash)) (if (and (null str) (boundp dnsym)) () ; already processed ;; make dn-list in fisrt time (if (null dn-list) (let ((case-fold-search t)) (setq dn-list (mapcar (lambda (str) (if (string-match "[a-z]+=\\(.*\\)" str) (wl-ldap-alias-safe-string (match-string 1 str)))) (split-string dn "[ \t]*,[ \t]*"))))) (setq dn-list (elmo-flatten dn-list)) ;; prepare candidate for uniq str (if str (setq str (concat str wl-ldap-alias-sep (car dn-list)) dn-list (cdr dn-list)) ;; first entry, pre-build with given level (cond ((null wl-ldap-alias-dn-level) (setq level 1)) ((eq t wl-ldap-alias-dn-level) (setq level 1000)) ; xxx, big enough ((numberp wl-ldap-alias-dn-level) (if (< 0 wl-ldap-alias-dn-level) (setq level wl-ldap-alias-dn-level) (setq level 1))) (t (setq level 1))) (while (and (< 0 level) dn-list) (if (null str) (setq str (car dn-list)) (setq str (concat str wl-ldap-alias-sep (car dn-list)))) (setq level (1- level) dn-list (cdr dn-list)))) (setq sym (intern (upcase str) hash)) (if (not (boundp sym)) ;; good (progn (set sym (list dn str dn-list)) (set dnsym str)) ;; conflict (if (not (eq (setq value (symbol-value sym)) t)) ;; move away deeper (progn (set sym t) (apply (function wl-ldap-register-dn-string) hash value))) (wl-ldap-register-dn-string hash dn str dn-list))))) (declare-function ldap-search-entries "pldap" (filter &optional host attributes attrsonly withdn)) (defun wl-address-ldap-search (pattern cl) "Make address completion-list matched for PATTERN by LDAP search. Matched address lists are append to CL." (require 'pldap) (unless wl-address-ldap-search-hash (setq wl-address-ldap-search-hash (elmo-make-hash 7))) (let ((pat (if (string-match wl-ldap-alias-sep pattern) (substring pattern 0 (match-beginning 0)) pattern)) (ldap-default-host (or wl-ldap-server ldap-default-host "localhost")) (ldap-default-port (or wl-ldap-port ldap-default-port 389)) (ldap-default-base (or wl-ldap-base ldap-default-base)) (dnhash (elmo-make-hash)) cache len sym tmpl regexp entries ent values dn dnstr alias result cn mails) ;; check cache (mapatoms (lambda (atom) (if (and (string-match (concat "^" (symbol-name atom) ".*") pat) (or (null cache) (< (car cache) (setq len (length (symbol-name atom)))))) (setq cache (cons (or len (length (symbol-name atom))) (symbol-value atom))))) wl-address-ldap-search-hash) ;; get matched entries (if cache (setq entries (cdr cache)) (ignore-errors (message "Searching in LDAP...") (setq entries (ldap-search-entries (wl-ldap-make-filter pat wl-ldap-search-attribute-type-list) nil wl-ldap-search-attribute-type-list nil t)) (message "Searching in LDAP...done") (elmo-set-hash-val pattern entries wl-address-ldap-search-hash))) ;; (setq tmpl entries) (while tmpl (wl-ldap-register-dn-string dnhash (car (car tmpl))) ; car is 'dn'. (setq tmpl (cdr tmpl))) ;; (setq regexp (concat "^" pat)) (while entries (setq ent (cdar entries) values (wl-ldap-make-matched-value-list regexp wl-ldap-search-attribute-type-list ent) mails (or (wl-ldap-get-value-list "mail" ent) (wl-ldap-get-value-list "email" ent)) cn (wl-ldap-get-value "cn" ent) dn (car (car entries)) dnstr (elmo-get-hash-val (upcase dn) dnhash)) ;; make alias list generated from LDAP data. (while (and mails values) ;; make alias like MATCHED/DN-STRING (if (not (string-match (concat "^" (regexp-quote (car values))) dnstr)) (setq alias (concat (car values) wl-ldap-alias-sep dnstr)) ;; use DN-STRING if DN-STRING begin with MATCHED (setq alias dnstr)) ;; check uniqness then add to list (setq sym (intern (downcase alias) dnhash)) (when (not (boundp sym)) (set sym alias) (setq result (cons (cons alias (concat cn " <" (car mails) ">")) result))) (setq values (cdr values))) ;; make mail addrses list (while mails (if (null (assoc (car mails) cl)); Not already in cl. ;;; (string-match regexp (car mails)) ;; add mail address itself to completion list (setq result (cons (cons (car mails) (concat cn " <" (car mails) ">")) result))) (setq mails (cdr mails))) (setq entries (cdr entries))) (append result cl))) (defun wl-complete-address (string predicate flag) "Completion function for completing-read (comma separated addresses)." (if (string-match "^\\(.*,\\)\\(.*\\)$" string) (let* ((str1 (match-string 1 string)) (str2 (match-string 2 string)) (str2-comp (wl-complete-address str2 predicate flag))) (if (and (not flag) (stringp str2-comp)) (concat str1 str2-comp) str2-comp)) (if (not flag) (try-completion string wl-address-list) (all-completions string wl-address-list)))) (defalias 'wl-address-quote-specials 'elmo-address-quote-specials) (make-obsolete 'wl-address-quote-specials 'elmo-address-quote-specials "20 Sep 2001") (defun wl-address-make-completion-list (address-list) (let (addr-tuple cl) (while address-list (setq addr-tuple (car address-list)) (setq cl (cons (wl-address-make-completion-entry 0 addr-tuple) cl)) ;; nickname completion. (if wl-address-enable-strict-loading (unless (or (equal (nth 1 addr-tuple) (nth 0 addr-tuple)) ;; already exists (assoc (nth 1 addr-tuple) cl)) (setq cl (cons (wl-address-make-completion-entry 1 addr-tuple) cl))) (setq cl (cons (wl-address-make-completion-entry 1 addr-tuple) cl))) (setq address-list (cdr address-list))) cl)) (defun wl-address-make-completion-entry (index addr-tuple) (cons (nth index addr-tuple) (if (or (string= (nth 2 addr-tuple) "") (string-match ".*:.*;$" (nth 0 addr-tuple))) (nth 0 addr-tuple) (concat (elmo-address-quote-specials (nth 2 addr-tuple)) " <"(nth 0 addr-tuple)">")))) (defun wl-complete-field-body-or-tab () (interactive) (let ((case-fold-search t) epand-char skip-chars (use-ldap nil) completion-list) (if (wl-draft-on-field-p) (wl-complete-field) (if (and (< (point) (save-excursion (goto-char (point-min)) (search-forward (concat "\n" mail-header-separator "\n") nil 0) (point))) (save-excursion (beginning-of-line) (setq use-ldap nil) (while (and (looking-at "^[ \t]") (not (= (point) (point-min)))) (forward-line -1)) (cond ((looking-at wl-address-complete-header-regexp) (setq completion-list wl-address-completion-list) (if wl-use-ldap (setq use-ldap t)) (setq epand-char ?@)) ((looking-at wl-folder-complete-header-regexp) (setq completion-list wl-folder-entity-hashtb) (setq skip-chars "^, ")) ((looking-at wl-newsgroups-complete-header-regexp) (setq completion-list wl-folder-newsgroups-hashtb))))) (wl-complete-field-body completion-list epand-char skip-chars use-ldap) (indent-for-tab-command))))) (defvar wl-completion-buf-name "*Completions*") (defvar wl-complete-candidates nil) (defun wl-complete-window-show (all) (if (and (get-buffer-window wl-completion-buf-name) (equal wl-complete-candidates all)) (let ((win (get-buffer-window wl-completion-buf-name))) (with-current-buffer wl-completion-buf-name (if (pos-visible-in-window-p (point-max) win) (set-window-start win 1) (scroll-other-window)))) (message "Making completion list...") (setq wl-complete-candidates all) (with-output-to-temp-buffer wl-completion-buf-name (display-completion-list all)) (message "Making completion list...done"))) (defun wl-complete-window-delete () (let (comp-buf comp-win) (when (and (setq comp-buf (get-buffer wl-completion-buf-name)) (setq comp-win (get-buffer-window comp-buf))) (delete-window comp-win)))) (defun wl-complete-field () (interactive) (let* ((end (point)) (start (save-excursion (skip-chars-backward "_a-zA-Z0-9+@%.!\\-") (point))) (completion) (pattern (buffer-substring start end)) (cl wl-draft-field-completion-list)) (if (null cl) nil (setq completion (let ((completion-ignore-case t)) (try-completion pattern cl))) (cond ((eq completion t) (let ((alias (assoc pattern cl))) (if alias (progn (delete-region start end) (insert (cdr alias)) ;;; (wl-highlight-message (point-min)(point-max) t) ))) (wl-complete-window-delete)) ((null completion) (message "Can't find completion for \"%s\"" pattern) (ding)) ((not (string= pattern completion)) (delete-region start end) (insert completion) (wl-complete-window-delete) (wl-highlight-message (point-min)(point-max) t)) (t (let ((list (all-completions pattern cl))) (wl-complete-window-show list))))))) (defun wl-complete-insert (start end pattern completion-list) (let ((alias (and (consp completion-list) (assoc pattern completion-list))) comp-buf comp-win) (if alias (progn (delete-region start end) (insert (cdr alias)) (if (setq comp-buf (get-buffer wl-completion-buf-name)) (if (setq comp-win (get-buffer-window comp-buf)) (delete-window comp-win))))))) (defun wl-complete-field-body (completion-list &optional epand-char skip-chars use-ldap) (interactive) (let* ((end (point)) (start (save-excursion (skip-chars-backward (or skip-chars "^:,>\n")) (skip-chars-forward " \t") (point))) (completion) (pattern (buffer-substring start end)) (len (length pattern)) (completion-ignore-case t) (cl completion-list)) (when use-ldap (setq cl (wl-address-ldap-search pattern cl))) (if (null cl) nil (setq completion (try-completion pattern cl)) (cond ((eq completion t) (if use-ldap (setq wl-address-ldap-search-hash nil)) (wl-complete-insert start end pattern cl) (wl-complete-window-delete) (message "Sole completion")) ((and epand-char (> len 0) (or (char-equal (aref pattern (1- len)) epand-char) (char-equal (aref pattern (1- len)) (string-to-char " "))) (assoc (substring pattern 0 (1- len)) cl)) (wl-complete-insert start end (substring pattern 0 (1- len)) cl)) ((null completion) (message "Can't find completion for \"%s\"" pattern) (ding)) ((not (string= pattern completion)) (delete-region start end) (insert completion)) (t (let ((list (sort (all-completions pattern cl) 'string<))) (wl-complete-window-show list))))))) (defvar wl-address-init-function 'wl-local-address-init) (defun wl-address-init () "Call `wl-address-init-function'." (funcall wl-address-init-function)) (defun wl-local-address-init () "Reload `wl-address-file'. Refresh `wl-address-list', `wl-address-completion-list', and `wl-address-petname-hash'." (message "Updating addresses...") (setq wl-address-list (wl-address-make-address-list wl-address-file)) (setq wl-address-completion-list (wl-address-make-completion-list wl-address-list)) (if (file-readable-p wl-alias-file) (setq wl-address-completion-list (append wl-address-completion-list (wl-address-make-alist-from-alias-file wl-alias-file)))) (setq wl-address-petname-hash (elmo-make-hash)) (let ((addresses wl-address-list)) (while addresses (elmo-set-hash-val (downcase (car (car addresses))) (cadr (car addresses)) wl-address-petname-hash) (setq addresses (cdr addresses)))) (message "Updating addresses...done")) (defun wl-address-expand-aliases (alist nest-count) (when (< nest-count 5) (let (expn-str new-expn-str expn new-expn(n 0) (expanded nil)) (while (setq expn-str (cdr (nth n alist))) (setq new-expn-str nil) (while (string-match "^[ \t]*\\([^,]+\\)" expn-str) (setq expn (match-string 1 expn-str)) (setq expn-str (elmo-string-delete-match expn-str 0)) (if (string-match "^[ \t,]+" expn-str) (setq expn-str (elmo-string-delete-match expn-str 0))) (if (string-match "[ \t,]+$" expn) (setq expn (elmo-string-delete-match expn 0))) (setq new-expn (cdr (assoc expn alist))) (if new-expn (setq expanded t)) (setq new-expn-str (concat new-expn-str (and new-expn-str ", ") (or new-expn expn)))) (when new-expn-str (setcdr (nth n alist) new-expn-str)) (setq n (1+ n))) (and expanded (wl-address-expand-aliases alist (1+ nest-count)))))) (defun wl-address-make-alist-from-alias-file (file) (with-temp-buffer (let ((case-fold-search t) alias expn alist) (insert-file-contents file) (while (re-search-forward ",$" nil t) (end-of-line) (forward-char) (delete-char -1)) (goto-char (point-min)) (while (re-search-forward "^\\([^#;\n][^:]+\\):[ \t]*\\(.*\\)$" nil t) (setq alias (match-string-no-properties 1) expn (match-string-no-properties 2)) (setq alist (cons (cons alias expn) alist))) (wl-address-expand-aliases alist 0) (nreverse alist) ; return value ))) (defun wl-address-make-address-list (path) (when (and path (file-readable-p path)) (with-temp-buffer (let (ret (coding-system-for-read 'undecided)) (insert-file-contents path) (goto-char (point-min)) (while (not (eobp)) (if (looking-at "\ ^\\([^#\n][^ \t\n]+\\)[ \t]+\\(\".*\"\\)[ \t]+\\(\".*\"\\)[ \t]*.*$") (setq ret (cons (list (match-string-no-properties 1) (read (match-string-no-properties 2)) (read (match-string-no-properties 3))) ret))) (forward-line)) (nreverse ret))))) (defsubst wl-address-header-extract-address (str) "Extracts a real e-mail address from STR and return it. e.g. \"Mine Sakurai \" -> \"m-sakura@example.org\". e.g. \"m-sakura@example.org (Mine Sakurai)\" -> \"m-sakura@example.org\"." (cond ((string-match ".*<\\([^>]*\\)>" str) ; .* to extract last <> (match-string 1 str)) ((string-match "\\([^ \t\n]*@[^ \t\n]*\\)" str) (match-string 1 str)) (t str))) (defsubst wl-address-header-extract-realname (str) "Extracts a real name from STR and return it. e.g. \"Mr. bar \" -> \"Mr. bar\"." (cond ((string-match "\\(.*[^ \t]\\)[ \t]*<[^>]*>" str) (match-string 1 str)) (t ""))) (defun wl-address-get-petname-1 (string) (let ((address (downcase (wl-address-header-extract-address string)))) (elmo-get-hash-val address wl-address-petname-hash))) (defsubst wl-address-get-petname (string) (or (wl-address-get-petname-1 string) string)) (defun wl-address-user-mail-address-p (address) "Judge whether ADDRESS is user's or not." (if wl-user-mail-address-regexp (string-match wl-user-mail-address-regexp (wl-address-header-extract-address address)) (member (downcase (wl-address-header-extract-address address)) (or (mapcar 'downcase wl-user-mail-address-list) (list (downcase (wl-address-header-extract-address wl-from))))))) (defun wl-address-delete-user-mail-addresses (address-list) "Delete user mail addresses from list by side effect. Deletion is done by using `elmo-list-delete'." (if wl-user-mail-address-regexp (elmo-list-delete (list wl-user-mail-address-regexp) address-list (lambda (elem list) (elmo-delete-if (lambda (item) (string-match elem item)) list))) (let ((myself (or wl-user-mail-address-list (list (wl-address-header-extract-address wl-from))))) (elmo-list-delete myself address-list (lambda (elem list) (elmo-delete-if (lambda (item) (string= (downcase elem) (downcase item))) list)))))) (defmacro wl-address-concat-token (string token) `(cond ((eq 'quoted-string (car ,token)) (concat ,string "\"" (cdr ,token) "\"")) ((eq 'comment (car ,token)) (concat ,string "(" (cdr ,token) ")")) (t (concat ,string (cdr ,token))))) (defun wl-address-string-without-group-list-contents (sequence) "Return address string from lexical analyzed list SEQUENCE. Group list contents is not included." (let (address-string route-addr-end token seq group-end) (while sequence (setq token (car sequence)) (cond ;; group = phrase ":" [#mailbox] ";" ((and (eq 'specials (car token)) (string= (cdr token) ":")) (setq address-string (concat address-string (cdr token))) ; ':' (setq seq (cdr sequence)) (setq token (car seq)) (setq group-end nil) (while (not group-end) (setq token (car seq)) (setq seq (cdr seq)) (setq group-end (and (eq 'specials (car token)) (string= (cdr token) ";")))) (setq address-string (concat address-string (cdr token))) ; ';' (setq sequence seq)) ;; route-addr = "<" [route] addr-spec ">" ;; route = 1#("@" domain) ":" ; path-relative ((and (eq 'specials (car token)) (string= (cdr token) "<")) (setq seq (std11-parse-route-addr sequence)) (setq route-addr-end (car (cdr seq))) (while (not (eq (car sequence) route-addr-end)) (setq address-string (wl-address-concat-token address-string (car sequence))) (setq sequence (cdr sequence)))) (t (setq address-string (wl-address-concat-token address-string token)) (setq sequence (cdr sequence))))) address-string)) (defun wl-address-delete (the-email) "Delete address entry in the `wl-address-file'." (with-temp-buffer (message "Deleting Address...") (insert-file-contents wl-address-file) (delete-matching-lines (concat "^[ \t]*" the-email "[ \t]+\".*\"[ \t]+\".*\"$")) (write-region (point-min) (point-max) wl-address-file nil 'no-msg) ;; Delete entries. (dolist (entry (elmo-string-assoc-all the-email wl-address-list)) (setq wl-address-list (delete entry wl-address-list))) (elmo-set-hash-val the-email nil wl-address-petname-hash) (message "Deleting Address...done"))) (defun wl-address-add-or-change (address &optional default-realname change-address) "Add address entry to `wl-address-file', if not registerd. If already registerd, change it." (let ((entry (assoc address wl-address-list)) the-realname the-petname new-addr regexp) (setq the-realname (read-from-minibuffer "Real Name: " (or default-realname (nth 2 entry)))) (setq the-petname (read-from-minibuffer "Petname: " (or (nth 1 entry) the-realname))) (when change-address (setq new-addr (read-from-minibuffer "E-Mail: " address)) (cond ((or (not (stringp new-addr)) (string-match "^[ \t]*$" new-addr)) (error "empty address")) ((and (not (string= address new-addr)) (assoc new-addr wl-address-list)) (error "'%s' already exists" new-addr)) (t ;; do nothing ))) ;; writing to ~/.address (with-temp-buffer (if (file-exists-p wl-address-file) (insert-file-contents wl-address-file)) (if (null entry) ;; add (progn (goto-char (point-max)) (if (and (> (buffer-size) 0) (/= (char-before (point-max)) ?\n)) (insert "\n"))) ;; override (setq regexp (concat "^[ \t]*" address)) (while (re-search-forward regexp nil t) (delete-region (point-at-bol) (1+ (point-at-eol))))) (insert (format "%s\t%s\t%s\n" (or new-addr address) (prin1-to-string the-petname) (prin1-to-string the-realname))) (write-region (point-min) (point-max) wl-address-file nil 'no-msg) (wl-address-init) (list (or new-addr address) the-petname the-realname)))) ;; Read addresses from minibuffer with completion. (defvar wl-address-minibuffer-history nil) (defvar wl-address-minibuffer-local-map nil "Keymap to use when reading address from the minibuffer.") (unless wl-address-minibuffer-local-map (let ((map (make-sparse-keymap))) (set-keymap-parent map minibuffer-local-map) (define-key map "\C-i" (lambda () (interactive) (wl-complete-field-body wl-address-completion-list ?@ nil wl-use-ldap))) (setq wl-address-minibuffer-local-map map))) (defun wl-address-read-from-minibuffer (prompt &optional initial-contents default-value) (read-from-minibuffer prompt initial-contents wl-address-minibuffer-local-map nil 'wl-address-minibuffer-history default-value)) (require 'product) (product-provide (provide 'wl-address) (require 'wl-version)) ;;; wl-address.el ends here wanderlust-wanderlust-769699d/wl/wl-addrmgr.el000066400000000000000000000514661406661363500214250ustar00rootroot00000000000000;;; wl-addrmgr.el --- Address manager for Wanderlust. -*- lexical-binding: t -*- ;; Copyright (C) 2001 Kitamoto Tsuyoshi ;; Copyright (C) 2001 Yuuichi Teranishi ;; Author: Kitamoto Tsuyoshi ;; Yuuichi Teranishi ;; Keywords: mail, net news ;; This file is part of Wanderlust (Yet Another Message Interface on Emacsen). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; Edit To:, Cc:, Bcc: fields interactively from E-Mail address list ;; on ~/.address file. ;;; Code: ;; (require 'wl-address) (require 'wl-draft) (require 'cl-lib) ;; Variables (defgroup wl-addrmgr nil "Wanderlust Address manager." :prefix "wl-" :group 'wl) (defcustom wl-addrmgr-buffer-lines 10 "*Buffer lines for ADDRMGR buffer for draft." :type 'integer :group 'wl-addrmgr) (defcustom wl-addrmgr-default-sort-key 'realname "Default key for sorting." :type '(choice '(address realname petname none)) :group 'wl-addrmgr) (defcustom wl-addrmgr-default-sort-order 'ascending "Default sorting order." :type '(choice '(ascending descending)) :group 'wl-addrmgr) (defcustom wl-addrmgr-realname-width 17 "Width for realname." :type 'integer :group 'wl-addrmgr) (defcustom wl-addrmgr-petname-width 10 "Width for petname." :type 'integer :group 'wl-addrmgr) (defcustom wl-addrmgr-line-width 78 "Width for each line." :type 'integer :group 'wl-addrmgr) (defcustom wl-addrmgr-realname-face 'wl-highlight-summary-normal-face "Face for realname." :type 'face :group 'wl-addrmgr) (defcustom wl-addrmgr-petname-face 'wl-highlight-summary-unread-face "Face for petname." :type 'face :group 'wl-addrmgr) (defcustom wl-addrmgr-address-face 'wl-highlight-summary-new-face "Face for address." :type 'face :group 'wl-addrmgr) (defcustom wl-addrmgr-default-method 'local "Default access method for address entries." ;; ??? :type 'symbol :group 'wl-addrmgr) (defvar wl-addrmgr-buffer-name "Address") (defvar wl-addrmgr-mode-map nil) (defvar wl-addrmgr-method-list '(local)) ;; buffer local variable. (defvar wl-addrmgr-draft-buffer nil) (defvar wl-addrmgr-unknown-list nil) (defvar wl-addrmgr-sort-key nil) (defvar wl-addrmgr-sort-order nil) (defvar wl-addrmgr-method nil) (defvar wl-addrmgr-list nil) (defvar wl-addrmgr-method-name nil) (make-variable-buffer-local 'wl-addrmgr-draft-buffer) (make-variable-buffer-local 'wl-addrmgr-unknown-list) (make-variable-buffer-local 'wl-addrmgr-sort-key) (make-variable-buffer-local 'wl-addrmgr-sort-order) (make-variable-buffer-local 'wl-addrmgr-method) (make-variable-buffer-local 'wl-addrmgr-list) (make-variable-buffer-local 'wl-addrmgr-method-name) ;;; Code (if wl-addrmgr-mode-map nil (setq wl-addrmgr-mode-map (make-sparse-keymap)) (define-key wl-addrmgr-mode-map "<" 'wl-addrmgr-goto-top) (define-key wl-addrmgr-mode-map ">" 'wl-addrmgr-goto-bottom) (define-key wl-addrmgr-mode-map "t" 'wl-addrmgr-mark-set-to) (define-key wl-addrmgr-mode-map "b" 'wl-addrmgr-mark-set-bcc) (define-key wl-addrmgr-mode-map "c" 'wl-addrmgr-mark-set-cc) (define-key wl-addrmgr-mode-map "u" 'wl-addrmgr-unmark) (define-key wl-addrmgr-mode-map "x" 'wl-addrmgr-apply) (define-key wl-addrmgr-mode-map "\C-c\C-c" 'wl-addrmgr-apply) (define-key wl-addrmgr-mode-map "n" 'wl-addrmgr-next) (define-key wl-addrmgr-mode-map "j" 'wl-addrmgr-next) (define-key wl-addrmgr-mode-map "k" 'wl-addrmgr-prev) (define-key wl-addrmgr-mode-map "p" 'wl-addrmgr-prev) (define-key wl-addrmgr-mode-map [down] 'wl-addrmgr-next) (define-key wl-addrmgr-mode-map [up] 'wl-addrmgr-prev) (define-key wl-addrmgr-mode-map "s" 'wl-addrmgr-sort) (define-key wl-addrmgr-mode-map "a" 'wl-addrmgr-add) (define-key wl-addrmgr-mode-map "d" 'wl-addrmgr-delete) (define-key wl-addrmgr-mode-map "e" 'wl-addrmgr-edit) (define-key wl-addrmgr-mode-map "\n" 'wl-addrmgr-edit) (define-key wl-addrmgr-mode-map "\r" 'wl-addrmgr-edit) (define-key wl-addrmgr-mode-map "q" 'wl-addrmgr-quit) (define-key wl-addrmgr-mode-map "\C-c\C-k" 'wl-addrmgr-quit) (define-key wl-addrmgr-mode-map "C" 'wl-addrmgr-change-method) (define-key wl-addrmgr-mode-map "Z" 'wl-addrmgr-reload) (define-key wl-addrmgr-mode-map "\C-c\C-l" 'wl-addrmgr-redraw)) (defun wl-addrmgr-mode () "Major mode for Wanderlust address management. See info under Wanderlust for full documentation. \\{wl-addrmgr-mode-map}" (kill-all-local-variables) (setq mode-name "Address" major-mode 'wl-addrmgr-mode) (wl-mode-line-buffer-identification '("Wanderlust: Address (" wl-addrmgr-method-name ")")) (use-local-map wl-addrmgr-mode-map) (setq bidi-paragraph-direction 'left-to-right) (setq buffer-read-only t)) (defun wl-addrmgr-address-entry-list (field) "Return address list." (mapcar (lambda (addr) (nth 1 (std11-extract-address-components addr))) (elmo-parse-addresses (mapconcat 'identity (elmo-multiple-fields-body-list (list field) mail-header-separator) ",")))) (defun wl-addrmgr-pickup-entry-list (buffer) "Return a list of address entries from BUFFER." (when buffer (with-current-buffer buffer (mapcar (lambda (addr) (let ((structure (std11-extract-address-components addr))) (list (cadr structure) (or (car structure) "") (or (car structure) "")))) (elmo-parse-addresses (mapconcat 'identity (elmo-multiple-fields-body-list '("to" "cc" "bcc") mail-header-separator) ",")))))) (defun wl-addrmgr-merge-entries (base-list append-list) "Return a merged list of address entries." (dolist (entry append-list) (unless (assoc (car entry) base-list) (setq base-list (nconc base-list (list entry))))) base-list) ;;;###autoload (defun wl-addrmgr () "Start an Address manager." (interactive) (let ((buffer (if (eq major-mode 'wl-draft-mode) (current-buffer))) (already-list (list (cons 'to (wl-addrmgr-address-entry-list "to")) (cons 'cc (wl-addrmgr-address-entry-list "cc")) (cons 'bcc (wl-addrmgr-address-entry-list "bcc"))))) (if (eq major-mode 'wl-draft-mode) (if (get-buffer-window wl-addrmgr-buffer-name) nil (split-window (selected-window) (- (window-height (selected-window)) wl-addrmgr-buffer-lines)) (select-window (next-window)) ;; Non-nil means display-buffer should make new windows. (let ((pop-up-windows nil)) (switch-to-buffer (get-buffer-create wl-addrmgr-buffer-name)))) (switch-to-buffer (get-buffer-create wl-addrmgr-buffer-name))) (set-buffer wl-addrmgr-buffer-name) (wl-addrmgr-mode) (unless wl-addrmgr-method (setq wl-addrmgr-method wl-addrmgr-default-method wl-addrmgr-method-name (symbol-name wl-addrmgr-default-method))) (unless wl-addrmgr-sort-key (setq wl-addrmgr-sort-key wl-addrmgr-default-sort-key)) (unless wl-addrmgr-sort-order (setq wl-addrmgr-sort-order wl-addrmgr-default-sort-order)) (setq wl-addrmgr-draft-buffer buffer) (setq wl-addrmgr-list (wl-addrmgr-merge-entries (wl-addrmgr-list) (wl-addrmgr-pickup-entry-list buffer))) (wl-addrmgr-draw already-list) (setq wl-addrmgr-unknown-list already-list) (wl-addrmgr-goto-top))) (defun wl-addrmgr-goto-top () (interactive) (goto-char (point-min)) (forward-line 2) (condition-case nil (forward-char 4) (error))) (defun wl-addrmgr-goto-bottom () (interactive) (goto-char (point-max)) (beginning-of-line) (forward-char 4)) (defun wl-addrmgr-reload () "Reload addresses entries." (interactive) (setq wl-addrmgr-list (wl-addrmgr-list 'reload)) (wl-addrmgr-redraw)) (defun wl-addrmgr-redraw () "Redraw address entries." (interactive) (let ((rcpt (wl-addrmgr-mark-check))) (wl-addrmgr-draw (list (cons 'to (nth 0 rcpt)) (cons 'cc (nth 1 rcpt)) (cons 'bcc (nth 2 rcpt))))) (wl-addrmgr-goto-top)) (defun wl-addrmgr-sort-list (key list order) (let ((pos (cl-case key (address 0) (petname 1) (realname 2))) sorted) (if pos (progn (setq sorted (sort list `(lambda (a b) (string< (nth ,pos a) (nth ,pos b))))) (if (eq order 'descending) (nreverse sorted) sorted)) list))) (defun wl-addrmgr-insert-line (entry) (let ((real (nth 2 entry)) (pet (nth 1 entry)) (addr (nth 0 entry)) beg) (insert " ") (setq beg (point)) (setq real (wl-set-string-width wl-addrmgr-realname-width real)) (put-text-property 0 (length real) 'face wl-addrmgr-realname-face real) (setq pet (wl-set-string-width wl-addrmgr-petname-width pet)) (put-text-property 0 (length pet) 'face wl-addrmgr-petname-face pet) (setq addr (copy-sequence addr)) (put-text-property 0 (length addr) 'face wl-addrmgr-address-face addr) (insert (wl-set-string-width (- wl-addrmgr-line-width 4) (concat real " " pet " " addr))) (put-text-property beg (point) 'wl-addrmgr-entry entry))) (defun wl-addrmgr-search-forward-address (address) "Search forward from point for ADDRESS. Return nil if no ADDRESS exists." (let ((pos (point))) (if (catch 'found (while (not (eobp)) (if (string= address (car (wl-addrmgr-address-entry))) (throw 'found t) (forward-line)))) (point) (goto-char pos) nil))) (defun wl-addrmgr-draw (already-list) "Show recipients mail addresses." (save-excursion (let ((buffer-read-only nil) list field addrs) (erase-buffer) (goto-char (point-min)) (insert "Mark " (wl-set-string-width wl-addrmgr-realname-width "Realname") " " (wl-set-string-width wl-addrmgr-petname-width "Petname") " Address\n") (insert "---- " (make-string wl-addrmgr-realname-width ?-) " " (make-string wl-addrmgr-petname-width ?-) " ---------------") (unless wl-addrmgr-list (insert "\n")) (dolist (entry (wl-addrmgr-sort-list wl-addrmgr-sort-key (copy-sequence wl-addrmgr-list) wl-addrmgr-sort-order)) (insert "\n") (wl-addrmgr-insert-line entry)) (set-buffer-modified-p nil) (while already-list (setq list (car already-list) field (car list) addrs (cdr list)) (while addrs (goto-char (point-min)) (when (wl-addrmgr-search-forward-address (car addrs)) (wl-addrmgr-mark-write field) (setcdr list (delq (car addrs) (cdr list)))) (setq addrs (cdr addrs))) (setq already-list (cdr already-list)))))) (defun wl-addrmgr-next () "Move cursor next line." (interactive) (end-of-line) (let ((current (count-lines (point-min) (point))) first) (cond ((<= current 2) (when (setq first (next-single-property-change (point) 'wl-addrmgr-entry nil)) (goto-char first) (beginning-of-line) (forward-char 4))) (t (forward-line) (beginning-of-line) (forward-char 4))))) (defun wl-addrmgr-prev () "Move cursor prev line." (interactive) (let ((current (count-lines (point-min) (point)))) (cond ((= current 3) (beginning-of-line) (forward-char 4)) ((< current 3) (goto-char (point-min)) (forward-line 2) (forward-char 4)) (t (forward-line -1) (forward-char 4))))) (defun wl-addrmgr-quit-yes () (let ((draft-buffer wl-addrmgr-draft-buffer)) (if (and draft-buffer (buffer-live-p draft-buffer) (null (get-buffer-window draft-buffer 'visible))) (switch-to-buffer draft-buffer) (if (wl-window-deletable-p) (delete-window))) (kill-buffer wl-addrmgr-buffer-name) (if (and draft-buffer (not (one-window-p))) (switch-to-buffer-other-window draft-buffer)))) (defun wl-addrmgr-quit () "Exit from electric reference mode without inserting reference." ;; ??? (interactive) (let ((rcpt (wl-addrmgr-mark-check))) (if (or (nth 0 rcpt) (nth 1 rcpt) (nth 2 rcpt)) (when (y-or-n-p "There is marked address. Quit wl-addrmgr really? ") (wl-addrmgr-quit-yes)) (wl-addrmgr-quit-yes))) (message "")) (defun wl-addrmgr-mark-set-to () "Marking To: sign." (interactive) (wl-addrmgr-mark-write 'to) (wl-addrmgr-next)) (defun wl-addrmgr-mark-set-cc () "Marking Cc: sign." (interactive) (wl-addrmgr-mark-write 'cc) (wl-addrmgr-next)) (defun wl-addrmgr-mark-set-bcc () "Marking Bcc: sign." (interactive) (wl-addrmgr-mark-write 'bcc) (wl-addrmgr-next)) (defun wl-addrmgr-unmark () "Erase Marked sign." (interactive) (let ((entry (wl-addrmgr-address-entry)) buffer-read-only) (save-excursion (delete-region (point-at-bol) (point-at-eol)) (wl-addrmgr-insert-line entry)) (set-buffer-modified-p nil) (wl-addrmgr-next))) (defun wl-addrmgr-sort () "Sort address entry." (interactive) (setq wl-addrmgr-sort-key (intern (completing-read (format "Sort By (%s): " (symbol-name wl-addrmgr-sort-key)) '(("address")("realname")("petname")("none")) nil t nil nil (symbol-name wl-addrmgr-sort-key)))) (if (eq wl-addrmgr-sort-key 'none) (wl-addrmgr-reload) (setq wl-addrmgr-sort-order (intern (completing-read (format "Sort Order (%s): " (symbol-name wl-addrmgr-sort-order)) '(("ascending") ("descending")) nil t nil nil (symbol-name wl-addrmgr-sort-order)))) (wl-addrmgr-redraw))) ;;; Backend methods. (defun wl-addrmgr-method-call (method &rest args) (apply (intern (concat "wl-addrmgr-" (symbol-name wl-addrmgr-method) "-" (symbol-name method))) args)) (defun wl-addrmgr-change-method () (interactive) (setq wl-addrmgr-method (intern (setq wl-addrmgr-method-name (completing-read (format "Method (%s): " (symbol-name wl-addrmgr-method)) (mapcar (lambda (method) (list (symbol-name method))) wl-addrmgr-method-list) nil t nil nil (symbol-name wl-addrmgr-method))))) (wl-addrmgr-redraw)) (defun wl-addrmgr-list (&optional reload) "List address entries." (wl-addrmgr-method-call 'list reload)) (defun wl-addrmgr-add () "Add address entry." (interactive) (let ((entry (wl-addrmgr-method-call 'add))) (if (eq wl-addrmgr-sort-key 'none) (wl-addrmgr-reload) (setq wl-addrmgr-list (cons entry wl-addrmgr-list)) (wl-addrmgr-redraw)) (message "Added `%s'." (substring-no-properties (car entry))))) (defun wl-addrmgr-delete () "Delete address entry." (interactive) (let ((addr (substring-no-properties (car (wl-addrmgr-address-entry)))) lines) (when (and addr (y-or-n-p (format "Delete '%s'? " addr))) (setq lines (count-lines (point-min) (point))) (wl-addrmgr-method-call 'delete addr) (setq wl-addrmgr-list (delq (assoc addr wl-addrmgr-list) wl-addrmgr-list)) (wl-addrmgr-redraw) (forward-line (- lines 2)) (message "Deleted `%s'." addr)))) (defun wl-addrmgr-edit () "Edit address entry." (interactive) (let ((orig (wl-addrmgr-address-entry)) entry lines) (setq entry (wl-addrmgr-method-call 'edit (substring-no-properties (car orig)))) (setq lines (count-lines (point-min) (point))) (if (eq wl-addrmgr-sort-key 'none) (wl-addrmgr-reload) (setq wl-addrmgr-list (delq (assoc (car orig) wl-addrmgr-list) wl-addrmgr-list) wl-addrmgr-list (cons entry wl-addrmgr-list)) (wl-addrmgr-redraw)) (forward-line (- lines 1)) (message "Modified `%s'." (substring-no-properties (car entry))))) ;;; local address book implementation. (defun wl-addrmgr-local-list (reload) (if (or (null wl-address-list) reload) (wl-address-init)) (copy-sequence wl-address-list)) (defun wl-addrmgr-local-add () (wl-address-add-or-change nil nil 'addr-too)) (defun wl-addrmgr-local-edit (address) (wl-address-add-or-change address nil 'addr-too)) (defun wl-addrmgr-local-delete (address) (wl-address-delete address)) ;;; LDAP implementation (Implement Me) ;;; Operations. (defun wl-addrmgr-address-entry () (get-text-property (previous-single-property-change (point-at-eol) 'wl-addrmgr-entry nil (point-at-bol)) 'wl-addrmgr-entry)) (defun wl-addrmgr-mark-write (&optional mark) "Set MARK to the current address entry." (save-excursion (unless (< (count-lines (point-min) (point-at-eol)) 3) (let ((buffer-read-only nil) beg end) (beginning-of-line) (delete-char 4) (insert (cl-case mark (to "To: ") (cc "Cc: ") (bcc "Bcc:") (t " "))) (insert (make-string (- 4 (current-column)) (string-to-char " "))) (setq beg (point-at-bol)) (setq end (point-at-eol)) (put-text-property beg end 'face nil) (wl-highlight-message beg end nil)) (set-buffer-modified-p nil)))) (defun wl-addrmgr-apply () (interactive) (let ((rcpt (wl-addrmgr-mark-check 'full))) (when (or (or (nth 0 rcpt) (nth 1 rcpt) (nth 2 rcpt)) (or (cdr (assq 'to wl-addrmgr-unknown-list)) (cdr (assq 'cc wl-addrmgr-unknown-list)) (cdr (assq 'bcc wl-addrmgr-unknown-list)))) (wl-addrmgr-apply-exec (wl-addrmgr-mark-check 'full))) (wl-addrmgr-quit-yes))) (defun wl-addrmgr-mark-check (&optional full) "Return list of recipients (TO CC BCC)." (save-excursion ; save cursor POINT (goto-char (point-min)) (forward-line 2) (let (to-list cc-list bcc-list mark addr realname) (while (and (not (eobp)) (re-search-forward "^\\([^ ]+:\\) " nil t)) (setq mark (match-string 1)) (setq addr (car (wl-addrmgr-address-entry))) (setq realname (nth 2 (wl-addrmgr-address-entry))) (cond ((string= mark "To:") (setq to-list (cons (if (and full (not (or (string= realname "") (string-match ".*:.*;$" addr)))) (concat (elmo-address-quote-specials realname) " <" addr">") addr) to-list))) ((string= mark "Cc:") (setq cc-list (cons (if (and full (not (or (string= realname "") (string-match ".*:.*;$" addr)))) (concat (elmo-address-quote-specials realname) " <" addr">") addr) cc-list))) ((string= mark "Bcc:") (setq bcc-list (cons (if (and full (not (or (string= realname "") (string-match ".*:.*;$" addr)))) (concat (elmo-address-quote-specials realname) " <" addr">") addr) bcc-list))))) (list to-list cc-list bcc-list)))) (defun wl-addrmgr-apply-exec (rcpt) (let ((to (nconc (nth 0 rcpt) (cdr (assq 'to wl-addrmgr-unknown-list)))) (cc (nconc (nth 1 rcpt) (cdr (assq 'cc wl-addrmgr-unknown-list)))) (bcc (nconc (nth 2 rcpt) (cdr (assq 'bcc wl-addrmgr-unknown-list)))) from clist) (setq clist (list (cons "Bcc" (if bcc (mapconcat 'identity bcc ",\n\t"))) (cons "Cc" (if cc (mapconcat 'identity cc ",\n\t"))) (cons "To" (if to (mapconcat 'identity to ",\n\t"))))) (when (or (null wl-addrmgr-draft-buffer) (not (buffer-live-p wl-addrmgr-draft-buffer))) (setq wl-addrmgr-draft-buffer (save-window-excursion (call-interactively 'wl-draft) (current-buffer)))) (with-current-buffer wl-addrmgr-draft-buffer (setq from (std11-field-body "From")) (if from (setq clist (append clist (list (cons "From" from))))) (wl-addrmgr-mark-exec-sub clist)))) (defun wl-addrmgr-replace-field (field content) "Insert FIELD with CONTENT to the top of the header fields." (save-excursion (save-restriction (let ((case-fold-search t) (inhibit-read-only t) ;; added by teranisi. (regexp (concat "^" (regexp-quote field) ":")) beg) (std11-narrow-to-header mail-header-separator) (goto-char (point-min)) (while (re-search-forward regexp nil t) ;; delete field (progn (setq beg (point-at-bol)) (re-search-forward "^[^ \t]" nil 'move) (delete-region beg (point-at-bol)) (beginning-of-line))) (when content ;; add field to top. (goto-char (point-min)) (insert (concat field ": " content "\n"))))))) (defun wl-addrmgr-mark-exec-sub (list) (dolist (pair list) (wl-addrmgr-replace-field (car pair) (cdr pair))) ;; from wl-template.el ;; rehighlight (if wl-highlight-body-too (let ((beg (point-min)) (end (point-max))) (put-text-property beg end 'face nil) (wl-highlight-message beg end t)))) (require 'product) (product-provide (provide 'wl-addrmgr) (require 'wl-version)) ;;; wl-addrmgr.el ends here wanderlust-wanderlust-769699d/wl/wl-batch.el000066400000000000000000000040541406661363500210550ustar00rootroot00000000000000;;; wl-batch.el --- batch functions for Wanderlust. -*- lexical-binding: t -*- ;; Copyright (C) 2003 Yuuichi Teranishi ;; Copyright (C) 2003 Chihiro Kuroda ;; Author: Yuuichi Teranishi , ;; Chihiro Kuroda ;; Keywords: mail, net news, batch ;; This file is not part of GNU Emacs ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;; You can use functions in this file from command line. ;; For example, ;; ;; % emacs -batch -l wl-batch -f wl-batch-prefetch (require 'wl) ;;; Code: (defgroup wl-batch nil "Wanderlust, batch processing." :prefix "wl-" :group 'wl) (defcustom wl-batch-prefetch-folder-list nil "A list of folder name to prefetch by `wl-batch-prefetch'." :type '(repeat string) :group 'wl-batch) (defcustom wl-batch-prefetch-max-number 100 "Max number for summary update while prefetching." :type 'integer :group 'wl-batch) (defun wl-batch-prefetch () "A batch function to prefetch messages by Emacs batch process." (interactive) (wl 1) (let ((elmo-folder-update-threshold wl-batch-prefetch-max-number) wl-demo elmo-folder-update-confirm wl-interactive-exit) (dolist (entity wl-batch-prefetch-folder-list) (wl-folder-check-entity entity) (wl-folder-prefetch-entity entity)) (wl-exit))) (provide 'wl-batch) ;;; wl-batch.el ends here wanderlust-wanderlust-769699d/wl/wl-demo.el000066400000000000000000000201271406661363500207170ustar00rootroot00000000000000;;; wl-demo.el --- Opening demo on Wanderlust -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000,2001,2002,2003,2004 ;; Yuuichi Teranishi ;; Copyright (C) 2000,2001,2004 ;; Katsumi Yamaoka ;; Author: Yuuichi Teranishi ;; Katsumi Yamaoka ;; Keywords: mail, net news ;; This file is part of Wanderlust (Yet Another Message Interface on Emacsen). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;;; Commentary: ;;; Code: (defconst wl-demo-copyright-notice "Copyright (C) 1998-2012 Yuuichi Teranishi " "A declaration of the copyright on Wanderlust.") (require 'path-util) (require 'wl-vars) (require 'wl-version) (require 'wl-highlight) (defun wl-demo-icon-name () "A function to determine logo file name." (catch 'found (dolist (pair wl-demo-icon-name-alist) (when (eval (car pair)) (throw 'found (eval (cdr pair))))))) (defvar wl-logo-ascii "\ o$ oo$$$$$$ooo oo$$$ o$$ o$$$\"\"\"\"\"\"$$$$$o $$$$$$\" o$$$\" o$\"\" \"$$$ $$\" o$\"\" o$\" $$$ $\" oo$\" $\" $$$ o$ oo\"\"$$ $ $$ o$$ oo$\" \"$$$o $ o$$ $$$$\"\" \"$$oo$ o o$\" \"$$o \"$$$o oooo$\"\" $$ \"\"\"\" Wanderlust \"$ Yet Another Message Interface On Emacsen" "Ascii picture used to splash the startup screen.") (defun wl-demo-image-type-alist () "Return an alist of available logo image types on the current frame." (if window-system (let ((xpm (when (and (display-images-p) (image-type-available-p 'xpm)) '("xpm" . xpm))) (xbm (when (and (display-images-p) (image-type-available-p 'xbm)) '("xbm" . xbm)))) (delq nil (list xpm xbm '("ascii")))) '(("ascii")))) (defun wl-demo-image-filter (file type) "Get filtered image data. FILE is the image file name. TYPE is the filter function." (let ((filter (catch 'found (dolist (pair wl-demo-image-filter-alist) (when (eq (car pair) type) (throw 'found (cdr pair))))))) (with-temp-buffer (set-buffer-multibyte nil) (insert-file-contents file) (goto-char (point-min)) (when filter (funcall filter)) (buffer-string)))) (defun wl-demo-insert-image (itype) "Insert a logo image at the point and position it to be centered. ITYPE specifies what a type of image should be displayed. Return a number of lines that an image occupies in the buffer." (let ((file (cond ((eq 'xpm itype) (concat (wl-demo-icon-name) ".xpm")) ((eq 'xbm itype) (concat (wl-demo-icon-name) ".xbm")))) image width height) (if (and file (if (and wl-icon-directory (file-directory-p wl-icon-directory)) (setq file (expand-file-name file wl-icon-directory)) (message "You have to specify the value of `wl-icon-directory'") nil) (if (file-exists-p file) (if (file-readable-p file) t (message "Permission denied: %s" file) nil) (message "File not found: %s" file) nil)) (when (memq itype '(xpm xbm)) ;; Use the new redisplay engine on Emacs 21. (setq image (create-image (wl-demo-image-filter file itype) itype t) width (image-size image) height (cdr width) width (car width)) (when (eq 'xbm itype) (let ((bg (face-background 'wl-highlight-demo-face)) (fg (face-foreground 'wl-highlight-logo-face))) (when (stringp bg) (plist-put (cdr image) ':background bg)) (when (stringp fg) (plist-put (cdr image) ':foreground fg)))) (insert (propertize " " 'display (list 'space ':align-to (max 0 (round (- (window-width) width) 2))))) (insert-image image) (insert "\n") (round height)) (insert wl-logo-ascii) (unless (bolp) (insert "\n")) (setq width 0) (while (progn (end-of-line 0) (not (bobp))) (setq width (max width (current-column)))) (indent-rigidly (point-min) (point-max) (max 0 (/ (1+ (- (window-width) width)) 2))) (put-text-property (point-min) (point-max) 'fixed-width t) (count-lines (point-min) (goto-char (point-max)))))) (defun wl-demo-setup-properties () "Set up properties of the demo buffer." ;; I think there should be a better way to set face background ;; for the buffer only. But I don't know how to do it on Emacs21. (goto-char (point-max)) (dotimes (_i (- (window-height) (count-lines (point-min) (point)))) (insert ?\n)) (let* ((fg (face-foreground 'wl-highlight-demo-face)) (bg (face-background 'wl-highlight-demo-face)) (oblique (nconc '(variable-pitch :slant oblique) (when (stringp bg) (list ':background bg)) (when (stringp fg) (list ':foreground fg)))) (start (text-property-any (point-min) (point-max) 'fixed-width t)) end) (if start (progn (put-text-property (point-min) start 'face oblique) (setq end (or (text-property-not-all start (point-max) 'fixed-width t) (point-max))) (put-text-property start end 'face (nconc '(wl-highlight-logo-face) (when (stringp bg) (list ':background bg)))) (put-text-property end (point-max) 'face oblique)) (put-text-property (point-min) (point-max) 'face oblique)))) (defun wl-demo-insert-text (height) "Insert a version and the copyright message after a logo image. HEIGHT should be a number of lines that an image occupies in the buffer." (let* ((height (- (window-height) height 1)) (text (format (cond ((<= height 2) "version %s - \"%s\"\n%s\n") ((eq height 3) "version %s - \"%s\"\n\n%s\n") (t "\nversion %s - \"%s\"\n\n%s\n")) (product-version-string (product-find 'wl-version)) (product-code-name (product-find 'wl-version)) wl-demo-copyright-notice)) start) (goto-char (point-min)) (insert-char ?\n (max 0 (/ (- height 4) 2))) (setq start (goto-char (point-max))) (insert text) (let ((fill-column (window-width))) (center-region start (point))))) (defun wl-demo (&optional itype) "Demo on the startup screen. ITYPE should be a symbol which overrides the variable `wl-demo-display-logo'. It will prompt user for the type of image when it is called interactively with a prefix argument." (interactive "P") (let ((selection (wl-demo-image-type-alist)) type) (if (and itype (called-interactively-p 'interactive)) (setq type (completing-read "Image type: " selection nil t) itype (cdr (assoc type selection))) (if (setq type (assoc (format "%s" (or itype wl-demo-display-logo)) selection)) (setq itype (cdr type)) (setq itype (when wl-demo-display-logo (cdr (car selection))))))) (let ((buffer (let ((line-spacing 0)) (get-buffer-create "*WL Demo*")))) (switch-to-buffer buffer) (setq buffer-read-only nil) (buffer-disable-undo) (erase-buffer) (setq truncate-lines t tab-width 8) (set (make-local-variable 'tab-stop-list) '(8 16 24 32 40 48 56 64 72 80 88 96 104 112 120)) (wl-demo-insert-text (wl-demo-insert-image itype)) (wl-demo-setup-properties) (set-buffer-modified-p nil) (goto-char (point-min)) (sit-for (if (featurep 'lisp-float-type) (/ (float 5) (float 10)) 1)) buffer)) (require 'product) (product-provide (provide 'wl-demo) (require 'wl-version)) ;;; wl-demo.el ends here wanderlust-wanderlust-769699d/wl/wl-draft.el000066400000000000000000003104431406661363500210760ustar00rootroot00000000000000;;; wl-draft.el --- Message draft mode for Wanderlust. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Copyright (C) 1998,1999,2000 Masahiro MURATA ;; Author: Yuuichi Teranishi ;; Masahiro MURATA ;; Keywords: mail, net news ;; This file is part of Wanderlust (Yet Another Message Interface on Emacsen). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'timezone nil t) (require 'std11) (require 'eword-encode) (require 'mime-setup) (require 'mime-edit) (require 'mime-view) (require 'elmo) (require 'elmo-net) (require 'wl-util) (require 'wl-vars) (require 'wl-address) (require 'wl-folder) (require 'wl-summary) (require 'wl-highlight) (require 'wl-mime) (provide 'wl-draft) (defvar x-face-add-x-face-version-header) (defvar mail-reply-buffer) (defvar mail-from-style) (eval-and-compile (autoload 'wl-addrmgr "wl-addrmgr")) (defvar wl-draft-buffer-message-number nil) (defvar wl-draft-field-completion-list nil) (defvar wl-draft-verbose-send t) (defvar wl-draft-verbose-msg nil) (defvar wl-draft-queue-flushing nil) (defvar wl-draft-config-variables nil) (defvar wl-draft-config-exec-flag t) (defvar wl-draft-buffer-cur-summary-buffer nil) (defvar wl-draft-clone-local-variable-regexp "^\\(wl\\|mime\\)") (defvar wl-draft-sendlog-filename "sendlog") (defvar wl-draft-queue-save-filename "qinfo") (defvar wl-draft-config-save-filename "config") (defvar wl-draft-queue-flush-send-function 'wl-draft-dispatch-message) (defvar wl-sent-message-via nil) (defvar wl-sent-message-modified nil) (defvar wl-sent-message-queued nil) (defvar wl-draft-fcc-list nil) (defvar wl-draft-reedit nil) (defvar wl-draft-reply-buffer nil) (defvar wl-draft-forward nil) (defvar wl-draft-doing-mime-bcc nil) (defvar wl-draft-parent-folder nil "Folder name of the summary in which current draft is invoked. This variable is local in each draft buffer. You can refer its value in `wl-draft-config-alist'. e.g. \(setq wl-draft-config-alist '(((string-match \".*@domain1$\" wl-draft-parent-folder) (\"From\" . \"user@domain1\")) ((string-match \".*@domain2$\" wl-draft-parent-folder) (\"From\" . \"user@domain2\"))))") (defvar wl-draft-parent-number nil) (defvar wl-draft-parent-flag nil) (defconst wl-draft-parent-variables '(wl-draft-parent-folder wl-draft-parent-number wl-draft-parent-flag)) (defvar wl-draft-config-sub-func-alist '((body . wl-draft-config-sub-body) (top . wl-draft-config-sub-top) (bottom . wl-draft-config-sub-bottom) (header . wl-draft-config-sub-header) (header-top . wl-draft-config-sub-header-top) (header-bottom . wl-draft-config-sub-header) (part-top . wl-draft-config-sub-part-top) (part-bottom . wl-draft-config-sub-part-bottom) (body-file . wl-draft-config-sub-body-file) (top-file . wl-draft-config-sub-top-file) (bottom-file . wl-draft-config-sub-bottom-file) (header-file . wl-draft-config-sub-header-file) (template . wl-draft-config-sub-template) (x-face . wl-draft-config-sub-x-face))) (make-variable-buffer-local 'wl-draft-buffer-message-number) (make-variable-buffer-local 'wl-draft-buffer-cur-summary-buffer) (make-variable-buffer-local 'wl-draft-config-variables) (make-variable-buffer-local 'wl-draft-config-exec-flag) (make-variable-buffer-local 'wl-sent-message-via) (make-variable-buffer-local 'wl-sent-message-queued) (make-variable-buffer-local 'wl-draft-fcc-list) (make-variable-buffer-local 'wl-draft-reply-buffer) (make-variable-buffer-local 'wl-draft-parent-folder) (make-variable-buffer-local 'wl-draft-parent-number) (make-variable-buffer-local 'wl-draft-parent-flag) (defvar wl-draft-folder-internal nil "Internal variable for caching `opened' draft folder.") (defvar wl-draft-mode-map) ;; wl-e21.el ;; for draft toolbar. (defalias 'wl-draft-insert-signature (if mime-setup-use-signature 'insert-signature 'mime-edit-insert-signature)) (defvar wl-draft-toolbar '([wl-draft-send-from-toolbar wl-draft-send-from-toolbar t "Send Current Draft"] [wl-draft-yank-original wl-draft-yank-original t "Yank Displaying Message"] [wl-draft-insert-signature wl-draft-insert-signature t "Insert Signature"] [wl-draft-kill wl-draft-kill t "Kill Current Draft"] [wl-draft-save-and-exit wl-draft-save-and-exit t "Save Draft and Exit"]) "The Draft buffer toolbar.") (eval-when-compile (defsubst wl-e21-setup-draft-toolbar () (when (wl-e21-setup-toolbar wl-draft-toolbar) (wl-e21-make-toolbar-buttons wl-draft-mode-map wl-draft-toolbar)))) (defun wl-draft-overload-menubar () (let ((keymap (current-local-map))) (define-key keymap [menu-bar mail send] '("Send Message" . wl-draft-send-and-exit)) (define-key keymap [menu-bar mail send-stay] '("Send, Keep Editing" . wl-draft-send)) (define-key-after (lookup-key keymap [menu-bar mail]) [mail-sep-send] '("--") 'send-stay) (define-key keymap [menu-bar mail cancel] '("Kill Current Draft" . wl-draft-kill)) (define-key-after (lookup-key keymap [menu-bar mail]) [save] '("Save Draft and Exit" . wl-draft-save-and-exit) 'cancel) (define-key-after (lookup-key keymap [menu-bar mail]) [mail-sep-exit] '("--") 'save) (define-key-after (lookup-key keymap [menu-bar mail]) [preview] '("Preview Message" . wl-draft-preview-message) 'mail-sep-exit) (define-key keymap [menu-bar mail yank] '("Cite Message" . wl-draft-yank-original)) (define-key keymap [menu-bar mail signature] '("Insert Signature" . wl-draft-insert-signature)) (define-key keymap [menu-bar headers fcc] '("Fcc" . wl-draft-fcc)))) (defun wl-draft-mode-setup () (require 'derived) (define-derived-mode wl-draft-mode mail-mode "Draft" "draft mode for Wanderlust derived from mail mode. See info under Wanderlust for full documentation. Special commands: \\{wl-draft-mode-map}" (setq font-lock-defaults nil) (when (featurep 'jit-lock) (jit-lock-register 'wl-draft-jit-highlight)) (add-hook 'after-change-functions 'wl-draft-idle-highlight-set-timer nil t))) (defun wl-draft-key-setup () (define-key wl-draft-mode-map "\C-c\C-y" 'wl-draft-yank-original) (define-key wl-draft-mode-map "\C-c\C-s" 'wl-draft-send) (define-key wl-draft-mode-map "\C-c\C-c" 'wl-draft-send-and-exit) (define-key wl-draft-mode-map "\C-c\C-z" 'wl-draft-save-and-exit) (define-key wl-draft-mode-map "\C-c\C-k" 'wl-draft-kill) (define-key wl-draft-mode-map "\C-l" 'wl-draft-highlight-and-recenter) (define-key wl-draft-mode-map "\C-i" 'wl-complete-field-body-or-tab) (define-key wl-draft-mode-map "\C-c\C-r" 'wl-draft-caesar-region) (define-key wl-draft-mode-map "\M-t" 'wl-toggle-plugged) (define-key wl-draft-mode-map "\C-c\C-o" 'wl-jump-to-draft-buffer) (define-key wl-draft-mode-map "\C-c\C-e" 'wl-draft-config-exec) (define-key wl-draft-mode-map "\C-c\C-j" 'wl-template-select) (define-key wl-draft-mode-map "\C-c\C-p" 'wl-draft-preview-message) (define-key wl-draft-mode-map "\C-c\C-a" 'wl-addrmgr) ;;; (define-key wl-draft-mode-map "\C-x\C-s" 'wl-draft-save) (define-key wl-draft-mode-map "\C-xk" 'wl-draft-mimic-kill-buffer) (define-key wl-draft-mode-map "\C-c\C-d" 'wl-draft-elide-region) (define-key wl-draft-mode-map "\C-a" 'wl-draft-beginning-of-line) (define-key wl-draft-mode-map "\M-p" 'wl-draft-previous-history-element) (define-key wl-draft-mode-map "\M-n" 'wl-draft-next-history-element)) (defun wl-draft-overload-functions () (wl-mode-line-buffer-identification) ;;; (local-set-key "\C-c\C-s" 'wl-draft-send) ; override (wl-e21-setup-draft-toolbar) (wl-draft-overload-menubar)) ;; End of wl-e21.el (defsubst wl-smtp-password-key (user mechanism server service) (list "SMTP" user mechanism server (if (integerp service) service 25))) (defmacro wl-smtp-extension-bind (&rest body) `(let ((smtp-sasl-mechanisms (if wl-smtp-authenticate-type (mapcar 'upcase (if (listp wl-smtp-authenticate-type) wl-smtp-authenticate-type (list wl-smtp-authenticate-type))))) (smtp-use-sasl wl-smtp-authenticate-type) (smtp-use-starttls (memq wl-smtp-connection-type elmo-network-starttls-stream-type-list)) (smtp-open-connection-function (let ((stream-type (elmo-get-network-stream-type wl-smtp-connection-type))) (if stream-type (progn (when (elmo-network-stream-type-feature stream-type) (require (elmo-network-stream-type-feature stream-type))) (elmo-network-stream-type-function stream-type)) smtp-open-connection-function))) (smtp-sasl-user-name wl-smtp-posting-user) (smtp-sasl-properties (when wl-smtp-authenticate-realm (list 'realm wl-smtp-authenticate-realm))) sasl-read-passphrase) (setq sasl-read-passphrase (lambda (_prompt) (elmo-get-passwd (wl-smtp-password-key smtp-sasl-user-name (car smtp-sasl-mechanisms) smtp-server smtp-service)))) ,@body)) (def-edebug-spec wl-smtp-extension-bind (body)) (defun wl-draft-insert-date-field () "Insert Date field." (insert "Date: " (wl-make-date-string) "\n")) (defun wl-draft-insert-from-field () "Insert From field." ;; Put the "From:" field in unless for some odd reason ;; they put one in themselves. (let (from) (condition-case nil (setq from (wl-draft-eword-encode-address-list wl-from)) (error (error "Please look at `wl-from' again"))) (insert "From: " from "\n"))) (defun wl-draft-insert-x-face-field () "Insert X-Face header." (interactive) (if (not (file-exists-p wl-x-face-file)) (error "File %s does not exist" wl-x-face-file) (goto-char (point-min)) (search-forward mail-header-separator nil t) (beginning-of-line) (wl-draft-insert-x-face-field-here) (run-hooks 'wl-draft-insert-x-face-field-hook))) ; highlight it if you want. (defun wl-draft-insert-x-face-field-here () "Insert X-Face field at point." (let ((x-face-string (elmo-get-file-string wl-x-face-file))) (when (string-match "^\\(X-Face:\\)?[ \t\n]*" x-face-string) (setq x-face-string (substring x-face-string (match-end 0)))) (insert "X-Face: " x-face-string)) (when (not (= (preceding-char) ?\n)) ; for chomped (choped) x-face-string (insert ?\n)) ;; Insert X-Face-Version: field (when (and (fboundp 'x-face-insert-version-header) (boundp 'x-face-add-x-face-version-header) x-face-add-x-face-version-header) (x-face-insert-version-header))) (defun wl-draft-setup () (let ((field wl-draft-fields) cl) (while field (setq cl (append cl (list (cons (concat (car field) " ") (concat (car field) " "))))) (setq field (cdr field))) (setq cl (cons (cons (concat wl-draft-mime-bcc-field-name ": ") (concat wl-draft-mime-bcc-field-name ": ")) cl)) (setq wl-draft-field-completion-list cl) (setq wl-address-complete-header-regexp (regexp-opt (append wl-address-complete-header-list (list (concat wl-draft-mime-bcc-field-name ":"))))))) (defun wl-draft-make-mail-followup-to (recipients) (let ((rlist (wl-address-delete-user-mail-addresses recipients))) (if (elmo-list-member rlist (mapcar 'downcase wl-subscribed-mailing-list)) rlist (append rlist (list (wl-address-header-extract-address wl-from)))))) (defun wl-draft-delete-myself-from-cc (to cc) (cond (wl-draft-always-delete-myself ; always-delete option (wl-address-delete-user-mail-addresses cc)) ((elmo-list-member (append to cc) ; subscribed mailing-list (mapcar 'downcase wl-subscribed-mailing-list)) (wl-address-delete-user-mail-addresses cc)) (t cc))) (defsubst wl-draft-strip-subject-regexp (subject regexp) "Remove REGEXP from SUBJECT string." (if (string-match regexp subject) (substring subject (match-end 0)) subject)) (defun wl-draft-forward-make-subject (original-subject) "Generate subject string for forwarding." (cond ((functionp wl-forward-subject-prefix) (concat (funcall wl-forward-subject-prefix) original-subject)) ((stringp wl-forward-subject-prefix) (concat wl-forward-subject-prefix (wl-draft-strip-subject-regexp (or original-subject "") wl-subject-forward-prefix-regexp))) (t original-subject))) (defun wl-draft-reply-make-subject (original-subject) "Generate subject string for replying." (cond ((functionp wl-reply-subject-prefix) (concat (funcall wl-reply-subject-prefix) original-subject)) ((stringp wl-reply-subject-prefix) (concat wl-reply-subject-prefix (wl-draft-strip-subject-regexp (or original-subject "") wl-subject-re-prefix-regexp))) (t original-subject))) (defun wl-draft-forward (original-subject summary-buf &optional number) (let (references parent-folder subject) (with-current-buffer summary-buf (setq parent-folder (wl-summary-buffer-folder-name))) (let ((decoder (mime-find-field-decoder 'Subject 'plain))) (setq subject (if (and original-subject decoder) (funcall decoder original-subject) original-subject))) (with-current-buffer (wl-message-get-original-buffer) (setq subject (wl-draft-forward-make-subject subject)) (setq references (nconc (std11-field-bodies '("References" "In-Reply-To")) (list (elmo-get-message-id-from-buffer)))) (setq references (delq nil references) references (mapconcat 'identity references " ") references (wl-draft-parse-msg-id-list-string references) references (wl-delete-duplicates references) references (when references (mapconcat 'identity references "\n\t")))) (and wl-draft-use-frame (get-buffer-window summary-buf) (select-window (get-buffer-window summary-buf))) (wl-draft (list (cons 'To "") (cons 'Subject subject) (cons 'References references)) nil nil nil nil parent-folder number)) (goto-char (point-max)) (wl-draft-insert-message) (mail-position-on-field "To") (setq wl-draft-config-variables (append wl-draft-parent-variables wl-draft-config-variables)) (wl-draft-config-info-operation wl-draft-buffer-message-number 'save) (run-hooks 'wl-draft-forward-hook)) (defun wl-draft-self-reply-p () "Return t when From address in the current message is user's self one or not." (wl-address-user-mail-address-p (or (std11-field-body "From") ""))) (defun wl-draft-find-reply-headers (rule-symbol) (let ((rule-list (symbol-value rule-symbol)) condition-match-p result) (setq condition-match-p (lambda (condition) (cond ((stringp condition) (std11-field-body condition)) ((functionp condition) (funcall condition)) ((consp condition) (and (funcall condition-match-p (car condition)) (funcall condition-match-p (cdr condition)))) ((null condition)) (t (error "Unkown condition in `%s'" rule-symbol))))) (while (and (null result) rule-list) (let ((rule (car rule-list))) (when (funcall condition-match-p (car rule)) (setq result (cdr rule))) (setq rule-list (cdr rule-list)))) result)) (defun wl-draft-reply (buf with-arg summary-buf &optional number) "Create draft for replying to the message in buffer BUF. Recipients are prepared along `wl-draft-reply-without-argument-list', or `wl-draft-reply-with-argument-list' if WITH-ARG argument is non-nil." ;;;(save-excursion (let ((rule-list (if with-arg 'wl-draft-reply-with-argument-list 'wl-draft-reply-without-argument-list)) reply-headers to mail-followup-to cc subject in-reply-to references newsgroups to-alist cc-alist decoder parent-folder) (when (buffer-live-p summary-buf) (with-current-buffer summary-buf (setq parent-folder (wl-summary-buffer-folder-name)))) (set-buffer (or buf mime-mother-buffer)) (setq reply-headers (or (wl-draft-find-reply-headers rule-list) (error "No match field: check your `%s'" rule-list))) (let ((r-to-list (nth 0 reply-headers)) (r-cc-list (nth 1 reply-headers)) (r-ng-list (nth 2 reply-headers))) (setq to (wl-concat-list (nconc (if (functionp r-to-list) (funcall r-to-list) (elmo-multiple-fields-body-list r-to-list)) (and (member "Followup-To" r-ng-list) (string= (std11-field-body "Followup-To") "poster") (progn (setq r-ng-list (delete "Followup-To" (copy-sequence r-ng-list))) (elmo-multiple-fields-body-list '("From"))))) ",")) (setq cc (wl-concat-list (if (functionp r-cc-list) (funcall r-cc-list) (elmo-multiple-fields-body-list r-cc-list)) ",")) (setq newsgroups (wl-concat-list (if (functionp r-ng-list) (funcall r-ng-list) (std11-field-bodies r-ng-list)) ","))) (setq subject (std11-field-body "Subject")) (setq to (elmo-parse-addresses to) cc (elmo-parse-addresses cc)) (with-temp-buffer ; to keep raw buffer unibyte. (set-buffer-multibyte t) (setq decoder (mime-find-field-decoder 'Subject 'plain)) (setq subject (if (and subject decoder) (funcall decoder subject) subject)) (setq to-alist (mapcar (lambda (addr) (setq decoder (mime-find-field-decoder 'To 'plain)) (cons (nth 1 (std11-extract-address-components addr)) (if decoder (funcall decoder addr) addr))) to)) (setq cc-alist (mapcar (lambda (addr) (setq decoder (mime-find-field-decoder 'Cc 'plain)) (cons (nth 1 (std11-extract-address-components addr)) (if decoder (funcall decoder addr) addr))) cc))) (setq subject (wl-draft-reply-make-subject subject)) (setq in-reply-to (elmo-get-message-id-from-buffer)) (setq references (nconc (std11-field-bodies '("References" "In-Reply-To")) (list in-reply-to))) (setq to (delq nil (mapcar 'car to-alist))) (setq cc (delq nil (mapcar 'car cc-alist))) ;; if subscribed mailing list is contained in cc or to ;; and myself is contained in cc, ;; delete myself from cc. (setq cc (wl-draft-delete-myself-from-cc to cc)) (when wl-insert-mail-followup-to (setq mail-followup-to (wl-draft-make-mail-followup-to (append to cc))) (setq mail-followup-to (wl-delete-duplicates mail-followup-to nil t))) (with-temp-buffer ; to keep raw buffer unibyte. (set-buffer-multibyte t) (setq newsgroups (elmo-parse newsgroups "[ \t\f\r\n,]*\\([^ \t\f\r\n,]+\\)") newsgroups (wl-delete-duplicates newsgroups) newsgroups (if newsgroups (mapconcat (lambda (grp) (setq decoder (mime-find-field-decoder 'Newsgroups 'plain)) (if decoder (funcall decoder grp) grp)) newsgroups ",")))) (setq to (wl-delete-duplicates to nil t)) (setq cc (wl-delete-duplicates (append (wl-delete-duplicates cc nil t) to (copy-sequence to)) t t)) (and to (setq to (mapconcat (lambda (addr) (if wl-draft-reply-use-address-with-full-name (or (cdr (assoc addr to-alist)) addr) addr)) to ",\n\t"))) (and cc (setq cc (mapconcat (lambda (addr) (if wl-draft-reply-use-address-with-full-name (or (cdr (assoc addr cc-alist)) addr) addr)) cc ",\n\t"))) (and mail-followup-to (setq mail-followup-to (mapconcat (lambda (addr) (if wl-draft-reply-use-address-with-full-name (or (cdr (assoc addr (append to-alist cc-alist))) addr) addr)) mail-followup-to ",\n\t"))) (and (null to) (setq to cc cc nil)) (setq references (delq nil references) references (mapconcat 'identity references " ") references (wl-draft-parse-msg-id-list-string references) references (wl-delete-duplicates references) references (if references (mapconcat 'identity references "\n\t"))) (and wl-draft-use-frame (get-buffer-window summary-buf) (select-window (get-buffer-window summary-buf))) (wl-draft (list (cons 'To to) (cons 'Cc cc) (cons 'Newsgroups newsgroups) (cons 'Subject subject) (cons 'In-Reply-To in-reply-to) (cons 'References references) (cons 'Mail-Followup-To mail-followup-to)) nil nil nil nil parent-folder number) (setq wl-draft-reply-buffer buf) (setq wl-draft-config-variables (append wl-draft-parent-variables wl-draft-config-variables)) (wl-draft-config-info-operation wl-draft-buffer-message-number 'save)) (run-hooks 'wl-draft-reply-hook)) (defun wl-draft-reply-position (position) (cond ((eq position 'body) (wl-draft-body-goto-top)) ((eq position 'bottom) (wl-draft-body-goto-bottom)) ((eq position 'top) (goto-char (point-min))) ((and (stringp position) (std11-field-body position)) (progn (mail-position-on-field position) (wl-draft-beginning-of-line))) ((listp position) (while (car position) (wl-draft-reply-position (car position)) (setq position (cdr position)))))) (defun wl-draft-add-references () (wl-draft-add-in-reply-to "References")) (defun wl-draft-add-in-reply-to (&optional alt-field) (let* ((mes-id (with-current-buffer mail-reply-buffer (elmo-get-message-id-from-buffer))) (field (or alt-field "In-Reply-To")) (ref (std11-field-body field)) (ref-list nil) (st nil)) (when (and mes-id ref) (while (string-match "<[^>]+>" ref st) (setq ref-list (cons (substring ref (match-beginning 0) (setq st (match-end 0))) ref-list))) (when (and ref-list (member mes-id ref-list)) (setq mes-id nil))) (when mes-id (save-excursion (when (mail-position-on-field field) (forward-line) (while (looking-at "^[ \t]") (forward-line)) (setq mes-id (concat "\t" mes-id "\n"))) (insert mes-id)) t))) (defun wl-draft-yank-from-mail-reply-buffer (decode-it &optional ignored-fields) (interactive) (save-restriction (narrow-to-region (point)(point)) (insert (string-as-multibyte (with-current-buffer mail-reply-buffer (when decode-it (decode-mime-charset-region (point-min) (point-max) wl-mime-charset)) (buffer-substring-no-properties (point-min) (point-max))))) (when ignored-fields (goto-char (point-min)) (wl-draft-delete-fields ignored-fields)) (goto-char (point-max)) (push-mark (point) nil t) (goto-char (point-min))) (let ((beg (point))) (cond (mail-citation-hook (run-hooks 'mail-citation-hook)) (wl-draft-cite-function (funcall wl-draft-cite-function))) ; default cite (run-hooks 'wl-draft-cited-hook) (when (if wl-draft-add-references (wl-draft-add-references) (if wl-draft-add-in-reply-to (wl-draft-add-in-reply-to))) (unless (eq wl-draft-real-time-highlight 'jit) (wl-highlight-headers 'for-draft))) ; highlight when added References: (when (and wl-highlight-body-too (not (eq wl-draft-real-time-highlight 'jit))) (wl-highlight-body-region beg (point-max))))) (defun wl-message-news-p () "If exist valid Newsgroups field, return non-nil." (std11-field-body "Newsgroups")) (defun wl-message-field-exists-p (field) "If FIELD exist and FIELD value is not empty, return non-nil." (let ((value (std11-field-body field))) (and value (not (string= value ""))))) (defun wl-message-mail-p () "If exist To, Cc or Bcc field, return non-nil." (or (wl-message-field-exists-p "To") (wl-message-field-exists-p "Resent-to") (wl-message-field-exists-p "Cc") (wl-message-field-exists-p "Bcc") (wl-message-field-exists-p wl-draft-mime-bcc-field-name) ;;; This may be needed.. ;;; (wl-message-field-exists-p "Fcc") )) (defun wl-draft-edit-string (string) (let ((tmp-buf (get-buffer-create " *wl-draft-edit-string*")) to subject in-reply-to cc references newsgroups mail-followup-to content-type content-transfer-encoding from) (set-buffer tmp-buf) (erase-buffer) (insert string) (setq to (std11-field-body "To")) (setq to (and to (eword-decode-string (decode-mime-charset-string to wl-mime-charset)))) (setq subject (std11-field-body "Subject")) (setq subject (and subject (eword-decode-string (decode-mime-charset-string subject wl-mime-charset)))) (setq from (std11-field-body "From") from (and from (eword-decode-string (decode-mime-charset-string from wl-mime-charset)))) (setq in-reply-to (std11-field-body "In-Reply-To")) (setq cc (std11-field-body "Cc")) (setq cc (and cc (eword-decode-string (decode-mime-charset-string cc wl-mime-charset)))) (setq references (std11-field-body "References")) (setq newsgroups (std11-field-body "Newsgroups")) (setq mail-followup-to (std11-field-body "Mail-Followup-To")) (setq content-type (std11-field-body "Content-Type")) (setq content-transfer-encoding (std11-field-body "Content-Transfer-Encoding")) (goto-char (point-min)) (or (re-search-forward "\n\n" nil t) (search-forward (concat mail-header-separator "\n") nil t)) (unwind-protect (set-buffer (wl-draft (list (cons 'From (if (wl-address-user-mail-address-p from) from)) (cons 'To to) (cons 'Cc cc) (cons 'Subject subject) (cons 'Newsgroups newsgroups) (cons 'Mail-Followup-To mail-followup-to) (cons 'In-Reply-To in-reply-to) (cons 'References references)) content-type content-transfer-encoding (buffer-substring (point) (point-max)) 'edit-again)) (kill-buffer tmp-buf)) ;; Set cursor point to the top. (goto-char (point-min)) (search-forward (concat mail-header-separator "\n") nil t) (run-hooks 'wl-draft-reedit-hook) (and to (mail-position-on-field "To")))) (defun wl-draft-insert-current-message (_dummy) (interactive) (let (original-buffer mail-reply-buffer mail-citation-hook wl-draft-add-references wl-draft-add-in-reply-to wl-draft-cite-function) (if (and wl-draft-buffer-cur-summary-buffer (with-current-buffer wl-draft-buffer-cur-summary-buffer (and wl-message-buffer (with-current-buffer wl-message-buffer (setq original-buffer (wl-message-get-original-buffer)) (not (zerop (with-current-buffer original-buffer (buffer-size)))))))) (progn (setq mail-reply-buffer original-buffer) (wl-draft-yank-from-mail-reply-buffer nil wl-ignored-forwarded-headers)) (when (string= (mime-make-tag "message" "rfc822") (buffer-substring-no-properties (point-at-bol 0)(point-at-eol 0))) (delete-region (point-at-bol 0) (1+ (point-at-eol 0)))) (error "No current message")))) (defun wl-draft-insert-get-message (_dummy) (let ((fld (completing-read "Folder name: " (if (memq 'read-folder wl-use-folder-petname) (wl-folder-get-entity-with-petname) wl-folder-entity-hashtb) nil nil nil 'wl-read-folder-history wl-default-spec)) (number (call-interactively (lambda (num) (interactive "nNumber: ") num))) (mail-reply-buffer (get-buffer-create "*wl-draft-insert-get-message*")) mail-citation-hook wl-draft-cite-function) (unwind-protect (progn (with-current-buffer mail-reply-buffer (erase-buffer) (elmo-message-fetch (wl-folder-get-elmo-folder fld) number ;; No cache. (elmo-make-fetch-strategy 'entire))) (wl-draft-yank-from-mail-reply-buffer nil)) (kill-buffer mail-reply-buffer)))) ;; ;; default body citation func ;; (defun wl-default-draft-cite () (let ((mail-yank-ignored-headers "[^:]+:") (mail-yank-prefix "> ") date from) (save-restriction (if (< (mark t) (point)) (exchange-point-and-mark)) (narrow-to-region (point)(point-max)) (setq date (std11-field-body "date") from (std11-field-body "from"))) (when (or date from) (insert (format wl-default-draft-cite-header-format-string (if date (if (stringp wl-default-draft-cite-date-format-string) (let ((system-time-locale (or wl-default-draft-cite-time-locale system-time-locale))) (format-time-string wl-default-draft-cite-date-format-string (elmo-time-parse-date-string date))) (concat "On " (if wl-default-draft-cite-date-format-string (wl-make-date-string (elmo-time-parse-date-string date)) date))) wl-default-draft-cite-no-date-string) (funcall (if wl-default-draft-cite-decorate-author wl-summary-from-function #'identity) (or from wl-default-draft-cite-no-author-string))))) (mail-indent-citation))) (defvar wl-draft-buffer nil "Draft buffer to yank content.") (defun wl-draft-yank-to-draft-buffer (buffer) "Yank BUFFER content to `wl-draft-buffer'." (set-buffer wl-draft-buffer) (let ((mail-reply-buffer buffer)) (wl-draft-yank-from-mail-reply-buffer nil) (kill-buffer buffer))) (defun wl-draft-yank-original (&optional arg) "Yank original message." (interactive "P") (if arg (let ((draft-buffer (current-buffer)) mail-reply-buffer) (with-temp-buffer (insert "\n") (yank) (setq mail-reply-buffer (current-buffer)) (with-current-buffer draft-buffer (wl-draft-yank-from-mail-reply-buffer nil)))) (wl-draft-yank-current-message-entity))) (defun wl-draft-hide (editing-buffer) "Hide the editing draft buffer if possible." (when (and editing-buffer (buffer-live-p editing-buffer) (get-buffer-window editing-buffer)) (select-window (get-buffer-window editing-buffer)) (let ((sum-buf wl-draft-buffer-cur-summary-buffer) fld-buf sum-win fld-win) (if (and wl-draft-use-frame (> (length (visible-frame-list)) 1)) ;; hide draft frame (delete-frame) ;; hide draft window (if (wl-window-deletable-p) (delete-window)) ;; stay folder window if required (when wl-stay-folder-window (if (setq fld-buf (get-buffer wl-folder-buffer-name)) (if (setq fld-win (get-buffer-window fld-buf)) (select-window fld-win) (if wl-draft-resume-folder-window ;; resume folder window (switch-to-buffer fld-buf))))) (if (buffer-live-p sum-buf) (if (setq sum-win (get-buffer-window sum-buf t)) ;; if Summary is on the frame, select it. (select-window sum-win) ;; if summary is not on the frame, switch to it. (if (and wl-stay-folder-window (or wl-draft-resume-folder-window fld-win)) (wl-folder-select-buffer sum-buf) (switch-to-buffer sum-buf)))))))) (defun wl-draft-delete (editing-buffer) "Kill the editing draft buffer and delete the file corresponds to it." (when editing-buffer (with-current-buffer editing-buffer (when wl-draft-buffer-message-number (elmo-folder-delete-messages (wl-draft-get-folder) (list wl-draft-buffer-message-number)) (wl-draft-config-info-operation wl-draft-buffer-message-number 'delete)) (set-buffer-modified-p nil) ; force kill (kill-buffer editing-buffer)))) (defun wl-draft-kill (&optional force-kill) "Kill current draft buffer and quit editing." (interactive "P") (save-excursion (when (and (or (eq major-mode 'wl-draft-mode) (eq major-mode 'mail-mode)) (or force-kill (yes-or-no-p "Kill Current Draft? "))) (let ((cur-buf (current-buffer))) (run-hooks 'wl-draft-kill-pre-hook) (wl-draft-hide cur-buf) (wl-draft-delete cur-buf))) (message ""))) (defun wl-draft-fcc () "Add a new Fcc field, with file name completion." (interactive) (or (mail-position-on-field "fcc" t) ;Put new field after exiting Fcc. (mail-position-on-field "to")) (insert "\nFcc: ")) ;; Imported from message.el. (defun wl-draft-elide-region (b e) "Elide the text in the region. An ellipsis (from `wl-draft-elide-ellipsis') will be inserted where the text was killed." (interactive "r") (kill-region b e) (insert wl-draft-elide-ellipsis)) ;; Imported from message.el. (defun wl-draft-beginning-of-line (&optional n) "Move point to beginning of header value or to beginning of line." (interactive "p") (if (wl-draft-point-in-header-p) (let* ((here (point)) (bol (progn (beginning-of-line n) (point))) (eol (line-end-position)) (eoh (and (looking-at "[^ \t]") (re-search-forward ": *" eol t)))) (if (and eoh (or (> here eoh) (= here bol))) (goto-char eoh) (goto-char bol))) (beginning-of-line n))) (defun wl-draft-point-in-header-p () "Return t if point is in the header." (save-excursion (let ((p (point))) (goto-char (point-min)) (not (re-search-forward (concat "^" (regexp-quote mail-header-separator) "\n") p t))))) ;; function for wl-sent-message-via (defmacro wl-draft-sent-message-p (type) `(eq (nth 1 (assq ,type wl-sent-message-via)) 'sent)) (defmacro wl-draft-set-sent-message (type result &optional server-port) `(let ((element (assq ,type wl-sent-message-via))) (if element (unless (eq (nth 1 element) ,result) (setcdr element (list ,result ,server-port)) (setq wl-sent-message-modified t)) (push (list ,type ,result ,server-port) wl-sent-message-via) (setq wl-sent-message-modified t)))) (defun wl-draft-sent-message-results () (let ((results wl-sent-message-via) unplugged-via sent-via) (while results (cond ((eq (nth 1 (car results)) 'unplugged) (push (caar results) unplugged-via)) ((eq (nth 1 (car results)) 'sent) (push (caar results) sent-via))) (setq results (cdr results))) (list unplugged-via sent-via))) (defun wl-draft-write-sendlog (status proto server to id) "Write send log file, if `wl-draft-sendlog' is non-nil." (when wl-draft-sendlog (with-temp-buffer (let* ((filename (expand-file-name wl-draft-sendlog-filename elmo-msgdb-directory)) (filesize (nth 7 (file-attributes filename))) (server (if server (concat " server=" server) "")) (to (if to (cond ((memq proto '(fcc queue)) (format " folder=\"%s\"" to)) ((eq proto 'nntp) (format " ng=<%s>" to)) (t (concat " to=" (mapconcat 'identity (mapcar (lambda (x) (format "<%s>" x)) to) ",")))) "")) (id (if id (concat " id=" id) "")) (time (format-time-string "%Y/%m/%d %T"))) (insert (format "%s proto=%s stat=%s%s%s%s\n" time proto status server to id)) (if (and wl-draft-sendlog-max-size filesize (> filesize wl-draft-sendlog-max-size)) (rename-file filename (concat filename ".old") t)) (if (file-writable-p filename) (write-region-as-binary (point-min) (point-max) filename t 'no-msg) (message "%s is not writable." filename)))))) (defun wl-draft-get-header-delimiter (&optional delete) ;; If DELETE is non-nil, replace the header delimiter with a blank line (let (delimline) (goto-char (point-min)) (when (re-search-forward (concat "^" (regexp-quote mail-header-separator) "$\\|^$") nil t) (replace-match "") (if delete (backward-char)) (setq delimline (point-marker))) delimline)) (defun wl-draft-send-mail-with-qmail () "Pass the prepared message buffer to qmail-inject. Refer to the documentation for the variable `send-mail-function' to find out how to use this." (if (and wl-draft-qmail-send-plugged (not (elmo-plugged-p))) (wl-draft-set-sent-message 'mail 'unplugged) ;; send the message (run-hooks 'wl-mail-send-pre-hook) ;; X-PGP-Sig, Cancel-Lock (let ((id (elmo-get-message-id-from-buffer)) (to (std11-field-body "To"))) (cl-case (as-binary-process (apply 'call-process-region 1 (point-max) wl-qmail-inject-program nil nil nil wl-qmail-inject-args)) ;; qmail-inject doesn't say anything on it's stdout/stderr, ;; we have to look at the retval instead (0 (progn (wl-draft-set-sent-message 'mail 'sent) (wl-draft-write-sendlog 'ok 'qmail nil (list to) id))) (1 (error "`qmail-inject' reported permanent failure")) (111 (error "`qmail-inject' reported transient failure")) ;; should never happen (t (error "`qmail-inject' reported unknown failure")))))) (defun wl-draft-parse-msg-id-list-string (string) "Get msg-id list from STRING." (let (msg-id-list) (dolist (parsed-id (std11-parse-msg-ids-string string)) (when (eq (car parsed-id) 'msg-id) (setq msg-id-list (cons (std11-msg-id-string parsed-id) msg-id-list)))) (nreverse msg-id-list))) (defun wl-draft-eword-encode-address-list (string &optional column) "Encode header field STRING as list of address, and return the result. Cause an error when STRING contains invalid address. Optional argument COLUMN is start-position of the field." (car (eword-encode-rword-list (or column eword-encode-default-start-column) (eword-encode-addresses-to-rword-list (wl-draft-std11-parse-addresses (std11-lexical-analyze string)))))) (defun wl-draft-std11-parse-addresses (lal) (let ((ret (std11-parse-address lal))) (when (and (not (and (eq (length lal) 1) (eq (car (car lal)) 'spaces))) (null ret)) (error "Error while parsing address")) (if ret (let ((dest (list (car ret)))) (setq lal (cdr ret)) (while (and (setq ret (std11-parse-ascii-token lal)) (string-equal (cdr (assq 'specials (car ret))) ",") (setq ret (std11-parse-address (cdr ret)))) (setq dest (cons (car ret) dest)) (setq lal (cdr ret))) (while (eq 'spaces (car (car lal))) (setq lal (cdr lal))) (if lal (error "Error while parsing address")) (nreverse dest))))) (defun wl-draft-parse-mailbox-list (field &optional remove-group-list) "Get mailbox list of FIELD from current buffer. The buffer is expected to be narrowed to just the headers of the message. If optional argument REMOVE-GROUP-LIST is non-nil, remove group list content from current buffer." (save-excursion (let ((case-fold-search t) (inhibit-read-only t) (regexp (concat "^" (regexp-quote field) "[\t ]*:")) addresses address mailbox-list beg seq has-group-list) (goto-char (point-min)) (while (re-search-forward regexp nil t) (setq beg (point)) (re-search-forward "^[^ \t]" nil 'move) (beginning-of-line) (skip-chars-backward "\n") (setq seq (std11-lexical-analyze (buffer-substring-no-properties beg (point)))) (setq addresses (wl-draft-std11-parse-addresses seq)) (while addresses (cond ((eq (car (car addresses)) 'group) (setq has-group-list t) (setq mailbox-list (nconc mailbox-list (mapcar 'std11-address-string (nth 2 (car addresses)))))) ((eq (car (car addresses)) 'mailbox) (setq address (nth 1 (car addresses))) (setq mailbox-list (nconc mailbox-list (list (std11-addr-to-string (if (eq (car address) 'phrase-route-addr) (nth 2 address) (cdr address)))))))) (setq addresses (cdr addresses))) (when (and remove-group-list has-group-list) (delete-region beg (point)) (insert (wl-address-string-without-group-list-contents seq)))) mailbox-list))) (defun wl-draft-deduce-address-list (_buffer header-start header-end) "Get address list suitable for smtp RCPT TO:
. Group list content is removed if `wl-draft-remove-group-list-contents' is non-nil." (let ((fields (if (and wl-draft-doing-mime-bcc wl-draft-disable-bcc-for-mime-bcc) '("to" "cc") '("to" "cc" "bcc"))) (resent-fields '("resent-to" "resent-cc" "resent-bcc")) (case-fold-search t) recipients) (save-excursion (save-restriction (narrow-to-region header-start header-end) (goto-char (point-min)) (save-excursion (if (re-search-forward "^resent-to[\t ]*:" nil t) (setq fields resent-fields))) (while fields (setq recipients (nconc recipients (wl-draft-parse-mailbox-list (car fields) wl-draft-remove-group-list-contents))) (setq fields (cdr fields))) recipients)))) (eval-when-compile (require 'smtp)) (declare-function smtp-send-buffer "smtp" (sender recipients buffer)) ;; ;; from Semi-gnus ;; (defun wl-draft-send-mail-with-smtp () "Send the prepared message buffer with SMTP." (require 'smtp) (let* ((errbuf (if mail-interactive (generate-new-buffer " smtp errors") 0)) (case-fold-search t) (sender (or wl-envelope-from (wl-address-header-extract-address wl-from))) (delimline (save-excursion (goto-char (point-min)) (re-search-forward (concat "^" (regexp-quote mail-header-separator) "$\\|^$") nil t) (point-marker))) (smtp-server (or wl-smtp-posting-server smtp-server "localhost")) (smtp-service (or wl-smtp-posting-port smtp-service)) (smtp-local-domain (or smtp-local-domain wl-local-domain)) (id (elmo-get-message-id-from-buffer)) recipients) (if (not (elmo-plugged-p smtp-server smtp-service)) (wl-draft-set-sent-message 'mail 'unplugged (cons smtp-server smtp-service)) (unwind-protect (save-excursion ;; Instead of `smtp-deduce-address-list'. (setq recipients (wl-draft-deduce-address-list (current-buffer) (point-min) delimline)) (unless recipients (error "No recipients")) ;; 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)) (run-hooks 'wl-mail-send-pre-hook) ;; X-PGP-Sig, Cancel-Lock (if mail-interactive (with-current-buffer errbuf (erase-buffer))) (wl-draft-delete-field "bcc" delimline) (wl-draft-delete-field "resent-bcc" delimline) (let (process-connection-type) (as-binary-process (when recipients (wl-smtp-extension-bind (condition-case err (smtp-send-buffer sender recipients (current-buffer)) (error (wl-draft-write-sendlog 'failed 'smtp smtp-server recipients id) (if (and (eq (car err) 'smtp-response-error) (= (nth 1 err) 535)) (elmo-remove-passwd (wl-smtp-password-key smtp-sasl-user-name (car smtp-sasl-mechanisms) smtp-server smtp-service))) (signal (car err) (cdr err))) (quit (wl-draft-write-sendlog 'uncertain 'smtp smtp-server recipients id) (signal (car err) (cdr err))))) (wl-draft-set-sent-message 'mail 'sent) (wl-draft-write-sendlog 'ok 'smtp smtp-server recipients id))))) (if (bufferp errbuf) (kill-buffer errbuf)))))) (autoload 'elmo-pop3-get-session "elmo-pop3") (defun wl-draft-send-mail-with-pop-before-smtp () "Send the prepared message buffer with POP-before-SMTP." (require 'elmo-pop3) (let ((folder (luna-make-entity 'elmo-pop3-folder :user (or wl-pop-before-smtp-user elmo-pop3-default-user) :server (or wl-pop-before-smtp-server elmo-pop3-default-server) :port (or wl-pop-before-smtp-port elmo-pop3-default-port) :auth (or wl-pop-before-smtp-authenticate-type elmo-pop3-default-authenticate-type) :stream-type (elmo-get-network-stream-type (or wl-pop-before-smtp-stream-type elmo-pop3-default-stream-type)))) session) (condition-case error (progn (setq session (elmo-pop3-get-session folder)) (when session (elmo-network-close-session session))) (error (unless (string= (nth 1 error) "Unplugged") (signal (car error) (cdr error)))))) (wl-draft-send-mail-with-smtp)) (defun wl-draft-send-mail-with-sendmail () "Send the prepared message buffer with `sendmail-send-it'. The function `sendmail-send-it' uses the external program `sendmail-program'." (require 'sendmail) (let ((id (elmo-get-message-id-from-buffer)) (to (std11-field-body "to"))) (run-hooks 'wl-mail-send-pre-hook) (condition-case err ;; Prevent select-message-coding-system checks from checking for ;; a MIME charset -- message is already encoded. (let (select-safe-coding-system-function) (setq buffer-file-coding-system 'raw-text) (sendmail-send-it)) (error (wl-draft-write-sendlog 'failed 'sendmail nil (list to) id) (signal (car err) (cdr err)))) (wl-draft-set-sent-message 'mail 'sent) (wl-draft-write-sendlog 'ok 'sendmail nil (list to) id))) (defun wl-draft-insert-required-fields (&optional force-msgid) "Insert Message-ID, Date, and From field. If FORCE-MSGID, insert message-id regardless of `wl-insert-message-id'." ;; Insert Message-Id field... (goto-char (point-min)) (when (and (or force-msgid wl-insert-message-id) (not (re-search-forward "^Message-ID[ \t]*:" nil t))) (insert (concat "Message-ID: " (funcall wl-message-id-function) "\n"))) ;; Insert date field. (goto-char (point-min)) (or (re-search-forward "^Date[ \t]*:" nil t) (wl-draft-insert-date-field)) ;; Insert from field. (goto-char (point-min)) (or (re-search-forward "^From[ \t]*:" nil t) (wl-draft-insert-from-field))) (defun wl-draft-normal-send-func (editing-buffer kill-when-done) "Send the message in the current buffer." (save-restriction (narrow-to-region (goto-char (point-min)) (if (re-search-forward (concat "^" (regexp-quote mail-header-separator) "$") nil t) (match-beginning 0) (point-max))) (wl-draft-insert-required-fields) ;; ignore any blank lines in the header (while (progn (goto-char (point-min)) (re-search-forward "\n[ \t]*\n\n*" nil t)) (replace-match "\n")) (goto-char (point-min)) (while (re-search-forward "^[^ \t\n:]+:[ \t]*\\(.*\\(\n[ \t].*\\)*\\)\n" nil t) (when (string= "" (match-string 1)) (replace-match "")))) ;;; (run-hooks 'wl-mail-send-pre-hook) ; X-PGP-Sig, Cancel-Lock (wl-draft-dispatch-message) (when kill-when-done ;; hide editing-buffer. (wl-draft-hide editing-buffer) ;; delete editing-buffer and its file. (wl-draft-delete editing-buffer))) (defun wl-draft-dispatch-message (&optional mes-string) "Send the message in the current buffer. Not modified the header fields." (let (delimline mime-bcc) (if (and wl-draft-verbose-send mes-string) (message "%s" mes-string)) ;; get fcc folders. (setq delimline (wl-draft-get-header-delimiter t)) (unless wl-draft-fcc-list (setq wl-draft-fcc-list (wl-draft-get-fcc-list delimline))) ;; (setq wl-sent-message-modified nil) (unwind-protect (progn (if (and (wl-message-mail-p) (not (wl-draft-sent-message-p 'mail))) (if (or (not (or wl-draft-force-queuing wl-draft-force-queuing-mail)) (memq 'mail wl-sent-message-queued)) (progn (setq mime-bcc (wl-draft-mime-bcc-field)) (funcall wl-draft-send-mail-function) (when (not (zerop (length mime-bcc))) (wl-draft-do-mime-bcc mime-bcc))) (push 'mail wl-sent-message-queued) (wl-draft-set-sent-message 'mail 'unplugged))) (if (and (wl-message-news-p) (not (wl-draft-sent-message-p 'news)) (not (wl-message-field-exists-p "Resent-to"))) (if (or (not (or wl-draft-force-queuing wl-draft-force-queuing-news)) (memq 'news wl-sent-message-queued)) (funcall wl-draft-send-news-function) (push 'news wl-sent-message-queued) (wl-draft-set-sent-message 'news 'unplugged)))) (let* ((status (wl-draft-sent-message-results)) (unplugged-via (car status)) (sent-via (nth 1 status))) ;; If one sent, process fcc folder. (if (and sent-via wl-draft-fcc-list) (progn (wl-draft-do-fcc (wl-draft-get-header-delimiter) wl-draft-fcc-list) (setq wl-draft-fcc-list nil))) (if wl-draft-use-cache (let ((id (std11-field-body "Message-ID")) (elmo-enable-disconnected-operation t)) (elmo-file-cache-save (elmo-file-cache-get-path id) nil))) ;; If one unplugged, append queue. (when (and unplugged-via wl-sent-message-modified) (if wl-draft-enable-queuing (progn (wl-draft-queue-append wl-sent-message-via) (setq wl-sent-message-modified 'requeue)) (error "Unplugged"))) (when wl-draft-verbose-send (if (and unplugged-via sent-via);; combined message (progn (setq wl-draft-verbose-msg (format "Sending%s and Queuing%s..." sent-via unplugged-via)) (message "%sdone" wl-draft-verbose-msg)) (if mes-string (message "%s%s" mes-string (if sent-via "done" "failed")))))))) (not wl-sent-message-modified)) ;; return value (defun wl-draft-raw-send (&optional kill-when-done force-pre-hook mes-string) "Force send current buffer as raw message." (interactive) (save-excursion (let (wl-interactive-send ;;; wl-draft-verbose-send (wl-mail-send-pre-hook (and force-pre-hook wl-mail-send-pre-hook)) (wl-news-send-pre-hook (and force-pre-hook wl-news-send-pre-hook)) mail-send-hook mail-send-actions) (wl-draft-send kill-when-done mes-string)))) (defun wl-draft-clone-local-variables () (let ((locals (buffer-local-variables)) result) (while locals (when (and (consp (car locals)) (car (car locals)) (string-match wl-draft-clone-local-variable-regexp (symbol-name (car (car locals))))) (wl-append result (list (car (car locals))))) (setq locals (cdr locals))) result)) (defcustom wl-draft-send-confirm-with-preview t "*Non-nil to invoke preview through confirmation of sending. This variable is valid when `wl-interactive-send' has non-nil value." :type 'boolean :group 'wl-draft) (defun wl-draft-send-confirm () (unwind-protect (condition-case nil (progn (when wl-draft-send-confirm-with-preview (let (wl-draft-send-hook) (wl-draft-preview-message))) (save-excursion (goto-char (point-min)) ; to show recipients in header (funcall (if (functionp wl-draft-send-confirm-type) wl-draft-send-confirm-type (lambda (prompt) (wl-y-or-n-p-with-scroll prompt (eq wl-draft-send-confirm-type 'scroll-by-SPC/BS)))) "Send current draft? "))) (quit nil)) (when (and wl-draft-send-confirm-with-preview (eq major-mode 'mime-view-mode)) (wl-mime-quit-preview)))) (defun wl-draft-send (&optional kill-when-done mes-string) "Send current draft message. If KILL-WHEN-DONE is non-nil, current draft buffer is killed" (interactive) ;;; Don't call this explicitly. ;;; Added to 'wl-draft-send-hook (by teranisi) ;;; (wl-draft-config-exec) (run-hooks 'wl-draft-send-hook) (when (or (not wl-interactive-send) (wl-draft-send-confirm)) (let ((send-mail-function 'wl-draft-raw-send) (editing-buffer (current-buffer)) (sending-buffer (wl-draft-generate-clone-buffer " *wl-draft-sending-buffer*" (append wl-draft-config-variables (wl-draft-clone-local-variables)))) (parent-flag wl-draft-parent-flag) (parent-number wl-draft-parent-number) (parent-folder wl-draft-parent-folder) (wl-draft-verbose-msg nil)) (unwind-protect (with-current-buffer sending-buffer (if (and (not (wl-message-mail-p)) (not (wl-message-news-p))) (error "No recipient is specified")) (expand-abbrev) ; for mail-abbrevs (let ((mime-header-encode-method-alist (append '((wl-draft-eword-encode-address-list . (To Cc Bcc Resent-To Resent-Cc Resent-Bcc From))) mime-header-encode-method-alist))) (run-hooks 'mail-send-hook) ; translate buffer ) ;; (if wl-draft-verbose-send (message "%s" (or mes-string "Sending..."))) ;; Set flag before send-function because ;; there's no need to change current mailbox at this time. ;; If flag is set after send-function, the current mailbox ;; might changed by Fcc. ;; It causes a huge loss in the IMAP folder. (when (and parent-flag parent-number (not (zerop (length parent-folder)))) (condition-case nil (wl-folder-set-persistent-mark parent-folder parent-number parent-flag) (error (message "Set mark (%s) failed" (symbol-name parent-flag))))) (funcall wl-draft-send-function editing-buffer kill-when-done) ;; Now perform actions on successful sending. (while mail-send-actions (condition-case () (apply (car (car mail-send-actions)) (cdr (car mail-send-actions))) (error)) (setq mail-send-actions (cdr mail-send-actions))) (if wl-draft-verbose-send (message "%sdone" (or wl-draft-verbose-msg mes-string "Sending...")))) ;; kill sending buffer, anyway. (and (buffer-live-p sending-buffer) (kill-buffer sending-buffer)))))) (defun wl-draft-mime-bcc-field () "Return the MIME-Bcc field body. The field is deleted." (prog1 (std11-field-body wl-draft-mime-bcc-field-name) (wl-draft-delete-field wl-draft-mime-bcc-field-name))) (defun wl-draft-do-mime-bcc (field-body) "Send MIME-Bcc (Encapsulated blind carbon copy)." (let ((orig-from (mime-decode-field-body (std11-field-body "from") 'From)) (orig-subj (mime-decode-field-body (or (std11-field-body "subject") "") 'Subject)) (recipients (elmo-parse-addresses field-body)) (draft-buffer (current-buffer)) wl-draft-use-frame) (save-window-excursion (when (and (not wl-draft-doing-mime-bcc) ; To avoid infinite loop. (not (zerop (length field-body)))) (let ((wl-draft-doing-mime-bcc t)) (dolist (recipient recipients) (wl-draft-create-buffer) (wl-draft-create-contents (append `((From . ,orig-from) (To . ,recipient) (Subject . ,(concat "A blind carbon copy (" orig-subj ")"))) (wl-draft-default-headers))) (wl-draft-insert-mail-header-separator) (wl-draft-prepare-edit) (goto-char (point-max)) (insert (or wl-draft-mime-bcc-body "This is a blind carbon copy.") "\n") (mime-edit-insert-tag "message" "rfc822") (insert-buffer-substring draft-buffer) (let (wl-interactive-send) (wl-draft-send 'kill-when-done)))))))) (defun wl-draft-save () "Save current draft." (interactive) (if (buffer-modified-p) (progn (message "Saving...") (let ((msg (buffer-substring-no-properties (point-min) (point-max))) (current-number wl-draft-buffer-message-number) next-number) ;; If no header separator, insert it. (with-temp-buffer (insert msg) (goto-char (point-min)) (unless (re-search-forward (concat "^" (regexp-quote mail-header-separator) "$") nil t) (goto-char (point-min)) (if (re-search-forward "\n\n" nil t) (replace-match (concat "\n" mail-header-separator "\n")) (goto-char (point-max)) (insert (if (eq (preceding-char) ?\n) "" "\n") mail-header-separator "\n"))) (let ((mime-header-encode-method-alist (append '((eword-encode-unstructured-field-body . (To Cc Bcc Resent-To Resent-Cc Resent-Bcc From))) mime-header-encode-method-alist))) (mime-edit-translate-buffer)) (wl-draft-get-header-delimiter t) (when current-number (elmo-folder-delete-messages (wl-draft-get-folder) (list current-number)) (wl-draft-config-info-operation current-number 'delete)) (elmo-folder-check (wl-draft-get-folder)) (setq next-number (elmo-folder-append-buffer (wl-draft-get-folder) nil nil t))) (elmo-folder-check (wl-draft-get-folder)) (elmo-folder-commit (wl-draft-get-folder)) (if (not (numberp next-number)) (setq wl-draft-buffer-message-number nil) (setq wl-draft-buffer-message-number next-number) (rename-buffer (format "%s/%d" (if (memq 'modeline wl-use-folder-petname) (wl-folder-get-petname wl-draft-folder) wl-draft-folder) next-number) t) (wl-draft-config-info-operation wl-draft-buffer-message-number 'save)) (setq buffer-file-name (buffer-name)) (set-buffer-modified-p nil) (message "Saving...done"))) (message "(No changes need to be saved)"))) (defun wl-draft-mimic-kill-buffer () "Kill the current (draft) buffer with query." (interactive) (let* ((default (buffer-name)) (bufname (wl-read-buffer "Kill buffer: " default)) wl-draft-use-frame) (if (or (not bufname) (string-equal bufname "") (string-equal bufname (buffer-name))) (let ((bufname (current-buffer))) (when (or (not (buffer-modified-p)) (yes-or-no-p (format "Buffer %s modified; kill anyway? " bufname))) (set-buffer-modified-p nil) (wl-draft-hide bufname) (kill-buffer bufname))) (kill-buffer bufname)))) (defun wl-draft-save-and-exit () "Save current draft and exit current draft mode." (interactive) (wl-draft-save) (let ((editing-buffer (current-buffer))) (wl-draft-hide editing-buffer) (kill-buffer editing-buffer))) (defun wl-draft-send-and-exit () "Send current draft message and kill it." (interactive) (wl-draft-send t)) (defun wl-draft-send-from-toolbar () (interactive) (let ((wl-interactive-send t)) (wl-draft-send-and-exit))) (defun wl-draft-delete-field (field &optional delimline replace) (wl-draft-delete-fields (regexp-quote field) delimline replace)) (defun wl-draft-delete-fields (field &optional delimline replace) (save-restriction (unless delimline (goto-char (point-min)) (if (search-forward "\n\n" nil t) (setq delimline (point)) (setq delimline (point-max)))) (narrow-to-region (point-min) delimline) (goto-char (point-min)) (let ((regexp (concat "^" field ":")) (case-fold-search t)) (while (not (eobp)) (if (looking-at regexp) (progn (delete-region (point) (progn (forward-line) (if (re-search-forward "^[^ \t]" nil t) (goto-char (match-beginning 0)) (point-max)))) (if replace (insert (concat field ": " replace "\n")))) (forward-line) (if (re-search-forward "^[^ \t]" nil t) (goto-char (match-beginning 0)) (point-max))))))) (defun wl-draft-get-fcc-list (header-end) (if (and wl-draft-doing-mime-bcc wl-draft-disable-fcc-for-mime-bcc) (progn (wl-draft-delete-field "fcc") nil) (let (fcc-list (case-fold-search t)) (or (markerp header-end) (error "HEADER-END must be a marker")) (save-excursion (goto-char (point-min)) (while (re-search-forward "^Fcc:[ \t]*" header-end t) (save-match-data (setq fcc-list (append fcc-list (split-string (buffer-substring-no-properties (point) (progn (end-of-line) (skip-chars-backward " \t") (point))) ",[ \t]*"))) (dolist (folder fcc-list) (wl-folder-confirm-existence (wl-folder-get-elmo-folder (eword-decode-string folder))))) (delete-region (match-beginning 0) (progn (forward-line) (point))))) fcc-list))) (defcustom wl-draft-fcc-append-read-folder-history t "Non-nil to append fcc'ed folder to `wl-read-folder-history'." :type 'boolean :group 'wl-draft) (defun wl-draft-do-fcc (header-end &optional fcc-list) (let ((send-mail-buffer (current-buffer)) (case-fold-search t)) (or (markerp header-end) (error "HEADER-END must be a marker")) (unless fcc-list (setq fcc-list (wl-draft-get-fcc-list header-end))) (with-temp-buffer ;; insert just the headers to avoid moving the gap more than ;; necessary (the message body could be arbitrarily huge.) (insert-buffer-substring send-mail-buffer 1 header-end) (wl-draft-insert-required-fields t) (goto-char (point-max)) (insert-buffer-substring send-mail-buffer header-end) (let ((id (std11-field-body "Message-ID")) (elmo-enable-disconnected-operation t)) (while fcc-list (let ((folder (wl-folder-get-elmo-folder (eword-decode-string (car fcc-list))))) (elmo-folder-open folder) (if (elmo-folder-append-buffer folder (and wl-fcc-force-as-read '(read))) (wl-draft-write-sendlog 'ok 'fcc nil (car fcc-list) id) (wl-draft-write-sendlog 'failed 'fcc nil (car fcc-list) id)) (if (and wl-draft-fcc-append-read-folder-history (boundp 'wl-read-folder-history)) (or (equal (car fcc-list) (car wl-read-folder-history)) (setq wl-read-folder-history (append (list (car fcc-list)) wl-read-folder-history)))) (setq fcc-list (cdr fcc-list)))))))) (defun wl-draft-on-field-p () (if (< (point) (save-excursion (goto-char (point-min)) (search-forward (concat "\n" mail-header-separator "\n") nil 0) (point))) (if (bolp) (if (bobp) t (save-excursion (forward-line -1) (if (or (looking-at ".*,[ \t]?$") (looking-at "^[^ \t]+:[ \t]+.*:$")); group list name nil t))) (let ((pos (point))) (save-excursion (beginning-of-line) (if (looking-at "^[ \t]") nil (if (re-search-forward ":" pos t) nil t))))))) (require 'wl) ;;;;;;;;;;;;;;;; ;;;###autoload (defun wl-draft (&optional header-alist content-type content-transfer-encoding body edit-again parent-folder parent-number) "Write and send mail/news message with Wanderlust." (interactive) (require 'wl) (unless wl-init (wl-load-profile) (wl-folder-init) (elmo-init) (wl-plugged-init t)) (let (wl-demo) (wl-init)) ; returns immediately if already initialized. (wl-start-save-drafts) (let (buffer) ;; note: wl-draft-create-buffer may create a new window and switch it to ;; the new buffer! (setq buffer (wl-draft-create-buffer parent-folder parent-number)) (unless (cdr (assq 'From header-alist)) (setq header-alist (append (list (cons 'From wl-from)) header-alist))) (unless (cdr (assq 'To header-alist)) (let ((to)) (when (setq to (and (called-interactively-p 'interactive) "")) (if (assq 'To header-alist) (setcdr (assq 'To header-alist) to) (setq header-alist (append header-alist (list (cons 'To to)))))))) (unless (cdr (assq 'Subject header-alist)) (if (assq 'Subject header-alist) (setcdr (assq 'Subject header-alist) "") (setq header-alist (append header-alist (list (cons 'Subject "")))))) (setq header-alist (append header-alist (wl-draft-default-headers) wl-draft-additional-header-alist (if body (list "" (cons 'Body body))))) (wl-draft-create-contents header-alist) (if edit-again (wl-draft-decode-body content-type content-transfer-encoding)) (wl-draft-insert-mail-header-separator) (wl-draft-prepare-edit) (if (called-interactively-p 'interactive) (run-hooks 'wl-mail-setup-hook)) (goto-char (point-min)) (setq buffer-undo-list nil) (wl-user-agent-compose-internal) ;; user-agent (cond ((and (called-interactively-p 'interactive) (string= (cdr (assq 'To header-alist)) "")) (mail-position-on-field "To")) (t (goto-char (point-max)))) buffer)) (defun wl-draft-do-reply-buffer-window-styling (buffer) "Internal setup of a reply draft buffer window." (cond ((memq wl-draft-reply-buffer-style '(split split-horiz)) (when (and (eq major-mode 'wl-folder-mode) (get-buffer-window (car (wl-collect-summary)))) (wl-folder-jump-to-previous-summary)) (when wl-summary-buffer-disp-msg (wl-summary-jump-to-current-message)) (if (eq wl-draft-reply-buffer-style 'split) (split-window-vertically) (split-window-horizontally)) (other-window 1) (switch-to-buffer buffer)) ;; todo: consider orig-split and orig-split-horiz which would re-display ;; the original message (and the original summary folder) for the selected ;; draft buffer (else default to what split and split-horiz do) ((eq wl-draft-reply-buffer-style 'keep) (when wl-summary-buffer-disp-msg (wl-summary-jump-to-current-message)) (switch-to-buffer buffer)) ((eq wl-draft-reply-buffer-style 'full) (delete-other-windows) (switch-to-buffer buffer)) ((functionp wl-draft-reply-buffer-style) (funcall wl-draft-reply-buffer-style buffer)) (t (error "Invalid value for wl-draft-reply-buffer-style"))) buffer) (defun wl-draft-do-buffer-window-styling (buffer) "Internal setup of a new message draft buffer window." (cond ((memq wl-draft-buffer-style '(split split-horiz msg-split msg-split-horiz)) (let ((msg (memq wl-draft-buffer-style '(msg-split msg-split-horiz))) (horiz (memq wl-draft-buffer-style '(split-horiz msg-split-horiz))) (summary (car (wl-collect-summary)))) (when (and summary (eq major-mode 'wl-folder-mode) (get-buffer-window summary)) (wl-folder-jump-to-previous-summary) (when msg (set-buffer (get-buffer wl-summary-buffer-name)))) (cond ((and msg summary) (when wl-summary-buffer-disp-msg (wl-summary-jump-to-current-message))) ;; xxx toggling off the message display was not working! it was ;; broken by commit 57e783b147694f79ad12c0105c005f57f4b90e4a ;; which introduced a call to `set-buffer' before this XXX ;; whether toggling off the message display here makes sense or ;; not is higly questionable! If it does for anyone then ;; arguably it should split the summary window with the same ;; ratio as with `wl-message-window-size'. ((eq major-mode 'wl-summary-mode) (wl-summary-toggle-disp-msg 'off))) (if horiz (split-window-horizontally) (split-window-vertically)) (other-window 1) (switch-to-buffer buffer))) ((eq wl-draft-buffer-style 'keep) (switch-to-buffer buffer)) ((eq wl-draft-buffer-style 'full) (delete-other-windows) (switch-to-buffer buffer)) ((functionp wl-draft-buffer-style) (funcall wl-draft-buffer-style buffer)) (t (error "Invalid value for wl-draft-buffer-style"))) buffer) (defun wl-draft-create-buffer (&optional parent-folder parent-number) (let* ((reply-or-forward (or (eq this-command 'wl-summary-reply) (eq this-command 'wl-summary-reply-with-citation) (eq this-command 'wl-summary-forward) (eq this-command 'wl-summary-target-mark-forward) (eq this-command 'wl-summary-target-mark-reply-with-citation))) (buffer (generate-new-buffer "*draft*"))) ; Just for initial name. ;; xxx maybe frame/window setup should be done by the caller? (if so use ;; `save-excursion' around the rest...) (set-buffer (if wl-draft-use-frame (switch-to-buffer-other-frame buffer) ;; else switch-buffer according to draft buffer style. (if reply-or-forward (wl-draft-do-reply-buffer-window-styling buffer) ;; otherwise we are writing an entirely new message... (wl-draft-do-buffer-window-styling buffer)))) (auto-save-mode -1) (wl-draft-mode) (set-buffer-multibyte t) ; draft buffer is always multibyte. (make-local-variable 'truncate-partial-width-windows) (setq truncate-partial-width-windows nil) (setq truncate-lines wl-draft-truncate-lines) (setq wl-sent-message-via nil) (setq wl-sent-message-queued nil) (setq wl-draft-config-exec-flag t) ;; if `parent-folder' is not set, use "" since this is for direct use with ;; the likes of `string-match', etc. in condition expressions in ;; `wl-draft-config-alist' (setq wl-draft-parent-folder (or parent-folder "")) (setq wl-draft-parent-number parent-number) (or (eq this-command 'wl-folder-write-current-folder) (setq wl-draft-buffer-cur-summary-buffer (wl-summary-get-buffer parent-folder))) buffer)) (defun wl-draft-create-contents (header-alist) "header-alist' sample '(function ;; funcall string ;; insert string (symbol . string) ;; insert symbol-value: string (symbol . function) ;; (funcall) and if it returns string, ;; insert symbol-value: string (symbol . nil) ;; do nothing nil ;; do nothing )" (unless (eq major-mode 'wl-draft-mode) (error "`wl-draft-create-header' must be use in wl-draft-mode")) (let ((halist header-alist) field value) (while halist (cond ;; function ((functionp (car halist)) (funcall (car halist))) ;; string ((stringp (car halist)) (insert (car halist) "\n")) ;; cons ((consp (car halist)) (setq field (car (car halist))) (setq value (cdr (car halist))) (cond ((symbolp field) (cond ((eq field 'Body) ; body (insert value)) ((stringp value) (insert (symbol-name field) ": " value "\n")) ((functionp value) (let ((value-return (funcall value))) (when (stringp value-return) (insert (symbol-name field) ": " value-return "\n")))) ((not value)) (t (debug)))) ;; ((not field)) (t (debug))))) (setq halist (cdr halist))))) (defun wl-draft-prepare-edit () (unless (eq major-mode 'wl-draft-mode) (error "`wl-draft-create-header' must be use in wl-draft-mode")) (wl-draft-editor-mode) (make-local-variable 'auto-save-file-name-transforms) (setq auto-save-file-name-transforms (cons (list (concat (regexp-quote wl-draft-folder) "/\\([0-9]+\\)") (concat (expand-file-name "auto-save-" (elmo-folder-msgdb-path (wl-draft-get-folder))) "\\1")) auto-save-file-name-transforms)) (when wl-draft-write-file-function (make-local-variable 'write-file-functions) (add-hook 'write-file-functions wl-draft-write-file-function)) (wl-draft-overload-functions) (unless (eq wl-draft-real-time-highlight 'jit) (wl-highlight-headers 'for-draft)) (wl-draft-save) (clear-visited-file-modtime)) (defun wl-draft-decode-header () (save-excursion (std11-narrow-to-header) (wl-draft-decode-message-in-buffer) (widen))) (defun wl-draft-decode-body (&optional content-type content-transfer-encoding) (let ((content-type (or content-type (std11-field-body "content-type"))) (content-transfer-encoding (or content-transfer-encoding (std11-field-body "content-transfer-encoding"))) delimline) (save-excursion (std11-narrow-to-header) (wl-draft-delete-field "content-type") (wl-draft-delete-field "content-transfer-encoding") (goto-char (point-max)) (setq delimline (point-marker)) (widen) (narrow-to-region delimline (point-max)) (goto-char (point-min)) (when content-type (insert "Content-type: " content-type "\n")) (when content-transfer-encoding (insert "Content-Transfer-Encoding: " content-transfer-encoding "\n")) (wl-draft-decode-message-in-buffer) (goto-char (point-min)) (unless (re-search-forward "^$" (point-at-eol) t) (insert "\n")) (widen) delimline))) ;;; subroutine for wl-draft-create-contents ;;; must be used in wl-draft-mode (defun wl-draft-check-new-line () (if (not (= (preceding-char) ?\n)) (insert ?\n))) (defsubst wl-draft-trim-ccs (cc) (let ((field (if (functionp cc) (funcall cc) cc))) (if (and field (null (and wl-draft-delete-myself-from-bcc-fcc (elmo-list-member (mapcar 'wl-address-header-extract-address (append (elmo-parse-addresses (std11-field-body "To")) (elmo-parse-addresses (std11-field-body "Cc")))) (mapcar 'downcase wl-subscribed-mailing-list))))) field nil))) (defun wl-draft-default-headers () (list (cons 'Mail-Reply-To (and wl-insert-mail-reply-to (wl-address-header-extract-address wl-from))) (cons 'User-Agent wl-generate-mailer-string-function) (cons 'Reply-To mail-default-reply-to) (cons 'Bcc (lambda () (wl-draft-trim-ccs (or wl-bcc (and mail-self-blind (user-login-name)))))) (cons 'Fcc (lambda () (wl-draft-trim-ccs wl-fcc))) (cons 'Organization wl-organization) (and wl-auto-insert-x-face (file-exists-p wl-x-face-file) 'wl-draft-insert-x-face-field-here) ;; allow nil mail-default-headers ;; check \n at th end of line for `mail-default-headers' 'wl-draft-check-new-line)) (defun wl-draft-insert-mail-header-separator (&optional delimline) (save-excursion (if delimline (goto-char delimline) (goto-char (point-min)) (if (search-forward "\n\n" nil t) (delete-char -1) (goto-char (point-max)))) (wl-draft-check-new-line) (put-text-property (point) (progn (insert mail-header-separator "\n") (1- (point))) 'category 'mail-header-separator) (point))) ;;;;;;;;;;;;;;;; (defun wl-draft-elmo-nntp-send () (let ((elmo-nntp-post-pre-hook wl-news-send-pre-hook) (elmo-nntp-default-user (or wl-nntp-posting-user elmo-nntp-default-user)) (elmo-nntp-default-server (or wl-nntp-posting-server elmo-nntp-default-server)) (elmo-nntp-default-port (or wl-nntp-posting-port elmo-nntp-default-port)) (elmo-nntp-default-stream-type (or wl-nntp-posting-stream-type elmo-nntp-default-stream-type)) (elmo-nntp-default-function wl-nntp-posting-function) condition) (if (setq condition (cdr (elmo-string-matched-assoc (std11-field-body "Newsgroups") wl-nntp-posting-config-alist))) (if (stringp condition) (setq elmo-nntp-default-server condition) (while (car condition) (set (intern (format "elmo-nntp-default-%s" (symbol-name (caar condition)))) (cdar condition)) (setq condition (cdr condition))))) (unless elmo-nntp-default-function (error "wl-draft-nntp-send: posting-function is nil")) (if (not (elmo-plugged-p elmo-nntp-default-server elmo-nntp-default-port)) (wl-draft-set-sent-message 'news 'unplugged (cons elmo-nntp-default-server elmo-nntp-default-port)) (funcall elmo-nntp-default-function elmo-nntp-default-server (current-buffer)) (wl-draft-set-sent-message 'news 'sent) (wl-draft-write-sendlog 'ok 'nntp elmo-nntp-default-server (std11-field-body "Newsgroups") (std11-field-body "Message-ID"))))) (defun wl-draft-generate-clone-buffer (name &optional local-variables) "Generate clone of current buffer named NAME." (let ((editing-buffer (current-buffer))) (with-current-buffer (generate-new-buffer name) (erase-buffer) (wl-draft-mode) (wl-draft-editor-mode) (insert-buffer-substring editing-buffer) (message "") (while local-variables (make-local-variable (car local-variables)) (set (car local-variables) (with-current-buffer editing-buffer (symbol-value (car local-variables)))) (setq local-variables (cdr local-variables))) (current-buffer)))) (defun wl-draft-remove-text-plain-tag () "Remove text/plain tag of mime-edit." (when (string= (mime-make-text-tag "plain") (buffer-substring-no-properties (point-at-bol)(point-at-eol))) (delete-region (point-at-bol)(1+ (point-at-eol))))) (defun wl-draft-reedit (number) (let ((draft-folder (wl-draft-get-folder)) (wl-draft-reedit t) buffer body-top) (setq buffer (get-buffer-create (format "%s/%d" (if (memq 'modeline wl-use-folder-petname) (wl-folder-get-petname wl-draft-folder) wl-draft-folder) number))) (if wl-draft-use-frame (switch-to-buffer-other-frame buffer) (switch-to-buffer buffer)) (set-buffer buffer) (elmo-message-fetch draft-folder number (elmo-make-fetch-strategy 'entire)) (elmo-delete-cr-buffer) (let ((mime-edit-again-ignored-field-regexp "^\\(Content-.*\\|Mime-Version\\):")) (wl-draft-decode-message-in-buffer)) (setq body-top (wl-draft-insert-mail-header-separator)) (auto-save-mode -1) (wl-draft-mode) (make-local-variable 'truncate-partial-width-windows) (setq truncate-partial-width-windows nil) (setq truncate-lines wl-draft-truncate-lines) (setq wl-sent-message-via nil) (setq wl-sent-message-queued nil) (wl-draft-config-info-operation number 'load) (goto-char (point-min)) (wl-draft-overload-functions) (wl-draft-editor-mode) (make-local-variable 'auto-save-file-name-transforms) (setq auto-save-file-name-transforms (cons (list (concat (regexp-quote wl-draft-folder) "/\\([0-9]+\\)") (concat (expand-file-name "auto-save-" (elmo-folder-msgdb-path (wl-draft-get-folder))) "\\1")) auto-save-file-name-transforms)) (setq buffer-file-name (buffer-name) wl-draft-buffer-message-number number) (unless wl-draft-parent-folder (setq wl-draft-parent-folder "")) (when wl-draft-write-file-function (make-local-variable 'write-file-functions) (add-hook 'write-file-functions wl-draft-write-file-function)) (unless (eq wl-draft-real-time-highlight 'jit) (wl-highlight-headers 'for-draft)) (goto-char body-top) (run-hooks 'wl-draft-reedit-hook) (goto-char (point-max)) buffer)) (defun wl-draft-body-goto-top () (goto-char (point-min)) (if (re-search-forward mail-header-separator nil t) (forward-char) (goto-char (point-max)))) (defun wl-draft-body-goto-bottom () (goto-char (point-max))) (defun wl-draft-config-body-goto-header () (goto-char (point-min)) (if (re-search-forward mail-header-separator nil t) (beginning-of-line) (goto-char (point-max)))) (defsubst wl-draft-config-sub-eval-insert (content &optional newline) (let (content-value) (when (and content (stringp (setq content-value (eval content)))) (insert content-value) (if newline (insert "\n"))))) (defun wl-draft-config-sub-body (content) (wl-draft-body-goto-top) (delete-region (point) (point-max)) (wl-draft-config-sub-eval-insert content)) (defun wl-draft-config-sub-top (content) (wl-draft-body-goto-top) (wl-draft-config-sub-eval-insert content)) (defun wl-draft-config-sub-bottom (content) (wl-draft-body-goto-bottom) (wl-draft-config-sub-eval-insert content)) (defun wl-draft-config-sub-header (content) (wl-draft-config-body-goto-header) (wl-draft-config-sub-eval-insert content 'newline)) (defun wl-draft-config-sub-header-top (content) (goto-char (point-min)) (wl-draft-config-sub-eval-insert content 'newline)) (defun wl-draft-config-sub-part-top (content) (goto-char (mime-edit-content-beginning)) (wl-draft-config-sub-eval-insert content 'newline)) (defun wl-draft-config-sub-part-bottom (content) (goto-char (mime-edit-content-end)) (wl-draft-config-sub-eval-insert content 'newline)) (defsubst wl-draft-config-sub-file (content) (let ((coding-system-for-read 'undecided) (file (expand-file-name (eval content)))) (if (file-exists-p file) (insert-file-contents file) (error "%s: no exists file" file)))) (defun wl-draft-config-sub-body-file (content) (wl-draft-body-goto-top) (delete-region (point) (point-max)) (wl-draft-config-sub-file content)) (defun wl-draft-config-sub-top-file (content) (wl-draft-body-goto-top) (wl-draft-config-sub-file content)) (defun wl-draft-config-sub-bottom-file (content) (wl-draft-body-goto-bottom) (wl-draft-config-sub-file content)) (defun wl-draft-config-sub-header-file (content) (wl-draft-config-body-goto-header) (wl-draft-config-sub-file content)) (require 'wl-template) (defun wl-draft-config-sub-template (content) (setq wl-draft-config-variables (wl-template-insert (eval content)))) (defun wl-draft-config-sub-x-face (content) (if (and (string-match "\\.xbm\\(\\.gz\\)?$" content) (fboundp 'x-face-insert)) ; x-face.el is installed. (x-face-insert content) (wl-draft-replace-field "X-Face" (elmo-get-file-string content t) t))) (defsubst wl-draft-config-sub-func (field content) (let (func) (if (setq func (assq field wl-draft-config-sub-func-alist)) (let (wl-draft-config-variables) (funcall (cdr func) content) ;; for wl-draft-config-sub-template (cons t wl-draft-config-variables))))) (defsubst wl-draft-config-exec-sub (clist) (let (config local-variables) (while clist (setq config (car clist)) (cond ((functionp config) (funcall config)) ((consp config) (let ((field (car config)) (content (cdr config)) ret-val) (cond ((stringp field) (wl-draft-replace-field field (eval content) t)) ((setq ret-val (wl-draft-config-sub-func field content)) (if (cdr ret-val) ;; for wl-draft-config-sub-template (wl-append local-variables (cdr ret-val)))) ((boundp field) ;; variable (make-local-variable field) (set field (eval content)) (wl-append local-variables (list field))) (t (error "%s: not variable" field))))) (t (error "%s: not supported type" config))) (setq clist (cdr clist))) local-variables)) (defun wl-draft-prepared-config-exec (&optional config-alist reply-buf) "Change headers in draft preparation time." (interactive) (unless wl-draft-reedit (let ((config-alist (or config-alist (and (boundp 'wl-draft-prepared-config-alist) wl-draft-prepared-config-alist) ;; For compatible. wl-draft-config-alist))) (if config-alist (wl-draft-config-exec config-alist reply-buf))))) (defun wl-draft-config-exec (&optional config-alist reply-buf) "Change headers according to the value of `wl-draft-config-alist'. Automatically applied in draft sending time." (interactive) (let ((case-fold-search t) (alist (or config-alist wl-draft-config-alist)) (reply-buf (or reply-buf (and (buffer-live-p wl-draft-reply-buffer) wl-draft-reply-buffer))) (local-variables wl-draft-config-variables) wl-draft-real-time-highlight key clist found) (when (and (or (called-interactively-p 'interactive) wl-draft-config-exec-flag) alist) (save-excursion (catch 'done (while alist (setq key (caar alist) clist (cdar alist)) (cond ((eq key 'reply) (when (and reply-buf (with-current-buffer reply-buf (save-restriction (std11-narrow-to-header) (goto-char (point-min)) (re-search-forward (car clist) nil t)))) (wl-draft-config-exec-sub (cdr clist)) (setq found t))) ((stringp key) (when (save-restriction (std11-narrow-to-header mail-header-separator) (goto-char (point-min)) (re-search-forward key nil t)) (wl-append local-variables (wl-draft-config-exec-sub clist)) (setq found t))) ((eval key) (wl-append local-variables (wl-draft-config-exec-sub clist)) (setq found t))) (if (and found wl-draft-config-matchone) (throw 'done t)) (setq alist (cdr alist))))) (if found (setq wl-draft-config-exec-flag nil)) (run-hooks 'wl-draft-config-exec-hook) (put-text-property (point-min)(point-max) 'face nil) (unless (eq wl-draft-real-time-highlight 'jit) (wl-highlight-message (point-min)(point-max) t)) (setq wl-draft-config-variables (elmo-uniq-list local-variables))))) (defun wl-draft-replace-field (field content &optional add) (save-excursion (save-restriction (let ((case-fold-search t) (inhibit-read-only t) ;; added by teranisi. beg) (std11-narrow-to-header mail-header-separator) (goto-char (point-min)) (if (re-search-forward (concat "^" (regexp-quote field) ":") nil t) (if content ;; replace field (progn (setq beg (point)) (re-search-forward "^[^ \t]" nil 'move) (beginning-of-line) (skip-chars-backward "\n") (delete-region beg (point)) (insert " " content)) ;; delete field (save-excursion (beginning-of-line) (setq beg (point))) (re-search-forward "^[^ \t]" nil 'move) (beginning-of-line) (delete-region beg (point))) (when (and add content) ;; add field (goto-char (point-max)) (insert (concat field ": " content "\n")))))))) (defsubst wl-draft-config-info-filename (number msgdb-dir) (expand-file-name (format "%s-%d" wl-draft-config-save-filename number) msgdb-dir)) (defun wl-draft-config-info-operation (msg operation) (let* ((msgdb-dir (elmo-folder-msgdb-path (wl-draft-get-folder))) (filename (wl-draft-config-info-filename msg msgdb-dir)) element alist variable) (cond ((eq operation 'save) (let ((variables (elmo-uniq-list wl-draft-config-variables))) (while (setq variable (pop variables)) (when (boundp variable) (wl-append alist (list (cons variable (eval variable)))))) (elmo-object-save filename alist))) ((eq operation 'load) (setq alist (elmo-object-load filename)) (while (setq element (pop alist)) (set (make-local-variable (car element)) (cdr element)) (wl-append wl-draft-config-variables (list (car element))))) ((eq operation 'delete) (if (file-exists-p filename) (delete-file filename)))))) (defun wl-draft-queue-info-operation (msg operation &optional add-sent-message-via) (let* ((msgdb-dir (elmo-folder-msgdb-path (wl-folder-get-elmo-folder wl-queue-folder))) (filename (expand-file-name (format "%s-%d" wl-draft-queue-save-filename msg) msgdb-dir)) element alist variable) (cond ((eq operation 'save) (let ((variables (elmo-uniq-list (append wl-draft-queue-save-variables wl-draft-config-variables (list 'wl-draft-fcc-list))))) (if add-sent-message-via (progn (push 'wl-sent-message-queued variables) (push 'wl-sent-message-via variables))) (while (setq variable (pop variables)) (when (boundp variable) (wl-append alist (list (cons variable (eval variable)))))) (elmo-object-save filename alist))) ((eq operation 'load) (setq alist (elmo-object-load filename)) (while (setq element (pop alist)) (set (make-local-variable (car element)) (cdr element)))) ((eq operation 'get-sent-via) (setq alist (elmo-object-load filename)) (cdr (assq 'wl-sent-message-via alist))) ((eq operation 'delete) (if (file-exists-p filename) (delete-file filename)))))) (defun wl-draft-queue-append (sent-message-via) (if wl-draft-verbose-send (message "Queuing...")) (let ((folder (wl-folder-get-elmo-folder wl-queue-folder)) (message-id (std11-field-body "Message-ID"))) (if (elmo-folder-append-buffer folder) (progn (wl-draft-queue-info-operation (car (elmo-folder-status folder)) 'save sent-message-via) (wl-draft-write-sendlog 'ok 'queue nil wl-queue-folder message-id) (when wl-draft-verbose-send (setq wl-draft-verbose-msg "Queuing...") (message "Queuing...done"))) (wl-draft-write-sendlog 'failed 'queue nil wl-queue-folder message-id) (error "Queuing failed")))) (defun wl-draft-queue-flush () "Flush draft queue." (interactive) (let* ((queue-folder (wl-folder-get-elmo-folder wl-queue-folder)) (msgs2 (progn (elmo-folder-open-internal queue-folder) (elmo-folder-list-messages queue-folder))) (i 0) (performed 0) (wl-draft-queue-flushing t) msgs failure len buffer sent-via) ;; get plugged send message (while msgs2 (setq sent-via (wl-draft-queue-info-operation (car msgs2) 'get-sent-via)) (catch 'found (while sent-via (when (and (eq (nth 1 (car sent-via)) 'unplugged) (or (not (nth 2 (car sent-via))) (elmo-plugged-p (car (nth 2 (car sent-via))) (cdr (nth 2 (car sent-via)))))) (wl-append msgs (list (car msgs2))) (throw 'found t)) (setq sent-via (cdr sent-via)))) (setq msgs2 (cdr msgs2))) (when (> (setq len (length msgs)) 0) (if (elmo-y-or-n-p (format "%d message(s) are in the sending queue. Send now? " len) (not elmo-dop-flush-confirm) t) (progn (save-excursion (setq buffer (get-buffer-create " *wl-draft-queue-flush*")) (set-buffer buffer) (while msgs ;; reset buffer local variables (kill-all-local-variables) (erase-buffer) (setq i (+ 1 i) failure nil) (setq wl-sent-message-via nil) (wl-draft-queue-info-operation (car msgs) 'load) (elmo-message-fetch queue-folder (car msgs) (elmo-make-fetch-strategy 'entire)) (condition-case err (setq failure (funcall wl-draft-queue-flush-send-function (format "Sending (%d/%d)..." i len))) ;;; (wl-draft-raw-send nil nil ;;; (format "Sending (%d/%d)..." i len)) (error (elmo-display-error err t) (setq failure t)) (quit (setq failure t))) (if (eq wl-sent-message-modified 'requeue) (progn (elmo-folder-delete-messages queue-folder (cons (car msgs) nil)) (wl-draft-queue-info-operation (car msgs) 'delete)) (unless failure (elmo-folder-delete-messages queue-folder (cons (car msgs) nil)) (wl-draft-queue-info-operation (car msgs) 'delete) (setq performed (+ 1 performed)))) (setq msgs (cdr msgs))) (kill-buffer buffer) (message "%d message(s) are sent." performed))) (message "%d message(s) are remained to be sent." len)) (elmo-folder-close queue-folder) len))) (defun wl-jump-to-draft-buffer (&optional arg) "Jump to the first of the buffers that are in `wl-draft-mode', unless called from a draft buffer, in which case switch to the next one. If the draft buffer is not already visible then apply the `wl-draft-buffer-style' rules to display the selected draft buffer. If ARG is not nil then call `wl-jump-to-draft-folder' instead." (interactive "P") (if arg (wl-jump-to-draft-folder) (let ((draft-bufs (wl-collect-draft)) buf) (cond ((null draft-bufs) (message "No draft buffers exist.")) (t (setq draft-bufs (sort (mapcar 'buffer-name draft-bufs) (lambda (a b) (not (string< a b))))) (if (setq buf (cdr (member (buffer-name) draft-bufs))) (setq buf (car buf)) (setq buf (car draft-bufs))) (if (eq major-mode 'wl-draft-mode) (switch-to-buffer buf) (let ((buf-win (get-buffer-window buf))) (if buf-win (pop-to-buffer buf) ;; otherwise make buf visible and go to it ;; ;; We have no way at this point to know whether the draft buffer ;; was opened as a reply or as a new message, so just assume it ;; was a reply message and ignore `wl-draft-buffer-style'. ;; (set-buffer (wl-draft-do-reply-buffer-window-styling buf)))))))))) (defun wl-jump-to-draft-folder () (let ((msgs (reverse (elmo-folder-list-messages (wl-draft-get-folder)))) (mybuf (buffer-name)) msg buf) (if (not msgs) (message "No draft message exist.") (if (string-match (concat "^" wl-draft-folder "/") mybuf) (setq msg (cadr (memq (string-to-number (substring mybuf (match-end 0))) msgs)))) (or msg (setq msg (car msgs))) (if (setq buf (get-buffer (format "%s/%d" wl-draft-folder msg))) (switch-to-buffer buf) (wl-draft-reedit msg))))) (defun wl-draft-highlight () (when wl-highlight-body-too (let ((modified (buffer-modified-p)) wl-draft-real-time-highlight) (unwind-protect (progn (put-text-property (point-min) (point-max) 'face nil) (wl-highlight-message (point-min) (point-max) t)) (set-buffer-modified-p modified))))) (defun wl-draft-highlight-and-recenter (&optional n) (interactive "P") (wl-draft-highlight) (recenter n)) ;; insert element from history (defvar wl-draft-current-history-position nil) (defvar wl-draft-history-backup-word "") (defun wl-draft-previous-history-element (n) (interactive "p") (let (bol history beg end new) (when (and (not (wl-draft-on-field-p)) (< (point) (save-excursion (goto-char (point-min)) (search-forward (concat "\n" mail-header-separator "\n") nil 0) (point))) (save-excursion (beginning-of-line) (while (and (looking-at "^[ \t]") (not (= (point) (point-min)))) (forward-line -1)) (cond ((looking-at wl-folder-complete-header-regexp) (and (boundp 'wl-read-folder-history) (setq history wl-read-folder-history))) ;;; ((looking-at wl-address-complete-header-regexp) ;;; (setq history .....)) (t nil))) (eolp)) (setq bol (save-excursion (beginning-of-line) (point))) (cond ((and (or (eq last-command 'wl-draft-previous-history-element) (eq last-command 'wl-draft-next-history-element)) wl-draft-current-history-position) (setq end (point)) (or (search-backward-regexp ",[ \t]*\\(.*\\)" bol t) (search-backward-regexp "^[ \t]\\(.*\\)" bol t) (search-backward-regexp "^[^ \t]*: \\(.*\\)" bol t)) (goto-char (match-beginning 1)) (setq beg (point)) (if (cond ((< n 0) (>= (+ n wl-draft-current-history-position) 0)) ((> n 0) (<= (+ n wl-draft-current-history-position) (length history)))) (progn (setq wl-draft-current-history-position (+ n wl-draft-current-history-position)) (setq new (nth wl-draft-current-history-position (append (list wl-draft-history-backup-word) history))) (delete-region beg end) (insert new)) (goto-char end) (cond ((< n 0) (message "End of history; no next item")) ((> n 0) (message "Beginning of history; no preceding item"))))) ((and (> n 0) (save-excursion (or (search-backward-regexp ",[ \t]*\\(.*\\)" bol t) (search-backward-regexp "^[ \t]\\(.*\\)" bol t) (search-backward-regexp "^[^ \t]*: \\(.*\\)" bol t))) (car history)) (setq wl-draft-current-history-position 1) (setq wl-draft-history-backup-word (match-string 1)) (delete-region (match-beginning 1) (match-end 1)) (insert (car history))) (t (setq wl-draft-current-history-position nil)))))) (defun wl-draft-next-history-element (n) (interactive "p") (wl-draft-previous-history-element (- n))) ;;;; user-agent support by Sen Nagata ;; this appears to be necessarily global... (defvar wl-user-agent-compose-p nil) (defvar wl-user-agent-headers-and-body-alist nil) ;; this should be a generic function for mail-mode -- i wish there was ;; something like it in sendmail.el (defun wl-user-agent-insert-header (header-name header-value) "Insert HEADER-NAME w/ value HEADER-VALUE into a message." ;; it seems like overriding existing headers is acceptable -- should ;; we provide an option? ;; plan was: unfold header (might be folded), remove existing value, insert ;; new value ;; wl doesn't seem to fold header lines yet anyway :-) (let ((kill-whole-line t) end-of-line) (mail-position-on-field (capitalize header-name)) (setq end-of-line (point)) (beginning-of-line) (re-search-forward ":" end-of-line) (insert (concat " " header-value "\n")) (kill-line))) ;; this should be a generic function for mail-mode -- i wish there was ;; something like it in sendmail.el ;; ;; ** haven't dealt w/ case where the body is already set ** (defun wl-user-agent-insert-body (body-text) "Insert a body of text, BODY-TEXT, into a message." ;; code defensively... :-P (goto-char (point-min)) (search-forward mail-header-separator) (forward-line) (insert body-text) (or (bolp) (insert "\n"))) ;;;###autoload (defun wl-user-agent-compose (&optional to subject other-headers _continue switch-function _yank-action _send-actions _return-action) "Support the `compose-mail' interface for wl. Only support for TO, SUBJECT, and OTHER-HEADERS has been implemented. Support for CONTINUE, YANK-ACTION, SEND-ACTIONS and RETURN-ACTION has not been implemented yet. Partial support for SWITCH-FUNCTION now supported." (unless (featurep 'wl) (require 'wl)) (or switch-function (setq switch-function 'keep)) ;; protect these -- to and subject get bound at some point, so it looks ;; to be necessary to protect the values used w/in (let ((wl-user-agent-headers-and-body-alist other-headers) (wl-draft-use-frame (eq switch-function 'switch-to-buffer-other-frame)) (wl-draft-buffer-style switch-function) tem) (if to (if (setq tem (elmo-string-match-assoc "\\`to\\'" wl-user-agent-headers-and-body-alist 'ignore-case)) (setcdr tem to) (setq wl-user-agent-headers-and-body-alist (cons (cons "to" to) wl-user-agent-headers-and-body-alist)))) (if subject (if (setq tem (elmo-string-match-assoc "\\`subject\\'" wl-user-agent-headers-and-body-alist 'ignore-case)) (setcdr tem subject) (setq wl-user-agent-headers-and-body-alist (cons (cons "subject" subject) wl-user-agent-headers-and-body-alist)))) ;; i think this is what we want to use... (unwind-protect (progn ;; tell the hook-function to do its stuff (setq wl-user-agent-compose-p t) ;; because to get the hooks working, wl-draft has to think it has ;; been called interactively (call-interactively 'wl-draft)) (setq wl-user-agent-compose-p nil)))) (defun wl-user-agent-compose-internal () "Manipulate headers and/or a body of a draft message." ;; being called from wl-user-agent-compose? (if wl-user-agent-compose-p (progn ;; insert headers (let ((headers wl-user-agent-headers-and-body-alist) (case-fold-search t)) (while headers ;; skip body (if (not (string-match "^body$" (car (car headers)))) (wl-user-agent-insert-header (car (car headers)) (cdr (car headers))) t) (setq headers (cdr headers)))) ;; highlight headers (from wl-draft in wl-draft.el) (unless (eq wl-draft-real-time-highlight 'jit) (wl-highlight-headers 'for-draft)) ;; insert body (let ((body (elmo-string-match-assoc "\\`body\\'" wl-user-agent-headers-and-body-alist 'ignore-case))) (if body (wl-user-agent-insert-body (cdr body))))) t)) (defun wl-draft-setup-parent-flag (flag) "Setup a FLAG for parent message." (when (and (> (length wl-draft-parent-folder) 0) wl-draft-parent-number) (setq wl-draft-parent-flag flag) (wl-draft-config-info-operation wl-draft-buffer-message-number 'save))) (defun wl-draft-buffer-change-number (old-number new-number) (when (eq wl-draft-buffer-message-number old-number) (setq wl-draft-buffer-message-number new-number) (rename-buffer (format "%s/%d" (if (memq 'modeline wl-use-folder-petname) (wl-folder-get-petname wl-draft-folder) wl-draft-folder) new-number) t) (setq buffer-file-name (buffer-name)) (set-buffer-modified-p nil))) (defun wl-draft-rename-saved-config (old-number new-number) (let* ((msgdb-dir (elmo-folder-msgdb-path (wl-draft-get-folder))) (old-name (wl-draft-config-info-filename old-number msgdb-dir)) (new-name (wl-draft-config-info-filename new-number msgdb-dir))) (when (file-exists-p old-name) (rename-file old-name new-name 'ok-if-already-exists)))) (defun wl-draft-default-jit-highlight (start end) (goto-char start) (beginning-of-line) ;; extend the region to whole lines (setq start (point)) (setq end (save-excursion (goto-char end) (end-of-line) (point))) (let ((in-header (wl-draft-point-in-header-p))) ;; check for multi-line header, extend region if necessary (when in-header (while (and (> start (point-min)) (looking-at "^[ \t]")) (forward-line -1)) (setq start (point))) ;; check for multi-line attribution (when (not in-header) (forward-line -1) (when (looking-at wl-highlight-citation-prefix-regexp) (setq start (point)))) ;; check for signature (let ((hack-sig (cond ((= end (point-max)) t) ((< end (- (point-max) wl-max-signature-size)) nil) (t (let ((sig (funcall wl-highlight-signature-search-function (- (point-max) wl-max-signature-size) (point-max)))) (cond ((>= start sig) (setq start sig end (point-max)) t) ((>= end sig) (setq end (point-max)) t) (t nil))))))) (put-text-property start end 'face nil) (wl-highlight-message start end hack-sig (not in-header))))) (defun wl-draft-jit-highlight (start end) (when (eq wl-draft-real-time-highlight 'jit) (funcall wl-draft-jit-highlight-function start end))) (defvar wl-draft-idle-highlight-timer nil) (defun wl-draft-real-time-highlight (&optional state) "Toggle real-time highlighting." (interactive) (let ((candidates (if (featurep 'jit-lock) '(nil jit idle) '(nil idle)))) (setq wl-draft-real-time-highlight (if state (and (memq state candidates) state) (cadr (memq wl-draft-real-time-highlight candidates))))) (when (called-interactively-p 'interactive) (if wl-draft-real-time-highlight (message "Real-time highlighting is using %s." (cdr (assq wl-draft-real-time-highlight '((jit . "jit-lock-mode") (idle . "idle timer"))))) (message "Real-time highlighting is disabled."))) wl-draft-real-time-highlight) (defun wl-draft-default-idle-highlight () (save-match-data (wl-draft-highlight))) (defun wl-draft-idle-highlight-timer (buffer) (when (and (eq wl-draft-real-time-highlight 'idle) (buffer-live-p buffer)) (with-current-buffer buffer (funcall wl-draft-idle-highlight-function)))) (defun wl-draft-idle-highlight-set-timer (_beg _end _len) (when (eq wl-draft-real-time-highlight 'idle) (require 'timer) (when (timerp wl-draft-idle-highlight-timer) (cancel-timer wl-draft-idle-highlight-timer)) (setq wl-draft-idle-highlight-timer (run-with-idle-timer wl-draft-idle-highlight-idle-time nil 'wl-draft-idle-highlight-timer (current-buffer))))) (require 'product) (product-provide (provide 'wl-draft) (require 'wl-version)) ;;; wl-draft.el ends here wanderlust-wanderlust-769699d/wl/wl-e21.el000066400000000000000000000213701406661363500203630ustar00rootroot00000000000000;;; wl-e21.el --- Wanderlust modules for Emacs 21. -*- lexical-binding: t -*- ;; Copyright (C) 2000,2001 Katsumi Yamaoka ;; Copyright (C) 2000,2001 Yuuichi Teranishi ;; Author: Katsumi Yamaoka ;; Keywords: mail, net news ;; This file is part of Wanderlust (Yet Another Message Interface on Emacsen). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;; This module uses `before-string' overlay property to show icon ;; images instead of `insert-image', so don't delete such overlays ;; sloppily. Here is a sample code to show icons in the buffer. ;; ;;(let (image icon from to overlay) ;; ;; The function `find-image' will look for an image first on `load-path' ;; ;; and then in `data-directory'. ;; (let ((load-path (cons wl-icon-directory load-path))) ;; (setq image (find-image (list (list :type 'xpm :file wl-nntp-folder-icon ;; :ascent 'center))))) ;; ;; `propertize' is a convenient function in such a case. ;; ;; String must have one or more length to wear an image. ;; (setq icon (propertize "any string" 'display image)) ;; (pop-to-buffer (get-buffer-create "*wl-e21-demo*")) ;; (erase-buffer) ;; (insert " ") ;; (setq from (point)) ;; (insert "-fj.wanderlust:0/0/0") ;; (setq to (point)) ;; (insert "\n") ;; (setq overlay (make-overlay from to)) ;; ;; Put an image. ;; (overlay-put overlay 'before-string icon) ;; ;; Put a mark to indicate that this overlay is made by `wl-e21'. ;; ;; It is not always necessarily. ;; (overlay-put overlay 'wl-e21-icon t) ;; ;; Make it to be removable. ;; (overlay-put overlay 'evaporate t)) ;; ;; Note that a port of Emacs to some platforms (e.g. MS-Windoze) does ;; not yet support images. It is a pity that neither icons nor tool- ;; bars will not be displayed in such systems. ;;; Code: ;; (require 'elmo) (require 'wl-vars) (add-hook 'wl-init-hook 'wl-biff-init-icons) (add-hook 'wl-init-hook 'wl-plugged-init-icons) (defvar wl-use-toolbar (image-type-available-p 'xpm)) (defvar wl-plugged-image nil) (defvar wl-unplugged-image nil) (defvar wl-biff-mail-image nil) (defvar wl-biff-nomail-image nil) (eval-and-compile (defmacro wl-e21-display-image-p () '(and wl-highlight-folder-with-icon (image-type-available-p 'xpm)))) (eval-and-compile (defun wl-e21-find-image (specs) (let ((image-load-path (cons 'wl-icon-directory image-load-path))) (find-image specs)))) (defun wl-e21-setup-toolbar (bar) (when (and wl-use-toolbar (wl-e21-display-image-p)) (let ((props '(:type xpm :ascent center :color-symbols (("backgroundToolBarColor" . "None")) :file)) (success t) icon up down disabled name) (while bar (setq icon (aref (pop bar) 0)) (unless (boundp icon) (setq name (symbol-name icon) up (wl-e21-find-image `((,@props ,(concat name "-up.xpm"))))) (if up (progn (setq down (wl-e21-find-image `((,@props ,(concat name "-down.xpm")))) disabled (wl-e21-find-image `((,@props ,(concat name "-disabled.xpm"))))) (if (and down disabled) (set icon (vector down up disabled disabled)) (set icon up))) (setq bar nil success nil)))) success))) (defvar wl-e21-toolbar-configurations '((auto-resize-tool-bars . t) (auto-raise-tool-bar-buttons . t) (tool-bar-button-margin . 2) (tool-bar-button-relief . 1))) (defun wl-e21-make-toolbar-buttons (keymap defs) (let ((configs wl-e21-toolbar-configurations) config) (while (setq config (pop configs)) (set (make-local-variable (car config)) (cdr config)))) ;; Invalidate the default bindings. (let ((keys (cdr (key-binding [tool-bar] t))) item) (unless (eq (caar keys) 'keymap) ;; Emacs >= 24 (while (setq item (pop keys)) (when (setq item (car-safe item)) (define-key keymap (vector 'tool-bar item) 'undefined))))) (let ((n (length defs)) def) (while (>= n 0) (setq n (1- n) def (nth n defs)) (define-key keymap (vector 'tool-bar (aref def 1)) (list 'menu-item (aref def 3) (aref def 1) :enable (aref def 2) :image (symbol-value (aref def 0))))))) (defun wl-highlight-plugged-current-line () (interactive) (when (wl-e21-display-image-p) (save-excursion (beginning-of-line) (when (looking-at "[[:blank:]]*\\(\\[\\([^]]+\\)\\]\\)") (let* ((start (match-beginning 1)) (end (match-end 1)) (status (match-string-no-properties 2)) (image (if (string-equal wl-plugged-plug-on status) wl-plugged-image wl-unplugged-image))) (when image (let (overlay) (let ((overlays (overlays-in start end))) (while (and (setq overlay (pop overlays)) (not (overlay-get overlay 'wl-e21-icon))))) (unless overlay (setq overlay (make-overlay start end)) (overlay-put overlay 'wl-e21-icon t) (overlay-put overlay 'evaporate t)) (overlay-put overlay 'display image)))))))) (defun wl-plugged-set-folder-icon (folder string) (let (image type) (when (wl-e21-display-image-p) (setq image (cond ((string= folder wl-queue-folder) (get 'wl-folder-queue-image 'image)) ((setq type (or (elmo-folder-type folder) (elmo-folder-type-internal (elmo-make-folder folder)))) (get (intern (format "wl-folder-%s-image" type)) 'image))))) (if image (concat (propertize " " 'display image 'invisible t) string) string))) (declare-function wl-toggle-plugged "wl" (&optional arg queue-flush-only)) (defun wl-plugged-init-icons () (let ((props (when (display-mouse-p) (list 'local-map (purecopy (make-mode-line-mouse-map 'mouse-2 #'wl-toggle-plugged)) 'help-echo "mouse-2 toggles plugged status")))) (if (wl-e21-display-image-p) (progn (unless wl-plugged-image (setq wl-plugged-image (wl-e21-find-image `((:type xpm :file ,wl-plugged-icon :ascent center))) wl-unplugged-image (wl-e21-find-image `((:type xpm :file ,wl-unplugged-icon :ascent center))))) (setq wl-modeline-plug-state-on (apply 'propertize wl-plug-state-indicator-on `(display ,wl-plugged-image ,@props)) wl-modeline-plug-state-off (apply 'propertize wl-plug-state-indicator-off `(display ,wl-unplugged-image ,@props)))) (if props (setq wl-modeline-plug-state-on (apply 'propertize wl-plug-state-indicator-on props) wl-modeline-plug-state-off (apply 'propertize wl-plug-state-indicator-off props)) (setq wl-modeline-plug-state-on wl-plug-state-indicator-on wl-modeline-plug-state-off wl-plug-state-indicator-off))))) (declare-function wl-biff-check-folders "wl-util" ()) (defun wl-biff-init-icons () (let ((props (when (display-mouse-p) (list 'local-map (purecopy (make-mode-line-mouse-map 'mouse-2 #'wl-biff-check-folders)) 'help-echo "mouse-2 checks new mails")))) (if (wl-e21-display-image-p) (progn (unless wl-biff-mail-image (setq wl-biff-mail-image (wl-e21-find-image `((:type xpm :file ,wl-biff-mail-icon :ascent center))) wl-biff-nomail-image (wl-e21-find-image `((:type xpm :file ,wl-biff-nomail-icon :ascent center))))) (setq wl-modeline-biff-state-on (apply 'propertize wl-biff-state-indicator-on `(display ,wl-biff-mail-image ,@props)) wl-modeline-biff-state-off (apply 'propertize wl-biff-state-indicator-off `(display ,wl-biff-nomail-image ,@props)))) (if props (setq wl-modeline-biff-state-on (apply 'propertize wl-biff-state-indicator-on props) wl-modeline-biff-state-off (apply 'propertize wl-biff-state-indicator-off props)) (setq wl-modeline-biff-state-on wl-biff-state-indicator-on wl-modeline-biff-state-off wl-biff-state-indicator-off))))) (defalias 'wl-defface 'defface) (make-obsolete 'wl-defface 'defface "26 May 2020") (put 'wl-modeline-biff-state-on 'risky-local-variable t) (put 'wl-modeline-biff-state-off 'risky-local-variable t) (put 'wl-modeline-plug-state-on 'risky-local-variable t) (put 'wl-modeline-plug-state-off 'risky-local-variable t) (require 'product) (product-provide (provide 'wl-e21) (require 'wl-version)) ;;; wl-e21.el ends here wanderlust-wanderlust-769699d/wl/wl-expire.el000066400000000000000000000677301406661363500213020ustar00rootroot00000000000000;;; wl-expire.el --- Message expire modules for Wanderlust. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000 Masahiro MURATA ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Author: Masahiro MURATA ;; Keywords: mail, net news ;; This file is part of Wanderlust (Yet Another Message Interface on Emacsen). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: (require 'wl-summary) (require 'wl-thread) (require 'wl-folder) (require 'elmo) (eval-when-compile (require 'wl-util) (require 'elmo-archive)) ;; Variables (defvar wl-expired-alist nil) (defvar wl-expired-alist-file-name "expired-alist") (defvar wl-expired-log-alist nil) (defvar wl-expired-log-alist-file-name "expired-log") (defvar wl-expire-test nil) ;; for debug (no execute) (defun wl-expired-alist-load () (elmo-object-load (expand-file-name wl-expired-alist-file-name elmo-msgdb-directory))) (defun wl-expired-alist-save (&optional alist) (elmo-object-save (expand-file-name wl-expired-alist-file-name elmo-msgdb-directory) (or alist wl-expired-alist))) (defsubst wl-expire-msg-p (msg-num mark-alist) (cond ((consp wl-summary-expire-reserve-marks) (let ((mark (nth 1 (assq msg-num mark-alist)))) (not (or (member mark wl-summary-expire-reserve-marks) (and wl-summary-buffer-disp-msg (eq msg-num wl-summary-buffer-current-msg)))))) ((eq wl-summary-expire-reserve-marks 'all) (not (or (assq msg-num mark-alist) (and wl-summary-buffer-disp-msg (eq msg-num wl-summary-buffer-current-msg))))) ((eq wl-summary-expire-reserve-marks 'none) t) (t (error "Invalid marks: %s" wl-summary-expire-reserve-marks)))) ;; New functions to avoid accessing to the msgdb directly. (defsubst wl-expire-message-p (folder number) "Return non-nil when a message in the FOLDER with NUMBER can be expired." (cond ((consp wl-summary-expire-reserve-marks) (let ((mark (wl-summary-message-mark folder number))) (not (or (member mark wl-summary-expire-reserve-marks) (and wl-summary-buffer-disp-msg (eq number wl-summary-buffer-current-msg)))))) ((eq wl-summary-expire-reserve-marks 'all) (not (or (wl-summary-message-mark folder number) (and wl-summary-buffer-disp-msg (eq number wl-summary-buffer-current-msg))))) ((eq wl-summary-expire-reserve-marks 'none) t) (t (error "Invalid marks: %s" wl-summary-expire-reserve-marks)))) (defun wl-expire-delete-reserved-messages (msgs folder) "Delete a number from NUMBERS when a message with the number is reserved." (let ((dlist msgs)) (while dlist (unless (wl-expire-message-p folder (car dlist)) (setq msgs (delq (car dlist) msgs))) (setq dlist (cdr dlist))) msgs)) ;; End New functions. (defun wl-expire-delete (folder delete-list &optional no-reserve-marks) "Delete message for expire." (unless no-reserve-marks (setq delete-list (wl-expire-delete-reserved-messages delete-list folder))) (when delete-list (let ((mess (format "Expiring (delete) %s msgs..." (length delete-list)))) (message "%s" mess) (if (elmo-folder-move-messages folder delete-list 'null) (progn (wl-expire-append-log (elmo-folder-name-internal folder) delete-list nil 'delete) (message "%sdone" mess)) (error "%sfailed!" mess)))) (cons delete-list (length delete-list))) (defun wl-expire-refile (folder refile-list dst-folder &optional no-reserve-marks preserve-number copy) "Refile message for expire. If COPY is non-nil, copy message." (when (not (string= (elmo-folder-name-internal folder) dst-folder)) (unless no-reserve-marks (setq refile-list (wl-expire-delete-reserved-messages refile-list folder))) (when refile-list (let* ((dst-name dst-folder) (dst-folder (wl-folder-get-elmo-folder dst-folder)) (action (format (if copy "Copying to %s" "Expiring (move to %s)") dst-name))) (elmo-with-progress-display (elmo-folder-move-messages (length refile-list)) action (if wl-expire-test nil (unless (or (elmo-folder-exists-p dst-folder) (elmo-folder-create dst-folder)) (error "Create folder failed: %s" dst-name)) (unless (elmo-folder-move-messages folder refile-list dst-folder copy preserve-number) (error "%s is failed" action)) (wl-expire-append-log (elmo-folder-name-internal folder) refile-list dst-name (if copy 'copy 'move)))))) (cons refile-list (length refile-list)))) (defun wl-expire-refile-with-copy-reserve-msg (folder refile-list dst-folder &optional _no-reserve-marks preserve-number _copy) "Refile message for expire. If REFILE-LIST includes reserve mark message, so copy." (when (not (string= (elmo-folder-name-internal folder) dst-folder)) (let ((msglist refile-list) (dst-folder (wl-folder-get-elmo-folder dst-folder)) (ret-val t) (copy-reserve-message) (copy-len 0) msg msg-id) (message "Expiring (move %s) %s msgs..." (elmo-folder-name-internal dst-folder) (length refile-list)) (if wl-expire-test (setq copy-len (length refile-list)) (unless (or (elmo-folder-exists-p dst-folder) (elmo-folder-create dst-folder)) (error "%s: create folder failed" (elmo-folder-name-internal dst-folder))) (while (setq msg (wl-pop msglist)) (unless (wl-expire-message-p folder msg) (setq msg-id (elmo-message-field folder msg 'message-id)) (if (assoc msg-id wl-expired-alist) ;; reserve mark message already refiled or expired (setq refile-list (delq msg refile-list)) ;; reserve mark message not refiled (wl-append wl-expired-alist (list (cons msg-id (elmo-folder-name-internal dst-folder)))) (setq copy-reserve-message t)))) (when refile-list (unless (setq ret-val (elmo-folder-move-messages folder refile-list dst-folder copy-reserve-message preserve-number)) (error "Expire: move msgs to %s failed" (elmo-folder-name-internal dst-folder))) (wl-expire-append-log (elmo-folder-name-internal folder) refile-list (elmo-folder-name-internal dst-folder) (if copy-reserve-message 'copy 'move)) (setq copy-len (length refile-list)) (when copy-reserve-message (setq refile-list (wl-expire-delete-reserved-messages refile-list folder)) (when refile-list (if (setq ret-val (elmo-folder-move-messages folder refile-list 'null)) (progn (wl-expire-append-log (elmo-folder-name-internal folder) refile-list nil 'delete)))))) (let ((mes (format "Expiring (move %s) %s msgs..." (elmo-folder-name-internal dst-folder) (length refile-list)))) (if ret-val (message "%sdone" mes) (error "%sfailed!" mes)))) (cons refile-list copy-len)))) (defun wl-expire-archive-get-folder (src-folder &optional fmt dst-folder-arg) "Get archive folder name from SRC-FOLDER." (let* ((fmt (or fmt wl-expire-archive-folder-name-fmt)) (src-folde-name (substring (elmo-folder-name-internal src-folder) (length (elmo-folder-prefix-internal src-folder)))) (archive-spec (char-to-string (car (rassq 'archive elmo-folder-type-alist)))) dst-folder-base dst-folder-fmt prefix) (cond (dst-folder-arg (setq dst-folder-base (concat archive-spec dst-folder-arg))) ((eq (elmo-folder-type-internal src-folder) 'localdir) (setq dst-folder-base (concat archive-spec src-folde-name))) (t (setq dst-folder-base (elmo-concat-path (format "%s%s" archive-spec (elmo-folder-type-internal src-folder)) src-folde-name)))) (setq dst-folder-fmt (format fmt dst-folder-base wl-expire-archive-folder-type)) (setq dst-folder-base (format "%s;%s" dst-folder-base wl-expire-archive-folder-type)) (when wl-expire-archive-folder-prefix (cond ((eq wl-expire-archive-folder-prefix 'short) (setq prefix (file-name-nondirectory src-folde-name))) (t (setq prefix src-folde-name))) (setq dst-folder-fmt (concat dst-folder-fmt ";" prefix)) (setq dst-folder-base (concat dst-folder-base ";" prefix))) (cons dst-folder-base dst-folder-fmt))) (defsubst wl-expire-archive-get-max-number (dst-folder-base &optional regexp) (let ((files (reverse (sort (elmo-folder-list-subfolders (elmo-make-folder dst-folder-base)) 'string<))) (regexp (or regexp wl-expire-archive-folder-num-regexp)) filenum in-folder) (catch 'done (while files (when (string-match regexp (car files)) (setq filenum (match-string 1 (car files))) (setq in-folder (elmo-folder-status (wl-folder-get-elmo-folder (car files)))) (throw 'done (cons in-folder filenum))) (setq files (cdr files)))))) (defun wl-expire-archive-number-delete-old (dst-folder-base preserve-number msgs folder &optional no-confirm regexp file) (let ((len 0) (max-num 0) folder-info dels) (if (or (and file (setq folder-info (cons (elmo-folder-status (wl-folder-get-elmo-folder file)) nil))) (setq folder-info (wl-expire-archive-get-max-number dst-folder-base regexp))) (progn (setq len (cdar folder-info)) (when preserve-number ;; delete small number than max number of dst-folder (setq max-num (caar folder-info)) (while (and msgs (>= max-num (car msgs))) (wl-append dels (list (car msgs))) (setq msgs (cdr msgs))) (setq dels (wl-expire-delete-reserved-messages dels folder)) (unless (and dels (or (or no-confirm (not wl-expire-delete-oldmsg-confirm)) (progn (if (eq major-mode 'wl-summary-mode) (wl-thread-jump-to-msg (car dels))) (y-or-n-p (format "Delete old messages %s? " dels))))) (setq dels nil))) (list msgs dels max-num (cdr folder-info) len)) (list msgs dels 0 "0" 0)))) (defun wl-expire-archive-number1 (folder delete-list &optional preserve-number dst-folder-arg no-delete) "Standard function for `wl-summary-expire'. Refile to archive folder followed message number." (let* ((elmo-archive-treat-file t) ;; treat archive folder as a file. (dst-folder-expand (and dst-folder-arg (elmo-expand-newtext dst-folder-arg (elmo-folder-name-internal folder)))) (dst-folder-fmt (funcall wl-expire-archive-get-folder-function folder nil dst-folder-expand)) (dst-folder-base (car dst-folder-fmt)) (dst-folder-fmt (cdr dst-folder-fmt)) (refile-func (if no-delete 'wl-expire-refile 'wl-expire-refile-with-copy-reserve-msg)) tmp dels dst-folder prev-arcnum arcnum msg arcmsg-list deleted-list ret-val) (setq tmp (wl-expire-archive-number-delete-old dst-folder-base preserve-number delete-list folder no-delete)) (when (and (not no-delete) (setq dels (nth 1 tmp))) (wl-append deleted-list (car (wl-expire-delete folder dels)))) (setq delete-list (car tmp)) (catch 'done (while t (if (setq msg (wl-pop delete-list)) (setq arcnum (/ msg wl-expire-archive-files)) (setq arcnum nil)) (when (and prev-arcnum (not (eq arcnum prev-arcnum))) (setq dst-folder (format dst-folder-fmt (* prev-arcnum wl-expire-archive-files))) (and (setq ret-val (funcall refile-func folder arcmsg-list dst-folder t preserve-number no-delete)) (wl-append deleted-list (car ret-val))) (setq arcmsg-list nil)) (if (null msg) (throw 'done t)) (wl-append arcmsg-list (list msg)) (setq prev-arcnum arcnum))) deleted-list)) (defun wl-expire-archive-number2 (folder delete-list &optional preserve-number dst-folder-arg no-delete) "Standard function for `wl-summary-expire'. Refile to archive folder followed the number of message in one archive folder. `elmo-localdir-folder-path' and `elmo-archive-folder-path' should be different from each other when you use this function. Please beware that default values are the same." (let* ((elmo-archive-treat-file t) ;; treat archive folder as a file. (dst-folder-expand (and dst-folder-arg (elmo-expand-newtext dst-folder-arg (elmo-folder-name-internal folder)))) (dst-folder-fmt (funcall wl-expire-archive-get-folder-function folder nil dst-folder-expand)) (dst-folder-base (car dst-folder-fmt)) (dst-folder-fmt (cdr dst-folder-fmt)) (refile-func (if no-delete 'wl-expire-refile 'wl-expire-refile-with-copy-reserve-msg)) (len 0) (filenum 0) tmp dels dst-folder arc-len msg arcmsg-list deleted-list ret-val) (setq tmp (wl-expire-archive-number-delete-old dst-folder-base preserve-number delete-list folder no-delete)) (when (and (not no-delete) (setq dels (nth 1 tmp))) (wl-append deleted-list (car (wl-expire-delete folder dels)))) (setq delete-list (car tmp) filenum (string-to-number (nth 3 tmp)) len (nth 4 tmp) arc-len len) (catch 'done (while t (if (setq msg (wl-pop delete-list)) (setq len (1+ len)) (setq len (1+ wl-expire-archive-files))) (when (> len wl-expire-archive-files) (when arcmsg-list (setq dst-folder (format dst-folder-fmt filenum)) (and (setq ret-val (funcall refile-func folder arcmsg-list dst-folder t preserve-number no-delete)) (wl-append deleted-list (car ret-val))) (setq arc-len (+ arc-len (cdr ret-val)))) (setq arcmsg-list nil) (if (< arc-len wl-expire-archive-files) (setq len (1+ arc-len)) (setq filenum (+ filenum wl-expire-archive-files) len (- len arc-len) ;; maybe 1 arc-len (1- len) ;; maybe 0 ))) (if (null msg) (throw 'done t)) (wl-append arcmsg-list (list msg)))) deleted-list)) (defun wl-expire-archive-date (folder delete-list &optional preserve-number dst-folder-arg no-delete) "Standard function for `wl-summary-expire'. Refile to archive folder followed message date." (let* ((elmo-archive-treat-file t) ;; treat archive folder as a file. (dst-folder-expand (and dst-folder-arg (elmo-expand-newtext dst-folder-arg (elmo-folder-name-internal folder)))) (dst-folder-fmt (funcall wl-expire-archive-get-folder-function folder wl-expire-archive-date-folder-name-fmt dst-folder-expand)) (dst-folder-base (car dst-folder-fmt)) (dst-folder-fmt (cdr dst-folder-fmt)) (refile-func (if no-delete 'wl-expire-refile 'wl-expire-refile-with-copy-reserve-msg)) tmp dels dst-folder time msg arcmsg-alist arcmsg-list deleted-list ret-val) (setq tmp (wl-expire-archive-number-delete-old dst-folder-base preserve-number delete-list folder no-delete wl-expire-archive-date-folder-num-regexp)) (when (and (not no-delete) (setq dels (nth 1 tmp))) (wl-append deleted-list (car (wl-expire-delete folder dels)))) (setq delete-list (car tmp)) (while (setq msg (wl-pop delete-list)) (setq time (or (elmo-time-to-datevec (elmo-message-field folder msg 'date)) (make-vector 7 0))) (if (= (aref time 1) 0) ;; if (month == 0) (aset time 0 0)) ;; year = 0 (setq dst-folder (format dst-folder-fmt (aref time 0) ;; year (aref time 1) ;; month )) (setq arcmsg-alist (wl-append-assoc-list dst-folder msg arcmsg-alist))) (while arcmsg-alist (setq dst-folder (caar arcmsg-alist)) (setq arcmsg-list (cdar arcmsg-alist)) (and (setq ret-val (funcall refile-func folder arcmsg-list dst-folder t preserve-number no-delete)) (wl-append deleted-list (car ret-val))) (setq arcmsg-alist (cdr arcmsg-alist))) deleted-list)) ;;; wl-expire-localdir-date (defvar wl-expire-localdir-date-folder-name-fmt "%s/%%04d_%%02d") (defcustom wl-expire-localdir-get-folder-function 'wl-expire-localdir-get-folder "*A function to get localdir folder name." :type 'function :group 'wl-expire) (defun wl-expire-localdir-get-folder (src-folder fmt dst-folder-arg) "Get localdir folder name from src-folder." (let* ((src-folder-name (substring (elmo-folder-name-internal src-folder) (length (elmo-folder-prefix-internal src-folder)))) (dst-folder-spec (char-to-string (car (rassq 'localdir elmo-folder-type-alist)))) dst-folder-base dst-folder-fmt) (cond (dst-folder-arg (setq dst-folder-base (concat dst-folder-spec dst-folder-arg))) ((eq (elmo-folder-type-internal src-folder) 'localdir) (setq dst-folder-base (concat dst-folder-spec src-folder-name))) (t (setq dst-folder-base (elmo-concat-path (format "%s%s" dst-folder-spec (elmo-folder-type-internal src-folder)) src-folder-name)))) (setq dst-folder-fmt (format fmt dst-folder-base)) (cons dst-folder-base dst-folder-fmt))) (defun wl-expire-localdir-date (folder delete-list &optional preserve-number dst-folder-arg no-delete) "Function for `wl-summary-expire'. Refile to localdir folder by message date. ex. +ml/wl/1999_11/, +ml/wl/1999_12/." (let* ((dst-folder-expand (and dst-folder-arg (elmo-expand-newtext dst-folder-arg (elmo-folder-name-internal folder)))) (dst-folder-fmt (funcall wl-expire-localdir-get-folder-function folder wl-expire-localdir-date-folder-name-fmt dst-folder-expand)) (dst-folder-fmt (cdr dst-folder-fmt)) (refile-func (if no-delete 'wl-expire-refile 'wl-expire-refile-with-copy-reserve-msg)) dst-folder time msg arcmsg-alist arcmsg-list deleted-list ret-val) (while (setq msg (wl-pop delete-list)) (setq time (or (elmo-time-to-datevec (elmo-message-field folder msg 'date)) (make-vector 7 0))) (if (= (aref time 1) 0) ;; if (month == 0) (aset time 0 0)) ;; year = 0 (setq dst-folder (format dst-folder-fmt (aref time 0);; year (aref time 1);; month )) (setq arcmsg-alist (wl-append-assoc-list dst-folder msg arcmsg-alist))) (while arcmsg-alist (setq dst-folder (caar arcmsg-alist)) (setq arcmsg-list (cdar arcmsg-alist)) (and (setq ret-val (funcall refile-func folder arcmsg-list dst-folder t preserve-number no-delete)) (wl-append deleted-list (car ret-val))) (setq arcmsg-alist (cdr arcmsg-alist))) deleted-list)) (defun wl-expire-hide (folder hide-list &optional no-reserve-marks) "Hide message for expire." (unless no-reserve-marks (setq hide-list (wl-expire-delete-reserved-messages hide-list folder))) (let ((mess (format "Hiding %s msgs..." (length hide-list)))) (message "%s" mess) (elmo-folder-detach-messages folder hide-list) (elmo-folder-kill-messages folder hide-list) (elmo-folder-commit folder) (message "%sdone" mess) (cons hide-list (length hide-list)))) (defsubst wl-expire-folder-p (entity) "Return non-nil, when ENTITY matched `wl-expire-alist'." (wl-get-assoc-list-value wl-expire-alist entity)) (defsubst wl-archive-folder-p (entity) "Return non-nil, when ENTITY matched `wl-archive-alist'." (wl-get-assoc-list-value wl-archive-alist entity)) (defun wl-summary-expire (&optional folder notsummary all) "Expire messages of current summary." (interactive (list wl-summary-buffer-elmo-folder nil current-prefix-arg)) (let* ((folder (or folder wl-summary-buffer-elmo-folder)) (folder-name (elmo-folder-name-internal folder)) (rule (wl-expire-folder-p folder-name))) (if (not rule) (and (called-interactively-p 'interactive) (error "No match %s in `wl-expire-alist'" folder-name)) (when (or (not (called-interactively-p 'interactive)) (y-or-n-p (format "Expire %s? " folder-name))) (save-excursion (run-hooks 'wl-summary-expire-pre-hook) (let ((expired (apply #'wl-expire-folder folder all rule))) (when (and (not wl-expire-test) (not notsummary) expired) (wl-summary-delete-messages-on-buffer expired) (wl-summary-folder-info-update) (wl-summary-set-message-modified) (sit-for 0) (set-buffer-modified-p nil)) (run-hooks 'wl-summary-expire-hook) (if expired (message "Expiring %s is done" folder-name) (and (called-interactively-p 'interactive) (message "No expire"))) expired)))))) (defun wl-expire-folder (folder all condition action &rest args) (let ((folder-name (elmo-folder-name-internal folder)) (val-type (car condition)) (value (nth 1 condition)) targets) (cond ((eq val-type nil)) ((eq val-type 'number) (let* ((msgs (elmo-folder-list-messages folder (not all) (not all))) (msglen (length msgs)) count) (when (>= msglen (or (nth 2 condition) (1+ value))) (setq count (- msglen value)) (while (and msgs (> count 0)) (when (elmo-message-entity folder (car msgs)) ;; don't expire new message (wl-append targets (list (car msgs))) (when (or (not wl-expire-number-with-reserve-marks) (wl-expire-message-p folder (car msgs))) (setq count (1- count)))) (setq msgs (cdr msgs)))))) ((eq val-type 'date) (let ((key-date (elmo-datevec-to-time (elmo-date-get-offset-datevec (timezone-fix-time (current-time-string) (current-time-zone) nil) value t)))) (elmo-folder-do-each-message-entity (entity folder) (when (time-less-p (elmo-message-entity-field entity 'date) key-date) (wl-append targets (list (elmo-message-entity-number entity))))))) (t (error "%s: not supported" val-type))) (when targets (or wl-expired-alist (setq wl-expired-alist (wl-expired-alist-load))) ;; evaluate string-match for elmo-expand-newtext (wl-expire-folder-p folder-name) (prog1 (cond ((eq action nil) nil) ((eq action 'remove) (car (wl-expire-delete folder targets))) ((eq action 'trash) (car (wl-expire-refile folder targets wl-trash-folder))) ((eq action 'hide) (car (wl-expire-hide folder targets))) ((stringp action) (car (wl-expire-refile folder targets (elmo-expand-newtext action folder-name)))) ((fboundp action) (apply action folder targets args)) (t (error "%s: invalid type" action))) (wl-expired-alist-save))))) (defun wl-folder-expire-entity (entity) (cond ((consp entity) (let ((flist (nth 2 entity))) (while flist (wl-folder-expire-entity (car flist)) (setq flist (cdr flist))))) ((stringp entity) (when (wl-expire-folder-p entity) (let ((folder (wl-folder-get-elmo-folder entity)) (summary (wl-summary-get-buffer entity)) (update-msgdb (cond ((consp wl-expire-folder-update-msgdb) (elmo-string-match-member entity wl-expire-folder-update-msgdb)) (t wl-expire-folder-update-msgdb)))) (when update-msgdb (wl-folder-sync-entity entity)) (if summary (save-selected-window (with-current-buffer summary (let ((win (get-buffer-window summary t))) (when win (select-window win))) (when (wl-summary-expire folder) (wl-summary-save-status)))) (when (wl-summary-expire folder 'no-summary) (wl-folder-check-entity entity)))))))) ;; Command (defun wl-folder-expire-current-entity () (interactive) (let ((entity-name (wl-folder-get-entity-from-buffer)) (type (if (wl-folder-buffer-group-p) 'group 'folder))) (when (and entity-name (or (not (called-interactively-p 'interactive)) (y-or-n-p (format "Expire %s? " entity-name)))) (wl-folder-expire-entity (wl-folder-search-entity-by-name entity-name wl-folder-entity type)) (message "Expiring %s is done" entity-name)))) ;;; Archive (defun wl-folder-archive-current-entity () (interactive) (let ((entity-name (wl-folder-get-entity-from-buffer)) (type (if (wl-folder-buffer-group-p) 'group 'folder))) (when (and entity-name (or (not (called-interactively-p 'interactive)) (y-or-n-p (format "Archive %s? " entity-name)))) (wl-folder-archive-entity (wl-folder-search-entity-by-name entity-name wl-folder-entity type)) (message "Archiving %s is done" entity-name)))) (defun wl-archive-number1 (folder archive-list &optional dst-folder-arg) (wl-expire-archive-number1 folder archive-list t dst-folder-arg t)) (defun wl-archive-number2 (folder archive-list &optional dst-folder-arg) (wl-expire-archive-number2 folder archive-list t dst-folder-arg t)) (defun wl-archive-date (folder archive-list &optional dst-folder-arg) (wl-expire-archive-date folder archive-list t dst-folder-arg t)) (defun wl-archive-folder (folder archive-list dst-folder) (let* ((elmo-archive-treat-file t) ;; treat archive folder as a file. copied-list ret-val) (setq archive-list (car (wl-expire-archive-number-delete-old nil t archive-list folder t ;; no-confirm nil dst-folder))) (when archive-list (and (setq ret-val (wl-expire-refile folder archive-list dst-folder t t t)) ;; copy!! (wl-append copied-list ret-val))) copied-list)) (defun wl-summary-archive (&optional arg folder _notsummary nolist) "" (interactive "P") (let* ((folder (or folder wl-summary-buffer-elmo-folder)) (msgs (if (not nolist) (elmo-folder-list-messages folder) (elmo-folder-list-messages folder 'visible 'in-msgdb))) archives func args dst-folder archive-list) (if arg (let ((wl-default-spec (char-to-string (car (rassq 'archive elmo-folder-type-alist))))) (setq dst-folder (wl-summary-read-folder (concat wl-default-spec (substring (elmo-folder-name-internal folder) 1)) "for archive")))) (run-hooks 'wl-summary-archive-pre-hook) (if dst-folder (wl-archive-folder folder msgs dst-folder) (when (and (or (setq archives (wl-archive-folder-p (elmo-folder-name-internal folder))) (progn (and (called-interactively-p 'interactive) (message "No match %s in wl-archive-alist" (elmo-folder-name-internal folder))) nil)) (or (not (called-interactively-p 'interactive)) (y-or-n-p (format "Archive %s? " (elmo-folder-name-internal folder))))) (setq func (car archives) args (cdr archives)) (setq archive-list (apply func (append (list folder msgs) args))) (run-hooks 'wl-summary-archive-hook) (if archive-list (message "Archiving %s is done" (elmo-folder-name-internal folder)) (and (called-interactively-p 'interactive) (message "No archive"))))))) (defun wl-folder-archive-entity (entity) (cond ((consp entity) (let ((flist (nth 2 entity))) (while flist (wl-folder-archive-entity (car flist)) (setq flist (cdr flist))))) ((stringp entity) (wl-summary-archive nil (wl-folder-get-elmo-folder entity) t)))) ;; append log (defun wl-expire-append-log (src-folder msgs dst-folder action) (when wl-expire-use-log (save-excursion (let ((tmp-buf (get-buffer-create " *wl-expire work*")) (filename (expand-file-name wl-expired-log-alist-file-name elmo-msgdb-directory))) (set-buffer tmp-buf) (erase-buffer) (if dst-folder (insert (format "%s\t%s -> %s\t%s\n" action src-folder dst-folder msgs)) (insert (format "%s\t%s\t%s\n" action src-folder msgs))) (if (file-writable-p filename) (write-region (point-min) (point-max) filename t 'no-msg) (message "%s is not writable." filename)) (kill-buffer tmp-buf))))) (require 'product) (product-provide (provide 'wl-expire) (require 'wl-version)) ;;; wl-expire.el ends here wanderlust-wanderlust-769699d/wl/wl-fldmgr.el000066400000000000000000001263561406661363500212610ustar00rootroot00000000000000;;; wl-fldmgr.el --- Folder manager for Wanderlust. -*- lexical-binding: t -*- ;; Copyright 1998,1999,2000 Masahiro MURATA ;; Yuuichi Teranishi ;; Author: Masahiro MURATA ;; Keywords: mail, net news ;; This file is part of Wanderlust (Yet Another Message Interface on Emacsen). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'wl-folder) (require 'wl-summary) (require 'wl-highlight) (require 'wl-version) (eval-when-compile (require 'wl-util)) ;;; Global Variable (defvar wl-fldmgr-modified nil) (defvar wl-fldmgr-modified-access-list nil) (defvar wl-fldmgr-cut-entity-list nil) (defvar wl-fldmgr-entity-list nil) (defvar wl-fldmgr-group-insert-opened nil) (defconst wl-fldmgr-folders-header (format "# # Folder definition file # This file is generated automatically by %s. # # If you edit this file by hand, be sure that comment lines # will be washed out by wl-fldmgr. # " (product-string-1 'wl-version t))) ;;; Initial setup (defvar wl-fldmgr-mode-map nil) (if wl-fldmgr-mode-map nil (define-prefix-command 'wl-fldmgr-mode-map) (define-key wl-fldmgr-mode-map "\C-s" 'wl-fldmgr-save-folders) (define-key wl-fldmgr-mode-map "m" 'wl-fldmgr-make-multi) (define-key wl-fldmgr-mode-map "g" 'wl-fldmgr-make-group) (define-key wl-fldmgr-mode-map "A" 'wl-fldmgr-make-access-group) (define-key wl-fldmgr-mode-map "f" 'wl-fldmgr-make-filter) (define-key wl-fldmgr-mode-map "p" 'wl-fldmgr-set-petname) (define-key wl-fldmgr-mode-map "a" 'wl-fldmgr-add) (define-key wl-fldmgr-mode-map "d" 'wl-fldmgr-delete) (define-key wl-fldmgr-mode-map "R" 'wl-fldmgr-rename) (define-key wl-fldmgr-mode-map "c" 'wl-fldmgr-copy) (define-key wl-fldmgr-mode-map "k" 'wl-fldmgr-cut) (define-key wl-fldmgr-mode-map "W" 'wl-fldmgr-copy-region) (define-key wl-fldmgr-mode-map "\C-w" 'wl-fldmgr-cut-region) (define-key wl-fldmgr-mode-map "y" 'wl-fldmgr-yank) (define-key wl-fldmgr-mode-map "s" 'wl-fldmgr-sort) (define-key wl-fldmgr-mode-map "l" 'wl-fldmgr-access-display-normal) (define-key wl-fldmgr-mode-map "L" 'wl-fldmgr-access-display-all) (define-key wl-fldmgr-mode-map "q" 'wl-fldmgr-clear-cut-entity-list) (define-key wl-fldmgr-mode-map "r" 'wl-fldmgr-reconst-entity-hashtb) (define-key wl-fldmgr-mode-map "u" 'wl-fldmgr-unsubscribe) (define-key wl-fldmgr-mode-map "U" 'wl-fldmgr-unsubscribe-region)) (add-hook 'wl-folder-mode-hook 'wl-fldmgr-init) (defun wl-fldmgr-init () (setq wl-fldmgr-cut-entity-list nil) (setq wl-fldmgr-modified nil) (setq wl-fldmgr-modified-access-list nil)) (defun wl-fldmgr-exit () (when (and wl-fldmgr-modified (or (not wl-interactive-save-folders) (y-or-n-p (concat "Folder view was modified" (and wl-fldmgr-cut-entity-list (format " (%s in cut stack)" (length wl-fldmgr-cut-entity-list))) ". Save current folders? ")))) (wl-fldmgr-save-folders))) ;;; Macro and misc Function ;; (defun wl-fldmgr-delete-line () (delete-region (point-at-bol) (1+ (point-at-eol)))) (defun wl-fldmgr-make-indent (level) (concat " " (make-string (* 2 level) (string-to-char " ")))) (defmacro wl-fldmgr-get-entity-id (&optional entity) `(get-text-property (if ,entity 0 (point)) 'wl-folder-entity-id ,entity)) (defmacro wl-fldmgr-assign-id (entity &optional id) `(let ((entity-id (or ,id wl-folder-entity-id))) (put-text-property 0 (length ,entity) 'wl-folder-entity-id entity-id ,entity))) (defsubst wl-fldmgr-read-string (str) (if (string-match "\n" str) (error "Not supported name: %s" str) (substring-no-properties str))) (defsubst wl-fldmgr-add-modified-access-list (group) (if (not (member group wl-fldmgr-modified-access-list)) (wl-append wl-fldmgr-modified-access-list (list group)))) (defsubst wl-fldmgr-delete-modified-access-list (group) (if (member group wl-fldmgr-modified-access-list) (setq wl-fldmgr-modified-access-list (delete group wl-fldmgr-modified-access-list)))) (defsubst wl-fldmgr-add-group (group) (or (assoc group wl-folder-group-alist) (wl-append wl-folder-group-alist (list (cons group wl-fldmgr-group-insert-opened))))) (defsubst wl-fldmgr-delete-group (group) (wl-fldmgr-delete-modified-access-list group) (setq wl-folder-group-alist (delete (assoc group wl-folder-group-alist) wl-folder-group-alist))) (defun wl-fldmgr-add-entity-hashtb (entities) "Update `wl-folder-entity-hashtb', `wl-folder-newsgroups-hashtb'. Return value is diffs '(new unread all)." (let* ((new-diff 0) (unread-diff 0) (all-diff 0) val entity entity-stack) (setq wl-folder-newsgroups-hashtb (or (wl-folder-create-newsgroups-hashtb entities t) wl-folder-newsgroups-hashtb)) (while entities (setq entity (wl-pop entities)) (cond ((consp entity) (wl-fldmgr-add-group (car entity)) (and entities (wl-push entities entity-stack)) (setq entities (nth 2 entity))) ((stringp entity) (if (not (setq val (wl-folder-get-entity-info entity))) (wl-folder-set-entity-info entity nil) (setq new-diff (+ new-diff (or (nth 0 val) 0))) (setq unread-diff (+ unread-diff (or (nth 1 val) 0))) (setq all-diff (+ all-diff (or (nth 2 val) 0)))))) (unless entities (setq entities (wl-pop entity-stack)))) (setq unread-diff (+ unread-diff new-diff)) (list new-diff unread-diff all-diff))) (defun wl-fldmgr-delete-entity-hashtb (entities &optional clear) "Update `wl-folder-entity-hashtb'. return value is diffs '(-new -unread -all)." (let* ((new-diff 0) (unread-diff 0) (all-diff 0) entity val entity-stack) (while entities (setq entity (wl-pop entities)) (cond ((consp entity) (wl-fldmgr-delete-group (car entity)) (and entities (wl-push entities entity-stack)) (setq entities (nth 2 entity))) ((stringp entity) (when (setq val (wl-folder-get-entity-info entity)) (setq new-diff (+ new-diff (or (nth 0 val) 0))) (setq unread-diff (+ unread-diff (or (nth 1 val) 0))) (setq all-diff (+ all-diff (or (nth 2 val) 0))) (and clear (wl-folder-clear-entity-info entity))))) (unless entities (setq entities (wl-pop entity-stack)))) (setq unread-diff (+ unread-diff new-diff)) (list (- new-diff) (- unread-diff) (- all-diff)))) ;; return value ;; example: '(("Desktop" group) ("+ml" access) "+ml/wl") (defun wl-fldmgr-get-path (entity target-entity &optional group-target) (let* ((target-id (wl-fldmgr-get-entity-id target-entity)) (entities (list entity)) entity-stack result-path) (reverse (catch 'done (while entities (setq entity (wl-pop entities)) (cond ((consp entity) (if (and (string= target-entity (car entity)) (eq target-id (wl-fldmgr-get-entity-id (car entity)))) (throw 'done (wl-push (if group-target (car entity) (list (car entity) (nth 1 entity))) result-path)) (wl-push (list (car entity) (nth 1 entity)) result-path)) (wl-push entities entity-stack) (setq entities (nth 2 entity))) ((stringp entity) (if (and (string= target-entity entity) (eq target-id (wl-fldmgr-get-entity-id entity))) (throw 'done (wl-push entity result-path))))) (unless entities (while (and entity-stack (not entities)) (setq result-path (cdr result-path)) (setq entities (wl-pop entity-stack))))))))) ;;;(defun wl-fldmgr-get-previous-entity (entity key-id) ;;; (cdr (wl-fldmgr-get-previous-entity-internal '(nil . nil) entity key-id))) ;;; ;;;(defun wl-fldmgr-get-previous-entity-internal (result entity key-id) ;;; (cond ;;; ((stringp entity) ;;; (if (eq key-id (wl-fldmgr-get-entity-id entity)) ;;; (cons t result) ;;; (cons nil (cons entity entity)))) ;;; ((consp entity) ;;; (if (eq key-id (wl-fldmgr-get-entity-id (car entity))) ;;; (cons t result) ;;; (setcar result (car entity)) ;;; (let ((flist (nth 2 entity)) ;;; return found) ;;; (while (and flist (not found)) ;;; (if (car (setq return ;;; (wl-fldmgr-get-previous-entity-internal ;;; result (car flist) key-id))) ;;; (setq found t)) ;;; (setq result (cdr return)) ;;; (setq flist (cdr flist))) ;;; (cons found result)))))) ;; path is get `wl-fldmgr-get-path-from-buffer'. (defun wl-fldmgr-update-group (path diffs) (save-excursion (while (and path (consp (car path))) (if (string= (caar path) wl-folder-desktop-name) ; update desktop (progn (goto-char (point-min)) (wl-folder-update-diff-line diffs)) ;; goto the path line. (goto-char (point-min)) (if (wl-folder-buffer-search-group (wl-folder-get-petname (caar path))) (wl-folder-update-diff-line diffs))) (setq path (cdr path))))) ;;; Function for wl-folder-entity ;; ;; usage: ;; (wl-delete-entity '(("Desktop") ("ML") "+ml/wl") '("+ml/wl") wl-folder-entity) ;; (wl-delete-entity '(("Desktop") "ML") '("+inbox" "ML") wl-folder-entity) ;; (wl-delete-entity '(("Desktop") "ML") nil wl-folder-entity) (defun wl-delete-entity (key-path delete-list entity &optional clear) (let (wl-fldmgr-entity-list) (when (and (string= (caar key-path) (car entity)) (wl-delete-entity-sub (cdr key-path) delete-list entity clear)) ;; return value is non-nil (diffs) (wl-fldmgr-delete-entity-hashtb wl-fldmgr-entity-list clear)))) (defun wl-delete-entity-sub (key-path delete-list entity clear) (let ((flist (nth 2 entity)) (key (car key-path)) next) (cond ((consp key);; into group (if (setq next (assoc (car key) flist)) (wl-delete-entity-sub (cdr key-path) delete-list next clear) ;; not found nil)) ((stringp key) ;; delete entities (if (not delete-list) (setq delete-list (list key))) (let* ((group (car entity)) (access (eq (nth 1 entity) 'access)) (unsubscribes (and access (nth 3 entity))) (update t) cut-entity is-group) (catch 'done (while delete-list (setq key (car delete-list)) (cond ((member key flist);; entity (setq flist (delete key flist)) (unless clear (wl-push key wl-fldmgr-cut-entity-list)) (wl-append wl-fldmgr-entity-list (list key)) (setq is-group nil)) ((setq cut-entity (assoc key flist));; group (setq flist (delete cut-entity flist)) (unless clear (wl-push cut-entity wl-fldmgr-cut-entity-list)) (wl-append wl-fldmgr-entity-list (list cut-entity)) (setq is-group t)) (t ;; not found (message "%s not found" key) (setq update nil) (throw 'done t))) (when (and access (not clear)) (if is-group (wl-append unsubscribes (list (list (substring-no-properties key) 'access nil))) (wl-append unsubscribes (list (substring-no-properties key))))) (setq delete-list (cdr delete-list)))) (when update (setcdr (cdr entity) (list flist unsubscribes)) (when access (wl-fldmgr-add-modified-access-list group)) t)))))) ;; usage: ;; (wl-add-entity '(("Desktop") ("ML") "ml/wl") '("+ml/new") wl-folder-entity 12) ;; (wl-add-entity '(("Desktop") "ML") '("+ml/new") wl-folder-entity 10) (defun wl-add-entity (key-path new entity _prev-entity-id &optional errmes) (when (string= (caar key-path) (car entity)) (let ((entities new)) (while entities (wl-folder-entity-assign-id (pop entities) wl-folder-entity-id-name-hashtb t))) (when (wl-add-entity-sub (cdr key-path) new entity errmes) ;; return value is non-nil (diffs) (wl-fldmgr-add-entity-hashtb new)))) (defun wl-add-entity-sub (key-path new entity &optional errmes) (let ((flist (nth 2 entity)) entry) (catch 'success (cond ((consp (car key-path));; into group (if (setq entry (assoc (caar key-path) flist)) (if (not (wl-add-entity-sub (cdr key-path) new entry errmes)) (throw 'success nil)) (and errmes (message "%s not found" (caar key-path))) (throw 'success nil))) (t;; insert entities (let* ((new2 new) (group (car entity)) (access (eq (nth 1 entity) 'access)) (unsubscribes (and access (nth 3 entity)))) ;; check (while new2 (cond ((stringp (car new2)) ;; folder (cond ((elmo-string-member (car new2) flist) (and errmes (message "%s: already exists" (car new2))) (throw 'success nil)) ((and access (not (elmo-string-member (car new2) unsubscribes))) (and errmes (message "%s: not access group folder" (car new2))) (throw 'success nil)))) (t ;; group (when (and access (not (elmo-string-assoc (caar new2) unsubscribes))) (and errmes (message "%s: can't insert access group" (caar new2))) (throw 'success nil)))) (setq new2 (cdr new2))) ;; do it (when access ;; remove from unsubscribe (setq new2 new) (while new2 (if (consp (car new2)) (setq unsubscribes (delq (elmo-string-assoc (car (car new2)) unsubscribes) unsubscribes)) (setq unsubscribes (delete (substring-no-properties (car new2)) unsubscribes))) (setq new2 (cdr new2))) (setcdr (cddr entity) (list unsubscribes)) (wl-fldmgr-add-modified-access-list group)) (if (not key-path);; insert group top (if (cddr entity) (setcar (cddr entity) (append new flist)) (setcdr (cdr entity) (list new))) (let (akey) (if (catch 'done (while flist (setq akey (car flist)) (cond ((consp akey);; group (if (equal (car key-path) (car akey)) (throw 'done t))) (t (if (equal (car key-path) akey) (throw 'done t)))) (setq flist (cdr flist)))) (setcdr flist (append new (cdr flist))) (and errmes (message "%s not found" (car key-path))) (throw 'success nil))))))) (throw 'success t)))) ;; return value is ;; (path indent-level (group . type) previous-entity-id target-entity) ;; previous-entity-id is (id-name-alist-prev-id . entity-alist-prev-id) ;; example: ;; '((("Desktop" group) ("ML" group) "+ml/wl") '(3 2) ("ML" . group) nil "+ml/wl") (defun wl-fldmgr-get-path-from-buffer (&optional prev) (let ((indent-level 0) (group-target t) (previous-entity nil) folder-path group-type entity) (save-excursion (beginning-of-line) (when prev ;;; (wl-folder-next-entity-skip-invalid t) ;;; (and (setq previous-entity ;;; (wl-fldmgr-get-previous-entity wl-folder-entity ;;; (wl-fldmgr-get-entity-id))) ;;; ;; change entity to id ;;; (setq previous-entity ;;; (cons ;;; (and (car previous-entity) ;;; (wl-fldmgr-get-entity-id (car previous-entity))) ;;; (and (cdr previous-entity) ;;; (wl-fldmgr-get-entity-id (cdr previous-entity)))))) (wl-folder-prev-entity-skip-invalid)) (if (and prev (wl-folder-buffer-group-p) (looking-at wl-folder-group-regexp) (string= (match-string-no-properties 2) "-")) (setq group-target nil) (if (and prev (bobp)) (error "Out of desktop group"))) (setq folder-path (wl-fldmgr-get-path wl-folder-entity (wl-folder-get-entity-from-buffer) ;;; (wl-fldmgr-get-entity-id) group-target)) (let ((fp folder-path)) (while fp (if (consp (car fp)) (progn (setq indent-level (1+ indent-level)) (setq group-type (cons (caar fp) (nth 1 (car fp))))) (setq entity (car fp))) (setq fp (cdr fp)))) (list folder-path indent-level group-type previous-entity entity)))) ;;; Command ;; (defun wl-fldmgr-clear-cut-entity-list () (interactive) (setq wl-fldmgr-cut-entity-list nil) (message "Cleared cut entity list")) (defun wl-fldmgr-reconst-entity-hashtb (&optional arg nomes) (interactive "P") (or nomes (message "Reconstructing entity alist...")) (when (not arg) (setq wl-folder-entity-id 0) (wl-folder-entity-assign-id wl-folder-entity)) (setq wl-folder-entity-hashtb (wl-folder-create-entity-hashtb wl-folder-entity wl-folder-entity-hashtb t)) ;; reset property on buffer (when (not arg) (let ((inhibit-read-only t) (cur-point (point))) (erase-buffer) (wl-folder-insert-entity " " wl-folder-entity) (goto-char cur-point) (set-buffer-modified-p nil))) (or nomes (message "Reconstructing entity alist...done"))) (defun wl-fldmgr-cut-region () (interactive) (let* ((p1 (region-beginning)) (p2 (region-end)) (r1 (progn (goto-char p1) (beginning-of-line) (point))) (r2 (progn (goto-char p2) (beginning-of-line) (point))) (from (min r1 r2)) (to (max r1 r2)) (count 0) (errmes nil) (cut-list nil) name pre-indent indent) (catch 'err (save-excursion (goto-char from) (and (looking-at "^\\([ ]*\\)") (setq pre-indent (match-string-no-properties 1))) (while (< (point) to) (and (looking-at "^\\([ ]*\\)") (setq indent (match-string-no-properties 1))) (cond ((= (length pre-indent) (length indent)) (setq pre-indent indent) (setq count (1+ count)) (and (setq name (wl-folder-get-entity-from-buffer)) (wl-append cut-list (list name))) (forward-line)) ((< (length pre-indent) (length indent)) (wl-folder-goto-bottom-of-current-folder pre-indent) (beginning-of-line)) (t (setq errmes "bad region") (throw 'err t)))) (unless (eq (point) to) (setq errmes "bad region") (throw 'err t))) (save-excursion (let ((count2 (length cut-list)) tmp path ent diffs) (goto-char from) (save-excursion (wl-folder-next-entity-skip-invalid t) (setq tmp (wl-fldmgr-get-path-from-buffer))) (setq path (car tmp)) (setq diffs (wl-delete-entity path cut-list wl-folder-entity)) (catch 'done (while (> count 0) (setq ent (looking-at wl-folder-entity-regexp)) (if (not (wl-fldmgr-cut (and ent tmp) (and ent (pop cut-list)))) (throw 'done nil)) (setq count (1- count)))) (if (> count2 0) (wl-push count2 wl-fldmgr-cut-entity-list)) (if diffs (wl-fldmgr-update-group path diffs)) t)) (throw 'err nil)) (if errmes (message "%s" errmes)))) (defun wl-fldmgr-cut (&optional tmp entity clear) (interactive) (save-excursion (beginning-of-line) (let ((ret-val nil) (inhibit-read-only t) path diffs) (if (bobp) (message "Can't remove desktop group") (or tmp (setq tmp (wl-fldmgr-get-path-from-buffer))) (setq path (car tmp)) (if (not path) (if (not (eobp)) (wl-fldmgr-delete-line)) ;; unsubscribe or removed folder (if (not entity) (setq diffs (wl-delete-entity path nil wl-folder-entity clear))) (setq wl-fldmgr-modified t) ;; (if (and (wl-folder-buffer-group-p) (looking-at wl-folder-group-regexp)) ;; group (let (beg end indent opened) (setq indent (match-string-no-properties 1)) (setq opened (match-string-no-properties 2)) (if (string= opened "+") (wl-fldmgr-delete-line) (setq beg (point)) (end-of-line) (save-match-data (setq end (progn (wl-folder-goto-bottom-of-current-folder indent) (beginning-of-line) (point)))) (delete-region beg end))) ;; entity (wl-fldmgr-delete-line)) (if diffs (wl-fldmgr-update-group path diffs)) (set-buffer-modified-p nil)) (setq ret-val t)) ret-val))) (defun wl-fldmgr-copy-region () (interactive) (let* ((p1 (region-beginning)) (p2 (region-end)) (r1 (progn (goto-char p1) (beginning-of-line) (point))) (r2 (progn (goto-char p2) (beginning-of-line) (point))) (from (min r1 r2)) (to (max r1 r2)) (errmes nil) (cut-list nil) (count 0) name pre-indent indent) (catch 'err (save-excursion (goto-char from) (when (bobp) (setq errmes "can't copy desktop group") (throw 'err t)) (and (looking-at "^\\([ ]*\\)") (setq pre-indent (match-string-no-properties 1))) (while (< (point) to) (and (looking-at "^\\([ ]*\\)") (setq indent (match-string-no-properties 1))) (if (wl-folder-buffer-group-p) (progn (setq errmes "can't copy group folder") (throw 'err t))) (cond ((= (length pre-indent) (length indent)) (if (setq name (wl-folder-get-entity-from-buffer)) (progn (setq pre-indent indent) (wl-push name cut-list))) (forward-line)) ((< (length pre-indent) (length indent)) (wl-folder-goto-bottom-of-current-folder pre-indent) (beginning-of-line)) (t (setq errmes "bad region") (throw 'err t)))) (unless (eq (point) to) (setq errmes "bad region") (throw 'err t))) (catch 'done (setq cut-list (reverse cut-list)) (while cut-list (setq name (pop cut-list)) (unless (wl-fldmgr-copy name) (throw 'done nil)) (setq count (1+ count))) (wl-push count wl-fldmgr-cut-entity-list) (message "Copy %s folders" count) (throw 'err nil))) (if errmes (message "%s" errmes)))) (defun wl-fldmgr-copy (&optional ename) (interactive "P") (save-excursion (beginning-of-line) (let ((ret-val nil)) (if (and (not ename) (wl-folder-buffer-group-p)) (message "Can't copy group folder") (let* ((name (or ename (wl-folder-get-entity-from-buffer))) (entity (substring-no-properties name))) (when name (if (member entity wl-fldmgr-cut-entity-list) (setq wl-fldmgr-cut-entity-list (delete entity wl-fldmgr-cut-entity-list))) (wl-push entity wl-fldmgr-cut-entity-list) (or ename (message "Copy: %s" name)) (setq ret-val t)))) ret-val))) (defun wl-fldmgr-yank () (interactive) (save-excursion (beginning-of-line) (if (bobp) (message "Can't insert in the out of desktop group") (let ((inhibit-read-only t) (top (car wl-fldmgr-cut-entity-list)) (access nil) tmp indent path count new new-list diffs) (if (not top) (message "No cut buffer") (setq tmp (wl-fldmgr-get-path-from-buffer t)) (setq path (car tmp)) (setq indent (wl-fldmgr-make-indent (nth 1 tmp))) (if (numberp top) (setq count (pop wl-fldmgr-cut-entity-list)) (setq count 1)) (if (catch 'err (let ((count count) (cut-list wl-fldmgr-cut-entity-list)) ;; check insert entity (while (> count 0) (setq new (car cut-list)) (wl-push new new-list) (when (consp new);; group (cond (access (message "Can't insert group in access") (throw 'err t)) ((elmo-string-assoc (car new) wl-folder-group-alist) (message "%s: group already exists" (car new)) (throw 'err t)))) (setq cut-list (cdr cut-list)) (setq count (1- count)))) (if (not (setq diffs (wl-add-entity path new-list wl-folder-entity (nth 3 tmp) t))) (throw 'err t)) (while (> count 0) (setq new (pop wl-fldmgr-cut-entity-list)) (save-excursion (wl-folder-insert-entity indent new) (setq wl-fldmgr-modified t)) (setq count (1- count))) (wl-fldmgr-update-group path diffs) (set-buffer-modified-p nil)) ;; error (wl-push count wl-fldmgr-cut-entity-list))))))) (defvar wl-fldmgr-add-completion-hashtb (make-vector 7 0)) (defun wl-fldmgr-add-completion-all-completions (string) (let ((table (catch 'found (mapatoms (lambda (atom) (if (string-match (symbol-name atom) string) (throw 'found (symbol-value atom)))) wl-fldmgr-add-completion-hashtb))) (pattern (if (string-match "\\.$" (elmo-folder-prefix-internal (wl-folder-get-elmo-folder string))) (substring string 0 (match-beginning 0)) (concat string nil)))) (or table (setq table (elmo-folder-list-subfolders (wl-folder-get-elmo-folder pattern))) (and table (or (/= (length table) 1) (elmo-folder-exists-p (wl-folder-get-elmo-folder (car table))))) (setq pattern (if (string-match "\\.[^\\.]+$" string) (substring string 0 (match-beginning 0)) (char-to-string (aref string 0))) table (elmo-folder-list-subfolders (wl-folder-get-elmo-folder pattern)))) (setq pattern (concat "^" (regexp-quote pattern))) (unless (intern-soft pattern wl-fldmgr-add-completion-hashtb) (set (intern pattern wl-fldmgr-add-completion-hashtb) table)) table)) (defun wl-fldmgr-add-completion-subr (string predicate flag) (let ((table (if (string= string "") (mapcar (lambda (spec) (list (char-to-string (car spec)))) elmo-folder-type-alist) (when (assq (aref string 0) elmo-folder-type-alist) (delq nil (mapcar (function list) (condition-case nil (wl-fldmgr-add-completion-all-completions string) (error nil)))))))) (cond ((null flag) (try-completion string table predicate)) ((eq flag 'lambda) (eq t (try-completion string table predicate))) (t (all-completions string table predicate))))) (defun wl-fldmgr-add (&optional name) (interactive) (save-excursion (beginning-of-line) (let ((ret-val nil) (inhibit-read-only t) (wl-folder-complete-folder-candidate (if wl-fldmgr-add-complete-with-current-folder-list (function wl-fldmgr-add-completion-subr))) tmp indent path diffs) (if (bobp) (message "Can't insert in the out of desktop group") (setq tmp (wl-fldmgr-get-path-from-buffer t)) (setq path (car tmp)) (setq indent (wl-fldmgr-make-indent (nth 1 tmp))) (or name (setq name (wl-fldmgr-read-string (wl-summary-read-folder wl-default-folder "to add")))) ;; maybe add elmo-plugged-alist. (elmo-folder-set-plugged (wl-folder-get-elmo-folder (if (listp name) (car name) name)) wl-plugged t) (when (setq diffs (wl-add-entity path (list name) wl-folder-entity (nth 3 tmp) t)) (wl-folder-insert-entity indent name) (wl-fldmgr-update-group path diffs) (setq wl-fldmgr-modified t) (set-buffer-modified-p nil) (setq ret-val t))) ret-val))) (defun wl-fldmgr-delete () (interactive) (save-excursion (beginning-of-line) (if (wl-folder-buffer-group-p) (error "Can't delete group folder")) (let* ((inhibit-read-only t) (tmp (wl-fldmgr-get-path-from-buffer)) (entity (substring-no-properties (nth 4 tmp))) (folder (wl-folder-get-elmo-folder entity))) (when (elmo-folder-delete folder) (wl-folder-clear-entity-info entity) (wl-fldmgr-cut tmp nil t) (wl-fldmgr-save-access-list))))) (defun wl-fldmgr-rename () (interactive) (save-excursion (beginning-of-line) (if (bobp) (message "Can't rename desktop group") (cond ((and (wl-folder-buffer-group-p) (looking-at wl-folder-group-regexp)) ;; group (let* ((indent (match-string-no-properties 1)) (old-group (wl-folder-get-entity-from-buffer)) (group-entity (wl-folder-search-group-entity-by-name old-group wl-folder-entity)) group) (if (eq (nth 1 group-entity) 'access) (message "%s: can't rename access group folder" old-group) (setq group (wl-fldmgr-read-string (read-from-minibuffer "Rename: " old-group))) (if (string-match "/$" group) (message "Remove tail slash.") (cond ((or (string= group "") (string= old-group group)) nil) (t (if (elmo-string-assoc group wl-folder-group-alist) (message "%s: group already exists" group) (let ((inhibit-read-only t) (id (wl-fldmgr-get-entity-id (car group-entity)))) (wl-fldmgr-assign-id group id) (setcar group-entity group) (setcar (elmo-string-assoc old-group wl-folder-group-alist) group) ;;; (setcdr (assq id wl-folder-entity-id-name-alist) group) (wl-folder-set-id-name id group) (wl-fldmgr-delete-line) (wl-folder-insert-entity indent group-entity t) (setq wl-fldmgr-modified t) (set-buffer-modified-p nil))))))))) (t ;; folder (let* ((tmp (wl-fldmgr-get-path-from-buffer)) (old-folder (nth 4 tmp)) new-folder) (unless old-folder (error "No folder")) (setq new-folder (wl-fldmgr-read-string (wl-summary-read-folder old-folder "to rename" t t old-folder))) (if (or (wl-folder-entity-exists-p new-folder) (file-exists-p (elmo-folder-msgdb-path (wl-folder-get-elmo-folder new-folder)))) (error "Already exists folder: %s" new-folder)) (if (and (eq (cdr (nth 2 tmp)) 'access) (null wl-fldmgr-allow-rename-access-group) (null (string-match (format "^%s" (regexp-quote (car (nth 2 tmp)))) new-folder))) (error "Can't rename access folder")) (elmo-folder-rename (wl-folder-get-elmo-folder old-folder) new-folder) (wl-folder-set-entity-info new-folder (wl-folder-get-entity-info old-folder)) (wl-folder-clear-entity-info old-folder) (setq wl-folder-info-alist-modified t) (if (eq (cdr (nth 2 tmp)) 'access) ;; force update access group (progn (wl-folder-open-close) (wl-folder-jump-to-current-entity t) (message "%s is renamed to %s" old-folder new-folder) (sit-for 1)) ;; update folder list (when (wl-fldmgr-cut tmp nil t) (wl-fldmgr-add new-folder))))))))) (defun wl-fldmgr-make-access-group () (interactive) (wl-fldmgr-make-group nil t)) (defun wl-fldmgr-make-group (&optional group-name access) (interactive) (save-excursion (beginning-of-line) (if (bobp) (message "Can't insert in the out of desktop group") (let ((inhibit-read-only t) (type 'group) group tmp indent path new prev-id flist diffs) (setq tmp (wl-fldmgr-get-path-from-buffer t)) (setq path (car tmp)) (setq indent (wl-fldmgr-make-indent (nth 1 tmp))) (setq prev-id (nth 3 tmp)) (if (eq (cdr (nth 2 tmp)) 'access) (message "Can't insert access group") (setq group (or group-name (wl-fldmgr-read-string (read-from-minibuffer (if access "Access Type Group: " "Group: "))))) ;; To check the folder name is correct. (if access (elmo-make-folder group)) (when (or access (string-match "[\t ]*/$" group)) (setq group (if access group (substring group 0 (match-beginning 0)))) (setq type 'access) (setq flist (wl-create-access-folder-entity group))) (if (string= group "") nil (if (elmo-string-assoc group wl-folder-group-alist) (message "%s: group already exists" group) (setq new (append (list group type) flist)) (when (setq diffs (wl-add-entity path (list new) wl-folder-entity prev-id)) (wl-folder-insert-entity indent new) (wl-fldmgr-update-group path diffs) (setq wl-fldmgr-modified t) (set-buffer-modified-p nil))))))))) (defun wl-fldmgr-make-multi () (interactive) (if (not wl-fldmgr-cut-entity-list) (message "No cut buffer") (let ((cut-entity wl-fldmgr-cut-entity-list) (new-entity "") (first t) status) (setq status (catch 'done (while cut-entity (cond ((numberp (car cut-entity)) nil) ((consp (car cut-entity)) (message "Can't make multi included group folder") (throw 'done nil)) (t (let ((folder (wl-folder-get-elmo-folder (car cut-entity))) multi-fld) (if (eq (elmo-folder-type-internal folder) 'multi) (setq multi-fld (substring (car cut-entity) 1))) (setq new-entity (format "%s%s%s" (or multi-fld (car cut-entity)) (if first "" ",") new-entity)) (setq first nil)))) (setq cut-entity (cdr cut-entity))) (throw 'done t))) (when status (setq new-entity (concat "*" new-entity)) (wl-fldmgr-add new-entity))))) (defun wl-fldmgr-make-filter () (interactive) (save-excursion (beginning-of-line) (let ((tmp (wl-fldmgr-get-path-from-buffer)) entity) (if (eq (cdr (nth 2 tmp)) 'access) (message "Can't change access group") (if (wl-folder-buffer-group-p) (setq entity (concat "*" (mapconcat 'identity (wl-folder-get-entity-list (wl-folder-search-group-entity-by-name (nth 4 tmp) wl-folder-entity)) ","))) (setq entity (nth 4 tmp))) (unless entity (error "No folder")) (wl-fldmgr-add (concat "/" (wl-read-search-condition wl-fldmgr-make-filter-default) "/" entity)))))) (defun wl-fldmgr-sort (&optional arg) (interactive "P") (save-excursion (beginning-of-line) (let ((inhibit-read-only t) entity flist indent opened) (when (and (wl-folder-buffer-group-p) (looking-at wl-folder-group-regexp) (prog1 (y-or-n-p (format "Sort subfolders of %s? " (wl-folder-get-entity-from-buffer))) (message nil))) (setq indent (match-string-no-properties 1)) (setq opened (match-string-no-properties 2)) (setq entity (wl-folder-search-group-entity-by-name (wl-folder-get-entity-from-buffer) wl-folder-entity)) (message "Sorting...") (setq flist (sort (nth 2 entity) wl-fldmgr-sort-function)) (when arg (setq flist (nreverse flist))) (setcar (cddr entity) flist) (wl-fldmgr-add-modified-access-list (car entity)) (setq wl-fldmgr-modified t) (when (string= opened "-") (let (beg end) (setq beg (point)) (end-of-line) (save-match-data (setq end (progn (wl-folder-goto-bottom-of-current-folder indent) (beginning-of-line) (point)))) (delete-region beg end) (wl-folder-insert-entity indent entity))) (message "Sorting...done") (set-buffer-modified-p nil))))) (defun wl-fldmgr-sort-standard (x y) (cond ((and (consp x) (not (consp y))) wl-fldmgr-sort-group-first) ((and (not (consp x)) (consp y)) (not wl-fldmgr-sort-group-first)) ((and (consp x) (consp y)) (string-lessp (car x) (car y))) (t (string-lessp x y)))) (defun wl-fldmgr-subscribe-region () (interactive) (wl-fldmgr-unsubscribe-region -1)) (defun wl-fldmgr-unsubscribe-region (&optional arg) (interactive "P") (let* ((p1 (region-beginning)) (p2 (region-end)) (r1 (progn (goto-char p1) (beginning-of-line) (point))) (r2 (progn (goto-char p2) (beginning-of-line) (point))) (from (min r1 r2)) (to (max r1 r2)) (count 0)) (goto-char from) (while (< (point) to) (setq count (1+ count)) (forward-line)) (goto-char from) (message "Unsubscribe region...") (while (and (> count 0) (wl-fldmgr-unsubscribe (or arg 1) t)) (setq count (1- count))) (message "Unsubscribe region...done"))) (defun wl-fldmgr-subscribe () (interactive) (wl-fldmgr-unsubscribe -1)) (defun wl-fldmgr-unsubscribe (&optional arg force) (interactive "P") (let ((type (and arg (prefix-numeric-value arg))) execed is-group) (save-excursion (beginning-of-line) (let ((inhibit-read-only t) folder tmp indent beg) (cond ((looking-at (format "^[ ]*%s\\[[+-]\\]\\(.*\\)" wl-folder-unsubscribe-mark)) (if (and type (> type 0)) nil (setq folder (list (match-string-no-properties 1) 'access nil)) (if (elmo-string-assoc (car folder) wl-folder-group-alist) (message "%s: group already exists" (car folder)) (wl-fldmgr-delete-line) (when (wl-fldmgr-add folder) (wl-folder-maybe-load-folder-list folder) ;;; (wl-folder-search-group-entity-by-name (car folder) ;;; wl-folder-entity) (setq execed t))))) ((looking-at (format "^[ ]*%s\\(.*\\)" wl-folder-unsubscribe-mark)) (if (and type (> type 0)) nil (setq folder (match-string-no-properties 1)) (wl-fldmgr-delete-line) (when (wl-fldmgr-add folder) (setq execed t)))) (t (if (and type (< type 0)) nil (setq is-group (wl-folder-buffer-group-p)) (setq tmp (wl-fldmgr-get-path-from-buffer)) (setq indent (wl-fldmgr-make-indent (nth 1 tmp))) (if (eq (cdr (nth 2 tmp)) 'access) (when (wl-fldmgr-cut tmp) ;; don't leave cut-list (setq wl-fldmgr-cut-entity-list (cdr wl-fldmgr-cut-entity-list)) (setq beg (point)) (insert indent wl-folder-unsubscribe-mark (if is-group (concat "[+]" (nth 4 tmp)) (nth 4 tmp)) "\n") (save-excursion (forward-line -1) (wl-highlight-folder-current-line)) (remove-text-properties beg (point) '(wl-folder-entity-id)) (setq execed t)) (message "not an access group folder"))))) (set-buffer-modified-p nil))) (if (or force execed) (progn (forward-line) t)))) (defun wl-fldmgr-access-display-normal (&optional arg) (interactive "P") (wl-fldmgr-access-display-all (not arg))) (defun wl-fldmgr-access-display-all (&optional arg) (interactive "P") (let ((id (save-excursion (wl-folder-prev-entity-skip-invalid t) (wl-fldmgr-get-entity-id)))) (save-excursion (beginning-of-line) (let ((inhibit-read-only t) entity indent opened unsubscribes beg) (when (not (and (wl-folder-buffer-group-p) (looking-at wl-folder-group-regexp))) (wl-folder-goto-top-of-current-folder) (looking-at wl-folder-group-regexp)) (setq indent (match-string-no-properties 1)) (setq opened (match-string-no-properties 2)) (setq entity (wl-folder-search-group-entity-by-name (wl-folder-get-entity-from-buffer) wl-folder-entity)) (when (eq (nth 1 entity) 'access) (save-excursion (if (string= opened "-") (let (beg end) (setq beg (point)) (end-of-line) (save-match-data (setq end (progn (wl-folder-goto-bottom-of-current-folder indent) (beginning-of-line) (point)))) (delete-region beg end)) (wl-fldmgr-delete-line) (setcdr (assoc (car entity) wl-folder-group-alist) t));; set open (wl-folder-insert-entity indent entity)) (when (not arg) (setq unsubscribes (nth 3 entity)) (forward-line) (while unsubscribes (setq beg (point)) (insert indent " " wl-folder-unsubscribe-mark (if (consp (car unsubscribes)) (concat "[+]" (caar unsubscribes)) (car unsubscribes)) "\n") (remove-text-properties beg (point) '(wl-folder-entity-id)) (save-excursion (forward-line -1) (wl-highlight-folder-current-line)) (setq unsubscribes (cdr unsubscribes)))) (set-buffer-modified-p nil)))) (wl-folder-move-path id))) (defun wl-fldmgr-set-petname () (interactive) (save-excursion (beginning-of-line) (let* ((is-group (wl-folder-buffer-group-p)) (name (wl-folder-get-entity-from-buffer)) (searchname (wl-folder-get-petname name)) (pentry (elmo-string-assoc name wl-folder-petname-alist)) (old-petname (or (cdr pentry) "")) (change) petname) (unless name (error "No folder")) (if (and is-group (not (eq (nth 1 (wl-folder-search-group-entity-by-name name wl-folder-entity)) 'access))) (message "Can't set petname. please rename.") (setq petname (wl-fldmgr-read-string (read-from-minibuffer "Petname: " old-petname))) (cond ((string= petname "") (when pentry (setq wl-folder-petname-alist (delete pentry wl-folder-petname-alist)) (setq change t))) (t (if (string= petname old-petname) nil (if (or (rassoc petname wl-folder-petname-alist) (and is-group (elmo-string-assoc petname wl-folder-group-alist))) (message "%s: already exists" petname) (wl-folder-append-petname name petname) (setq change t))))) (when change (let ((inhibit-read-only t) indent) (goto-char (point-min)) (if is-group (progn (if (string= old-petname "") (setq old-petname name)) (while (wl-folder-buffer-search-group old-petname) (beginning-of-line) (and (looking-at "^\\([ ]*\\)") (setq indent (match-string-no-properties 1))) (wl-fldmgr-delete-line) (wl-folder-insert-entity indent (wl-folder-search-group-entity-by-name name wl-folder-entity) t))) (while (wl-folder-buffer-search-entity name searchname) (save-excursion (beginning-of-line) (and (looking-at "^\\([ ]*\\)") (setq indent (match-string-no-properties 1))) (wl-fldmgr-delete-line)) (wl-folder-insert-entity indent name))) (setq wl-fldmgr-modified t) (set-buffer-modified-p nil))))))) ;;; Function for save folders ;; (defun wl-fldmgr-insert-folders-buffer (indent entities &optional pet-entities) (let ((flist entities) name petname) (while flist (setq name (car flist)) (cond ((stringp name) (if (setq petname (cdr (elmo-string-assoc name wl-folder-petname-alist))) (wl-append pet-entities (list name))) (insert indent name (if petname (concat "\t\"" petname "\"") "") "\n")) ((consp name) (let ((group (car name)) (type (nth 1 name))) (cond ((eq type 'group) (insert indent group "{\n") (setq pet-entities (wl-fldmgr-insert-folders-buffer (concat indent wl-fldmgr-folders-indent) (nth 2 name) pet-entities)) (insert indent "}\n")) ((eq type 'access) (insert indent group "/\n")))))) (setq flist (cdr flist)))) pet-entities) (defun wl-fldmgr-insert-petname-buffer (pet-entities) (let ((alist wl-folder-petname-alist)) (while alist (if (elmo-string-member (caar alist) pet-entities) nil (insert "=\t" (caar alist) "\t\"" (cdar alist) "\"\n")) (setq alist (cdr alist))))) (defun wl-fldmgr-delete-disused-petname () (let ((alist wl-folder-petname-alist)) (while alist (unless (wl-folder-search-entity-by-name (caar alist) wl-folder-entity) (setq wl-folder-petname-alist (delete (car alist) wl-folder-petname-alist))) (setq alist (cdr alist))))) (defun wl-fldmgr-save-folders () (interactive) (let ((tmp-buf (get-buffer-create " *wl-fldmgr-tmp*")) save-petname-entities) (message "Saving folders...") (set-buffer tmp-buf) (erase-buffer) (insert wl-fldmgr-folders-header) (wl-fldmgr-delete-disused-petname) (setq save-petname-entities (wl-fldmgr-insert-folders-buffer "" (nth 2 wl-folder-entity))) (insert "\n# petname definition (access group, folder in access group)\n") (wl-fldmgr-insert-petname-buffer save-petname-entities) (insert "\n# end of file.\n") (if (and wl-fldmgr-make-backup (file-exists-p wl-folders-file)) (rename-file wl-folders-file (concat wl-folders-file ".bak") t)) (write-region (point-min) (point-max) wl-folders-file nil 'no-msg) (set-file-modes wl-folders-file (+ (* 64 6) (* 8 0) 0)) ; chmod 0600 (kill-buffer tmp-buf) (wl-fldmgr-save-access-list) (setq wl-fldmgr-modified nil) (message "Saving folders...done"))) (defun wl-fldmgr-save-access-list () (let ((access-list wl-fldmgr-modified-access-list) entity) (while access-list (setq entity (wl-folder-search-group-entity-by-name (car access-list) wl-folder-entity)) (elmo-msgdb-flist-save (car access-list) (list (wl-folder-make-save-access-list (nth 2 entity)) (wl-folder-make-save-access-list (nth 3 entity)))) (setq access-list (cdr access-list))) (setq wl-fldmgr-modified-access-list nil))) (require 'product) (product-provide (provide 'wl-fldmgr) (require 'wl-version)) ;;; wl-fldmgr.el ends here wanderlust-wanderlust-769699d/wl/wl-folder.el000066400000000000000000003242011406661363500212460ustar00rootroot00000000000000;;; wl-folder.el --- Folder mode for Wanderlust. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Copyright (C) 1998,1999,2000 Masahiro MURATA ;; Author: Yuuichi Teranishi ;; Masahiro MURATA ;; Keywords: mail, net news ;; This file is part of Wanderlust (Yet Another Message Interface on Emacsen). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'elmo-vars) (require 'elmo-util) (require 'elmo) (require 'elmo-nntp) (require 'wl-vars) (require 'easymenu nil t) ; needed here. (require 'wl-util) (require 'wl-e21) (require 'wl-summary) (require 'cl-lib) (provide 'wl-folder) (defcustom wl-folder-init-hook nil "A hook called after folder initialization is finished." :type 'hook :group 'wl) (defvar wl-folder-buffer-name "Folder") (defvar wl-folder-entity nil) ; desktop entity. (defvar wl-folder-group-alist nil) ; opened or closed (defvar wl-folder-entity-id nil) ; id (defvar wl-folder-entity-hashtb nil) (defvar wl-folder-entity-id-name-hashtb nil) (defvar wl-folder-elmo-folder-hashtb nil) ; name => elmo folder structure (defvar wl-folder-newsgroups-hashtb nil) (defvar wl-folder-info-alist-modified nil) (defvar wl-folder-mode-map nil) (defvar wl-folder-mode-menu nil) (defvar wl-folder-buffer-disp-summary nil) (defvar wl-folder-buffer-cur-entity-id nil) (defvar wl-folder-buffer-last-visited-entity-id nil) (defvar wl-folder-buffer-cur-path nil) (defvar wl-folder-buffer-cur-point nil) (make-variable-buffer-local 'wl-folder-buffer-disp-summary) (make-variable-buffer-local 'wl-folder-buffer-cur-entity-id) (make-variable-buffer-local 'wl-folder-buffer-last-visited-entity-id) (make-variable-buffer-local 'wl-folder-buffer-cur-path) (make-variable-buffer-local 'wl-folder-buffer-cur-point) (defconst wl-folder-entity-regexp "^\\([ ]*\\)\\(\\[[\\+-]\\]\\)?\\([^\\[].+\\):[-*0-9]+/[-*0-9]+/[-*0-9]+") (defconst wl-folder-group-regexp "^\\([ ]*\\)\\[\\([\\+-]\\)\\]\\(.+\\):[0-9-]+/[0-9-]+/[0-9-]+\n") ;; 1:indent 2:opened 3:group-name (defconst wl-folder-unsync-regexp ":[^0\\*][0-9]*/[0-9\\*-]+/[0-9\\*-]+$") (defvar wl-folder-mode-menu-spec '("Folder" ["Enter Current Folder" wl-folder-jump-to-current-entity t] ["Prev Folder" wl-folder-prev-entity t] ["Next Folder" wl-folder-next-entity t] ["Check Current Folder" wl-folder-check-current-entity t] ["Sync Current Folder" wl-folder-sync-current-entity t] ;;; ["Drop Current Folder" wl-folder-drop-unsync-current-entity t] ["Prefetch Current Folder" wl-folder-prefetch-current-entity t] "----" ["Mark as Read all Current Folder" wl-folder-mark-as-read-all-current-entity t] ["Expire Current Folder" wl-folder-expire-current-entity t] "----" ["Go to Draft Folder" wl-folder-goto-draft-folder t] ["Quick search" wl-quicksearch-goto-search-folder-wrapper t] ["Empty trash" wl-folder-empty-trash t] ["Flush queue" wl-folder-flush-queue t] "----" ["Open All" wl-folder-open-all t] ["Open All Unread folder" wl-folder-open-all-unread-folder t] ["Close All" wl-folder-close-all t] ("Folder Manager" ["Add folder" wl-fldmgr-add t] ["Add group" wl-fldmgr-make-group t] ["Copy" wl-fldmgr-copy t] ["Cut" wl-fldmgr-cut t] ["Paste" wl-fldmgr-yank t] ["Set petname" wl-fldmgr-set-petname t] ["Rename" wl-fldmgr-rename t] ["Save" wl-fldmgr-save-folders t] "----" ["Unsubscribe" wl-fldmgr-unsubscribe t] ["Display all" wl-fldmgr-access-display-all t]) "----" ["Write a message" wl-draft t] ["Write for current folder" wl-folder-write-current-folder t] "----" ["Wanderlust NEWS" wl-news t] "----" ["Toggle Plug Status" wl-toggle-plugged t] ["Change Plug Status" wl-plugged-change t] "----" ["Save Current Status" wl-save t] ["Update Status" wl-status-update t] ["Exit" wl-exit t])) (defun wl-folder-setup-mouse () (define-key wl-folder-mode-map [mouse-2] 'wl-folder-click) (define-key wl-folder-mode-map [mouse-4] 'wl-folder-prev-entity) (define-key wl-folder-mode-map [mouse-5] 'wl-folder-next-entity) (define-key wl-folder-mode-map [S-mouse-4] 'wl-folder-prev-unread) (define-key wl-folder-mode-map [S-mouse-5] 'wl-folder-next-unread)) (if wl-folder-mode-map nil (setq wl-folder-mode-map (make-sparse-keymap)) (define-key wl-folder-mode-map " " 'wl-folder-jump-to-current-entity) ;;; (define-key wl-folder-mode-map "\M- " 'wl-folder-open-close) (define-key wl-folder-mode-map "/" 'wl-folder-open-close) (define-key wl-folder-mode-map "\C-m" 'wl-folder-jump-to-current-entity) (define-key wl-folder-mode-map [(shift return)] 'wl-folder-jump-to-current-entity-with-arg) (define-key wl-folder-mode-map "\M-\C-m" 'wl-folder-update-recursive-current-entity) (define-key wl-folder-mode-map "rc" 'wl-folder-mark-as-read-all-region) (define-key wl-folder-mode-map "c" 'wl-folder-mark-as-read-all-current-entity) (define-key wl-folder-mode-map "g" 'wl-folder-goto-folder) (define-key wl-folder-mode-map "G" 'wl-folder-goto-folder-sticky) (define-key wl-folder-mode-map "j" 'wl-folder-jump-to-current-entity) (define-key wl-folder-mode-map "\C-i" 'wl-folder-revisit-last-visited-folder) (define-key wl-folder-mode-map "w" 'wl-draft) (define-key wl-folder-mode-map "W" 'wl-folder-write-current-folder) (define-key wl-folder-mode-map "\C-c\C-o" 'wl-jump-to-draft-buffer) (define-key wl-folder-mode-map "\C-c\C-a" 'wl-addrmgr) (define-key wl-folder-mode-map "\C-c\C-p" 'wl-folder-jump-to-previous-summary) (define-key wl-folder-mode-map "\C-c\C-n" 'wl-folder-jump-to-next-summary) (define-key wl-folder-mode-map "rS" 'wl-folder-sync-region) (define-key wl-folder-mode-map "S" 'wl-folder-sync-current-entity) (define-key wl-folder-mode-map "rs" 'wl-folder-check-region) (define-key wl-folder-mode-map "s" 'wl-folder-check-current-entity) (define-key wl-folder-mode-map "I" 'wl-folder-prefetch-current-entity) ;;; (define-key wl-folder-mode-map "D" 'wl-folder-drop-unsync-current-entity) (define-key wl-folder-mode-map "p" 'wl-folder-prev-entity) (define-key wl-folder-mode-map "n" 'wl-folder-next-entity) (define-key wl-folder-mode-map "v" 'wl-folder-toggle-disp-summary) (define-key wl-folder-mode-map "P" 'wl-folder-prev-unread) (define-key wl-folder-mode-map "N" 'wl-folder-next-unread) (define-key wl-folder-mode-map "J" 'wl-folder-jump-folder) (define-key wl-folder-mode-map "f" 'wl-folder-goto-first-unread-folder) (define-key wl-folder-mode-map "o" 'wl-folder-open-all-unread-folder) (define-key wl-folder-mode-map "[" 'wl-folder-open-all) (define-key wl-folder-mode-map "]" 'wl-folder-close-all) (define-key wl-folder-mode-map "e" 'wl-folder-expire-current-entity) (define-key wl-folder-mode-map "E" 'wl-folder-empty-trash) (define-key wl-folder-mode-map "F" 'wl-folder-flush-queue) (define-key wl-folder-mode-map "V" 'wl-folder-virtual) (define-key wl-folder-mode-map "?" 'wl-folder-pick) (define-key wl-folder-mode-map "q" 'wl-exit) (define-key wl-folder-mode-map "z" 'wl-folder-suspend) (define-key wl-folder-mode-map "x" 'wl-execute-temp-marks) (define-key wl-folder-mode-map "\M-t" 'wl-toggle-plugged) (define-key wl-folder-mode-map "\C-t" 'wl-plugged-change) (define-key wl-folder-mode-map "<" 'beginning-of-buffer) (define-key wl-folder-mode-map ">" 'end-of-buffer) ;; wl-fldmgr (define-key wl-folder-mode-map "m" 'wl-fldmgr-mode-map) (define-key wl-folder-mode-map "*" 'wl-fldmgr-make-multi) (define-key wl-folder-mode-map "+" 'wl-fldmgr-make-group) (define-key wl-folder-mode-map "|" 'wl-fldmgr-make-filter) (define-key wl-folder-mode-map "\M-c" 'wl-fldmgr-copy) (define-key wl-folder-mode-map "\M-w" 'wl-fldmgr-copy-region) (define-key wl-folder-mode-map "\C-k" 'wl-fldmgr-cut) (define-key wl-folder-mode-map "\C-w" 'wl-fldmgr-cut-region) (define-key wl-folder-mode-map "\C-y" 'wl-fldmgr-yank) (define-key wl-folder-mode-map "R" 'wl-fldmgr-rename) (define-key wl-folder-mode-map "u" 'wl-fldmgr-unsubscribe) (define-key wl-folder-mode-map "ru" 'wl-fldmgr-unsubscribe-region) (define-key wl-folder-mode-map "U" 'wl-fldmgr-unsubscribe-region) (define-key wl-folder-mode-map "l" 'wl-fldmgr-access-display-normal) (define-key wl-folder-mode-map "L" 'wl-fldmgr-access-display-all) (define-key wl-folder-mode-map "Z" 'wl-status-update) (define-key wl-folder-mode-map "\C-x\C-s" 'wl-save) (define-key wl-folder-mode-map "\C-xk" 'wl-folder-mimic-kill-buffer) (define-key wl-folder-mode-map "\M-\C-a" 'wl-folder-goto-top-of-current-folder) (define-key wl-folder-mode-map "\M-\C-e" 'wl-folder-goto-bottom-of-current-folder) ;; quicksearch (define-key wl-folder-mode-map "'" 'wl-quicksearch-goto-search-folder-wrapper) (wl-folder-setup-mouse) (easy-menu-define wl-folder-mode-menu wl-folder-mode-map "Menu used in Folder mode." wl-folder-mode-menu-spec)) (defun wl-folder-unread-regex (group) (concat "^[ ]*.+:[0-9\\*-]+/[^0\\*][0-9]*/[0-9\\*-]+$" (if group "\\|^[ ]*\\[[+-]\\]" ""))) (defun wl-folder-buffer-group-p () (get-text-property (point) 'wl-folder-is-group)) (defun wl-folder-buffer-search-group (group) (let ((prev-point (point)) (group-regexp (concat "^\\([ \t]*\\)\\[[\\+-]\\]" (regexp-quote group) ":[-0-9-]+/[0-9-]+/[0-9-]+"))) (or (catch 'found (while (re-search-forward group-regexp nil t) (if (wl-folder-buffer-group-p) (throw 'found (point))))) (progn ; not found (goto-char prev-point) nil)))) (defun wl-folder-buffer-search-entity (folder &optional searchname) (let ((regexp (concat "^[ \t]*" (regexp-quote (or searchname (wl-folder-get-petname folder))) ":[-0-9\\*-]+/[0-9\\*-]+/[0-9\\*-]+")) case-fold-search result) (catch 'found (while (setq result (re-search-forward regexp nil t)) (when (string= (wl-folder-get-entity-from-buffer) folder) (throw 'found result)))))) (defsubst wl-folder-get-folder-name-by-id (entity-id &optional hashtb) (and (numberp entity-id) (elmo-get-hash-val (format "#%d" entity-id) (or hashtb wl-folder-entity-id-name-hashtb)))) (defsubst wl-folder-set-id-name (entity-id entity &optional hashtb) (and (numberp entity-id) (elmo-set-hash-val (format "#%d" entity-id) entity (or hashtb wl-folder-entity-id-name-hashtb)))) (defmacro wl-folder-get-entity-id (entity) `(get-text-property 0 'wl-folder-entity-id ,entity)) (defun wl-folder-get-entity-from-buffer (&optional getid) (let ((id (get-text-property (point) 'wl-folder-entity-id))) (if getid id (wl-folder-get-folder-name-by-id id)))) (defmacro wl-folder-entity-exists-p (entity &optional hashtb) `(let ((sym (intern-soft ,entity (or ,hashtb wl-folder-entity-hashtb)))) (and sym (boundp sym)))) (defmacro wl-folder-clear-entity-info (entity &optional hashtb) `(elmo-clear-hash-val ,entity (or ,hashtb wl-folder-entity-hashtb))) (defmacro wl-folder-get-entity-info (entity &optional hashtb) `(elmo-get-hash-val ,entity (or ,hashtb wl-folder-entity-hashtb))) (defsubst wl-folder-set-entity-info (entity value &optional hashtb) (let* ((hashtb (or hashtb wl-folder-entity-hashtb)) (info (wl-folder-get-entity-info entity hashtb))) (elmo-set-hash-val (substring-no-properties entity) (if (< (length value) 4) (append value (list (nth 3 info))) value) hashtb))) (defun wl-folder-persistent-p (folder) (or (and (wl-folder-search-entity-by-name folder wl-folder-entity 'folder) t) ; on Folder mode. (catch 'found (let ((li wl-save-folder-list)) (while li (if (string-match (car li) folder) (throw 'found t)) (setq li (cdr li))))) (not (catch 'found (let ((li wl-no-save-folder-list)) (while li (if (string-match (car li) folder) (throw 'found t)) (setq li (cdr li)))))))) ;;; ELMO folder structure with cache. (defmacro wl-folder-elmo-folder-cache-get (name &optional hashtb) "Returns a elmo folder structure associated with NAME from HASHTB. Default HASHTB is `wl-folder-elmo-folder-hashtb'." `(elmo-get-hash-val ,name (or ,hashtb wl-folder-elmo-folder-hashtb))) (defmacro wl-folder-elmo-folder-cache-put (name folder &optional hashtb) "Get folder elmo folder structure on HASHTB for folder with NAME. Default HASHTB is `wl-folder-elmo-folder-hashtb'." `(elmo-set-hash-val ,name ,folder (or ,hashtb wl-folder-elmo-folder-hashtb))) (require 'wl-draft) (defun wl-draft-get-folder () "A function to obtain `opened' draft elmo folder structure." (if (and wl-draft-folder-internal (string= (elmo-folder-name-internal wl-draft-folder-internal) wl-draft-folder)) wl-draft-folder-internal (setq wl-draft-folder-internal (wl-folder-make-elmo-folder wl-draft-folder)) (wl-folder-confirm-existence wl-draft-folder-internal) (elmo-folder-open wl-draft-folder-internal 'load-msgdb) wl-draft-folder-internal)) (defun wl-folder-mime-charset (folder-name) (or (wl-get-assoc-list-value wl-folder-mime-charset-alist folder-name) wl-mime-charset)) (defun wl-folder-make-elmo-folder (folder-name) (elmo-make-folder folder-name nil (wl-folder-mime-charset folder-name))) (defsubst wl-folder-get-elmo-folder (entity &optional no-cache) "Get elmo folder structure from ENTITY." (let ((name (substring-no-properties entity))) (if no-cache (wl-folder-make-elmo-folder name) (if (string= name wl-draft-folder) (wl-draft-get-folder) (or (wl-folder-elmo-folder-cache-get name) (let ((folder (wl-folder-make-elmo-folder name))) (wl-folder-elmo-folder-cache-put name folder) folder)))))) (defsubst wl-folder-put-folder-property (beg end id is-group &optional object) (put-text-property beg end 'wl-folder-entity-id id object) (put-text-property beg end 'wl-folder-is-group is-group object)) (defun wl-folder-prev-entity () (interactive) (forward-line -1)) (defun wl-folder-next-entity () (interactive) (forward-line)) (defun wl-folder-prev-entity-skip-invalid (&optional hereto) "Move to previous entity. skip unsubscribed or removed entity." (interactive) (if hereto (end-of-line)) (if (re-search-backward wl-folder-entity-regexp nil t) (beginning-of-line) (goto-char (point-min)))) (defun wl-folder-next-entity-skip-invalid (&optional hereto) "Move to next entity. skip unsubscribed or removed entity." (interactive) (beginning-of-line) (if (not hereto) (forward-line)) (if (re-search-forward wl-folder-entity-regexp nil t) (beginning-of-line) (goto-char (point-max)))) (defun wl-folder-search-group-entity-by-name (name entity) (wl-folder-search-entity-by-name name entity 'group)) (defun wl-folder-search-entity-by-name (name entity &optional type) (let ((entities (list entity)) entity-stack) (catch 'done (while entities (setq entity (wl-pop entities)) (cond ((consp entity) (if (and (not (eq type 'folder)) (string= name (car entity))) (throw 'done entity)) (and entities (wl-push entities entity-stack)) (setq entities (nth 2 entity))) ((and (not (eq type 'group)) (stringp entity)) (if (string= name entity) (throw 'done entity)))) (unless entities (setq entities (wl-pop entity-stack))))))) (defun wl-folder-search-entity-list-by-name (name entity &optional get-id) (let ((entities (list entity)) entity-stack ret-val) (while entities (setq entity (wl-pop entities)) (cond ((consp entity) (and entities (wl-push entities entity-stack)) (setq entities (nth 2 entity))) ((stringp entity) (if (string= name entity) (wl-append ret-val (if get-id (list (wl-folder-get-entity-id entity)) (list entity)))))) (unless entities (setq entities (wl-pop entity-stack)))) ret-val)) (defun wl-folder-get-prev-folder (id &optional unread) (let ((name (if (stringp id) id (wl-folder-get-folder-name-by-id id))) entity entity-stack last-entity finfo (entities (list wl-folder-entity))) (catch 'done (while entities (setq entity (wl-pop entities)) (cond ((consp entity) ;;; (if (and (string= name (car entity)) ;;; (eq id (wl-folder-get-entity-id (car entity)))) ;;; (throw 'done last-entity)) (and entities (wl-push entities entity-stack)) (setq entities (nth 2 entity))) ((stringp entity) (if (and (string= name entity) (eq id (wl-folder-get-entity-id entity))) (throw 'done last-entity)) (if (or (not unread) (and (setq finfo (wl-folder-get-entity-info entity)) (and (nth 0 finfo)(nth 1 finfo)) (> (+ (nth 0 finfo)(nth 1 finfo)) 0))) (setq last-entity entity)))) (unless entities (setq entities (wl-pop entity-stack))))))) (defun wl-folder-get-next-folder (id &optional unread) (let ((name (if (stringp id) id (wl-folder-get-folder-name-by-id id))) entity entity-stack found finfo (entities (list wl-folder-entity))) (catch 'done (while entities (setq entity (wl-pop entities)) (cond ((consp entity) ;;; (if (and (string= name (car entity)) ;;; (eq id (wl-folder-get-entity-id (car entity)))) ;;; (setq found t)) (and entities (wl-push entities entity-stack)) (setq entities (nth 2 entity))) ((stringp entity) (if found (when (or (not unread) (and (setq finfo (wl-folder-get-entity-info entity)) (and (nth 0 finfo)(nth 1 finfo)) (> (+ (nth 0 finfo)(nth 1 finfo)) 0))) (throw 'done entity)) (if (and (string= name entity) (eq id (wl-folder-get-entity-id entity))) (setq found t))))) (unless entities (setq entities (wl-pop entity-stack))))))) (defun wl-folder-flush-queue () "Flush queue." (interactive) (let ((cur-buf (current-buffer)) (wl-auto-select-first nil) (wl-plugged t)) (if elmo-enable-disconnected-operation (elmo-dop-queue-flush)) (if (not (elmo-folder-list-messages (wl-folder-get-elmo-folder wl-queue-folder))) (message "No sending queue exists.") (if wl-stay-folder-window (wl-folder-select-buffer (wl-summary-get-buffer-create wl-queue-folder))) (wl-summary-goto-folder-subr wl-queue-folder 'force-update nil) (unwind-protect (wl-draft-queue-flush) (if (get-buffer-window cur-buf) (select-window (get-buffer-window cur-buf))) (set-buffer cur-buf) (if wl-stay-folder-window (wl-folder-toggle-disp-summary 'off wl-queue-folder) (switch-to-buffer cur-buf)))))) (defun wl-folder-set-persistent-mark (folder number flag) "Set a persistent mark which corresponds to the specified flag on message." (let ((buffer (wl-summary-get-buffer folder))) (if buffer (with-current-buffer buffer (wl-summary-set-persistent-mark flag number)) ;; Parent buffer does not exist. (let ((elmo-folder (wl-folder-get-elmo-folder folder))) (elmo-folder-open elmo-folder 'load-msgdb) (elmo-folder-set-flag elmo-folder (list wl-draft-parent-number) flag) (elmo-folder-close elmo-folder))))) (defun wl-folder-empty-trash () "Empty trash." (interactive) (let ((cur-buf (current-buffer)) (wl-auto-select-first nil) trash-buf emptied) (wl-summary-goto-folder-subr wl-trash-folder 'force-update) (setq trash-buf (wl-summary-get-buffer-create wl-trash-folder)) (if wl-stay-folder-window (wl-folder-select-buffer trash-buf) (switch-to-buffer trash-buf)) (unwind-protect (setq emptied (wl-summary-delete-all-msgs)) (when emptied (setq wl-thread-entities nil wl-thread-entity-list nil) (if wl-summary-cache-use (wl-summary-save-view-cache)) (elmo-folder-commit wl-summary-buffer-elmo-folder)) (if (get-buffer-window cur-buf) (select-window (get-buffer-window cur-buf))) (set-buffer cur-buf) (if emptied (wl-folder-set-folder-updated wl-trash-folder '(0 0 0))) (if wl-stay-folder-window (wl-folder-toggle-disp-summary 'off wl-trash-folder) (switch-to-buffer cur-buf)) (and trash-buf (kill-buffer trash-buf))))) (defun wl-folder-goto-top-of-current-folder (&optional arg) "Move backward to the top of the current folder group. Optional argument ARG is repeart count." (interactive "P") (if (re-search-backward "^ *\\[[\\+-]\\]" nil t (if arg (prefix-numeric-value arg))) (beginning-of-line) (goto-char (point-min)))) (defun wl-folder-goto-bottom-of-current-folder (indent) "Move forward to the bottom of the current folder group." (interactive (let ((indent (save-excursion (beginning-of-line) (if (looking-at "^ *") (buffer-substring (match-beginning 0)(1- (match-end 0))) "")))) (list indent))) (if (catch 'done (while (re-search-forward "^ *" nil t) (if (<= (length (match-string 0)) (length indent)) (throw 'done nil))) (throw 'done t)) (goto-char (point-max)))) (defun wl-folder-update-group (entity diffs &optional is-group) (save-excursion (let ((path (wl-folder-get-path wl-folder-entity (wl-folder-get-entity-id entity) entity))) (if (not is-group) ;; delete itself from path (setq path (delete (nth (- (length path) 1) path) path))) (goto-char (point-min)) (catch 'done (while path ;; goto the path line. (if (or (eq (car path) 0) ; update desktop (wl-folder-buffer-search-group (wl-folder-get-petname (if (stringp (car path)) (car path) (wl-folder-get-folder-name-by-id (car path)))))) ;; update it. (wl-folder-update-diff-line diffs) (throw 'done t)) (setq path (cdr path))))))) (require 'wl-fldmgr) (defun wl-folder-maybe-load-folder-list (entity) (when (null (cl-caddr entity)) (setcdr (cdr entity) (elmo-msgdb-flist-load (car entity))) (when (cddr entity) (let (diffs) (save-excursion (wl-folder-entity-assign-id entity wl-folder-entity-id-name-hashtb t) (setq diffs (wl-fldmgr-add-entity-hashtb (list entity))) (unless (equal diffs '(0 0 0)) (wl-folder-update-group (car entity) diffs t))))))) (defsubst wl-folder-force-fetch-p (entity) (cond ((consp wl-force-fetch-folders) (elmo-string-match-member entity wl-force-fetch-folders)) (t wl-force-fetch-folders))) (defun wl-folder-jump-to-current-entity-with-arg () (interactive) (wl-folder-jump-to-current-entity t)) (defun wl-folder-jump-to-current-entity (&optional arg) "Enter the current folder. If optional ARG exists, update folder list." (interactive "P") (let ((fld-name (wl-folder-get-entity-from-buffer)) entity beg end indent opened) (unless fld-name (error "No folder")) (beginning-of-line) (if (and (wl-folder-buffer-group-p) (looking-at wl-folder-group-regexp)) ;; folder group (save-excursion (setq indent (match-string-no-properties 1)) (setq opened (match-string-no-properties 2)) (if (string= opened "+") (progn (setq entity (wl-folder-search-group-entity-by-name fld-name wl-folder-entity)) (setq beg (point)) (if arg (wl-folder-update-recursive-current-entity entity) ;; insert as opened (setcdr (assoc (car entity) wl-folder-group-alist) t) (if (eq 'access (cadr entity)) (wl-folder-maybe-load-folder-list entity)) (if (or (wl-folder-force-fetch-p (car entity)) (and (eq 'access (cadr entity)) (null (cl-caddr entity)))) (wl-folder-update-newest indent entity) (wl-folder-insert-entity indent entity)) (wl-highlight-folder-path wl-folder-buffer-cur-path) (let ((buffer-read-only nil)) (delete-region (save-excursion (beginning-of-line) (point)) (save-excursion (end-of-line) (+ 1 (point))))))) (setq beg (point)) (end-of-line) (save-match-data (setq end (progn (wl-folder-goto-bottom-of-current-folder indent) (beginning-of-line) (point)))) (setq entity (wl-folder-search-group-entity-by-name fld-name wl-folder-entity)) (let ((buffer-read-only nil)) (delete-region beg end)) (setcdr (assoc (car entity) wl-folder-group-alist) nil) (wl-folder-insert-entity indent entity) ; insert entity (forward-line -1) (wl-highlight-folder-path wl-folder-buffer-cur-path) ;;; (wl-delete-all-overlays) ;;; (wl-highlight-folder-current-line) )) ;; ordinal folder (wl-folder-set-current-entity-id (get-text-property (point) 'wl-folder-entity-id)) (setq fld-name (wl-folder-get-folder-name-by-id wl-folder-buffer-cur-entity-id)) (let ((summary-buf (wl-summary-get-buffer-create fld-name arg))) (if (or wl-stay-folder-window wl-summary-use-frame) (wl-folder-select-buffer summary-buf) (if (and summary-buf (get-buffer-window summary-buf)) (delete-window))) (wl-summary-goto-folder-subr fld-name (wl-summary-get-sync-range (wl-folder-get-elmo-folder fld-name)) nil arg t)))) (set-buffer-modified-p nil)) (defun wl-folder-close-entity (entity) (let ((entities (list entity)) entity-stack) (while entities (setq entity (wl-pop entities)) (cond ((consp entity) (setcdr (assoc (car entity) wl-folder-group-alist) nil) (and entities (wl-push entities entity-stack)) (setq entities (nth 2 entity)))) (unless entities (setq entities (wl-pop entity-stack)))))) (defun wl-folder-update-recursive-current-entity (&optional entity) (interactive) (beginning-of-line) (when (and (wl-folder-buffer-group-p) (looking-at wl-folder-group-regexp)) (cond ((string= (match-string-no-properties 2) "+") (save-excursion (if entity () (setq entity (wl-folder-search-group-entity-by-name (wl-folder-get-entity-from-buffer) wl-folder-entity))) (let ((inhibit-read-only t) (entities (list entity)) entity-stack err indent) (while (and entities (not err)) (setq entity (wl-pop entities)) (cond ((consp entity) (wl-folder-close-entity entity) (setcdr (assoc (car entity) wl-folder-group-alist) t) (unless (wl-folder-buffer-search-group (wl-folder-get-petname (car entity))) (error "%s: not found group" (car entity))) (setq indent (match-string-no-properties 1)) (if (eq 'access (cadr entity)) (wl-folder-maybe-load-folder-list entity)) (beginning-of-line) (setq err nil) (save-excursion (condition-case errobj (wl-folder-update-newest indent entity) (quit (setq err t) (setcdr (assoc (car entity) wl-folder-group-alist) nil)) (error (elmo-display-error errobj t) (ding) (setq err t) (setcdr (assoc (car entity) wl-folder-group-alist) nil))) (if (not err) (delete-region (save-excursion (beginning-of-line) (point)) (save-excursion (end-of-line) (+ 1 (point)))))) ;; (and entities (wl-push entities entity-stack)) (setq entities (nth 2 entity)))) (unless entities (setq entities (wl-pop entity-stack))))) (set-buffer-modified-p nil))) (t (wl-folder-jump-to-current-entity))))) (defun wl-folder-no-auto-check-folder-p (folder) (if (stringp folder) (if (catch 'found (let ((li wl-auto-check-folder-list)) (while li (if (string-match (car li) folder) (throw 'found t)) (setq li (cdr li))))) nil (catch 'found (let ((li wl-auto-uncheck-folder-list)) (while li (if (string-match (car li) folder) (throw 'found t)) ; no check! (setq li (cdr li)))))))) (defsubst wl-folder-add-folder-info (pre-value value) (list (+ (or (nth 0 pre-value) 0) (or (nth 0 value) 0)) (+ (or (nth 1 pre-value) 0) (or (nth 1 value) 0)) (+ (or (nth 2 pre-value) 0) (or (nth 2 value) 0)))) (defun wl-folder-check-entity (entity &optional auto) "Check unsync message number." (let ((start-pos (point)) ret-val) (run-hook-with-args 'wl-folder-check-entity-pre-hook entity) (if (and (consp entity) ;; group entity wl-folder-check-async) ;; very fast (setq ret-val (wl-folder-check-entity-async entity auto)) (save-excursion (cond ((consp entity) (let ((flist (if auto (elmo-delete-if 'wl-folder-no-auto-check-folder-p (nth 2 entity)) (nth 2 entity))) (wl-folder-check-entity-pre-hook nil) (wl-folder-check-entity-hook nil)) (while flist (setq ret-val (wl-folder-add-folder-info ret-val (wl-folder-check-entity (car flist)))) (setq flist (cdr flist))) ;;; (wl-folder-buffer-search-entity (car entity)) ;;; (wl-folder-update-line ret-val) )) ((stringp entity) (message "Checking \"%s\"" entity) (setq ret-val (wl-folder-check-one-entity entity)) (goto-char start-pos) (sit-for 0)) (t (message "Uncheck(unplugged) \"%s\"" entity))))) (if ret-val (message "Checking \"%s\" is done" (if (consp entity) (car entity) entity))) (run-hook-with-args 'wl-folder-check-entity-hook entity) ret-val)) (defun wl-folder-check-one-entity (entity &optional biff) (let* ((folder (wl-folder-get-elmo-folder entity biff)) (nums (condition-case err (progn (if biff (elmo-folder-set-biff-internal folder t)) (if (elmo-string-match-member entity wl-strict-diff-folders) (elmo-strict-folder-diff folder) (elmo-folder-diff folder))) (elmo-open-error (signal (car err) (cdr err))) (error ;; maybe not exist folder. (if (not (elmo-folder-exists-p folder)) (wl-folder-create-subr folder) (signal (car err) (cdr err)))))) (new (elmo-diff-new nums)) (unread (elmo-diff-unread nums)) (all (elmo-diff-all nums))) (if (and (eq wl-folder-notify-deleted 'sync) (or (and new (> 0 new)) (and unread (> 0 unread)) (and all (> 0 all)))) (progn (wl-folder-sync-entity entity) (setq nums (elmo-folder-diff folder) new (elmo-diff-new nums) unread (elmo-diff-unread nums) all (elmo-diff-all nums))) (unless wl-folder-notify-deleted (setq new (and new (max 0 new)) unread (and unread (max 0 unread)) all (and all (max 0 all)))) (setq unread (if unread (- unread (or new 0)) (or (elmo-folder-get-info-unread folder) (cdr (assq 'unread (elmo-folder-count-flags folder))) 0))) (wl-folder-entity-hashtb-set wl-folder-entity-hashtb entity (list new unread all) (get-buffer wl-folder-buffer-name))) (setq wl-folder-info-alist-modified t) (sit-for 0) (list new unread all))) (defun wl-folder-check-entity-async (entity &optional auto) (let ((elmo-nntp-groups-async t) (elist (if auto (elmo-delete-if 'wl-folder-no-auto-check-folder-p (wl-folder-get-entity-list entity)) (wl-folder-get-entity-list entity))) (nntp-connection-keys nil) folder folder-list sync-folder-list async-folder-list server ret-val) (while elist (setq folder (wl-folder-get-elmo-folder (car elist))) (if (not (elmo-folder-plugged-p folder)) (message "Uncheck \"%s\"" (car elist)) (setq folder-list (elmo-folder-get-primitive-list folder)) (cond ((elmo-folder-contains-type folder 'nntp) (wl-append async-folder-list (list folder)) (while folder-list (when (eq (elmo-folder-type-internal (car folder-list)) 'nntp) (when (not (string= server (elmo-net-folder-server-internal (car folder-list)))) (setq server (elmo-net-folder-server-internal (car folder-list))) (message "Checking on \"%s\"" server)) (setq nntp-connection-keys (elmo-nntp-get-folders-info-prepare (car folder-list) nntp-connection-keys))) (setq folder-list (cdr folder-list)))) (t (wl-append sync-folder-list (list folder))))) (setq elist (cdr elist))) ;; check local entity at first (while (setq folder (pop sync-folder-list)) (if (not (elmo-folder-plugged-p folder)) (message "Uncheck \"%s\"" (elmo-folder-name-internal folder)) (message "Checking \"%s\"" (elmo-folder-name-internal folder)) (setq ret-val (wl-folder-add-folder-info ret-val (wl-folder-check-one-entity (elmo-folder-name-internal folder)))) ;;; (sit-for 0) )) ;; check network entity at last (when async-folder-list (elmo-nntp-get-folders-info nntp-connection-keys) (while (setq folder (pop async-folder-list)) (if (not (elmo-folder-plugged-p folder)) (message "Uncheck \"%s\"" (elmo-folder-name-internal folder)) (message "Checking \"%s\"" (elmo-folder-name-internal folder)) (setq ret-val (wl-folder-add-folder-info ret-val (wl-folder-check-one-entity (elmo-folder-name-internal folder)))) ;;; (sit-for 0) ))) ret-val)) ;; (defun wl-folder-resume-entity-hashtb-by-finfo (entity-hashtb info-alist) "Resume unread info for entity alist." (let (info) (while info-alist (setq info (nth 1 (car info-alist))) (wl-folder-set-entity-info (caar info-alist) (list (nth 2 info)(nth 3 info)(nth 1 info)) entity-hashtb) (setq info-alist (cdr info-alist))))) (defun wl-folder-move-path (path) (let ((fp (if (consp path) path ;; path is entity-id (wl-folder-get-path wl-folder-entity path)))) (goto-char (point-min)) (while (and fp (not (eobp))) (when (equal (car fp) (wl-folder-get-entity-from-buffer t)) (setq fp (cdr fp)) (setq wl-folder-buffer-cur-point (point))) (forward-line)) (and wl-folder-buffer-cur-point (goto-char wl-folder-buffer-cur-point)))) (defun wl-folder-set-current-entity-id (entity-id) (let* ((buf (get-buffer wl-folder-buffer-name)) (buf-win (get-buffer-window buf))) (if buf (save-current-buffer (save-selected-window (if buf-win (select-window buf-win) (set-buffer buf)) (when (and wl-folder-buffer-cur-entity-id (not (eq wl-folder-buffer-cur-entity-id entity-id))) (setq wl-folder-buffer-last-visited-entity-id wl-folder-buffer-cur-entity-id)) (setq wl-folder-buffer-cur-entity-id entity-id) (setq wl-folder-buffer-cur-path (wl-folder-get-path wl-folder-entity entity-id)) (wl-highlight-folder-path wl-folder-buffer-cur-path) (and wl-folder-move-cur-folder wl-folder-buffer-cur-point (goto-char wl-folder-buffer-cur-point))))))) (defun wl-folder-check-current-entity () "Check folder at position. If current line is group folder, check all sub entries." (interactive) (let* ((entity-name (wl-folder-get-entity-from-buffer)) (group (wl-folder-buffer-group-p)) (desktop (string= entity-name wl-folder-desktop-name))) (when entity-name (wl-folder-check-entity (if group (wl-folder-search-group-entity-by-name entity-name wl-folder-entity) entity-name) desktop)))) (defun wl-folder-sync-entity (entity &optional unread-only) "Synchronize the msgdb of ENTITY." (cond ((consp entity) (let ((flist (nth 2 entity))) (while flist (wl-folder-sync-entity (car flist) unread-only) (setq flist (cdr flist))))) ((stringp entity) (let* ((folder (wl-folder-get-elmo-folder entity)) (nums (wl-folder-get-entity-info entity)) (new (or (car nums) 0)) (unread (or (cadr nums) 0))) (when (or (not unread-only) (or (> new 0) (> unread 0))) (let ((summary (wl-summary-get-buffer entity)) (range (wl-summary-get-sync-range folder))) (if summary (save-selected-window (with-current-buffer summary (let ((win (get-buffer-window summary t))) (when win (select-window win))) (wl-summary-sync 'unset-cursor range) (wl-summary-save-status))) (elmo-folder-open folder 'load-msgdb) (unwind-protect (progn (elmo-folder-synchronize folder nil (eq range 'all)) (wl-folder-set-folder-updated entity (list 0 (or (cdr (assq 'unread (elmo-folder-count-flags folder))) 0) (elmo-folder-length folder)))) (elmo-folder-close folder))))))))) (defun wl-folder-sync-current-entity (&optional unread-only) "Synchronize the folder at position. If current line is group folder, check all subfolders." (interactive "P") (save-excursion (let ((entity-name (wl-folder-get-entity-from-buffer)) (group (wl-folder-buffer-group-p))) (when (and entity-name (y-or-n-p (format "Sync %s? " entity-name))) (wl-folder-sync-entity (if group (wl-folder-search-group-entity-by-name entity-name wl-folder-entity) entity-name) unread-only) (message "Syncing %s is done!" entity-name))))) (defun wl-folder-mark-as-read-all-entity (entity) "Mark as read all messages in the ENTITY." (cond ((consp entity) (let ((flist (nth 2 entity))) (while flist (wl-folder-mark-as-read-all-entity (car flist)) (setq flist (cdr flist))))) ((stringp entity) (let* ((folder (wl-folder-get-elmo-folder entity)) (nums (wl-folder-get-entity-info entity)) (new (or (car nums) 0)) (unread (or (cadr nums) 0))) (when (or (> new 0) (> unread 0)) (let ((summary (wl-summary-get-buffer entity)) (range (wl-summary-get-sync-range folder))) (if summary (save-selected-window (with-current-buffer summary (let ((win (get-buffer-window summary t))) (when win (select-window win))) (wl-summary-sync 'unset-cursor range) (wl-summary-mark-as-read-all) (wl-summary-save-status))) (elmo-folder-open folder 'load-msgdb) (unwind-protect (progn (elmo-folder-synchronize folder nil (eq range 'all)) (elmo-folder-unset-flag folder (elmo-folder-list-flagged folder 'unread 'in-msgdb) 'unread) (wl-folder-set-folder-updated entity (list 0 0 (elmo-folder-length folder)))) (elmo-folder-close folder))))))))) (defun wl-folder-mark-as-read-all-current-entity () "Mark as read all messages in the folder at position. If current line is group folder, all subfolders are marked." (interactive) (save-excursion (let ((entity-name (wl-folder-get-entity-from-buffer)) (group (wl-folder-buffer-group-p))) (when (and entity-name (y-or-n-p (format "Mark all messages in %s as read? " entity-name))) (wl-folder-mark-as-read-all-entity (if group (wl-folder-search-group-entity-by-name entity-name wl-folder-entity) entity-name)) (message "All messages in %s are marked!" entity-name))))) (defun wl-folder-check-region (beg end) (interactive "r") (goto-char beg) (beginning-of-line) (setq beg (point)) (goto-char end) (beginning-of-line) (setq end (point)) (goto-char beg) (let ((inhibit-read-only t) entity) (while (< (point) end) ;; normal folder entity (if (looking-at "^[\t ]*\\([^\\[]+\\):\\(.*\\)\n") (save-excursion (setq entity (wl-folder-get-entity-from-buffer)) (if (not (elmo-folder-plugged-p (wl-folder-get-elmo-folder entity))) (message "Uncheck %s" entity) (message "Checking %s" entity) (wl-folder-check-one-entity entity) (sit-for 0)))) (forward-line))) (message "")) (defun wl-folder-sync-region (beg end) (interactive "r") (goto-char beg) (beginning-of-line) (setq beg (point)) (goto-char end) (end-of-line) (setq end (point)) (goto-char beg) (while (< (point) end) ;; normal folder entity (if (looking-at "^[\t ]*\\([^\\[]+\\):\\(.*\\)\n") (save-excursion (let ((inhibit-read-only t) entity) (setq entity (wl-folder-get-entity-from-buffer)) (wl-folder-sync-entity entity) (message "Syncing %s is done!" entity) (sit-for 0)))) (forward-line)) (message "")) (defun wl-folder-mark-as-read-all-region (beg end) (interactive "r") (goto-char beg) (beginning-of-line) (setq beg (point)) (goto-char end) (end-of-line) (setq end (point)) (goto-char beg) (while (< (point) end) ;; normal folder entity (if (looking-at "^[\t ]*\\([^\\[]+\\):\\(.*\\)\n") (save-excursion (let ((inhibit-read-only t) entity) (setq entity (wl-folder-get-entity-from-buffer)) (wl-folder-mark-as-read-all-entity entity) (message "All messages in %s are marked!" entity) (sit-for 0)))) (forward-line)) (message "")) (defsubst wl-create-access-init-load-p (folder) (let ((no-load-regexp (when (and (not wl-folder-init-load-access-folders) wl-folder-init-no-load-access-folders) (mapconcat 'identity wl-folder-init-no-load-access-folders "\\|"))) (load-regexp (and wl-folder-init-load-access-folders (mapconcat 'identity wl-folder-init-load-access-folders "\\|")))) (cond (load-regexp (string-match load-regexp folder)) (t (not (and no-load-regexp (string-match no-load-regexp folder))))))) (defun wl-create-access-folder-entity (name) (let (flists flist) (when (wl-create-access-init-load-p name) (setq flists (elmo-msgdb-flist-load name)) ; load flist. (setq flist (car flists)) (while flist (when (consp (car flist)) (setcdr (cdar flist) (wl-create-access-folder-entity (caar flist)))) (setq flist (cdr flist))) flists))) (defun wl-create-folder-entity-from-buffer () "Create folder entity recursively." (cond ((looking-at "^[ \t]*$") ; blank line (goto-char (+ 1(match-end 0))) 'ignore) ((looking-at "^#.*$") ; comment (goto-char (+ 1 (match-end 0))) 'ignore) ((looking-at "^[\t ]*\\(.+\\)[\t ]*{[\t ]*$") ; group definition (let (name entity flist) (setq name (match-string-no-properties 1)) (goto-char (+ 1 (match-end 0))) (while (setq entity (wl-create-folder-entity-from-buffer)) (unless (eq entity 'ignore) (wl-append flist (list entity)))) (if (looking-at "^[\t ]*}[\t ]*$") ; end of group (progn (goto-char (+ 1 (match-end 0))) (if (elmo-string-assoc name wl-folder-petname-alist) (error "%s already defined as petname" name)) (list name 'group flist)) (error "Syntax error in folder definition")))) ((looking-at "^[\t ]*\\([^\t \n]+\\)[\t ]*/$") ; access it! (let (name) (setq name (match-string-no-properties 1)) (goto-char (+ 1 (match-end 0))) ;;; (condition-case () ;;; (unwind-protect ;;; (setq flist (elmo-list-folders name))) ;;; (error (message "Access to folder %s failed." name))) ;;; (setq flist (elmo-msgdb-flist-load name)) ; load flist. ;;; (setq unsublist (nth 1 flist)) ;;; (setq flist (car flist)) ;;; (list name 'access flist unsublist))) (append (list name 'access) (wl-create-access-folder-entity name)))) ;;; ((looking-at "^[\t ]*\\([^\t \n}]+\\)[\t ]*\\(\"[^\"]*\"\\)?[\t ]*$") ; normal folder entity ((looking-at "^[\t ]*=[ \t]+\\([^\n]+\\)$"); petname definition (goto-char (+ 1 (match-end 0))) (let ((rest (match-string-no-properties 1)) petname) (when (string-match "\\(\"[^\"]*\"\\)[\t ]*$" rest) (setq petname (elmo-delete-char ?\" (match-string 1 rest))) (setq rest (substring rest 0 (match-beginning 0)))) (when (string-match "^[\t ]*\\(.*[^\t ]+\\)[\t ]+$" rest) (wl-folder-append-petname (match-string 1 rest) petname)) 'ignore)) ((looking-at "^[ \t]*}[ \t]*$") ; end of group nil) ((looking-at "^.*$") ; normal folder entity (goto-char (+ 1 (match-end 0))) (let ((rest (match-string-no-properties 0)) realname petname) (if (string-match "\\(\"[^\"]*\"\\)[\t ]*$" rest) (progn (setq petname (elmo-delete-char ?\" (match-string 1 rest))) (setq rest (substring rest 0 (match-beginning 0))) (when (string-match "^[\t ]*\\(.*[^\t ]+\\)[\t ]+$" rest) (wl-folder-append-petname (setq realname (match-string 1 rest)) petname) realname)) (if (string-match "^[\t ]*\\(.+\\)$" rest) (match-string 1 rest) rest)))))) (defun wl-folder-create-folder-entity () "Create folder entries." (let ((tmp-buf (get-buffer-create " *wl-folder-tmp*")) entity ret-val) (condition-case () (progn (with-current-buffer tmp-buf (erase-buffer) (insert-file-contents wl-folders-file) (goto-char (point-min)) (while (and (not (eobp)) (setq entity (wl-create-folder-entity-from-buffer))) (unless (eq entity 'ignore) (wl-append ret-val (list entity))))) (kill-buffer tmp-buf)) (file-error nil)) (list wl-folder-desktop-name 'group ret-val))) (defun wl-folder-entity-assign-id (entity &optional hashtb on-noid) (let ((hashtb (or hashtb (setq wl-folder-entity-id-name-hashtb (elmo-make-hash wl-folder-entity-id)))) (entities (list entity)) entity-stack) (while entities (setq entity (wl-pop entities)) (cond ((consp entity) (when (not (and on-noid (get-text-property 0 'wl-folder-entity-id (car entity)))) (wl-folder-put-folder-property 0 (length (car entity)) wl-folder-entity-id 'is-group (car entity)) (wl-folder-set-id-name wl-folder-entity-id (car entity) hashtb) (setq wl-folder-entity-id (+ 1 wl-folder-entity-id))) (and entities (wl-push entities entity-stack)) (setq entities (nth 2 entity))) ((stringp entity) (when (not (and on-noid (get-text-property 0 'wl-folder-entity-id entity))) (wl-folder-put-folder-property 0 (length entity) wl-folder-entity-id nil entity) (wl-folder-set-id-name wl-folder-entity-id entity hashtb) (setq wl-folder-entity-id (+ 1 wl-folder-entity-id))))) (unless entities (setq entities (wl-pop entity-stack)))))) (defun wl-folder-click (e) (interactive "e") (mouse-set-point e) (beginning-of-line) (save-excursion (wl-folder-jump-to-current-entity))) (defun wl-folder-select-buffer (buffer) (let ((gbw (get-buffer-window buffer)) exists) (if gbw (progn (select-window gbw) (setq exists t)) (unless wl-summary-use-frame (condition-case () (unwind-protect (split-window-horizontally wl-folder-window-width) (other-window 1)) (error nil)))) (set-buffer buffer) (if wl-summary-use-frame (switch-to-buffer-other-frame buffer) (switch-to-buffer buffer)) exists)) (defun wl-folder-toggle-disp-summary (&optional arg folder) (interactive) (if (or (and folder (assoc folder wl-folder-group-alist)) (and (called-interactively-p 'interactive) (wl-folder-buffer-group-p))) (error "This command is not available on Group")) (beginning-of-line) (let (wl-auto-select-first (wl-stay-folder-window t)) (cond ((eq arg 'on) (setq wl-folder-buffer-disp-summary t)) ((eq arg 'off) (setq wl-folder-buffer-disp-summary nil) ;; hide wl-summary window. (let ((cur-buf (current-buffer)) (summary-buffer (wl-summary-get-buffer folder))) (when summary-buffer (wl-folder-select-buffer summary-buffer) (delete-window)) (select-window (get-buffer-window cur-buf)))) (t (setq wl-folder-buffer-disp-summary (not wl-folder-buffer-disp-summary)) (let ((cur-buf (current-buffer)) folder-name) (when (looking-at "^[ ]*\\([^\\[].+\\):.*\n") (setq folder-name (wl-folder-get-entity-from-buffer)) (if wl-folder-buffer-disp-summary (progn (wl-folder-select-buffer (wl-summary-get-buffer-create folder-name)) (unwind-protect (wl-summary-goto-folder-subr folder-name 'no-sync nil) (select-window (get-buffer-window cur-buf)))) (let ((summary-buffer (wl-summary-get-buffer folder-name))) (when summary-buffer (wl-folder-select-buffer summary-buffer) (delete-window)) (select-window (get-buffer-window cur-buf)))))))))) (defun wl-folder-prev-unsync () "Move cursor to the previous unsync folder." (interactive) (let (start-point) (setq start-point (point)) (beginning-of-line) (if (re-search-backward wl-folder-unsync-regexp nil t) (beginning-of-line) (goto-char start-point) (message "No more unsync folder")))) (defun wl-folder-next-unsync (&optional plugged) "Move cursor to the next unsync." (interactive) (let (start-point entity) (setq start-point (point)) (end-of-line) (if (catch 'found (while (re-search-forward wl-folder-unsync-regexp nil t) (if (or (wl-folder-buffer-group-p) (not plugged) (setq entity (wl-folder-get-entity-from-buffer)) (elmo-folder-plugged-p entity)) (throw 'found t)))) (beginning-of-line) (goto-char start-point) (message "No more unsync folder")))) (defun wl-folder-prev-unread (&optional group) "Move cursor to the previous unread folder." (interactive "P") (let (start-point) (setq start-point (point)) (beginning-of-line) (if (re-search-backward (wl-folder-unread-regex group) nil t) (progn (beginning-of-line) (wl-folder-get-entity-from-buffer)) (goto-char start-point) (message "No more unread folder") nil))) (defun wl-folder-next-unread (&optional group) "Move cursor to the next unread folder." (interactive "P") (let (start-point) (setq start-point (point)) (end-of-line) (if (re-search-forward (wl-folder-unread-regex group) nil t) (progn (beginning-of-line) (wl-folder-get-entity-from-buffer)) (goto-char start-point) (message "No more unread folder") nil))) (defun wl-folder-mode () "Major mode for Wanderlust Folder. See Info under Wanderlust for full documentation. Special commands: \\{wl-folder-mode-map} Entering Folder mode calls the value of `wl-folder-mode-hook'." (interactive) (setq major-mode 'wl-folder-mode) (setq mode-name "Folder") (use-local-map wl-folder-mode-map) (setq buffer-read-only t) (setq inhibit-read-only nil) (setq truncate-lines t) (setq wl-folder-buffer-cur-entity-id nil wl-folder-buffer-cur-path nil wl-folder-buffer-cur-point nil) (set 'bidi-paragraph-direction 'left-to-right) (wl-mode-line-buffer-identification) ;; This hook may contain the functions `wl-folder-init-icons' and ;; `wl-setup-folder' for reasons of system internal to accord ;; facilities for the Emacs variants. (run-hooks 'wl-folder-mode-hook)) (defun wl-folder-append-petname (realname petname) (let ((pentry (elmo-string-assoc realname wl-folder-petname-alist))) (when pentry (setq wl-folder-petname-alist (delete pentry wl-folder-petname-alist)))) (wl-append wl-folder-petname-alist (list (cons realname petname)))) (defun wl-folder () (let (initialize folder-buf) (if (setq folder-buf (get-buffer wl-folder-buffer-name)) (if wl-folder-use-frame (let (select-frame) (save-selected-window (dolist (frame (visible-frame-list)) (select-frame frame) (if (get-buffer-window folder-buf) (setq select-frame frame)))) (if select-frame (select-frame select-frame) (switch-to-buffer folder-buf))) (switch-to-buffer folder-buf)) (if wl-folder-use-frame (progn (switch-to-buffer-other-frame (get-buffer-create wl-folder-buffer-name)) (let ((frame (selected-frame))) (setq wl-delete-startup-frame-function `(lambda () (setq wl-delete-startup-frame-function nil) (let ((frame ,frame)) (if (eq (selected-frame) frame) (delete-frame frame))))))) (switch-to-buffer (get-buffer-create wl-folder-buffer-name))) (set-buffer wl-folder-buffer-name) (wl-folder-mode) ;; Initialization. (unless wl-folder-entity (wl-folder-init)) (setq wl-folder-entity-id 0) (wl-folder-entity-assign-id wl-folder-entity) (setq wl-folder-entity-hashtb (wl-folder-create-entity-hashtb wl-folder-entity)) (setq wl-folder-elmo-folder-hashtb (elmo-make-hash wl-folder-entity-id)) (setq wl-folder-group-alist (wl-folder-create-group-alist wl-folder-entity)) (setq wl-folder-newsgroups-hashtb (wl-folder-create-newsgroups-hashtb wl-folder-entity)) (wl-folder-init-info-hashtb) (let ((inhibit-read-only t) (buffer-read-only nil)) (erase-buffer) (setcdr (assoc (car wl-folder-entity) wl-folder-group-alist) t) (save-excursion (wl-folder-insert-entity " " wl-folder-entity))) (sit-for 0) (set-buffer-modified-p nil) (setq initialize t)) initialize)) (defun wl-folder-auto-check () "Check and update folders in `wl-auto-check-folder-name'." (interactive) (when (get-buffer wl-folder-buffer-name) (switch-to-buffer wl-folder-buffer-name) (cond ((eq wl-auto-check-folder-name 'none)) ((or (consp wl-auto-check-folder-name) (stringp wl-auto-check-folder-name)) (let ((folder-list (if (consp wl-auto-check-folder-name) wl-auto-check-folder-name (list wl-auto-check-folder-name))) entity) (while folder-list (if (setq entity (wl-folder-search-entity-by-name (car folder-list) wl-folder-entity)) (wl-folder-check-entity entity 'auto)) (setq folder-list (cdr folder-list))))) (t (wl-folder-check-entity wl-folder-entity 'auto))))) (defun wl-folder-set-folder-updated (name value) (save-excursion (let ((buf (get-buffer wl-folder-buffer-name))) (if buf (wl-folder-entity-hashtb-set wl-folder-entity-hashtb name value buf)) (setq wl-folder-info-alist-modified t)))) (defun wl-folder-calc-finfo (entity) ;; calcurate finfo without inserting. (let ((entities (list entity)) entity-stack new unread all nums) (while entities (setq entity (wl-pop entities)) (cond ((consp entity) (and entities (wl-push entities entity-stack)) (setq entities (nth 2 entity))) ((stringp entity) (setq nums (wl-folder-get-entity-info entity)) (setq new (+ (or new 0) (or (nth 0 nums) 0))) (setq unread (+ (or unread 0) (or (and (nth 0 nums)(nth 1 nums) (+ (nth 0 nums)(nth 1 nums))) 0))) (setq all (+ (or all 0) (or (nth 2 nums) 0))))) (unless entities (setq entities (wl-pop entity-stack)))) (list new unread all))) (defsubst wl-folder-make-save-access-list (list) (mapcar (lambda (x) (cond ((consp x) (list (substring-no-properties (car x)) 'access)) (t (substring-no-properties x)))) list)) (defun wl-folder-update-newest (indent entity) (cond ((consp entity) (let ((inhibit-read-only t) (buffer-read-only nil) (flist (nth 2 entity)) (as-opened (cdr (assoc (car entity) wl-folder-group-alist)))) (if as-opened (let (update-flist flist-unsub new-flist) (when (and (eq (cadr entity) 'access) (elmo-folder-plugged-p (wl-folder-get-elmo-folder (car entity)))) (message "Fetching folder entries...") (when (setq new-flist (elmo-folder-list-subfolders (wl-folder-get-elmo-folder (car entity)) (elmo-string-match-member (car entity) wl-folder-hierarchy-access-folders))) (setq update-flist (wl-folder-update-access-group entity new-flist)) (setq flist (nth 1 update-flist)) (when (car update-flist) ;; diff (setq flist-unsub (nth 2 update-flist)) (elmo-msgdb-flist-save (car entity) (list (wl-folder-make-save-access-list flist) (wl-folder-make-save-access-list flist-unsub))) (wl-folder-entity-assign-id entity wl-folder-entity-id-name-hashtb t) (setq wl-folder-entity-hashtb (wl-folder-create-entity-hashtb entity wl-folder-entity-hashtb t)) (setq wl-folder-newsgroups-hashtb (or (wl-folder-create-newsgroups-hashtb entity nil) wl-folder-newsgroups-hashtb)))) (message "Fetching folder entries...done")) (wl-folder-insert-entity indent entity))))))) (defun wl-folder-insert-entity (indent entity &optional onlygroup) (let (ret-val new unread all) (cond ((consp entity) (let ((inhibit-read-only t) (buffer-read-only nil) (flist (nth 2 entity)) (as-opened (cdr (assoc (car entity) wl-folder-group-alist))) beg) ;;; (insert indent "[" (if as-opened "-" "+") "]" (car entity) "\n") ;;; (save-excursion (forward-line -1) ;;; (wl-highlight-folder-current-line)) (setq beg (point)) (if (and as-opened (not onlygroup)) (let (removed group-name-end) ;;; (when (and (eq (cadr entity) 'access) ;;; newest) ;;; (message "fetching folder entries...") ;;; (when (setq new-flist ;;; (elmo-list-folders ;;; (elmo-string (car entity)) ;;; (wl-string-member ;;; (car entity) ;;; wl-folder-hierarchy-access-folders) ;;; )) ;;; (setq update-flist ;;; (wl-folder-update-access-group entity new-flist)) ;;; (setq flist (nth 1 update-flist)) ;;; (when (car update-flist) ;; diff ;;; (setq flist-unsub (nth 2 update-flist)) ;;; (setq removed (nth 3 update-flist)) ;;; (elmo-msgdb-flist-save ;;; (car entity) ;;; (list ;;; (wl-folder-make-save-access-list flist) ;;; (wl-folder-make-save-access-list flist-unsub))) ;;; ;; ;;; ;; reconstruct wl-folder-entity-id-name-hashtb and ;;; ;; wl-folder-entity-hashtb ;;; ;; ;;; (wl-folder-entity-assign-id ;;; entity ;;; wl-folder-entity-id-name-hashtb ;;; t) ;;; (setq wl-folder-entity-hashtb ;;; (wl-folder-create-entity-hashtb ;;; entity ;;; wl-folder-entity-hashtb ;;; t)) ;;; (setq wl-folder-newsgroups-hashtb ;;; (or ;;; (wl-folder-create-newsgroups-hashtb ;;; entity nil) ;;; wl-folder-newsgroups-hashtb)))) ;;; (message "fetching folder entries...done")) (insert indent "[" (if as-opened "-" "+") "]" (if (eq (cadr entity) 'access) (wl-folder-get-petname (car entity)) (car entity))) (setq group-name-end (point)) (insert ":0/0/0\n") (wl-folder-put-folder-property beg (point) (get-text-property 0 'wl-folder-entity-id (car entity)) 'is-group) (when removed (setq beg (point)) (while removed (insert indent " " wl-folder-removed-mark (if (listp (car removed)) (concat "[+]" (caar removed)) (car removed)) "\n") (save-excursion (forward-line -1) (wl-highlight-folder-current-line)) (setq removed (cdr removed))) (remove-text-properties beg (point) '(wl-folder-entity-id))) (elmo-with-progress-display (wl-folder-insert-entity (length flist)) (format "Inserting group %s" (car entity)) (while flist (setq ret-val (wl-folder-insert-entity (concat indent " ") (car flist))) (setq new (+ (or new 0) (or (nth 0 ret-val) 0))) (setq unread (+ (or unread 0) (or (nth 1 ret-val) 0))) (setq all (+ (or all 0) (or (nth 2 ret-val) 0))) (elmo-progress-notify 'wl-folder-insert-entity) (setq flist (cdr flist)))) (save-excursion (goto-char group-name-end) (delete-region (point) (save-excursion (end-of-line) (point))) (insert (format ":%d/%d/%d" (or new 0) (or unread 0) (or all 0))) (setq ret-val (list new unread all)) (wl-highlight-folder-current-line ret-val))) (setq ret-val (wl-folder-calc-finfo entity)) (insert indent "[" (if as-opened "-" "+") "]" (if (eq (cadr entity) 'access) (wl-folder-get-petname (car entity)) (car entity)) (format ":%d/%d/%d" (or (nth 0 ret-val) 0) (or (nth 1 ret-val) 0) (or (nth 2 ret-val) 0)) "\n") (wl-folder-put-folder-property beg (point) (get-text-property 0 'wl-folder-entity-id (car entity)) 'is-group) (save-excursion (forward-line -1) (wl-highlight-folder-current-line ret-val))))) ((stringp entity) (let* ((inhibit-read-only t) (buffer-read-only nil) (nums (wl-folder-get-entity-info entity)) beg) (setq beg (point)) (insert indent (wl-folder-get-petname entity) (format ":%s/%s/%s\n" (or (setq new (nth 0 nums)) "*") (or (setq unread (and (nth 0 nums)(nth 1 nums) (+ (nth 0 nums)(nth 1 nums)))) "*") (or (setq all (nth 2 nums)) "*"))) (wl-folder-put-folder-property beg (point) (get-text-property 0 'wl-folder-entity-id entity) nil) (save-excursion (forward-line -1) (wl-highlight-folder-current-line nums)) (setq ret-val (list new unread all))))) (set-buffer-modified-p nil) ret-val)) (defun wl-folder-check-all () (interactive) (wl-folder-check-entity wl-folder-entity)) (defun wl-folder-entity-hashtb-set (entity-hashtb name value buffer) (let ((cur-val (wl-folder-get-entity-info name entity-hashtb)) (new-diff 0) (unread-diff 0) (all-diff 0) diffs) (setq new-diff (- (or (nth 0 value) 0) (or (nth 0 cur-val) 0))) (setq unread-diff (+ new-diff (- (or (nth 1 value) 0) (or (nth 1 cur-val) 0)))) (setq all-diff (- (or (nth 2 value) 0) (or (nth 2 cur-val) 0))) (setq diffs (list new-diff unread-diff all-diff)) (unless (and (nth 0 cur-val) (equal diffs '(0 0 0))) (wl-folder-set-entity-info name value entity-hashtb) (save-match-data (with-current-buffer buffer (save-excursion (let ((entity-list (wl-folder-search-entity-list-by-name name wl-folder-entity))) (while entity-list (wl-folder-update-group (car entity-list) diffs) (setq entity-list (cdr entity-list)))) (goto-char (point-min)) (while (wl-folder-buffer-search-entity name) (wl-folder-update-line value)))))))) (defun wl-folder-update-unread (folder unread) (let ((buf (get-buffer wl-folder-buffer-name)) (value (wl-folder-get-entity-info folder)) cur-unread (unread-diff 0) newvalue) ;;; Update folder-info ;;; (elmo-folder-set-info-hashtb fld nil nil nil unread) (setq cur-unread (or (nth 1 value) 0)) (setq unread-diff (- (or unread 0) cur-unread)) (setq newvalue (list (nth 0 value) unread (nth 2 value))) (wl-folder-set-entity-info folder newvalue) (setq wl-folder-info-alist-modified t) (when (and buf (not (zerop unread-diff))) (save-match-data (with-current-buffer buf (save-excursion (let ((entity-list (wl-folder-search-entity-list-by-name folder wl-folder-entity))) (while entity-list (wl-folder-update-group (car entity-list) (list 0 unread-diff 0)) (setq entity-list (cdr entity-list)))) (goto-char (point-min)) (while (wl-folder-buffer-search-entity folder) (wl-folder-update-line newvalue)))))))) (defun wl-folder-create-entity-hashtb (entity &optional hashtb reconst) (let ((hashtb (or hashtb (elmo-make-hash wl-folder-entity-id))) (entities (list entity)) entity-stack) (while entities (setq entity (wl-pop entities)) (cond ((consp entity) (and entities (wl-push entities entity-stack)) (setq entities (nth 2 entity))) ((stringp entity) (when (not (and reconst (wl-folder-get-entity-info entity))) (wl-folder-set-entity-info entity nil hashtb)))) (unless entities (setq entities (wl-pop entity-stack)))) hashtb)) ;; Unsync number is reserved. ;;;(defun wl-folder-reconstruct-entity-hashtb (entity &optional hashtb id-name) ;;; (let* ((hashtb (or hashtb (elmo-make-hash wl-folder-entity-id))) ;;; (entities (list entity)) ;;; entity-stack) ;;; (while entities ;;; (setq entity (wl-pop entities)) ;;; (cond ;;; ((consp entity) ;;; (if id-name ;;; (wl-folder-set-id-name (wl-folder-get-entity-id (car entity)) ;;; (car entity))) ;;; (and entities ;;; (wl-push entities entity-stack)) ;;; (setq entities (nth 2 entity)) ;;; ) ;;; ((stringp entity) ;;; (wl-folder-set-entity-info entity ;;; (wl-folder-get-entity-info entity) ;;; hashtb) ;;; (if id-name ;;; (wl-folder-set-id-name (wl-folder-get-entity-id entity) ;;; entity)))) ;;; (unless entities ;;; (setq entities (wl-pop entity-stack)))) ;;; hashtb)) (defun wl-folder-create-newsgroups-from-nntp-access (entity) (let ((flist (nth 2 entity)) folders) (while flist (wl-append folders (cond ((consp (car flist)) (wl-folder-create-newsgroups-from-nntp-access (car flist))) (t (list (elmo-nntp-folder-group-internal (wl-folder-get-elmo-folder (car flist))))))) (setq flist (cdr flist))) folders)) (defun wl-folder-create-newsgroups-hashtb (entity &optional is-list info) "Create NNTP group hashtable for ENTITY." (let ((entities (if is-list entity (list entity))) entity-stack folder-list newsgroups newsgroup make-hashtb) (and info (message "Creating newsgroups...")) (while entities (setq entity (wl-pop entities)) (cond ((consp entity) (if (eq (nth 1 entity) 'access) (when (eq (elmo-folder-type-internal (elmo-make-folder (car entity))) 'nntp) (wl-append newsgroups (wl-folder-create-newsgroups-from-nntp-access entity)) (setq make-hashtb t)) (and entities (wl-push entities entity-stack)) (setq entities (nth 2 entity)))) ((stringp entity) (setq folder-list (elmo-folder-get-primitive-list (elmo-make-folder entity))) (while folder-list (when (and (eq (elmo-folder-type-internal (car folder-list)) 'nntp) (setq newsgroup (elmo-nntp-folder-group-internal (car folder-list)))) (wl-append newsgroups (list (substring-no-properties newsgroup)))) (setq folder-list (cdr folder-list))))) (unless entities (setq entities (wl-pop entity-stack)))) (and info (message "Creating newsgroups...done")) (if (or newsgroups make-hashtb) (elmo-setup-subscribed-newsgroups newsgroups)))) (defun wl-folder-get-path (entity target-id &optional string) (let ((entities (list entity)) entity-stack result-path) (reverse (catch 'done (while entities (setq entity (wl-pop entities)) (cond ((consp entity) (if (and (or (not string) (string= string (car entity))) (eq target-id (wl-folder-get-entity-id (car entity)))) (throw 'done (wl-push target-id result-path)) (wl-push (wl-folder-get-entity-id (car entity)) result-path)) (wl-push entities entity-stack) (setq entities (nth 2 entity))) ((stringp entity) (if (and (or (not string) (string= string entity)) (eq target-id (wl-folder-get-entity-id entity))) (throw 'done (wl-push target-id result-path))))) (unless entities (while (and entity-stack (not entities)) (setq result-path (cdr result-path)) (setq entities (wl-pop entity-stack))))))))) (defun wl-folder-create-group-alist (entity) (if (consp entity) (let ((flist (nth 2 entity)) (cur-alist (list (cons (car entity) nil))) append-alist) (while flist (if (consp (car flist)) (wl-append append-alist (wl-folder-create-group-alist (car flist)))) (setq flist (cdr flist))) (append cur-alist append-alist)))) (defun wl-folder-init-info-hashtb () (let ((info-alist (and wl-folder-info-save (elmo-msgdb-finfo-load)))) (elmo-folder-info-make-hashtb info-alist wl-folder-entity-hashtb))) ;;; (wl-folder-resume-entity-hashtb-by-finfo ;;; wl-folder-entity-hashtb ;;; info-alist))) (defun wl-folder-cleanup-variables () (setq wl-folder-entity nil wl-folder-entity-hashtb nil wl-folder-entity-id-name-hashtb nil wl-folder-group-alist nil wl-folder-petname-alist nil wl-folder-newsgroups-hashtb nil wl-fldmgr-cut-entity-list nil wl-fldmgr-modified nil wl-fldmgr-modified-access-list nil) (when (boundp 'wl-score-cache) (setq wl-score-cache nil))) (defun wl-make-plugged-alist () (let ((entity-list (wl-folder-get-entity-list wl-folder-entity)) (add (not wl-reset-plugged-alist))) (while entity-list (elmo-folder-set-plugged (wl-folder-get-elmo-folder (car entity-list)) wl-plugged add) (setq entity-list (cdr entity-list))) ;; smtp posting server (when wl-smtp-posting-server (elmo-set-plugged wl-plugged wl-smtp-posting-server ; server (or wl-smtp-posting-port (and (boundp 'smtp-service) smtp-service) "smtp") ; port wl-smtp-connection-type nil nil "smtp" add)) ;; nntp posting server (when wl-nntp-posting-server (elmo-set-plugged wl-plugged wl-nntp-posting-server wl-nntp-posting-port wl-nntp-posting-stream-type nil nil "nntp" add)) (run-hooks 'wl-make-plugged-hook))) (defvar wl-folder-init-function 'wl-local-folder-init) (autoload 'wl-acap-init "wl-acap") (defun wl-folder-init () "Return top-level folder entity." (interactive) (if wl-use-acap (wl-acap-init) (funcall wl-folder-init-function)) (run-hooks 'wl-folder-init-hook)) (defun wl-local-folder-init () "Initialize local folder." (message "Initializing folder...") (setq wl-folder-entity (wl-folder-create-folder-entity)) (message "Initializing folder...done")) (defun wl-folder-get-realname (petname) (or (car (elmo-string-rassoc petname wl-folder-petname-alist)) petname)) (defun wl-folder-get-petname (name) (or (cdr (elmo-string-assoc name wl-folder-petname-alist)) name)) (defun wl-folder-get-entity-with-petname () (let ((alist wl-folder-petname-alist) (hashtb (copy-sequence wl-folder-entity-hashtb))) (while alist (wl-folder-set-entity-info (cdar alist) nil hashtb) (setq alist (cdr alist))) hashtb)) (defun wl-folder-get-newsgroups (folder) "Return Newsgroups field value string for FOLDER newsgroup. If FOLDER is multi, return comma separated string (cross post)." (let ((nlist (elmo-folder-newsgroups (wl-folder-get-elmo-folder folder)))) (if nlist (list nil nil (mapconcat 'identity nlist ",")) nil))) (defun wl-folder-guess-mailing-list-by-refile-rule (entity) "Return ML address guess by ENTITY. Use `wl-subscribed-mailing-list' and `wl-refile-rule-alist'." (let ((flist (elmo-folder-get-primitive-list (wl-folder-get-elmo-folder entity))) fld mladdr to) (while (setq fld (car flist)) (setq mladdr (wl-folder-guess-mailing-list-by-refile-rule-subr (elmo-folder-name-internal fld))) (when mladdr (setq to (if (stringp to) (concat to ", " mladdr) mladdr))) (setq flist (cdr flist))) (if (stringp to) (list to nil nil) nil))) (defun wl-folder-guess-mailing-list-by-refile-rule-subr (entity) (unless (memq (elmo-folder-type entity) '(localnews nntp)) (let ((rules wl-refile-rule-alist) tokey toalist) (while rules (if (or (and (stringp (car (car rules))) (string-match "[Tt]o" (car (car rules)))) (and (listp (car (car rules))) (elmo-string-matched-member "to" (car (car rules)) 'case-ignore))) (setq toalist (append toalist (cdr (car rules))))) (setq rules (cdr rules))) (setq tokey (car (rassoc entity toalist))) ;;; (setq histkey (car (rassoc folder wl-refile-alist))) ;; case-ignore search `wl-subscribed-mailing-list' (if (stringp tokey) (elmo-string-matched-member tokey wl-subscribed-mailing-list t))))) (defun wl-folder-guess-mailing-list-by-folder-name (entity) "Return ML address guess by ENTITY name's last hierarchy. Use `wl-subscribed-mailing-list'." (let ((flist (elmo-folder-get-primitive-list (wl-folder-get-elmo-folder entity))) fld mladdr to) (while (setq fld (car flist)) (setq mladdr (wl-folder-guess-mailing-list-by-folder-name-subr (elmo-folder-name-internal fld))) (when mladdr (setq to (if (stringp to) (concat to ", " mladdr) mladdr))) (setq flist (cdr flist))) (if (stringp to) (list to nil nil) nil))) (defun wl-folder-guess-mailing-list-by-folder-name-subr (entity) (when (memq (elmo-folder-type entity) '(localdir imap4 maildir)) (let (key foldername) ;; Get foldername and Remove folder type symbol. (setq foldername (substring entity 1)) (if (string-match "@" foldername) (setq foldername (substring foldername 0 (match-beginning 0)))) (when (string-match "[^\\./]+$" foldername) (setq key (regexp-quote (concat (substring foldername (match-beginning 0)) "@"))) (elmo-string-matched-member key wl-subscribed-mailing-list 'case-ignore))))) (defun wl-folder-update-diff-line (diffs) (let ((inhibit-read-only t) (buffer-read-only nil) cur-new new-new cur-unread new-unread cur-all new-all id is-group) (save-excursion (beginning-of-line) (setq id (get-text-property (point) 'wl-folder-entity-id)) (setq is-group (get-text-property (point) 'wl-folder-is-group)) (when (looking-at "^[ ]*\\(.*\\):\\([0-9\\*-]*\\)/\\([0-9\\*-]*\\)/\\([0-9\\*]*\\)") ;;(looking-at "^[ ]*\\([^\\[].+\\):\\([0-9\\*-]*/[0-9\\*-]*/[0-9\\*]*\\)") (setq cur-new (string-to-number (match-string-no-properties 2))) (setq cur-unread (string-to-number (match-string-no-properties 3))) (setq cur-all (string-to-number (match-string-no-properties 4))) (delete-region (match-beginning 2) (match-end 4)) (goto-char (match-beginning 2)) (insert (format "%s/%s/%s" (setq new-new (+ cur-new (nth 0 diffs))) (setq new-unread (+ cur-unread (nth 1 diffs))) (setq new-all (+ cur-all (nth 2 diffs))))) (wl-folder-put-folder-property (match-beginning 2) (point) id is-group) (if wl-use-highlight-mouse-line (put-text-property (match-beginning 2) (point) 'mouse-face 'highlight)) (wl-highlight-folder-group-line (list new-new new-unread new-all)) (setq buffer-read-only t) (set-buffer-modified-p nil))))) (defun wl-folder-update-line (nums &optional _is-group) (let ((inhibit-read-only t) (buffer-read-only nil) id is-group) (save-excursion (beginning-of-line) (setq id (get-text-property (point) 'wl-folder-entity-id)) (setq is-group (get-text-property (point) 'wl-folder-is-group)) (if (looking-at "^[ ]*\\(.*\\):\\([0-9\\*-]*/[0-9\\*-]*/[0-9\\*]*\\)") ;;; (looking-at "^[ ]*\\([^\\[].+\\):\\([0-9\\*-]*/[0-9\\*-]*/[0-9\\*]*\\)") (progn (delete-region (match-beginning 2) (match-end 2)) (goto-char (match-beginning 2)) (insert (format "%s/%s/%s" (or (nth 0 nums) "*") (or (and (nth 0 nums)(nth 1 nums) (+ (nth 0 nums)(nth 1 nums))) "*") (or (nth 2 nums) "*"))) (wl-folder-put-folder-property (match-beginning 2) (point) id is-group) (if is-group ;; update only colors (wl-highlight-folder-group-line nums) (wl-highlight-folder-current-line nums)) (beginning-of-line) (set-buffer-modified-p nil)))))) (defun wl-folder-goto-folder (&optional arg) "Visit some folder." (interactive "P") (wl-folder-goto-folder-subr nil arg)) (defun wl-folder-goto-folder-sticky () "Visit some folder and make it sticky." (interactive) (wl-folder-goto-folder-subr nil t)) (defun wl-folder-goto-draft-folder (&optional arg) "Visit draft folder." (interactive "P") (wl-folder-goto-folder-subr wl-draft-folder arg)) (defun wl-folder-revisit-last-visited-folder (&optional arg) "Revisit last visited folder." (interactive "P") (let ((folder (wl-folder-get-folder-name-by-id wl-folder-buffer-last-visited-entity-id))) (if (and folder (y-or-n-p (format "Revisit %s? " folder))) (wl-folder-goto-folder-subr folder arg)))) (defun wl-folder-goto-folder-subr (&optional folder sticky) (beginning-of-line) (let (summary-buf fld-name entity id) ;;; (setq fld-name (wl-folder-get-entity-from-buffer)) ;;; (if (or (null fld-name) ;;; (assoc fld-name wl-folder-group-alist)) (setq fld-name wl-default-folder) (setq fld-name (or folder (let ((this-command this-command)) (wl-summary-read-folder fld-name)))) (if (and (setq entity (wl-folder-search-entity-by-name fld-name wl-folder-entity 'folder)) (setq id (wl-folder-get-entity-id entity))) (wl-folder-set-current-entity-id id)) (setq summary-buf (wl-summary-get-buffer-create fld-name sticky)) (if (or wl-stay-folder-window wl-summary-use-frame) (wl-folder-select-buffer summary-buf) (if (and summary-buf (get-buffer-window summary-buf)) (delete-window))) (wl-summary-goto-folder-subr fld-name (wl-summary-get-sync-range (wl-folder-get-elmo-folder fld-name)) nil sticky t))) (defun wl-folder-suspend () (interactive) (run-hooks 'wl-folder-suspend-hook) (wl-folder-info-save) (elmo-crosspost-message-alist-save) (elmo-quit) ;(if (fboundp 'mmelmo-cleanup-entity-buffers) ;(mmelmo-cleanup-entity-buffers)) (dolist (buf (cons wl-folder-buffer-name (nconc (wl-collect-summary) (wl-collect-draft)))) (bury-buffer buf) (delete-windows-on buf t))) (defun wl-folder-info-save () (when (and wl-folder-info-save wl-folder-info-alist-modified) (let ((entities (list wl-folder-entity)) entity entity-stack info-alist info) (while entities (setq entity (wl-pop entities)) (cond ((consp entity) (and entities (wl-push entities entity-stack)) (setq entities (nth 2 entity))) ((stringp entity) (when (and (setq info (elmo-folder-get-info (wl-folder-get-elmo-folder entity))) (not (equal info '(nil)))) (if (listp info) (wl-append info-alist (list (list (substring-no-properties entity) (list (nth 3 info) ;; max (nth 2 info) ;; length (nth 0 info) ;; new (nth 1 info)) ;; unread ))))))) (unless entities (setq entities (wl-pop entity-stack)))) (elmo-msgdb-finfo-save info-alist) (setq wl-folder-info-alist-modified nil)))) (defun wl-folder-goto-first-unread-folder (&optional arg) (interactive "P") (let ((entities (list wl-folder-entity)) entity entity-stack ret-val first-entity finfo) (setq first-entity (catch 'done (while entities (setq entity (wl-pop entities)) (cond ((consp entity) (and entities (wl-push entities entity-stack)) (setq entities (nth 2 entity))) ((stringp entity) (if (and (setq finfo (wl-folder-get-entity-info entity)) (and (nth 0 finfo)(nth 1 finfo)) (> (+ (nth 0 finfo)(nth 1 finfo)) 0)) (throw 'done entity)) (wl-append ret-val (list entity)))) (unless entities (setq entities (wl-pop entity-stack)))))) (if first-entity (progn (when arg (wl-folder-jump-folder first-entity) (sit-for 0)) (wl-folder-goto-folder-subr first-entity)) (message "No unread folder")))) (defun wl-folder-jump-folder (&optional fld-name noopen) (interactive) (if (not fld-name) (setq fld-name (wl-summary-read-folder wl-default-folder))) (goto-char (point-min)) (if (not noopen) (wl-folder-open-folder fld-name)) (and (wl-folder-buffer-search-entity fld-name) (beginning-of-line))) (defun wl-folder-get-entity-list (entity) (let ((entities (list entity)) entity-stack ret-val) (while entities (setq entity (wl-pop entities)) (cond ((consp entity) (and entities (wl-push entities entity-stack)) (setq entities (nth 2 entity))) ((stringp entity) (wl-append ret-val (list entity)))) (unless entities (setq entities (wl-pop entity-stack)))) ret-val)) (defun wl-folder-open-unread-folder (entity) (save-excursion (let ((alist (wl-folder-get-entity-list entity)) (unread 0) finfo path-list path id) (while alist (when (and (setq finfo (wl-folder-get-entity-info (car alist))) (nth 0 finfo) (nth 1 finfo) (> (+ (nth 0 finfo)(nth 1 finfo)) 0)) (setq unread (+ unread (+ (nth 0 finfo)(nth 1 finfo)))) (setq id (wl-folder-get-entity-id (car alist))) (setq path (delete id (wl-folder-get-path wl-folder-entity id (car alist)))) (if (not (member path path-list)) (wl-append path-list (list path)))) (setq alist (cdr alist))) (while path-list (wl-folder-open-folder-sub (car path-list)) (setq path-list (cdr path-list))) (message "%s unread message(s)" (if (> unread 0) unread "No"))))) (defun wl-folder-open-unread-current-entity () (interactive) (let ((entity-name (wl-folder-get-entity-from-buffer)) (group (wl-folder-buffer-group-p))) (when entity-name (wl-folder-open-unread-folder (if group (wl-folder-search-group-entity-by-name entity-name wl-folder-entity) entity-name))))) (defun wl-folder-open-only-unread-folder () (interactive) (let ((id (progn (wl-folder-prev-entity-skip-invalid t) (wl-folder-get-entity-from-buffer t)))) (wl-folder-open-all-unread-folder) (save-excursion (goto-char (point-max)) (while (and (re-search-backward "^[ ]*\\[[-]\\].+:0/0/[0-9-]+" nil t) (not (bobp))) (wl-folder-jump-to-current-entity) ;; close it )) (wl-folder-move-path id) (recenter))) (defun wl-folder-open-all-unread-folder (&optional arg) (interactive "P") (let ((id (progn (wl-folder-prev-entity-skip-invalid t) (wl-folder-get-entity-from-buffer t)))) (wl-folder-open-unread-folder wl-folder-entity) (if (not arg) (wl-folder-move-path id) (goto-char (point-min)) (wl-folder-next-unread t)))) (defun wl-folder-open-folder (&optional fld-name) (interactive) (if (not fld-name) (setq fld-name (wl-summary-read-folder wl-default-folder))) (let ((entity (wl-folder-search-entity-by-name fld-name wl-folder-entity 'folder))) (if entity (let* ((id (wl-folder-get-entity-id entity)) (path (and id (wl-folder-get-path wl-folder-entity id)))) (if path (wl-folder-open-folder-sub path))) (message "%s: not found" fld-name)))) (defun wl-folder-open-folder-sub (path) (let ((inhibit-read-only t) (buffer-read-only nil) indent name entity) (save-excursion (goto-char (point-min)) (while (and path (wl-folder-buffer-search-group (wl-folder-get-petname (if (stringp (car path)) (car path) (wl-folder-get-folder-name-by-id (car path)))))) (beginning-of-line) (setq path (cdr path)) (if (and (wl-folder-buffer-group-p) (looking-at wl-folder-group-regexp) (string= "+" (match-string-no-properties 2)));; closed group (save-excursion (setq indent (match-string-no-properties 1)) (setq name (wl-folder-get-entity-from-buffer)) (setq entity (wl-folder-search-group-entity-by-name name wl-folder-entity)) ;; insert as opened (setcdr (assoc (car entity) wl-folder-group-alist) t) (if (eq 'access (cadr entity)) (wl-folder-maybe-load-folder-list entity)) (wl-folder-insert-entity indent entity) (delete-region (save-excursion (beginning-of-line) (point)) (save-excursion (end-of-line) (+ 1 (point))))))) (set-buffer-modified-p nil)))) (defun wl-folder-open-all-pre () (let ((entities (list wl-folder-entity)) entity entity-stack group-entry) (while entities (setq entity (wl-pop entities)) (cond ((consp entity) (unless (or (not (setq group-entry (assoc (car entity) wl-folder-group-alist))) (cdr group-entry)) (setcdr group-entry t) (when (eq 'access (cadr entity)) (wl-folder-maybe-load-folder-list entity))) (and entities (wl-push entities entity-stack)) (setq entities (nth 2 entity)))) (unless entities (setq entities (wl-pop entity-stack)))))) (defun wl-folder-open-all (&optional refresh) (interactive "P") (let* ((inhibit-read-only t) (buffer-read-only nil) indent name entity) (if refresh (let ((id (progn (wl-folder-prev-entity-skip-invalid t) (wl-folder-get-entity-from-buffer t))) (alist wl-folder-group-alist)) (while alist (setcdr (pop alist) t)) (erase-buffer) (wl-folder-insert-entity " " wl-folder-entity) (wl-folder-move-path id)) (elmo-with-progress-display (wl-folder-open-all (length wl-folder-group-alist)) "Opening all folders" (wl-folder-open-all-pre) (save-excursion (goto-char (point-min)) (while (re-search-forward "^\\([ ]*\\)\\[\\([+]\\)\\]\\(.+\\):[-0-9-]+/[0-9-]+/[0-9-]+$" nil t) (setq indent (match-string-no-properties 1)) (setq name (wl-folder-get-entity-from-buffer)) (setq entity (wl-folder-search-group-entity-by-name name wl-folder-entity)) ;; insert as opened (setcdr (assoc (car entity) wl-folder-group-alist) t) (beginning-of-line) (wl-folder-insert-entity indent entity) (delete-region (save-excursion (beginning-of-line) (point)) (save-excursion (end-of-line) (+ 1 (point)))) (elmo-progress-notify 'wl-folder-open-all))))) (wl-highlight-folder-path wl-folder-buffer-cur-path) (set-buffer-modified-p nil))) (defun wl-folder-close-all () (interactive) (let ((inhibit-read-only t) (buffer-read-only nil) (alist wl-folder-group-alist) (id (progn (wl-folder-prev-entity-skip-invalid t) (wl-folder-get-entity-from-buffer t)))) (while alist (setcdr (car alist) nil) (setq alist (cdr alist))) (setcdr (assoc (car wl-folder-entity) wl-folder-group-alist) t) (erase-buffer) (wl-folder-insert-entity " " wl-folder-entity) (wl-folder-move-path id) (wl-highlight-folder-path wl-folder-buffer-cur-path) (recenter) (set-buffer-modified-p nil))) (defun wl-folder-open-close () "Open or close parent entity." (interactive) (unless (wl-folder-get-entity-from-buffer) (error "No folder")) (beginning-of-line) (if (wl-folder-buffer-group-p) ;; if group (whether opend or closed.) (wl-folder-jump-to-current-entity) ;; if folder (let (indent) (setq indent (save-excursion (re-search-forward "\\([ ]*\\)." nil t) (match-string-no-properties 1))) (while (looking-at indent) (forward-line -1))) (wl-folder-jump-to-current-entity))) (defsubst wl-folder-access-subscribe-p (group folder) (let (subscr regexp match) (if (setq subscr (wl-get-assoc-list-value wl-folder-access-subscribe-alist group)) (progn (setq regexp (mapconcat 'identity (cdr subscr) "\\|")) (setq match (string-match regexp folder)) (if (car subscr) match (not match))) t))) (defun wl-folder-update-access-group (entity new-flist) (let ((flist (nth 2 entity)) (unsubscribes (nth 3 entity)) diff new-unsubscribes removes subscribed-list folder group entry) (elmo-with-progress-display (wl-folder-update-access-group (+ (length flist) (length unsubscribes))) "Updating access group" ;; check subscribed groups (while flist (cond ((listp (car flist)) ;; group (setq group (substring-no-properties (caar flist))) (cond ((assoc group new-flist) ;; found in new-flist (setq new-flist (delete (assoc group new-flist) new-flist)) (if (wl-folder-access-subscribe-p (car entity) group) (wl-append subscribed-list (list (car flist))) (wl-append new-unsubscribes (list (car flist))) (setq diff t))) (t (setq wl-folder-group-alist (delete (elmo-string-assoc group wl-folder-group-alist) wl-folder-group-alist)) (wl-append removes (list (list group)))))) (t ;; folder (setq folder (substring-no-properties (car flist))) (cond ((member folder new-flist) ;; found in new-flist (setq new-flist (delete folder new-flist)) (if (wl-folder-access-subscribe-p (car entity) folder) (wl-append subscribed-list (list (car flist))) (wl-append new-unsubscribes (list folder)) (setq diff t))) (t (wl-append removes (list folder)))))) (elmo-progress-notify 'wl-folder-update-access-group) (setq flist (cdr flist))) ;; check unsubscribed groups (while unsubscribes (cond ((listp (car unsubscribes)) (when (setq entry (assoc (caar unsubscribes) new-flist)) (setq new-flist (delete entry new-flist)) (wl-append new-unsubscribes (list (car unsubscribes))))) (t (when (member (car unsubscribes) new-flist) (setq new-flist (delete (car unsubscribes) new-flist)) (wl-append new-unsubscribes (list (car unsubscribes)))))) (elmo-progress-notify 'wl-folder-update-access-group) (setq unsubscribes (cdr unsubscribes))) ;; (if (or new-flist removes) (setq diff t)) (setq new-flist (mapcar (lambda (x) (cond ((consp x) (list (car x) 'access)) (t x))) new-flist)) ;; check new groups (let ((new-list new-flist)) (while new-list (if (not (wl-folder-access-subscribe-p (car entity) (if (listp (car new-list)) (caar new-list) (car new-list)))) ;; auto unsubscribe (progn (wl-append new-unsubscribes (list (car new-list))) (setq new-flist (delete (car new-list) new-flist))) (cond ((listp (car new-list)) ;; check group exists (if (elmo-string-assoc (caar new-list) wl-folder-group-alist) (progn (message "%s: group already exists." (caar new-list)) (sit-for 1) (wl-append new-unsubscribes (list (car new-list))) (setq new-flist (delete (car new-list) new-flist))) (wl-append wl-folder-group-alist (list (cons (caar new-list) nil))))))) (setq new-list (cdr new-list))))) (when new-flist (message "%d new folder(s)." (length new-flist))) (wl-append new-flist subscribed-list) ;; new is first (run-hooks 'wl-folder-update-access-group-hook) (setcdr (cdr entity) (list new-flist new-unsubscribes)) (list diff new-flist new-unsubscribes removes))) (defun wl-folder-prefetch-entity (entity) "Prefetch all new messages in the ENTITY." (cond ((consp entity) (let ((flist (nth 2 entity)) (sum-done 0) (sum-all 0) result) (while flist (setq result (wl-folder-prefetch-entity (car flist))) (setq sum-done (+ sum-done (car result))) (setq sum-all (+ sum-all (cdr result))) (setq flist (cdr flist))) (message "Prefetched %d/%d message(s) in \"%s\"." sum-done sum-all (wl-folder-get-petname (car entity))) (cons sum-done sum-all))) ((stringp entity) (let* ((folder (wl-folder-get-elmo-folder entity)) (nums (wl-folder-get-entity-info entity)) (wl-summary-highlight (if (or (wl-summary-sticky-p folder) (wl-summary-always-sticky-folder-p folder)) wl-summary-highlight)) wl-summary-exit-next-move wl-auto-select-first ret-val count sticky) (setq count (or (car nums) 0)) (setq count (+ count (wl-folder-count-incorporates folder))) (if (or (null (car nums)) ; unknown (< 0 count)) (save-window-excursion (save-excursion (let ((wl-summary-buffer-name (if (setq sticky (get-buffer (wl-summary-sticky-buffer-name (elmo-folder-name-internal folder)))) ;; Sticky folder exists. (wl-summary-sticky-buffer-name (elmo-folder-name-internal folder)) (concat wl-summary-buffer-name (symbol-name this-command)))) (wl-summary-use-frame nil) (wl-summary-always-sticky-folder-list nil)) (wl-summary-goto-folder-subr entity (wl-summary-get-sync-range folder) nil) (setq ret-val (wl-summary-incorporate)) (if sticky (wl-summary-save-status) (wl-summary-exit)) ret-val))) (cons 0 0)))))) (defun wl-folder-count-incorporates (folder) (let ((sum 0)) (dolist (number (elmo-folder-list-flagged folder 'any)) (when (member (wl-summary-message-mark folder number) wl-summary-incorporate-marks) (cl-incf sum))) sum)) (defun wl-folder-prefetch-current-entity (&optional no-check) "Prefetch all uncached messages in the folder at position. If current line is group folder, all subfolders are prefetched." (interactive "P") (save-excursion (let ((entity-name (wl-folder-get-entity-from-buffer)) (group (wl-folder-buffer-group-p)) wl-folder-check-entity-hook entity) (when entity-name (setq entity (if group (wl-folder-search-group-entity-by-name entity-name wl-folder-entity) entity-name)) (if (not no-check) (wl-folder-check-entity entity)) (wl-folder-prefetch-entity entity))))) ;;;(defun wl-folder-drop-unsync-entity (entity) ;;; "Drop all unsync messages in the ENTITY." ;;; (cond ;;; ((consp entity) ;;; (let ((flist (nth 2 entity))) ;;; (while flist ;;; (wl-folder-drop-unsync-entity (car flist)) ;;; (setq flist (cdr flist))))) ;;; ((stringp entity) ;;; (let ((nums (wl-folder-get-entity-info entity)) ;;; wl-summary-highlight wl-auto-select-first new) ;;; (setq new (or (car nums) 0)) ;;; (if (< 0 new) ;;; (save-window-excursion ;;; (save-excursion ;;; (let ((wl-summary-buffer-name (concat ;;; wl-summary-buffer-name ;;; (symbol-name this-command)))) ;;; (wl-summary-goto-folder-subr entity 'no-sync nil) ;;; (wl-summary-drop-unsync) ;;; (wl-summary-exit))))))))) ;;;(defun wl-folder-drop-unsync-current-entity (&optional force-check) ;;; "Drop all unsync messages in the folder at position. ;;;If current line is group folder, all subfolders are dropped. ;;;If optional arg exists, don't check any folders." ;;; (interactive "P") ;;; (save-excursion ;;; (let ((entity-name (wl-folder-get-entity-from-buffer)) ;;; (group (wl-folder-buffer-group-p)) ;;; wl-folder-check-entity-hook ;;; summary-buf entity) ;;; (when (and entity-name ;;; (y-or-n-p (format ;;; "Drop all unsync messages in %s? " entity-name))) ;;; (setq entity ;;; (if group ;;; (wl-folder-search-group-entity-by-name entity-name ;;; wl-folder-entity) ;;; entity-name)) ;;; (if (null force-check) ;;; (wl-folder-check-entity entity)) ;;; (wl-folder-drop-unsync-entity entity) ;;; (message "All unsync messages in %s are dropped!" entity-name))))) (defun wl-folder-write-current-folder () "Write message to current folder's newsgroup or mailing-list. Call `wl-summary-write-current-folder' with current folder name." (interactive) (unless (wl-folder-buffer-group-p) (wl-summary-write-current-folder (wl-folder-get-entity-from-buffer)))) (require 'wl) (defun wl-folder-mimic-kill-buffer () "Kill the current (Folder) buffer with query." (interactive) (let* ((default (buffer-name)) (bufname (wl-read-buffer "Kill buffer: " default)) wl-interactive-exit) (if (or (not bufname) (string-equal bufname "") (string-equal bufname (buffer-name))) (wl-exit) (kill-buffer bufname)))) (defun wl-folder-create-subr (folder) (let ((name (elmo-folder-name-internal folder))) (unless (elmo-folder-creatable-p folder) (error "Folder %s does not exist" name)) (unless (y-or-n-p (format "Folder %s does not exist, create it? " name)) (error "Folder %s is not created" name)) (message "") (setq wl-folder-entity-hashtb (wl-folder-create-entity-hashtb name wl-folder-entity-hashtb)) (unless (elmo-folder-create folder) (error "Create folder failed")))) (defun wl-folder-confirm-existence (folder &optional force) (if force (unless (elmo-folder-exists-p folder) (wl-folder-create-subr folder)) (unless (or (wl-folder-entity-exists-p (elmo-folder-name-internal folder)) (and (elmo-folder-msgdb-path folder) (file-exists-p (elmo-folder-msgdb-path folder))) (elmo-folder-exists-p folder)) (wl-folder-create-subr folder)))) (defun wl-folder-virtual () "Goto virtual folder." (interactive) (let ((entity (wl-folder-get-entity-from-buffer))) (if (wl-folder-buffer-group-p) (setq entity (concat "*" (mapconcat 'identity (wl-folder-get-entity-list (wl-folder-search-group-entity-by-name entity wl-folder-entity)) ",")))) (unless entity (error "No folder")) (wl-folder-goto-folder-subr (concat "/" (wl-read-search-condition wl-fldmgr-make-filter-default) "/" entity)))) (defun wl-folder-pick () (interactive) (save-excursion (let* ((condition (car (elmo-parse-search-condition (wl-read-search-condition wl-summary-pick-field-default)))) (entity (wl-folder-get-entity-from-buffer)) (folder-list (if (wl-folder-buffer-group-p) (wl-folder-get-entity-list (wl-folder-search-group-entity-by-name entity wl-folder-entity)) (list entity))) results ret) (while (car folder-list) (setq ret (elmo-folder-search (wl-folder-get-elmo-folder (car folder-list)) condition t)) (if ret (setq results (append results (list (cons (car folder-list) ret))))) (setq folder-list (cdr folder-list))) (if results (message "%s are picked." (mapconcat (lambda (res) (format "%s(%d)" (car res) (length (cdr res)))) results ",")) (message "No message was picked."))))) (defun wl-folder-jump-to-next-summary () (interactive) (when (wl-collect-summary) (if (get-buffer-window (car (wl-collect-summary))) (switch-to-buffer-other-window (car (wl-collect-summary)))) (wl-summary-next-buffer))) (defun wl-folder-jump-to-previous-summary () (interactive) (when (wl-collect-summary) (if (get-buffer-window (car (wl-collect-summary))) (switch-to-buffer-other-window (car (wl-collect-summary)))) (wl-summary-previous-buffer))) ;;; ;; Completion (defvar wl-folder-complete-folder-candidate nil) (defun wl-folder-complete-folder (string predicate flag) (cond ((or (string-match "^\\(/[^/]*/\\)\\(.*\\)$" string) ; filter (string-match "^\\(\*\\|\*.*,\\)\\([^,]*\\)$" string) ; multi (string-match "^\\(|[^|]*|:?\\)\\(.*\\)$" string) ;pipe-src (string-match "^\\(|\\)\\([^|]*\\)$" string)) ;pipe-dst (let* ((str1 (match-string 1 string)) (str2 (match-string 2 string)) (str2-comp (wl-folder-complete-folder str2 predicate flag))) (cond ((listp str2-comp) ; flag=t (mapcar (lambda (x) (concat str1 x)) str2-comp)) ((stringp str2-comp) (concat str1 str2-comp)) (t str2-comp)))) ((string-match "^\\(/\\)\\([^/]*\\)$" string) ; filter-condition (let* ((str1 (match-string 1 string)) (str2 (match-string 2 string)) (str2-comp (wl-folder-complete-filter-condition str2 predicate flag))) (cond ((listp str2-comp) ; flag=t (mapcar (lambda (x) (concat str1 x)) str2-comp)) ((stringp str2-comp) (concat str1 str2-comp)) (t str2-comp)))) (t (let ((candidate (or wl-folder-complete-folder-candidate (if (memq 'read-folder wl-use-folder-petname) (wl-folder-get-entity-with-petname) wl-folder-entity-hashtb)))) (if (not flag) (try-completion string candidate) (all-completions string candidate)))))) (defun wl-folder-complete-filter-condition (string predicate flag) (cond ((string-match "^\\(.*|\\|.*&\\|.*(\\)\\([^:]*\\)$" string) (let* ((str1 (match-string 1 string)) (str2 (match-string 2 string)) (str2-comp (wl-folder-complete-filter-condition str2 predicate flag))) (cond ((listp str2-comp) ; flag=t (mapcar (lambda (x) (concat str1 x)) str2-comp)) ((stringp str2-comp) (concat str1 str2-comp)) (t str2-comp)))) (t (let ((candidate (mapcar (lambda (x) (list (concat (downcase x) ":"))) (wl-search-condition-fields)))) (if (not flag) (try-completion string candidate) (all-completions string candidate)))))) ;; wl-e21.el (defvar wl-folder-internal-icon-list ;; alist of (image . icon-file) '((wl-folder-nntp-image . wl-nntp-folder-icon) (wl-folder-imap4-image . wl-imap-folder-icon) (wl-folder-pop3-image . wl-pop-folder-icon) (wl-folder-localdir-image . wl-localdir-folder-icon) (wl-folder-localnews-image . wl-localnews-folder-icon) (wl-folder-internal-image . wl-internal-folder-icon) (wl-folder-multi-image . wl-multi-folder-icon) (wl-folder-filter-image . wl-filter-folder-icon) (wl-folder-archive-image . wl-archive-folder-icon) (wl-folder-pipe-image . wl-pipe-folder-icon) (wl-folder-maildir-image . wl-maildir-folder-icon) (wl-folder-search-image . wl-search-folder-icon) (wl-folder-shimbun-image . wl-shimbun-folder-icon) (wl-folder-file-image . wl-file-folder-icon) (wl-folder-access-image . wl-access-folder-icon) (wl-folder-trash-empty-image . wl-empty-trash-folder-icon) (wl-folder-draft-image . wl-draft-folder-icon) (wl-folder-queue-image . wl-queue-folder-icon) (wl-folder-trash-image . wl-trash-folder-icon))) (defvar wl-folder-toolbar '([wl-folder-jump-to-current-entity wl-folder-jump-to-current-entity t "Enter Current Folder"] [wl-folder-next-entity wl-folder-next-entity t "Next Folder"] [wl-folder-prev-entity wl-folder-prev-entity t "Previous Folder"] [wl-folder-check-current-entity wl-folder-check-current-entity t "Check Current Folder"] [wl-folder-sync-current-entity wl-folder-sync-current-entity t "Sync Current Folder"] [wl-draft wl-draft t "Write a New Message"] [wl-folder-goto-draft-folder wl-folder-goto-draft-folder t "Go to Draft Folder"] [wl-folder-empty-trash wl-folder-empty-trash t "Empty Trash"] [wl-exit wl-exit t "Quit Wanderlust"]) "The Folder buffer toolbar.") (defun wl-e21-setup-folder-toolbar () (when (wl-e21-setup-toolbar wl-folder-toolbar) (wl-e21-make-toolbar-buttons wl-folder-mode-map wl-folder-toolbar))) (defvar wl-folder-toggle-icon-list '((wl-folder-opened-image . wl-opened-group-folder-icon) (wl-folder-closed-image . wl-closed-group-folder-icon))) (eval-when-compile (defsubst wl-e21-highlight-folder-group-line (start end icon _numbers) (let (image) (when (wl-e21-display-image-p) (let (overlay) (let ((overlays (overlays-in start end))) (while (and (setq overlay (pop overlays)) (not (overlay-get overlay 'wl-e21-icon))))) (unless overlay (setq overlay (make-overlay start end)) (overlay-put overlay 'wl-e21-icon t) (overlay-put overlay 'evaporate t)) (setq image (get icon 'image)) (unless image (let ((name (symbol-value (cdr (assq icon wl-folder-toggle-icon-list))))) (setq image (wl-e21-find-image `((:type xpm :file ,name :ascent center)))))) (overlay-put overlay 'display image))) (when (and wl-use-highlight-mouse-line (display-mouse-p)) (let ((inhibit-read-only t)) (put-text-property (if image (max (1- start) (line-beginning-position)) start) (line-end-position) 'mouse-face 'highlight))))) (defsubst wl-e21-highlight-folder-by-numbers (start _end text-face numbers) (when (display-color-p) (let ((inhibit-read-only t)) (if (and wl-highlight-folder-by-numbers numbers (nth 0 numbers) (nth 1 numbers) (re-search-forward "[-[:digit:]]+/[-[:digit:]]+/[-[:digit:]]+" (line-end-position) t)) (let* ((unsync (nth 0 numbers)) (unread (nth 1 numbers)) (face (cond ((and unsync (zerop unsync)) (if (and unread (zerop unread)) 'wl-highlight-folder-zero-face 'wl-highlight-folder-unread-face)) ((and unsync (>= unsync wl-folder-many-unsync-threshold)) 'wl-highlight-folder-many-face) (t 'wl-highlight-folder-few-face)))) (if (numberp wl-highlight-folder-by-numbers) (progn (put-text-property start (match-beginning 0) 'face text-face) (put-text-property (match-beginning 0) (match-end 0) 'face face)) (put-text-property start (match-end 0) 'face face))) (put-text-property start (line-end-position) 'face text-face)))))) (defun wl-highlight-folder-current-line (&optional numbers) (interactive) (save-excursion (beginning-of-line) (let (fld-name start end) (cond ;; opened folder group ((and (wl-folder-buffer-group-p) (looking-at wl-highlight-folder-opened-regexp)) (setq start (match-beginning 1) end (match-end 1)) (wl-e21-highlight-folder-group-line start end 'wl-folder-opened-image numbers) (wl-e21-highlight-folder-by-numbers start end 'wl-highlight-folder-opened-face numbers)) ;; closed folder group ((and (wl-folder-buffer-group-p) (looking-at wl-highlight-folder-closed-regexp)) (setq start (match-beginning 1) end (match-end 1)) (wl-e21-highlight-folder-group-line start end 'wl-folder-closed-image numbers) (wl-e21-highlight-folder-by-numbers start end 'wl-highlight-folder-closed-face numbers)) ;; basic folder ((and (setq fld-name (wl-folder-get-folder-name-by-id (get-text-property (point) 'wl-folder-entity-id))) (looking-at "[[:blank:]]+\\([^[:blank:]\n]+\\)")) (setq start (match-beginning 1) end (match-end 1)) (let (image) (when (wl-e21-display-image-p) (let (overlay) (let ((overlays (overlays-in start end))) (while (and (setq overlay (pop overlays)) (not (overlay-get overlay 'wl-e21-icon))))) (unless overlay (setq overlay (make-overlay start end)) (overlay-put overlay 'wl-e21-icon t) (overlay-put overlay 'evaporate t)) (let (type) (unless (get (caar wl-folder-internal-icon-list) 'image) (wl-folder-init-icons)) (setq image (cond ;; trash folder ((string= fld-name wl-trash-folder) (let ((num (nth 2 numbers))) ; number of messages (get (if (or (not num) (zerop num)) 'wl-folder-trash-empty-image 'wl-folder-trash-image) 'image))) ;; draft folder ((string= fld-name wl-draft-folder) (get 'wl-folder-draft-image 'image)) ;; queue folder ((string= fld-name wl-queue-folder) (get 'wl-folder-queue-image 'image)) ;; and one of many other folders ((setq type (or (elmo-folder-type fld-name) (elmo-folder-type-internal (elmo-make-folder fld-name)))) (get (intern (format "wl-folder-%s-image" type)) 'image))))) (overlay-put overlay 'before-string (propertize " " 'display image 'invisible t)))) (when (and wl-use-highlight-mouse-line (display-mouse-p)) (let ((inhibit-read-only t)) (put-text-property (if image (max (1- start) (line-beginning-position)) start) (line-end-position) 'mouse-face 'highlight)))) (when (display-color-p) (wl-e21-highlight-folder-by-numbers start end (if (looking-at (format "^[[:blank:]]*\\(?:%s\\|%s\\)" wl-folder-unsubscribe-mark wl-folder-removed-mark)) 'wl-highlight-folder-killed-face 'wl-highlight-folder-unknown-face) numbers))))))) (defun wl-folder-init-icons () (when (wl-e21-display-image-p) (let ((icons wl-folder-internal-icon-list) icon name image) (while (setq icon (pop icons)) (unless (get (car icon) 'image) (setq name (symbol-value (cdr icon)) image (wl-e21-find-image `((:type xpm :file ,name :ascent center)))) (when image (put (car icon) 'image image))))))) (defalias 'wl-setup-folder 'wl-e21-setup-folder-toolbar) (add-hook 'wl-folder-mode-hook 'wl-setup-folder) (add-hook 'wl-folder-mode-hook 'wl-folder-init-icons) ;; End of wl-e21.el (require 'product) (product-provide (provide 'wl-folder) (require 'wl-version)) ;;; wl-folder.el ends here wanderlust-wanderlust-769699d/wl/wl-highlight.el000066400000000000000000002014771406661363500217530ustar00rootroot00000000000000;;; wl-highlight.el --- Hilight modules for Wanderlust. -*- lexical-binding: t -*- ;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004 ;; Yuuichi Teranishi ;; Author: Yuuichi Teranishi ;; Keywords: mail, net news ;; This file is part of Wanderlust (Yet Another Message Interface on Emacsen). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'invisible) (require 'wl-vars) (provide 'wl-highlight) (defgroup wl-faces nil "Wanderlust, Faces." :prefix "wl-highlight-" :group 'wl-highlight :group 'wl) (defgroup wl-summary-faces nil "Wanderlust, Faces of summary buffer." :prefix "wl-highlight-" :group 'wl-highlight :group 'wl-summary) (defgroup wl-folder-faces nil "Wanderlust, Faces of folder buffer." :prefix "wl-highlight-" :group 'wl-highlight :group 'wl-folder) (defgroup wl-message-faces nil "Wanderlust, Faces of message buffer." :prefix "wl-highlight-" :group 'wl-highlight) ;; for message header and signature (defface wl-highlight-message-headers '((((type graphic) (background dark)) (:foreground "gray" :bold t)) (((type tty) (min-colors 16777216) (background dark)) (:foreground "gray" :bold t)) (((type tty) (min-colors 256) (background dark)) (:foreground "color-250" :bold t)) (((type tty) (min-colors 88) (background dark)) (:foreground "color-85" :bold t)) (((type tty) (background dark)) (:foreground "white" :bold t)) (((type graphic) (background light)) (:foreground "gray50" :bold t)) (((type tty) (min-colors 16777216) (background light)) (:foreground "gray50" :bold t)) (((type tty) (min-colors 16) (background light)) (:foreground "brightblack" :bold t)) (((type tty) (background light)) (:bold t))) "Face used for displaying header names." :group 'wl-message-faces :group 'wl-faces) (defface wl-highlight-message-header-contents '((((type graphic) (background dark)) (:foreground "LightSkyBlue" :bold t)) (((type tty) (min-colors 16777216) (background dark)) (:foreground "LightSkyBlue" :bold t)) (((type tty) (min-colors 256) (background dark)) (:foreground "color-117" :bold t)) (((type tty) (min-colors 88) (background dark)) (:foreground "color-43" :bold t)) (((type tty) (background dark)) (:foreground "cyan" :bold t)) (((type graphic) (background light)) (:foreground "purple" :bold t)) (((type tty) (min-colors 16777216) (background light)) (:foreground "purple" :bold t)) (((type tty) (min-colors 256) (background light)) (:foreground "color-129" :bold t)) (((type tty) (min-colors 88) (background light)) (:foreground "color-35" :bold t)) (((type tty) (background light)) (:foreground "magenta" :bold t))) "Face used for displaying header content." :group 'wl-message-faces :group 'wl-faces) (defface wl-highlight-message-important-header-contents '((((type graphic) (background dark)) (:foreground "yellow" :bold t)) (((type tty) (min-colors 16) (background dark)) (:foreground "brightyellow" :bold t)) (((type tty) (background dark)) (:foreground "yellow" :bold t)) (((type graphic) (background light)) (:foreground "brown" :bold t)) (((type tty) (min-colors 16777216) (background light)) (:foreground "brown" :bold t)) (((type tty) (min-colors 256) (background light)) (:foreground "color-124" :bold t)) (((type tty) (min-colors 88) (background light)) (:foreground "color-32" :bold t)) (((type tty) (background light)) (:foreground "red" :bold t))) "Face used for displaying contents of special headers." :group 'wl-message-faces :group 'wl-faces) (defface wl-highlight-message-important-header-contents2 '((((type graphic) (background dark)) (:foreground "orange" :bold t)) (((type tty) (min-colors 16777216) (background dark)) (:foreground "orange" :bold t)) (((type tty) (min-colors 256) (background dark)) (:foreground "color-214" :bold t)) (((type tty) (min-colors 88) (background dark)) (:foreground "color-68" :bold t)) (((type tty) (background dark)) (:foreground "yellow" :bold t)) (((type graphic) (background light)) (:foreground "DarkSlateBlue" :bold t)) (((type tty) (min-colors 16777216) (background light)) (:foreground "DarkSlateBlue" :bold t)) (((type tty) (min-colors 256) (background light)) (:foreground "color-60" :bold t)) (((type tty) (min-colors 88) (background light)) (:foreground "color-81" :bold t)) (((type tty) (background light)) (:foreground "blue" :bold t))) "Face used for displaying contents of special headers." :group 'wl-message-faces :group 'wl-faces) (defface wl-highlight-message-citation-header '((((type graphic) (background dark)) (:foreground "SkyBlue")) (((type tty) (min-colors 16777216) (background dark)) (:foreground "SkyBlue")) (((type tty) (min-colors 256) (background dark)) (:foreground "color-117")) (((type tty) (min-colors 88) (background dark)) (:foreground "color-43")) (((type tty) (background dark)) (:foreground "cyan")) (((type graphic) (background light)) (:foreground "DarkGreen")) (((type tty) (min-colors 16777216) (background light)) (:foreground "DarkGreen")) (((type tty) (min-colors 256) (background light)) (:foreground "color-22")) (((type tty) (min-colors 88) (background light)) (:foreground "color-20")) (((type tty) (background light)) (:foreground "black"))) "Face used for displaying header of quoted texts." :group 'wl-message-faces :group 'wl-faces) (defface wl-highlight-message-unimportant-header-contents '((((type graphic) (background dark)) (:foreground "GreenYellow" :bold t)) (((type tty) (min-colors 16777216) (background dark)) (:foreground "GreenYellow" :bold t)) (((type tty) (min-colors 256) (background dark)) (:foreground "color-154" :bold t)) (((type tty) (min-colors 88) (background dark)) (:foreground "color-154" :bold t)) (((type tty) (background dark)) (:foreground "green" :bold t)) (((type graphic) (background light)) (:foreground "DarkGreen" :bold t)) (((type tty) (min-colors 16777216) (background light)) (:foreground "DarkGreen" :bold t)) (((type tty) (min-colors 256) (background light)) (:foreground "color-22" :bold t)) (((type tty) (min-colors 88) (background light)) (:foreground "color-20" :bold t)) (((type tty) (background light)) (:foreground "black" :bold t))) "Face used for displaying contents of unimportant headers." :group 'wl-message-faces :group 'wl-faces) (defface wl-highlight-message-signature '((((type graphic) (background dark)) (:foreground "khaki")) (((type tty) (min-colors 16777216) (background dark)) (:foreground "khaki")) (((type tty) (min-colors 256) (background dark)) (:foreground "color-222")) (((type tty) (min-colors 88) (background dark)) (:foreground "color-77")) (((type tty) (background dark)) (:foreground "white")) (((type graphic) (background light)) (:foreground "DarkSlateBlue")) (((type tty) (min-colors 16777216) (background light)) (:foreground "DarkSlateBlue")) (((type tty) (min-colors 256) (background light)) (:foreground "color-60")) (((type tty) (min-colors 88) (background light)) (:foreground "color-81")) (((type tty) (background light)) (:foreground "blue"))) "Face used for displaying signature." :group 'wl-message-faces :group 'wl-faces) ;; for draft (defface wl-highlight-header-separator-face '((((type graphic)) (:foreground "Black" :background "DarkKhaki")) (((type tty) (min-colors 16777216)) (:foreground "Black" :background "DarkKhaki")) (((type tty) (min-colors 256)) (:foreground "black" :background "color-143")) (((type tty) (min-colors 88)) (:foreground "black" :background "color-57")) (((type tty) (background dark)) (:foreground "black" :background "yellow"))) "Face used for displaying header separator." :group 'wl-draft :group 'wl-faces) ;; important messages (defface wl-highlight-summary-flagged-face '((((type graphic) (background dark)) (:foreground "orange")) (((type tty) (min-colors 16777216) (background dark)) (:foreground "orange")) (((type tty) (min-colors 256) (background dark)) (:foreground "color-214")) (((type tty) (min-colors 88) (background dark)) (:foreground "color-68")) (((type tty) (background dark)) (:foreground "yellow")) (((type graphic) (background light)) (:foreground "purple")) (((type tty) (min-colors 16777216) (background light)) (:foreground "purple")) (((type tty) (min-colors 256) (background light)) (:foreground "color-129")) (((type tty) (min-colors 88) (background light)) (:foreground "color-35")) (((type tty) (background light)) (:foreground "magenta"))) "Face used for displaying flagged messages." :group 'wl-summary-faces :group 'wl-faces) (defface wl-highlight-summary-new-face '((((type graphic)) (:foreground "tomato")) (((type tty) (min-colors 16777216)) (:foreground "tomato")) (((type tty) (min-colors 256)) (:foreground "color-203")) (((type tty) (min-colors 88)) (:foreground "color-69")) (((type tty) (min-colors 16)) (:foreground "brightred")) (((type tty)) (:foreground "red"))) "Face used for displaying new messages." :group 'wl-summary-faces :group 'wl-faces) (defface wl-highlight-summary-killed-face '((((type graphic) (background dark)) (:foreground "gray")) (((type tty) (min-colors 16777216) (background dark)) (:foreground "gray")) (((type tty) (min-colors 256) (background dark)) (:foreground "color-250")) (((type tty) (min-colors 88) (background dark)) (:foreground "color-285")) (((type tty) (background dark)) (:foreground "white")) (((type graphic) (background light)) (:foreground "LightSlateGray")) (((type tty) (min-colors 16777216) (background light)) (:foreground "LightSlateGray")) (((type tty) (min-colors 256) (background light)) (:foreground "color-102")) (((type tty) (min-colors 88) (background light)) (:foreground "color-83")) (((type tty) (min-colors 16) (background light)) (:foreground "brightblack")) (((type tty) (background light)) (:foreground "cyan"))) "Face used for displaying killed messages." :group 'wl-summary-faces :group 'wl-faces) (defface wl-highlight-summary-displaying-face '((t (:underline t :bold t))) "Face used for displaying message." :group 'wl-summary-faces :group 'wl-faces) (defface wl-highlight-thread-indent-face '((((type graphic)) (:foreground "gray40")) (((type tty) (min-colors 16777216)) (:foreground "gray40")) (((type tty) (min-colors 256)) (:foreground "color-241")) (((type tty) (min-colors 88)) (:foreground "color-81")) (((type tty) (min-colors 16)) (:foreground "brightblack")) ;; (((type tty)) ;; (:foreground "black")) ) "Face used for displaying indented thread." :group 'wl-summary-faces :group 'wl-faces) ;; unimportant messages (defface wl-highlight-summary-unread-face '((((type graphic) (background dark)) (:foreground "LightSkyBlue")) (((type tty) (min-colors 16777216) (background dark)) (:foreground "LightSkyBlue")) (((type tty) (min-colors 256) (background dark)) (:foreground "color-117")) (((type tty) (min-colors 88) (background dark)) (:foreground "color-43")) (((type tty) (background dark)) (:foreground "cyan")) (((type graphic) (background light)) (:foreground "RoyalBlue")) (((type tty) (min-colors 16777216) (background light)) (:foreground "RoyalBlue")) (((type tty) (min-colors 256) (background light)) (:foreground "color-62")) (((type tty) (min-colors 16) (background light)) (:foreground "brightblue")) (((type tty) (background light)) (:foreground "cyan"))) "Face used for displaying unread messages." :group 'wl-summary-faces :group 'wl-faces) (defface wl-highlight-summary-disposed-face '((((type graphic) (background dark)) (:foreground "gray")) (((type tty) (min-colors 16777216) (background dark)) (:foreground "gray")) (((type tty) (min-colors 256) (background dark)) (:foreground "color-250")) (((type tty) (min-colors 88) (background dark)) (:foreground "color-285")) (((type tty) (background dark)) (:foreground "white")) (((type graphic) (background light)) (:foreground "DarkKhaki")) (((type tty) (min-colors 16777216) (background light)) (:foreground "DarkKhaki")) (((type tty) (min-colors 256) (background light)) (:foreground "color-143")) (((type tty) (min-colors 88) (background light)) (:foreground "color-57")) (((type tty) (background light)) (:foreground "yellow"))) "Face used for displaying messages mark as disposed." :group 'wl-summary-faces :group 'wl-faces) (defface wl-highlight-summary-deleted-face '((((type graphic) (background dark)) (:foreground "SteelBlue")) (((type tty) (min-colors 16777216) (background dark)) (:foreground "SteelBlue")) (((type tty) (min-colors 256) (background dark)) (:foreground "color-67")) (((type tty) (min-colors 88) (background dark)) (:foreground "color-38")) (((type tty) (min-colors 16) (background dark)) (:foreground "brightblack")) (((type tty) (background dark)) (:foreground "cyan")) (((type graphic) (background light)) (:foreground "RoyalBlue4")) (((type tty) (min-colors 16777216) (background light)) (:foreground "RoyalBlue4")) (((type tty) (min-colors 256) (background light)) (:foreground "color-24")) (((type tty) (min-colors 88) (background light)) (:foreground "color-17")) (((type tty) (min-colors 16) (background light)) (:foreground "brightblack")) (((type tty) (background dark)) (:foreground "blue"))) "Face used for displaying messages mark as deleted." :group 'wl-summary-faces :group 'wl-faces) (defface wl-highlight-summary-prefetch-face '((((type graphic) (background dark)) (:foreground "DeepSkyBlue")) (((type tty) (min-colors 16777216) (background dark)) (:foreground "DeepSkyBlue")) (((type tty) (min-colors 256) (background dark)) (:foreground "color-39")) (((type tty) (min-colors 88) (background dark)) (:foreground "color-27")) (((type tty) (background dark)) (:foreground "cyan")) (((type graphic) (background light)) (:foreground "brown")) (((type tty) (min-colors 16777216) (background light)) (:foreground "brown")) (((type tty) (min-colors 256) (background light)) (:foreground "color-124")) (((type tty) (min-colors 88) (background light)) (:foreground "color-32")) (((type tty) (background light)) (:foreground "red"))) "Face used for displaying messages mark as deleted." :group 'wl-summary-faces :group 'wl-faces) (defface wl-highlight-summary-resend-face '((((type graphic)) (:foreground "orange3")) (((type tty) (min-colors 16777216)) (:foreground "orange3")) (((type tty) (min-colors 256)) (:foreground "color-172")) (((type tty) (min-colors 88)) (:foreground "color-52")) (((type tty)) (:foreground "yellow"))) "Face used for displaying messages mark as resend." :group 'wl-summary-faces :group 'wl-faces) (defface wl-highlight-summary-refiled-face '((((type graphic) (background dark)) (:foreground "blue")) (((type tty) (min-colors 16777216) (background dark)) (:foreground "blue")) (((type tty) (min-colors 256) (background dark)) (:foreground "color-21")) (((type tty) (min-colors 88) (background dark)) (:foreground "color-19")) (((type tty) (min-colors 16) (background dark)) (:foreground "brightblue")) (((type tty) (background dark)) ;; "blue" is too dark. (:foreground "magenta")) (((type graphic) (background light)) (:foreground "firebrick")) (((type tty) (min-colors 16777216) (background light)) (:foreground "firebrick")) (((type tty) (min-colors 256) (background light)) (:foreground "color-124")) (((type tty) (min-colors 88) (background light)) (:foreground "color-48")) (((type tty) (background light)) (:foreground "red"))) "Face used for displaying messages mark as refiled." :group 'wl-summary-faces :group 'wl-faces) (defface wl-highlight-summary-copied-face '((((type graphic) (background dark)) (:foreground "cyan")) (((type tty) (min-colors 16) (background dark)) (:foreground "brightcyan")) (((type tty) (background dark)) (:foreground "cyan")) (((type graphic) (background light)) (:foreground "blue")) (((type tty) (min-colors 16777216) (background light)) (:foreground "blue")) (((type tty) (min-colors 256) (background light)) (:foreground "color-21")) (((type tty) (min-colors 88) (background light)) (:foreground "color-19")) (((type tty) (background light)) (:foreground "blue"))) "Face used for displaying messages mark as copied." :group 'wl-summary-faces :group 'wl-faces) ;; answered (defface wl-highlight-summary-answered-face '((((type graphic) (background dark)) (:foreground "khaki")) (((type tty) (min-colors 16777216) (background dark)) (:foreground "khaki")) (((type tty) (min-colors 256) (background dark)) (:foreground "color-222")) (((type tty) (min-colors 88) (background dark)) (:foreground "color-73")) (((type tty) (background dark)) (:foreground "white")) (((type graphic) (background light)) (:foreground "khaki4")) (((type tty) (min-colors 16777216) (background light)) (:foreground "khaki4")) (((type tty) (min-colors 256) (background light)) (:foreground "color-101")) (((type tty) (min-colors 88) (background light)) (:foreground "color-82")) (((type tty) (background light)) (:foreground "yellow"))) "Face used for displaying answered messages." :group 'wl-summary-faces :group 'wl-faces) ;; forwarded (defface wl-highlight-summary-forwarded-face '((((type graphic) (background dark)) (:foreground "DarkOliveGreen2")) (((type tty) (min-colors 16777216) (background dark)) (:foreground "DarkOliveGreen2")) (((type tty) (min-colors 256) (background dark)) (:foreground "color-155")) (((type tty) (min-colors 88) (background dark)) (:foreground "color-61")) (((type tty) (background dark)) (:foreground "green")) (((type graphic) (background light)) (:foreground "DarkOliveGreen4")) (((type tty) (min-colors 16777216) (background light)) (:foreground "DarkOliveGreen4")) (((type tty) (min-colors 256) (background light)) (:foreground "color-65")) (((type tty) (min-colors 88) (background light)) (:foreground "color-81")) (((type tty) (background light)) (:foreground "yellow"))) "Face used for displaying forwarded messages." :group 'wl-summary-faces :group 'wl-faces) (defface wl-summary-persistent-mark-face '((((type graphic) (background dark)) (:foreground "SeaGreen4")) (((type tty) (min-colors 16777216) (background dark)) (:foreground "SeaGreen4")) (((type tty) (min-colors 256) (background dark)) (:foreground "color-29")) (((type tty) (min-colors 88) (background dark)) (:foreground "color-81")) (((type tty) (min-colors 16) (background dark)) (:foreground "brightblack")) (((type tty) (background dark)) (:foreground "green")) (((type graphic) (background light)) (:foreground "SeaGreen1")) (((type tty) (min-colors 16777216) (background light)) (:foreground "SeaGreen1")) (((type tty) (min-colors 256) (background light)) (:foreground "color-85")) (((type tty) (min-colors 88) (background light)) (:foreground "color-45")) (((type tty) (background light)) (:foreground "cyan"))) "Dafault face used for displaying messages with persistent mark." :group 'wl-summary-faces :group 'wl-faces) ;; obsolete. (defface wl-highlight-summary-temp-face '((((type graphic)) (:foreground "HotPink1")) (((type tty) (min-colors 16777216)) (:foreground "HotPink1")) (((type tty) (min-colors 256)) (:foreground "color-205")) (((type tty) (min-colors 88)) (:foreground "color-70")) (((type tty)) (:foreground "magenta"))) "Face used for displaying messages mark as temp." :group 'wl-summary-faces :group 'wl-faces) (defface wl-highlight-summary-target-face '((((type graphic)) (:foreground "HotPink1")) (((type tty) (min-colors 16777216)) (:foreground "HotPink1")) (((type tty) (min-colors 256)) (:foreground "color-205")) (((type tty) (min-colors 88)) (:foreground "color-70")) (((type tty)) (:foreground "magenta"))) "Face used for displaying messages mark as target." :group 'wl-summary-faces :group 'wl-faces) (defface wl-highlight-summary-low-read-face '((((type graphic) (background dark)) (:foreground "PaleGreen" :italic t)) (((type tty) (min-colors 16777216) (background dark)) (:foreground "PaleGreen" :italic t)) (((type tty) (min-colors 256) (background dark)) (:foreground "color-120" :italic t)) (((type tty) (min-colors 88) (background dark)) (:foreground "color-45" :italic t)) (((type tty) (background dark)) (:foreground "green" :italic t)) (((type graphic) (background light)) (:foreground "Green3" :italic t)) (((type tty) (min-colors 16777216) (background light)) (:foreground "Green3" :italic t)) (((type tty) (background light)) (:foreground "green" :italic t))) "Face used for displaying low interest read messages." :group 'wl-summary-faces :group 'wl-faces) (defface wl-highlight-summary-high-read-face '((((type graphic) (background dark)) (:foreground "PaleGreen" :bold t)) (((type tty) (min-colors 16777216) (background dark)) (:foreground "PaleGreen" :bold t)) (((type tty) (min-colors 256) (background dark)) (:foreground "color-120" :bold t)) (((type tty) (min-colors 88) (background dark)) (:foreground "color-45" :bold t)) (((type tty) (background dark)) (:foreground "green" :bold t)) (((type graphic) (background light)) (:foreground "SeaGreen" :bold t)) (((type tty) (min-colors 16777216) (background light)) (:foreground "SeaGreen" :bold t)) (((type tty) (min-colors 256) (background light)) (:foreground "color-29" :bold t)) (((type tty) (min-colors 88) (background light)) (:foreground "color-81" :bold t)) (((type tty) (background light)) (:foreground "green" :bold t))) "Face used for displaying high interest read messages." :group 'wl-summary-faces :group 'wl-faces) (defface wl-highlight-summary-low-unread-face '((((type graphic) (background dark)) (:foreground "LightSkyBlue" :italic t)) (((type tty) (min-colors 16777216) (background dark)) (:foreground "LightSkyBlue" :italic t)) (((type tty) (min-colors 256) (background dark)) (:foreground "color-117" :italic t)) (((type tty) (min-colors 88) (background dark)) (:foreground "color-43" :italic t)) (((type tty) (background dark)) (:foreground "cyan" :italic t)) (((type graphic) (background light)) (:foreground "RoyalBlue" :italic t)) (((type tty) (min-colors 16777216) (background light)) (:foreground "RoyalBlue" :italic t)) (((type tty) (min-colors 256) (background light)) (:foreground "color-62" :italic t)) (((type tty) (min-colors 16) (background light)) (:foreground "brightblue" :italic t)) (((type tty) (background light)) (:foreground "cyan" :italic t))) "Face used for displaying low interest unread messages." :group 'wl-summary-faces :group 'wl-faces) (defface wl-highlight-summary-high-unread-face '((((type graphic)) (:foreground "tomato" :bold t)) (((type tty) (min-colors 16777216)) (:foreground "tomato" :bold t)) (((type tty) (min-colors 256)) (:foreground "color-203" :bold t)) (((type tty) (min-colors 88)) (:foreground "color-69" :bold t)) (((type tty) (min-colors 16)) (:foreground "brightred" :bold t)) (((type tty)) (:foreground "red" :bold t))) "Face used for displaying high interest unread messages." :group 'wl-summary-faces :group 'wl-faces) ;; ordinary messages (defface wl-highlight-summary-thread-top-face '((((type graphic) (background dark)) (:foreground "GreenYellow")) (((type tty) (min-colors 16777216) (background dark)) (:foreground "GreenYellow")) (((type tty) (min-colors 256) (background dark)) (:foreground "color-154")) (((type tty) (min-colors 88) (background dark)) (:foreground "color-60")) (((type tty) (background dark)) (:foreground "green")) (((type graphic) (background light)) (:foreground "green4")) (((type tty) (min-colors 16777216) (background light)) (:foreground "green4")) (((type tty) (min-colors 256) (background light)) (:foreground "color-28")) (((type tty) (min-colors 88) (background light)) (:foreground "color-20")) (((type tty) (background light)) (:foreground "green"))) "Face used for displaying top thread message." :group 'wl-summary-faces :group 'wl-faces) (defface wl-highlight-summary-normal-face '((((type graphic) (background dark)) (:foreground "PaleGreen")) (((type tty) (min-colors 16777216) (background dark)) (:foreground "PaleGreen")) (((type tty) (min-colors 256) (background dark)) (:foreground "color-120")) (((type tty) (min-colors 88) (background dark)) (:foreground "color-45")) (((type tty) (background dark)) (:foreground "white")) (((type graphic) (background light)) (:foreground "SeaGreen")) (((type tty) (min-colors 16777216) (background light)) (:foreground "SeaGreen")) (((type tty) (min-colors 256) (background light)) (:foreground "color-29")) (((type tty) (min-colors 88) (background light)) (:foreground "color-81")) (((type tty) (background light)) (:foreground "green"))) "Face used for displaying normal message." :group 'wl-summary-faces :group 'wl-faces) ;; folder (defface wl-highlight-folder-unknown-face '((((type graphic) (background dark)) (:foreground "pink")) (((type tty) (min-colors 16777216) (background dark)) (:foreground "pink")) (((type tty) (min-colors 256) (background dark)) (:foreground "color-218")) (((type tty) (min-colors 88) (background dark)) (:foreground "color-74")) (((type tty) (background dark)) (:foreground "white")) (((type graphic) (background light)) (:foreground "RoyalBlue")) (((type tty) (min-colors 16777216) (background light)) (:foreground "RoyalBlue")) (((type tty) (min-colors 256) (background light)) (:foreground "color-62")) (((type tty) (min-colors 16) (background light)) (:foreground "brightblue")) (((type tty) (background light)) (:foreground "cyan"))) "Face used for displaying unread folder." :group 'wl-folder-faces :group 'wl-faces) (defface wl-highlight-folder-killed-face '((((type graphic)) (:foreground "gray50")) (((type tty) (min-colors 16777216)) (:foreground "gray50")) (((type tty) (min-colors 16) (background dark)) (:foreground "brightblack"))) "Face used for displaying killed folder." :group 'wl-folder-faces :group 'wl-faces) (defface wl-highlight-folder-zero-face '((((type graphic) (background dark)) (:foreground "SkyBlue")) (((type tty) (min-colors 16777216) (background dark)) (:foreground "SkyBlue")) (((type tty) (min-colors 256) (background dark)) (:foreground "color-116")) (((type tty) (min-colors 88) (background dark)) (:foreground "color-43")) (((type tty) (background dark)) (:foreground "white")) (((type graphic) (background light)) (:foreground "BlueViolet")) (((type tty) (min-colors 16777216) (background light)) (:foreground "BlueViolet")) (((type tty) (min-colors 256) (background light)) (:foreground "color-92")) (((type tty) (min-colors 88) (background light)) (:foreground "color-34")) (((type tty) (min-colors 16) (background light)) (:foreground "brightblue")) (((type tty) (background light)) (:foreground "magenta"))) "Face used for displaying folder needs no sync." :group 'wl-folder-faces :group 'wl-faces) (defface wl-highlight-folder-few-face '((((type graphic) (background dark)) (:foreground "orange")) (((type tty) (min-colors 16777216) (background dark)) (:foreground "orange")) (((type tty) (min-colors 256) (background dark)) (:foreground "color-214")) (((type tty) (min-colors 88) (background dark)) (:foreground "color-68")) (((type tty) (background dark)) (:foreground "yellow")) (((type graphic) (background light)) (:foreground "OrangeRed3")) (((type tty) (min-colors 16777216) (background light)) (:foreground "OrangeRed3")) (((type tty) (min-colors 256) (background light)) (:foreground "color-166")) (((type tty) (background light)) (:foreground "red"))) "Face used for displaying folder contains few unsync messages." :group 'wl-folder-faces :group 'wl-faces) (defface wl-highlight-folder-many-face '((((type graphic) (background dark)) (:foreground "HotPink1")) (((type tty) (min-colors 16777216) (background dark)) (:foreground "HotPink1")) (((type tty) (min-colors 256) (background dark)) (:foreground "color-205")) (((type tty) (min-colors 88) (background dark)) (:foreground "color-70")) (((type tty) (background dark)) (:foreground "magenta")) (((type graphic) (background light)) (:foreground "tomato")) (((type tty) (min-colors 16777216) (background light)) (:foreground "tomato")) (((type tty) (min-colors 256) (background light)) (:foreground "color-203")) (((type tty) (min-colors 88) (background light)) (:foreground "color-69")) (((type tty) (min-colors 16) (background light)) (:foreground "brightred")) (((type tty) (background light)) (:foreground "red"))) "Face used for displaying folder contains many unsync messages." :group 'wl-folder-faces :group 'wl-faces) (defface wl-highlight-folder-unread-face '((((type graphic) (background dark)) (:foreground "gold")) (((type tty) (min-colors 16777216) (background dark)) (:foreground "gold")) (((type tty) (min-colors 256) (background dark)) (:foreground "color-220")) (((type tty) (min-colors 88) (background dark)) (:foreground "color-72")) (((type tty) (min-colors 16) (background dark)) (:foreground "brightyellow")) (((type tty) (background dark)) (:foreground "yellow")) (((type graphic) (background light)) (:foreground "MediumVioletRed")) (((type tty) (min-colors 16777216) (background light)) (:foreground "MediumVioletRed")) (((type tty) (min-colors 256) (background light)) (:foreground "color-162")) (((type tty) (min-colors 88) (background light)) (:foreground "color-49")) (((type tty) (background light)) (:foreground "magenta"))) "Face used for displaying unread folder." :group 'wl-folder-faces :group 'wl-faces) (defface wl-highlight-folder-opened-face '((((type graphic) (background dark)) (:foreground "PaleGreen")) (((type tty) (min-colors 16777216) (background dark)) (:foreground "PaleGreen")) (((type tty) (min-colors 256) (background dark)) (:foreground "color-120")) (((type tty) (min-colors 88) (background dark)) (:foreground "color-45")) (((type tty) (background dark)) (:foreground "green")) (((type graphic) (background light)) (:foreground "ForestGreen")) (((type tty) (min-colors 16777216) (background light)) (:foreground "ForestGreen")) (((type tty) (min-colors 256) (background light)) (:foreground "color-28")) (((type tty) (min-colors 88) (background light)) (:foreground "color-20")) (((type tty) (background light)) (:foreground "green"))) "Face used for displaying opened group folder." :group 'wl-folder-faces :group 'wl-faces) (defface wl-highlight-folder-closed-face '((((type graphic) (background dark)) (:foreground "GreenYellow")) (((type tty) (min-colors 16777216) (background dark)) (:foreground "GreenYellow")) (((type tty) (min-colors 256) (background dark)) (:foreground "color-154")) (((type tty) (min-colors 88) (background dark)) (:foreground "color-60")) (((type tty) (background dark)) (:foreground "green")) (((type graphic) (background light)) (:foreground "DarkOliveGreen4")) (((type tty) (min-colors 16777216) (background light)) (:foreground "DarkOliveGreen4")) (((type tty) (min-colors 256) (background light)) (:foreground "color-65")) (((type tty) (min-colors 88) (background light)) (:foreground "color-81")) (((type tty) (background light)) (:foreground "yellow"))) "Face used for displaying closed group folder." :group 'wl-folder-faces :group 'wl-faces) (defface wl-highlight-folder-path-face '((t (:bold t :underline t))) "Face used for displaying path." :group 'wl-folder-faces :group 'wl-faces) (defface wl-highlight-demo-face '((((type graphic) (background dark)) (:foreground "#d9ffd9" :background "#004400")) (((type tty) (min-colors 16777216) (background dark)) (:foreground "#d9ffd9" :background "#004400")) (((type tty) (min-colors 256) (background dark)) (:foreground "color-194" :background "color-22")) (((type tty) (min-colors 88) (background dark)) (:foreground "color-62" :background "color-16")) (((type tty) (background dark)) (:foreground "white" :background "green")) (((type graphic) (background light)) (:foreground "#006600" :background "#d9ffd9")) (((type tty) (min-colors 16777216) (background light)) (:foreground "#006600" :background "#d9ffd9")) (((type tty) (min-colors 256) (background light)) (:foreground "color-22" :background "color-194")) (((type tty) (min-colors 88) (background light)) (:foreground "color-20" :background "color-62")) (((type tty) (background light)) (:foreground "black" :background "white"))) "Face used for displaying demo." :group 'wl-faces) (defface wl-highlight-logo-face '((((type graphic) (background dark)) (:foreground "SkyBlue" :background "#004400")) (((type tty) (min-colors 16777216) (background dark)) (:foreground "SkyBlue" :background "#004400")) (((type tty) (min-colors 256) (background dark)) (:foreground "color-116" :background "color-22")) (((type tty) (min-colors 88) (background dark)) (:foreground "color-43" :background "color-16")) (((type tty) (background dark)) (:foreground "cyan" :background "black")) (((type graphic) (background light)) (:foreground "SteelBlue" :background "#d9ffd9")) (((type tty) (min-colors 16777216) (background light)) (:foreground "SteelBlue" :background "#d9ffd9")) (((type tty) (min-colors 256) (background light)) (:foreground "color-67" :background "color-194")) (((type tty) (min-colors 88) (background light)) (:foreground "color-38" :background "color-62")) (((type tty) (background light)) (:foreground "cyan" :background "white"))) "Face used for displaying demo." :group 'wl-faces) (defface wl-highlight-action-argument-face '((((type graphic) (background dark)) (:foreground "pink")) (((type tty) (min-colors 16777216) (background dark)) (:foreground "pink")) (((type tty) (min-colors 256) (background dark)) (:foreground "color-218")) (((type tty) (min-colors 88) (background dark)) (:foreground "color-74")) (((type tty) (background dark)) (:foreground "magenta")) (((type graphic) (background light)) (:foreground "red")) (((type tty) (min-colors 16) (background light)) (:foreground "brightred")) (((type tty) (background light)) (:foreground "red"))) "Face used for displaying action argument." :group 'wl-summary-faces :group 'wl-faces) ;; cited face (defface wl-highlight-message-cited-text-1 '((((type graphic) (background dark)) (:foreground "HotPink1")) (((type tty) (min-colors 16777216) (background dark)) (:foreground "HotPink1")) (((type tty) (min-colors 256) (background dark)) (:foreground "color-205")) (((type tty) (min-colors 88) (background dark)) (:foreground "color-70")) (((type tty) (background dark)) (:foreground "magenta")) (((type graphic) (background light)) (:foreground "ForestGreen")) (((type tty) (min-colors 16777216) (background light)) (:foreground "ForestGreen")) (((type tty) (min-colors 256) (background light)) (:foreground "color-28")) (((type tty) (min-colors 88) (background light)) (:foreground "color-20")) (((type tty) (background light)) (:foreground "green"))) "Face used for displaying quoted text from other messages." :group 'wl-message-faces :group 'wl-faces) (defface wl-highlight-message-cited-text-2 '((((type graphic)) (:foreground "violet")) (((type tty) (min-colors 16777216)) (:foreground "violet")) (((type tty) (min-colors 256)) (:foreground "color-213")) (((type tty) (min-colors 88)) (:foreground "color-71")) (((type tty)) (:foreground "red")) ) "Face used for displaying quoted text from other messages." :group 'wl-message-faces :group 'wl-faces) (defface wl-highlight-message-cited-text-3 '((((type graphic)) (:foreground "orchid3")) (((type tty) (min-colors 16777216)) (:foreground "orchid3")) (((type tty) (min-colors 256)) (:foreground "color-170")) (((type tty) (min-colors 88)) (:foreground "color-54")) (((type tty)) (:foreground "magenta"))) "Face used for displaying quoted text from other messages." :group 'wl-message-faces :group 'wl-faces) (defface wl-highlight-message-cited-text-4 '((((type graphic)) (:foreground "purple1")) (((type tty) (min-colors 16777216)) (:foreground "purple1")) (((type tty) (min-colors 256)) (:foreground "color-99")) (((type tty) (min-colors 88)) (:foreground "color-35")) (((type tty) (min-colors 16)) (:foreground "brightblue")) (((type tty)) (:foreground "cyan"))) "Face used for displaying quoted text from other messages." :group 'wl-message-faces :group 'wl-faces) (defface wl-highlight-message-cited-text-5 '((((type graphic)) (:foreground "MediumPurple1")) (((type tty) (min-colors 16777216)) (:foreground "MediumPurple1")) (((type tty) (min-colors 256)) (:foreground "color-141")) (((type tty) (min-colors 88)) (:foreground "color-39")) (((type tty) (min-colors 16)) (:foreground "brightblue")) ;; (((type tty)) ;; (:foreground "white")) ) "Face used for displaying quoted text from other messages." :group 'wl-message-faces :group 'wl-faces) (defface wl-highlight-message-cited-text-6 '((((type graphic)) (:foreground "PaleVioletRed")) (((type tty) (min-colors 16777216)) (:foreground "PaleVioletRed")) (((type tty) (min-colors 256)) (:foreground "color-168")) (((type tty)) (:foreground "magenta"))) "Face used for displaying quoted text from other messages." :group 'wl-message-faces :group 'wl-faces) (defface wl-highlight-message-cited-text-7 '((((type graphic)) (:foreground "LightPink")) (((type tty) (min-colors 16777216)) (:foreground "LightPink")) (((type tty) (min-colors 256)) (:foreground "color-217")) (((type tty) (min-colors 88)) (:foreground "color-74")) ;; (((type tty)) ;; (:foreground "white")) ) "Face used for displaying quoted text from other messages." :group 'wl-message-faces :group 'wl-faces) (defface wl-highlight-message-cited-text-8 '((((type graphic)) (:foreground "salmon")) (((type tty) (min-colors 16777216)) (:foreground "salmon")) (((type tty) (min-colors 256)) (:foreground "color-209")) (((type tty) (min-colors 88)) (:foreground "color-69")) (((type tty)) (:foreground "magenta"))) "Face used for displaying quoted text from other messages." :group 'wl-message-faces :group 'wl-faces) (defface wl-highlight-message-cited-text-9 '((((type graphic)) (:foreground "SandyBrown")) (((type tty) (min-colors 16777216)) (:foreground "SandyBrown")) (((type tty) (min-colors 256)) (:foreground "color-215")) (((type tty) (min-colors 88)) (:foreground "color-69")) (((type tty)) (:foreground "yellow"))) "Face used for displaying quoted text from other messages." :group 'wl-message-faces :group 'wl-faces) (defface wl-highlight-message-cited-text-10 '((((type graphic)) (:foreground "wheat")) (((type tty) (min-colors 16777216)) (:foreground "wheat")) (((type tty) (min-colors 256)) (:foreground "color-223")) (((type tty) (min-colors 88)) (:foreground "color-74")) ;; (((type tty)) ;; (:foreground "white")) ) "Face used for displaying quoted text from other messages." :group 'wl-message-faces :group 'wl-faces) (defface wl-message-header-narrowing-face '((((type graphic) (background dark)) (:foreground "white" :background "darkgoldenrod")) (((type tty) (min-colors 16777216) (background dark)) (:foreground "white" :background "darkgoldenrod")) (((type tty) (min-colors 256) (background dark)) (:foreground "brightwhite" :background "color-136")) (((type tty) (min-colors 88) (background dark)) (:foreground "brightwhite" :background "color-52")) (((type tty) (min-colors 16) (background dark)) (:foreground "brightwhite" :background "yellow")) (((type tty) (background dark)) (:foreground "cyan" :background "yellow")) (((type graphic) (background light)) (:foreground "black" :background "darkkhaki")) (((type tty) (min-colors 16777216) (background light)) (:foreground "black" :background "darkkhaki")) (((type tty) (min-colors 256) (background light)) (:foreground "black" :background "color-143")) (((type tty) (min-colors 88) (background light)) (:foreground "black" :background "color-57")) (((type tty) (background light)) (:foreground "black" :background "yellow"))) "Face used for header narrowing for the message." :group 'wl-message-faces :group 'wl-faces) (defvar wl-highlight-folder-opened-regexp "^ *\\(\\[\\-\\]\\)") (defvar wl-highlight-folder-closed-regexp "^ *\\(\\[\\+\\]\\)") (defvar wl-highlight-folder-leaf-regexp "[ ]*\\([-%\\+]\\)\\(.*\\):.*$") (defvar wl-highlight-citation-face-list '(wl-highlight-message-cited-text-1 wl-highlight-message-cited-text-2 wl-highlight-message-cited-text-3 wl-highlight-message-cited-text-4 wl-highlight-message-cited-text-5 wl-highlight-message-cited-text-6 wl-highlight-message-cited-text-7 wl-highlight-message-cited-text-8 wl-highlight-message-cited-text-9 wl-highlight-message-cited-text-10)) (defun wl-delete-all-overlays () "Delete all momentary overlays." (let ((overlays (overlays-in (point-min) (point-max))) overlay) (while (setq overlay (car overlays)) (if (overlay-get overlay 'wl-momentary-overlay) (delete-overlay overlay)) (setq overlays (cdr overlays))))) (defun wl-highlight-summary-displaying () (interactive) (wl-delete-all-overlays) (let (bol eol ov) (save-excursion (end-of-line) (setq eol (point)) (beginning-of-line) (setq bol (point)) (setq ov (make-overlay bol eol)) (overlay-put ov 'face 'wl-highlight-summary-displaying-face) (overlay-put ov 'evaporate t) (overlay-put ov 'wl-momentary-overlay t)))) (defun wl-highlight-folder-group-line (numbers) (end-of-line) (let ((eol (point)) bol) (beginning-of-line) (setq bol (point)) (let ((text-face (cond ((looking-at wl-highlight-folder-opened-regexp) 'wl-highlight-folder-opened-face) ((looking-at wl-highlight-folder-closed-regexp) 'wl-highlight-folder-closed-face)))) (if (and wl-highlight-folder-by-numbers (re-search-forward "[0-9-]+/[0-9-]+/[0-9-]+" eol t)) (let* ((unsync (nth 0 numbers)) (unread (nth 1 numbers)) (face (cond ((and unsync (zerop unsync)) (if (and unread (> unread 0)) 'wl-highlight-folder-unread-face 'wl-highlight-folder-zero-face)) ((and unsync (>= unsync wl-folder-many-unsync-threshold)) 'wl-highlight-folder-many-face) (t 'wl-highlight-folder-few-face)))) (if (numberp wl-highlight-folder-by-numbers) (progn (put-text-property bol (match-beginning 0) 'face text-face) (put-text-property (match-beginning 0) (match-end 0) 'face face)) ;; Remove previous face. (put-text-property bol (match-end 0) 'face nil) (put-text-property bol (match-end 0) 'face face))) (put-text-property bol eol 'face text-face))))) (defsubst wl-highlight-get-face-by-name (format &rest args) (let ((face (intern (apply #'format format args)))) (and (facep face) face))) (defsubst wl-highlight-summary-line-face-spec (status temp-mark indent) "Return a cons cell of (face . argument)." (or (let (action) (and (setq action (assoc temp-mark wl-summary-mark-action-list)) (cons (nth 5 action) (nth 2 action)))) (let ((flags (elmo-message-status-flags status))) (cond ((and (string= temp-mark wl-summary-score-over-mark) (or (memq 'new flags) (memq 'unread flags))) '(wl-highlight-summary-high-unread-face)) ((and (string= temp-mark wl-summary-score-below-mark) (or (memq 'new flags) (memq 'unread flags))) '(wl-highlight-summary-low-unread-face)) ((let ((priorities wl-summary-persistent-mark-priority-list) (fl wl-summary-flag-alist) result global-flags) (while (and (null result) priorities) (cond ((eq (car priorities) 'killed) (when (elmo-message-status-killed-p status) (setq result '(wl-highlight-summary-killed-face)))) ((eq (car priorities) 'flag) (when (setq global-flags (elmo-get-global-flags flags 'ignore-preserved)) (while fl (when (memq (car (car fl)) global-flags) (setq result (list (or (wl-highlight-get-face-by-name "wl-highlight-summary-%s-flag-face" (car (car fl))) 'wl-highlight-summary-flagged-face)) fl nil)) (setq fl (cdr fl))) (unless result (setq result (list 'wl-highlight-summary-flagged-face))))) ((memq (car priorities) flags) (setq result (list (or (wl-highlight-get-face-by-name "wl-highlight-summary-%s-face" (car priorities)) 'wl-summary-persistent-mark-face))))) (setq priorities (cdr priorities))) result)) ((string= temp-mark wl-summary-score-below-mark) '(wl-highlight-summary-low-read-face)) ((string= temp-mark wl-summary-score-over-mark) '(wl-highlight-summary-high-read-face)) (t (if indent '(wl-highlight-summary-normal-face) '(wl-highlight-summary-thread-top-face))))))) (autoload 'elmo-flag-folder-referrer "elmo-flag") (defun wl-highlight-flag-folder-help-echo (folder number) (let ((referer (elmo-flag-folder-referrer folder number))) (concat "The message exists in " (mapconcat (lambda (pair) (concat (car pair) "/" (number-to-string (cdr pair)))) referer ",")))) (require 'wl-summary) (defun wl-highlight-summary-line-help-echo (number beg end &optional string) (let ((type (elmo-folder-type-internal wl-summary-buffer-elmo-folder)) message handler) (when (setq handler (cadr (assq type wl-highlight-summary-line-help-echo-alist))) (setq message (funcall handler wl-summary-buffer-elmo-folder number)) (if message (put-text-property beg end 'help-echo message string))))) (defun wl-highlight-summary-line-string (number line status temp-mark indent) (let ((fsymbol (car (wl-highlight-summary-line-face-spec status temp-mark (> (length indent) 0))))) (put-text-property 0 (length line) 'face fsymbol line)) (when wl-use-highlight-mouse-line (put-text-property 0 (length line) 'mouse-face 'highlight line)) (when wl-highlight-summary-line-help-echo-alist (wl-highlight-summary-line-help-echo number 0 (length line) line))) (defun wl-highlight-summary-current-line (&optional number status) (interactive) (save-excursion (let ((inhibit-read-only t) (case-fold-search nil) (deactivate-mark nil) (number (or number (wl-summary-message-number))) bol eol spec) (when number (setq bol (line-beginning-position)) (setq eol (line-end-position)) (wl-summary-selective-display eol bol) (goto-char bol) (setq spec (wl-highlight-summary-line-face-spec (or status (wl-summary-message-status number)) (wl-summary-temp-mark number) (wl-thread-entity-get-parent-entity (wl-thread-get-entity number)))) (when (car spec) (put-text-property bol eol 'face (car spec))) (when (cdr spec) (put-text-property (next-single-property-change (next-single-property-change bol 'wl-summary-action-argument nil eol) 'wl-summary-action-argument nil eol) eol 'face 'wl-highlight-action-argument-face)) (when wl-use-highlight-mouse-line (put-text-property bol eol 'mouse-face 'highlight)) (when wl-highlight-summary-line-help-echo-alist (wl-highlight-summary-line-help-echo number bol eol)))))) (defun wl-highlight-folder (start end) "Highlight folder between start and end. Faces used: wl-highlight-folder-unknown-face unread messages wl-highlight-folder-zero-face folder needs no sync wl-highlight-folder-few-face folder contains few unsync messages wl-highlight-folder-many-face folder contains many unsync messages wl-highlight-folder-opened-face opened group folder wl-highlight-folder-closed-face closed group folder Variables used: wl-highlight-folder-opened-regexp matches opened group folder wl-highlight-folder-closed-regexp matches closed group folder " (interactive "r") (if (< end start) (let ((s start)) (setq start end end s))) (save-excursion (save-restriction (widen) (narrow-to-region start end) (save-restriction (goto-char start) (while (not (eobp)) (wl-highlight-folder-current-line) (forward-line)))))) (require 'wl-folder) (defun wl-highlight-folder-path (folder-path) "Highlight current folder path...overlay" (save-excursion (wl-delete-all-overlays) (let ((fp folder-path) ov) (goto-char (point-min)) (while (and fp (not (eobp))) (beginning-of-line) (or (looking-at "^[ ]*\\[[\\+-]\\]\\(.+\\):.*\n") (looking-at "^[ ]*\\([^ \\[].+\\):.*\n")) (when (equal (get-text-property (point) 'wl-folder-entity-id) (car fp)) (setq fp (cdr fp)) (setq ov (make-overlay (match-beginning 1) (match-end 1))) (setq wl-folder-buffer-cur-point (point)) (overlay-put ov 'face 'wl-highlight-folder-path-face) (overlay-put ov 'evaporate t) (overlay-put ov 'wl-momentary-overlay t)) (forward-line))))) (defun wl-highlight-action-argument-string (string) (put-text-property 0 (length string) 'face 'wl-highlight-action-argument-face string)) (defun wl-highlight-summary-all () "For evaluation" (interactive) (wl-highlight-summary (point-min)(point-max))) (defun wl-highlight-summary (start end &optional lazy) "Highlight summary between start and end. Faces used: wl-highlight-summary-unread-face unread messages wl-highlight-summary-deleted-face messages mark as deleted wl-highlight-summary-refiled-face messages mark as refiled wl-highlight-summary-copied-face messages mark as copied wl-highlight-summary-new-face new messages wl-highlight-summary-*-flag-face flagged messages" (if (< end start) (let ((s start)) (setq start end end s))) (save-excursion (goto-char start) (while (and (not (eobp)) (< (point) end)) (if (or (not lazy) (null (get-text-property (point) 'face))) (wl-highlight-summary-current-line) (let ((inhibit-read-only t) (deactivate-mark nil)) (wl-summary-selective-display (line-end-position)))) (forward-line)) (unless wl-summary-lazy-highlight (message "Highlighting...done")))) (defun wl-highlight-summary-window (&optional win _beg) "Highlight summary window. This function is defined for `window-scroll-functions'" (when wl-summary-highlight (with-current-buffer (window-buffer win) (when (eq major-mode 'wl-summary-mode) (let ((start (window-start win)) (end (window-end win t))) (wl-highlight-summary start end 'lazy)) (set-buffer-modified-p nil))))) (defun wl-highlight-headers (&optional for-draft) (let ((beg (point-min)) (end (or (save-excursion (re-search-forward "^$" nil t) (point)) (point-max)))) (wl-highlight-message beg end nil) (unless for-draft (when wl-highlight-x-face-function (funcall wl-highlight-x-face-function))) (run-hooks 'wl-highlight-headers-hook))) (defun wl-highlight-body-all () (wl-highlight-message (point-min) (point-max) t t)) (defun wl-highlight-body () (let ((beg (or (save-excursion (goto-char (point-min)) (re-search-forward "^$" nil t)) (point-min))) (end (point-max))) (wl-highlight-message beg end t))) (defun wl-highlight-body-region (beg end) (wl-highlight-message beg end t t)) (defun wl-highlight-signature-search-simple (beg end) "Search signature area in the body message between BEG and END. Returns start point of signature." (save-excursion (goto-char end) (if (re-search-backward "\n--+ *\n" beg t) (if (eq (following-char) ?\n) (1+ (point)) (point)) end))) (defun wl-highlight-signature-search (beg end) "Search signature area in the body message between BEG and END. Returns start point of signature." (save-excursion (goto-char end) (or ;; look for legal signature separator (check at first for fasten) (search-backward "\n-- \n" beg t) ;; look for dual separator (let ((pt (point)) separator) (prog1 (and (re-search-backward "^[^A-Za-z0-9> \t\n]+ *$" beg t) ;; `10' is a magic number. (> (- (match-end 0) (match-beginning 0)) 10) (setq separator (buffer-substring (match-beginning 0) (match-end 0))) ;; We should not use `re-search-backward' for a long word ;; since it is possible to crash XEmacs because of a bug. (if (search-backward (concat "\n" separator "\n") beg t) (1+ (point)) (and (search-backward (concat separator "\n") beg t) (bolp) (point)))) (goto-char pt))) ;; look for user specified signature-separator (if (stringp wl-highlight-signature-separator) (re-search-backward wl-highlight-signature-separator nil t);; case one string (let ((sep wl-highlight-signature-separator)) ;; case list (while (and sep (not (re-search-backward (car sep) beg t))) (setq sep (cdr sep))) (point))) ;; if no separator found, returns end. ))) (defun wl-highlight-citation-prefix-index (prefix) "Return a face index for a given citation prefix" (apply '+ (mapcar (lambda (ch) (cond ((memq ch '(?> ?| ?: ?})) 1) ((memq ch '(9 32)) 0) (t ch))) prefix))) (defun wl-highlight-message (start end hack-sig &optional body-only) "Highlight message headers between start and end. Faces used: wl-highlight-message-headers the part before the colon wl-highlight-message-header-contents the part after the colon wl-highlight-message-important-header-contents contents of \"important\" headers wl-highlight-message-important-header-contents2 contents of \"important\" headers wl-highlight-message-unimportant-header-contents contents of unimportant headers wl-highlight-message-cited-text-N quoted text from other messages wl-highlight-message-citation-header header of quoted texts wl-highlight-message-signature signature Variables used: wl-highlight-message-header-alist alist of header regexp with face for header contents wl-highlight-citation-prefix-regexp matches lines of quoted text wl-highlight-force-citation-header-regexp matches headers for quoted text wl-highlight-citation-header-regexp matches headers for quoted text If HACK-SIG is true,then we search backward from END for something that looks like the beginning of a signature block, and don't consider that a part of the message (this is because signatures are often incorrectly interpreted as cited text.)" (if (< end start) (let ((s start)) (setq start end end s))) (let ((too-big (and wl-highlight-max-message-size (> (- end start) wl-highlight-max-message-size))) (real-end end) current p hend wl-draft-real-time-highlight) (unless too-big (save-excursion (save-restriction (widen) ;; take off signature (when hack-sig (setq end (funcall wl-highlight-signature-search-function (- end wl-max-signature-size) end)) (when (not (eq end real-end)) (put-text-property end (point-max) 'face 'wl-highlight-message-signature))) (narrow-to-region start end) ;; narrow down to just the headers... (goto-char start) (unless body-only (save-restriction ;; If this search fails then the narrowing performed above ;; is sufficient (if (re-search-forward (format "^\\(%s\\)?$" (regexp-quote mail-header-separator)) nil t) (narrow-to-region (point-min) (match-beginning 0))) ;; highlight only when header is not too-big. (if (and wl-highlight-max-header-size (>= (point) wl-highlight-max-header-size)) (goto-char (point-max)) (goto-char start) (while (not (eobp)) (if (looking-at "^[^ \t\n:]+[ \t]*:[ \t]*") (progn (setq p (match-end 0)) (put-text-property (match-beginning 0) p 'face 'wl-highlight-message-headers) (setq hend (save-excursion (std11-field-end end))) (put-text-property p hend 'face (catch 'match (let ((regexp-alist wl-highlight-message-header-alist)) (while regexp-alist (when (looking-at (caar regexp-alist)) (throw 'match (cdar regexp-alist))) (setq regexp-alist (cdr regexp-alist)))) 'wl-highlight-message-header-contents)) (goto-char hend)) ;; ignore non-header field name lines (forward-line)))))) (when (looking-at (format "^%s$" (regexp-quote mail-header-separator))) (put-text-property (match-beginning 0) (match-end 0) 'face 'wl-highlight-header-separator-face) (forward-line)) (let (prefix end) (while (null (progn ;; Skip invisible region. (when (invisible-p (point)) (goto-char (next-visible-point (point)))) (eobp))) (cond ((and wl-highlight-force-citation-header-regexp (looking-at wl-highlight-force-citation-header-regexp)) (setq current 'wl-highlight-message-citation-header) (setq end (match-end 0))) ((and wl-highlight-citation-prefix-regexp (looking-at wl-highlight-citation-prefix-regexp)) (setq prefix (buffer-substring (point) (match-end 0))) (unless wl-highlight-highlight-citation-too (goto-char (match-end 0))) (setq current (nth (% (wl-highlight-citation-prefix-index prefix) (length wl-highlight-citation-face-list)) wl-highlight-citation-face-list))) ((and wl-highlight-citation-header-regexp (looking-at wl-highlight-citation-header-regexp)) (setq current 'wl-highlight-message-citation-header) (setq end (match-end 0))) (t (setq current nil))) (when current (setq p (point)) (forward-line) ; this is to put the \n in the face too (put-text-property p (or end (point)) 'face current) (setq end nil) (backward-char)) (forward-line))) (run-hooks 'wl-highlight-message-hook)))))) ;; highlight-mouse-line for folder mode (defun wl-highlight-folder-mouse-line () (interactive) (let* ((end (save-excursion (end-of-line) (point))) (beg (progn (re-search-forward "[^ ]" end t) (1- (point)))) (inhibit-read-only t)) (put-text-property beg end 'mouse-face 'highlight))) (require 'product) (product-provide (provide 'wl-highlight) (require 'wl-version)) ;;; wl-highlight.el ends here wanderlust-wanderlust-769699d/wl/wl-message.el000066400000000000000000001044641406661363500214260ustar00rootroot00000000000000;;; wl-message.el --- Message displaying modules for Wanderlust. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Author: Yuuichi Teranishi ;; Keywords: mail, net news ;; This file is part of Wanderlust (Yet Another Message Interface on Emacsen). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'cl-lib) (require 'timer) (require 'mime-view) (require 'elmo) (require 'elmo-mime) (require 'wl-vars) (require 'wl-util) (require 'wl-highlight) (require 'wl-e21) (require 'wl-mime) (provide 'wl-message) (defvar wl-message-buffer-prefetch-get-next-function 'wl-summary-default-get-next-msg) (defvar wl-message-buffer-prefetch-debug nil) (defvar wl-message-buffer nil) ; message buffer. (defvar wl-message-buffer-cur-folder nil) (defvar wl-message-buffer-cur-number nil) (defvar wl-message-buffer-cur-display-type nil) (defvar wl-message-buffer-cur-summary-buffer nil) (defvar wl-message-buffer-require-all-header nil) (defvar wl-message-buffer-original-buffer nil) ; original buffer. (defvar wl-message-buffer-mode-line-formatter nil) (defvar wl-message-buffer-flag-indicator nil) (defvar wl-message-buffer-mime-entity nil) (make-variable-buffer-local 'wl-message-buffer-cur-folder) (make-variable-buffer-local 'wl-message-buffer-cur-number) (make-variable-buffer-local 'wl-message-buffer-cur-display-type) (make-variable-buffer-local 'wl-message-buffer-cur-summary-buffer) (make-variable-buffer-local 'wl-message-buffer-require-all-header) (make-variable-buffer-local 'wl-message-buffer-original-buffer) (make-variable-buffer-local 'wl-message-buffer-mode-line-formatter) (make-variable-buffer-local 'wl-message-buffer-flag-indicator) (make-variable-buffer-local 'wl-message-buffer-mime-entity) (defvar wl-fixed-window-configuration nil) (defvar wl-message-buffer-cache-size 10) ; At least 1. ;;; Message buffer cache. (defvar wl-message-buffer-cache nil "Message cache. (old ... new) order alist. With association ((\"folder\" message \"message-id\") . cache-buffer).") (defmacro wl-message-buffer-cache-buffer-get (entry) `(cdr ,entry)) (defmacro wl-message-buffer-cache-folder-get (entry) `(car (car ,entry))) (defmacro wl-message-buffer-cache-message-get (entry) `(cdr (car ,entry))) (defmacro wl-message-buffer-cache-entry-make (key buf) `(cons ,key ,buf)) (defmacro wl-message-buffer-cache-hit (key) "Return value assosiated with key." `(wl-message-buffer-cache-buffer-get (assoc ,key wl-message-buffer-cache))) (defun wl-message-buffer-cache-sort (entry) "Move ENTRY to the top of `wl-message-buffer-cache'." (setq wl-message-buffer-cache (cons entry (delete entry wl-message-buffer-cache)))) ;;; (let* ((pointer (cons nil wl-message-buffer-cache)) ;;; (top pointer)) ;;; (while (cdr pointer) ;;; (if (equal (car (cdr pointer)) entry) ;;; (setcdr pointer (cdr (cdr pointer))) ;;; (setq pointer (cdr pointer)))) ;;; (setcdr pointer (list entry)) ;;; (setq wl-message-buffer-cache (cdr top)))) (defconst wl-original-message-buffer-name " *Original*") (defun wl-original-message-mode () "A major mode for original message buffer." (setq major-mode 'wl-original-message-mode) (setq buffer-read-only t) (set-buffer-multibyte nil) (setq mode-name "Wanderlust original message")) (defun wl-original-message-buffer-get (name) "Get original message buffer for NAME. If original message buffer already exists, it is re-used." (let* ((name (concat wl-original-message-buffer-name name)) (buffer (get-buffer name))) (unless (and buffer (buffer-live-p buffer)) (with-current-buffer (setq buffer (get-buffer-create name)) (wl-original-message-mode))) buffer)) (defun wl-message-buffer-create () "Create a new message buffer." (let* ((buffer (generate-new-buffer wl-message-buffer-name)) (name (buffer-name buffer))) (with-current-buffer buffer (setq wl-message-buffer-original-buffer (wl-original-message-buffer-get name)) (when wl-message-use-header-narrowing (wl-message-header-narrowing-setup)) (run-hooks 'wl-message-buffer-created-hook)) buffer)) (defun wl-message-buffer-cache-add (key) "Add (KEY . buf) to the top of `wl-message-buffer-cache'. Return its cache buffer." (let ((len (length wl-message-buffer-cache)) (buf nil)) (if (< len wl-message-buffer-cache-size) (setq buf (wl-message-buffer-create)) (let ((entry (nth (1- len) wl-message-buffer-cache))) (if (buffer-live-p (setq buf (wl-message-buffer-cache-buffer-get entry))) (setcdr (nthcdr (- len 2) wl-message-buffer-cache) nil) (setq wl-message-buffer-cache (delq entry wl-message-buffer-cache)) (setq buf (wl-message-buffer-create))))) (setq wl-message-buffer-cache (cons (wl-message-buffer-cache-entry-make key buf) wl-message-buffer-cache)) buf)) (defun wl-message-buffer-cache-delete (&optional key) "Delete the most recent cache entry" (if key (setq wl-message-buffer-cache (delq (assoc key wl-message-buffer-cache) wl-message-buffer-cache)) (let ((buf (wl-message-buffer-cache-buffer-get (car wl-message-buffer-cache)))) (setq wl-message-buffer-cache (nconc (cdr wl-message-buffer-cache) (list (wl-message-buffer-cache-entry-make nil buf))))))) (defun wl-message-buffer-cache-clean-up () "A function to flush all decoded messages in cache list." (interactive) (if (and (eq major-mode 'wl-summary-mode) wl-message-buffer (get-buffer-window wl-message-buffer)) (delete-window (get-buffer-window wl-message-buffer))) (wl-kill-buffers (regexp-quote wl-message-buffer-name)) (setq wl-message-buffer-cache nil)) ;;; Message buffer handling from summary buffer. (require 'wl-summary) (defun wl-message-buffer-window () "Get message buffer window if any." (let* ((start-win (selected-window)) (cur-win start-win)) (catch 'found (while (progn (setq cur-win (next-window cur-win)) (with-current-buffer (window-buffer cur-win) (if (or (eq major-mode 'wl-message-mode) (eq major-mode 'mime-view-mode)) (throw 'found cur-win))) (not (eq cur-win start-win))))))) (defun wl-message-select-buffer (buffer) "Select BUFFER as a message buffer." (let ((window (get-buffer-window buffer)) (sum (car wl-message-window-size)) (mes (cdr wl-message-window-size)) whi) (when (and window (not (eq (with-current-buffer (window-buffer window) wl-message-buffer-cur-summary-buffer) (current-buffer)))) (delete-window window) (run-hooks 'wl-message-window-deleted-hook) (setq window nil)) (if window (select-window window) (when wl-fixed-window-configuration (delete-other-windows) (and wl-stay-folder-window (wl-summary-toggle-disp-folder))) ;; There's no buffer window. Search for message window and snatch it. (if (setq window (wl-message-buffer-window)) (select-window window) (setq whi (1- (window-height))) (if mes (progn (let ((total (+ sum mes))) (setq sum (max window-min-height (/ (* whi sum) total))) (setq mes (max window-min-height (/ (* whi mes) total)))) (when (and (< whi (+ sum mes)) ;; Avoid error when resize-mini-windows is ;; non-nil. frame-root-window-p is not ;; available on Emacs 23. (null (eq (selected-window) (frame-root-window)))) (enlarge-window (- (+ sum mes) whi))))) (split-window (get-buffer-window (current-buffer)) sum) (other-window 1))) (switch-to-buffer buffer))) (defun wl-message-narrow-to-page (&optional arg) "Narrow to page. If ARG is specified, narrow to ARGth page." (interactive "P") (setq arg (if arg (prefix-numeric-value arg) 0)) (save-excursion (condition-case () (forward-page -1) ; Beginning of current page. (beginning-of-buffer (goto-char (point-min)))) (forward-char) ; for compatibility with emacs-19.28 and emacs-19.29 (widen) (cond ((> arg 0) (forward-page arg)) ((< arg 0) (forward-page (1- arg)))) (forward-page) (if wl-break-pages (narrow-to-region (point) (progn (forward-page -1) (if (and (eolp) (not (bobp))) (forward-line)) (point)))))) (defun wl-message-prev-page (&optional lines) "Scroll down current message by LINES. Returns non-nil if top of message." (interactive) (let (top real-top) (save-selected-window (unless (eq major-mode 'mime-view-mode) (when (buffer-live-p wl-message-buffer) (wl-message-select-buffer wl-message-buffer))) (move-to-window-line 0) (if (and wl-break-pages (bobp) (not (setq real-top (save-restriction (widen) (bobp))))) (progn (wl-message-narrow-to-page -1) (goto-char (point-max)) (recenter)) (if (not (bobp)) (condition-case nil (scroll-down (or lines wl-message-scroll-amount)) (error)) (setq top t))) (if real-top (let ((f (assq (mime-preview-original-major-mode) mime-preview-over-to-previous-method-alist))) (if f (funcall (cdr f)))))) top)) (defun wl-message-next-page (&optional lines) "Scroll up current message by LINES. Returns non-nil if bottom of message." (interactive) (let (bottom) (save-selected-window (unless (eq major-mode 'mime-view-mode) (when (buffer-live-p wl-message-buffer) (wl-message-select-buffer wl-message-buffer))) (move-to-window-line -1) (if (save-excursion (end-of-line) (and (pos-visible-in-window-p) (eobp))) (if (or (null wl-break-pages) (save-excursion (save-restriction (widen) (forward-line) (eobp)))) (setq bottom t) (wl-message-narrow-to-page 1) (setq bottom nil)) (condition-case () (scroll-up (or lines wl-message-scroll-amount)) (end-of-buffer (goto-char (point-max)))) (setq bottom nil)) (if (eobp) (let ((f (assq (mime-preview-original-major-mode) mime-preview-over-to-next-method-alist))) (if f (funcall (cdr f)))))) bottom)) (require 'wl-draft) (defun wl-message-follow-current-entity (_buffer) "Follow to current message." (wl-draft-reply (wl-message-get-original-buffer) nil wl-message-buffer-cur-summary-buffer) ; reply to all (wl-draft-yank-from-mail-reply-buffer nil)) ;; (defun wl-message-mode () "A major mode for message displaying." (interactive) (setq major-mode 'wl-message-mode) (setq buffer-read-only t) (setq mode-name "Message")) (defun wl-message-exit () "Move to summary buffer or mother buffer." (interactive) (let (summary-buf summary-win mother-buffer) (cond ((setq summary-buf wl-message-buffer-cur-summary-buffer) (unless (buffer-live-p summary-buf) (error "Summary buffer not found: %s" wl-message-buffer-cur-folder)) (if (setq summary-win (get-buffer-window summary-buf)) (select-window summary-win) (switch-to-buffer summary-buf) (wl-message-select-buffer wl-message-buffer) (select-window (get-buffer-window summary-buf)))) ((setq mother-buffer mime-mother-buffer) (kill-buffer (current-buffer)) (when (buffer-live-p mother-buffer) (switch-to-buffer mother-buffer)))) (run-hooks 'wl-message-exit-hook))) (defun wl-message-toggle-disp-summary () (interactive) (let ((summary-buf (get-buffer wl-message-buffer-cur-summary-buffer)) summary-win) (if (and summary-buf (buffer-live-p summary-buf)) (if (setq summary-win (get-buffer-window summary-buf)) (delete-window summary-win) (switch-to-buffer summary-buf) (wl-message-select-buffer wl-message-buffer)) (wl-summary-goto-folder-subr wl-message-buffer-cur-folder 'no-sync nil nil t) ; no summary-buf (let ((sum-buf (current-buffer))) (wl-message-select-buffer wl-message-buffer) (setq wl-message-buffer-cur-summary-buffer sum-buf))))) (defun wl-message-get-original-buffer () "Get original buffer for current message buffer." (if (buffer-live-p wl-message-buffer-original-buffer) wl-message-buffer-original-buffer (wl-original-message-buffer-get (buffer-name (current-buffer))))) (defun wl-message-add-buttons-to-body (start end) (save-excursion (save-restriction (narrow-to-region start end) (let ((case-fold-search t) (alist wl-message-body-button-alist) entry) (while alist (setq entry (car alist) alist (cdr alist)) (goto-char (point-min)) (while (re-search-forward (car entry) (+ (point) (nth 4 entry)) t) (unless (get-text-property (point) 'keymap) (wl-message-add-button (match-beginning (nth 1 entry)) (match-end (nth 1 entry)) (nth 2 entry) (match-string (nth 3 entry)))))))))) (defun wl-message-add-buttons-to-header (start end) (save-excursion (save-restriction (narrow-to-region start end) (let ((case-fold-search t) (alist wl-message-header-button-alist) entry) (while alist (setq entry (car alist) alist (cdr alist)) (goto-char (point-min)) (while (re-search-forward (car entry) nil t) (setq start (match-beginning 0) end (if (re-search-forward "^[^ \t]" nil t) (match-beginning 0) (point-max))) (goto-char start) (while (re-search-forward (nth 1 entry) end t) (wl-message-add-button (match-beginning (nth 2 entry)) (match-end (nth 2 entry)) (nth 3 entry) (match-string (nth 4 entry)))) (goto-char end))))))) ;; display-type object definition. (defun wl-message-make-display-type (mime header) (let (symbol) (prog1 (setq symbol (intern (format "%s-%s-header" mime header))) (put symbol 'wl-message-display-type (list :mime mime :header header))))) (defun wl-message-display-type-property (display-type prop) (plist-get (get display-type 'wl-message-display-type) prop)) (defun wl-message-mime-analysis-p (display-type &optional header-or-body) (let ((mode (wl-message-display-type-property display-type :mime))) (cl-case header-or-body (header (memq mode '(mime header-only))) (t (eq mode 'mime))))) (defun wl-message-display-all-header-p (display-type) (eq (wl-message-display-type-property display-type :header) 'all)) (defun wl-message-display-no-merge-p (display-type) (eq (wl-message-display-type-property display-type :mime) 'no-merge)) (defun wl-message-buffer-display-type (&optional message-buffer) (if message-buffer (with-current-buffer message-buffer wl-message-buffer-cur-display-type) wl-message-buffer-cur-display-type)) (defun wl-message-flag-indicator (flags) (let ((flags (elmo-get-global-flags flags))) (if (null flags) "" (concat " (" (mapconcat (lambda (flag) (let ((indicator (capitalize (symbol-name flag))) face) (when (and (assq flag wl-summary-flag-alist) (facep (setq face (intern (format "wl-highlight-summary-%s-flag-face" flag))))) (put-text-property 0 (length indicator) 'face face indicator)) indicator)) (sort flags (lambda (l r) (> (length (memq (assq l wl-summary-flag-alist) wl-summary-flag-alist)) (length (memq (assq r wl-summary-flag-alist) wl-summary-flag-alist))))) ", ") ")")))) (defun wl-message-redisplay (folder number display-type &optional force-reload) (let* ((default-mime-charset wl-mime-charset) (buffer-read-only nil) (summary-buf (current-buffer)) message-buf summary-win) (setq buffer-read-only nil) (setq wl-message-buffer (wl-message-buffer-display folder number display-type force-reload)) (setq message-buf wl-message-buffer) (wl-message-select-buffer wl-message-buffer) (set-buffer message-buf) (wl-deactivate-region) (make-local-variable 'truncate-partial-width-windows) (setq truncate-partial-width-windows nil) (setq truncate-lines wl-message-truncate-lines) (setq buffer-read-only nil) (setq wl-message-buffer-cur-summary-buffer summary-buf) (setq wl-message-buffer-cur-folder (elmo-folder-name-internal folder)) (setq wl-message-buffer-cur-number number) (setq wl-message-buffer-flag-indicator (wl-message-flag-indicator (elmo-message-flags folder number))) (wl-line-formatter-setup wl-message-buffer-mode-line-formatter wl-message-mode-line-format wl-message-mode-line-format-spec-alist) (setq mode-line-buffer-identification (funcall wl-message-buffer-mode-line-formatter)) ;;; ;; highlight body ;;; (when wl-highlight-body-too ;;; (wl-highlight-body)) (ignore-errors (wl-message-narrow-to-page)) (goto-char (point-min)) (when (re-search-forward "^$" nil t) (wl-message-add-buttons-to-header (point-min) (point)) (wl-message-add-buttons-to-body (point) (point-max))) (when (and wl-message-use-header-narrowing (not (wl-message-display-all-header-p display-type))) (wl-message-header-narrowing)) (goto-char (point-min)) (condition-case error (run-hooks 'wl-message-redisplay-hook) (error (message "Error occured in running wl-message-redisplay-hook, %s" (cdr error)))) ;; go back to summary mode (set-buffer-modified-p nil) (setq buffer-read-only t) (set-buffer summary-buf) (setq summary-win (get-buffer-window summary-buf)) (if (window-live-p summary-win) (select-window summary-win)))) ;; Use message buffer cache. (defun wl-message-buffer-display (folder number display-type &optional force-reload unread) (let* ((msg-id (ignore-errors (elmo-message-field folder number 'message-id))) (fname (elmo-folder-name-internal folder)) (hit (wl-message-buffer-cache-hit (list fname number msg-id))) (redisplay nil) entity) (when (and hit (not (buffer-live-p hit))) (wl-message-buffer-cache-delete (list fname number msg-id)) (setq hit nil)) (if hit (progn ;; move hit to the top. (wl-message-buffer-cache-sort (wl-message-buffer-cache-entry-make (list fname number msg-id) hit)) (with-current-buffer hit ;; Rewind to the top page (widen) (goto-char (point-min)) (ignore-errors (wl-message-narrow-to-page)) (setq entity wl-message-buffer-mime-entity) (unless (eq wl-message-buffer-cur-display-type display-type) (setq redisplay t)))) ;; delete tail and add new to the top. (setq hit (wl-message-buffer-cache-add (list fname number msg-id))) (setq redisplay t)) (when (or force-reload redisplay) (let (done) (unwind-protect (with-current-buffer hit (when (or force-reload (null entity) (not (elmo-mime-entity-display-p entity (if (wl-message-mime-analysis-p display-type) 'mime 'as-is))) (if (wl-message-display-no-merge-p display-type) (elmo-mime-entity-reassembled-p entity) (elmo-mime-entity-fragment-p entity))) (setq entity (elmo-message-mime-entity folder number (wl-message-get-original-buffer) (and wl-message-auto-reassemble-message/partial (not (wl-message-display-no-merge-p display-type))) force-reload unread (not (wl-message-mime-analysis-p display-type))))) (unless entity (error "Cannot display message %s/%s" fname number)) (wl-message-display-internal entity display-type) (setq done t)) (unless done (wl-message-buffer-cache-delete))))) hit)) (defun wl-message-display-internal (entity display-type) (let ((default-mime-charset wl-mime-charset) (elmo-mime-charset wl-mime-charset) (wl-message-buffer-require-all-header (wl-message-display-all-header-p display-type))) (if (wl-message-mime-analysis-p display-type) (elmo-mime-entity-display entity (current-buffer) 'wl-original-message-mode (wl-message-define-keymap)) (let* ((elmo-mime-display-header-analysis (wl-message-mime-analysis-p display-type 'header)) (wl-highlight-x-face-function (and elmo-mime-display-header-analysis wl-highlight-x-face-function))) (elmo-mime-entity-display-as-is entity (current-buffer) 'wl-original-message-mode (wl-message-define-keymap)) (let (buffer-read-only) (wl-highlight-message (point-min) (point-max) t)))) (setq wl-message-buffer-cur-display-type display-type wl-message-buffer-mime-entity entity) (run-hooks 'wl-message-display-internal-hook) (setq buffer-read-only t))) (defun wl-message-buffer-prefetch-p (folder &optional number) (and (or (not number) (elmo-message-file-p folder number) (let ((size (elmo-message-field folder number 'size))) (not (and (integerp size) wl-message-buffer-prefetch-threshold (>= size wl-message-buffer-prefetch-threshold))))) (or (not number) (elmo-folder-plugged-p folder) (elmo-file-cache-exists-p (elmo-message-field folder number 'message-id))) (or (cond ((eq wl-message-buffer-prefetch-folder-type-list t) t) ((and number wl-message-buffer-prefetch-folder-type-list) (memq (elmo-folder-type-internal (elmo-message-folder folder number)) wl-message-buffer-prefetch-folder-type-list)) (wl-message-buffer-prefetch-folder-type-list (let ((list wl-message-buffer-prefetch-folder-type-list) type) (catch 'done (while (setq type (pop list)) (if (elmo-folder-contains-type folder type) (throw 'done t))))))) (cond ((consp wl-message-buffer-prefetch-folder-list) (elmo-string-match-member (elmo-folder-name-internal folder) wl-message-buffer-prefetch-folder-list)) (t wl-message-buffer-prefetch-folder-list))))) (defsubst wl-message-buffer-prefetch-clear-timer () (cancel-function-timers 'wl-message-buffer-prefetch-subr)) (defsubst wl-message-buffer-prefetch-set-timer (folder number count summary charset) (run-with-idle-timer wl-message-buffer-prefetch-idle-time nil 'wl-message-buffer-prefetch-subr folder number count summary charset)) (defvar wl-message-buffer-prefetch-move-spec-alist nil) (defun wl-message-buffer-prefetch-get-next (folder number summary) (if (buffer-live-p summary) (with-current-buffer summary (let ((wl-summary-move-spec-alist (or wl-message-buffer-prefetch-move-spec-alist wl-summary-move-spec-alist)) (next number)) (while (and (setq next (funcall wl-message-buffer-prefetch-get-next-function next)) (not (wl-message-buffer-prefetch-p folder next)))) next)))) (defun wl-message-buffer-prefetch (folder number count &optional summary charset) (let* ((summary (or summary (get-buffer wl-summary-buffer-name))) (num number)) (when (and (> count 0) (wl-message-buffer-prefetch-p folder)) (unless (wl-message-buffer-prefetch-p folder number) (setq num (wl-message-buffer-prefetch-get-next folder number summary))) (when num (wl-message-buffer-prefetch-clear-timer) (wl-message-buffer-prefetch-set-timer folder num count summary charset))))) (defun wl-message-buffer-prefetch-next (folder number count &optional summary charset) (let* ((summary (or summary (get-buffer wl-summary-buffer-name))) next) (when (and (> count 0) (wl-message-buffer-prefetch-p folder)) (setq next (wl-message-buffer-prefetch-get-next folder number summary)) (when next (wl-message-buffer-prefetch-clear-timer) (wl-message-buffer-prefetch-set-timer folder next count summary charset))))) (defun wl-message-buffer-prefetch-subr (folder number count summary charset) (if (buffer-live-p summary) (with-current-buffer summary (if (and number (numberp count) (>= (setq count (- count 1)) 0) (string= (elmo-folder-name-internal folder) (wl-summary-buffer-folder-name))) (let* ((wl-mime-charset charset) (default-mime-charset charset) (message-id (elmo-message-field folder number 'message-id)) (key (list (elmo-folder-name-internal folder) number message-id)) (hit (wl-message-buffer-cache-hit key)) (display-type (wl-message-make-display-type wl-summary-buffer-display-mime-mode wl-summary-buffer-display-header-mode)) time1 time2 sec micro) (when wl-message-buffer-prefetch-debug (message "%d: count %d, hit %s" number count (buffer-name hit))) (if (and hit (buffer-live-p hit)) (progn (wl-message-buffer-cache-sort (wl-message-buffer-cache-entry-make key hit)) (wl-message-buffer-prefetch-subr folder (wl-message-buffer-prefetch-get-next folder number summary) count summary charset)) ;; prefetching (when wl-message-buffer-prefetch-debug (setq time1 (current-time)) (message "Prefetching %d..." number)) (wl-message-buffer-display folder number display-type nil 'unread) (when (elmo-message-use-cache-p folder number) (elmo-message-set-cached folder number t)) (when wl-message-buffer-prefetch-debug (setq time2 (current-time)) (setq sec (- (nth 1 time2)(nth 1 time1))) (setq micro (- (nth 2 time2)(nth 2 time1))) (setq micro (+ micro (* 1000000 sec))) (message "Prefetching %d...done(%f msec)." number (/ micro 1000.0)) (sit-for 0)) ;; set next prefetch (wl-message-buffer-prefetch-set-timer folder (wl-message-buffer-prefetch-get-next folder number summary) count summary charset) (sit-for 0) ;; success prefetch ))) ;; finish prefetch (when wl-message-buffer-prefetch-debug (message "Buffer Cached Messages: %s" (mapconcat (lambda (cache) (if (numberp (nth 1 (car cache))) (if (string= (nth 0 (car cache)) (elmo-folder-name-internal folder)) (format "%d" (nth 1 (car cache))) (format "*%d" (nth 1 (car cache)))) "-")) wl-message-buffer-cache " "))) ))) (defvar wl-message-button-map (make-sparse-keymap)) (defun wl-message-add-button (from to function &optional data) "Create a button between FROM and TO with callback FUNCTION and DATA." (add-text-properties from to (nconc (list 'wl-message-button-callback function) (if data (list 'wl-message-button-data data)))) (let ((ov (make-overlay from to))) (overlay-put ov 'mouse-face 'highlight) (overlay-put ov 'local-map wl-message-button-map) (overlay-put ov 'evaporate t))) (defun wl-message-button-dispatcher (event) "Select the button under point." (interactive "@e") (mouse-set-point event) (let ((callback (get-text-property (point) 'wl-message-button-callback)) (data (get-text-property (point) 'wl-message-button-data))) (if callback (funcall callback data) (wl-message-button-dispatcher-internal event)))) (defun wl-message-button-refer-article (data) "Read article specified by Message-ID DATA at point." (switch-to-buffer-other-window wl-message-buffer-cur-summary-buffer) (if (wl-summary-jump-to-msg-by-message-id data) (wl-summary-redisplay))) (defun wl-message-uu-substring (buf outbuf &optional first last) (with-current-buffer buf (search-forward "\n\n") (let ((sp (point)) ep filename case-fold-search) (catch 'done (if first (progn (if (re-search-forward "^begin[ \t]+[0-9]+[ \t]+\\([^ ].*\\)" nil t) (setq filename (buffer-substring (match-beginning 1)(match-end 1))) (throw 'done nil))) (re-search-forward "^M.*$" nil t)) ; uuencoded string (setq sp (point-at-bol)) (goto-char (point-max)) (if last (re-search-backward "^end" sp t) (re-search-backward "^M.*$" sp t)) ; uuencoded string (forward-line) (setq ep (point)) (with-current-buffer outbuf (goto-char (point-max)) (insert-buffer-substring buf sp ep)) filename)))) ;;; Header narrowing courtesy of Hideyuki Shirai. (defun wl-message-header-narrowing () "Narrowing headers." (unless (eq this-command 'wl-summary-redisplay-all-header) (save-excursion (save-restriction (goto-char (point-min)) (if (re-search-forward "^$" nil t) (beginning-of-line) (goto-char (point-max))) (narrow-to-region (point-min) (point)) (let ((fields wl-message-header-narrowing-fields)) (while fields (wl-message-header-narrowing-1 (concat "^" (car fields) ":")) (setq fields (cdr fields)))))))) (defvar wl-message-header-narrowing-map (make-sparse-keymap)) (define-key wl-message-header-narrowing-map [mouse-2] 'wl-message-header-narrowing-again-at-mouse) (defvar wl-message-header-narrowing-widen-map (make-sparse-keymap)) (define-key wl-message-header-narrowing-widen-map [mouse-2] 'wl-message-header-narrowing-widen-at-mouse) (defun wl-message-header-narrowing-again-at-mouse (event) (interactive "e") (save-window-excursion (save-excursion (mouse-set-point event) (wl-message-header-narrowing)))) (defun wl-message-header-narrowing-1 (hregexp) (let ((case-fold-search t) ov start end) (goto-char (point-min)) (while (re-search-forward hregexp nil t) (setq start (match-beginning 0)) (forward-line) (setq end (progn (while (looking-at "^[ \t]") (forward-line)) (forward-line -1) (line-end-position))) (if (<= (count-lines start end) wl-message-header-narrowing-lines) (forward-line) (goto-char start) (forward-line (1- wl-message-header-narrowing-lines)) (end-of-line) (setq start (point)) (unless (eq (get-char-property start 'invisible) 'wl-message-header-narrowing) (setq ov (or (let ((ovs (overlays-at start)) ov) (while (and ovs (not (overlayp ov))) (if (overlay-get (car ovs) 'wl-message-header-narrowing) (setq ov (car ovs))) (setq ovs (cdr ovs))) ov) (make-overlay start end))) (overlay-put ov 'wl-message-header-narrowing t) (overlay-put ov 'evaporate t) (overlay-put ov 'invisible 'wl-message-header-narrowing) (overlay-put ov 'after-string wl-message-header-narrowing-string)))))) (defun wl-message-header-narrowing-widen-at-mouse (event) (interactive "e") (save-selected-window (select-window (posn-window (event-start event))) (let* ((win (selected-window)) (wpos (window-start win)) (pos (mouse-set-point event)) (ovs (overlays-in (1- pos) (1+ pos))) ;; Uum... ov) (while (and ovs (not (overlayp ov))) (when (overlay-get (car ovs) 'wl-message-header-narrowing) (setq ov (car ovs))) (setq ovs (cdr ovs))) (when (overlayp ov) (overlay-put ov 'face 'wl-message-header-narrowing-face) (overlay-put ov 'local-map wl-message-header-narrowing-map) (overlay-put ov 'invisible nil) (overlay-put ov 'after-string nil)) (set-window-start win wpos)))) (defun wl-message-header-narrowing-setup () (set (make-local-variable 'line-move-ignore-invisible) t) (set-text-properties 0 (length wl-message-header-narrowing-string) `(face wl-message-header-narrowing-face keymap ,wl-message-header-narrowing-widen-map) wl-message-header-narrowing-string)) (defun wl-message-header-narrowing-toggle () "Toggle header narrowing." (interactive) (when wl-message-use-header-narrowing (save-excursion (goto-char (point-min)) (if (re-search-forward "^$" nil t) (beginning-of-line) (goto-char (point-max))) (let ((ovs (overlays-in (point-min) (point))) ov hn-ovs) (while (setq ov (car ovs)) (when (overlay-get ov 'wl-message-header-narrowing) (setq hn-ovs (cons ov hn-ovs))) (setq ovs (cdr ovs))) (if hn-ovs (while hn-ovs (delete-overlay (car hn-ovs)) (setq hn-ovs (cdr hn-ovs))) (wl-message-header-narrowing)))))) ;; wl-e21.el (add-hook 'wl-message-display-internal-hook 'wl-setup-message) (defvar wl-message-toolbar '([wl-message-read wl-message-read t "Read Contents"] [wl-message-next-content wl-message-next-content t "Next Content"] [wl-message-prev-content wl-message-prev-content t "Previous Content"] [wl-message-quit wl-message-quit t "Back to Summary"] [wl-message-play-content wl-message-play-content t "Play Content"] [wl-message-extract-content wl-message-extract-content t "Extract Content"]) "The Message buffer toolbar.") (defun wl-e21-setup-message-toolbar () (when (wl-e21-setup-toolbar wl-message-toolbar) (wl-e21-make-toolbar-buttons (current-local-map) wl-message-toolbar))) (defalias 'wl-setup-message 'wl-e21-setup-message-toolbar) (defun wl-message-define-keymap () (let ((keymap (make-sparse-keymap))) (define-key keymap "D" 'wl-message-delete-current-part) (define-key keymap "l" 'wl-message-toggle-disp-summary) (define-key keymap "\C-c:d" 'wl-message-decrypt-pgp-nonmime) (define-key keymap "\C-c:v" 'wl-message-verify-pgp-nonmime) (define-key keymap "w" 'wl-draft) (define-key keymap [mouse-4] 'wl-message-wheel-down) (define-key keymap [mouse-5] 'wl-message-wheel-up) (define-key keymap [S-mouse-4] 'wl-message-wheel-down) (define-key keymap [S-mouse-5] 'wl-message-wheel-up) (set-keymap-parent wl-message-button-map keymap) (define-key wl-message-button-map [mouse-2] 'wl-message-button-dispatcher) keymap)) (defun wl-message-wheel-up (event) (interactive "e") (if (string-match (regexp-quote wl-message-buffer-name) (regexp-quote (buffer-name))) (wl-message-next-page) (let ((cur-buf (current-buffer)) proceed) (save-selected-window (select-window (posn-window (event-start event))) (set-buffer cur-buf) (setq proceed (wl-message-next-page))) (if proceed (if (memq 'shift (event-modifiers event)) (wl-summary-down t) (wl-summary-next t)))))) (defun wl-message-wheel-down (event) (interactive "e") (if (string-match (regexp-quote wl-message-buffer-name) (regexp-quote (buffer-name))) (wl-message-prev-page) (let ((cur-buf (current-buffer)) proceed) (save-selected-window (select-window (posn-window (event-start event))) (set-buffer cur-buf) (setq proceed (wl-message-prev-page))) (if proceed (if (memq 'shift (event-modifiers event)) (wl-summary-up t) (wl-summary-prev t)))))) ;; End of wl-e21.el (require 'product) (product-provide (provide 'wl-message) (require 'wl-version)) ;;; wl-message.el ends here wanderlust-wanderlust-769699d/wl/wl-mime.el000066400000000000000000001106521406661363500207250ustar00rootroot00000000000000;;; wl-mime.el --- SEMI implementations of MIME processing on Wanderlust. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Author: Yuuichi Teranishi ;; Keywords: mail, net news ;; This file is part of Wanderlust (Yet Another Message Interface on Emacsen). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'alist) (require 'mcharset) (require 'std11) (require 'mime) (require 'mime-parse) (require 'eword-decode) (require 'eword-encode) (eval-when-compile (require 'smtp)) (eval-when-compile (require 'mmbuffer)) (require 'mime-setup) (require 'mime-view) (require 'mime-edit) (require 'mime-play) (require 'mime-parse) (require 'elmo) (require 'elmo-mime) (require 'wl-vars) (require 'wl-util) (require 'cl-lib) ;;; Draft (defalias 'wl-draft-editor-mode 'mime-edit-mode) (defalias 'wl-draft-decode-message-in-buffer 'mime-edit-decode-message-in-buffer) (defun wl-draft-yank-current-message-entity () "Yank currently displayed message entity. By setting following-method as yank-content. If region is active, yank region contents instead. \(this feature is available if and only if `transient-mark-mode' \(GNU Emacs\) or `zmacs-regions' \(XEmacs\) has Non-nil value\)" (let ((wl-draft-buffer (current-buffer)) (mime-preview-following-method-alist (list (cons 'wl-original-message-mode (function wl-draft-yank-to-draft-buffer)))) (message-buffer (wl-current-message-buffer))) (if message-buffer (with-current-buffer message-buffer (save-restriction (widen) (cond ((wl-region-exists-p) (wl-mime-preview-follow-current-region)) ((not (wl-message-mime-analysis-p (wl-message-buffer-display-type))) (wl-mime-preview-follow-no-mime (wl-message-buffer-display-type))) (t (save-excursion (goto-char (point-min)) (mime-preview-follow-current-entity)))))) (error "No message.")))) ;; modified mime-preview-follow-current-entity from mime-view.el (defun wl-mime-preview-follow-no-mime (display-type) "Write follow message to current message, without mime. It calls following-method selected from variable `mime-preview-following-method-alist'." (interactive) (let* ((mode (mime-preview-original-major-mode 'recursive)) (new-name (format "%s-no-mime" (buffer-name))) new-buf beg end (entity (get-text-property (point-min) 'elmo-as-is-entity)) (the-buf (current-buffer))) (save-excursion (goto-char (point-min)) (setq beg (re-search-forward "^$" nil t) end (point-max))) (with-current-buffer (setq new-buf (get-buffer-create new-name)) (erase-buffer) (insert-buffer-substring the-buf beg end) (goto-char (point-min)) ;; Insert all headers. (let ((elmo-mime-display-header-analysis (wl-message-mime-analysis-p display-type 'header))) (elmo-mime-insert-sorted-header entity)) (let ((f (cdr (assq mode mime-preview-following-method-alist)))) (if (functionp f) (funcall f new-buf) (message "Sorry, following method for %s is not implemented yet." mode)))))) ;; modified mime-preview-follow-current-entity from mime-view.el (defun wl-mime-preview-follow-current-region () "Write follow message to current region. It calls following-method selected from variable `mime-preview-following-method-alist'." (interactive) (let ((r-beg (region-beginning)) (r-end (region-end)) (entity (get-text-property (point-min) 'mime-view-entity))) (let* ((mode (mime-preview-original-major-mode 'recursive)) (new-name (format "%s-active-region" (buffer-name))) new-buf (the-buf (current-buffer)) fields) (with-current-buffer (setq new-buf (get-buffer-create new-name)) (erase-buffer) (insert ?\n) (insert-buffer-substring the-buf r-beg r-end) (goto-char (point-min)) (let ((current-entity (if (and entity (eq (mime-entity-media-type entity) 'message) (eq (mime-entity-media-subtype entity) 'rfc822)) (car (mime-entity-children entity)) entity))) (while (and current-entity (if (and (eq (mime-entity-media-type current-entity) 'message) (eq (mime-entity-media-subtype current-entity) 'rfc822)) nil (mime-insert-header current-entity fields) t)) (setq fields (std11-collect-field-names) current-entity (mime-entity-parent current-entity)))) (let ((rest mime-view-following-required-fields-list) field-name ret) (while rest (setq field-name (car rest)) (or (std11-field-body field-name) (progn (with-current-buffer the-buf (let ((entity (when mime-mother-buffer (set-buffer mime-mother-buffer) (get-text-property (point) 'mime-view-entity)))) (while (and entity (null (setq ret (mime-entity-fetch-field entity field-name)))) (setq entity (mime-entity-parent entity))))) (if ret (insert (concat field-name ": " ret "\n"))))) (setq rest (cdr rest))))) (let ((f (cdr (assq mode mime-preview-following-method-alist)))) (if (functionp f) (funcall f new-buf) (message "Sorry, following method for %s is not implemented yet." mode)))))) (defalias 'wl-draft-enclose-digest-region 'mime-edit-enclose-digest-region) (defun wl-draft-preview-attributes-list () (if (listp (car wl-draft-preview-attributes-list)) (elmo-uniq-list (nconc (and (wl-message-mail-p) (copy-sequence (cdr (assq 'mail wl-draft-preview-attributes-list)))) (and (wl-message-news-p) (copy-sequence (cdr (assq 'news wl-draft-preview-attributes-list)))))) wl-draft-preview-attributes-list)) (defun wl-draft-show-attributes-buffer (attribute-values) (let* ((cur-win (selected-window)) (size (min (- (window-height cur-win) window-min-height 1) (- (window-height cur-win) (max window-min-height (cond ((null (integerp wl-draft-preview-attributes-buffer-lines)) (1+ (length attribute-values))) ((<= 0 wl-draft-preview-attributes-buffer-lines) (1+ wl-draft-preview-attributes-buffer-lines)) (t ;; wl-draft-preview-attributes-buffer-lines is negative. (- (length attribute-values) -1 wl-draft-preview-attributes-buffer-lines)))))))) (split-window cur-win (if (> size 0) size window-min-height)) (select-window (next-window)) (let ((pop-up-windows nil)) (switch-to-buffer (get-buffer-create wl-draft-preview-attributes-buffer-name))) (with-current-buffer (get-buffer wl-draft-preview-attributes-buffer-name) (setq buffer-read-only t) (let (buffer-read-only) (erase-buffer) (dolist (pair attribute-values) (insert (capitalize (symbol-name (car pair))) ": " (format "%s" (or (cdr pair) "")) "\n")) (goto-char (point-min)) (wl-highlight-headers))) (select-window cur-win))) (defun wl-draft-hide-attributes-buffer () (let (window buffer) (when (setq window (get-buffer-window wl-draft-preview-attributes-buffer-name)) (select-window window) (delete-window)) (when (setq buffer (get-buffer wl-draft-preview-attributes-buffer-name)) (kill-buffer buffer)))) (defun wl-draft-attribute-recipients () (let (wl-draft-remove-group-list-contents) (mapconcat 'identity (nconc (wl-draft-deduce-address-list (current-buffer) (point-min) (save-excursion (goto-char (point-min)) (re-search-forward (concat "^" (regexp-quote mail-header-separator) "$") nil t) (point))) (wl-draft-parse-mailbox-list wl-draft-mime-bcc-field-name)) ", "))) (defun wl-draft-attribute-envelope-from () (or wl-envelope-from (wl-address-header-extract-address wl-from))) (defun wl-draft-attribute-smtp-posting-server () (or wl-smtp-posting-server (progn (require 'smtp) smtp-server) "localhost")) (defun wl-draft-attribute-smtp-posting-port () (or wl-smtp-posting-port (progn (require 'smtp) smtp-service))) (defvar wl-draft-attribute-show-smtp-settings-functions '(wl-draft-send-mail-with-smtp wl-draft-send-mail-with-pop-before-smtp)) (defun wl-draft-attribute-smtp-settings () (when (memq wl-draft-send-mail-function wl-draft-attribute-show-smtp-settings-functions) (concat (and wl-smtp-authenticate-type (format "%s/%s@" wl-smtp-posting-user (if (listp wl-smtp-authenticate-type) (concat "[" (mapconcat 'identity wl-smtp-authenticate-type ", ") "]") wl-smtp-authenticate-type))) (format "%s:%s, %s" (wl-draft-attribute-smtp-posting-server) (wl-draft-attribute-smtp-posting-port) (or wl-smtp-connection-type "direct"))))) (defvar wl-draft-attribute-show-pop-before-smtp-settings-functions '(wl-draft-send-mail-with-pop-before-smtp)) (defun wl-draft-attribute-pop-before-smtp-settings () (when (memq wl-draft-send-mail-function wl-draft-attribute-show-pop-before-smtp-settings-functions) (format "%s/%s@%s:%s, %s" (or wl-pop-before-smtp-user elmo-pop3-default-user) (or wl-pop-before-smtp-authenticate-type elmo-pop3-default-authenticate-type) (or wl-pop-before-smtp-server elmo-pop3-default-server) (or wl-pop-before-smtp-port elmo-pop3-default-port) (or (elmo-get-network-stream-type (or wl-pop-before-smtp-stream-type elmo-pop3-default-stream-type)) "direct")))) (defvar wl-draft-attribute-hide-send-mail-method-functions '(wl-draft-send-mail-with-smtp wl-draft-send-mail-with-pop-before-smtp)) (defvar wl-draft-attribute-send-mail-method-table '((wl-draft-send-mail-with-qmail . "qmail") (wl-draft-send-mail-with-sendmail . "sendmail"))) (defun wl-draft-attribute-send-mail-method () (cond ((memq wl-draft-send-mail-function wl-draft-attribute-hide-send-mail-method-functions) nil) ((assq wl-draft-send-mail-function wl-draft-attribute-send-mail-method-table) (cdr (assq wl-draft-send-mail-function wl-draft-attribute-send-mail-method-table))) (t wl-draft-send-mail-function))) (defun wl-draft-attribute-newsgroups () (std11-field-body "Newsgroups")) (defun wl-draft-nntp-attribute (attribute &optional alternatives) (let ((config (cdr (elmo-string-matched-assoc (std11-field-body "newsgroups") wl-nntp-posting-config-alist))) entry) (when (stringp config) (setq config (list (cons 'server config)))) (if (setq entry (assq attribute config)) ;; maybe nil (cdr entry) (let (value) (while alternatives (if (setq value (symbol-value (car alternatives))) (setq alternatives nil) (setq alternatives (cdr alternatives)))) value)))) (defun wl-draft-attribute-nntp-posting-function () (wl-draft-nntp-attribute 'function '(wl-nntp-posting-function))) (defun wl-draft-attribute-nntp-posting-user () (wl-draft-nntp-attribute 'user '(wl-nntp-posting-user elmo-nntp-default-user))) (defun wl-draft-attribute-nntp-posting-server () (wl-draft-nntp-attribute 'server '(wl-nntp-posting-server elmo-nntp-default-server))) (defun wl-draft-attribute-nntp-posting-port () (wl-draft-nntp-attribute 'port '(wl-nntp-posting-port elmo-nntp-default-port))) (defun wl-draft-attribute-nntp-posting-stream-type () (wl-draft-nntp-attribute 'stream-type '(wl-nntp-posting-stream-type elmo-nntp-default-stream-type))) (defvar wl-draft-attribute-show-nntp-settings-functions '(elmo-nntp-post)) (defvar wl-draft-attribute-nntp-method-table nil) (defun wl-draft-attribute-nntp-method () (let ((method (wl-draft-attribute-nntp-posting-function))) (cond ((memq method wl-draft-attribute-show-nntp-settings-functions) nil) ((assq method wl-draft-attribute-nntp-method-table) (cdr (assq method wl-draft-attribute-nntp-method-table))) (t method)))) (defun wl-draft-attribute-nntp-settings () (when (memq (wl-draft-attribute-nntp-posting-function) wl-draft-attribute-show-nntp-settings-functions) (let ((user (wl-draft-attribute-nntp-posting-user))) (concat (and user (concat user "@")) (format "%s:%s, %s" (wl-draft-attribute-nntp-posting-server) (wl-draft-attribute-nntp-posting-port) (or (wl-draft-attribute-nntp-posting-stream-type) "direct")))))) (defun wl-draft-attribute-pgp-processings () (when (and (null wl-draft-preview-process-pgp) wl-draft-preview-pgp-processing) (mapconcat #'symbol-name wl-draft-preview-pgp-processing ", "))) (defun wl-draft-attribute-value (attr) (let ((name (symbol-name attr)) fsymbol symbol) (cond ((and (setq fsymbol (intern-soft (format "wl-draft-attribute-%s" name))) (fboundp fsymbol)) (funcall fsymbol)) ((and (setq symbol (intern-soft (format "wl-%s" name))) (boundp symbol)) (symbol-value symbol)) ((boundp attr) (symbol-value attr))))) (defun wl-mime-quit-preview () "Quitting method for mime-view." (let* ((temp mime-edit-temp-message-buffer) (window (selected-window)) buf) (mime-preview-kill-buffer) (set-buffer temp) (setq buf mime-edit-buffer) (kill-buffer temp) (select-window window) (switch-to-buffer buf))) (defvar wl-draft-preview-pgp-processing nil) (make-variable-buffer-local 'wl-draft-preview-pgp-processing) (defun wl-draft-preview-message () "Preview editing message." (interactive) (let* (attribute-values (orig-buffer (current-buffer)) (current-point (point)) (config-exec-flag wl-draft-config-exec-flag) (parent-folder wl-draft-parent-folder) (mime-display-header-hook 'wl-highlight-headers) (mime-header-encode-method-alist (append '((wl-draft-eword-encode-address-list . (To Cc Bcc Resent-To Resent-Cc Resent-Bcc From))) mime-header-encode-method-alist)) mime-view-ignored-field-list ; all header. wl-draft-preview-pgp-processing (mime-edit-pgp-processing mime-edit-pgp-processing) (mime-edit-translate-buffer-hook (cons (lambda () (let ((wl-draft-config-exec-flag config-exec-flag) (wl-draft-parent-folder parent-folder) (copy-buffer (current-buffer))) (wl-copy-local-variables orig-buffer copy-buffer (with-current-buffer orig-buffer (append wl-draft-config-variables (wl-draft-clone-local-variables)))) (goto-char current-point) (run-hooks 'wl-draft-send-hook) (unless wl-draft-preview-process-pgp (setq wl-draft-preview-pgp-processing mime-edit-pgp-processing mime-edit-pgp-processing nil)) (condition-case err (setq attribute-values (delq nil (mapcar (lambda (attr) (let ((value (wl-draft-attribute-value attr))) (and value (cons attr value)))) (if wl-draft-preview-attributes (wl-draft-preview-attributes-list) '(recipients))))) (error (kill-buffer (current-buffer)) (signal (car err) (cdr err)))))) mime-edit-translate-buffer-hook))) (mime-edit-preview-message) (make-local-variable 'mime-preview-quitting-method-alist) (setq mime-preview-quitting-method-alist '((mime-temp-message-mode . wl-mime-quit-preview))) (let ((buffer-read-only nil)) (when wl-highlight-body-too (wl-highlight-body)) (run-hooks 'wl-draft-preview-message-hook)) (add-hook 'kill-buffer-hook #'wl-draft-hide-attributes-buffer nil t) (if wl-draft-preview-attributes (ignore-errors ; in case when the window is too small (wl-draft-show-attributes-buffer attribute-values)) (message (concat "Recipients: " (cdr (assq 'recipients attribute-values))))))) (defalias 'wl-draft-caesar-region 'mule-caesar-region) (defalias 'wl-draft-insert-message 'mime-edit-insert-message) (defalias 'wl-draft-insert-mail 'mime-edit-insert-mail) ;;; Message (defun wl-message-decode-mode (outbuf inbuf) (let ((mime-display-header-hook 'wl-highlight-headers)) (mime-view-mode nil nil nil inbuf outbuf))) (defun wl-message-decode-with-all-header (outbuf inbuf) (let ((mime-display-header-hook 'wl-highlight-headers) mime-view-ignored-field-list) (mime-view-mode nil nil nil inbuf outbuf))) (defun wl-message-delete-popup-windows () (dolist (buffer wl-message-popup-buffers) (when (or (stringp buffer) (and (symbolp buffer) (boundp buffer) (setq buffer (symbol-value buffer)))) (let ((window (get-buffer-window buffer))) (when window (delete-window window)))))) (defun wl-message-request-partial (folder number) (elmo-set-work-buf (elmo-message-fetch (wl-folder-get-elmo-folder folder) number (elmo-make-fetch-strategy 'entire) 'unread) (mime-parse-buffer nil))) (defalias 'wl-message-read 'mime-preview-scroll-up-entity) (defalias 'wl-message-next-content 'mime-preview-move-to-next) (defalias 'wl-message-prev-content 'mime-preview-move-to-previous) (defalias 'wl-message-play-content 'mime-preview-play-current-entity) (defalias 'wl-message-extract-content 'mime-preview-extract-current-entity) (defalias 'wl-message-quit 'mime-preview-quit) (defalias 'wl-message-button-dispatcher-internal 'mime-button-dispatcher) (defsubst wl-mime-node-id-to-string (node-id) (if (consp node-id) (mapconcat (lambda (num) (format "%s" (1+ num))) (reverse node-id) ".") "0")) (defun wl-message-delete-current-part () "Delete a part under the cursor from the multipart message." (interactive) (save-restriction (widen) (let* ((entity (get-text-property (point) 'mime-view-entity)) (node-id (mime-entity-node-id entity)) (filename (mime-entity-safe-filename entity)) (header-start (mime-buffer-entity-header-start-internal entity)) (body-end (mime-buffer-entity-body-end-internal entity)) (folder (wl-folder-get-elmo-folder wl-message-buffer-cur-folder)) (number wl-message-buffer-cur-number) (msgid (elmo-message-field folder number 'message-id)) (orig-buf wl-message-buffer-original-buffer)) (if (eq (luna-class-name entity) 'mime-elmo-imap-entity) (error "Please fetch the entire message (by typing 'C-u .') and try again")) (with-current-buffer orig-buf (unless (string-equal (buffer-string) (elmo-message-fetch-string folder number (elmo-make-fetch-strategy 'entire))) (error "Buffer content differs from actual message"))) (when (and (elmo-folder-writable-p folder) (buffer-live-p orig-buf) node-id (yes-or-no-p (format "Do you really want to delete part %s? " (wl-mime-node-id-to-string node-id)))) (when (with-temp-buffer (insert-buffer-substring orig-buf) (delete-region header-start body-end) (goto-char header-start) (insert "Content-Type: text/plain; charset=US-ASCII\n") (when filename (insert "Content-Disposition:" (mime-encode-field-body (concat "" (and filename (concat " inline; filename=" (std11-wrap-as-quoted-string filename)))) "Content-Disposition") "\n")) (insert "\n") (insert "** This part has been removed by Wanderlust **\n\n") (elmo-folder-append-buffer folder)) (elmo-folder-move-messages folder (list number) (wl-folder-get-elmo-folder wl-trash-folder)) (when (and (elmo-cache-get-path msgid) (file-exists-p (elmo-cache-get-path msgid))) (delete-file (elmo-cache-get-path msgid))) (mime-preview-quit) (wl-summary-delete-messages-on-buffer (list number)) (wl-summary-toggle-disp-msg 'off) (setq wl-message-buffer nil) (wl-summary-sync nil "update")))))) ;; PGP (defun wl-epg-progress-callback (_context _what _char current total reporter) (let ((label (elmo-progress-counter-label reporter))) (when label (elmo-progress-notify label :set current :total total)))) (eval-when-compile (require 'epg)) (declare-function epg-context-set-progress-callback "epg" (context progress-callback)) (declare-function epg-decrypt-string "epg" (context cipher)) (declare-function epg-verify-string "epg" (context signature &optional signed-text)) (declare-function epg-context-result-for "epg" (context name)) (declare-function epg-verify-result-to-string "epg" (verify-result)) (defun wl-mime-pgp-decrypt-region-with-epg (beg end &optional no-decode) (require 'epg) (let ((context (epg-make-context))) (elmo-with-progress-display (epg-decript nil reporter) "Decrypting" (epg-context-set-progress-callback context (cons #'wl-epg-progress-callback reporter)) (insert (prog1 (decode-coding-string (epg-decrypt-string context (buffer-substring beg end)) (if no-decode 'raw-text 'undecided)) (delete-region beg end))))) last-coding-system-used) (eval-when-compile (require 'epa)) (declare-function epa-display-info "epa" (info)) (defun wl-mime-pgp-verify-region-with-epg (beg end &optional coding-system) (require 'epa) (let ((context (epg-make-context)) window) (elmo-with-progress-display (epg-verify nil reporter) "Verifying" (epg-context-set-progress-callback context (cons #'wl-epg-progress-callback reporter)) (epg-verify-string context (encode-coding-string (buffer-substring beg end) (if coding-system (coding-system-change-eol-conversion coding-system 'dos) 'raw-text-dos)))) (when (epg-context-result-for context 'verify) (epa-display-info (epg-verify-result-to-string (epg-context-result-for context 'verify))) (when (and epa-popup-info-window (setq window (get-buffer-window epa-info-buffer))) (select-window window))))) (defsubst wl-mime-pgp-decrypt-region (beg end &optional no-decode) (cl-case wl-use-pgp-module (epg (wl-mime-pgp-decrypt-region-with-epg beg end no-decode)) (t (error "No support for PGP decryption")))) (defsubst wl-mime-pgp-verify-region (beg end &optional coding-system) (cl-case wl-use-pgp-module (epg (wl-mime-pgp-verify-region-with-epg beg end coding-system)) (t (error "No support for PGP verification")))) (defun wl-message-decrypt-pgp-nonmime () "Decrypt PGP encrypted region" (interactive) (save-excursion (beginning-of-line) (let ((region (wl-find-region "^-+BEGIN PGP MESSAGE-+$" "^-+END PGP MESSAGE-+$")) (inhibit-read-only t) coding-system) (unless region (error "Cannot find PGP encrypted region")) (save-restriction (let ((props (text-properties-at (car region)))) (narrow-to-region (car region) (cdr region)) (when (setq coding-system (wl-mime-pgp-decrypt-region (point-min) (point-max))) (setq props (plist-put props 'wl-mime-decoded-coding-system coding-system))) (set-text-properties (point-min) (point-max) props)))))) (defun wl-message-verify-pgp-nonmime (&optional arg) "Verify PGP signed region. With ARG, ask coding system and encode the region with it before verifying." (interactive "P") (save-excursion (beginning-of-line) (let ((region (wl-find-region "^-+BEGIN PGP SIGNED MESSAGE-+$" "^-+END PGP SIGNATURE-+$")) coding-system) (unless region (error "Cannot find PGP signed region")) (setq coding-system (or (get-text-property (car region) 'wl-mime-decoded-coding-system) (let* ((situation (mime-preview-find-boundary-info)) (entity (aref situation 2))) (mime-charset-to-coding-system (mime-content-type-parameter (mime-entity-content-type entity) "charset"))) buffer-file-coding-system)) (when arg (setq coding-system (read-coding-system (format "Coding system (%S): " coding-system) coding-system))) (wl-mime-pgp-verify-region (car region) (cdr region) coding-system)))) (defvar wl-mime-pgp-decrypted-buffers nil) (defun wl-mime-pgp-kill-decrypted-buffers () (dolist (buffer wl-mime-pgp-decrypted-buffers) (when (bufferp buffer) (kill-buffer buffer)))) (defun wl-mime-preview-application/pgp (parent-entity entity _situation) (goto-char (point-max)) (let ((p (point)) representation-type child-entity buffer failed) (goto-char p) (save-restriction (narrow-to-region p p) (setq buffer (generate-new-buffer (concat wl-original-message-buffer-name "PGP*"))) (with-current-buffer buffer (mime-insert-entity entity) (when (progn (goto-char (point-min)) (re-search-forward "^-+BEGIN PGP MESSAGE-+$" nil t)) (condition-case error (wl-mime-pgp-decrypt-region (point-min) (point-max) 'no-decode) (error (setq failed error))) (setq representation-type 'elmo-buffer)) (unless failed (setq child-entity (mime-parse-message (mm-expand-class-name representation-type) nil parent-entity (mime-entity-node-id-internal parent-entity)) buffer-read-only t))) (if failed (progn (insert (format "%s" (cdr failed))) (kill-buffer buffer)) (add-hook 'kill-buffer-hook 'wl-mime-pgp-kill-decrypted-buffers nil t) (make-local-variable 'wl-mime-pgp-decrypted-buffers) (add-to-list 'wl-mime-pgp-decrypted-buffers buffer) (mime-display-entity child-entity nil `((header . visible) (body . visible) (entity-button . invisible))))))) (defun wl-mime-preview-application/pgp-encrypted (entity situation) (let* ((entity-node-id (mime-entity-node-id entity)) (mother (mime-entity-parent entity)) (knum (car entity-node-id)) (onum (if (> knum 0) (1- knum) (1+ knum))) (orig-entity (nth onum (mime-entity-children mother)))) (wl-mime-preview-application/pgp entity orig-entity situation))) ;;; Summary (defun wl-summary-burst-subr (message-entity target number) ;; returns new number. (let (content-type) (setq content-type (mime-entity-content-type message-entity)) (cond ((eq (cdr (assq 'type content-type)) 'multipart) (dolist (entity (mime-entity-children message-entity)) (setq number (wl-summary-burst-subr entity target number)))) ((and (eq (cdr (assq 'type content-type)) 'message) (eq (cdr (assq 'subtype content-type)) 'rfc822)) (message "Bursting...%s" (setq number (+ 1 number))) (with-temp-buffer (set-buffer-multibyte nil) (insert (mime-entity-body message-entity)) (elmo-folder-append-buffer target)))) number)) (defun wl-summary-burst (&optional arg) "De-capsulate embedded messages in MIME format. With ARG, ask destination folder." (interactive "P") (let ((raw-buf (wl-summary-get-original-buffer)) (view-buf wl-message-buffer) message-entity target) (save-excursion (when (and (null arg) (elmo-folder-writable-p wl-summary-buffer-elmo-folder)) (setq target wl-summary-buffer-elmo-folder)) (while (null target) (let ((name (wl-summary-read-folder wl-default-folder "to extract to"))) (setq target (wl-folder-get-elmo-folder name)) (unless (elmo-folder-writable-p target) (message "%s is not writable" name) (setq target nil) (sit-for 1)))) (wl-summary-set-message-buffer-or-redisplay) (with-current-buffer view-buf (setq message-entity (get-text-property (point-min) 'mime-view-entity))) (when message-entity (message "Bursting...") (with-current-buffer raw-buf (wl-summary-burst-subr message-entity target 0)) (message "Bursting...done")) (if (elmo-folder-plugged-p target) (elmo-folder-check target))) (when (and target (string= wl-summary-buffer-folder-name (elmo-folder-name-internal target))) (save-excursion (wl-summary-sync-update))))) ;; internal variable. (defvar wl-mime-save-directory nil "Last saved directory.") ;;; Yet another save method. (defun wl-mime-save-content (entity _situation) (let ((filename (expand-file-name (read-file-name "Save to file: " (or wl-mime-save-directory wl-temporary-file-directory) nil nil (or (mime-entity-safe-filename entity) "."))))) (while (file-directory-p filename) (setq filename (read-file-name "Please set filename (not directory): " filename))) (if (and (file-exists-p filename) (not (yes-or-no-p (format "File %s exists. Save anyway? " filename)))) (message "Not saved") (setq wl-mime-save-directory (file-name-directory filename)) (mime-write-entity-content entity filename)))) (defun wl-summary-extract-attachments-1 (message-entity directory number) ;; returns new number. (let (children filename) (cond ((setq children (mime-entity-children message-entity)) (dolist (entity children) (setq number (wl-summary-extract-attachments-1 entity directory number)))) ((and (eq (mime-content-disposition-type (mime-entity-content-disposition message-entity)) 'attachment) (setq filename (mime-entity-safe-filename message-entity))) (let ((full (expand-file-name filename directory))) (when (or (not (file-exists-p full)) (yes-or-no-p (format "File %s exists. Save anyway? " filename))) (message "Extracting...%s" (setq number (+ 1 number))) (mime-write-entity-content message-entity full))))) number)) (defun wl-summary-extract-attachments (directory) "Extract attachment parts in MIME format into the DIRECTORY." (interactive (let* ((default (or wl-mime-save-directory wl-temporary-file-directory)) (directory (read-directory-name "Extract to " default default t))) (list (if (> (length directory) 0) directory default)))) (unless (and (file-writable-p directory) (file-directory-p directory)) (error "%s is not writable" directory)) (save-excursion (wl-summary-set-message-buffer-or-redisplay) (let ((entity (get-text-property (point-min) 'mime-view-entity))) (when entity (message "Extracting...") (wl-summary-extract-attachments-1 entity directory 0) (message "Extracting...done"))))) ;;; Yet another combine method. (defun wl-mime-combine-message/partial-pieces (entity situation) "Internal method for wl to combine message/partial messages automatically." (interactive) (let* ((folder (with-current-buffer wl-message-buffer-cur-summary-buffer wl-summary-buffer-elmo-folder)) (mime-display-header-hook 'wl-highlight-headers) (id (or (cdr (assoc "id" situation)) "")) (mother (current-buffer)) (summary-buf wl-message-buffer-cur-summary-buffer) subject-id (root-dir (expand-file-name (concat "m-prts-" (user-login-name)) temporary-file-directory)) full-file) (setq root-dir (concat root-dir "/" (replace-as-filename id))) (setq full-file (concat root-dir "/FULL")) (if (or (file-exists-p full-file) (not (y-or-n-p "Merge partials? "))) (with-current-buffer mother (mime-store-message/partial-piece entity situation) (setq wl-message-buffer-cur-summary-buffer summary-buf) (make-local-variable 'mime-preview-over-to-next-method-alist) (setq mime-preview-over-to-next-method-alist (cons (cons 'mime-show-message-mode 'wl-message-exit) mime-preview-over-to-next-method-alist)) (make-local-variable 'mime-preview-over-to-previous-method-alist) (setq mime-preview-over-to-previous-method-alist (cons (cons 'mime-show-message-mode 'wl-message-exit) mime-preview-over-to-previous-method-alist))) (setq subject-id (eword-decode-string (decode-mime-charset-string (mime-entity-read-field entity 'Subject) wl-summary-buffer-mime-charset))) (if (string-match "[0-9\n]+" subject-id) (setq subject-id (substring subject-id 0 (match-beginning 0)))) (catch 'tag (elmo-folder-do-each-message-entity (entity folder) (when (string-match (regexp-quote subject-id) (elmo-message-entity-field entity 'subject)) (let* ((message ;; request message at the cursor in Subject buffer. (wl-message-request-partial (elmo-folder-name-internal folder) (elmo-message-entity-number entity))) (situation (mime-entity-situation message)) (the-id (or (cdr (assoc "id" situation)) ""))) (when (string= (downcase the-id) (downcase id)) (with-current-buffer mother (mime-store-message/partial-piece message situation)) (if (file-exists-p full-file) (throw 'tag nil)))))) (message "Not all partials found."))))) (defun wl-mime-display-text/plain (entity situation) (let ((beg (point))) (mime-display-text/plain entity situation) (wl-highlight-message beg (point-max) t t))) (defun wl-mime-display-header (entity situation) (let ((elmo-message-ignored-field-list (if wl-message-buffer-require-all-header nil wl-message-ignored-field-list)) (elmo-message-visible-field-list wl-message-visible-field-list) (elmo-message-sorted-field-list wl-message-sort-field-list)) (elmo-mime-insert-header entity situation) (wl-highlight-headers))) (autoload 'mime-decrypt-application/pgp-encrypted "mime-pgp") (defun wl-mime-decrypt-application/pgp-encrypted (entity situation) (let ((summary-buffer wl-message-buffer-cur-summary-buffer) (original-buffer wl-message-buffer-original-buffer)) (mime-decrypt-application/pgp-encrypted entity situation) (setq wl-message-buffer-cur-summary-buffer summary-buffer) (setq wl-message-buffer-original-buffer original-buffer))) ;;; Setup methods. (defun wl-mime-setup () (set-alist 'mime-preview-quitting-method-alist 'wl-original-message-mode 'wl-message-exit) (set-alist 'mime-view-over-to-previous-method-alist 'wl-original-message-mode 'wl-message-exit) (set-alist 'mime-view-over-to-next-method-alist 'wl-original-message-mode 'wl-message-exit) (set-alist 'mime-preview-over-to-previous-method-alist 'wl-original-message-mode 'wl-message-exit) (set-alist 'mime-preview-over-to-next-method-alist 'wl-original-message-mode 'wl-message-exit) (add-hook 'wl-summary-toggle-disp-off-hook 'wl-message-delete-popup-windows) (add-hook 'wl-summary-redisplay-hook 'wl-message-delete-popup-windows) (add-hook 'wl-message-exit-hook 'wl-message-delete-popup-windows) (ctree-set-calist-strictly 'mime-preview-condition '((type . text) (subtype . plain) (body . visible) (body-presentation-method . wl-mime-display-text/plain) (major-mode . wl-original-message-mode))) (ctree-set-calist-strictly 'mime-preview-condition '((type . application)(subtype . pgp-encrypted) (encoding . t) (body . invisible) (body-presentation-method . wl-mime-preview-application/pgp-encrypted) (major-mode . wl-original-message-mode))) (ctree-set-calist-strictly 'mime-acting-condition '((type . message) (subtype . partial) (method . wl-mime-combine-message/partial-pieces) (request-partial-message-method . wl-message-request-partial) (major-mode . wl-original-message-mode))) (ctree-set-calist-strictly 'mime-acting-condition '((type . application) (subtype . pgp-encrypted) (method . wl-mime-decrypt-application/pgp-encrypted) (major-mode . wl-original-message-mode))) (ctree-set-calist-strictly 'mime-acting-condition '((mode . "extract") (major-mode . wl-original-message-mode) (method . wl-mime-save-content))) (set-alist 'mime-preview-following-method-alist 'wl-original-message-mode (function wl-message-follow-current-entity)) (set-alist 'mime-edit-message-inserter-alist 'wl-draft-mode (function wl-draft-insert-current-message)) (set-alist 'mime-edit-mail-inserter-alist 'wl-draft-mode (function wl-draft-insert-get-message)) (set-alist 'mime-edit-split-message-sender-alist 'wl-draft-mode (cdr (assq 'mail-mode mime-edit-split-message-sender-alist))) (set-alist 'mime-raw-representation-type-alist 'wl-original-message-mode 'binary) ;; Sort and highlight header fields. (or wl-message-ignored-field-list (setq wl-message-ignored-field-list mime-view-ignored-field-list)) (or wl-message-visible-field-list (setq wl-message-visible-field-list mime-view-visible-field-list)) (set-alist 'mime-header-presentation-method-alist 'wl-original-message-mode 'wl-mime-display-header) ;; To avoid overriding wl-draft-mode-map. (when mime-setup-use-signature (unless (assq 'wl-draft-mode mime-setup-signature-key-alist) (setq mime-setup-signature-key-alist (cons '(wl-draft-mode . "\C-c\C-w") mime-setup-signature-key-alist))))) (require 'product) (product-provide (provide 'wl-mime) (require 'wl-version)) ;;; wl-mime.el ends here wanderlust-wanderlust-769699d/wl/wl-news.el.in000066400000000000000000000233721406661363500213610ustar00rootroot00000000000000;;; wl-news.el --- Create notification from NEWS(.ja) for Wanderlust. ;; Copyright (C) 2002 Yoichi NAKAYAMA ;; Copyright (C) 2002 Kenichi OKADA ;; Author: Yoichi NAKAYAMA ;; Kenichi OKADA ;; Keywords: mail, net news ;; This file is part of Wanderlust (Yet Another Message Interface on Emacsen). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'elmo) (require 'wl-vars) (require 'wl-util) (require 'wl-address) (require 'wl-folder) (defvar wl-news-version-file-name "previous-version") (defvar wl-news-default-previous-version '(2 0 0)) (defvar wl-news-lang (if (string-equal "Japanese" (symbol-value 'current-language-environment)) '("ja" "en") '("en" "ja")) "The list of languages to show NEWS. (order sensitive)") (defun wl-news-check () (let* ((updated (not (wl-news-already-current-p)))) (if updated (if (and wl-news-lang (wl-news-check-news (cdr (wl-news-previous-version-load)) wl-news-lang) (not (memq 'wl-news wl-hook))) (add-hook 'wl-hook 'wl-news)) ;; update wl-news-version-file (wl-news-previous-version-save (product-version (product-find 'wl-version)) (cdr (wl-news-previous-version-load)))) updated)) ;;; -*- news-list -*- ;;; -*- news-list-end -*- (defun wl-news-previous-version-load () (with-temp-buffer (let ((filename (expand-file-name wl-news-version-file-name elmo-msgdb-directory)) insert-file-contents-pre-hook insert-file-contents-post-hook ret-val) (if (not (file-readable-p filename)) (cons wl-news-default-previous-version wl-news-default-previous-version) (insert-file-contents filename) (condition-case nil (read (current-buffer)) (error nil nil)))))) (defun wl-news-previous-version-save (current-version previous-version) (with-temp-buffer (let ((filename (expand-file-name wl-news-version-file-name elmo-msgdb-directory)) print-length print-level) (prin1 (cons current-version previous-version) (current-buffer)) (princ "\n" (current-buffer)) (if (file-writable-p filename) (write-region (point-min) (point-max) filename nil 'no-msg) (message "%s is not writable." filename))))) (defun wl-news-append-news (lang previous-version &optional no-mime-tag) (require 'wl-mime) (let ((news-list (cdr (assoc lang wl-news-news-alist))) ret) (when news-list (if no-mime-tag (insert "--------------\n") (mime-edit-insert-tag "text" "plain" "" "")) (while (< 0 (product-version-compare (car (car news-list)) previous-version)) (setq ret t) (insert (cdr (car news-list)) "\n\n") (setq news-list (cdr news-list)))) ret)) (defun wl-news-check-news (version news-lang) (let ((lang news-lang) news-list ret) (while (car lang) (setq news-list (cdr (assoc (car lang) wl-news-news-alist))) (while (< 0 (product-version-compare (car (car news-list)) version)) (setq ret t) (setq news-list (cdr news-list))) (setq lang (cdr lang))) ret)) (defun wl-news-already-current-p () (>= 0 (product-version-compare (product-version (product-find 'wl-version)) (car (wl-news-previous-version-load))))) (defun wl-news-send-news (version news-lang folder) (require 'wl-draft) (let ((lang (if (listp wl-news-lang) wl-news-lang (list wl-news-lang))) send-buffer wl-fcc wl-bcc ret) (save-window-excursion (set-buffer (setq send-buffer (wl-draft-create-buffer))) (wl-draft-create-contents (list (cons 'From "WL Release 'Bot ") (cons 'To (wl-draft-eword-encode-address-list wl-from)) (cons 'Subject "Wanderlust NEWS") (cons 'Date (wl-make-date-string)) (cons 'User-Agent wl-generate-mailer-string-function))) (wl-draft-insert-mail-header-separator) (wl-draft-prepare-edit) (goto-char (point-max)) (insert "\nThis message is automatically generated by Wanderlust.\n\n") ;; insert news (while (car lang) (wl-news-append-news (car lang) version) (setq lang (cdr lang))) ;; encode (let ((mime-header-encode-method-alist '((eword-encode-unstructured-field-body)))) (mime-edit-translate-buffer)) (wl-draft-get-header-delimiter t) (setq ret (and (elmo-folder-writable-p (wl-folder-get-elmo-folder folder)) (elmo-folder-append-buffer (wl-folder-get-elmo-folder folder)))) (wl-draft-hide send-buffer) (wl-draft-delete send-buffer)) ret)) ;;; wl-news-mode (defvar wl-news-buf-name "NEWS") (defvar wl-news-mode-map nil) (defvar wl-news-winconf nil) (defvar wl-news-buffer-oldest-version nil) (make-variable-buffer-local 'wl-news-buffer-oldest-version) (unless wl-news-mode-map (setq wl-news-mode-map (make-sparse-keymap)) (define-key wl-news-mode-map "q" 'wl-news-exit) (define-key wl-news-mode-map "Q" 'wl-news-force-exit) (define-key wl-news-mode-map "\C-xk" 'wl-news-exit) (define-key wl-news-mode-map "a" 'wl-news-show-all) (define-key wl-news-mode-map "m" 'wl-news-append-to-folder) (define-key wl-news-mode-map "\C-m" 'wl-news-next-line) (define-key wl-news-mode-map " " 'wl-news-next-page) (define-key wl-news-mode-map "\177" 'wl-news-previous-page) ;; re-bind commands of outline-mode (define-key wl-news-mode-map "n" 'outline-next-visible-heading) (define-key wl-news-mode-map "p" 'outline-previous-visible-heading) (define-key wl-news-mode-map "u" 'outline-up-heading) (define-key wl-news-mode-map "N" 'outline-forward-same-level) (define-key wl-news-mode-map "P" 'outline-backward-same-level)) (require 'derived) (define-derived-mode wl-news-mode outline-mode "NEWS" "Mode for Wanderlust NEWS(.ja)." (setq buffer-read-only t)) (defun wl-news (&optional arg) (interactive "P") (remove-hook 'wl-hook 'wl-news) (let* ((previous-version (if arg wl-news-default-previous-version (cdr (wl-news-previous-version-load)))) (lang wl-news-lang) window-lines lines) (if (or (get-buffer wl-news-buf-name) (if (wl-news-check-news previous-version wl-news-lang) (progn (setq wl-news-winconf (current-window-configuration)) (set-buffer (get-buffer-create wl-news-buf-name)) (wl-news-mode) (setq wl-news-buffer-oldest-version previous-version) (buffer-disable-undo (current-buffer)) ;; insert news (let ((buffer-read-only nil)) (insert "--- Wanderlust NEWS --- press 'a' to show all NEWS\n") (insert " press 'm' to mail this NEWS to your folder\n") (insert " press 'q' to quit\n") (insert " press 'Q' to force quit\n\n") (while (car lang) (wl-news-append-news (car lang) previous-version t) (setq lang (cdr lang)))) t) (message "No NEWS.") nil)) (progn (switch-to-buffer wl-news-buf-name) (delete-other-windows) (goto-char (point-min)))))) (defun wl-news-next-line () (interactive) (scroll-up 1)) (defun wl-news-next-page () (interactive) (scroll-up)) (defun wl-news-previous-page () (interactive) (scroll-down)) (defun wl-news-show-all () (interactive) (when (eq major-mode 'wl-news-mode) (kill-buffer (current-buffer)) (wl-news t))) (defun wl-news-exit () (interactive) (let* ((oldest-version (cdr (wl-news-previous-version-load))) (current-version (product-version (product-find 'wl-version))) (new-old-version current-version) (buf (get-buffer wl-news-buf-name))) (when buf (if (wl-news-check-news oldest-version wl-news-lang) (if (y-or-n-p "Do you want to see this message again? ") (progn (message "Please M-x wl-news if you want to see it.") (setq new-old-version oldest-version)))) (wl-news-previous-version-save current-version new-old-version) (kill-buffer (current-buffer)) (if wl-news-winconf (set-window-configuration wl-news-winconf)) (kill-buffer buf) (if wl-news-winconf (set-window-configuration wl-news-winconf))))) (defun wl-news-append-to-folder () (interactive) (let* ((current-version (product-version (product-find 'wl-version))) (new-old-version current-version) (folder wl-default-folder)) (if (or (and (elmo-folder-writable-p (wl-folder-get-elmo-folder folder)) (y-or-n-p (format "Do you want to append this message to %s ? " wl-default-folder))) (setq folder (wl-summary-read-folder wl-default-folder "to append "))) (or (wl-news-send-news wl-news-buffer-oldest-version wl-news-lang folder) (error "Cannot append NEWS mail to %s" folder))))) (defun wl-news-force-exit () (interactive) (let ((buf)) (when (setq buf (get-buffer wl-news-buf-name)) (wl-news-previous-version-save (product-version (product-find 'wl-version)) (cdr (wl-news-previous-version-load))) (kill-buffer buf) (if wl-news-winconf (set-window-configuration wl-news-winconf))))) (require 'product) (product-provide (provide 'wl-news) (require 'wl-version)) ;; Local Variables: ;; no-byte-compile: t ;; End: ;;; wl-news.el ends here wanderlust-wanderlust-769699d/wl/wl-qs.el000066400000000000000000000113571406661363500204230ustar00rootroot00000000000000;;; wl-qs.el --- Prompt for a query string and display search results. -*- lexical-binding: t -*- ;; Copyright (C) 2014-2015 Erik Hetzner ;; Author: Erik Hetzner ;; Keywords: mail, net news ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;;; Commentary: ;;; Code: (require 'elmo-imap4) (require 'elmo-search) (require 'wl-folder) (require 'wl-summary) (require 'wl-util) (defgroup wl-quicksearch nil "Wanderlust Quicksearch feature." :prefix "wl-" :group 'wl) (defcustom wl-quicksearch-folder nil "Folder to use for wl-quicksearch search. To use an external search program, speficy a search folder, e.g. \"[]\". To define a search target to pass for the grep engine, use \"[]~/Mail/inbox\". To use a different search engine, use e.g. \"[]!grep\". To use Gmail's raw search, use a gmail folder, e.g. \"%[Gmail]/All Mail:USERNAME@imap.gmail.com\". Any other type of folder will be searched using a filter folder." :group 'wl-quicksearch :type 'string) (defcustom wl-quicksearch-gmail-servers "gmail\\.com$" "Use Gmail's raw search when imap server name is matched with this regexp." :group 'wl-quicksearch :type '(choice (const :tag "Never use Gmail's raw search" nil) regexp)) (defun wl-quicksearch-goto-search-folder-subr (folder-name) (if (eq major-mode 'wl-folder-mode) (wl-folder-goto-folder-subr folder-name) (let (wl-ask-range) (wl-summary-goto-folder-subr folder-name nil nil nil t)))) (luna-define-generic wl-quicksearch-goto-search-folder (base-folder) "Prompt for a query and jump to the quicksearch folder for BASE-FOLDER.") (luna-define-method wl-quicksearch-goto-search-folder ((base-folder elmo-search-folder)) "Prompt for a search condition and jump to a new search folder. Folder is the same BASE-FOLDER but with a new search pattern." (let* ((engine (elmo-search-folder-engine-internal base-folder)) (base-folder-name (elmo-folder-name-internal base-folder)) (engine-type (or (and (string-match "!\\(.*\\)$" base-folder-name) (match-string 1 base-folder-name)) elmo-search-default-engine)) (q (wl-quicksearch-escape-query-string (read-string (format "%s query: " engine-type))))) (wl-quicksearch-goto-search-folder-subr (format (format "[\"%s\"]%s!%s" q (elmo-search-engine-param-internal engine) engine-type))))) (defun wl-quicksearch-escape-query-string (str) "Replace single quotes (') in STR with double quotes (\"), then escape double-quotes." (replace-regexp-in-string "\"\\|'" "\\\"" str t t)) (luna-define-method wl-quicksearch-goto-search-folder ((base-folder elmo-folder)) "Prompt for a search condition and jump to filter folder that searches BASE-FOLDER." (wl-quicksearch-goto-search-folder-subr (concat "/" (wl-read-search-condition wl-fldmgr-make-filter-default) "/" (elmo-folder-name-internal base-folder)))) (luna-define-method wl-quicksearch-goto-search-folder :around ((base-folder elmo-imap4-folder)) "Jump to the quicksearch folder for BASE-FOLDER. If BASE-FOLDER is a gmail.com folder, use raw gmail query. Otherwise call parent method." (if (and wl-quicksearch-gmail-servers (elmo-folder-plugged-p base-folder) (eq (elmo-folder-type-internal base-folder) 'imap4) (string-match wl-quicksearch-gmail-servers (elmo-net-folder-server-internal base-folder))) (let* ((q (wl-quicksearch-escape-query-string (read-string "gmail query: ")))) (wl-quicksearch-goto-search-folder-subr (format "/x-gm-raw:\"%s\"/%s" q (elmo-folder-name-internal base-folder)))) (luna-call-next-method))) ;;;###autoload (defun wl-quicksearch-goto-search-folder-wrapper () "Call `wl-quicksearch-goto-search-folder' on a folder built from `wl-quicksearch-folder'." (interactive) (if (null wl-quicksearch-folder) (error "The variable `wl-quicksearch-folder' is not set. Please customize")) (wl-quicksearch-goto-search-folder (wl-folder-make-elmo-folder wl-quicksearch-folder))) (provide 'wl-qs) ;;; wl-qs.el ends here wanderlust-wanderlust-769699d/wl/wl-refile.el000066400000000000000000000214051406661363500212410ustar00rootroot00000000000000;;; wl-refile.el --- Refile modules for Wanderlust. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Author: Yuuichi Teranishi ;; Keywords: mail, net news ;; This file is part of Wanderlust (Yet Another Message Interface on Emacsen). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'wl-vars) (require 'wl-util) (require 'wl-address) (defvar wl-refile-alist nil) (defvar wl-refile-alist-file-name "refile-alist") ;; should be renamed to "refile-from-alist" (defvar wl-refile-msgid-alist nil) (defvar wl-refile-msgid-alist-file-name "refile-msgid-alist") (defvar wl-refile-subject-alist nil) (defvar wl-refile-subject-alist-file-name "refile-subject-alist") (defvar wl-refile-default-from-folder-path-separator "/") (defvar wl-refile-alist-max-length 1000) ;; ;; refile guess ;; (defvar wl-refile-guess-functions '(wl-refile-guess-by-rule wl-refile-guess-by-msgid wl-refile-guess-by-subject wl-refile-guess-by-history wl-refile-guess-by-from) "*Functions in this list are used for guessing refile destination folder.") (defun wl-refile-alist-setup () (let ((flist wl-refile-guess-functions)) (while flist (cond ((eq (car flist) 'wl-refile-guess-by-history) (setq wl-refile-alist (elmo-object-load (expand-file-name wl-refile-alist-file-name elmo-msgdb-directory) elmo-mime-charset))) ((eq (car flist) 'wl-refile-guess-by-msgid) (setq wl-refile-msgid-alist (elmo-object-load (expand-file-name wl-refile-msgid-alist-file-name elmo-msgdb-directory) elmo-mime-charset))) ((eq (car flist) 'wl-refile-guess-by-subject) (setq wl-refile-subject-alist (elmo-object-load (expand-file-name wl-refile-subject-alist-file-name elmo-msgdb-directory) elmo-mime-charset)))) (setq flist (cdr flist))))) (defun wl-refile-alist-save () (if wl-refile-alist (wl-refile-alist-save-file wl-refile-alist-file-name wl-refile-alist)) (if wl-refile-msgid-alist (wl-refile-alist-save-file wl-refile-msgid-alist-file-name wl-refile-msgid-alist)) (if wl-refile-subject-alist (wl-refile-alist-save-file wl-refile-subject-alist-file-name wl-refile-subject-alist))) (defun wl-refile-alist-save-file (file-name alist) (if (> (length alist) wl-refile-alist-max-length) (setcdr (nthcdr (1- wl-refile-alist-max-length) alist) nil)) (elmo-object-save (expand-file-name file-name elmo-msgdb-directory) alist elmo-mime-charset)) (defun wl-refile-learn (entity dst) (let (tocc-list from key hit ml) (setq dst (substring-no-properties dst)) (setq tocc-list (mapcar (lambda (entity) (downcase (wl-address-header-extract-address entity))) (append (elmo-message-entity-field entity 'to) (elmo-message-entity-field entity 'cc)))) (while tocc-list (if (elmo-string-member (car tocc-list) (mapcar (function downcase) wl-subscribed-mailing-list)) (setq ml (car tocc-list) tocc-list nil) (setq tocc-list (cdr tocc-list)))) (if ml (setq key ml) ; subscribed entity!! (or (wl-address-user-mail-address-p (setq from (downcase (wl-address-header-extract-address (elmo-message-entity-field entity 'from))))) (setq key from)) (if (or wl-refile-msgid-alist (memq 'wl-refile-guess-by-msgid wl-refile-guess-functions)) (wl-refile-msgid-learn entity dst)) (if (or wl-refile-subject-alist (memq 'wl-refile-guess-by-subject wl-refile-guess-functions)) (wl-refile-subject-learn entity dst))) (when key (if (setq hit (assoc key wl-refile-alist)) (setq wl-refile-alist (delq hit wl-refile-alist))) (setq wl-refile-alist (cons (cons key dst) wl-refile-alist))))) (defun wl-refile-msgid-learn (entity dst) (let ((key (elmo-message-entity-field entity 'message-id)) hit) (setq dst (substring-no-properties dst)) (if key (if (setq hit (assoc key wl-refile-msgid-alist)) (setcdr hit dst) (setq wl-refile-msgid-alist (cons (cons key dst) wl-refile-msgid-alist)))))) (defun wl-refile-subject-learn (entity dst) (let ((subject (funcall wl-summary-subject-filter-function (elmo-message-entity-field entity 'subject))) hit) (setq dst (substring-no-properties dst)) (if (and subject (not (string= subject ""))) (if (setq hit (assoc subject wl-refile-subject-alist)) (setcdr hit dst) (setq wl-refile-subject-alist (cons (cons subject dst) wl-refile-subject-alist)))))) ;; 2000-11-05: *-func-list -> *-functions (elmo-define-obsolete-variable 'wl-refile-guess-func-list 'wl-refile-guess-functions) (defun wl-refile-guess (entity &optional functions) (let ((flist (or functions wl-refile-guess-functions)) guess) (while flist (if (setq guess (funcall (car flist) entity)) (setq flist nil) (setq flist (cdr flist)))) guess)) (defun wl-refile-evaluate-rule (rule entity) "Return folder string if RULE is matched to ENTITY. If RULE does not match ENTITY, returns nil." (let ((case-fold-search t) fields guess pairs value) (cond ((stringp rule) rule) ((listp (car rule)) (setq fields (car rule)) (while fields (if (setq guess (wl-refile-evaluate-rule (append (list (car fields)) (cdr rule)) entity)) (setq fields nil) (setq fields (cdr fields)))) guess) ((stringp (car rule)) (setq pairs (cdr rule)) (setq value (wl-refile-get-field-value entity (car rule))) (while pairs (if (and (stringp value) (string-match (car (car pairs)) value) (setq guess (elmo-expand-newtext (wl-refile-evaluate-rule (cdr (car pairs)) entity) value))) (setq pairs nil) (setq pairs (cdr pairs)))) guess) (t (error "Invalid structure for wl-refile-rule-alist"))))) (defun wl-refile-get-field-value (entity field) "Get FIELD value from ENTITY." (elmo-message-entity-field entity (intern (downcase field)) 'string)) (defun wl-refile-guess-by-rule (entity) (let ((rules wl-refile-rule-alist) guess) (while rules (if (setq guess (wl-refile-evaluate-rule (car rules) entity)) (setq rules nil) (setq rules (cdr rules)))) guess)) (defun wl-refile-guess-by-history (entity) (let ((tocc-list (mapcar (lambda (entity) (downcase (wl-address-header-extract-address entity))) (append (elmo-message-entity-field entity 'to) (elmo-message-entity-field entity 'cc)))) ret-val) (setq tocc-list (wl-address-delete-user-mail-addresses tocc-list)) (while tocc-list (if (setq ret-val (cdr (assoc (car tocc-list) wl-refile-alist))) (setq tocc-list nil) (setq tocc-list (cdr tocc-list)))) ret-val)) (defun wl-refile-get-account-part-from-address (address) (if (string-match "\\([^@]+\\)@[^@]+" address) (match-string 1 address) address)) (defun wl-refile-guess-by-from (entity) (let ((from (downcase (wl-address-header-extract-address (elmo-message-entity-field entity 'from)))) (folder (elmo-make-folder wl-refile-default-from-folder)) (elmo-path-sep wl-refile-default-from-folder-path-separator)) ;; search from alist (or (cdr (assoc from wl-refile-alist)) (concat (elmo-folder-prefix-internal folder) (elmo-concat-path (substring wl-refile-default-from-folder (length (elmo-folder-prefix-internal folder))) (wl-refile-get-account-part-from-address from)))))) (defun wl-refile-guess-by-msgid (entity) (let ((references (elmo-message-entity-field entity 'references)) result) ;; In old msgdb, references's field is a string. (when (stringp references) (setq references (list references))) (while references (setq references (if (setq result (cdr (assoc (car references) wl-refile-msgid-alist))) nil (cdr references))) result))) (defun wl-refile-guess-by-subject (entity) (cdr (assoc (funcall wl-summary-subject-filter-function (elmo-message-entity-field entity 'subject)) wl-refile-subject-alist))) (require 'product) (product-provide (provide 'wl-refile) (require 'wl-version)) ;;; wl-refile.el ends here wanderlust-wanderlust-769699d/wl/wl-score.el000066400000000000000000001342501406661363500211110ustar00rootroot00000000000000;;; wl-score.el --- Scoring in Wanderlust. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000 Masahiro MURATA ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Author: Masahiro MURATA ;; Keywords: mail, net news ;; This file is part of Wanderlust (Yet Another Message Interface on Emacsen). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; Original codes are gnus-score.el and score-mode.el ;;; Code: ;; (require 'wl-vars) (require 'wl-util) (require 'cl-lib) ; cadaar, cddaar (eval-when-compile (require 'static) (require 'elmo-msgdb)) ; for inline functions (defvar wl-score-edit-header-char '((?a "from" nil string) (?s "subject" nil string) (?i "message-id" nil string) (?r "references" "message-id" string) (?x "xref" nil string) (?e "extra" nil string) (?l "lines" nil number) (?d "date" nil date) (?f "followup" nil string) (?t "thread" "message-id" string))) (defvar wl-score-edit-type-char '((?s s "substring" string) (?e e "exact string" string) (?f f "fuzzy string" string) (?r r "regexp string" string) (?b before "before date" date) (?a after "after date" date) (?n at "this date" date) (?< < "less than number" number) (?> > "greater than number" number) (?= = "equal to number" number))) (defvar wl-score-edit-perm-char '((?t temp "temporary") (?p perm "permanent") (?i now "immediate"))) ;;; Global Variable (defconst wl-score-header-index ;; Name to function alist. '(("number" wl-score-integer number) ("subject" wl-score-string subject charset) ("from" wl-score-string from charset) ("date" wl-score-date date) ("message-id" wl-score-string message-id) ("references" wl-score-string references) ("to" wl-score-string to) ("cc" wl-score-string cc) ("chars" wl-score-integer size) ("lines" wl-score-integer lines) ("xref" wl-score-string xref) ("extra" wl-score-extra extra mime) ("followup" wl-score-followup from charset) ("thread" wl-score-thread references))) (defvar wl-score-auto-make-followup-entry nil) (defvar wl-score-debug nil) (defvar wl-score-trace nil) (defvar wl-score-alist nil) (defvar wl-score-index nil) (defvar wl-score-cache nil) (defvar wl-scores-messages nil) (defvar wl-current-score-file nil) (defvar wl-score-make-followup nil) (defvar wl-score-stop-add-entry nil) (defvar wl-prev-winconf nil) (defvar wl-score-help-winconf nil) (defvar wl-score-header-buffer-list nil) (defvar wl-score-alike-hashtb nil) (defvar wl-score-edit-exit-function nil "Function run on exit from the score buffer.") (make-variable-buffer-local 'wl-current-score-file) (make-variable-buffer-local 'wl-score-alist) (defvar wl-score-edit-summary-buffer nil) (defvar wl-score-mode-syntax-table (let ((table (copy-syntax-table lisp-mode-syntax-table))) (modify-syntax-entry ?| "w" table) table) "Syntax table used in score-mode buffers.") (defvar wl-score-mode-map nil) (defvar wl-score-mode-menu-spec '("Score" ["Exit" wl-score-edit-exit t] ["Insert date" wl-score-edit-insert-date t] ["Format" wl-score-pretty-print t])) ;; Utility functions (defun wl-score-simplify-buffer-fuzzy () "Simplify string in the buffer fuzzily. The string in the accessible portion of the current buffer is simplified. It is assumed to be a single-line subject. Whitespace is generally cleaned up, and miscellaneous leading/trailing matter is removed. Additional things can be deleted by setting `wl-score-simplify-fuzzy-regexp'." (let ((regexp (if (listp wl-score-simplify-fuzzy-regexp) (mapconcat (function identity) wl-score-simplify-fuzzy-regexp "\\|") wl-score-simplify-fuzzy-regexp)) (case-fold-search t) modified-tick) (elmo-buffer-replace "\t" " ") (while (not (eq modified-tick (buffer-modified-tick))) (setq modified-tick (buffer-modified-tick)) (elmo-buffer-replace regexp) (elmo-buffer-replace "^ *\\[[-+?*!][-+?*!]\\] *") (elmo-buffer-replace "^ *\\(re\\|fw\\|fwd\\|forward\\)[[{(^0-9]*[])}]?[:;] *") (elmo-buffer-replace "^[[].*:\\( .*\\)[]]$" "\\1")) (elmo-buffer-replace " *[[{(][^()\n]*[]})] *$") (elmo-buffer-replace " +" " ") (elmo-buffer-replace " $") (elmo-buffer-replace "^ +"))) (defun wl-score-simplify-string-fuzzy (string) "Simplify a STRING fuzzily. See `wl-score-simplify-buffer-fuzzy' for details." (elmo-set-work-buf (let ((case-fold-search t)) (insert string) (wl-score-simplify-buffer-fuzzy) (buffer-string)))) (defun wl-score-simplify-subject (subject) "Simplify a SUBJECT fuzzily. Remove Re, Was, Fwd etc." (elmo-set-work-buf (let ((regexp (if (listp wl-score-simplify-fuzzy-regexp) (mapconcat (function identity) wl-score-simplify-fuzzy-regexp "\\|") wl-score-simplify-fuzzy-regexp)) (case-fold-search t)) (insert subject) (elmo-buffer-replace regexp) (elmo-buffer-replace "^[ \t]*\\(re\\|was\\|fw\\|fwd\\|forward\\)[:;][ \t]*") (buffer-string)))) ;; (defun wl-score-overview-entity-get-lines (entity) (let ((lines (elmo-message-entity-field entity 'lines))) (and lines (string-to-number lines)))) (defun wl-score-overview-entity-get-xref (entity) (or (elmo-message-entity-field entity 'xref) "")) (static-if (fboundp 'string>) (defalias 'wl-string> 'string>) (defun wl-string> (s1 s2) (string< s2 s1))) (defsubst wl-score-ov-entity-get (entity index &optional extra) (elmo-message-entity-field entity (if extra (intern extra) index) ;; FIXME (if (or (eq index 'to) (eq index 'cc)) 'string nil))) (defun wl-score-string< (a1 a2) (string-lessp (wl-score-ov-entity-get (car a1) wl-score-index) (wl-score-ov-entity-get (car a2) wl-score-index))) (defun wl-score-string-sort (messages _index) (sort messages 'wl-score-string<)) (defsubst wl-score-get (symbol &optional alist) "Get SYMBOL's definition in ALIST." ;; Get SYMBOL's definition in ALIST. (cdr (assoc symbol (or alist wl-score-alist)))) (defun wl-score-set (symbol value &optional alist warn) "Set SYMBOL to VALUE in ALIST." ;; Set SYMBOL to VALUE in ALIST. (let* ((alist (or alist wl-score-alist)) (entry (assoc symbol alist))) (cond ((wl-score-get 'read-only alist) ;; This is a read-only score file, so we do nothing. (when warn (message "Note: read-only score file; entry discarded"))) (entry (setcdr entry value)) ((null alist) (error "Empty alist")) (t (setcdr alist (cons (cons symbol value) (cdr alist))))))) (defun wl-score-cache-clean () "Cleaning score cache. Set `wl-score-cache' nil." (interactive) (setq wl-score-cache nil)) (defun wl-score-load-score-alist (file) "Read score FILE." (let (alist) (if (not (file-readable-p file)) (setq wl-score-alist nil) (with-temp-buffer (wl-as-mime-charset wl-score-mode-mime-charset (insert-file-contents file)) (goto-char (point-min)) ;; Only do the loading if the score file isn't empty. (when (save-excursion (re-search-forward "[()0-9a-zA-Z]" nil t)) (setq alist (condition-case () (read (current-buffer)) (error "Problem with score file %s" file)))) (cond ((and alist (atom alist)) (error "Invalid syntax with score file %s" file)) (t (setq wl-score-alist alist))))))) (defun wl-score-save () "Save all score information." ;; Save all score information. (let ((cache wl-score-cache) entry score file dir) (with-temp-buffer (setq wl-score-alist nil) (while cache (setq entry (pop cache) file (car entry) score (cdr entry)) (unless (or (not (equal (wl-score-get 'touched score) '(t))) (wl-score-get 'read-only score) (and (file-exists-p file) (not (file-writable-p file)))) (setq score (setcdr entry (wl-delete-alist 'touched score))) (erase-buffer) (let (emacs-lisp-mode-hook (lisp-mode-syntax-table wl-score-mode-syntax-table) print-length print-level) (pp score (current-buffer))) (setq dir (file-name-directory file)) (if (file-directory-p dir) (); ok. (if (file-exists-p dir) (error "File %s already exists" dir) (elmo-make-directory dir))) ;; If the score file is empty, we delete it. (if (zerop (buffer-size)) (when (file-exists-p file) ; added by teranisi. (delete-file file)) ;; There are scores, so we write the file. (when (file-writable-p file) (wl-as-mime-charset wl-score-mode-mime-charset (write-region (point-min) (point-max) file nil 'no-msg))))))))) (defun wl-score-remove-from-cache (file) (setq wl-score-cache (delq (assoc file wl-score-cache) wl-score-cache))) (defun wl-score-load-file (file) (let* ((file (expand-file-name (or (and (string-match (concat "^" (regexp-quote (expand-file-name wl-score-files-directory))) (expand-file-name file)) file) (expand-file-name file (file-name-as-directory wl-score-files-directory))))) (cached (assoc file wl-score-cache)) alist) (if cached ;; The score file was already loaded. (setq alist (cdr cached)) ;; We load the score file. (setq wl-score-alist nil) (setq alist (wl-score-load-score-alist file)) (unless (assq 'touched alist) (wl-push (list 'touched nil) alist)) (wl-push (cons file alist) wl-score-cache)) (let ((a alist)) (while a ;; Downcase all header names. (cond ((stringp (caar a)) (setcar (car a) (downcase (caar a))))) (pop a))) (setq wl-current-score-file file) (setq wl-score-alist alist))) (defun wl-score-get-score-files (score-alist folder) (let ((files (wl-get-assoc-list-value score-alist (elmo-folder-name-internal folder) (if (not wl-score-folder-alist-matchone) 'all-list))) fl f) (while (setq f (wl-pop files)) (wl-append fl (cond ((functionp f) (funcall f folder)) (t (list f))))) fl)) (defun wl-score-get-score-alist () (interactive) (let* ((score-alist (reverse (wl-score-get-score-files wl-score-folder-alist wl-summary-buffer-elmo-folder))) alist scores) (setq wl-current-score-file nil) (unless (and wl-score-default-file (member wl-score-default-file score-alist)) (wl-push wl-score-default-file score-alist)) (while score-alist (setq alist (cond ((stringp (car score-alist)) ;; file (wl-score-load-file (car score-alist))) ((consp (car score-alist)) ;; alist (car score-alist)) ((boundp (car score-alist)) ;; variable (symbol-value (car score-alist))) (t (error "Void variable: %s" (car score-alist))))) (let ((mark (car (wl-score-get 'mark alist))) (expunge (car (wl-score-get 'expunge alist))) (mark-and-expunge (car (wl-score-get 'mark-and-expunge alist))) (temp (car (wl-score-get 'temp alist))) ; obsolate (target (car (wl-score-get 'target alist))) (important (car (wl-score-get 'important alist)))) (setq wl-summary-important-above (or important wl-summary-important-above)) (setq wl-summary-target-above (or target temp wl-summary-target-above)) (setq wl-summary-mark-below (or mark mark-and-expunge wl-summary-mark-below)) (setq wl-summary-expunge-below (or expunge mark-and-expunge wl-summary-expunge-below))) (wl-append scores (list alist)) (setq score-alist (cdr score-alist))) scores)) (defun wl-score-headers (scores &optional force-msgs not-add) (let* ((elmo-mime-charset wl-summary-buffer-mime-charset) (folder wl-summary-buffer-elmo-folder) (now (elmo-time-to-days (current-time))) (expire (and wl-score-expiry-days (- now wl-score-expiry-days))) (wl-score-stop-add-entry not-add) entries news new entry header) (setq wl-scores-messages nil) (message "Scoring...") ;; Create messages, an alist of the form `(ENTITY . SCORE)'. (dolist (num (elmo-folder-list-messages folder 'visible 'in-db)) (when (and (not (assq num wl-summary-scored)) (or (memq num force-msgs) (member (wl-summary-message-mark folder num) wl-summary-score-marks))) (setq wl-scores-messages (cons (cons (elmo-message-entity folder num) (or wl-summary-default-score 0)) wl-scores-messages)))) (save-excursion (setq news scores) (while news (setq scores news news nil) ;; Run each header through the score process. (setq entries wl-score-header-index) (while entries (setq entry (pop entries) header (car entry)) (if (> (length wl-scores-messages) 500) (message "Scoring...\"%s\"" header)) (when (< 0 (apply 'max (mapcar (lambda (score) (length (wl-score-get header score))) scores))) ;; Call the scoring function for this type of "header". (when (setq new (funcall (nth 1 entry) scores header now expire)) (wl-push new news)))))) ;; Add messages to `wl-summary-scored'. (let (entry num score) (while wl-scores-messages (when (or (/= wl-summary-default-score (cdar wl-scores-messages))) (setq num (elmo-message-entity-number (caar wl-scores-messages)) score (cdar wl-scores-messages)) (if (setq entry (assq num wl-summary-scored)) (setcdr entry (+ score (cdr entry))) (wl-push (cons num score) wl-summary-scored))) (setq wl-scores-messages (cdr wl-scores-messages)))) (message "Scoring...done") ;; Remove buffers. (while wl-score-header-buffer-list (elmo-kill-buffer (pop wl-score-header-buffer-list))))) (defun wl-score-integer (scores header now expire) (let ((wl-score-index (nth 2 (assoc header wl-score-header-index))) entries alist) ;; Find matches. (while scores (setq alist (car scores) scores (cdr scores) entries (assoc header alist)) (while (cdr entries) ;First entry is the header index. (let* ((rest (cdr entries)) (kill (car rest)) (match (nth 0 kill)) (type (or (nth 3 kill) '>)) (score (or (nth 1 kill) wl-score-interactive-default-score)) (date (nth 2 kill)) (found nil) (match-func (if (memq type '(> < <= >= =)) type (error "Invalid match type: %s" type))) (messages wl-scores-messages)) (while messages (when (funcall match-func (or (wl-score-ov-entity-get (caar messages) wl-score-index) 0) match) (setq found t) (setcdr (car messages) (+ score (cdar messages)))) (setq messages (cdr messages))) ;; Update expire date (cond ((null date)) ;Permanent entry. ((and found wl-score-update-entry-dates) ;Match, update date. (wl-score-set 'touched '(t) alist) (setcar (nthcdr 2 kill) now)) ((and expire (< date expire)) ;Old entry, remove. (wl-score-set 'touched '(t) alist) (setcdr entries (cdr rest)) (setq rest entries))) (setq entries rest))))) nil) (defun wl-score-date (scores header now expire) (let ((wl-score-index (nth 2 (assoc header wl-score-header-index))) entries alist match match-func message) ;; Find matches. (while scores (setq alist (car scores) scores (cdr scores) entries (assoc header alist)) (while (cdr entries) ;First entry is the header index. (let* ((rest (cdr entries)) (kill (car rest)) (type (or (nth 3 kill) 'before)) (score (or (nth 1 kill) wl-score-interactive-default-score)) (date (nth 2 kill)) (found nil) (messages wl-scores-messages) l) (cond ((eq type 'after) (setq match-func 'string< match (wl-date-iso8601 (nth 0 kill)))) ((eq type 'before) (setq match-func 'wl-string> match (wl-date-iso8601 (nth 0 kill)))) ((eq type 'at) (setq match-func 'string= match (wl-date-iso8601 (nth 0 kill)))) ((eq type 'regexp) (setq match-func 'string-match match (nth 0 kill))) (t (error "Invalid match type: %s" type))) (while (setq message (pop messages)) (when (and (setq l (wl-score-ov-entity-get (car message) wl-score-index)) (funcall match-func match (wl-date-iso8601 l))) (setq found t) (setcdr message (+ score (cdr message))))) ;; Update expire date (cond ((null date)) ;Permanent entry. ((and found wl-score-update-entry-dates) ;Match, update date. (wl-score-set 'touched '(t) alist) (setcar (nthcdr 2 kill) now)) ((and expire (< date expire)) ;Old entry, remove. (wl-score-set 'touched '(t) alist) (setcdr entries (cdr rest)) (setq rest entries))) (setq entries rest))))) nil) (defun wl-score-extra (scores header now expire) (let ((score-list scores) entries alist extra extras) (while score-list (setq alist (pop score-list) entries (assoc header alist)) (while (cdr entries) (setq extra (nth 4 (cadr entries))) (unless (member extra extras) (wl-push extra extras)) (setq entries (cdr entries)))) (while extras (wl-score-string scores header now expire (car extras)) (setq extras (cdr extras))) nil)) (defmacro wl-score-put-alike (alike) `(elmo-set-hash-val (format "#%d" (wl-count-lines)) ,alike wl-score-alike-hashtb)) (defsubst wl-score-get-alike () (elmo-get-hash-val (format "#%d" (wl-count-lines)) wl-score-alike-hashtb)) (defun wl-score-insert-header (header messages &optional extra-header) (let ((mime-decode (nth 3 (assoc header wl-score-header-index))) (buffer-name (concat "*Score-Headers-" header (if extra-header (concat "-" extra-header) "") "*")) buf) (if (setq buf (get-buffer buffer-name)) (set-buffer buf) (set-buffer (setq buf (get-buffer-create buffer-name))) (wl-append wl-score-header-buffer-list (list buf)) (buffer-disable-undo (current-buffer)) (make-local-variable 'wl-score-alike-hashtb) (setq wl-score-alike-hashtb (elmo-make-hash (* (length messages) 2))) (when mime-decode (set-buffer-multibyte t)) (let (art last this alike) (while (setq art (pop messages)) (setq this (wl-score-ov-entity-get (car art) wl-score-index extra-header)) (when (stringp this) (setq this (std11-unfold-string this))) (if (equal last this) ;; O(N*H) cons-cells used here, where H is the number of ;; headers. (wl-push art alike) (when last (wl-score-put-alike alike) (insert last ?\n)) (setq alike (list art) last this))) (when last (wl-score-put-alike alike) (insert last ?\n)) (when mime-decode (decode-mime-charset-region (point-min) (point-max) elmo-mime-charset) (when (eq mime-decode 'mime) (eword-decode-region (point-min) (point-max)))))))) (defun wl-score-string (scores header now expire &optional extra-header) "Insert the unique message headers in the buffer." ;; Insert the unique message headers in the buffer. (let ((wl-score-index (nth 2 (assoc header wl-score-header-index))) entries alist messages fuzzies kill) (when (integerp wl-score-index) (setq wl-scores-messages (wl-score-string-sort wl-scores-messages wl-score-index))) (setq messages wl-scores-messages) (wl-score-insert-header header messages extra-header) ;; Go through all the score alists and pick out the entries ;; for this header. (while scores (setq alist (pop scores) entries (assoc header alist)) (while (cdr entries) ;First entry is the header index. (let* ((kill (cadr entries)) (type (or (nth 3 kill) 's)) (score (or (nth 1 kill) wl-score-interactive-default-score)) (date (nth 2 kill)) (extra (nth 4 kill)) ; non-standard header; string. (mt (aref (symbol-name type) 0)) (case-fold-search (not (memq mt '(?R ?S ?E ?F)))) (dmt (downcase mt)) (match (nth 0 kill)) (search-func (cond ((= dmt ?r) 're-search-forward) ((memq dmt '(?e ?s ?f)) 'search-forward) ((= dmt ?w) nil) (t (error "Invalid match type: %s" type)))) arts art found) (if (and extra-header (or (not extra) (not (string= extra-header extra)))) (setq entries (cdr entries)) (cond ;; Fuzzy matches. We save these for later. ((= dmt ?f) (wl-push (cons entries alist) fuzzies) (setq entries (cdr entries))) (t ;; Regexp, substring and exact matching. (goto-char (point-min)) (when (and (not (= dmt ?e)) (string= match "")) (setq match "\n")) (while (and (not (eobp)) (funcall search-func match nil t)) (when (or (not (= dmt ?e)) ;; Is it really exact? (and (eolp) (= (save-excursion (forward-line 0) (point)) (match-beginning 0)))) ;;; (end-of-line) (setq found (setq arts (wl-score-get-alike))) ;; Found a match, update scores. (while (setq art (pop arts)) (setcdr art (+ score (cdr art))))) (forward-line)) ;; Update expiry date (cond ;; Permanent entry. ((null date) (setq entries (cdr entries))) ;; We have a match, so we update the date. ((and found wl-score-update-entry-dates) (wl-score-set 'touched '(t) alist) (setcar (nthcdr 2 kill) now) (setq entries (cdr entries))) ;; This entry has expired, so we remove it. ((and expire (< date expire)) (wl-score-set 'touched '(t) alist) (setcdr entries (cddr entries))) ;; No match; go to next entry. (t (setq entries (cdr entries)))))))))) ;; Find fuzzy matches. (when fuzzies ;; Simplify the entire buffer for easy matching. (wl-score-simplify-buffer-fuzzy) (while (setq kill (cl-cadaar fuzzies)) (let* ((match (nth 0 kill)) (type (nth 3 kill)) (score (or (nth 1 kill) wl-score-interactive-default-score)) (date (nth 2 kill)) (mt (aref (symbol-name type) 0)) (case-fold-search (not (= mt ?F))) arts art found) (goto-char (point-min)) (while (and (not (eobp)) (search-forward match nil t)) (when (and (eolp) (= (save-excursion (forward-line 0) (point)) (match-beginning 0))) (setq found (setq arts (wl-score-get-alike))) (while (setq art (pop arts)) (setcdr art (+ score (cdr art))))) (forward-line)) ;; Update expiry date (cond ;; Permanent. ((null date)) ;; Match, update date. ((and found wl-score-update-entry-dates) (wl-score-set 'touched '(t) (cdar fuzzies)) (setcar (nthcdr 2 kill) now)) ;; Old entry, remove. ((and expire (< date expire)) (wl-score-set 'touched '(t) (cdar fuzzies)) (setcdr (caar fuzzies) (cl-cddaar fuzzies)))) (setq fuzzies (cdr fuzzies))))) nil)) (defun wl-score-thread (scores header now expire) (wl-score-followup scores header now expire t)) (defun wl-score-followup (scores header now expire &optional thread) "Insert the unique message headers in the buffer." (let ((wl-score-index (nth 2 (assoc header wl-score-header-index))) (all-scores scores) entries alist messages new news) (when (integerp wl-score-index) (setq wl-scores-messages (wl-score-string-sort wl-scores-messages wl-score-index))) (setq messages wl-scores-messages) (wl-score-insert-header (if thread "references" "from") messages) ;; Find matches. (while scores (setq alist (car scores) scores (cdr scores) entries (assoc header alist)) (while (cdr entries) ;First entry is the header index. (let* ((rest (cdr entries)) (kill (car rest)) (match (nth 0 kill)) (type (or (nth 3 kill) 's)) (score (or (nth 1 kill) wl-score-interactive-default-score)) (date (nth 2 kill)) (found nil) (mt (aref (symbol-name type) 0)) (case-fold-search (not (memq mt '(?R ?S ?E ?F)))) (dmt (downcase mt)) (search-func (cond ((= dmt ?r) 're-search-forward) ((memq dmt '(?e ?s ?f)) 'search-forward) (t (error "Invalid match type: %s" type)))) arts art day) (goto-char (point-min)) (while (funcall search-func match nil t) (when (or (not (= dmt ?e)) (and (eolp) (= (progn (beginning-of-line) (point)) (match-beginning 0)))) ;;; (end-of-line) (setq found (setq arts (wl-score-get-alike))) ;; Found a match, update scores. (while (setq art (pop arts)) (setq day nil) (when (or (not wl-score-make-followup) (and wl-score-update-entry-dates expire (< expire (setq day (elmo-time-to-days (elmo-message-entity-field (car art) 'date)))))) (when (setq new (wl-score-add-followups (car art) score all-scores alist thread day)) (when thread (unless wl-score-stop-add-entry (wl-append rest (list new))) (setcdr art (+ score (cdr art)))) (wl-push new news)))) (forward-line))) ;; Update expire date (cond ((null date)) ;Permanent entry. ((and found wl-score-update-entry-dates) ;Match, update date. (wl-score-set 'touched '(t) alist) (setcar (nthcdr 2 kill) now)) ((and expire (< date expire)) ;Old entry, remove. (wl-score-set 'touched '(t) alist) (setcdr entries (cdr rest)) (setq rest entries))) (setq entries rest)))) (when (and news (not thread)) (list (cons "references" news))))) (defun wl-score-add-followups (header score scores alist &optional thread day) (let* ((id (elmo-message-entity-field header 'message-id)) (scores (car scores)) entry dont) (when id ;; Don't enter a score if there already is one. (while (setq entry (pop scores)) (and (member (car entry) '("thread" "references")) (memq (nth 3 (cadr entry)) '(s nil)) (assoc id entry) (setq dont t))) (unless dont (let ((entry (list id score (or day (elmo-time-to-days (current-time))) 's))) (unless (or thread wl-score-stop-add-entry) (wl-score-update-score-entry "references" entry alist)) (wl-score-set 'touched '(t) alist) entry))))) (defun wl-score-flush-cache () "Flush the cache of score files." (interactive) (wl-score-save) (setq wl-score-cache nil wl-score-alist nil) (message "The score cache is now flushed")) (defun wl-score-set-mark-below (score) "Automatically mark messages with score below SCORE as read." (interactive (list (or (and current-prefix-arg (prefix-numeric-value current-prefix-arg)) (elmo-read-number "Mark below: " 0)))) (setq score (or score wl-summary-default-score 0)) (wl-score-set 'mark (list score)) (wl-score-set 'touched '(t)) (setq wl-summary-mark-below score) (wl-summary-score-update-all-lines t)) (defun wl-score-set-expunge-below (score) "Automatically expunge messages with score below SCORE." (interactive (list (or (and current-prefix-arg (prefix-numeric-value current-prefix-arg)) (elmo-read-number "Expunge below: " 0)))) (setq score (or score wl-summary-default-score 0)) (wl-score-set 'expunge (list score)) (wl-score-set 'touched '(t))) (defun wl-score-change-score-file (file) "Change current score alist." (interactive (list (read-file-name "Change to score file: " wl-score-files-directory))) (wl-score-load-file file)) (defun wl-score-default (level) (if level (prefix-numeric-value level) wl-score-interactive-default-score)) (defun wl-summary-lower-score (&optional score) (interactive "P") (wl-summary-increase-score score t)) (defun wl-summary-increase-score (&optional score lower) (interactive "P") (if (wl-summary-message-number) (let* ((rscore (if lower (- (wl-score-default score)) (wl-score-default score))) (increase (> rscore 0)) lscore entry list match type) (setq entry (wl-score-get-header-entry nil rscore)) (setq list (nth 1 entry)) (setq match (car list)) (setq type (nth 3 list)) (cond ((memq type '(r R s S nil)) (when (and match (string= (car entry) "subject")) (setq match (wl-score-simplify-subject match)))) ((memq type '(f F)) (setq match (wl-score-simplify-string-fuzzy match)))) (setq match (read-string (format "Match on %s, %s: " (car entry) (if increase "raise" "lower")) (if (numberp match) (number-to-string match) match))) ;; transform from string to int. (when (eq (nth 1 (assoc (car entry) wl-score-header-index)) 'wl-score-integer) (setq match (string-to-number match))) ;; set score (if score (setq lscore rscore) (setq lscore (nth 1 list)) (setq lscore (abs (if lscore lscore wl-score-interactive-default-score))) (setq lscore (if lower (- lscore) lscore))) (setcar (cdr list) (if (eq lscore wl-score-interactive-default-score) nil lscore)) ;; update score file (setcar list match) (unless (eq (nth 2 list) 'now) (let ((alist (if wl-current-score-file (cdr (assoc wl-current-score-file wl-score-cache)) wl-score-alist))) (wl-score-update-score-entry (car entry) list alist) (wl-score-set 'touched '(t) alist))) (wl-summary-score-effect (car entry) list (eq (nth 2 list) 'now))))) (defun wl-score-get-latest-msgs () (let* ((now (elmo-time-to-days (current-time))) (expire (and wl-score-expiry-days (- now wl-score-expiry-days))) (rnumbers (reverse wl-summary-buffer-number-list)) msgs) (if (not expire) (elmo-folder-list-messages wl-summary-buffer-elmo-folder nil t) (catch 'break (while rnumbers (if (< (elmo-time-to-days (elmo-message-entity-field wl-summary-buffer-elmo-folder (car rnumbers) 'date)) expire) (throw 'break t)) (wl-push (car rnumbers) msgs) (setq rnumbers (cdr rnumbers)))) msgs))) (defun wl-score-get-header (header &optional extra) (let ((index (nth 2 (assoc header wl-score-header-index)))) (if index (wl-score-ov-entity-get (elmo-message-entity wl-summary-buffer-elmo-folder (wl-summary-message-number)) index extra)))) (defun wl-score-kill-help-buffer () (when (get-buffer "*Score Help*") (kill-buffer "*Score Help*") (when wl-score-help-winconf (set-window-configuration wl-score-help-winconf)))) (defun wl-score-insert-help (string alist idx) (setq wl-score-help-winconf (current-window-configuration)) (let ((cur-win (selected-window)) mes-win) (with-current-buffer (get-buffer-create "*Score Help*") (buffer-disable-undo (current-buffer)) (delete-windows-on (current-buffer)) (erase-buffer) (insert string ":\n\n") (let ((max -1) (list alist) (i 0) n width pad format) ;; find the longest string to display (while list (setq n (length (nth idx (car list)))) (unless (> max n) (setq max n)) (setq list (cdr list))) (setq max (+ max 4)) ; %c, `:', SPACE, a SPACE at end (setq n (/ (1- (window-width)) max)) ; items per line (setq width (/ (1- (window-width)) n)) ; width of each item ;; insert `n' items, each in a field of width `width' (while alist (unless (< i n) (setq i 0) (delete-char -1) ; the `\n' takes a char (insert "\n")) (setq pad (- width 3)) (setq format (concat "%c: %-" (number-to-string pad) "s")) (insert (format format (caar alist) (nth idx (car alist)))) (setq alist (cdr alist)) (setq i (1+ i))) (set-buffer-modified-p nil))) (when (and wl-message-buffer (get-buffer wl-message-buffer) (setq mes-win (get-buffer-window (get-buffer wl-message-buffer)))) (select-window mes-win) (unless (eq (next-window) cur-win) (delete-window (next-window)))) (split-window) (pop-to-buffer "*Score Help*") (let ((window-min-height 1)) (shrink-window-if-larger-than-buffer)) (select-window cur-win))) (defun wl-score-get-header-entry (&optional match-func increase) (let (hchar tchar pchar header score perm type extra hentry entry) (unwind-protect (progn ;; read the header to score. (while (not hchar) (message "%s header (%s?): " (if increase (if (> increase 0) "Increase" "Lower") "Set") (mapconcat (lambda (s) (list (car s))) wl-score-edit-header-char "")) (setq hchar (read-char)) (when (or (= hchar ??) (= hchar ?\C-h)) (setq hchar nil) (wl-score-insert-help "Match on header" wl-score-edit-header-char 1))) (wl-score-kill-help-buffer) (unless (setq hentry (assq (downcase hchar) wl-score-edit-header-char)) (error "Invalid header type")) (message "") (setq entry (assoc (setq header (nth 1 hentry)) wl-score-header-default-entry)) (setq score (nth 1 entry) perm (nth 2 entry) type (nth 3 entry)) ;; read extra header. (when (equal header "extra") (setq extra (completing-read "Set extra header: " (mapcar 'list elmo-msgdb-extra-fields)))) ;; read the type. (unless type (let ((valid-types (delq nil (mapcar (lambda (s) (if (eq (nth 3 hentry) (nth 3 s)) s nil)) (copy-sequence wl-score-edit-type-char))))) (while (not tchar) (message "Set header '%s' with match type (%s?): " header (mapconcat (lambda (s) (list (car s))) valid-types "")) (setq tchar (read-char)) (when (or (= tchar ??) (= tchar ?\C-h)) (setq tchar nil) (wl-score-insert-help "Match type" valid-types 2))) (wl-score-kill-help-buffer) (unless (setq type (nth 1 (assq (downcase tchar) valid-types))) (error "Invalid match type")) (message ""))) ;; read the permanence. (unless perm (while (not pchar) (message "Set permanence (%s?): " (mapconcat (lambda (s) (list (car s))) wl-score-edit-perm-char "")) (setq pchar (read-char)) (when (or (= pchar ??) (= pchar ?\C-h)) (setq pchar nil) (wl-score-insert-help "Match permanence" wl-score-edit-perm-char 2))) (wl-score-kill-help-buffer) (unless (setq perm (nth 1 (assq (downcase pchar) wl-score-edit-perm-char))) (error "Invalid match duration")) (message "")) ;; read the score. (unless (or score increase) (setq score (elmo-read-number "Set score: " 0)))) (message "") (wl-score-kill-help-buffer)) (let* ((match-header (or (nth 2 hentry) header)) (match (if match-func (funcall match-func match-header extra) (wl-score-get-header match-header extra))) (match (cond ((memq type '(r R regexp Regexp)) (regexp-quote match)) ((eq (nth 1 (assoc (car entry) wl-score-header-index)) 'wl-score-integer) match) (t (or match "")))) (perm (cond ((eq perm 'perm) nil) ((eq perm 'temp) (elmo-time-to-days (current-time))) ((eq perm 'now) perm))) (new (list match score perm type extra))) (list header new)))) (defun wl-score-update-score-entries (header entries &optional alist) (while entries (wl-score-update-score-entry header (car entries) alist) (setq entries (cdr entries))) (wl-score-set 'touched '(t) alist)) (defun wl-score-update-score-entry (header new &optional alist) (let ((old (wl-score-get header alist)) (match (nth 0 new)) elem) (if (and old (setq elem (assoc match old)) (eq (nth 3 elem) (nth 3 new)) (or (and (numberp (nth 2 elem)) (numberp (nth 2 new))) (and (not (nth 2 elem)) (not (nth 2 new))))) (setcar (cdr elem) (+ (or (nth 1 elem) wl-score-interactive-default-score) (or (nth 1 new) wl-score-interactive-default-score))) (wl-score-set header (if old (cons new old) (list new)) alist t)))) ;; functions for summary mode (defun wl-summary-score-effect (header entry &optional now) (let ((scores (list (list (list header entry))))) (setq wl-summary-scored nil) (cond ((string= header "followup") (if wl-score-auto-make-followup-entry (let ((wl-score-make-followup t)) (wl-score-headers scores (wl-score-get-latest-msgs))) (wl-score-headers scores (if (eq wl-summary-buffer-view 'thread) (wl-thread-get-children-msgs (wl-summary-message-number)) (list (wl-summary-message-number))))) (unless now (wl-score-update-score-entries "references" (cdr (assoc "references" (car scores)))))) ((string= header "thread") (wl-score-headers scores (if (eq wl-summary-buffer-view 'thread) (wl-thread-get-children-msgs (wl-summary-message-number)) (list (wl-summary-message-number)))) (unless now (wl-score-update-score-entries header ;; remove parent (cdr (cl-cdaar scores))))) (t (wl-score-headers scores (list (wl-summary-message-number))))) (wl-summary-score-update-all-lines t))) (defun wl-summary-rescore-msgs (numbers) (nthcdr (max (- (length numbers) wl-summary-rescore-partial-threshold) 0) numbers)) (defun wl-summary-rescore (&optional arg) "Redo the entire scoring process in the current summary." (interactive "P") (wl-score-save) (setq wl-score-cache nil) (setq wl-summary-scored nil) (wl-summary-score-headers (unless arg (wl-summary-rescore-msgs (elmo-folder-list-messages wl-summary-buffer-elmo-folder t t)))) (let ((expunged (wl-summary-score-update-all-lines t))) (if expunged (message "%d message(s) are expunged by scoring." (length expunged)))) (set-buffer-modified-p nil)) ;; optional argument force-msgs is added by teranisi. (defun wl-summary-score-headers (&optional force-msgs not-add) "Do scoring if scoring is required." (let ((scores (wl-score-get-score-alist))) (when scores (wl-score-headers scores force-msgs not-add)))) (defun wl-summary-score-update-all-lines (&optional update) (let ((alist wl-summary-scored) (update-unread nil) wl-summary-unread-message-hook num score dels visible score-mark) (save-excursion (elmo-with-progress-display (wl-update-score (length alist)) "Updating score" (while alist (setq num (caar alist) score (cdar alist)) (when wl-score-debug (message "Scored %d with %d" score num) (wl-push (list (substring-no-properties (wl-summary-buffer-folder-name)) num score) wl-score-trace)) (setq score-mark (wl-summary-get-score-mark num)) (and (setq visible (wl-summary-jump-to-msg num)) (wl-summary-set-score-mark score-mark)) (cond ((and wl-summary-expunge-below (< score wl-summary-expunge-below)) (wl-push num dels)) ((< score wl-summary-mark-below) (if visible (wl-summary-mark-as-read num); opened (setq update-unread t) (wl-summary-mark-as-read num))) ; closed ((and wl-summary-important-above (> score wl-summary-important-above)) (if (wl-thread-jump-to-msg num);; force open (wl-summary-set-persistent-mark 'important num))) ((and wl-summary-target-above (> score wl-summary-target-above)) (if visible (wl-summary-set-mark "*")))) (setq alist (cdr alist)) (elmo-progress-notify 'wl-update-score)) (when dels (dolist (del dels) (elmo-message-unset-flag wl-summary-buffer-elmo-folder del 'unread)) (elmo-folder-kill-messages wl-summary-buffer-elmo-folder dels) (wl-summary-delete-messages-on-buffer dels)) (when (and update update-unread) ;; Update Folder mode (wl-folder-set-folder-updated (wl-summary-buffer-folder-name) (list 0 (let ((flag-count (wl-summary-count-unread))) (or (cdr (assq 'unread flag-count)) 0)) (elmo-folder-length wl-summary-buffer-elmo-folder))) (wl-summary-update-modeline))) dels))) (defun wl-score-edit-done () (let ((bufnam (buffer-file-name (current-buffer))) (winconf wl-prev-winconf)) (when winconf (set-window-configuration winconf)) (wl-score-remove-from-cache bufnam) (wl-score-load-file bufnam))) (defun wl-score-edit-current-scores (file) "Edit the current score alist." (interactive (list wl-current-score-file)) (if file (wl-score-edit-file file) (call-interactively 'wl-score-edit-file))) (defun wl-score-edit-file (file) "Edit a score FILE." (interactive (list (read-file-name "Edit score file: " wl-score-files-directory))) (when (wl-collect-summary) (wl-score-save)) (let ((winconf (current-window-configuration)) (edit-buffer (wl-as-mime-charset wl-score-mode-mime-charset (find-file-noselect file))) (sum-buf (current-buffer))) (if (string-match (concat "^" wl-summary-buffer-name) (buffer-name)) (let ((cur-buf (current-buffer))) (when wl-message-buffer (wl-message-select-buffer wl-message-buffer) (delete-window) (select-window (get-buffer-window cur-buf))) (wl-message-select-buffer edit-buffer)) (switch-to-buffer edit-buffer)) (wl-score-mode) (setq wl-score-edit-exit-function 'wl-score-edit-done) (setq wl-score-edit-summary-buffer sum-buf) (make-local-variable 'wl-prev-winconf) (setq wl-prev-winconf winconf)) (message (substitute-command-keys "\\\\[wl-score-edit-exit] to save edits"))) ;; score-mode (unless wl-score-mode-map (setq wl-score-mode-map (copy-keymap emacs-lisp-mode-map)) (define-key wl-score-mode-map "\C-c\C-k" 'wl-score-edit-kill) (define-key wl-score-mode-map "\C-c\C-c" 'wl-score-edit-exit) (define-key wl-score-mode-map "\C-c\C-p" 'wl-score-pretty-print) (define-key wl-score-mode-map "\C-c\C-d" 'wl-score-edit-insert-date) (define-key wl-score-mode-map "\C-c\C-s" 'wl-score-edit-insert-header) (define-key wl-score-mode-map "\C-c\C-e" 'wl-score-edit-insert-header-entry) (unless (boundp 'wl-score-menu) (easy-menu-define wl-score-menu wl-score-mode-map "Menu used in score mode." wl-score-mode-menu-spec))) (defun wl-score-mode () "Mode for editing Wanderlust score files. This mode is an extended emacs-lisp mode. Special commands; \\{wl-score-mode-map} Entering Score mode calls the value of `wl-score-mode-hook'." (interactive) (kill-all-local-variables) (use-local-map wl-score-mode-map) (set-syntax-table wl-score-mode-syntax-table) (setq major-mode 'wl-score-mode) (setq mode-name "Score") (lisp-mode-variables nil) (make-local-variable 'wl-score-edit-exit-function) (make-local-variable 'wl-score-edit-summary-buffer) (run-hooks 'emacs-lisp-mode-hook 'wl-score-mode-hook)) (defun wl-score-edit-insert-date () "Insert date in numerical format." (interactive) (princ (elmo-time-to-days (current-time)) (current-buffer))) (defun wl-score-pretty-print () "Format the current score file." (interactive) (goto-char (point-min)) (let ((form (read (current-buffer)))) (erase-buffer) (let ((emacs-lisp-mode-syntax-table wl-score-mode-syntax-table) print-length print-level) (pp form (current-buffer)))) (goto-char (point-min))) (defun wl-score-edit-exit () "Stop editing the score file." (interactive) (unless (file-exists-p (file-name-directory (buffer-file-name))) (elmo-make-directory (file-name-directory (buffer-file-name)))) (if (zerop (buffer-size)) (progn (set-buffer-modified-p nil) (and (file-exists-p (buffer-file-name)) (delete-file (buffer-file-name)))) (wl-as-mime-charset wl-score-mode-mime-charset (save-buffer))) (let ((buf (current-buffer))) (when wl-score-edit-exit-function (funcall wl-score-edit-exit-function)) (kill-buffer buf))) (defun wl-score-edit-kill () "Cancel editing the score file." (interactive) (let ((buf (current-buffer))) (set-buffer-modified-p nil) (when wl-score-edit-exit-function (funcall wl-score-edit-exit-function)) (kill-buffer buf))) (defun wl-score-edit-get-summary-buf () (let ((summary-buf (and wl-score-edit-summary-buffer (get-buffer wl-score-edit-summary-buffer)))) (if (and summary-buf (buffer-live-p summary-buf)) summary-buf (if (and (setq summary-buf (window-buffer (previous-window))) (string-match (concat "^" wl-summary-buffer-name) (buffer-name summary-buf))) summary-buf)))) (defun wl-score-edit-get-header (header &optional extra) (let ((sum-buf (wl-score-edit-get-summary-buf)) (index (nth 2 (assoc header wl-score-header-index)))) (when (and sum-buf index) (with-current-buffer sum-buf (wl-score-get-header header extra))))) (defun wl-score-edit-insert-number () (interactive) (let ((sum-buf (wl-score-edit-get-summary-buf)) num) (when sum-buf (if (setq num (with-current-buffer sum-buf (wl-summary-message-number))) (prin1 num (current-buffer)))))) (defun wl-score-edit-insert-header () (interactive) (let (hchar entry) (unwind-protect (progn (while (not hchar) (message "Insert header (%s?): " (mapconcat (lambda (s) (list (car s))) wl-score-edit-header-char "")) (setq hchar (read-char)) (when (or (= hchar ??) (= hchar ?\C-h)) (setq hchar nil) (wl-score-insert-help "Match on header" wl-score-edit-header-char 1))) (wl-score-kill-help-buffer) (unless (setq entry (assq (downcase hchar) wl-score-edit-header-char)) (error "Invalid match type"))) (message "") (wl-score-kill-help-buffer) (let* ((header (nth 1 entry)) (value (wl-score-edit-get-header header))) (and value (prin1 value (current-buffer))))))) (defun wl-score-edit-insert-header-entry () (interactive) (let (form entry) (goto-char (point-min)) (setq form (and (not (zerop (buffer-size))) (condition-case () (read (current-buffer)) (error "Invalid syntax")))) (setq entry (wl-score-get-header-entry 'wl-score-edit-get-header)) (unless (eq (nth 2 (nth 1 entry)) 'now) (if form (wl-score-update-score-entry (car entry) (nth 1 entry) form) (setq form (list entry))) (erase-buffer) (let ((emacs-lisp-mode-syntax-table wl-score-mode-syntax-table) print-length print-level) (pp form (current-buffer))) (goto-char (point-min))))) (require 'product) (product-provide (provide 'wl-score) (require 'wl-version)) ;;; wl-score.el ends here wanderlust-wanderlust-769699d/wl/wl-spam.el000066400000000000000000000425641406661363500207440ustar00rootroot00000000000000;;; wl-spam.el --- Spam filtering interface for Wanderlust. -*- lexical-binding: t -*- ;; Copyright (C) 2003 Hiroya Murata ;; Copyright (C) 2003 Yuuichi Teranishi ;; Author: Hiroya Murata ;; Keywords: mail, net news, spam ;; This file is part of Wanderlust (Yet Another Message Interface on Emacsen). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'cl-lib) (require 'elmo-spam) (require 'wl-summary) (require 'wl-action) (require 'wl-highlight) (defgroup wl-spam nil "Spam configuration for wanderlust." :group 'wl) (defcustom wl-spam-folder "+spam" "*Spam folder." :type 'string :group 'wl-spam) (defcustom wl-spam-undecided-folder-list nil "*List of folder name which is contained undecided domain. If an element is symbol, use symbol-value instead." :type '(repeat (choice (string :tag "Folder name") (variable :tag "Variable"))) :group 'wl-spam) (defcustom wl-spam-undecided-folder-regexp-list '("inbox") "*List of folder regexp which is contained undecided domain." :type '(repeat (regexp :tag "Folder Regexp")) :group 'wl-spam) (defcustom wl-spam-ignored-folder-list '(wl-draft-folder wl-trash-folder wl-queue-folder) "*List of folder name which is contained ignored domain. If an element is symbol, use symbol-value instead." :type '(repeat (choice (string :tag "Folder name") (variable :tag "Variable"))) :group 'wl-spam) (defcustom wl-spam-ignored-folder-regexp-list nil "*List of folder regexp which is contained ignored domain." :type '(repeat (regexp :tag "Folder Regexp")) :group 'wl-spam) (defcustom wl-spam-auto-check-folder-regexp-list nil "*List of Folder regexp which check spam automatically." :type '(repeat (regexp :tag "Folder Regexp")) :group 'wl-spam) (defcustom wl-spam-auto-check-marks (list wl-summary-new-uncached-mark wl-summary-new-cached-mark) "Persistent marks to check spam automatically." :type '(choice (const :tag "All marks" all) (repeat (string :tag "Mark"))) :group 'wl-spam) (defface wl-highlight-summary-spam-face '((((type graphic)) (:foreground "LightSlateGray")) (((type tty) (min-colors 16777216)) (:foreground "LightSlateGray")) (((type tty) (min-colors 256)) (:foreground "color-102")) (((type tty) (min-colors 88)) (:foreground "color-37")) (((type tty) (min-colors 16)) (:foreground "brightblack")) (((type tty)) (:foreground "cyan"))) "Face used for displaying messages mark as spam." :group 'wl-summary-faces :group 'wl-faces) (defcustom wl-spam-mark-action-list '(("s" spam nil wl-summary-register-temp-mark wl-summary-exec-action-spam wl-highlight-summary-spam-face "Mark messages as spam.")) "A variable to define Mark & Action for spam. Append this value to `wl-summary-mark-action-list' by `wl-spam-setup'. See `wl-summary-mark-action-list' for the detail of element." :type '(repeat (list (string :tag "Temporary mark") (symbol :tag "Action name") (symbol :tag "Argument function") (symbol :tag "Set mark function") (symbol :tag "Exec function") (symbol :tag "Face symbol") (string :tag "Document string"))) :group 'wl-spam) (defsubst wl-spam-string-member-p (string list regexp-list) (or (elmo-string-member string list) (elmo-string-match-member string regexp-list))) (defun wl-spam-domain (folder-name) (cond ((string= folder-name wl-spam-folder) 'spam) ((wl-spam-string-member-p folder-name wl-spam-undecided-folder-list wl-spam-undecided-folder-regexp-list) 'undecided) ((wl-spam-string-member-p folder-name wl-spam-ignored-folder-list wl-spam-ignored-folder-regexp-list) 'ignore) (t 'good))) (defun wl-spam-split-numbers (folder numbers) (let (alist) (dolist (number numbers) (let* ((domain (wl-spam-domain (elmo-folder-name-internal (elmo-message-folder folder number)))) (cell (assq domain alist))) (if cell (setcdr cell (cons number (cdr cell))) (setq alist (cons (list domain number) alist))))) alist)) (defsubst wl-spam-auto-check-message-p (folder number) (or (eq wl-spam-auto-check-marks 'all) (member (wl-summary-message-mark folder number) wl-spam-auto-check-marks))) (defsubst wl-spam-map-spam-messages (folder numbers function &rest args) (elmo-with-progress-display (elmo-spam-check-spam (length numbers)) "Checking spam" (dolist (number (elmo-spam-list-spam-messages (elmo-spam-processor) folder numbers)) (apply function number args)))) (defun wl-spam-apply-partitions (folder partitions function msg) (when partitions (let ((total 0)) (dolist (partition partitions) (setq total (+ total (length (cdr partition))))) (elmo-with-progress-display (elmo-spam-register total) msg (dolist (partition partitions) (funcall function folder (cdr partition) (car partition))))))) (declare-function ;; Defined by wl-summary-define-mark-action function in wl-action.el. wl-summary-spam "wl-action.el" (&optional number data)) (declare-function ;; Defined by wl-summary-define-mark-action function in wl-action.el. wl-summary-unmark-spam "wl-action.el" (&optional number)) (defun wl-spam-register-spam-messages (folder numbers) "Register messages specified by FOLDER and NUMBERS as spam. Put spam mark unless FOLDER is a spam folder." (elmo-with-progress-display (elmo-spam-register (length numbers)) "Registering spam" (elmo-spam-register-spam-messages (elmo-spam-processor) folder numbers)) (unless (eq (wl-spam-domain (elmo-folder-name-internal folder)) 'spam) (dolist (number numbers) (wl-summary-spam number)))) (defun wl-spam-register-good-messages (folder numbers) "Register messages specified by FOLDER and NUMBERS as non-spam. Remove spam mark." (elmo-with-progress-display (elmo-spam-register (length numbers)) "Registering good" (elmo-spam-register-good-messages (elmo-spam-processor) folder numbers)) (dolist (number numbers) (wl-summary-unmark-spam number))) (defun wl-spam-save-status (&optional force) (interactive "P") (let ((processor (elmo-spam-processor (not force)))) (when (or force (and processor (elmo-spam-modified-p processor))) (elmo-spam-save-status processor)))) ;; insinuate into summary mode (defvar wl-summary-spam-map nil) (unless wl-summary-spam-map (let ((map (make-sparse-keymap))) (define-key map "m" 'wl-summary-spam) (define-key map "c" 'wl-summary-test-spam) (define-key map "C" 'wl-summary-mark-spam) (define-key map "s" 'wl-summary-register-as-spam) (define-key map "S" 'wl-summary-register-as-spam-all) (define-key map "n" 'wl-summary-register-as-good) (define-key map "N" 'wl-summary-register-as-good-all) (setq wl-summary-spam-map map))) (defun wl-summary-test-spam (&optional folder number) (interactive) (let ((folder (or folder wl-summary-buffer-elmo-folder)) (number (or number (wl-summary-message-number))) spam) (message "Checking spam...") (if (setq spam (elmo-spam-message-spam-p (elmo-spam-processor) folder number)) (wl-summary-spam number) (wl-summary-unmark-spam number)) (message "Checking spam...done") (when (called-interactively-p 'interactive) (message "No: %d is %sa spam message." number (if spam "" "not "))))) (defun wl-summary-test-spam-messages (folder numbers &rest args) (elmo-with-progress-display (elmo-spam-check-spam (length numbers)) "Checking spam" (let* ((spams (elmo-spam-list-spam-messages (elmo-spam-processor) folder numbers)) (goods (car (elmo-list-diff numbers spams)))) (dolist (number spams) (wl-summary-spam number args)) (dolist (number goods) (wl-summary-unmark-spam number))))) (defun wl-summary-test-spam-region (beg end) (interactive "r") (let ((numbers (wl-summary-collect-numbers-region beg end))) (cond (numbers (wl-summary-test-spam-messages wl-summary-buffer-elmo-folder numbers)) ((called-interactively-p 'interactive) (message "No message to test."))))) (defun wl-thread-test-spam (&optional arg) (interactive "P") (wl-thread-call-region-func 'wl-summary-test-spam-region arg)) (defun wl-summary-mark-spam (&optional all) "Set spam mark to messages which is spam classification." (interactive "P") (let (numbers) (if all (setq numbers wl-summary-buffer-number-list) (dolist (number wl-summary-buffer-number-list) (when (wl-spam-auto-check-message-p wl-summary-buffer-elmo-folder number) (setq numbers (cons number numbers))))) (cond (numbers (wl-spam-map-spam-messages wl-summary-buffer-elmo-folder numbers #'wl-summary-spam)) ((called-interactively-p 'interactive) (message "No message to test."))))) (defun wl-summary-register-as-spam () "Register current message as spam. Put spam mark unless current folder is a spam folder." (interactive) (let ((number (wl-summary-message-number))) (when number (wl-spam-register-spam-messages wl-summary-buffer-elmo-folder (list number))))) (defun wl-summary-register-as-spam-region (beg end) "Register messages in the region between BEG and END as spam. Put spam mark unless current folder is a spam folder." (interactive "r") (let ((numbers (wl-summary-collect-numbers-region beg end))) (cond (numbers (wl-spam-register-spam-messages wl-summary-buffer-elmo-folder numbers)) ((called-interactively-p 'interactive) (message "No message to register as spam."))))) (defun wl-thread-register-as-spam (&optional arg) "Register messages which are the descendant of the current thread as spam. Put spam mark unless current folder is a spam folder. With prefix argument, it affects on the all messages in the thread tree." (interactive "P") (wl-thread-call-region-func 'wl-summary-register-as-spam-region arg)) (defun wl-summary-register-as-spam-all () "Register all messages in the folder as spam. Put spam mark unless current folder is a spam folder." (interactive) (when (y-or-n-p "Register all messages as spam, OK? ") (wl-spam-register-spam-messages wl-summary-buffer-elmo-folder wl-summary-buffer-number-list))) (defun wl-summary-target-mark-register-as-spam () "Register messages with the target mark as spam. Put spam mark unless current folder is a spam folder." (interactive) (save-excursion (goto-char (point-min)) (let ((inhibit-read-only t) (buffer-read-only nil) wl-summary-buffer-disp-msg) (wl-spam-register-spam-messages wl-summary-buffer-elmo-folder wl-summary-buffer-target-mark-list) (dolist (number wl-summary-buffer-target-mark-list) (wl-summary-unset-mark number))))) (defun wl-summary-register-as-good () "Register current message as non-spam. Remove spam mark." (interactive) (let ((number (wl-summary-message-number))) (when number (wl-spam-register-good-messages wl-summary-buffer-elmo-folder (list number))))) (defun wl-summary-register-as-good-region (beg end) "Register messages in the region between BEG and END as non-spam. Remove spam mark." (interactive "r") (let ((numbers (wl-summary-collect-numbers-region beg end))) (cond (numbers (wl-spam-register-good-messages wl-summary-buffer-elmo-folder numbers)) ((called-interactively-p 'interactive) (message "No message to register as good."))))) (defun wl-thread-register-as-good (&optional arg) "Register messages which are the descendant of the current thread as non-spam. Remove spam mark. With prefix argument, it affects on the all messages in the thread tree." (interactive "P") (wl-thread-call-region-func 'wl-summary-register-as-good-region arg)) (defun wl-summary-register-as-good-all () "Register all messages in the folder as non-spam. Remove spam mark." (interactive) (when (y-or-n-p "Register all messages as non-spam, OK? ") (wl-spam-register-good-messages wl-summary-buffer-elmo-folder wl-summary-buffer-number-list))) (defun wl-summary-target-mark-register-as-good () "Register messages with the target mark as non-spam. Remove spam mark." (interactive) (save-excursion (goto-char (point-min)) (let ((inhibit-read-only t) (buffer-read-only nil) wl-summary-buffer-disp-msg) (wl-spam-register-good-messages wl-summary-buffer-elmo-folder wl-summary-buffer-target-mark-list) (dolist (number wl-summary-buffer-target-mark-list) (wl-summary-unset-mark number))))) ;; hook functions and other (defun wl-summary-auto-check-spam () (when (elmo-string-match-member (wl-summary-buffer-folder-name) wl-spam-auto-check-folder-regexp-list) (wl-summary-mark-spam))) (defun wl-summary-exec-action-spam (mark-list) (let ((folder wl-summary-buffer-elmo-folder)) (wl-folder-confirm-existence (wl-folder-get-elmo-folder wl-spam-folder)) (wl-spam-apply-partitions folder (wl-filter-associations '(undecided good) (wl-spam-split-numbers folder (mapcar #'car mark-list))) (lambda (folder numbers domain) (elmo-spam-register-spam-messages (elmo-spam-processor) folder numbers (eq domain 'good))) "Registering spam") (wl-summary-move-mark-list-messages mark-list wl-spam-folder "Refiling spam"))) (defun wl-summary-exec-action-refile-with-register (mark-list) (let ((folder wl-summary-buffer-elmo-folder) spam-list good-list) (dolist (info mark-list) (cl-case (wl-spam-domain (nth 2 info)) (spam (setq spam-list (cons (car info) spam-list))) (good (setq good-list (cons (car info) good-list))))) (wl-spam-apply-partitions folder (wl-filter-associations '(undecided good) (wl-spam-split-numbers folder spam-list)) (lambda (folder numbers domain) (elmo-spam-register-spam-messages (elmo-spam-processor) folder numbers (eq domain 'good))) "Registering spam") (wl-spam-apply-partitions folder (wl-filter-associations '(undecided spam) (wl-spam-split-numbers folder good-list)) (lambda (folder numbers domain) (elmo-spam-register-good-messages (elmo-spam-processor) folder numbers (eq domain 'spam))) "Registering good") ;; execute refile messages (wl-summary-exec-action-refile mark-list))) (defun wl-message-check-spam () (let ((original (wl-message-get-original-buffer)) (number wl-message-buffer-cur-number) spam) (message "Checking spam...") (when (setq spam (elmo-spam-buffer-spam-p (elmo-spam-processor) original)) (with-current-buffer wl-message-buffer-cur-summary-buffer (wl-summary-spam number))) (message "Checking spam...done") (message "No: %d is %sa spam message." number (if spam "" "not ")))) (defun wl-refile-guess-by-spam (entity) (when (elmo-spam-message-spam-p (elmo-spam-processor) wl-summary-buffer-elmo-folder (elmo-message-entity-number entity)) wl-spam-folder)) (defun wl-spam-setup () (add-hook 'wl-summary-sync-updated-hook #'wl-summary-auto-check-spam) (let ((actions wl-summary-mark-action-list) action) (while actions (setq action (car actions) actions (cdr actions)) (when (eq (wl-summary-action-symbol action) 'refile) (setcar (nthcdr 4 action) 'wl-summary-exec-action-refile-with-register) (setq actions nil)))) (when wl-spam-mark-action-list (setq wl-summary-mark-action-list (append wl-summary-mark-action-list wl-spam-mark-action-list)) (dolist (action wl-spam-mark-action-list) (setq wl-summary-reserve-mark-list (cons (wl-summary-action-mark action) wl-summary-reserve-mark-list)) (setq wl-summary-skip-mark-list (cons (wl-summary-action-mark action) wl-summary-skip-mark-list)))) (define-key wl-summary-mode-map "k" wl-summary-spam-map) (define-key wl-summary-mode-map "rkm" 'wl-summary-spam-region) (define-key wl-summary-mode-map "rkc" 'wl-summary-test-spam-region) (define-key wl-summary-mode-map "rks" 'wl-summary-register-as-spam-region) (define-key wl-summary-mode-map "rkn" 'wl-summary-register-as-good-region) (define-key wl-summary-mode-map "tkm" 'wl-thread-spam) (define-key wl-summary-mode-map "tkc" 'wl-thread-test-spam) (define-key wl-summary-mode-map "tks" 'wl-thread-register-as-spam) (define-key wl-summary-mode-map "tkn" 'wl-thread-register-as-good) (define-key wl-summary-mode-map "mk" 'wl-summary-target-mark-spam) (define-key wl-summary-mode-map "ms" 'wl-summary-target-mark-register-as-spam) (define-key wl-summary-mode-map "mn" 'wl-summary-target-mark-register-as-good)) (require 'product) (product-provide (provide 'wl-spam) (require 'wl-version)) (unless noninteractive (wl-spam-setup)) ;;; wl-spam.el ends here wanderlust-wanderlust-769699d/wl/wl-summary.el000066400000000000000000005522521406661363500215010ustar00rootroot00000000000000;;; wl-summary.el --- Summary mode for Wanderlust. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Copyright (C) 1998,1999,2000 Masahiro MURATA ;; Copyright (C) 1999,2000 TSUMURA Tomoaki ;; Copyright (C) 1999,2000 Kenichi OKADA ;; Author: Yuuichi Teranishi ;; Masahiro MURATA ;; TSUMURA Tomoaki ;; Kenichi OKADA ;; Keywords: mail, net news ;; This file is part of Wanderlust (Yet Another Message Interface on Emacsen). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'cl-lib) (require 'timezone nil t) (require 'elmo) (require 'elmo-date) (require 'wl-message) (require 'wl-vars) (require 'wl-highlight) (require 'wl-refile) (require 'wl-util) (require 'easymenu nil t) (provide 'wl-summary) ;; wl-e21.el (add-hook 'wl-summary-mode-hook 'wl-setup-summary) (defvar wl-summary-toolbar '([wl-summary-read wl-summary-read t "Read Messages"] [wl-summary-next wl-summary-next t "Next Message"] [wl-summary-prev wl-summary-prev t "Previous Message"] [wl-summary-jump-to-current-message wl-summary-jump-to-current-message t "Jump to Current Message"] [wl-summary-sync-force-update wl-summary-sync-force-update t "Sync Current Folder"] [wl-summary-dispose wl-summary-dispose t "Dispose Current Message"] [wl-summary-set-flags wl-summary-set-flags t "Set Flags"] [wl-draft wl-summary-write-current-folder t "Write for Current Folder"] [wl-summary-reply wl-summary-reply t "Reply to Current Message" ] [wl-summary-reply-with-citation wl-summary-reply-with-citation t "Reply to Current Message with Citation"] [wl-summary-forward wl-summary-forward t "Forward Current Message"] [wl-summary-exit wl-summary-exit t "Exit Current Summary"]) "The Summary buffer toolbar.") (defun wl-e21-setup-summary-toolbar () (when (wl-e21-setup-toolbar wl-summary-toolbar) (wl-e21-make-toolbar-buttons wl-summary-mode-map wl-summary-toolbar))) (defalias 'wl-setup-summary 'wl-e21-setup-summary-toolbar) ;; End of wl-e21.el (defvar dragdrop-drop-functions) (defvar scrollbar-height) (defvar mail-reply-buffer) (defvar elmo-global-flags) (defvar wl-summary-buffer-name "Summary") (defvar wl-summary-mode-map nil) (defvar wl-current-summary-buffer nil) (defvar wl-summary-buffer-elmo-folder nil) (defun wl-summary-buffer-folder-name () (and wl-summary-buffer-elmo-folder (elmo-folder-name-internal wl-summary-buffer-elmo-folder))) (defvar wl-summary-buffer-disp-msg nil) (defvar wl-summary-buffer-disp-folder nil) (defvar wl-summary-buffer-temp-mark-list nil) (defvar wl-summary-buffer-message-ring nil) (defvar wl-summary-buffer-current-msg nil) (defvar wl-summary-buffer-unread-count 0) (defvar wl-summary-buffer-new-count 0) (defvar wl-summary-buffer-answered-count 0) (defvar wl-summary-buffer-mime-charset nil) (defvar wl-summary-buffer-weekday-name-lang nil) (defvar wl-summary-buffer-thread-indent-set-alist nil) (defvar wl-summary-buffer-view nil) (defvar wl-summary-buffer-message-modified nil) (defvar wl-summary-buffer-thread-modified nil) (defvar wl-summary-buffer-number-column nil) (defvar wl-summary-buffer-temp-mark-column nil) (defvar wl-summary-buffer-persistent-mark-column nil) (defvar wl-summary-buffer-persistent-mark-version 0) (defvar wl-summary-buffer-persistent nil) (defvar wl-summary-buffer-thread-nodes nil) (defvar wl-summary-buffer-target-mark-list nil) (defvar wl-summary-buffer-prev-refile-destination nil) (defvar wl-summary-buffer-saved-message nil) (defvar wl-summary-buffer-prev-folder-function nil) (defvar wl-summary-buffer-next-folder-function nil) (defvar wl-summary-buffer-exit-function nil) (defvar wl-summary-buffer-next-message-function nil) (defvar wl-summary-buffer-window-scroll-functions nil) (defvar wl-summary-buffer-number-list nil) (defvar wl-summary-buffer-folder-name nil) (defvar wl-summary-buffer-line-formatter nil) (defvar wl-summary-buffer-line-format nil) (defvar wl-summary-buffer-mode-line-formatter nil) (defvar wl-summary-buffer-mode-line nil) (defvar wl-summary-buffer-display-mime-mode 'mime) (defvar wl-summary-buffer-display-header-mode 'partial) (defvar wl-thread-indent-level-internal nil) (defvar wl-thread-have-younger-brother-str-internal nil) (defvar wl-thread-youngest-child-str-internal nil) (defvar wl-thread-vertical-str-internal nil) (defvar wl-thread-horizontal-str-internal nil) (defvar wl-thread-space-str-internal nil) (defvar wl-summary-last-visited-folder nil) (defvar wl-read-folder-history nil) (defvar wl-summary-scored nil) (defvar wl-crosspost-alist-modified nil) (defvar wl-summary-alike-hashtb nil) (defvar wl-summary-search-buf-name " *wl-search-subject*") (defvar wl-summary-delayed-update nil) (defvar wl-summary-search-buf-folder-name nil) (defvar wl-summary-get-petname-function 'wl-address-get-petname-1) (defvar wl-summary-shell-command-last "") (defvar wl-ps-preprint-hook nil) (defvar wl-ps-print-hook nil) (defvar wl-thread-saved-entity-hashtb-internal nil) (make-variable-buffer-local 'wl-summary-buffer-elmo-folder) (make-variable-buffer-local 'wl-summary-search-buf-folder-name) (make-variable-buffer-local 'wl-summary-buffer-disp-msg) (make-variable-buffer-local 'wl-summary-buffer-disp-folder) (make-variable-buffer-local 'wl-summary-buffer-target-mark-list) (make-variable-buffer-local 'wl-summary-buffer-temp-mark-list) (make-variable-buffer-local 'wl-summary-buffer-message-ring) (make-variable-buffer-local 'wl-summary-buffer-unread-count) (make-variable-buffer-local 'wl-summary-buffer-new-count) (make-variable-buffer-local 'wl-summary-buffer-answered-count) (make-variable-buffer-local 'wl-summary-buffer-mime-charset) (make-variable-buffer-local 'wl-summary-buffer-weekday-name-lang) (make-variable-buffer-local 'wl-summary-buffer-thread-indent-set) (make-variable-buffer-local 'wl-summary-buffer-view) (make-variable-buffer-local 'wl-summary-buffer-message-modified) (make-variable-buffer-local 'wl-summary-buffer-thread-modified) (make-variable-buffer-local 'wl-summary-buffer-number-column) (make-variable-buffer-local 'wl-summary-buffer-temp-mark-column) (make-variable-buffer-local 'wl-summary-buffer-persistent-mark-column) (make-variable-buffer-local 'wl-summary-buffer-persistent-mark-version) (make-variable-buffer-local 'wl-summary-buffer-persistent) (make-variable-buffer-local 'wl-summary-buffer-thread-nodes) (make-variable-buffer-local 'wl-summary-buffer-prev-refile-destination) (make-variable-buffer-local 'wl-summary-buffer-saved-message) (make-variable-buffer-local 'wl-summary-scored) (make-variable-buffer-local 'wl-summary-default-score) (make-variable-buffer-local 'wl-summary-move-direction-downward) (make-variable-buffer-local 'wl-summary-important-above) (make-variable-buffer-local 'wl-summary-target-above) (make-variable-buffer-local 'wl-summary-mark-below) (make-variable-buffer-local 'wl-summary-expunge-below) (make-variable-buffer-local 'wl-thread-indent-level-internal) (make-variable-buffer-local 'wl-thread-have-younger-brother-str-internal) (make-variable-buffer-local 'wl-thread-youngest-child-str-internal) (make-variable-buffer-local 'wl-thread-vertical-str-internal) (make-variable-buffer-local 'wl-thread-horizontal-str-internal) (make-variable-buffer-local 'wl-thread-space-str-internal) (make-variable-buffer-local 'wl-summary-buffer-prev-folder-function) (make-variable-buffer-local 'wl-summary-buffer-next-folder-function) (make-variable-buffer-local 'wl-summary-buffer-exit-function) (make-variable-buffer-local 'wl-summary-buffer-next-message-function) (make-variable-buffer-local 'wl-summary-buffer-window-scroll-functions) (make-variable-buffer-local 'wl-summary-buffer-number-list) (make-variable-buffer-local 'wl-summary-buffer-folder-name) (make-variable-buffer-local 'wl-summary-buffer-line-formatter) (make-variable-buffer-local 'wl-summary-buffer-line-format) (make-variable-buffer-local 'wl-summary-buffer-mode-line-formatter) (make-variable-buffer-local 'wl-summary-buffer-mode-line) (make-variable-buffer-local 'wl-summary-buffer-display-mime-mode) (make-variable-buffer-local 'wl-summary-buffer-display-header-mode) (defvar wl-datevec) (defvar wl-thr-indent-string) (defvar wl-thr-children-number) (defvar wl-thr-linked) (defvar wl-message-entity) (defvar wl-parent-message-entity) (defvar wl-temp-mark) (defvar wl-persistent-mark) (defun wl-summary-sticky-buffer-name (name) (concat wl-summary-buffer-name ":" name)) (defun wl-summary-default-subject (subject-string) (if (string-match "^[ \t]*\\[[^:]+[,: ][0-9]+\\][ \t]*" subject-string) (substring subject-string (match-end 0)) subject-string)) (defun wl-summary-default-from (from) "Instance of `wl-summary-from-function'. Ordinarily returns the sender name. Returns recipient names if (1) summary's folder name matches with `wl-summary-showto-folder-regexp' and (2) sender address is yours. See also variable `wl-use-petname'." (let ((translator (if wl-use-petname (lambda (string) (or (funcall wl-summary-get-petname-function string) (car (std11-extract-address-components string)) string)) #'identity)) to ng) (or (and (eq major-mode 'wl-summary-mode) (stringp wl-summary-showto-folder-regexp) (string-match wl-summary-showto-folder-regexp (wl-summary-buffer-folder-name)) (wl-address-user-mail-address-p from) (cond ((setq to (elmo-message-entity-field wl-message-entity 'to)) (concat "To:" (mapconcat translator to ","))) ((setq ng (elmo-message-entity-field wl-message-entity 'newsgroups)) (concat "Ng:" ng)))) (funcall translator from)))) (defun wl-summary-simple-from (string) (if wl-use-petname (or (funcall wl-summary-get-petname-function string) (car (std11-extract-address-components string)) string) string)) (defvar wl-summary-sort-specs '(number date subject from list-info size)) (defvar wl-summary-default-sort-spec 'date) (defvar wl-summary-mode-menu-spec `("Summary" ["Read" wl-summary-read t] ["Edit draft message" wl-summary-reedit :visible (string= (wl-summary-buffer-folder-name) wl-draft-folder)] ["Prev page" wl-summary-prev-page t] ["Next page" wl-summary-next-page t] ["Top" wl-summary-display-top t] ["Bottom" wl-summary-display-bottom t] ["Prev" wl-summary-prev t] ["Next" wl-summary-next t] ["Up" wl-summary-up t] ["Down" wl-summary-down t] ["Parent message" wl-summary-jump-to-parent-message t] "----" ["Sync" wl-summary-sync t] ["Execute" wl-summary-exec t] ["Go to other folder" wl-summary-goto-folder t] ["Quick search" wl-quicksearch-goto-search-folder-wrapper t] ["Pick" wl-summary-pick t] ["Mark as read all" wl-summary-mark-as-read-all t] ["Unmark all" wl-summary-unmark-all t] ["Toggle display message" wl-summary-toggle-disp-msg t] ["Display folder" wl-summary-toggle-disp-folder t] ["Toggle threading" wl-summary-toggle-thread t] ["Stick" wl-summary-stick t] ("Sort" ["By Number" wl-summary-sort-by-number t] ["By Size" wl-summary-sort-by-size t] ["By Date" wl-summary-sort-by-date t] ["By From" wl-summary-sort-by-from t] ["By Subject" wl-summary-sort-by-subject t] ["By List Info" wl-summary-sort-by-list-info t]) "----" ("Message Operation" ["Mark as read" wl-summary-mark-as-read t] ["Set flags" wl-summary-set-flags t] ["Mark as unread" wl-summary-mark-as-unread t] ["Mark as answered" wl-summary-mark-as-answered t] ["Set dispose mark" wl-summary-dispose t] ["Set refile mark" wl-summary-refile t] ["Set copy mark" wl-summary-copy t] ["Set resend mark" wl-summary-resend t] ["Prefetch" wl-summary-prefetch t] ["Set target mark" wl-summary-target-mark t] ["Unmark" wl-summary-unmark t] ["Save" wl-summary-save t] ["Cancel posted news" wl-summary-cancel-message t] ["Supersedes message" wl-summary-supersedes-message t] ["Resend bounced mail" wl-summary-resend-bounced-mail t] ["Enter the message" wl-summary-jump-to-current-message t] ["Pipe message" wl-summary-pipe-message t] ["Print message" wl-summary-print-message t] ["View raw message" wl-summary-display-raw t]) ("Thread Operation" ["Open or Close" wl-thread-open-close (eq wl-summary-buffer-view 'thread)] ["Open all" wl-thread-open-all (eq wl-summary-buffer-view 'thread)] ["Close all" wl-thread-close-all (eq wl-summary-buffer-view 'thread)] ["Mark as read" wl-thread-mark-as-read (eq wl-summary-buffer-view 'thread)] ["Set flags" wl-thread-set-flags (eq wl-summary-buffer-view 'thread)] ["Mark as unread" wl-thread-mark-as-unread (eq wl-summary-buffer-view 'thread)] ["Mark as answered" wl-thread-mark-as-answered (eq wl-summary-buffer-view 'thread)] ["Set delete mark" wl-thread-delete (eq wl-summary-buffer-view 'thread)] ["Set refile mark" wl-thread-refile (eq wl-summary-buffer-view 'thread)] ["Set copy mark" wl-thread-copy (eq wl-summary-buffer-view 'thread)] ["Prefetch" wl-thread-prefetch (eq wl-summary-buffer-view 'thread)] ["Set target mark" wl-thread-target-mark (eq wl-summary-buffer-view 'thread)] ["Unmark" wl-thread-unmark (eq wl-summary-buffer-view 'thread)] ["Save" wl-thread-save (eq wl-summary-buffer-view 'thread)] ["Execute" wl-thread-exec (eq wl-summary-buffer-view 'thread)]) ("Region Operation" ["Mark as read" wl-summary-mark-as-read-region t] ["Set flags" wl-summary-set-flags-region t] ["Mark as unread" wl-summary-mark-as-unread-region t] ["Mark as answered" wl-summary-mark-as-answered-region t] ["Set dispose mark" wl-summary-dispose-region t] ["Set delete mark" wl-summary-delete-region t] ["Set refile mark" wl-summary-refile-region t] ["Set copy mark" wl-summary-copy-region t] ["Prefetch" wl-summary-prefetch-region t] ["Set target mark" wl-summary-target-mark-region t] ["Unmark" wl-summary-unmark-region t] ["Save" wl-summary-save-region t] ["Execute" wl-summary-exec-region t]) ("Mark Operation" ["Mark as read" wl-summary-target-mark-mark-as-read t] ["Set flags" wl-summary-target-mark-set-flags t] ["Mark as unread" wl-summary-target-mark-mark-as-unread t] ["Set delete mark" wl-summary-target-mark-delete t] ["Set refile mark" wl-summary-target-mark-refile t] ["Set copy mark" wl-summary-target-mark-copy t] ["Prefetch" wl-summary-target-mark-prefetch t] ["Save" wl-summary-target-mark-save t] ["Reply with citation" wl-summary-target-mark-reply-with-citation t] ["Forward" wl-summary-target-mark-forward t] ["uudecode" wl-summary-target-mark-uudecode t]) ("Score Operation" ["Switch current score file" wl-score-change-score-file t] ["Edit current score file" wl-score-edit-current-scores t] ["Edit score file" wl-score-edit-file t] ["Set mark below" wl-score-set-mark-below t] ["Set expunge below" wl-score-set-expunge-below t] ["Rescore buffer" wl-summary-rescore t] ["Increase score" wl-summary-increase-score t] ["Lower score" wl-summary-lower-score t]) "----" ("Writing Messages" ["Write a message" wl-summary-write t] ["Write for current folder" wl-summary-write-current-folder t] ["Reply" wl-summary-reply t] ["Reply with citation" wl-summary-reply-with-citation t] ["Forward" wl-summary-forward t]) "----" ["Toggle Plug Status" wl-toggle-plugged t] ["Change Plug Status" wl-plugged-change t] "----" ["Exit Current Folder" wl-summary-exit t])) (defun wl-summary-setup-mouse () (define-key wl-summary-mode-map [mouse-4] 'wl-summary-prev) (define-key wl-summary-mode-map [mouse-5] 'wl-summary-next) (define-key wl-summary-mode-map [S-mouse-4] 'wl-summary-up) (define-key wl-summary-mode-map [S-mouse-5] 'wl-summary-down) (define-key wl-summary-mode-map [mouse-2] 'wl-summary-click)) (if wl-summary-mode-map () (setq wl-summary-mode-map (make-keymap)) (suppress-keymap wl-summary-mode-map) (substitute-key-definition 'kill-buffer 'wl-summary-mimic-kill-buffer wl-summary-mode-map global-map) ;; basic commands (define-key wl-summary-mode-map " " 'wl-summary-read) (define-key wl-summary-mode-map "." 'wl-summary-redisplay) (define-key wl-summary-mode-map "," 'wl-summary-display-raw) (define-key wl-summary-mode-map "<" 'wl-summary-display-top) (define-key wl-summary-mode-map ">" 'wl-summary-display-bottom) (define-key wl-summary-mode-map "\177" 'wl-summary-prev-page) (define-key wl-summary-mode-map [backspace] 'wl-summary-prev-page) (define-key wl-summary-mode-map "\r" 'wl-summary-enter-handler) (define-key wl-summary-mode-map "\C-m" 'wl-summary-enter-handler) (define-key wl-summary-mode-map "/" 'wl-thread-open-close) (define-key wl-summary-mode-map "[" 'wl-thread-open-all) (define-key wl-summary-mode-map "]" 'wl-thread-close-all) (define-key wl-summary-mode-map "-" 'wl-summary-prev-line-content) (define-key wl-summary-mode-map "\e\r" 'wl-summary-prev-line-content) (define-key wl-summary-mode-map "g" 'wl-summary-goto-folder) (define-key wl-summary-mode-map "G" 'wl-summary-goto-folder-sticky) (define-key wl-summary-mode-map "c" 'wl-summary-mark-as-read-all) (define-key wl-summary-mode-map "a" 'wl-summary-reply) (define-key wl-summary-mode-map "A" 'wl-summary-reply-with-citation) (define-key wl-summary-mode-map "C" 'wl-summary-cancel-message) (define-key wl-summary-mode-map "E" 'wl-summary-reedit) (define-key wl-summary-mode-map "\eE" 'wl-summary-resend-bounced-mail) (define-key wl-summary-mode-map "f" 'wl-summary-forward) (define-key wl-summary-mode-map "$" 'wl-summary-mark-as-important) (define-key wl-summary-mode-map "F" 'wl-summary-set-flags) (define-key wl-summary-mode-map "\M-k" 'wl-summary-toggle-persistent-mark) (define-key wl-summary-mode-map "&" 'wl-summary-mark-as-answered) (define-key wl-summary-mode-map "@" 'wl-summary-edit-addresses) (define-key wl-summary-mode-map "y" 'wl-summary-save) (define-key wl-summary-mode-map "n" 'wl-summary-next) (define-key wl-summary-mode-map "p" 'wl-summary-prev) (define-key wl-summary-mode-map "N" 'wl-summary-down) (define-key wl-summary-mode-map "P" 'wl-summary-up) (define-key wl-summary-mode-map "w" 'wl-summary-write) (define-key wl-summary-mode-map "W" 'wl-summary-write-current-folder) (define-key wl-summary-mode-map "e" 'wl-summary-save) (define-key wl-summary-mode-map "\C-c\C-o" 'wl-jump-to-draft-buffer) (define-key wl-summary-mode-map "\C-c\C-a" 'wl-addrmgr) (define-key wl-summary-mode-map "\C-c\C-p" 'wl-summary-previous-buffer) (define-key wl-summary-mode-map "\C-c\C-n" 'wl-summary-next-buffer) (define-key wl-summary-mode-map "H" 'wl-summary-toggle-all-header) (define-key wl-summary-mode-map "M" 'wl-summary-toggle-mime) (define-key wl-summary-mode-map "\C-cm" 'wl-summary-toggle-mime-buttons) (define-key wl-summary-mode-map "B" 'wl-summary-burst) (define-key wl-summary-mode-map "Z" 'wl-status-update) (define-key wl-summary-mode-map "#" 'wl-summary-print-message) (define-key wl-summary-mode-map "|" 'wl-summary-pipe-message) (define-key wl-summary-mode-map "z" 'wl-summary-suspend) (define-key wl-summary-mode-map "q" 'wl-summary-exit) (define-key wl-summary-mode-map "Q" 'wl-summary-force-exit) (define-key wl-summary-mode-map "j" 'wl-summary-jump-to-current-message) (define-key wl-summary-mode-map "J" 'wl-thread-jump-to-msg) (define-key wl-summary-mode-map "I" 'wl-summary-incorporate) (define-key wl-summary-mode-map "\M-j" 'wl-summary-jump-to-msg-by-message-id) (define-key wl-summary-mode-map "^" 'wl-summary-jump-to-parent-message) (define-key wl-summary-mode-map "!" 'wl-summary-mark-as-unread) (define-key wl-summary-mode-map "s" 'wl-summary-sync) (define-key wl-summary-mode-map "S" 'wl-summary-sort) (define-key wl-summary-mode-map "\M-S" 'wl-summary-stick) (define-key wl-summary-mode-map "T" 'wl-summary-toggle-thread) (define-key wl-summary-mode-map "l" 'wl-summary-toggle-disp-folder) (define-key wl-summary-mode-map "v" 'wl-summary-toggle-disp-msg) (define-key wl-summary-mode-map "V" 'wl-summary-virtual) (define-key wl-summary-mode-map "\C-i" 'wl-summary-goto-last-displayed-msg) (define-key wl-summary-mode-map "?" 'wl-summary-pick) (define-key wl-summary-mode-map "\ee" 'wl-summary-expire) ;; copy & paste. (define-key wl-summary-mode-map "\ew" 'wl-summary-save-current-message) (define-key wl-summary-mode-map "\C-y" 'wl-summary-yank-saved-message) ;; line commands (define-key wl-summary-mode-map "R" 'wl-summary-mark-as-read) (define-key wl-summary-mode-map "i" 'wl-summary-prefetch) (define-key wl-summary-mode-map "x" 'wl-summary-exec) (define-key wl-summary-mode-map "*" 'wl-summary-target-mark) (define-key wl-summary-mode-map "o" 'wl-summary-refile) (define-key wl-summary-mode-map "O" 'wl-summary-copy) (define-key wl-summary-mode-map "\M-o" 'wl-summary-refile-prev-destination) (define-key wl-summary-mode-map "\C-o" 'wl-summary-auto-refile) (define-key wl-summary-mode-map "d" 'wl-summary-dispose) (define-key wl-summary-mode-map "u" 'wl-summary-unmark) (define-key wl-summary-mode-map "U" 'wl-summary-unmark-all) (define-key wl-summary-mode-map "D" 'wl-summary-delete) (define-key wl-summary-mode-map "~" 'wl-summary-resend) ;; thread commands (define-key wl-summary-mode-map "t" (make-sparse-keymap)) (define-key wl-summary-mode-map "tR" 'wl-thread-mark-as-read) (define-key wl-summary-mode-map "ti" 'wl-thread-prefetch) (define-key wl-summary-mode-map "tx" 'wl-thread-exec) (define-key wl-summary-mode-map "t*" 'wl-thread-target-mark) (define-key wl-summary-mode-map "to" 'wl-thread-refile) (define-key wl-summary-mode-map "tO" 'wl-thread-copy) (define-key wl-summary-mode-map "t\M-o" 'wl-thread-refile-prev-destination) (define-key wl-summary-mode-map "td" 'wl-thread-dispose) (define-key wl-summary-mode-map "tD" 'wl-thread-delete) (define-key wl-summary-mode-map "t~" 'wl-thread-resend) (define-key wl-summary-mode-map "tu" 'wl-thread-unmark) (define-key wl-summary-mode-map "t!" 'wl-thread-mark-as-unread) (define-key wl-summary-mode-map "t$" 'wl-thread-mark-as-important) (define-key wl-summary-mode-map "tF" 'wl-thread-set-flags) (define-key wl-summary-mode-map "t&" 'wl-thread-mark-as-answered) (define-key wl-summary-mode-map "ty" 'wl-thread-save) (define-key wl-summary-mode-map "ts" 'wl-thread-set-parent) ;; target-mark commands (define-key wl-summary-mode-map "m" (make-sparse-keymap)) (define-key wl-summary-mode-map "mi" 'wl-summary-target-mark-prefetch) (define-key wl-summary-mode-map "mo" 'wl-summary-target-mark-refile) (define-key wl-summary-mode-map "mO" 'wl-summary-target-mark-copy) (define-key wl-summary-mode-map "m\M-o" 'wl-summary-target-mark-refile-prev-destination) (define-key wl-summary-mode-map "md" 'wl-summary-target-mark-dispose) (define-key wl-summary-mode-map "mD" 'wl-summary-target-mark-delete) (define-key wl-summary-mode-map "m~" 'wl-summary-target-mark-resend) (define-key wl-summary-mode-map "mu" 'wl-summary-delete-all-temp-marks) (define-key wl-summary-mode-map "my" 'wl-summary-target-mark-save) (define-key wl-summary-mode-map "mR" 'wl-summary-target-mark-mark-as-read) (define-key wl-summary-mode-map "m!" 'wl-summary-target-mark-mark-as-unread) (define-key wl-summary-mode-map "m&" 'wl-summary-target-mark-mark-as-answered) (define-key wl-summary-mode-map "m$" 'wl-summary-target-mark-mark-as-important) (define-key wl-summary-mode-map "mF" 'wl-summary-target-mark-set-flags) (define-key wl-summary-mode-map "mU" 'wl-summary-target-mark-uudecode) (define-key wl-summary-mode-map "ma" 'wl-summary-target-mark-all) (define-key wl-summary-mode-map "mt" 'wl-summary-target-mark-thread) (define-key wl-summary-mode-map "mT" 'wl-summary-target-mark-threads) (define-key wl-summary-mode-map "mA" 'wl-summary-target-mark-reply-with-citation) (define-key wl-summary-mode-map "mf" 'wl-summary-target-mark-forward) (define-key wl-summary-mode-map "m?" 'wl-summary-target-mark-pick) (define-key wl-summary-mode-map "m#" 'wl-summary-target-mark-print) (define-key wl-summary-mode-map "m|" 'wl-summary-target-mark-pipe) ;; region commands (define-key wl-summary-mode-map "r" (make-sparse-keymap)) (define-key wl-summary-mode-map "rR" 'wl-summary-mark-as-read-region) (define-key wl-summary-mode-map "ri" 'wl-summary-prefetch-region) (define-key wl-summary-mode-map "rx" 'wl-summary-exec-region) (define-key wl-summary-mode-map "mr" 'wl-summary-target-mark-region) (define-key wl-summary-mode-map "r*" 'wl-summary-target-mark-region) (define-key wl-summary-mode-map "ro" 'wl-summary-refile-region) (define-key wl-summary-mode-map "rO" 'wl-summary-copy-region) (define-key wl-summary-mode-map "r\M-o" 'wl-summary-refile-prev-destination-region) (define-key wl-summary-mode-map "rd" 'wl-summary-dispose-region) (define-key wl-summary-mode-map "rD" 'wl-summary-delete-region) (define-key wl-summary-mode-map "r~" 'wl-summary-resend-region) (define-key wl-summary-mode-map "ru" 'wl-summary-unmark-region) (define-key wl-summary-mode-map "r!" 'wl-summary-mark-as-unread-region) (define-key wl-summary-mode-map "r$" 'wl-summary-mark-as-important-region) (define-key wl-summary-mode-map "rF" 'wl-summary-set-flags-region) (define-key wl-summary-mode-map "r&" 'wl-summary-mark-as-answered-region) (define-key wl-summary-mode-map "ry" 'wl-summary-save-region) ;; score commands (define-key wl-summary-mode-map "K" 'wl-summary-increase-score) (define-key wl-summary-mode-map "L" 'wl-summary-lower-score) (define-key wl-summary-mode-map "h" (make-sparse-keymap)) (define-key wl-summary-mode-map "hR" 'wl-summary-rescore) (define-key wl-summary-mode-map "hc" 'wl-score-change-score-file) (define-key wl-summary-mode-map "he" 'wl-score-edit-current-scores) (define-key wl-summary-mode-map "hf" 'wl-score-edit-file) (define-key wl-summary-mode-map "hF" 'wl-score-flush-cache) (define-key wl-summary-mode-map "hm" 'wl-score-set-mark-below) (define-key wl-summary-mode-map "hx" 'wl-score-set-expunge-below) ;; quicksearch (define-key wl-summary-mode-map "'" 'wl-quicksearch-goto-search-folder-wrapper) ;; misc (define-key wl-summary-mode-map "\C-c\C-f" 'wl-summary-toggle-header-narrowing) (define-key wl-summary-mode-map "\M-t" 'wl-toggle-plugged) (define-key wl-summary-mode-map "\C-t" 'wl-plugged-change) ;; (define-key wl-summary-mode-map "\C-x\C-s" 'wl-summary-save-status) (wl-summary-setup-mouse) (easy-menu-define wl-summary-mode-menu wl-summary-mode-map "Menu used in Summary mode." wl-summary-mode-menu-spec)) (defun wl-summary-mimic-kill-buffer (buffer) "Kill the current (Summary) buffer with query." (interactive "bKill buffer: ") (if (or (not buffer) (string-equal buffer "") (string-equal buffer (buffer-name))) (wl-summary-exit 'force-exit) (kill-buffer buffer))) (defsubst wl-summary-message-visible-p (number) "Return non-nil if the message with NUMBER is visible." (or (eq wl-summary-buffer-view 'sequence) (not (wl-thread-entity-parent-invisible-p (wl-thread-get-entity number))))) (defun wl-summary-push-message (number) (when (and number (not (equal number (car wl-summary-buffer-message-ring)))) (setq wl-summary-buffer-message-ring (cons number wl-summary-buffer-message-ring)) (when (> (length wl-summary-buffer-message-ring) wl-summary-message-ring-max) (setcdr (nthcdr (1- wl-summary-message-ring-max) wl-summary-buffer-message-ring) nil)))) (defun wl-summary-pop-message (&optional current-number) (when wl-summary-buffer-message-ring (when current-number (setq wl-summary-buffer-message-ring (nconc wl-summary-buffer-message-ring (list current-number)))) (prog1 (car wl-summary-buffer-message-ring) (setq wl-summary-buffer-message-ring (cdr wl-summary-buffer-message-ring))))) (defsubst wl-summary-message-status (&optional number) (elmo-message-status wl-summary-buffer-elmo-folder (or number (wl-summary-message-number)))) (defun wl-summary-update-mark-and-highlight-window (&optional win beg) "A function to be called as window-scroll-functions." (with-current-buffer (window-buffer win) (when (eq major-mode 'wl-summary-mode) (let ((beg (or beg (window-start win))) (end (window-end win t))) (save-excursion (goto-char beg) (while (and (< (point) end) (not (eobp))) (when (or (null (get-text-property (point) 'face)) (wl-summary-persistent-mark-invalid-p)) (wl-summary-update-persistent-mark (wl-summary-message-number))) (forward-line))))) (set-buffer-modified-p nil))) (defsubst wl-summary-selective-display (eol &optional bol) (goto-char eol) (when (search-backward "\r" (or bol (line-beginning-position)) t) (put-text-property (point) eol 'invisible t))) (defun wl-summary-maybe-highlight-current-line (&optional number status) (if wl-summary-highlight (wl-highlight-summary-current-line number status) (save-excursion (let ((inhibit-read-only t) (deactivate-mark nil)) (wl-summary-selective-display (line-end-position)))))) (defun wl-summary-selective-display-window (&optional win _beg) "Hide trailing message numbers in summary window. This function is defined for `window-scroll-functions'" (with-current-buffer (window-buffer win) (when (eq major-mode 'wl-summary-mode) (save-excursion (let ((inhibit-read-only t) (deactivate-mark nil) (start (window-start win)) (end (window-end win t))) (goto-char start) (while (< (point) end) (wl-summary-selective-display (line-end-position)) (forward-line)))) (set-buffer-modified-p nil)))) (defun wl-summary-window-scroll-functions () (cond ((and wl-summary-highlight wl-summary-lazy-highlight wl-summary-lazy-update-mark) (list 'wl-summary-update-mark-and-highlight-window)) ((and wl-summary-highlight wl-summary-lazy-highlight) (list 'wl-highlight-summary-window)) ((null wl-summary-highlight) (append (list 'wl-summary-selective-display-window) (when wl-summary-lazy-update-mark (list 'wl-summary-update-mark-window)))) (wl-summary-lazy-update-mark (list 'wl-summary-update-mark-window)))) (defun wl-summary-after-resize-function (frame) "Called from `window-size-change-functions'." (save-excursion (save-selected-window (select-frame frame) (walk-windows (lambda (window) (set-buffer (window-buffer window)) (when (eq major-mode 'wl-summary-mode) (run-hook-with-args 'wl-summary-buffer-window-scroll-functions window))) 'nomini frame)))) ;; Handler of event from elmo-folder (defun wl-summary-update-persistent-mark-on-event (buffer numbers) (with-current-buffer buffer (save-excursion (if wl-summary-lazy-update-mark (let ((window-list (get-buffer-window-list (current-buffer) 'nomini t)) invalidate) (dolist (number numbers) (when (wl-summary-message-visible-p number) (if (catch 'visible (let ((window-list window-list) win) (while (setq win (car window-list)) (when (wl-summary-jump-to-msg number (window-start win) (window-end win)) (throw 'visible t)) (setq window-list (cdr window-list))))) (wl-summary-update-persistent-mark number) (setq invalidate t)))) (when invalidate (wl-summary-invalidate-persistent-mark) (dolist (win window-list) (wl-summary-validate-persistent-mark (window-start win) (window-end win))))) (dolist (number numbers) (when (and (wl-summary-message-visible-p number) (wl-summary-jump-to-msg number)) (wl-summary-update-persistent-mark number))))))) (defun wl-summary-buffer-attach () (when wl-summary-buffer-elmo-folder (elmo-connect-signal wl-summary-buffer-elmo-folder 'flag-changed (current-buffer) (elmo-define-signal-handler (buffer _folder numbers) (wl-summary-update-persistent-mark-on-event buffer numbers))) (elmo-connect-signal wl-summary-buffer-elmo-folder 'status-changed (current-buffer) (elmo-define-signal-handler (buffer _folder numbers) (wl-summary-update-persistent-mark-on-event buffer numbers))) (elmo-connect-signal wl-summary-buffer-elmo-folder 'update-overview (current-buffer) (elmo-define-signal-handler (buffer _folder number) (with-current-buffer buffer (wl-summary-rescan-message number)))))) (defun wl-summary-buffer-detach () (when (and (eq major-mode 'wl-summary-mode) wl-summary-buffer-elmo-folder) (elmo-disconnect-signal 'flag-changed (current-buffer)) (elmo-disconnect-signal 'status-changed (current-buffer)) (elmo-disconnect-signal 'update-overview (current-buffer)))) (defun wl-status-update () (interactive) (wl-address-init)) (defun wl-summary-display-top () (interactive) (goto-char (point-min)) (run-hooks 'wl-summary-buffer-window-scroll-functions) (if wl-summary-buffer-disp-msg (wl-summary-redisplay))) (defun wl-summary-display-bottom () (interactive) (goto-char (point-max)) (forward-line -1) (run-hooks 'wl-summary-buffer-window-scroll-functions) (if wl-summary-buffer-disp-msg (wl-summary-redisplay))) (defun wl-summary-count-unread () (let ((flag-count (elmo-folder-count-flags wl-summary-buffer-elmo-folder))) (setq wl-summary-buffer-new-count (or (cdr (assq 'new flag-count)) 0) wl-summary-buffer-unread-count (or (cdr (assq 'unread flag-count)) 0) wl-summary-buffer-answered-count (or (cdr (assq 'answered flag-count)) 0)) flag-count)) (defun wl-summary-message-string (&optional use-cache) "Return full body string of current message. If optional USE-CACHE is non-nil, use cache if exists." (let ((number (wl-summary-message-number)) (folder wl-summary-buffer-elmo-folder)) (if (null number) (message "No message.") (elmo-message-fetch-string folder number (elmo-make-fetch-strategy 'entire use-cache ; use cache nil ; save cache (should `t'?) (and use-cache (elmo-file-cache-get-path (elmo-message-field folder number 'message-id)))) 'unread)))) (defun wl-summary-reedit (&optional arg) "Re-edit current message. If ARG is non-nil, Supersedes message" (interactive "P") (wl-summary-toggle-disp-msg 'off) (cond ((null (wl-summary-message-number)) (message "No message.")) (arg (wl-summary-supersedes-message)) ((string= (wl-summary-buffer-folder-name) wl-draft-folder) (wl-draft-reedit (wl-summary-message-number)) (if (wl-message-news-p) (mail-position-on-field "Newsgroups") (mail-position-on-field "To"))) (t (wl-draft-edit-string (wl-summary-message-string 'maybe))))) (defun wl-summary-resend-bounced-mail () "Re-mail the current message. This only makes sense if the current message is a bounce message which contains some mail you have written but has been bounced back to you." (interactive) (wl-summary-toggle-disp-msg 'off) (save-excursion (wl-summary-set-message-buffer-or-redisplay) (set-buffer (wl-message-get-original-buffer)) (goto-char (point-min)) (let ((case-fold-search nil)) (cond ((and (re-search-forward (concat "^\\($\\|[Cc]ontent-[Tt]ype:[ \t]+multipart/\\(report\\|mixed\\)\\)") nil t) (not (bolp)) (re-search-forward "boundary=\"\\([^\"]+\\)\"" nil t)) (let ((boundary (buffer-substring (match-beginning 1) (match-end 1))) start) (cond ((and (setq start (re-search-forward (concat "^--" boundary "\n" "\\([Cc]ontent-[Dd]escription:.*\n\\)?" "[Cc]ontent-[Tt]ype:[ \t]+" "\\(message/rfc822\\|text/rfc822-headers\\).*\n" "\\(.+\n\\)*\n") nil t)) (re-search-forward (concat "\n\\(--" boundary "\\)--\n") nil t)) (wl-draft-edit-string (buffer-substring start (match-beginning 1)))) (t (message "Seems no message/rfc822 part."))))) ((let ((case-fold-search t)) (re-search-forward wl-rejected-letter-start nil t)) (skip-chars-forward " \t\n") (wl-draft-edit-string (buffer-substring (point) (point-max)))) (t (message "Does not appear to be a rejected letter.")))))) (defun wl-summary-detect-mark-position () (let ((column wl-summary-buffer-number-column) (formatter wl-summary-buffer-line-formatter) (lang wl-summary-buffer-weekday-name-lang) (dummy-number 10000) (dummy-temp (char-to-string 200)) ;; bind only for the check. (wl-summary-new-uncached-mark (char-to-string 201)) (wl-summary-persistent-mark-priority-list '(new)) ; ditto. wl-summary-highlight temp persistent) (with-temp-buffer (set-buffer-multibyte t) (setq wl-summary-buffer-number-column column wl-summary-buffer-line-formatter formatter wl-summary-buffer-weekday-name-lang lang) (insert (wl-summary-create-line (elmo-msgdb-make-message-entity (luna-make-entity 'modb-entity-handler) :number dummy-number :from "foo" :subject "bar" :size 100) nil dummy-temp (let ((status (elmo-message-status nil dummy-number))) (elmo-message-status-set-flags status '(new)) (elmo-message-status-set-killed status nil) status))) (goto-char (point-min)) (setq temp (save-excursion (when (search-forward dummy-temp nil t) (current-column))) persistent (save-excursion (when (search-forward wl-summary-new-uncached-mark nil t) (current-column))))) (setq wl-summary-buffer-temp-mark-column temp wl-summary-buffer-persistent-mark-column persistent))) (defun wl-summary-buffer-set-folder (folder) (wl-summary-buffer-detach) (if (stringp folder) (setq folder (wl-folder-get-elmo-folder folder))) (setq wl-summary-buffer-elmo-folder folder) (make-local-variable 'wl-message-buffer) (setq wl-summary-buffer-mime-charset (wl-folder-mime-charset (elmo-folder-name-internal folder))) (setq wl-summary-buffer-weekday-name-lang (or (wl-get-assoc-list-value wl-folder-weekday-name-lang-alist (elmo-folder-name-internal folder)) wl-summary-weekday-name-lang)) (setq wl-summary-buffer-thread-indent-set (wl-get-assoc-list-value wl-folder-thread-indent-set-alist (elmo-folder-name-internal folder))) (setq wl-summary-buffer-number-column (or (wl-get-assoc-list-value wl-summary-number-column-alist (wl-summary-buffer-folder-name)) wl-summary-default-number-column)) (wl-line-formatter-setup wl-summary-buffer-line-formatter (setq wl-summary-buffer-line-format (or (wl-get-assoc-list-value wl-folder-summary-line-format-alist (elmo-folder-name-internal folder)) wl-summary-line-format)) wl-summary-line-format-spec-alist) (wl-line-formatter-setup wl-summary-buffer-mode-line-formatter wl-summary-mode-line-format wl-summary-mode-line-format-spec-alist) (setq wl-summary-buffer-persistent (wl-folder-persistent-p (elmo-folder-name-internal folder))) (elmo-folder-set-persistent-internal folder wl-summary-buffer-persistent) (wl-summary-buffer-attach) ;; process duplicates. (elmo-folder-set-process-duplicates-internal folder (cdr (elmo-string-matched-assoc (elmo-folder-name-internal folder) wl-folder-process-duplicates-alist))) (setq wl-thread-indent-level-internal (or (nth 0 wl-summary-buffer-thread-indent-set) wl-thread-indent-level) wl-thread-have-younger-brother-str-internal (or (nth 1 wl-summary-buffer-thread-indent-set) wl-thread-have-younger-brother-str) wl-thread-youngest-child-str-internal (or (nth 2 wl-summary-buffer-thread-indent-set) wl-thread-youngest-child-str) wl-thread-vertical-str-internal (or (nth 3 wl-summary-buffer-thread-indent-set) wl-thread-vertical-str) wl-thread-horizontal-str-internal (or (nth 4 wl-summary-buffer-thread-indent-set) wl-thread-horizontal-str) wl-thread-space-str-internal (or (nth 5 wl-summary-buffer-thread-indent-set) wl-thread-space-str)) (run-hooks 'wl-summary-buffer-set-folder-hook)) (defun wl-summary-mode () "Major mode for reading threaded messages. See Info under Wanderlust for full documentation. Special commands: \\{wl-summary-mode-map} Entering Folder mode calls the value of `wl-summary-mode-hook'." (interactive) (unless (called-interactively-p 'interactive) (kill-all-local-variables)) (setq major-mode 'wl-summary-mode) (setq mode-name "Summary") (use-local-map wl-summary-mode-map) ;;; (setq default-directory (or wl-tmp-dir (expand-file-name "~/"))) (setq buffer-read-only t) (setq truncate-lines t) (setq show-trailing-whitespace nil) (make-local-variable 'nobreak-char-display) (setq nobreak-char-display wl-summary-nobreak-char-display) ;;; (make-local-variable 'tab-width) ;;; (setq tab-width 1) (buffer-disable-undo (current-buffer)) (set 'bidi-paragraph-direction 'left-to-right) (wl-mode-line-buffer-identification '(wl-summary-buffer-mode-line)) (setq wl-summary-buffer-window-scroll-functions (wl-summary-window-scroll-functions)) (when wl-summary-buffer-window-scroll-functions (let ((hook 'window-scroll-functions)) (dolist (function wl-summary-buffer-window-scroll-functions) (add-hook hook function nil t))) (add-hook 'window-size-change-functions #'wl-summary-after-resize-function)) (dolist (hook '(change-major-mode-hook kill-buffer-hook)) (add-hook hook #'wl-summary-buffer-detach nil t)) ;; This hook may contain the function `wl-setup-summary' for reasons ;; of system internal to accord facilities for the Emacs variants. (run-hooks 'wl-summary-mode-hook)) (defun wl-summary-overview-entity-compare-by-size (x y) "Compare entity X and Y by size." (< (elmo-message-entity-field x 'size) (elmo-message-entity-field y 'size))) (defun wl-summary-overview-entity-compare-by-date (x y) "Compare entity X and Y by date." (condition-case nil (time-less-p (elmo-message-entity-field x 'date) (elmo-message-entity-field y 'date)) (error))) ;; ignore error. (defun wl-summary-overview-entity-compare-by-number (x y) "Compare entity X and Y by number." (< (elmo-message-entity-number x) (elmo-message-entity-number y))) (defun wl-summary-overview-entity-compare-by-from (x y) "Compare entity X and Y by from." (string< (or (elmo-message-entity-field x 'from) wl-summary-no-from-message) (or (elmo-message-entity-field y 'from) wl-summary-no-from-message))) (defun wl-summary-overview-entity-compare-by-subject (x y) "Compare entity X and Y by subject." (string< (elmo-message-entity-field x 'subject) (elmo-message-entity-field y 'subject))) (defun wl-summary-get-list-info (entity) "Returns (\"ML-name\" . ML-count) of ENTITY." (or (elmo-message-entity-field entity 'ml-info) (let* ((getter (let ((entity entity)) (lambda (field) (elmo-message-entity-field entity field)))) (name (elmo-find-list-match-value elmo-mailing-list-name-spec-list getter)) (count (elmo-find-list-match-value elmo-mailing-list-count-spec-list getter))) (cons name (and count (string-to-number count)))))) (defun wl-summary-overview-entity-compare-by-list-info (x y) "Compare entity X and Y by mailing-list info." (let* ((list-info-x (wl-summary-get-list-info x)) (list-info-y (wl-summary-get-list-info y))) (if (equal (car list-info-x) (car list-info-y)) (if (equal (cdr list-info-x) (cdr list-info-y)) (wl-summary-overview-entity-compare-by-date x y) (< (or (cdr list-info-x) 0) (or (cdr list-info-y) 0))) (string< (or (car list-info-x) "") (or (car list-info-y) ""))))) (defun wl-summary-define-sort-command () "Define functions to sort summary lines by `wl-summary-sort-specs'." (interactive) (dolist (sort-by wl-summary-sort-specs) (fset (intern (format "wl-summary-sort-by-%s" sort-by)) `(lambda (&optional reverse) ,(format "\ Sort summary lines into the order by %s. If optional argument REVERSE is non-nil, sort into reverse order. This function is defined by `wl-summary-define-sort-command'." sort-by) (interactive "P") (wl-summary-rescan ,(symbol-name sort-by) reverse))))) (defun wl-summary-sort-function-from-spec (spec reverse) (let (function) (when (string-match "^!\\(.+\\)$" spec) (setq spec (match-string 1 spec) reverse (not reverse))) (setq function (intern (format "wl-summary-overview-entity-compare-by-%s" spec))) (if reverse `(lambda (x y) (not (,function x y))) function))) (defun wl-summary-sort-messages (numbers sort-by reverse) (let* ((functions (mapcar (lambda (spec) (wl-summary-sort-function-from-spec spec reverse)) (if (listp sort-by) sort-by (list sort-by)))) (predicate (if (= (length functions) 1) (car functions) (lambda (x y) (let ((functions functions)) (catch 'done (dolist (function functions) (when (funcall function x y) (throw 'done t)) (when (funcall function y x) (throw 'done nil))))))))) (mapcar #'elmo-message-entity-number (sort (mapcar (lambda (number) (elmo-message-entity wl-summary-buffer-elmo-folder number)) numbers) predicate)))) (defun wl-summary-rescan (&optional sort-by reverse disable-killed disable-thread) "Rescan current folder without updating." (interactive) (let ((elmo-mime-charset wl-summary-buffer-mime-charset) (inhibit-read-only t) (buffer-read-only nil) (numbers (elmo-folder-list-messages wl-summary-buffer-elmo-folder (not disable-killed) t)) ; in-msgdb (wl-thread-saved-entity-hashtb-internal (and (not disable-thread) wl-thread-entity-hashtb)) (wl-summary-search-parent-by-subject-regexp (and disable-thread wl-summary-search-parent-by-subject-regexp)) (wl-summary-divide-thread-when-subject-changed (and disable-thread wl-summary-divide-thread-when-subject-changed)) num expunged) (erase-buffer) (message "Re-scanning...") (when (and sort-by numbers) (let ((action (if reverse "Reverse sorting" "Sorting"))) (message "%s by %s..." action sort-by) (setq numbers (wl-summary-sort-messages numbers sort-by reverse)) (message "%s by %s...done" action sort-by))) (setq num (length numbers)) (setq wl-thread-entity-hashtb (elmo-make-hash (* num 2)) wl-thread-entity-list nil wl-thread-entities nil wl-summary-scored nil wl-summary-buffer-number-list nil wl-summary-buffer-persistent-mark-version 0 wl-summary-buffer-target-mark-list nil wl-summary-buffer-temp-mark-list nil wl-summary-delayed-update nil) (elmo-kill-buffer wl-summary-search-buf-name) (elmo-with-progress-display (wl-summary-insert-line (+ num (length wl-summary-delayed-update))) "Constructing summary structure" (dolist (number numbers) (wl-summary-insert-message (elmo-message-entity wl-summary-buffer-elmo-folder number) wl-summary-buffer-elmo-folder nil)) (while wl-summary-delayed-update (message "Parent (%d) of message %d is no entity" (caar wl-summary-delayed-update) (elmo-message-entity-number (cdar wl-summary-delayed-update))) (wl-summary-insert-message (cdar wl-summary-delayed-update) wl-summary-buffer-elmo-folder nil t) (setq wl-summary-delayed-update (cdr wl-summary-delayed-update)))) (when (eq wl-summary-buffer-view 'thread) (wl-thread-insert-top)) (when wl-use-scoring (wl-summary-score-headers (wl-summary-rescore-msgs wl-summary-buffer-number-list) t) (when (and wl-summary-scored (setq expunged (wl-summary-score-update-all-lines))) (message "%d message(s) are expunged by scoring." (length expunged)))) (wl-summary-set-message-modified) (wl-summary-count-unread) (wl-summary-update-modeline) (goto-char (if (eq wl-summary-order 'descending) (point-min) (point-max))) (forward-line -1) (set-buffer-modified-p nil))) (defun wl-summary-rescan-message (number &optional reparent) "Rescan current message without updating." (interactive (list (wl-summary-message-number) current-prefix-arg)) (let ((start-number (wl-summary-message-number)) (start-column (current-column))) (when (wl-summary-jump-to-msg number) (let* ((folder wl-summary-buffer-elmo-folder) (entity (elmo-message-entity folder number)) (inhibit-read-only t)) (if (eq wl-summary-buffer-view 'thread) (let* ((thread-entity (wl-thread-get-entity number)) (thread-parent (wl-thread-entity-get-parent thread-entity)) (entity-parent (elmo-message-entity-number (elmo-message-entity-parent folder entity))) update-top-list) (if (and (not reparent) (eq thread-parent entity-parent)) (progn (wl-thread-entity-set-linked thread-entity nil) (wl-thread-update-line-on-buffer-sub nil number)) (let ((replacements (cons number (wl-thread-entity-get-descendant thread-entity)))) (wl-thread-delete-message number 'deep 'update) (wl-thread-cleanup-symbols replacements) (dolist (number replacements) (setq update-top-list (nconc update-top-list (wl-summary-insert-thread (elmo-message-entity folder number) folder 'update)))) (when update-top-list (wl-thread-update-indent-string-thread (elmo-uniq-list update-top-list)))))) (delete-region (point-at-bol) (1+ (point-at-eol))) (wl-summary-insert-line (wl-summary-create-line entity nil (wl-summary-temp-mark number) (elmo-message-status folder number))))) (when (and wl-summary-buffer-disp-msg wl-summary-buffer-current-msg) (save-excursion (when (wl-summary-jump-to-msg wl-summary-buffer-current-msg) (wl-highlight-summary-displaying)))) (wl-summary-set-message-modified) (wl-summary-jump-to-msg start-number) (move-to-column start-column)))) (defun wl-summary-next-folder-or-exit (&optional next-entity upward) (if (and next-entity wl-auto-select-next) (let (retval) (wl-summary-toggle-disp-msg 'off) (unwind-protect (setq retval (wl-summary-goto-folder-subr next-entity 'force-update nil nil ; not sticky t ; interactive! )) (wl-folder-set-current-entity-id (wl-folder-get-entity-id next-entity)) (if (and (eq retval 'more-next) (memq wl-auto-select-next '(unread skip-no-unread)) (memq this-command wl-summary-next-no-unread-command)) (if upward (wl-summary-up t (eq wl-auto-select-next 'skip-no-unread)) (goto-char (point-max)) (forward-line -1) (wl-summary-down t (eq wl-auto-select-next 'skip-no-unread)))))) (wl-summary-exit))) (defun wl-summary-entity-info-msg (entity finfo) (or (and entity (concat (if (memq 'ask-folder wl-use-folder-petname) (wl-folder-get-petname entity) entity) (if (null (car finfo)) " (? new/? unread)" (format " (%d new/%d unread)" (nth 0 finfo) (+ (nth 0 finfo) (nth 1 finfo)))))) "folder mode")) (defun wl-summary-set-message-modified () (setq wl-summary-buffer-message-modified t)) (defun wl-summary-message-modified-p () wl-summary-buffer-message-modified) (defun wl-summary-set-thread-modified () (setq wl-summary-buffer-thread-modified t)) (defun wl-summary-thread-modified-p () wl-summary-buffer-thread-modified) (defun wl-summary-exec-with-confirmation (&optional message) (when wl-summary-buffer-temp-mark-list (if (y-or-n-p (or message (format "Execute marks in %s? " (wl-summary-buffer-folder-name)))) (progn (wl-summary-exec) (if wl-summary-buffer-temp-mark-list (error "Some execution was failed"))) ;; temp-mark-list is remained. (message "")))) (defun wl-summary-cleanup-temp-marks () (when wl-summary-buffer-temp-mark-list (wl-summary-exec-with-confirmation (format "Execute marks in %s? (answer \"n\" to discard them) " (wl-summary-buffer-folder-name)))) (wl-summary-delete-all-temp-marks 'no-msg) (setq wl-summary-scored nil)) ;; a subroutine for wl-summary-exit/wl-save-status ;; Note that folder is not commited here. (defun wl-summary-save-view () ;; already in summary buffer. (when wl-summary-buffer-persistent ;; save the current summary buffer view. (if (and wl-summary-cache-use (or (wl-summary-message-modified-p) (wl-summary-thread-modified-p))) (wl-summary-save-view-cache)))) (defun wl-summary-save-status () "Save summary view and msgdb." (interactive) (if (called-interactively-p 'interactive) (message "Saving summary status...")) (wl-summary-save-view) (elmo-folder-commit wl-summary-buffer-elmo-folder) (elmo-folder-check wl-summary-buffer-elmo-folder) (if wl-use-scoring (wl-score-save)) (if (called-interactively-p 'interactive) (message "Saving summary status...done"))) (defun wl-summary-force-exit () "Exit current summary. Buffer is deleted even the buffer is sticky." (interactive) (wl-summary-exit 'force-exit)) (defun wl-summary-exit (&optional force-exit) "Exit current summary. if FORCE-EXIT, exits even the summary is sticky." (interactive "P") (let ((summary-buf (current-buffer)) (sticky (wl-summary-sticky-p)) summary-win folder-buf folder-win) (run-hooks 'wl-summary-exit-pre-hook) (if wl-summary-buffer-exit-function (funcall wl-summary-buffer-exit-function) (if (or force-exit (not sticky)) (wl-summary-cleanup-temp-marks)) (unwind-protect ;; save summary status (progn (wl-summary-save-view) (if (or force-exit (not sticky)) (elmo-folder-close wl-summary-buffer-elmo-folder) (elmo-folder-commit wl-summary-buffer-elmo-folder) (elmo-folder-check wl-summary-buffer-elmo-folder)) (if wl-use-scoring (wl-score-save))) ;; for sticky summary (wl-delete-all-overlays) (setq wl-summary-buffer-disp-msg nil) (elmo-kill-buffer wl-summary-search-buf-name) ;; delete message window if displayed. (if (and wl-message-buffer (get-buffer-window wl-message-buffer)) (delete-window (get-buffer-window wl-message-buffer))) (if (and wl-summary-use-frame (> (length (visible-frame-list)) 1)) (delete-frame)) (if (setq folder-buf (get-buffer wl-folder-buffer-name)) (if wl-summary-use-frame (let (select-frame) (save-selected-window (dolist (frame (visible-frame-list)) (select-frame frame) (if (get-buffer-window folder-buf) (setq select-frame frame)))) (if select-frame (select-frame select-frame) (switch-to-buffer folder-buf))) (if (setq folder-win (get-buffer-window folder-buf)) ;; folder win is already displayed. (select-window folder-win) ;; folder win is not displayed. (switch-to-buffer folder-buf))) ;; currently no folder buffer (wl-folder)) (and wl-folder-move-cur-folder wl-folder-buffer-cur-point (goto-char wl-folder-buffer-cur-point)) (setq wl-folder-buffer-cur-path nil) (setq wl-folder-buffer-last-visited-entity-id wl-folder-buffer-cur-entity-id) (setq wl-folder-buffer-cur-entity-id nil) (wl-delete-all-overlays) (if wl-summary-exit-next-move (wl-folder-next-unsync t) (beginning-of-line)) (if (setq summary-win (get-buffer-window summary-buf)) (delete-window summary-win)) (if (or force-exit (not sticky)) (progn (set-buffer summary-buf) (kill-buffer summary-buf))) (run-hooks 'wl-summary-exit-hook))))) (defun wl-summary-suspend () (interactive) (wl-summary-exit) (wl-folder-suspend)) (defun wl-summary-sync-force-update (&optional unset-cursor no-check) (interactive) (wl-summary-sync-update unset-cursor nil nil no-check)) (defsubst wl-summary-sync-all-init () (wl-summary-cleanup-temp-marks) (erase-buffer) (wl-summary-set-message-modified) (setq wl-thread-entity-hashtb (elmo-make-hash (* (elmo-folder-length wl-summary-buffer-elmo-folder) 2))) (setq wl-thread-entity-list nil) (setq wl-thread-entities nil) (setq wl-summary-buffer-number-list nil) (setq wl-summary-buffer-target-mark-list nil) (setq wl-summary-buffer-temp-mark-list nil)) (defun wl-summary-sync (&optional unset-cursor force-range) (interactive) (let* ((folder wl-summary-buffer-elmo-folder) (inhibit-read-only t) (buffer-read-only nil) (range (or force-range (wl-summary-input-range (elmo-folder-name-internal folder))))) (when (symbolp range) (setq range (symbol-name range))) (cond ((string-match "rescan" range) (let ((msg (wl-summary-message-number)) (wl-use-scoring (if (string-match "noscore" range) nil wl-use-scoring))) (wl-summary-rescan nil nil (string-match "noscore" range) (string-match "thread" range)) (and msg (wl-summary-jump-to-msg msg)))) ((string= range "mark") (let ((msg (wl-summary-message-number))) (call-interactively 'wl-summary-sync-marks) (and msg (wl-summary-jump-to-msg msg)))) ((string= range "cache-status") (let ((msg (wl-summary-message-number))) (wl-summary-resume-cache-status) (and msg (wl-summary-jump-to-msg msg)))) ((string= range "no-sync")) ((or (string-match "^last:" range) (string-match "^first:" range)) (wl-summary-goto-folder-subr (concat "/" range "/" (elmo-folder-name-internal folder)) 'force-update nil nil t)) (t (wl-summary-sync-update unset-cursor (string-match "entirely" range) (string-match "all" range)))))) (defvar wl-summary-edit-addresses-candidate-fields ;; First element becomes default. '("from" "to" "cc")) (defun wl-summary-edit-addresses-collect-candidate-fields (mime-charset) (let ((fields wl-summary-edit-addresses-candidate-fields) body candidates components) (while fields (setq body (mapconcat 'identity (elmo-multiple-field-body (car fields)) ",")) (setq body (elmo-parse-addresses body)) (if body (setq candidates (append candidates body))) (setq fields (cdr fields))) (setq candidates (elmo-uniq-list candidates)) (mapcar (lambda (x) (setq components (std11-extract-address-components x)) (cons (nth 1 components) (and (car components) (eword-decode-string (mime-charset-decode-string (car components) mime-charset))))) candidates))) (defun wl-summary-edit-addresses-subr (the-email name-in-addr) ;; returns nil if there's no change. (if (elmo-get-hash-val (downcase the-email) wl-address-petname-hash) (let (char) (message "'%s' already exists. (e)dit/(d)elete/(c)ancel?" the-email) (while (not (or (eq (setq char (read-char)) ?\r) (eq char ?\n) (eq char (string-to-char " ")) (eq char ?e) (eq char ?c) (eq char ?d))) (message "Please answer `e' or `d' or `c'. (e)dit/(d)elete/(c)ancel?")) (cond ((or (eq char ?e) (eq char ?\n) (eq char ?\r) (eq char (string-to-char " "))) ;; Change Addresses (wl-address-add-or-change the-email (wl-address-header-extract-realname (cdr (assoc (let ((completion-ignore-case t) comp) (setq comp (try-completion the-email wl-address-completion-list)) (if (equal comp t) the-email comp)) wl-address-completion-list)))) "edited") ((eq char ?d) ;; Delete Addresses (if (y-or-n-p (format "Delete '%s'? " the-email)) (progn (wl-address-delete the-email) "deleted") (message "") nil)) (t (message "") nil))) ;; Add Petname (wl-address-add-or-change the-email name-in-addr) "added")) (defun wl-summary-edit-addresses (&optional addr-str) "Edit address book interactively. Optional argument ADDR-STR is used as a target address if specified." (interactive (if current-prefix-arg (list (read-from-minibuffer "Target address: ")))) (if (null (wl-summary-message-number)) (message "No message.") (save-excursion (let* ((charset wl-summary-buffer-mime-charset) (candidates (with-current-buffer (wl-summary-get-original-buffer) (wl-summary-edit-addresses-collect-candidate-fields charset))) address pair result) (if addr-str (setq address addr-str) (when candidates (setq address (car (car candidates))) (setq address (completing-read (format "Target address (%s): " address) (mapcar (lambda (x) (cons (car x) (car x))) candidates) nil nil nil nil address)))) (when address (setq pair (assoc address candidates)) (unless pair (setq pair (cons address nil))) (when (setq result (wl-summary-edit-addresses-subr (car pair) (cdr pair))) ;; update alias (wl-status-update) (setq address (assoc (car pair) wl-address-list)) (if address (message "%s, %s, <%s> is %s." (nth 2 address) (nth 1 address) (nth 0 address) result))) ;;; i'd like to update summary-buffer, but... ;;; (wl-summary-rescan) (run-hooks 'wl-summary-edit-addresses-hook)))))) (defun wl-summary-incorporate (&optional arg) "Check and prefetch all uncached messages. If ARG is non-nil, checking is omitted." (interactive "P") (unless arg (save-excursion (wl-summary-sync-force-update))) (wl-summary-prefetch-region-no-mark (point-min) (point-max) wl-summary-incorporate-marks)) (defun wl-summary-force-prefetch () "All uncached messages are cached." (interactive) (unless (elmo-folder-local-p wl-summary-buffer-elmo-folder) (let* ((targets (elmo-folder-list-flagged wl-summary-buffer-elmo-folder 'uncached 'in-msgdb)) (count 0) wl-prefetch-confirm wl-prefetch-threshold (length (length targets))) (save-excursion (elmo-with-progress-display (wl-summary-prefetch-message length) "Retrieving" (goto-char (point-min)) (dolist (target targets) (when (if (not (wl-thread-entity-parent-invisible-p (wl-thread-get-entity target))) (progn (wl-summary-jump-to-msg target) (wl-summary-prefetch-msg (wl-summary-message-number))) (wl-summary-prefetch-msg target)) (cl-incf count)) (elmo-progress-notify 'wl-summary-prefetch-message))) (message "Retrieved %d/%d message(s)" count length))))) (defun wl-summary-prefetch-msg (number &optional arg) "Prefetch message and return non-nil value. If skipped, return nil." ;; prefetching procedure. (save-excursion (let* ((size (elmo-message-field wl-summary-buffer-elmo-folder number 'size)) (file-cached (elmo-file-cache-exists-p (elmo-message-field wl-summary-buffer-elmo-folder number 'message-id))) (force-read (and size (or file-cached (and (null wl-prefetch-confirm) arg) (null wl-prefetch-threshold) (< size wl-prefetch-threshold))))) (ignore-errors (when (and (or arg (not file-cached)) size (not force-read) wl-prefetch-confirm) (let ((wl-message-entity (elmo-message-entity wl-summary-buffer-elmo-folder number))) (setq force-read (save-restriction (widen) (y-or-n-p (format "Message from %s has %s bytes. Prefetch it? " (concat "[ " (save-match-data (wl-set-string-width 17 (funcall wl-summary-from-function (elmo-delete-char ?\" (or (elmo-message-entity-field wl-message-entity 'from) "??"))))) " ]") (cl-do ((size (/ size 1024.0) (/ size 1024.0)) ;; kilo, mega, giga, tera, peta, exa (post-fixes (list "k" "M" "G" "T" "P" "E") (cdr post-fixes))) ((< size 1024) (format "%.0f%s" size (car post-fixes)))))))) (message ""))) ; flush. (if force-read (save-excursion (save-match-data ;; online (when (or arg (not file-cached)) (elmo-message-encache wl-summary-buffer-elmo-folder number)) (elmo-message-set-cached wl-summary-buffer-elmo-folder number t)) t) nil))))) (defsubst wl-summary-narrow-to-region (beg end) (narrow-to-region (save-excursion (goto-char beg) (point-at-bol)) (save-excursion (goto-char end) (if (= (current-column) 0) (point-at-bol) (point-at-eol))))) (defun wl-summary-prefetch-region-no-mark (beg end &optional prefetch-marks) (interactive "r") (let ((count 0) targets mark length entity msg) (save-excursion (save-restriction (wl-summary-narrow-to-region beg end) ;; collect prefetch targets. (message "Collecting marks...") (goto-char (point-min)) (while (not (eobp)) (setq msg (wl-summary-message-number)) (setq mark (wl-summary-persistent-mark msg)) (if (or (and (null prefetch-marks) msg (null (elmo-file-cache-exists-p (elmo-message-field wl-summary-buffer-elmo-folder msg 'message-id)))) (member mark prefetch-marks)) (setq targets (nconc targets (list msg)))) (setq entity (wl-thread-get-entity msg)) (if (or (not (eq wl-summary-buffer-view 'thread)) (wl-thread-entity-get-opened entity)) (); opened. no hidden children. (setq targets (nconc targets (wl-thread-get-children-msgs-uncached msg prefetch-marks)))) (forward-line)) (setq length (length targets)) (message "Prefetching...") (while targets (when (if (not (wl-thread-entity-parent-invisible-p (wl-thread-get-entity (car targets)))) (progn (wl-summary-jump-to-msg (car targets)) (wl-summary-prefetch-msg (wl-summary-message-number))) (wl-summary-prefetch-msg (car targets))) (message "Prefetching... %d/%d message(s)" (setq count (+ 1 count)) length)) (setq targets (cdr targets))) (message "Prefetched %d/%d message(s)" count length) (cons count length))))) (defun wl-summary-delete-marks-on-buffer (marks) (while marks (wl-summary-unmark (pop marks)))) (defun wl-summary-delete-copy-marks-on-buffer (copies) (wl-summary-delete-marks-on-buffer copies)) ;;; (defun wl-summary-delete-all-target-marks () (wl-summary-delete-marks-on-buffer wl-summary-buffer-target-mark-list)) (defun wl-summary-number-list-from-region (beg end) (save-excursion (save-restriction (wl-summary-narrow-to-region beg end) (goto-char (point-min)) (let (number-list) (if (eq wl-summary-buffer-view 'thread) (while (not (eobp)) (let* ((number (wl-summary-message-number)) (entity (wl-thread-get-entity number))) (setq number-list (nconc number-list (if (wl-thread-entity-get-opened entity) (list number) (wl-thread-get-children-msgs number)))) (forward-line))) (while (not (eobp)) (setq number-list (nconc number-list (list (wl-summary-message-number)))) (forward-line))) number-list)))) (defun wl-summary-mark-as-read-region (beg end) (interactive "r") (let ((number-list (wl-summary-number-list-from-region beg end))) (if (null number-list) (message "No message.") (wl-summary-mark-as-read number-list)))) (defun wl-summary-mark-as-unread-region (beg end) (interactive "r") (let ((number-list (wl-summary-number-list-from-region beg end))) (if (null number-list) (message "No message.") (wl-summary-mark-as-unread number-list)))) (defun wl-summary-set-flags-region (beg end &optional remove) (interactive "r\nP") (let ((number-list (wl-summary-number-list-from-region beg end))) (if (null number-list) (message "No message.") (wl-summary-set-flags-internal number-list nil nil remove) (wl-summary-count-unread) (wl-summary-update-modeline)))) (defun wl-summary-mark-as-answered-region (beg end &optional remove) (interactive "r\nP") (let ((number-list (wl-summary-number-list-from-region beg end)) (remove (or remove (elmo-message-flagged-p wl-summary-buffer-elmo-folder (save-excursion (goto-char beg) (wl-summary-message-number)) 'answered)))) (if (null number-list) (message "No message.") (wl-summary-set-persistent-mark-internal remove 'answered number-list nil nil (called-interactively-p 'interactive)) (wl-summary-count-unread) (wl-summary-update-modeline)))) (defun wl-summary-mark-as-important-region (beg end &optional remove) (interactive "r\nP") (let ((number-list (wl-summary-number-list-from-region beg end)) (remove (or remove (elmo-message-flagged-p wl-summary-buffer-elmo-folder (save-excursion (goto-char beg) (wl-summary-message-number)) 'important)))) (if (null number-list) (message "No message.") (wl-summary-set-persistent-mark-internal remove 'important number-list nil nil (called-interactively-p 'interactive)) (wl-summary-count-unread) (wl-summary-update-modeline)))) (defun wl-summary-recover-messages-region (beg end) "Recover killed messages in region." (interactive "r") (let ((number-list (wl-summary-number-list-from-region beg end))) (if (null number-list) (message "No message.") (elmo-folder-recover-messages wl-summary-buffer-elmo-folder number-list)))) (defun wl-summary-mark-as-read-all () (interactive) (if (or (not (called-interactively-p 'interactive)) (y-or-n-p "Mark all messages as read? ")) (let ((folder wl-summary-buffer-elmo-folder)) (message "Setting all msgs as read...") (elmo-folder-unset-flag folder (elmo-folder-list-flagged folder 'unread 'in-msgdb) 'unread) (wl-folder-update-unread (wl-summary-buffer-folder-name) 0) (setq wl-summary-buffer-unread-count 0) (setq wl-summary-buffer-new-count 0) (wl-summary-update-modeline) (message "Setting all msgs as read...done")))) (defun wl-summary-delete-cache () "Delete cache of current message." (interactive) (save-excursion (let* ((folder wl-summary-buffer-elmo-folder) number) (setq number (wl-summary-message-number)) (elmo-message-set-cached folder number nil) (ignore-errors (elmo-file-cache-delete (elmo-file-cache-get-path (elmo-message-field wl-summary-buffer-elmo-folder number 'message-id))))))) (defun wl-summary-resume-cache-status () "Resume the cache status of all messages in the current folder." (interactive) (let ((folder wl-summary-buffer-elmo-folder) number msgid) (message "Resuming cache status...") (save-excursion (goto-char (point-min)) (while (not (eobp)) (setq number (wl-summary-message-number)) (setq msgid (elmo-message-field folder number 'message-id)) (elmo-message-set-cached folder number (elmo-file-cache-exists-p msgid)) (forward-line)) (wl-summary-count-unread) (wl-summary-update-modeline) (message "Resuming cache status...done")))) (defun wl-summary-delete-messages-on-buffer (msgs) (interactive) (save-excursion (let ((inhibit-read-only t) (buffer-read-only nil) (msgs2 msgs) update-list) (elmo-kill-buffer wl-summary-search-buf-name) (elmo-with-progress-display (wl-summary-delete-messages (length msgs)) "Delete messages on summary buffer" (if (eq wl-summary-buffer-view 'thread) (while msgs ;; don't use wl-append(nconc), because list is broken. ...why? (setq update-list (append update-list (wl-thread-delete-message (car msgs))) update-list (delq (car msgs) update-list) msgs (cdr msgs)) (elmo-progress-notify 'wl-summary-delete-messages)) (goto-char (point-min)) (setq msgs (copy-sequence msgs)) (let (number) (while (and msgs (re-search-forward "^.*\r\\([0-9]+\\)\n" nil t)) (when (memq (setq number (string-to-number (match-string 1))) msgs) (setq msgs (delq number msgs) wl-summary-buffer-number-list (delq number wl-summary-buffer-number-list)) (goto-char (match-beginning 0)) ;; needed? (delete-region (match-beginning 0) (match-end 0)) (elmo-progress-notify 'wl-summary-delete-messages)))))) (when (eq wl-summary-buffer-view 'thread) (let ((updates (elmo-sort-uniq-number-list update-list))) (elmo-with-progress-display (wl-thread-update-line (length updates)) "Updating deleted thread" (wl-thread-update-line-msgs updates) (wl-thread-cleanup-symbols msgs2)))) (wl-summary-count-unread) (wl-summary-update-modeline) (wl-summary-folder-info-update)))) (defun wl-summary-update-status-marks (beg end &optional check) "Synchronize status marks on current buffer to the msgdb." (interactive "r") (save-excursion (goto-char beg) (while (and (< (point) end) (not (eobp))) (when (or (not check) (wl-summary-persistent-mark-invalid-p)) (wl-summary-update-persistent-mark)) (forward-line)))) (defun wl-summary-update-mark-window (&optional win _beg) "Update persistent mark in visible summary window. This function is defined for `window-scroll-functions'" (with-current-buffer (window-buffer win) (when (eq major-mode 'wl-summary-mode) (let ((start (window-start win)) (end (window-end win t))) (wl-summary-update-status-marks start end 'check))))) (defun wl-summary-insert-message (&rest args) (prog1 (if (eq wl-summary-buffer-view 'thread) (apply 'wl-summary-insert-thread args) (apply 'wl-summary-insert-sequential args)) (elmo-progress-notify 'wl-summary-insert-line))) (defun wl-summary-sort (reverse) "Sort summary lines into the selected order; argument means reverse order." (interactive "P") (let ((default-value (symbol-name wl-summary-default-sort-spec))) (wl-summary-rescan (completing-read-multiple (format "%s by (%s): " (if reverse "Reverse sort" "Sort") default-value) (nconc (mapcar (lambda (spec) (list (symbol-name spec))) wl-summary-sort-specs) (mapcar (lambda (spec) (list (concat "!" (symbol-name spec)))) wl-summary-sort-specs)) nil t nil nil default-value) reverse))) (defun wl-summary-get-available-flags (&optional include-specials) (let ((flags (elmo-uniq-list (append elmo-global-flags (copy-sequence elmo-preserved-flags)) #'delq))) (if include-specials flags (delq 'new (delq 'cached flags))))) (defun wl-summary-sync-marks () "Update persistent marks in summary." (interactive) (let ((mes "Updated ") diff diffs) (message "Updating marks...") (dolist (flag (wl-summary-get-available-flags)) (setq diff (elmo-list-diff (elmo-folder-list-flagged wl-summary-buffer-elmo-folder flag) (elmo-folder-list-flagged wl-summary-buffer-elmo-folder flag 'in-msgdb))) (setq diffs (cadr diff)) (setq mes (concat mes (format "-%d" (length diffs)))) (when diffs (wl-summary-unset-persistent-mark flag diffs 'no-modeline 'no-server)) (setq diffs (car diff) mes (concat mes (format "/+%d %s " (length diffs) flag))) (when diffs (wl-summary-set-persistent-mark flag diffs 'no-modeline 'no-server))) (if (called-interactively-p 'interactive) (message "%s" mes)))) (defun wl-summary-sync-update (&optional unset-cursor disable-killed sync-all no-check) "Update the summary view to the newest folder status." (interactive) (let* ((folder wl-summary-buffer-elmo-folder) (elmo-mime-charset wl-summary-buffer-mime-charset) (inhibit-read-only t) (buffer-read-only nil) crossed expunged mes) (unwind-protect (progn (unless wl-summary-buffer-elmo-folder (error "(Internal error) Folder is not set:%s" (buffer-name (current-buffer)))) ;; Flush pending append operations (disconnected operation). ;;; (setq seen-list ;;; (wl-summary-flush-pending-append-operations seen-list)) (goto-char (point-max)) (wl-folder-confirm-existence folder (elmo-folder-plugged-p folder)) (setq crossed (elmo-folder-synchronize folder disable-killed sync-all no-check)) (if crossed (let ((wl-summary-highlight (and wl-summary-highlight (not wl-summary-lazy-highlight))) append-list delete-list update-thread update-top-list num diff entity) ;; Setup sync-all (if sync-all (wl-summary-sync-all-init)) (setq diff (elmo-list-diff (elmo-folder-list-messages folder (not disable-killed) 'in-msgdb) wl-summary-buffer-number-list)) (setq append-list (car diff)) (setq delete-list (cadr diff)) (when delete-list (wl-summary-delete-messages-on-buffer delete-list)) (unless wl-summary-lazy-update-mark (wl-summary-update-status-marks (point-min) (point-max))) (when (and wl-summary-lazy-highlight wl-summary-lazy-update-mark) (let (buffer-read-only) (put-text-property (point-min) (point-max) 'face nil))) (setq num (length append-list)) (setq wl-summary-delayed-update nil) (elmo-kill-buffer wl-summary-search-buf-name) (elmo-with-progress-display (wl-summary-insert-line (+ num (length wl-summary-delayed-update))) (if (eq wl-summary-buffer-view 'thread) "Making thread" "Inserting message") (dolist (number append-list) (setq entity (elmo-message-entity folder number)) (when (setq update-thread (wl-summary-insert-message entity folder (not sync-all))) (wl-append update-top-list update-thread))) (while wl-summary-delayed-update (message "Parent (%d) of message %d is no entity" (caar wl-summary-delayed-update) (elmo-message-entity-number (cdar wl-summary-delayed-update))) (when (setq update-thread (wl-summary-insert-message (cdar wl-summary-delayed-update) wl-summary-buffer-elmo-folder (not sync-all) t)) (wl-append update-top-list update-thread)) (setq wl-summary-delayed-update (cdr wl-summary-delayed-update)))) (when (and (eq wl-summary-buffer-view 'thread) update-top-list) (wl-thread-update-indent-string-thread (elmo-sort-uniq-number-list update-top-list))) (when (or delete-list append-list) (wl-summary-set-message-modified)) (when (and sync-all (eq wl-summary-buffer-view 'thread)) (elmo-kill-buffer wl-summary-search-buf-name) (wl-thread-insert-top)) (run-hooks 'wl-summary-sync-updated-hook) (setq mes (if (and (null delete-list) (zerop num)) (format "No updates for \"%s\"" (elmo-folder-name-internal folder)) (format "Updated (-%d/+%d) message(s)" (length delete-list) num)))) (setq mes "Quit updating"))) ;; synchronize marks. (if (and crossed wl-summary-auto-sync-marks) (wl-summary-sync-marks)) ;; scoring (when wl-use-scoring (setq wl-summary-scored nil) (wl-summary-score-headers (and sync-all (wl-summary-rescore-msgs wl-summary-buffer-number-list)) sync-all) (when (and wl-summary-scored (setq expunged (wl-summary-score-update-all-lines))) (setq mes (concat mes (format " (%d expunged)" (length expunged)))))) (if (and crossed (> crossed 0)) (setq mes (if mes (concat mes (format " (%d crosspost)" crossed)) (format "%d crosspost message(s)" crossed))) (and mes (setq mes (concat mes ".")))) ;; Update Folder mode (wl-folder-set-folder-updated (elmo-folder-name-internal folder) (list 0 (or (cdr (assq 'unread (wl-summary-count-unread))) 0) (elmo-folder-length folder))) (wl-summary-update-modeline) ;; (unless unset-cursor (goto-char (if (eq wl-summary-order 'descending) (point-max) (point-min))) (if (not (if (eq wl-summary-order 'descending) (wl-summary-cursor-up t) (wl-summary-cursor-down t))) (if (eq wl-summary-order 'descending) (goto-char (point-min)) (goto-char (point-max)) (forward-line -1)) (when (and wl-summary-highlight (not wl-summary-lazy-highlight) (not (get-text-property (point) 'face))) (save-excursion (forward-line (- (or wl-summary-partial-highlight-above-lines wl-summary-highlight-partial-threshold))) (wl-highlight-summary (point) (point-max)))))) (wl-delete-all-overlays) (run-hooks 'wl-summary-buffer-window-scroll-functions) (set-buffer-modified-p nil) (if mes (message "%s" mes))))) (defun wl-summary-set-score-mark (mark) (save-excursion (beginning-of-line) (let ((cur-mark (wl-summary-temp-mark))) (when (member cur-mark (list " " wl-summary-score-below-mark wl-summary-score-over-mark)) (wl-summary-put-temp-mark mark) (wl-summary-maybe-highlight-current-line) (set-buffer-modified-p nil))))) (defun wl-summary-get-score-mark (msg-num) (let ((score (cdr (assq msg-num wl-summary-scored)))) (if score (cond ((< score wl-summary-default-score) "-") ((> score wl-summary-default-score) "+"))))) (defun wl-summary-update-modeline () (setq wl-summary-buffer-mode-line (funcall wl-summary-buffer-mode-line-formatter))) (defun wl-summary-jump-to-msg (&optional number beg end) (interactive "NJump to Message (No.): ") (when number (let ((pos (point))) (goto-char (or beg (point-min))) (if (search-forward (concat "\r" (number-to-string number) "\n") end t) (forward-line -1) (goto-char pos) nil)))) (defun wl-summary-highlight-msgs (msgs) (save-excursion (elmo-with-progress-display (wl-summary-highlight-line (length msgs)) "Hilighting" (while msgs (if (wl-summary-jump-to-msg (car msgs)) (wl-highlight-summary-current-line)) (setq msgs (cdr msgs)) (elmo-progress-notify 'wl-summary-highlight-line))))) (defun wl-summary-message-number () (save-excursion (beginning-of-line) (if (or (re-search-forward "\r\\(-?[0-9]+\\)" (point-at-eol) t) (re-search-forward "^ *\\(-?[0-9]+\\)" (point-at-eol) t)) (string-to-number (match-string-no-properties 1)) nil))) (defun wl-summary-delete-all-msgs () (interactive) (let ((cur-buf (current-buffer)) (dels (elmo-folder-list-messages wl-summary-buffer-elmo-folder))) (set-buffer cur-buf) (if (null dels) (message "No message to delete.") (if (y-or-n-p (format "%s has %d message(s). Delete all? " (wl-summary-buffer-folder-name) (length dels))) (progn (message "Deleting...") (elmo-folder-move-messages wl-summary-buffer-elmo-folder dels 'null) (wl-summary-set-message-modified) (wl-folder-set-folder-updated (wl-summary-buffer-folder-name) (list 0 0 0)) ;;; for thread. ;;; (setq wl-thread-top-entity '(nil t nil nil)) (setq wl-summary-buffer-unread-count 0) (setq wl-summary-buffer-new-count 0) (wl-summary-update-modeline) (set-buffer cur-buf) (let ((inhibit-read-only t) (buffer-read-only nil)) (erase-buffer)) ;;; (if wl-summary-cache-use (wl-summary-save-view-cache)) (message "Deleting...done") t) nil)))) (defun wl-summary-toggle-thread (&optional arg) "Toggle thread status (T)hread and (S)equential. If ARG, without confirm." (interactive "P") (when (or arg (y-or-n-p (format "Toggle threading? (y=%s): " (if (eq wl-summary-buffer-view 'thread) "\"off\"" "\"on\"")))) (if (eq wl-summary-buffer-view 'thread) (setq wl-summary-buffer-view 'sequence) (setq wl-summary-buffer-view 'thread)) (wl-summary-update-modeline) (force-mode-line-update) (wl-summary-rescan nil nil nil t))) (defun wl-summary-load-file-object (filename) "Load lisp object from dir." (with-temp-buffer (if (not (file-readable-p filename)) () (as-binary-input-file (insert-file-contents filename)) (condition-case nil (read (current-buffer)) (error (error "Reading failed")))))) (defun wl-summary-goto-folder (&optional arg) (interactive "P") (wl-summary-goto-folder-subr nil nil nil nil t nil arg)) (defun wl-summary-goto-folder-sticky () (interactive) (wl-summary-goto-folder-subr nil nil nil t t)) (defun wl-summary-goto-last-visited-folder () (interactive) (let ((entity (wl-folder-search-entity-by-name wl-summary-last-visited-folder wl-folder-entity 'folder))) (if entity (wl-folder-set-current-entity-id (wl-folder-get-entity-id entity)))) (wl-summary-goto-folder-subr wl-summary-last-visited-folder nil nil nil t)) (defun wl-summary-sticky-p (&optional folder) (if folder (get-buffer (wl-summary-sticky-buffer-name (elmo-folder-name-internal folder))) (not (string= wl-summary-buffer-name (buffer-name))))) (defun wl-summary-always-sticky-folder-p (folder) (or (eq t wl-summary-always-sticky-folder-list) (elmo-string-match-member (elmo-folder-name-internal folder) wl-summary-always-sticky-folder-list))) (defun wl-summary-stick (&optional force) "Make current summary buffer sticky." (interactive "P") (if (wl-summary-sticky-p) (message "Current summary buffer is already sticky.") (when (or force (y-or-n-p "Stick current summary buffer? ")) (wl-summary-toggle-disp-msg 'off) (wl-summary-switch-to-clone-buffer (wl-summary-sticky-buffer-name (wl-summary-buffer-folder-name))) ;;; ???hang up ;;; (rename-buffer (wl-summary-sticky-buffer-name ;;; (wl-summary-buffer-folder-name)))) (message "Folder `%s' is now sticky." (wl-summary-buffer-folder-name))))) (defun wl-summary-switch-to-clone-buffer (buffer-name) (let ((cur-buf (current-buffer)) (msg (wl-summary-message-number)) (buf (get-buffer-create buffer-name)) (folder wl-summary-buffer-elmo-folder) (copy-variables (append '(wl-summary-buffer-view wl-summary-buffer-temp-mark-list wl-summary-buffer-target-mark-list wl-summary-buffer-elmo-folder wl-summary-buffer-number-column wl-summary-buffer-temp-mark-column wl-summary-buffer-persistent-mark-column wl-summary-buffer-message-modified wl-summary-buffer-thread-modified wl-summary-buffer-number-list wl-summary-buffer-persistent-mark-version wl-summary-buffer-folder-name wl-summary-buffer-line-formatter) (and (eq wl-summary-buffer-view 'thread) '(wl-thread-entity-hashtb wl-thread-entities wl-thread-entity-list)) (and wl-use-scoring '(wl-summary-scored wl-summary-default-score wl-summary-important-above wl-summary-target-above wl-summary-mark-below wl-summary-expunge-below)) (and (featurep 'wl-score) '(wl-current-score-file wl-score-alist))))) (set-buffer buf) (wl-summary-mode) (wl-summary-buffer-set-folder folder) (let ((buffer-read-only nil)) (insert-buffer-substring cur-buf)) (set-buffer-modified-p nil) (while copy-variables (set (car copy-variables) (with-current-buffer cur-buf (symbol-value (car copy-variables)))) (setq copy-variables (cdr copy-variables))) (switch-to-buffer buf) (kill-buffer cur-buf) (wl-summary-count-unread) (wl-summary-update-modeline) (if msg (if (eq wl-summary-buffer-view 'thread) (wl-thread-jump-to-msg msg) (wl-summary-jump-to-msg msg)) (goto-char (point-max)) (beginning-of-line)))) (defun wl-summary-get-buffer (folder) (and folder (or (get-buffer (wl-summary-sticky-buffer-name folder)) (let ((buffer (get-buffer wl-summary-buffer-name))) (and buffer (with-current-buffer buffer (string= (wl-summary-buffer-folder-name) folder)) buffer))))) (defun wl-summary-get-buffer-create (name &optional force-sticky) (if force-sticky (get-buffer-create (wl-summary-sticky-buffer-name name)) (or (get-buffer (wl-summary-sticky-buffer-name name)) (get-buffer-create wl-summary-buffer-name)))) (defun wl-summary-make-number-list () (save-excursion (goto-char (point-min)) (setq wl-summary-buffer-number-list nil) (while (not (eobp)) (setq wl-summary-buffer-number-list (cons (wl-summary-message-number) wl-summary-buffer-number-list)) (forward-line)) (setq wl-summary-buffer-number-list (nreverse wl-summary-buffer-number-list)))) (defun wl-summary-auto-select-msg-p (unread-msg) (and unread-msg (not (elmo-message-has-global-flag-p wl-summary-buffer-elmo-folder unread-msg)))) (defsubst wl-summary-open-folder (folder) ;; Select folder (let ((elmo-mime-charset wl-summary-buffer-mime-charset)) (unwind-protect (elmo-folder-open folder 'load-msgdb) ;; For compatibility (setq wl-summary-buffer-folder-name (elmo-folder-name-internal folder))))) (defun wl-summary-goto-folder-subr (&optional name scan-type other-window sticky interactive scoring force-exit) "Display target folder on summary." (interactive) (let* ((keep-cursor (memq this-command wl-summary-keep-cursor-command)) (name (or name (wl-summary-read-folder wl-default-folder))) (cur-fld wl-summary-buffer-elmo-folder) folder buf mes reuse-buf retval entity) (if (string= name "") (setq name wl-default-folder)) (setq folder (wl-folder-get-elmo-folder name)) (when (and (not (string= (and cur-fld (elmo-folder-name-internal cur-fld)) (elmo-folder-name-internal folder))) ; folder is moved. (eq major-mode 'wl-summary-mode)) ; called in summary. (setq wl-summary-last-visited-folder (wl-summary-buffer-folder-name)) (run-hooks 'wl-summary-exit-pre-hook) (let ((discard-contents (or force-exit (not (wl-summary-sticky-p))))) (when discard-contents (wl-summary-cleanup-temp-marks)) (wl-summary-save-view) (if discard-contents (elmo-folder-close wl-summary-buffer-elmo-folder) (elmo-folder-commit wl-summary-buffer-elmo-folder))) (if (and (wl-summary-sticky-p) force-exit) (kill-buffer (current-buffer)))) (setq buf (wl-summary-get-buffer-create (elmo-folder-name-internal folder) sticky)) (setq reuse-buf (with-current-buffer buf (string= (elmo-folder-name-internal folder) (wl-summary-buffer-folder-name)))) (unwind-protect (if reuse-buf (if interactive (switch-to-buffer buf) (set-buffer buf)) (if other-window (delete-other-windows)) (set-buffer buf) (unless (eq major-mode 'wl-summary-mode) (wl-summary-mode)) (wl-summary-buffer-set-folder folder) (setq wl-summary-buffer-display-mime-mode (if (wl-summary-no-mime-p wl-summary-buffer-elmo-folder) 'as-is 'mime)) (setq wl-summary-buffer-disp-msg nil) (setq wl-summary-buffer-message-ring nil) (setq wl-summary-buffer-current-msg nil) (setq wl-summary-buffer-persistent-mark-version 0) (let ((inhibit-read-only t) (buffer-read-only nil)) (erase-buffer) ;; Resume summary view (if wl-summary-cache-use (let* ((dir (elmo-folder-msgdb-path folder)) (cache (expand-file-name wl-summary-cache-file dir)) (view (expand-file-name wl-summary-view-file dir))) (when (file-exists-p cache) (insert-file-contents-literally cache) (set-buffer-multibyte t) (decode-mime-charset-region (point-min)(point-max) wl-summary-buffer-mime-charset 'LF)) (if (file-exists-p view) (setq wl-summary-buffer-view (wl-summary-load-file-object view)) (setq wl-summary-buffer-view (or (wl-get-assoc-list-value wl-summary-default-view-alist (elmo-folder-name-internal folder)) wl-summary-default-view))) (wl-thread-resume-entity folder) (wl-summary-open-folder folder) (wl-summary-detect-mark-position)) (setq wl-summary-buffer-view (wl-summary-load-file-object (expand-file-name wl-summary-view-file (elmo-folder-msgdb-path folder)))) (wl-summary-open-folder folder) (wl-summary-detect-mark-position) (wl-summary-rescan)) (wl-summary-count-unread) (wl-summary-update-modeline))) (unless (eq wl-summary-buffer-view 'thread) (wl-summary-make-number-list)) (when (and wl-summary-cache-use (or (and wl-summary-check-line-format (wl-summary-line-format-changed-p)) (wl-summary-view-old-p))) (wl-summary-rescan)) (wl-summary-toggle-disp-msg (if wl-summary-buffer-disp-msg 'on 'off)) (unless (and reuse-buf keep-cursor) (unwind-protect (let ((wl-use-scoring (if (or scoring interactive) wl-use-scoring))) (if (and (not scan-type) interactive (not wl-ask-range)) (setq scan-type (wl-summary-get-sync-range folder))) (cond ((eq scan-type nil) (wl-summary-sync 'unset-cursor)) ((eq scan-type 'all) (wl-summary-sync 'unset-cursor "all")) ((eq scan-type 'no-sync)) ((eq scan-type 'rescan) (wl-summary-rescan)) ((or (eq scan-type 'force-update) (eq scan-type 'update)) (setq mes (wl-summary-sync-force-update 'unset-cursor))))) (if interactive (switch-to-buffer buf) (set-buffer buf)) ;; stick always-sticky-folder (when (wl-summary-always-sticky-folder-p folder) (or (wl-summary-sticky-p) (wl-summary-stick t))) (run-hooks 'wl-summary-prepared-pre-hook) (set-buffer-modified-p nil) (goto-char (point-min)) (if (wl-summary-cursor-down t) (let ((unreadp (wl-summary-next-message (wl-summary-message-number) 'down t))) (cond ((and wl-auto-select-first (wl-summary-auto-select-msg-p unreadp)) ;; wl-auto-select-first is non-nil and ;; unreadp is non-nil but not flagged (setq retval 'disp-msg)) ((and wl-auto-prefetch-first (wl-summary-auto-select-msg-p unreadp)) ;; wl-auto-select-first is non-nil and ;; unreadp is non-nil but not flagged (setq retval 'prefetch-msg)) ((not (wl-summary-auto-select-msg-p unreadp)) ;; unreadp is nil or flagged (setq retval 'more-next)))) (goto-char (point-max)) (if (elmo-folder-plugged-p folder) (forward-line -1) (wl-summary-prev)) (setq retval 'more-next)) (if (and wl-summary-highlight (not wl-summary-lazy-highlight) (not reuse-buf)) (if (and wl-summary-highlight-partial-threshold (> (count-lines (point-min) (point-max)) wl-summary-highlight-partial-threshold)) (save-excursion (forward-line (- 0 (or wl-summary-partial-highlight-above-lines wl-summary-highlight-partial-threshold))) (wl-highlight-summary (point) (point-max))) (wl-highlight-summary (point-min) (point-max)))) (if (eq retval 'disp-msg) (wl-summary-redisplay)) (if (eq retval 'prefetch-msg) (wl-message-buffer-prefetch folder (wl-summary-message-number) (min (or wl-message-buffer-prefetch-depth 0) (1- wl-message-buffer-cache-size)) (current-buffer) wl-summary-buffer-mime-charset)) (if mes (message "%s" mes)) (if (and interactive wl-summary-recenter) (recenter (/ (- (window-height) 2) 2)))))) ;; set current entity-id (when (and folder (setq entity (wl-folder-search-entity-by-name (elmo-folder-name-internal folder) wl-folder-entity 'folder))) ;; entity-id is unknown. (wl-folder-set-current-entity-id (wl-folder-get-entity-id entity))) (when (or (eq t wl-summary-force-prefetch-folder-list) (elmo-string-match-member (elmo-folder-name-internal wl-summary-buffer-elmo-folder) wl-summary-force-prefetch-folder-list)) (wl-summary-force-prefetch)) (unwind-protect (run-hooks 'wl-summary-prepared-hook) (set-buffer-modified-p nil)) retval)) (defun wl-summary-goto-previous-message-beginning () (end-of-line) (re-search-backward "\r\\(-?[0-9]+\\)" nil t) (beginning-of-line)) (defun wl-summary-goto-top-of-current-thread () (wl-summary-jump-to-msg (wl-thread-entity-get-number (wl-thread-entity-get-top-entity (wl-thread-get-entity (wl-summary-message-number)))))) (defun wl-summary-goto-bottom-of-sub-thread (&optional depth) (interactive) (let ((depth (or depth (wl-thread-get-depth-of-current-line)))) (forward-line) (while (and (not (eobp)) (>= (wl-thread-get-depth-of-current-line) depth)) (forward-line)) (beginning-of-line))) (defun wl-summary-insert-line (line) "Insert LINE in the Summary." (if wl-use-highlight-mouse-line ;; remove 'mouse-face of current line. (put-text-property (point-at-bol) (point-at-eol) 'mouse-face nil)) (insert line "\n") (save-excursion (forward-line -1) (wl-summary-selective-display (line-end-position)) (let* ((number (wl-summary-message-number)) (mark-info (wl-summary-registered-temp-mark number))) (when (and mark-info (nth 2 mark-info)) (wl-summary-print-argument number (nth 2 mark-info))))) (if wl-use-highlight-mouse-line ;; remove 'mouse-face of current line. (put-text-property (point-at-bol) (point-at-eol) 'mouse-face nil)) (condition-case error (run-hooks 'wl-summary-line-inserted-hook) (error (message "Error occured in running wl-summary-line-inserted-hook, %s" (cdr error))))) (defun wl-summary-insert-sequential (entity folder &rest _args) (when entity (let ((inhibit-read-only t) (number (elmo-message-entity-number entity)) buffer-read-only) (goto-char (if (eq wl-summary-order 'descending) (point-min) (point-max))) (wl-summary-insert-line (wl-summary-create-line entity nil nil (elmo-message-status folder number))) (setq wl-summary-buffer-number-list (if (eq wl-summary-order 'descending) (cons (elmo-message-entity-number entity) wl-summary-buffer-number-list) (wl-append wl-summary-buffer-number-list (list (elmo-message-entity-number entity))))) nil))) (defun wl-summary-default-subject-filter (subject) (setq subject (replace-regexp-in-string "\\(\\(re\\|was\\)[:>]\\|[ \t]+\\)+" "" subject t t)) (if (string-match "^\\[[^]]*\\]" subject) (substring subject (match-end 0)) subject)) (defun wl-summary-subject-equal (subject1 subject2) (string= (funcall wl-summary-subject-filter-function subject1) (funcall wl-summary-subject-filter-function subject2))) (defmacro wl-summary-put-alike (alike count) `(elmo-set-hash-val (format "#%d" ,count) ,alike wl-summary-alike-hashtb)) (defsubst wl-summary-get-alike () (elmo-get-hash-val (format "#%d" (wl-count-lines)) wl-summary-alike-hashtb)) (defun wl-summary-insert-headers (folder func &optional mime-decode) (let ((numbers (elmo-folder-list-messages folder 'visible t)) (count (wl-count-lines)) ov this last alike) (buffer-disable-undo (current-buffer)) (make-local-variable 'wl-summary-alike-hashtb) (setq wl-summary-alike-hashtb (elmo-make-hash (* (length numbers) 2))) (when mime-decode (set-buffer-multibyte t)) (mapc (lambda (number) (when (setq ov (elmo-message-entity folder number)) (setq this (funcall func ov)) (if (equal last this) (setq alike (cons ov alike)) (when last (wl-summary-put-alike alike count) (insert last ?\n) (setq count (1+ count))) (setq alike (list ov) last this)))) numbers) (when (null (eq last this)) (wl-summary-put-alike alike count) (insert last ?\n)) (when mime-decode (decode-mime-charset-region (point-min) (point-max) elmo-mime-charset) (when (eq mime-decode 'mime) (eword-decode-region (point-min) (point-max)))) (run-hooks 'wl-summary-insert-headers-hook))) (defun wl-summary-search-by-subject (entity folder) (let ((summary-buf (current-buffer)) (buf (get-buffer-create wl-summary-search-buf-name)) (folder-name (wl-summary-buffer-folder-name)) match founds result) (with-current-buffer buf (let ((case-fold-search t)) (when (or (not (string= wl-summary-search-buf-folder-name folder-name)) (zerop (buffer-size))) (setq wl-summary-search-buf-folder-name folder-name) (message "Creating subject cache...") (wl-summary-insert-headers folder (lambda (x) (funcall wl-summary-subject-filter-function (elmo-message-entity-field x 'subject)))) (message "Creating subject cache...done")) (setq match (funcall wl-summary-subject-filter-function (elmo-message-entity-field entity 'subject))) (if (string= match "") (setq match "\n")) (goto-char (point-max)) (while (and (null result) (not (= (point) (point-min))) (search-backward match nil t)) ;; check exactly match (when (and (bolp) (= (point-at-eol)(match-end 0))) (setq founds (wl-summary-get-alike)) (with-current-buffer summary-buf (while founds (when (and ;; the first element of found-entity list exists on ;; thread tree. (wl-thread-get-entity (elmo-message-entity-number (car founds))) ;; message id is not same as myself. (not (string= (elmo-message-entity-field entity 'message-id) (elmo-message-entity-field (car founds) 'message-id))) ;; not a descendant. (not (wl-thread-descendant-p (elmo-message-entity-number entity) (elmo-message-entity-number (car founds))))) (setq result (car founds) founds nil)) (setq founds (cdr founds)))))) result)))) (defun wl-summary-insert-thread (entity folder update &optional force-insert) (let (parent-entity parent-number number linked retval delayed-entity update-list entity-stack thread-entity) (while entity (setq number (elmo-message-entity-number entity)) (if (and wl-thread-saved-entity-hashtb-internal (setq thread-entity (elmo-get-hash-val (format "#%d" (elmo-message-entity-number entity)) wl-thread-saved-entity-hashtb-internal))) (setq parent-entity (elmo-message-entity folder (wl-thread-entity-get-parent thread-entity)) linked (wl-thread-entity-get-linked thread-entity)) (setq parent-entity (elmo-message-entity-parent folder entity) linked nil)) (setq parent-number (and parent-entity (elmo-message-entity-number parent-entity))) ;; If thread loop detected, set parent as nil. (let ((cur entity) anumber relatives) (while cur (when (setq anumber (elmo-message-entity-number (setq cur (elmo-message-entity-parent folder cur)))) (if (memq anumber relatives) (setq parent-number nil cur nil)) (setq relatives (cons anumber relatives))))) (if (and parent-number (not (wl-thread-get-entity parent-number)) (not force-insert)) ;; parent exists in overview, but not in wl-thread-entities (progn (wl-append wl-summary-delayed-update (list (cons parent-number entity))) (setq entity nil)) ;; exit loop ;; Search parent by subject. (when (and (null parent-number) wl-summary-search-parent-by-subject-regexp (string-match wl-summary-search-parent-by-subject-regexp (elmo-message-entity-field entity 'subject))) (let ((found (wl-summary-search-by-subject entity folder))) (when (and found (not (member found wl-summary-delayed-update))) (setq parent-entity found) (setq parent-number (elmo-message-entity-number parent-entity)) (setq linked t)))) ;; If subject is change, divide thread. (if (and parent-number wl-summary-divide-thread-when-subject-changed (not (wl-summary-subject-equal (or (elmo-message-entity-field entity 'subject) "") (or (elmo-message-entity-field parent-entity 'subject) "")))) (setq parent-number nil)) (when (setq retval (wl-thread-insert-message entity number parent-number update linked)) (wl-append update-list (list retval))) (setq entity nil) ; exit loop (while (setq delayed-entity (assq number wl-summary-delayed-update)) (setq wl-summary-delayed-update (delq delayed-entity wl-summary-delayed-update)) ;; update delayed message (wl-append entity-stack (list (cdr delayed-entity))))) (if (and (not entity) entity-stack) (setq entity (pop entity-stack)))) update-list)) (defun wl-summary-update-thread (entity thr-entity parent-entity) (let* ((this-id (elmo-message-entity-field entity 'message-id)) (parent-id (elmo-message-entity-field parent-entity 'message-id)) (number (elmo-message-entity-number entity)) (parent-number (elmo-message-entity-number parent-entity)) insert-line) (cond ((or (not parent-id) (string= this-id parent-id)) (goto-char (if (eq wl-summary-order 'descending) (point-min) (point-max))) (beginning-of-line) (setq insert-line t)) ;; parent already exists in buffer. ((wl-summary-jump-to-msg parent-number) (wl-thread-goto-bottom-of-sub-thread) (setq insert-line t))) (when insert-line (let (buffer-read-only) (wl-summary-insert-line (wl-summary-create-line entity parent-entity nil (wl-summary-message-status number) (wl-thread-maybe-get-children-num number) (wl-thread-make-indent-string thr-entity) (wl-thread-entity-get-linked thr-entity))))))) (declare-function ;; Defined by wl-summary-define-mark-action function in wl-action.el wl-summary-target-mark "wl-action.el" (&optional number data)) (defun wl-summary-target-mark-msgs (msgs) "Return the number of marked messages." (let ((i 0)) (dolist (number msgs) (when (wl-summary-target-mark number) (setq i (1+ i)))) i)) (defun wl-summary-pick (&optional from-list delete-marks) (interactive "i\nP") (save-excursion (let* ((condition (car (elmo-parse-search-condition (wl-read-search-condition wl-summary-pick-field-default)))) (result (elmo-folder-search wl-summary-buffer-elmo-folder condition (or from-list t))) num) (if delete-marks (let ((mlist wl-summary-buffer-target-mark-list)) (while mlist (when (wl-summary-jump-to-msg (car mlist)) (wl-summary-unmark)) (setq mlist (cdr mlist))) (setq wl-summary-buffer-target-mark-list nil))) (if (and result (setq num (wl-summary-target-mark-msgs result)) (> num 0)) (if (= num (length result)) (message "%d message(s) are picked." num) (message "%d(%d) message(s) are picked." num (- (length result) num))) (message "No message was picked."))))) (require 'elmo-filter) (defun wl-summary-unvirtual () "Exit from current virtual folder." (interactive) (if (eq 'filter (elmo-folder-type-internal wl-summary-buffer-elmo-folder)) (wl-summary-goto-folder-subr (elmo-folder-name-internal (elmo-filter-folder-target-internal wl-summary-buffer-elmo-folder)) 'update nil nil t) (error "This folder is not filtered"))) (defun wl-summary-virtual (&optional arg) "Goto virtual folder. If ARG, exit virtual folder." (interactive "P") (if arg (wl-summary-unvirtual) (wl-summary-goto-folder-subr (concat "/" (wl-read-search-condition wl-summary-pick-field-default) "/" (wl-summary-buffer-folder-name)) 'update nil nil t) (run-hooks 'wl-summary-virtual-hook))) (defun wl-summary-delete-all-temp-marks (&optional no-msg force) "Erase all temp marks from buffer." (interactive) (when (or wl-summary-buffer-target-mark-list wl-summary-buffer-temp-mark-list wl-summary-scored) (save-excursion (goto-char (point-min)) (unless no-msg (message "Unmarking...")) (while (not (eobp)) (wl-summary-unset-mark nil nil force) (forward-line)) (unless no-msg (message "Unmarking...done")) (setq wl-summary-buffer-target-mark-list nil) (setq wl-summary-buffer-temp-mark-list nil)))) (defsubst wl-summary-temp-mark (&optional number) "Return temp-mark string of current line." (let ((number (or number (wl-summary-message-number))) info) (or (and (wl-summary-have-target-mark-p number) "*") (and (setq info (wl-summary-registered-temp-mark number)) (nth 1 info)) (wl-summary-get-score-mark number) " "))) (defun wl-summary-persistent-mark-invalid-p () (not (equal ;; mey be nil. (get-text-property (point) 'wl-summary-persistent-mark-version) wl-summary-buffer-persistent-mark-version))) (defun wl-summary-validate-persistent-mark (beg end) (let ((inhibit-read-only t) (buffer-read-only nil)) (put-text-property beg end 'wl-summary-persistent-mark-version wl-summary-buffer-persistent-mark-version) (set-buffer-modified-p nil))) (defun wl-summary-validate-persistent-mark-string (string) (put-text-property 0 (length string) 'wl-summary-persistent-mark-version wl-summary-buffer-persistent-mark-version string)) (defun wl-summary-invalidate-persistent-mark () (setq wl-summary-buffer-persistent-mark-version (1+ wl-summary-buffer-persistent-mark-version))) (defsubst wl-summary-persistent-mark-string (folder status) "Return the persistent mark string. The mark is decided according to the FOLDER and STATUS." (let ((priorities wl-summary-persistent-mark-priority-list) (flags (elmo-message-status-flags status)) (cached (elmo-message-status-cached-p status)) mark) (while (and (null mark) priorities) (let ((flag (car priorities))) (cond ((eq flag 'flag) (let ((flags (elmo-get-global-flags flags 'ignore-preserved)) (specs wl-summary-flag-alist) spec) (when flags (while (setq spec (car specs)) (if (memq (car spec) flags) (setq mark (or (nth 2 spec) wl-summary-flag-mark) specs nil) (setq specs (cdr specs)))) (unless mark (setq mark wl-summary-flag-mark))))) ((eq flag 'killed) (when (elmo-message-status-killed-p status) (setq mark wl-summary-killed-mark))) ((memq flag flags) (setq mark (let ((var (intern-soft (format (if cached "wl-summary-%s-cached-mark" "wl-summary-%s-uncached-mark") flag)))) (or (and var (boundp var) (symbol-value var)) (funcall (if cached #'downcase #'upcase) (substring (symbol-name flag) 0 1))))))) (setq priorities (cdr priorities)))) (or mark (if (or cached (elmo-folder-local-p folder)) nil wl-summary-uncached-mark)))) (defsubst wl-summary-message-mark (folder number &optional status) "Return mark of the message." (ignore-errors (wl-summary-persistent-mark-string folder (or status (elmo-message-status folder number))))) (defsubst wl-summary-persistent-mark (&optional number status) "Return persistent-mark string of current line." (or (wl-summary-message-mark wl-summary-buffer-elmo-folder (or number (wl-summary-message-number)) status) " ")) (defun wl-summary-put-temp-mark (mark) "Put temp MARK on current line." (when wl-summary-buffer-temp-mark-column (save-excursion (beginning-of-line) (let ((inhibit-read-only t) (buffer-read-only nil)) (move-to-column wl-summary-buffer-temp-mark-column) (delete-char -1) (insert mark))))) (defun wl-summary-next-buffer () "Switch to next summary buffer." (interactive) (let ((buffers (sort (wl-collect-summary) (lambda (buffer1 buffer2) (string-lessp (buffer-name buffer1) (buffer-name buffer2)))))) (switch-to-buffer (or (cadr (memq (current-buffer) buffers)) (car buffers))))) (defun wl-summary-previous-buffer () "Switch to previous summary buffer." (interactive) (let ((buffers (sort (wl-collect-summary) (lambda (buffer1 buffer2) (not (string-lessp (buffer-name buffer1) (buffer-name buffer2))))))) (switch-to-buffer (or (cadr (memq (current-buffer) buffers)) (car buffers))))) (defun wl-summary-check-target-mark () (when (null wl-summary-buffer-target-mark-list) (error "No marked message"))) (defun wl-summary-target-mark-mark-as-read () (interactive) (wl-summary-check-target-mark) (save-excursion (goto-char (point-min)) (let ((inhibit-read-only t) (buffer-read-only nil) wl-summary-buffer-disp-msg) (wl-summary-mark-as-read wl-summary-buffer-target-mark-list) (dolist (number wl-summary-buffer-target-mark-list) (wl-summary-unset-mark number))))) (defun wl-summary-target-mark-mark-as-unread () (interactive) (wl-summary-check-target-mark) (save-excursion (goto-char (point-min)) (let ((inhibit-read-only t) (buffer-read-only nil) wl-summary-buffer-disp-msg) (wl-summary-mark-as-unread wl-summary-buffer-target-mark-list) (dolist (number wl-summary-buffer-target-mark-list) (wl-summary-unset-mark number))))) (defun wl-summary-target-mark-operation (flag &optional inverse) (wl-summary-check-target-mark) (save-excursion (let ((inhibit-read-only t) (buffer-read-only nil) wl-summary-buffer-disp-msg) (wl-summary-set-persistent-mark-internal inverse flag wl-summary-buffer-target-mark-list) (wl-summary-delete-all-target-marks)))) (defun wl-summary-target-mark-mark-as-important (&optional remove) (interactive "P") (wl-summary-target-mark-operation 'important remove)) (defun wl-summary-target-mark-mark-as-answered (&optional remove) (interactive "P") (wl-summary-target-mark-operation 'answered remove)) (defun wl-summary-target-mark-set-flags (&optional remove) (interactive "P") (wl-summary-check-target-mark) (save-excursion (let ((inhibit-read-only t) (buffer-read-only nil) wl-summary-buffer-disp-msg) (wl-summary-set-flags-internal wl-summary-buffer-target-mark-list nil nil remove) (wl-summary-delete-all-target-marks) (wl-summary-count-unread) (wl-summary-update-modeline)))) (defun wl-summary-target-mark-recover () "Recover killed messages which have target mark." (interactive) (wl-summary-check-target-mark) (save-excursion (let ((inhibit-read-only t) (buffer-read-only nil) wl-summary-buffer-disp-msg) (elmo-folder-recover-messages wl-summary-buffer-elmo-folder wl-summary-buffer-target-mark-list) (dolist (number wl-summary-buffer-target-mark-list) (wl-summary-unset-mark number))))) (defun wl-summary-target-mark-save () (interactive) (wl-summary-check-target-mark) (let ((wl-save-dir (wl-read-directory-name "Save to directory: " wl-temporary-file-directory)) number) (if (null (file-exists-p wl-save-dir)) (make-directory wl-save-dir)) (while (setq number (car wl-summary-buffer-target-mark-list)) (wl-thread-jump-to-msg number) (wl-summary-save t wl-save-dir) (wl-summary-unmark)))) (defun wl-summary-target-mark-pick () (interactive) (wl-summary-check-target-mark) (wl-summary-pick wl-summary-buffer-target-mark-list 'delete)) (defun wl-summary-target-mark-threads () "Put target mark on all the messages of the threads which contain already target marked message." (interactive) (if wl-summary-buffer-target-mark-list (let ((length (length wl-summary-buffer-target-mark-list)) (mark-list wl-summary-buffer-target-mark-list)) (save-excursion (dolist (number mark-list) (wl-summary-jump-to-msg number) (wl-summary-target-mark-thread))) (if (eq length (length wl-summary-buffer-target-mark-list)) ;; No newly marked message. (when (y-or-n-p "Do you want to mark this thread?") (wl-summary-target-mark-thread)))) ;; No message is marked. Mark thread at current point. (wl-summary-target-mark-thread))) (defun wl-summary-update-persistent-mark (&optional number) "Synch up persistent mark of current line with msgdb's. Return non-nil if the mark is updated" (interactive) (let ((status (wl-summary-message-status number))) (prog1 (when wl-summary-buffer-persistent-mark-column (save-excursion (move-to-column wl-summary-buffer-persistent-mark-column) (let ((inhibit-read-only t) (buffer-read-only nil) (mark (buffer-substring (- (point) 1) (point))) (new-mark (wl-summary-persistent-mark number status))) (prog1 (unless (string= new-mark mark) (delete-char -1) (insert new-mark) (wl-summary-set-message-modified) t) (wl-summary-validate-persistent-mark (point-at-bol) (point-at-eol)))))) (wl-summary-maybe-highlight-current-line) (set-buffer-modified-p nil)))) (defsubst wl-summary-mark-as-read-internal (inverse number-or-numbers no-folder-mark no-modeline-update) (save-excursion (let ((folder wl-summary-buffer-elmo-folder) unread-message number number-list) (setq number-list (cond ((numberp number-or-numbers) (setq unread-message (elmo-message-flagged-p folder number-or-numbers 'unread)) (list number-or-numbers)) ((and (not (null number-or-numbers)) (listp number-or-numbers)) number-or-numbers) ((setq number (wl-summary-message-number)) ;; interactive (setq unread-message (elmo-message-flagged-p folder number 'unread)) (list number)))) (if (null number-list) (message "No message.") (if inverse (elmo-folder-set-flag folder number-list 'unread no-folder-mark) (elmo-folder-unset-flag folder number-list 'unread no-folder-mark)) (when (and unread-message (not inverse)) (dolist (number number-list) (wl-summary-jump-to-msg number) (run-hooks 'wl-summary-unread-message-hook))) (unless no-modeline-update ;; Update unread numbers. (wl-summary-count-unread) (wl-summary-update-modeline) (wl-folder-update-unread (wl-summary-buffer-folder-name) wl-summary-buffer-unread-count)))))) (defun wl-summary-mark-as-read (&optional number-or-numbers no-folder-mark no-modeline-update) (interactive) (wl-summary-mark-as-read-internal nil number-or-numbers no-folder-mark no-modeline-update)) (defun wl-summary-mark-as-unread (&optional number-or-numbers no-folder-mark no-modeline-update) (interactive) (wl-summary-mark-as-read-internal 'inverse number-or-numbers no-folder-mark no-modeline-update)) (defsubst wl-summary-set-persistent-mark-internal (inverse flag &optional number-or-numbers no-modeline-update no-server interactive) "Set persistent mark." (save-excursion (let ((folder wl-summary-buffer-elmo-folder) number number-list) (setq number-list (cond ((numberp number-or-numbers) (list number-or-numbers)) ((and (not (null number-or-numbers)) (listp number-or-numbers)) number-or-numbers) ((setq number (wl-summary-message-number)) ;; interactive (list number)))) (if (null number-list) (message "No message.") ;; XXX Only the first element of the list is checked. (if (elmo-message-flag-available-p folder (car number-list) flag) (progn (if inverse (elmo-folder-unset-flag folder number-list flag no-server) (elmo-folder-set-flag folder number-list flag no-server)) (unless no-modeline-update ;; Update unread numbers. ;; should elmo-flag-mark-as-read return unread numbers? (wl-summary-count-unread) (wl-summary-update-modeline) (wl-folder-update-unread (wl-summary-buffer-folder-name) wl-summary-buffer-unread-count))) (if interactive (error "Flag `%s' is not available in this folder" flag))))))) (defun wl-summary-unset-persistent-mark (&optional flag number-or-numbers no-modeline-update no-server) "Unset persistent mark." (interactive) (when (called-interactively-p 'interactive) (let ((completion-ignore-case t)) (setq flag (intern (downcase (completing-read "Mark name: " (mapcar (lambda (flag) (list (capitalize (symbol-name flag)))) (wl-summary-get-available-flags)) nil 'require-match)))))) (wl-summary-set-persistent-mark-internal 'inverse flag number-or-numbers no-modeline-update no-server (called-interactively-p 'interactive))) (defun wl-summary-set-persistent-mark (&optional flag number-or-numbers no-modeline-update no-server) "Set persistent mark." (interactive) (when (called-interactively-p 'interactive) (let ((completion-ignore-case t)) (setq flag (intern (downcase (completing-read "Mark name: " (mapcar (lambda (flag) (list (capitalize (symbol-name flag)))) (wl-summary-get-available-flags)) nil 'require-match)))))) (wl-summary-set-persistent-mark-internal nil flag number-or-numbers no-modeline-update no-server (called-interactively-p 'interactive))) (defun wl-summary-toggle-persistent-mark (&optional force) "Toggle persistent mark." (interactive "P") (let ((completion-ignore-case t) flag) (setq flag (intern (downcase (completing-read "Mark name: " (mapcar (lambda (flag) (list (capitalize (symbol-name flag)))) (wl-summary-get-available-flags)) nil 'require-match)))) (if (and (elmo-message-flagged-p wl-summary-buffer-elmo-folder (wl-summary-message-number) flag) (not force)) (wl-summary-unset-persistent-mark flag) (wl-summary-set-persistent-mark flag)))) (defun wl-summary-mark-as-answered (&optional number-or-numbers no-modeline-update) (interactive) (wl-summary-set-persistent-mark-internal (and (called-interactively-p 'interactive) (elmo-message-flagged-p wl-summary-buffer-elmo-folder (wl-summary-message-number) 'answered)) 'answered number-or-numbers no-modeline-update nil (called-interactively-p 'interactive))) (defun wl-summary-mark-as-unanswered (&optional number-or-numbers no-modeline-update) (wl-summary-set-persistent-mark-internal 'inverse 'answered number-or-numbers no-modeline-update)) (defun wl-summary-decide-flag (folder number) (let ((flags (elmo-get-global-flags (elmo-message-flags folder number))) (completion-ignore-case t) new-flags) (setq new-flags (delq nil (mapcar (lambda (flag) (and (> (length flag) 0) (intern (downcase flag)))) (completing-read-multiple "Flags: " (mapcar (lambda (flag) (list (capitalize (symbol-name flag)))) elmo-global-flags) nil nil (mapconcat (lambda (flag) (capitalize (symbol-name flag))) flags ","))))) (dolist (flag new-flags) (unless (memq flag elmo-global-flags) (when (elmo-local-flag-p flag) (error "Cannot treat `%s'." flag)) (unless (elmo-flag-valid-p flag) (error "Invalid char in `%s'" flag)) (if (y-or-n-p (format "Flag `%s' is not registered yet. Register?" (capitalize (symbol-name flag)))) (setq elmo-global-flags (append elmo-global-flags (list flag))) (error "Stopped")))) new-flags)) (defsubst wl-summary-set-flags-internal (&optional number-or-numbers flags local remove-all) (save-excursion (let ((folder wl-summary-buffer-elmo-folder) number number-list) (setq number-list (cond ((numberp number-or-numbers) (list number-or-numbers)) ((and (not (null number-or-numbers)) (listp number-or-numbers)) number-or-numbers) ((setq number (wl-summary-message-number)) ;; interactive (list number)))) (if remove-all (setq flags nil) (unless flags (setq flags (wl-summary-decide-flag folder (car number-list))))) (if (null number-list) (message "No message.") (dolist (number number-list) (elmo-message-set-global-flags folder number flags local))) flags))) (defun wl-summary-set-flags (&optional remove) (interactive "P") (wl-summary-set-flags-internal nil nil nil remove)) (defun wl-summary-mark-as-important (&optional prompt) (interactive "P") (if prompt (wl-summary-set-flags-internal) (wl-summary-set-persistent-mark-internal (and (called-interactively-p 'interactive) (elmo-message-flagged-p wl-summary-buffer-elmo-folder (wl-summary-message-number) 'important)) 'important nil nil nil (called-interactively-p 'interactive)))) (defun wl-summary-recover-message (number) "Recover current message if it is killed." (interactive (list (wl-summary-message-number))) (if (null number) (message "No message.") (elmo-folder-recover-messages wl-summary-buffer-elmo-folder (list number)))) (defun wl-summary-view-old-p () "Return non-nil when summary view cache has old format." (when wl-summary-buffer-number-list (save-excursion (goto-char (point-min)) (not (re-search-forward "\r-?[0-9]+" (point-at-eol) t))))) (defun wl-summary-line-format-changed-p () "Return non-nil when summary line format is changed." (not (string= wl-summary-buffer-line-format (or (elmo-object-load (expand-file-name wl-summary-line-format-file (elmo-folder-msgdb-path wl-summary-buffer-elmo-folder)) wl-summary-buffer-mime-charset) wl-summary-buffer-line-format)))) (defun wl-summary-line-format-save () "Save current summary line format." (elmo-object-save (expand-file-name wl-summary-line-format-file (elmo-folder-msgdb-path wl-summary-buffer-elmo-folder)) wl-summary-buffer-line-format wl-summary-buffer-mime-charset)) (defun wl-summary-line-number () (format (format "%%%dd" wl-summary-buffer-number-column) (elmo-message-entity-number wl-message-entity))) (defun wl-summary-line-year () (aref wl-datevec 0)) (defun wl-summary-line-month () (format "%02d" (aref wl-datevec 1))) (defun wl-summary-line-day () (format "%02d" (aref wl-datevec 2))) (defun wl-summary-line-day-of-week () (condition-case nil (elmo-date-get-week (aref wl-datevec 0) (aref wl-datevec 1) (aref wl-datevec 2)) (error "??"))) (defun wl-summary-line-hour () (format "%02d" (aref wl-datevec 3))) (defun wl-summary-line-minute () (format "%02d" (aref wl-datevec 4))) (defun wl-summary-line-size () (let ((size (elmo-message-entity-field wl-message-entity 'size))) (if size (cond ((<= 1 (/ size 1048576)) (format "%.0fM" (/ size 1048576.0))) ((<= 1 (/ size 1024)) (format "%.0fK" (/ size 1024.0))) (t (format "%dB" size))) ""))) (defun wl-summary-line-subject () (let (no-parent subject parent-raw-subject parent-subject) (if (string= wl-thr-indent-string "") (setq no-parent t)) ; no parent (setq subject (elmo-delete-char ?\n (or (elmo-message-entity-field wl-message-entity 'subject) wl-summary-no-subject-message))) (setq parent-raw-subject (elmo-message-entity-field wl-parent-message-entity 'subject)) (setq parent-subject (if parent-raw-subject (elmo-delete-char ?\n parent-raw-subject))) (if (or no-parent (null parent-subject) (not (wl-summary-subject-equal subject parent-subject))) (funcall wl-summary-subject-function subject) ""))) (defun wl-summary-line-from () (elmo-delete-char ?\n (funcall wl-summary-from-function (elmo-message-entity-field wl-message-entity 'from)))) (defun wl-summary-line-list-info () (let ((list-info (wl-summary-get-list-info wl-message-entity))) (if (car list-info) (format (if (cdr list-info) "(%s %05.0f)" "(%s)") (car list-info) (cdr list-info)) ""))) (defun wl-summary-line-list-count () (let ((ml-count (cdr (wl-summary-get-list-info wl-message-entity)))) (if ml-count (format "%.0f" ml-count) ""))) (defun wl-summary-line-attached () (let ((content-type (elmo-message-entity-field wl-message-entity 'content-type)) (case-fold-search t)) (if (and content-type (string-match "multipart/mixed" content-type)) "@" ""))) ;;; For future use. ;;;(defun wl-summary-line-cached () ;;; (if (elmo-message-cached-p wl-summary-buffer-elmo-folder ;;; (elmo-message-entity-number wl-message-entity)) ;;; " " ;;; "u")) (defun wl-summary-create-line (message-entity parent-message-entity temp-mark wl-status &optional thr-children-number thr-indent-string thr-linked) "Create a summary line." (let ((wl-message-entity message-entity) (wl-parent-message-entity parent-message-entity) (wl-temp-mark temp-mark) (wl-thr-children-number thr-children-number) (wl-thr-indent-string thr-indent-string) (wl-thr-linked thr-linked)) (let ((wl-mime-charset wl-summary-buffer-mime-charset) (wl-persistent-mark (wl-summary-persistent-mark-string wl-summary-buffer-elmo-folder wl-status)) (elmo-mime-charset wl-summary-buffer-mime-charset) (elmo-lang wl-summary-buffer-weekday-name-lang) (wl-datevec (or (ignore-errors (elmo-time-to-datevec (elmo-message-entity-field wl-message-entity 'date) wl-summary-fix-timezone)) (make-vector 7 0))) line) (if (and wl-thr-indent-string wl-summary-indent-length-limit (< wl-summary-indent-length-limit (string-width wl-thr-indent-string))) (setq wl-thr-indent-string (wl-set-string-width wl-summary-indent-length-limit wl-thr-indent-string))) (setq line (funcall wl-summary-buffer-line-formatter)) (if wl-summary-width (setq line (wl-set-string-width (- wl-summary-width 1) line nil 'ignore-invalid))) (setq line (concat line "\r" (number-to-string (elmo-message-entity-number wl-message-entity)))) (wl-summary-validate-persistent-mark-string line) (if wl-summary-highlight (wl-highlight-summary-line-string (elmo-message-entity-number wl-message-entity) line wl-status wl-temp-mark wl-thr-indent-string)) line))) (defsubst wl-summary-proc-wday (wday-str year month mday) (save-match-data (if (string-match "\\([A-Z][a-z][a-z]\\).*" wday-str) (match-string 1 wday-str) (elmo-date-get-week year month mday)))) (defvar wl-summary-move-spec-alist '((new . ((t . nil) (p . new) (p . unread) (p . digest))) (unread . ((t . nil) (p . unread) (p . digest))))) (defsubst wl-summary-next-message (num direction hereto) (if wl-summary-buffer-next-message-function (funcall wl-summary-buffer-next-message-function num direction hereto) (let ((cur-spec (cdr (assq wl-summary-move-order wl-summary-move-spec-alist))) (nums (memq num (if (eq direction 'up) (reverse wl-summary-buffer-number-list) wl-summary-buffer-number-list))) flagged-list nums2) (unless hereto (setq nums (cdr nums))) (setq nums2 nums) (if cur-spec (catch 'done (while cur-spec (setq nums nums2) (cond ((eq (car (car cur-spec)) 'p) (if (setq flagged-list (elmo-folder-list-flagged wl-summary-buffer-elmo-folder (cdr (car cur-spec)) t)) (while nums (if (and (memq (car nums) flagged-list) (elmo-message-accessible-p wl-summary-buffer-elmo-folder (car nums))) (throw 'done (car nums))) (setq nums (cdr nums))))) ((eq (car (car cur-spec)) 't) (if wl-summary-buffer-target-mark-list (while nums (if (memq (car nums) wl-summary-buffer-target-mark-list) (throw 'done (car nums))) (setq nums (cdr nums)))))) (setq cur-spec (cdr cur-spec)))) (car nums))))) (defsubst wl-summary-cursor-move (direction hereto) (when (and (eq direction 'up) (eobp)) (forward-line -1) (setq hereto t)) (let (num) (when (setq num (wl-summary-next-message (wl-summary-message-number) direction hereto)) (if (numberp num) (wl-thread-jump-to-msg num)) t))) ;; ;; Goto unread or global flag message ;; returns t if next message exists in this folder. (defun wl-summary-cursor-down (&optional hereto) (interactive "P") (wl-summary-cursor-move 'down hereto)) (defun wl-summary-cursor-up (&optional hereto) (interactive "P") (wl-summary-cursor-move 'up hereto)) (defun wl-summary-save-view-cache () (save-excursion (let* ((dir (elmo-folder-msgdb-path wl-summary-buffer-elmo-folder)) (cache (expand-file-name wl-summary-cache-file dir)) (view (expand-file-name wl-summary-view-file dir)) (save-view wl-summary-buffer-view) (mark-list (copy-sequence wl-summary-buffer-target-mark-list)) (temp-list (copy-sequence wl-summary-buffer-temp-mark-list)) (tmp-buffer (get-buffer-create " *wl-summary-save-view-cache*")) (temp-column wl-summary-buffer-temp-mark-column) (charset wl-summary-buffer-mime-charset)) (when dir (if (file-directory-p dir) (); ok. (if (file-exists-p dir) (error "File %s already exists" dir) (elmo-make-directory dir))) (if (eq save-view 'thread) (wl-thread-save-entity dir)) (when wl-summary-check-line-format (wl-summary-line-format-save)) (unwind-protect (progn (when (file-writable-p cache) (copy-to-buffer tmp-buffer (point-min) (point-max)) (with-current-buffer tmp-buffer (widen) (make-local-variable 'wl-summary-highlight) (setq wl-summary-highlight nil wl-summary-buffer-target-mark-list mark-list wl-summary-buffer-temp-mark-list temp-list wl-summary-buffer-temp-mark-column temp-column) (wl-summary-delete-all-temp-marks 'no-msg 'force) (encode-coding-region (point-min) (point-max) (or (and wl-on-mule ;; one in mcs-ltn1(apel<10.4) cannot take 2 arg. (mime-charset-to-coding-system charset 'LF)) ;; Mule 2 doesn't have `*ctext*unix'. (mime-charset-to-coding-system charset))) (write-region-as-binary (point-min)(point-max) cache nil 'no-msg))) (when (file-writable-p view) ; 'thread or 'sequence (with-temp-buffer (prin1 save-view (current-buffer)) (princ "\n" (current-buffer)) (write-region (point-min) (point-max) view nil 'no-msg)))) ;; kill tmp buffer. (kill-buffer tmp-buffer)))))) (defsubst wl-summary-get-sync-range (folder) (intern (or (and (elmo-folder-plugged-p folder) (wl-get-assoc-list-value wl-folder-sync-range-alist (elmo-folder-name-internal folder) 'function)) wl-default-sync-range))) ;; redefined for wl-summary-sync-update (defun wl-summary-input-range (folder) "returns update or all or rescan." ;; for the case when parts are expanded in the bottom of the folder (let ((input-range-list '("no-sync" "first:" "last:" "cache-status" "mark" "rescan" "rescan-noscore" "rescan-thread" "update" "update-entirely" "all" "all-entirely")) (default (or (wl-get-assoc-list-value wl-folder-sync-range-alist folder 'function) wl-default-sync-range))) (completing-read (format "Range (%s): " default) (mapcar (lambda (x) (cons x x)) input-range-list) nil nil nil nil default))) (defun wl-summary-toggle-disp-folder (&optional arg) (interactive) (let ((cur-buf (current-buffer)) (summary-win (get-buffer-window (current-buffer))) fld-buf fld-win) (cond ((eq arg 'on) (setq wl-summary-buffer-disp-folder t) ;; hide your folder window (when (and (setq fld-buf (get-buffer wl-folder-buffer-name)) (setq fld-win (get-buffer-window fld-buf))) (delete-window fld-win))) ((eq arg 'off) (setq wl-summary-buffer-disp-folder nil) ;; hide your wl-message window! (when (buffer-live-p wl-message-buffer) (wl-message-select-buffer wl-message-buffer) (delete-window)) (select-window (get-buffer-window cur-buf)) ;; display wl-folder window!! (if (setq fld-buf (get-buffer wl-folder-buffer-name)) (if (setq fld-win (get-buffer-window fld-buf)) ;; folder win is already displayed. (select-window fld-win) ;; folder win is not displayed. (switch-to-buffer fld-buf)) ;; no folder buf (wl-folder)) ;; temporarily delete summary-win. (if summary-win (delete-window summary-win)) (split-window-horizontally wl-folder-window-width) (other-window 1) (switch-to-buffer cur-buf)) (t (when (setq fld-buf (get-buffer wl-folder-buffer-name)) (setq wl-summary-buffer-disp-folder (null (setq fld-win (get-buffer-window fld-buf))))) (if (not wl-summary-buffer-disp-folder) ;; hide message window (let ((mes-win (and wl-message-buffer (get-buffer-window wl-message-buffer))) (wl-stay-folder-window t)) (if mes-win (delete-window mes-win)) ;; hide your folder window (when fld-win (delete-window (get-buffer-window cur-buf)) (select-window fld-win) (switch-to-buffer cur-buf)) (run-hooks 'wl-summary-toggle-disp-folder-off-hook) ;; resume message window. (when mes-win (wl-message-select-buffer wl-message-buffer) (run-hooks 'wl-summary-toggle-disp-folder-message-resumed-hook) (select-window (get-buffer-window cur-buf)))) ;; hide message window (let ((wl-stay-folder-window t) (mes-win (and wl-message-buffer (get-buffer-window wl-message-buffer)))) (if mes-win (delete-window mes-win)) (select-window (get-buffer-window cur-buf)) ;; display wl-folder window!! (if (setq fld-buf (get-buffer wl-folder-buffer-name)) (if (setq fld-win (get-buffer-window fld-buf)) ;; folder win is already displayed. (select-window fld-win) ;; folder win is not displayed...occupy all. (switch-to-buffer fld-buf)) ;; no folder buf (wl-folder)) (split-window-horizontally wl-folder-window-width) (other-window 1) (switch-to-buffer cur-buf) ;; resume message window. (run-hooks 'wl-summary-toggle-disp-folder-on-hook) (when mes-win (wl-message-select-buffer wl-message-buffer) (run-hooks 'wl-summary-toggle-disp-folder-message-resumed-hook) (select-window (get-buffer-window cur-buf)))))))) (run-hooks 'wl-summary-toggle-disp-folder-hook)) (defun wl-summary-toggle-disp-msg (&optional arg) (interactive) (let ((cur-buf (current-buffer)) fld-buf fld-win) (cond ((eq arg 'on) (setq wl-summary-buffer-disp-msg t) ;; hide your folder window (when (and (not wl-stay-folder-window) (setq fld-buf (get-buffer wl-folder-buffer-name)) (setq fld-win (get-buffer-window fld-buf))) (delete-window fld-win))) ((eq arg 'off) (wl-delete-all-overlays) (setq wl-summary-buffer-disp-msg nil) (save-excursion (when (buffer-live-p wl-message-buffer) (wl-message-select-buffer wl-message-buffer) (delete-window) (and (get-buffer-window cur-buf) (select-window (get-buffer-window cur-buf)))) (run-hooks 'wl-summary-toggle-disp-off-hook))) (t (if (and wl-message-buffer (get-buffer-window wl-message-buffer)) ; already displayed (setq wl-summary-buffer-disp-msg nil) (setq wl-summary-buffer-disp-msg t)) (if wl-summary-buffer-disp-msg (progn (wl-summary-redisplay) ;;; hide your folder window ;;; (setq fld-buf (get-buffer wl-folder-buffer-name)) ;;; (if (setq fld-win (get-buffer-window fld-buf)) ;;; (delete-window fld-win))) (run-hooks 'wl-summary-toggle-disp-on-hook)) (wl-delete-all-overlays) (save-excursion (wl-message-select-buffer wl-message-buffer) (delete-window) (select-window (get-buffer-window cur-buf)) (setq wl-message-buffer nil) (run-hooks 'wl-summary-toggle-disp-off-hook)) ;;; (switch-to-buffer cur-buf) ))) (run-hooks 'wl-summary-buffer-window-scroll-functions))) (defun wl-summary-enter-handler (&optional arg) "A command for `enter' key in the summary. Basically, it shows next line of the message. If optional argument ARG is specified, behave as followed. If ARG is number, jump to the message. Otherwise it shows previous line of the message." (interactive "P") (cond ((numberp arg) (unless (wl-thread-jump-to-msg arg) (message "Message (#%d) was not found." arg))) (arg (wl-summary-prev-line-content)) (t (wl-summary-next-line-content)))) (defun wl-summary-next-line-content () "Show next line of the message." (interactive) (let ((cur-buf (current-buffer))) (wl-summary-toggle-disp-msg 'on) (when (wl-summary-set-message-buffer-or-redisplay 'ignore-original) (set-buffer cur-buf) (wl-message-next-page 1)))) (defun wl-summary-prev-line-content () (interactive) (let ((cur-buf (current-buffer))) (wl-summary-toggle-disp-msg 'on) (when (wl-summary-set-message-buffer-or-redisplay 'ignore-original) (set-buffer cur-buf) (wl-message-prev-page 1)))) (defun wl-summary-next-page () (interactive) (let ((cur-buf (current-buffer))) (wl-summary-toggle-disp-msg 'on) (when (wl-summary-set-message-buffer-or-redisplay 'ignore-original) (set-buffer cur-buf) (wl-message-next-page)))) (defun wl-summary-prev-page () (interactive) (let ((cur-buf (current-buffer))) (wl-summary-toggle-disp-msg 'on) (when (wl-summary-set-message-buffer-or-redisplay 'ignore-original) (set-buffer cur-buf) (wl-message-prev-page)))) (defsubst wl-summary-no-mime-p (folder) (elmo-string-match-member (elmo-folder-name-internal folder) wl-summary-no-mime-folder-list)) (defun wl-summary-set-message-buffer-or-redisplay (&rest _args) "Set message buffer. If message is not displayed yet, display it. Return t if message exists." (let ((folder wl-summary-buffer-elmo-folder) (number (wl-summary-message-number)) cur-folder cur-number) (when (buffer-live-p wl-message-buffer) (save-window-excursion (setq wl-current-summary-buffer (current-buffer)) (wl-message-select-buffer wl-message-buffer) (setq cur-folder wl-message-buffer-cur-folder) (setq cur-number wl-message-buffer-cur-number))) (if (and (string= (elmo-folder-name-internal folder) (or cur-folder "")) (eq number (or cur-number 0))) (progn (set-buffer wl-message-buffer) t) (wl-summary-redisplay-internal folder number) (when (buffer-live-p wl-message-buffer) (set-buffer wl-message-buffer)) nil))) (defun wl-summary-target-mark-forward (&optional _arg) (interactive "P") (wl-summary-check-target-mark) (let ((mlist (nreverse (copy-sequence wl-summary-buffer-target-mark-list))) (summary-buf (current-buffer)) (wl-draft-forward t) start-point draft-buf) (wl-summary-jump-to-msg (car mlist)) (wl-summary-forward t) (setq start-point (point)) (setq draft-buf (current-buffer)) (setq mlist (cdr mlist)) (save-window-excursion (when mlist (while mlist (set-buffer summary-buf) (wl-summary-jump-to-msg (car mlist)) (wl-summary-redisplay) (set-buffer draft-buf) (goto-char (point-max)) (wl-draft-insert-message) (setq mlist (cdr mlist))) (wl-draft-body-goto-top) (wl-draft-enclose-digest-region (point) (point-max))) (goto-char start-point) (with-current-buffer summary-buf (wl-summary-delete-all-target-marks))) (run-hooks 'wl-mail-setup-hook))) (defun wl-summary-target-mark-reply-with-citation (&optional arg) (interactive "P") (wl-summary-check-target-mark) (let ((mlist (nreverse (copy-sequence wl-summary-buffer-target-mark-list))) (summary-buf (current-buffer)) start-point draft-buf) (wl-summary-jump-to-msg (car mlist)) (when (wl-summary-reply arg t) (goto-char (point-max)) (setq start-point (point-marker)) (setq draft-buf (current-buffer)) (save-window-excursion (while mlist (set-buffer summary-buf) (delete-other-windows) (wl-summary-jump-to-msg (car mlist)) (wl-summary-redisplay) (set-buffer draft-buf) (goto-char (point-max)) (wl-draft-yank-original) (setq mlist (cdr mlist))) (goto-char start-point) (with-current-buffer summary-buf (wl-summary-delete-all-target-marks))) (wl-draft-reply-position wl-draft-reply-default-position) (run-hooks 'wl-mail-setup-hook)))) (defun wl-summary-reply-with-citation (&optional arg) (interactive "P") (when (wl-summary-reply arg t) (goto-char (point-max)) (wl-draft-yank-original) (wl-draft-reply-position wl-draft-reply-default-position) (run-hooks 'wl-mail-setup-hook))) (defun wl-summary-jump-to-msg-by-message-id (&optional id) (interactive) (let* ((msgid (substring-no-properties (or id (read-from-minibuffer "Message-ID: ")))) (entity (elmo-message-entity wl-summary-buffer-elmo-folder msgid)) msg schar (errmsg (format "No message with id \"%s\" in the folder." msgid))) (if (setq msg (elmo-message-entity-number entity)) (progn (wl-thread-jump-to-msg msg) t) (cond ((eq wl-summary-search-via-nntp 'confirm) (require 'elmo-nntp) (message "Search message in nntp server \"%s\" ? " elmo-nntp-default-server) (setq schar (let ((cursor-in-echo-area t)) (read-char))) (cond ((eq schar ?y) (wl-summary-jump-to-msg-by-message-id-via-nntp msgid)) ((eq schar ?s) (wl-summary-jump-to-msg-by-message-id-via-nntp msgid (read-from-minibuffer "NNTP Server: "))) (t (message "%s" errmsg) nil))) ((or (eq wl-summary-search-via-nntp 'force) (and (eq (elmo-folder-type-internal wl-summary-buffer-elmo-folder) 'nntp) wl-summary-search-via-nntp)) (wl-summary-jump-to-msg-by-message-id-via-nntp msgid)) (t (message "%s" errmsg) nil))))) (defun wl-summary-jump-to-msg-by-message-id-via-nntp (&optional id server-spec) (interactive) (let* ((msgid (substring-no-properties (or id (read-from-minibuffer "Message-ID: ")))) newsgroups folder ret user server port type spec) (if server-spec (if (string-match "^-" server-spec) (setq spec (wl-folder-get-elmo-folder server-spec) user (elmo-net-folder-user-internal spec) server (elmo-net-folder-server-internal spec) port (elmo-net-folder-port-internal spec) type (elmo-net-folder-stream-type-internal spec)) (setq server server-spec))) (when (setq ret (elmo-nntp-get-newsgroup-by-msgid msgid (or server elmo-nntp-default-server) (or user elmo-nntp-default-user) (or port elmo-nntp-default-port) (or type elmo-nntp-default-stream-type))) (setq newsgroups (elmo-nntp-parse-newsgroups ret)) (setq folder (concat "-" (car newsgroups) (elmo-nntp-folder-postfix user server port type))) (catch 'found (while newsgroups (if (wl-folder-entity-exists-p (car newsgroups) wl-folder-newsgroups-hashtb) (throw 'found (setq folder (concat "-" (car newsgroups) (elmo-nntp-folder-postfix user server port type))))) (setq newsgroups (cdr newsgroups))))) (if ret (wl-summary-jump-to-msg-internal folder nil 'update msgid) (message "No message id \"%s\" in nntp server \"%s\"." msgid (or server elmo-nntp-default-server)) nil))) (defun wl-summary-jump-to-msg-internal (folder msg scan-type &optional msgid) (let (wl-auto-select-first entity) (if (or (string= folder (wl-summary-buffer-folder-name)) (y-or-n-p (format "Message was found in the folder \"%s\". Jump to it? " folder))) (progn (unwind-protect (wl-summary-goto-folder-subr folder scan-type nil nil t) (if msgid (setq msg (elmo-message-entity-number (elmo-message-entity wl-summary-buffer-elmo-folder msgid)))) (setq entity (wl-folder-search-entity-by-name folder wl-folder-entity 'folder)) (if entity (wl-folder-set-current-entity-id (wl-folder-get-entity-id entity)))) (if (null msg) (message "Message was not found currently in this folder.") (setq msg (and (wl-thread-jump-to-msg msg) msg))) (cons folder msg))))) (defun wl-summary-jump-to-parent-message (arg) (interactive "P") (let ((cur-buf (current-buffer)) (disp-msg wl-summary-buffer-disp-msg) (number (wl-summary-message-number)) (regexp "\\(<[^<>]*>\\)[ \t]*$") (i -1) ;; xxx msg-id msg-num ref-list ref irt) (if (null number) (message "No message.") (when (eq wl-summary-buffer-view 'thread) (cond ((and arg (not (numberp arg))) (setq msg-num (wl-thread-entity-get-number (wl-thread-entity-get-top-entity (wl-thread-get-entity number))))) ((and arg (numberp arg)) (setq i 0) (setq msg-num number) (while (< i arg) (setq msg-num (wl-thread-entity-get-number (wl-thread-entity-get-parent-entity (wl-thread-get-entity msg-num)))) (setq i (1+ i)))) (t (setq msg-num (wl-thread-entity-get-number (wl-thread-entity-get-parent-entity (wl-thread-get-entity number))))))) (when (null msg-num) (wl-summary-set-message-buffer-or-redisplay) (set-buffer (wl-message-get-original-buffer)) (message "Searching parent message...") (setq ref (std11-field-body "References") irt (std11-field-body "In-Reply-To")) (cond ((and arg (not (numberp arg)) ref (not (string= ref "")) (string-match regexp ref)) ;; The first message of the thread. (setq msg-id (match-string 1 ref))) ;; "In-Reply-To:" has only one msg-id. ((and (null arg) irt (not (string= irt "")) (string-match regexp irt)) (setq msg-id (match-string 1 irt))) ((and (or (null arg) (numberp arg)) ref (not (string= ref "")) (string-match regexp ref)) ;; "^" searching parent, "C-u 2 ^" looking for grandparent. (while (string-match regexp ref) (setq ref-list (append (list (match-string 1 ref)) ref-list)) (setq ref (substring ref (match-end 0))) (setq i (1+ i))) (setq msg-id (if (null arg) (nth 0 ref-list) ;; previous (if (<= arg i) (nth (1- arg) ref-list) (nth i ref-list)))))) (set-buffer cur-buf) (or disp-msg (wl-summary-toggle-disp-msg 'off))) (cond ((and (null msg-id) (null msg-num)) (message "No parent message!") nil) ((and msg-id (wl-summary-jump-to-msg-by-message-id msg-id)) (if wl-summary-buffer-disp-msg (wl-summary-redisplay)) (message "Searching parent message...done") t) ((and msg-num (wl-summary-jump-to-msg msg-num)) (if wl-summary-buffer-disp-msg (wl-summary-redisplay)) (message "Searching parent message...done") t) (t ; failed. (message "Parent message was not found.") nil))))) (defun wl-summary-reply (&optional arg without-setup-hook) "Reply to the current message. See also `wl-draft-reply'." (interactive "P") (let ((number (wl-summary-message-number)) (summary-buf (current-buffer)) (winconf (current-window-configuration)) mes-buf) (when number (save-excursion (wl-summary-set-message-buffer-or-redisplay)) (wl-message-select-buffer wl-message-buffer) (condition-case err (when (setq mes-buf (wl-message-get-original-buffer)) (wl-draft-reply mes-buf arg summary-buf number) (wl-draft-reply-position wl-draft-reply-default-position) (unless without-setup-hook (run-hooks 'wl-mail-setup-hook))) (error (set-window-configuration winconf) (signal (car err)(cdr err)))) (with-current-buffer summary-buf (run-hooks 'wl-summary-reply-hook)) t))) (defun wl-summary-write (folder) "Write a new draft from Summary." (interactive (list (wl-summary-buffer-folder-name))) (wl-draft (list (cons 'To "")) nil nil nil nil folder) ;; wl-draft only does these if called `interactive-p' (run-hooks 'wl-mail-setup-hook) (mail-position-on-field "To")) (defvar wl-summary-write-current-folder-functions '(wl-folder-get-newsgroups wl-folder-guess-mailing-list-by-refile-rule wl-folder-guess-mailing-list-by-folder-name) "Newsgroups or Mailing List address guess functions list. Call from `wl-summary-write-current-folder'. When guess function return nil, challenge next guess-function.") (defun wl-summary-write-current-folder (folder) "Write message to current FOLDER's newsgroup or mailing-list. Use function list is `wl-summary-write-current-folder-functions'." (interactive (list (wl-summary-buffer-folder-name))) (let ((func-list wl-summary-write-current-folder-functions) guess-list guess-func) (while func-list (setq guess-list (funcall (car func-list) folder)) (if (null guess-list) (setq func-list (cdr func-list)) (setq guess-func (car func-list)) (setq func-list nil))) (if (null guess-func) (wl-summary-write folder) (unless (or (stringp (nth 0 guess-list)) (stringp (nth 1 guess-list)) (stringp (nth 2 guess-list))) (error "Invalid value return guess function `%s'" (symbol-name guess-func))) (wl-draft (list (cons 'To (nth 0 guess-list)) (cons 'Cc (nth 1 guess-list)) (cons 'Newsgroups (nth 2 guess-list))) nil nil nil nil folder) (run-hooks 'wl-mail-setup-hook) (mail-position-on-field "Subject")))) (defun wl-summary-forward (&optional without-setup-hook) "" (interactive) (let ((folder wl-summary-buffer-elmo-folder) (number (wl-summary-message-number)) (summary-buf (current-buffer)) (wl-draft-forward t) subject) (if (null number) (message "No message.") (if (and (elmo-message-use-cache-p folder number) (eq (elmo-file-cache-status (elmo-file-cache-get (elmo-message-field folder number 'message-id))) 'section)) ;; Reload. (wl-summary-redisplay-internal nil nil 'force-reload) (wl-summary-redisplay-internal folder number)) (wl-message-select-buffer wl-message-buffer) (setq subject (with-current-buffer wl-message-buffer-original-buffer (std11-field-body "Subject"))) (wl-draft-forward subject summary-buf number) (with-current-buffer summary-buf (run-hooks 'wl-summary-forward-hook)) (unless without-setup-hook (run-hooks 'wl-mail-setup-hook))))) (defun wl-summary-click (e) (interactive "e") (mouse-set-point e) (wl-summary-read)) (defun wl-summary-read () "Proceed reading message in the summary buffer." (interactive) (let ((cur-buf (current-buffer))) (wl-summary-toggle-disp-msg 'on) (when (wl-summary-set-message-buffer-or-redisplay 'ignore-original) (set-buffer cur-buf) (if (wl-message-next-page) (wl-summary-down t))))) (defsubst wl-summary-cursor-move-surface (downward interactive) (if wl-summary-move-direction-toggle (setq wl-summary-move-direction-downward downward)) (let ((start (point)) (skip-tmark-regexp (and wl-summary-skip-mark-list (regexp-opt wl-summary-skip-mark-list))) (skip t) (column (current-column)) goto-next next-entity finfo) (beginning-of-line) (while (and skip (not (if downward (eobp) (bobp)))) (if downward (forward-line) (forward-line -1)) (setq skip (or (and skip-tmark-regexp (string-match skip-tmark-regexp (wl-summary-temp-mark))) (not (and (wl-summary-message-number) (elmo-message-accessible-p wl-summary-buffer-elmo-folder (wl-summary-message-number))))))) (if (if downward (eobp) (and (bobp) skip)) (setq goto-next t)) (if (or (eobp) (and (bobp) skip)) (goto-char start)) (move-to-column column) (if (not goto-next) (if wl-summary-buffer-disp-msg (wl-summary-redisplay)) (if interactive (cond ((and (not downward) wl-summary-buffer-prev-folder-function) (funcall wl-summary-buffer-prev-folder-function)) ((and downward wl-summary-buffer-next-folder-function) (funcall wl-summary-buffer-next-folder-function)) (t (when wl-auto-select-next (setq next-entity (if downward (wl-summary-get-next-folder) (wl-summary-get-prev-folder))) (if next-entity (setq finfo (wl-folder-get-entity-info next-entity)))) (wl-ask-folder (lambda () (wl-summary-next-folder-or-exit next-entity)) (format "No more messages. Type SPC to go to %s." (wl-summary-entity-info-msg next-entity finfo))))))))) (defun wl-summary-prev (&optional interactive) (interactive) (wl-summary-cursor-move-surface nil (or interactive (called-interactively-p 'interactive)))) (defun wl-summary-next (&optional interactive) (interactive) (wl-summary-cursor-move-surface t (or interactive (called-interactively-p 'interactive)))) (defun wl-summary-up (&optional interactive skip-no-unread) "" (interactive) (if wl-summary-move-direction-toggle (setq wl-summary-move-direction-downward nil)) (if (wl-summary-cursor-up) (if wl-summary-buffer-disp-msg (wl-summary-redisplay)) (if (or interactive (called-interactively-p 'interactive)) (if wl-summary-buffer-prev-folder-function (funcall wl-summary-buffer-prev-folder-function) (let (next-entity finfo) (when wl-auto-select-next (progn (setq next-entity (wl-summary-get-prev-unread-folder)) (if next-entity (setq finfo (wl-folder-get-entity-info next-entity))))) (if (and skip-no-unread (eq wl-auto-select-next 'skip-no-unread)) (wl-summary-next-folder-or-exit next-entity t) (wl-ask-folder (lambda () (wl-summary-next-folder-or-exit next-entity t)) (format "No more unread messages. Type SPC to go to %s." (wl-summary-entity-info-msg next-entity finfo))))))))) (defun wl-summary-get-prev-folder () (let ((folder-buf (get-buffer wl-folder-buffer-name))) (when folder-buf (wl-folder-get-prev-folder (with-current-buffer folder-buf wl-folder-buffer-cur-entity-id))))) (defun wl-summary-get-next-folder () (let ((folder-buf (get-buffer wl-folder-buffer-name))) (when folder-buf (wl-folder-get-next-folder (with-current-buffer folder-buf wl-folder-buffer-cur-entity-id))))) (defun wl-summary-get-next-unread-folder () (let ((folder-buf (get-buffer wl-folder-buffer-name))) (when folder-buf (wl-folder-get-next-folder (with-current-buffer folder-buf wl-folder-buffer-cur-entity-id) 'unread)))) (defun wl-summary-get-prev-unread-folder () (let ((folder-buf (get-buffer wl-folder-buffer-name))) (when folder-buf (wl-folder-get-prev-folder (with-current-buffer folder-buf wl-folder-buffer-cur-entity-id) 'unread)))) (defun wl-summary-down (&optional interactive skip-no-unread) (interactive) (if wl-summary-move-direction-toggle (setq wl-summary-move-direction-downward t)) (if (wl-summary-cursor-down) (if wl-summary-buffer-disp-msg (wl-summary-redisplay)) (if (or interactive (called-interactively-p 'interactive)) (if wl-summary-buffer-next-folder-function (funcall wl-summary-buffer-next-folder-function) (let (next-entity finfo) (when wl-auto-select-next (setq next-entity (wl-summary-get-next-unread-folder))) (if next-entity (setq finfo (wl-folder-get-entity-info next-entity))) (if (and skip-no-unread (eq wl-auto-select-next 'skip-no-unread)) (wl-summary-next-folder-or-exit next-entity) (wl-ask-folder (lambda () (wl-summary-next-folder-or-exit next-entity)) (format "No more unread messages. Type SPC to go to %s." (wl-summary-entity-info-msg next-entity finfo))))))))) (defun wl-summary-pop-to-last-message () "Jump to last displayed message, and pop a new massage off the ring." (interactive) (let ((number (wl-summary-pop-message (wl-summary-message-number)))) (unless number (error "Empty message ring")) (wl-summary-jump-to-msg number) (when wl-summary-buffer-disp-msg (let (wl-summary-buffer-message-ring) (wl-summary-redisplay))))) (defun wl-summary-goto-last-displayed-msg (&optional arg) "Jump to last displayed message." (interactive "P") (cond ((eq last-command 'wl-summary-pop-to-last-message) (setq this-command 'wl-summary-pop-to-last-message) (wl-summary-pop-to-last-message)) (arg (setq this-command 'wl-summary-pop-to-last-message) (wl-summary-pop-to-last-message)) (t (let ((current (wl-summary-message-number)) (number (wl-summary-pop-message))) (if number (progn (wl-summary-jump-to-msg number) (if wl-summary-buffer-disp-msg (wl-summary-redisplay) (wl-summary-push-message current))) (message "No last message.")))))) (defun wl-summary-message-display-type () (when (and wl-summary-buffer-disp-msg (buffer-live-p wl-message-buffer) wl-summary-buffer-current-msg (wl-summary-message-number) (= (wl-summary-message-number) wl-summary-buffer-current-msg)) (wl-message-buffer-display-type wl-message-buffer))) (defun wl-summary-buffer-display-mime-mode () (or (wl-message-display-type-property (wl-summary-message-display-type) :mime) wl-summary-buffer-display-mime-mode)) (defun wl-summary-buffer-display-header-mode () (or (wl-message-display-type-property (wl-summary-message-display-type) :header) wl-summary-buffer-display-header-mode)) (defun wl-summary-toggle-mime (&optional arg) "Toggle MIME decoding. If ARG is non-nil, ask coding-system to display the message in the current MIME analysis mode. If ARG is numeric number, decode message as following: 1: Enable MIME analysis. 2: Enable MIME analysis only for headers. 3: Disable MIME analysis." (interactive "P") (let ((mime-mode (wl-summary-buffer-display-mime-mode)) (elmo-mime-display-as-is-coding-system elmo-mime-display-as-is-coding-system)) (if (and (consp arg) (> (prefix-numeric-value arg) 4)) (progn (setq wl-summary-buffer-display-mime-mode mime-mode) (wl-summary-update-modeline)) (cond ((numberp arg) (setq mime-mode (cl-case arg (1 'mime) (2 'header-only) (3 'as-is) ;;; (4 'decode-only) (5 'no-merge)))) (arg ;; Specify coding-system (doesn't change the MIME mode). (setq elmo-mime-display-as-is-coding-system (if (and arg (not (wl-message-mime-analysis-p (wl-summary-message-display-type)))) (or (read-coding-system "Coding system: ") elmo-mime-display-as-is-coding-system) elmo-mime-display-as-is-coding-system))) (t ;; Change the MIME mode. (setq mime-mode (or (cadr (memq mime-mode wl-summary-display-mime-mode-list)) (car wl-summary-display-mime-mode-list))))) (wl-summary-redisplay-internal nil nil arg mime-mode)) (message "MIME decoding: %s%s" (upcase (symbol-name mime-mode)) (if (and (not (eq mime-mode 'mime)) (not (eq elmo-mime-display-as-is-coding-system 'undecided))) (concat " (" (symbol-name elmo-mime-display-as-is-coding-system) ")") "")))) (defun wl-summary-redisplay (&optional arg) "Redisplay message." (interactive "P") (apply #'wl-summary-redisplay-internal nil nil arg (unless (and (consp arg) (> (prefix-numeric-value arg) 4)) (list wl-summary-buffer-display-mime-mode wl-summary-buffer-display-header-mode)))) (defun wl-summary-toggle-all-header (&optional arg) "Toggle displaying message with all header." (interactive "P") (let ((header-mode (wl-summary-buffer-display-header-mode))) (if (and (consp arg) (> (prefix-numeric-value arg) 4)) (setq wl-summary-buffer-display-header-mode header-mode) (wl-summary-redisplay-internal nil nil arg nil (if (eq header-mode 'all) 'partial 'all))))) (defun wl-summary-redisplay-internal (&optional folder number force-reload mime-mode header-mode) (let* ((folder (or folder wl-summary-buffer-elmo-folder)) (num (or number (wl-summary-message-number))) (wl-mime-charset wl-summary-buffer-mime-charset) (default-mime-charset wl-summary-buffer-mime-charset) fld-buf fld-win thr-entity (elmo-message-fetch-confirm (or elmo-message-fetch-confirm (and force-reload elmo-message-fetch-threshold)))) (if (and wl-thread-open-reading-thread (eq wl-summary-buffer-view 'thread) (not (wl-thread-entity-get-opened (setq thr-entity (wl-thread-get-entity num)))) (wl-thread-entity-get-children thr-entity)) (wl-thread-force-open)) (if num (progn (setq wl-summary-buffer-disp-msg t) (wl-summary-push-message wl-summary-buffer-current-msg) ;; hide folder window (when (and (not wl-stay-folder-window) (setq fld-buf (get-buffer wl-folder-buffer-name)) (setq fld-win (get-buffer-window fld-buf))) (delete-window fld-win)) (setq wl-current-summary-buffer (current-buffer)) (wl-message-redisplay folder num (wl-message-make-display-type (or mime-mode (wl-summary-buffer-display-mime-mode)) (or header-mode (wl-summary-buffer-display-header-mode))) (or force-reload (string= (elmo-folder-name-internal folder) wl-draft-folder))) (when (elmo-message-use-cache-p folder num) (elmo-message-set-cached folder num t)) (ignore-errors (if (elmo-message-flagged-p wl-summary-buffer-elmo-folder num 'unread) (wl-summary-mark-as-read num) (wl-summary-count-unread) (wl-summary-update-modeline) (wl-folder-update-unread (wl-summary-buffer-folder-name) wl-summary-buffer-unread-count))) (setq wl-summary-buffer-current-msg num) (when wl-summary-recenter (recenter (/ (- (window-height) 2) 2)) (if (not wl-summary-indent-length-limit) (wl-horizontal-recenter))) (wl-highlight-summary-displaying) (wl-message-buffer-prefetch-next folder num (min (or wl-message-buffer-prefetch-depth 0) (1- wl-message-buffer-cache-size)) (current-buffer) wl-summary-buffer-mime-charset) (run-hooks 'wl-summary-redisplay-hook)) (message "No message to display.")))) (defun wl-summary-jump-to-current-message () "Jump into Message buffer." (interactive) (let (message-buf message-win) (if (setq message-buf wl-message-buffer) (if (setq message-win (get-buffer-window message-buf)) (select-window message-win) (wl-message-select-buffer wl-message-buffer)) (wl-summary-redisplay) (wl-message-select-buffer wl-message-buffer)))) (defun wl-summary-cancel-message () "Cancel an article on news." (interactive) (if (null (wl-summary-message-number)) (message "No message.") (let ((summary-buf (current-buffer)) message-buf) (wl-summary-set-message-buffer-or-redisplay) (if (setq message-buf (wl-message-get-original-buffer)) (set-buffer message-buf)) (unless (wl-message-news-p) (set-buffer summary-buf) (if (and (eq (elmo-folder-type-internal wl-summary-buffer-elmo-folder) 'nntp) (y-or-n-p "Cannot get Newsgroups. Fetch again? ")) (progn (wl-summary-redisplay t) (wl-summary-supersedes-message)) (error "This is not a news article; supersedes is impossible"))) (when (yes-or-no-p "Do you really want to cancel this article? ") (let (from newsgroups message-id distribution) (save-excursion (setq from (std11-field-body "from") newsgroups (std11-field-body "newsgroups") message-id (elmo-get-message-id-from-buffer) distribution (std11-field-body "distribution")) ;; Make sure that this article was written by the user. (unless (wl-address-user-mail-address-p (wl-address-header-extract-address (car (elmo-parse-addresses from)))) (error "This article is not yours")) ;; Make control message. (set-buffer (get-buffer-create " *message cancel*")) (setq wl-draft-buffer-cur-summary-buffer summary-buf) (buffer-disable-undo) (erase-buffer) (insert "Newsgroups: " newsgroups "\n" "From: " (wl-address-header-extract-address wl-from) "\n" "Subject: cmsg cancel " message-id "\n" "Control: cancel " message-id "\n" (if distribution (concat "Distribution: " distribution "\n") "") mail-header-separator "\n" wl-summary-cancel-message) (message "Canceling your message...") (wl-draft-raw-send t t) ; kill when done, force-pre-hooks. (message "Canceling your message...done"))))))) (defun wl-summary-supersedes-message () "Supersede current message." (interactive) (wl-summary-toggle-disp-msg 'off) (let ((summary-buf (current-buffer)) message-buf from) (wl-summary-set-message-buffer-or-redisplay) (if (setq message-buf (wl-message-get-original-buffer)) (set-buffer message-buf)) (unless (wl-message-news-p) (set-buffer summary-buf) (if (and (eq (elmo-folder-type-internal wl-summary-buffer-elmo-folder) 'nntp) (y-or-n-p "Cannot get Newsgroups. Fetch again? ")) (progn (wl-summary-redisplay t) (wl-summary-supersedes-message)) (error "This is not a news article; supersedes is impossible"))) (save-excursion (setq from (std11-field-body "from")) ;; Make sure that this article was written by the user. (unless (wl-address-user-mail-address-p (wl-address-header-extract-address (car (elmo-parse-addresses from)))) (error "This article is not yours")) (let* ((message-id (elmo-get-message-id-from-buffer)) (followup-to (std11-field-body "followup-to")) (mail-default-headers (concat mail-default-headers "Supersedes: " message-id "\n" (and followup-to (concat "Followup-To: " followup-to "\n"))))) (if message-buf (set-buffer message-buf)) (wl-draft-edit-string (buffer-substring (point-min) (point-max))))))) (defun wl-summary-display-raw (&optional _arg) "Display current message in raw format." (interactive) (let ((number (wl-summary-message-number)) (folder wl-summary-buffer-elmo-folder)) (if number (let ((raw (elmo-message-fetch-string folder number (elmo-find-fetch-strategy folder number))) (raw-buffer (get-buffer-create "*wl:raw message*")) (raw-mode-map (make-sparse-keymap))) (with-current-buffer raw-buffer (read-only-mode -1) (erase-buffer) (princ raw raw-buffer) (read-only-mode 1) (goto-char (point-min)) (switch-to-buffer-other-window raw-buffer) (define-key raw-mode-map "l" 'toggle-truncate-lines) (define-key raw-mode-map "q" 'kill-buffer-and-window) (define-key raw-mode-map "," 'kill-buffer-and-window) (use-local-map raw-mode-map))) (message "No message to display.")) number)) (defun wl-summary-save (&optional arg wl-save-dir) "Save current message to disk." (interactive) (let ((filename) (num (wl-summary-message-number))) (unless wl-save-dir (setq wl-save-dir wl-temporary-file-directory)) (if num (save-excursion (setq filename (concat (number-to-string num) wl-summary-save-file-suffix)) (if (or (null arg) (file-exists-p (expand-file-name filename wl-save-dir))) (setq filename (expand-file-name (read-file-name "Save to file: " wl-save-dir nil nil filename))) (setq filename (expand-file-name filename wl-save-dir))) (wl-summary-set-message-buffer-or-redisplay) (set-buffer (wl-message-get-original-buffer)) (when (or arg (not (file-exists-p filename)) (y-or-n-p "File already exists. override it? ")) (write-region-as-binary (point-min) (point-max) filename))) (message "No message to save.")) num)) (defun wl-summary-save-region (beg end) (interactive "r") (save-excursion (save-restriction (wl-summary-narrow-to-region beg end) (goto-char (point-min)) (let ((wl-save-dir (wl-read-directory-name "Save to directory: " wl-temporary-file-directory))) (if (null (file-exists-p wl-save-dir)) (make-directory wl-save-dir)) (if (eq wl-summary-buffer-view 'thread) (progn (while (not (eobp)) (let* ((number (wl-summary-message-number)) (entity (wl-thread-get-entity number))) (if (wl-thread-entity-get-opened entity) (wl-summary-save t wl-save-dir) ;; closed (wl-summary-save t wl-save-dir)) (forward-line)))) (while (not (eobp)) (wl-summary-save t wl-save-dir) (forward-line))))))) ;; mew-summary-pipe-message() (defun wl-summary-pipe-message (prefix command) "Send this message via pipe." (interactive (list current-prefix-arg nil)) (if (null (wl-summary-message-number)) (message "No message.") (setq command (wl-read-shell-command "Shell command on message: " wl-summary-shell-command-last)) (if (y-or-n-p "Send this message to pipe? ") (wl-summary-pipe-message-subr prefix command)))) (defun wl-summary-target-mark-pipe (prefix command) "Send each marked messages via pipe." (interactive (list current-prefix-arg nil)) (if (null wl-summary-buffer-target-mark-list) (message "No marked message.") (setq command (wl-read-shell-command "Shell command on each marked message: " wl-summary-shell-command-last)) (when (y-or-n-p "Send each marked message to pipe? ") (while (car wl-summary-buffer-target-mark-list) (let ((num (car wl-summary-buffer-target-mark-list))) (wl-thread-jump-to-msg num) (wl-summary-pipe-message-subr prefix command) (wl-summary-unmark)))))) (defun wl-summary-pipe-message-subr (prefix command) (save-excursion (wl-summary-set-message-buffer-or-redisplay) (set-buffer (wl-message-get-original-buffer)) (if (string= command "") (setq command wl-summary-shell-command-last)) (goto-char (point-min)) ; perhaps this line won't be necessary (if prefix (search-forward "\n\n")) (shell-command-on-region (point) (point-max) command nil) (setq wl-summary-shell-command-last command))) (defun wl-summary-print-message (&optional _arg) (interactive "P") (if (null (wl-summary-message-number)) (message "No message.") (save-excursion (wl-summary-set-message-buffer-or-redisplay) (if (or (not (called-interactively-p 'interactive)) (y-or-n-p "Print ok? ")) (progn (let ((buffer (generate-new-buffer " *print*"))) (copy-to-buffer buffer (point-min) (point-max)) (set-buffer buffer) (funcall wl-print-buffer-function) (kill-buffer buffer))) (message ""))))) (eval-when-compile (require 'ps-print)) (autoload 'ps-print-preprint "ps-print") (defun wl-summary-print-message-with-ps-print (&optional filename) "Print message via ps-print." (interactive) (if (null (wl-summary-message-number)) (message "No message.") (setq filename (ps-print-preprint current-prefix-arg)) (if (or (not (called-interactively-p 'interactive)) (y-or-n-p "Print ok? ")) (let ((summary-buffer (current-buffer)) wl-break-pages) (save-excursion (wl-summary-set-message-buffer-or-redisplay) (let* ((buffer (generate-new-buffer " *print*")) (entity (progn (set-buffer summary-buffer) (elmo-message-entity wl-summary-buffer-elmo-folder (wl-summary-message-number)))) (wl-ps-subject (or (elmo-message-entity-field entity 'subject 'string) "")) (wl-ps-from (or (elmo-message-entity-field entity 'from 'string) "")) (wl-ps-date (or (elmo-message-entity-field entity 'date 'string) ""))) (run-hooks 'wl-ps-preprint-hook) (set-buffer wl-message-buffer) (copy-to-buffer buffer (point-min) (point-max)) (set-buffer buffer) (unwind-protect (let ((ps-left-header (list (concat "(" wl-ps-subject ")") (concat "(" wl-ps-from ")"))) (ps-right-header (list "/pagenumberstring load" (concat "(" wl-ps-date ")")))) (run-hooks 'wl-ps-print-hook) (funcall wl-ps-print-buffer-function filename)) (kill-buffer buffer))))) (message "")))) (if (featurep 'ps-print) ; ps-print is available. (fset 'wl-summary-print-message 'wl-summary-print-message-with-ps-print)) (defun wl-summary-target-mark-print () (interactive) (wl-summary-check-target-mark) (when (y-or-n-p "Print all marked messages. OK? ") (while (car wl-summary-buffer-target-mark-list) (let ((num (car wl-summary-buffer-target-mark-list))) (wl-thread-jump-to-msg num) (wl-summary-print-message) (wl-summary-unmark))))) (defun wl-summary-folder-info-update () (wl-folder-set-folder-updated (substring-no-properties (wl-summary-buffer-folder-name)) (list 0 wl-summary-buffer-unread-count (elmo-folder-length wl-summary-buffer-elmo-folder)))) (defun wl-summary-get-original-buffer () "Get original buffer for the current summary." (save-excursion (wl-summary-set-message-buffer-or-redisplay) (wl-message-get-original-buffer))) (defun wl-summary-pack-number (&optional _arg) (interactive "P") (if (elmo-folder-pack-numbers wl-summary-buffer-elmo-folder) (let (wl-use-scoring) (wl-summary-rescan nil nil nil t)) (error "This folder doesn't support packing numbers"))) (defun wl-summary-target-mark-uudecode () (interactive) (wl-summary-check-target-mark) (let ((mlist (reverse wl-summary-buffer-target-mark-list)) (summary-buf (current-buffer)) (tmp-buf (get-buffer-create "*WL UUENCODE*")) orig-buf i k filename rc errmsg) (setq i 1) (setq k (length mlist)) (set-buffer tmp-buf) (erase-buffer) (save-window-excursion (while mlist (set-buffer summary-buf) (wl-summary-jump-to-msg (car mlist)) (wl-summary-redisplay) (set-buffer (setq orig-buf (wl-summary-get-original-buffer))) (goto-char (point-min)) (cond ((= i 1) ; first (if (setq filename (wl-message-uu-substring orig-buf tmp-buf t (= i k))) nil (error "Can't find begin line"))) ((< i k) (wl-message-uu-substring orig-buf tmp-buf)) (t ; last (wl-message-uu-substring orig-buf tmp-buf nil t))) (setq i (1+ i)) (setq mlist (cdr mlist))) (set-buffer tmp-buf) (message "Exec %s..." wl-prog-uudecode) (unwind-protect (let ((decode-dir wl-temporary-file-directory)) (if (not wl-prog-uudecode-no-stdout-option) (setq filename (expand-file-name (read-file-name "Save to file: " wl-temporary-file-directory nil nil (elmo-safe-filename filename)))) (setq decode-dir (wl-read-directory-name "Save to directory: " wl-temporary-file-directory)) (setq filename (expand-file-name filename decode-dir))) (if (file-exists-p filename) (or (yes-or-no-p (format "File %s exists. Save anyway? " filename)) (error ""))) (elmo-bind-directory decode-dir (setq rc (as-binary-process (apply 'call-process-region (point-min) (point-max) wl-prog-uudecode t (current-buffer) nil wl-prog-uudecode-arg)))) (when (not (= 0 rc)) (setq errmsg (buffer-substring (point-min)(point-max))) (error "Uudecode error: %s" errmsg)) (if (not wl-prog-uudecode-no-stdout-option) (let (file-name-handler-alist) ;; void jka-compr (as-binary-output-file (write-region (point-min) (point-max) filename nil 'no-msg)))) (with-current-buffer summary-buf (wl-summary-delete-all-target-marks)) (if (file-exists-p filename) (message "Saved as %s" filename))) (kill-buffer tmp-buf))))) ;;; Someday ;;;(defun wl-summary-drop-unsync () ;;; "Drop all unsync messages." ;;; (interactive) ;;; (if (elmo-folder-pipe-p (wl-summary-buffer-folder-name)) ;;; (error "You cannot drop unsync messages in this folder")) ;;; (if (or (not (called-interactively-p 'interactive)) ;;; (y-or-n-p "Drop all unsync messages? ")) ;;; (let* ((folder-list (elmo-folder-get-primitive-folder-list ;;; (wl-summary-buffer-folder-name))) ;;; (is-multi (elmo-multi-p (wl-summary-buffer-folder-name))) ;;; (sum 0) ;;; (multi-num 0) ;;; pair) ;;; (message "Dropping...") ;;; (while folder-list ;;; (setq pair (elmo-folder-message-numbers (car folder-list))) ;;; (when is-multi ;; dirty hack... ;;; (incf multi-num) ;;; (setcar pair (+ (* multi-num elmo-multi-divide-number) ;;; (car pair)))) ;;; (elmo-msgdb-set-number-alist ;;; (wl-summary-buffer-msgdb) ;;; (nconc ;;; (elmo-msgdb-get-number-alist (wl-summary-buffer-msgdb)) ;;; (list (cons (car pair) nil)))) ;;; (setq sum (+ sum (cdr pair))) ;;; (setq folder-list (cdr folder-list))) ;;; (wl-summary-set-message-modified) ;;; (wl-folder-set-folder-updated (wl-summary-buffer-folder-name) ;;; (list 0 ;;; (+ wl-summary-buffer-unread-count ;;; wl-summary-buffer-new-count) ;;; sum)) ;;; (message "Dropping...done")))) (defun wl-summary-previous-message-number (msg) "Return a message number previous to the message specified by MSG." (let ((list wl-summary-buffer-number-list) previous) (while (and list (not (eq msg (car list)))) (setq previous (car list)) (setq list (cdr list))) previous)) (defun wl-summary-next-message-number (msg) "Return a message number next to the message specified by MSG." (cadr (memq msg wl-summary-buffer-number-list))) (defun wl-summary-default-get-next-msg (msg) (or (wl-summary-next-message msg (if wl-summary-move-direction-downward 'down 'up) nil) (if wl-summary-move-direction-downward (wl-summary-next-message-number msg) (wl-summary-previous-message-number msg)))) (defun wl-summary-save-current-message () "Save current message for `wl-summary-yank-saved-message'." (interactive) (let ((number (wl-summary-message-number))) (setq wl-summary-buffer-saved-message number) (and number (message "No: %s is saved." number)))) (defun wl-summary-yank-saved-message () "Set current message as a parent of the saved message." (interactive) (if wl-summary-buffer-saved-message (let ((number (wl-summary-message-number))) (if (eq wl-summary-buffer-saved-message number) (message "Cannot set itself as a parent.") (save-excursion (wl-thread-jump-to-msg wl-summary-buffer-saved-message) (wl-thread-set-parent number) (wl-summary-set-thread-modified)) (setq wl-summary-buffer-saved-message nil))) (message "There's no saved message."))) (defun wl-summary-toggle-header-narrowing () "Toggle message header narrowing." (interactive) (when wl-message-use-header-narrowing (save-selected-window (let* ((mbuf wl-message-buffer) (mwin (when mbuf (get-buffer-window mbuf))) (wpos (when mwin (window-start mwin)))) (when mbuf (set-buffer mbuf) (wl-message-header-narrowing-toggle) (and wpos (set-window-start mwin wpos))))))) (defun wl-summary-toggle-mime-buttons () "Toggle visibility of mime buttons." (interactive) (customize-set-value 'mime-view-buttons-visible (not mime-view-buttons-visible)) (wl-message-buffer-cache-clean-up) (wl-summary-redisplay)) (require 'product) (product-provide (provide 'wl-summary) (require 'wl-version)) ;;; wl-summary.el ends here wanderlust-wanderlust-769699d/wl/wl-template.el000066400000000000000000000161001406661363500216020ustar00rootroot00000000000000;;; wl-template.el --- Draft template feature for Wanderlust. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000 Masahiro MURATA ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Author: Masahiro MURATA ;; Keywords: mail, net news ;; This file is part of Wanderlust (Yet Another Message Interface on Emacsen). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;;; Code: ;; (require 'elmo-util) (require 'wl-vars) (require 'wl-highlight) (provide 'wl-template) ;; Variables (defvar wl-template-default-name "default") (defvar wl-template-buffer-name "*WL-Template*") (defvar wl-template-mode-map nil) (defvar wl-template nil) (defvar wl-template-cur-num 0) (defvar wl-template-max-num 0) (defvar wl-template-draft-buffer nil) (defvar wl-template-preview nil) ;;; Code (if wl-template-mode-map nil (setq wl-template-mode-map (make-sparse-keymap)) (define-key wl-template-mode-map "p" 'wl-template-prev) (define-key wl-template-mode-map "n" 'wl-template-next) (define-key wl-template-mode-map "q" 'wl-template-abort) (define-key wl-template-mode-map "\r" 'wl-template-set) (define-key wl-template-mode-map "\n" 'wl-template-set)) (defun wl-template-preview-p () "Return non-nil when preview template." wl-template-preview) (defun wl-template-mode () "Major mode for Wanderlust template. See info under Wanderlust for full documentation. \\{wl-template-mode} Entering WL-Template mode calls the value of `wl-template-mode-hook'." (kill-all-local-variables) (setq mode-name "Wl-Template" major-mode 'wl-template-mode) (use-local-map wl-template-mode-map) (setq buffer-read-only t) (run-hooks 'wl-template-mode-hook)) (defun wl-template-select (&optional arg) "Select template from `wl-template-alist'." (interactive "P") (unless wl-template-alist (error "Please set `wl-template-alist'")) (if (not (if arg (not wl-template-visible-select) wl-template-visible-select)) (wl-template-apply (completing-read (format "Template (%s): " wl-template-default-name) wl-template-alist)) (let* ((begin wl-template-default-name) (work wl-template-alist)) (if (and begin (cdr (assoc begin wl-template-alist))) (while (not (string= (car (car work)) begin)) (setq wl-template-cur-num (1+ wl-template-cur-num)) (setq work (cdr work)))) (setq wl-template nil wl-template-cur-num 0 wl-template-max-num (length wl-template-alist)) (setq wl-template-draft-buffer (current-buffer)) (if (get-buffer-window wl-template-buffer-name) (select-window (get-buffer-window wl-template-buffer-name)) (let* ((cur-win (selected-window)) (size (min (- (window-height cur-win) window-min-height 1) (- (window-height cur-win) (max window-min-height (1+ wl-template-buffer-lines)))))) (split-window cur-win (if (> size 0) size window-min-height)) ;; goto the bottom of the two... (select-window (next-window)) ;; make it display... (let ((pop-up-windows nil)) (switch-to-buffer (get-buffer-create wl-template-buffer-name))))) (set-buffer wl-template-buffer-name) (wl-template-mode) (wl-template-show)))) (defun wl-template-show (&optional _arg) "Show reference INDEX in `wl-template-alist'. ARG is ignored." ; ARG ignored this version (?) (with-current-buffer wl-template-buffer-name (let ((buffer-read-only nil) (wl-template-preview t) (mail-header-separator "--header separator--")) (erase-buffer) (goto-char (point-min)) (wl-template-insert (setq wl-template (car (nth wl-template-cur-num wl-template-alist))) mail-header-separator) (wl-highlight-message (point-min) (point-max) t) (when wl-highlight-x-face-function (funcall wl-highlight-x-face-function (point-min) (re-search-forward mail-header-separator nil t))) (setq mode-line-process (concat ":" wl-template)) (set-buffer-modified-p nil)))) (defun wl-template-next () "Display next reference in other buffer." (interactive) (if (= wl-template-max-num (setq wl-template-cur-num (1+ wl-template-cur-num))) (setq wl-template-cur-num 0)) (wl-template-show)) (defun wl-template-prev () "Display previous reference in other buffer." (interactive) (setq wl-template-cur-num (if (zerop wl-template-cur-num) (1- wl-template-max-num) (1- wl-template-cur-num))) (wl-template-show)) (defun wl-template-insert (name &optional mail-header) "Insert NAME template. Set header-separator is MAIL-HEADER." (let ((template (cdr (assoc name wl-template-alist))) (mail-header-separator (or mail-header mail-header-separator))) (when template (if mail-header (insert mail-header-separator "\n")) (wl-draft-config-exec-sub template)))) (require 'wl-draft) (defun wl-template-apply (name) "Apply NAME template to draft." (let (template wl-draft-real-time-highlight) (when name (if (string= name "") (setq name wl-template-default-name)) (when (setq template (cdr (assoc name wl-template-alist))) (save-excursion (setq wl-draft-config-variables (elmo-uniq-list (nconc wl-draft-config-variables (save-excursion (wl-draft-config-exec-sub template))))) ;; rehighlight (if wl-highlight-body-too (let ((beg (point-min)) (end (point-max))) (put-text-property beg end 'face nil) (wl-highlight-message beg end t)))))))) (defun wl-template-abort () "Exit from electric reference mode without inserting reference." (interactive) (setq wl-template nil) (delete-window) (kill-buffer wl-template-buffer-name) (when (buffer-live-p wl-template-draft-buffer) (set-buffer wl-template-draft-buffer) (let ((win (get-buffer-window wl-template-draft-buffer))) (if win (select-window win))))) (defun wl-template-set () "Exit from electric reference mode and insert selected reference." (interactive) (if (and wl-template-confirm (not (y-or-n-p "Are you sure ? "))) (message "") (delete-window) (kill-buffer wl-template-buffer-name) (when (buffer-live-p wl-template-draft-buffer) (set-buffer wl-template-draft-buffer) (wl-template-apply wl-template) (let ((win (get-buffer-window wl-template-draft-buffer))) (if win (select-window win)))))) (require 'product) (product-provide (provide 'wl-template) (require 'wl-version)) ;;; wl-template.el ends here wanderlust-wanderlust-769699d/wl/wl-thread.el000066400000000000000000001150461406661363500212470ustar00rootroot00000000000000;;; wl-thread.el --- Thread display modules for Wanderlust. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Copyright (C) 1998,1999,2000 Masahiro MURATA ;; Author: Yuuichi Teranishi ;; Masahiro MURATA ;; Keywords: mail, net news ;; This file is part of Wanderlust (Yet Another Message Interface on Emacsen). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'wl-action) (require 'wl-summary) (require 'wl-highlight) (require 'cl-lib) ;; buffer local variables. ;;(defvar wl-thread-top-entity '(nil t nil nil)) ; top entity (defvar wl-thread-tops nil) ; top number list (number) (defvar wl-thread-entities nil) (defvar wl-thread-entity-list nil) ; entity list (defvar wl-thread-entity-hashtb nil) ; obarray (make-variable-buffer-local 'wl-thread-entity-hashtb) (make-variable-buffer-local 'wl-thread-entities) ; ".wl-thread-entity" (make-variable-buffer-local 'wl-thread-entity-list) ; ".wl-thread-entity-list" ;;; global flag (defvar wl-thread-insert-force-opened nil) ;;;;;; each entity is (number opened-or-not children parent) ;;;;;;; (defsubst wl-thread-entity-get-number (entity) (car entity)) (defsubst wl-thread-entity-get-opened (entity) (nth 1 entity)) (defsubst wl-thread-entity-get-children (entity) (nth 2 entity)) (defsubst wl-thread-entity-get-parent (entity) (nth 3 entity)) (defsubst wl-thread-entity-get-linked (entity) (nth 4 entity)) (defsubst wl-thread-create-entity (num parent &optional opened linked) (list num (or opened wl-thread-insert-opened) nil parent linked)) (defsubst wl-thread-set-entity (entity) (elmo-set-hash-val (format "#%d" (wl-thread-entity-get-number entity)) entity wl-thread-entity-hashtb)) (defsubst wl-thread-get-entity (num) (and num (elmo-get-hash-val (format "#%d" num) wl-thread-entity-hashtb))) (defsubst wl-thread-entity-set-parent (entity parent) (setcar (cl-cdddr entity) parent) entity) (defsubst wl-thread-entity-set-children (entity children) (setcar (cddr entity) children)) (defsubst wl-thread-entity-set-linked (entity linked) (if (cl-cddddr entity) (setcar (cl-cddddr entity) linked) (nconc entity (list linked))) entity) (defsubst wl-thread-reparent-children (children parent) (let (entity) (dolist (child children) (when (setq entity (wl-thread-get-entity child)) (wl-thread-entity-set-parent entity parent) (wl-thread-entity-set-linked entity t))))) (defsubst wl-thread-entity-insert-as-top (entity) (when (and entity (wl-thread-entity-get-number entity)) (if (eq wl-summary-order 'descending) (setq wl-thread-entity-list (cons (car entity) wl-thread-entity-list)) (wl-append wl-thread-entity-list (list (car entity)))) (setq wl-thread-entities (cons entity wl-thread-entities)) (setq wl-summary-buffer-number-list (if (eq wl-summary-order 'descending) (cons (wl-thread-entity-get-number entity) wl-summary-buffer-number-list) (nconc wl-summary-buffer-number-list (list (wl-thread-entity-get-number entity))))) (wl-thread-set-entity entity))) (defsubst wl-thread-entity-insert-as-children (to entity) (let ((children (wl-thread-entity-get-children to)) curp curc) (setq curp to) (elmo-list-insert wl-summary-buffer-number-list (wl-thread-entity-get-number entity) (progn (while (setq curc (wl-thread-entity-get-children curp)) (setq curp (wl-thread-get-entity (car (last curc))))) (wl-thread-entity-get-number curp))) (wl-thread-entity-set-children to (wl-append children (list (wl-thread-entity-get-number entity)))) (setq wl-thread-entities (cons entity wl-thread-entities)) (wl-thread-set-entity entity))) (defsubst wl-thread-entity-set-opened (entity opened) (setcar (cdr entity) opened)) (defsubst wl-thread-entity-get-children-num (entity) (let (children ret-val msgs-stack (msgs (list (wl-thread-entity-get-number entity)))) (while msgs (setq msgs (cdr msgs)) (setq children (wl-thread-entity-get-children entity)) (if (null children) (while (and (null msgs) msgs-stack) (setq msgs (wl-pop msgs-stack))) (setq ret-val (+ (or ret-val 0) (length children))) (wl-push msgs msgs-stack) (setq msgs children)) (setq entity (wl-thread-get-entity (car msgs)))) ret-val)) (defun wl-thread-entity-get-descendant (entity) (let (children ret-val msgs-stack (msgs (list (wl-thread-entity-get-number entity)))) (while msgs (setq msgs (cdr msgs)) (setq children (wl-thread-entity-get-children entity)) (if (null children) (while (and (null msgs) msgs-stack) (setq msgs (wl-pop msgs-stack))) (setq ret-val (nconc ret-val (copy-sequence children))) (wl-push msgs msgs-stack) (setq msgs children)) (setq entity (wl-thread-get-entity (car msgs)))) ret-val)) (defsubst wl-thread-entity-get-parent-entity (entity) (wl-thread-get-entity (wl-thread-entity-get-parent entity))) (defun wl-thread-entity-get-top-entity (entity) (let ((cur-entity entity) p-num) (while (setq p-num (wl-thread-entity-get-parent cur-entity)) (setq cur-entity (wl-thread-get-entity p-num))) cur-entity)) (defun wl-thread-resume-entity (fld) (let (entities top-list) (setq entities (wl-summary-load-file-object (expand-file-name wl-thread-entity-file (elmo-folder-msgdb-path fld)))) (setq top-list (wl-summary-load-file-object (expand-file-name wl-thread-entity-list-file (elmo-folder-msgdb-path fld)))) (message "Resuming thread structure...") ;; set obarray value. (setq wl-thread-entity-hashtb (elmo-make-hash (* (length entities) 2))) ;; set buffer local variables. (setq wl-thread-entities entities) (setq wl-thread-entity-list top-list) (mapc 'wl-thread-set-entity entities) (wl-thread-make-number-list) (message "Resuming thread structure...done"))) (defun wl-thread-make-number-list () "Make `wl-summary-buffer-number-list', a list of message numbers." (if wl-thread-entity-list (let* ((node (wl-thread-get-entity (car wl-thread-entity-list))) (children (wl-thread-entity-get-children node)) parent sibling) (setq wl-summary-buffer-number-list (list (car wl-thread-entity-list))) (while children (wl-thread-entity-make-number-list-from-children (wl-thread-get-entity (car children))) (setq children (cdr children))) (while node (setq parent (wl-thread-entity-get-parent-entity node) sibling (wl-thread-entity-get-younger-brothers node parent)) (while sibling (wl-thread-entity-make-number-list-from-children (wl-thread-get-entity (car sibling))) (setq sibling (cdr sibling))) (setq node parent)) (setq wl-summary-buffer-number-list (nreverse wl-summary-buffer-number-list))) (setq wl-summary-buffer-number-list nil))) (defun wl-thread-entity-make-number-list-from-children (entity) (let ((msgs (list (wl-thread-entity-get-number entity))) msgs-stack children) (while (and msgs entity) (setq wl-summary-buffer-number-list (cons (wl-thread-entity-get-number entity) wl-summary-buffer-number-list)) (setq msgs (cdr msgs)) (setq children (wl-thread-entity-get-children entity)) (if children (progn (wl-push msgs msgs-stack) (setq msgs children)) (unless msgs (while (and (null msgs) msgs-stack) (setq msgs (wl-pop msgs-stack))))) (setq entity (wl-thread-get-entity (car msgs)))))) (defun wl-thread-save-entity (dir) (wl-thread-save-entities dir) (wl-thread-save-top-list dir)) (defun wl-thread-save-top-list (dir) (let ((top-file (expand-file-name wl-thread-entity-list-file dir)) (entity wl-thread-entity-list) print-length) (with-temp-buffer (when (file-writable-p top-file) (prin1 entity (current-buffer)) (princ "\n" (current-buffer)) (write-region (point-min) (point-max) top-file nil 'no-msg))))) (defun wl-thread-save-entities (dir) (let ((top-file (expand-file-name wl-thread-entity-file dir)) (entities wl-thread-entities) print-length print-level) (with-temp-buffer (when (file-writable-p top-file) (prin1 entities (current-buffer)) (princ "\n" (current-buffer)) (write-region (point-min) (point-max) top-file nil 'no-msg))))) (defun wl-thread-entity-parent-invisible-p (entity) "If parent of ENTITY is invisible, the top invisible ancestor entity of ENTITY is returned." (let ((cur-entity entity) top) (catch 'done (while (setq cur-entity (wl-thread-entity-get-parent-entity cur-entity)) (if (null (wl-thread-entity-get-number cur-entity)) (throw 'done nil) (when (not (wl-thread-entity-get-opened cur-entity)) (setq top cur-entity))))) top)) (defun wl-thread-entity-get-nearly-older-brother (entity &optional parent) (let ((brothers (wl-thread-entity-get-older-brothers entity parent))) (when brothers (car (last brothers))))) (defun wl-thread-entity-get-older-brothers (entity &optional parent) (let ((parent (or parent (wl-thread-entity-get-parent-entity entity))) brothers ret-val) (if parent (setq brothers (wl-thread-entity-get-children parent)) (setq brothers wl-thread-entity-list)) (while (and brothers (not (eq (wl-thread-entity-get-number entity) (car brothers)))) (wl-append ret-val (list (car brothers))) (setq brothers (cdr brothers))) ret-val)) (defun wl-thread-entity-get-younger-brothers (entity &optional parent) (let* ((parent (or parent (wl-thread-entity-get-parent-entity entity))) (brothers (wl-thread-entity-get-children parent))) (if parent (cdr (memq (wl-thread-entity-get-number entity) brothers)) ;; top!! (cdr (memq (wl-thread-entity-get-number entity) wl-thread-entity-list))))) (defun wl-thread-jump-to-msg (&optional number) "Jump to the message with specified number in the current summary." (interactive) (unless number (setq number (elmo-read-number "Jump to Message(No.): " 0))) (wl-thread-entity-force-open (wl-thread-get-entity number)) (wl-summary-jump-to-msg number)) (defun wl-thread-close-all () "Close all top threads." (interactive) (elmo-with-progress-display (wl-thread-close-all (length wl-thread-entity-list)) "Closing all threads" (save-excursion (dolist (entity wl-thread-entity-list) (when (and (wl-thread-entity-get-opened (wl-thread-get-entity entity)) (wl-thread-entity-get-children (wl-thread-get-entity entity))) (wl-summary-jump-to-msg entity) (wl-thread-open-close)) (elmo-progress-notify 'wl-thread-close-all))))) (defun wl-thread-open-all () "Open all threads." (interactive) (elmo-with-progress-display (wl-thread-open-all (count-lines (point-min) (point-max))) "Opening all threads" (save-excursion (goto-char (point-min)) (while (not (eobp)) (if (wl-thread-entity-get-opened (wl-thread-get-entity (wl-summary-message-number))) (forward-line) (wl-thread-force-open) (wl-thread-goto-bottom-of-sub-thread)) (elmo-progress-notify 'wl-thread-open-all))))) (defun wl-thread-open-all-unread () (interactive) (dolist (number (elmo-folder-list-flagged wl-summary-buffer-elmo-folder 'digest 'in-msgdb)) (wl-thread-entity-force-open (wl-thread-get-entity number)))) (defsubst wl-thread-maybe-get-children-num (msg) (let ((entity (wl-thread-get-entity msg))) (if (not (wl-thread-entity-get-opened entity)) (wl-thread-entity-get-children-num entity)))) (defun wl-thread-get-depth-of-current-line () (let ((entity (wl-thread-get-entity (wl-summary-message-number))) (depth 0) number) (while (setq number (wl-thread-entity-get-parent entity)) (cl-incf depth) (setq entity (wl-thread-get-entity number))) depth)) (defsubst wl-thread-make-indent-string (entity) (let ((cur entity) (ret-val "") (space-str (wl-repeat-string wl-thread-space-str-internal (1- wl-thread-indent-level-internal))) parent) (when (wl-thread-entity-get-number (setq parent (wl-thread-entity-get-parent-entity cur))) (if (wl-thread-entity-get-younger-brothers cur) (setq ret-val wl-thread-have-younger-brother-str-internal) (setq ret-val wl-thread-youngest-child-str-internal)) (setq ret-val (concat ret-val (wl-repeat-string wl-thread-horizontal-str-internal (1- wl-thread-indent-level-internal)))) (setq cur parent) (while (wl-thread-entity-get-number (wl-thread-entity-get-parent-entity cur)) (if (wl-thread-entity-get-younger-brothers cur) (setq ret-val (concat wl-thread-vertical-str-internal space-str ret-val)) (setq ret-val (concat wl-thread-space-str-internal space-str ret-val))) (setq cur (wl-thread-entity-get-parent-entity cur)))) ret-val)) (defsubst wl-thread-update-line-on-buffer-sub (entity msg &optional parent-msg) (let* ((entity (or entity (wl-thread-get-entity msg))) (parent-msg (or parent-msg (wl-thread-entity-get-parent entity))) (buffer-read-only nil) (inhibit-read-only t) message-entity temp-mark invisible-top) (if (wl-thread-delete-line-from-buffer msg) (progn (cond ((memq msg wl-summary-buffer-target-mark-list) (setq temp-mark "*")) ((setq temp-mark (wl-summary-registered-temp-mark msg)) (setq temp-mark (nth 1 temp-mark))) (t (setq temp-mark (wl-summary-get-score-mark msg)))) (when (setq message-entity (elmo-message-entity wl-summary-buffer-elmo-folder msg)) (wl-summary-insert-line (wl-summary-create-line message-entity (elmo-message-entity wl-summary-buffer-elmo-folder parent-msg) temp-mark (elmo-message-status wl-summary-buffer-elmo-folder msg) (if wl-thread-insert-force-opened nil (wl-thread-maybe-get-children-num msg)) (wl-thread-make-indent-string entity) (wl-thread-entity-get-linked entity))))) ;; insert thread (moving thread) (if (not (setq invisible-top (wl-thread-entity-parent-invisible-p entity))) (wl-summary-update-thread (elmo-message-entity wl-summary-buffer-elmo-folder msg) entity (and parent-msg (elmo-message-entity wl-summary-buffer-elmo-folder parent-msg))) ;; currently invisible.. update closed line. (wl-thread-update-children-number invisible-top))))) (defun wl-thread-update-line-on-buffer (&optional msg parent-msg updates) (interactive) (let ((msgs (list (or msg (wl-summary-message-number)))) entity children msgs-stack) (while msgs (setq msg (wl-pop msgs)) (setq updates (and updates (delete msg updates))) (setq entity (wl-thread-get-entity msg)) (wl-thread-update-line-on-buffer-sub entity msg parent-msg) ;; (setq children (wl-thread-entity-get-children entity)) (if children ;; update children (when (wl-thread-entity-get-opened entity) (wl-push msgs msgs-stack) (setq parent-msg msg msgs children)) (unless msgs (while (and (null msgs) msgs-stack) (setq msgs (wl-pop msgs-stack))) (when msgs (setq parent-msg (wl-thread-entity-get-number (wl-thread-entity-get-parent-entity (wl-thread-get-entity (car msgs))))))))) updates)) (defun wl-thread-update-line-msgs (msgs) (wl-delete-all-overlays) (dolist (message msgs) (wl-thread-update-line-on-buffer-sub nil message) (elmo-progress-notify 'wl-thread-update-line))) (defun wl-thread-update-indent-string-region (beg end) (interactive "r") (save-excursion (goto-char beg) (while (< (point) end) (save-excursion (wl-thread-update-line-on-buffer-sub nil (wl-summary-message-number))) (forward-line)))) (defun wl-thread-delete-line-from-buffer (msg) "Simply delete msg line." (when (wl-summary-jump-to-msg msg) (let ((beg (point))) (forward-line) (delete-region beg (point))) t)) (defun wl-thread-cleanup-symbols (msgs) (let (entity) (dolist (msg msgs) (when (setq entity (wl-thread-get-entity msg)) ;; delete entity. (setq wl-thread-entities (delq entity wl-thread-entities)) ;; free symbol. (elmo-clear-hash-val (format "#%d" msg) wl-thread-entity-hashtb))))) (defun wl-thread-get-exist-children (msg &optional include-self) (let ((msgs (list msg)) msgs-stack children ret-val) (while msgs (setq children (wl-thread-entity-get-children (wl-thread-get-entity (car msgs)))) (when (elmo-message-entity wl-summary-buffer-elmo-folder (car msgs)) (wl-append ret-val (list (car msgs))) (setq children nil)) (setq msgs (cdr msgs)) (if (null children) (while (and (null msgs) msgs-stack) (setq msgs (wl-pop msgs-stack))) (wl-push msgs msgs-stack) (setq msgs children))) (unless include-self (setq ret-val (delq msg ret-val))) ret-val)) (defsubst wl-thread-get-children-msgs (msg &optional visible-only) (let ((msgs (list msg)) msgs-stack children entity ret-val) (while msgs (wl-append ret-val (list (car msgs))) (setq children (wl-thread-entity-get-children (setq entity (wl-thread-get-entity (car msgs))))) (if (and visible-only (not (wl-thread-entity-get-opened entity))) (setq children nil)) (setq msgs (cdr msgs)) (if (null children) (while (and (null msgs) msgs-stack) (setq msgs (wl-pop msgs-stack))) (wl-push msgs msgs-stack) (setq msgs children))) ret-val)) (defun wl-thread-get-children-msgs-uncached (msg &optional uncached-marks) (let ((children-msgs (wl-thread-get-children-msgs msg)) mark uncached-list) (while children-msgs (if (and (not (eq msg (car children-msgs))) ; except itself (or (and uncached-marks (setq mark (wl-summary-message-mark wl-summary-buffer-elmo-folder (car children-msgs))) (member mark uncached-marks)) (and (not uncached-marks) (null (elmo-file-cache-exists-p (elmo-message-field wl-summary-buffer-elmo-folder (car children-msgs) 'message-id)))))) (wl-append uncached-list (list (car children-msgs)))) (setq children-msgs (cdr children-msgs))) uncached-list)) (defun wl-thread-get-children-msgs-with-mark (msg mark) (let ((children-msgs (wl-thread-get-children-msgs msg)) (check-func (cond ((string= mark "o") 'wl-summary-msg-marked-as-refiled) ((string= mark "O") 'wl-summary-msg-marked-as-copied) ((string= mark "D") 'wl-summary-msg-marked-as-deleted) ((string= mark "*") 'wl-summary-msg-marked-as-target))) ret-val) (while children-msgs (if (funcall check-func (car children-msgs)) (wl-append ret-val (list (car children-msgs)))) (setq children-msgs (cdr children-msgs))) ret-val)) (defun wl-thread-delete-message (msg &optional deep update) "Delete MSG from entity and buffer." (save-excursion (let ((entity (wl-thread-get-entity msg)) top-child top-entity update-msgs invisible-top) (setq wl-summary-buffer-number-list (delq msg wl-summary-buffer-number-list)) (when entity (when deep (setq wl-summary-buffer-number-list (elmo-list-delete (wl-thread-entity-get-descendant entity) wl-summary-buffer-number-list #'delq))) (let ((parent (wl-thread-entity-get-parent-entity entity))) (if parent ;; has parent. (let (children (older-brothers (wl-thread-entity-get-older-brothers entity parent)) (younger-brothers (wl-thread-entity-get-younger-brothers entity parent))) (unless deep (setq children (wl-thread-entity-get-children entity)) (wl-thread-reparent-children children (wl-thread-entity-get-number parent)) (setq update-msgs (apply (function nconc) update-msgs (mapcar (lambda (message) (wl-thread-get-children-msgs message t)) children)))) (wl-thread-entity-set-children parent (append older-brothers children younger-brothers)) ;; If chidren and younger-brothers do not exist, ;; update nearly older brother. (when (and older-brothers (not younger-brothers) (not children)) (wl-append update-msgs (wl-thread-get-children-msgs (car (last older-brothers)))))) ;; top...oldest child becomes top. (unless deep (let ((children (wl-thread-entity-get-children entity))) (when children (setq top-child (car children) children (cdr children)) (setq top-entity (wl-thread-get-entity top-child)) (wl-thread-entity-set-parent top-entity nil) (wl-thread-entity-set-linked top-entity nil) (wl-append update-msgs (wl-thread-get-children-msgs top-child t))) (when children (wl-thread-entity-set-children top-entity (append (wl-thread-entity-get-children top-entity) children)) (wl-thread-reparent-children children top-child) (wl-append update-msgs children)))) ;; delete myself from top list. (let ((match (memq msg wl-thread-entity-list))) (when match (if top-child (setcar match top-child) (setq wl-thread-entity-list (delq msg wl-thread-entity-list)))))))) ;; (if deep ;; delete thread on buffer (when (wl-summary-jump-to-msg msg) (let ((beg (point))) (wl-thread-goto-bottom-of-sub-thread) (delete-region beg (point)))) ;; delete myself from buffer. (unless (wl-thread-delete-line-from-buffer msg) ;; jump to suitable point. ;; just upon the oldest younger-brother of my top. (setq invisible-top (car (wl-thread-entity-parent-invisible-p entity))) (if invisible-top (progn (wl-append update-msgs (list invisible-top)) (wl-summary-jump-to-msg invisible-top)) (goto-char (point-max)))) ;; insert children if thread is closed or delete top. (when (or top-child (not (wl-thread-entity-get-opened entity))) (let (next-top insert-msgs ent grandchildren) (if top-child (progn (setq insert-msgs (wl-thread-get-exist-children top-child 'include-self)) (setq next-top (car insert-msgs)) (setq ent (wl-thread-get-entity next-top)) (when (and (wl-thread-entity-get-opened entity) ;; open (not (wl-thread-entity-get-opened ent)) ;; close (setq grandchildren (wl-thread-entity-get-children ent)) (wl-summary-jump-to-msg next-top)) (forward-line) (setq insert-msgs (append (cdr insert-msgs) grandchildren))) (when top-entity (wl-thread-entity-set-opened top-entity t)) (when ent (wl-thread-entity-set-opened ent t))) (when (not invisible-top) (setq insert-msgs (wl-thread-get-exist-children msg)) ;; First msg always opened, because first msg maybe becomes top. (if (setq ent (wl-thread-get-entity (car insert-msgs))) (wl-thread-entity-set-opened ent t)))) ;; insert children (while insert-msgs ;; if no exists in summary, insert entity. (when (and (car insert-msgs) (not (wl-summary-jump-to-msg (car insert-msgs)))) (setq ent (wl-thread-get-entity (car insert-msgs))) (wl-thread-insert-entity 0 ; no mean now... ent entity nil)) (setq insert-msgs (cdr insert-msgs)))))) (if update ;; modify buffer. (while update-msgs (wl-thread-update-line-on-buffer-sub nil (pop update-msgs))) ;; don't update buffer update-msgs)))) ; return value (defun wl-thread-insert-message (message-entity msg parent-msg &optional update linked) "Insert MSG to the entity. When optional argument UPDATE is non-nil, Message is inserted to the summary buffer." (let ((parent (wl-thread-get-entity parent-msg)) child-entity invisible-top) ;;; Update the thread view...not implemented yet. ;;; (when force-insert ;;; (if parent ;;; (wl-thread-entity-force-open parent)) (when (and wl-summary-max-thread-depth parent) (let ((cur parent) (depth 0)) (while cur (cl-incf depth) (setq cur (wl-thread-entity-get-parent-entity cur))) (when (> depth wl-summary-max-thread-depth) (setq parent nil parent-msg nil)))) (if parent ;; insert as children. (wl-thread-entity-insert-as-children parent (setq child-entity (wl-thread-create-entity msg (wl-thread-entity-get-number parent) nil linked))) ;; insert as top message. (wl-thread-entity-insert-as-top (wl-thread-create-entity msg nil))) (if update (if (not (setq invisible-top (wl-thread-entity-parent-invisible-p child-entity))) ;; visible. (progn (wl-summary-update-thread message-entity child-entity (elmo-message-entity wl-summary-buffer-elmo-folder parent-msg)) (when parent ;; use thread structure. ;;; (wl-thread-entity-get-nearly-older-brother ;;; child-entity parent))) ; return value (wl-thread-entity-get-number parent))) ; return value ;;; (setq beg (point)) ;;; (wl-thread-goto-bottom-of-sub-thread) ;;; (wl-thread-update-indent-string-region beg (point))) ;; currently invisible.. update closed line. (wl-thread-update-children-number invisible-top) nil)))) ;;;(defun wl-thread-get-parent-list (msgs) ;;; ;; return ancestors ;;; (let* ((msgs2 msgs) ;;; myself) ;;; (while msgs2 ;;; (setq myself (car msgs2) ;;; msgs2 (cdr msgs2)) ;;; (while (not (eq myself (car msgs2))) ;;; (if (wl-thread-descendant-p myself (car msgs2)) ;;; (setq msgs (delq (car msgs2) msgs))) ;;; (setq msgs2 (or (cdr msgs2) msgs))) ;;; (setq msgs2 (cdr msgs2))) ;;; msgs)) (defun wl-thread-get-parent-list (msgs) ;; return connected ancestors (let (parent ret) (dolist (msg msgs) (setq parent (wl-thread-entity-get-parent (wl-thread-get-entity msg))) (when (or (not parent) (not (memq parent msgs))) (setq ret (cons msg ret)))) (nreverse ret))) (defun wl-thread-update-indent-string-thread (top-list) (let ((top-list (wl-thread-get-parent-list top-list)) beg) (elmo-with-progress-display (wl-thread-update-indent-string-thread (length top-list)) "Updating thread indent" (while top-list (when (car top-list) (wl-summary-jump-to-msg (car top-list)) (setq beg (point)) (wl-thread-goto-bottom-of-sub-thread) (wl-thread-update-indent-string-region beg (point))) (elmo-progress-notify 'wl-thread-update-indent-string-thread) (setq top-list (cdr top-list)))))) (defun wl-thread-update-children-number (entity) "Update the children number." (wl-thread-update-line-on-buffer (wl-thread-entity-get-number entity))) ;; ;; Thread oriented commands. ;; (defun wl-thread-call-region-func (func &optional arg) (save-excursion (if arg (wl-summary-goto-top-of-current-thread) (beginning-of-line)) (let ((beg (point))) (wl-thread-goto-bottom-of-sub-thread) (funcall func beg (point))))) (defun wl-thread-prefetch (&optional arg) (interactive "P") (wl-thread-call-region-func 'wl-summary-prefetch-region arg)) (defun wl-thread-mark-as-read (&optional arg) (interactive "P") (wl-thread-call-region-func 'wl-summary-mark-as-read-region arg)) (defun wl-thread-mark-as-unread (&optional arg) (interactive "P") (wl-thread-call-region-func 'wl-summary-mark-as-unread-region arg)) (defun wl-thread-mark-as-important (&optional arg) (interactive "P") (wl-thread-call-region-func 'wl-summary-mark-as-important-region arg)) (defun wl-thread-set-flags (&optional arg) (interactive "P") (wl-thread-call-region-func 'wl-summary-set-flags-region arg)) (defun wl-thread-mark-as-answered (&optional arg) (interactive "P") (wl-thread-call-region-func 'wl-summary-mark-as-answered-region arg)) (defun wl-thread-recover-messages (&optional arg) "Recover killed messages which are contained current thread." (interactive "P") (wl-thread-call-region-func 'wl-summary-recover-messages-region arg)) (defun wl-thread-unmark (&optional arg) (interactive "P") (wl-thread-call-region-func 'wl-summary-unmark-region arg)) (defun wl-thread-exec (&optional arg) (interactive "P") (wl-thread-call-region-func 'wl-summary-exec-region arg)) (defun wl-thread-save (&optional arg) (interactive "P") (wl-thread-call-region-func 'wl-summary-save-region arg)) (defun wl-thread-force-open (&optional msg-num) "force open current folder" (when msg-num (wl-summary-jump-to-msg msg-num)) (wl-thread-open-close 'force-open)) (defun wl-thread-entity-force-open (entity) (let ((wl-thread-insert-force-opened t) notopen) (if (null (wl-thread-entity-get-parent entity)) ;; top!! (if (and (not (wl-thread-entity-get-opened entity)) (wl-thread-entity-get-children entity)) (wl-thread-force-open (wl-thread-entity-get-number entity))) (if (setq notopen (wl-thread-entity-parent-invisible-p entity)) (wl-thread-force-open (wl-thread-entity-get-number notopen)))))) (defun wl-thread-insert-top () (let ((len (length wl-thread-entity-list))) (elmo-with-progress-display (wl-thread-insert-entity len) "Inserting message" (wl-delete-all-overlays) (dolist (e wl-thread-entity-list) (wl-thread-insert-entity 0 (wl-thread-get-entity e) nil len) (elmo-progress-notify 'wl-thread-insert-entity))))) (defsubst wl-thread-insert-entity-sub (_indent entity parent-entity all) (let (msg-num message-entity temp-mark) (when (setq msg-num (wl-thread-entity-get-number entity)) (unless all ; all...means no temp-mark. (cond ((memq msg-num wl-summary-buffer-target-mark-list) (setq temp-mark "*")) ((setq temp-mark (wl-summary-registered-temp-mark msg-num)) (setq temp-mark (nth 1 temp-mark))))) (unless temp-mark (setq temp-mark (wl-summary-get-score-mark msg-num))) (setq message-entity (elmo-message-entity wl-summary-buffer-elmo-folder msg-num)) ;;; (wl-delete-all-overlays) (when message-entity (wl-summary-insert-line (wl-summary-create-line message-entity (elmo-message-entity wl-summary-buffer-elmo-folder (wl-thread-entity-get-number parent-entity)) temp-mark (elmo-message-status wl-summary-buffer-elmo-folder msg-num) (if wl-thread-insert-force-opened nil (wl-thread-maybe-get-children-num msg-num)) (wl-thread-make-indent-string entity) (wl-thread-entity-get-linked entity))))))) (defun wl-thread-insert-entity (indent entity parent-entity all) "Insert thread entity in current buffer." (let ((msgs (list (wl-thread-entity-get-number entity))) children msgs-stack) (while msgs (wl-thread-insert-entity-sub indent entity parent-entity all) (setq msgs (cdr msgs)) (setq children (wl-thread-entity-get-children entity)) (if children ;; insert children (when (or wl-thread-insert-force-opened (wl-thread-entity-get-opened entity)) (wl-thread-entity-set-opened entity t) (wl-push msgs msgs-stack) (setq msgs children indent (1+ indent) parent-entity entity))) (unless msgs (while (and (null msgs) msgs-stack) (setq msgs (wl-pop msgs-stack)) (setq indent (1- indent))) (when msgs (setq entity (wl-thread-get-entity (car msgs))) (setq parent-entity (wl-thread-entity-get-parent-entity entity)))) (setq entity (wl-thread-get-entity (car msgs)))))) (defun wl-thread-descendant-p (mynumber number) (let ((cur (wl-thread-get-entity number)) num) (catch 'done (while cur (setq cur (wl-thread-entity-get-parent-entity cur)) (if (null (setq num (wl-thread-entity-get-number cur))) ; top! (throw 'done nil)) (if (and num (eq mynumber (wl-thread-entity-get-number cur))) (throw 'done t))) nil))) ;;;(defun wl-thread-goto-bottom-of-sub-thread () ;;; (interactive) ;;; (let ((depth (wl-thread-get-depth-of-current-line))) ;;; (forward-line) ;;; (while (and (not (eobp)) ;;; (> (wl-thread-get-depth-of-current-line) ;;; depth)) ;;; (forward-line)) ;;; (beginning-of-line))) (defun wl-thread-goto-bottom-of-sub-thread (&optional msg) (interactive) (let ((mynumber (or msg (wl-summary-message-number)))) (forward-line) (while (wl-thread-descendant-p mynumber (wl-summary-message-number)) (forward-line)) (beginning-of-line))) (defun wl-thread-remove-argument-region (beg end) (save-excursion (save-restriction (narrow-to-region beg end) (goto-char (point-min)) (while (not (eobp)) (wl-summary-remove-argument) (forward-line))))) (defun wl-thread-print-argument-region (beg end) (if wl-summary-buffer-temp-mark-list (save-excursion (save-restriction (narrow-to-region beg end) (goto-char (point-min)) (while (not (eobp)) (let ((num (wl-summary-message-number)) temp-mark pair) (when (and (setq temp-mark (wl-summary-registered-temp-mark num)) (nth 2 temp-mark) (setq pair (cons (nth 0 temp-mark)(nth 2 temp-mark)))) (wl-summary-print-argument (car pair) (cdr pair)))) (forward-line)))))) (defun wl-thread-close (entity) (let (depth beg) (wl-thread-entity-set-opened entity nil) (setq depth (wl-thread-get-depth-of-current-line)) (setq beg (point-at-bol)) (wl-thread-goto-bottom-of-sub-thread) (wl-thread-remove-argument-region beg (point)) (backward-char) ;; needed for mouse-face. (delete-region beg (point)) (wl-thread-insert-entity (1- depth) entity (wl-thread-get-entity (wl-thread-entity-get-parent entity)) nil) (delete-char 1) ; delete '\n' (wl-thread-print-argument-region beg (point)))) (defun wl-thread-close-children (&optional number) (interactive) (when (eq wl-summary-buffer-view 'thread) (setq number (or number (wl-summary-message-number))) (save-excursion (let ((inhibit-read-only t) (entity (wl-thread-get-entity number))) (when (wl-thread-entity-get-opened entity) (wl-thread-close entity)))))) (defun wl-thread-open (entity) (let (depth beg) (setq beg (point-at-bol)) (setq depth (wl-thread-get-depth-of-current-line)) (delete-region (point-at-bol) (point-at-eol)) (wl-thread-entity-set-opened entity t) (wl-thread-insert-entity depth ;(- depth 1) entity (wl-thread-get-entity (wl-thread-entity-get-parent entity)) nil) (delete-char 1) ; delete '\n' (wl-thread-print-argument-region beg (point)))) (defun wl-thread-open-children (&optional number) (interactive) (when (eq wl-summary-buffer-view 'thread) (setq number (or number (wl-summary-message-number))) (save-excursion (let ((inhibit-read-only t) (entity (wl-thread-get-entity number))) (unless (wl-thread-entity-get-opened entity) (wl-thread-open entity)))))) (defun wl-thread-open-close (&optional force-open) (interactive "P") (when (eq wl-summary-buffer-view 'thread) ;;; (if (equal wl-thread-top-entity '(nil t nil nil)) ;;; (error "There's no thread structure")) (save-excursion (let ((inhibit-read-only t) (buffer-read-only nil) (wl-thread-insert-force-opened (or wl-thread-insert-force-opened force-open)) msg entity parent) (setq msg (wl-summary-message-number)) (setq entity (wl-thread-get-entity msg)) (if (wl-thread-entity-get-opened entity) ;; if already opened, close its child! (if (wl-thread-entity-get-children entity) (wl-thread-close entity) ;; opened, but has no children, close its parent! (when (setq parent (wl-thread-entity-get-parent entity)) (wl-summary-jump-to-msg parent) (wl-thread-close (wl-thread-get-entity (wl-summary-message-number))))) ;; if closed (or it is just a thread bottom message) ;; has children, open it! (if (wl-thread-entity-get-children entity) (wl-thread-open entity) ;; closed, and has no children, close its parent! (setq msg (or (wl-thread-entity-get-parent entity) (wl-thread-entity-get-number entity))) (when msg (wl-summary-jump-to-msg msg) (wl-thread-close (wl-thread-get-entity (wl-summary-message-number))))))) (if (and wl-summary-highlight wl-summary-lazy-highlight) (wl-highlight-summary-window) (wl-summary-selective-display-window)) (wl-summary-set-message-modified) (set-buffer-modified-p nil)))) (defun wl-thread-set-parent (&optional parent-number) "Set current message's parent interactively." (interactive) (let ((number (wl-summary-message-number)) (dst-parent (if (called-interactively-p 'interactive) (read-from-minibuffer "Parent Message (No.): "))) entity dst-parent-entity children update-msgs buffer-read-only) (if (string= dst-parent "") (setq dst-parent nil) (if (called-interactively-p 'interactive) (setq dst-parent (string-to-number dst-parent)) (setq dst-parent parent-number))) (if (and dst-parent (memq dst-parent (wl-thread-get-children-msgs number))) (error "Parent is children or myself")) (setq entity (wl-thread-get-entity number)) (when (and number entity) ;; delete thread (setq update-msgs (wl-thread-delete-message number 'deep)) ;; insert as child at new parent (setq dst-parent-entity (wl-thread-get-entity dst-parent)) (if dst-parent-entity (progn (if (setq children (wl-thread-entity-get-children dst-parent-entity)) (wl-append update-msgs (wl-thread-get-children-msgs (car (last children)) t))) (wl-thread-entity-set-children dst-parent-entity (append children (list number))) (wl-thread-entity-set-linked entity (let ((parent (elmo-message-entity-parent wl-summary-buffer-elmo-folder (elmo-message-entity wl-summary-buffer-elmo-folder number)))) (or (null parent) (/= parent-number (elmo-message-entity-number parent)))))) ;; insert as top (if (eq wl-summary-order 'descending) (setq wl-thread-entity-list (cons number wl-thread-entity-list)) (wl-append wl-thread-entity-list (list number))) (wl-thread-entity-set-linked entity nil)) ;; update my thread (wl-append update-msgs (wl-thread-get-children-msgs number t)) (setq update-msgs (elmo-uniq-list update-msgs)) (wl-thread-entity-set-parent entity dst-parent) ;; update thread on buffer (wl-thread-make-number-list) (wl-thread-update-line-msgs update-msgs)))) (require 'product) (product-provide (provide 'wl-thread) (require 'wl-version)) ;;; wl-thread.el ends here wanderlust-wanderlust-769699d/wl/wl-util.el000066400000000000000000001034231406661363500207510ustar00rootroot00000000000000;;; wl-util.el --- Utility modules for Wanderlust. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Copyright (C) 2000 A. SAGATA ;; Copyright (C) 2000 Katsumi Yamaoka ;; Author: Yuuichi Teranishi ;; A. SAGATA ;; Katsumi Yamaoka ;; Keywords: mail, net news ;; This file is part of Wanderlust (Yet Another Message Interface on Emacsen). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'bytecomp) (require 'elmo-util) (require 'elmo-flag) (require 'wl-vars) (require 'cl-lib) (require 'pp nil t) (provide 'wl-util) (defalias 'wl-set-work-buf 'elmo-set-work-buf) (make-obsolete 'wl-set-work-buf 'elmo-set-work-buf "03 Apr 2000 at latest") (defmacro wl-append (val func) (list 'if val (list 'nconc val func) (list 'setq val func))) (defalias 'wl-parse 'elmo-parse) (make-obsolete 'wl-parse 'elmo-parse "20 Feb 2001") (require 'wl-address) (defun wl-delete-duplicates (list &optional all hack-addresses) "Delete duplicate equivalent strings from the LIST. If ALL is t, then if there is more than one occurrence of a string in the LIST, then all occurrences of it are removed instead of just the subsequent ones. If HACK-ADDRESSES is t, then the strings are considered to be mail addresses, and only the address part is compared (so that \"Name \" and \"foo\" would be considered to be equivalent.)" (let ((hashtable (make-vector 29 0)) (new-list nil) sym-string sym) (while list (setq sym-string (if hack-addresses (wl-address-header-extract-address (car list)) (car list)) sym-string (or sym-string "-unparseable-garbage-") sym (intern sym-string hashtable)) (if (boundp sym) (and all (setcar (symbol-value sym) nil)) (setq new-list (cons (car list) new-list)) (set sym new-list)) (setq list (cdr list))) (delq nil (nreverse new-list)))) ;; string utils. (defalias 'wl-string-member 'elmo-string-member) (defalias 'wl-string-match-member 'elmo-string-match-member) (defalias 'wl-string-delete-match 'elmo-string-delete-match) (defalias 'wl-string-match-assoc 'elmo-string-match-assoc) (defalias 'wl-string-assoc 'elmo-string-assoc) (defalias 'wl-string-rassoc 'elmo-string-rassoc) (defalias 'wl-parse-addresses 'elmo-parse-addresses) (make-obsolete 'wl-string-member 'elmo-string-member "21 Sep 2000 at latest") (make-obsolete 'wl-string-match-member 'elmo-string-match-member "21 Sep 2000 at latest") (make-obsolete 'wl-string-delete-match 'elmo-string-delete-match "21 Sep 2000 at latest") (make-obsolete 'wl-string-match-assoc 'elmo-string-match-assoc "21 Sep 2000 at latest") (make-obsolete 'wl-string-assoc 'elmo-string-assoc "21 Sep 2000 at latest") (make-obsolete 'wl-string-rassoc 'elmo-string-rassoc "21 Sep 2000 at latest") (make-obsolete 'wl-parse-addresses 'elmo-parse-addresses "20 Mar 2005") (defun wl-append-element (list element) (if element (append list (list element)) list)) (defmacro wl-push (v l) "Insert V at the head of the list stored in L." (list 'setq l (list 'cons v l))) (defmacro wl-pop (l) "Remove the head of the list stored in L." (list 'car (list 'prog1 l (list 'setq l (list 'cdr l))))) (defun wl-read-event-char (&optional prompt) "Get the next event." (let ((event (read-event prompt))) (cons (and (numberp event) event) event))) (defun wl-ask-folder (func mes-string) (let* (key keve (cmd (string-to-char (format "%s" (this-command-keys))))) (message "%s" mes-string) (setq key (car (setq keve (wl-read-event-char)))) (if (or (equal key (string-to-char " ")) (and cmd (equal key cmd))) (progn (message "") (funcall func)) (wl-push (cdr keve) unread-command-events)))) (defun wl-require-update-all-folder-p (name) "Return non-nil if NAME is draft or queue folder." (or (string= name wl-draft-folder) (string= name wl-queue-folder))) ;;;(defalias 'wl-make-hash 'elmo-make-hash) ;;;(make-obsolete 'wl-make-hash 'elmo-make-hash) ;;;(defalias 'wl-get-hash-val 'elmo-get-hash-val) ;;;(make-obsolete 'wl-get-hash-val 'elmo-get-hash-val) ;;;(defalias 'wl-set-hash-val 'elmo-set-hash-val) ;;;(make-obsolete 'wl-set-hash-val 'elmo-set-hash-val) (defsubst wl-set-string-width (width string &optional padding ignore-invalid) "Make a new string which have specified WIDTH and content of STRING. `wl-invalid-character-message' is used when invalid character is contained. If WIDTH is negative number, padding chars are added to the head and otherwise, padding chars are added to the tail of the string. The optional 3rd arg PADDING, if non-nil, specifies a padding character to add the result instead of white space. If optional 4th argument is non-nil, don't use `wl-invalid-character-message' even when invalid character is contained." (if (> (string-width string) (abs width)) (setq string (truncate-string-to-width string (abs width)))) (if (= (string-width string) (abs width)) string (when (and (not ignore-invalid) (< (abs width) (string-width string))) (setq string (truncate-string-to-width wl-invalid-character-message (abs width)))) (let ((paddings (make-string (max 0 (- (abs width) (string-width string))) (or padding (string-to-char " "))))) (if (< width 0) (concat paddings string) (concat string paddings))))) (defun wl-mode-line-buffer-identification (&optional id) (let ((priorities '(biff plug title))) (let ((items (reverse wl-mode-line-display-priority-list)) item) (while items (setq item (car items) items (cdr items)) (unless (memq item '(biff plug)) (setq item 'title)) (setq priorities (cons item (delq item priorities))))) (let (priority result) (while priorities (setq priority (car priorities) priorities (cdr priorities)) (cond ((eq 'biff priority) (when wl-biff-check-folder-list (setq result (append result '((wl-modeline-biff-status wl-modeline-biff-state-on wl-modeline-biff-state-off)))))) ((eq 'plug priority) (when wl-show-plug-status-on-modeline (setq result (append result '((wl-modeline-plug-status wl-modeline-plug-state-on wl-modeline-plug-state-off)))))) (t (setq result (append result (or id '("Wanderlust: %12b"))))))) (prog1 (setq mode-line-buffer-identification (if (stringp (car result)) result (cons "" result))) (force-mode-line-update t))))) (defalias 'wl-display-error 'elmo-display-error) (make-obsolete 'wl-display-error 'elmo-display-error "03 Apr 2000 at latest") (defun wl-get-assoc-list-value (assoc-list folder &optional match) (catch 'found (let ((alist assoc-list) value pair) (while alist (setq pair (car alist)) (if (and (eq match 'function) (functionp (car pair))) (when (funcall (car pair) folder) (throw 'found (cdr pair))) (if (string-match (car pair) folder) (cond ((eq match 'all) (setq value (append value (list (cdr pair))))) ((eq match 'all-list) (setq value (append value (cdr pair)))) ((or (not match) (eq match 'function)) (throw 'found (cdr pair)))))) (setq alist (cdr alist))) value))) (make-obsolete 'wl-match-string 'match-string"11 Dec 2017") (make-obsolete 'wl-match-buffer 'elmo-match-buffer "11 Dec 2017") (put 'wl-as-coding-system 'lisp-indent-function 1) (put 'wl-as-mime-charset 'lisp-indent-function 1) (eval-and-compile (defmacro wl-as-coding-system (coding-system &rest body) `(let ((coding-system-for-read ,coding-system) (coding-system-for-write ,coding-system)) ,@body))) (defmacro wl-as-mime-charset (mime-charset &rest body) `(wl-as-coding-system (mime-charset-to-coding-system ,mime-charset) ,@body)) (defalias 'wl-string 'elmo-string) (make-obsolete 'wl-string 'elmo-string "03 Apr 2000 at latest") (defsubst wl-repeat-string (str times) (apply #'concat (make-list times str))) (defun wl-append-assoc-list (item value alist) "make assoc list '((item1 value1-1 value1-2 ...)) (item2 value2-1 ...)))" (let ((entry (assoc item alist))) (if entry (progn (when (not (member value (cdr entry))) (nconc entry (list value))) alist) (append alist (list (list item value)))))) (defun wl-delete-alist (key alist) "Delete by side effect any entries specified with KEY from ALIST. Return the modified ALIST. Key comparison is done with `assq'. Write `(setq foo (wl-delete-alist key foo))' to be sure of changing the value of `foo'." (let (entry) (while (setq entry (assq key alist)) (setq alist (delq entry alist))) alist)) (defun wl-delete-associations (keys alist) "Delete by side effect any entries specified with KEYS from ALIST. Return the modified ALIST. KEYS must be a list of keys for ALIST. Deletion is done with `wl-delete-alist'. Write `(setq foo (wl-delete-associations keys foo))' to be sure of changing the value of `foo'." (while keys (setq alist (wl-delete-alist (car keys) alist)) (setq keys (cdr keys))) alist) (defun wl-filter-associations (keys alist) (let (entry result) (while keys (when (setq entry (assq (car keys) alist)) (setq result (cons entry result))) (setq keys (cdr keys))) result)) (defun wl-inverse-alist (keys alist) "Inverse ALIST, copying. Return an association list represents the inverse mapping of ALIST, from objects to KEYS. The objects mapped (cdrs of elements of the ALIST) are shared." (let (x y tmp result) (while keys (setq x (car keys)) (setq y (cdr (assq x alist))) (if y (if (setq tmp (assoc y result)) (setq result (cons (append tmp (list x)) (delete tmp result))) (setq result (cons (list y x) result)))) (setq keys (cdr keys))) result)) (defsubst wl-get-date-iso8601 (date) (or (get-text-property 0 'wl-date date) (let* ((d1 (timezone-fix-time date nil nil)) (time (format "%04d%02d%02dT%02d%02d%02d" (aref d1 0) (aref d1 1) (aref d1 2) (aref d1 3) (aref d1 4) (aref d1 5)))) (put-text-property 0 1 'wl-date time date) time))) (defun wl-make-date-string (&optional time) (let ((system-time-locale "C")) (format-time-string "%a, %d %b %Y %T %z" time))) (defun wl-date-iso8601 (date) "Convert the DATE to YYMMDDTHHMMSS." (condition-case () (wl-get-date-iso8601 date) (error ""))) (defun wl-url-news (url &rest _args) (interactive "sURL: ") (if (string-match "^news:\\(.*\\)$" url) (wl-summary-goto-folder-subr (concat "-" (match-string 1 url)) nil nil nil t) (message "Not a news: url."))) (defun wl-url-nntp (url &rest _args) (interactive "sURL: ") (let (folder fld-name server port msg) (if (string-match "^nntp://\\([^:/]*\\):?\\([0-9]*\\)/\\([^/]*\\)/\\([0-9]*\\).*$" url) (progn (if (zerop (length (setq fld-name (match-string 3 url)))) (setq fld-name nil)) (if (zerop (length (setq port (match-string 2 url)))) (setq port (number-to-string elmo-nntp-default-port))) (if (zerop (length (setq server (match-string 1 url)))) (setq server elmo-nntp-default-server)) (setq folder (concat "-" fld-name "@" server ":" port)) (if (zerop (length (setq msg (match-string 4 url)))) (wl-summary-goto-folder-subr folder nil nil nil t) (wl-summary-goto-folder-subr folder 'update nil nil t) (wl-summary-jump-to-msg (string-to-number msg)) (wl-summary-redisplay))) (message "Not a nntp: url.")))) (defmacro wl-concat-list (list separator) `(mapconcat 'identity (delete "" (delq nil ,list)) ,separator)) (require 'wl-message) (require 'wl-summary) (defun wl-current-message-buffer () (when (buffer-live-p wl-current-summary-buffer) (with-current-buffer wl-current-summary-buffer (or wl-message-buffer (and (wl-summary-message-number) (wl-message-buffer-display wl-summary-buffer-elmo-folder (wl-summary-message-number) wl-summary-buffer-display-mime-mode nil nil)))))) (defun wl-kill-buffers (regexp) (mapc (lambda (x) (if (and (buffer-name x) (string-match regexp (buffer-name x))) (and (get-buffer x) (kill-buffer x)))) (buffer-list))) (defun wl-collect-summary () (let (result) (mapc (lambda (x) (if (and (string-match "^Summary" (buffer-name x)) (with-current-buffer x (eq major-mode 'wl-summary-mode))) (setq result (nconc result (list x))))) (buffer-list)) result)) (defun wl-collect-draft () (let ((draft-regexp (concat "^" (regexp-quote (if (memq 'modeline wl-use-folder-petname) (wl-folder-get-petname wl-draft-folder) wl-draft-folder)))) result) (dolist (buffer (buffer-list)) (when (with-current-buffer buffer (and (eq major-mode 'wl-draft-mode) (buffer-name) (string-match draft-regexp (buffer-name)))) (setq result (cons buffer result)))) (nreverse result))) (defvar wl-inhibit-save-drafts nil) (defvar wl-disable-auto-save nil) (make-variable-buffer-local 'wl-disable-auto-save) (defun wl-save-drafts () "Save all drafts. Return nil if there is no draft buffer." (if wl-inhibit-save-drafts 'inhibited (let ((wl-inhibit-save-drafts t) (msg (current-message)) (buffers (wl-collect-draft))) (save-excursion (dolist (buffer buffers) (set-buffer buffer) (when (and (not wl-disable-auto-save) (buffer-modified-p)) (wl-draft-save)))) (message "%s" (or msg "")) buffers))) (defun wl-read-directory-name (prompt dir) (read-directory-name prompt dir dir)) ;; local variable check. (defalias 'wl-local-variable-p 'local-variable-p) (make-obsolete 'wl-local-variable-p 'local-variable-p "24 May 2020") (defun wl-number-base36 (num len) (if (if (< len 0) (<= num 0) (= len 0)) "" (concat (wl-number-base36 (/ num 36) (1- len)) (list (aref "zyxwvutsrqponmlkjihgfedcba9876543210" (% num 36)))))) (defvar wl-unique-id-char nil) (defun wl-unique-id () ;; Don't use microseconds from (current-time), they may be unsupported. ;; Instead we use this randomly inited counter. (setq wl-unique-id-char (% (1+ (or wl-unique-id-char (logand (random t) (1- (lsh 1 20))))) ;; (current-time) returns 16-bit ints, ;; and 2^16*25 just fits into 4 digits i base 36. (* 25 25))) (let ((tm (current-time))) (concat (if (memq system-type '(ms-dos emx vax-vms)) (let ((user (downcase (user-login-name)))) (while (string-match "[^a-z0-9_]" user) (aset user (match-beginning 0) ?_)) user) (wl-number-base36 (user-uid) -1)) (wl-number-base36 (+ (car tm) (lsh (% wl-unique-id-char 25) 16)) 4) (wl-number-base36 (+ (nth 1 tm) (lsh (/ wl-unique-id-char 25) 16)) 4) ;; Append the name of the message interface, because while the ;; generated ID is unique to this newsreader, other newsreaders ;; might otherwise generate the same ID via another algorithm. wl-unique-id-suffix))) (defcustom wl-draft-make-message-id-from-address-delimiter "-" "A string between unique and addr-spec of Message-ID built from e-mail address. It should be consist of atext (described in RFC 5322)." :type 'string :group 'wl-draft) (defun wl-draft-make-message-id-from-address (string) (when (and (stringp string) (string-match "\\`\\(.+\\)@\\([^@]+\\)\\'" string)) (let ((local (match-string 1 string)) (domain (match-string 2 string))) (format "<%s%s%s@%s>" (wl-unique-id) wl-draft-make-message-id-from-address-delimiter (if wl-message-id-hash-function (concat wl-draft-make-message-id-from-address-delimiter (funcall wl-message-id-hash-function local)) local) domain)))) (defvar wl-message-id-function 'wl-draft-make-message-id-string) (defun wl-draft-make-message-id-string () "Return Message-ID field value." (or (and wl-message-id-use-message-from (catch :done (mapc (lambda (string) (when (setq string (wl-draft-make-message-id-from-address (std11-address-string (car (std11-parse-address-string string))))) (throw :done string))) (list (or (std11-fetch-field "from") "") wl-from)) nil)) (format "<%s@%s>" (wl-unique-id) (or wl-message-id-domain (if wl-local-domain (concat (system-name) "." wl-local-domain) (system-name)))))) ;;; Profile loading. (defvar wl-load-profile-function 'wl-local-load-profile) (defun wl-local-load-profile () "Load `wl-init-file'." (message "Initializing...") (load wl-init-file 'noerror 'nomessage)) (defun wl-load-profile () "Call `wl-load-profile-function' function." (funcall wl-load-profile-function)) ;;; (defsubst wl-count-lines () (count-lines 1 (point-at-bol))) (defun wl-horizontal-recenter () "Recenter the current buffer horizontally." (beginning-of-line) (re-search-forward "[[<]" (point-at-eol) t) (if (< (current-column) (/ (window-width) 2)) (set-window-hscroll (get-buffer-window (current-buffer) t) 0) (let* ((orig (point)) (end (window-end (get-buffer-window (current-buffer) t))) (max 0)) (when end ;; Find the longest line currently displayed in the window. (goto-char (window-start)) (while (and (not (eobp)) (< (point) end)) (end-of-line) (setq max (max max (current-column))) (forward-line 1)) (goto-char orig) ;; Scroll horizontally to center (sort of) the point. (if (> max (window-width)) (set-window-hscroll (get-buffer-window (current-buffer) t) (min (- (current-column) (/ (window-width) 3)) (+ 2 (- max (window-width))))) (set-window-hscroll (get-buffer-window (current-buffer) t) 0)) max)))) ;; Draft auto-save (defun wl-auto-save-drafts () (unless (wl-save-drafts) (wl-stop-save-drafts))) (defun wl-start-save-drafts () (when (numberp wl-auto-save-drafts-interval) (require 'timer) (if (get 'wl-save-drafts 'timer) (progn (timer-set-idle-time (get 'wl-save-drafts 'timer) wl-auto-save-drafts-interval t) (timer-activate-when-idle (get 'wl-save-drafts 'timer))) (put 'wl-save-drafts 'timer (run-with-idle-timer wl-auto-save-drafts-interval t 'wl-auto-save-drafts))))) (defun wl-stop-save-drafts () (when (get 'wl-save-drafts 'timer) (cancel-timer (get 'wl-save-drafts 'timer)))) (defun wl-set-auto-save-draft (&optional arg) (interactive "P") (unless (setq wl-disable-auto-save (cond ((null arg) (not wl-disable-auto-save)) ((< (prefix-numeric-value arg) 0) t) (t nil))) (wl-start-save-drafts)) (when (called-interactively-p 'interactive) (message "Auto save is %s (in this buffer)" (if wl-disable-auto-save "disabled" "enabled")))) ;; Biff ;; Internal variable. (defvar wl-biff-check-folders-running nil) (defun wl-biff-stop () (mapc (lambda (elt) (when (timerp elt) (cancel-timer elt))) (get 'wl-biff 'timers)) (put 'wl-biff 'timers nil)) (defun wl-biff-start () (require 'timer) (if wl-biff-check-folder-list ;; If biff timer already started, do nothing. (unless (get 'wl-biff 'timers) (put 'wl-biff 'timers (list (if wl-biff-use-idle-timer (run-with-idle-timer wl-biff-check-interval t 'wl-biff-event-handler) (run-at-time t wl-biff-check-interval 'wl-biff-launch-handler))))) (message "No folder is specified for biff"))) (defun wl-biff-launch-handler () (let ((timers (get 'wl-biff 'timers))) (unless (or wl-biff-check-folders-running (cdr timers)) (put 'wl-biff 'timers (cons (run-with-idle-timer wl-biff-check-delay nil 'wl-biff-event-handler) timers))))) (defun wl-biff-event-handler () ;; PAKURing from FSF:time.el (unwind-protect (progn (condition-case signal (wl-biff-check-folders) (error (message "wl-biff: %s (%s)" (car signal) (cdr signal)))) ;; Do redisplay right now, if no input pending. (sit-for 0)) (wl-biff-start) (put 'wl-biff 'timers (let ((timers (get 'wl-biff 'timers))) ;; Cancel existing extra idle timer (normaly only 1 at most). (while (cdr timers) (when (timerp (car timers)) (cancel-timer (car timers))) (setq timers (cdr timers))) (if wl-biff-use-idle-timer ;; Run extra idle timer for the case Emacs keeps idle. (cons (run-with-idle-timer (+ wl-biff-check-interval (float-time (current-idle-time))) nil 'wl-biff-event-handler) timers) timers))))) (defsubst wl-biff-notify (new-mails notify-minibuf) (if (> new-mails 0) (progn (unless wl-modeline-biff-status (run-hooks 'wl-biff-notify-hook)) (run-hook-with-args 'wl-biff-new-mail-hook new-mails)) (when (and wl-modeline-biff-status (eq new-mails 0)) (run-hooks 'wl-biff-unnotify-hook))) (setq wl-modeline-biff-status (> new-mails 0)) (force-mode-line-update t) (when notify-minibuf (cond ((zerop new-mails) (message "No mail.")) ((= 1 new-mails) (message "You have a new mail.")) (t (message "You have %d new mails." new-mails))))) (defun wl-biff-check-folders () (interactive) (if wl-biff-check-folders-running (when (called-interactively-p 'interactive) (message "Biff process is running.")) (setq wl-biff-check-folders-running t) (when (called-interactively-p 'interactive) (message "Checking new mails...")) (let ((new-mails 0) (flist (or wl-biff-check-folder-list (list wl-default-folder))) folder) (if (eq (length flist) 1) (wl-biff-check-folder-async (wl-folder-get-elmo-folder (car flist) 'biff) (called-interactively-p 'interactive)) (unwind-protect (while flist (setq folder (wl-folder-get-elmo-folder (car flist)) flist (cdr flist)) (elmo-folder-set-biff-internal folder t) (when (and (elmo-folder-plugged-p folder) (elmo-folder-exists-p folder)) (setq new-mails (+ new-mails (nth 0 (wl-biff-check-folder folder)))))) (setq wl-biff-check-folders-running nil) (wl-biff-notify new-mails (called-interactively-p 'interactive))))))) (autoload 'elmo-pop3-get-session "elmo-pop3") (defun wl-biff-check-folder (folder) (if (eq (elmo-folder-type-internal folder) 'pop3) (if (elmo-pop3-get-session folder 'any-exists) (make-list 3 0) (wl-folder-check-one-entity (elmo-folder-name-internal folder) 'biff)) (wl-folder-check-one-entity (elmo-folder-name-internal folder) 'biff))) (require 'wl-folder) (defun wl-biff-check-folder-async-callback (diff data) (if (nth 1 data) (with-current-buffer (nth 1 data) (wl-folder-entity-hashtb-set wl-folder-entity-hashtb (nth 0 data) (list (nth 0 diff) (- (nth 1 diff) (nth 0 diff)) (nth 2 diff)) (current-buffer)))) (setq wl-folder-info-alist-modified t) (setq wl-biff-check-folders-running nil) (sit-for 0) (wl-biff-notify (car diff) (nth 2 data))) (defun wl-biff-check-folder-async (folder notify-minibuf) (if (and (elmo-folder-plugged-p folder) (wl-folder-entity-exists-p (elmo-folder-name-internal folder))) (progn (elmo-folder-set-biff-internal folder t) (if (and (eq (elmo-folder-type-internal folder) 'imap4) (elmo-folder-use-flag-p folder)) ;; Check asynchronously only when IMAP4 and use server diff. (progn (setq elmo-folder-diff-async-callback 'wl-biff-check-folder-async-callback) (setq elmo-folder-diff-async-callback-data (list (elmo-folder-name-internal folder) (get-buffer wl-folder-buffer-name) notify-minibuf)) (elmo-folder-diff-async folder)) (unwind-protect (wl-biff-notify (car (wl-biff-check-folder folder)) notify-minibuf) (setq wl-biff-check-folders-running nil)))) (setq wl-biff-check-folders-running nil))) (make-obsolete 'wl-expand-newtext 'elmo-expand-newtext "22 Sep 2016") (make-obsolete 'wl-regexp-opt 'elmo-regexp-opt "22 Sep 2016") (defun wl-region-exists-p () "Return non-nil if a region exists on current buffer." (and transient-mark-mode mark-active)) (defun wl-deactivate-region () "Deactivate region on current buffer" (setq mark-active nil)) (defvar wl-line-string) (defun wl-line-parse-format (format spec-alist) "Make a formatter from FORMAT and SPEC-ALIST." (let (f spec specs stack) (setq f (with-temp-buffer (insert format) (goto-char (point-min)) (while (search-forward "%" nil t) (cond ((looking-at "%") (goto-char (match-end 0))) ((looking-at "\\(-?\\(0?\\)[0-9]*\\)\\([^0-9]\\)") (cond ((string= (match-string 3) "(") (if (zerop (length (match-string 1))) (error "No number specification for %%( line format")) (push (list (match-beginning 0) ; start (match-end 0) ; start-content (string-to-number (match-string 1)) ; width specs) ; specs stack) (setq specs nil)) ((string= (match-string 3) ")") (let ((entry (pop stack)) form) (unless entry (error "No matching %%( parenthesis in summary line format")) (goto-char (car entry)) ; start (setq form (buffer-substring (nth 1 entry) ; start-content (- (match-beginning 0) 1))) (delete-region (car entry) (match-end 0)) (insert "s") (setq specs (append (nth 3 entry) (list (list 'wl-set-string-width (nth 2 entry) (append (list 'format form) specs))))))) (t (setq spec (if (setq spec (assq (string-to-char (match-string 3)) spec-alist)) (nth 1 spec) (match-string 3))) (unless (string= "" (match-string 1)) (setq spec (list 'wl-set-string-width (string-to-number (match-string 1)) spec (unless (string= "" (match-string 2)) (string-to-char (match-string 2)))))) (replace-match "s" 'fixed) (setq specs (append specs (list (list 'setq 'wl-line-string spec))))))))) (buffer-string))) (append (list 'format f) specs))) (defmacro wl-line-formatter-setup (formatter format alist) `(let (byte-compile-warnings) (setq ,formatter (byte-compile (list 'lambda () (wl-line-parse-format ,format ,alist)))) (when (get-buffer "*Compile-Log*") (bury-buffer "*Compile-Log*")) (when (get-buffer "*Compile-Log-Show*") (bury-buffer "*Compile-Log-Show*")))) (defsubst wl-copy-local-variables (src dst local-variables) "Copy value of LOCAL-VARIABLES from SRC buffer to DST buffer." (with-current-buffer dst (dolist (variable local-variables) (set (make-local-variable variable) (with-current-buffer src (symbol-value variable)))))) (defsubst wl-window-deletable-p () "Return t if selected window can be safely deleted from its frame." (eq (window-deletable-p) t)) ;;; Search Condition (defun wl-search-condition-fields () (let ((denial-fields (nconc (mapcar 'capitalize elmo-msgdb-extra-fields) (mapcar 'capitalize wl-additional-search-condition-fields) '("Flag" "Since" "Before" "From" "Subject" "To" "Cc" "Body" "Raw-Body" "ToCc" "Larger" "Smaller")))) (append '("Last" "First") denial-fields (mapcar (lambda (f) (concat "!" f)) denial-fields)))) (defun wl-read-search-condition (default) "Read search condition string interactively." (wl-read-search-condition-internal "Search by" default)) (defun wl-read-search-condition-internal (prompt default &optional paren) (let* ((completion-ignore-case t) (field (completing-read (format "%s (%s): " prompt default) (mapcar #'list (append '("AND" "OR") (wl-search-condition-fields))) nil nil nil nil default)) value) (cond ((or (string= field "AND") (string= field "OR")) (concat (if paren "(" "") (wl-read-search-condition-internal (concat field "(1) Search by") default 'paren) (if (string= field "AND") "&" "|") (wl-read-search-condition-internal (concat field "(2) Search by") default 'paren) (if paren ")" ""))) ((string-match "Since\\|Before" field) (let ((default (format-time-string "%Y-%m-%d"))) (setq value (completing-read (format "Value for '%s' [%s]: " field default) (mapcar (lambda (x) (list (format "%s" (car x)))) elmo-date-descriptions) nil nil nil nil default)) (concat (downcase field) ":" value))) ((string-match "!?Flag" field) (while (null value) (setq value (downcase (completing-read (format "Value for '%s': " field) (mapcar (lambda (f) (list (capitalize (symbol-name f)))) (elmo-uniq-list (append '(unread answered forwarded digest any) (copy-sequence elmo-global-flags)) #'delq))))) (unless (elmo-flag-valid-p value) (message "Invalid char in `%s'" value) (setq value nil) (sit-for 1))) (unless (string-match (concat "^" elmo-condition-atom-regexp "$") value) (setq value (prin1-to-string value))) (concat (downcase field) ":" value)) (t (setq value (read-from-minibuffer (format "Value for '%s': " field))) (unless (string-match (concat "^" elmo-condition-atom-regexp "$") value) (setq value (prin1-to-string value))) (concat (downcase field) ":" value))))) (defun wl-y-or-n-p-with-scroll (prompt &optional scroll-by-SPC) (let ((prompt (concat prompt (if scroll-by-SPC " " " ")))) (catch 'done (while t (discard-input) (let ((key (let ((cursor-in-echo-area t)) (cdr (wl-read-event-char prompt))))) (cond ((memq key '(?y ?Y)) (throw 'done t)) ((eq key (string-to-char " ")) (if scroll-by-SPC (ignore-errors (scroll-up)) (throw 'done t))) ((memq key '(?v ?j ?J next)) (ignore-errors (scroll-up))) ((memq key '(?^ ?k ?K prior backspace)) (ignore-errors (scroll-down))) ((memq key '(?n ?N)) (throw 'done nil)))))))) (defun wl-find-region (beg-regexp end-regexp) (if (or (re-search-forward end-regexp nil t) (re-search-backward end-regexp nil t)) (let ((end (match-end 0)) (beg (re-search-backward beg-regexp nil t))) (if beg (cons beg end))))) (defun wl-simple-display-progress (_label action current total) (when (> total 0) (let ((progress (* (/ current (float total)) 100))) (if (< total 10000) (message "%s... %d%%" action (floor progress)) (message (format "%%s... %%.%df%%%%" (- (length (number-to-string total)) 4)) action progress))))) (when (fboundp 'progress-feedback-with-label) (defun wl-display-progress-with-gauge (label action current total) (progress-feedback-with-label label "%s..." (if (> total 0) (floor (* (/ current (float total)) 100)) 0) action))) (defvar wl-progress-next-update-time nil) (defun wl-progress-set-next-update-time () (let ((time (current-time)) (l (floor wl-progress-update-interval)) usec) (setq usec (+ (nth 2 time) (floor (* (- wl-progress-update-interval l) 1000000))) l (+ (/ usec 1000000) (nth 1 time) l) wl-progress-next-update-time (list (+ (/ l 65536) (car time)) (logand l 65535) (% usec 1000000))))) (defun wl-progress-callback-function (label action current total) (cl-case current (query (let ((threshold (if (consp wl-display-progress-threshold) (cdr (or (assq label wl-display-progress-threshold) (assq t wl-display-progress-threshold))) wl-display-progress-threshold))) (and threshold (>= total threshold)))) (start (wl-progress-set-next-update-time) (message "%s..." action)) (done (wl-progress-set-next-update-time) (message "%s...done" action)) (t (when (and wl-display-progress-function (or (null wl-progress-next-update-time) (time-less-p wl-progress-next-update-time (current-time)))) (wl-progress-set-next-update-time) (funcall wl-display-progress-function label action current total))))) ;; read multiple strings with completion (defun wl-completing-read-multiple-1 (prompt table &optional predicate _require-match initial-input hist def inherit-input-method) "Read multiple strings in the minibuffer" (split-string (completing-read prompt table predicate nil initial-input hist def inherit-input-method) ",")) (eval-when-compile (require 'crm)) (defun wl-completing-read-multiple-2 (prompt table &optional predicate require-match initial-input hist def inherit-input-method) "Read multiple strings in the minibuffer" (let ((ret (completing-read-multiple prompt table predicate require-match initial-input hist def inherit-input-method))) (if (and def (equal ret '(""))) (split-string def crm-separator) ret))) (defalias 'wl-completing-read-multiple 'completing-read-multiple) (make-obsolete 'wl-completing-read-multiple 'completing-read-multiple "24 May 2020") (cond ((fboundp 'shell-command-read-minibuffer) (defun wl-read-shell-command (prompt &optional initial-contents keymap read hist) (shell-command-read-minibuffer prompt default-directory initial-contents keymap read hist))) (t (defalias 'wl-read-shell-command 'read-from-minibuffer))) (defun wl-read-buffer (prompt &optional def require-match) (read-buffer prompt def require-match)) (require 'product) (product-provide (provide 'wl-util) (require 'wl-version)) ;;; wl-util.el ends here wanderlust-wanderlust-769699d/wl/wl-vars.el000066400000000000000000003221401406661363500207460ustar00rootroot00000000000000;;; wl-vars.el --- Variable definitions for Wanderlust. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000,2001 Yuuichi Teranishi ;; Copyright (C) 1998,1999,2000,2001 Masahiro MURATA ;; Author: Yuuichi Teranishi ;; Masahiro MURATA ;; Keywords: mail, net news ;; This file is part of Wanderlust (Yet Another Message Interface on Emacsen). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'elmo-vars) (require 'elmo-util) (require 'elmo-msgdb) ;;; Customizable Variables (defgroup wl nil "Wanderlust, a news and mail reading software." :tag "Wanderlust" :link `(custom-manual ,(if (string-equal "Japanese" (symbol-value 'current-language-environment)) "(wl-ja)Top" "(wl)Top")) :group 'news :group 'mail) (defgroup wl-pref nil "Wanderlust, Preferences." :prefix "wl-" :group 'wl) (defgroup wl-folder nil "Wanderlust, folder buffer." :prefix "wl-" :group 'wl) (defgroup wl-summary nil "Wanderlust, summary buffer." :prefix "wl-" :group 'wl) (defgroup wl-summary-marks nil "Wanderlust, marks used in summary buffers." :prefix "wl-summary-" :group 'wl-summary) (defgroup wl-expire nil "Wanderlust, Expiring and archiving." :prefix "wl-" :group 'wl) (defgroup wl-score nil "Wanderlust, Score file handling." :prefix "wl-" :group 'wl) (defgroup wl-highlight nil "Wanderlust, Highlights." :prefix "wl-" :group 'wl) (defgroup wl-draft nil "Wanderlust, draft mode." :prefix "wl-" :group 'wl) (defgroup wl-setting nil "Wanderlust common settings." :prefix "wl-" :group 'wl) ;;; Emacsen (defconst wl-on-xemacs nil) (defconst wl-on-emacs21 t) (defconst wl-on-mule t) (defconst wl-on-mule3 t) (defconst wl-on-nemacs nil) ; backward compatibility. (defcustom wl-from (when user-mail-address (let ((name (user-full-name))) (concat (unless (member name '("" "unknown")) (concat (elmo-address-quote-specials name) " ")) "<" user-mail-address ">"))) "*From string used in draft." :type '(choice string (const :tag "Don't choice this!!" nil)) :group 'wl :group 'wl-setting) (defcustom wl-user-mail-address-list nil "*A list of user's mail addresses. This list is used to judge whether an address is user's or not. You should set this variable if you use multiple e-mail addresses. If you don't have multiple e-mail addresses, you don't have to set this. NOTE: Non-nil value of `wl-user-mail-address-regexp' supersede this." :type '(repeat string) :group 'wl :group 'wl-setting) (defcustom wl-user-mail-address-regexp nil "*A regexp for user's mail addresses. Supersede `wl-user-mail-address-list'." :type '(choice (const :tag "Use wl-user-mail-address-list" nil) string) :group 'wl :group 'wl-setting) (defcustom wl-organization (getenv "ORGANIZATION") "Organization name." :type '(choice (const :tag "none" nil) string) :group 'wl :group 'wl-setting) (defcustom wl-temporary-file-directory "~/tmp/" "*Default temporary directory to save message, part." :type 'directory :group 'wl) (defcustom wl-icon-directory (or (let ((icons (expand-file-name "wl/icons/" data-directory))) (if (file-directory-p icons) icons)) (if load-file-name (let ((icons (expand-file-name "icons" (file-name-directory load-file-name)))) (if (file-directory-p icons) icons)))) "*Directory to load the icon files from, or nil if none." :type '(choice (const :tag "none" nil) string) :group 'wl) (defcustom wl-summary-default-view 'thread "Default status of summary view, thread or sequential view." :type '(choice (const :tag "Thread" thread) (const :tag "Sequential" sequence)) :group 'wl-summary) (defcustom wl-summary-default-view-alist nil "An alist of regexp for folder name and summary default view. If no match, `wl-summary-default-view' is used." :type '(repeat (cons (regexp :tag "Folder Regexp") (choice (const :tag "Thread" thread) (const :tag "Sequential" sequence)))) :group 'wl-summary) (defcustom wl-summary-order 'ascending "Specify order of messages in summary buffer. Note that messages in a thread are always listed in ascending order even if this value is descending." :type '(choice (const :tag "Ascending order" ascending) (const :tag "Descending order" descending)) :group 'wl-summary) (defvar wl-summary-mode-line-format-spec-alist '((?f (if (memq 'modeline wl-use-folder-petname) (wl-folder-get-petname (elmo-folder-name-internal wl-summary-buffer-elmo-folder)) (elmo-folder-name-internal wl-summary-buffer-elmo-folder))) (?t (if (eq wl-summary-buffer-view 'thread) "T" "S")) (?m (upcase (symbol-name wl-summary-buffer-display-mime-mode))) (?n wl-summary-buffer-new-count) (?u wl-summary-buffer-unread-count) (?a (length wl-summary-buffer-number-list))) "An alist of format specifications that can appear in summary mode-lines. Each element is a list of following: \(SPEC STRING-EXP) SPEC is a character for format specification. STRING-EXP is an expression to get string to insert.") (defcustom wl-summary-mode-line-format "Wanderlust: %f {%t}(%n/%u/%a)" "*A format string for summary mode-line of Wanderlust. It may include any of the following format specifications which are replaced by the given information: %f The folder name. %t The thread status of the summary ('T' for thread, 'S' for sequential). %m The mime analysis status of the summary ('MIME' for MIME ON) %n The number of new messages. %u The number of unread messages (includes new messages). %a The number of all messages." :group 'wl-summary :type 'string) (defvar wl-summary-line-format-spec-alist '((?Y (wl-summary-line-year)) (?M (wl-summary-line-month)) (?D (wl-summary-line-day)) (?W (wl-summary-line-day-of-week)) (?h (wl-summary-line-hour)) (?m (wl-summary-line-minute)) (?\[ (if wl-thr-linked "<" "[")) (?\] (if wl-thr-linked ">" "]")) (?t (or wl-thr-indent-string "")) (?s (wl-summary-line-subject)) (?S (wl-summary-line-size)) (?C (if wl-thr-children-number (concat "[+" (number-to-string wl-thr-children-number) "] ") (if wl-parent-message-entity (if wl-thr-linked ">>" ">") ""))) (?~ (if (zerop (length wl-line-string)) "" " ")) (?c (if wl-thr-children-number (concat "+" (number-to-string wl-thr-children-number) ":") "")) (?f (wl-summary-line-from)) (?# (wl-summary-line-list-info)) (?l (wl-summary-line-list-count)) (?T (or wl-temp-mark " ")) (?P (or wl-persistent-mark " ")) (?n (wl-summary-line-number)) (?@ (wl-summary-line-attached))) "An alist of format specifications that can appear in summary lines. Each element is a list of following: \(SPEC STRING-EXP) SPEC is a character for format specification. STRING-EXP is an expression to get string to insert.") (defcustom wl-summary-line-format "%n%T%P%M/%D(%W)%h:%m %t%[%17(%c %f%) %] %s" "*A default format string for summary line of Wanderlust. It may include any of the following format specifications which are replaced by the given information: %n The number of the message. The width is decided using `wl-summary-default-number-column' and `wl-summary-number-column-alist'. %T The temporal mark (*, D, o, O). %P The persistent mark (status of the message). %Y The year of the date field of the message (zero padded). %M The month of the date field of the message (zero padded). %D The day of the date field of the message (zero padded). %W The weekday name of the date field of the message (zero padded). %h The hour of the date field of the message (zero padded). %l The number in the mailing list. %m The minute of the date field of the message (zero padded). %[ An open bracket. If the message thread is linked, it is replaced with '<'. %] A close bracket. If the message thread is linked, it is replaced with '>'. %c The children number of the closed message thread. Children number is printed like '+??:'. %C The children number of the closed message thread. Children number is printed like '[+??] '. If the message is opened, '>' or '>>' (linked) is displayed. %f The from: field string of the message. %s The subject: field string of the message. %S The size of the message (if available). %t The branch of the thread. %@ `@' only if the first MIME part is multipart/mixed. %~ If the previous spec is not zero-length, replaced with ' '. %# mailing list information (`(' ML-name [ ` ' ML-number ] `)') If the format string contains the specifiers %( and %), the text between them will have the specified number of columns. See also variable `wl-summary-width'." :group 'wl-summary :type 'string) (defcustom wl-folder-summary-line-format-alist nil "An alist of folder name and a summary line format. If no match, `wl-summary-line-format' is used. e.x. '((\"^%\" . \"%n%T%P%M/%D(%W)%h:%m %t%[%14(%c %f%) %](%S) %s\") (\"^@2ch\" . \"%n%T%P%M%/%D/%h:%m %t[%9(%c %f%) ]%s\")))" :type '(repeat (cons (regexp :tag "Folder Regexp") (string :tag "line format"))) :group 'wl-summary) (defcustom wl-summary-check-line-format t "*Check summary line format change if non-nil. When summary line format is changed, current summary cache is discarded. It is highly recommended to set this value to t." :type 'boolean :group 'wl-summary) (defcustom wl-summary-line-format-file ".wl-summary-line-format" "*Cache file for summary line format." :type 'file :group 'wl-summary) (defcustom wl-summary-from-function 'wl-summary-default-from "*A function for displaying sender (From: field) information." :type 'function :group 'wl-summary) (defcustom wl-summary-subject-function 'wl-summary-default-subject "*A function for displaying subject." :type 'function :group 'wl-summary) (defcustom wl-summary-subject-filter-function 'wl-summary-default-subject-filter "*A filter function for comparing subjects." :type 'function :group 'wl-summary) (defcustom wl-summary-nobreak-char-display nil "Override `nobreak-char-display' in Summary buffer. See `nobreak-char-display' for details." :type '(choice (const :tag "Use harcoded face" t) (const :tag "Use escape glyph" 'escape) (const :tag "No special handling" nil)) :group 'wl-summary) (defcustom wl-summary-search-parent-by-subject-regexp "^[ \t]*\\(\\[[^:]+[,: ][0-9]+\\]\\)?[ \t]*re[\\^[:> ]" "*If message does not have in-reply-to field nor references field and subject matches this regexp, search parent message by subject matching. If nil, never search search parent by subject." :type '(choice string (const :tag "Don't search parent" nil)) :group 'wl-summary) ;;; Mark & Action (defcustom wl-summary-mark-action-list '(("*" target-mark nil wl-summary-register-target-mark nil wl-highlight-summary-temp-face "Put target mark.") ("d" dispose nil wl-summary-register-temp-mark wl-summary-exec-action-dispose wl-highlight-summary-disposed-face "Dispose messages according to `wl-dispose-folder-alist'.") ("D" delete nil wl-summary-register-temp-mark wl-summary-exec-action-delete wl-highlight-summary-deleted-face "Delete messages immediately.") ("o" refile wl-summary-get-refile-destination wl-summary-set-action-refile wl-summary-exec-action-refile wl-highlight-summary-refiled-face "Refile messages to the other folder.") ("O" copy wl-summary-get-copy-destination wl-summary-register-temp-mark wl-summary-exec-action-copy wl-highlight-summary-copied-face "Copy messages to the other folder.") ("i" prefetch nil wl-summary-register-temp-mark wl-summary-exec-action-prefetch wl-highlight-summary-prefetch-face "Prefetch messages.") ("~" resend wl-summary-get-resend-address wl-summary-register-temp-mark wl-summary-exec-action-resend wl-highlight-summary-resend-face "Resend messages.")) "A variable to define Mark & Action. Each element of the list should be a list of \(MARK SYMBOL ARGUMENT-FUNCTION SET-MARK-FUNCTION EXEC-FUNCTION FACE DOC-STRING) MARK is a temporal mark string to define. SYMBOL is an action name to define. ARGUMENT-FUNCTION is a function called to set the argument data for SET-MARK-FUNCTION. Its argument is (ACTION NUMBER). ACTION is same as the SYMBOL. NUMBER is the message number to determine the argument data. SET-MARK-FUNCTION is a function called to set the mark. Its argument is (NUMBER MARK DATA). NUMBER is the target message number. MARK is the temporary mark string. DATA is given by ARGUMENT-FUNCTION. EXEC-FUNCTION is a function called to execute the action. Its argument is a list of MARK-INFO. MARK-INFO is a list of (NUMBER MARK DATA). FACE is a face for highlighting." :type '(repeat (list (string :tag "Temporary mark") (symbol :tag "Action name") (symbol :tag "Argument function") (symbol :tag "Set mark function") (symbol :tag "Exec function") (symbol :tag "Face symbol") (string :tag "Document string"))) :group 'wl-summary) ;; Important folders (defcustom wl-default-folder "%inbox" "*Default folder used in `wl-summary-goto-folder'." :type 'string :group 'wl) (defcustom wl-draft-folder "+draft" "*Draft folder" :type 'string :group 'wl) (defcustom wl-trash-folder "+trash" "*Trash folder" :type 'string :group 'wl :group 'wl-setting) (defcustom wl-queue-folder "+queue" "*Queue folder" :type 'string :group 'wl) (defcustom wl-default-spec "%" "*Default prefix for folder name initially added in minibuffer" :type 'string :group 'wl) (defcustom wl-insert-mail-followup-to nil "*Insert Mail-Followup-To: field if non-nil." :type 'boolean :group 'wl-draft) (defcustom wl-insert-mail-reply-to nil "*Insert Mail-Reply-To: field if non-nil." :type 'boolean :group 'wl-draft) (defcustom wl-insert-message-id t "*Insert Message-ID: field if non-nil." :type 'boolean :group 'wl-draft) (defcustom wl-auto-insert-x-face t "*Insert X-Face: field automatically." :type 'boolean :group 'wl-draft) (defcustom wl-x-face-file "~/.xface" "*X-Face field is inserted using its contents. If file exists and `wl-auto-insert-x-face' is non-nil." :type 'file :group 'wl-draft) (defcustom wl-draft-write-file-function 'wl-draft-save "Save function for draft message." :type 'function :group 'wl-draft) (defcustom wl-subscribed-mailing-list nil "*Subscribed mailing list. You had better set this variable if you set 'wl-insert-mail-followup-to' as t." :type '(repeat string) :group 'wl-pref :group 'wl-setting) (defcustom wl-demo t "*Display demo at start time." :type 'boolean :group 'wl-pref) (defcustom wl-demo-icon-name-alist '(((string-match "^... Dec \\([ 01][0-9]\\|2[0-5]\\)" (current-time-string)) . (concat "wl-" (wl-version-status) "-xmas-logo")) (t . (concat "wl-" (wl-version-status) "-logo"))) "An alist to determine the basename of the logo file." :type '(repeat (cons (symbol :tag "condition") (symbol :tag "file name"))) :group 'wl-pref) (defcustom wl-demo-image-filter-alist nil "An alist of image type and filter function." :type '(repeat (cons symbol function)) :group 'wl-pref) (defcustom wl-envelope-from nil "*Envelope From used in SMTP. If nil, `wl-from' is used." :type '(choice (const :tag "Same as 'From' field." nil) string) :group 'wl :group 'wl-setting) (defcustom wl-draft-additional-header-alist nil "*Additional headers in the draft." :type '(repeat (cons (symbol :tag "Field Name") (choice (string :tag "String") (function :tag "Function")))) :group 'wl-draft) (defcustom wl-draft-add-in-reply-to t "*If non-nil, message-id of the cited message is inserted to the in-reply-to field of the current draft. Note: default value follows RFC2822." :type 'boolean :group 'wl-draft) (defcustom wl-draft-add-references nil "*If non-nil, message-id of the cited message is inserted to the references field of the current draft. Note: default value follows RFC2822." :type 'boolean :group 'wl-draft) (defcustom wl-draft-cite-function 'wl-default-draft-cite "*A function for citation." :type 'function :group 'wl-draft) (defcustom wl-default-draft-cite-date-format-string t "*Format string to use for first line of citation in `wl-default-draft-cite'. The value is passed to `format-time-string'. When non-string and non-nil, call `wl-make-date-string' function. When nil, use original message's Date: field as is." :type '(choice (string :tag "Format string") (const :tag "Call wl-make-date-string function" t) (const :tag "Use original Date: field" nil)) :group 'wl-draft) (defcustom wl-default-draft-cite-no-date-string "Some time ago" "*String to use for first line of citation in `wl-default-draft-cite'. The value is used as is when original message's Date: field is not found." :type 'string :group 'wl-draft) (defcustom wl-default-draft-cite-no-author-string "you" "*String to use for second line of citation in `wl-default-draft-cite'. The value is used as is when original message's From: field is not found." :type 'string :group 'wl-draft) (defcustom wl-default-draft-cite-time-locale "C" "*Override `system-time-locale' while making time string of citaion header." :type '(choice (string :tag "Specify locale") (const :tag "Do not override" nil)) :group 'wl-draft) (defcustom wl-default-draft-cite-header-format-string "%s,\n%s wrote:\n" "*Format string to generate citation header. The value is passed to `format' function with two string, date and author respectively. Should be terminated with LF." :type 'string :group 'wl-draft) (defcustom wl-default-draft-cite-decorate-author t "*If non-nil, the author of cited message is arranged by `wl-summary-from-func-internal' in `wl-default-draft-cite'." :type 'boolean :group 'wl-draft) (defcustom wl-draft-preview-process-pgp nil "*When non-nil, PGP processing (encryption, sign) will be done when preview." :type 'boolean :group 'wl-draft) (defcustom wl-smtp-connection-type nil "*SMTP connection type. If nil, default smtp connection type is used." :type '(choice (const :tag "default" nil) (const :tag "Use STARTTLS" starttls) (const :tag "SMTP over SSL" ssl) symbol) :group 'wl) (defcustom wl-smtp-posting-user nil "*SMTP authentication user." :type '(choice (const :tag "none" nil) string) :group 'wl :group 'wl-setting) (defcustom wl-smtp-posting-server nil "*SMTP server name to send mail (wl-draft-send-mail-with-smtp)." :type '(choice (const :tag "none" nil) string) :group 'wl :group 'wl-setting) (defcustom wl-smtp-posting-port nil "*SMTP port number in `wl-smtp-posting-server'. If nil, default SMTP port number(25) is used." :type '(choice (const :tag "Default (25)" nil) integer) :group 'wl :group 'wl-setting) (defcustom wl-smtp-authenticate-type nil "*SMTP Authentication type. If nil, don't authenticate." :type '(choice (const :tag "none" nil) (const :tag "PLAIN" "plain") (const :tag "CRAM-MD5" "cram-md5") (const :tag "DIGEST-MD5" "digest-md5") (const :tag "LOGIN" "login") (string :tag "Other")) :group 'wl :group 'wl-setting) (defcustom wl-smtp-authenticate-realm nil "*SMTP Authentication realm. If you don't need to specify realm, set as nil." :type '(choice (const :tag "none" nil) string) :group 'wl :group 'wl-setting) (defcustom wl-pop-before-smtp-user nil "*POP3 user name to send mail using POP-before-SMTP. If nil, `elmo-pop3-default-user' is used. To use POP-before-SMTP, \(setq wl-draft-send-mail-function 'wl-draft-send-mail-with-pop-before-smtp)" :type '(choice (const :tag "none" nil) string) :group 'wl :group 'wl-setting) (defcustom wl-pop-before-smtp-server nil "*POP3 server for POP-before-SMTP. If nil, `elmo-pop3-default-server' is used." :type '(choice (const :tag "none" nil) string) :group 'wl :group 'wl-setting) (defcustom wl-pop-before-smtp-port nil "*POP3 port for POP-before-SMTP. If nil, `elmo-pop3-default-port' is used." :type '(choice (const :tag "none" nil) integer string) :group 'wl :group 'wl-setting) (defcustom wl-pop-before-smtp-stream-type nil "*Stream type for POP-before-SMTP. If nil, `elmo-pop3-default-stream-type' is used." :type '(choice (const :tag "Use `elmo-pop3-default-stream-type'" nil) symbol) :group 'wl) (defcustom wl-pop-before-smtp-authenticate-type nil "*Default Authentication type for POP-before-SMTP. If nil, `elmo-pop3-default-authenticate-type' is used." :type '(choice (const :tag "none" nil) (const :tag "APOP" 'apop) (const :tag "POP3" 'user)) :group 'wl :group 'wl-setting) (defcustom wl-nntp-posting-server nil "*NNTP server name to post news. If nil, `elmo-nntp-default-server' is used." :type '(choice (const :tag "none" nil) string) :group 'wl :group 'wl-setting) (defcustom wl-nntp-posting-user nil "*NNTP user name to post news for authinfo. If nil, `elmo-nntp-default-user' is used. If nil, don't authenticate." :type '(choice (const :tag "none" nil) string) :group 'wl :group 'wl-setting) (defcustom wl-nntp-posting-port nil "*NNTP port to post news. If nil, `elmo-nntp-default-port' is used." :type '(choice (const :tag "none" nil) integer string) :group 'wl :group 'wl-setting) (defcustom wl-nntp-posting-stream-type nil "*Stream type for posting Netnews. If nil, `elmo-nntp-default-stream-type' is used." :type '(choice (const :tag "Use `elmo-nntp-default-stream-type'" nil) symbol) :group 'wl) (defcustom wl-nntp-posting-function 'elmo-nntp-post "A function to post news. Prepared candidate is 'elmo-nntp-post." :type '(radio (function-item elmo-nntp-post) (function :tag "Other")) :group 'wl-draft) (defcustom wl-nntp-posting-config-alist nil "*Alist of configuration on nntp posting. ex. '((\",?local.test\" . \"news.media.kyoto-u.ac.jp\") (\",?ku\\.\" . ((server . \"news.media.kyoto-u.ac.jp\") (user . \"newsmaster\") (port . 119) (function . elmo-nntp-post)) (\".*\" . \"newsfeed.kuee.kyoto-u.ac.jp\")))" :type '(repeat (cons (sexp :tag "Match") (choice (string :tag "Server") (repeat :inlie t (cons (choice (const server) (const user) (const port) (const stream-type) (const function)) (sexp :tag "Value")))))) :group 'wl-draft :group 'wl-setting) (defcustom wl-prefetch-confirm t "*Confirm prefetching if message size is larger than `wl-prefetch-threshold'." :type 'boolean :group 'wl-pref) (defcustom wl-prefetch-threshold 30000 "*Maximum size of message prefetched without confirmation. If nil, all messages prefetched regardless of its size. If message size is larger than this value, confirm prefetching when `wl-prefetch-confirm' is non-nil." :type '(choice (integer :tag "Threshold (bytes)") (const :tag "No limitation" nil)) :group 'wl-pref :group 'wl-setting) (defcustom wl-thread-insert-opened nil "*Non-nil forces to insert thread as opened in updating." :type 'boolean :group 'wl-summary :group 'wl-setting) (defcustom wl-thread-open-reading-thread t "*Non-nil forces to open reading thread." :type 'boolean :group 'wl-summary) (defcustom wl-additional-search-condition-fields nil "*A list of field name which is used for candidates of search condition." :type '(repeat (string :tag "Field name")) :group 'wl-pref :group 'wl-setting) ;;;; Hooks (defvar wl-folder-mode-hook nil "A hook called when wanderlust folder mode is started. This hook may contain the functions `wl-folder-init-icons' and `wl-setup-folder' for reasons of system internal to accord facilities for the Emacs variants.") (defvar wl-summary-toggle-disp-on-hook nil "A hook called when message is toggled.") (defvar wl-summary-toggle-disp-off-hook nil "A hook called when message is disappeared.") (defvar wl-summary-toggle-disp-folder-on-hook nil "A hook called when folder is toggled.") (defvar wl-summary-toggle-disp-folder-off-hook nil "A hook called when folder is disappeared.") (defvar wl-summary-toggle-disp-folder-message-resumed-hook nil "A hook called when message window is resumed when folder is toggled.") (defvar wl-summary-mode-hook nil "A hook called when summary mode is started. This hook may contain the function `wl-setup-summary' for reasons of system internal to accord facilities for the Emacs variants.") (defvar wl-summary-prepared-pre-hook nil "A hook called before the summary buffer has been generated.") (defvar wl-summary-prepared-hook nil "A hook called after the summary buffer has been generated.") (defvar wl-summary-sync-updated-hook nil "A hook called when update summary buffer.") (defvar wl-summary-unread-message-hook nil "A hook called when unread message is displayed.") (defvar wl-summary-edit-addresses-hook nil "A hook called when address book is edited.") (defvar wl-summary-buffer-message-saved-hook nil "A hook called when msgdb is saved.") (defvar wl-summary-buffer-mark-saved-hook nil "A hook called when mark is saved.") (defvar wl-summary-divide-thread-when-subject-changed nil "Divide thread when subject is changed.") (defvar wl-init-hook nil "A hook called when initialization is finished. This hook may contain the functions `wl-plugged-init-icons' and `wl-biff-init-icons' for reasons of system internal to accord facilities for the Emacs variants.") (defvar wl-hook nil "A hook called when Wanderlust is invoked.") (defvar wl-draft-reply-hook '((lambda () (wl-draft-setup-parent-flag 'answered))) "A hook called when replied. This hook runs on the draft buffer.") (defvar wl-draft-forward-hook '((lambda () (wl-draft-setup-parent-flag 'forwarded))) "A hook called when forwarded. This hook runs on the draft buffer.") (defvar wl-draft-kill-pre-hook nil "A hook called just before the draft buffer is killed.") (defvar wl-summary-reply-hook nil "A hook called when `wl-summary-reply' is called. This hook runs on the summary buffer.") (defvar wl-summary-forward-hook nil "A hook called when `wl-summary-forward' is called. This hook runs on the summary buffer.") (defvar wl-summary-resend-hook nil "A hook runs on the resent message buffer before sending process starts.") (defvar wl-summary-redisplay-hook nil "A hook called when displaying message finishes.") (defvar wl-mail-setup-hook nil "A hook called when Draft is prepared.") (defvar wl-draft-reedit-hook '(wl-draft-remove-text-plain-tag) "A hook called when Draft is re-edited. The cursor point is located at top of the body.") (defvar wl-draft-send-hook '(wl-draft-config-exec) "A hook called on the draft editing buffer before sending process starts.") (defvar wl-mail-send-pre-hook nil "A hook called just before the mail sending process starts.") (defvar wl-news-send-pre-hook nil "A hook called just before the news sending process starts.") (defvar wl-message-buffer-created-hook nil "A hook called when Message buffer is prepared.") (defvar wl-message-redisplay-hook nil "A hook called when Message is displayed.") (defvar wl-message-exit-hook nil "A hook called when quit message.") (defvar wl-summary-exit-pre-hook nil "A hook called before exit summary mode.") (defvar wl-summary-exit-hook nil "A hook called when exit summary mode.") (defvar wl-highlight-headers-hook nil "A hook called when header is highlighted.") (defvar wl-highlight-message-hook nil "A hook called when message is highlighted.") (defvar wl-save-hook nil "A hook called when save summary and folder status.") (defvar wl-exit-hook nil "A hook called when exit wanderlust.") (defvar wl-folder-suspend-hook nil "A hook called when suspend wanderlust.") (defvar wl-biff-notify-hook '(ding) "A hook called when a biff-notification is invoked.") (defvar wl-biff-unnotify-hook nil "A hook called when a biff-notification is removed.") (defvar wl-biff-new-mail-hook nil "A hook called when `wl-biff-notify' found non-zero new mails. The hook functions receive the number of new mails as the first argument.") (defvar wl-auto-check-folder-pre-hook nil "A hook called before auto check folders.") (defvar wl-auto-check-folder-hook nil "A hook called when auto check folders.") (defvar wl-folder-check-entity-pre-hook nil "A hook called before check entity. Functions are called with one argument ENTITY.") (defvar wl-folder-check-entity-hook nil "A hook called when check entity. Functions are called with one argument ENTITY.") (defvar wl-draft-config-exec-hook nil "A hook called when execute header-config on draft.") (defvar wl-summary-expire-pre-hook nil "A hook called before expire.") (defvar wl-summary-expire-hook nil "A hook called when expired.") (defvar wl-summary-archive-pre-hook nil "A hook called before archive.") (defvar wl-summary-archive-hook nil "A hook called when archived.") (defvar wl-summary-line-inserted-hook nil "A hook called when summary line is inserted.") (defvar wl-summary-insert-headers-hook nil "A hook called when insert header for search header.") (defvar wl-message-display-internal-hook nil "A hook called when message buffer is created and message is displayed. This hook may contain the functions `wl-setup-message' for reasons of system internal to accord facilities for the Emacs variants.") (defvar wl-thread-update-children-number-hook nil "A hook called when children number is updated.") (defvar wl-folder-update-access-group-hook nil "A hook called when update access group folder.") (defvar wl-draft-cited-hook nil "A hook called after a message is cited.") (defvar wl-draft-insert-x-face-field-hook nil "A hook called after a x-face field is inserted.") (defvar wl-template-mode-hook nil "A hook called when template mode is started.") (defvar wl-score-mode-hook nil "A hook called when score mode is started.") (defvar wl-make-plugged-hook nil "A hook called when make plugged alist.") (defvar wl-plugged-exit-hook nil "A hook called when exit plugged mode.") ;;;; functions for draft (defcustom wl-draft-send-function 'wl-draft-normal-send-func "A function to send message." :type 'function :group 'wl-draft) (defcustom wl-draft-send-news-function 'wl-draft-elmo-nntp-send "A function to send news." :type 'function :group 'wl-draft) (defcustom wl-draft-send-mail-function 'wl-draft-send-mail-with-smtp "A function to send mail. Prepared candidates are 'wl-draft-send-mail-with-smtp, 'wl-draft-send-mail-with-sendmail, 'wl-draft-send-mail-with-qmail and 'wl-draft-send-mail-with-pop-before-smtp." :type '(radio (function-item wl-draft-send-mail-with-smtp) (function-item wl-draft-send-mail-with-sendmail) (function-item wl-draft-send-mail-with-qmail) (function-item wl-draft-send-mail-with-pop-before-smtp) (function :tag "Other")) :group 'wl-draft) (defcustom wl-draft-send-confirm-type 'scroll-by-SPC/BS "*Confirmation type or function to use when send a message." :type '(choice (const :tag "y or n with scroll (j/k)" scroll-by-j/k) (const :tag "y or n with scroll (SPC/BS)" scroll-by-SPC/BS) (function-item y-or-n-p) (function-item yes-or-no-p) (function :tag "Other function")) :group 'wl-draft) (defcustom wl-draft-reply-with-argument-list '(("From" . (("Reply-To" "Mail-Reply-To" "From") ("Mail-Followup-To" "To" "Cc") ("Followup-To" "Newsgroups")))) "Alist of cons cell of \('condition' . ('fields for To' 'fields for Cc' 'fields for Newsgroups')) 'condition' is a header name string (non-nil if the header exists in original message), a function (evaluated in original message buffer) or a list of those \(means 'AND' condition). 'fields for ***' is a list of strings. If car of each cons cell returns non-nil value, cdr of each cons cell is used for preparing headers of draft message. Default is for 'reply-to-all'." :type '(repeat (cons (choice (string :tag "Field Name") (symbol :tag "Function") (const :tag "Replying to self" wl-draft-self-reply-p) (repeat :tag "AND" (choice (string :tag "Field Name") (symbol :tag "Function") (const :tag "Replying to self" wl-draft-self-reply-p)))) (list (repeat :tag "Fields For To" string) (repeat :tag "Fields For Cc" string) (repeat :tag "Fields For Newsgroups" string)))) :group 'wl-draft) (defcustom wl-draft-reply-without-argument-list '(("Followup-To" . (("Mail-Followup-To" "Mail-Reply-To" "Reply-To") nil ("Followup-To"))) ("Mail-Followup-To" . (("Mail-Followup-To") nil nil)) ("Newsgroups" . (("Mail-Reply-To" "Reply-To" "To") ("Cc") ("Newsgroups"))) ("Mail-Reply-To" . (("Mail-Reply-To" "Reply-To") ("To" "Cc") nil)) ("Reply-To" . (("Reply-To") ("To" "Cc") nil)) (wl-draft-self-reply-p . (("To") ("Cc") nil)) ("From" . (("From") ("To" "Cc") nil))) "Alist of cons cell of \('condition' . ('fields for To' 'fields for Cc' 'fields for Newsgroups')) 'condition' is a header name string (non-nil if the header exists in original message), a function (evaluated in original message buffer) or a list of those \(means 'AND' condition). 'fields for ***' is a list of strings. If car of each cons cell returns non-nil value, cdr of each cons cell is used for preparing headers of draft message." :type '(repeat (cons (choice (string :tag "Field Name") (symbol :tag "Function") (const :tag "Replying to self" wl-draft-self-reply-p) (repeat :tag "AND" (choice (string :tag "Field Name") (symbol :tag "Function") (const :tag "Replying to self" wl-draft-self-reply-p)))) (list (repeat :tag "Fields For To" string) (repeat :tag "Fields For Cc" string) (repeat :tag "Fields For Newsgroups" string)))) :group 'wl-draft) (defcustom wl-draft-always-delete-myself nil "*Always delete myself from recipient if non-nil." :type 'boolean :group 'wl-draft) (defcustom wl-draft-delete-myself-from-bcc-fcc nil "*Do not insert bcc or fcc if To and Cc fields is a member of `wl-subscribed-mailing-list'" :type 'boolean :group 'wl-draft) (defcustom wl-draft-resume-folder-window t "*Resume folder window in `wl-draft-hide'." :type 'boolean :group 'wl-draft) (defcustom wl-draft-use-frame nil "*Raise new frame when composing draft." :type 'boolean :group 'wl-draft) (defcustom wl-draft-qmail-send-plugged nil "*Send mail when plugged is on, in the `wl-draft-send-mail-with-qmail'." :type 'boolean :group 'wl-draft) (defcustom wl-draft-remove-group-list-contents t "*If non-nil, remove group list contents in `wl-draft-send-mail-with-smtp'." :type 'boolean :group 'wl-draft) ;;;; (defcustom wl-init-file "~/.wl" "*User customization setting file." :type 'file :group 'wl) (defcustom wl-folders-file "~/.folders" "*Folders file." :type 'file :group 'wl) (defcustom wl-address-file "~/.addresses" "*Addresses file." :type 'file :group 'wl) (defcustom wl-alias-file "~/.im/Aliases" "*Alias file for completion." :type 'file :group 'wl) (defcustom wl-ldap-server nil "*LDAP server." :type '(choice (const :tag "Default server(localhost)" nil) (string :tag "Server")) :group 'wl :group 'wl-setting) (defcustom wl-ldap-port nil "*LDAP port." :type '(choice (const :tag "Default port" nil) integer) :group 'wl :group 'wl-setting) (defcustom wl-ldap-base nil "*LDAP base." :type '(choice (const :tag "Default base" nil) (string :tag "Base")) :group 'wl :group 'wl-setting) (defcustom wl-use-ldap nil "*If non-nil, use LDAP for address completion." :type 'boolean :group 'wl :group 'wl-setting) (defcustom wl-use-acap nil "*If non-nil, use ACAP for configuration." :type 'boolean :group 'wl) (defcustom wl-folder-info-save t "If non-nil, save elmo-folder-info-alist." :type 'boolean :group 'wl-folder) (defcustom wl-summary-persistent-mark-priority-list '(killed flag new answered forwarded unread) "List of preserved flag symbols to define the priority to map to the persistent mark. Special symbol `flag' means the user defined flag." :type '(repeat (symbol :tag "preserved flag")) :group 'wl-summary) (defcustom wl-summary-flag-alist '((important "orange")) "An alist to define the global flags for the summary mode. Each element is a form like: \(SYMBOL-OF-FLAG COLOR [MARK]\) Example: \((important \"orange\"\) \(todo \"red\" \"T\"\) \(business \"green\" \"B\"\) \(private \"blue\"\)\)" :type '(repeat (list (symbol :tag "flag") (string :tag "color") (choice (string :tag "mark") (const :tag "Default mark" nil)))) :group 'wl-summary) (defcustom wl-summary-killed-mark "X" "Mark for killed message." :type '(string :tag "Mark") :group 'wl-summary-marks) (defcustom wl-summary-uncached-mark "!" "Mark for uncached message with no flag." :type '(string :tag "Mark") :group 'wl-summary-marks) (defcustom wl-summary-new-uncached-mark "N" "Mark for new and uncached message." :type '(string :tag "Mark") :group 'wl-summary-marks) (defcustom wl-summary-new-cached-mark "n" "Mark for new but already cached message." :type '(string :tag "Mark") :group 'wl-summary-marks) (defcustom wl-summary-unread-uncached-mark "U" "Mark for unread and uncached message." :type '(string :tag "Mark") :group 'wl-summary-marks) (defcustom wl-summary-unread-cached-mark "u" "Mark for unread but already cached message." :type '(string :tag "Mark") :group 'wl-summary-marks) (defcustom wl-summary-answered-cached-mark "a" "Mark for answered and cached message." :type '(string :tag "Mark") :group 'wl-summary-marks) (defcustom wl-summary-answered-uncached-mark "A" "Mark for answered but uncached message." :type '(string :tag "Mark") :group 'wl-summary-marks) (defcustom wl-summary-flag-mark "$" "Mark for the messages which have tags." :type '(string :tag "Mark") :group 'wl-summary-marks) (defcustom wl-summary-score-over-mark "+" "Score mark used for messages with high scores." :type '(string :tag "Mark") :group 'wl-summary-marks) (defcustom wl-summary-score-below-mark "-" "Score mark used for messages with low scores." :type '(string :tag "Mark") :group 'wl-summary-marks) (defcustom wl-summary-no-mime-folder-list nil "*All folders that match this list don't analyze mime." :type '(repeat string) :group 'wl-summary) (defcustom wl-summary-display-mime-mode-list '(mime as-is) "*Display mime mode list toggled by `wl-summary-toggle-mime'. Candidates are following: `mime' ... header and body are decoded `header-only' ... only header is decoded `as-is' ... header and body are not decoded" :type '(repeat (choice (const :tag "MIME" mime) (const :tag "HEADER-ONLY" header-only) (const :tag "AS-IS" as-is))) :group 'wl-summary) (defcustom wl-summary-fix-timezone nil "*Time zone of the date string in summary mode. If nil, it is adjust to the default time zone information \(system's default time zone or environment variable TZ)." :type '(choice (const :tag "Default time zone" nil) string) :group 'wl-summary) (defcustom wl-summary-message-ring-max 16 "*Maximum size of message ring on summary buffer. Start discarding off end if gets this big." :type 'integer :group 'wl-summary) (defcustom wl-summary-default-score 0 "*Default message score level. All scores generated by the score files will be added to this score. If this variable is nil, scoring will be disabled." :type '(choice (const :tag "disable" nil) integer) :group 'wl-score) (defcustom wl-summary-important-above nil "*Mark all messages with a score above this variable as important. This variable is local to the summary buffers." :type '(choice (const :tag "off" nil) integer) :group 'wl-score) (defcustom wl-summary-target-above nil "*Mark all messages with a score above this variable as target. This variable is local to the summary buffers." :type '(choice (const :tag "off" nil) integer) :group 'wl-score) (defcustom wl-summary-mark-below 0 "*Mark all messages with a score below this variable as read. This variable is local to each summary buffer and usually set by the score file." :type 'integer :group 'wl-score) (defcustom wl-summary-expunge-below nil "All messages that have a score less than this variable will be expunged. This variable is local to the summary buffers." :type '(choice (const :tag "off" nil) integer) :group 'wl-score) (defcustom wl-summary-score-marks (list wl-summary-new-uncached-mark wl-summary-new-cached-mark) "Persistent marks to scoring." :type '(repeat (string :tag "Mark")) :group 'wl-score) (defcustom wl-use-scoring t "*If non-nil, enable scoring." :type 'boolean :group 'wl-pref) (defcustom wl-summary-rescore-partial-threshold 200 "*Summary is not scored entirely if there are messages more than this value. In sync-all or rescan." :type 'integer :group 'wl-score) (defcustom wl-score-files-directory (concat elmo-msgdb-directory elmo-path-sep) "*Name of the directory where score files will be stored. \(default \"~/.elmo\")." :type 'directory :group 'wl) (defcustom wl-score-interactive-default-score 1000 "*Scoring commands will raise/lower the score with this number as the default." :type 'integer :group 'wl-score) (defcustom wl-score-expiry-days 7 "*Number of days before unused score file entries are expired. If this variable is nil, no score file entries will be expired." :type '(choice (const :tag "never" nil) number) :group 'wl-score) (defcustom wl-score-update-entry-dates t "*In 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." :type 'boolean :group 'wl-score) (defcustom wl-score-folder-alist nil "*Alist of folder regexp and score file." :type '(repeat (list (regexp :tag "Folder Regexp") (repeat :inline t (choice file (symbol :tag "Variable"))))) :group 'wl-score) (defcustom wl-score-folder-alist-matchone t "*If non-nil, getting only one element of `wl-score-folder-alist'." :type 'boolean :group 'wl-score) (defcustom wl-score-default-file "all.SCORE" "*Default score file name." :type 'file :group 'wl-score) (defcustom wl-score-simplify-fuzzy-regexp '("^[ \t]*\\[[^:]+[,: ][0-9]+\\][ \t]*") "*Strings to be removed when doing fuzzy matches. This can either be a regular expression or list of regular expressions." :type '(repeat regexp) :group 'wl-score) (defcustom wl-score-header-default-entry '(("number" -1000 perm =) ("subject" -1000 nil nil) ("from" -1000 perm s) ("message-id" -1000 temp e) ("references" -1000 perm e) ("to" -1000 perm s) ("cc" -1000 perm s) ("date" -1000 temp nil) ("xref" -1000 perm s) ("extra" -1000 perm s) ("chars" -1000 perm >) ("lines" -1000 perm >) ("followup" -1000 perm s) ("thread" -1000 temp s)) "*Default entry when insert score entry." :type '(repeat (list (string :tag "Header") (choice (integer :tag "Score") (const :tag "Ask" nil)) (choice (const :tag "Permanent" perm) (const :tag "Temporary" temp) (const :tag "Ask" nil)) (choice (const :tag "Regexp string" r) (const :tag "Substring" s) (const :tag "fuzzy string" f) (const :tag "Exact string" e) (const :tag "REGEXP STRING" R) (const :tag "SUBSTRING" S) (const :tag "FUZZY STRING" F) (const :tag "EXACT STRING" E) (const :tag "less than" <) (const :tag "less equal" <=) (const :tag "greater than" >) (const :tag "greater equal" >=) (const :tag "equal" =) (const :tag "Ask" nil)))) :group 'wl-score) (defcustom wl-score-mode-mime-charset 'x-ctext "*MIME Charset for score file." :type 'symbol :group 'wl-score) (defcustom wl-draft-fields '("To:" "Cc:" "Bcc:" "Fcc:" "Distribution:" "Organization:" "Newsgroups:" "Followup-To:" "Mail-Followup-To:" "From:" "Reply-To:") "Fields used in draft mode." :type '(repeat (string :tag "Field")) :group 'wl-draft) ;; MIME Bcc. (defcustom wl-draft-mime-bcc-field-name "Ecc" "Field name for MIME-encapsulated Bcc." :type '(string :tag "Field Name") :group 'wl-draft) (defcustom wl-draft-mime-bcc-body nil "Body string for MIME-encapsulated Bcc. If nil, a string `This is a blind carbon copy.' is used." :type '(choice (const :tag "default" nil) (string :tag "Body")) :group 'wl-draft) (defcustom wl-draft-disable-bcc-for-mime-bcc t "Disable Bcc while MIME-encapsulated Bcc." :type 'boolean :group 'wl-draft) (defcustom wl-draft-disable-fcc-for-mime-bcc t "Disable Fcc while MIME-encapsulated Bcc." :type 'boolean :group 'wl-draft) (defcustom wl-draft-config-alist nil "Alist of condition and actions for dynamical draft modification. First element of each list is some condition for the draft buffer (regular expression for header or elisp expression) and remaining elements indicate actions. If the first element is `reply' keyword, the next element be the condition for the message being replied, and remaining elements are actions. The configuration is applied when `wl-draft-config-exec' is called, or applied automatically before sending message. ex. '((\"^To: .*wl@ml.gentei.org\" (\"From\" . my-from-address-for-wl-list) (\"Organization\" . my-organization-for-wl-list)) (reply \"^To: .*hogehoge@aaa.ne.jp\" (\"From\" . \"Alternative Address \") my-draft-config-function-hogehoge)) See also variable `wl-draft-parent-folder'." :type '(repeat (list (sexp :tag "Match") (repeat :inline t (choice (cons (sexp :tag "Field(Variable)") (sexp :tag "Value")) (sexp :tag "Function"))))) :group 'wl-draft :group 'wl-setting) (defcustom wl-draft-config-matchone nil "*If non-nil, applied only one element of `wl-draft-config-alist'." :type 'boolean :group 'wl-draft :group 'wl-setting) (defcustom wl-draft-elide-ellipsis "\n[...]\n\n" "*The string which is inserted for elided text." :type 'string :group 'wl-draft) (defcustom wl-template-alist nil "Alist of template. First element of each list is a string specifies the name of the template. Remaining elements indicate actions. The format of actions is same as that of `wl-draft-config-alist'." :type '(repeat (list (string :tag "Name") (repeat :inline t (choice (cons (sexp :tag "Field(Variable)") (sexp :tag "Value")) (sexp :tag "Function"))))) :group 'wl-draft :group 'wl-setting) (defcustom wl-template-visible-select t "*If non-nil, select template with visible." :type 'boolean :group 'wl-draft) (defcustom wl-template-confirm nil "*If non-nil, require your confirmation when selected template." :type 'boolean :group 'wl-draft) (defcustom wl-template-buffer-lines 7 "*Lines of template buffer." :type 'integer :group 'wl-draft) ;; queued sending. (defcustom wl-draft-enable-queuing t "*Non-nil enables queued sending." :type 'boolean :group 'wl-draft :group 'wl-pref) (defcustom wl-draft-force-queuing nil "*Non-nil forces queued sending for mail and news." :type 'boolean :group 'wl-draft :group 'wl-pref) (defcustom wl-draft-force-queuing-mail nil "*Non-nil forces queued sending for mail." :type 'boolean :group 'wl-draft :group 'wl-pref) (defcustom wl-draft-force-queuing-news nil "*Non-nil forces queued sending for news." :type 'boolean :group 'wl-draft :group 'wl-pref) (defcustom wl-draft-use-cache nil "*If non-nil, sending message is cached." :type 'boolean :group 'wl-draft :group 'wl-pref) (defcustom wl-auto-flush-queue t "*If non-nil, sending queue is flushed when network status is toggled." :type 'boolean :group 'wl-draft :group 'wl-pref) (defcustom wl-draft-reply-buffer-style 'split "Style of draft buffer for `wl-summary-reply' and `wl-summary-forward'. 'keep will use the existing message buffer window for the reply, 'full will use a full frame window, 'split will split the message window vertically (top-to-bottom), and 'split-horiz will split the message window horizontally (side-by-side). If a function is given, it is called with the draft buffer as an argument. For 'split and 'split-horiz if the current window is the folder window, and the summary window is visible, then the summary window is visited (with `wl-folder-jump-to-previous-summary') before any action is taken." :type '(choice (const :tag "Keep window" keep) (const :tag "Split window vertically" split) (const :tag "Split window horizontally" split-horiz) (const :tag "Full window" full) (sexp :tag "Use Function")) :group 'wl-draft) (defcustom wl-draft-buffer-style 'full "Style of draft buffer for writing new messages (i.e. except for `wl-summary-reply' and `wl-summary-forward'). 'keep will use the current window for the new message, 'full will use a full frame window, 'split will split the current window vertically (top-to-bottom), 'msg-split will split the message buffer window vertically (top-to-bottom), 'spilt-horiz will split the current window horizontally (side-by-side), and 'msg-spilt-horiz will split the message window horizontally (side-by-side). If a function is given, it is called with the draft buffer as an argument. If the message window is not visible then the current window is used. For 'split, 'msg-split, 'split-horiz, and 'msg-split-horiz if the current window is the folder window, and the summary window is visible, then the summary window is visited (with `wl-folder-jump-to-previous-summary') before any action is taken." :type '(choice (const :tag "Keep window" keep) (const :tag "Split current window vertically" split) (const :tag "Split message window vertically" msg-split) (const :tag "Split current window horizontally" split-horiz) (const :tag "Split message window horizontally" msg-split-horiz) (const :tag "Full window" full) (sexp :tag "Use Function")) :group 'wl-draft) (defcustom wl-draft-reply-default-position 'body "Begining position of reply buffer. 'body means the top of body. 'bottom means the bottom of body. 'top means the top of header. \"To\", \"Newsgroups\", \"Subject\" means the position of the header field. You can also set it to a list of setting. " :type '(choice (repeat (choice (const :tag "Top of body" body) (const :tag "Bottom of body" bottom) (const :tag "Top of header" top) (const "To") (const "Newsgroups") (const "Subject") (string :tag "Header Name"))) (const :tag "Top of body" body) (const :tag "Bottom of body" bottom) (const :tag "Top of header" top) (const "To") (const "Newsgroups") (const "Subject") (string :tag "Header Name")) :group 'wl-draft) (defcustom wl-draft-queue-save-variables '(wl-envelope-from wl-from wl-smtp-posting-server wl-smtp-posting-user wl-smtp-posting-port wl-smtp-authenticate-type wl-smtp-connection-type wl-pop-before-smtp-server wl-pop-before-smtp-user wl-pop-before-smtp-port wl-pop-before-smtp-stream-type wl-pop-before-smtp-authenticate-type wl-nntp-posting-server wl-nntp-posting-server wl-nntp-posting-user wl-nntp-posting-port wl-nntp-posting-stream-type) "*Saving variables in queue info." :type '(repeat (sexp :tag "Variable")) :group 'wl-draft) (defcustom wl-draft-sendlog t "*Keep send state in log if non-nil." :type 'boolean :group 'wl-draft) (defcustom wl-draft-sendlog-max-size 20000 "*Max file size of sendlog." :type '(choice (const :tag "Unlimited" nil) integer) :group 'wl-draft) (defcustom wl-summary-default-number-column 5 "Number of columns in summary buffer." :type 'integer :group 'wl-summary) (defcustom wl-summary-number-column-alist '(("\\*.*" . 6)) "Alist of folder and its number column. If no matches, 'wl-summary-default-number-column' is used. ex. '((\"^%inbox@qmail-maildir\" . 9) (\"^-.*@news-server\" . 6))" :type '(repeat (cons (regexp :tag "Folder Regexp") integer)) :group 'wl-summary) (defcustom wl-summary-highlight t "Non-nil forces Summary buffer to be highlighted." :type 'boolean :group 'wl-summary :group 'wl-highlight) (defcustom wl-summary-lazy-highlight t "Non-nil forces lazy summary highlighting using `window-scroll-functions'." :type 'boolean :group 'wl-summary :group 'wl-highlight) (defcustom wl-summary-highlight-partial-threshold 1000 "Summary is not highlighted entirely if there are lines more than this value. Available if only `wl-summary-lazy-highlight' is nil." :type 'integer :group 'wl-summary :group 'wl-highlight) (defcustom wl-summary-partial-highlight-above-lines 30 "If Summary has lines more than `wl-summary-highlight-partial-threshold', Summary lines are highlighted partialy above current position. Available if only `wl-summary-lazy-highlight' is nil." :type 'integer :group 'wl-summary :group 'wl-highlight) (defcustom wl-summary-lazy-update-mark t "Non-nil forces lazy update mark using `window-scroll-functions'." :type 'boolean :group 'wl-summary) (defcustom wl-summary-cache-use t "Non-nil forces wl-summary to use cache file." :type 'boolean :group 'wl-summary) (defcustom wl-summary-auto-sync-marks t "Non-nil forces to synchronize unread/important marks." :type 'boolean :group 'wl-summary) (defcustom wl-summary-cache-file ".wl-summary-cache" "*Cache file for summary mode contents." :type 'file :group 'wl-summary) (defcustom wl-summary-view-file ".wl-summary-view" "*Current summary view." :type 'file :group 'wl-summary) (defcustom wl-thread-top-file ".wl-thread-top" "*Current thread top entity... obsolete." :type 'file :group 'wl-summary) (defcustom wl-thread-entity-file ".wl-thread-entity" "*Thread entities." :type 'file :group 'wl-summary) (defcustom wl-thread-entity-list-file ".wl-thread-entity-list" "*Thread top entity list." :type 'file :group 'wl-summary) (defcustom wl-print-buffer-function 'lpr-buffer "A function to print current buffer." :type 'function :group 'wl-pref) (defcustom wl-ps-print-buffer-function (if window-system 'ps-print-buffer-with-faces 'ps-print-buffer) "A function to print current buffer with ps-print." :type 'function :group 'wl-pref) ;;;; Preferences (defcustom wl-use-petname t "*Display petname in summary and default citation title." :type 'boolean :group 'wl-pref) (defcustom wl-use-folder-petname '(modeline) "*List of situation using folder petname. Allowed situations are: modeline : displayed on modeline. ask-folder : displayed on minibuffer when ask folder. read-folder : can used for completion at `wl-summary-read-folder'." :type '(set (const modeline) (const ask-folder) (const read-folder)) :group 'wl-summary :group 'wl-pref) (defcustom wl-folder-petname-alist nil "A list of (realname . petname)." :type '(repeat (cons (string :tag "Realname") (string :tag "Petname"))) :group 'wl-folder) (defcustom wl-summary-weekday-name-lang (if (string-equal "Japanese" (symbol-value 'current-language-environment)) "ja" "en") "*Language to display week day." :type '(choice (const "ja") (const "en") (const "fr") (const "de") (string :tag "Other")) :group 'wl-summary :group 'wl-pref) (defcustom wl-message-id-use-message-from (if (boundp 'wl-message-id-use-wl-from) wl-message-id-use-wl-from t) "When non-nil, use From: header's field value for domain part of Message-ID preferably." :type 'boolean :group 'wl-pref) (defcustom wl-message-id-hash-function nil "Indicate hash function for the local part when Message-ID is made from mail address. Hash function receives a string and returns hashed string. Nil means the local part is not hashed." :type '(choice (const :tag "as is" nil) function) :group 'wl-pref) (defcustom wl-local-domain nil "*Domain part of this client (without hostname). Set this if (system-name) does not return FQDN." :type '(choice (const :tag "Use System Name" nil) string) :group 'wl-pref) (defcustom wl-message-id-domain nil "*Specific domain part of Message-ID." :type '(choice (const :tag "Use System Name" nil) string) :group 'wl-pref) (defcustom wl-unique-id-suffix ".wl" "*Specific string in generated Message-ID which appear just before @ (domain based) or % (mail address based)." :type 'string :group 'wl-pref) (defcustom wl-break-pages t "*Break Pages at ^L." :type 'boolean :group 'wl-pref) (defcustom wl-message-auto-reassemble-message/partial nil "*Reassemble message/partial messages automatically on show when non-nil." :type 'boolean :group 'wl-pref) (defcustom wl-message-use-header-narrowing t "Use header narrowing when non-nil." :type 'boolean :group 'wl-pref) (defcustom wl-message-header-narrowing-fields '("to" "cc") "A list of field name to enable header narrowing." :type '(repeat string) :group 'wl-pref) (defcustom wl-message-header-narrowing-lines 4 "Line number to enable the header narrowing." :type 'integer :group 'wl-pref) (defcustom wl-message-header-narrowing-string "..." "A string used for header narrowing truncation." :type 'string :group 'wl-pref) (defvar wl-message-mode-line-format-spec-alist '((?f (if (memq 'modeline wl-use-folder-petname) (wl-folder-get-petname wl-message-buffer-cur-folder) wl-message-buffer-cur-folder)) (?m (upcase (symbol-name (wl-message-display-type-property wl-message-buffer-cur-display-type :mime)))) (?F wl-message-buffer-flag-indicator) (?n wl-message-buffer-cur-number)) "An alist of format specifications for message buffer's mode-lines. Each element is a list of following: \(SPEC STRING-EXP) SPEC is a character for format specification. STRING-EXP is an expression to get string to insert.") (defcustom wl-message-mode-line-format "Wanderlust: << %f / %n %F>> [%m]" "*A format string for message buffer's mode-line of Wanderlust. It may include any of the following format specifications which are replaced by the given information: %f The folder name. %n The number of the message. %m The MIME analysis status. %F The global flag indicator." :group 'wl-pref :type 'string) (defcustom wl-message-truncate-lines truncate-lines "*Truncate lines in Message Buffer." :type 'boolean :group 'wl-pref) (defcustom wl-draft-truncate-lines truncate-lines "*Truncate lines in Draft Buffer." :type 'boolean :group 'wl-draft :group 'wl-pref) (defcustom wl-message-scroll-amount nil "*Scroll amount by SPC key." :type '(choice (const :tag "scrolling by screenfuls" nil) integer) :group 'wl-pref) (defcustom wl-message-window-size '(1 . 4) "*Size of summary and message window. cons cell of (Summary : Message)." :type '(cons integer integer) :group 'wl-pref) (defcustom wl-message-sort-field-list '("Return-Path" "Received" "^To" "^Cc" "Newsgroups" "Subject" "^From") "*Sort order of header fields. Each elements are regexp of field name." :type '(repeat (string :tag "Field Regexp")) :group 'wl-pref :group 'wl-setting) (defcustom wl-message-ignored-field-list nil "All fields that match this list will be hidden in message buffer. Each elements are regexp of field-name. You can specify exceptions by `wl-message-visible-field-list'." :type '(repeat (string :tag "Field Regexp")) :group 'wl-pref :group 'wl-setting) (defcustom wl-message-visible-field-list nil "All fields that match this list will be displayed in message buffer. Each elements are regexp of field-name. This variable overwhelm `wl-message-ignored-field-list' settings." :type '(repeat (string :tag "Field Regexp")) :group 'wl-pref :group 'wl-setting) (defcustom wl-message-header-button-alist '(("^\\(References\\|Message-Id\\|In-Reply-To\\):" "<[^>\n ]+>" 0 wl-message-button-refer-article 0) ("^[^:]+:" "\\(<\\(url: \\)?news:\\([^>\n ]*\\)>\\)" 1 wl-message-button-refer-article 3)) "Alist of headers and regexps to match buttons in message headers." :type '(repeat (list (regexp :tag "Header") regexp (integer :tag "Button") (function :tag "Callback") (repeat :tag "Data" :inline t (integer :tag "Regexp group")))) :group 'wl-pref) (defcustom wl-message-body-button-alist '(("]+>" 0 'ignore 0 1024) ("<[^>\n ]+@[^>\n ]+>" 0 wl-message-button-refer-article 0 1024)) "Alist of regexps to match buttons in message body." :type '(repeat (list regexp (integer :tag "Button") (function :tag "Callback") (repeat :tag "Data" :inline t (integer :tag "Regexp group")) (integer :tag "Max Length"))) :group 'wl-pref) (defcustom wl-folder-window-width 20 "*Width of folder window." :type 'integer :group 'wl-folder :group 'wl-pref) (defcustom wl-summary-recenter t "*Recenter on redisplay." :type 'boolean :group 'wl-summary :group 'wl-pref) (defcustom wl-folder-use-frame nil "*Use dedicated frame for folder mode if non-nil." :type 'boolean :group 'wl-pref) (defcustom wl-summary-use-frame nil "*Use dedicated frame for each folder summary if non-nil." :type 'boolean :group 'wl-pref) (defcustom wl-stay-folder-window nil "*Stay folder window when folder is selected if non-nil." :type 'boolean :group 'wl-pref) (defcustom wl-reply-subject-prefix "Re: " "*Prefix of the subject of the replied message. The value is string or string valued function to be evalueted in the target message buffer." :type '(choice string function) :group 'wl-draft :group 'wl-pref) (defcustom wl-forward-subject-prefix "Forward: " "*Prefix of the subject of the forwarded message. The value is string or string valued function to be evalueted in the target message buffer." :type '(choice string function) :group 'wl-draft :group 'wl-pref) (defcustom wl-draft-reply-use-address-with-full-name t "*Use address with full-name in the draft of replied message." :type 'boolean :group 'wl-pref :group 'wl-draft) (defcustom wl-subject-re-prefix-regexp "^[ \t]*\\([Rr][Ee][:>][ \t]*\\)*[ \t]*" "*Regexp matching \"Re: \" in the subject line." :type 'regexp :group 'wl-draft :group 'wl-pref) (defcustom wl-subject-forward-prefix-regexp "^[ \t]*\\(\\([Ff][Oo][Rr][Ww][Aa][Rr][Dd]\\|[Ff][Ww][Dd]\\|[Ff][Ww]\\)[:>][ \t]*\\)*[ \t]*" "*Regexp matching \"Forward: \", \"Fwd: \", or \"Fw: \" in the subject line." :type 'regexp :group 'wl-draft :group 'wl-pref) (defcustom wl-folder-many-unsync-threshold 70 "*Folders which contains messages more than this number are highlighted with wl-highlight-folder-many-face." :type 'integer :group 'wl-folder :group 'wl-pref) (defcustom wl-fcc nil "*Folder Carbon Copy target initially added at creating draft buffer." :type '(choice (const :tag "disable" nil) string function) :group 'wl-draft :group 'wl-pref) (defcustom wl-fcc-force-as-read nil "*If non-nil, mark copied message as read." :type 'boolean :group 'wl-draft :group 'wl-pref) (defcustom wl-bcc nil "*Blind Carbon Copy target initially added at creating draft buffer." :type '(choice (const :tag "disable" nil) string) :group 'wl-draft :group 'wl-pref) (defcustom wl-folder-desktop-name "Desktop" "*An implicit name of the folder top entity." :type 'string :group 'wl-folder :group 'wl-pref) (defcustom wl-summary-indent-length-limit 46 "*Limit of indent length for thread. Nil means unlimited" :type '(choice (const :tag "Unlimited" nil) integer) :group 'wl-summary :group 'wl-pref) (defcustom wl-summary-max-thread-depth 30 "*If thread depth of the message is larger than this value, divide it." :type '(choice (const :tag "Unlimited" nil) integer) :group 'wl-summary :group 'wl-pref) (defcustom wl-summary-no-from-message "nobody@nowhere?" "*A string displayed in summary when no from field exists." :type 'string :group 'wl-summary) (defcustom wl-summary-no-subject-message "(WL:No Subject in original.)" "*A string displayed in summary when no subject field exists." :type 'string :group 'wl-summary) (defcustom wl-summary-cancel-message "I'd like to cancel my message." "*The body content of a cancel message." :type 'string :group 'wl-summary) (defcustom wl-summary-width 80 "*Set summary line width if non nil." :type '(choice (const :tag "Don't truncate" nil) integer) :group 'wl-summary :group 'wl-pref) (defcustom wl-summary-print-argument-within-window nil "*If non-nil, always print argument right side of window." :type 'boolean :group 'wl-summary :group 'wl-pref) (defcustom wl-summary-pick-field-default "Body" "*Default field for pick." :type '(radio (const "From") (const "Subject") (const "To") (const "Cc") (const "Body") (const "Raw-Body") (const "Since") (const "Before") (const "Last") (const "First") (string :tag "Other")) :group 'wl-summary) (defcustom wl-mime-charset 'x-ctext "*MIME Charset for summary and message." :type 'symbol :group 'wl-summary :group 'wl-pref) (defcustom wl-generate-mailer-string-function 'wl-generate-user-agent-string "A function for creating User-Agent field string." :type 'function :group 'wl-draft) (defcustom wl-highlight-background-mode 'dark "*Background mode of highlight (for Old Emacsen). 'dark or 'light." :type '(radio (const dark) (const light)) :group 'wl-highlight) (defcustom wl-highlight-x-face-function nil "A function to display X-Face." :type 'function :group 'wl-highlight) (defcustom wl-qmail-inject-program "/var/qmail/bin/qmail-inject" "Location of the qmail-inject program." :type '(string :tag "Program") :group 'wl-draft) (defcustom wl-qmail-inject-args nil "Arguments passed to qmail-inject programs. This should be a list of strings, one string for each argument. For e.g., if you wish to set the envelope sender address so that bounces go to the right place or to deal with listserv's usage of that address, you might set this variable to '(\"-f\" \"you@some.where\")." :type '(repeat (string :tag "Argument")) :group 'wl-draft) (defcustom wl-rejected-letter-start "^[\t ]*-+[\t ]+\\(\\(original\\|\\(\\(the \\)?unsent\\)\\) message\\( follows\\)?[\t ]+-+[\t ]*\\|Below this line is a copy of the message\\..*\\)$" "Regexp specifying the beginning of the wrapper around a returned letter. This wrapper is generated by the mail system when rejecting a letter." :type 'regexp :group 'wl-draft) (defcustom wl-ignored-forwarded-headers "\\(received\\|return-path\\|x-uidl\\)" "*All headers that match this regexp will be deleted when forwarding a message." :type 'regexp :group 'wl-draft) (defcustom wl-ignored-resent-headers "\\(return-receipt\\|[bdf]cc\\)" "*All headers that match this regexp will be deleted when resending a message." :type 'regexp :group 'wl-draft) (defcustom wl-auto-save-drafts-interval 300 "Idle interval in seconds to save draft buffers automatically. If you don't want to use this feature, set this to nil." :type '(choice (const :tag "Don't use this feature" nil) (number :tag "Secs")) :group 'wl-draft) (defcustom wl-draft-preview-attributes t "Non-nil forces to preview the attributes in the `wl-draft-preview-message'. Attributes specified in the `wl-draft-preview-attributes-list' are displayed." :type 'boolean :group 'wl-draft) (defcustom wl-draft-preview-attributes-list '((mail recipients envelope-from send-mail-method smtp-settings pop-before-smtp-settings pgp-processings) (news newsgroups nntp-method nntp-settings pgp-processings)) "*Attribute symbols to display in the draft preview. Candidates are following: `recipients' `envelope-from' `send-mail-method' `smtp-posting-server' `smtp-posting-port' `smtp-settings' `pop-before-smtp-settings' `newsgroups' `nntp-posting-server' `nntp-posting-port' Also variables which begin with `wl-' can be specified \(`wl-' have to be removed\)" :type '(choice (repeat (cons (choice (const :tag "Mail" mail) (const :tag "News" news)) (repeat symbol))) (repeat symbol)) :group 'wl-draft) (defcustom wl-draft-preview-attributes-buffer-lines t "Buffer height for the draft attribute preview. Non-integer means decide height from number of attributes automatically. Negative-integer means add absolute value to automated height." :type '(choice integer (const :tag "Automated" t)) :group 'wl-draft) (defcustom wl-draft-preview-attributes-buffer-name "*Preview Attributes*" "*Buffer name for the draft attribute preview." :type 'string :group 'wl-draft) (defcustom wl-refile-default-from-folder "+from" "*Folder name to refile by `wl-refile-guess-by-from'." :type '(string :tag "Folder") :group 'wl-pref) (defcustom wl-summary-auto-refile-skip-marks (list wl-summary-new-uncached-mark wl-summary-new-cached-mark wl-summary-unread-uncached-mark wl-summary-unread-cached-mark) "Persistent marks to skip auto-refiling." :type '(repeat (string :tag "Mark")) :group 'wl-summary) (defcustom wl-summary-reserve-mark-list (list "o" "O" "D" "d" "i") "If a message is already marked as temporal marks in this list, the message is not marked by any mark command." :type '(repeat (string :tag "Temp-Mark")) :group 'wl-summary) (defcustom wl-summary-skip-mark-list (list "D" "d") "If a message is already marked as temporal marks in this list, the message is skipped at cursor move." :type '(repeat (string :tag "Temp-Mark")) :group 'wl-summary) (defcustom wl-summary-incorporate-marks (list wl-summary-new-uncached-mark wl-summary-unread-uncached-mark) "Persistent marks to prefetch at `wl-summary-incorporate'." :type '(repeat (string :tag "Mark")) :group 'wl-summary) (defcustom wl-refile-rule-alist nil "Refile rule alist. e.x. '((\"From\" (\"teranisi@isl.ntt.co.jp\" . \"+teranisi\")) (\"x-ml-name\" (\"^Wanderlust\" . \"+wl\") (\"^Elips\" . \"+elips\")))" :type '(repeat (list (string :tag "Field") (repeat :inline t (cons (regexp :tag "Value") (string :tag "Folder"))))) :group 'wl-pref) (defcustom wl-strict-diff-folders nil "List of regexps matching folders of which Wanderlust seriously counts unsync messages." :type '(choice (const :tag "Off" nil) (repeat (regexp :tag "Folder Regexp"))) :group 'wl-folder) (defcustom wl-folder-use-server-diff t "Checked unread message number on IMAP4 server. Only IMAP4 folders have an effect." :type 'boolean :group 'wl-folder) (defcustom wl-force-fetch-folders nil "Non-nil forces to fetch subfolders when user opened an 'access' folder." :type '(choice (const :tag "off" nil) (const :menu-tag "on" t) (repeat (regexp :tag "Folder Regexp"))) :group 'wl-folder) (defcustom wl-auto-check-folder-name nil "*A folder, a group or a list of folders and groups specified which will be automatically checked at the startup time." :type '(choice (string :tag "Folder") (repeat (string :tag "Folder")) (const none)) :group 'wl-folder) (defcustom wl-auto-uncheck-folder-list '("\\$.*") "All folders that match this list won't be checked at the startup time even if they are embedded in some groups specified by wl-auto-check-folder-name. Those folders are also skipped when you check on the Desktop. This value is preceded by wl-auto-check-folder-list. Each elements are regexp of folder name." :type '(repeat (regexp :tag "Folder Regexp")) :group 'wl-folder) (defcustom wl-auto-check-folder-list nil "A list of patterns for exceptional folders against wl-auto-uncheck-folder-list. Each elements are regexp of folder name." :type '(repeat (regexp :tag "Folder Regexp")) :group 'wl-folder) (defcustom wl-show-plug-status-on-modeline t "If it is non-nil, show plugged status in modeline." :type 'boolean :group 'wl-setting) (defcustom wl-plug-state-indicator-on " [ON] " "String used to show plugged status ON." :type 'string :group 'wl-setting) (defcustom wl-plug-state-indicator-off " [--] " "String used to show plugged status OFF." :type 'string :group 'wl-setting) (defcustom wl-biff-check-folder-list nil "All folders that include this list are automatically checked every intervals specified by `wl-biff-check-interval'." :type '(repeat (string :tag "Folder")) :group 'wl-setting) (defcustom wl-biff-check-interval 40 "Number of seconds between updates of new mails in the mode line." :type 'number :group 'wl-setting) (defcustom wl-biff-check-delay 0 "After interval specified by `wl-biff-check-interval', automatically checking new mail will start when Emacs keeps idle longer than specified seconds by this varaible. It has no effect on the case which `wl-biff-use-idle-timer' is non-nil." :type 'number :group 'wl-setting) (defcustom wl-biff-use-idle-timer nil "Non-nil means that Emacs will not use normal timer for wl-biff." :type 'boolean :group 'wl-setting) (defcustom wl-biff-state-indicator-on ;; Youbin mark (decode-coding-string (read "\"[\e$B\\\")\e(B]\"") 'iso-2022-jp) "String used to show biff status ON." :type 'string :group 'wl-setting) (defcustom wl-biff-state-indicator-off "[‐]" ;; Japanese short hyphen "String used to show biff status OFF." :type 'string :group 'wl-setting) (defcustom wl-mode-line-display-priority-list '(biff plug title) "Displaying order of items to be shown in modeline. The first item will be placed in the leftmost. The significant items are `biff' and `plug'; otherwise, e.g. `title', corresponds to the things except for the biff staus nor the plugged status. The default order is '(biff plug title) even if the value of this option is set to nil. Here are some samples: ;; Plugged status first: \(setq wl-mode-line-display-priority-list '(plug)) ;; Biff status, Title of Wanderlust, Plugged status: \(setq wl-mode-line-display-priority-list '(biff title plug)) " :type '(repeat (radio (const :format "%v " biff) (const :format "%v " plug) (sexp :tag "Other" :value title))) :group 'wl-setting) (defcustom wl-interactive-send t "*If non-nil, require your confirmation when sending draft message." :type 'boolean :group 'wl-pref :group 'wl-setting) (defcustom wl-interactive-exit t "*If non-nil, require your confirmation when exiting WL." :type 'boolean :group 'wl-pref) (defcustom wl-summary-move-order 'unread "*The order of priority when move in summary mode. If this variable is `unread', precede \"U\", \"u\", \"N\", \"n\" mark. If this variable is `new', precede \"N\", \"n\" mark." :type '(radio (const new) (const unread)) :group 'wl-summary :group 'wl-setting) (defvar wl-summary-move-direction-downward t) (defcustom wl-summary-move-direction-toggle t "*If non-nil, search direction for the next message will be determined depends on previous search direction. It uses wl-summary-move-direction-downward as a direction flag." :type 'boolean :group 'wl-summary) (defcustom wl-auto-select-first nil "*If non-nil, display selected first message when enter summary." :type 'boolean :group 'wl-pref :group 'wl-setting) (defcustom wl-auto-prefetch-first nil "*If non-nil, prefetch selected first message when enter summary." :type 'boolean :group 'wl-pref :group 'wl-setting) (defcustom wl-auto-select-next nil "*If non-nil, offer to go to the next folder from the end of the previous. If the value is the symbol `unread', go to the next folder that no unread message exists. If the value is the symbol `skip-no-unread', skip the folder that no unread message exists. See also variable `wl-summary-next-no-unread-command'." :type '(radio (const :tag "off" nil) (const :tag "on" t) (const unread) (const skip-no-unread)) :group 'wl-pref :group 'wl-setting) (defcustom wl-message-popup-buffers '(mime-echo-buffer-name epa-info-buffer) "*List of buffer or name which is popped up with message buffer." :type '(repeat (choice (symbol :tag "Variable") (string :tag "Buffer name"))) :group 'wl-setting) (defcustom wl-message-buffer-name " *WL:Message*" "*Buffer name for message buffers." :type 'string :group 'wl-pref :group 'wl-setting) (defcustom wl-message-buffer-prefetch-folder-type-list '(imap4 nntp) "*All folder types that match this list prefetch next message, and reserved buffer cache." :type `(choice (const :tag "all" t) (const :tag "never" nil) (set (const localdir) (const localnews) (const maildir) (const imap4) (const nntp) (const pop3) (const shimbun) (const search) (const archive) (const mark) (const cache))) :group 'wl-pref) (defcustom wl-message-buffer-prefetch-folder-list nil "*All folders that match this list prefetch next message, and reserved buffer cache. e.x. '(\"^[-%]\")" :type '(repeat (regexp :tag "Folder Regexp")) :group 'wl-pref) (defcustom wl-message-buffer-prefetch-depth 1 "*Depth of buffer prefetch in summary mode." :type 'integer :group 'wl-pref) (defcustom wl-message-buffer-prefetch-idle-time 1 "*Idle time of buffer prefetch." :type 'number :group 'wl-pref) (defcustom wl-message-buffer-prefetch-threshold 30000 "*Quit forward cache prefetching if message size is larger than this value." :type 'integer :group 'wl-pref) (defcustom wl-summary-always-sticky-folder-list nil "All folders that match this list has sticky summary. Each elements are regexp of folder name." :type '(radio (const :tag "none" nil) (const :tag "all" t) (repeat (regexp :tag "Folder Regexp"))) :group 'wl-pref) (defcustom wl-summary-force-prefetch-folder-list nil "All folders that match this list are prefetched. Each elements are regexp of folder name." :type '(radio (const :tag "none" nil) (const :tag "all" t) (repeat (regexp :tag "Folder Regexp"))) :group 'wl-pref) (defcustom wl-no-save-folder-list '("^/.*$" "^\\[.*$") "All folders that match this list won't save its msgdb. Each elements are regexp of folder name." :type '(repeat (regexp :tag "Folder Regexp")) :group 'wl-pref) (defcustom wl-save-folder-list nil "All folders that match this list save its msgdb. Each elements are regexp of folder name." :type '(repeat (regexp :tag "Folder Regexp")) :group 'wl-pref) (defcustom wl-folder-mime-charset-alist '(("^-alt\\.chinese" . big5) ("^-relcom\\." . koi8-r) ("^-tw\\." . big5) ("^-han\\." . euc-kr) ("@sponichi" . shift_jis) ("@2ch" . shift_jis)) "Charset alist. If no match, `wl-mime-charset' is used." :type '(repeat (cons (regexp :tag "Folder Regexp") (symbol :tag "Charset"))) :group 'wl-summary :group 'wl-pref) (defcustom wl-folder-weekday-name-lang-alist '(("^-alt\\.chinese" . "en") ("^-relcom\\." . "en") ("^-tw\\." . "en") ("^-han\\." . "en")) "Weekday name lang alist. If no match, `wl-summary-weekday-name-lang' is used. e.x. '((\"xemacs-beta$\" . \"en\") (\"^-fj\" . \"ja\"))" :type '(repeat (cons (regexp :tag "Folder Regexp") (choice (const "ja") (const "en") (const "fr") (const "de") (string :tag "Other")))) :group 'wl-pref) (defcustom wl-folder-thread-indent-set-alist '(("^-alt\\.chinese" . (2 "+" "+" "|" "-" " ")) ("^-relcom\\." . (2 "+" "+" "|" "-" " ")) ("^-tw\\." . (2 "+" "+" "|" "-" " ")) ("^-han\\." . (2 "+" "+" "|" "-" " "))) "Thread indent set alist. If no match, following indent set is used. \(wl-thread-indent-level wl-thread-have-younger-brother-str wl-thread-youngest-child-str wl-thread-vertical-str wl-thread-horizontal-str wl-thread-space-str) e.x. '((\"xemacs-beta$\" . (2 \"+\" \"+\" \"|\" \"-\" \" \")))" :type '(repeat (cons (regexp :tag "Folder Regexp") (group (integer :tag "Indent") (string :tag "Yonger Brother") (string :tag "Yonger Child") (string :tag "Vertical") (string :tag "Horizontal") (string :tag "Space")))) :group 'wl-pref) (defcustom wl-folder-sync-range-alist (list (cons 'wl-require-update-all-folder-p "all")) "*Default sync range alist. If no matches, `wl-default-sync-range' is used." :type '(repeat (cons (choice (regexp :tag "Folder Regexp") (symbol :tag "A function")) (choice (const "update") (const "all") (const "rescan") (const "no-sync") (const :tag "none" nil)))) :group 'wl-pref) (defcustom wl-default-sync-range "update" "*Default sync range." :type '(choice (const "update") (const "all") (const "rescan") (const "no-sync") (const :tag "none" nil)) :group 'wl-pref) (defcustom wl-ask-range t "*If non-nil, ask for a range for summary synchronization. If nil, always use default." :type 'boolean :group 'wl-pref) (defcustom wl-folder-process-duplicates-alist nil "Specify process type of duplicated messages. It should be a list of cons cell like: (REGEXP . TYPE) REGEXP is a regular expression string of folder name. TYPE is one of the symbols `hide' or `read'. `hide' means hide duplicated messages. `read' means mark as read duplicated messages. If TYPE is nil, do nothing for duplicated messages." :type '(repeat (cons (regexp :tag "Folder regexp") (choice (const :tag "Hide" hide) (const :tag "Mark as read" read)))) :group 'wl-folder) (defcustom wl-folder-move-cur-folder nil "*Non-nil, move cursor to current folder on folder buffer when goto folder." :type 'boolean :group 'wl-folder) (defcustom wl-folder-check-async t "*Check the folder asynchronous." :type 'boolean :group 'wl-folder) (defcustom wl-folder-notify-deleted nil "*Non-nil, display negative number on folder-mode when message is deleted in folder. If the value is 'sync, msgdb would be synchronized." :type '(choice (const :tag "off" nil) (const :tag "on" t) (const sync)) :group 'wl-folder) (defcustom wl-summary-exit-next-move t "*Non-nil, move to next-unsync or next-entity when exit summary." :type 'boolean :group 'wl-summary) (defcustom wl-summary-next-no-unread-command '(wl-summary-read wl-summary-down wl-summary-up) "*Command list available when the value of `wl-auto-select-next' is 'unread or 'skip-no-unread." :type '(repeat function) :group 'wl-summary) (defcustom wl-summary-search-via-nntp 'confirm "*Non-nil, search message via nntp after `wl-summary-jump-to-msg-by-message-id'. If the value is 'confirm, confirm before search, 'force to search via nntp regardless of current folder type." :type '(choice (const :tag "confirm" confirm) (const :tag "always" force) (const :tag "in nntp folder" t) (const :tag "never" nil)) :group 'wl-summary) (defcustom wl-summary-keep-cursor-command '(wl-summary-goto-folder wl-summary-goto-last-visited-folder) "*Command list to keep cursor position when folder is changed to already existing summary." :type '(repeat function) :group 'wl-summary) (defcustom wl-summary-showto-folder-regexp nil "Regexp specifying the folder that shows the To (or Newsgroups) field as Sender information in summary mode. It is effective when the value of `wl-summary-from-function' is `wl-summary-default-from'" :type '(choice (const :tag "none" nil) regexp) :group 'wl-summary) (defcustom wl-summary-save-file-suffix ".eml" "Suffix for the saved file name." :type 'string :group 'wl-summary) (defcustom wl-summary-resend-use-cache nil "*Non-nil to enable offline resending by using file cache. Note that strict message identity is not guaranteed when cache is used." :type 'boolean :group 'wl-summary) (defcustom wl-folder-removed-mark "#" "Mark for removed folder." :type 'string :group 'wl-folder) (defcustom wl-folder-unsubscribe-mark "#" "Mark for unsubscribe folder." :type 'string :group 'wl-folder) (defcustom wl-dispose-folder-alist '(("^-" . remove) ("^@" . remove)) "*Alist of folder and dispose policy. Each element is (folder-regexp . policy). The policy is one of the followings: 'remove or 'null : remove message. string : refile to the specified folder. 'trash or otherwise : refile to the `wl-trash-folder'. ex. '((\"^%\" . \"%#mh/trash\") (\"^-\" . remove) (\"^\\\\+\" . trash))" :type '(repeat (cons (regexp :tag "Folder Regexp") (choice :tag "Policy" (const remove) (const :tag "remove(null)" null) (const trash) (const :tag "trash(other)" trash) (string :tag "Folder")))) :group 'wl-folder) (defcustom wl-folder-hierarchy-access-folders '("^-[^.]*\\(:\\|@\\|$\\)" "^@$" "^'$") "*Access group REGEXPs to make hierarchy structure." :type '(repeat (string :tag "Regexp")) :group 'wl-folder) (defcustom wl-folder-init-load-access-folders nil "*Access group folders to load folder list on `wl-folder-init'. If this variable is non-nil, `wl-folder-init-no-load-access-folders' will be ignored." :type '(repeat (regexp :tag "Folder Regexp")) :group 'wl-folder) (defcustom wl-folder-init-no-load-access-folders nil "*Access group folders to not load folder list on `wl-folder-init'. If `wl-folder-init-load-access-folders' is non-nil, this variable will be ignored." :type '(repeat (regexp :tag "Folder Regexp")) :group 'wl-folder) (defcustom wl-folder-access-subscribe-alist nil "*Subscribe folders to fetching folder entries. Each element is (group-regexp (subscribe folder-regexp ...)). If subscribe is non-nil, subscribe when match folder-regexp. If subscribe is nil, unsubscribe when match folder-regexp. ex. '((\"^-fj$\" . (t \"^-fj\\\\.\\\\(editor\\\\|mail\\\\|net\\\\|news\\\\)\")) (\"^-comp$\" . (t \"^-comp\\\\.unix\" \"^-comp\\\\.sys\")) (\"^-$\" . (nil \"^-alt\" \"^-rec\")))" :type '(repeat (cons (regexp :tag "Folder Regexp") (list (boolean :tag "Subscribed") (repeat :inline t (regexp :tag "Folder Regexp"))))) :group 'wl-folder) ;;; For Folder Manager (defcustom wl-interactive-save-folders t "*Non-nil require your confirmation when save folders." :type 'boolean :group 'wl-folder :group 'wl-setting) (defcustom wl-fldmgr-make-backup t "*Non-nil make backup file when save folders." :type 'boolean :group 'wl-folder) (defcustom wl-fldmgr-folders-indent "\t" "*Indent string for folders file." :type 'string :group 'wl-folder) (defcustom wl-fldmgr-sort-function 'wl-fldmgr-sort-standard "*A function to sort folder." :type 'function :group 'wl-folder) (defcustom wl-fldmgr-sort-group-first t "*Non-nil Group folder is first when sort." :type 'function :group 'wl-folder) (defcustom wl-fldmgr-add-complete-with-current-folder-list nil "*If non-nil, completion for adding folder refers current folder list." :type 'boolean :group 'wl-folder) (defcustom wl-fldmgr-make-filter-default "Body" "*Default filter key while making filter on Folder." :type '(radio (const "From") (const "Subject") (const "To") (const "Cc") (const "Body") (const "Since") (const "Before") (const "Last") (const "First") (string :tag "Other")) :group 'wl-folder) (defcustom wl-fldmgr-allow-rename-access-group nil "*If non-nil, allow to rename folder in access group." :type 'boolean :group 'wl-folder) ;;; For Expire and Archive (defcustom wl-expire-alist nil "Alist to decide a policy for expire. Each element is (folder-regexp (number or date) policy). The policy is one of the followings: 'remove : remove messsage. 'trash : refile `wl-trash-folder'. string : refile string folder. function : call function. ex. '((\"^\\\\+ml/wl$\" (number 500 510) wl-expire-archive-number1 t) (\"^\\\\+ml/\" (number 300 305) wl-expire-archive-number2) (\"^\\\\+outbox$\" (number 300) \"$outbox;lha\") (\"^\\\\(\\\\+tmp\\\\|\\\\+trash\\\\)$\" (date 7) remove) (\"^\\\\+misc$\" (date 14) trash))" :type '(repeat (choice (list :tag "No-match" (regexp :tag "Folder Regexp") (const nil)) (list :tag "Match" (regexp :tag "Folder Regexp") (list (radio :value number (const number) (const date)) (list :inline t integer (repeat :inline t integer))) (choice :tag "Policy" :value remove (const remove) (const trash) (string :tag "folder") function) (repeat :inline t :tag "Arg for function" sexp)))) :group 'wl-expire) (defcustom wl-archive-alist '((".*" wl-archive-number1)) "Alist to decide a policy for archive. Each element is (folder-regexp policy(function)). ex. '((\"\\\\+work$\" wl-archive-date) (\"\\\\+ml/\" wl-archive-number1) (\".*\" wl-archive-number2))" :type '(repeat (list (regexp :tag "Folder Regexp") function (repeat :inline t (sexp :tag "Argument")))) :group 'wl-expire) (defcustom wl-summary-expire-reserve-marks (list wl-summary-flag-mark wl-summary-new-uncached-mark wl-summary-new-cached-mark wl-summary-unread-uncached-mark wl-summary-unread-cached-mark) "Permanent marks of reserved message when expire. Don't reserve temporary mark message. ex. 'all : reserved all permanent marks. 'none : not reserve permanent marks. list : reserved specified permanent marks." :type '(repeat (string :tag "Mark")) :group 'wl-expire) (defcustom wl-expire-number-with-reserve-marks nil "If non-nil, include reserve message when expire by number." :type 'boolean :group 'wl-expire) (defcustom wl-expire-add-seen-list t "*If non-nil, add seen message list when refile message at expire." :type 'boolean :group 'wl-expire) (defcustom wl-expire-use-log nil "*If non-nil, write a log when expired." :type 'boolean :group 'wl-expire) (defcustom wl-expire-folder-update-msgdb t "*Non-nil update summary msgdb when expire on folder mode." :type 'boolean :group 'wl-expire) ;; for wl-expire-archive-{number1|number2} (defcustom wl-expire-archive-files 100 "*The number of one archive folder." :type 'integer :group 'wl-expire) ;; for wl-expire-archive-{number1|number2|date} (defcustom wl-expire-archive-get-folder-function 'wl-expire-archive-get-folder "*A function to get archive folder name." :type 'function :group 'wl-expire) (defcustom wl-expire-delete-oldmsg-confirm t "*If non-nil, require your confirmation when delete old message." :type 'boolean :group 'wl-expire) ;; for wl-expire-archive-get-folder (defcustom wl-expire-archive-folder-type 'zip "*Archiver type of archive folder." :type '(radio (const zip) (const lha) (const zoo) (const rar) (const tar) (const tgz) (symbol :tag "Other")) :group 'wl-expire) (defcustom wl-expire-archive-folder-name-fmt "%s-%%05d;%s" ;; $folder-00100;zip "*A format string for archive folder name." :type 'string :group 'wl-expire) (defcustom wl-expire-archive-folder-num-regexp "-\\([0-9]+\\);" "*A regexp string for archive folder name." :type 'string :group 'wl-expire) (defcustom wl-expire-archive-date-folder-name-fmt "%s-%%04d%%02d;%s" ;; $folder-199812;zip "*A format string for archive date folder name." :type 'string :group 'wl-expire) (defcustom wl-expire-archive-date-folder-num-regexp "-\\([0-9]+\\);" "*A regexp string for archive date folder name." :type 'string :group 'wl-expire) (defcustom wl-expire-archive-folder-prefix nil "*Prefix for archive folder." :type '(radio (const :tag "nothing" nil) (const :tag "full" t) (const short)) :group 'wl-expire) ;;;; Highlights. ;; highilght about summary (defcustom wl-highlight-max-summary-lines 10000 "*If the summary is larger than this lines, don't highlight it." :type 'integer :group 'wl-highlight) ;; highilght about draft and message (defcustom wl-highlight-body-too t "*In addition to header, highlight the body too. if non nil." :type 'boolean :group 'wl-highlight) (defcustom wl-highlight-message-header-alist '(("Subject[ \t]*:" . wl-highlight-message-important-header-contents) ("From[ \t]*:\\|To[ \t]*:" . wl-highlight-message-important-header-contents2) ("X-[^ \t]*:\\|User-Agent[ \t]*:" . wl-highlight-message-unimportant-header-contents)) "" :type '(repeat (cons regexp face)) :group 'wl-highlight) (defcustom wl-highlight-citation-prefix-regexp "^[>|:} ]*[>|:}]\\([^ \n>]*>\\)?\\|^[^ <\n>]*>" "All lines that match this regexp will be highlighted with `wl-highlight-message-cited-text-*' face." :type 'regexp :group 'wl-highlight) (defcustom wl-highlight-highlight-citation-too nil "*Whether the whole citation line should go in the `wl-highlight-citation-face' face. If nil, the text matched by `wl-highlight-citation-prefix-regexp' is in the default face, and the remainder of the line is in the wl-highlight-message-cited-text face." :type 'boolean :group 'wl-highlight) (defcustom wl-highlight-force-citation-header-regexp "^>>>.*$\\|^[ \t]*<[^>]*>[ \t]*$" "*The pattern to match the prolog of a cited block. Text in the body of a message which matches this will be displayed in the `wl-highlight-message-headers' face." :type 'regexp :group 'wl-highlight) (defcustom wl-highlight-citation-header-regexp (concat "In article.*$\\|In message.*$\\|In the message.*$\\|" "^At[^\n]+\n[^\n]+wrote:\n\\|" "^.*\\(writes\\|wrote\\|said\\):\n") "*The pattern to match the prolog of a cited block. Text in the body of a message which matches this will be displayed in the `wl-highlight-message-headers' face." :type 'regexp :group 'wl-highlight) (defcustom wl-highlight-max-header-size nil "*If the message header is larger than this many chars, don't highlight it. If this is nil, all headers will be highlighted." :type 'integer :group 'wl-highlight) (defcustom wl-highlight-max-message-size 10000 "*If the message body is larger than this many chars, don't highlight it. This is to prevent us from wasting time trying to fontify things like uuencoded files and large digests. If this is nil, all messages will be highlighted." :type 'integer :group 'wl-highlight) ;; highilght about signature (of draft and message) (defcustom wl-highlight-signature-separator '("\n--+\n" "\n\n--+.*\n*\\'") "List of regexps matching signature separator. It will be verified from head to tail looking for a separator. Verification will be done from the end of the buffer. No need to specify \"^-- $\" in this list, because it is verified by default. This variable can also be a regex." :type '(repeat regexp) :group 'wl-highlight) (defcustom wl-max-signature-size 400 "*If the signature is larger than this chars, don't treat it as a signature." :type 'integer :group 'wl-highlight) ;; highilght about mouse (defcustom wl-use-highlight-mouse-line window-system "*Highlight mouse line, if non-nil." :type 'boolean :group 'wl-highlight) (defcustom wl-highlight-summary-line-help-echo-alist '((flag wl-highlight-flag-folder-help-echo) (search elmo-message-file-name)) "*Alist to display help-echo in summary buffer. Each element is (folder-type handler(function)). Handler take two arguments elmo-folder and message number and return string." :type 'boolean :group 'wl-highlight) ;; highilght about folder (defcustom wl-highlight-folder-with-icon t "*Highlight folder with icon(XEmacs or Emacs 21)." :type 'boolean :group 'wl-highlight) (defcustom wl-highlight-folder-by-numbers t "Highlight folder lines by numbers. If it is a number, only numbers will be highlighted." :type '(choice (const :tag "whole line" t) (const :tag "only numbers" 1) (const :tag "don't highlight" nil)) :group 'wl-highlight) (defcustom wl-highlight-signature-search-function 'wl-highlight-signature-search "Function to search signature area in the message body." :type 'function :group 'wl-highlight) ;; Real-time draft highlighting (defcustom wl-draft-real-time-highlight (if (featurep 'jit-lock) 'jit 'idle) "Incdicate real-time draft highlighting method. Possible values are `jit', `idle' or nil. `jit' means using jit-lock-mode. `idle' means using idle-timer. nil means real-time highlighting is disabled." :type '(choice (const :tag "Use jit-lock-mode" jit) (const :tag "Use idle timer" idle) (const :tag "Don't highlight automatically" nil)) :group 'wl-draft) (defcustom wl-draft-jit-highlight-function 'wl-draft-default-jit-highlight "The function used for real-time highlighting using jit-lock-mode." :type 'function :group 'wl-draft) (defcustom wl-draft-idle-highlight-idle-time 0.5 "Do real-time highlighting after indicated idle time (second)." :type 'number :group 'wl-draft) (defcustom wl-draft-idle-highlight-function 'wl-draft-default-idle-highlight "The function for real-time highlighting using a timer." :type 'function :group 'wl-draft) (make-obsolete-variable 'wl-use-dnd "Obsoleted" "03 Jun 2020") (defcustom wl-reset-plugged-alist t "*If non-nil, reset `elmo-plugged-alist' when startup." :type 'boolean :group 'wl-pref) (defcustom wl-demo-display-logo (module-installed-p 'image) "If it is T, show graphic logo in the startup screen. You can set it to a symbol `xbm' or `xpm' in order to force the image format." :type '(radio (const :tag "Off" nil) (const :tag "On (any format)" t) (const xpm) (const xbm)) :group 'wl-pref) (defcustom wl-invalid-character-message "(WL:Invalid characters.)" "*A string displayed when invalid character exists." :type 'string :group 'wl-pref) (defcustom wl-use-pgp-module 'epg "*Whether use EasyPG." :type '(choice (const :tag "EasyPG Library" epg) (const :tag "Don't use PGP" nil)) :group 'wl-pref) (defcustom wl-display-progress-threshold '((wl-folder-insert-entity . 100) (elmo-retrieve-message . 3000) (t . 20)) "*Displaying progress message if number of total are more than this value." :type '(choice (const :tag "No display" nil) (const :tag "No limitation" 0) (integer :tag "For all") (repeat :tag "Each label" (cons (choice (const :tag "Default" t) (symbol :tag "Label")) (choice (const :tag "No display" nil) (const :tag "No limitation" 0) (integer :tag "Threshold"))))) :group 'wl-pref) (defcustom wl-display-progress-function 'wl-simple-display-progress "*A function to display progress message" :type '(choice (const :tag "No display" nil) (function :tag "Function")) :group 'wl-pref) (defcustom wl-progress-update-interval 0.3 "The minimum interval in seconds between displaying progress messages." :type 'number :group 'wl-pref) ;;; Internal variables (defvar wl-init nil) ;; For disconnected operations. (defvar wl-plugged-hook nil) (defvar wl-unplugged-hook nil) (defcustom wl-plugged t "*Plugged state at the startup. Nil means off-line." :type 'boolean :group 'wl :group 'wl-setting) ;; Internal variables used to modeline identifiers. (defvar wl-modeline-plug-status nil) (defvar wl-modeline-plug-state-on wl-plug-state-indicator-on) (defvar wl-modeline-plug-state-off wl-plug-state-indicator-off) (defvar wl-modeline-biff-status nil) (defvar wl-modeline-biff-state-on wl-biff-state-indicator-on) (defvar wl-modeline-biff-state-off wl-biff-state-indicator-off) ;; Advanced thread view. (defvar wl-thread-indent-level (if wl-on-mule 1 2) "*Indent level for thread.") (defvar wl-thread-have-younger-brother-str (if wl-on-mule "┣" "+") "*A string for thread branch line. It should contain one character.") (defvar wl-thread-youngest-child-str (if wl-on-mule "┗" "+") "*A string for thread branch line. It should contain one character.") (defvar wl-thread-vertical-str (if wl-on-mule "┃" "|") "*A string for thread branch line. It should contain one character.") (defvar wl-thread-horizontal-str (if wl-on-mule "━" "-") "*A string for thread branch line. It should contain one character.") (defvar wl-thread-space-str (if wl-on-mule " " " ") "*A string for thread branch line. It should contain one character.") ;; folder icons. filename relative to wl-icon-directory (defvar wl-opened-group-folder-icon "opened.xpm" "*Icon file for opened group folder.") (defvar wl-closed-group-folder-icon "closed.xpm" "*Icon file for closed group folder.") (defvar wl-nntp-folder-icon "news.xpm" "*Icon file for nntp folder.") (defvar wl-imap-folder-icon "imap.xpm" "*Icon file for imap folder.") (defvar wl-pop-folder-icon "pop.xpm" "*Icon file for pop folder.") (defvar wl-localdir-folder-icon "local.xpm" "*Icon file for localdir folder.") (defvar wl-localnews-folder-icon "localnews.xpm" "*Icon file for localnews folder.") (defvar wl-internal-folder-icon "internal.xpm" "*Icon file for internal folder.") (defvar wl-multi-folder-icon "multi.xpm" "*Icon file for multi folder.") (defvar wl-filter-folder-icon "filter.xpm" "*Icon file for filter folder.") (defvar wl-archive-folder-icon "archive.xpm" "*Icon file for archive folder.") (defvar wl-pipe-folder-icon "pipe.xpm" "*Icon file for pipe folder.") (defvar wl-search-folder-icon "nmz.xpm" "*Icon file for search folder.") (defvar wl-shimbun-folder-icon "shimbun.xpm" "*Icon file for shimbun folder.") (defvar wl-file-folder-icon "file.xpm" "*Icon file for file folder.") (defvar wl-maildir-folder-icon "maildir.xpm" "*Icon file for maildir folder.") (defvar wl-access-folder-icon "access.xpm" "*Icon file for access folder.") (defvar wl-empty-trash-folder-icon "trash-e.xpm" "*Icon file for emptied trash folder.") (defvar wl-trash-folder-icon "trash.xpm" "*Icon file for trash folder.") (defvar wl-draft-folder-icon "draft.xpm" "*Icon file for draft folder.") (defvar wl-queue-folder-icon "queue.xpm" "*Icon file for queue folder.") (defvar wl-plugged-icon "plugged.xpm" "*Icon file for plugged state.") (defvar wl-unplugged-icon "unplugged.xpm" "*Icon file for unplugged state.") (defvar wl-biff-mail-icon "letter.xpm" "*Icon file for mail existed state.") (defvar wl-biff-nomail-icon "no-letter.xpm" "*Icon file for no mail existed state.") (defvar wl-prog-uudecode "uudecode" "*uudecode program name.") (defvar wl-prog-uudecode-arg nil "*Arguments for uudecode program.") (defvar wl-prog-uudecode-no-stdout-option t "*If non-nil, uudecode program don't have option for output to stdout.") ;; plug (defvar wl-plugged-plug-on "ON") (defvar wl-plugged-plug-off "--") (defvar wl-plugged-auto-off "**") (defvar wl-plugged-server-indent 2) (defvar wl-plugged-port-indent 4) (defvar wl-plugged-queue-status-column 25) ;;;; Obsolete variables. ;; 2012-08-19 (elmo-define-obsolete-variable 'wl-message-id-use-wl-from 'wl-message-id-use-message-from) ;; 2005-01-23 (elmo-define-obsolete-variable 'wl-nmz-folder-icon 'wl-search-folder-icon) ;; 2003-11-05 (elmo-define-obsolete-variable 'wl-summary-new-mark 'wl-summary-new-uncached-mark) ;; 2003-07-15 delete -> dispose (elmo-define-obsolete-variable 'wl-delete-folder-alist 'wl-dispose-folder-alist) ;; 2002-12-25 (elmo-define-obsolete-variable 'wl-draft-reply-myself-with-argument-list 'wl-draft-reply-with-argument-list) (elmo-define-obsolete-variable 'wl-draft-reply-myself-without-argument-list 'wl-draft-reply-without-argument-list) ;; 2001-12-11: *-dir -> *-directory (elmo-define-obsolete-variable 'wl-icon-dir 'wl-icon-directory) (elmo-define-obsolete-variable 'wl-mime-save-dir 'wl-mime-save-directory) (elmo-define-obsolete-variable 'wl-score-files-dir 'wl-score-files-directory) (elmo-define-obsolete-variable 'wl-tmp-dir 'wl-temporary-file-directory) ;; 2001-12-10 (elmo-define-obsolete-variable 'wl-summary-update-confirm-threshold 'elmo-folder-update-threshold) (elmo-define-obsolete-variable 'wl-fetch-confirm-threshold 'elmo-message-fetch-threshold) (elmo-define-obsolete-variable 'wl-cache-prefetch-folder-type-list 'wl-message-buffer-prefetch-folder-type-list) (elmo-define-obsolete-variable 'wl-cache-prefetch-folder-list 'wl-message-buffer-prefetch-folder-list) ;; 2001-02-27: *-func -> *-function (elmo-define-obsolete-variable 'wl-summary-from-func 'wl-summary-from-function) (elmo-define-obsolete-variable 'wl-summary-subject-func 'wl-summary-subject-function) (elmo-define-obsolete-variable 'wl-summary-subject-filter-func 'wl-summary-subject-filter-function) (elmo-define-obsolete-variable 'wl-draft-send-func 'wl-draft-send-function) (elmo-define-obsolete-variable 'wl-draft-send-news-func 'wl-draft-send-news-function) (elmo-define-obsolete-variable 'wl-draft-send-mail-func 'wl-draft-send-mail-function) (elmo-define-obsolete-variable 'wl-print-buffer-func 'wl-print-buffer-function) (elmo-define-obsolete-variable 'wl-ps-print-buffer-func 'wl-ps-print-buffer-function) (elmo-define-obsolete-variable 'wl-generate-mailer-string-func 'wl-generate-mailer-string-function) (elmo-define-obsolete-variable 'wl-highlight-x-face-func 'wl-highlight-x-face-function) (elmo-define-obsolete-variable 'wl-fldmgr-sort-func 'wl-fldmgr-sort-function) (elmo-define-obsolete-variable 'wl-expire-archive-get-folder-func 'wl-expire-archive-get-folder-function) (elmo-define-obsolete-variable 'wl-highlight-signature-search-func 'wl-highlight-signature-search-function) ;; 2000-01-25: temp mark -> target mark (elmo-define-obsolete-variable 'wl-summary-temp-above 'wl-summary-target-above) (defvar wl-draft-prepared-config-alist nil) (make-obsolete-variable 'wl-draft-prepared-config-alist 'wl-draft-config-alist "07 Nov 1999") ;; 1999-10-10 (elmo-define-obsolete-variable 'wl-address-filename 'wl-address-file) (elmo-define-obsolete-variable 'wl-score-default-file-name 'wl-score-default-file) (require 'product) (product-provide (provide 'wl-vars) (require 'wl-version)) ;;; wl-vars.el ends here wanderlust-wanderlust-769699d/wl/wl-version.el000066400000000000000000000146701406661363500214660ustar00rootroot00000000000000;;; wl-version.el --- Version information for Wanderlust. -*- lexical-binding: t -*- ;; Copyright (C) 2000-2001 Yuuichi Teranishi ;; Copyright (C) 2000-2001 TAKAHASHI Kaoru ;; Author: Yuuichi Teranishi ;; TAKAHASHI Kaoru ;; Keywords: mail, net news ;; This file is part of Wanderlust (Yet Another Message Interface on Emacsen). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;; Put the following lines to each file of Wanderlust package. ;; ;; (require 'product) ;; (product-provide (provide FEATURE) (require 'wl-version)) ;;; Code: ;; (require 'product) (require 'elmo-version) ; product-version-as-string (provide 'wl-version) ; before product-provide ;; product-define in the first place (product-provide 'wl-version (product-define "Wanderlust" nil (eval-when-compile (product-version (product-find 'elmo-version))) ; equals to ELMO version. "Almost Unreal")) (defconst wl-version-status nil "Wanderlust verstion status. For override default rule. If nil, use default rule.") ;; set version-string (product-version-as-string 'wl-version) (defun wl-version () "Print Wanderlust version. Don't support insert string at-point (C-u M-x wl-version). For bug report, use `wl-generate-user-agent-string-1' instead. When non-interactive, use `product-string-1' instead." (interactive) (let ((product-info (product-string-1 'wl-version t))) (if (called-interactively-p 'interactive) (message "%s" product-info) product-info))) (defun wl-version-status () "Return version status string. If variable `wl-version-status' is non-nil, override default rule." (or wl-version-status (if (zerop (% (nth 1 (product-version (product-find 'wl-version))) 2)) "stable" "beta"))) ;; avoid compile warnings (defvar emacs-beta-version) (defvar mime-edit-insert-user-agent-field) (defvar mime-edit-user-agent-value) (defvar mime-editor/version) (defvar mime-editor/codename) (defun wl-generate-user-agent-string () "A candidate of `wl-generate-mailer-string-function'. Insert User-Agent field instead of X-Mailer field." (wl-generate-user-agent-string-1 ;; for backward compatibility mime-edit-insert-user-agent-field)) (defun wl-generate-user-agent-string-1 (&optional verbose) "Return User-Agent field value. If VERBOSE return with SEMI, FLIM and APEL version." (cond ;; Don't use `product-string-verbose' for short User-Agent field value. ((not verbose) (concat (product-string-1 'wl-version t) " " (wl-extended-emacs-version3 "/" t))) ;; SEMI (verbose) (mime-edit-user-agent-value (concat (product-string-verbose 'wl-version) " " mime-edit-user-agent-value)))) ;; from gnus (defun wl-extended-emacs-version (&optional _with-codename) "Stringified Emacs version. WITH-CODENAME is ignored." (cond ((string-match "^\\([0-9]+\\.[0-9]+\\)\\.[.0-9]+$" emacs-version) (concat "Emacs " (match-string 1 emacs-version) (when (boundp 'mule-version) (concat "/Mule " mule-version)))) ((string-match "\\([A-Z]*[Mm][Aa][Cc][Ss]\\)[^(]*\\(\\((beta.*)\\|'\\)\\)?" emacs-version) (concat (match-string 1 emacs-version) (format " %d.%d" emacs-major-version emacs-minor-version) (when (and (boundp 'emacs-beta-version) emacs-beta-version) (format "b%d" emacs-beta-version)))) (t emacs-version))) (defun wl-extended-emacs-version2 (&optional delimiter _with-codename) "Stringified Emacs version. Separate DELIMITER (default is \" \"). WITH-CODENAME is ignored." (cond ((and (boundp 'mule-version) (string-match "\\([0-9]+\.[0-9]+\\)\\(.*$\\)" mule-version)) (format "Mule%s%s@%d.%d" (or delimiter " ") (match-string 1 mule-version) emacs-major-version emacs-minor-version)) ((string-match "^\\([0-9]+\\.[0-9]+\\)\\.[.0-9]+$" emacs-version) (concat "Emacs" (or delimiter " ") (match-string 1 emacs-version))) ((string-match "\\([A-Z]*[Mm][Aa][Cc][Ss]\\)[^(]*\\(\\((beta.*)\\|'\\)\\)?" emacs-version) (concat (match-string 1 emacs-version) (or delimiter " ") (format "%d.%d" emacs-major-version emacs-minor-version) (when (and (boundp 'emacs-beta-version) emacs-beta-version) (format "b%d" emacs-beta-version)))) (t emacs-version))) (defun wl-extended-emacs-version3 (&optional delimiter _with-codename) "Stringified Emacs version. Separate DELIMITER (default is \" \"). WITH-CODENAME is ignored." (cond ((and (boundp 'mule-version) (string-match "\\([0-9]+\.[0-9]+\\)\\(.*$\\)" mule-version)) (format "Emacs%s%d.%d Mule%s%s" (or delimiter " ") emacs-major-version emacs-minor-version (or delimiter " ") (match-string 1 mule-version))) ((string-match "^\\([0-9]+\\.[0-9]+\\)\\.[.0-9]+$" emacs-version) (concat "Emacs" (or delimiter " ") (match-string 1 emacs-version))) ((string-match "\\([A-Z]*[Mm][Aa][Cc][Ss]\\)[^(]*\\(\\((beta.*)\\|'\\)\\)?" emacs-version) (concat (match-string 1 emacs-version) (or delimiter " ") (format "%d.%d" emacs-major-version emacs-minor-version) (when (and (boundp 'emacs-beta-version) emacs-beta-version) (format "b%d" emacs-beta-version)))) (t emacs-version))) ;; for backward compatibility (defconst wl-appname (product-name (product-find 'wl-version))) (make-obsolete-variable 'wl-appname "use (product-name (product-find 'wl-version)) insteaed." "10 Oct 2000") (defconst wl-version (product-version-string (product-find 'wl-version))) (make-obsolete-variable 'wl-version "use (product-version-string (product-find 'wl-version)) instead." "10 Oct 2000") (defconst wl-codename (product-code-name (product-find 'wl-version))) (make-obsolete-variable 'wl-codename "use (product-code-name (product-find 'wl-version)) instead." "10 Oct 2000") ;;; wl-version.el ends here wanderlust-wanderlust-769699d/wl/wl.el000066400000000000000000001006751406661363500200040ustar00rootroot00000000000000;;; wl.el --- Wanderlust bootstrap. -*- lexical-binding: t -*- ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Copyright (C) 1998,1999,2000 Masahiro MURATA ;; Author: Yuuichi Teranishi ;; Masahiro MURATA ;; Keywords: mail, net news ;; This file is part of Wanderlust (Yet Another Message Interface on Emacsen). ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;; ;;; Commentary: ;; ;;; Code: ;; (require 'std11) (require 'elmo) (require 'wl-version) ; reduce recursive-load-depth (require 'wl-vars) (require 'wl-util) (require 'wl-e21) (provide 'wl) ; circular dependency (require 'wl-folder) (require 'wl-summary) (require 'wl-action) (require 'wl-thread) (require 'wl-address) (require 'wl-news nil t) (require 'wl-draft) (wl-draft-mode-setup) (wl-draft-key-setup) (require 'wl-demo) (require 'wl-highlight) (require 'cl-lib) (eval-when-compile (require 'smtp) (require 'wl-score) (require 'wl-fldmgr) (require 'wl-mime)) (defun wl-plugged-init (&optional make-alist) (setq elmo-plugged wl-plugged) (if wl-reset-plugged-alist (elmo-set-plugged elmo-plugged)) (when make-alist (wl-make-plugged-alist)) ;; Plug status. (setq elmo-plugged (setq wl-plugged (elmo-plugged-p)) wl-modeline-plug-status wl-plugged) (if wl-plugged (wl-toggle-plugged t 'flush))) (defun wl-toggle-plugged (&optional arg queue-flush-only) (interactive) (elmo-quit) ; Disconnect current connection. (unless queue-flush-only (cond ((eq arg 'on) (setq wl-plugged t)) ((eq arg 'off) (setq wl-plugged nil)) (t (setq wl-plugged (not wl-plugged)))) (elmo-set-plugged wl-plugged)) (setq elmo-plugged wl-plugged wl-modeline-plug-status wl-plugged) (save-excursion (let ((summaries (wl-collect-summary))) (while summaries (set-buffer (pop summaries)) (wl-summary-save-view) (elmo-folder-commit wl-summary-buffer-elmo-folder)))) (setq wl-biff-check-folders-running nil) (if wl-plugged (progn ;; flush queue!! (elmo-dop-queue-flush) (unless queue-flush-only (when wl-biff-check-folder-list (wl-biff-check-folders) (wl-biff-start))) (if (and wl-draft-enable-queuing wl-auto-flush-queue) (wl-draft-queue-flush)) ;;; (when (and (eq major-mode 'wl-summary-mode) ;;; (elmo-folder-plugged-p wl-summary-buffer-elmo-folder)) ;;; (let* ((msgdb-dir (elmo-folder-msgdb-path ;;; wl-summary-buffer-elmo-folder)) ;;; (seen-list (elmo-msgdb-seen-load msgdb-dir))) ;;; (setq seen-list ;;; (wl-summary-flush-pending-append-operations seen-list)) ;;; (elmo-msgdb-seen-save msgdb-dir seen-list))) (run-hooks 'wl-plugged-hook)) (wl-biff-stop) (run-hooks 'wl-unplugged-hook)) (force-mode-line-update t)) ;;; wl-plugged-mode (defvar wl-plugged-port-label-alist (list (cons 119 "nntp") (cons 143 "imap4") (cons 110 "pop3") (cons 25 "smtp"))) ;;(cons elmo-pop-before-smtp-port "pop3") (defconst wl-plugged-switch-variables '(("Queuing" . wl-draft-enable-queuing) ("AutoFlushQueue" . wl-auto-flush-queue) ("DisconnectedOperation" . elmo-enable-disconnected-operation))) (defvar wl-plugged-buf-name "Plugged") (defvar wl-plugged-mode-map nil) (defvar wl-plugged-alist nil) (defvar wl-plugged-switch nil) (defvar wl-plugged-winconf nil) (defvar wl-plugged-sending-queue-alist nil) (defvar wl-plugged-dop-queue-alist nil) (defvar wl-plugged-alist-modified nil) (defvar wl-plugged-mode-menu-spec '("Plugged" ["Toggle plugged" wl-plugged-toggle t] ["Toggle All plugged" wl-plugged-toggle-all t] ["Prev Port" wl-plugged-move-to-previous t] ["Next Port" wl-plugged-move-to-next t] ["Prev Server" wl-plugged-move-to-previous-server t] ["Next Server" wl-plugged-move-to-next-server t] ["Flush queue" wl-plugged-flush-queue t] "----" ["Exit" wl-plugged-exit t])) (eval-and-compile (defun wl-plugged-setup-mouse () (define-key wl-plugged-mode-map [mouse-2] 'wl-plugged-click))) (unless wl-plugged-mode-map (setq wl-plugged-mode-map (make-sparse-keymap)) (define-key wl-plugged-mode-map " " 'wl-plugged-toggle) (define-key wl-plugged-mode-map "\C-m" 'wl-plugged-toggle) (define-key wl-plugged-mode-map "\M-t" 'wl-plugged-toggle-all) (define-key wl-plugged-mode-map "q" 'wl-plugged-exit) (define-key wl-plugged-mode-map "\C-t" 'wl-plugged-exit) (define-key wl-plugged-mode-map "F" 'wl-plugged-flush-queue) (define-key wl-plugged-mode-map "P" 'wl-plugged-move-to-previous-server) (define-key wl-plugged-mode-map "N" 'wl-plugged-move-to-next-server) (define-key wl-plugged-mode-map "p" 'wl-plugged-move-to-previous) (define-key wl-plugged-mode-map "n" 'wl-plugged-move-to-next) (define-key wl-plugged-mode-map "\e\t" 'wl-plugged-move-to-previous) (define-key wl-plugged-mode-map "\t" 'wl-plugged-move-to-next) (wl-plugged-setup-mouse) (easy-menu-define wl-plugged-mode-menu wl-plugged-mode-map "Menu used in Plugged mode." wl-plugged-mode-menu-spec)) (defun wl-plugged-mode () "Mode for setting Wanderlust plugged. See info under Wanderlust for full documentation. Special commands: \\{wl-plugged-mode-map} Entering Plugged mode calls the value of `wl-plugged-mode-hook'." (interactive) (kill-all-local-variables) (use-local-map wl-plugged-mode-map) (setq major-mode 'wl-plugged-mode) (setq mode-name "Plugged") (wl-mode-line-buffer-identification) (setq wl-plugged-switch wl-plugged) (setq wl-plugged-alist-modified nil) (setq buffer-read-only t) (run-hooks 'wl-plugged-mode-hook)) (defun wl-plugged-string (plugged &optional time) (if time wl-plugged-auto-off (if plugged wl-plugged-plug-on wl-plugged-plug-off))) (defun wl-plugged-server-indent () (make-string wl-plugged-server-indent (string-to-char " "))) (defun wl-plugged-set-variables () (setq wl-plugged-sending-queue-alist (wl-plugged-sending-queue-info)) (setq wl-plugged-dop-queue-alist (wl-plugged-dop-queue-info)) (setq wl-plugged-alist (sort (copy-sequence elmo-plugged-alist) (lambda (a b) (string< (caar a) (caar b)))))) (defun wl-plugged-sending-queue-info () ;; sending queue status (let (alist msgs sent-via server port) (setq msgs (elmo-folder-list-messages (wl-folder-get-elmo-folder wl-queue-folder))) (while msgs (setq sent-via (wl-draft-queue-info-operation (car msgs) 'get-sent-via)) (while sent-via (when (eq (nth 1 (car sent-via)) 'unplugged) (setq server (car (nth 2 (car sent-via))) port (cdr (nth 2 (car sent-via)))) (elmo-plugged-p server port) ;; add elmo-plugged-alist if nothing. (setq alist (wl-append-assoc-list (cons server port) (car msgs) alist))) (setq sent-via (cdr sent-via))) (setq msgs (cdr msgs))) alist)) (defun wl-plugged-sending-queue-status (qinfo) ;; sending queue status (let ((len (length (cdr qinfo)))) (concat (wl-plugged-set-folder-icon wl-queue-folder (wl-folder-get-petname wl-queue-folder)) (if (> len 1) (format ": %d msgs (" len) (format ": %d msg (" len)) (mapconcat (function number-to-string) (cdr qinfo) ",") ")"))) (defun wl-plugged-dop-queue-info () ;; dop queue status (let* ((elmo-dop-queue (copy-sequence elmo-dop-queue)) dop-queue last alist server-info ope operation) ;;; (elmo-dop-queue-load) (elmo-dop-queue-merge) (setq dop-queue (sort elmo-dop-queue (lambda (a b) (string< (elmo-dop-queue-fname a) (elmo-dop-queue-fname b))))) (wl-append dop-queue (list nil)) ;; terminate(dummy) (when (car dop-queue) (setq last (elmo-dop-queue-fname (car dop-queue)))) ;; first (while dop-queue (when (car dop-queue) (setq ope (cons (elmo-dop-queue-method-name (car dop-queue)) (length (if (listp (car (elmo-dop-queue-arguments (car dop-queue)))) (car (elmo-dop-queue-arguments (car dop-queue)))))))) (if (and (car dop-queue) (string= last (elmo-dop-queue-fname (car dop-queue)))) (wl-append operation (list ope)) ;;; (setq count (1+ count)) (when (and last (setq server-info (elmo-net-port-info (wl-folder-get-elmo-folder last)))) (setq alist (wl-append-assoc-list server-info (cons last operation) alist))) (when (car dop-queue) (setq last (elmo-dop-queue-fname (car dop-queue)) operation (list ope)))) (setq dop-queue (cdr dop-queue))) alist)) (defun wl-plugged-dop-queue-status (qinfo &optional column) ;; dop queue status (let ((operations (cdr qinfo)) (column (or column wl-plugged-queue-status-column))) (mapconcat (lambda (folder-ope) (concat (wl-plugged-set-folder-icon (car folder-ope) (wl-folder-get-petname (car folder-ope))) "(" (let ((opes (cdr folder-ope)) pair shrinked) (while opes (if (setq pair (assoc (car (car opes)) shrinked)) (setcdr pair (+ (cdr pair) (max (cdr (car opes)) 1))) (setq shrinked (cons (cons (car (car opes)) (max (cdr (car opes)) 1)) shrinked))) (setq opes (cdr opes))) (mapconcat (lambda (ope) (if (> (cdr ope) 0) (format "%s:%d" (car ope) (cdr ope)) (format "%s" (car ope)))) (nreverse shrinked) ",")) ")")) operations (concat "\n" (wl-set-string-width column ""))))) (defun wl-plugged-drawing (plugged-alist) (let ((buffer-read-only nil) (alist plugged-alist) (vars wl-plugged-switch-variables) last server port stream-type label plugged time line qinfo column) (erase-buffer) (while vars (insert (format "%s:[%s]%s" (caar vars) (wl-plugged-string (symbol-value (cdar vars))) (if (cdr vars) " " ""))) (setq vars (cdr vars))) (insert "\n") (let ((elmo-plugged wl-plugged-switch)) (setq line (format "[%s](wl-plugged)" (wl-plugged-string (elmo-plugged-p)))) ;; sending queue status (when (setq qinfo (assoc (cons nil nil) wl-plugged-sending-queue-alist)) (setq line (concat (wl-set-string-width wl-plugged-queue-status-column line) (wl-plugged-sending-queue-status qinfo)))) (insert line "\n")) (while alist (setq server (nth 0 (caar alist)) port (nth 1 (caar alist)) stream-type (nth 2 (caar alist)) label (nth 1 (car alist)) plugged (nth 2 (car alist)) time (nth 3 (car alist))) (unless (string= last server) ;; server plug (insert (format "%s[%s]%s\n" (wl-plugged-server-indent) (wl-plugged-string (elmo-plugged-p server nil plugged-alist)) server)) (setq last server)) ;; port plug (setq line (format "%s[%s]%s" (make-string wl-plugged-port-indent (string-to-char " ")) (wl-plugged-string plugged time) (cond ((stringp port) port) (t (format "%s(%d)" (or label (cdr (assq port wl-plugged-port-label-alist)) "") port))))) (setq column (max (if line (1+ (string-width line)) 0) wl-plugged-queue-status-column)) (cond ;; sending queue status ((setq qinfo (assoc (cons server port) wl-plugged-sending-queue-alist)) (setq line (concat (wl-set-string-width column line) (wl-plugged-sending-queue-status qinfo)))) ;; dop queue status ((setq qinfo (assoc (list server port stream-type) wl-plugged-dop-queue-alist)) (setq line (concat (wl-set-string-width column line) (wl-plugged-dop-queue-status qinfo column))))) (insert line "\n") (setq alist (cdr alist))) (delete-region (1- (point-max)) (point-max)) ;; delete line at the end. (goto-char (point-min)) (while (not (eobp)) (wl-highlight-plugged-current-line) (forward-line))) (set-buffer-modified-p nil) (count-lines (point-min) (point-max))) (defun wl-plugged-redrawing-switch (indent switch &optional time) (beginning-of-line) (when (re-search-forward (format "^%s\\[\\([^]]+\\)\\]" (make-string indent (string-to-char " ")))) (goto-char (match-beginning 1)) (delete-region (match-beginning 1) (match-end 1)) (insert (wl-plugged-string switch time)) (wl-highlight-plugged-current-line) (forward-line))) (defun wl-plugged-redrawing (plugged-alist) (let ((buffer-read-only nil) (alist plugged-alist) last server plugged time) (goto-char (point-min)) (wl-plugged-redrawing-switch 0 (elmo-plugged-p)) (while alist (setq server (cl-caaar alist) plugged (nth 2 (car alist)) time (nth 3 (car alist))) (unless (string= last server) ;; server plug (wl-plugged-redrawing-switch wl-plugged-server-indent (elmo-plugged-p server nil plugged-alist)) (setq last server)) ;; port plug (wl-plugged-redrawing-switch wl-plugged-port-indent plugged time) (setq alist (cdr alist)))) (sit-for 0) (set-buffer-modified-p nil)) (defun wl-plugged-change () (interactive) (if (not elmo-plugged-alist) (message "No plugged info") (setq wl-plugged-winconf (current-window-configuration)) (let* ((cur-win (selected-window)) (max-lines (if (eq major-mode 'wl-summary-mode) (/ (frame-height) 2) (window-height))) window-lines lines) (with-current-buffer (get-buffer-create wl-plugged-buf-name) (wl-plugged-mode) (buffer-disable-undo (current-buffer)) (delete-windows-on (current-buffer)) (wl-plugged-set-variables) (setq lines (wl-plugged-drawing wl-plugged-alist))) (select-window cur-win) (setq window-lines (min max-lines (max lines window-min-height))) (when (> (- (window-height) window-lines) window-min-height) (split-window cur-win (- (window-height) window-lines))) (switch-to-buffer wl-plugged-buf-name) (condition-case nil (progn (enlarge-window (- window-lines (window-height))) (goto-char (point-min)) (while (and (< (window-height) max-lines) (not (pos-visible-in-window-p (1- (point-max))))) (enlarge-window 2))) (error)) (goto-char (point-min)) (forward-line) (wl-plugged-move-to-next)))) ;; goto first entry (defsubst wl-plugged-get-server () (save-excursion (end-of-line) (wl-plugged-move-to-previous-server) (beginning-of-line) (when (looking-at (format "^%s\\[[^]]+\\]\\(.*\\)" (wl-plugged-server-indent))) (match-string-no-properties 1)))) (defun wl-plugged-toggle () (interactive) (let ((cur-point (point))) (save-excursion (beginning-of-line) (cond ;; switch variable ((bobp) (let (variable switch name) (goto-char cur-point) (when (and (not (bobp)) (/= (preceding-char) (string-to-char " "))) (if (re-search-backward " [^ ]+" nil t) (forward-char) (re-search-backward "^[^ ]+" nil t))) (when (looking-at "\\([^ :[]+\\):?\\[\\([^]]+\\)\\]") (setq name (match-string-no-properties 1)) (setq switch (not (string= (match-string-no-properties 2) wl-plugged-plug-on))) (when (setq variable (cdr (assoc name wl-plugged-switch-variables))) (set variable switch)) (goto-char (match-beginning 2)) (let ((buffer-read-only nil)) (delete-region (match-beginning 2) (match-end 2)) (insert (wl-plugged-string switch)) (set-buffer-modified-p nil))))) ;; switch plug ((looking-at "^\\( *\\)\\[\\([^]]+\\)\\]\\([^ \n]*\\)") (let* ((indent (length (match-string-no-properties 1))) (switch (match-string-no-properties 2)) (name (match-string-no-properties 3)) (plugged (not (string= switch wl-plugged-plug-on))) (alist wl-plugged-alist) server port stream-type name-1) (cond ((eq indent wl-plugged-port-indent) ;; toggle port plug (cond ((string-match "\\([^([]*\\)(\\([^)[]+\\))" name) (setq port (string-to-number (match-string 2 name))) (if (string-match "!" (setq name-1 (match-string 1 name))) (setq stream-type (intern (substring name-1 (match-end 0)))))) (t (setq port name))) (setq server (wl-plugged-get-server)) (elmo-set-plugged plugged server port stream-type nil alist)) ((eq indent wl-plugged-server-indent) ;; toggle server plug (elmo-set-plugged plugged name nil nil nil alist)) ((zerop indent) ;; toggle all plug (elmo-set-plugged plugged nil nil nil nil alist))) ;; redraw (wl-plugged-redrawing wl-plugged-alist) ;; show plugged status in modeline (let ((elmo-plugged wl-plugged-switch)) (setq wl-plugged-switch (elmo-plugged-p) wl-modeline-plug-status wl-plugged-switch) (force-mode-line-update t)))))) (setq wl-plugged-alist-modified t) (goto-char cur-point))) (defun wl-plugged-click (e) (interactive "e") (mouse-set-point e) (wl-plugged-toggle)) (defun wl-plugged-toggle-all () (interactive) (let ((cur-point (point))) (setq wl-plugged-switch (not wl-plugged-switch)) (elmo-set-plugged wl-plugged-switch nil nil nil nil wl-plugged-alist) (wl-plugged-redrawing wl-plugged-alist) (goto-char cur-point) (setq wl-plugged-alist-modified t) ;; show plugged status in modeline (setq wl-modeline-plug-status wl-plugged-switch) (force-mode-line-update t))) (defun wl-plugged-exit () (interactive) (setq wl-plugged wl-plugged-switch ;;; elmo-plugged-alist wl-plugged-alist wl-plugged-alist nil wl-plugged-sending-queue-alist nil wl-plugged-dop-queue-alist nil) (run-hooks 'wl-plugged-exit-hook) (when wl-plugged-alist-modified (wl-toggle-plugged (if wl-plugged 'on 'off) t)) (kill-buffer (current-buffer)) (if wl-plugged-winconf (set-window-configuration wl-plugged-winconf))) (defun wl-plugged-flush-queue () (interactive) (let ((cur-point (point)) (dop-status (elmo-dop-queue-flush)) (send-status (wl-draft-queue-flush))) (unless (or dop-status send-status) (message "No processing queue.")) (wl-plugged-set-variables) (wl-plugged-drawing wl-plugged-alist) (goto-char cur-point))) (defun wl-plugged-move-to-next () (interactive) (when (re-search-forward "\\[\\([^]]+\\)\\]" nil t) (let ((pos (match-beginning 1))) (if (invisible-p pos) (goto-char (next-visible-point pos)) (goto-char pos))))) (defun wl-plugged-move-to-previous () (interactive) (if (eq (preceding-char) ?\]) (backward-char)) (when (re-search-backward "\\[\\([^]]+\\)\\]" nil t) (let ((pos (match-beginning 1))) (if (invisible-p pos) (goto-char (next-visible-point pos)) (goto-char pos))))) (defun wl-plugged-move-to-next-server () (interactive) (let ((regexp (format "^%s\\[\\([^]]+\\)\\]" (wl-plugged-server-indent))) point) (save-excursion (end-of-line) (if (re-search-forward regexp nil t) (setq point (match-beginning 1)))) (if point (goto-char point)))) (defun wl-plugged-move-to-previous-server () (interactive) (let ((regexp (format "^%s\\[\\([^]]+\\)\\]" (wl-plugged-server-indent)))) (if (re-search-backward regexp nil t) (goto-char (match-beginning 1))))) ;;; end of wl-plugged-mode (defun wl-save () "Save summary and folder status." (interactive) (wl-save-status 'keep-summary) (run-hooks 'wl-save-hook)) (defun wl-execute-temp-marks () "Execute temporary marks in summary buffers." (interactive) (let ((summaries (wl-collect-summary))) (while summaries (with-current-buffer (car summaries) (wl-summary-exec-with-confirmation) (wl-summary-save-status)) (setq summaries (cdr summaries))))) (defun wl-save-status (&optional keep-summary) (message "Saving summary and folder status...") (save-excursion (let ((summaries (wl-collect-summary))) (while summaries (with-current-buffer (car summaries) (unless keep-summary (wl-summary-cleanup-temp-marks)) (wl-summary-save-view) (elmo-folder-commit wl-summary-buffer-elmo-folder) (unless keep-summary (kill-buffer (car summaries)))) (setq summaries (cdr summaries))))) (wl-refile-alist-save) (wl-folder-info-save) (and (featurep 'wl-fldmgr) (wl-fldmgr-exit)) (and (featurep 'wl-spam) (wl-spam-save-status)) (elmo-crosspost-message-alist-save) (message "Saving summary and folder status...done")) (defun wl-exit () (interactive) (when (or (not wl-interactive-exit) (y-or-n-p "Do you really want to quit Wanderlust? ")) (elmo-quit) (when wl-use-acap (funcall (symbol-function 'wl-acap-exit))) (wl-biff-stop) (elmo-clear-signal-slots) (run-hooks 'wl-exit-hook) (wl-save-status) (wl-folder-cleanup-variables) (wl-message-buffer-cache-clean-up) (wl-kill-buffers (format "^\\(%s\\)$" (mapconcat 'identity (list wl-folder-buffer-name wl-plugged-buf-name) "\\|"))) (when wl-delete-startup-frame-function (funcall wl-delete-startup-frame-function)) ;;; (if (and wl-folder-use-frame ;;; (> (length (visible-frame-list)) 1)) ;;; (delete-frame)) (setq wl-init nil) (remove-hook 'kill-emacs-hook 'elmo-quit) (remove-hook 'kill-emacs-hook 'wl-save-status) (elmo-passwd-alist-clear) t) (message "") ; empty minibuffer. ) (defun wl-init () (when (not wl-init) (require 'mime-setup) (setq elmo-plugged wl-plugged) (add-hook 'kill-emacs-hook 'wl-save-status) (add-hook 'kill-emacs-hook 'elmo-quit) (wl-address-init) (wl-draft-setup) (wl-refile-alist-setup) (require 'wl-mime) ;; defined above. (wl-mime-setup) (fset 'wl-summary-from-func-internal (symbol-value 'wl-summary-from-function)) (fset 'wl-summary-subject-func-internal (symbol-value 'wl-summary-subject-function)) (fset 'wl-summary-subject-filter-func-internal (symbol-value 'wl-summary-subject-filter-function)) (wl-summary-define-sort-command) (wl-summary-define-mark-action) (dolist (spec wl-summary-flag-alist) (set-face-foreground (make-face (intern (format "wl-highlight-summary-%s-flag-face" (car spec)))) (nth 1 spec))) (setq elmo-get-folder-function #'wl-folder-make-elmo-folder elmo-progress-callback-function #'wl-progress-callback-function) (when (stringp wl-summary-no-from-message) (setq elmo-no-from wl-summary-no-from-message)) (when (stringp wl-summary-no-subject-message) (setq elmo-no-subject wl-summary-no-subject-message)) (elmo-global-flags-initialize (mapcar 'car wl-summary-flag-alist)) (elmo-connect-signal nil 'message-number-changed 'wl-draft (elmo-define-signal-handler (_listener _folder old-number new-number) (dolist (buffer (wl-collect-draft)) (with-current-buffer buffer (wl-draft-buffer-change-number old-number new-number))) (wl-draft-rename-saved-config old-number new-number)) (elmo-define-signal-filter (_listener folder _old-number _new-number) (and folder (string= (elmo-folder-name-internal folder) wl-draft-folder)))) (when (featurep 'wl-news) (wl-news-check)) (setq wl-init t) ;; This hook may contain the functions `wl-plugged-init-icons' and ;; `wl-biff-init-icons' for reasons of system internal to accord ;; facilities for the Emacs variants. (run-hooks 'wl-init-hook))) (defun wl-check-environment (no-check-folder) ;; wl-from (let* ((lal (std11-lexical-analyze wl-from)) (ret (std11-parse-mailbox lal)) address) (unless ;; Copied and modified from wl-draft-std11-parse-addresses. (when (or (and (eq (length lal) 1) (eq (car (car lal)) 'spaces)) ret) (setq lal (cdr ret)) (while (eq 'spaces (car (car lal))) (setq lal (cdr lal))) (null lal)) (error "Please set `wl-from' to your mail address")) (setq address (std11-address-string (car ret))) (when (string-match "@[^.]+$" address) (elmo-warning "Domain portion of `wl-from' seems to be a local hostname."))) ;; No-from and no-subject message (unless (stringp wl-summary-no-from-message) (elmo-warning "`wl-summary-no-from-message' must be a string.")) (unless (stringp wl-summary-no-subject-message) (elmo-warning "`wl-summary-no-subject-message' must be a string.")) ;; Message-ID (when wl-insert-message-id (let ((message-id (funcall wl-message-id-function)) (custom-msgid-function (null (eq wl-message-id-function 'wl-draft-make-message-id-string)))) (unless (std11-parse-msg-id (std11-lexical-analyze message-id)) ;; Invalid Message-ID (error (cond (custom-msgid-function "Check around `wl-message-id-function' to get valid Message-ID") (wl-message-id-use-message-from ;; `wl-from' is already checked. "Check `wl-message-id-hash-function' and `wl-draft-make-message-id-from-address-delimiter' to get valid Message-ID") ((and wl-message-id-domain (string-match "@" wl-message-id-domain)) "Remove `@' from `wl-message-id-domain'") (t "Check `wl-message-id-domain' to get valid Message-ID")))) (when (string-match "@[^.]+$" message-id) (elmo-warning (cond (custom-msgid-function "Please check around `wl-message-id-function' to get valid Message-ID.") (wl-message-id-use-message-from "`wl-from' address is used to make Message-ID string.") (wl-message-id-domain "`wl-message-id-domain' seems to be a local hostname.") (t "Please set `wl-message-id-domain' to get valid Message-ID.")))))) ;; folders (when (not no-check-folder) (let ((draft-folder (wl-folder-get-elmo-folder wl-draft-folder)) (queue-folder (wl-folder-get-elmo-folder wl-queue-folder)) (lost+found-folder (wl-folder-get-elmo-folder elmo-lost+found-folder))) (unless (elmo-folder-exists-p draft-folder) (if (y-or-n-p (format "Draft Folder %s does not exist, create it? " wl-draft-folder)) (elmo-folder-create draft-folder) (error "Draft Folder is not created"))) (if (and wl-draft-enable-queuing (not (elmo-folder-exists-p queue-folder))) (if (y-or-n-p (format "Queue Folder %s does not exist, create it? " wl-queue-folder)) (elmo-folder-create queue-folder) (error "Queue Folder is not created"))) (when (not (eq no-check-folder 'wl-draft)) (unless (elmo-folder-exists-p lost+found-folder) (elmo-folder-create lost+found-folder))) ;; tmp dir (unless (file-exists-p wl-temporary-file-directory) (if (y-or-n-p (format "Temp directory (to save multipart) %s does not exist, create it now? " wl-temporary-file-directory)) (make-directory wl-temporary-file-directory) (error "Temp directory is not created")))))) (defconst wl-check-variables-alist '((numberp . elmo-pop3-default-port) (symbolp . elmo-pop3-default-authenticate-type) (numberp . elmo-imap4-default-port) (symbolp . elmo-imap4-default-authenticate-type) (numberp . elmo-nntp-default-port) (numberp . wl-pop-before-smtp-port) (symbolp . wl-pop-before-smtp-authenticate-type))) (defun wl-check-variables () (let ((type-variables wl-check-variables-alist) type) (while (setq type (car type-variables)) (if (and (eval (cdr type)) (not (funcall (car type) (eval (cdr type))))) (error "%s must be %s: %S" (cdr type) (substring (format "%s" (car type)) 0 -1) (eval (cdr type)))) (setq type-variables (cdr type-variables))))) (defun wl-check-variables-2 () (if (< wl-message-buffer-cache-size 1) (error "`wl-message-buffer-cache-size' must be larger than 0")) (when wl-message-buffer-prefetch-depth (if (not (< wl-message-buffer-prefetch-depth wl-message-buffer-cache-size)) (error (concat "`wl-message-buffer-prefetch-depth' must be smaller than " "`wl-message-buffer-cache-size' - 1."))))) ;;;###autoload (defun wl (&optional arg) "Start Wanderlust -- Yet Another Message Interface On Emacsen. If ARG (prefix argument) is specified, folder checkings are skipped." (interactive "P") (unless wl-init (wl-load-profile) (elmo-init)) (let (demo-buf check) (unless wl-init (if wl-demo (setq demo-buf (wl-demo))) (setq check t)) (wl-init) (condition-case obj (progn (if check (progn (message "Checking environment...") (wl-check-environment arg) (message "Checking environment...done") (message "Checking type of variables...") (wl-check-variables) (wl-check-variables-2) (message "Checking type of variables...done"))) (let ((inhibit-quit t)) (wl-plugged-init (wl-folder))) (unless arg (run-hooks 'wl-auto-check-folder-pre-hook) (wl-folder-auto-check) (run-hooks 'wl-auto-check-folder-hook))) (error (if (buffer-live-p demo-buf) (kill-buffer demo-buf)) (signal (car obj)(cdr obj))) (quit)) (when wl-biff-check-folder-list (unless arg (wl-biff-check-folders)) (wl-biff-start)) (if (buffer-live-p demo-buf) (kill-buffer demo-buf))) (run-hooks 'wl-hook)) (defvar wl-delete-startup-frame-function nil) ;;;###autoload (defun wl-other-frame (&optional arg) "Pop up a frame to read messages via Wanderlust." (interactive) (if wl-folder-use-frame (wl arg) (let ((focusing-functions '(raise-frame select-frame x-focus-frame)) (folder (get-buffer wl-folder-buffer-name)) window frame wl-folder-use-frame) (if (and folder (setq window (get-buffer-window folder t)) (window-live-p window) (setq frame (window-frame window))) (progn (while focusing-functions (funcall (car focusing-functions) frame) (setq focusing-functions (cdr focusing-functions))) (wl arg)) (setq frame (make-frame)) (while focusing-functions (funcall (car focusing-functions) frame) (setq focusing-functions (cdr focusing-functions))) (setq wl-delete-startup-frame-function `(lambda () (setq wl-delete-startup-frame-function nil) (let ((frame ,frame)) (if (eq (selected-frame) frame) (delete-frame frame))))) (wl arg))))) ;; Define some autoload functions WL might use. (eval-and-compile ;; This little mapc goes through the list below and marks the ;; symbols in question as autoloaded functions. (mapc (lambda (package) (let ((interactive (nth 1 (memq ':interactive package)))) (mapc (lambda (function) (let (keymap) (when (consp function) (setq keymap (car (memq 'keymap function))) (setq function (car function))) (autoload function (car package) nil interactive keymap))) (if (eq (nth 1 package) ':interactive) (cl-cdddr package) (cdr package))))) '(("wl-fldmgr" :interactive t wl-fldmgr-access-display-all wl-fldmgr-access-display-normal wl-fldmgr-add wl-fldmgr-clear-cut-entity-list wl-fldmgr-copy wl-fldmgr-copy-region wl-fldmgr-cut wl-fldmgr-cut-region wl-fldmgr-make-access-group wl-fldmgr-make-filter wl-fldmgr-make-group wl-fldmgr-make-multi wl-fldmgr-reconst-entity-hashtb wl-fldmgr-rename wl-fldmgr-delete wl-fldmgr-save-folders wl-fldmgr-set-petname wl-fldmgr-sort wl-fldmgr-subscribe wl-fldmgr-subscribe-region wl-fldmgr-unsubscribe wl-fldmgr-unsubscribe-region wl-fldmgr-yank ) ("wl-acap" wl-acap-init) ("wl-acap" :interactive t wl-acap-store) ("wl-fldmgr" (wl-fldmgr-mode-map keymap) wl-fldmgr-add-entity-hashtb) ("wl-expire" :interactive t wl-folder-archive-current-entity wl-folder-expire-current-entity wl-summary-archive wl-summary-expire ) ("wl-score" wl-score-save wl-summary-rescore-msgs wl-summary-score-headers wl-summary-score-update-all-lines ) ("wl-score" :interactive t wl-score-change-score-file wl-score-edit-current-scores wl-score-edit-file wl-score-flush-cache wl-summary-rescore wl-score-set-mark-below wl-score-set-expunge-below wl-summary-increase-score wl-summary-lower-score ) ("wl-draft" wl-draft-rename-saved-config) ("wl-qs" :interactive t wl-quicksearch-goto-search-folder-wrapper) ("wl-spam" wl-spam-save-status)))) ;; for backward compatibility (defalias 'wl-summary-from-func-petname 'wl-summary-default-from) (make-obsolete 'wl-summary-from-func-petname 'wl-summary-default-from "03 Apr 2000 at latest") (require 'product) (product-provide (provide 'wl) (require 'wl-version)) ;;; wl.el ends here