pax_global_header00006660000000000000000000000064126232045560014517gustar00rootroot0000000000000052 comment=912c443a912e037d898941397b747d3325aa01b3 wanderlust-wanderlust-912c443/000077500000000000000000000000001262320455600163505ustar00rootroot00000000000000wanderlust-wanderlust-912c443/.gitmodules000066400000000000000000000000001262320455600205130ustar00rootroot00000000000000wanderlust-wanderlust-912c443/BUGS000066400000000000000000000003551262320455600170360ustar00rootroot00000000000000* 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-912c443/BUGS.ja000066400000000000000000000003561262320455600174300ustar00rootroot00000000000000* qmail $BBP1~$N(B UW imapd $B$N%a%C%;!<%8$r07$($J$$!#(B * POP3 $B%U%)%k%@$N(B biff $B$,$&$^$/F0$+$J$$(B (c.f. [wl: 08937])$B!#(B * IMAP STATUS $B%3%^%s%I$r(Bselect$B$5$l$?(B mailbox $B$KBP$7$F;H$C$F$O$J$i$J$$(B(RFC3501) wanderlust-wanderlust-912c443/COPYING000066400000000000000000000014171262320455600174060ustar00rootroot00000000000000Copyright (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-912c443/ChangeLog000066400000000000000000000746461262320455600201430ustar00rootroot000000000000002015-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-912c443/INSTALL000066400000000000000000000120301262320455600173750ustar00rootroot00000000000000 How to install Wanderlust Kaoru Takahashi, Yuuichi Teranishi, Tsunehiko Baba System Requirements =================== Wanderlust supports following Emacsen: Mule 2.3 based on Emacs 19.34 Emacs 20.1 or later XEmacs 20.4 or later Before installing Wanderlust, please install the following MIME modules. SEMI (1.14.6 or later) FLIM (1.14.9 or later) Wanderlust and MIME modules require APEL. Before installing MIME modules, please install the APEL. APEL (10.6 or later) Select MIME Module ================== For each Emacsen, Recommended combination of MIME module package follows. (a) XEmacs 21.1 or later APEL 10.8, FLIM 1.14.9, SEMI 1.14.6 Installation as a XEmacs package, If possible. (b) Emacs 20.4 or later APEL 10.8, FLIM 1.14.9, SEMI 1.14.6 (c) Emacs 20.1 to 20.3 APEL 10.8, CLIME 1.14.6, SEMI 1.14.6 Use CLIME instead of FLIM. FLIM does not support Emacs 20.3 or earlier. (d) Emacs 19.34 (Mule 2.3) APEL 10.8, CLIME 1.14.6, SEMI 1.14.6 Mule based on Emacs 19.34 can also run SEMI. See the following web page to get more information (in Japanese). http://www.jpl.org/elips/INSTALL-SEMI-ja.html Install MIME Module =================== You can download these packages from following URLs. APEL: ftp://ftp.m17n.org/pub/mule/apel/ FLIM: ftp://ftp.m17n.org/pub/mule/flim/ CLIME: ftp://ftp.jpl.org/pub/m17n/ SEMI: ftp://ftp.m17n.org/pub/mule/semi/ Please install APEL, FLIM(CLIME), and SEMI, in that order. Generally, 'make install' will do the job. To get full information, please refer to the README.en within each package. You can also use many other FLIM/SEMI variants. Combination of the latest versions should work. For example, the following combinations are confirmed to work: APEL 10.6, SLIM 1.14.9, SEMI 1.14.5 APEL 10.6, CLIME 1.14.5, EMIKO 1.14.1 You have to re-install Wanderlust if you upgraded APEL, FLIM, or SEMI. 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-912c443/INSTALL.ja000066400000000000000000000146421262320455600200010ustar00rootroot00000000000000 Wanderlust $B$N%$%s%9%H!<%kJ}K!(B Kaoru Takahashi $B9b660j(B, Yuuichi Teranishi $B;{@>M50l(B, Tsunehiko Baba $BGO>l91I'(B $BI,MW>r7o(B ======== Wanderlust $B$,%5%]!<%H$9$k(B Emacsen $B$r0J2<$K<($7$^$9!#(B Mule 2.3 based on Emacs 19.34 Emacs 20.1 $B0J9_(B XEmacs 20.4 $B0J9_(B Wanderlust $B$r;H$&$?$a$K$O!"0J2<$K<($9(BMIME$BMQ%b%8%e!<%k$r%$%s%9%H!<%k$7(B $B$F$*$/I,MW$,$"$j$^$9!#(B SEMI (1.14.6 $B0J9_(B) FLIM (1.14.9 $B0J9_(B) Wanderlust $B$*$h$S(B MIME$BMQ%b%8%e!<%k$r;H$&$?$a$K$O(B APEL $B$r%$%s%9%H!<%k$7(B $B$F$*$/I,MW$,$"$j$^$9!#(BAPEL $B$O>o$K:G?7HG$r;H$&$3$H$r?d>)$7$^$9!#(B APEL (10.6 $B0J9_(B) MIME$BMQ%b%8%e!<%k$NA*Br(B ====================== $B)$9$k(B APEL, FLIM, SEMI $B$NAH9g$;$r0J2<$K<($7$^$9!#(B (a) XEmacs 21.1 $B0J9_(B APEL 10.8, FLIM 1.14.9, SEMI 1.14.6 $B2DG=$J$i$P(B XEmacs $B$N%Q%C%1!<%8$H$7$F%$%s%9%H!<%k$9$k$3$H$r$*4+$a$7$^$9!#(B (b) Emacs 20.4 $B0J9_(B APEL 10.8, FLIM 1.14.9, SEMI 1.14.6 (c) Emacs 20.1$B!A(B20.3 APEL 10.8, CLIME 1.14.6, SEMI 1.14.6 FLIM $B$,F0$-$^$;$s$N$G!"Be$o$j$K(B CLIME $B$r%$%s%9%H!<%k$7$F$/$@$5$$!#(B (d) Emacs 19.34 (Mule 2.3) APEL 10.8, CLIME 1.14.6, SEMI 1.14.6 Emacs 19.34 $B%Y!<%9$N(B Mule $B$G$O(B SEMI $B$rF0:n$5$;$k$3$H$,2DG=$G$9!#2<5-(B $B$N%Z!<%8$,;29M$K$J$j$^$9!#(B http://www.jpl.org/elips/INSTALL-SEMI-ja.html MIME$BMQ%b%8%e!<%k$N%$%s%9%H!<%k(B ============================== $B%Q%C%1!<%8$O$=$l$>$l0J2<$N(B URL $B$GF~\$7$$%$%s%9%H!<%k$NJ}K!$O3F%Q%C%1!<%8$KE:IU$5$l$F$$$k%I%-%e%a%s%H(B (README.ja, README.en) $B$r;2>H$7$F$/$@$5$$!#(B $B$=$NB>!"(BFLIM, SEMI $B$K$O$$$m$$$m$JJQ7A%P!<%8%g%s$,B8:_$7$^$9$,!"$=$l$i(B $B$N$$$:$l$bMxMQ$9$k$3$H$,2DG=$G$9!#4pK\E*$K:G?7HG$NAH9g$;$J$iF0:n$9$k$O(B $B$:$G$9!#(B $BNc$($P!"0J2<$NAH9g$;$NF0:n$,3NG'$5$l$F$$$^$9!#(B APEL 10.6, SLIM 1.14.9, SEMI 1.14.5 APEL 10.6, CLIME 1.14.5, EMIKO 1.14.1 APEL, FLIM, SEMI $B$N%P!<%8%g%s%"%C%W$r9T$C$?>l9g$O!"(BWanderlust $B$r%$%s%9(B $B%H!<%k$7D>$7$F$/$@$5$$!#(B $B4D6-$N3NG'(B ========== Wanderlust $B$N%$%s%9%H!<%k$NA0$K4D6-$N3NG'$r$9$k$3$H$r?d>)$7$^$9!#(B % make check $B$^$?$O(B % make EMACS=xemacs check $B$G(B APEL, FLIM, SEMI $B$N%A%'%C%/$r4^$s$@4D6-%F%9%H$,9T$($^$9!#(B $B?7$7$$(B APEL, FLIM, SEMI $B$,%$%s%9%H!<%k$5$l$F$$$F$b!"(Bload-path $B>e$K8E$$(B $B$b$N$,;D$C$F$$$k>l9g$K$O%H%i%V%k$N860x$H$J$j$^$9!#(Bload-path $B>e$G=EJ#$7(B $B$?%U%!%$%k$rC5$9$K$O(B M-x list-load-path-shadows $B$,JXMx$G$9!#(B $BDL>o$N%$%s%9%H!<%k(B ================== (a)Makefile, WL-CFG $B$NJT=8(B Makefile $B$O!"(BEMACS, LISPDIR $B$NItJ,$rJT=8$7$F$/$@$5$$!#(B EMACS $B;HMQ$7$F$$$k(B Emacs $B$N%3%^%s%IL>$r;XDj(B LISPDIR $B%$%s%9%H!<%k@h$r;XDj(B LISPDIR $B$OFC$K;XDj$7$J$/$F$b(B (NONE $B$N$^$^$G$b(B) $B<+F0E*$K%$%s%9%H!<%k(B $B@h$r8!=P$7$^$9!#(B $BI,MW$J$i(B WL-CFG $B$rJT=8$7$F$/$@$5$$!#(B INFO $B$N8@8l$N;XDj$J$I$,$G$-$^$9!#(B (b)$B%P%$%H%3%s%Q%$%k!&%$%s%9%H!<%k(B $B0J2<$rl9g$O!"(Bcustom, APEL, FLIM, SEMI $B$N%$%s%9%H!<%k@h$r4D6-JQ?t(B EMACSLOADPATH $B$K2C$($k$+!"E83+%G%#%l%/%H%j$N(B WL-CFG $B$H$$$&%U%!%$%kCf(B $B$G(B load-path $B$rDL$7$F$*$/$H$h$$$G$7$g$&!#(B XEmacs $B$N%Q%C%1!<%8$H$7$F%$%s%9%H!<%k(B ===================================== Wanderlust $B$O(B XEmacs (21.0 $B0J9_(B) $B$N%Q%C%1!<%8$N$R$H$D$H$7$F%$%s%9%H!<(B $B%k$9$k$3$H$b2DG=$G$9!#%Q%C%1!<%8$H$7$F%$%s%9%H!<%k$9$k$H!"(Bautoload $B$N@_Dj!"%"%$%3%s$N%Q%9@_Dj$r8D?M$N(B .emacs $B$K5-=R$7$J$/$F$b(B Wanderlust $B$r@5>o$K5/F0$G$-$k$h$&$K$J$j$^$9!#(B (a)Makefile, WL-CFG $B$NJT=8(B Makefile $B$O!"(BXEMACS, PACKAGEDIR $B$NItJ,$rJT=8$7$F$/$@$5$$!#(B XEMACS $B;HMQ$7$F$$$k(B XEmacs $B$N%3%^%s%IL>$r;XDj(B PACKAGEDIR package $B$N%G%#%l%/%H%j$r;XDj(B PACKAGEDIR $B$OFC$K;XDj$7$J$/$F$b(B (NONE $B$N$^$^$G$b(B)$B!"(BSEMI $B$,%$%s%9%H!<(B $B%k$5$l$F$$$l$P<+F0E*$K8!=P$5$l$^$9!#(B $BI,MW$J$i(B WL-CFG $B$rJT=8$7$F$/$@$5$$!#(B INFO $B$N8@8l$N;XDj$J$I$,$G$-$^$9!#(B (b)$B%P%$%H%3%s%Q%$%k!&%$%s%9%H!<%k(B $B0J2<$rl9g$O!"(B load-path $B$r@_Dj$9$kI,MW$O$"$j$^$;$s!#(B Emacs 20.2 $B0JA0$r$*;H$$$J$i!"(BWanderlust $B$r(B install $B$7$?>l=j$r(B load-path $B$K@_Dj$7$F$/$@$5$$!#(B $B$b$7(B Emacs 19.29 $B0J9_$^$?$O(B Emacs 20.1, Emacs 20.2 $B$r;H$C$F=i4|@_Dj(B $B$G%$%s%9%H!<%k$7$?$N$J$i!"l9g$O<+F0E*$K(B Info $B%U%!%$%k(B $B$b%$%s%9%H!<%k$5$l$k$N$G$3$l$i$NA`:n$OI,MW$"$j$^$;$s!#(B $B%^%K%e%"%k$N%$%s%9%H!<%k@h$O<+F08!=P$5$l$^$9!#(B(Makefile $BCf$N(B INFODIR $B$G$b@_Dj2DG=$G$9(B) $B%5%s%W%k@_Dj(B ============ Wanderlust $B$N@_Dj%U%!%$%k$K$O!"(B ~/.wl Wanderlust $B$N@_Dj(B ($B5/F0;~$KFI$_9~$^$l$k(B) ~/.folders $B%U%)%k%@@_Dj(B ~/.addresses $B%"%I%l%9D"(B ($BL5$/$F$b5/F0$G$-$k(B) $B$N;0$D$,$"$j$^$9!#(B $B$=$l$>$l!"(Bsamples/ja/ $B%G%#%l%/%H%j$N2<$K%5%s%W%k@_Dj(B (dot.addresses, dot.folders, dot.wl) $B$,$"$j$^$9$N$G!"(B $B3F<+$G%[!<%`%G%#%l%/%H%j$K%3%T!<$7$FJT=8$9$k$J$I$7$F$/$@$5$$!#(B $B>\$7$$@_Dj$O(B Info $B$r8fMw$/$@$5$$!#(B Local Variables: fill-column: 72 End: wanderlust-wanderlust-912c443/Makefile000066400000000000000000000062721262320455600200170ustar00rootroot00000000000000# # 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-912c443/NEWS000066400000000000000000000724621262320455600170620ustar00rootroot00000000000000Wanderlust 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-912c443/NEWS.ja000066400000000000000000001054141262320455600174450ustar00rootroot00000000000000Wanderlust NEWS ($BF|K\8lHG(B) -- User-visible changes in Wanderlust. * 2.14.x $B$+$i(B 2.16.0 $B$X$NJQ99E@(B ** $B$3$N%j%j!<%9$O8x<0$N$b$N$G$O$"$j$^$;$s!#M-;V$K$h$j!"(Bgithub $B$N(B $B%j%]%8%H%j$G3+H/$5$l$F$$$k$b$N$G$9!#(B ( https://github.com/wanderlust ) ** $B%a!<%j%s%0%j%9%H$N%"%I%l%9$,JQ99$5$l$^$7$?!#(B ** $B?75,%U%)%k%@(B rss $B%U%)%k%@$,DI2C$5$l$^$7$?!#(B ** $B%*%U%i%$%s;~$K%a%C%;!<%8$N0\F0$r9T$C$?8e$K%*%s%i%$%s$K$J$C$?:]$K!"(B $BA`:n$K$h$C$F$O0U?^$;$:$K%a%C%;!<%8$,<:$o$l$k;v$,$"$k$N$r=$@5$7$^$7(B $B$?!#$3$N>r7o$KEv$F$O$^$C$?%a%C%;!<%8$O!"(Belmo-lost+found-folder ($B%G(B $B%U%)%k%H$G$O(B"+lost+found") $B$K<}G<$5$l$^$9!#(B ** SSL/TLS $B@\B3$K!"AH$_9~$_(B GnuTLS $B$d(B tls.el $B$r;HMQ$9$k$h$&$K$J$j$^$7$?!#(B ** $B%I%i%U%H%P%C%U%!$N%O%$%i%$%H$K(B jit-lock-mode $B$r;HMQ$9$k$h$&$K$J$j$^$7$?!#(B idle-timer $B$r;HMQ$7$?%O%$%i%$%H$b%5%]!<%H$5$l$F$$$^$9!#(B ** IMAP4$B$G!";HMQ$G$-$k>l9g$O(B utf-7-imap $B%3!<%G%#%s%0%7%9%F%`$r;HMQ$7$^$9!#(B $B$3$N;~!"(Belmo-imap4-use-modified-utf7 $B$N%G%U%)%k%HCM$O(B t $B$K$J$j!"(B utf7.el $B$O%$%s%9%H!<%k$5$l$^$;$s!#(B ** wl-summary-pick $BEy$G(B `body' $B$KBP$7$F8!:w$r$+$1$k$H!"%F%-%9%H%Q!<%H(B $B$KBP$7$F%G%3!<%I$r9T$C$F$+$i8!:w$9$k$h$&$K$J$j$^$7$?!#=>MhDL$j$N8!(B $B:w$O(B `raw-body' $B$KBP$7$F8!:w$r9T$C$F$/$@$5$$!#(B ** sendmail $B%Q%C%1!<%8$K$h$k%a!<%kAw?.$,%5%]!<%H$5$l$^$7$?!#(B ** IMAP $B%U%)%k%@$N2~L>;~$K%a%C%;!<%8$,<:$o$l$k;v$,$"$k%P%0$r=$@5$7$^$7$?!#(B ** spam $B$H$7$FEPO?$7$?%a%C%;!<%8$K(B spam $B%^!<%/$rIU$1$^$9!#(B ** non-spam $B$H$7$FEPO?$7$?%a%C%;!<%8$+$i(B spam $B%^!<%/$rr7o$r;XDj=PMh$k$h$&$K$J$j$^$7$?!#(B "," $B6h@Z$j$G>r7o$rJB$Y$F2<$5$$!#(B ** $B%M%C%H%o!<%/%U%)%k%@L>$N2r@O$r87L)$K9T$&$h$&$K$J$j$^$7$?!#(B ** $B%j%U%!%$%k=hM}$N:GE,2=(B filter, pipe, multi $B%U%)%k%@$r2re=q$-$7$F$7$^$&LdBj$,=$@5$5$l$^$7$?!#(B $B%a%C%;!<%8$rDI2C$9$k=hM}$K%P%0$,B8:_$7$F$$$^$7$?!#(B * 2.14.0 $B$+$i(B 2.14.1 $B$X$NJQ99E@(B 2.14.1 $B$O!"(B2.14.0 $B$N%P%0=$@5HG$G$9!#(B ** Maildir $B$GI=<(=g=x$,@5$7$/$J$$%P%0$,=$@5$5$l$^$7$?!#(B ** $B%"%/%;%9%U%)%k%@$N%"%$%3%s$,I=<($5$l$^$9!#(B * 2.12.2 $B$+$i(B 2.14.0 $B$X$NJQ99E@(B ** $B?7$7$$%U%)%k%@7?(B access $B%U%)%k%@$,DI2C$5$l$^$7$?!#(B $B;XDj$5$l$?%U%)%k%@$NG[2<$N%5%V%U%)%k%@$r2>A[E*$K0l$D$N%U%)%k%@$H$7$F07$((B $B$k$h$&$K$9$k%U%)%k%@$G$9!#(B ** $B%U%)%k%@$N%"%C%W%G!<%H$,9bB.2=$5$l$^$7$?!#(B $B%j%9%H$N:9J,$r7W;;$9$k4X?t$,=q$-D>$5$l!"FC$KB?$/$N%a%C%;!<%8$r4^$`%U%)(B $B%k%@$G$NF0:n$,9bB.$K$J$j$^$7$?!#(B ** $B?7$7$$%$%Y%s%H%O%s%I%j%s%05!G=$,DI2C$5$l$^$7$?!#(B ** $B%I%i%U%H%U%)%k%@$K(B IMAP $B%U%)%k%@$r;XDj$7$F$$$k>l9g$NIT6q9g$,2~A1$5$l$^$7$?!#(B $B%*%U%i%$%s>uBV$G%I%i%U%H$rJ]B8$9$k$H$-$N5sF0$K%P%0$,$"$j$^$7$?$,!"?7$7$$(B $B%$%Y%s%H%O%s%I%j%s%05!G=$rMQ$$$F=$@5$5$l$^$7$?!#(B ** `Shimbun' $B$N%5%^%j$,F0E*$K99?7$5$l$^$9!#(B $B$$$/$D$+$N(B shimbun $B%U%)%k%@$O!"%5%^%j$N>pJs$,@5$7$/$"$j$^$;$s!#(B $B$3$N%P!<%8%g%s$+$i!"%a%C%;!<%8$rpJs$rMQ$$$F%5%^%j$,(B $B<+F0E*$K=$@5$5$l$k$h$&$K$J$j$^$7$?!#$3$NB?$/$N%P%0=$@5!#(B * 2.12.0 $B$+$i(B 2.12.1 $B$X$NJQ99E@(B 2.12.1 $B$O!"(B2.12.0 $B$N%P%0=$@5HG$G$9!#(B ** Windows $B$G(B Maildir $B$,;H$($k$h$&$K$J$j$^$7$?!#(B $B$?$@$7!"5,3J$KB'$C$F$$$^$;$s$N$G!"(BUNIX $B>e$N(B Maildir $B$H8_49@-$,$"$j$^$;$s!#(B ** $B%U%#%k%?%U%)%k%@Ey$G$N%-%c%C%7%e%^!<%/IT@09g$NIT6q9g$,2r>C$5$l$^$7$?!#(B $B%-%c%C%7%e$5$l$F$b%-%c%C%7%e$5$l$F$$$J$$I=<($H$J$k>l9g$,$"$j$^$7$?$,(B $B=$@5$5$l$^$7$?!#(B ** $B%U%i%0$,?75,$N$^$^JQ99$5$l$J$/$J$k>l9g$,$"$k%P%0$N=$@5!#(B ** Maildir $B$GJ#?t%a%C%;!<%80\F0;~!"%U%i%0$,@5$7$/0z$-7Q$,$l$J$$%P%0$N=$@5!#(B $B:G=i$N%a%C%;!<%8$7$+%U%i%0$,0z$-7Q$,$l$^$;$s$G$7$?$,!"=$@5$5$l$^$7$?!#(B ** $BF~$l;R$K$J$C$?%a%C%;!<%8$N(B IMAP $B$K$h$kI=<(;~$NIT6q9g$,2r>C$5$l$^$7$?!#(B $BF~$l;R$K$J$C$?%a%C%;!<%8$r%Q!<%H%U%'%C%A$7$?>l9g!"%X%C%@$,I=<($5$l$J$$(B $B>l9g$,$"$j$^$7$?$,!"@5$7$/I=<($5$l$k$h$&$K$J$j$^$7$?!#(B ** %INBOX $B$N%5%V%U%)%k%@$K(B %INBOX $B<+BN$,4^$^$l$J$$>l9g$,$"$kLdBj$KBP=h$7$^$7$?!#(B cyrus-imapd $B$G!"Ev3:$NLdBj$,=P$F$$$^$7$?$,=$@5$5$l$^$7$?!#(B ** $B%U%i%0$,!"8!:w;~Ey$NJd408uJd$H$7$F8=$l$k$h$&$K$J$j$^$7$?!#(B ** Folder mode $B$G%"%/%;%9%0%k!<%W(B "@/" $B$NE83+$,@5$7$/F0:n$7$^$9!#(B ** $B%U%i%0L>$K$h$C$F$O4V0c$C$?%U%i%0%U%)%k%@$,:n@.$5$l$kLdBj$,=$@5$5$l$^$7$?!#(B $B%U%i%0$K(B [a-z]$B0J30$NJ8;z$r;H$C$?$H$-$NLdBj$KBP=h$7$^$7$?!#(B ** $B%I%i%U%H$N<+F0J]B8;~$K%(%i!<$K$J$C$F$7$^$&LdBj$,=$@5$5$l$^$7$?!#(B ** $B%"%I%l%9%^%M!<%8%c$r5/F0$7$?:]$K%(%i!<$K$J$kLdBj$,=$@5$5$l$^$7$?!#(B $BK\J8$K(B To: $BEy$NJ8;zNs$,$"$k$H%(%i!<$,H/@8$7$F$$$^$7$?$,!"=$@5$5$l$^$7$?!#(B ** $B%U%#%k%?%U%)%k%@$+$i$N%3%T!uBV$G$b%-%c%C%7%e$rMQ$$$?:FAw(B(resend)$B$,$G$-$^$9!#(B ** $B?75,%*%W%7%g%s(B elmo-network-session-idle-timeout $B$,DI2C$5$l$^$7$?!#(B $B;XDj$7$?;~4V0J>e%"%$%I%k>uBV$H$J$C$?%;%C%7%g%s$r:FMxMQ$7$^$;$s!#(B ** 'H' $B$d(B 'M' $B$G$N%a%C%;!<%8:FI=<($,8zN(2=$5$l$^$7$?!#(B $B:FI=<(;~$K(B MIME $B$N9=B$!"%P%C%U%!$r:FMxMQ$9$k$h$&$K$J$j$^$7$?!#(B ** $B%I%i%U%H$N%W%l%S%e!<;~$KI=<($5$l$kB0@-I=<($,(B netnews $B$KBP1~$7$^$7$?!#(B * 2.10.1 $B$+$i(B 2.12.0 $B$X$NJQ99E@(B ** $B%a%C%;!<%8%G!<%?%Y!<%9$N9=B$$,2~A1$5$l$^$7$?!#(B $B0J2<$N@_Dj$r$9$l$P!"%U%)%k%@A*Br;~$K<+F0E*$K5lMh$N%?%$%W$N(B msgdb $B$r(B $B?7$7$$%?%$%W$N$b$N$KJQ49$7$^$9!#(B (setq elmo-msgdb-default-type 'standard elmo-msgdb-convert-type 'auto) $B=i4|CM$O!">e5-$NDL$j$H$J$C$F$$$^$9!#(B ** $B0l;~%^!<%/$H!"$=$l$KBP$9$k%"%/%7%g%s$r<+M3$KDj5A$G$-$k$h$&$K$J$j$^$7$?!#(B $B%G%U%)%k%H$G$O0J2<$N%^!<%/$H%"%/%7%g%s$rDj5A$7$F$$$^$9!#(B $B=>Mh$+$i0z$-7Q$,$l$?%^!<%/$H%"%/%7%g%s(B "o" refile ($B=>Mh$N%j%U%!%$%k$HF1$8(B) "O" copy ($B=>Mh$N%3%T!<$HF1$8(B) "d" dispose ($B5l(B delete, D $B%^!<%/!#(Bwl-trash-folder $B$K0\F0!#(B wl-dispose-folder-alist $B$NCM$K$h$j5sF0$,7h$^$k!#(B) $B?7$?$KDI2C$5$l$?%^!<%/$H%"%/%7%g%s(B "D" delete ($B$$$-$J$j>C5n(B) "i" prefetch ($B%W%j%U%'%C%A(B) "~" resend ($B:FAw(B) $B%5%^%j$G(B x $B%-!<$r2!$9$H%^!<%/$KBP1~$7$?%"%/%7%g%s$,$9$Y$F\$7$/$OF1JQ?t$N(B docstring $B$r;2>H$7$F$/$@$5$$!#(B ** $B%9%Q%`%U%#%k%?%b%8%e!<%k$,?7$?$KDI2C$5$l$^$7$?!#(B $B0J2<$N%9%Q%`%U%#%k%?$KBP1~$7$F$$$^$9!#(B bogofilter spamfilter bsfilter SpamAssassin SpamOracle $B@55,I=8=$K$h$k%X%C%@8!::(B ** 'mark $B%U%)%k%@$O2~L>$5$l!"(B'flag $B%U%)%k%@$K$J$j$^$7$?!#(B $B$3$l$K4XO"$7$F!"(B'flag $B%U%)%k%@$N%5%^%j$G85%a%C%;!<%8$,$I$3$K$"$k$+$r(B help-echo $B$H$7$FI=<($9$k$h$&$K$J$j$^$7$?(B($B$3$l$N$U$k$^$$$O(B wl-highlight-summary-line-help-echo-alist $B$G@)8f$G$-$^$9(B)$B!#(B ** $B%a%C%;!<%8$KBP$7$FG$0U$N%f!<%6Dj5A$N%U%i%0$rIU$1$i$l$k$h$&$K$J$j$^$7$?!#(B $B%5%^%j$K$*$$$F(B "F" $B$G%U%i%0$N;XDj$,$G$-$^$9!#(B ** $BJV?.:Q$_%^!<%/(B A,a $B$,DI2C$5$l$^$7$?!#(B $B%5%^%j$K$*$$$F!"JV?.$7$?%a%C%;!<%8$K(B A $B%^!<%/(B($B%-%c%C%7%e$J$7$N>l9g(B) $B$b$7$/$O(B a $B%^!<%/(B($B%-%c%C%7%e$"$j$N>l9g(B) $B$,I=<($5$l$^$9!#(B ** $BE>Aw:Q$_%^!<%/(B F,f $B$,DI2C$5$l$^$7$?!#(B $B%5%^%j$K$*$$$F!"E>Aw$7$?%a%C%;!<%8$K(B F $B%^!<%/(B($B%-%c%C%7%e$J$7$N>l9g(B) $B$b$7$/$O(B f $B%^!<%/(B($B%-%c%C%7%e$"$j$N>l9g(B) $B$,I=<($5$l$^$9!#(B ** $B%U%)%k%@$N8!:w>r7o$K!"(B'$B%U%i%0(B' ($B%a%C%;!<%8$N>uBV(B) $B$,DI2C$5$l$^$7$?!#(B $B%U%i%0$K$O!"(Bunread($BL$FI(B), important($B=EMW(B), answered($BJV?.:Q$_(B), digest ($BL$FI$^$?$O=EMW(B), any ($BL$FI$^$?$O=EMW$^$?$OJV?.:Q$_(B)$B$,$"$j$^$9!#(B $BNc$($P!"Z!"I|9f2=$N$?$a$N%3%^%s%I$,DI2C$5$l$^$7$?!#(B $B%a%C%;!<%8%P%C%U%!$K$*$$$F(B C-c:v, C-c:d $B$G$=$l$>$l8!>Z!"I|9f2=$7$^$9!#(B ** $B%5%^%j$rJB$YBX$(>r7o$N5U=g$G%=!<%H$G$-$k$h$&$K$J$j$^$7$?!#(B ** $B%a%C%;!<%8%P%C%U%!$GJ#?t9T$K$o$?$kD9$$%X%C%@$r>JN,I=<($7$^$9!#(B ** $B%5%^%j%P%C%U%!$N1JB3%^!<%/$NJ8;zNs$,JQ99$5$l$^$7$?!#(B $B%G%U%)%k%H$N@_Dj$G$O%-%c%C%7%e$NM-L5$rBgJ8;z>.J8;z$G<($7$^$9!#(B ** $BAw?.3NG'$N:]$K%I%i%U%H$N%W%l%S%e!<$rI=<($9$k$h$&$K$J$j$^$7$?!#(B ** $B%I%i%U%H$N%W%l%S%e!<$N:]$KAw?.%Q%i%a!<%?$rI=<($9$k$h$&$K$J$j$^$7$?!#(B $B>\$7$/$OJQ?t(B wl-draft-preview-attributes $B$N@bL@$r8+$F2<$5$$!#(B ** wl-biff-use-idle-timer $B$r@_Dj$9$k$H(B biff $B$,(B idle-timer $B$GAv$j$^$9!#(B ** wl-draft-kill $B$O(B yes-or-no-p $B$G3NG'$r5a$a$k$h$&$K$J$j$^$7$?!#(B ** $B%5%^%j$G0lDj0J>e?<$$%9%l%C%I$OJ,3d$5$l$^$9!#(B $BJQ?t(B wl-summary-max-thread-depth $B$G8B3&$rJQ99$G$-$^$9!#(B ** Emacs multi-tty support $B$KBP1~$7$^$7$?!#(B (http://lorentey.hu/project/emacs.html) ** $B%5%^%j$NJB$YBX$(>r7o$K(B 'size' $B$,DI2C$5$l$^$7$?!#(B $B%a%C%;!<%8%5%$%:$K$h$k%5%^%j$NJB$YBX$($,2DG=$K$J$j$^$7$?!#(B ** $BJQ?t(B wl-refile-policy-alist $B$OGQ;_$5$l$^$7$?!#(B ** $B%P%C%A=hM}MQ$N%b%8%e!<%k$,?7$?$KDI2C$5$l$^$7$?!#(B ** $B%^%k%A%U%)%k%@$H%*%j%8%J%k%U%)%k%@$N>uBV$,F14|$5$l$k$h$&$K$J$j$^$7$?!#(B $BNc$($P!"(B+inbox $B$NL$FI>pJs$,!"(B*+inbox,+outbox $B$K$bH?1G$5$l$^$9!#(B ** $B4X?t(B wl-summary-resend-message $B$OGQ;_$5$l$^$7$?!#(B $B$=$NBe$o$j$K(B wl-summary-resend $B$r;H$($P:FAw%^!<%/$rIU$1$k$3$H$,$G$-$^$9!#(B ** $BJQ?t(B wl-delete-folder-alist $B$O(B wl-dispose-folder-alist $B$K(B $BL>A0$,JQ99$5$l$^$7$?!#(B ** POP3 $B%U%)%k%@$NB8:_%A%'%C%/$N%G%U%)%k%H5sF0$r4JN,2=(B elmo-pop3-exists-exactly $B$N%G%U%)%k%HCM$r(B nil $B$K$7$^$7$?!#(B ** RFC2449 $B$N(B POP3 $B3HD%$N%l%9%]%s%9%3!<%I$KBP1~$7$^$7$?!#(B $BB>$N%;%C%7%g%s$,;HMQCf$G$"$k$?$a$KG'>Z$K<:GT$7$?$H$-$K$O!"%Q%9%o!<%I(B $B$,%/%j%"$5$l$J$/$J$j$^$7$?!#(B ** IMAP4 $B$K$*$$$F!"(BEXPUNGE, CHECK $B%3%^%s%I$rHsF14|$GAw?.$9$k$h$&$K$7$^$7$?!#(B ** wl-folder-hierarchy-access-folders $B$N=i4|CM$,JQ99$5$l$^$7$?!#(B ** $B?7J9%U%)%k%@$N%"%/%;%9%0%k!<%W(B "@/" $B$,;H$($k$h$&$K$J$j$^$7$?!#(B ** $BA0$K;H$C$F$$$?$b$N$h$j?7$7$$(B Wanderlust $B$r5/F0$9$k$H(B NEWS(.ja) $B$NFbMF$r(B $BI=<($7$^$9!#(B ** wl-draft-reply-*-list $B$N=i4|CM$,JQ99$5$l$^$7$?!#(B $B0JA0$N@_Dj$O!"(Bsamples/ja/dot.wl $B$r;2>H$7$F2<$5$$!#(B ** wl-draft-reply-myself-*-list $B$OGQ;_$5$l!"(Bwl-draft-reply-*-list $B$KE}9g(B $B$5$l$^$7$?!#(B ** $BJV?.MQ%I%i%U%H$N%+!<%=%k$N=i4|0LCV$r;XDj$G$-$^$9!#(B $BJQ?t(B wl-draft-reply-default-position $B$r@_Dj$7$F2<$5$$!#(B ** $B%I%i%U%H%P%C%U%!%&%#%s%I%&$NG[CV$N;XDj$N;EJ}$,JQ99$5$l$^$7$?!#(B wl-draft-buffer-style $B$H(B wl-draft-reply-buffer-style $B$K(B keep,full,split $B$N$$$:$l$+$r;XDj$7$^$9!#(B ** $B?75,(B 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 ** $BGQ;_$5$l$?(B hook wl-reply-hook ** $B?75,(B 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 ** $BGQ;_$5$l$?(B face wl-highlight-refile-destination-face (wl-highlight-action-argument-face $B$KJQL>(B) * 2.10.0 $B$+$i(B 2.10.1 $B$X$NJQ99E@(B 2.10.1 $B$O(B 2.10.0 $B$N%P%0=$@5HG$G$9!#(B ** print-length $B$d(B print-level $B$,(B Non-nil $B$N$H$-$K(B msgdb $B$,2u$l$kLdBj$,(B $B=$@5$5$l$^$7$?!#(B ** $B%Q%$%W%U%)%k%@$K$*$$$F(B wl-summary-pack-number $B$,$&$^$/F0$+$J$+$C$?(B $B$?$a8z$+$J$/$7$F$"$j$^$9!#I,MW$G$"$l$Pe$G(B wl-draft-reedit $B$,$&$^$/F0$+$J$$LdBj$,=$@5$5$l$^$7$?!#(B ** wl-summary-pack-number $B$,(B Maildir $B$d(B shimbun $B%U%)%k%@$GF0$+$J$$(B $BLdBj$,=$@5$5$l$^$7$?!#(B ** $B=EMW%^!<%/$D$-%a%C%;!<%8$N%-%c%C%7%e$KBP$9$kJ]8n5!G=$,F/$+$J$$(B $BIT6q9g$,=$@5$5$l$^$7$?!#(B ** wl-summary-line-format $B$N(B %# $B$GBg$-$J?tCM$r@5$7$/07$($J$$IT6q9g(B $B$,=$@5$5$l$^$7$?!#(B ** SMTP AUTH $B$GG'>Z0J30$N%(%i!<$G$b%Q%9%o!<%I>C5n$5$l$kIT6q9g$,=$(B $B@5$5$l$^$7$?!#(B ** wl-message-buffer-prefetch-folder-type-list, wl-message-buffer-prefetch-idle-time, wl-message-buffer-prefetch-depth $B$N%G%U%)%k%HCM$,JQ99$5$l$^$7$?!#(B ** XEmacs without mule $B$G%3%s%Q%$%k$G$-$J$$LdBj$,=$@5$5$l$^$7$?!#(B * 2.8.1 $B$+$i(B 2.10.0 $B$X$NJQ99E@(B ** $B%5%^%j9T$NI=<(7A<0$rJQ99$G$-$k$h$&$K$J$j$^$7$?!#(B wl-summary-line-format $B$G=q<0$r@_Dj$G$-$^$9!#%U%)%k%@Kh$K=q<0$rJQ$($?$$(B $B>l9g$O(B wl-folder-summary-line-format-alist $B$rMQ$$$F2<$5$$!#(B ** $B%I%i%U%H%U%)%k%@$X$NJ]B87A<0$,JQ99$5$l$^$7$?!#(Bwl-draft-save $B$N:]$K$O(B $B%(%s%3!<%I$7$FJ]B8$5$l$^$9!#(B ** elmo-split $B$,?7@_$5$l$^$7$?!#M?$($?%k!<%k$K1h$C$F(B procmail $BIw$K%a%C%;(B $B!<%8$r?6$jJ,$1$k$3$H$,$G$-$^$9!#(B ** $B%P%C%U%!%W%j%U%'%C%A$,r7o$rK~$?$9%a%C%;!<%8$+$i$J$k2>A[%U%)%k%@(B $B$X0\F0$G$-$^$9(B (wl-folder-virtual)$B!#(B"V" $B$K%P%$%s%I$5$l$F$$$^$9!#(B ** $B%U%)%k%@%b!<%I$G!"M?$($i$l$?>r7o$rK~$?$9%a%C%;!<%8$r4^$`%U%)%k%@$rC5$;$k(B $B$h$&$K$J$j$^$7$?(B (wl-folder-pick)$B!#(B"?" $B$K%P%$%s%I$5$l$F$$$^$9!#(B ** $B%"%/%;%9%0%k!<%W%U%)%k%@$N2~L>$,=PMh$k$h$&$K$J$j$^$7$?!#(B ** $B?75,%5%^%j$KBP$9$k%9%l%C%II=<($N(B ON/OFF $B$r;XDj$G$-$k$h$&$K$J$j$^$7$?!#(B wl-summary-default-view, wl-summary-default-view-alist $B$r@_Dj$7$F2<$5$$!#(B ** $B%9%F%#%C%-!<%5%^%j$r(B q $B$d(B g $B$GH4$1$k:]$K!"0l;~E*%^!<%/$rJ];}$9$k$h$&$K(B $B$J$j$^$7$?!#(B ** $B%9%F%#%C%-!<%5%^%j$K4X$9$k%-!<%P%$%s%I$,JQ99$K$J$j$^$7$?!#(B $B%5%^%j$G(B C-u g $B$9$k$H(B C-u q $B$HF1MM$K%5%^%j$rGK4~$7$^$9!#%5%^%j$d%U%)%k%@(B $B%b!<%I$+$i(B G $B$G%5%^%j$K0\F0$9$k$H!"?75,%5%^%j$,%9%F%#%C%-!<$K$J$j$^$9!#(B ** C-cC-n $B$d(B C-cC-p $B$G%5%^%j%P%C%U%!4V$r=d2s$G$-$^$9!#(B ** $B%j%9%H(B wl-folder-hierarchy-access-folders $B$N3FMWAG$O!"%"%/%;%9%0%k!<%W$K(B $B$D$$$F$N@55,I=8=$K$J$j$^$7$?(B($B$3$l$^$G$O@53N$J%0%k!<%WL>$G$7$?(B)$B!#(B ** $B%I%i%U%H$N%X%C%@ItJ,$G(B C-a $B$9$k$H!"9TF,$b$7$/$O%X%C%@$N@hF,$K%+!<%=%k$,(B $B0\F0$7$^$9!#(B ** $B%+%W%;%k2=(B Blind Carbon Copy $B$rAw$l$k$h$&$K$J$j$^$7$?!#(B $B%G%U%)%k%H$N%U%#!<%k%IL>$O(B "Ecc:" $B$G$9!#(B ** $B%I%i%U%H$N(B C-c C-y $B$G%j!<%8%g%s$r0zMQ$G$-$k$h$&$K$J$j$^$7$?!#(B transient-mark-mode (Emacs) $B$b$7$/$O(B zmacs-regions (XEmacs) $B$,(B Non-nil $B$G!"%j!<%8%g%s$,M-8z$N$H$-$K:nMQ$7$^$9!#(B ** $B%^%k%A%Q!<%H$N%a%C%;!<%8$+$i%Q!<%H$r:o=|$G$-$k$h$&$K$J$j$^$7$?!#(B $B%a%C%;!<%8%P%C%U%!$G(B "D" $B$K%P%$%s%I$5$l$F$$$^$9!#(B ** $B%K%e!<%95-;v$rEj9F$9$k%5!<%P$r4JC1$K@_Dj$G$-$k$h$&$K$J$j$^$7$?!#(B Info $B$NNc$K=,$C$F(B wl-nntp-posting-config-alist $B$r@_Dj$7$F2<$5$$!#(B ** $BJQ?t(B wl-draft-reply-with-argument-list $BEy$G!"4X?t$NJV$jCM$+$i08@h$r(B $B7h$a$i$l$k$h$&$K$J$j$^$7$?!#(B ** $B4X?t(B wl-draft $B$N%$%s%?!<%U%'!<%9$,JQ99$5$l$^$7$?!#(B $B:G=i$KMQ0U$9$k%X%C%@$r4XO"%j%9%H$N7A$GEO$9$h$&$K$J$j$^$7$?!#(B ** wl-generate-mailer-string-function $B$N;HMQK!$,JQ99$K$J$j$^$7$?!#(B User-Agent $B%U%#!<%k%I$KF~$kJ8;zNs$rJV$94X?t$r;XDj$7$F2<$5$$!#(B ** Reference Card (doc/wl-refcard-ja.tex) $B$K$$$/$D$+$N=$@5!#(B * 2.6.1 $B$+$i(B 2.8.0 $B$X$NJQ99E@(B ** Nemacs, Mule 2.3 based on Emacs 19.28 $B$O%5%]!<%H$5$l$J$/$J$j$^$7$?!#(B ** FLIM 1.14.2 $B0JA0$N(B FLIM $B$G$O$&$^$/F0$+$J$$>l9g$,$"$j$^$9!#(B FLIM 1.14.3 $B0J9_$*$h$SBP1~$7$?(B SEMI $B$r%$%s%9%H!<%k$7$F$/$@$5$$!#(B ** make check $B$G4JC1$J4D6-%F%9%H$,$G$-$k$h$&$K$J$j$^$7$?!#(B ** $BL>A0JQ99Ey$G;H$o$l$J$/$J$C$?JQ?t$r(B .wl $BEy$G@_Dj$7$F$$$k$H!"7Y9p$,I=<($5$l(B $B$^$9!#%a%C%;!<%8$r;29M$K$7$F!"@_Dj$rJQ99$7$F$/$@$5$$!#(B $B$b$72?$i$+$NM}M3$G7Y9p$NI=<($rM^@)$7$?$$>l9g$K$O!"JQ?t(B elmo-obsolete-variable-show-warnings $B$r(B nil $B$K$7$F$/$@$5$$!#(B ** $B?75,FbIt%U%)%k%@(B 'sendlog $B$,DI2C$5$l$^$7$?!#(B ** $B?75,%U%)%k%@(B shimbun $B%U%)%k%@$,DI2C$5$l$^$7$?!#(B $B=q<0(B: '@' '$B2>A[%5!<%PL>(B' '.' '$B%0%k!<%WL>(B' ** $B?75,%U%)%k%@(B namazu $B%U%)%k%@$,DI2C$5$l$^$7$?!#(B $B=q<0(B: '[' 'namazu $B8!:w<0(B' ']' [ 'namazu index $B$N%Q%9!J@dBP%Q%9!K(B' ] ** $B%Q%$%W%U%)%k%@$G%5!<%P$K%a%C%;!<%8$r;D$9$3$H$,$G$-$k$h$&$K$J$j$^$7$?(B $Bl9g$G$b!"%9%-%C%W$7$?%Q!<%H0J30$O(B $B%*%U%i%$%s>uBV$GFI$_JV$9$3$H$,$G$-$k$h$&$K$J$j$^$7$?!#(B ** $B%a%C%;!<%8$N%W%j%U%'%C%A$G%a%C%;!<%8%S%e!<$^$G:n@.$9$k$h$&$K$J$j$^$7$?!#(B $B%W%j%U%'%C%A$5$l$?%a%C%;!<%8$NI=<($,9bB.2=$5$l$^$7$?!#(B ** $B%a%C%;!<%8%P%C%U%!!"%I%i%U%H%P%C%U%!$GD9$$9T$N@^$jJV$7$r@_Dj$G$-$k$h$&$K(B $B$J$j$^$7$?!#JQ?t(B wl-message-truncate-lines, wl-draft-truncate-lines $B$,(B non-nil $B$J$i!"$=$l$>$l$K$D$$$FD9$$9T$r(B window $BI}$G@Z$j=L$a$^$9!#(B ** $B%*!<%W%K%s%0%G%b$K;H$o$l$k%S%C%H%^%C%W2hA|$O(B wl-demo.elc $B$+$i$5$l$^$7$?!#(B ** elmo $B$N%P%C%/%(%s%I$K0MB8$7$?JQ?t$O(B "elmo-$B%P%C%/%(%s%IL>(B-*" $B$H$$$&L>A0$KJQ99$5$l$^$7$?!#(B $BNc$($P!"(B elmo-default-imap4-server $B$,(B elmo-imap4-default-server $B$K(B $BJQ99$5$l$F$$$^$9!#(B ** xxx-func $B$H$$$&L>A0$NJQ?t$O(B xxx-function $B$H$$$&L>A0$KJQ99(B $B$5$l$^$7$?!#(B ** X-Face utility 1.3.6.12 $B0JA0$O%5%]!<%H$5$l$J$/$J$j$^$7$?!#(B $BI,MW$J$i(B X-Face utility 1.3.6.13 $B0J9_$r%$%s%9%H!<%k$7$F$/$@$5$$!#(B ** plugged $B%b!<%I$G!"(Bstream-type $B$,0c$&$b$N$OJL%(%s%H%j$H$7$F07$o$l$k$h$&$K(B $B$J$j$^$7$?!#(B ** $B%"!<%+%$%V(B, $B%^%k%A%U%)%k%@MQ$N(B msgdb path $B$,JQ99$5$l$^$7$?!#(B $B$=$N$^$^$G$bLdBj$"$j$^$;$s$,!"%G%#%9%/$KL5BL$J%G!<%?$r;D$7$?$/$J$$J}$O(B .elmo/multi, .elmo/archive $B0J2<$r$"$i$+$8$a:o=|$7$F$*$$$F$/$@$5$$!#(B ** xxx-dir $B$H$$$&L>A0$NJQ?t$O(B xxx-directory $B$H$$$&L>A0$KJQ99$5$l$^$7$?!#(B $BNc$($P!"(Bwl-icon-dir $B$O(B wl-icon-directory $B$KJQ99$5$l$F$$$^$9!#(B Emacs21 $B$G(B logo $BI=<($J$I$N@_Dj$r$7$F$$$kJ}$OFC$KCm0U$7$F$/$@$5$$!#(B ** elmo-cache-dirname $B$rGQ;_$7$F(B elmo-cache-directory $B$r?7@_$7$^$7$?!#(B elmo-cache-directory $B$r@_Dj$9$k$3$H$K$h$C$F%-%c%C%7%e$@$1$rA4$/JL$N(B $B%G%#%l%/%H%j$KCV$/$3$H$,$G$-$^$9!#(B ** elmo-enable-disconnected-operation $B$N%G%U%)%k%HCM$,(B t $B$K$J$j$^$7$?!#(B $B%*%U%i%$%s>uBV$G$b%a%C%;!<%8$,%-%c%C%7%e$5$l$F$$$l$P!"$"$kDxEY$N(B $B%a%C%;!<%8A`:n$,2DG=$G$9!#(B ** "$" $B%^!<%/$NIU$$$?%a%C%;!<%8$O!"%a%C%;!<%8$NC$($?>l9g$K$O%5%^%j$+$i(B $B$b>C$($k$h$&$K$J$j$^$7$?!#(B "$" $B%^!<%/$NIU$$$?%a%C%;!<%8$r8+D>$7$?$$>l9g$O(B 'mark $B%U%)%k%@$r;2>H$7$F(B $B$/$@$5$$!#(B * 2.6.0 $B$+$i(B 2.6.1 $B$X$NJQ99E@(B 2.6.1 $B$O(B 2.6.0 $B$N=$@5HG$G$9!#(B ** Emacs 21 $B$G(B Recursive load... $B$H=P$kIT6q9g$,=$@5$5$l$^$7$?!#(B ** XEmacs 21.1 $B$GJ8;z2=$1$9$kLdBj$,=$@5$5$l$^$7$?!#(B ** XEmacs $B$G(B IMAP4 $B$rMQ$$$k$H%W%m%0%l%9%P!<$,=P$C$Q$J$7$K$J$kLdBj$,(B $B=$@5$5$l$^$7$?!#(B ** X- $B$G;O$^$k%U%#!<%k%I$N8!:w$,$G$-$J$$LdBj$,=$@5$5$l$^$7$?!#(B ** $B$=$NB>$$$/$D$+$N=$@5!#(B * 2.4.1 $B$+$i(B 2.6.0 $B$X$NJQ99E@(B ** FLIM 1.13.x $B$O%5%]!<%H$5$l$J$/$J$j$^$7$?!#(B FLIM 1.14.1 $B0J9_$r%$%s%9%H!<%k$7$F$/$@$5$$!#(B ** $B%U%)%k%@!"%5%^%j$rJL%U%l!<%`$G5/F0$G$-$k$h$&$K$J$j$^$7$?!#(B $B?75,JQ?t(B wl-folder-use-frame$B!"(Bwl-summary-use-frame $B$,(B non-nil $B$J$i(B $B$=$l$>$l%U%)%k%@!"%5%^%j$rJL%U%l!<%`$K3+$-$^$9(B($B%G%U%)%k%H$O(B nil)$B!#(B ** $B%5%^%j$G$N(B 'N' $B$d(B 'P' $B$K$h$k%+!<%=%k0\F0$,9bB.2=$5$l$^$7$?!#(B ** $B%m!<%+%k%U%)%k%@$rBP>]$H$7$?!"(Blast $B$*$h$S(B first $B>r7o$N%U%#%k%?%U%)%k%@(B ($BNc$($P!"(B/last:100/+inbox $B$N$h$&$J%U%)%k%@(B) $B$N%A%'%C%/$,9bB.2=$5$l$^$7$?!#(B ** POP, IMAP $B$GBg$-$J%a%C%;!<%8$re$G$bF0:n$9$k$h$&$K$J$j$^$7$?!#(B ** POP before SMTP $B$G(B POP $B%3%M%/%7%g%s$,@Z$l$J$$IT6q9g$,=$@5$5$l$^$7$?!#(B ** IMAP4 $B$G$N@8%Q%9%o!<%I$K$h$kG'>Z$N;XDjJ}K!$,JQ99$K$J$j$^$7$?!#(B $B$3$l$^$G!"(BIMAP4 $B$G@8%Q%9%o!<%I$NG'>Z(B(LOGIN $B%3%^%s%I$K$h$k%m%0%$%s(B)$B$r$9$k$K$O!"(B $BJQ?t(B elmo-default-imap4-authenticate-type $B$K(B 'plain ($B$^$?$O(B nil) $B$r@_Dj$9$k$3$H$K$J$C$F$$$^$7$?$,!"(B'clear ($B$^$?$O(B nil)$B$KJQ99$5$l$^$7$?!#(B $BNc$($P!"(B (setq elmo-default-imap4-authenticate-type 'plain) $B$H$$$&@_Dj$O(B (setq elmo-default-imap4-authenticate-type 'clear) $B$KJQ99$9$kI,MW$,$"$j$^$9!#(B * 1.1.1 $B$+$i(B 2.4.0 $B$X$NJQ99E@(B ** $B%P!<%8%g%sHV9f(B $B%P!<%8%g%sHV9f$NIU$1J}$,JQ$o$j$^$7$?!#(B $B$3$l$^$G!"(B1.x $B$,0BDjHG!"(B2.0.x$B!A(B2.2.x $B$,3+H/HG$H$J$C$F$$$^$7$?$,!"(B2.3.0 $B0J9_$O!"BhFsHV9f$,6v?t$J$i0BDjHG!"4q?t$J$i3+H/HG$H$J$j$^$7$?!#$3$N%P!<(B $B%8%g%sHV9f$NIU$1J}$O0lHLE*$J%*!<%W%s%=!<%93+H/$N47=,$K4p$E$/$b$N$G$9!#(B $B8x3+(B CVS $B%5!<%P(B cvs.m17n.org $B>e(B $B$G$O!"44$,(B beta ($B3+H/(B)$BHG!"(B $B;^$,(B stable ($B0BDj(B)$BHG(B ($B;^L>$O!"(B2.4.x $B$J$i(B wl-2_4) $B$H$J$j$^$9!#(B ** $B%$%s%9%H!<%k(B *** FLIM 1.12 $B$O%5%]!<%H$5$l$J$/$J$j$^$7$?!#(B $B$/$o$7$/$O(B INSTALL.ja $B$r8fMw2<$5$$!#(B *** APEL 10.2 $B0J9_$,I,MW$K$J$j$^$7$?!#(B tm-8 $B$r;HMQ$9$kJ}$OFC$K$4Cm0U$/$@$5$$!#(B ** $B?75!G=(B *** LDAP $B%5%]!<%H(B LDAP $B%5!<%P!<$H@\B3$7!"%"%I%l%9$NJd40$r9T$($^$9!#(B $BJQ?t(B wl-use-ldap $B$,(B non-nil $B$K@_Dj$5$l$F$$$k$H(B LDAP $B$rMxMQ$7$^$9(B ($B=i4|@_Dj$O(B nil)$B!#(B *** POP3 $B%U%)%k%@$G(B UIDL $B%5%]!<%H(B POP3 $B%U%)%k%@$G%5%^%j$N>uBV$rJ]B8$G$-$k$h$&$K$J$j!"%"%/%;%9$,9bB.2=$5$l$^$7$?!#(B $BJQ?t(B elmo-pop3-use-uidl $B$,(B non-nil $B$K@_Dj$5$l$F$$$k$H(B UIDL $B$r;HMQ$7$^$9(B ($B=i4|@_Dj$O(B t)$B!#(B *** Emacs 21 $B%5%]!<%H(B Standard Emacs 21 $B$N%5%]!<%H$r3+;O$7$^$7$?!#(BWanderlust $B$N$[$H$s(B $B$I$N%U%l!<%`$K!"(BXEmacs $B$HF1$8$h$&$K%D!<%k%P!<$d%"%$%3%s2hA|$rI=(B $B<($7$^$9!#(B *** biff $B5!G=(B $B0lDj;~4V$*$-$K%5!<%P$K%a!<%k$,FO$$$F$$$k$+3NG'$7$^$9!#(B $BFO$$$F$$$l$P%b!<%I%i%$%s$KI=<($7!"%U%)%k%@0lMw%b!<%I$r99?7$7$^$9!#(B *** expire-hide $B5-;v<+BN$O>C$9$3$H$J$/!"%5%^%j$K8+$($k5-;v?t$r0lDj$KJ]$D$3$H$,$G(B $B$-$k$h$&$K$J$j$^$7$?!#$R$H$D$N%U%)%k%@$KBgNL$K5-;v$rN/$a$F$$$k>l(B $B9g$G$b!"B.EYDc2<$rM^$($k$3$H$G$-$^$9!#(B *** $B%9%l%C%I=$I|5!G=(B $B%5%V%8%'%/%H$+$i?dB,$7$?%9%l%C%I$N<+F0$N$D$J$.D>$7!"5Z$S(B $B$7(B($B%5%^%j$G(B M-w ($B%3%T!<(B)$B$H(B C-y ($B%Z!<%9%H(B)) $B$,2DG=$K$J$j$^$7$?!#(B *** $B%Q%9%o!<%I$N%?%$%^@_Dj(B $BJQ?t(B elmo-passwd-life-time $B$G@_Dj$G$-$^$9!#(B (nil $B$J$i%?%$%^$J$7!#=i4|@_Dj$O(B nil)$B!#(B *** killed-list NNTP $B%U%)%k%@$G:o=|$7$?%a%C%;!<%8$O(B killed-list $B$KJ]B8$7$^$9!#(B killed-list $B$K$"$k%a%C%;!<%8$O%5!<%P>e$K$bB8:_$7$J$$$+$N$h$&$K07(B $B$$$^$9!#JQ?t(B elmo-use-killed-list $B$,(B non-nil $B$J$i(B killed-list $B$r(B $B;HMQ$7$^$9(B($B%G%U%)%k%H$O(B t)$B!#(B $B$3$l$K$h$C$F(B NNTP $B$rMxMQ$7$?%Q%$%W%U%)%k%@$b$7$^$9!#(B ** $B8!:w(B *** $B%U%#%k%?%U%)%k%@$KJ#;($J>r7o;XDj$r;XDj$G$-$k$h$&$K$J$j$^$7$?!#(B AND $B>r7o!"(BOR $B>r7o!"H]Dj>r7o!"$*$h$S$=$l$i$NAH9g$;$r;XDj$G$-$^$9!#(B $B$3$l$K$H$b$J$$!">r7o;XDjItJ,$N%7%s%?%C%/%9$,JQ99$5$l$^$7$?!#(B $B$/$o$7$/$O(B Info $B$r8fMw2<$5$$!#(B $BCm0U!'(B1.1.1 $B$+$i0\9T$5$l$kJ}$X(B $B>e5-JQ99$KH<$$!"%U%#%k%?%U%)%k%@$N(B msgdb $B$NCV$->l=j$,JQ$o$j$^$7$?!#(B $B$3$N$?$a!"=>Mh$N(B msgdb $B$OITMW$H$J$j$^$9!#$=$N$^$^$G$bLdBj$"$j$^$;$s$,!"(B $B%G%#%9%/$KL5BL$J%G!<%?$r;D$7$?$/$J$$J}$O(B .elmo/filter/ $B0J2<$r(B $B$"$i$+$8$a:o=|$7$F$*$$$F$/$@$5$$!#(B *** NNTP $B$G$N8!:w5!G=$,6/2=$5$l$^$7$?!#(B NNTP $B$KBP$9$k%U%#%k%?%U%)%k%@$r:n$l$k$h$&$K$J$j$^$7$?!#(B (NNTP $B%5!<%P$,(B XHDR $B%3%^%s%I$KBP1~$7$F$$$k>l9g$N$_(B) *** $B%5%^%j$G$N(B Pick$B!"(BVirtual $B$GJ#9g>r7o$rF~NO$G$-$k$h$&$K$J$j$^$7$?!#(B AND $B>r7o$d(B OR $B>r7o$bF~NO$G$-$^$9!#(B $BF~NOJ}K!$O!"%U%#!<%k%IL>$N$+$o$j$K(B 'AND' $B$d(B 'OR' $B$rF~NO$9$k$@$1$G$9!#(B ** $B@\B3!&G'>Z(B *** elmo-default-*-authenticate-type $B$O%7%s%\%k$G@_Dj$9$k$h$&$K$J$j$^$7$?!#(B $BNc$($P!"(B (setq elmo-default-imap4-authenticate-type "cram-md5") $B$H$$$&@_Dj$O!"(B (setq elmo-default-imap4-authenticate-type 'cram-md5) $B$KJQ99$9$kI,MW$,$"$j$^$9!#(B *** stream-type $B$NDj5AJ}K!$rJQ99$7$^$7$?!#(B $BJQ?t(B elmo-network-{imap4-,pop3-,nntp-,}stream-type-alist $B$G@_Dj2DG=$G$9!#(B SSL $B4XO"$N$$$/$D$+$NJQ?t$,GQ;_$5$l$^$7$?(B($B2~L>(B)$B!#(B $B$^$?!"?7$?$K(B "!socks" $B$G=*$o$k%M%C%H%o!<%/7O%U%)%k%@(B(IMAP4, NNTP, POP3)$B$O(B SOCKS $B7PM3$G%"%/%;%9$5$l$k$h$&$K$J$j$^$7$?!#(B ** $B%I%i%U%H(B *** group-list $B$KBP1~$7$^$7$?!#(B $B08@h$K(B Group: foo@gohome.org, bar@gohome.org; $B$N$h$&$K=q$1$k$h$&$K(B $B$J$j$^$7$?!#JQ?t(B wl-draft-remove-group-list-contents $B$,(B t $B$J$i(B group-list $B$NFbMF$r:o=|$7$FAw?.$7$^$9!#(B *** $B%I%i%U%H$N%W%l%S%e!<$G$&$h$&$K$J$j$^$7$?!#(B ** $B$=$NB>$NJQ99E@(B *** $B%9%l%C%I$N9bB.2=$HB?$/$N%P%0%U%#%C%/%9!#(B *** $BJQ?tL>$NJQ99!#(B wl-refile-guess-func-list => wl-refile-guess-functions wl-summary-temp-above => wl-summary-target-above *** wl-fcc $B$K4X?t$r@_Dj$G$-$^$9!#(B $B7nKh$K%U%)%k%@$rJQ$($?$$>l9g$J$I$K;HMQ$G$-$^$9!#(B *** elmo-search-mime-charset $B$OGQ;_$5$l$^$7$?!#(B charset $B$OF~NOJ8;zNs$+$iH=Dj$5$l$^$9!#(B *** $BE>Aw;~$KM>7W$J%X%C%@$r:o=|$7$^$9!#(B $BJQ?t(B wl-ignored-forwarded-headers $B$G!"E>Aw;~$K:o=|$9$k%X%C%@$r@_(B $BDj$G$-$^$9!#(B *** wl-highlight-group-folder-by-numbers $B$OGQ;_$5$l$^$7$?!#(B wl-highlight-folder-by-numbers $B$K2~L>$5$l!"CM$K1~$8$F0J2<$N0UL#$r;}$D$h$&$K(B $B$J$j$^$7$?!#(B `t' $B!'9TA4BN$K%a%C%;!<%8?t$K1~$8$??'$rIU$1$^$9!#(B `nil' $B!'%U%)%k%@$N>uBV$K1~$8$??'$rIU$1$^$9!#(B $B?t;z(B ($BNc$($P(B `1') $B!'%a%C%;!<%8?t$H%U%)%k%@$N>uBV$NN>J}$K1~$8$??'$rIU$1$^$9!#(B *** $B%a%C%;!<%8%P%C%U%!$G$N%X%C%@I=<($r@)8f$G$-$^$9!#(B $BJQ?t(B wl-message-ignored-field-list, wl-message-visible-field-list $B$G!"(BWanderlust $B%l%Y%k$G@_Dj$,2DG=(B $B$K$J$j$^$7$?!#(B($B:#$^$G$O(B SEMI $B$G@_Dj$9$kI,MW$,$"$j$^$7$?(B) *** DEMO $B$NI=<(J}K!$,JQ$o$j$^$7$?!#(B $B%+%i!<$N%T%C%/%9%^%C%W$GMxMQ$9$k?'?t$,:o8:$5$l$^$7$?!#(B $B$^$?!"J8;z$N$_$7$+I=<($G$-$J$$4D6-$G$b$=$l$J$j$N%G%b$,I=<($5$l$k$h$&$K(B $B$J$j$^$7$?!#(B * 1.1.0 $B$+$i(B 1.1.1 $B$X$NJQ99E@(B 1.1.1 $B$O(B 1.1.0 $B$N%P%0=$@5HG$G$9!#$$$/$D$+$N:Y$+$$=$@5$,2C$o$C$F$$$^$9!#(B ** CVS $B%5!<%P>e$G$N3+H/$,;O$a$i$l$^$7$?!#(B ** $B%G%#%l%/%H%j9=@.$,$+$o$j$^$7$?!#(B *** 00README, 00README.ja $B$O(B README, README.ja $B$KJQ99$5$l$^$7$?!#(B *** wl-* $B$N%U%!%$%k$O(B 'wl' $B%G%#%l%/%H%j$K0\F0$7$^$7$?!#(B ** wl-refile-rule-alist $B$N5-=RJ}K!$,3HD%$5$l$^$7$?(B($B0JA0$H8_49@-$,$"$j$^$9(B)$B!#(B ** progress gauge $BI=<(5!G=$rMxMQ$9$k$h$&$K$J$j$^$7$?!#(B progress gauge $B$NI=<(5!G=$r$b$D(B Emacs $B$G$O!"=hM}$N?JD=$,(B progress gauge $B$K(B $BI=<($5$l$k$h$&$K$J$j$^$7$?!#(B * 1.0.3 $B$+$i(B 1.1.0 $B$X$NJQ99E@(B ** $B%$%s%9%H!<%k(B *** tm7 $B$O%5%]!<%H$5$l$J$/$J$j$^$7$?!#(B $B$/$o$7$/$O(B INSTALL.ja $B$r8fMw2<$5$$!#(B *** WL_PREFIX $B$H(B ELMO_PREFIX $B$N=i4|@_Dj$,(B "wl" $B$K$J$j$^$7$?!#(B (defvar WL_PREFIX "wl") (defvar ELMO_PREFIX "wl") $BNc$($P!"%$%s%9%H!<%k%G%#%l%/%H%j$O!"(B 1.0.3 /usr/local/share/emacs/site-lisp/ 1.1.0 /usr/local/share/emacs/site-lisp/wl/ $B$H$J$j$^$9!#(B *** Makefile $B$NJQ?t$N%G%U%)%k%HCM$,JQ$o$j$^$7$?!#(B EMACS = emacs XEMACS = xemacs $(XEMACS) $B$O!"(B`package' $B$d(B `install-package' $B$N(B target $B$G;2>H$5$l$^$9!#(B *** *.el $B%U%!%$%k$b%$%s%9%H!<%k$5$l$k$h$&$K$J$j$^$7$?!#(B *** $B1Q8lHG%I%-%e%a%s%H(B (wl.texi) $B$,IU$-$^$7$?!#(B ** $B?75!G=(B *** Modified UTF7 $B$,%5%]!<%H$5$l$^$7$?!#(B $B%f%K%3!<%I$,07$($k(B Emacs $B$G$O!"(BIMAP4 $B$GF|K\8l%a!<%k%\%C%/%9L>$r;XDj$G$-$^$9!#(B *** $B%9%3%"5!G=$,IU$-$^$7$?!#(B *** $B%W%i%04IM}5!G=$,IU$-$^$7$?!#(B *** IMAP4 $B$,$h$jHFMQE*$K$J$j$^$7$?!#(B $BB?$/$N(B IMAP4 $B%5!<%P$GF0$/$h$&$K$J$j$^$7$?!#(B *** $B$$$/$D$+$NG'>ZJ}<0$,%5%]!<%H$5$l$^$7$?!#(B IMAP4: CRAM-MD5, DIGEST-MD5, STARTTLS POP3: CRAM-MD5, DIGEST-MD5, SCRAM-MD5, STARTTLS NNTP: STARTTLS SMTP: STARTTLS *** $B?7$7$$%U%)%k%@7?$,2C$o$j$^$7$?!#(B | $B%Q%$%W%U%)%k%@(B $B%a%C%;!<%8$rC$($J$$%5%^%j(B)$B$,3HD%$5$l$^$7$?!#(B $B%a%C%;!<%8%P%C%U%!$b%5%^%j$KBP1~$7$FMQ0U$5$l$k$h$&$K$J$j$^$7$?!#(B $B>o$K%9%F%#%C%-!<$K$J$k%U%)%k%@$r@_Dj$G$-$k$h$&$K$J$j$^$7$?!#(B ** $B$=$NB>(B *** $BJQ?t(B wl-draft-prepared-config-alist $B$OGQ;_$5$l$^$7$?!#(B wl-draft-config-alist $B$KE}9g$5$l$^$7$?!#(B *** POP-before-SMTP $B4XO"$NJQ?t$,@0M}$5$l$^$7$?!#(B *** $BB8:_$7$J$$%U%)%k%@$r:n$k$+$I$&$+3NG'$9$k$h$&$K$J$j$^$7$?!#(B FCC: $B$K?7$7$$%U%)%k%@L>$r;XDj$7$?$H$-$d!"(Bauto-refile $B$G(B $B?7$7$$%U%)%k%@L>$r;XDj$7$?$H$-$K%U%)%k%@$r:n$k$+$I$&$+3NG'$7$^$9!#(B *** $B%W%j%U%'%C%A$N3NG'$K4X$9$k@_Dj$NJQ?t$,2C$o$j$^$7$?!#(B wl-prefetch-confirm-threshold, wl-cache-fetch-threshold. *** $B%U%)%k%@L>$N$"$@L>$r%U%)%k%@L>F~NO$GJd40$G$-$k$h$&$K$J$j$^$7$?!#(B *** Message-ID $B$N@8@.J}K!$,JQ$o$j$^$7$?!#(B *** Mule $B$G$O%S%C%H%^%C%W$N%*!<%W%K%s%0%G%b2hLL$,=P$k$h$&$K$J$j$^$7$?!#(B *** `smtp-server' $B$K4X?t$r;XDj$G$-$^$9!#(B *** $BAw?.%m%0$,J]B8$5$l$k$h$&$K$J$j$^$7$?!#(B `wl-draft-sendlog' $B$,(B non-nil $B$N>l9g!"(B'sendlog' $B%U%!%$%k$KJ]B8$5$l$^$9!#(B *** $B%*%U%i%$%s=hM}$G%W%j%U%'%C%A$rM=Ls$G$-$k$h$&$K$J$j$^$7$?!#(B *** `wl-summary-incorporate-marks' *** `wl-draft-use-frame' $B$,(B non-nil $B$J$i%U%l!<%`$r@8@.$7$^$9!#(B *** $B?75,JQ?t(B `wl-user-mail-address-list'$B!#(B *** $B?75,JQ?t(B `wl-local-domain'$B!#(B *** IMAP4 $B$G%5!<%PB&$NL$FI>uBV$r;2>H$9$k$h$&$K$J$j$^$7$?!#(B *** $B=i4|@_Dj$,JQ99$5$l$?JQ?t(B wl-mime-charset iso-2022-jp => x-ctext wl-summary-move-order 'new => 'unread wl-tmp-dir TMPDIR => ~/tmp/ *** $B?75,(B 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 *** $B?75,%3%^%s%I(B 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 * $BJQ99E@$N>\:Y$O(B ChangeLog $B$r8fMw2<$5$$!#(B Local variables: mode: outline paragraph-separate: "[ ]*$" end: wanderlust-wanderlust-912c443/README.ja000066400000000000000000000071741262320455600176320ustar00rootroot00000000000000 Wanderlust -- Yet Another Message Interface on Emacsen by Yuuichi Teranishi Wanderlust $B$O(B Emacs $B>e$GF0$/(B IMAP4rev1 $BBP1~$N%a!<%k(B/$B%K%e!<%94IM}%7%9%F%`$G$9!#(B Features: * elisp $B$N$_$K$h$kA[%U%)%k%@!#(B * $BB?$$F|$b0B?4$N!"%^%k%A%"!<%+%$%PBP1~05=L%U%)%k%@!#(B * $B%U%)%k%@Cf$N8E$$5-;v$r<+F0E*$K%"!<%+%$%V(B/$B:o=|$7$F@0M}$9$k(B expire $B5!G=!#(B * $B<+F0%j%U%!%$%k!#(B * $BDj7?%a%C%;!<%8$NAw?.$KJXMx$J%F%s%W%l!<%H5!G=!#(B System Requirements: INSTALL.ja $B$r8fMw$/$@$5$$!#(B Install: $B%$%s%9%H!<%k$NJ}K!$K$D$$$F$O!"(BINSTALL.ja $B$r8fMw$/$@$5$$!#(B Web Page: Wanderlust $B8x<0(B Web $B%Z!<%8$N(B URL $B$O0J2<$NDL$j$G$9!#(B http://www.gohome.org/wl/ $B$3$3$+$i%Q%C%1!<%8$N%@%&%s%m!<%I$b2DG=$G$9!#(B $B%a!<%j%s%0%j%9%H(B: Wanderlust $B$K4X$9$k5DO@$O%a%$%j%s%0%j%9%H$G9T$o$l$F$$$^$9!#(B $B:G?7%P!<%8%g%s$N%"%J%&%s%9$b$3$A$i$KN.$l$^$9!#(B Wanderlust Mailing List $B$^$?!"1Q8l@lMQ$N%j%9%H$H$7$F(B Wanderlust List in English $B$b$"$j$^$9(B($B$3$A$i$KEj9F$5$l$?%a%C%;!<%8$OA0l9g$O!"0J2<$NMM$K$7$F$/$@$5$$!#(B % cvs -d :pserver:anonymous@cvs.m17n.org:/cvs/root checkout -r wl-2_14 wanderlust CVS repository $B$O0J2<$+$i$b;2>H$G$-$^$9!#(B http://cvs.m17n.org/viewcvs/root/wanderlust/ CVS $B$N(B commit log $B$r%a!<%k$G$C$F2<$5$$!#(B http://cvs.m17n.org/ Development: CVS $B$K4p$E$$$?3+H/$K;22C$7$?$$J}$O!"(B cvs@cvs.m17n.org $B$K%"%+%&%s%HL>$H!"(Bssh $B$N8x3+80$rAw$C$F$/$@$5$$!#(Bssh $B7PM3$G$O!"(B cvsroot $B$O(B :ext:cvs@cvs.m17n.org:/cvs/root $B$H$J$j$^$9!#(B $B3+$+$l$?3+H/$K;22C$7$F$/$@$5$k$3$H$r4|BT$7$^$9!#(B References: [1] M. Crispin, "INTERNET MESSAGE ACCESS PROTOCOL - VERSION 4rev1", RFC 2060, 1996. [2] B. Kantor and P. Lapsley, "Network News Transfer Protocol: A Proposed Standard for the Stream-Based Transmission of News", RFC 977, 1986. [3] J. Myers, M. Rose, "Post Office Protocol - Version 3", RFC 1929, 1996. [4] "Mew -- Messaging in the Emacs World", (Copyright (C) 1994, 1995, 1996, 1997, 1998 Mew developing team.) Available from http://www.mew.org/. [5] "tm -- MIME package for GNU Emacs", (Copyright (C) 1994, 1995, 1996 MORIOKA Tomohiko) wanderlust-wanderlust-912c443/README.md000066400000000000000000000056461262320455600176420ustar00rootroot00000000000000Wanderlust - 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: [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 (XEmacs and Emacs 21). * 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] ([archives][10]) * Japanese: [wl@ml.gentei.org][11] ([archives][12]) 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 (C) 1994, 1995, 1996, 1997, 1998 Mew developing team)" [9]: mailto:wl-en@ml.gentei.org [10]: http://news.gmane.org/gmane.mail.wanderlust.general [11]: wl@ml.gentei.org [12]: http://news.gmane.org/gmane.mail.wanderlust.general.japanese [13]: mailto:wl-ctl@ml.gentei.org [14]: mailto:wl-en-ctl@ml.gentei.org [15]: https://github.com/wanderlust/wanderlust wanderlust-wanderlust-912c443/WL-CFG000066400000000000000000000015671262320455600172230ustar00rootroot00000000000000;;; -*- 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-912c443/WL-ELS000066400000000000000000000054761262320455600172520ustar00rootroot00000000000000;;; 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-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) (unless (coding-system-p 'utf-7-imap) (add-to-list 'ELMO-MODULES 'utf7)) (cond ((featurep 'xemacs) (setq WL-MODULES (append WL-MODULES (list 'wl-dnd 'wl-xmas))) (setq ELMO-MODULES (append (list 'elmo-database) ELMO-MODULES))) ((and (boundp 'emacs-major-version) (>= emacs-major-version 21)) (setq WL-MODULES (append WL-MODULES (list 'wl-e21)))) ((featurep 'mule) (setq WL-MODULES (append WL-MODULES (list 'wl-mule))))) (defconst WL-AUTOLOAD-MODULES '( auto-autoloads custom-load )) (if (or (fboundp 'dynamic-link) ;; static (fboundp 'open-database)) (add-to-list 'ELMO-MODULES 'elmo-database)) (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 (module-installed-p 'bbdb) (cons UTILSDIR (list 'bbdb-wl))) (if wl-install-utils (cons UTILSDIR UTILS-MODULES)))) wanderlust-wanderlust-912c443/WL-MK000066400000000000000000000410751262320455600171310ustar00rootroot00000000000000;;; -*- 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? $B$+$i(B \\([0-9.]*\\) $B$X$NJQ99E@(B"))) (defconst wl-news-filename "wl-news.el") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (require 'cl) (defvar INFODIR nil) (condition-case () (require 'custom) (error nil)) ;; for wl-vars.el (unless (and (fboundp 'defgroup) (fboundp 'defcustom) ;; ignore broken module (not (featurep 'tinycustom))) (when (and (boundp 'emacs-major-version) (= emacs-major-version 19) (>= emacs-minor-version 29)) (message "%s" " Warning: You don't seem to have \"new custom\" package installed. See README file of APEL package for more information. ")) (require 'backquote) (defmacro defgroup (&rest args)) (defmacro defcustom (symbol value &optional doc &rest args) (let ((doc (concat "*" (or doc "")))) `(defvar ,symbol ,value ,doc)))) (load "bytecomp" nil t) (unless (fboundp 'byte-compile-file-form-custom-declare-variable) ;; Bind defcustom'ed variables. (put 'custom-declare-variable 'byte-hunk-handler 'byte-compile-file-form-custom-declare-variable) (defun byte-compile-file-form-custom-declare-variable (form) (if (memq 'free-vars byte-compile-warnings) (setq byte-compile-bound-variables (cons (nth 1 (nth 1 form)) byte-compile-bound-variables))) form)) (condition-case nil (char-after) (wrong-number-of-arguments ;; Optimize byte code for `char-after'. (put 'char-after 'byte-optimizer 'byte-optimize-char-after) (defun byte-optimize-char-after (form) (if (null (cdr form)) '(char-after (point)) form)))) (setq byte-compile-warnings '(free-vars unresolved callargs redefine)) ;; v18, v19 (if (boundp 'MULE) (setq max-lisp-eval-depth 400)) ;; FIXME: it is currently needed to byte-compile with Emacs 21. (setq recursive-load-depth-limit nil) (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 "\\.img$\\|\\.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 (cond ((featurep 'xemacs) "\\.x[bp]m$") ((and (boundp 'emacs-major-version) (>= emacs-major-version 21)) "\\.img$\\|\\.x[bp]m$") ((featurep 'mule) "\\.img$\\|\\.xbm$"))))) (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 () (if (not (featurep 'xemacs)) (error "This directive is only for XEmacs")) (config-wl-package-subr) ;; PACKAGEDIR check. (let (package-dir) (defvar PACKAGEDIR (if (and (setq package-dir (car command-line-args-left)) (not (string= "NONE" package-dir))) package-dir (require 'install) (install-get-default-package-directory))) (princ (format "PACKAGEDIR is %s\n" PACKAGEDIR)) (setq command-line-args-left (cdr command-line-args-left))) ;; PIXMAPDIR check. (config-wl-pixmap-dir PACKAGEDIR) (princ "\n")) ;; 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) (require 'wl-vars) ;; for 'wl-cs-local (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) ;; Emacs20.2's default is 'raw-text-unix. (and (fboundp 'set-buffer-file-coding-system) (set-buffer-file-coding-system wl-cs-local)) (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-912c443/doc/000077500000000000000000000000001262320455600171155ustar00rootroot00000000000000wanderlust-wanderlust-912c443/doc/.cvsignore000066400000000000000000000001411262320455600211110ustar00rootroot00000000000000*.info *.dvi *.aux *.log *.toc *.cp *.fn *.ky *.pg *.tp *.vr *.cps *.fns *.kys *.pgs *.tps *.vrs wanderlust-wanderlust-912c443/doc/TODO000066400000000000000000000013001262320455600175770ustar00rootroot00000000000000** 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-912c443/doc/TODO.ja000066400000000000000000000014241262320455600201770ustar00rootroot00000000000000** $BHsF14|2=(B ** $B%U%)%k%@%b!<%I$N2~A1!&3H=<(B ** $B%U%)%k%@L>$N>JN,I=<((B($B%U%)%k%@?t$,B?$$>l9g$r9MN8(B) ** $B%-%c%C%7%e%^!<%/$NFHN)(B ** History Folder (proposal by Tomotaka SUWA) ** elmo.el $B$G%U%)%k%@$N%"%$%3%s$rDj5A$G$-$k$h$&$K$9$k(B ** $B%5%^%j$N%=!<%H>uBV$rJ];}$7$?$^$^(B Update ** .addresses $B%(%s%H%j$K$D$$$F(B hash table $B$r;H$&(B ** wl-folder-check-entity-async $B$N$"$?$j$G(B NNTP $B$,FCJL07$$$K$J$C$F$$$k$N$r(B $B$I$&$K$+$9$k(B ** wl-summary-other-frame-list $B$N$h$&$JJQ?t$r@_$1!"%^%C%A$7$?%5%^%j$O(B $BJL%U%l!<%`$G3+$/$h$&$K$9$k(B ** $B%Q%$%W%U%)%k%@$K!"?75,%a!<%k%A%'%C%/;~$K%@%&%s%m!<%I$^$G$d$C$F$7$^$&(B $B%*%W%7%g%s$r@_$1$k(B ** rfc2192, rfc2193, rfc2221 (imap referral $B$N=hM}(B) $B$X$NBP1~(B ** $B%3!<%I$N@0M}(B wanderlust-wanderlust-912c443/doc/texinfo.tex000066400000000000000000011072401262320455600213200ustar00rootroot00000000000000% 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{2010-05-22.17} % % Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, % 2007, 2008, 2009, 2010 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 has been our intent since Texinfo was invented.) % % Please try the latest version of texinfo.tex before submitting bug % reports; you can get the latest version from: % http://www.gnu.org/software/texinfo/ (the Texinfo home page), or % ftp://tug.org/tex/texinfo.tex % (and all CTAN mirrors, see http://www.ctan.org). % 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 including 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 http://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} \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\ptexstar=\* \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\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 % Since the category of space is not known, we have to be careful. \chardef\spacecat = 10 \def\spaceisspace{\catcode`\ =\spacecat} % sometimes characters are active, so we need control sequences. \chardef\colonChar = `\: \chardef\commaChar = `\, \chardef\dashChar = `\- \chardef\dotChar = `\. \chardef\exclamChar= `\! \chardef\lquoteChar= `\` \chardef\questChar = `\? \chardef\rquoteChar= `\' \chardef\semiChar = `\; \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 } % Margin to add to right of even pages, to left of odd pages. \newdimen\bindingoffset \newdimen\normaloffset \newdimen\pagewidth \newdimen\pageheight % 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 } % 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\undefined\else % etex gives us more logging \tracingscantokens1 \tracingifs1 \tracinggroups1 \tracingnesting2 \tracingassigns1 \fi \tracingcommands3 % 3 gives us more in etex \errorcontextlines16 }% % 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} % Do @cropmarks to get crop marks. % \newif\ifcropmarks \let\cropmarks = \cropmarkstrue % % Dimensions to add cropmarks at corners. % Added by P. A. MacKay, 12 Nov. 1986 % \newdimen\outerhsize \newdimen\outervsize % set by the paper size routines \newdimen\cornerlong \cornerlong=1pc \newdimen\cornerthick \cornerthick=.3pt \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. The solution is % described on page 260 of The TeXbook. It involves outputting two % marks for the sectioning macros, one before the section break, and % one after. I won't pretend I can describe this better than DEK... \def\domark{% \toks0=\expandafter{\lastchapterdefs}% \toks2=\expandafter{\lastsectiondefs}% \toks4=\expandafter{\prevchapterdefs}% \toks6=\expandafter{\prevsectiondefs}% \toks8=\expandafter{\lastcolordefs}% \mark{% \the\toks0 \the\toks2 \noexpand\or \the\toks4 \the\toks6 \noexpand\else \the\toks8 }% } % \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\topmark\fi \ifx\thischapter\empty \ifcase0\firstmark\fi \fi } \def\getbottomheadingmarks{\ifcase1\botmark\fi} \def\getcolormarks{\ifcase2\topmark\fi} % Avoid "undefined control sequence" errors. \def\lastchapterdefs{} \def\lastsectiondefs{} \def\prevchapterdefs{} \def\prevsectiondefs{} \def\lastcolordefs{} % Main output routine. \chardef\PAGE = 255 \output = {\onepageout{\pagecontents\PAGE}} \newbox\headlinebox \newbox\footlinebox % \onepageout takes a vbox as an argument. Note that \pagecontents % does insertions, but you have to call it yourself. \def\onepageout#1{% \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi % \ifodd\pageno \advance\hoffset by \bindingoffset \else \advance\hoffset by -\bindingoffset\fi % % Do this outside of the \shipout so @code etc. will be expanded in % the headline as they should be, not taken literally (outputting ''code). \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% % {% % 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. % \indexdummies % don't expand commands in the output. \normalturnoffactive % \ in index entries must not stay \, e.g., if % the page break happens to be in the middle of an example. % We don't want .vr (or whatever) entries like this: % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}} % "\acronym" won't work when it's read back in; % it needs to be % {\code {{\tt \backslashcurfont }acronym} \shipout\vbox{% % Do this early so pdf references go to the beginning of the page. \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi % \ifcropmarks \vbox to \outervsize\bgroup \hsize = \outerhsize \vskip-\topandbottommargin \vtop to0pt{% \line{\ewtop\hfil\ewtop}% \nointerlineskip \line{% \vbox{\moveleft\cornerthick\nstop}% \hfill \vbox{\moveright\cornerthick\nstop}% }% \vss}% \vskip\topandbottommargin \line\bgroup \hfil % center the page within the outer (page) hsize. \ifodd\pageno\hskip\bindingoffset\fi \vbox\bgroup \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 % \ifcropmarks \egroup % end of \vbox\bgroup \hfil\egroup % end of (centering) \line\bgroup \vskip\topandbottommargin plus1fill minus1fill \boxmaxdepth = \cornerthick \vbox to0pt{\vss \line{% \vbox{\moveleft\cornerthick\nsbot}% \hfill \vbox{\moveright\cornerthick\nsbot}% }% \nointerlineskip \line{\ewbot\hfil\ewbot}% }% \egroup % \vbox from first cropmarks clause \fi }% end of \shipout\vbox }% end of group with \indexdummies \advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi } \newinsert\margin \dimen\margin=\maxdimen \def\pagebody#1{\vbox to\pageheight{\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} } % Here are the rules for the cropmarks. Note that they are % offset so that the space between them is truly \outerhsize or \outervsize % (P. A. MacKay, 12 November, 1986) % \def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} \def\nstop{\vbox {\hrule height\cornerthick depth\cornerlong width\cornerthick}} \def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} \def\nsbot{\vbox {\hrule height\cornerlong depth\cornerthick width\cornerthick}} % 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. % \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. \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\foo{...} % is roughly equivalent to % \def\foo{\parsearg\Xfoo} % \def\Xfoo#1{...} % % Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my % favourite TeX trick. --kasal, 16nov03 \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 out 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, but... --kasal, 06nov03 \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\*{\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. % \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 = \pageheight \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\pageheight \page \fi \fi \box\groupbox \prevdepth = \dimen1 \checkinserts } % % 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 % Old definition--didn't work. %\parseargdef\need{\par % %% This method tries to make TeX break the page naturally %% if the depth of the box does not fit. %{\baselineskip=0pt% %\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak %\prevdepth=-1000pt %}} \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 } % @| inserts a changebar to the left of the current line. It should % surround any changed text. This approach does *not* work if the % change spans more than two lines of output. To handle that, we would % have adopt a much more difficult approach (putting marks into the main % vertical list for the beginning and end of each change). This command % is not documented, not supported, and doesn't work. % \def\|{% % \vadjust can only be used in horizontal mode. \leavevmode % % Append this vertical mode material after the current line in the output. \vadjust{% % We want to insert a rule with the height and depth of the current % leading; that is exactly what \strutbox is supposed to record. \vskip-\baselineskip % % \vadjust-items are inserted at the left edge of the type. So % the \llap here moves out into the left-hand margin. \llap{% % % For a thicker or thinner bar, change the `1pt'. \vrule height\baselineskip width1pt % % This is the space between the bar and the text. \hskip 12pt }% }% } % @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. \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\next\centerH \else \let\next\centerV \fi \next{\hfil \ignorespaces#1\unskip \hfil}% } \def\centerH#1{% {% \hfil\break \advance\hsize by -\leftskip \advance\hsize by -\rightskip \line{#1}% \break }% } \def\centerV#1{\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\comment{\begingroup \catcode`\^^M=\other% \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% \commentxxx} {\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} \let\c=\comment % @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 % 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 (before @setfilename). % \newif\iflinks \linkstrue % by default we want the aux files. \let\novalidate = \linksfalse % @setfilename is done at the beginning of every texinfo file. % So open here the files we need to have open while reading the input. % This makes it possible to make a .fmt file for texinfo. \def\setfilename{% \fixbackslash % Turn off hack to swallow `\input texinfo'. \iflinks \tryauxfile % Open the new aux file. TeX will close it automatically at exit. \immediate\openout\auxfile=\jobname.aux \fi % \openindices needs to do some work in any case. \openindices \let\setfilename=\comment % Ignore extra @setfilename cmds. % % If texinfo.cnf is present on the system, read it. % Useful for site-wide @afourpaper, etc. \openin 1 texinfo.cnf \ifeof 1 \else \input texinfo.cnf \fi \closein 1 % \comment % Ignore the actual filename. } % Called from \setfilename. % \def\openindices{% \newindex{cp}% \newcodeindex{fn}% \newcodeindex{vr}% \newcodeindex{tp}% \newcodeindex{ky}% \newcodeindex{pg}% } % @bye. \outer\def\bye{\pagealignmacro\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 \newcount\countA \newif\ifpdf \newif\ifpdfmakepagedest % 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 \undefined, % borrowed from ifpdf.sty. \ifx\pdfoutput\undefined \else \ifx\pdfoutput\relax \else \ifcase\pdfoutput \else \pdftrue \fi \fi \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. % 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). % double active backslashes. % {\catcode`\@=0 \catcode`\\=\active @gdef@activebackslashdouble{% @catcode`@\=@active @let\=@doublebackslash} } % To handle parens, we must adopt a different approach, since parens are % not active characters. hyperref.dtx (which has the same problem as % us) handles it with this amazing macro to replace tokens, with minor % changes for Texinfo. It is included here under the GPL by permission % from the author, Heiko Oberdiek. % % #1 is the tokens to replace. % #2 is the replacement. % #3 is the control sequence with the string. % \def\HyPsdSubst#1#2#3{% \def\HyPsdReplace##1#1##2\END{% ##1% \ifx\\##2\\% \else #2% \HyReturnAfterFi{% \HyPsdReplace##2\END }% \fi }% \xdef#3{\expandafter\HyPsdReplace#3#1\END}% } \long\def\HyReturnAfterFi#1\fi{\fi#1} % #1 is a control sequence in which to do the replacements. \def\backslashparens#1{% \xdef#1{#1}% redefine it as its expansion; the definition is simply % \lastnode when called from \setref -> \pdfmkdest. \HyPsdSubst{(}{\realbackslash(}{#1}% \HyPsdSubst{)}{\realbackslash)}{#1}% } \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 based on 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. \def\rgbDarkRed{0.50 0.09 0.12} \def\rgbBlack{0 0 0} % % k sets the color for filling (usual text, etc.); % K 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\lastcolordefs{\gdef\noexpand\thiscolor{#1}}% \domark \pdfsetcolor{#1}% } % \def\maincolor{\rgbBlack} \pdfsetcolor{\maincolor} \edef\thiscolor{\maincolor} \def\lastcolordefs{} % \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\imagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% \def\imageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% % % pdftex (and the PDF format) support .png, .jpg, .pdf (among % others). Let's try in that order. \let\pdfimgext=\empty \begingroup \openin 1 #1.png \ifeof 1 \openin 1 #1.jpg \ifeof 1 \openin 1 #1.jpeg \ifeof 1 \openin 1 #1.JPG \ifeof 1 \openin 1 #1.pdf \ifeof 1 \openin 1 #1.PDF \ifeof 1 \errhelp = \nopdfimagehelp \errmessage{Could not find image file #1 for pdf}% \else \gdef\pdfimgext{PDF}% \fi \else \gdef\pdfimgext{pdf}% \fi \else \gdef\pdfimgext{JPG}% \fi \else \gdef\pdfimgext{jpeg}% \fi \else \gdef\pdfimgext{jpg}% \fi \else \gdef\pdfimgext{png}% \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 \imagewidth \fi \ifdim \wd2 >0pt height \imageheight \fi \ifnum\pdftexversion<13 #1.\pdfimgext \else {#1.\pdfimgext}% \fi \ifnum\pdftexversion < 14 \else \pdfrefximage \pdflastximage \fi} % \def\pdfmkdest#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 \turnoffactive \activebackslashdouble \makevalueexpandable \def\pdfdestname{#1}% \backslashparens\pdfdestname \safewhatsit{\pdfdest name{\pdfdestname} xyz}% }} % % used to mark target names; must be expandable. \def\pdfmkpgn#1{#1} % % by default, use a color that is dark enough to print on paper as % nearly black, but still distinguishable for online viewing. \def\urlcolor{\rgbDarkRed} \def\linkcolor{\rgbDarkRed} \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. \def\pdfoutlinedest{#3}% \ifx\pdfoutlinedest\empty \def\pdfoutlinedest{#4}% \else % Doubled backslashes in the name. {\activebackslashdouble \xdef\pdfoutlinedest{#3}% \backslashparens\pdfoutlinedest}% \fi % % Also double the backslashes in the display string. {\activebackslashdouble \xdef\pdfoutlinetext{#1}% \backslashparens\pdfoutlinetext}% % \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}% } % \def\pdfmakeoutlines{% \begingroup % Thanh's hack / proper braces in bookmarks \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace % % 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. \def\numchapentry##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. % % xx to do this right, we have to translate 8-bit characters to % their "best" equivalent, based on the @documentencoding. Right % now, I guess we'll just let the pdf reader have its way. \indexnofonts \setupdatafile \catcode`\\=\active \otherbackslash \input \tocreadfilename \endgroup } % \def\skipspaces#1{\def\PP{#1}\def\D{|}% \ifx\PP\D\let\nextsp\relax \else\let\nextsp\skipspaces \ifx\p\space\else\addtokens{\filename}{\PP}% \advance\filenamelength by 1 \fi \fi \nextsp} \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\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} \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 \message{fonts,} % 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 ten#1\endcsname % change the current font } % Select #1 fonts with the current style. % \def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname} \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}} % Unfortunately, we have to override this for titles and the like, since % in those cases "rm" is bold. Sigh. \def\rmisbold{\rm\def\curfontstyle{bf}} % 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}} \let\li = \sf % Sometimes we call it \li, not \sf. % We don't need math for this font style. \def\ttsl{\setfontstyle{ttsl}} % Default leading. \newdimen\textleading \textleading = 13.2pt % 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} % \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\undefined \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 #2, adding on the % specified font prefix (normally `cm'). % #3 is the font's design size, #4 is a scale factor, #5 is the CMap % encoding (currently only OT1, OT1IT and OT1TT are allowed, pass % empty to omit). \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 % emacs-page 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\undefined \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. This is 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\defttsl\ttslshape{10}{\magstep1}{OT1TT} \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\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 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\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 @acro 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 % 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\defttsl\ttslshape{10}{\magstephalf}{OT1TT} \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\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 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 @acro 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 % We provide the user-level command % @fonttextsize 10 % (or 11) to redefine the text font size. pt is assumed. % \def\xword{10} \def\xiword{11} % \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 } % In order for the font changes to affect most math symbols and letters, % we have to define the \textfont of the standard families. Since % texinfo doesn't allow for producing subscripts and superscripts except % in the main text, we don't bother to reset \scriptfont and % \scriptscriptfont (which would also require loading a lot more fonts). % \def\resetmathfonts{% \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf \textfont\ttfam=\tentt \textfont\sffam=\tensf } % The font-changing commands redefine the meanings of \tenSTYLE, 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 % \tenSTYLE to set the current font. % % Each font-changing command also sets the names \lsize (one size lower) % and \lllsize (three sizes lower). These relative commands are used in % the LaTeX logo and acronyms. % % This all needs generalizing, badly. % \def\textfonts{% \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl \def\curfontsize{text}% \def\lsize{reduced}\def\lllsize{smaller}% \resetmathfonts \setleading{\textleading}} \def\titlefonts{% \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy \let\tenttsl=\titlettsl \def\curfontsize{title}% \def\lsize{chap}\def\lllsize{subsec}% \resetmathfonts \setleading{27pt}} \def\titlefont#1{{\titlefonts\rmisbold #1}} \def\chapfonts{% \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl \def\curfontsize{chap}% \def\lsize{sec}\def\lllsize{text}% \resetmathfonts \setleading{19pt}} \def\secfonts{% \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl \def\curfontsize{sec}% \def\lsize{subsec}\def\lllsize{reduced}% \resetmathfonts \setleading{16pt}} \def\subsecfonts{% \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl \def\curfontsize{ssec}% \def\lsize{text}\def\lllsize{small}% \resetmathfonts \setleading{15pt}} \let\subsubsecfonts = \subsecfonts \def\reducedfonts{% \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy \let\tenttsl=\reducedttsl \def\curfontsize{reduced}% \def\lsize{small}\def\lllsize{smaller}% \resetmathfonts \setleading{10.5pt}} \def\smallfonts{% \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy \let\tenttsl=\smallttsl \def\curfontsize{small}% \def\lsize{smaller}\def\lllsize{smaller}% \resetmathfonts \setleading{10.5pt}} \def\smallerfonts{% \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy \let\tenttsl=\smallerttsl \def\curfontsize{smaller}% \def\lsize{smaller}\def\lllsize{smaller}% \resetmathfonts \setleading{9.5pt}} % 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} % 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 and the set of \ifmarkupSTYLE switches for all styles % currently in effect. \newif\ifmarkupvar \newif\ifmarkupsamp \newif\ifmarkupkey %\newif\ifmarkupfile % @file == @samp. %\newif\ifmarkupoption % @option == @samp. \newif\ifmarkupcode \newif\ifmarkupkbd %\newif\ifmarkupenv % @env == @code. %\newif\ifmarkupcommand % @command == @code. \newif\ifmarkuptex % @tex (and part of @math, for now). \newif\ifmarkupexample \newif\ifmarkupverb \newif\ifmarkupverbatim \let\currentmarkupstyle\empty \def\setupmarkupstyle#1{% \csname markup#1true\endcsname \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} \gdef\markupsetnoligaturesquoteleft{\let`\noligaturesquoteleft} } \let\markupsetuplqcode \markupsetcodequoteleft \let\markupsetuprqcode \markupsetcodequoteright % \let\markupsetuplqexample \markupsetcodequoteleft \let\markupsetuprqexample \markupsetcodequoteright % \let\markupsetuplqsamp \markupsetcodequoteleft \let\markupsetuprqsamp \markupsetcodequoteright % \let\markupsetuplqverb \markupsetcodequoteleft \let\markupsetuprqverb \markupsetcodequoteright % \let\markupsetuplqverbatim \markupsetcodequoteleft \let\markupsetuprqverbatim \markupsetcodequoteright \let\markupsetuplqkbd \markupsetnoligaturesquoteleft % Allow an option to not replace quotes with a regular directed right % quote/apostrophe (char 0x27), but instead use 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{% \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax '% \else \char'15 \fi \else \char'15 \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{% \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 } % [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\ptexslash \fi\fi\fi} % like \smartslanted except unconditionally uses \ttsl, and no ic. % @var is set to this for defun arguments. \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} \let\i=\smartitalic \let\slanted=\smartslanted \def\var#1{\smartslanted{#1}} \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\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@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 \rawbackslash \plainfrenchspacing #1}% \null } % @samp. \def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}} % 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} % ctrl is no longer a Texinfo command. \def\ctrl #1{{\tt \rawbackslash \hat}#1} % @file, @option are the same as @samp. \let\file=\samp \let\option=\samp % @code is a modification of @t, % which makes spaces the same size as normal in the surrounding text. \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 % \rawbackslash \plainfrenchspacing #1% }% \null } % We *must* turn on hyphenation at `-' and `_' in @code. % 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-\realdash \let_\realunder \fi \codex } } \def\realdash{-} \def\codedash{-\discretionary{}{}{}} \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{}{}{}}% {\_}% } \def\codex #1{\tclose{#1}\endgroup} % An additional complication: the above will allow breaks after, e.g., % each of the four underscores in __typeof__. This is undesirable in % some manuals, especially if they don't have long identifiers in % general. @allowcodebreaks provides a way to control this. % \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'}% \fi\fi } % @kbd is like @code, except that if the argument is just one @key command, % then @kbd has no effect. \def\kbd#1{{\setupmarkupstyle{kbd}\def\look{#1}\expandafter\kbdfoo\look??\par}} % @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 option `\txiarg'}% \fi\fi\fi } \def\worddistinct{distinct} \def\wordexample{example} \def\wordcode{code} % Default is `distinct'. \kbdinputstyle distinct \def\xkey{\key} \def\kbdfoo#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} % For @indicateurl, @env, @command quotes seem unnecessary, so use \code. \let\indicateurl=\code \let\env=\code \let\command=\code % @clicksequence{File @click{} Open ...} \def\clicksequence#1{\begingroup #1\endgroup} % @clickstyle @arrow (by default) \parseargdef\clickstyle{\def\click{#1}} \def\click{\arrow} % @uref (abbreviation for `urlref') 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. Perhaps eventually put in % a hypertex \special here. % \def\uref#1{\douref #1,,,\finish} \def\douref#1,#2,#3,#4\finish{\begingroup \unsepspaces \pdfurl{#1}% \setbox0 = \hbox{\ignorespaces #3}% \ifdim\wd0 > 0pt \unhbox0 % third arg given, show only that \else \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \ifpdf \unhbox0 % PDF: 2nd arg given, show only it \else \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url \fi \else \code{#1}% only url given, so show it \fi \fi \endlink \endgroup} % @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} \ifpdf \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 % 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} % @l was never documented to mean ``switch to the Lisp font'', % and it is not used as such in any manual I can find. We need it for % Polish suppressed-l. --karl, 22sep96. %\def\l#1{{\li #1}\null} % @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{% {\selectfonts\lsize #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi } % @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 } % @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 \ character. % FYI, plain.tex uses \\ as a temporary control sequence (why?), but % this is not advertised and we don't care. Texinfo does not % otherwise define @\. % % The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} % \def\math{% \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 $\finishmath } \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 } } \message{glyphs,} % and logos. % @@ prints an @. \def\@{\char64 } % Used to generate quoted braces. Unless we're in typewriter, use % \ecfont because the CM text fonts do not have braces, and we don't % want to switch into math. \def\mylbrace{{\ifmonospace\else\ecfont\fi \char123}} \def\myrbrace{{\ifmonospace\else\ecfont\fi \char125}} \let\{=\mylbrace \let\}=\myrbrace \begingroup % Definitions to produce \{ and \} commands for indices, % and @{ and @} for the aux/toc files. \catcode`\{ = \other \catcode`\} = \other \catcode`\[ = 1 \catcode`\] = 2 \catcode`\! = 0 \catcode`\\ = \other !gdef!lbracecmd[\{]% !gdef!rbracecmd[\}]% !gdef!lbraceatcmd[@{]% !gdef!rbraceatcmd[@}]% !endgroup % @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{\selectfonts\lllsize \underbar{a}}} \def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \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{\selectfonts\lllsize A}\vss}}% \kern-.15em \TeX } % Some math mode symbols. \def\bullet{$\ptexbullet$} \def\geq{\ifmmode \ge\else $\ge$\fi} \def\leq{\ifmmode \le\else $\le$\fi} \def\minus{\ifmmode -\else $-$\fi} % @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 % {\tentt \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 error\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{{\it\$}} % @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 ec* fonts (cm-super in outline format) for non-CM glyphs. \def\ecfont{% % 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}% \ifx\curfontstyle\bfstylename % bold: \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize \else % regular: \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize \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{\selectfonts\lllsize 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\undefined \def\Orb{\mathhexbox20D} \fi % Quotes. \chardef\quotedblleft="5C \chardef\quotedblright=`\" \chardef\quoteleft=`\` \chardef\quoteright=`\' \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 % Do an implicit @contents or @shortcontents after @end titlepage if the % user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. % \newif\ifsetcontentsaftertitlepage \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue \newif\ifsetshortcontentsaftertitlepage \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue \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 % % If they want short, they certainly want long too. \ifsetshortcontentsaftertitlepage \shortcontents \contents \global\let\shortcontents = \relax \global\let\contents = \relax \fi % \ifsetcontentsaftertitlepage \contents \global\let\contents = \relax \global\let\shortcontents = \relax \fi } \def\finishtitlepage{% \vskip4pt \hrule height 2pt width \hsize \vskip\titlepagebottomglue \finishedtitlepagetrue } %%% Macros to be used within @titlepage: \let\subtitlerm=\tenrm \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} \parseargdef\title{% \checkenv\titlepage \leftline{\titlefonts\rmisbold #1} % 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\rmisbold \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\evenfootline % footline on even pages \newtoks\oddfootline % footline on odd pages % Now make TeX use those variables \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline \else \the\evenheadline \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}}} \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}}} \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\pageheight 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 \def\evenheadingmarks{\headingmarks{even}{heading}} \def\oddheadingmarks{\headingmarks{odd}{heading}} \def\evenfootingmarks{\headingmarks{even}{footing}} \def\oddfootingmarks{\headingmarks{odd}{footing}} \def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1} \headingmarks{odd}{heading}{#1} } \def\everyfootingmarks#1 {\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. \def\headings #1 {\csname HEADINGS#1\endcsname} \def\headingsoff{% non-global headings elimination \evenheadline={\hfil}\evenfootline={\hfil}% \oddheadline={\hfil}\oddfootline={\hfil}% } \def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting \HEADINGSoff % it's the default % When we turn headings on, set the page number to 1. % 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{% \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \let\contentsalignmacro = \chappager % For single-sided printing, chapter title goes across top left of page, % page number on top right. \def\HEADINGSsingle{% \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chappager } \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\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\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\undefined \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 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}% % \vadjust{\penalty 1200}}% not good to break after first line of item. \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 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 \global\everytab={\bf}% can't use \headitemfont since the parsing differs \the\everytab % for the first item }% % % 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={}% \global\colcount=0 % Reset the column counter. % Check for saved footnotes, etc. \checkinserts % Keeps underfull box messages off when table breaks over pages. %\filbreak % Maybe so, but it also creates really weird page breaks when the % table breaks over pages. Wouldn't \vfil be better? Wait until the % problem manifests itself, so it can be fixed for real --karl. }% }% % \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-\realdash \let_\normalunderscore } } % We have this subroutine so that we can handle at least some @value's % properly in indexes (we call \makevalueexpandable in \indexdummies). % The command has to be fully expandable (if the variable is set), since % the result winds up in the index file. This means that if the % variable's value contains other Texinfo commands, it's almost certain % it will fail (although perhaps we could fix that with sufficient work % to do a one-level expansion on the result, instead of complete). % \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 } % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined % with @set. % % To get special treatment of `@end ifset,' call \makeond and the 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 ifclear reads 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}} % @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 foo. % It automatically defines \fooindex such that % \fooindex ...rest of line... puts an entry in the index foo. % It also defines \fooindfile to be the number of the output channel for % the file that accumulates this index. The file's extension is foo. % The name of an index should be no more than 2 characters long % for the sake of vms. % \def\newindex#1{% \iflinks \expandafter\newwrite \csname#1indfile\endcsname \openout \csname#1indfile\endcsname \jobname.#1 % Open the file \fi \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{% \iflinks \expandafter\newwrite \csname#1indfile\endcsname \openout \csname#1indfile\endcsname \jobname.#1 \fi \expandafter\xdef\csname#1index\endcsname{% \noexpand\docodeindex{#1}}% } % @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{% % Only do \closeout if we haven't already done it, else we'll end up % closing the target index. \expandafter \ifx\csname donesynindex#2\endcsname \relax % The \closeout helps reduce unnecessary open files; the limit on the % Acorn RISC OS is a mere 16 files. \expandafter\closeout\csname#2indfile\endcsname \expandafter\let\csname donesynindex#2\endcsname = 1 \fi % 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 \fooindex macros. % Argument #1 is generated by the calling \fooindex macro, % and it is "foo", the name of the index. % \doindex just uses \parsearg; it calls \doind for the actual work. % This is because \doind is more useful to call from other macros. % There is also \dosubind {index}{topic}{subtopic} % which makes an entry in a two-level index such as the operation index. \def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} \def\singleindexer #1{\doind{\indexname}{#1}} % like the previous two, but they put @code around the argument. \def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} \def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} % Take care of Texinfo commands that can appear in an index entry. % Since there are some commands we want to expand, and others we don't, % we have to laboriously prevent expansion for those that we don't. % \def\indexdummies{% \escapechar = `\\ % use backslash in output files. \def\@{@}% change to @@ when we switch to @ as escape char in index files. \def\ {\realbackslash\space }% % % Need these unexpandable (because we define \tt as a dummy) % definitions when @{ or @} appear in index entry text. Also, more % complicated, when \tex is in effect and \{ is a \delimiter again. % We can't use \lbracecmd and \rbracecmd because texindex assumes % braces and backslashes are used only as delimiters. Perhaps we % should define @lbrace and @rbrace commands a la @comma. \def\{{{\tt\char123}}% \def\}{{\tt\char125}}% % % I don't entirely understand this, but when an index entry is % generated from a macro call, the \endinput which \scanmacro inserts % causes processing to be prematurely terminated. This is, % apparently, because \indexsorttmp is fully expanded, and \endinput % is an expandable command. The redefinition below makes \endinput % disappear altogether for that purpose -- although logging shows that % processing continues to some further point. On the other hand, it % seems \endinput does not hurt in the printed index arg, since that % is still getting written without apparent harm. % % Sample source (mac-idx3.tex, reported by Graham Percival to % help-texinfo, 22may06): % @macro funindex {WORD} % @findex xyz % @end macro % ... % @funindex commtest % % The above is not enough to reproduce the bug, but it gives the flavor. % % Sample whatsit resulting: % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}} % % So: \let\endinput = \empty % % Do the redefinitions. \commondummies } % For the aux and toc files, @ is the escape character. So we want to % redefine everything using @ as the escape character (instead of % \realbackslash, still used for index files). When everything uses @, % this will be simpler. % \def\atdummies{% \def\@{@@}% \def\ {@ }% \let\{ = \lbraceatcmd \let\} = \rbraceatcmd % % Do the redefinitions. \commondummies \otherbackslash } % Called from \indexdummies and \atdummies. % \def\commondummies{% % % \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. % % For control letters, we have \definedummyletter, which omits the % space. % % 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). % \def\definedummyword ##1{\def##1{\string##1\space}}% \def\definedummyletter##1{\def##1{\string##1}}% \let\definedummyaccent\definedummyletter % \commondummiesnofonts % \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\bullet \definedummyword\comma \definedummyword\copyright \definedummyword\registeredsymbol \definedummyword\dots \definedummyword\enddots \definedummyword\entrybreak \definedummyword\equiv \definedummyword\error \definedummyword\euro \definedummyword\guillemetleft \definedummyword\guillemetright \definedummyword\guilsinglleft \definedummyword\guilsinglright \definedummyword\expansion \definedummyword\minus \definedummyword\ogonek \definedummyword\pounds \definedummyword\point \definedummyword\print \definedummyword\quotedblbase \definedummyword\quotedblleft \definedummyword\quotedblright \definedummyword\quoteleft \definedummyword\quoteright \definedummyword\quotesinglbase \definedummyword\result \definedummyword\textdegree % % We want to disable all macros so that they are not expanded by \write. \macrolist % \normalturnoffactive % % Handle some cases of @value -- where it does not contain any % (non-fully-expandable) commands. \makevalueexpandable } % \commondummiesnofonts: common to \commondummies and \indexnofonts. % \def\commondummiesnofonts{% % Control letters and accents. \definedummyletter\!% \definedummyaccent\"% \definedummyaccent\'% \definedummyletter\*% \definedummyaccent\,% \definedummyletter\.% \definedummyletter\/% \definedummyletter\:% \definedummyaccent\=% \definedummyletter\?% \definedummyaccent\^% \definedummyaccent\`% \definedummyaccent\~% \definedummyword\u \definedummyword\v \definedummyword\H \definedummyword\dotaccent \definedummyword\ogonek \definedummyword\ringaccent \definedummyword\tieaccent \definedummyword\ubaraccent \definedummyword\udotaccent \definedummyword\dotless % % Texinfo font commands. \definedummyword\b \definedummyword\i \definedummyword\r \definedummyword\sc \definedummyword\t % % Commands that take arguments. \definedummyword\acronym \definedummyword\cite \definedummyword\code \definedummyword\command \definedummyword\dfn \definedummyword\email \definedummyword\emph \definedummyword\env \definedummyword\file \definedummyword\kbd \definedummyword\key \definedummyword\math \definedummyword\option \definedummyword\pxref \definedummyword\ref \definedummyword\samp \definedummyword\strong \definedummyword\tie \definedummyword\uref \definedummyword\url \definedummyword\var \definedummyword\verb \definedummyword\w \definedummyword\xref } % \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\definedummyaccent##1{\let##1\asis}% % We can just ignore other control letters. \def\definedummyletter##1{\let##1\empty}% % Hopefully, all control words can become @asis. \let\definedummyword\definedummyaccent % \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\@{@}% % how to handle braces? \def\_{\normalunderscore}% % % Non-English letters. \def\AA{AA}% \def\AE{AE}% \def\DH{DZZ}% \def\L{L}% \def\OE{OE}% \def\O{O}% \def\TH{ZZZ}% \def\aa{aa}% \def\ae{ae}% \def\dh{dzz}% \def\exclamdown{!}% \def\l{l}% \def\oe{oe}% \def\ordf{a}% \def\ordm{o}% \def\o{o}% \def\questiondown{?}% \def\ss{ss}% \def\th{zzz}% % \def\LaTeX{LaTeX}% \def\TeX{TeX}% % % Assorted special characters. % (The following {} will end up in the sort string, but that's ok.) \def\bullet{bullet}% \def\comma{,}% \def\copyright{copyright}% \def\dots{...}% \def\enddots{...}% \def\equiv{==}% \def\error{error}% \def\euro{euro}% \def\expansion{==>}% \def\guillemetleft{<<}% \def\guillemetright{>>}% \def\guilsinglleft{<}% \def\guilsinglright{>}% \def\minus{-}% \def\point{.}% \def\pounds{pounds}% \def\print{-|}% \def\quotedblbase{"}% \def\quotedblleft{"}% \def\quotedblright{"}% \def\quoteleft{`}% \def\quoteright{'}% \def\quotesinglbase{,}% \def\registeredsymbol{R}% \def\result{=>}% \def\textdegree{o}% % \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax \else \indexlquoteignore \fi % % 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 } % Undocumented (for FSFS 2nd ed.): @set txiindexlquoteignore makes us % ignore left quotes in the sort term. {\catcode`\`=\active \gdef\indexlquoteignore{\let`=\empty}} \let\indexbackslash=0 %overridden during \printindex. \let\SETmarginindex=\relax % put index entries in margin (undocumented)? % Most index entries go through here, but \dosubind is the general case. % #1 is the index name, #2 is the entry text. \def\doind#1#2{\dosubind{#1}{#2}{}} % Workhorse for all \fooindexes. % #1 is name of index, #2 is stuff to put there, #3 is subentry -- % empty if called from \doind, as we usually are (the main exception % is with most defuns, which call us directly). % \def\dosubind#1#2#3{% \iflinks {% % Store the main index entry text (including the third arg). \toks0 = {#2}% % If third arg is present, precede it with a space. \def\thirdarg{#3}% \ifx\thirdarg\empty \else \toks0 = \expandafter{\the\toks0 \space #3}% \fi % \edef\writeto{\csname#1indfile\endcsname}% % \safewhatsit\dosubindwrite }% \fi } % Write the entry in \toks0 to the index file: % \def\dosubindwrite{% % Put the index entry in the margin if desired. \ifx\SETmarginindex\relax\else \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}% \fi % % Remember, we are within a group. \indexdummies % Must do this here, since \bf, etc expand at this stage \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now % so it will be output as is; and it will print as backslash. % % Process the index entry with all font commands turned off, to % get the string to sort by. {\indexnofonts \edef\temp{\the\toks0}% need full expansion \xdef\indexsorttmp{\temp}% }% % % 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{\indexsorttmp}{\noexpand\folio}{\the\toks0}}% }% \temp } % 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} % for the beginning of a topic that is used with subtopics % \secondary {subtopic}{pagelist} % for each 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} \def\cindexsub {\begingroup\obeylines\cindexsub} {\obeylines % \gdef\cindexsub "#1" #2^^M{\endgroup % \dosubind{cp}{#2}{#1}}} % 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 if the index file exists and is nonempty. % Change catcode of @ here so that if the index file contains % \initial {@} % as its first line, TeX doesn't complain about mismatched braces % (because it thinks @} is a control sequence). \catcode`\@ = 11 \openin 1 \jobname.#1s \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 \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 \temp \ifeof 1 \putwordIndexIsEmpty \else % Index files are almost Texinfo source, but we use \ as the escape % character. It would be better to use @, but that's too big a change % to make right now. \def\indexbackslash{\backslashcurfont}% \catcode`\\ = 0 \escapechar = `\\ \begindoublecolumns \input \jobname.#1s \enddoublecolumns \fi \fi \closein 1 \endgroup} % These macros are used by the sorted index file itself. % Change them to control the appearance of the index. \def\initial#1{{% % Some minor font changes for the special characters. \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt % % Remove any glue we may have, we'll be inserting our own. \removelastskip % % We like breaks before the index initials, so insert a bonus. \nobreak \vskip 0pt plus 3\baselineskip \penalty 0 \vskip 0pt plus -3\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 .5\baselineskip \leftline{\secbf #1}% % Do our best not to break after the initial. \nobreak \vskip .33\baselineskip plus .1\baselineskip }} % \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. % % A straightforward implementation would start like this: % \def\entry#1#2{... % But this freezes the catcodes in the argument, and can cause problems to % @code, which sets - active. This problem was fixed by a kludge--- % ``-'' was active throughout whole index, but this isn't really right. % The right solution is to prevent \entry from swallowing the whole text. % --kasal, 21nov03 \def\entry{% \begingroup % % Start a new paragraph if necessary, so our assignments below can't % affect previous text. \par % % Do not fill out the last line with white space. \parfillskip = 0in % % No extra space above this paragraph. \parskip = 0in % % Do not prefer a separate line ending with a hyphen to fewer lines. \finalhyphendemerits = 0 % % \hangindent is only relevant when the entry text and page number % don't both fit on one line. In that case, bob suggests starting the % dots pretty far over on the line. Unfortunately, a large % indentation looks wrong when the entry text itself is broken across % lines. So we use a small indentation and put up with long leaders. % % \hangafter is reset to 1 (which is the value we want) at the start % of each paragraph, so we need not do anything with that. \hangindent = 2em % % When the entry text needs to be broken, just fill out the first line % with blank space. \rightskip = 0pt plus1fil % % A bit of stretch before each entry for the benefit of balancing % columns. \vskip 0pt plus1pt % % 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}% % % Swallow the left brace of the text (first parameter): \afterassignment\doentry \let\temp = } \def\entrybreak{\unskip\space\ignorespaces}% \def\doentry{% \bgroup % Instead of the swallowed brace. \noindent \aftergroup\finishentry % And now comes the text of the entry. } \def\finishentry#1{% % #1 is the page number. % % The following is kludged to not output a line of dots in the index if % there are no page numbers. The next person who breaks this will be % cursed by a Unix daemon. \setbox\boxA = \hbox{#1}% \ifdim\wd\boxA = 0pt \ % \else % % If we must, put the page number on a line of its own, and fill out % this line with blank space. (The \hfil is overwhelmed with the % fill leaders glue in \indexdotfill if the page number does fit.) \hfil\penalty50 \null\nobreak\indexdotfill % Have leaders before the page number. % % The `\ ' here is removed by the implicit \unskip that TeX does as % part of (the primitive) \par. Without it, a spurious underfull % \hbox ensues. \ifpdf \pdfgettoks#1.% \ \the\toksA \else \ #1% \fi \fi \par \endgroup } % Like plain.tex's \dotfill, except uses up at least 1 em. \def\indexdotfill{\cleaders \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill} \def\primary #1{\line{#1\hfil}} \newskip\secondaryindent \secondaryindent=0.5cm \def\secondary#1#2{{% \parfillskip=0in \parskip=0in \hangindent=1in \hangafter=1 \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill \ifpdf \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. \else #2 \fi \par }} % 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 \newbox\partialpage \newdimen\doublecolumnhsize \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns % Grab any single-column material above us. \output = {% % % Here is a possibility not foreseen in manmac: if we accumulate a % whole lot of material, we might end up calling this \output % routine twice in a row (see the doublecol-lose test, which is % essentially a couple of indexes with @setchapternewpage off). In % that case we just ship out what is in \partialpage with the normal % output routine. Generally, \partialpage will be empty when this % runs and this will be a no-op. See the indexspread.tex test case. \ifvoid\partialpage \else \onepageout{\pagecontents\partialpage}% \fi % \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 % % Double the \vsize as well. (We don't need a separate register here, % since nobody clobbers \vsize.) \vsize = 2\vsize } % The double-column output routine for all double-column pages except % the last. % \def\doublecolumnout{% \splittopskip=\topskip \splitmaxdepth=\maxdepth % Get the available space for the double columns -- the normal % (undoubled) page height minus any material left over from the % previous page. \dimen@ = \vsize \divide\dimen@ by 2 \advance\dimen@ by -\ht\partialpage % % box0 will be the left-hand column, box2 the right. \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ \onepageout\pagesofar \unvbox255 \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\pagewidth{\box0\hfil\box2}% } % % All done 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 \pageheight (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. Leave it on the % current page, no automatic page break. \balancecolumns % % If we end up splitting too much material for the current page, % though, there will be another page break right after this \output % invocation ends. Having called \balancecolumns once, we do not % want to call it again. Therefore, reset \output to its normal % definition right away. (We hope \balancecolumns will never be % called on to balance too much material, but if it is, this makes % the output somewhat more palatable.) \global\output = {\onepageout{\pagecontents\PAGE}}% }% \eject \endgroup % started in \begindoublecolumns % % \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 (after the % \endgroup where \vsize got restored). \pagegoal = \vsize } % % Called at the end of the double column material. \def\balancecolumns{% \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. \dimen@ = \ht0 \advance\dimen@ by \topskip \advance\dimen@ by-\baselineskip \divide\dimen@ by 2 % target to split to %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% \splittopskip = \topskip % Loop until we get a decent breakpoint. {% \vbadness = 10000 \loop \global\setbox3 = \copy0 \global\setbox1 = \vsplit3 to \dimen@ \ifdim\ht3>\dimen@ \global\advance\dimen@ by 1pt \repeat }% %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% \setbox0=\vbox to\dimen@{\unvbox1}% \setbox2=\vbox to\dimen@{\unvbox3}% % \pagesofar } \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\rmisbold #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 \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} \let\up=\raisesections % original BFox name % @lowersections: treat @chapter as section, @section as subsection, etc. \def\lowersections{\global\advance\secbase by 1} \let\down=\lowersections % original BFox name % 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 } \outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz \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{% % Well, we could do the following in a group, but that would break % an assumption that \chapmacro is called at the outermost level. % Thus we are safer this way: --kasal, 24feb04 \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}% } \outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz \def\appendixsectionzzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% } \let\appendixsec\appendixsection \outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz \def\unnumberedseczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% } % Subsections. \outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz \def\numberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% } \outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz \def\appendixsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno}% } \outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz \def\unnumberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno}% } % Subsubsections. \outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz \def\numberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynumbered}% {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% } \outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz \def\appendixsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% } \outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz \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 % NOTE on use of \vbox for chapter headings, section headings, and such: % 1) We use \vbox rather than the earlier \line to permit % overlong headings to fold. % 2) \hyphenpenalty is set to 10000 because hyphenation in a % heading is obnoxious; this forbids it. % 3) Likewise, headings look best if no \parindent is used, and % if justification is not attempted. Hence \raggedright. \def\majorheading{% {\advance\chapheadingskip by 10pt \chapbreak }% \parsearg\chapheadingzzz } \def\chapheading{\chapbreak \parsearg\chapheadingzzz} \def\chapheadingzzz#1{% {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\ptexraggedright \rmisbold #1\hfill}}% \bigskip \par\penalty 200\relax \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} %%% Define plain chapter starts, and page on/off switching for it % Parameter controlling skip before chapter headings (if needed) \newskip\chapheadingskip \def\chapbreak{\dobreak \chapheadingskip {-4000}} \def\chappager{\par\vfill\supereject} % 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 } \def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} \def\CHAPPAGoff{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chapbreak \global\let\pagealignmacro=\chappager} \def\CHAPPAGon{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chappager \global\let\pagealignmacro=\chappager \global\def\HEADINGSon{\HEADINGSsingle}} \def\CHAPPAGodd{% \global\let\contentsalignmacro = \chapoddpage \global\let\pchapsepmacro=\chapoddpage \global\let\pagealignmacro=\chapoddpage \global\def\HEADINGSon{\HEADINGSdouble}} \CHAPPAGon % Chapter opening. % % #1 is the text, #2 is the section type (Ynumbered, Ynothing, % Yappendix, Yomitfromtoc), #3 the chapter number. % % To test against our argument. \def\Ynothingkeyword{Ynothing} \def\Yomitfromtockeyword{Yomitfromtoc} \def\Yappendixkeyword{Yappendix} % \def\chapmacro#1#2#3{% % Insert the first mark before the heading break (see notes for \domark). \let\prevchapterdefs=\lastchapterdefs \let\prevsectiondefs=\lastsectiondefs \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}% \gdef\thissection{}}% % \def\temptype{#2}% \ifx\temptype\Ynothingkeyword \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{\thischaptername}}% \else\ifx\temptype\Yomitfromtockeyword \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{}}% \else\ifx\temptype\Yappendixkeyword \toks0={#1}% \xdef\lastchapterdefs{% \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}% \gdef\noexpand\thischapter{\printheadingappendix{\noexpand\thischapternum}% {\noexpand\thischaptername}}% }% \else \toks0={#1}% \xdef\lastchapterdefs{% \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}% \gdef\noexpand\thischapter{\printheadingchapter{\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=\lastchapterdefs \let\prevsectiondefs=\lastsectiondefs \domark % {% \chapfonts \rmisbold % % Have to define \lastsection 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\lastsection{#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{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright \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 } % I don't think this chapter style is supported any more, so I'm not % updating it with the new noderef stuff. We'll see. --karl, 11aug03. % \def\setchapterstyle #1 {\csname CHAPF#1\endcsname} % \def\unnchfopen #1{% \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\ptexraggedright \rmisbold #1\hfill}}\bigskip \par\nobreak } \def\chfopen #1#2{\chapoddpage {\chapfonts \vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% \par\penalty 5000 % } \def\centerchfopen #1{% \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt \hfill {\rmisbold #1}\hfill}}\bigskip \par\nobreak } \def\CHAPFopen{% \global\let\chapmacro=\chfopen \global\let\centerchapmacro=\centerchfopen} % 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, #2 is the section level (sec/subsec/subsubsec), #3 is % the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the % section number. % \def\seckeyword{sec} % \def\sectionheading#1#2#3#4{% {% % Switch to the right set of fonts. \csname #2fonts\endcsname \rmisbold % \def\sectionlevel{#2}% \def\temptype{#3}% % % Insert first mark before the heading break (see notes for \domark). \let\prevsectiondefs=\lastsectiondefs \ifx\temptype\Ynothingkeyword \ifx\sectionlevel\seckeyword \gdef\lastsectiondefs{\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\lastsectiondefs{% \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}% \gdef\noexpand\thissection{\printheadingsection{\noexpand\thissectionnum}% {\noexpand\thissectionname}}% }% \fi \else \ifx\sectionlevel\seckeyword \toks0={#1}% \xdef\lastsectiondefs{% \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}% \gdef\noexpand\thissection{\printheadingsection{\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. \let\prevsectiondefs=\lastsectiondefs \domark % % Only insert the space after the number if we have a section number. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unn}% \gdef\lastsection{#1}% \else\ifx\temptype\Yomitfromtockeyword % for @headings -- no section number, don't include in toc, % and don't redefine \lastsection. \setbox0 = \hbox{}% \def\toctype{omit}% \let\sectionlevel=\empty \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{#4\enspace}% \def\toctype{app}% \gdef\lastsection{#1}% \else \setbox0 = \hbox{#4\enspace}% \def\toctype{num}% \gdef\lastsection{#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.) \vskip-\parskip % % This is purely so the last item on the list is a known \penalty > % 10000. This is so \startdefun can avoid allowing breakpoints after % section headings. Otherwise, it would insert a valid breakpoint between: % % @section sec-whatever % @deffn def-whatever \penalty 10001 } % for localization hook point \def\printheadingchapter#1#2{\noexpand\putwordChapter{}#1: #2} \def\printheadingsection#1#2{\noexpand\putwordSection{}#1: #2} \def\printheadingappendix#1#2{\noexpand\putwordAppendix{}#1: #2} \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'. \ifpdf \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. Thus, we maintain % \contentsalignmacro in parallel with \pagealignmacro. % From: Torbjorn Granlund \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. \advance\hsize by -\contentsrightmargin % Don't use the full line length. % % Roman numerals for page numbers. \ifnum \pageno>0 \global\pageno = \lastnegativepageno \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 \lastnegativepageno = \pageno \global\pageno = \savepageno } % 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 \lastnegativepageno = \pageno \global\pageno = \savepageno } \let\shortcontents = \summarycontents % 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{\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}\labelspace#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 \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 \escapechar=`\\ % % ' 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 % \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\*=\ptexstar \let\t=\ptext \expandafter \let\csname top\endcsname=\ptextop % 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 % 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 }} \let\afterenvbreak = \aboveenvbreak % \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. \font\circle=lcircle10 \newdimen\circthick \newdimen\cartouter\newdimen\cartinner \newskip\normbskip\newskip\normpskip\newskip\normlskip \circthick=\fontdimen8\circle % \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 \envdef\cartouche{% \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 % Flag to tell @lisp, etc., not to narrow margin. \let\nonarrowing = t% \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 \checkinserts } % This macro is called at the beginning of all the @example variants, % inside a group. \newdimen\nonfillparindent \def\nonfillstart{% \aboveenvbreak \hfuzz = 12pt % 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 plus2em \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{% {\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 \advance\rightskip by \lispnarrowing \exdentamount = \lispnarrowing \else \let\nonarrowing = \relax \fi \parsearg\quotationlabel } % We have retained a nonzero parskip for the environment, since we're % doing normal filling. % \def\Equotation{% \par \ifx\quotationauthor\undefined\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 } % 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 % \def\starttabbox{\setbox0=\hbox\bgroup} % \begingroup \catcode`\^^I=\active \gdef\tabexpand{% \catcode`\^^I=\active \def^^I{\leavevmode\egroup \dimen0=\wd0 % the width so far, or since the previous tab \divide\dimen0 by\tabw \multiply\dimen0 by\tabw % compute previous multiple of \tabw \advance\dimen0 by\tabw % advance to next multiple of \tabw \wd0=\dimen0 \box0 \starttabbox }% } \endgroup % start the verbatim environment. \def\setupverbatim{% \let\nonarrowing = t% \nonfillstart % Easiest (and conventionally used) font for verbatim \tt \def\par{\leavevmode\egroup\box0\endgraf}% \tabexpand \setupmarkupstyle{verbatim}% % Respect line breaks, % print special symbols as themselves, and % make each space count % must do in this order: \obeylines \uncatcodespecials \sepspaces \everypar{\starttabbox}% } % 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{#2\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. \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. \input #1 \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 very 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 minor 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 % % Define \deffn and \deffnx, without parameters. % \deffnheader has to be defined explicitly. % \def\domakedefun#1#2#3{% \envdef#1{% \startdefun \parseargusing\activeparens{\printdefunline#3}% }% \def#2{\dodefunx#1}% \def#3% } %%% 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{% % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}. \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}% \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 {} } %%% Type: % @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{% % Get the values of \leftskip and \rightskip as they were outside the @def... \advance\leftskip by -\defbodyindent % % How we'll format the type 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. % 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 % The continuations: \dimen2=\hsize \advance\dimen2 by -\defargsindent % (plain.tex says that \dimen1 should be used only as global.) \parshape 2 0in \dimen0 \defargsindent \dimen2 % % Put the type name to 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}% return value type \ifx\temp\empty\else \tclose{\temp} \fi #3% output function name }% {\rm\enskip}% hskip 0.5 em of \tenrm % \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. Let's try @var for that. \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} } \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\undefined \newwrite\macscribble \def\scantokens#1{% \toks0={#1}% \immediate\openout\macscribble=\jobname.tmp \immediate\write\macscribble{\the\toks0}% \immediate\closeout\macscribble \input \jobname.tmp } \fi \def\scanmacro#1{% \begingroup \newlinechar`\^^M \let\xeatspaces\eatspaces % Undo catcode changes of \startcontents and \doprintindex % When called from @insertcopying or (short)caption, we need active % backslash to get it printed correctly. Previously, we had % \catcode`\\=\other instead. We'll see whether a problem appears % with macro expansion. --kasal, 19aug04 \catcode`\@=0 \catcode`\\=\active \escapechar=`\@ % ... and \example \spaceisspace % % Append \endinput to make sure that TeX does not see the ending newline. % I've verified that it is necessary both for e-TeX and for ordinary TeX % --kasal, 29nov03 \scantokens{#1\endinput}% \endgroup } \def\scanexp#1{% \edef\temp{\noexpand\scanmacro{#1}}% \temp } \newcount\paramno % Count of parameters \newtoks\macname % Macro name \newif\ifrecursive % Is it recursive? % List of all defined macros in the form % \definedummyword\macro1\definedummyword\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\definedummyword#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 \. % 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{% \catcode`\"=\other \catcode`\+=\other \catcode`\<=\other \catcode`\>=\other \catcode`\@=\other \catcode`\^=\other \catcode`\_=\other \catcode`\|=\other \catcode`\~=\other \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi } \def\scanargctxt{% \scanctxt \catcode`\\=\other \catcode`\^^M=\other } \def\macrobodyctxt{% \scanctxt \catcode`\{=\other \catcode`\}=\other \catcode`\^^M=\other \usembodybackslash } \def\macroargctxt{% \scanctxt \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\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% \else \expandafter\parsemargdef \argl;% \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\definedummyword\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\definedummyword \noexpand#1% \fi } % This makes use of the obscure 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. \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}} % Parse the optional {params} list. Set up \paramno and \paramlist % so \defmacro knows what to do. Define \macarg.blah for each blah % in the params list, to be ##N where N is the position in that list. % That gets used by \mbodybackslash (above). % We need to get `macro parameter char #' into several definitions. % The technique used is stolen from LaTeX: let \hash be something % unexpandable, insert that wherever you need a #, and then redefine % it to # just before using the token list produced. % % The same technique is used to protect \eatspaces till just before % the macro is used. \def\parsemargdef#1;{\paramno=0\def\paramlist{}% \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,} \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} % These two commands read recursive and nonrecursive macro bodies. % (They're different since rec and nonrec macros end differently.) \long\def\parsemacbody#1@end macro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% \long\def\parsermacbody#1@end rmacro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% % This defines the macro itself. There are six cases: recursive and % nonrecursive macros of zero, one, and many arguments. % Much magic with \expandafter here. % \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 \ifrecursive \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\scanmacro{\temp}}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\braceorline \expandafter\noexpand\csname\the\macname xxx\endcsname}% \expandafter\xdef\csname\the\macname xxx\endcsname##1{% \egroup\noexpand\scanmacro{\temp}}% \else % many \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\csname\the\macname xx\endcsname}% \expandafter\xdef\csname\the\macname xx\endcsname##1{% \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname xxx\endcsname \paramlist{\egroup\noexpand\scanmacro{\temp}}% \fi \else \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\braceorline \expandafter\noexpand\csname\the\macname xxx\endcsname}% \expandafter\xdef\csname\the\macname xxx\endcsname##1{% \egroup \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \else % many \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \expandafter\noexpand\csname\the\macname xx\endcsname}% \expandafter\xdef\csname\the\macname xx\endcsname##1{% \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname xxx\endcsname \paramlist{% \egroup \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \fi \fi} \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} % \braceorline decides whether the next nonwhitespace character is a % {. If so it reads up to the closing }, if not, it reads the whole % line. Whatever was read is then fed to the next control sequence % as an argument (by \parsebrace or \parsearg) \def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} \def\braceorlinexxx{% \ifx\nchar\bgroup\else \expandafter\parsearg \fi \macnamexxx} % @alias. % We need some trickery to remove the optional spaces around the equal % sign. Just 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}} \let\nwnode=\node \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 \lastsection, % 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 {% \atdummies % preserve commands, but don't expand them \edef\writexrdef##1##2{% \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef ##1}{##2}}% these are parameters of \writexrdef }% \toks0 = \expandafter{\lastsection}% \immediate \writexrdef{title}{\the\toks0 }% \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, during \shipout }% \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#1{\putwordsee{} \xrefX[#1,,,,,,,]} \def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} \def\ref#1{\xrefX[#1,,,,,,,]} \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup \unsepspaces \def\printedmanual{\ignorespaces #5}% \def\printedrefname{\ignorespaces #3}% \setbox1=\hbox{\printedmanual\unskip}% \setbox0=\hbox{\printedrefname\unskip}% \ifdim \wd0 = 0pt % No printed node name was explicitly given. \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax % Use the node name inside the square brackets. \def\printedrefname{\ignorespaces #1}% \else % Use the actual chapter/section title appear inside % the square brackets. Use the real section title if we have it. \ifdim \wd1 > 0pt % It is in another manual, so we don't have it. \def\printedrefname{\ignorespaces #1}% \else \ifhavexrefs % We 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 % This expands tokens, so do it after making catcode changes, so _ % etc. don't get their TeX definitions. \getfilename{#4}% % % See comments at \activebackslashdouble. {\activebackslashdouble \xdef\pdfxrefdest{#1}% \backslashparens\pdfxrefdest}% % \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 % % Float references are printed completely differently: "Figure 1.2" % instead of "[somenode], p.3". We distinguish them by the % LABEL-title being set to a magic string. {% % 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 }% \iffloat\Xthisreftitle % If the user specified the print name (third arg) to the ref, % print it instead of our usual "Figure 1.2". \ifdim\wd0 = 0pt \refx{#1-snt}{}% \else \printedrefname \fi % % if the user also gave the printed manual name (fifth arg), append % "in MANUALNAME". \ifdim \wd1 > 0pt %\space \putwordin{} \cite{\printedmanual}% \xrefprintinmanual{\printedmanual} \fi \else % node/anchor (non-float) references. % % If we use \unhbox0 and \unhbox1 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 \wd1 > 0pt %\putwordSection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}% \xrefprintrefinmanual{\printedrefname}{\printedmanual} \else \xrefprintnodename% % _ (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}\fi }% % output the `[mynode]' via a macro so it can be overridden. {\printedrefname}% % % But we always want a comma and a space: %,\space % % output the `page 3'. {\turnoffactive \putwordpage\tie\refx{#1-pg}{}}% \fi \fi \endlink \endgroup} % for localization hook point \def\xrefprintinmanual#1#2{\space \putwordin{} \cite{#1}} \def\xrefprintrefinmanual#1#2{\putwordSection{} ``#1'' \putwordin{} \cite{#2}} % 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]} \def\xrefprintnodename#1#2#3{% \def\temp{#1}% \ifx\temp\empty \else #1\space \fi [#2],\space#3 } % 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 } % Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. % If its value is nonempty, SUFFIX is output afterward. % \def\refx#1#2{% {% \indexnofonts \otherbackslash \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 \message{\linenumber Undefined cross reference `#1'.}% \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. Usually it's % just a \def (we prepend XR to the control sequence name to avoid % collisions). But if this is a float type, we have more work to do. % \def\xrdef#1#2{% {% The node name might contain 8-bit characters, which in our current % implementation are changed to commands like @'e. Don't let these % mess up the control sequence name. \indexnofonts \turnoffactive \xdef\safexrefname{#1}% }% % \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref % % 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 } % 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 % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc. % in xref tags, i.e., node names. But since ^^e4 notation isn't % supported in the main text, it doesn't seem desirable. Furthermore, % that is not enough: for node names that actually contain a ^ % character, we would end up writing a line like this: 'xrdef {'hat % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first % argument, and \hat is not an expandable control sequence. It could % all be worked out, but why? Either we support ^^ or we don't. % % The other change necessary for this was to define \auxhat: % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter % and then to call \auxhat in \setq. % \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 % % This is to support \ in node names and titles, since the \ % characters end up in a \csname. It's easier than % leaving it active and making its active definition an actual \ % character. What I don't understand is why it works in the *value* % of the xrdef. Seems like it should be a catcode12 \, and that % should not typeset properly. But it works, so I'm moving on for % now. --karl, 15jan04. \catcode`\\=\other % % Make the characters 128-255 be printing characters. {% \count1=128 \def\loop{% \catcode\count1=\other \advance\count1 by 1 \ifnum \count1<256 \loop \fi }% }% % % @ 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{% \let\indent=\ptexindent \let\noindent=\ptexnoindent \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 % 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=\pagewidth \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 \futurelet\next\fo@t } }%end \catcode `\@=11 % 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 ftp://tug.org/tex/epsf.tex.} % \def\image#1{% \ifx\epsfbox\undefined \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 % If the image is by itself, center it. \ifvmode \imagevmodetrue \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. On the other hand, if % it's at the top level, we don't want the normal paragraph indentation. \noindent % % Output the image. \ifpdf \dopdfimage{#1}{#2}{#3}% \else % \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}% \fi % \ifimagevmode \medskip \fi % space after the standalone image \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 \lastsection 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\lastsection{\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. {% \atdummies % % since we read the caption text in the macro world, where ^^M % is turned into a normal character, we have to scan it back, so % we don't write the literal three characters "^^M" into the aux file. \scanexp{% \xdef\noexpand\gtemp{% \ifx\thisshortcaption\empty \thiscaption \else \thisshortcaption \fi }% }% \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident \ifx\gtemp\empty \else : \gtemp \fi}}% }% \fi \egroup % end of \vtop % % place the captured inserts % % BEWARE: when the floats start floating, we have to issue warning % whenever an insert appears inside a float which could possibly % float. --kasal, 26may04 % \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 % \lastsection 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{\begingroup \let_=\normalunderscore % normal _ character for filenames \tex % read txi-??.tex file in plain TeX. % Read the file by the name they passed if it exists. \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 \endgroup} % % 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 } % 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. % \parseargdef\documentencoding{% % 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 \setnonasciicharscatcode\active \lattwochardefs % \else \ifx \declaredencoding \latone \setnonasciicharscatcode\active \latonechardefs % \else \ifx \declaredencoding \latnine \setnonasciicharscatcode\active \latninechardefs % \else \ifx \declaredencoding \utfeight \setnonasciicharscatcode\active \utfeightchardefs % \else \message{Unknown document encoding #1, ignoring.}% % \fi % utfeight \fi % latnine \fi % latone \fi % lattwo \fi % ascii } % A message to be logged when using a character that isn't available % the default font encoding (OT1). % \def\missingcharmsg#1{\message{Character missing in OT1 encoding: #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 % % Latin1 (ISO-8859-1) character definitions. \def\latonechardefs{% \gdef^^a0{~} \gdef^^a1{\exclamdown} \gdef^^a2{\missingcharmsg{CENT SIGN}} \gdef^^a3{{\pounds}} \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} \gdef^^a5{\missingcharmsg{YEN SIGN}} \gdef^^a6{\missingcharmsg{BROKEN BAR}} \gdef^^a7{\S} \gdef^^a8{\"{}} \gdef^^a9{\copyright} \gdef^^aa{\ordf} \gdef^^ab{\guillemetleft} \gdef^^ac{$\lnot$} \gdef^^ad{\-} \gdef^^ae{\registeredsymbol} \gdef^^af{\={}} % \gdef^^b0{\textdegree} \gdef^^b1{$\pm$} \gdef^^b2{$^2$} \gdef^^b3{$^3$} \gdef^^b4{\'{}} \gdef^^b5{$\mu$} \gdef^^b6{\P} % \gdef^^b7{$^.$} \gdef^^b8{\cedilla\ } \gdef^^b9{$^1$} \gdef^^ba{\ordm} % \gdef^^bb{\guilletright} \gdef^^bc{$1\over4$} \gdef^^bd{$1\over2$} \gdef^^be{$3\over4$} \gdef^^bf{\questiondown} % \gdef^^c0{\`A} \gdef^^c1{\'A} \gdef^^c2{\^A} \gdef^^c3{\~A} \gdef^^c4{\"A} \gdef^^c5{\ringaccent A} \gdef^^c6{\AE} \gdef^^c7{\cedilla C} \gdef^^c8{\`E} \gdef^^c9{\'E} \gdef^^ca{\^E} \gdef^^cb{\"E} \gdef^^cc{\`I} \gdef^^cd{\'I} \gdef^^ce{\^I} \gdef^^cf{\"I} % \gdef^^d0{\DH} \gdef^^d1{\~N} \gdef^^d2{\`O} \gdef^^d3{\'O} \gdef^^d4{\^O} \gdef^^d5{\~O} \gdef^^d6{\"O} \gdef^^d7{$\times$} \gdef^^d8{\O} \gdef^^d9{\`U} \gdef^^da{\'U} \gdef^^db{\^U} \gdef^^dc{\"U} \gdef^^dd{\'Y} \gdef^^de{\TH} \gdef^^df{\ss} % \gdef^^e0{\`a} \gdef^^e1{\'a} \gdef^^e2{\^a} \gdef^^e3{\~a} \gdef^^e4{\"a} \gdef^^e5{\ringaccent a} \gdef^^e6{\ae} \gdef^^e7{\cedilla c} \gdef^^e8{\`e} \gdef^^e9{\'e} \gdef^^ea{\^e} \gdef^^eb{\"e} \gdef^^ec{\`{\dotless i}} \gdef^^ed{\'{\dotless i}} \gdef^^ee{\^{\dotless i}} \gdef^^ef{\"{\dotless i}} % \gdef^^f0{\dh} \gdef^^f1{\~n} \gdef^^f2{\`o} \gdef^^f3{\'o} \gdef^^f4{\^o} \gdef^^f5{\~o} \gdef^^f6{\"o} \gdef^^f7{$\div$} \gdef^^f8{\o} \gdef^^f9{\`u} \gdef^^fa{\'u} \gdef^^fb{\^u} \gdef^^fc{\"u} \gdef^^fd{\'y} \gdef^^fe{\th} \gdef^^ff{\"y} } % Latin9 (ISO-8859-15) encoding character definitions. \def\latninechardefs{% % Encoding is almost identical to Latin1. \latonechardefs % \gdef^^a4{\euro} \gdef^^a6{\v S} \gdef^^a8{\v s} \gdef^^b4{\v Z} \gdef^^b8{\v z} \gdef^^bc{\OE} \gdef^^bd{\oe} \gdef^^be{\"Y} } % Latin2 (ISO-8859-2) character definitions. \def\lattwochardefs{% \gdef^^a0{~} \gdef^^a1{\ogonek{A}} \gdef^^a2{\u{}} \gdef^^a3{\L} \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} \gdef^^a5{\v L} \gdef^^a6{\'S} \gdef^^a7{\S} \gdef^^a8{\"{}} \gdef^^a9{\v S} \gdef^^aa{\cedilla S} \gdef^^ab{\v T} \gdef^^ac{\'Z} \gdef^^ad{\-} \gdef^^ae{\v Z} \gdef^^af{\dotaccent Z} % \gdef^^b0{\textdegree} \gdef^^b1{\ogonek{a}} \gdef^^b2{\ogonek{ }} \gdef^^b3{\l} \gdef^^b4{\'{}} \gdef^^b5{\v l} \gdef^^b6{\'s} \gdef^^b7{\v{}} \gdef^^b8{\cedilla\ } \gdef^^b9{\v s} \gdef^^ba{\cedilla s} \gdef^^bb{\v t} \gdef^^bc{\'z} \gdef^^bd{\H{}} \gdef^^be{\v z} \gdef^^bf{\dotaccent z} % \gdef^^c0{\'R} \gdef^^c1{\'A} \gdef^^c2{\^A} \gdef^^c3{\u A} \gdef^^c4{\"A} \gdef^^c5{\'L} \gdef^^c6{\'C} \gdef^^c7{\cedilla C} \gdef^^c8{\v C} \gdef^^c9{\'E} \gdef^^ca{\ogonek{E}} \gdef^^cb{\"E} \gdef^^cc{\v E} \gdef^^cd{\'I} \gdef^^ce{\^I} \gdef^^cf{\v D} % \gdef^^d0{\DH} \gdef^^d1{\'N} \gdef^^d2{\v N} \gdef^^d3{\'O} \gdef^^d4{\^O} \gdef^^d5{\H O} \gdef^^d6{\"O} \gdef^^d7{$\times$} \gdef^^d8{\v R} \gdef^^d9{\ringaccent U} \gdef^^da{\'U} \gdef^^db{\H U} \gdef^^dc{\"U} \gdef^^dd{\'Y} \gdef^^de{\cedilla T} \gdef^^df{\ss} % \gdef^^e0{\'r} \gdef^^e1{\'a} \gdef^^e2{\^a} \gdef^^e3{\u a} \gdef^^e4{\"a} \gdef^^e5{\'l} \gdef^^e6{\'c} \gdef^^e7{\cedilla c} \gdef^^e8{\v c} \gdef^^e9{\'e} \gdef^^ea{\ogonek{e}} \gdef^^eb{\"e} \gdef^^ec{\v e} \gdef^^ed{\'\i} \gdef^^ee{\^\i} \gdef^^ef{\v d} % \gdef^^f0{\dh} \gdef^^f1{\'n} \gdef^^f2{\v n} \gdef^^f3{\'o} \gdef^^f4{\^o} \gdef^^f5{\H o} \gdef^^f6{\"o} \gdef^^f7{$\div$} \gdef^^f8{\v r} \gdef^^f9{\ringaccent u} \gdef^^fa{\'u} \gdef^^fb{\H u} \gdef^^fc{\"u} \gdef^^fd{\'y} \gdef^^fe{\cedilla t} \gdef^^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 } \begingroup \catcode`\~13 \catcode`\"12 \def\UTFviiiLoop{% \global\catcode\countUTFx\active \uccode`\~\countUTFx \uppercase\expandafter{\UTFviiiTmp}% \advance\countUTFx by 1 \ifnum\countUTFx < \countUTFy \expandafter\UTFviiiLoop \fi} \countUTFx = "C2 \countUTFy = "E0 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiTwoOctets\string~}} \UTFviiiLoop \countUTFx = "E0 \countUTFy = "F0 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiThreeOctets\string~}} \UTFviiiLoop \countUTFx = "F0 \countUTFy = "F4 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiFourOctets\string~}} \UTFviiiLoop \endgroup \begingroup \catcode`\"=12 \catcode`\<=12 \catcode`\.=12 \catcode`\,=12 \catcode`\;=12 \catcode`\!=12 \catcode`\~=13 \gdef\DeclareUnicodeCharacter#1#2{% \countUTFz = "#1\relax \wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}% \begingroup \parseXMLCharref \def\UTFviiiTwoOctets##1##2{% \csname u8:##1\string ##2\endcsname}% \def\UTFviiiThreeOctets##1##2##3{% \csname u8:##1\string ##2\string ##3\endcsname}% \def\UTFviiiFourOctets##1##2##3##4{% \csname u8:##1\string ##2\string ##3\string ##4\endcsname}% \expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter \gdef\UTFviiiTmp{#2}% \endgroup} \gdef\parseXMLCharref{% \ifnum\countUTFz < "A0\relax \errhelp = \EMsimple \errmessage{Cannot define Unicode char value < 00A0}% \else\ifnum\countUTFz < "800\relax \parseUTFviiiA,% \parseUTFviiiB C\UTFviiiTwoOctets.,% \else\ifnum\countUTFz < "10000\relax \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiB E\UTFviiiThreeOctets.{,;}% \else \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiA!% \parseUTFviiiB F\UTFviiiFourOctets.{!,;}% \fi\fi\fi } \gdef\parseUTFviiiA#1{% \countUTFx = \countUTFz \divide\countUTFz by 64 \countUTFy = \countUTFz \multiply\countUTFz by 64 \advance\countUTFx by -\countUTFz \advance\countUTFx by 128 \uccode `#1\countUTFx \countUTFz = \countUTFy} \gdef\parseUTFviiiB#1#2#3#4{% \advance\countUTFz by "#10\relax \uccode `#3\countUTFz \uppercase{\gdef\UTFviiiTmp{#2#3#4}}} \endgroup \def\utfeightchardefs{% \DeclareUnicodeCharacter{00A0}{\tie} \DeclareUnicodeCharacter{00A1}{\exclamdown} \DeclareUnicodeCharacter{00A3}{\pounds} \DeclareUnicodeCharacter{00A8}{\"{ }} \DeclareUnicodeCharacter{00A9}{\copyright} \DeclareUnicodeCharacter{00AA}{\ordf} \DeclareUnicodeCharacter{00AB}{\guillemetleft} \DeclareUnicodeCharacter{00AD}{\-} \DeclareUnicodeCharacter{00AE}{\registeredsymbol} \DeclareUnicodeCharacter{00AF}{\={ }} \DeclareUnicodeCharacter{00B0}{\ringaccent{ }} \DeclareUnicodeCharacter{00B4}{\'{ }} \DeclareUnicodeCharacter{00B8}{\cedilla{ }} \DeclareUnicodeCharacter{00BA}{\ordm} \DeclareUnicodeCharacter{00BB}{\guillemetright} \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{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{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{0118}{\ogonek{E}} \DeclareUnicodeCharacter{0119}{\ogonek{e}} \DeclareUnicodeCharacter{010A}{\dotaccent{C}} \DeclareUnicodeCharacter{010B}{\dotaccent{c}} \DeclareUnicodeCharacter{010C}{\v{C}} \DeclareUnicodeCharacter{010D}{\v{c}} \DeclareUnicodeCharacter{010E}{\v{D}} \DeclareUnicodeCharacter{0112}{\=E} \DeclareUnicodeCharacter{0113}{\=e} \DeclareUnicodeCharacter{0114}{\u{E}} \DeclareUnicodeCharacter{0115}{\u{e}} \DeclareUnicodeCharacter{0116}{\dotaccent{E}} \DeclareUnicodeCharacter{0117}{\dotaccent{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{0124}{\^H} \DeclareUnicodeCharacter{0125}{\^h} \DeclareUnicodeCharacter{0128}{\~I} \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}} \DeclareUnicodeCharacter{012A}{\=I} \DeclareUnicodeCharacter{012B}{\={\dotless{i}}} \DeclareUnicodeCharacter{012C}{\u{I}} \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}} \DeclareUnicodeCharacter{0130}{\dotaccent{I}} \DeclareUnicodeCharacter{0131}{\dotless{i}} \DeclareUnicodeCharacter{0132}{IJ} \DeclareUnicodeCharacter{0133}{ij} \DeclareUnicodeCharacter{0134}{\^J} \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}} \DeclareUnicodeCharacter{0139}{\'L} \DeclareUnicodeCharacter{013A}{\'l} \DeclareUnicodeCharacter{0141}{\L} \DeclareUnicodeCharacter{0142}{\l} \DeclareUnicodeCharacter{0143}{\'N} \DeclareUnicodeCharacter{0144}{\'n} \DeclareUnicodeCharacter{0147}{\v{N}} \DeclareUnicodeCharacter{0148}{\v{n}} \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{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{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{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{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{02DB}{\ogonek{ }} \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} \DeclareUnicodeCharacter{2013}{--} \DeclareUnicodeCharacter{2014}{---} \DeclareUnicodeCharacter{2018}{\quoteleft} \DeclareUnicodeCharacter{2019}{\quoteright} \DeclareUnicodeCharacter{201A}{\quotesinglbase} \DeclareUnicodeCharacter{201C}{\quotedblleft} \DeclareUnicodeCharacter{201D}{\quotedblright} \DeclareUnicodeCharacter{201E}{\quotedblbase} \DeclareUnicodeCharacter{2022}{\bullet} \DeclareUnicodeCharacter{2026}{\dots} \DeclareUnicodeCharacter{2039}{\guilsinglleft} \DeclareUnicodeCharacter{203A}{\guilsinglright} \DeclareUnicodeCharacter{20AC}{\euro} \DeclareUnicodeCharacter{2192}{\expansion} \DeclareUnicodeCharacter{21D2}{\result} \DeclareUnicodeCharacter{2212}{\minus} \DeclareUnicodeCharacter{2217}{\point} \DeclareUnicodeCharacter{2261}{\equiv} }% end of \utfeightchardefs % US-ASCII character definitions. \def\asciichardefs{% nothing need be done \relax } % Make non-ASCII characters printable again for compatibility with % existing Texinfo documents that may use them, even without declaring a % document encoding. % \setnonasciicharscatcode \other \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 \pageheight = \vsize % \hsize = #2\relax \outerhsize = \hsize \advance\outerhsize by 0.5in \pagewidth = \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 \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 \hfuzz = 1pt \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 \hfuzz = 1pt \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 \hfuzz = 1pt \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 \hfuzz = 1.2pt \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 % \dimen2 = \hsize \advance\dimen2 by \normaloffset % \internalpagesizes{#1}{\hsize}% {\voffset}{\normaloffset}% {\bindingoffset}{44pt}% {\dimen0}{\dimen2}% }} % Set default to letter. % \letterpaper \message{and turning on texinfo input format.} % 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 \catcode`\~=\other \catcode`\^=\other \catcode`\_=\other \catcode`\|=\other \catcode`\<=\other \catcode`\>=\other \catcode`\+=\other \catcode`\$=\other \def\normaldoublequote{"} \def\normaltilde{~} \def\normalcaret{^} \def\normalunderscore{_} \def\normalverticalbar{|} \def\normalless{<} \def\normalgreater{>} \def\normalplus{+} \def\normaldollar{$}%$ font-lock fix % 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} % Turn off all special characters except @ % (and those which the user can use as if they were ordinary). % 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~{{\tt\char126}} \chardef\hat=`\^ \catcode`\^=\active \def^{{\tt \hat}} \catcode`\_=\active \def_{\ifusingtt\normalunderscore\_} \let\realunder=_ % Subroutine for the previous macro. \def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } \catcode`\|=\active \def|{{\tt\char124}} \chardef \less=`\< \catcode`\<=\active \def<{{\tt \less}} \chardef \gtr=`\> \catcode`\>=\active \def>{{\tt \gtr}} \catcode`\+=\active \def+{{\tt \char 43}} \catcode`\$=\active \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix % 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 \everyjob (or @setfilename) turn them on. % \otherifyactive is called near the end of this file. \def\otherifyactive{\catcode`+=\other \catcode`\_=\other} % 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=`\\ \global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work % \realbackslash is an actual character `\' with catcode other, and % \doublebackslash is two of them (for the pdf outlines). {\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}} % In texinfo, backslash is an active character; it prints the backslash % in fixed width font. \catcode`\\=\active @def@normalbackslash{{@tt@backslashcurfont}} % On startup, @fixbackslash assigns: % @let \ = @normalbackslash % \rawbackslash defines an active \ to do \backslashcurfont. % \otherbackslash defines an active \ to be a literal `\' character with % catcode other. @gdef@rawbackslash{@let\=@backslashcurfont} @gdef@otherbackslash{@let\=@realbackslash} % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of % the literal character `\'. % @def@normalturnoffactive{% @let\=@normalbackslash @let"=@normaldoublequote @let~=@normaltilde @let^=@normalcaret @let_=@normalunderscore @let|=@normalverticalbar @let<=@normalless @let>=@normalgreater @let+=@normalplus @let$=@normaldollar %$ font-lock fix @markupsetuplqdefault @markupsetuprqdefault @unsepspaces } % Make _ and + \other characters, temporarily. % This is canceled by @fixbackslash. @otherifyactive % 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. % @gdef@eatinput input texinfo{@fixbackslash} @global@let\ = @eatinput % On the other hand, perhaps the file did not have a `\input texinfo'. Then % the first `\' in the file would cause an error. This macro tries to fix % that, assuming it is called before the first `\' could plausibly occur. % Also turn back on active characters that might appear in the input % file name, in case not using a pre-dumped format. % @gdef@fixbackslash{% @ifx\@eatinput @let\ = @normalbackslash @fi @catcode`+=@active @catcode`@_=@active } % Say @foo, not \foo, in error messages. @escapechar = `@@ % These look ok in all fonts, so just make them not special. @catcode`@& = @other @catcode`@# = @other @catcode`@% = @other @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 'write-file-hooks 'time-stamp) @c page-delimiter: "^\\\\message" @c time-stamp-start: "def\\\\texinfoversion{" @c time-stamp-format: "%:y-%02m-%02d.%02H" @c time-stamp-end: "}" @c End: @c vim:sw=2: @ignore arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 @end ignore wanderlust-wanderlust-912c443/doc/txi-en.tex000066400000000000000000000043501262320455600210450ustar00rootroot00000000000000% English non-translation 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 defaults. % $Id$ % % Copyright (C) 1999, 2007 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 . \gdef\putwordAppendix{Appendix} \gdef\putwordChapter{Chapter} \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-912c443/doc/txi-ja.tex000066400000000000000000000245241262320455600210420ustar00rootroot00000000000000%% TeX macros to handle Japanese texinfo files %% %% 92.7.8 modified for Mule Ver.0.9.5 by K.Handa %% To detect type of jTeX and its version, the method %% posted by Takafumi SAKURAI is used. %% 92.9.30 modified for Mule Ver.0.9.6 by K.Handa %% For unknown reason, \newif\ifNTTOLD should be before %% \ifNTT. %% 93.4.29 modified for Mule Ver.0.9.7 by N.Hikichi %% 95.10.6 modified for texinfo 2.145 by K.Handa %% 95.10.13 modified by J.Sato %% Support many Japanese oriented phrases (reference, etc) %% 95.10.14 modified by K.Handa %% Bug for handling index fixed. %% 96.1.16 modified by J.Sato %% index with [] of @deffn. %% 99.6.27 modified by Moimoi %% for texinfo 1999-05-25.6 %% 2000.2.23 modified by Moimoi %% for texinfo.tex 1999-09-25.10 %% 2000.4.11 modified by Moimoi %% for texinfo.tex 1999-09-25.10 %% fixed for jTeX/pTeX/MulTeX %% 2010.06.02 modified by Shoichi Fukusaka %% for texinfo.tex 2005-01-30.17 %% omitted support for old NTT-jTeX/MulTex %% improve macros %% 2010.06.03 modified by Shoichi Fukusaka %% for texinfo.tex 2010-05.22.17 modified version %% minimize re-define macro %% 2010.06.03a modified by Shoichi Fukusaka %% for texinfo.tex 2010-05.22.17 modified version %% output \special for dvipdfmx to generate pdf bookmark %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% 92.7.8 by K.Handa \newif\ifNTT \ifx\gtfam\undefined \NTTtrue \else \NTTfalse \fi %% TeX macros to handle Japanese texinfo files %% 92/05/24 merged jtexinfo.tex (by H. Isozaki and N. Hikichi) into this %% Created by Satoru Tomura (tomura@etl.go.jp) \def\texinfoJPversion{5} \ifNTT \message{txi-ja (NTT JTeX) package [Version \texinfoJPversion]:} \else \message{txi-ja (ASCII pTeX) package [Version \texinfoJPversion]:} \fi \message{} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Set up fixed words for Japanese. \gdef\putwordAppendix{付録} \gdef\putwordChapter{ç« } \gdef\putwordfile{ファイル} \gdef\putwordin{in} \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{p.\gobble} \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{関数} \def\today{\number\year å¹´ \number\month 月 \number\day æ—¥} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % æ—¥æœ¬èªžçµ„ã®æ®µè½ã‚¤ãƒ³ãƒ‡ãƒ³ãƒˆã®ãƒ‡ãƒ•ォルトを設定 \global\defaultparindent = 1em \global\def\suppressfirstparagraphindent{\relax} % 日本人好ãã®ã‚®ãƒƒã‚·ãƒªè©°ã¾ã£ãŸç´™ \global\def\afourpaperj{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt \textleading = 12pt % \internalpagesizes{248mm}{170mm}% {\voffset}{-6mm}% {\bindingoffset}{8mm}% {297mm}{210mm}% % \tolerance = 750 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = 5mm }} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Utility routines. \def\csdef#1{\expandafter\def\csname#1\endcsname} \gdef\addcsbefore#1#2{% \cslet{orig#1}{#1}% \csdef{addcs#1}{#2}% \csdef{#1}{% \cslet{addcs}{addcs#1}% \futurelet\orig\addcsbeforeyyy\expandafter\empty\csname orig#1\endcsname } } \gdef\addcsbeforeyyy{\addcs\orig} \gdef\addcsafter#1#2{% \cslet{orig#1}{#1}% \csdef{addcs#1}{#2}% \csdef{#1}{% \cslet{addcs}{addcs#1}% \futurelet\orig\addcsafteryyy\expandafter\empty\csname orig#1\endcsname } } \gdef\addcsafteryyy{\orig\addcs} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% 日本語フォント \def\jafont{% \ifNTT% \let\next=\jTeXjafont% \else% \let\next=\pTeXjafont% \fi% \next} \def\jTeXjafont#1#2#3#4{% \def\tempa{#2} \def\tempb{mc} \ifx\tempa\tempb% mc \expandafter\gjfont\csname#1\endcsname=dm#3 scaled #4% \else% gt \expandafter\gjfont\csname#1\endcsname=dg#3 scaled #4% \fi% } \def\pTeXjafont#1#2#3#4{% \def\tempa{#2} \def\tempb{mc} \ifx\tempa\tempb% mc \global\expandafter\font\csname#1\endcsname=min#3 scaled #4% \else% gt \global\expandafter\font\csname#1\endcsname=goth#3 scaled #4% \fi } % % 日本語フォントã®å®šç¾© % % Text fonts (11.2pt, magstep1). \jafont{textmc}{mc}{10}{\mainmagstep} \jafont{textgt}{gt}{10}{\mainmagstep} % Fonts for indices, footnotes, small examples (9pt). \jafont{smallmc}{mc}{9}{1000} \jafont{smallgt}{gt}{9}{1000} % Fonts for small examples (8pt). \jafont{smallermc}{mc}{8}{1000} \jafont{smallergt}{gt}{8}{1000} % Fonts for title page (20.4pt): \jafont{titlemc}{mc}{10}{\magstep4} % Chapter (and unnumbered) fonts (17.28pt). \jafont{chapmc}{mc}{10}{\magstep3} \jafont{chapgt}{gt}{10}{\magstep3} % Section fonts (14.4pt). \jafont{secmc}{mc}{10}{\magstep2} \jafont{secgt}{gt}{10}{\magstep2} % Subsection fonts (13.15pt). \jafont{ssecmc}{mc}{10}{1315} \jafont{ssecgt}{gt}{10}{1315} % Reduced fonts for @acro in text (10pt). \jafont{reducedmc}{mc}{10}{1000} \jafont{reducedgt}{gt}{10}{1000} % Fonts for short table of contents. (12pt) \jafont{shortcontmc}{mc}{10}{\magstep1} \jafont{shortcontgt}{gt}{10}{\magstep1} % 95.11.2 by K.Handa % Reduce Overfull/Underfull \hbox by relaxing these glues. \ifNTT \global\jintercharskip=0pt plus 0.5pt minus -0.2pt \global\jasciikanjiskip=2.28854pt plus 0.5pt minus -0.2pt \fi %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def\syncjfont#1#2{\addcsafter{#1}{\csname #2\endcsname}} \def\addjfonts#1#2{\addcsafter{#1fonts}{\cslet{tenmc}{#2mc}\cslet{tengt}{#2gt}}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \globaldefs = 1 \syncjfont{rm}{tenmc} \syncjfont{bf}{tengt} \syncjfont{sl}{tengt} \syncjfont{authorrm}{secmc} \syncjfont{authortt}{secgt} \addjfonts{text}{text} \addjfonts{title}{title} \addjfonts{chap}{chap} \addjfonts{sec}{sec} \addjfonts{subsec}{ssec} \addjfonts{small}{small} \addjfonts{smaller}{smaller} \addjfonts{reduced}{reduced} \let\subsubsecfonts = \subsecfonts \let\smallexamplefonts = \smallfonts \textfonts \rm \globaldefs = 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % æ—¥æœ¬èªžè¡¨è¨˜ã®æ”¹å–„ % 1. ヘッドã®ç« ã®è¡¨è¨˜ % 2. See 訳語ã«åˆã‚ã›ã¦å‹•詞ã®å¾Œç½® % 3. クロスレファレンスã®è¡¨è¨˜ % 4. @dfn ã®è¡¨è¨˜ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 1. ヘッドã®ç« ã®è¡¨è¨˜ \gdef\thischapterspace{\hskip \SETthischapterspace em} \set thischapterspace 1 \gdef\printheadingappendix#1#2{\putwordAppendix{}#1\thischapterspace#2} \gdef\printheadingchapter#1#2{第#1\putwordChapter{}\thischapterspace#2} \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 } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 2. See 訳語ã«åˆã‚ã›ã¦å‹•詞ã®å¾Œç½® \global\def\inforefzzz #1,#2,#3,#4**{\putwordInfo{}\putwordfile{} \file{\ignorespaces #3{}}, ノード\samp{\ignorespaces#1{}}\putwordSee{}} \global\def\pxref#1{\xrefX[#1,,,,,,,]\putwordsee{}} \global\def\xref#1{\xrefX[#1,,,,,,,]\putwordSee{}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 3. クロスレファレンスã®è¡¨è¨˜ \global\def\xrefprintinmanual#1#2{\space \putwordin{} \cite{#1}} \global\def\xrefprintrefinmanual#1#2{\cite{#2}ã®``#1''\putwordsection{}} \global\def\xrefprintnodename#1#2#3{\def\temp{#1}\ifx\empty\temp\else#1\fi「#2ã€#3} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 4. @dfn ã®è¡¨è¨˜ \global\def\doublebracket#1{『#1ã€} \global\let\dfn=\doublebracket %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % for dvipdfmx \gdef\usedvipdfmx{ \ifnum 42146=\euc"A4A2 \special{pdf:tounicode EUC-UCS2}\else \special{pdf:tounicode 90ms-RKSJ-UCS2}\fi \global\pdfmakepagedesttrue \gdef\pdfdest name##1 xyz{% \iffinishedtitlepage\else \special{pdf:dest (name##1) [\@thispage /XYZ \@xpos \@ypos]}% \fi } \gdef\dopdfoutline##1##2##3##4{% \special{pdf:out [] ##2 << /Title (##1) /A << /S /GoTo /D (name##4) >> >> }% } \gdef\entryaddpdfoutline##1##2{% \global\cslet{orig##1}{##1}% \csdef{##1}####1####2####3####4{% \expandafter\empty\csname orig##1\endcsname{####1}{####2}{####3}{####4}% \dopdfoutline{####1}{##2}{####3}{####4}% } } \entryaddpdfoutline{numchapentry}{1} \entryaddpdfoutline{numsecentry}{2} \entryaddpdfoutline{numsubsecentry}{3} \entryaddpdfoutline{numsubsubsecentry}{4} \entryaddpdfoutline{unnchapentry}{1} \entryaddpdfoutline{unnsecentry}{2} \entryaddpdfoutline{unnsubsecentry}{3} \entryaddpdfoutline{unnsubsubsecentry}{4} \entryaddpdfoutline{appentry}{1} \let\appsecentry=\numsecentry \let\appsubsecentry=\numsubsecentry \let\appsubsubsecentry=\numsubsubsecentry \addcsbefore{contents}{% \special{pdf:docinfo << /Title (\thistitle) %/Subject (subject) /Creator (texinfo.tex+dvipdfmx) %/Author (author) %/Producer (producer) %/Keywords (keywords) >>% } } } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wanderlust-wanderlust-912c443/doc/version.tex000066400000000000000000000000331262320455600213200ustar00rootroot00000000000000\def\versionnumber{2.15.9} wanderlust-wanderlust-912c443/doc/version.texi000066400000000000000000000000241262320455600214710ustar00rootroot00000000000000@set VERSION 2.15.9 wanderlust-wanderlust-912c443/doc/wl-ja.texi000066400000000000000000012034161262320455600210310ustar00rootroot00000000000000\input texinfo @c -*-texinfo -*- coding: iso-2022-jp -*- @c %**start of header @setfilename wl-ja.info @settitle Wanderlust -- Yet Another Message Interface On Emacsen -- @c %**end of header @documentlanguage ja @documentencoding iso-2022-jp @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. $B$3$N%U%!%$%k$O(B Emacs $B$GF0$/%a!<%k(B/$B%K%e!<%94IM}%7%9%F%`(B Wanderlust $B$K4X$9(B $B$k@bL@=q$G$9!#(B 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}. $B$3$NHG$O(B Wanderlust version @value{VERSION} $B$KBP1~$7$^$9!#(B Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. $BCx:n8"I=<($H$3$N5v2DJ8$,$9$Y$F$NJ#@=$KB8:_$9$k8B$j!"$3$N@bL@=q$N$^$C$?$/(B $BF10l$NJ#@=$r:n$j!"G[I[$9$k$3$H$r5v2D$9$k!#(B @ignore Permission is granted to process this file through TeX and print the results, provided the printed document carries copying permission notice identical to this one except for the removal of this paragraph (this paragraph not being relevant to the printed manual). $B$3$NCJMn$,H$5$l$^$;$s(B)$B!#(B @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. $BF10lJ#@=$N>r7o$N2<$G!"$=$l$K$h$C$FF@$i$l$?7k2L$b$3$N5v2DJ8$NI=<($HF10l$N(B $B>r7o$N$b$H$GG[I[$9$k8B$j!"$3$N@bL@=q$N=$@5HG$NJ#@=$r$7!"G[I[$9$k$3$H$r5v(B $B2D$9$k!#(B Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions. $B>e5-$N=$@5HG$K4X$9$k>r7o$N2<$G!"$3$N@bL@=q$NK]Lu$NJ#@=$r:n$j!"G[I[$9$k$3(B $B$H$r5v2D$9$k!#(B @end ifinfo @titlepage @sp 10 @title Wanderlust $B%f!<%6%^%K%e%"%k(B @subtitle Yet another message interface on Emacsen @subtitle for Wanderlust version @value{VERSION} @author $B;{@>M50l(B @author $B1|@>F#OB(B @author $BBr7o$N2<$G!"$=$l$K$h$C$FF@$i$l$?7k2L$r$3$N5v2DJ8$NI=<($HF10l$N(B $B>r7o$N$b$H$GG[I[$9$k8B$j!"$3$N@bL@=q$N=$@5HG$NJ#@=$r$7!"G[I[$9$k$3$H$r5v(B $B2D$9$k!#(B Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions. $B>e5-$N=$@5HG$K4X$9$k>r7o$N2<$G!"$3$N@bL@=q$NK]Lu$NJ#@=$r:n$j!"G[I[$9$k$3(B $B$H$r5v2D$9$k!#(B @end titlepage @ifinfo @node Top, Introduction, (dir), (dir) @top Wanderlust $B%f!<%6%^%K%e%"%k(B @flushright $B;{@>M50l(B $B1|@>F#OB(B $BBA[%U%)%k%@!#(B @item $BB?$$F|$b0B?4$N!"%^%k%A%"!<%+%$%PBP1~05=L%U%)%k%@!#(B @item $B%U%)%k%@Cf$N8E$$5-;v$r<+F0E*$K%"!<%+%$%V(B/$B:o=|$7$F@0M}$9$k(B expire $B5!G=!#(B @item $B<+F0%j%U%!%$%k!#(B @item $BDj7?%a%C%;!<%8$NAw?.$KJXMx$J%F%s%W%l!<%H5!G=!#(B @end itemize @section $BF0:n4D6-(B Wanderlust $B$O0J2<$N(B Emacsen $B$GF0:n$9$k$3$H$,3NG'$5$l$F$$$^$9!#(B @itemize @bullet @item Mule 2.3 based on Emacs 19.34 @item Emacs 20.2 $B0J9_(B @item XEmacs 20.4 $B0J9_(B @item Meadow 1.00 $B0J9_(B @item NTEmacs 20.4 $B0J9_(B @item PMMule @end itemize Wanderlust $B$+$iMxMQ$G$-$k$H3NG'$5$l$F$$$k(B IMAP $B%5!<%P$O0J2<$NDL$j$G$9!#(B @itemize @bullet @item UW imapd 4.1$B!A(B4.7, 4.7a, 4.7b, 4.7c, 2000 $B0J9_(B @item Cyrus imapd 1.4, 1.5.19, 1.6.22$B!A(B1.6.24, 2.0.5 $B0J9_(B @item Courier-IMAP 1.3.2 $B0J9_(B @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 $B$+$iMxMQ$G$-$k$H3NG'$5$l$F$$$k(B LDAP $B%5!<%P$O0J2<$NDL$j$G$9!#(B @itemize @bullet @item OpenLDAP 2.0.6 $B0J9_(B @end itemize @node Start Me Up, Folders, Introduction, Top @chapter Wanderlust $B$r5/F0$9$k(B @cindex Start up Wanderlust $B$r5/F0$9$k$^$G$KI,MW$Jl=j$K$"$k$b$N$r;HMQ$7$F$/$@$5$$!#(B SEMI $B$O(B SEMI-EPG $B$H$$$&%Q%C%1!<%8L>$K$J$j$^$9!#(B @example @group APEL: @uref{https://github.com/wanderlust/apel} FLIM: @uref{https://github.com/wanderlust/flim} SEMI-EPG: @uref{https://github.com/wanderlust/semi} @end group @end example $B%*%j%8%J%k$N(B APEL, FLIM, SEMI $B$O0J2<$N>l=j$+$i%@%&%s%m!<%I$G$-$^$9!#(B @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, FLIM, SEMI[-EPG] $B$N=g$K%$%s%9%H!<%k$7$F$/$@$5$$!#(B $B4pK\E*$K$9$Y$F(B @samp{make install} $B$N\:Y$K$D$$$F$O!"3F%Q%C%1!<%8$KE:IU$5$l$F$$$k%I%-%e%a(B $B%s%H$r;2>H$7$F$/$@$5$$(B @footnote{Emacs 19.34 $B%Y!<%9$N(B Mule $B$r;H$C$F$$$k(B $B>l9g!"(B@* @uref{http://www.jpl.org/ftp/attic/INSTALL-SEMI-ja.html} $B$,;29M$K$J(B $B$k$+$b$7$l$^$;$s!#(B}$B!#(B $B?d>)$5$l$k(B APEL, FLIM, SEMI $B$N%P!<%8%g%s$NAH9g$;$O!"0J2<$NDL$j$G$9!#(B @itemize @minus @item APEL 10.8, FLIM 1.14.9, SEMI-EPG 1.14.7 @end itemize $B$=$NB>!"(BFLIM, SEMI $B$K$O$$$m$$$m$JJQ7A%P!<%8%g%s$,B8:_$7$^$9$,!"(B $B$=$l$i$N$$$:$l$bMxMQ2DG=$G$9!#(B $B4pK\E*$K:G?7HG$NAH9g$;$J$iF0:n$9$k$O$:$G$9!#(B $BNc$($P!"0J2<$NAH9g$;$GF0:n$9$k$3$H$,3NG'$5$l$F$$$^$9!#(B @itemize @minus @item APEL 10.6, SLIM 1.14.9, SEMI 1.14.5 @item APEL 10.6, CLIME 1.14.5, EMIKO 1.14.1 @end itemize APEL, FLIM $B$b$7$/$O(B SEMI $B$N%P!<%8%g%s%"%C%W$r9T$C$?>l9g$O!"(BWanderlust $B$r(B $B%$%s%9%H!<%k$7D>$7$F$/$@$5$$!#(B @node Download, Install, MIME Modules, Start Me Up @section $B%Q%C%1!<%8$NF~l=j$+$i%@%&%s%m!<%I$G$-$^$9!#(B $B0ll9g$O$=$l$r;H$$$^$9!#(B $Bl9g$O!"K\%Q%C%1!<%8$N(B @file{utils} $B%G%#%l%/%H%j$K$"$k(B @file{ssl.el} $B$r%$%s%9%H!<%k$9$kI,MW$,$"$j$^$9!#$J$*$+$D!"(BOpenSSL $B$K4^$^(B $B$l$k(B @command{openssl} $B$K%Q%9$,DL$C$F$$$kI,MW$,$"$j$^$9!#(B $B8el9g$O(B starttls $B%Q%C%1!<%8$r(B $B%$%s%9%H!<%k$9$kI,MW$,$"$j$^$9!#(B starttls $B%Q%C%1!<%8$O0J2<$N>l=j$+$iF~o$N%$%s%9%H!<%k(B @file{Makefile} $B$N(B @code{LISPDIR}, @code{EMACS} $B$N$"$?$j$rJT=8$7$^$9!#(B @code{LISPDIR} $B$K$O%Q%C%1!<%8$N%$%s%9%H!<%k@h!"(B @code{EMACS} $B$K$OMxMQ$9$k(B Emacs $B$N%3%^%s%IL>$r;XDj$7$^$9!#(B @example @group % make % make install @end group @end example @file{Makefile} $BCf$N(B @code{LISPDIR} $B$rJQ99$;$:!"(B $B$=$N$^$^(B(@samp{NONE} $B$N$^$^$G$b(B)$B%$%s%9%H!<%k$7$?>l9g!"(B $BE,Ev$J%$%s%9%H!<%k@h$r<+F0E*$K8!=P$7$^$9!#(B $Bl9g$O!"(Bcustom, APEL, FLIM, SEMI $B$N%$%s%9%H!<%k@h$r4D6-JQ?t(B @env{EMACSLOADPATH} $B$K2C$($k$+!"E83+%G%#%l%/%H(B $B%j$N(B @file{WL-CFG} $B$H$$$&%U%!%$%kCf$G(B@code{load-path} $B$rDL$7$F$*$/$HNI$$(B $B$G$7$g$&!#(B $B$^$?!"?7J9%U%)%k%@$rMxMQ$9$k>l9g$d!"(BBBDB $B$rMxMQ$9$k>l9g$K$O!"$=$l$>$l(B emacs-w3m$B!"(BBBDB $B$,%$%s%9%H!<%k$5$l$F$$$k%G%#%l%/%H%j$K(B @code{load-path} $B$rDL$7$F$*$/$HI,MW$J%b%8%e!<%k$,%P%$%H%3%s%Q%$%k(B/$B%$%s%9%H!<%k$5$l$^$9!#(B @xref{Shimbun Folder}, @xref{BBDB}. @subsection @file{WL-CFG} @file{WL-CFG} $B$H$$$&%U%!%$%k$,E83+%G%#%l%/%H%j$KB8:_$9$k$H!"(B $B%$%s%9%H!<%k;~$KFI$_9~$^$l$k$h$&$K$J$C$F$$$^$9!#(B $B%$%s%9%H!<%k$G(B SEMI $BEy$N(B @code{load-path} $B$N@_Dj$,I,MW$G$"$l$P!"(B @file{WL-CFG} $B$K@_Dj$7$F$/$@$5$$!#(B $B%$%s%9%H!<%k@h$O(B @file{Makefile} $BCf$N(B @code{LISPDIR} $B$G;XDj$7$^$9$,!"(B $Bo$K5/F0$G$-$k$h$&$K$J$j$^$9!#(B XEmacs $B$N(B package $B$H$7$F%$%s%9%H!<%k$9$k$K$O0J2<$N$h$&$K$7$^$9!#(B @example @group % vi Makefile % make package % make install-package @end group @end example package $B$N%G%#%l%/%H%j$O!"(BSEMI $B$r%$%s%9%H!<%k$7$F$"$l$P<+F08!=P$5$l$^$9!#(B (@file{Makefile} $BCf$N(B @code{PACKAGEDIR} $B$G$b@_Dj2D(B) @subsection $B%$%s%9%H!<%k$7$J$$$GMxMQ(B Wanderlust $B$O%P%$%H%3%s%Q%$%k!"%$%s%9%H!<%k$r$7$J$/$F$b!"(B@file{wl}, @file{elmo} $B$N%G%#%l%/%H%j$K(B @code{load-path} $B$r@_Dj$9$l$P5/F0$9$k(B $B$3$H$,$G$-$^$9!#Nc$($P(B @file{~/work} $B$K%Q%C%1!<%8$rE83+$7$?>l9g!"(B @file{~/.emacs} $B$K0J2<$N@_Dj$r$9$l$P5/F0$G$-$^$9!#(B @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 $B%^%K%e%"%k$K$D$$$F(B $B%^%K%e%"%k$O(B Info $B7A<0$G$9!#(B $B%$%s%9%H!<%k$9$k$K$O2<5-$rl9g$O<+F0E*$K(B Info $B%U%!%$%k$b(B $B%$%s%9%H!<%k$5$l$F$$$k$N$G!"$3$l$i$NA`:n$OI,MW$"$j$^$;$s!#(B $B$^$?!"2<5-$K$b%^%K%e%"%k$,$"$j$^$9!#(B @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} $B$N@_Dj(B @cindex Minimal Settings @cindex Settings @cindex Configuration @cindex .emacs @cindex .wl Wanderlust $B$N%Q%C%1!<%8$O!"Bg$-$/J,$1$FFs$D$N%b%8%e!<%k72$r4^$s$G$$$^$9!#(B @table @samp @item ELMO (elmo-*.el) $B$9$Y$F$r%U%)%k%@$K8+$;$k%b%8%e!<%k72$G$9!#(BWL $B$N%P%C%/%(%s%I$G$9!#(B @item WL (wl-*.el) Wanderlust $BK\BN$NF0:n$r7h$a$k%b%8%e!<%k72$G$9!#(BELMO $B$N%U%m%s%H%(%s%I$G$9!#(B @end table $B%f!<%6$O(B @code{elmo-}, @code{wl-} $B$G;O$^$kJQ?t$N@_Dj$rJQ$($k$3$H$K$h$C$F(B Wanderlust $B$NF0:n$r%+%9%?%^%$%:$G$-$^$9!#(B $B:GDc8BI,MW$J@_Dj$O0J2<$NDL$j$G$9!#(B @lisp @group ;; @r{autoload $B$N@_Dj(B} ;; @r{(XEmacs $B$N(B package $B$H$7$F%$%s%9%H!<%k$7$?>l9g$OI,MW$"$j$^$;$s(B)} (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{$B%"%$%3%s$rCV$/%G%#%l%/%H%j!#=i4|@_Dj$O(B Emacs $B8GM-$N%G%U%)%k%HCM!#(B} ;; @r{($B%G%U%)%k%H$NCM$,@5$7$1$l$PI,MW$"$j$^$;$s(B)} (setq wl-icon-directory "~/work/wl/etc") ;; @r{$B%a!<%k$rAw?.$9$k(B SMTP $B%5!<%P!#(B $B=i4|@_Dj$O(B @code{nil}$B!#(B} (setq wl-smtp-posting-server "your.smtp.example.com") ;; @r{$B%K%e!<%9Ej9FMQ$N(B NNTP $B%5!<%P!#(B $B=i4|@_Dj$O(B @code{nil}$B!#(B} (setq wl-nntp-posting-server "your.nntp.example.com") @end group @end lisp Wanderlust $B5/F08e!"(B@file{~/.wl} $B$,B8:_$9$l$P$=$l$r%m!<%I$7$^$9!#$7$?$,$C$F(B Wanderlust $B$K8GM-$N@_Dj$O(B @file{~/.wl} $B$K5-=R$7$F$*$/$H@0M}$7$d$9$$$G$7$g(B $B$&!#(Bface $B$N@_Dj$O(B @file{~/.emacs} $B$K=q$/$3$H$O$G$-$J$$$N$G(B@file{~/.wl} $B$K=q$$$F$/$@$5$$!#(B@xref{Highlights}. $B>e5-$N$&$A!"(B@code{autoload} $B$N@_Dj$O(B @file{~/.emacs} $B$K=q$/I,MW$,$"$j$^$9!#(B $B$=$l0J30$N@_Dj$O(B @file{~/.wl} $B$K5-=R$G$-$^$9!#(B @subsection @code{mail-user-agent} @cindex Default Mailer @cindex Mailer, Default @vindex mail-user-agent @findex compose-mail $B0J2<$N$h$&$J@_Dj$r(B @file{~/.emacs} $B$K$7$F$*$/$H!"(B@kbd{C-x m} (@code{compose-mail}) $B$K$h$C$F(B Wanderlust $B$N%I%i%U%H%b!<%I$r5/F0$9$k(B $B$h$&$K$J$j$^$9!#(BWanderlust $B$r(B Emacs $B>e$NI8=`%a!<%i$H$7$F;H$$$?$$>l9g$O@_(B $BDj$7$F$*$/$HNI$$$G$7$g$&!#$?$@$7!"$3$l$O(B @code{mail-user-agent} $B$NDj5A$,(B $B2DG=$J(B Emacsen $B$N>l9g$N$_M-8z$G$9!#(B @xref{Mail Methods, , ,emacs-ja, The Emacs Editor}. @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 $B9XFI$9$k%U%)%k%@$NDj5A(B @cindex Folder Definition @cindex .folders $B9XFI$9$k%U%)%k%@$r%U%!%$%k(B @file{~/.folders} $B$KDj5A$7$^$9!#(B @file{~/.folders} $B$K=q$+$l$?FbMF$,$=$N$^$^$"$J$?$N9XFI$9$k%U%)%k%@$H$J$j$^$9!#(B $B5/F0$7$?>uBV$G%U%)%k%@0lMw$N%P%C%U%!$+$i9XFI%U%)%k%@$rDI2C(B/$BJT=8$9$k$3$H(B $B$b2DG=$G$9$N$G!"$3$N9`$OFI$_Ht$P$7$F$b9=$$$^$;$s!#(B @xref{Folder Manager}. @file{~/.folders} $B$N=q$-J}$O$H$F$bC1=c$G$9!#$3$s$J46$8$G$9!#(B @example @group # # @r{@samp{#} $B$G;O$^$k9T$O%3%a%s%H!#(B} # @r{$B6u9T$OL5;k!#(B} # # @var{$B%U%)%k%@(B} "@var{$B$"$@L>(B}" # @r{($B$"$@L>$OL5$/$F$b$h$$(B)} # %inbox "$BO$G>\$7$/@bL@$7$^$9!#(B @samp{@var{$B%0%k!<%WL>(B}@{} $B$H(B @samp{@}} $B$G0O$^$l$?ItJ,$O0l$D$N%0%k!<%W$H(B $B$J$j$^$9!#$R$H$D$N%0%k!<%W$O%U%)%k%@%b!<%I$G$O3+JD$G$-$k%G%#%l%/%H%j$N$h(B $B$&$K8+$($^$9!#$$$/$D$+$N%U%)%k%@$r$^$H$a$F@0M}$9$k$N$KJXMx$G$9!#(B $BCm0U$9$Y$-$J$N$O!"(B@samp{@var{$B%0%k!<%WL>(B}@{} $B$H(B @samp{@}} $B$O#19T$r@jNN$7(B $B$F=q$/I,MW$,$"$k$3$H$G$9(B($B$3$l$O%Q!<%5$,%@%5$$$+$i$G$9(B)$B!#(B $B%0%k!<%W$K$O!"#2$D$Ne$NNc$N(B @samp{Emacsen} $B$N$h(B $B$&$KD>@\<+J,$G9%$-$J%U%)%k%@$r%0%k!<%W$H$7$FDj5A$9$k%?%$%W$G$9!#(B $B$b$&0l$D$O!">e$NNc$N(B @samp{+ /} $B$N$h$&$J(B @dfn{$B%"%/%;%9%0%k!<%W(B} $B$G$9!#$3$l(B $B$O!"$"$k%U%)%k%@$K4^$^$l$k%5%V%U%)%k%@A4$F$r$^$H$a$F0l$D$N%0%k!<%W$H$9$k$b$N(B $B$G$9!#(B($B$=$NF0:n$O%U%)%k%@$N%?%$%W$K$h$C$F0[$J$j$^$9!#Nc$($P(B @samp{+ /} $B$J$i(B MH $B$N%5%V%G%#%l%/%H%j$9$Y$F$,$R$H$D$N%0%k!<%W$H$J$j$^$9!#(B) $B$9$HNI$$$G$7$g$&!#(B @node Start Wanderlust, Overview, Folder Definition, Start Me Up @section Wanderlust $B$N5/F0(B @cindex Start Wanderlust $B%$%s%9%H!<%k!"$*$h$S@_Dj$,$&$^$/$$$C$F$$$l$P!"(B @example M-x wl @end example @noindent $B$G5/F0$G$-$^$9!#(B $B=i4|2=$N8e!"%U%)%k%@0lMw$rI=<($9$k%U%)%k%@%b!<%I$,8=$l$^$9!#(B @kbd{C-u M-x wl} $B$N$h$&$K(B prefix argument $B$D$-$GJN,$7$F5/F0$7$^$9!#(B @node Overview, , Start Wanderlust, Start Me Up @section $B354Q(B @cindex Overview Wanderlust $B$G$O4pK\E*$K!"$l$N>\:Y$K$D$$$F$O0J2<$N3F>O$G@bL@$7$^$9!#(B @table @samp @item $B%U%)%k%@%P%C%U%!(B $B%U%)%k%@$N0lMw$rI=<($7$^$9!#%U%)%k%@$rA*Br$7$F!"$=$N%U%)%k%@$N%5%^%j$KF~$k$3$H$,$G$-$^$9!#(B $B$^$?!"9XFI$9$k%U%)%k%@$rDI2C$7$?$j!"JT=8$9$k$3$H$b$G$-$^$9!#(B @item $B%5%^%j%P%C%U%!(B $B%U%)%k%@$K4^$^$l$k%a%C%;!<%8$N0lMw$rI=<($7$^$9!#(B $B$3$3$G$O%a%C%;!<%8$rA*Br$7$F$=$NFbMF$rI=<($7$?$j!"%a%C%;!<%8$KBP$7$FJV?.$r$9$k$3$H$,$G$-$^$9!#(B $B$^$?!"%a%C%;!<%8$r:o=|$7$?$j!"JL$N%U%)%k%@$K0\F0$5$;$?$j$9$k$3$H$,$G$-$^$9!#(B @item $B%a%C%;!<%8%P%C%U%!(B $B%a%C%;!<%8$NFbMF$rI=<($7$^$9!#%Q!<%H$rJ]B8$7$?$j!"30It%W%m%0%i%`$G3+$/$3$H$,$G$-$^$9!#(B @item $B%I%i%U%H%P%C%U%!(B $B%a%C%;!<%8$NJT=8$r9T$$$^$9!#(B @end table @node Folders, Folder, Start Me Up, Top @chapter Wanderlust $B$G07$($k%U%)%k%@$?$A(B @cindex Folder Type $B0J2<$G$O(B Wanderlust $B$G07$($k%U%)%k%@$K$D$$$F@bL@$7$^$9!#(B Wanderlust $B$O(B ELMO $B$N%$%s%?%U%'!<%9$rMxMQ$7$F$$$k$?$a!"(BELMO $B%b%8%e!<%k$,(B $B%5%]!<%H$7$F$$$l$P!"$I$s$J%U%)%k%@$G$bMxMQ$G$-$^$9!#(B $B%P!<%8%g%s(B @value{VERSION} $B8=:_!"MQ0U$5$l$F$$$k%U%)%k%@$O!"(BIMAP, NNTP, LocalDir(MH), Maildir, News Spool, Archive, POP, Shimbun, Search, Multi, Filter, Pipe, File, Access, Internal $B$N(B 15 $B(B} [@samp{:} @var{$B%f!<%6L>(B} [@samp{/} @var{$BG'>ZK!(B}]][@samp{@@} @var{$B%[%9%HL>(B}][@samp{:} @var{$B%]!<%HHV9f(B}][@samp{!}] @end group @end example @example @var{$BG'>ZK!(B}$B$K$O(B @code{login} ($B%(%s%3!<%I$7$F%Q%9%o!<%I$rAw?.(B)$B$+(B @code{cram-md5} (CRAM-MD5 $B$K$h$kG'>Z(B)$B$+(B @code{digest-md5} (DIGEST-MD5 $B$K$h$kG'>Z(B)$B$+(B @code{clear} ($B$^$?$O(B @code{nil}$B!#@8%Q%9%o!<%I$rAw?.(B) $B$N$$$:$l$+$r;XDj!#(B @end example default $BCM(B: @example $B%f!<%6L>(B -> $BJQ?t(B @code{elmo-imap4-default-user} $B$NCM!#(B $B=i4|@_Dj$O(B $B4D6-JQ?t(B @env{USER} $B$+!"(B@env{LOGNAME} $B$+!"(B @code{(user-login-name)} $B$NJV$jCM!#(B $BG'>ZK!(B -> $BJQ?t(B @code{elmo-imap4-default-authenticate-type} $B$NCM!#(B $B=i4|@_Dj$O(B @code{login}$B!#(B $B%[%9%HL>(B -> $BJQ?t(B @code{elmo-imap4-default-server} $B$NCM!#(B $B=i4|@_Dj$O(B @samp{localhost}$B!#(B $B%]!<%HHV9f(B-> $BJQ?t(B @code{elmo-imap4-default-port} $B$NCM!#(B $B=i4|@_Dj$O(B 143$B!#(B @end example $B%a%$%s$G;HMQ$9$k(B IMAP $B%5!<%P$rJQ?t(B @code{elmo-imap4-default-server} $B$K;XDj$9$k$H!"$$$A$$$A%U%)%k%@L>$K%[%9%HL>$r=q$+$:$K:Q$_$^$9!#Nc$($P%U%!(B $B%$%"%&%)!<%k$r1[$($J$1$l$P$J$i$J$$>l9g$G$b(B @samp{foo%imap@@gateway} $B$N$h(B $B$&$K;XDj$G$-$^$9!#(B @lisp @group ;; @r{$BNc(B: imap4.exaple.org $B$r%a%$%s$G;HMQ$9$k(B IMAP $B%5!<%P$H$7$F@_Dj(B} (setq elmo-imap4-default-server "imap4.example.org") @end group @end lisp $B%U%)%k%@L>$N:G8e$K(B @samp{!} $B$,IU$$$F$$$k$H!"(BSSL (Secure Socket Layer)$B$r(B $BMxMQ$7$F%3%M%/%7%g%s$rD%$j$^$9!#(B@samp{!!} $B$@$H!"(BSTARTTLS $B$K$h$j(BSSL $B%3%M(B $B%/%7%g%s$rD%$j$^$9!#(B $BJQ?t(B @code{elmo-imap4-default-stream-type} $B$NCM$,(B @code{ssl} $B$J$i!"(B @samp{!} $B$rIU$1$J$/$F$b(B SSL $B$r;H$$$^$9!#(B@code{starttls} $B$J$i(B @samp{!!} $B$r0UL#$7$^$9!#$3$l$i$N>l9g!"DL>o$N@\B3$r$9$k$K$O%U%)%k%@L>$N:G8e$K(B @samp{!direct} $B$rIU$1$^$9!#(B @lisp @group ;; @r{$BNc(B: SSL $B$rMxMQ$7$F%3%M%/%7%g%s$rD%$k(B} (setq elmo-imap4-default-stream-type 'ssl) @end group @end lisp $BG'>ZK!$H$7$F!"(B@code{login}$B!"(B@code{cram-md5} $B$b$7$/$O(B @code{digest-md5} $B$r;XDj$7$?>l9g!"%Q%9%o!<%I$r%(%s%3!<%I$7$FAw?.$7$^$9!#$?$@$7!"%5!<%PB&$,(B $B%Q%9%o!<%I$r%(%s%3!<%I$7$Fl9g$O!"3NG'$N8e!"(B @code{clear} ($B@8%Q%9%o!<%I$rAw$k(B) $B$K@ZBX$($^$9!#JQ?t(B @code{elmo-imap4-force-login} $B$,(B non-nil $B$J$i$P!"3NG'L5$7$K(B @code{clear} $B$K@ZBX$($^$9(B($B=i4|@_Dj$O(B @code{nil})$B!#(B @lisp ;; @r{$BNc(B: $B@8%Q%9%o!<%I$GG'>Z(B} (setq elmo-imap4-default-authenticate-type 'clear) @end lisp $BNc(B: @example @group %inbox -> IMAP $B$N%a!<%k%\%C%/%9!"(B"inbox" %#mh/inbox -> IMAP $B$N%a!<%k%\%C%/%9!"(B"#mh/inbox" %inbox:hoge -> IMAP $B$N%a!<%k%\%C%/%9!"(B"inbox" $B$X%f!<%6(B "hoge" $B$G%"%/%;%9!#(B %inbox:hoge/clear@@server1 -> server1 $B>e$N(B IMAP $B$N%a!<%k%\%C%/%9(B "inbox" $B$X(B $B%f!<%6(B "hoge" $B$G!"@8%Q%9%o!<%I$rAw$C$F(B('clear $B$G(B) $B%"%/%;%9!#(B @end group @end example @subsection $BF|K\8l%a!<%k%\%C%/%9L>$N07$$(B(Modified UTF7) @cindex Modified UTF7 @cindex UTF7 @cindex UTF8 @cindex Unicode @pindex Mule-UCS @pindex ucs-conv Emacs $B$,(B UTF-7 $B$KBP1~$7$F$$$l$P!$JQ?t(B @code{elmo-imap4-use-modified-utf7} $B$K(B non-nil $B$NCM$r@_Dj$9$l$P(B ($B%G%U%)%k(B $B%H$O(B Emacs 23 $B0J9_$G$O(B @code{t}$B!"$=$l0J30$G$O(B @code{nil})$B!"F|K\8l(B ($B$d!"(B $B$=$NB>$N1Q8l0J30$N8@8l(B) $B$G%a!<%k%\%C%/%9L>$r;XDj$9$k$3$H$,$G$-$^$9!#(B Emacs 23 $B0J9_$G$ODI2C$N%Q%C%1!<%8$OITMW$G$9!#(B $B$=$l0J30$N(B Emacsen $B$G$O!"(BMule-UCS $B$rJL$K%$%s%9%H!<%k$9$kI,MW$,$"$j$^$9!#(B Mule-UCS $B$O0J2<$N(B Emacsen $B$GF0:n$7$^$9!#(B @itemize @bullet @item Emacs 20.3 $B0J9_(B @item XEmacs 21.2.37 $B0J9_(B @end itemize Mule-UCS $B$O0J2<$+$i(B2004$BG/$N%9%J%C%W%7%g%C%H$,F~(B} [@samp{:} @var{$B%f!<%6L>(B}][@samp{@@} @var{$B%[%9%HL>(B}][@samp{:} @var{$B%]!<%HHV9f(B}][@samp{!}] @end group @end example default $BCM(B: @example $B%[%9%HL>(B -> $BJQ?t(B @code{elmo-nntp-default-server} $B$NCM!#=i4|@_Dj$O(B "localhost"$B!#(B $B%f!<%6L>(B -> $BJQ?t(B @code{elmo-nntp-default-user} $B$NCM!#=i4|@_Dj$O(B @code{nil}$B!#(B $B%]!<%HHV9f(B-> $BJQ?t(B @code{elmo-nntp-default-port} $B$NCM!#(B $B=i4|@_Dj$O(B 119$B!#(B @end example @var{$B%f!<%6L>(B}$B$,(B non-nil $B$N>l9g$O(B AUTHINFO $B$K$h$kG'>Z$r9T$J$$$^$9!#(B $B%U%)%k%@L>$N:G8e$K(B @samp{!} $B$,IU$$$F$$$k$H!"(BSSL $B$rMxMQ$7$F%3%M%/%7%g%s$rD%$j$^$9!#(B @samp{!!} $B$@$H!"(BSTARTTLS $B$K$h$j(B SSL $B%3%M%/%7%g%s$rD%$j$^$9!#(B $BJQ?t(B @code{elmo-nntp-default-stream-type} $B$NCM$,(B @code{ssl} $B$J$i!"(B@samp{!} $B$rIU$1(B $B$J$/$F$b(B SSL $B$r;H$$$^$9!#(B@code{starttls} $B$J$i(B @samp{!!} $B$r0UL#$7$^$9!#(B $B$3$l$i$N>l9g!"DL>o$N@\B3$r$9$k$K$O%U%)%k%@L>$N:G8e$K(B @samp{!direct} $B$rIU$1$^$9!#(B $BNc(B: @example @group -fj.rec.tv -> $B%K%e!<%9%0%k!<%W!"(B@samp{fj.rec.tv}$B!#(B -fj.rec.tv@@newsserver -> @samp{newsserver} $B>e$N%K%e!<%9%0%k!<%W!"(B@samp{fj.rec.tv}$B!#(B @end group @end example @node MH Folder, Maildir Folder, NNTP Folder, Folders @section MH $B%U%)%k%@(B @cindex @samp{+} @cindex MH Folder @cindex Folder, MH @pindex MH MH $B7A<0(B(1$B%U%!%$%k(B1$B%a!<%k(B)$B$GJ]B8$5$l$?%a!<%k$rFI$`$?$a$N%U%)%k%@$G$9!#(B $B=q<0(B: @example @samp{+} @var{$B%G%#%l%/%H%jL>(B} @end example @var{$B%G%#%l%/%H%jL>(B}$B$O!"DL>o!"JQ?t(B @code{elmo-localdir-folder-path} ($B=i4|@_Dj$O(B @file{~/Mail}) $B$+$i$NAjBP%Q%9$G$9$,!"(B @samp{/} $B$d(B @samp{~} $B$G;O$^$C$F$$$l$P@dBP%Q%9$H8+Pv$7$^$9(B ($B%I%i%$%V%l%?!<$bF1MM$G$9(B)$B!#(B $B%a%C%;!<%8$,J]B8$5$l$k%U%!%$%k$N%U%!%$%kL>$K$O!"%a%C%;!<%8HV9f$r;HMQ$7$^$9!#(B $BNc(B: @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 $B%U%)%k%@(B @cindex @samp{.} @cindex Maildir Folder @pindex Maildir @pindex qmail Maildir $B7A<0(B(1$B%U%!%$%k(B1$B%a!<%k(B)$B$GJ]B8$5$l$?%a!<%k$rFI$`$?$a$N%U%)%k%@$G$9!#(B $B=q<0(B: @example @samp{.} @var{$B%G%#%l%/%H%jL>(B} @end example @var{$B%G%#%l%/%H%jL>(B}$B$O!"DL>o!"JQ?t(B @code{elmo-maildir-folder-path} ($B=i4|(B $B@_Dj$O(B @file{~/Maildir}) $B$+$i$NAjBP%Q%9$G$9$,!"(B@samp{/} $B$d(B @samp{~} $B$G;O(B $B$^$C$F$$$l$P@dBP%Q%9$H8+Pv$7$^$9(B($B%I%i%$%V%l%?!<$bF1MM$G$9(B)$B!#(B Maildir $B$O!"(B@file{cur}, @file{new}, @file{tmp} $B$N%G%#%l%/%H%j$r4^$s$G$$(B $B$^$9!#2<$N(B @file{cur} $B%G%#%l%/%H%j$G$9!#;XDj%G%#%l%/%H%jD>2<$N(B @file{new} $B%G%#%l%/%H%j$KB8:_$9$k(B $B%a%C%;!<%8%U%!%$%k$O!"%"%/%;%9;~$K(B @file{cur} $B%G%#%l%/%H%j$X0\F0$5$l$^$9!#(B $B$^$?!"(B@file{tmp} $B%G%#%l%/%H%j$K$"$j!"$+$D(B 36 $B;~4V0J>e%"%/%;%9$,L5$$%a%C(B $B%;!<%8%U%!%$%k$O:o=|$5$l$^$9!#(B $B$3$NF0:n$O(B @uref{http://cr.yp.to/proto/maildir.html} $B$K=>$C$F$$$^$9!#(B@* ($BF|K\8lLu$O(B @uref{http://man.qmail.jp/jman5/maildir.html}) $BNc(B: @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 $B%U%)%k%@(B @cindex @samp{=} @cindex News spool Folder @pindex gnspool Mew/IM $B$,Ds>'$9$k!"%m!<%+%k$KJ]B8$5$l$?%K%e!<%95-;v$rFI$_=q$-$9$k$?$a$N(B $B%U%)%k%@$G$9!#(BNNTP $B7PM3$G$O$J$/!"(B@command{gnspool} $B$J$I$r;H$C$Fl9g$K$=$N%9%W!<%k$rD>@\FI$`!"$H$$$&;H$$J}$bA[Dj$7$F$$$^$9!#(B $B=q<0(B: @example @samp{=} @var{$B%G%#%l%/%H%jL>(B} @end example @var{$B%G%#%l%/%H%jL>(B}$B$O!"JQ?t(B @code{elmo-localnews-folder-path} ($B=i4|@_Dj(B $B$O(B @file{~/News})$B$G;XDj$7$?%G%#%l%/%H%j$N%5%V%G%#%l%/%H%j$r;X$7$^$9!#%G%#(B $B%l%/%H%j$N6h@Z$j$O(B @samp{.} $B$G$b2D$G$9!#(B $BNc(B: @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 $B%"!<%+%$%V%U%)%k%@(B @cindex Archive Folder @cindex @samp{$} @c @pindex ange-ftp Info-ZIP $B$d(B LHA $B$J$I$G05=L$5$l$?%"!<%+%$%V%U%!%$%k$r0l$D$N%U%)%k%@$H$7(B $B$F07$$$^$9!#(B $B=q<0(B: @example @group @samp{$} @var{$B%G%#%l%/%H%jL>(B} [@samp{;} @var{$B%"!<%+%$%P%?%$%W(B} @samp{;} @var{$B%W%l%U%#%/%9(B}] @end group @end example @var{$B%G%#%l%/%H%jL>(B}$B$O!"DL>o!"JQ?t(B @code{elmo-archive-folder-path} ($B=i4|@_Dj$O(B @file{~/Mail}) $B$+$i$NAjBP%Q%9$G$9$,!"(B @samp{/} $B$d(B @samp{~} $B$G;O$^$C$F$$$l$P@dBP%Q%9$H8+Pv$7$^$9(B ($B%I%i%$%V%l%?!<$b(B OK)$B!#(B ange-ftp $BI=5-$b(B ange-ftp, efs $B$,;H$($k4D6-$G$O(B OK $B$G$9!#(B $B%U%)%k%@$Ne=R$N%G%#%l%/%H%j$K$"$k(B @code{elmo-archive-basename}($B=i4|CM$O(B @file{elmo-archive})$B$K$J$j$^$9!#(B $B$?$@$7!"%G%#%l%/%H%j$G$J$/%U%!%$%k$G$"$C$?>l9g!"$=$N%U%!%$%k$r%U%)%k%@(B $B$H8+Pv$7$^$9!#(B $B3HD%;R$O%"!<%+%$%PKh$K<+F0E*$K(B($BF0E*$K(B)$BA*Br$5$l$^$9!#(B @var{$B%"!<%+%$%P%?%$%W(B}$B$r>JN,$7$?>l9g!"JQ?t(B @code{elmo-archive-default-type} ($B=i4|@_Dj$O(B @code{zip})$B$,;2>H$5$l$^$9!#(B @var{$B%W%l%U%#%/%9(B}$B$O!"=q8K$,%G%#%l%/%H%j9=B$$r;}$C$F$$$k>l9g$K!"$=$N%G%#(B $B%l%/%H%jItJ,$r;XDj$7$^$9!#$3$l$Ol9g!"(B@file{msend.tar.gz} $B$O(B @file{spool/1} $B$N(B $B$h$&$J9=B$$J$N$G!"(B@samp{spool} $B$r;XDj$7$^$9!#(B $BNc(B: @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} $B>e$N(B @file{~/bar/elmo-archive.zoo} $d:/msend.tar.gz;tgz;spool -> @file{d:/msend.tar.gz} $ml;zip/ -> @file{~/Mail/ml} $B0J2<$N%"!<%+%$%V%U%)%k%@$+$i$J$k(B $B%"%/%;%9%0%k!<%W(B @end group @end example @menu * Archiver:: $BBP1~(B($B2DG=(B)$B%"!<%+%$%P(B * Archive Tips:: TIPS * Archive Vars:: $B%+%9%?%^%$%:JQ?t(B @end menu @node Archiver, Archive Tips, Archive Folder, Archive Folder @subsection $B%"!<%+%$%V%U%)%k%@$,BP1~$7$F$$$k(B($BBP1~2DG=$J(B)$B%"!<%+%$%P(B @cindex Archiver @pindex LHA @pindex Info-ZIP @pindex UNZIP @pindex ZOO @pindex RAR @pindex TAR @pindex GNU TAR $B%G%U%)%k%H$G0J2<$N%"!<%+%$%P$KBP1~$7$^$9!#(B @example @group LHA, Info-ZIP/UNZIP, ZOO, RAR ;; $B%U%k%9%Z%C%/(B GNU TAR(@code{tgz}, @code{tar}) ;; $B%G%U%)%k%H$G$O1\Mw@lMQ(B @end group @end example $BJ#?t%U%!%$%k$r#1%W%m%;%9$G0l$D$N=q8K$X$^$H$a$k$3$H$,$G$-$k%"!<%+%$%P$G$"(B $B$l$P!"I,MW$JJQ?t$rDI2CDj5A$9$k$@$1$G;H$($k2DG=@-$,$"$j$^$9(B(ARJ/UNARJ, ARC $B$O!"C$9(B (@code{mv}) $B$3$H$,$G$-$J$$E@$G??LLL\$K%5%]!<%H$7$F$$$^$;$s(B)$B!#J#?t%U%!%$(B $B%k$r0l$D$K$^$H$a$i$l$J$$E@$G(B @command{gzip}, @command{bzip}, @command{bzip2} $B$O;H$($^$;$s!#I8=`=PNO$X2rE`$G$-$J$$%"!<%+%$%P$K$bI8=`$G(B $B$OBP1~$7$^$;$s!#(B @subsection $B3F(B OS $B$G$N%"!<%+%$%P$K4X$9$kFC5-;v9`(B $B%U%k%9%Z%C%/$GFI$_=q$-2DG=$J$3$H$r3NG'$7$F$$$k%"!<%+%$%P$O!"0J2<$N$H$*(B $B$j$G$9(B(@samp{*} $B0u$N$b$N$O=hM}B.EY$J$I$NE@$G:G$bE,$7$F$$$k$b$N(B)$B!#(B @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)$BHG(B gzip 1.2.4 (18 Aug 93) + bzip2 $B%Q%C%A(B(by $BHSED$5$s(B) [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 $B$OIT2D(B) 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 $B"((B LHA $B$K4X$9$kCm0U(B OS/2 $B$N>l9g!"(BPeter Fitzsimmons $B;a:n$N(B LH/2 $B$K$OBP1~$7$^$;$s!#J?>>HG$r$*(B $B;H$$$/$@$5$$!#(B Win32 $B$G$O(B DOS $BHG$G$J$/!"(BLHa32 $B$G$J$$$HF0$+$J$$$H$N$3$H$G$9!#(B $B"((B GNU tar $B$K4X$9$kCm0U(B GNU tar $B$O=q8K$+$i$N:o=|$KLdBj$,$"$k$b$N$,B?$$$N$G!"FC$KCm0U$7$F$/$@$5$$!#(B $B=q8K$,GK2u$5$l$k4m81@-$,9b$$$N$G!"%U%k%9%Z%C%/$GFI$_=q$-$9$kA0$K(B @option{--delete} @option{-f} $B$r=e5-(B $B$N$b$N$G$O:#$N$H$3$mLdBj$OJs9p$5$l$F$$$^$;$s!#(B @node Archive Tips, Archive Vars, Archiver, Archive Folder @subsection TIPS @cindex Archive Tips $B2wE,$K0\9T$9$k$K$O!"(B@code{wl-summary-archive} $B$rl9g$O!"(B $BJQ?t(B @code{elmo-archive-treat-file} $B$r(B non-nil $B$K@_Dj$9$kI,MW$,$"$j$^$9!#(B $B$J$*!"(BOS/2 $B>e$G$N%F%9%H$G$O!"(BMule2.3(19.28) $B$H(B Emacs20.2 $B$G$O=hM}B.EY$K(B $B05E]E*$J0c$$$,$"$j$^$9!#2wE,$K;H$&$K$O(B Emacs20 $B$r$*4+$a$7$^$9(B(re-search $B$NB.EY$NLdBj$@$H$9$k$H(B 19.3x $B0J>e$+$I$&$+$,6-$K$J$k$G$7$g$&(B)$B!#(B $B$^$?!"0l$D$N=q8K%U%!%$%k$,B?$/$N%U%!%$%k$r4^$s$G$$$k$H%"!<%+%$%P5/F0;~(B $B$N%*!<%P!<%X%C%I$,2CB.EYE*$KA}2C$9$k(B($BFC$K(B LHA $B$N>l9g(B)$B$?$a!"(B150 $BDLDxEY!"(B $B:GBg$G$b(B 200 $BDL$^$G$K$7$F$*$/$H!"%9%H%l%9$J$/FI$_=q$-$G$-$k$G$7$g$&!#(B $B$J$*!"EvA3$N$3$H$J$,$i(B @lisp @group (setq wl-fcc "$backup") (setq wl-trash-folder "$trash;lha") @end group @end lisp @noindent $B$b2DG=$G$9(B@t{:-)}$B!#(B @node Archive Vars, , Archive Tips, Archive Folder @subsection $B%"!<%+%$%V%U%)%k%@$K4X$9$kJQ?t(B @cindex Archive variables @table @code @item elmo-archive-default-type @vindex elmo-archive-default-type $B%G%U%)%k%H$N%"!<%+%$%P%?%$%W$r%7%s%\%k$G;XDj$7$^$9!#=i4|CM$O(B @code{zip} $B$G$9!#(B @item elmo-archive-@var{type}-method-alist @vindex elmo-archive-TYPE-method-alist $B%"!<%+%$%P$N(B @var{type} ($Be$H%;%C%H$G%U%k%9%Z%C%/(B 'cp ('cp-pipe) ;; @end group @end example @noindent $B$G$9!#3g8LFb$N$b$N$O!"L5$/$F$b9=$$$^$;$s(B($B$"$l$PM%@hE*$K;H$$$^$9(B)$B!#(B @item elmo-archive-suffix-alist @vindex elmo-archive-suffix-alist $B%"!<%+%$%P%?%$%W(B($B%7%s%\%k(B) $BKh$KBP1~$9$k=q8K$N3HD%;R$r5-=R$7$^$9!#(B @item elmo-archive-file-regexp-alist @vindex elmo-archive-file-regexp-alist $B=q8K$N%j%9%H1\Mw;~$N=PNO$+$i%U%!%$%kL>$ruBV$G$O(B)$B%"!<%+%$%P$r%7%'%k$r7PM3$;$:$K5/F0$7(B $B$^$9!#(Belisp $B%l%Y%k$G$N%3%^%s%IJ8;zNs$NAm%P%$%H?t$K$O@)8B$O$J$$$H$N$3$H$J(B $B$N$G!"B?$/$N%Q%i%a!<%?$r0lEY$KM?$($FF0$+$;$k$+$I$&$+$O(B OS $B%l%Y%k$NLdBj$K(B $B$J$j$^$9!#$3$l$O!"Nc$($P?tI4DLC10L$N%a%C%;!<%8$r0lEY$K>C5n$G$-$k$+$I$&$+(B $B$NLdBj!"$HFI$_BX$($F$/$@$5$$!#(B OS/2 $B$G$O%7%'%k$r2p$5$:$KH/9T$G$-$k%3%^%s%IJ8;zNs$O(B 8190 $B%P%$%H$^$G$J$N(B $B$G!"M>M5$r8+$F%G%U%)%k%H$r(B 8000 $B$K$7$F$$$^$9!#(BOS/2 REXX $B$d%7%'%k%9%/%j%W(B $B%H$J$I$r3z$^$9>l9g!"%7%'%k$N]$H$J$k%U%!%$%k$N%j%9%H$rI8=`F~NO$+$il9g!"(B1$B%W%m%;%9$G=hM}$9$k$3$H$,$G$-$^$9!#(B @end table @node POP Folder, Shimbun Folder, Archive Folder, Folders @section POP $B%U%)%k%@(B @cindex @samp{&} @cindex POP Folder @cindex RFC 1939 @cindex POP3 @cindex APOP RFC 1939 $B$G5,Dj$5$l$F$$$k(B POP3 $B$rMxMQ$7$F%a!<%k$rFI$`$?$a$N%U%)%k%@$G$9!#(B $B=q<0(B: @example @group @samp{&} [@var{$B%f!<%6L>(B}][@samp{/} @var{$BG'>ZK!(B}][@samp{:} @var{$BHV9f$N?6$jJ}(B}][@samp{@@} @var{$B%[%9%HL>(B}][@samp{:} @var{$B%]!<%HHV9f(B}][@samp{!}] @end group @end example @var{$BG'>ZK!(B}$B$K$O!"(B@samp{user} ($B@8%Q%9%o!<%I$rAw?.$7$FG'>Z(B) $B$H(B @samp{apop} (APOP $B$GG'>Z(B) $B$N(B 2 $B(B -> $BJQ?t(B @code{elmo-pop3-default-user} $B$NCM!#(B $B=i4|@_Dj$O(B $B4D6-JQ?t(B @env{USER} $B$+!"(B@env{LOGNAME} $B$+!"(B @code{(user-login-name)} $B$NJV$jCM!#(B $BG'>ZK!(B -> $BJQ?t(B @code{elmo-pop3-default-authenticate-type} $B$NCM!#(B $B=i4|@_Dj$O(B "user"$B!#(B $BHV9f$N?6$jJ}(B-> $BJQ?t(B @code{elmo-pop3-default-use-uidl} $B$NCM$K$h$k!#(B t $B$J$i(B UIDL $B$rMQ$$$k!#=i4|@_Dj$O(B t$B!#(B $B%[%9%HL>(B -> $BJQ?t(B @code{elmo-pop3-default-server} $B$NCM!#(B $B=i4|@_Dj$O(B "localhost"$B!#(B $B%]!<%HHV9f(B -> $BJQ?t(B @code{elmo-pop3-default-port} $B$NCM!#(B $B=i4|@_Dj$O(B 110$B!#(B @end example $BNc(B: @example @group &hoge@@localhost -> localhost $B$X%f!<%6(B @samp{hoge} $B$G%"%/%;%9!#(B &hoge@@popserver:109 -> $B%[%9%H(B @samp{popserver} $B$N%]!<%H(B 109 $BHV$X(B $B%f!<%6(B @samp{hoge} $B$G%"%/%;%9!#(B @end group @end example APOP $B$rMxMQ$9$k$K$O!"(B@file{md5.el} $B$,I,MW$G$9!#(B(XEmacs $B$G$OI,MW$"$j$^$;$s!#(B ) @file{md5.el} $B$O(B $BK\%Q%C%1!<%8$N(B @file{utils/sasl/lisp/} $B$+(B Emacs/W3 $B%Q%C(B $B%1!<%8(B (@uref{http://www.cs.indiana.edu/elisp/w3/docs.html})$B!"$^$?$O(B LCD archive $B$+$iF~$N:G8e$K(B @samp{!} $B$,IU$$$F$$$k$H!"(BSSL $B$rMxMQ$7$F%3%M%/%7%g%s$rD%$j$^$9!#(B $BJQ?t(B @code{elmo-pop3-default-stream-type} $B$NCM$,(B @code{ssl} $B$J$i!"(B@samp{!} $B$rIU$1(B $B$J$/$F$b(B SSL $B$r;H$$$^$9!#(B@code{starttls} $B$J$i(B @samp{!!} $B$r0UL#$7$^$9!#(B $B$3$l$i$N>l9g!"DL>o$N@\B3$r$9$k$K$O%U%)%k%@L>$N:G8e$K(B@samp{!direct} $B$rIU$1$^$9!#(B @node Shimbun Folder, RSS Folder, POP Folder, Folders @section $B?7J9%U%)%k%@(B @cindex @samp{@@} @cindex Shimbun Folder @cindex Folder, Shimbun @cindex Folder, Web @pindex w3m @pindex emacs-w3m emacs-w3m (@uref{http://emacs-w3m.namazu.org/}) $B$rMQ$$$F(B WWW $B>e$N?7J9$d%K%e!<%9%5%$%H!"%a!<%j%s%0%j%9%H%"!<%+%$%V$J$I$r(B $BFI$`$?$a$N%U%)%k%@$G$9!#(B w3m $B$*$h$S(B emacs-w3m $B$,%$%s%9%H!<%k$5$l$F$$$kI,MW$,$"$j$^$9!#(B $B=q<0(B: @example @group @samp{@@} @var{$B%b%8%e!<%kL>(B} @samp{.} @var{$B%U%)%k%@L>(B} @end group @end example @var{$B%b%8%e!<%kL>(B}$B!"$*$h$S(B @var{$B%U%)%k%@L>(B} $B$KF~$kCM$K$D$$$F$O(B emacs-w3m $B$KIUB0$N(B @file{README.shimbun.ja} $B$r;2>H$7$F$/$@$5$$!#(B $BNc(B: @example @group @@airs.wl -> wanderlust ML $B%"!<%+%$%V(B ($B%b%8%e!<%k(B @file{sb-airs.el} $B;HMQ(B) @@asahi/ -> @file{sb-asahi.el} $B%b%8%e!<%k$K4^$^$l$k%U%)%k%@$N%"%/%;%9%0%k!<%W(B @end group @end example @subsection $B?7J9%U%)%k%@$K4X$9$kJQ?t(B @table @code @item elmo-shimbun-update-overview-folder-list @vindex elmo-shimbun-update-overview-folder-list $B=i4|@_Dj$O(B @code{all}$B!#%a%C%;!<%8$r%U%'%C%A$7$?$H$-$K(B overview $B$r99?7$9(B $B$k?7J9%U%)%k%@$r;XDj$7$^$9!#A4$F$N?7J9%U%)%k%@$G(B overview $B$r99?7$7$?$$>l(B $B9g$K$O!"(B@code{all} $B$r@_Dj$7$^$9!#%U%)%k%@L>$N@55,I=8=$+$i$J$k%j%9%H$r@_(B $BDj$9$k;v$G!"99?7$9$k%U%)%k%@$r8BDj$9$k;v$b=PMh$^$9!#(B $BNc(B: @example (setq elmo-shimbun-update-overview-folder-list '("^@@airs\\." "^@@namazu\\.")) @end example $B%5%^%j$NI=<($O!"<+F0E*$K99?7$5$l$^$9!#(B @end table @node RSS Folder, Search Folder, Shimbun Folder, Folders @section RSS $B%U%)%k%@(B @cindex RSS Folder @cindex Atom Folder RSS $B$d(B Atom $B%U%#!<%I$K4^$^$l$k%a%C%;!<%8$r1\Mw$9$k0Y$N%U%)%k%@$G$9!#(B $B=q<0(B: @example @samp{rss:} @var{RSS $B$^$?$O(B Atom $B$N(BURL} @end example $BNc(B: @example rss:https://github.com/wanderlust/wanderlust/commits/master.atom @end example $B%5%]!<%H$9$k(B RSS $B$d(B Atom $B$OA4$F<+F0E*$K07$o$l$^$9!#(B $B$h$j:Y$+$$@_Dj$,I,MW$J>l9g$O!"?7J9%U%)%k%@(B (@pxref{Shimbun Folder}) $B$r(B $B;H$C$F$/$@$5$$!#(B $B%a%C%;!<%8$N%-%c%C%7%e$O;}$?$J$$$N$G!"%a%C%;!<%8$O%U%#!<%I$+$iL5$/$J$k$H(B $B%U%)%k%@$+$i$bD>$A$K>C<:$7$^$9!#(B $BJ]B8$9$kI,MW$,$"$k>l9g$O%Q%$%W%U%)%k%@(B (@pxref{Pipe Folder}) $B$H(B $BAH$_9g$o$;$F$/$@$5$$!#(B @example |rss:http://lwn.net/headlines/newrss|+lwn @end example RSS $B$d(B Atom $B5Z$S(B OPML $B$r%"%/%;%9%0%k!<%W$H$7$F07$&$3$H$,$G$-!"(B $B$=$N>l9g!"4XO"$9$k%U%#!<%I$O%5%V%U%)%k%@Fb$K8=$l$^$9!#(B @node Search Folder, Multi Folder, RSS Folder, Folders @section $B8!:w%U%)%k%@(B @cindex Search Folder @cindex @samp{[} @cindex Folder, Search @cindex Folder, Text Search $B30It%W%m%0%i%`$rMQ$$$F!"8!:w<0$K%^%C%A$7$?%a%C%;!<%8$r=8$a$?2>A[E*$J%U%)(B $B%k%@$r9=@.$7$^$9!#(B $B=q<0(B: @example @group @samp{[} @var{$B8!:w<0(B} @samp{]} [ @var{$B8!:wBP>](B} [ @samp{!} @var{$B8!:wJ}<0(B} ] ] @end group @end example $B8!:w<0$H8!:wBP>]$N;XDjJ}K!$O!"8!:wJ}<0$K$h$C$F0[$J$j$^$9!#(B @subsection $BBP1~$7$F$$$k8!:wJ}<0(B $B%G%U%)%k%H$G$O!"0J2<$N8!:wJ}<0$KBP1~$7$F$$$^$9!#8!:wJ}<0$r>JN,$7$?>l9g$O!"(B @code{elmo-search-default-engine} $B$G;XDj$5$l$?8!:wJ}<0$,;HMQ$5$l$^$9!#(B @menu * namazu:: namazu * grep:: grep * mu:: mu * notmuch:: notmuch @end menu @node namazu, grep, Search Folder, Search Folder @subsection namazu @pindex namazu namazu (@uref{http://www.namazu.org/}) $B$r;H$C$F!"%$%s%G%C%/%9$KEPO?$5$l$?(B $BJ8=q$r8!:w$7$^$9!#(B $B8!:w<0$O!"(Bnamazu $B$N8!:w<0$G$9!#>\$7$/$O!"(Bnamazu $B$KIUB0$NJ8=q$r;2>H$7$F2<(B $B$5$$!#(B $B8!:wBP>]$K$O!";HMQ$9$k%$%s%G%C%/%9$r;XDj$7$^$9!#%$%s%G%C%/%9$N$"$k%G%#%l(B $B%/%H%j$N%Q%9$r$=$N$^$^;XDj$9$k$+!"0J2<$N@bL@$K$"$kJLL>$r;XDj$9$k;v$,=PMh(B $B$^$9!#%$%s%G%C%/%9$r>JN,$7$?>l9g$O!"(B @code{elmo-search-namazu-default-index-path} $B$G;XDj$5$l$?CM$,;HMQ$5$l$^$9!#(B $BNc(B: @example @group [wanderlust] -> $B%G%U%)%k%H$N%$%s%G%C%/%9$+$i(B "wanderlust" $B$K%^%C%A$9$k$b$N$rC5$9(B [semi flim]~/Mail/semi -> $B%G%#%l%/%H%j(B "~/Mail/semi" $B$K$"$k%$%s%G%C%/%9(B $B$+$i(B "semi flim" $B$rC5$9(B @end group @end example @c @subsection TIPS @subsubsection $BJ#?t%-!<%o!<%I$NF~NO(B $B%U%)%k%@L>F~NO;~$K6uGr$rF~NO$7$?$$>l9g!"(B@kbd{C-q @key{SPC}} $B$G$G$-$^$9!#(B @subsubsection $B%$%s%G%C%/%9$N%(%$%j%"%9L>(B $B%$%s%G%C%/%9$K$O%(%$%j%"%9L>(B($BJLL>(B)$B$rDj5A$G$-$^$9!#(B @example (setq elmo-search-namazu-index-alias-alist '(("cache" . "~/.elmo/cache") ("docs" . "~/documents"))) @end example $B$NMM$K@_Dj$9$k$3$H$K$h$j%$%s%G%C%/%9$NJLL>$rDj5A$G$-$^$9!#(B $B>e5-Nc$G$"$l$P!"(B @example [wanderlust]cache @end example $B$HF~NO$9$l$P!"(B@file{~/.elmo/cache} $B$K$"$k(B namazu $B%$%s%G%C%/%9$rBP>]$H$7$F!"(B $B%-!<%o!<%I(B @samp{wanderlust} $B$G8!:w$r9T$$$^$9!#(B @subsubsection $BJ#?t%$%s%G%C%/%9$N;XDj(B @code{elmo-search-namazu-default-index-path}, @code{elmo-search-namazu-index-alias-alist} $B$NCM$H$7$F%$%s%G%C%/%9$N%j%9(B $B%H$r;XDj$9$k$3$H$b2DG=$G$9!#%j%9%H$r;XDj$9$k$H!"J#?t$N%$%s%G%C%/%9$rBP>](B $B$H$7$?8!:w$H$J$j$^$9!#(B $BNc$($P!"(B @example (setq elmo-search-namazu-index-alias-alist '(("all" . ("~/.elmo/cache" "~/documents")) ("cache" . "~/.elmo/cache"))) @end example $B$N$h$&$K;XDj$9$k$H!"(B @example [wanderlust]all @end example $B$HF~NO$9$l$P!"(B@file{~/.elmo/cache} $B$H(B @file{~/documents} $B$N%$%s%G%C%/%9$r(B $BBP>]$H$7$F!"%-!<%o!<%I(B @samp{wanderlust} $B$G8!:w$r9T$$$^$9!#(B @node grep, mu, namazu, Search Folder @subsection grep @pindex grep grep $B$r;H$C$F!"8!:wBP>]$G;XDj$5$l$?%G%#%l%/%H%j$K$"$k%U%!%$%k$r8!:w$7$^$9!#(B $B8!:w<0$K$O!"(Bgrep $B$N@55,I=8=$r;XDj$7$^$9!#8!:wBP>]$H$9$k%G%#%l%/%H%j$r>JN,(B $B$9$k;v$O=PMh$^$;$s!#(B $BNc(B: @example @group [wanderlust]~/Mail/inbox!grep -> $B%G%#%l%/%H%j(B "~/Mail/inbox" $B$+$i(B "wanderlust" $B$K%^%C%A$9$k$b$N$rC5$9(B ["[sr]emi"]~/Mail/semi!grep -> $B8!:w<0$,(B @samp{]} $B$r4^$`@55,I=8=$G$"$k>l9g$O!"(B @samp{"} $B$G0O$`I,MW$,$"$j$^$9(B @end group @end example @node mu, notmuch, grep, Search Folder @subsection mu @pindex mu mu (@uref{http://www.djcbsoftware.nl/code/mu/}) $B$r;H$C$F!"J8=q$r8!:w$7$^$9!#(B $BNc(B:$B!J(BMu cheatsheet $B$h$j!K(B @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] -> $B%5%V%8%'%/%H$,!!(B'soc' $B$G;O$^$k(B (soccer, society, socrates, ...) $BL$FI$N%a%C%;!<%8$rC5$9(B [mime:image/*] -> $B2hA|$,E:IU$5$l$?%a%C%;!<%8$rC5$9(B ['foo bar'] -> "foo bar" $B$H$$$&%U%l!<%:$r4^$`%a%C%;!<%8$rC5$9(B @end group @end example @node notmuch, , mu, Search Folder @subsection notmuch @pindex notmuch notmuch (@uref{http://notmuchmail.org/}) $B$r;H$C$F!"J8=q$r8!:w$7$^$9!#(B $BNc!J(Bnotmuch $B%^%K%e%"%k$h$j!K(B @example @group [term1] -> 'term1' $B$r4^$`%a%C%;!<%8$rC5$9(B [-term1] -> 'term1' $B$r(B@emph{$B4^$^$J$$(B}$B%a%C%;!<%8$rC5$9(B [term1 term2] -> 'term1' $B$H(B 'term2' $B$NN>J}$r4^$`%a%C%;!<%8$rC5$9(B ['foo bar'] -> "foo bar" $B$H$$$&%U%l!<%:$r4^$`%a%C%;!<%8$rC5$9(B @end group @end example @node Multi Folder, Filter Folder, Search Folder, Folders @section $B%^%k%A%U%)%k%@(B @cindex @samp{*} @cindex Multi Folder @cindex Folder, Multiple @cindex Folder, Marge $BJ#?t$N%U%)%k%@$r2>A[E*$K0l$D$K8+$($k$h$&$K$9$k%U%)%k%@$G$9!#(B $B=q<0(B: @example @group @samp{*} @var{$B%U%)%k%@(B1} [@samp{,} @var{$B%U%)%k%@(B2}] @dots{} [@samp{,} @var{$B%U%)%k%@(BN}] @end group @end example @samp{*} $B$N8e$K!"(B@samp{@var{$B%U%)%k%@(B1},@var{$B%U%)%k%@(B2},@dots{},@var{$B%U%)(B $B%k%@(BN}}$B$N$h$&$K(B @samp{,} ($B%3%s%^(B)$B$G6h@Z$C$F!"0l$D$K8+$($k$h$&$K$7$?$$%U%)(B $B%k%@72$r;XDj$7$^$9!#(B $BNc(B: @example @group *-fj.editor.xemacs,-fj.editor.mule,-fj.editor.emacs -> -fj.editor.xemacs, -fj.editor.mule, -fj.editor.emacs $B$,0l$D$N(B $B%U%)%k%@$H$7$F8+$($k!#(B *+inbox,-fj.rec.tv,%inbox -> +inbox, -fj.rec.tv, %inbox $B$,0l$D$N%U%)%k%@$H$7$F8+$($k!#(B @end group @end example @node Filter Folder, Pipe Folder, Multi Folder, Folders @section $B%U%#%k%?%U%)%k%@(B @cindex @samp{/} @cindex Filter Folder @cindex Folder, Filtering @cindex Folder, Virtual @cindex Folder, Conditional @cindex Flag $B;XDj$7$?>r7o$rK~$?$9%a%C%;!<%8$N$_$r4^$`2>A[E*$J%U%)%k%@$G$9!#(B $B=q<0(B: @example @samp{/} @var{$B>r7o(B} @samp{/} @var{$B%U%)%k%@(B} @end example @var{$B>r7o(B}$B$K$O!"0J2<$r=q$1$^$9!#(B @enumerate @item $BItJ,%U%#%k%?!'(B @samp{first:@var{$B?t;z(B}}, @samp{last:@var{$B?t;z(B}} first: $BA4%a%C%;!<%8$N@hF,$+$i(B@var{$B?t;z(B}$B$N?t$@$1%a%C%;!<%8$r@Z$j=P$7$^$9!#(B last: $BA4%a%C%;!<%8$NKvHx$+$i(B@var{$B?t;z(B}$B$N?t$@$1%a%C%;!<%8$r@Z$j=P$7$^$9!#(B $BNc(B: @example @group /last:10/-fj.os.linux -> -fj.os.linux $B$N:G6a$N(B 10 $B8D$N%a%C%;!<%8(B $B$N$_$rI=<($9$k%U%)%k%@(B /first:20/%inbox -> %inbox $B$N:G=i$N(B 20 $B8D$rI=<($9$k%U%)%k%@(B @end group @end example @item $BF|IU%U%#%k%?!'(B @samp{since:@var{$BF|IU(B}}, @samp{before:@var{$BF|IU(B}} since: @var{$BF|IU(B}$B$h$j:G6a$N%a%C%;!<%8$N$_$r $B:rF|(B lastweek -> $B@h=5$N:#F|(B lastmonth -> $B@h7n$N:#F|(B lastyear -> $B5nG/$N:#F|(B @var{$B?t;z(B}daysago -> @var{$B?t;z(B} $BF|A0(B (e.x. 3daysago) @var{$BF|(B}-@var{$B7n$NN,L>(B}-@var{$BG/(B} -> $BF|IU$=$N$b$N$N;XDj(B (ex. 1-Nov-1998) @end group @end example $BNc(B: @example @group /since:3daysago/+inbox $B"*(B $B:G6a#3F|4V$N(B +inbox $BCf$N%a%C%;!<%8!#(B /before:yesterday/+inbox $B"*(B $B:rF|$h$j0JA0$N(B +inbox $BCf$N%a%C%;!<%8!#(B @end group @end example @item $B%U%#!<%k%I%U%#%k%?!'(B @samp{@var{$B%U%#!<%k%IL>(B}:@var{$BJ8;zNs(B}} $B%a%C%;!<%8$N(B@var{$B%U%#!<%k%I(B}$B$NCf?H$,(B@var{$BJ8;zNs(B}$B$K%^%C%A$9$k%a%C%;!<%8$r(B}$B!"(B@var{$BJ8;zNs(B}$B$KBgJ8;z>.J8;z$N6hJL$O$"$j$^$;$s!#(B $BNc(B: @example @group /from:teranisi/+inbox -> +inbox $B$G!"(BFrom: $B%U%#!<%k%I$K(B "teranisi" $B$H$$$&J8;zNs$r4^$`%a%C%;!<%8$N%U%)%k%@(B /body:$B$J$s$H$+(B/%inbox -> %inbox $B$G!"K\J8$K(B "$B$J$s$H$+(B" $B$H$$$&J8;zNs$r4^$`%a%C%;!<%8$N%U%)%k%@(B @end group @end example @item $B%U%i%0%U%#%k%?!'(B @samp{flag:@var{$B%U%i%0L>(B}} @var{$B%U%i%0L>(B}$B$G;XDj$5$l$?%U%i%0$r;}$D%a%C%;!<%8$r$K$O!"0J2<$N$b$N$,$"$j$^$9!#(B @example @group unread -> $BL$FI(B important -> $B=EMW(B answered -> $BJV?.:Q$_(B forwarded -> $BE>Aw:Q$_(B digest -> $BL$FI$^$?$O%0%m!<%P%k%U%i%0IU$-(B any -> $BL$FI!"JV?.:Q$_!"E>Aw:Q$_!"%0%m!<%P%k%U%i%0IU$-(B @end group @end example $B$^$?!"%0%m!<%P%k%U%i%0$H$7$F@_Dj$7$?%U%i%0$bF1MM$K@_Dj$9$k$3$H$,=PMh$^$9!#(B $B%0%m!<%P%k%U%i%0$H$O!"(B@code{wl-summary-set-flags} (F $B%-!<(B)$B$K$h$jIUM?$G$-$k(B $BG$0U$NL>A0$r;}$D%U%i%0$G$9!#%U%i%0$NL>A0$O<+M3$KDj5A$9$k$3$H$,$G$-$^$9!#(B $B%G%U%)%k%H$G$O!"(B@samp{important} $B%U%i%0$,MQ0U$5$l$F$$$^$9!#(B $B%0%m!<%P%k%U%i%0$,IUM?$5$l$?%a%C%;!<%8$O!"(B@samp{'flag} $B%U%)%k%@$N(B $B%5%V%U%)%k%@$r1\Mw$9$k$3$H$G!"$^$H$a$FFI$`$3$H$,$G$-$^$9!#(B @xref{Internal Folder}. $BNc(B: @example @group /flag:digest/%inbox -> %inbox $B$N$&$A!"L$FI$^$?$O=EMW$J(B $B%a%C%;!<%8$N%U%)%k%@(B /flag:wl/+ML/Wanderlust -> +ML/Wanderlust $B$N$&$A!"(Bwl $B$H$$$&(B $B%0%m!<%P%k%U%i%0$,IU$$$?%a%C%;!<%8$N%U%)%k%@(B @end group @end example @item $BJ#9g>r7o(B $B>r7oItJ,$,(B @samp{!} $B$G;O$^$k$HH]Dj$N>r7o;XDj$H$J$j$^$9!#J#?t$N>r7o$r(B @samp{|} $B$G6h@Z$C$F;XDj$9$k$H!"(BOR $B>r7o$H$J$j$^$9!#F1MM$K!"(B@samp{&} $B$G6h(B $B@Z$k$H(B AND $B>r7o$r;XDj$G$-$^$9(B(AND $B>r7o$O(B OR $B>r7o$h$j$bM%@h$7$FI>2A$5$l$^(B $B$9(B)$B!#$5$i$K!"(B@samp{(}, @samp{)}, $B$G0O$&$H>r7o<0$r%0%k!<%T%s%0;XDj$G$-$^$9!#(B $B$^$?!">r7o$N>JN,5-K!$H$7$F(B @samp{tocc} $B$rMQ0U$7$F$$$^$9!#(B @samp{/tocc:xxxx/} $B$O!"(B@samp{/to:xxxx|cc:xxxx/} $B$KE83+$5$l$^$9!#(B @samp{/!tocc:xxxx/} $B$O!"(B@samp{/!to:xxxx&!cc:xxxx/} $B$KE83+$5$l$^$9!#(B $BNc(B: @example @group /from:teranisi&!to:teranisi/+inbox -> +inbox $B$G(B From: $B%U%#!<%k%I$K(B "teranisi" $B$r4^$_!"(B To: $B%U%#!<%k%I$K(B "teranisi" $B$r4^$^$J$$(B $B%a%C%;!<%8$N%U%)%k%@(B /tocc:"Yuuichi Teranishi"/+inbox -> +inbox $B$G!"(BTo: $B%U%#!<%k%I$+(B Cc: $B%U%#!<%k%I$K(B "Yuuichi Teranishi" $B$r4^$`(B $B%a%C%;!<%8$N%U%)%k%@(B /(from:yt|from:teranisi)&subject:$BJs9p(B/+inbox -> +inbox $B$G!"(BFrom: $B%U%#!<%k%I$,(B "yt" $B$+(B "teranisi" $B$r4^$_!"$+$D(B Subject $B$,(B "$BJs9p(B" $B$r4^$`(B $B%a%C%;!<%8$N%U%)%k%@(B @end group @end example @end enumerate @noindent $BCm0U(B $BJ8;zNsItJ,$K!"6uGrJ8;z!"(B@samp{"}$B!"(B@samp{/}$B!"(B@samp{)}$B!"(B@samp{|}$B!"(B@samp{&} $B$r4^$_$?$$>l9g$O!"J8;zNsA4BN$r(B @samp{"} $B$G3g$kI,MW$,$"$j$^$9!#(B(@samp{"} $B$G3g$i$l$F$$$kJ8;zNsCf$K(B @samp{"} $B$r4^$`>l9g$O!"(B@samp{\} $B$G%(%9%1!<%W$9(B $B$kI,MW$,$"$j$^$9(B)$B!#$3$l$i$NJ8;z$r4^$^$J$$>l9g$G$b(B @samp{"} $B$G3g$k$N$OLd(B $BBj$"$j$^$;$s!#(B @noindent $B1~MQJT(B @example *%inbox,/from:teranisi/%inbox@@server -> %inbox$B!"$*$h$S!"(B %inbox@@server $B$NCf$G(B From $B%U%#!<%k%I$,(B "teranisi" $B$N%a%C%;!<%872!"(B $B$r$$$C$Z$s$KI=<($9$k%U%)%k%@!#(B /last:100//to:teranisi/*+inbox,%inbox -> +inbox $B$H(B %inbox $BCf$N%a%C%;!<%8$N$&$A!"(B To: $B%U%#!<%k%I$,(B "teranisi" $B$K%^%C%A$9$k(B $B%a%C%;!<%8$N:G6a$N(B 100 $B8D$rI=<($9$k%U%)%k%@!#(B /from:hogehoge//last:20//tocc:teranisi/%#mh/inbox@@localhost -> %#mh/inbox@@localhost $B$NCf$G!"(BTo $B$+(B Cc $B$K(B "teranisi" $B$,4^$^$l$k(B $B%a%C%;!<%8$N:G6a$N(B 20 $B8D$N$&$A!"(BFrom $B$,(B "hogehoge" $B$N$b$N$r(B $BI=<($9$k%U%)%k%@!#(B @end example @node Pipe Folder, Internal Folder, Filter Folder, Folders @section $B%Q%$%W%U%)%k%@(B @cindex @samp{|} @cindex Pipe Folder @cindex Get Message @cindex Download Message @cindex Incorporate Message $B%U%)%k%@1\Mw;~$K!"<+F0E*$K%a%C%;!<%8$Nl9g$O!"(B @example |&username@@popserver|+inbox @end example @noindent $B$N$h$&$K;XDj$9$k$H!"%U%)%k%@$NI=<($r99?7$9$k$H$-$K(B @samp{&username@@popserver} $B$+$i(B @samp{+inbox} $B$X!"%a%C%;!<%8$r<+F0E*$K(B $Bl9g$O!"(B @example |&username@@popserver|:+inbox @end example $B$N$h$&$K$7$^$9!#(B $BNc(B: @example @group |%inbox|%myinbox -> %inbox $B$+$i(B %myinbox $B$X%a%C%;!<%8$r &user@@popserver1 $B$H(B &user@@popserver2 $B$+$i(B +inbox $B$X%a%C%;!<%8$r(B $B -gnu.emacs.sources $B$+$i(B +sources $B$X%a%C%;!<%8$r%3%T!<$7$F1\Mw$9$k(B $B%U%)%k%@!#(B @end group @end example $B%a%C%;!<%8$,0\F0$7$?8e!"%U%C%/(B @code{elmo-pipe-drained-hook} $B$,8F$P$l(B $B$^$9$N$G!"%@%&%s%m!<%I8e$KA[%U%)%k%@$G$9!#(B $B%G%U%)%k%H$GDj5A$5$l$F$$$k(B@var{$B%0%m!<%P%k%U%i%0(B}$B$H$7$F(B @samp{important} $B%U%i%0$,$"$j$^$9!#$3$N%U%i%0$O!"8e=R$N=EMW%^!<%/(B(@samp{$})$B$rIU$1$k$3$H$G(B $B%a%C%;!<%8$KIU2C$5$l$^$9!#=EMW%^!<%/$r%a%C%;!<%8$K$D$1$F$*$$$F!"$"$H$+$i(B $B8+D>$7$?$$$H$-$J$I$KJXMx$G$9!#(B@var{$B%0%m!<%P%k%U%i%0(B}$B$r>JN,$7$?>l9g$O!"$3(B $B$N(B @samp{important} $B%U%i%0$r;XDj$7$?$b$N$H4GJo$5$l$^$9!#(B $B$^$?!"8e=R$N%5%^%j%b!<%I$K$*$$$F!"<+M3$K%0%m!<%P%k%U%i%0$rDj5A$7$F%a%C%;!<(B $B%8$KIU2C$9$k$3$H$b=PMh$^$9!#(B@xref{Usage of Summary Mode}. $B$3$N%U%)%k%@$G%a%C%;!<%8$r:o=|$9$k$H!"$=$N%a%C%;!<%8$K$D$$$F$$$?(B @var{$B%0%m!<%P%k%U%i%0(B} $B$,:o=|$5$l$^$9!#$^$?!"$3$N%U%)%k%@$K%a%C%;!<%8(B $B$rDI2C$9$k$H!"$=$N%a%C%;!<%8$K$O(B @var{$B%0%m!<%P%k%U%i%0(B} $B$,IU$1$i$l$^$9!#(B @samp{'sendlog} $B$O(B @file{~/.elmo/sendlog} $B$K5-:\$5$l$F$$$k%a%C%;!<%8$N$&$A(B $B%-%c%C%7%e$7$F$$$k$b$N$r=8$a$?2>A[%U%)%k%@$G$9!#<+J,<+?H$X$N(B cc $B$r(B $BIU$1K:$l$?;~$J$I$KM-MQ$+$b$7$l$^$;$s!#(B $B$3$l$rMxMQ$9$k$K$O!"(B@code{wl-draft-use-cache} $B$r(B non-nil $B$K@_Dj$7$F!"(B $BAw?.$7$?%a%C%;!<%8$r%-%c%C%7%e$9$k$h$&$K$7$F$/$@$5$$!#(B @samp{'cache/00} $B!A(B @samp{'cache/1F} $B$O%M%C%H%o!<%/7PM3$GFI$s$@%a%C%;!<(B $B%8$N%-%c%C%7%e$K%"%/%;%9$9$k$?$a$N%U%)%k%@$G$9!#(B00 $B!A(B 1F $B$K$O!"%-%c%C%7%e(B $B%G%#%l%/%H%j(B (@file{~/.elmo/cache})$B$N%5%V%G%#%l%/%H%jL>$r;XDj$7$^$9!#(B @node File Folder, Access Folder, Internal Folder, Folders @section $B%U%!%$%k%U%)%k%@(B @cindex File Folder $B%m!<%+%k%U%!%$%k%7%9%F%`$N%U%!%$%k$r1\Mw$9$k$?$a$N%U%)%k%@$G$9!#0l$D$N%G%#(B $B%l%/%H%j$r0l$D$N%U%)%k%@$H$7$F07$$$^$9!#(B $B=q<0(B: @example @samp{file:} @var{$B%G%#%l%/%H%j$N%Q%9(B} @end example $BNc(B: @example @group file:~/work -> @file{~/work} file:/etc -> @file{/etc} @end group @end example @node Access Folder,, File Folder, Folders @section $B%"%/%;%9%U%)%k%@(B @cindex Access Folder $B;XDj$5$l$?%U%)%k%@$NG[2<$N%5%V%U%)%k%@$r2>A[E*$K0l$D$N%U%)%k%@$H$7$F07$((B $B$k$h$&$K$9$k%U%)%k%@$G$9!#%5%V%U%)%k%@$NA}8:$O<+F0E*$KH?1G$5$l$^$9!#(B $B=q<0(B: @example @samp{access:} @var{$B%k!<%H%U%)%k%@(B} @end example $BNc(B: @example @group access:%INBOX -> %INBOX $B0J2<$N(B IMAP $B$N%a!<%k%\%C%/%9$NA4$F(B access:'cache -> $BA4$F$N(B 'cache $B%U%)%k%@(B @end group @end example @node Folder, Summary, Folders, Top @chapter $B%U%)%k%@%b!<%I(B @cindex Folder $B5/F0$7$F:G=i$K8=$l$k$N$,%U%)%k%@%b!<%I(B($B%U%)%k%@$N0lMwI=<((B)$B$G$9!#(B $B%U%)%k%@%b!<%I$G$O!"FI$_$?$$%U%)%k%@$NA*Br!"9XFI%U%)%k%@$NJT=8$r9T$J$$$^$9!#(B @menu * Selecting Folder:: $BFI$_$?$$%U%)%k%@$NA*Br(B * Folder Manager:: $B9XFI%U%)%k%@$NJT=8(B @end menu @node Selecting Folder, Folder Manager, Folder, Folder @section $BFI$_$?$$%U%)%k%@$NA*Br(B @cindex Selecting Folder @subsection $B;HMQJ}K!(B(TIPS) @subsubsection $B?75,?t!"L$FI?t$N%A%'%C%/(B $B%U%)%k%@%b!<%I$N8+$?$a$O$3$s$J46$8$K$J$k$O$:$G$9!#(B (XEmacs $B$G$O$b$&$A$g$C$H$+$C$3$h$/8+$($k$O$:$G$9(B @t{;-)}) @example @group [-]Desktop:14186/35580/67263 $B(B}:@var{$BL$F14|(B}(@var{$B?75,(B})@var{$B?t(B}/@var{$BL$FI?t(B}/@var{$BAm?t(B} @end example @noindent $B$rI=<($7$F$$$^$9!#(B $B%A%'%C%/$7$?$$%U%)%k%@$N>e$K%+!<%=%k$r9g$o$;$F(B @kbd{s} $B$r2!$9$H!"(B $B$3$l$i$N?t$r:G?7$N$b$N$K99?7$7$^$9!#(B $B$?$/$5$s?75,%a%C%;!<%8$,$"$k$H?'$,JQ$o$j$^$9!#(B $B%U%)%k%@%b!<%IA4BN$O(B @samp{Desktop} $B$H$$$&%0%k!<%W%U%)%k%@$K$J$j$^$9!#(B $B%0%k!<%W%U%)%k%@$O%j%?!<%s%-!<$G3+JD$G$-$^$9!#(B $B%0%k!<%W%U%)%k%@$KBP$9$kA`:n$O!"$=$N%0%k!<%W%U%)%k%@$KB0$9$kA4$F$N;R(B $B%U%)%k%@$KBP$7$FE,MQ$5$l$^$9!#(B $BNc$($P!"(B@samp{[-]Emacsen} $B$N$H$3$m$K%+!<%=%k$r9g$o$;$F(B @kbd{s} $B$r2!$9$H!"(B $B$3$l$K4^$^$l$k#6$D$N%U%)%k%@$NI=<($r:G?7$N$b$N$K99?7$7$^$9!#(B @subsubsection $B%U%)%k%@$NA*Br(B $B%U%)%k%@$N9T$K%+!<%=%k$rCV$$$F%j%?!<%s(B($B%9%Z!<%9(B)$B%-!<$r2!$9$H$=$N%U%)%k%@(B $B$NFbMF$rI=<($9$k%5%^%j%b!<%I$K0\F0$7$^$9!#(B $B$3$N$H$-!"JQ?t(B @code{wl-stay-folder-window} $B$,(B non-nil $B$J$i%5%^%j$K0\F0(B $B$7$?$H$-$K%U%)%k%@%P%C%U%!$N1&$K%5%^%j$N%P%C%U%!$,8=$l$^$9!#(B @subsection $B%-!<%P%$%s%I(B $B%U%)%k%@%b!<%I$G$N%U%)%k%@A*Br$K4X$9$k%3%^%s%I$N%-!<%P%$%s%I$O0J2<$NDL$j$G$9!#(B @table @kbd @item @key{SPC} @itemx @key{RET} @kindex @key{SPC} (Folder) @kindex @key{RET} (Folder) @findex wl-folder-jump-to-current-entity $B8=:_%+!<%=%k$,$"$k9T$N%U%)%k%@$N%5%^%jI=<($X0\F0$7$^$9!#(B prefix argument $B$r$D$1$k$H!"%9%F%#%C%-!<%5%^%j$KF~$j$^$9!#(B $B%0%k!<%W%U%)%k%@$K%+!<%=%k$,$"$k>l9g$O!"%0%k!<%W%U%)%k%@$N3+JD$r9T$J$$$^$9!#(B $B%"%/%;%9%0%k!<%W$G$O!"(Bprefix argument $B$D$-$G%0%k!<%W%U%)%k%@$r3+$/$H!"(B $BFbMF$r:G?7$N%j%9%H$K99?7$7$^$9!#(B $B%"%/%;%9%0%k!<%W$,3,AX9=B$$K$J$C$F$$$k>l9g$O:F5"E*$K99?7$7$^$9!#(B (@code{wl-folder-jump-to-current-entity}) @item M-@key{RET} @kindex M-@key{RET} (Folder) @findex wl-folder-update-recursive-current-entity $B8=:_%+!<%=%k$,$"$k%"%/%;%9%0%k!<%W$NFbMF$r:G?7$N%j%9%H$K99?7$7$^$9!#(B $B%"%/%;%9%0%k!<%W$,3,AX9=B$$K$J$C$F$$$k>l9g$O:F5"E*$K99?7$7$^$9!#(B (@code{wl-folder-update-recursive-current-entity}) @item w @kindex w (Folder) @findex wl-draft $B?75,%I%i%U%H$rMQ0U$7$^$9!#(B (@code{wl-draft}) @item W @kindex W (Folder) @findex wl-folder-write-current-folder $B8=:_%+!<%=%k$,$"$k%U%)%k%@$,(B NNTP $B%U%)%k%@$J$i!"(B@samp{Newsgroups:} $B%U%#!<(B $B%k%I$rJd$C$F%I%i%U%H$rMQ0U$7$^$9!#%a!<%j%s%0%j%9%H$N%j%U%!%$%k@h$J$i!"%a!<(B $B%j%s%0%j%9%H$N%"%I%l%9$r?dB,$7$F!"(B@samp{To:} $B%U%#!<%k%I$rJd$C$F%I%i%U%H(B $B$rMQ0U$7$^$9!#JQ?t(B @code{wl-subscribed-mailing-list} $B$r@_Dj$7$F$*$/I,MW(B $B$,$"$j$^$9!#(B (@code{wl-folder-write-current-folder}) @item C-c C-o @kindex C-c C-o (Folder) @findex wl-jump-to-draft-buffer $B%I%i%U%H%P%C%U%!$,$"$l$P0\F0$7$^$9!#(B $BJ#?t$N%I%i%U%H%P%C%U%!$,B8:_$9$k>l9g$O!"(B $Bl9g$O!"%I%i%U%H%U%)%k%@$+$i%U%!%$%k$r(B($BB8:_$9$l$P(B) $BFI$_9~$_$^$9!#(B (@code{wl-jump-to-draft-buffer}) @item s @kindex s (Folder) @findex wl-folder-check-current-entity $B8=:_%+!<%=%k$,$"$k9T$N%U%)%k%@$NL$F14|%a%C%;!<%8?t$r99?7$7$^$9!#(B (@code{wl-folder-check-current-entity}) @item S @kindex S (Folder) @findex wl-folder-sync-current-entity $B8=:_%+!<%=%k$,$"$k9T$N%U%)%k%@$N%5%^%j$r99?7$7$^$9!#(B (@code{wl-folder-sync-current-entity}) @item r s @kindex r s (Folder) @findex wl-folder-check-region $B%j!<%8%g%s$K$"$k%U%)%k%@$NL$F14|%a%C%;!<%8?t$r99?7$7$^$9!#(B (@code{wl-folder-check-region}) @item r S @kindex r S (Folder) @findex wl-folder-sync-region $B%j!<%8%g%s$K$"$k%U%)%k%@$N%5%^%j$r99?7$7$^$9!#(B (@code{wl-folder-sync-region}) @item Z @kindex Z (Folder) @findex wl-status-update @file{~/.addresses} $BEy$N>uBV$r:G?7$N$b$N$K99?7$7$^$9!#(B (@code{wl-status-update}) @item P @kindex P (Folder) @findex wl-folder-prev-unread $B$R$H$D>e$NL$FI$,$"$k%U%)%k%@(B($B$b$7$/$O%0%k!<%W(B)$B$K0\F0$7$^$9!#(B (@code{wl-folder-prev-unread}) @item N @kindex N (Folder) @findex wl-folder-next-unread $B$R$H$D2<$NL$FI$,$"$k%U%)%k%@(B($B$b$7$/$O%0%k!<%W(B)$B$K0\F0$7$^$9!#(B (@code{wl-folder-next-unread}) @item p @kindex p (Folder) @findex wl-folder-prev-entity $B$R$H$D>e$N%U%)%k%@$X0\F0$7$^$9!#(B (@code{wl-folder-prev-entity}) @item n @kindex n (Folder) @findex wl-folder-next-entity $B$R$H$D2<$N%U%)%k%@$X0\F0$7$^$9!#(B (@code{wl-folder-next-entity}) @item J @kindex J (Folder) @findex wl-folder-jump-folder $B;XDj$7$?%U%)%k%@$X%+!<%=%k$r0\F0$7$^$9!#(B (@code{wl-folder-jump-folder}) @item I @kindex I (Folder) @findex wl-folder-prefetch-current-entity $B8=:_%+!<%=%k$,$"$k9T$N%U%)%k%@$KBP$7$F!"(B @code{wl-summary-incorporate}$B$K$h$j!"(B $B?7Ce5-;v$r%W%j%U%'%C%A$7$^$9!#(B $B%0%k!<%W%U%)%k%@$K%+!<%=%k$,$"$k>l9g$O!"(B $B:F5"E*$Kl9g$O!"(B $B:F5"E*$Kr7o$H9gCW$9$k%a%C%;!<%8$N$_$r4^$`2>A[%U%)%k%@(B($B%U%#%k%?%U%)%k%@(B) $B$X0\F0$7$^$9!#(B (@code{wl-folder-virtual}) @item ? @kindex ? (Folder) @findex wl-folder-pick $B;XDj$7$?>r7o$H9gCW$9$k%a%C%;!<%8$r4^$`%U%)%k%@$rC5$7$^$9!#(B (@code{wl-folder-pick}) @item o @kindex o (Folder) @findex wl-folder-open-all-unread-folder $BA4$F$NL$FI$,$"$k%U%)%k%@$,4^$^$l$k%0%k!<%W$r3+$-$^$9!#(B (@code{wl-folder-open-all-unread-folder}) @item x @kindex x (Folder) @findex wl-execute-temp-marks $B%5%^%j%P%C%U%!$N%^!<%/$ruBV$r%;!<%V$7$^$9!#(B (@code{wl-save}) @item M-t @kindex M-t (Folder) @findex wl-toggle-plugged Wanderlust $B$N%*%U%i%$%s%b!<%I(B/$B%*%s%i%$%s%b!<%I$r%H%0%k$7$^$9!#(B (@code{wl-toggle-plugged}) @item C-t @kindex C-t (Folder) @findex wl-plugged-change Wanderlust $B$N%5!<%P!&%]!<%HJL$N%*%U%i%$%s(B/$B%*%s%i%$%s$rJQ99$7$^$9!#(B (@code{wl-plugged-change}) @end table @subsection $B%+%9%?%^%$%:JQ?t(B @table @code @item wl-folders-file @vindex wl-folders-file $B=i4|@_Dj$O(B @file{~/.folders}$B!#(B $B9XFI$9$k%U%)%k%@$r5-=R$9$k%U%!%$%k$NL>A0$G$9!#(B @item wl-folder-info-save @vindex wl-folder-info-save $B=i4|@_Dj$O(B @code{t}$B!#(B $Be$2D>$7$?$H$-$KA02s$NL$FI?t$J$I$N7k2L$r;H$$2s$7$9$k$+$I$&$+!"$G$9!#(B @item wl-stay-folder-window @vindex wl-stay-folder-window $B=i4|@_Dj$O(B @code{nil}$B!#(B Non-nil $B$J$i%5%^%j$K0\F0$7$?$H$-$K%U%)%k%@%P%C%U%!$N1&$K%5%^%j$N%P%C%U%!$,8=$l$^$9!#(B @item wl-folder-window-width @vindex wl-folder-window-width $B=i4|@_Dj$O(B 20$B!#(B @code{wl-stay-folder-window} $B$,(B non-nil $B$N$H$-$K;D$9%U%)%k%@%P%C%U%!$N%&%#%s%I%&$NI}$G$9!#(B @item wl-folder-use-frame @vindex wl-folder-use-frame $B=i4|@_Dj$O(B @code{nil}$B!#(B Non-nil $B$J$i%U%)%k%@0lMwMQ$K?7$7$$%U%l!<%`$r3+$-$^$9!#(B @item wl-folder-many-unsync-threshold @vindex wl-folder-many-unsync-threshold $B=i4|@_Dj$O(B 70$B!#(B $BL$F14|?t$,$?$/$5$s$+$I$&$+$NogCM!#$3$NCM$r1[$($k$H?'$,JQ$o$j$^$9!#(B @item wl-highlight-folder-by-numbers @vindex wl-highlight-folder-by-numbers $B%U%)%k%@%P%C%U%!$K$*$1$k3F9T$N%O%$%i%$%H$N7A<0$r;XDj$7$^$9!#=i4|CM$O(B @code{t} $B$G!"9TA4BN$K%a%C%;!<%8?t$K1~$8$??'$rIU$1$^$9!#(B@code{nil} $B$G$O%U%)(B $B%k%@$N>uBV$K1~$8$??'$rIU$1$^$9!#$^$?!"?t;z(B ($BNc$($P(B 1) $B$K$7$F$*$/$H!"%a%C(B $B%;!<%8?t$H%U%)%k%@$N>uBV$NN>J}$K1~$8$?%O%$%i%$%H$,9T$J$o$l$^$9!#(B @item wl-folder-desktop-name @vindex wl-folder-desktop-name $B=i4|@_Dj$O(B @samp{Desktop}$B!#(B $B%H%C%W$N%0%k!<%W$NL>A0$G$9!#(B @item wl-folder-petname-alist @vindex wl-folder-petname-alist $B=i4|@_Dj$O(B @code{nil}$B!#(B $B%U%)%k%@$NK\L>$H$"$@L>$N(B cons $B$N%j%9%H$G$9!#(B @item wl-folder-access-subscribe-alist @vindex wl-folder-access-subscribe-alist $B=i4|@_Dj$O(B @code{nil}$B!#(B $B%"%/%;%9%0%k!<%W$N%j%9%Hl9g$O(B@var{$B%U%)%k%@$N@55,I=(B $B8=(B}$B$K%^%C%A$7$?%U%)%k%@$N$_I=<($7!"(B@var{$B9XFI%U%i%0(B}$B$,(B @code{nil} $B$N>l9g(B $B$O(B@var{$B%U%)%k%@$N@55,I=8=(B}$B$K%^%C%A$7$?%U%)%k%@$OI=<($7$^$;$s!#$?$@$7!"(B @var{$B9XFI%U%i%0(B}$B$,(B non-nil $B$G$b4{$K(B unsubscribe $B:Q$N%U%)%k%@$OI=<($7$^$;(B $B$s!#$^$?!"(B@var{$B%U%)%k%@$N@55,I=8=(B}$B$OJ#?t8D5-=R$G$-$^$9!#(B $BNc(B: @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 $B3,AX9=B$$K:n@.$9$k%"%/%;%9%0%k!<%W$N@55,I=8=$+$i$J$k%j%9%H$G$9!#(B $BNc$($P!"0J2<$N$h$&$K(B @code{wl-folder-hierarchy-access-folders} $B$r@_Dj$9$k$H!"(B @lisp @group (setq wl-folder-hierarchy-access-folders '("^-[^\\.]*$" "^-comp.unix$" "^-comp.unix.bsd$")) @end group @end lisp @noindent $B@\JT=8$9$k$^$G$b$J$/!"%U%)%k%@%b!<%I$+$i$b%U%)%k%@(B $B$NDI2C(B/$B:o=|(B/$B%0%k!<%W$NDj5A$J$I$rJT=8$G$-$^$9!#(B @subsection $B;HMQJ}K!(B(TIPS) @subsubsection $B%U%)%k%@$NDI2C(B @kbd{m a} $B$G?75,$K9XFI$9$k%U%)%k%@$rDI2C$7$^$9!#B8:_$7$J$$%U%)%k%@$rF~NO(B $B$9$k$H!"?75,$K:n@.$7$F$h$$$+J9$$$F$-$^$9!#(B@kbd{m g} $B$G%0%k!<%W$,DI2C$5$l(B $B$^$9!#$3$N%0%k!<%W$K%U%)%k%@$rDI2C$9$k$K$O!"$^$:$3$N%0%k!<%W$r3+$$$?>uBV(B $B$K$7$^$9!#$=$7$Fo$NJ8=qJT=8$N9TJT=8$HF1$8$h$&$K%U%)%k%@$N0LCV$rJQ992DG=$G$9!#(B @subsubsection $B%^%k%A%U%)%k%@$N:n@.J}K!(B @enumerate @item @kbd{m q}$B$G(B @code{wl-fldmgr-cut-entity-list} $B$r>C$7$^$9!#(B @item @kbd{C-k} $B$G%U%)%k%@$r@Z$j(B(petname)$B$d%U%#%k%?$N:o=|(B $B$"$@L>$d%U%#%k%?$r:o=|$9$k$?$a$K$O!"%_%K%P%C%U%!$G(B ``''(@var{NULL}) $B$rF~(B $BNO$7$^$9!#(B @subsubsection $B6u%0%k!<%W$X$NDI2C(B @kbd{m g} $B$J$I$G%0%k!<%W$r:n@.$7$?8e!"$3$N%0%k!<%W$K%U%)%k%@$rDI2C$9$k$K(B $B$O!"$^$:$3$N%0%k!<%W$r3+$$$?>uBV$K$7$^$9!#$=$7$Fe$N9T$N%0%k!<%W$,(B $BJD$8$?>uBV$N$H$-$O!"$=$N%0%k!<%W$HF1$8%l%Y%k$KA^F~$5$l$^$9!#(B $B8@MU$G@bL@$9$k$N$OFq$7$$$N$Ge$K$"$k%0%k!<%W$N3+JD>uBV$K(B $B$h$jA^F~$5$l$k0LCV$,0[$J$k$N$G$9!#(B @subsubsection $B%;!<%V;~$N8@8l%3!<%I(B @code{wl-folders-file} $B$r%;!<%V$9$k$H$-$O(B @code{wl-mime-charset} $B$N8@8l(B $B%3!<%I$K$J$j$^$9!#(B @subsubsection $B%U%#%k%?%U%)%k%@$N:n@.(B $B%+!<%=%k>e$N%U%)%k%@$r%U%#%k%?IU$-$KJQ99$9$k$K$O!"%U%#%k%?%U%)%k%@:n@.%3(B $B%^%s%I$rMQ$$$^$9!#$b$7%+!<%=%k>e$N%U%)%k%@$r;D$7$?$^$^?7$?$K%U%#%k%?%U%)(B $B%k%@$r:n@.$9$k>l9g$O!"$^$:%3%T!<$7$F$+$i%U%#%k%?$r:n@.$7!"$=$N8e%3%T!<$7(B $B$?%U%)%k%@$rA^F~$7$^$9!#%U%#%k%?%U%)%k%@:n@.;~$K$O0lEY$KJ#?t$N(B($BB?CJ$N(B)$B%U%#(B $B%k%?$,;XDj$G$-$^$9!#@hF,$N%U%#%k%?$r$9$Y$F:o=|$9$k$?$a$K$O!"(B ``''(@var{NULL})$B$rF~NO$7$^$9!#(B @subsubsection $B%U%)%k%@$NJB$SBX$((B $B%0%k!<%WFb$N%U%)%k%@$rJB$SBX$($k:]$K$O!"(B@code{wl-fldmgr-sort-function} $B$G;XDj$7$?4X?t$rMQ$$$^$9!#=i4|@_Dj$O(B @code{wl-fldmgr-sort-standard} $B$K$J$C(B $B$F$$$^$9!#$3$l$O%"%k%U%!%Y%C%H=g$KJB$SBX$(!"%0%k!<%W$r:G=i$K$9$k4X?t$G$9!#(B $BJB$SBX$($NBP>]$K$J$k$N$O;XDj$7$?%0%k!<%W$N$_$G!"2<0L$N%0%k!<%W$OJB$S(B $BBX$($^$;$s!#$D$^$j!":F5"E*$K$O9T$o$J$$$H$$$&$3$H$G$9!#(B @subsubsection $B%"%/%;%9%0%k!<%WFb$NI=<($7$J$$%U%)%k%@$N;XDj(B $B%"%/%;%9%0%k!<%W$r3+$/$HDL>oA4$F$N%U%)%k%@$rI=<($7$^$9$,!"I=<($7$J$$%U%)(B $B%k%@$r;XDj$9$k$3$H$b$G$-$^$9!#0J2<$NA`:n$O%"%/%;%9%0%k!<%WFb$G$N$_M-8z$G(B $B$9!#(B $B%3%^%s%I(B @code{wl-fldmgr-unsubscribe} (@kbd{u}) $B$O%+!<%=%k0LCV$N%U%)%k%@$N(B $BI=<((B(subscribe)$B!&HsI=<((B(unsubscribe)$B@_Dj$r%H%0%k$7$^$9!#$3$l$KBP$7$F(B @code{wl-fldmgr-unsubscribe-region} (@kbd{U}) $B$O;XDjHO0O$N%U%)%k%@$rHsI=<($K(B $B$7$^$9!#(B @code{wl-fldmgr-unsubscribe} $B$O%H%0%k$7$^$9$,!"(B @code{wl-fldmgr-unsubscribe-region} $B$@$HDL>o%H%0%k$K$J$i$J$$$3$H$KCm0U$7(B $B$F2<$5$$!#%j!<%8%g%s$N>l9g%H%0%k$K$9$k$h$j$I$A$i$+$K@_Dj$5$;$kJ}$,;H$$$d(B $B$9$$$H9M$(!"$3$N$h$&$K$7$F$$$^$9!#$7$+$7!">e5-(B2$B$D$N4X?t$H$b(B prefix argument $B$NCM$,@5$J$i%U%)%k%@$rHsI=<(!"Ii$J$iI=<(!"(B0$B$J$i%H%0%k$7$^$9!#(B $B$^$?%-!<$K$O3d$jEv$F$F$$$^$;$s$,!"%U%)%k%@$rI=<($K@_Dj$9$k$@$1$N(B @code{wl-fldmgr-subscribe} $B$H(B @code{wl-fldmgr-subscribe-region} $B$bMQ0U$7$F(B $B$$$^$9!#;HMQ$9$k>l9g$OE,Ev$J%-!<$K3d$jEv$F$F$/$@$5$$!#(B $B$5$i$K!"%"%/%;%9%0%k!<%WFb$G(B @code{wl-fldmgr-cut} $B$H(B @code{wl-fldmgr-cut-region} $B$r$l(B @code{wl-fldmgr-unsubscribe} $B$H(B @code{wl-fldmgr-unsubscribe-region} $B$rl9g$O2hLL$+$i$b>C5n$9$k$3(B $B$H$G$9!#(B @subsubsection $B%"%/%;%9%0%k!<%WFb$NA`:n(B $B%"%/%;%9%0%k!<%WFb$G$b:o=|$dA^F~$r9T$($^$9!#$H$$$C$F$b$C$F!"(BWanderlust $B0J30$G%U%)%k%@$rJQ99$7$?>l9g!"$=$N%U%)%k%@$rl9g$K$O(B $B3NG'$N8e!"?75,$K:n@.$7$^$9!#(B (@code{wl-fldmgr-add}) @item + @itemx m g @kindex + (Folder) @kindex m g (Folder) @findex wl-fldmgr-make-group $B%0%k!<%W$r:n@.$7$^$9!#(B (@code{wl-fldmgr-make-group}) @item m A @kindex m A (Folder) @findex wl-fldmgr-make-access-group $B%"%/%;%9%0%k!<%W$r:n@.$7$^$9!#(B (@code{wl-fldmgr-make-access-group}) @item m d @kindex m d (Folder) @findex wl-fldmgr-delete $B%U%)%k%@$N$rJQ99$7$^$9!#(B $B%U%)%k%@$rJQ99$9$k>l9g$O(B msgdb $B$N%Q%9$bJQ99$7$^$9!#(B (@code{wl-fldmgr-rename}) @item * @itemx m m @kindex * (Folder) @kindex m m(Folder) @findex wl-fldmgr-make-multi $B%^%k%A%U%)%k%@$r:n@.$7$^$9(B ($B%3%T!(B(petname)$B$rIU$1$k!#(B (@code{wl-fldmgr-set-petname}) @item m q @kindex m q (Folder) @findex wl-fldmgr-clear-cut-entity-list $B%3%T!pJs(B(cut-list)$B$r>C$9!#(B (@code{wl-fldmgr-clear-cut-entity-list}) @item m s @kindex m s (Folder) @findex wl-fldmgr-sort $B%0%k!<%WFb$N%U%)%k%@$rJB$SBX$($k(B ($B$=$N%0%k!<%W3,AX$N$_(B)$B!#(B (@code{wl-fldmgr-sort}) @item m C-s @kindex m C-s (Folder) @findex wl-fldmgr-save wl-folders-file $B$K%;!<%V$9$k!#(B (@code{wl-fldmgr-save}) @end table [$B0J2<$NA`:n$O%"%/%;%9%0%k!<%W$KBP$7$F$N$_M-8z(B] @table @kbd @item u @itemx m u @kindex u (Folder) @kindex m u (Folder) @findex wl-fldmgr-unsubscribe $B%U%)%k%@$NI=<((B/$BHsI=<($N@_Dj!#(B (@code{wl-fldmgr-unsubscribe}) @item U @itemx r u @kindex U (Folder) @kindex r u (Folder) @findex wl-fldmgr-unsubscribe-region $B;XDjHO0O$K$"$k%U%)%k%@$NI=<((B/$BHsI=<($N@_Dj!#(B (@code{wl-fldmgr-unsubscribe-region}) @item l @itemx m l @kindex l (Folder) @kindex m l (Folder) @findex wl-fldmgr-access-display-normal $B8=:_M-8z$J%U%)%k%@$N$_0lMwI=<($9$k!#(B (@code{wl-fldmgr-access-display-normal}) @item L @itemx m L @kindex L (Folder) @kindex m L (Folder) @findex wl-fldmgr-access-display-all $BHsI=<($N%U%)%k%@$b4^$a$FA4$F$N%U%)%k%@$r0lMwI=<($9$k!#(B (@code{wl-fldmgr-access-display-all}) @end table @subsection $B%+%9%?%^%$%:JQ?t(B @table @code @item wl-interactive-save-folders @vindex wl-interactive-save-folders $B=i4|@_Dj$O(B @code{t}$B!#%U%)%k%@JQ99$NA`:n$r9T$C$?>l9g!"(BWanderlust $B=*N;;~$b(B $B$7$/$O(B Emacs $B=*N;;~$K%;!<%V$9$k$+3NG'$r9T$$$^$9!#(B@code{nil} $B$@$H3NG'$J$7(B $B$G%;!<%V$7$^$9!#(B @item wl-fldmgr-make-backup @vindex wl-fldmgr-make-backup $B=i4|@_Dj$O(B @code{t}$B!#(BNon-nil $B$J$i!"%;!<%V$9$k:]$K(B @file{~/.folders.bak} $B$K%P%C%/%"%C%W$rl9g(B)$B!#(B @item wl-fldmgr-sort-group-first @vindex wl-fldmgr-sort-group-first $B=i4|@_Dj$O(B @code{t}$B!#(B Non-nil $B$J$i!"(B@code{wl-fldmgr-sort-standard} $B$GJB$SBX$($k$H$-%0%k!<%W$r:G(B $B=i$KCV$/!#(B@code{nil} $B$J$i!"%0%k!<%W$b4^$a$F%"%k%U%!%Y%C%H=g$KJB$SBX$($^$9!#(B @item wl-folder-check-async @vindex wl-folder-check-async $B=i4|@_Dj$O(B @code{t}$B!#(B Non-nil $B$N>l9g!"%U%)%k%@$N?75,%a%C%;!<%8?t$N%A%'%C%/$rHsF14|$K9T$J$$$^$9!#(B $B%K%e!<%9%0%k!<%W$N%A%'%C%/$,BgI}$KB.$/$J$j$^$9!#(B @item wl-folder-check-fast @vindex wl-folder-check-fast $B=i4|@_Dj$O(B @code{nil}$B!#(B Non-nil $B$N>l9g!"%U%)%k%@$N?75,%a%C%;!<%8?t$N%A%'%C%/$r9T$&$?$S$K(B $B%U%)%k%@$NI=<($r99?7$7$^$;$s!#(B @item wl-folder-notify-deleted @vindex wl-folder-notify-deleted $B=i4|@_Dj$O(B @code{nil}$B!#(B @c nil means? Non-nil $B$J$i%a%C%;!<%8$,:o=|$5$l$?$H$-$K%U%)%k%@%b!<%I$GL$FI?t$r%A%'%C%/(B $B$9$k$HIi$NCM$,I=<($5$l$^$9!#CM$,(B @code{sync} $B$J$i$P!"%a%C%;!<%8$,:o=|$5(B $B$l$F$$$?$H$-$K%U%)%k%@$NFbMF$HF14|$r(B $B%U%)%k%@$NJT=8$K4X$7$F!"0J2<$N$h$&$J;E3]$1$d@)8B$,$"$j$^$9!#(B @enumerate @item $B:o=|$d%3%T!<$r9T$&$H!"%9%?%C%/$N$h$&$KJQ?t(B @code{wl-fldmgr-cut-entity-list} $B$K$?$^$C$F$$$-$^$9!#%Z!<%9%H(B($BD%$jIU$1(B) $B$O:o=|$d%3%T!<$7$?C10L$G(B($B%j!<%8%g%s$G%3%T!<$7$?$J$i!"$=$N%j!<%8%g%sFb$N(B $B%U%)%k%@$r0lEY$K(B) $BEG$-=P$7$^$9!#(B @item @samp{Desktop} $B%0%k!<%W$N:o=|!"%3%T!<$O$G$-$^$;$s!#(B $B$^$?!"(B@samp{Desktop} $B30$X$NA^F~$O$G$-$^$;$s!#(B @item $B%0%k!<%W$N%3%T!<$O$G$-$^$;$s!#(B @item $B%"%/%;%9%0%k!<%WFb$G$NA`:n$O!"$=$N%"%/%;%9%0%k!<%W$K]$K$J$j$^$9!#(B @item $BA4BN$GF1$8L>A0$N%0%k!<%W$OJ#?t:n$l$^$;$s!#(B @item $BF1$8%0%k!<%W(B($B3,AX(B)$B$KF1$8%U%)%k%@$O:n$l$^$;$s!#3,AX$,0c$($PJ#?t:n$l$^$9!#(B $B0[$J$k%U%)%k%@$KF1$8$"$@L>$O;XDj$G$-$^$;$s!#(B @end enumerate @node Summary, Message, Folder, Top @chapter $B%5%^%j%b!<%I(B $B%U%)%k%@%b!<%I$GFI$_$?$$%U%)%k%@$rA*Br$9$k$H!"%5%^%j%b!<%I$K0\F0$7$^$9!#(B $B%5%^%j%b!<%I$O!"%a%C%;!<%8$N0lMw$rI=<($9$k%b!<%I$G$9!#(B @menu * Usage of Summary Mode:: $B;HMQJ}K!(B * Thread Operations:: $B%9%l%C%I$NA`:n(B * Cache:: $B%-%c%C%7%e$H@hFI$_5!G=(B * Auto Refile:: $B<+F0%j%U%!%$%k(B * Sticky Summary:: $B%9%F%#%C%-!<%5%^%j(B * Summary View:: $B%5%^%j9T$N7A<0(B * Mark and Action:: $B0l;~%^!<%/$H$=$N=hM}(B * Key Bindings of Summary:: $B%-!<%P%$%s%I(B * Variables of Summary:: $B%+%9%?%^%$%:JQ?t(B @end menu @node Usage of Summary Mode, Thread Operations, Summary, Summary @section $B;HMQJ}K!(B(TIPS) @subsection $B%5%^%j$NI=<(FbMF(B $B%5%^%j%b!<%I$K$O!"0J2<$N$h$&$K%a%C%;!<%8$N0lMw$,I=<($5$l$^$9!#(B @example @group 377 09/16($B?e(B)11:57 [+1: $BKLL\$5$s(B ] Bug? 381 09/17($BLZ(B)00:16 [+3: $B1|@>$5$s(B ] elmo-lha.el -- LHA interface 384 09/17($BLZ(B)01:32 [+1: $B$F$i$K$7(B ] wl-0.6.2 389 N09/18($B6b(B)01:07 [+2: $B$F$i$K$7(B ] wl-0.6.3 @end group @end example $B3F9T$O!"%a%C%;!<%8$N(B @example @var{$B%a%C%;!<%8HV9f(B}$B!"(B@var{$B0l;~E*%^!<%/(B}$B!"(B@var{$B1JB3E*%^!<%/(B}$B!"(B@var{$BF|IU$1(B}$B!"(B@var{$B:9=P?M(B}$B!"(B@var{$B%5%V%8%'%/%H(B} @end example @noindent $B$r=g$KI=<($7$F$$$^$9!#I=<(7A<0$NJQ99$K$D$$$F$O!"%5%^%j9T$N7A<0$N@a$r(B $B;2>H$7$F2<$5$$!#(B@xref{Summary View}. @var{$B%a%C%;!<%8HV9f(B}$B$O$=$N%U%)%k%@Cf$K$"$k%a%C%;!<%8$KBP$9$k%i%Y%k$G$9!#(B News $B%U%)%k%@$G$O(B article $BHV9f!"(BIMAP $B%U%)%k%@$G$O(B UID$B!"(BMH $B%U%)%k%@$G$O%U%!(B $B%$%kL>$K$J$j$^$9!#(B @var{$B0l;~E*%^!<%/(B}/@var{$B1JB3E*%^!<%/(B}$B$K$D$$$F$O!"$"$H$G>\$7$/@bL@$7$^$9!#(B @var{$BF|IU$1(B}$B$O!"(B@samp{@var{$B7n(B}/@var{$BF|(B}(@var{$BMKF|(B})@var{$B;~(B}:@var{$BJ,(B}} $B$N(B $B$h$&$KI=<($5$l$^$9!#MKF|$rF|K\8l$G$O$J$/1Q8lI=5-$7$?$$>l9g$O!"(B @code{wl-summary-weekday-name-lang} $B$r(B @samp{en} $B$K@_Dj$7$F$/$@$5$$!#(B @var{$B:9=P?M(B}$B$O!"%9%l%C%I$N?<$5J,%$%s%G%s%H$5$l$FI=<($5$l$^$9!#(B@var{$B:9=P(B $B?M(B}$B$O!"%"%I%l%9D"$K$"$@L>$,$"$l$P$"$@L>$GI=<($7$^$9!#$"$@L>I=5-$r;_$a$?(B $B$$>l9g$O!"(B@code{wl-use-petname} $B$r(B @code{nil} $B$K@_Dj$7$F$/$@$5$$!#(B @var{$B:9=P?M(B}$B$NItJ,$K$"$k(B @samp{+2} $B$N$h$&$J?t;z$O!"$=$N%a%C%;!<%8$KBP$9(B $B$kJV;v$N?t$rI=$7$^$9!#Nc$($P(B @samp{+2} $B$J$iJV;v$,(B 2 $BDL$"$k$3$H$r<($7$^$9!#(B @var{$B%5%V%8%'%/%H(B}$B$O!"%a%C%;!<%8$N(B @samp{Subject:} $B%U%#!<%k%I$G$9!#F1$8(B $B%9%l%C%I$G!"$+$D?F$HF1$8(B @samp{Subject:} $B$r;}$D%a%C%;!<%8$N>l9g$K$O!"(B @var{$B%5%V%8%'%/%H(B} $B$rI=<($7$^$;$s!#%a!<%j%s%0%j%9%H$J$I$NDL$7HV9fI=<($O(B $BL5;k$7$^$9!#(B@samp{Subject:} $B$,L5$$>l9g$K$O!"JQ?t(B @code{wl-summary-no-subject-message} $B$NFbMF$rI=<($7$^$9!#(B @subsection $B0l;~E*%^!<%/(B @cindex Mark, Temporary $B0l;~E*%^!<%/$O!"%a%C%;!<%8$rA`:n$9$k$?$a%^!<%/$G$9!#(B $B0l;~E*%^!<%/$K$O!"(B@samp{*}, @samp{d}, @samp{D}, @samp{o}, @samp{O}, @samp{i}, @samp{~} $B$,$"$j$^$9!#(B @table @samp @item * $B$^$H$a=hM}MQ%^!<%/$G$9!#(B @kbd{m} $B$G;O$^$k%3%^%s%I$G(B @samp{*}$B%^!<%/$N$D$$$?%a%C%;!<%8BP$7$F0l3g$7$?=hM}(B $B$,$G$-$^$9!#(B @item d $B=hJ,$9$k%a%C%;!<%8$KIU$/%^!<%/$G$9!#(B@kbd{d} $B$r2!$9$HIU$-$^$9!#(B @item D $B:o=|$9$k%a%C%;!<%8$KIU$/%^!<%/$G$9!#(B@kbd{D} $B$r2!$9$HIU$-$^$9!#(B @item o $B%j%U%!%$%k$9$k%a%C%;!<%8$KIU$/%^!<%/$G$9!#(B@kbd{o}$B$r2!$9$H!"%j%U%!%$%k@h(B $B$rJ9$$$FMh$^$9!#$=$l$KEz$($k$H!"%j%U%!%$%k@h$N%U%)%k%@>pJs$,IU$12C$o$j$^$9!#(B @item O $B%3%T!<$9$k%a%C%;!<%8$KIU$/%^!<%/$G$9!#(B@kbd{O}$B$r2!$9$H!"%3%T!<@h$rJ9$$$F(B $BMh$^$9!#$=$l$KEz$($k$H!"%3%T!<@h$N%U%)%k%@>pJs$,IU$12C$o$j$^$9!#(B @item i $B%W%j%U%'%C%AM=Ls$5$l$?%a%C%;!<%8$KIU$/%^!<%/$G$9!#(B@kbd{i}$B$r2!$9$HIU$-$^$9!#(B @item ~ $B:FAwM=Ls$5$l$?%a%C%;!<%8$KIU$/%^!<%/$G$9!#(B@kbd{~}$B$r2!$9$H!":FAw@h%"%I%l(B $B%9$rJ9$$$FMh$^$9!#$=$l$KEz$($k$H!":FAw@h$N%"%I%l%9>pJs$,IU$12C$o$j$^$9!#(B @end table @kbd{x} $B$r2!$9$H!"$=$l$>$l$N0l;~E*%^!<%/$KBP1~$7$?%"%/%7%g%s$ruBV$r<($9%^!<%/$G$9!#(B $B1JB3E*%^!<%/$K$O!"(B@samp{!}, @samp{N}, @samp{n}, @samp{U}, @samp{u}, @samp{A}, @samp{a}, @samp{F}, @samp{f}, @samp{$} $B$,$"$j$^$9!#(B @table @samp @item N $B?75,%a%C%;!<%8$KIU$-$^$9!#(B @item n $B?75,%a%C%;!<%8$KIU$-$^$9!#(B@samp{N} $B$H$O0[$J$j!"(B@samp{n} $B$N%a%C%;!<%8$O(B $B%-%c%C%7%e$5$l$F$$$^$9!#(B @item U $BL$FI%a%C%;!<%8$KIU$-$^$9!#(B @item u $BL$FI%a%C%;!<%8$KIU$-$^$9!#(B@samp{U} $B$H$O0[$J$j!"(B@samp{u} $B$N%a%C%;!<%8$O(B $B%-%c%C%7%e$5$l$F$$$^$9!#(B @item ! $B4{FI%a%C%;!<%8$KIU$-$^$9!#%^!<%/L5$7$H$O0[$J$j!"(B@samp{!} $B$N%a%C%;!<%8$O(B $B%-%c%C%7%e$5$l$F$$$^$;$s!#(B @item A $BJV?.:Q$_%a%C%;!<%8$KIU$-$^$9!#(B @item a $BJV?.:Q$_%a%C%;!<%8$KIU$-$^$9!#(B@samp{A} $B$H$O0[$J$j!"(B@samp{a} $B$N%a%C%;!<%8(B $B$O%-%c%C%7%e$5$l$F$$$^$9!#(B @item F $BE>Aw:Q$_%a%C%;!<%8$KIU$-$^$9!#(B @item f $BE>Aw:Q$_%a%C%;!<%8$KIU$-$^$9!#(B@samp{F} $B$H$O0[$J$j!"(B@samp{f} $B$N%a%C%;!<%8(B $B$O%-%c%C%7%e$5$l$F$$$^$9!#(B @item $ $B%0%m!<%P%k%U%i%0$N@_Dj$5$l$?%a%C%;!<%8$KIU$-$^$9!#$3$N%^!<%/$O(B Emacs $B$r(B $B=*N;$7$F$bJ]B8$5$l$k$?$a!"$"$H$GJV;v$r=q$-$?$$>l9g$J$I!"3P$($F$*$-$?$$=E(B $BMW$J%a%C%;!<%8$KIU$1$F$*$/$HJXMx$G$9!#(B@samp{$} $B$NIU$$$?%a%C%;!<%8$O!"(B($BC$5$l$?$H$7$F$b(B) @samp{'flag} $B%U%)%k%@$G1\Mw$G$-$^$9!#(B $B%0%m!<%P%k%U%i%0$O!"(B@kbd{$} $B$^$?$O!"(B@kbd{F} $B$GIU$1$k$3$H$,=PMh$^$9!#(B @item $B$J$7(B $B4{FI%a%C%;!<%8$K$O%^!<%/$,B8:_$7$^$;$s!#(B @end table @samp{N}, @samp{U}, @samp{!}, @samp{A}, @samp{F} $B$O!"$=$N%a%C%;!<%8$,%-%c%C(B $B%7%e$5$l$F$$$J$$$3$H$r<($7$F$$$^$9!#$3$l$i$N%^!<%/$,IU$$$F$$$J$$>l9g!"$D(B $B$^$j!"$=$N%a%C%;!<%8$,%-%c%C%7%e$5$l$F$$$k>l9g$O!"%M%C%H%o!<%/$K@\B3$5$l(B $B$F$$$J$/$F$b(BIMAP $B%U%)%k%@$N%a%C%;!<%8$d(B NNTP $B%U%)%k%@$N%K%e!<%95-;v$rFI(B $B$`$3$H$,$G$-$^$9!#(B $B1JB3E*%^!<%/$N$&$A!"(B@code{wl-summary-expire-reserve-marks} $B$G;XDj$7$?(B $B%^!<%/$NIU$$$?%a%C%;!<%8$O!"8e$G@bL@$9$k(B (Wanderlust $B$N5!G=$H$7$F$N(B) expire $B$NBP>]$+$i=|30$5$l$^$9!#(B@xref{Expire and Archive}. @subsection $B%a%C%;!<%8$NFI$_?J$a$+$?(B $B%5%^%j%b!<%I$G$O!"4pK\E*$K%9%Z!<%9%-!<$r2!$9$@$1$G%a%C%;!<%8$r(B $BFI$_?J$a$k$3$H$,$G$-$^$9!#(B $B%5%^%j$NI=<(FbMF$r%U%)%k%@$N:G?7$N>uBV$K9g$o$;$k(B($BF14|$9$k(B)$B$K$O!"(B @kbd{s} $B$r2!$7$^$9!#(B @kbd{N} $B$GC$7$^$9!#(B @subsection $B%P%C%U%!%-%c%C%7%e$H@hFI$_5!G=(B $B0lEYFI$s$@%a%C%;!<%8$O0lDj?t%P%C%U%!$KJ];}$5$l$^$9!#$3$l$K$h$j!"]$H$J$j$^$9!#$3$NJQ?t$O(B @code{wl-message-buffer-prefetch-folder-list} $B$h$j$bM%@h$5$l$^$9!#$9$Y$F(B $B$N%U%)%k%@$G@hFI$_5!G=$rM-8z$K$7$?$$>l9g$K$O!"(Bt $B$r;XDj$7$^$9!#(B @item wl-message-buffer-prefetch-folder-list @vindex wl-message-buffer-prefetch-folder-list $B=i4|@_Dj$O(B @code{nil}$B!#(B $B@hFI$_5!G=$rM-8z$K$9$k%U%)%k%@$r%U%)%k%@L>(B($B@55,I=8=(B)$B$N%j%9%H$G;XDj$7$^$9!#(B @item wl-message-buffer-prefetch-depth @vindex wl-message-buffer-prefetch-depth $B=i4|@_Dj$O(B 1$B!#@hFI$_5!G=$9$k%a%C%;!<%8$N?t!#(B @item wl-message-buffer-prefetch-idle-time @vindex wl-message-buffer-prefetch-idle-time $B=i4|@_Dj$O(B 1 ($BC10L(B:$BIC(B)$B!#@hFI$_5!G=$9$k;~4V4V3V!#(B @item wl-message-buffer-prefetch-threshold @vindex wl-message-buffer-prefetch-threshold $B=i4|@_Dj$O(B 30000 (bytes)$B!#$3$NCM$r1[$($k%5%$%:$N%a%C%;!<%8$O!"@hFI$_$7$^$;$s!#(B @code{wl-message-buffer-prefetch-threshold}$B$r(B @code{nil} $B$K@_Dj$9$k$H!"(B $B@hFI$_$9$k%a%C%;!<%8$N%5%$%:$r%A%'%C%/$7$^$;$s!#(B @item wl-auto-prefetch-first @vindex wl-auto-prefetch-first $B=i4|@_Dj$O(B @code{nil}$B!#(B Non-nil $B$G$"$l$P%U%)%k%@$K0\F0$7$?;~$K:G=i$N%a%C%;!<%8$r<+F0E*$K@hFI$_$7$^$9!#(B @end table @node Auto Refile, Sticky Summary, Cache, Summary @section $B<+F0%j%U%!%$%k(B @vindex elmo-msgdb-extra-fields @vindex wl-refile-rule-alist @findex wl-summary-auto-refile $B%a%C%;!<%8$N%X%C%@>pJs$+$iG$0U$N%U%)%k%@$X?6$jJ,$1$k<+F0%j%U%!%$%k5!G=$,(B @kbd{C-o} (@code{wl-summary-auto-refile}) $B$G;HMQ$G$-$^$9!#<+F0%j%U%!%$%k(B $B$O(B msgdb $B$N(B overview $B>pJs$r85$K?6$jJ,$1$7$^$9!#I8=`$G$O(B @samp{From:} @samp{Subject:} @samp{To:} @samp{Cc:} $B$,4^$^$l$F$$$^$9!#$3$l0J30$N3HD%9`(B $BL\$G?6$jJ,$1$?$$$H$-$K$O!"(B @lisp @group (setq elmo-msgdb-extra-fields '("x-ml-name" "reply-to" "sender" "mailing-list" "newsgroups")) @end group @end lisp @noindent $B$H$7$F3HD%9`L\$r(B msgdb $B$K4^$a$k$h$&$K$7$F$/$@$5$$!#4{$K$9I,MW$,$"$j(B $B$^$9!#(B $B$NJ8;zNs$r;XDj$7$^$9!#$^$?!"%U%#!<%k(B $B%IL>$NJ8;zNs$N%j%9%H$r;XDj$9$k$3$H$b$G$-$^$9!#$3$N>l9g!"%j%9%H$N$$$:$l$+(B $B$N%U%#!<%k%I$NCM$,%^%C%A$7$?$H$-$K?6$jJ,$1$r9T$$$^$9(B(OR $B>r7o$H$J$j$^$9(B)$B!#(B $B!X(B@var{$B@55,I=8=(B}$B!Y$K$O%U%#!<%k%I$NCM$K%^%C%A$5$;$k@55,I=8=J8;zNs$r;XDj$7$^$9!#(B $B!X(B@var{$B?6$jJ,$1@h(B}$B!Y$K$O?6$jJ,$1@h$N%U%)%k%@L>$NJ8;zNs$r;XDj$7$^$9!#(B $B!X(B@var{$B?6$jJ,$1@h(B}$B!YItJ,$K$O!":F$S%k!<%k$r=q$/$3$H$b$G$-!"$=$N>l9g(B $B$=$N%k!<%k$N%U%#!<%k%I$NCM$N>r7o$H8=:_$N%k!<%k$N%U%#!<%k%I$NCM$N>r7o$,(B $BK~$?$5$l$?$H$-$K?6$jJ,$1$r9T$J$$$^$9(B(AND $B>r7o$H$J$j$^$9(B)$B!#(B $B$^$?!"!X(B@var{$B@55,I=8=(B}$B!Y$G%^%C%A$7$?ItJ,J8;zNs$rMQ$$$F!"!X(B@var{$B?6$jJ,$1@h(B}$B!Y(B $B$r;XDj$9$k$3$H$b$G$-$^$9!#H$7$^$9!#(B @table @samp @item \& $B%^%C%A$7$?J8;zNsA4BN$r;2>H$7$^$9!#(B @item \@var{N} @var{N} $BHVL\$N(B @samp{\(@dots{}\)} $B$K%^%C%A$7$?J8;zNs$r;2>H$7$^$9!#(B (@var{N} $B$O?t;z(B) @end table $B0J2<$O(B @code{wl-refile-rule-alist} $B$N0lNc$G$9!#(B @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}) $B$G>r7o$K%^%C%A$7$?%a%C%;!<%8$K(B $B%j%U%!%$%k%^!<%/$,IU2C$5$l$^$9!#(B@kbd{x} $B$G%j%U%!%$%k$r]$H$J$i$J$$%a%C%;!<%8$r;XDj$9$k$3$H$,$G$-$^$9!#(B $BI8=`$G$O(B @samp{N} @samp{U} @samp{!} $B$,@_Dj$5$l$F$*$j!"(B $B$3$l$i$N1JB3E*%^!<%/$N$D$$$?%a%C%;!<%8$O!"<+F0%j%U%!%$%k$7$^$;$s!#(B $B$D$^$jI8=`$G$OL$FI$N%a%C%;!<%8$r<+F0%j%U%!%$%k$7$J$$$3$H$K$J$j$^$9!#(B $B$9$Y$F$N%a%C%;!<%8$r<+F0%j%U%!%$%k$NBP>]$K$9$k$K$O!"(B @lisp (setq wl-summary-auto-refile-skip-marks nil) @end lisp @noindent $B$NMM$K(B @code{wl-summary-auto-refile-skip-marks} $B$r(B @code{nil} $B$K$7$^$9!#(B @node Sticky Summary, Summary View, Auto Refile, Summary @section $B%9%F%#%C%-!<%5%^%j(B @cindex Summary, Sticky @cindex Sticky Summary $B%9%F%#%C%-!<%5%^%j$O!"(B@kbd{q} $B$G8=:_$N%5%^%j$r=*N;$7$F$b%P%C%U%!$,>C$($J(B $B$$!"$=$NL>$NDL$j%9%F%#%C%-!<(B($B$7$D$3$$(B)$B%5%^%j$G$9!#(B $B%U%)%k%@%b!<%I$+$i(B @kbd{Shift RET} $B!"$b$7$/$O%5%^%j(B $B$+$i(B @kbd{G} $B$7$F(B $B%5%^%j$KF~$k$H!"%9%F%#%C%-!<%5%^%j$,:n$i$l$^$9!#(B $B$^$?!"DL>o$N%5%^%j$G(B @kbd{M-s} (@code{wl-summary-stick}) $B$r$O!"(B@samp{Summary:@var{$B%U%)%k%@L>(B}} $B$H(B $B$J$j$^$9!#(B @kbd{C-x b} (@code{switch-to-buffer}) $B$J$I$G!"E,Ev$K%P%C%U%!(B $B$r@ZBX$($l$P$$$D$G$b%9%F%#%C%-!<%5%^%j$r;2>H$G$-$^$9!#$^$?!"%5%^%j%b!<%I(B $B$G(B @kbd{C-c C-n} (@code{wl-summary-previous-buffer}) $B$d(B @kbd{C-c C-p} (@code{wl-summary-next-buffer}) $B$9$k$H%5%^%j$r=d2s$G$-$^$9!#(B $B%9%F%#%C%-!<%5%^%j$G$O!"(B@kbd{q} $B$d(B @kbd{g} $B$N:]$K85$N%P%C%U%!$r(B $B;D$7$^$9!#%9%F%#%C%-!<%5%^%j$r=*N;$9$k$K$O(B @kbd{C-u q} $B$G%5%^%j$rH4$1$k(B $B$+!"(B@kbd{C-u g} $B$GJL$N%5%^%j$K0\F0$7$F2<$5$$!#$=$NB>$NA`:n$K4X$7$F$ODL>o(B $B$N%5%^%j$HF1MM$G$9!#(B $BJQ?t(B @code{wl-summary-always-sticky-folder-list} $B$K%U%)%k%@L>(B($B@55,I=8=(B) $B$N%j%9%H$r@_Dj$9$k$3$H$K$h$j!"%U%)%k%@0\F0;~$K<+F0E*$K%9%F%#%C%-!<%5%^%j(B $B$H$9$k$3$H$b$G$-$^$9!#(B @node Summary View, Mark and Action, Sticky Summary, Summary @section $B%5%^%j9T$N7A<0(B @cindex Format of summary lines $B%5%^%j9T$N7A<0$O!"$"$kDxEY<+M3$KJQ99$G$-$^$9!#(B $B%5%^%j9T$N7A<0$rJQ99$9$k$K$O(B @code{wl-summary-line-format} $B$r@_Dj$7$^$9!#(B @code{wl-summary-line-format-spec-alist} $B$GDj5A$5$l$?=q<0$rMQ$$$^$9!#(B $B0J2<$KNc$r<($7$^$9!#(B @lisp @group ;; @r{$BHV9f(B $B0l;~%^!<%/(B $B1JB3%^!<%/(B $BF|IU(B $B;^(B [ ($B;R$N?t(B) $B:9=P?M(B ] $B7oL>(B} (setq wl-summary-line-format "%n%T%P%M/%D(%W) %t%[%17(%c %f%) %] %s") @end group @end lisp $B?t;z$O7e?t$rI=$7$^$9!#Ii$N?t$N>l9g$O!"1&5M$a$K$J$j$^$9!#$^$?!":G=i$N?t;z(B $B$r(B @samp{0} $B$K$9$k$H!"7e?t$,B-$j$J$$>l9g$K(B @samp{ } $B$NBe$o$j$K(B @samp{0} $B$rDI2C$7$F7e?t$rB7$($^$9!#(B $BNc(B: @example @group %5n -> `1 ' %-05n -> `00001' @end group @end example $B%G%U%)%k%H$N(B @code{wl-summary-line-format-spec-alist} $B$GMQ0U$5$l$F$$$k(B $B=q<05-9f$N$&$A$7$?;R$N>l9g$O(B <) %] ] ($B7R$.D>$7$?;R$N>l9g$O(B >) %f $B:9=P?M(B %s $B7oL>(B %S $B%5%$%:(B %c +$B;R$N?t(B: ($B%9%l%C%I$r3+$$$?;~$N$_I=<((B) %C [+$B;R$N?t(B] ($B%9%l%C%I$r3+$$$?;~$N$_I=<((B) %# $B%a!<%j%s%0%j%9%H$N>pJs(B (`(' ML$BL>(B [ ` ' ML$BHV9f(B ] `)') %l $B%a!<%j%s%0%j%9%H$G$NHV9f(B %@@ $B:G=i$N(B MIME $B%Q!<%H$,(B multipart/mixed $B$N>l9g$K(B `@@' %~ $BD>A0$N9`L\$,6u$G$J$$>l9g$K(B ` ' @end group @end example @code{wl-summary-line-format} $B$K0l;~E*%^!<%/(B (@samp{%T}) $B$H1JB3E*%^!<%/(B (@samp{%P}) $B$r4^$a$k>l9g$K$O!"I,$:0lDj$N0LCV$KI=<($5$l$k$h$&$KDj5A$7$J$1(B $B$l$P$J$j$^$;$s!#Nc$($P!"%9%l%C%I$K$h$C$FD9$5$,JQ$o$k(B @samp{%t} $B$N$&$7$m$K(B @samp{%T} $B$d(B @samp{%P} $B$rI=<($9$k$h$&$K$7$F$7$^$&$H!"@5$7$/%^!<%/=hM}$r9T(B $B$J$($J$/$J$k2DG=@-$,$"$j$^$9!#(B $B$^$?!$(B@samp{%$B?t;z(B(}, @samp{%)} $B$G0O$s$@HO0O$O!$(B'$B?t;z(B'$B$N7e?t$K$J$j$^$9(B($BF~(B $B$l;R$b2D(B)$B!#J#?t$N=q<05-9f$KBP$9$kI}$r@_Dj$9$k$H$-$K;H$$$^$9!#Nc$($P!">e(B $B5-Nc$N(B @example %17(%c %f%) @end example $B$H$$$&;XDj$O!"!X!V;R$N?t!W$H!V:9=P?M!W$r$D$J$2$?J8;zNs$r(B 17 $B7e$K$9$k!Y$H(B $B$$$&0UL#$G$9!#(B $B$^$?!"(B@code{wl-folder-summary-line-format-alist} $B$r@_Dj$9$k$H!"%5%^%j9T(B $B$N7A<0$r%U%)%k%@Kh$K;XDj$9$k$3$H$,$G$-$^$9!#0J2<$NNc$N$h$&$K!"%U%)%k%@L>(B $B$N@55,I=8=$H%5%^%j9T$N=q<0$r;XDj$7$F2<$5$$!#(B @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 $B:9=P$7?M$NI=<(7A<0$K$D$$$F(B $B=q<05-9f(B @samp{%f} $B$O!"(B@code{wl-summary-from-function} $B$G;XDj$7$?4X?t$,JV$9CM$r(B $BI=<($7$^$9!#4X?t(B @code{wl-summary-default-from} $B$rMQ$$$k>l9g(B($B%G%U%)%k%H(B)$B!"DL>o$O(B $B:9=P?M$rI=<($7$^$9$,!"%U%)%k%@L>$,(B @code{wl-summary-showto-folder-regexp} $B$K%^%C%A$7!"$+$D:9=P?M$,<+J,$G$"$k%a%C%;!<%8$K$D$$$F$O!"08@h$rI=<($7$^$9!#(B $B$^$?!"(B @code{wl-use-petname} $B$,(B Non-nil $B$N>l9g$K$O%Z%C%H%M!<%`$rMQ$$$FI=<($7$^$9!#(B $BNc$($P!"(B@samp{+backup} $B$G$O<+J,$,=P$7$?%a%C%;!<%8$K$D$$$F$O08@h$rI=<($7$?$$>l9g!"(B $BA0$G$9!#(B @samp{ARGUMENT-FUNCTION} $B$O]$H$J$k%a%C%;!<%8$NHV9f!"(B@samp{MARK} $B$O0l;~%^!<(B $B%/$NJ8;zNs!"(B@samp{DATA} $B$O(B @samp{ARGUMENT-FUNCTION} $B$GM?$($i$l$k$b$N$G$9!#(B @samp{EXEC-FUNCTION} $B$O%"%/%7%g%s$r$7(B $B$^$9!#(B@kbd{C-u C-u .} $B$N$h$&$K(B 2$B2s$N(B @kbd{C-u} $B$rIU$1$Fl9g!"8=:_(B $B$NI=<(7A<0$r0];}$7$F:FFI$_9~$_$7D>$7$^$9!#(B(@code{wl-summary-redisplay}) @item < @kindex < (Summary) @findex wl-summary-display-top $B:G=i$N%a%C%;!<%8$rI=<($7$^$9!#(B (@code{wl-summary-display-top}) @item > @kindex > (Summary) @findex wl-summary-display-bottom $B:G8eHx$N%a%C%;!<%8$rI=<($7$^$9!#(B (@code{wl-summary-display-bottom}) @item @key{BS} @itemx @key{DEL} @kindex @key{BS} (Summary) @kindex @key{DEL} (Summary) $BA0$N%Z!<%8$rI=<($7$^$9!#(B @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 $B%+!<%=%k9T$N%a%C%;!<%8$,I=<(Cf$G$"$l$P%a%C%;!<%8$r0l9T>e$K%9%/%m!<%k$7$^(B $B$9!#I=<(Cf$G$J$1$l$P!"I=<($7$^$9!#(B(@code{wl-summary-next-line-content}) prefix argument $B$r$D$1$Fl9g$K$O!"5U$K%a%C%;!<%8$r0l9T2<$K%9%/%m!<(B $B%k$7$^$9!#(B(@code{wl-summary-prev-line-content}) $B$^$?!"(Bprefix argument $B$,(B $B?tCM$G$"$C$?>l9g$K$O!";XDj$7$?%a%C%;!<%8HV9f$r;}$D%a%C%;!<%8$X%8%c%s%W$7(B $B$^$9!#(B @item - @itemx M-@key{RET} @kindex - (Summary) @kindex M-@key{RET} (Summary) @findex wl-summary-prev-line-content $B%+!<%=%k9T$N%a%C%;!<%8$,I=<(Cf$G$"$l$P%a%C%;!<%8$r0l9T2<$K%9%/%m!<%k$7$^$9!#(B $BI=<(Cf$G$J$1$l$P!"I=<($7$^$9!#(B (@code{wl-summary-prev-line-content}) @item / @kindex / (Summary) @findex wl-thread-open-close $B%+!<%=%k9T$N%9%l%C%I$N3+JD$r%H%0%k$7$^$9!#(B prefix argument $B$D$-$J$i$P!"%+!<%=%k9T$N;R%9%l%C%I$rA4$F3+$-$^$9!#(B (@code{wl-thread-open-close}) @item [ @kindex [ (Summary) $BA4$F$N%9%l%C%I$r3+$-$^$9!#(B @findex wl-thread-open-all (@code{wl-thread-open-all}) @item ] @kindex ] (Summary) $BA4$F$N%9%l%C%I$rJD$8$^$9!#(B @findex wl-thread-close-all (@code{wl-thread-close-all}) @item g @kindex g (Summary) @findex wl-summary-goto-folder $B0c$&%U%)%k%@$K0\F0$7$^$9!#(B (@code{wl-summary-goto-folder}) @item c @kindex c (Summary) $BA4$F$N%a%C%;!<%8$rFI$s$@$3$H$K$7$^$9!#(B @findex wl-summary-mark-as-read-all (@code{wl-summary-mark-as-read-all}) @item a @kindex a (Summary) @findex wl-summary-reply $B8=:_%+!<%=%k$,$"$k9T$N%a%C%;!<%8$X$NJV;vMQ$N%I%i%U%H$rMQ0U$7$^$9!#(B (@code{wl-summary-reply}) @item A @kindex A (Summary) @findex wl-summary-reply-with-citation $B8=:_%+!<%=%k$,$"$k9T$N%a%C%;!<%8$X$NJV;vMQ$N%I%i%U%H$rK\J8$r0zMQ$7$FMQ0U$7$^$9!#(B (@code{wl-summary-reply-with-citation}) @item C @kindex C (Summary) @findex wl-summary-cancel-message $B8=:_$N%+!<%=%k$,$"$k9T$N%a%C%;!<%8$,<+J,$,=P$7$?%K%e!<%95-;v$N>l9g!"$=$NEj9F$r%-%c%s%;%k$7$^$9!#(B (@code{wl-summary-cancel-message}) @item E @kindex E (Summary) @findex wl-summary-reedit $B8=:_%+!<%=%k$,$"$k9T$N%a%C%;!<%8$NFbMF$r;}$D%I%i%U%H$rMQ0U$7$^$9!#(B $B$b$7!"(Bprefix argument $B$D$-$G$N?M$KE>Aw$9$k%I%i%U%H$rMQ0U$7$^$9!#(B (@code{wl-summary-forward}) @item $ @kindex $ (Summary) @findex wl-summary-mark-as-important @samp{important} $B%U%i%0$r$D$1$^$9!#4{$K(B @samp{important} $B%U%i%0$,$"$l$P(B $B%U%i%0$rl9g$O!"(B@kbd{F} $B$H(B $BF1MM$KIU2C$9$k%0%m!<%P%k%U%i%0$r?R$M$F$-$^$9!#(B (@code{wl-summary-mark-as-important}) @item F @kindex F (Summary) @findex wl-summary-set-flags $B%_%K%P%C%U%!$GF~NO$7$?G$0U$N%0%m!<%P%k%U%i%0$r$D$1$^$9!#(BEmacs 21$B0J9_$J$i(B @samp{,} $B$G6h@Z$C$FJ#?t$N%U%i%0$rF1;~$K@_Dj=PMh$^$9!#(Bprefix argument $B$r(B $B$D$1$Fl9g$O!"4{$K$D$$$F$$$k%0%m!<%P%k%U%i%0$re$N%a%C%;!<%8$X0\F0$7$^$9!#(B @code{wl-summary-skip-mark-list} $B$K$"$k0l;~%^!<%/$,IU$$$?%a%C%;!<%8$X$O(B $B0\F0$7$^$;$s!#%*%U%i%$%s%b!<%I$N$H$-$K$O!"(B $B%-%c%C%7%e$5$l$F$$$J$$%a%C%;!<%8$K$b0\F0$7$^$;$s!#(B (@code{wl-summary-prev}) @item N @kindex N (Summary) @findex wl-summary-down $B2l9g$O!"(B $B$^$H$a=hM}%^!<%/(B @samp{*} $B$,$D$$$?%a%C%;!<%8$KM%@hE*$K0\F0$7$^$9!#(B $B$3$N5sF0$O(B @code{wl-summary-move-order}$B$NCM$K1~$8$FJQ$o$j$^$9!#(B (@code{wl-summary-down}) @item P @kindex P (Summary) @findex wl-summary-up $B>eJ}8~$K$"$kL$FI$b$7$/$O(B @samp{$}$B%^!<%/$D$-$N%a%C%;!<%8$X0\F0$7$^$9!#(B $B%*%U%i%$%s%b!<%I$N$H$-$K$O!"%-%c%C%7%e$5$l$F$$$J$$%a%C%;!<%8$K0\F0$7$^$;$s!#(B $B$?$@$7!"$^$H$a=hM}%^!<%/(B @samp{*} $B$,$D$$$?%a%C%;!<%8$,$"$k>l9g$O!"(B $B$^$H$a=hM}%^!<%/(B @samp{*} $B$,$D$$$?%a%C%;!<%8$KM%@hE*$K0\F0$7$^$9!#(B $B$3$N5sF0$O(B @code{wl-summary-move-order}$B$NCM$K1~$8$FJQ$o$j$^$9!#(B (@code{wl-summary-up}) @item w @kindex w (Summary) @findex wl-summary-write $B?75,%I%i%U%H$rMQ0U$7$^$9!#(B (@code{wl-summary-write}) @item W @kindex W (Summary) @findex wl-summary-write-current-folder $B8=:_$N%5%^%j$,%K%e!<%9%0%k!<%W$N>l9g!"(B@samp{Newsgroups:} $B%U%#!<%k%I$rJd$C(B $B$F%I%i%U%H$rMQ0U$7$^$9!#(B $B8=:_$N%5%^%j$,%a!<%j%s%0%j%9%H$N>l9g!"%a!<%j%s%0%j%9%H$N%"%I%l%9$r?dB,$7(B $B$F(B @samp{To:} $B%U%#!<%k%I$rJd$C$F%I%i%U%H$rMQ0U$7$^$9!#(B @code{wl-subscribed-mailing-list} $B$r@_Dj$7$F$*$/I,MW$,$"$j$^$9!#(B (@code{wl-summary-write-current-folder}) @item H @kindex H (Summary) @findex wl-summary-toggle-all-header $B8=:_%+!<%=%k$,$"$k9T$N%a%C%;!<%8$r!"A4$F%X%C%@>pJs$rI=<($9$k$+$I$&$+$r@Z(B $B$j49$($F:FI=<($7$^$9!#(Bprefix argument $B$D$-$J$i$P%-%c%C%7%e$,B8:_$7$F$b(B $BL5;k$7$F:FFI$_9~$_$7D>$7$^$9!#(B@kbd{C-u C-u H} $B$N$h$&$K(B 2$B2s$N(B @kbd{C-u} $B$r(B $BIU$1$Fl9g!"8=:_$N%X%C%@$NI=<(7A<0$r%5%^%j$N%G%U%)%k%HCM$H$7$F(B $B@_Dj$7$^$9!#(B (@code{wl-summary-toggle-all-header}) @item M @kindex M (Summary) @findex wl-summary-toggle-mime $B8=:_%+!<%=%k$,$"$k9T$N%a%C%;!<%8$r!"(BMIME $B2r@O$N;XDj$r@Z$j49$($F:FI=<($7$^(B $B$9!#@Z$j49$($O!"(B@code{wl-summary-display-mime-mode-list} $B$K;XDj$5$l$?=g$K(B $B9T$o$l$^$9!#$^$?!"?tCM$N(B prefix argument $B$D$-$Gl9g!"0J2<$N$h$&$K(B $BD>@\@Z$j49$($k$3$H$,=PMh$^$9!#(B @example @group 1: MIME $B2r@O$rM-8z$K$7$^$9(B 2: $B%X%C%@$N$_(B MIME $B2r@O$rM-8z$K$7$^$9(B 3: MIME $B2r@O$rL58z$K$7$^$9(B @end group @end example @kbd{C-u C-u M} $B$N$h$&$K(B 2$B2s$N(B @kbd{C-u} $B$rIU$1$Fl9g!"8=:_$N;XDj(B $B$r%5%^%j$N%G%U%)%k%HCM$H$7$F@_Dj$7$^$9!#(B(@code{wl-summary-toggle-mime}) @item C-c C-f @kindex C-c C-f (Summary) @findex wl-summary-toggle-header-narrowing $B8=:_%+!<%=%k$,$"$k9T$N%a%C%;!<%8$N%X%C%@$N>JN,I=<($r%H%0%k$7$^$9!#(B (@code{wl-summary-toggle-header-narrowing}) @item B @kindex B (Summary) @findex wl-summary-burst $B8=:_%+!<%=%k$,$"$k9T$N%a%C%;!<%8$,(B MIME $B$G%+%W%;%k2=$5$l$?J#?t$N%a%C%;!<%84^$`>l9g!"(B $B$=$l$i$r8=:_$N%U%)%k%@$K$[$I$-$^$9!#(B $B=q$-9~$_IT2D$N%U%)%k%@$K5o$k>l9g$d(B prefix argument $B$r$D$1$Fl9g(B $B$K$O!"E83+@h$N%U%)%k%@$r?R$M$^$9!#(B (@code{wl-summary-burst}) @item @@ @kindex @@ (Summary) @findex wl-summary-edit-petname $B%5%^%j9T$N%a!<%k$N(B @samp{From:} ($BH/?.l9g$OJQ99(B/$B:o=|$b$G$-$^$9!#(B prefix argument $B$D$-$GuBV$r:G?7$N$b$N$K99?7$7$^$9!#(B (@code{wl-status-update}) @item | @kindex | (Summary) @findex wl-summary-pipe-message $B8=:_$N%a%C%;!<%8$NFbMF$rB>$N%W%m%;%9$K%Q%$%W7PM3$G0z$-EO$7$^$9!#(B (@code{wl-summary-pipe-message}) @item # @kindex # (Summary) @findex wl-summary-print-message $B8=:_$N%a%C%;!<%8$NFbMF$r0u:~$7$^$9!#(BEmacs 20$B0J9_(B $B$G$O(B @code{ps-print} $B$r(B $B;H$$$^$9!#Gr9u%W%j%s%?$G$O!"(B@code{wl-ps-print-buffer-function} $B$r(B @code{ps-print-buffer} $B$K@_Dj$7$?$[$&$,NI$$$+$b$7$l$^$;$s!#(B @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 $B8=:_$N%U%)%k%@$rC&=P$7$^$9!#(B (@code{wl-summary-exit}) @item j @kindex j (Summary) @findex wl-summary-jump-to-current-message $B8=:_I=<(Cf$N%a%C%;!<%8$N%P%C%U%!$K0\F0$7$^$9!#(B (@code{wl-summary-jump-to-current-message}) @item J @kindex J (Summary) $BB>$N%a%C%;!<%8$K%8%c%s%W$7$^$9!#(B @findex wl-summary-jump-to-msg (@code{wl-summary-jump-to-msg}) @item I @kindex I (Summary) $B%5%^%j$NI=<($r99?7$7$?8e!"(B @code{wl-summary-incorporate-marks} $B$K4^$^$l$k%^!<%/$r;}$D%a%C%;!<%8$r(B $B%W%j%U%'%C%A$7$^$9!#(B @findex wl-summary-incorporate (@code{wl-summary-incorporate}) @item M-j @kindex M-j (Summary) @findex wl-summary-jump-to-msg-by-message-id $BF~NO$7$?(B @samp{Message-ID:} $B$r;}$D%a%C%;!<%8$N9T$K%8%c%s%W$7$^$9!#(B @code{elmo-use-database} $B$,(B non-nil$B$J$i!"8=:_$N%5%^%j0J30$+$i$b8uJd$r8!(B $B:w$7$^$9!#(B(@code{wl-summary-jump-to-msg-by-message-id}) @item ^ @kindex ^ (Summary) $B8=:_$N%a%C%;!<%8$N?F%a%C%;!<%8$K0\F0$7$^$9!#(B @findex wl-summary-jump-to-parent-message (@code{wl-summary-jump-to-parent-message}) @item ! @kindex ! (Summary) @findex wl-summary-mark-as-unread $B%+!<%=%k$,$"$k9T$N%a%C%;!<%8$rFI$^$J$+$C$?$3$H$K$7$^$9!#(B (@code{wl-summary-mark-as-unread}) @item s @kindex s (Summary) @findex wl-summary-sync $B%a%C%;!<%8$N0lMwI=<($N99?7%l%s%8$NF~NO$rpJs$r$7$^$9!#(B killed $B%a%C%;!<%8$O$7$^$;$s!#(B all-entirely $B8=:_$N(B msgdb $B$NFbMF$rGK4~$7!"A4>pJs$r$7$^$9!#(B killed $B%a%C%;!<%8$b$7$^$9!#(B update $BJ];}$7$F$$$k(B msgdb $B$N>pJs$H:G?7>pJs$N:9J,$r99?7$7$^$9!#(B killed $B%a%C%;!<%8$O99?7$7$^$;$s!#(B update-entirely $BJ];}$7$F$$$k(B msgdb $B$N>pJs$H:G?7>pJs$N:9J,$r99?7$7$^$9!#(B killed $B%a%C%;!<%8$b99?7$7$^$9!#(B rescan $B8=:_$N(B msgdb $B$K4p$E$$$F:FI=<($r9T$$$^$9!#(B rescan-noscore $B8=:_$N(B msgdb $B$K4p$E$$$F:FI=<($r9T$$$^$9!#(B $B%9%3%"$K$h$j>C$($?%a%C%;!<%8$bI=<($7$^$9!#(B rescan-thread $B8=:_$N(B msgdb $B$K4p$E$$$F:FI=<($r9T$$$^$9!#(B $B%9%l%C%I$N>pJs$b:F9=C[$7$^$9!#(B cache-status $B%-%c%C%7%e$N>uBV$r%^!<%/$KH?1G$7$^$9!#(B mark $B%^!<%/$N>uBV$r:G?7$K$7$^$9!#(B no-sync $B2?$b$7$^$;$s!#(B first:$B?t;z(B $B%U%#%k%?%U%)%k%@$K0\F0$7$^$9!#(B last:$B?t;z(B $B%U%#%k%?%U%)%k%@$K0\F0$7$^$9!#(B @end group @end example @noindent (@code{wl-summary-sync}) @item S @kindex S (Summary) @findex wl-summary-sort $B%5%^%j$NI=<(=g=x$rJB$SBX$($^$9!#(B@samp{date} ($BF|IU(B)$B!"(B@samp{from} ($BH/?.A0$H%a%C%;!<%8HV9f(B) $B$N$$$:$l$+$r85$KJB$SBX$($^$9!#(B prefix argument $B$D$-$J$i$P!"A*$s$@=g=x$N5U=g$G%5%^%j$rJB$SBX$($^$9!#(B (@code{wl-summary-sort}) @item T @kindex T (Summary) @findex wl-summary-toggle-thread $B%9%l%C%II=<($r%H%0%k$7$^$9!#$=$N>uBV$O(B Wanderlust $B$r=*N;$7$F$bJ]B8$5$l(B $B$^$9!#?75,$K:n@.$5$l$?%5%^%j$KBP$7$F$N%G%U%)%k%H$N>uBV$O(B @code{wl-summary-default-view} $B$d(B @code{wl-summary-default-view-alist} $B$G;XDj$9$k$3$H$,$G$-$^$9!#(B $B8=:_$N%9%l%C%II=<(>uBV$O%b!<%I%i%$%s$KI=<($5$l$^$9!#(B @samp{@{S@}} $B$O%9%l%C%I!&%*%U(B(Sequence)$B$N>uBV!"(B @samp{@{T@}} $B$O%9%l%C%I!&%*%s(B(Thread)$B$N>uBV$r<($7$^$9!#(B (@code{wl-summary-toggle-thread}) @item l @kindex l (Summary) @findex wl-summary-toggle-disp-folder $B%U%)%k%@%b!<%I$N%P%C%U%!$NI=<($r%H%0%k$7$^$9!#(B (@code{wl-summary-toggle-disp-folder}) @item v @kindex v (Summary) $B%a%C%;!<%8$N%P%C%U%!$NI=<($r%H%0%k$7$^$9!#(B @findex wl-summary-toggle-disp-msg (@code{wl-summary-toggle-disp-msg}) @item V @kindex V (Summary) $BM?$($i$l$?>r7o$r;}$D%a%C%;!<%8$N$_$r;}$D2>A[%U%)%k%@(B($B%U%#%k%?%U%)%k%@(B)$B$X(B $B0\F0$7$^$9!#(Bprefix argument $B$D$-$GA[%U%)%k%@$+$iC&=P$7$^$9!#(B @findex wl-summary-virtual (@code{wl-summary-virtual}) @item @key{TAB} @kindex @key{TAB} (Summary) @findex wl-summary-goto-last-displayed-msg $B$5$C$-I=<($7$?%a%C%;!<%8$KHt$S$^$9!#(B (@code{wl-summary-goto-last-displayed-msg}) @item ? @kindex ? (Summary) @findex wl-summary-pick $BM?$($i$l$?>r7o$r;}$D%a%C%;!<%8$K$^$H$a=hM}%^!<%/(B @samp{*} $B$r$D$1$^$9!#DL(B $B>o$O!"4{$K$D$$$F$$$k(B @samp{*} $B%^!<%/$O$=$N$^$^$G!"C1$KDI2C$5$l$^$9$,!"(B prefix argument $B$r$D$1$Fl9g$K$O!"0JA0$N%^!<%/$r:o=|$7$FCV$-49$((B $B$^$9!#(B(@code{wl-summary-pick}) @item R @kindex R (Summary) @findex wl-summary-mark-as-read $B%+!<%=%k9T$N%a%C%;!<%8$rFI$s$@$3$H$K$7$^$9!#(B (@code{wl-summary-mark-as-read}) @item x @kindex x (Summary) $B%5%^%j%P%C%U%!$N$9$Y$F$N%a%C%;!<%8$KBP$7$F!"0l;~E*%^!<%/$KBP1~$9$k%"%/%7%g%s(B $B$rA0$K%j%U%!%$%k$7$?%U%)%k%@$HF1$8%U%)%k%@08$K!"(B $B%j%U%!%$%k%^!<%/$r$D$1$^$9!#(B @findex wl-summary-refile-prev-destination (@code{wl-summary-refile-prev-destination}) @item d @kindex d (Summary) @findex wl-summary-dispose $B%+!<%=%k9T$N%a%C%;!<%8$K=hJ,%^!<%/$r$D$1$^$9!#(B $B=hJ,$N7k2L$O(B @code{wl-dispose-folder-alist} $B$G@)8f$G$-!"%G%U%)%k%H$G$O(B @code{wl-trash-folder} $B$K%j%U%!%$%k$5$l$^$9!#(B (@code{wl-summary-dispose}) @xref{Mark and Action}. @item D @kindex D (Summary) @findex wl-summary-delete $B%+!<%=%k9T$N%a%C%;!<%8$K6/@):o=|%^!<%/$r$D$1$^$9!#(B (@code{wl-summary-delete}) @xref{Mark and Action}. @item i @kindex i (Summary) $B%+!<%=%k9T$N%a%C%;!<%8$K%W%j%U%'%C%AM=Ls%^!<%/$rIU$1$^$9!#(B @findex wl-summary-prefetch (@code{wl-summary-prefetch}) @xref{Mark and Action}. @item ~ @kindex ~ (Summary) @findex wl-summary-resend $B%+!<%=%k9T$N%a%C%;!<%8$K:FAwM=Ls%^!<%/$rIU$1$^$9!#(B (@code{wl-summary-resend}) @xref{Mark and Action}. @item u @kindex u (Summary) @findex wl-summary-unmark $B%+!<%=%k9T$N%a%C%;!<%8$K0l;~E*%^!<%/$,$"$l$PC$7$^$9!#(B (@code{wl-summary-delete-all-temp-marks}) @findex wl-summary-delete-all-temp-marks @item m a @kindex m a (Summary) $BA4$F$N%a%C%;!<%8$K$^$H$a=hM}MQ%^!<%/(B @samp{*} $B$rIU$1$^$9!#(B (@code{wl-summary-target-mark-all}) @findex wl-summary-target-mark-all @item m t @kindex m t (Summary) $B$^$H$a=hM}MQ%^!<%/(B @samp{*} $B$r8=:_$N%9%l%C%I$K$D$1$^$9!#(B @findex wl-summary-target-mark-thread (@code{wl-summary-target-mark-thread}) @item m r @kindex m r (Summary) @findex wl-summary-target-mark-region $B;XDj$5$l$?%j!<%8%g%s$K$^$H$a=hM}MQ%^!<%/(B @samp{*} $B$r$D$1$^$9!#(B (@code{wl-summary-target-mark-region}) @item m A @kindex m A (Summary) @findex wl-summary-target-mark-reply-with-citation $B$^$H$a=hM}MQ%^!<%/(B @samp{*} $B$N$D$$$?%a%C%;!<%8$r0zMQ$7$FJV;v$r=q$/%I%i%U%H(B $B$rMQ0U$7$^$9!#(B (@code{wl-summary-target-mark-reply-with-citation}) @item m f @kindex m f (Summary) @findex wl-summary-target-mark-forward $B$^$H$a=hM}MQ%^!<%/(B @samp{*} $B$N$D$$$?%a%C%;!<%8$r%U%)%o!<%I$9$k%I%i%U%H$r(B $BMQ0U$7$^$9!#(B (@code{wl-summary-target-mark-forward}) @item m U @kindex m U (Summary) @findex wl-summary-target-mark-uudecode $B$^$H$a=hM}MQ%^!<%/(B @samp{*} $B$N$D$$$?%a%C%;!<%8$r$^$H$a$F(B uudecode $B$7$^$9!#(B (@code{wl-summary-target-mark-uudecode}) @item m ? @kindex m ? (Summary) @findex wl-summary-target-mark-pick $B$^$H$a=hM}MQ%^!<%/(B @samp{*} $B$N$D$$$?%a%C%;!<%8$NFb!"(B $B>r7o$K%^%C%A$9$k%a%C%;!<%8$N(B @samp{*} $B%^!<%/$N$_$r;D$7$^$9!#(B (@code{wl-summary-target-mark-pick}) @item m # @kindex m # (Summary) @findex wl-summary-target-mark-print $B$^$H$a=hM}MQ%^!<%/(B @samp{*} $B$N$D$$$?%a%C%;!<%8$r0u:~$7$^$9!#(B (@code{wl-summary-target-mark-print}) @item m | @kindex m | (Summary) @findex wl-summary-target-mark-pipe $B$^$H$a=hM}MQ%^!<%/(B @samp{*} $B$N$D$$$?%a%C%;!<%8$=$l$>$l$r!"(B $B;XDj$7$?B>$N%W%m%;%9$K%Q%$%W7PM3$G0z$-EO$7$^$9!#(B (@code{wl-summary-target-mark-pipe}) @item M-t @kindex M-t (Summary) @findex wl-toggle-plugged Wanderlust $B$N%*%U%i%$%s%b!<%I(B/$B%*%s%i%$%s%b!<%I$r%H%0%k$7$^$9!#(B (@code{wl-toggle-plugged}) @item C-t @kindex C-t (Summary) Wanderlust $B$N%5!<%P!&%]!<%HJL$N%*%U%i%$%s(B/$B%*%s%i%$%s$rJQ99$7$^$9!#(B (@code{wl-plugged-change}) @item C-c C-o @kindex C-c C-o (Summary) @findex wl-jump-to-draft-buffer $B%I%i%U%H%P%C%U%!$,$"$l$P0\F0$7$^$9!#(B $BJ#?t$N%I%i%U%H%P%C%U%!$,B8:_$9$k>l9g$O!"(B $Bl9g$O!"%I%i%U%H%U%)%k%@$+$i%U%!%$%k$r(B($BB8:_$9$l$P(B) $BFI$_9~$_$^$9!#(B (@code{wl-jump-to-draft-buffer}) @item M-w @kindex M-w (Summary) @findex wl-summary-save-current-message $B%+!<%=%k9T$N%a%C%;!<%8$N%3%T!l9g$K$O!"<+F0E*$Ke5-0J30!'(B $BuBV$G%5%^(B $B%j$KI=<($5$l$^$9!#(B @item wl-thread-open-reading-thread @vindex wl-thread-open-reading-thread $B=i4|@_Dj$O(B @code{t}$B!#(BNon-nil $B$J$i!"JD$8$?>uBV$N(B thread $B$X0\F0$7$?;~$K<+(B $BF0E*$K(B thread $B$r3+$-$^$9!#(B @item wl-summary-exit-next-move @vindex wl-summary-exit-next-move $B=i4|@_Dj$O(B @code{t}$B!#(BNon-nil $B$J$i!"%5%^%j$r=*N;$9$k$H$-$K$N%U%)%k%@$K0\F0$9$k$H%U%)(B $B%k%@%b!<%I$G$N%+!<%=%k0LCV$b9g$o$;$F0\F0$7$^$9!#(B @item wl-summary-weekday-name-lang @vindex wl-summary-weekday-name-lang $B%5%^%j$NMKF|I=<($N8@8l$r;XDj$7$^$9!#(B@samp{en} $B$J$i(B $B1Q8l!"(B@samp{fr} $B$J$i%U%i%s%98l!"(B@samp{de} $B$J$i%I%$%D8l$H$J$j$^$9!#(B $BCM$rJQ99$7$?8e$K$O!"%5%^%j$r(B rescan $B$7$F2<$5$$!#(B @item wl-summary-fix-timezone @vindex wl-summary-fix-timezone $B=i4|@_Dj$O(B @code{nil}$B!#%5%^%j$NF|;~I=<($r;XDj$7$?%?%$%`%>!<%s$KD>$7$^$9!#(B @code{nil} $B$J$i$P!"%G%U%)%k%H$N%?%$%`%>!<%s$r;2>H$7$FD>$7$^$9!#(B $B%G%U%)%k%H$N%?%$%`%>!<%s$H$O!"%7%9%F%`$K$"$i$+$8$a@_Dj$5$l$?%?%$%`%>!<%s$+!"(B $B4D6-JQ?t(B @samp{TZ} $B$NCM$G$9!#(B @item wl-use-petname @vindex wl-use-petname $B=i4|@_Dj$O(B @code{t}$B!#(B Non-nil $B$J$i%5%^%j$N(B From $BItJ,$K$"$@L>$rI=<($7$^$9!#(B @item wl-break-pages @vindex wl-break-pages $B=i4|@_Dj$O(B @code{t}$B!#(B Non-nil $B$J$i!"(B@samp{^L} $B$G2~%Z!<%8$7$F%a%C%;!<%8$rI=<($7$^$9!#(B @item wl-summary-from-function @vindex wl-summary-from-function $B%5%^%j$N:9=P?MI=<($N@07A$K;H$&4X?t$r;XDj$7$^$9!#(B $B=i4|@_Dj$O(B @code{wl-summary-default-from} $B$G$9!#(B @item wl-summary-no-from-message @vindex wl-summary-no-from-message $B=i4|@_Dj$O(B @samp{nobody@@nowhere?}$B!#(B $B%a%C%;!<%8$K(B @samp{From:} $B$,L5$+$C$?>l9g$K%5%^%j$KI=<($9$kJ8;zNs$G$9!#(B @item wl-summary-subject-function @vindex wl-summary-subject-function $B%5%^%j$N%5%V%8%'%/%HI=<($N@07A$K;H$&4X?t$r;XDj$7$^$9!#(B $B=i4|@_Dj$O(B @code{wl-summary-default-subject} $B$G!"%5%V%8%'%/%H@hF,$N(B $B%j%9%HL>$J$IItJ,$r%+%C%H$7$^$9!#(B $B%5%V%8%'%/%H$r$=$N$^$^I=<($9$k$K$O0J2<$N$h$&$K@_Dj$7$^$9!#(B @lisp (setq wl-summary-subject-function 'identity) @end lisp @item wl-summary-no-subject-message @vindex wl-summary-no-subject-message $B=i4|@_Dj$O(B @samp{(WL:No Subject in original.)}$B!#%a%C%;!<%8$K(B @samp{Subject:} $B$,L5$+$C$?>l9g$K%5%^%j$KI=<($9$kJ8;zNs$G$9!#(B @item wl-summary-default-view @vindex wl-summary-default-view $B=i4|@_Dj$O(B @code{'thread}$B!#(B $B?75,$K:n@.$5$l$?%5%^%j$N>uBV$r%9%l%C%II=<($J$i(B @code{'thread}$B!"(B $BHV9f=g$J$i(B @code{'sequence} $B$N$$$:$l$+$G;XDj$7$^$9!#(B @item wl-summary-use-frame @vindex wl-summary-use-frame $B=i4|@_Dj$O(B @code{nil}$B!#(B Non-nil $B$J$i%5%^%jI=<(MQ$K?7$7$$%U%l!<%`$r3+$-$^$9!#(B @item wl-use-folder-petname @vindex wl-use-folder-petname $B=i4|@_Dj$O0J2<$N%j%9%H!#(B @lisp @group (modeline) @end group @end lisp @noindent $B%U%)%k%@$N$"$@L>(B (petname) $B$r;HMQ$9$k>l=j(B($B%7%s%\%k(B)$B$N%j%9%H$r;XDj$7$^$9!#(B $B;XDj$G$-$k%7%s%\%k$Oe$+2<$+$r@Z$jBX$($k!#FI$s$G(B $B$$$kJ}8~$r0U<1$7$?$$$H$-$O(B @code{t} $B$K$9$k$HNI$$$G$7$g$&!#(B @item wl-summary-width @vindex wl-summary-width $B=i4|@_Dj$O(B 80$B!#%5%^%j$NI=<(I}$r@_Dj$5$l$?CM$K@Z$j5M$a$^$9!#(B@code{nil} $B$J(B $B$iI=<(I}$r@Z$j5M$a$^$;$s!#(B @item wl-summary-print-argument-within-window @vindex wl-summary-print-argument-within-window $B=i4|@_Dj$O(B @code{nil}$B!#(BNon-nil $B$J$i(B @code{wl-summary-width} $B$,(B @code{nil} $B$G$"$C$F$b%&%#%s%I%&$N1&C<$KB7$($F!"%"%/%7%g%s0z?t$rI=<($7$^(B $B$9!#(B @item wl-summary-indent-length-limit @vindex wl-summary-indent-length-limit $B=i4|@_Dj$O(B 46$B!#@_Dj$5$l$?CM0J>e%5%^%j$r%$%s%G%s%H$7$^$;$s!#(B@code{nil} $B$J(B $B$i%5%^%j$N%$%s%G%s%H$rL5@)8B$K$7$^$9!#(B $BCM$r(B @code{nil} $B$K$9$k$H$-$O!"(B@code{wl-summary-width} $B$b(B @code{nil} $B$K@_Dj(B $B$9$k$H$h$$$G$7$g$&!#(B @item wl-summary-max-thread-depth @vindex wl-summary-max-thread-depth $B=i4|@_Dj$O(B 30$B!#@_Dj$5$l$?CM0J>e$N?<$5$N%9%l%C%I$rJ,3d$7$^$9!#(B @item wl-summary-recenter @vindex wl-summary-recenter $B=i4|@_Dj$O(B @code{t}$B!#(BNon-nil $B$J$i$PI=<($7$?$H$-$KI=<(Cf$N%a%C%;!<%8$N%5(B $B%^%j9T$r%&%#%s%I%&$NCf1{IU6a$K0\F0$7$^$9!#(B @item wl-summary-max-thread-depth @vindex wl-summary-max-thread-depth $B=i4|@_Dj$O(B 30$B!#(B $B%9%l%C%I$N?<$5$,$3$NCM$h$jBg$-$/$J$k$H%9%l%C%I$rJ,3d$7$^$9!#(B @item wl-summary-divide-thread-when-subject-changed @vindex wl-summary-divide-thread-when-subject-changed $B=i4|@_Dj$O(B @code{nil}$B!#(B Non-nil $B$J$i%5%V%8%'%/%H$,JQ$o$C$?$H$-$K%9%l%C%I$r@Z$j$^$9!#(B @item wl-summary-search-via-nntp @vindex wl-summary-search-via-nntp $B=i4|@_Dj$O(B @code{confirm}$B!#(B Non-nil $B$J$i(B @code{wl-summary-jump-to-msg-by-message-id} $B$G!"%a%C%;!<%8(B $B$r8+$D$1$k$3$H$,$G$-$J$+$C$?$H$-$K!"(B @code{wl-summary-jump-to-msg-by-message-id-via-nntp} $B$r8F$S!"(B @code{elmo-nntp-default-server} $B$G;XDj$5$l$?%5!<%P$+$i8!:w$7$^$9!#$3$N$H(B $B$-(B @code{elmo-nntp-default-user}, @code{elmo-nntp-default-port}, @code{elmo-nntp-default-stream-type} $B$G;XDj$7$?>r7o$G%5!<%P$H@\B3$7$^$9!#(B @code{confirm} $B$J$i(B @code{elmo-nntp-default-*} $B$G;XDj$5$l$?%5!<%P$+$i8!(B $B:w$9$k$+!"%5!<%P$r;XDj$9$k$+$r3NG'$7$^$9!#$3$N>l9g!"%5!<%P$N%[%9%HL>!"$b(B $B$7$/$O(B @samp{-:username@@servername:119!} $B$N$h$&$K(B NNTP $B%U%)%k%@7A<0$G$N(B $B;XDj$,2DG=$G$9!#(B @item wl-summary-keep-cursor-command @vindex wl-summary-keep-cursor-command $B=i4|@_Dj$O0J2<$N%j%9%H!#(B @lisp @group (wl-summary-goto-folder wl-summary-goto-last-visited-folder) @end group @end lisp @noindent $B4{$KB8:_$9$k%5%^%j$X0\F0$7$?$H$-$K99?7$;$:!"%+!<%=%k0LCV$rJ]B8$9$k(B $B%3%^%s%I$N%j%9%H$G$9!#(B @item elmo-folder-update-threshold @vindex elmo-folder-update-threshold $B=i4|@_Dj$O(B 500$B!#$3$NCM$h$j%5%^%j$N99?7?t$,B?$$>l9g!"0lItJ,$@$199?7$9$k$+(B $B$I$&$+!"l9g!K!#(B @item elmo-folder-update-confirm @vindex elmo-folder-update-confirm $B=i4|@_Dj$O(B @code{t}$B!#(BNon-nil $B$J$i$P(B @code{elmo-folder-update-threshold} $B$K$h$kH=Dj$r9T$$$^$9!#(B @item wl-summary-always-sticky-folder-list @vindex wl-summary-always-sticky-folder-list $B=i4|@_Dj$O(B @code{nil}$B!#%U%)%k%@L>(B($B@55,I=8=(B)$B$N%j%9%H$r@_Dj$9$k$3$H$K$h$j!"(B $B<+F0E*$K%9%F%#%C%-!<%5%^%j$H$9$k$+$I$&$+$r%U%)%k%@Kh$K;XDj$7$^$9!#(B @item wl-summary-reserve-mark-list @vindex wl-summary-reserve-mark-list $B=i4|@_Dj$O0J2<$N%j%9%H!#(B @lisp @group ("o" "O" "D" "d" "i") @end group @end lisp @noindent $B$3$N%j%9%H$K$"$k0l;~%^!<%/$O!">C$5$J$$8B$j>e=q$-$5$l$^$;$s!#(B @item wl-summary-skip-mark-list @vindex wl-summary-skip-mark-list $B=i4|@_Dj$O0J2<$N%j%9%H!#(B @lisp @group ("D" "d") @end group @end lisp @noindent $B$3$N%j%9%H$K$"$k0l;~%^!<%/$NIU$$$?%a%C%;!<%8$O!"%+!<%=%k0\F0$N:]$K%9%-%C(B $B%W$5$l$^$9!#(B @item elmo-message-fetch-threshold @vindex elmo-message-fetch-threshold $B=i4|@_Dj$O(B 30000 (bytes)$B!#$3$NCM$r1[$($k%5%$%:$N%a%C%;!<%8$rI=<($9$k;~$K!"(B $B3NG'$r5a$a$^$9!J(B@code{elmo-message-fetch-confirm} $B$,(B non-nil $B$N>l9g!K!#(B @item elmo-message-fetch-confirm @vindex elmo-message-fetch-confirm $B=i4|@_Dj$O(B @code{t}$B!#(BNon-nil $B$J$i$P(B @code{elmo-message-fetch-threshold} $B$K(B $B$h$kH=Dj$r9T$$$^$9!#(B @item wl-prefetch-threshold @vindex wl-prefetch-threshold $B=i4|@_Dj$O(B 30000 (bytes)$B!#(B@code{wl-prefetch-threshold} $B$r1[$($k%5%$%:$N(B $B%a%C%;!<%8$O!"(B@code{wl-prefetch-confirm} $B$,(B non-nil $B$N>l9g!"%W%j%U%'%C%A(B $B;~$K3NG'$r5a$a$^$9!#(B@code{wl-prefetch-threshold}$B$r(B @code{nil} $B$K$9$k$H!"(B @code{wl-prefetch-confirm} $B$NCM$K$+$+$o$i$:%W%j%U%'%C%A$ruBV$G$b%-%c%C%7%e$r(B $B;H$C$F:FAw$7$^$9!#%-%c%C%7%e$rMQ$$$F:FAw$9$k$H!"I,$:$7$b0U?^$7$?(B $B%a%C%;!<%8$,;H$o$l$k$H$O8B$i$J$$$3$H$KN10U$7$F$/$@$5$$!#(B @item wl-folder-process-duplicates-alist @vindex wl-folder-process-duplicates-alist $B=i4|@_Dj$O(B @code{nil}$B!#=EJ#$7$?%a%C%;!<%8$,F1$8%U%)%k%@$K$"$k>l9g$NF0:n(B $B$r;XDj$7$^$9!#3F9`L\$O!"%U%)%k%@L>$N@55,I=8=$HF0:n$+$i$J$j$^$9!#(B $BF0:n$H$7$F$O0J2<$N$b$N$,;XDj$G$-$^$9!#(B @example @code{nil} : $B=EJ#%a%C%;!<%8$KBP$7!$2?$b$7$J$$!%(B @code{hide} : $B=EJ#%a%C%;!<%8$r%5%^%j$KI=<($7$J$$!%(B @code{read} : $B=EJ#%a%C%;!<%8$r4{FI$K$9$k!%(B @end example @noindent $BNc$($P0J2<$N$h$&$K@_Dj$7$^$9(B ($B%^%k%A%U%)%k%@$G=EJ#%a%C%;!<%8$r1#$9>l9g(B) @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 $B=i4|@_Dj$O0J2<$NDL$j!#(B @lisp @group ((important "orange")) @end group @end lisp $B%5%^%j$G$N%U%i%0$D$-%a%C%;!<%8$N?'$H%^!<%/$r;XDj$7$^$9!#%^!<%/$r>JN,$7$?(B $B>l9g$O!"(B@code{wl-summary-flag-mark} $B$K;XDj$5$l$?%^!<%/$,;HMQ$5$l$^$9!#0l(B $B$D$N%a%C%;!<%8$KJ#?t$N%0%m!<%P%k%U%i%0$,@_Dj$5$l$F$$$k>l9g$K$O!"$3$N%j%9(B $B%H$NA0J}$K$"$k%U%i%0$,M%@h$5$l$^$9!#(B $B@_DjNc(B: @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 $B=i4|@_Dj$O0J2<$N%j%9%H!#(B @lisp @group (mime as-is) @end group @end lisp @noindent @code{wl-summary-toggle-mime} $B$O$3$N%j%9%H$N=g$K(B MIME $B2r@O$N;XDj$r@Z$j49(B $B$($^$9!#(BMIME $B2r@O$NJ}<0$K$O0J2<$N$b$N$,;XDj$G$-$^$9!#(B @example @code{mime} : MIME $B2r@O$r9T$$$^$9(B @code{header-only} : $B%X%C%@$N$_(B MIME $B2r@O$r9T$$$^$9(B @code{as-is} : MIME $B2r@O$r9T$$$^$;$s(B @end example @end table @node Message, Draft, Summary, Top @chapter $B%a%C%;!<%8%P%C%U%!(B $B%a%C%;!<%8%P%C%U%!$O(B SEMI $B$N(B MIME-View mode $B$G$9!#(B $BA`:n$NJ}K!!"%-!<%P%$%s%I$O$=$l$>$l$N%I%-%e%a%s%H$r;2>H$7$F$/$@$5$$!#(B @xref{MIME-View, , ,mime-ui-ja, a MIME user interface for GNU Emacs}. $B$^$?!"%a%C%;!<%8%P%C%U%!$K$*$$$F!"(B@kbd{?} $B$G%X%k%W$,;2>H$G$-$^$9!#(B $B%a%C%;!<%8$N@hF,$G(B @kbd{p}$B!"%a%C%;!<%8$N:G8eHx$G(B @kbd{n} $B$r2!$9$H!"%5%^(B $B%j%b!<%I$KLa$j$^$9!#$^$?!"(B@kbd{l} $B$r2!$9$H!"%5%^%j%b!<%I%P%C%U%!$NI=<($r(B $B%H%0%k$7$^$9!#(B @section $B%-!<%P%$%s%I(B @cindex Keybind, Message Mode @cindex Keybind, Message Buffer @table @kbd @item l @kindex l (Message) @findex wl-message-toggle-disp-summary $B%5%^%j%P%C%U%!$rI=<($9$k$+$I$&$+$r%H%0%k$7$^$9!#(B (@code{wl-message-toggle-disp-summary}) @item Button-2 @kindex Button-2 (Message) @findex wl-message-button-refer-article @findex wl-message-header-narrowing $B%^%&%9%]%$%s%?$N0LCV$K(B @samp{Message-ID:} $B$,$"$C$?$H$-$KBP1~$9$k%a%C%;!<(B $B%8$,8+$D$+$l$PI=<($7$^$9!#(B(@code{wl-message-button-refer-article}) $B%^%&%9%]%$%s%?$N0LCV$N%X%C%@$,>JN,I=<($5$l$F$$$?>l9g$K$O!"A4$F$NFbMF$rI=(B $B<($7$^$9!#$b$&0lEY2!$9$H:FEY>JN,I=<($7$^$9!#(B @item Button-4 ($B%[%$!<%k$D$-%^%&%9$N%[%$!<%k$r>e$X(B) @kindex Button-4 (Message) @findex wl-message-wheel-down $B%a%C%;!<%8$r>e$K%9%/%m!<%k$7$^$9!#%a%C%;!<%8$NKvHx$^$GE~C#$9$k$H!"(B $Be$K%9%/%m!<%k$7$^$9!#%a%C%;!<%8$N@hF,$^$GE~C#$9$k$H!"(B $BA0$N%a%C%;!<%8$K0\F0$7$^$9!#(B (@code{wl-message-wheel-up}) @item D @kindex D (Message) @findex wl-message-delete-current-part $B%+!<%=%k0LCV$N%Q!<%H$r:o=|$7$^$9!#JN,I=<($rM-8z$K$7$^$9!#(B @item wl-message-header-narrowing-fields @vindex wl-message-header-narrowing-fields $B=i4|@_Dj$O0J2<$N%j%9%H!#(B @lisp ("to" "cc") @end lisp @noindent $B>JN,I=<($9$k%U%#!<%k%I$r;XDj$7$^$9!#(B @item wl-message-header-narrowing-lines @vindex wl-message-header-narrowing-lines $B=i4|@_Dj$O(B 4$B!#(B $B;XDj9T?t0J>e$"$k>l9g$K>JN,I=<($7$^$9!#(B @item wl-message-header-narrowing-string @vindex wl-message-header-narrowing-string $B=i4|@_Dj$O(B @samp{...}$B!#(B $B%X%C%@$NFbMF$r>JN,$7$?;~$KI=<($9$kJ8;zNs$r;XDj$7$^$9!#(B @item wl-message-auto-reassemble-message/partial @vindex wl-message-auto-reassemble-message/partial $B=i4|@_Dj$O(B @code{nil}$B!#(B Non-nil $B$J$i(B MIME $B%a%G%#%"%?%$%W$,(B message/partial $B$N%a%C%;!<%8$rI=<($9$k(B $B:]$K!"<+F0E*$K7k9g$7$FI=<($7$^$9!#(B @end table @node Draft, Disconnected Operations, Message, Top @chapter $B%I%i%U%H%P%C%U%!(B $B%5%^%j%b!<%I$d%U%)%k%@%b!<%I$G(B @kbd{w} $B$r2!$9$H?75,%I%i%U%H%P%C%U%!$,MQ0U(B $B$5$l$^$9!#$3$N%P%C%U%!$G$O!"%a!<%k$d%K%e!<%95-;v$N(B($B?75,(B)$BJT=8!"Aw?.$r9T$$$^$9!#(B @kbd{W} $B$r2!$9$H!"(B($B2DG=$G$"$l$P(B)$B08@h$r?dB,$7$F%I%i%U%H%P%C%U%!$rMQ0U$7$^(B $B$9!#(B @menu * Usage of Draft Mode:: $B4pK\E*$J;H$$J}(B * Key Bindings of Draft:: $B%-!<%P%$%s%I(B * Variables of Draft Mode:: $B%+%9%?%^%$%:JQ?t(B @end menu @node Usage of Draft Mode, Key Bindings of Draft, Draft, Draft @section $B;H$$J}(B(TIPS) $B4pK\$O(B Emacs $BI8=`$N%a!<%k%b!<%I$G$9!#(B @menu * Parameters for Sending:: $BAw?.$N0Y$N%Q%i%a!<%?(B * Editing Header:: $B%X%C%@$NJT=8(B * Editing Message Body and Sending:: $B%a%C%;!<%8$NJT=8$HAw?.(B * Dynamical Message Re-arrangement:: $B%a%C%;!<%8$NF0E*$JJQ99(B * Template:: $B%F%s%W%l!<%H$NA^F~(B * POP-before-SMTP:: POP-before-SMTP $B$K$h$k%a!<%k$NAw?.(B @end menu @node Parameters for Sending, Editing Header, Usage of Draft Mode, Usage of Draft Mode @subsection $BAw?.$N0Y$N%Q%i%a!<%?(B $B%a%C%;!<%8$NAw?.$K;H$&%5!<%P$N>pJs$K1h$C$F0J2<$NJQ?t$r@_Dj$7$F2<$5$$!#(B @table @code @item wl-smtp-posting-server $B%a!<%kAw?.;~$N(B SMTP $B%5!<%PL>$G$9!#(B @item wl-smtp-posting-port $B%a!<%kAw?.;~$N(B SMTP $B%]!<%HHV9f$G$9!#(B $B@_Dj$7$F$$$J$$>l9g$O%G%U%)%k%H$N(B SMTP $B%]!<%HHV9f(B(25)$B$r;H$$$^$9!#(B @item wl-nntp-posting-server $B%K%e!<%9Ej9F;~$N(B NNTP $B%5!<%PL>$G$9!#(B $B@_Dj$7$F$$$J$$>l9g$O(B @code{elmo-nntp-default-server} $B$r;H$$$^$9!#(B @item wl-nntp-posting-port $B%K%e!<%9Ej9F;~$N(B NNTP $B%5!<%P$N%]!<%HHV9f$G$9!#(B $B@_Dj$7$F$$$J$$>l9g$O(B @code{elmo-nntp-default-port} $B$r;H$$$^$9!#(B @end table $BI,MW$K1~$8$F0J2<$NJQ?t$b@_Dj$7$F2<$5$$!#>\:Y$O%+%9%?%^%$%:JQ?t$N@a$r;2>H(B $B$7$F2<$5$$!#(B @xref{Variables of Draft Mode}. @table @code @item wl-smtp-posting-user SMTP AUTH $B$K$h$kG'>Z$r9T$J$&$H$-$N%f!<%6L>$G$9!#(B @item wl-smtp-authenticate-type SMTP AUTH $B$K$h$kG'>Z$r9T$J$&$H$-$NG'>ZJ}<0$G$9!#(B $B@_Dj$7$F$$$J$$>l9g$OG'>Z$r9T$$$^$;$s!#(B @item wl-smtp-authenticate-realm SMTP AUTH $B$K$h$kG'>Z$r9T$J$&$H$-$N%l%k%`(B(realm)$B$r;XDj$7$^$9!#(B $B@_Dj$7$F$$$J$$>l9g$O%l%k%`$N;XDj$r9T$$$^$;$s!#(B @item wl-smtp-connection-type SMTP $B$N%3%M%/%7%g%s$r$I$N$h$&$KD%$k$+$r;XDj$7$^$9!#(B @item wl-nntp-posting-user $B%K%e!<%9Ej9F;~$K(B AUTHINFO $B$K$h$kG'>Z$r9T$J$&$H$-$N%f!<%6L>$G$9!#(B @item wl-nntp-posting-stream-type NNTP $B$N%3%M%/%7%g%s$r$I$N$h$&$KD%$k$+$r;XDj$7$^$9!#(B @end table @node Editing Header, Editing Message Body and Sending, Parameters for Sending, Usage of Draft Mode @subsection $B%X%C%@$NJT=8(B $Be$N%X%C%@NN0h$O<+M3$KJT=8$9$k$3$H$,$G$-$^$9!#(B $B=i4|>uBV$G$O(B @samp{To:} $B$K%+!<%=%k$,$"$j$^$9!#Aw?.Aj$l(B $B<+J,$G=q$-2C$($F2<$5$$!#%U%#!<%k%IL>$rF~NO$9$k:]$K$O!"(B@kbd{@key{TAB}}$B$G(B $BJd40$,$G$-$^$9!#(B @table @asis @item @samp{Newsgroups:} $B%K%e!<%95-;v$H$7$F=P$9>l9g$NEj9F@h$r;XDj$7$^$9!#(B @item @samp{Cc:} $B%a%C%;!<%8$N%3%T!<(B(Carbon Copy)$B$rAwIU$9$k%"%I%l%9!#(B @end table $B0J2<$N%X%C%@$O!"Aw?.$5$l$k%a%C%;!<%8$+$i$O:o=|$5$l$^$9!#(B @table @asis @item @samp{Bcc:} $B%a%C%;!<%8$N%3%T!<(B(Blind Carbon Copy)$B$rAwIU$9$k%"%I%l%9!#(B @item @samp{Fcc:} $BAw?.$7$?%a%C%;!<%8$rJ]B8$9$k%U%)%k%@$r;XDj$7$^$9!#(B @item @samp{Ecc:} $BAw?.$7$?%a%C%;!<%8$r%+%W%;%k2=$7$FE>Aw$7$^$9!#(B @end table $B0J2<$NJQ?t$K$h$j!":G=i$KMQ0U$9$k%X%C%@$rDI2C$G$-$^$9!#(B @table @code @item wl-fcc @vindex wl-fcc $B=i4|@_Dj$O(B @code{nil}$B!#(B Non-nil $B$J$i!"@_Dj$5$l$?CM$r%I%i%U%H$N(B @samp{Fcc:} $B$H$7$F:G=i$+$iA^F~$7$^$9!#(B $B4X?t$,;XDj$5$l$F$$$k>l9g!"4X?t$NJV$jCM(B(string) $B$,A^F~$5$l$^$9!#(B @item wl-bcc @vindex wl-bcc $B=i4|@_Dj$O(B @code{nil}$B!#(B Non-nil $B$J$i!"@_Dj$5$l$?CM$r%I%i%U%H$N(B @samp{Bcc:} $B$H$7$F:G=i$+$iA^F~$7$^$9!#(B @end table @node Editing Message Body and Sending, Dynamical Message Re-arrangement, Editing Header, Usage of Draft Mode @subsection $B%a%C%;!<%8$NJT=8$HAw?.(B $B@bL@$9$k$^$G$b$J$$$G$9$,!"%a%C%;!<%8K\J8$NJT=8$O4pK\E*$KDL>o$NJ8>O:n@.$H(B $BF1MM$K9T$J$$$^$9!#K\J8$O(B @samp{--text follows this line--} $B$N9T$h$j2<$K(B $B5-=R$7$^$9!#(B($BCm0U!'(B @samp{--text follows this line--} $B$N9T$O$$$8$i$J$$$G(B $B2<$5$$!#(B) $B%^%k%A%Q!<%H$NJT=8$O(B SEMI $B$N(B MIME $BJT=8%b!<%I$rMxMQ$7$F$$$^$9!#(B $BJT=8$NJ}K!$K$D$$$F$O3F%Q%C%1!<%8IUB0$N%I%-%e%a%s%H$r;2>H$7$F$/$@$5$$!#(B @xref{MIME-Edit, , ,mime-ui-ja, a MIME user interface for GNU Emacs}. $B$^$?!"%I%i%U%H%P%C%U%!$K$*$$$F!"(B@kbd{C-c C-x ?} $B$G%X%k%W$,;2>H$G$-$^$9!#(B $BJT=8Cf$N%I%i%U%H$r%;!<%V$9$k$H!"(B@code{wl-draft-folder} $B$G@_Dj$7$?%I%i%U(B $B%H%U%)%k%@$KDI2C$5$l$^$9!#(B@kbd{C-c C-z} (@code{wl-draft-save-and-exit}) $B$K$h$j!"8e$+$iJT=8$G$-$k$h$&$K$=$l$r%;!<%V$7$?>e$G%I%i%U%H%P%C%U%!$rN%C&(B $B$G$-$^$9!#(B $B%a%C%;!<%8$NJT=8$,40N;$7$?$i!"(B@kbd{C-c C-c} $B$GAw?.$G$-$^$9!#(B @node Dynamical Message Re-arrangement, Template, Editing Message Body and Sending, Usage of Draft Mode @subsection $B%a%C%;!<%8$NF0E*$JJQ99(B @vindex wl-draft-config-alist @c @cindex Chage Message @c @cindex Message, Chage Dynamic @code{wl-draft-config-alist} $B$r@_Dj$9$k$H!"%X%C%@$d$=$NB>$N>pJs$K4p$E$$(B $B$F!"<+F0E*$KB>$N%X%C%@$dK\J8$rJQ99$9$k$3$H$,$G$-$^$9!#(B $BJQ?t(B @code{wl-draft-config-alist} $B$K$D$$$F@bL@$7$^$9!#$3$NJQ?t$N=i4|@_Dj(B $B$O(B @code{nil} $B$G$9!#(B $BNc$($P0J2<$N$h$&$K@_Dj$9$k$H!"(B@code{wl-draft-send-and-exit} $B$d(B @code{wl-draft-send} $B$re$G$9!#(B\n") ;; @r{$BK\J8KvHx$XJ8;zNs$rA^F~$7$^$9(B} )) @end group @end lisp @code{wl-draft-config-alist} $B$OH(B) @end example $B$^$?!"$3$l$i$rDj5A$7$F$$$k$N$O(B @code{wl-draft-config-sub-func-alist} $B$G(B $B$"$j!"Dj5A$rJQ99$7$?$j<+J,$G:n$C$?4X?t$rDI2C$9$k$3$H$,$G$-$^$9!#4X?t$N=q(B $B$-J}$O$3$3$G@bL@$9$k$h$jD>@\%3!<%I$r8+$?J}$,J,$+$j$d$9$$$G$7$g$&$+$i!">J(B $BN,$7$^$9!#(B $B3FMWAG$N(B1$BHVL\$K$O(B @var{$B%X%C%@$N@55,I=8=(B} $B$+(B elisp $B<0(B $B$r;XDj$7$^$9!#(Belisp $B<0$N>l9g$OI>2A$7$?CM$,(B non-nil $B$N>l9g$KE,MQ$5$l$^$9!#(B $B$^$?!"%G%U%)%k%H$G$OJ#?t$NMWAG$,%^%C%A$^$?$O(B non-nil $B$K$J$C$?>l9g$K!"$=$N(B $BA4$F$,E,MQ$5$l$^$9!#$3$3$G!"JQ?t(B @code{wl-draft-config-matchone} $B$r(B @code{t} $B$K$7$F$"$l$P!":G=i$K%^%C%A$7$?(B1$B$D$@$1$rE,MQ$9$k$3$H$b$G$-$^$9!#(B $BMWAG$N(B2$BHVL\$K$O(B cons $B$+4X?t$N(B list $B$r;XDj$7$^$9!#(Bcons $B$K$O%X%C%@$N(B Field $B$+JQ?t!"%5%V4X?t$r;XDj$7$^$9!#(BField $B$r;XDj$7$?>l9g$O$=$N(B Field $B$rJQ99$7!"(B $BJQ?t$r;XDj$7$?>l9g$O0l;~E*$K$=$NJQ?tCM$rJQ99$7$^$9!#(B $BCM$K$OJ8;zNs$dJQ?t$NB>!"(Belisp$B<0$r$=$N$^$^5-=R$9$k$3$H$b$G$-$^$9!#$b$7!"(B Field $B$NCM$,(B @code{nil} $B$J$i$P$=$N(B Field $B$r:o=|$7$^$9!#(B $B$D$E$$$F!"l9g!"JV?.85$N%X%C%@$K%^%C(B $B%A$9$l$PE,MQ$5$l$k$h$&$K$J$j$^$9!#$?$@$7!"(B@code{wl-draft} $B$rl9g$OL5;k$5$l$^$9!#(B $B?F%U%)%k%@$NL>A0$rMxMQ$7$?$$>l9g$K$O!"%P%C%U%!%m!<%+%kJQ?t(B @code{wl-draft-parent-folder} $B$rMxMQ$G$-$^$9!#$K$h$C$F(B From $B$rJQ99$7$^$9!#(B @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 $B2?$bFCJL$J@_Dj$r$7$J$1$l$P!"(B@code{wl-draft-config-alist} $B$O!"(B @code{wl-draft-send-and-exit} $B$+(B @code{wl-draft-send} $B$,A0$K(B $B0lEY$@$1E,MQ$5$l$^$9!#Aw?.$rl9g$O!"(B@kbd{C-c C-e} (@code{wl-draft-config-exec}) $B$rl9g$O!"l9g$O!"l9g$O!"(B $B(B") (body . " $B!{!{$G$9!#(B\n")) ("report" (template . "default") ;; @r{(a)} ("To" . "jousi@@example.com") ("Subject" . "$BJs9p(B") (body-file . "~/work/report.txt") ) )) @end group @end lisp $B$3$N$h$&$K%X%C%@$N@55,I=8=$NBe$o$j$K(B @samp{default} $B$d(B @samp{report} $B$N(B $B$h$&$K3FMWAG$NL>A0(B($B%F%s%W%l!<%HL>(B)$B$r$D$1$k$@$1$G$9!#3FMWAG$NDj5A$O(B @code{wl-draft-config-alist} $B$HF1$8$J$N$G!"(B(a)$B$N$h$&$KJL$N%F%s%W%l!<%H$r(B $B8F$V$3$H$b2DG=$G$9!#(B $B%3%^%s%I(B @code{wl-template-select} $B$r$l0J2<$N(B $B$h$&$K?6Iq$$$^$9!#(B @code{wl-template-visible-select} $B$,(B @code{t} ($B%G%U%)%k%H(B)$B$N>l9g!"%I%i%U(B $B%H%P%C%U%!$N2<$KE,MQ8e$N%P%C%U%!%&%#%s%I%&$,I=<($5$l$k$N$G!"$=$l$r8+$J$,(B $B$i(B @kbd{n} $B$H(B @kbd{p} $B$GA*Br$7$^$9!#$=$7$F%j%?!<%s%-!<$G7hDj$9$k$Hl9g!"%_%K%P%C%U%!$G%F(B $B%s%W%l!<%HL>$rF~NO$9$k$3$H$GA*Br$7$^$9!#(B @code{wl-template-select} $B$r(B prefix argument $B$D$-$Gl9g$K$O!"(B @code{wl-template-visible-select} $B$NCM$r5U$K$7$?F0:n$K$J$j$^$9!#(B $B$^$?!"(B@code{wl-draft-config-alist} $B$NNc$N$h$&$KNc$($P(B @lisp (template . "default") @end lisp @noindent $B$H=q$/$3$H$G(B @samp{default} $B$N%F%s%W%l!<%H$rE,MQ$G$-$^$9!#(B @node POP-before-SMTP, , Template, Usage of Draft Mode @subsection POP-before-SMTP $B$K$h$k%a!<%k$NAw?.(B @cindex POP-before-SMTP @cindex SMTP-after-POP POP-before-SMTP $B$K$h$k%a!<%k$NAw?.$,$G$-$^$9!#(B $B$=$N$?$a$KI,MW$J@_Dj$O!"%a!<%kAw?.$KMQ$$$k4X?t$r%G%U%)%k%H$N(B @code{wl-draft-send-mail-with-smtp} $B$+$iJQ99$9$k(B @lisp (setq wl-draft-send-mail-function 'wl-draft-send-mail-with-pop-before-smtp) @end lisp @noindent $B$H9g$o$;$F!"I,MW$K1~$8$F0J2<$NJQ?t$r@_Dj$7$F$/$@$5$$!#(B @table @code @item wl-pop-before-smtp-user POP-before-SMTP $B$GG'>Z$r9T$J$&$H$-$N(B POP $B%f!<%6L>$G$9!#(B $B@_Dj$7$F$$$J$$>l9g$O(B @code{elmo-pop3-default-user} $B$r;H$$$^$9!#(B @item wl-pop-before-smtp-server POP-before-SMTP $B$GG'>Z$r9T$J$&$H$-$N(B POP $B%5!<%PL>$G$9!#(B $B@_Dj$7$F$$$J$$>l9g$O(B @code{elmo-pop3-default-server} $B$r;H$$$^$9!#(B @item wl-pop-before-smtp-authenticate-type POP-before-SMTP $B$GG'>Z$r9T$J$&$H$-$N(B POP $BG'>ZJ}<0$G$9!#(B $B@_Dj$7$F$$$J$$>l9g$O(B @code{elmo-pop3-default-authenticate-type} $B$r;H$$$^$9!#(B @item wl-pop-before-smtp-port POP-before-SMTP $B$GG'>Z$r9T$J$&$H$-$N(B POP $B%]!<%HHV9f$G$9!#(B $B@_Dj$7$F$$$J$$>l9g$O(B @code{elmo-pop3-default-port} $B$r;H$$$^$9!#(B @item wl-pop-before-smtp-stream-type @code{ssl} $B$J$i(B SSL $B$rMxMQ$7$F(B POP $B%3%M%/%7%g%s$rD%$j$^$9!#(B@code{starttls} $B$J$i(B STARTTLS (RFC2595) $B$rMxMQ$7$F%3%M%/%7%g%s$rD%$j$^$9!#@_Dj$7$F$$$J(B $B$$>l9g$O(B @code{elmo-pop3-default-stream-type} $B$r;H$$$^$9!#(B @end table POP-before-SMTP $BMQ$NJQ?t(B (@code{wl-pop-before-smtp-*})$B$r@_Dj$7$F$$$J$$>l(B $B9g$K$O!"(BPOP $B%U%)%k%@$N@_Dj(B (@code{elmo-pop3-default-*}) $B$,MQ$$$i$l$^$9!#$=$N(B $B$?$a!"(BSMTP $B%5!<%P$H(B POP $B%5!<%P$NH$7$F$/$@$5$$!#(B @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 $B%-!<%P%$%s%I(B @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 $B8=:_I=<(Cf$N%a%C%;!<%8%P%C%U%!(B($B%+!<%=%k0LCV$N%Q!<%H(B)$B$NFbMF$r0zMQ$7$^$9!#(B $B%j!<%8%g%s$,M-8z$J>l9g$K$O!"%j!<%8%g%s$r0zMQ$7$^$9(B (@code{transient-mark-mode} (GNU Emacs $B$N>l9g(B) $B$+(B @code{zmacs-regions} (XEmacs $B$N>l9g(B) $B$,(B Non-nil $B$N;~$N$_(B)$B!#(B $B$^$?!"(Bprefix argument $B$rIU$1$k$H!"(Byank $B$GA^F~$5$l$k%F%-%9%H(B $B$NFbMF(B($B%/%j%C%W%\!<%I$NFbMF(B)$B$,0zMQ$5$l$^$9!#(B (@code{wl-draft-yank-original}) @item C-c C-p @kindex C-c C-p (Draft) @findex wl-draft-preview-message $B8=:_$N%I%i%U%H$NFbMF$r%W%l%S%e!<$7$^$9!#(B MIME $B$N%^%k%A%Q!<%H%a%C%;!<%8$N3NG'$K;H$&$HJXMx$G$9!#(B (@code{wl-draft-preview-message}) @item C-c C-s @kindex C-c C-s (Draft) @findex wl-draft-send $B8=:_$N%I%i%U%H$NFbMF$rAw?.$7$^$9!#%I%i%U%H%P%C%U%!$O>C5n$7$^$;$s!#(B $BJ#?t$N?M$K>/$7$:$DFbMF$rJQ$($F%a%C%;!<%8$rAw$j$?$$>l9g$KJXMx$G$9!#(B (@code{wl-draft-send}) @item C-c C-c @kindex C-c C-c (Draft) @findex wl-draft-send-and-exit $B8=:_$N%I%i%U%H$NFbMF$rAw?.$7!"%I%i%U%H%P%C%U%!$r>C5n$7$^$9!#(B (@code{wl-draft-send-and-exit}) @item C-x C-s @kindex C-x C-s (Draft) @findex wl-draft-save $B8=:_$N%I%i%U%H$r%;!<%V$7$^$9!#(B (@code{wl-draft-save}) @item C-c C-k @kindex C-c C-k (Draft) @findex wl-draft-kill $B8=:_$N%I%i%U%H$rGK4~$7$^$9!#(B $B%;!<%V$7$F$$$?>l9g!"(B@samp{+draft} $B%U%)%k%@$+$i$b:o=|$5$l$^$9!#(B (@code{wl-draft-kill}) @item C-x k @kindex C-x k (Draft) @findex wl-draft-mimic-kill-buffer $B8=:_$N%I%i%U%H$rGK4~$7$^$9!#(B (@code{wl-draft-mimic-kill-buffer}) @item C-c C-z @kindex C-c C-z (Draft) @findex wl-draft-save-and-exit $B8=:_$N%I%i%U%H$r%;!<%V$7!"%I%i%U%H%P%C%U%!$r>C5n$7$^$9!#(B $B%I%i%U%H$NJT=8$rCfCG$7$?$$$H$-$KJXMx$G$9!#(B @samp{+draft} $B%U%)%k%@$KF~$C$F(B @kbd{E} (@code{wl-summary-reedit} $B$r2!$;$P!"(B $BJT=8$r:F3+$G$-$^$9!#(B (@code{wl-draft-save-and-exit}) @item C-c C-r @kindex C-c C-r (Draft) @findex wl-caesar-region $B;XDj$5$l$?%j!<%8%g%s$r%7!<%60E9f$G%(%s%3!<%I(B/$B%G%3!<%I$7$^$9!#(B (@code{wl-caesar-region}) @item C-l @kindex C-l (Draft) @findex wl-draft-highlight-and-recenter $B8=:_$N%I%i%U%H$r%O%$%i%$%H$7$J$*$7$^$9!#(B (@code{wl-draft-highlight-and-recenter}) @item M-t @kindex M-t (Draft) @findex wl-toggle-plugged Wanderlust $B$N%*%U%i%$%s%b!<%I(B/$B%*%s%i%$%s%b!<%I$r%H%0%k$7$^$9!#(B (@code{wl-toggle-plugged}) @item C-c C-o @kindex C-c C-o (Draft) @findex wl-jump-to-draft-buffer $BB>$N%I%i%U%H%P%C%U%!$,$"$l$P0\F0$7$^$9!#(B $B$^$?!"(Bprefix argument $B$r$D$1$k$3$H$K$h$j!"%P%C%U%!$,B8:_$7$F$$$J$$>l9g$O!"(B $B%I%i%U%H%U%)%k%@$+$i%U%!%$%k$r(B($BB8:_$9$l$P(B)$BFI$_9~$_$^$9!#(B (@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}$B$rE,MQ$7$^$9!#(B (@code{wl-draft-config-exec}) @item C-c C-j @kindex C-c C-j (Draft) @findex wl-template-select $B%F%s%W%l!<%H$rA*Br$7$^$9!#(B (@code{wl-template-select}) @item C-c C-a @kindex C-c C-a (Draft) @findex wl-addrmgr $B%"%I%l%9%^%M!<%8%c$r5/F0$7$^$9!#(B @xref{Address Manager}. (@code{wl-addrmgr}) @item C-c C-d @kindex C-c C-d (Draft) @findex wl-draft-elide-region $B%]%$%s%H$H%^!<%/$N4V$NJ8$r>J$-$^$9(B (@code{wl-draft-elide-region})$B!#J8>O(B $B$O@Z$i$l$F(B (killed) $BJQ?t(B @code{wl-draft-elide-ellipsis} $B$NCM$GCV$-49$($i(B $B$l$^$9!#%G%U%)%k%H$N>JN,Id9f$H$7$F;H$o$l$kCM$O(B (@samp{[...]}) $B$G$9!#(B @end table @node Variables of Draft Mode, , Key Bindings of Draft, Draft @section $B%+%9%?%^%$%:JQ?t(B @cindex SMTP AUTH @table @code @item wl-subscribed-mailing-list @vindex wl-subscribed-mailing-list $B=i4|@_Dj$O(B @code{nil}$B!#;22C$7$F$$$k%a!<%j%s%0%j%9%H$N%j%9%H!#JV;v$N%I%i(B $B%U%H$rMQ0U$9$k$H$-$K(B @samp{Mail-Followup-To:} $B$d(B @samp{Cc:} $B$K$3$l$i$,4^(B $B$^$l$k$H$-$O<+J,$N%"%I%l%9$r=|$-$^$9!#$^$?!"$3$l$i$,(B @samp{To:} $B$+(B @samp{Cc:} $B$K4^$^$l$k$H$-$K$O!"$=$N%"%I%l%9$G%j%U%!%$%k@h$r3P$($^$9!#(B $B@_DjNc(B: @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 $B=i4|@_Dj$O(B @code{nil}$B!#(BNon-nil $B$J$i!"(B@samp{Mail-Followup-To:} $B%U%#!<%k%I(B $B$r%I%i%U%H%P%C%U%!$K<+F0E*$KA^F~$7$^$9!#(B @item wl-insert-mail-reply-to @vindex wl-insert-mail-reply-to $B=i4|@_Dj$O(B @code{nil}$B!#(BNon-nil $B$J$i!"(B@samp{Mail-Reply-To:} $B%U%#!<%k%I$r(B $B%I%i%U%H%P%C%U%!$K<+F0E*$KA^F~$7$^$9!#(B @item wl-auto-insert-x-face @vindex wl-auto-insert-x-face $B=i4|@_Dj$O(B @code{t}$B!#(BNon-nil $B$G$+$D!"%(%s%3!<%I$5$l$?(B X-Face $BJ8;zNs$r(B @file{~/.xface} ($BJQ?t(B @code{wl-x-face-file} $B$NCM(B)$B$NFbMF$KMQ0U$7$F$*$/$H!"(B $B%I%i%U%H$r=`Hw$9$k$H$-$K<+F0E*$K(B @samp{X-Face:} $B%U%#!<%k%I$H$7$FA^F~$5$l(B $B$^$9!#(B@code{nil} $B$N>l9g$O<+F0E*$K$OA^F~$7$^$;$s!#(B @item wl-insert-message-id @vindex wl-insert-message-id $B=i4|@_Dj$O(B @code{t}$B!#(B Non-nil $B$J$i!"Aw?.;~$K(B @samp{Message-ID:} $B%U%#!<%k%I$r<+F0E*$KA^F~$7$^$9!#(B @item wl-message-id-use-message-from @vindex wl-message-id-use-message-from $B=i4|@_Dj$O(B @code{t}$B!#(BNon-nil $B$J$i!"(B@samp{Message-ID:} $B$N%I%a%$%s%Q!<%H$K(B @samp{From:} $B%U%#!<%k%I!"$b$7$/$O(B @code{wl-from} $B$NCM$rMxMQ$7$^$9!#(B @item wl-local-domain @vindex wl-local-domain $B=i4|@_Dj$O(B @code{nil}$B!#(B@code{nil} $B$J$i$P(B @samp{Message-ID:} $B$N%I%a%$%s%Q!<(B $B%H$K$O4X?t(B @code{system-name} $B$NJV$jCM$r@_Dj$7$^$9!#(B @code{system-name} $B$,(B FQDN (@samp{smtp.gohome.org} $B$N$h$&$J%[%9%H$N%U%k(B $B%M!<%`(B) $B$rJV$5$J$$>l9g$O!"$3$NJQ?t$K(B @strong{$BI,$:(B} $B%[%9%HL>$r=|$$$?%I%a(B $B%$%sL>(B (@samp{gohome.org}$B$J$I(B) $B$r@_Dj$7$F$/$@$5$$!#(B $B$b$7!"%0%m!<%P%k$J(B IP $B%"%I%l%9$r;}$?$J$$>l9g$O!"(B@code{wl-message-id-domain}$B$r@_Dj$7$F$/$@$5$$!#(B (@samp{Message-ID:} $B$N%I%a%$%s$,$*$+$7$$$H!"%M%C%H%K%e!<%9$G$U$/$mC!$-$K(B $B$"$C$F$7$^$&2DG=@-$,$"$j$^$9!#(B) $B$^$?!"$3$NCM$r@_Dj$7$F$$$k>l9g!"(B@code{system-name} $B$K$3$NCM$rIU2C$7$?%[(B $B%9%HL>$r(B SMTP $B$N(B HELO $B$N0z?t$H$7$FMxMQ$7$^$9!#(B @item wl-message-id-domain @vindex wl-message-id-domain $B=i4|@_Dj$O(B @code{nil}$B!#(BNon-nil $B$J$i!"(B@samp{Message-ID:} $B$N%I%a%$%s%Q!<%H(B $B$K;HMQ$5$l$^$9!#%0%m!<%P%k$J(B IP $B%"%I%l%9$r;}$?$J$$>l9g$J$I!"%I%a%$%s%Q!<(B $B%H$r7h$a$i$l$J$$>l9g$O!"(B@code{wl-message-id-domain} $B$K0l0U$JJ8;zNs(B($BNc$((B $B$P!"%a!<%k%"%I%l%9$J$I(B)$B$r@_Dj$7$F$/$@$5$$!#(B @item wl-unique-id-suffix @vindex wl-unique-id-suffix $B=i4|@_Dj$O(B @samp{.wl}$B!#(BMessage-ID $B$r@8@.$9$k:]$K(B @samp{@@} $B$^$?$O(B @samp{%} $B$ND>A0$K8=$l$kJ8;zNs$r;XDj$7$^$9!#(B @item wl-draft-config-alist @vindex wl-draft-config-alist $B=i4|@_Dj$O(B @code{nil}$B!#(B $BAw?.D>A0$K%I%i%U%H%a%C%;!<%8$rJQ99$7$^$9!#<+F0E*$K(B @code{wl-draft-config-alist} $B$NFbMF$,E,MQ$5$l$k$N$OAw?.;~$K0lEY$@$1$G$9!#(B $B$b$7!$l9g$O!$(B@kbd{C-c C-e} (@code{wl-draft-config-exec}) $B$r;HMQ$7$F$/$@$5$$!#$3$N%3%^%s%I$O2?EY$G$bE,MQ$G$-$^$9!#(B @item wl-template-alist @vindex wl-template-alist $B=i4|@_Dj$O(B @code{nil}$B!#(B $B%I%i%U%H%P%C%U%!$GE,MQ$9$k%F%s%W%l!<%H$r@_Dj$7$^$9!#(B @item wl-draft-config-matchone @vindex wl-draft-config-matchone $B=i4|@_Dj$O(B @code{nil}$B!#(BNon-nil $B$J$i(B @code{wl-draft-config-alist} $B$NE,MQ(B $B;~$K:G=i$K%^%C%A$7$?MWAG$N$_$rE,MQ$7$^$9!#(B@code{nil} $B$J$i%^%C%A$7$?$b$N(B $B$9$Y$F$rE,MQ$7$^$9!#(B @item wl-template-visible-select @vindex wl-template-visible-select $B=i4|@_Dj$O(B @code{t}$B!#(B Non-nil $B$J$iJL%&%#%s%I%&$KE,MQ8e$N>uBV$rI=<($7$J$,$i%F%s%W%l!<%H$rA*Br$7$^$9!#(B @item wl-template-confirm @vindex wl-template-confirm $B=i4|@_Dj$O(B @code{nil}$B!#(B Non-nil $B$J$i%&%#%s%I%&$rI=<($7$J$,$i%F%s%W%l!<%H$rA*Br$9$k>l9g!"%j%?!<%s(B $B%-!<$GA*Br$9$k;~$K3NG'$r9T$$$^$9!#(B @item wl-template-buffer-lines @vindex wl-template-buffer-lines $B=i4|@_Dj$O(B 7$B!#(B @code{wl-template-visible-select}$B$,(B non-nil $B$N>l9g!"(B $BE,MQ8e$N>uBV$rI=<($9$k%&%#%s%I%&$NBg$-$5$r;XDj$7$^$9!#(B @item wl-draft-buffer-style @vindex wl-draft-buffer-style $B=i4|@_Dj$O(B @code{full}$B!#(B ($BJV?.$HE>Aw$N>l9g0J30$N(B)$B%I%i%U%H%P%C%U%!$N%&%$%s%I%&$N7ABV$r;XDj$7$^$9!#(B @code{keep} $B$H$9$k$H8=:_$N%&%#%s%I%&$r;H$$!"(B @code{full} $B$H$9$k$H%U%l!<%`A4BN$N%&%$%s%I%&$r;H$$$^$9!#(B @code{split} $B$H$9$k$H8=:_$N%&%#%s%I%&$rJ,3d$7$F;H$$$^$9!#(B $B4X?t$,;XDj$5$l$?>l9g!"%I%i%U%H%P%C%U%!$r0z?t$H$7$F$=$l8F$S=P$7$^$9!#(B @item wl-draft-reply-buffer-style @vindex wl-draft-reply-buffer-style $B=i4|@_Dj$O(B @code{split}$B!#(B $BJV?.$HE>Aw$N>l9g$N%I%i%U%H%P%C%U%!$N%&%$%s%I%&$N7ABV$r;XDj$7$^$9!#(B @code{keep} $B$H$9$k$H%a%C%;!<%8%P%C%U%!$N%&%#%s%I%&$r;H$$!"(B @code{full} $B$H$9$k$H%U%l!<%`A4BN$N%&%$%s%I%&$r;H$$$^$9!#(B @code{split} $B$H$9$k$H%a%C%;!<%8%P%C%U%!$N%&%#%s%I%&$rJ,3d$7$F;H$$$^$9!#(B $B4X?t$,;XDj$5$l$?>l9g!"%I%i%U%H%P%C%U%!$r0z?t$H$7$F$=$l8F$S=P$7$^$9!#(B @item wl-draft-use-frame @vindex wl-draft-use-frame $B=i4|@_Dj$O(B @code{nil}$B!#(B Non-nil $B$J$i%I%i%U%HMQ$K?7$7$$%U%l!<%`$r3+$-$^$9!#(B @item wl-draft-reply-default-position @vindex wl-draft-reply-default-position $B=i4|@_Dj$O(B @code{body} $BJV?.$N>l9g$N%I%i%U%H$G$N%+!<%=%k$N=i4|0LCV$r;XDj$7$^$9!#(B @code{body} $B$H$9$k$H%a%C%;!<%8K\J8$N@hF,!"(B@code{bottom} $B$H$9$k$HK\J8KvHx!"(B @code{top} $B$H$9$k$H%X%C%@$N@hF,$K%+!<%=%k$r0\F0$7$^$9!#(B @item wl-draft-truncate-lines @vindex wl-draft-truncate-lines $B=i4|@_Dj$G$O(B @code{default-truncate-lines} $B$NCM$r;H$$$^$9!#(BNon-nil $B$J$i(B $B%I%i%U%H%P%C%U%!$GD9$$9T$N@^$jJV$7$r$7$^$;$s!#(B @item wl-from @vindex wl-from $B=i4|@_Dj$OJQ?t(B @code{user-mail-address} $B$NCM!#(B $B@_Dj$5$l$?CM$r%I%i%U%H$N(B @samp{From:} $B%U%#!<%k%I$H$7$F:G=i$+$iA^F~$7$^$9!#(B @item wl-envelope-from @vindex wl-envelope-from $B=i4|@_Dj$O(B @code{nil}$B!#(B $B@_Dj$7$?CM$r(B envelope from (MAIL FROM) $B$K;HMQ$7$^$9!#(B @code{nil} $B$J$i(B @code{wl-from} $B$N%"%I%l%9ItJ,$r;HMQ$7$^$9!#(B @item wl-user-mail-address-list @vindex wl-user-mail-address-list $B=i4|@_Dj$O(B @code{nil}$B!#(B $B%f!<%6$N%"%I%l%9%j%9%H$G$9!#(B $B%"%I%l%9$rJ#?t;}$C$F$$$k>l9g$O@_Dj$7$F$/$@$5$$!#(B @item wl-reply-subject-prefix @vindex wl-reply-subject-prefix $B=i4|@_Dj$O(B @samp{Re: }$B!#(B $BJV?.;~$N%I%i%U%H$N(B @samp{Subject:} $B$G!"855-;v$N(B @samp{Subject:} $B$N@hF,$K(B $BIU$12C$($kJ8;zNs$G$9!#JV?.BP>]$N%a%C%;!<%8%P%C%U%!$GI>2A$5$l$k4X?t$r;XDj(B $B$9$k$3$H$b$G$-$^$9!#(B @item wl-forward-subject-prefix @vindex wl-forward-subject-prefix $B=i4|@_Dj$O(B @samp{Forward: }$B!#(B $BE>Aw;~$N%I%i%U%H$N(B @samp{Subject:} $B$G!"855-;v$N(B @samp{Subject:} $B$N@hF,$K(B $BIU$12C$($kJ8;zNs$G$9!#E>AwBP>]$N%a%C%;!<%8%P%C%U%!$GI>2A$5$l$k4X?t$r;XDj(B $B$9$k$3$H$b$G$-$^$9!#(B @item wl-draft-reply-use-address-with-full-name @vindex wl-draft-reply-use-address-with-full-name $B=i4|@_Dj$O(B @code{t}$B!#(B Non-nil $B$J$iJV?.%"%I%l%9$N(B @samp{To:}, @samp{Cc:} $B%U%#!<%k%I$KAjl9g$O%-%c%C%7%e$7$^$;$s!#(B @item wl-fcc-force-as-read @vindex wl-fcc-force-as-read $B=i4|@_Dj$O(B @code{nil}$B!#(BNon-nil $B$J$i(B @samp{Fcc:} $B$GJ]B8$7$?%a%C%;!<%8$r(B $B4{FI$K$7$^$9!#(B @item wl-auto-flush-queue @vindex wl-auto-flush-queue $B=i4|@_Dj$O(B @code{t}$B!#(B $B%*%s%i%$%s$K$J$C$?$H$-$K<+F0E*$K%-%e!<$rAw?.$9$k$+$I$&$+$r<($9%U%i%0$G$9!#(B Non-nil $B$J$i<+F0E*$KAw?.$7$^$9(B ($B0l1~(B @code{y-or-n-p} $B$G3NG'$7$^$9(B)$B!#(B $BAw;~$K:o=|$9$k%X%C%@%U%#!<%k%IL>$r@55,I=8=$G;XDj$7$^$9!#(B @item wl-ignored-resent-headers $B=i4|@_Dj$O(B @samp{\\(return-receipt\\|[bdf]cc\\)}$B!#(B $B:FAw;~$K:o=|$9$k%X%C%@%U%#!<%k%IL>$r@55,I=8=$G;XDj$7$^$9!#(B @item wl-draft-always-delete-myself @vindex wl-draft-always-delete-myself Non-nil $B$J$i!"<+J,08$F$N%a!<%k$KJV?.$9$k>l9g!">o$K(B @samp{To:}, @samp{Cc:} $B$+$i<+J,$N%a!<%k%"%I%l%9$r:o=|$7$^$9!#(B @item wl-draft-delete-myself-from-bcc-fcc @vindex wl-draft-delete-myself-from-bcc-fcc Non-nil $B$G!"(B@samp{To:}, @samp{Cc:} $B$,(B $BJQ?t(B @code{wl-subscribed-mailing-list} $B$K(B $B4^$^$l$F$$$k>l9g!"(B@samp{Bcc:} , @samp{Fcc:} $B$r$D$1$^$;$s!%(B @item wl-draft-send-mail-function @vindex wl-draft-send-mail-function $B=i4|@_Dj$O(B @code{wl-draft-send-mail-with-smtp}$B!#(B $B%a!<%kAw?.$K;H$&4X?t$G$9!#(BPOP-before-SMTP $B$rMxMQ$9$k>l9g$O(B @code{wl-draft-send-mail-with-pop-before-smtp} $B$K@_Dj$7$^$9!#(B @item wl-smtp-posting-server @vindex wl-smtp-posting-server $B=i4|@_Dj$O(B @code{nil}$B!#(B $B%a!<%kAw?.;~$N(B SMTP $B%5!<%PL>$G$9!#(B @item wl-smtp-posting-port @vindex wl-smtp-posting-port $B=i4|@_Dj$O(B @code{nil}$B!#(B $B%a!<%kAw?.;~$N(B SMTP $B%]!<%HHV9f$G$9!#(B @code{nil} $B$J$i%G%U%)%k%H$N(B SMTP $B%]!<%HHV9f(B(25)$B$r;H$$$^$9!#(B @item wl-smtp-posting-user @vindex wl-smtp-posting-user $B=i4|@_Dj$O(B @code{nil}$B!#(B SMTP AUTH $B$K$h$kG'>Z$r9T$J$&$H$-$N%f!<%6L>$G$9!#(B @item wl-smtp-authenticate-type @vindex wl-smtp-authenticate-type $B=i4|@_Dj$O(B @code{nil}$B!#(B SMTP AUTH $B$K$h$kG'>Z$r9T$J$&$H$-$NG'>ZJ}<0$rJ8;zNs$G;XDj$7$^$9!#(B $BCM$H$7$F(B @code{plain}, @code{cram-md5}, @code{digest-md5}, @code{login} $B$J$I$,;XDj$G$-$^$9!#(B @code{nil} $B$J$iG'>Z$r9T$$$^$;$s!#(B @item wl-smtp-authenticate-realm @vindex wl-smtp-authenticate-realm $B=i4|@_Dj$O(B @code{nil}$B!#(B SMTP AUTH $B$K$h$kG'>Z$r9T$J$&$H$-$N%l%k%`(B(realm)$B$rJ8;zNs$G;XDj$7$^$9!#(B $B%l%k%`$N;XDj$O(B DIGEST-MD5 $BEy$NG'>ZJ}<0$GI,MW$J>l9g$,$"$j$^$9!#(B @code{nil} $B$N>l9g$O%l%k%`$N;XDj$r9T$$$^$;$s!#(B @item wl-smtp-connection-type @vindex wl-smtp-connection-type $B=i4|@_Dj$O(B @code{nil}$B!#(B SMTP $B$N%3%M%/%7%g%s$r$I$N$h$&$KD%$k$+$r%7%s%\%k$G;XDj$7$^$9!#(B @code{nil} $B$J$i%G%U%)%k%H$N@\B37?<0$rMxMQ$7$^$9!#(B @code{starttls} $B$J$i(B STARTTLS (RFC3207)$B$rMxMQ$7$F%3%M%/%7%g%s$rD%$j$^$9!#(B @code{ssl} $B$J$i(B SSL $B$rMxMQ$7$^$9!#(B @item wl-nntp-posting-server @vindex wl-nntp-posting-server $B=i4|@_Dj$O(B @code{nil}$B!#(B $B%K%e!<%9Ej9F;~$N(B NNTP $B%5!<%PL>$G$9!#(B @code{nil} $B$J$i(B @code{elmo-nntp-default-server} $B$r;H$$$^$9!#(B @item wl-nntp-posting-user @vindex wl-nntp-posting-user $B=i4|@_Dj$O(B @code{nil}$B!#(B $B%K%e!<%9Ej9F;~$K(B AUTHINFO $B$K$h$kG'>Z$r9T$J$&$H$-$N%f!<%6L>$G$9!#(B @code{nil} $B$J$i(B @code{elmo-nntp-default-user} $B$r;H$$$^$9!#(B $B$=$l$G$b(B @code{nil} $B$J$i(B AUTHINFO $B$K$h$kG'>Z$r9T$J$$$^$;$s!#(B @item wl-nntp-posting-port @vindex wl-nntp-posting-port $B=i4|@_Dj$O(B @code{nil}$B!#(B $B%K%e!<%9Ej9F;~$N(B NNTP $B%5!<%P$N%]!<%HHV9f!#(B @code{nil} $B$J$i(B @code{elmo-nntp-default-port} $B$r;H$$$^$9!#(B @item wl-nntp-posting-stream-type @vindex wl-nntp-posting-stream-type $B=i4|@_Dj$O(B @code{nil}$B!#(B @code{nil} $B$J$i(B @code{elmo-nntp-default-stream-type} $B$rI>2A$7$^$9!#(B @code{ssl} $B$J$i%K%e!<%9Ej9F;~$K(B SSL $B$rMxMQ$7$^$9!#(B @code{starttls}$B$J$i(B STARTTLS (RFC2595)$B$rMxMQ$7$F%3%M%/%7%g%s$rD%$j$^$9!#(B @item wl-nntp-posting-function @vindex wl-nntp-posting-function $B=i4|@_Dj$O(B @code{elmo-nntp-post}$B!#(B $B%K%e!<%9Ej9F$N$?$a$N4X?t!#(B @item wl-nntp-posting-config-alist @vindex wl-nntp-posting-config-alist $B=i4|@_Dj$O(B @code{nil}$B!#(B $B0J2<$NNc$N$h$&$K$7$F!"%K%e!<%9Ej9F;~$N%5!<%PA*BrJ}K!$r@_Dj$7$^$9!#(B @code{wl-nntp-posting-@{server|user|port|function@}}$B$h$jM%@h$5$l$^$9!#(B @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 $B=i4|@_Dj$O(B @code{nil}$B!#(B POP-before-SMTP $B$G(B POP $B$r9T$J$&$H$-$N%f!<%6L>$G$9!#(B @code{nil} $B$N$^$^$J$i(B @code{elmo-pop3-default-user}$B$rMxMQ$7$^$9!#(B @item wl-pop-before-smtp-server @vindex wl-pop-before-smtp-server $B=i4|@_Dj$O(B @code{nil}$B!#(B POP-before-SMTP $B$G(B POP $B$r9T$J$&$H$-$N%5!<%PL>$G$9!#(B @code{nil} $B$N$^$^$J$i(B @code{elmo-pop3-default-server}$B$rMxMQ$7$^$9!#(B @item wl-pop-before-smtp-authenticate-type @vindex wl-pop-before-smtp-authenticate-type $B=i4|@_Dj$O(B @code{nil}$B!#(B POP-before-SMTP $B$G(B POP $B$r9T$J$&$H$-$NG'>ZJ}<0$G$9!#(B @code{nil} $B$N$^$^$J$i(B @code{elmo-pop3-default-authenticate-type}$B$rMxMQ$7$^$9!#(B @item wl-pop-before-smtp-port @vindex wl-pop-before-smtp-port $B=i4|@_Dj$O(B @code{nil}$B!#(B POP-before-SMTP $B$G(B POP $B$r9T$J$&$H$-$N%]!<%HHV9f$G$9!#(B @code{nil} $B$N$^$^$J$i(B @code{elmo-pop3-default-port}$B$rMxMQ$7$^$9!#(B @item wl-pop-before-smtp-stream-type @vindex wl-pop-before-smtp-stream-type $B=i4|@_Dj$O(B @code{nil}$B!#(B POP-before-SMTP $B$G(B SSL $B$rMxMQ$9$k$+$I$&$+$r<($9%U%i%0$G$9!#(B@code{nil} $B$N(B $B$^$^$J$i(B @code{elmo-pop3-default-stream-type}$B$rMxMQ$7$^$9!#(B @code{ssl} $B$J$i(B SSL $B$rMxMQ$7$^$9!#(B @code{starttls}$B$J$i(B STARTTLS (RFC2595)$B$rMxMQ$7$F%3%M%/%7%g%s$rD%$j$^$9!#(B @item wl-draft-queue-save-variables @vindex wl-draft-queue-save-variables $B%*%U%i%$%sAw?.;~$K%-%e!<$K3JG<$7$?%a%C%;!<%8$K$D$$$FJ]B8$7$F$*$/JQ?t$r(B $B%j%9%H$G;XDj$7$^$9!#(B @item wl-draft-sendlog @vindex wl-draft-sendlog $B=i4|@_Dj$O(B @code{t}$B!#(B @code{t} $B$J$i(B @file{~/.elmo/sendlog} $B$KAw?.%m%0$r=PNO$7$^$9!#(B $B%m%0$r=PNO$9$k%?%$%_%s%0$O0J2<$NDL$j$G$9(B($B<:GT$N>l9g$b(B)$B!#(B @itemize @minus @item smtp, qmail $B$K$h$kAw?.(B @item fcc $B$K$h$k%U%)%k%@$X$N3JG<(B @item queuing $B$K$h$k%U%)%k%@$X$N3JG<(B @end itemize @noindent $B$?$@$7!"(B@file{im-wl.el} $B$K$h$kAw?.$G$O!"(B @file{sendlog} $B$K$O=PNO$;$:$K(B @command{imput} $B$N%m%05!G=$K$*$^$+$;$7$^$9!#(B @item wl-draft-sendlog-max-size @vindex wl-draft-sendlog-max-size $B=i4|@_Dj$O(B 20000 ($B%P%$%H(B)$B!#(B @code{wl-draft-sendlog} $B$,(B @code{t} $B$N>l9g!"J]B8$7$?%m%0$NBg$-$5$,;XDj$7(B $B$?Bg$-$50J>e$K$J$l$P!"%m%0$r%m!<%F!<%7%g%s$7$^$9!#(B @item wl-use-ldap @vindex wl-use-ldap $B=i4|@_Dj$O(B @code{nil}$B!#(B Non-nil $B$J$i(B LDAP $B$rMxMQ$7$F%"%I%l%9Jd40$7$^$9!#(B @item wl-ldap-server @vindex wl-ldap-server $B=i4|@_Dj$O(B @samp{localhost}$B!#(B $B%"%I%l%9Jd40$KMQ$$$k(B LDAP $B%5!<%PL>$G$9!#(B @item wl-ldap-port @vindex wl-ldap-port $B=i4|@_Dj$O(B @code{nil}$B!%(B $B%"%I%l%9Jd40$KMQ$$$k(B LDAP $B%5!<%P$N%]!<%HHV9f$G$9!#(B @item wl-ldap-base @vindex wl-ldap-base $B=i4|@_Dj$O(B @samp{c=US}$B!#(B $B%"%I%l%9Jd40;~$N(B LDAP $B8!:w$N3+;OE@(B(base)$B$r;XDj$7$^$9!#(B @item wl-draft-remove-group-list-contents @vindex wl-draft-remove-group-list-contents $B=i4|@_Dj$O(B @code{t}$B!#(B Non-nil $B$J$i%a!<%kAw?.$N:]$K08@h$+$i(B group-list $B$NFbMF$r:o=|$7$^$9(B (group-list $B$H$O08@h$K4^$^$l$k(B @samp{Group: foo@@gohome.org, bar@@gohome.org;}$B$N$h$&$J5-=R$r;X$7$^$9(B)$B!#(B @end table @node Disconnected Operations, Expire and Archive, Draft, Top @chapter $B%*%U%i%$%s=hM}(B @cindex Disconnected Operations @cindex Offline @cindex Unplugged Wanderlust $B$K$O%*%s%i%$%s%b!<%I$H%*%U%i%$%s%b!<%I$,$"$j$^$9!#(B @menu * Off-line State:: $B%*%U%i%$%s%b!<%I(B * Enable Operations:: $B%*%U%i%$%s%b!<%I$GuBV@_Dj(B * Variables of Plugged Mode:: $B%+%9%?%^%$%:JQ?t(B @end menu @node Off-line State, Enable Operations, Disconnected Operations, Disconnected Operations @section $B%*%U%i%$%s%b!<%I(B Wanderlust $B$K$O%*%s%i%$%s%b!<%I$H%*%U%i%$%s%b!<%I$,$"$j$^$9!#%*%U%i%$%s(B $B%b!<%I$G$O!"%M%C%H%o!<%/7PM3$G$J$1$l$PFI$a$J$$%a%C%;!<%8$K$O%"%/%;%9$G$-(B $B$^$;$s(B($B%-%c%C%7%e$5$l$F$$$l$P%"%/%;%9$G$-$^$9(B)$B!#(B $B%b!<%I%i%$%s$N(B @samp{[ON]} $B$H$$$&I=<($O!"%*%s%i%$%s%b!<%I$K$"$k$3$H$r<((B $B$7$F$$$^$9!#%b!<%I%i%$%s$,(B @samp{[--]} $B$H$$$&I=<($K$J$C$F$$$k$H$-$O%*%U(B $B%i%$%s%b!<%I$G$9!#%U%)%k%@%b!<%I!"%5%^%j%b!<%I$G(B @kbd{M-t} $B$r2!$9$H%*%U(B $B%i%$%s(B/ $B%*%s%i%$%s$N@Z$jBX$($,$G$-$^$9!#(B $B%*%U%i%$%s%b!<%I$G$O%5%^%j%b!<%I$N(B @kbd{n} $B$H(B @kbd{p} $B$NF0:n$,JQ$o$j!"(B $B%-%c%C%7%e$5$l$F$$$J$$%a%C%;!<%8$X$O0\F0$7$J$/$J$j$^$9!#(B @file{~/.wl} $B$J$I$GJQ?t(B @code{wl-plugged} $B$r(B @code{nil} $B$K@_Dj$7$F$+$i5/(B $BF0$9$k$H!"5/F0;~$+$i%*%U%i%$%s%b!<%I$H$J$j$^$9!#(B @node Enable Operations, Plugged Mode, Off-line State, Disconnected Operations @section $B%*%U%i%$%s%b!<%I$G]$H$J$k%a%C%;!<%8$,%-%c%C%7%e$5$l$F$$$l$P(B) $B%*%U%i%$%s%b!<(B $B%I$G$be$KH?1G(B $B$5$l$k$N$O!"(BWanderlust $B$,%*%s%i%$%s%b!<%I$K$J$C$?=V4V$G$9!#(B $BJQ?t(B @code{elmo-enable-disconnected-operation} $B$,(B @code{nil} $B$J$i!"$3$l$i(B $B$N%M%C%H%o!<%/%U%)%k%@$K4X$9$k%*%U%i%$%s=hM}$ruBV$G%a!<%k(B/$B%K%e!<%95-;v$NAw?.A`:n$r$9$k$H!"Aw?.$NM=Ls$,$5$l(B $B$^$9!#(B(@file{im-wl.el} $B$r$*;H$$$N>l9g$O!"4X78$"$j$^$;$s!#(B) $B%*%U%i%$%s$N(B $B$H$-$KAw?.M=Ls$5$l$?%a%C%;!<%8$O%-%e!<%U%)%k%@(B @samp{+queue} $B$KN/$j$^$9!#(B $BN/$C$?%a%C%;!<%8$O!"%*%s%i%$%s$K$J$C$?$H$-$K0l5$$KAw?.$5$l$^$9!#(B $B%*%U%i%$%s$N$&$A$K(B @samp{+queue} $B$rK,$l$F!"%-%e!<$K$"$k%a%C%;!<%8$NFbMF(B $B$r3NG'$G$-$^$9!#%a%C%;!<%8$r:o=|$9$k$3$H$b2DG=$G$9!#(B($B:o=|$5$l$?%a%C%;!<(B $B%8$O%*%s%i%$%s$K$J$C$F$bAw?.$5$l$^$;$s!#(B) @c $B%-%e!<$K$"$k%a%C%;!<%8$r:FJT=8$9$k$3$H$b2DG=$G$9$,!"(B @c $BLdBj$,5/$3$k2DG=@-$,$"$j$^$9$N$G$*4+$a$G$-$^$;$s!#(B @node Re-file and Copy queue, Creation of Folders, Send Messages off-line, Enable Operations @subsection $B%j%U%!%$%k(B/$B%3%T!<(B(IMAP4) $B%*%U%i%$%s>uBV$N$"$$$@$Ke$N%a%C(B $B%;!<%8$H(B @samp{Message-ID:} $B$,0lCW$7$?>l9g$N$_l9g$K$O!"$=$l$i$N%a%C%;!<%8$r(B @samp{+lost+found} $B%U%)%k%@$KDI2C$7$^$9!#(B @node Creation of Folders, Marking, Re-file and Copy queue, Enable Operations @subsection $B%U%)%k%@@8@.(B(IMAP4) IMAP $B%U%)%k%@$N@8@.$b%*%U%i%$%s>uBV$Gl9g!"%*%U%i%$%sCf$K@8@.$5$l$?%U%)%k%@$X%j%U%!%$(B $B%k$5$l$?%a%C%;!<%8$O(B @samp{+lost+found} $B%U%)%k%@$KDI2C$5$l$^$9!#(B @node Marking, Pre-fetching Reservations, Creation of Folders, Enable Operations @subsection $B%^!<%/IU$1(B(IMAP4) IMAP $B%U%)%k%@$K$"$k%a%C%;!<%8$KBP$9$kL$FI(B/$B4{FI$N>pJs!"$*$h$S!"=EMW%^!<%/(B @samp{$} $B$,$D$$$F$$$k$+$I$&$+$b!"%*%U%i%$%sCf$NJQ99$,%*%s%i%$%s$K$J$C$?(B $B$H$-$K%5!<%P$KH?1G$5$l$^$9!#(B @node Pre-fetching Reservations, , Marking, Enable Operations @subsection $B%W%j%U%'%C%A(B $B%M%C%H%o!<%/%U%)%k%@(B (IMAP, NNTP, POP3, shimbun) $B$K$"$k%a%C%;!<%8$KBP$7$F!"(B $B%W%j%U%'%C%A$NM=Ls$r$7$^$9!#%W%j%U%'%C%A$rM=Ls$7$?%a%C%;!<%8$K$O(B @samp{u} $B$,IU$-$^$9$,!"$3$N;~E@$G$O%-%c%C%7%e$5$l$F$*$i$:!"%*%s%i%$%s$K$J$C(B $B$?$H$-$K%5!<%P$+$i%W%j%U%'%C%A$5$l$^$9!#(B @node Plugged Mode, Off-line State settings, Enable Operations, Disconnected Operations @section $B%5!<%P!&%]!<%HJL$N%*%s%i%$%s!"%*%U%i%$%s$N@Z$jBX$((B $B>e5-$N(B @kbd{M-t} $B$K$h$kA`:n$G$O%M%C%H%o!<%/$N>uBV$r0l3g$7$F@Z$jBX$($^$9$,!"(B $B%5!<%P!&%]!<%HJL$K%*%s%i%$%s$H%*%U%i%$%s$r@Z$jBX$($k$3$H$b$G$-$^$9!#(B $B%U%)%k%@%b!<%I!"%5%^%j%b!<%I$G(B @kbd{C-t} $B$r2!$9$H0J2<$N$h$&$J(B wl-plugged-mode $B$KF~$j!"$3$N%b!<%I$G3F%]!<%H$N(B plug $B>uBV$rJQ99$7$^$9!#(B @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$B9TL\$O%*%U%i%$%sA`:n$K4X78$9$kuBV$rI=<($7$F$$$^$9!#(B $B$=$l$>$l$N%i%Y%kMs$G(B @kbd{@key{SPC}} $B$d(B @kbd{@key{RET}} $B$r2!$9$3$H$G(B $BJQ?t$NCM$r4JC1$KJQ99$G$-$k$h$&$K$J$C$F$$$^$9!#(B @example @group "Queuing" @code{wl-draft-enable-queuing} "AutoFlushQueue" @code{wl-auto-flush-queue} "DisconnectedOperation" @code{elmo-enable-disconnected-operation} @end group @end example $B$3$3$G!"(B@samp{[ON]} $B$O$=$NJQ?t$NCM$,(B @code{t} $B$G$"$k$3$H$r!"(B@samp{[--]} $B$O(B @code{nil} $B$G$"$k$3$H$r<($7$F$$$^$9!#(B $B$^$?!"(B2$B9TL\0J9_$G$O%5!<%P$H%]!<%H$N%*%s%i%$%s$H%*%U%i%$%s>uBV$rI=<($7!"(B @samp{[ON]} $B$O$=$N%5!<%P$d%]!<%H$,%*%s%i%$%s$G$"$k$3$H$r!"(B @samp{[--]} $B$O%*%U%i%$%s$G$"$k$3$H$r<($7$F$$$^$9(B (XEmacs $B$H(B Emacs 21 $B$G$O%"%$%3%s$GI=<($5$l$^$9(B)$B!#(B $B$=$7$F$=$l$>$l$N9T$G(B @kbd{@key{SPC}} $B$d(B @kbd{@key{RET}} $B$r2!$9$3$H$G(B $B>uBV$r@Z$jBX$($k$3$H$,$G$-$^$9!#(B @dfn{sending queue} $B$O%*%U%i%$%sAw?.;~$K(B @samp{+queue} $B%U%)%k%@$K3JG<$5(B $B$l$F$$$kAw?.BT$A$N%a%C%;!<%8$r;X$7!"(B@dfn{dop queue} $B$O%*%U%i%$%s$G9T$C$?(B $B%j%U%!%$%k(B/$B%3%T!uBV$,2hLL$K(B $BI=<($5$l$^$9!#>e5-Nc$G$O!"(Bsending queue $B$K$O(B hosta $B$N(B smtp $B8~$1$K(B 2 $B$D(B (queue $B%U%)%k%@$N(B1$BHV$H(B2$BHV(B)$B$H!"(Bhosta $B$N(B nntp $B8~$1$K(B 1 $B$D(B(3$BHV(B)$B$N%a%C%;!<%8(B $B$,$"$j!"(Bdop queue $B$K$O(B @samp{%inbox} $B$NA`:n$,(B1$B$D$H!"(B@samp{%#mh/wl} $B$NA`(B $B:n$,(B2$B$D$"$k$3$H$r<($7$F$$$^$9!#(B $B$3$N%b!<%I$G(B2$B9TL\$K$"$k(B @samp{(wl-plugged)} $B$rJQ99$9$k$H!"(B @code{wl-plugged} $BJQ?t$,JQ99$5$l!"$3$l$K$h$j%b!<%I%i%$%s$N(B indicator $B$H(B $BA4BN$N(B $B%]!<%H(B plug $B>uBV$,(B ON/OFF $B$5$l$^$9!#$^$?!"3F%5!<%P$d%]!<%H$N(B plug $B>uBV$rJQ99$9$k$H!"(B@code{elmo-plugged-condition} ($B8e=R(B)$B$N@_Dj$H3F%]!<%H$N(B plug $B>uBV$K$h$j(B 2$B9TL\$N(B @samp{(wl-plugged)} $B$,JQ2=$7$^$9!#(B @node Off-line State settings, Variables of Plugged Mode, Plugged Mode, Disconnected Operations @section $B5/F0;~$N%*%U%i%$%s>uBV@_Dj(B $BA0=R$NDL$j!"(B@file{~/.wl} $B$J$I$GJQ?t(B @code{wl-plugged} $B$r(B @code{nil} $B$K@_(B $BDj$7$F$+$i5/F0$9$k$H!"5/F0;~$+$i%*%U%i%$%s%b!<%I$K$9$k$3$H$,$G$-$^$9!#$5(B $B$i$K:Y$+$/%5!<%P$d%]!<%HKh$K%*%U%i%$%s>uBV$r@_Dj$9$k$3$H$b2DG=$G$9!#J;$;(B $B$FJQ?t(B @code{wl-reset-plugged-alist} $B$b;2>H$7$F2<$5$$!#(B $BDL>o!"5/F0;~$K$O(B @file{~/.folders} $B$H(B @code{wl-smtp-posting-server}, @code{wl-nntp-posting-server} $B$J$I$+$i3F%]!<%H$N(B plug $B>uBV$,<+F0E*$KDI2C(B $B$5$l$^$9$,!"$3$l$i$N%]!<%H$N(B plug $B>uBV$rJQ99$7$?$j!">e5-0J30$N%]!<%H$rDI2C(B $B$7$?$j$9$k>l9g$K$O(B @code{wl-make-plugged-hook} $B$KJQ99$9$k4X?t$r5-=R$7$^(B $B$9!#(B @lisp @group (add-hook 'wl-make-plugged-hook '(lambda () (elmo-set-plugged plugged$BCM(B(t/nil) server port) ;; @r{server,port$B$N(Bplug$B>uBV$r?75,DI2C$b$7$/$OJQ99$9$k(B} (elmo-set-plugged plugged$BCM(B(t/nil) server) ;; @r{port $B$r>JN,$9$k$H(Bserver$B$NA4(Bport$B$,JQ99$5$l$k(B} ;; @r{(port $B$r>JN,$7$F?75,$NDI2C$O$G$-$J$$(B)} )) @end group @end lisp @node Variables of Plugged Mode, , Off-line State settings, Disconnected Operations @section $B%+%9%?%^%$%:JQ?t(B @table @code @item wl-plugged @vindex wl-plugged $B$3$NCM$r(B @code{nil} $B$K@_Dj$7$F(B Wanderlust $B$r5/F0$9$k$H!"5/F0;~$+$i%*%U%i(B $B%$%s%b!<%I$H$J$j$^$9!#(B @item wl-queue-folder @vindex wl-queue-folder $B=i4|@_Dj$O(B @samp{+queue}$B!#Aw?.%-%e!<$N%a%C%;!<%8$,N/$k%U%)%k%@!#(B @item wl-auto-flush-queue @vindex wl-auto-flush-queue $B=i4|@_Dj$O(B @code{t}$B!#%*%s%i%$%s$K$J$C$?$H$-$K<+F0E*$K%-%e!<$rAw?.$9$k$+(B $B$I$&$+!#(BNon-nil $B$J$i<+F0E*$KAw?.$7$^$9(B ($B0l1~(B @code{y-or-n-p} $B$G3NG'(B $B$7$^$9(B)$B!#r7o$r3F%]!<%H$N(B plug $B>u(B $BBV$K$h$j;XDj$7$^$9!#(B @example 'one : 1$B$D0J>e$N%]!<%H$,(B plugged $B$J$i(B plugged $B$G$"$k(B 'all : $BA4$F$N%]!<%H$,(B plugged $B$J$i(B plugged $B$G$"$k(B 'independent : $B%]!<%H$N(B plug $B>uBV$K4X78$J$/(B wl-plugged (elmo-plugged) $B$r;2>H$9$k(B @var{function} : $B4X?t(B @var{function} $B$NLa$jCM$K$h$jJQ2=$9$k(B $BI8=`$GMQ0U$5$l$F$$$k4X?t(B 'elmo-plug-on-by-servrs : $BJQ?t(B elmo-plug-on-servers $B$G;XDj$7$?%5!<%P$N(B plug $B>uBV$K$h$jJQ2=$9$k(B 'elmo-plug-on-by-exclude-servers : $BJQ?t(B elmo-plug-on-exclude-servers $B$G;XDj$7$?0J30$N(B $B%5!<%P$N(B plug $B>uBV$K$h$jJQ2=$9$k(B elmo-plug-on-exclude-servers $B$N%G%U%)%k%HCM$O(B '("localhost" (system-name) (system-name)$B$+$i%I%a%$%sIt$r=|$$$?$b$N(B) $B$G$"$k(B @end example @example @group $BNc(B1: (setq elmo-plugged-condition 'all) $BNc(B2: (setq elmo-plug-on-servers '("smtpserver" "newsserver")) (setq elmo-plugged-condition 'elmo-plug-on-by-servers) $BNc(B3: (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 $B=i4|@_Dj$O(B @code{t}$B!#(BNon-nil $B$J$i(B Wanderlust $B$N5/F0;~$K%5!<%P!&%]!<%HJL(B $B$N%W%i%0>uBV$r(B @code{wl-plugged} $B$NCM$K$h$j=i4|2=$7$^$9!#(B @code{nil} $B$J$i!"(BEmacs $B$,F0:n$7$F$$$k4V!"A02s=*N;$7$?;~E@$N%W%i%0>uBV$r(B $BJ];}$7$^$9!#8@$$49$($l$P(B @code{nil} $B$G$"$C$F$b(B Emacs $B$r:F5/F0$9$k$H=i4|(B $B2=$5$l$^$9!#(B @end table @node Expire and Archive, Scoring, Disconnected Operations, Top @chapter $B%a%C%;!<%8$N<+F0:o=|$H%"!<%+%$%V(B @cindex Expire and Archive @menu * Expire:: $B4|8B%a%C%;!<%8$N<+F0:o=|!"%"!<%+%$%V(B * Archive:: $BA4%a%C%;!<%8$N%"!<%+%$%V(B @end menu @node Expire, Archive, Expire and Archive, Expire and Archive @section $B%a%C%;!<%8$N<+F0:o=|(B @cindex Expire Message Expire $B$H$O!";XDj$7$?4|4V$r2a$.$?8E$$%a%C%;!<%8$r:o=|$9$k5!G=$G$9!#(B $B$7$+$7!"(B@code{wl-expire} $B$G$O%a%C%;!<%8$rC1=c$K>C$9$@$1$G$O$J$/!";XDj$7$?%"!<%+(B $B%$%V%U%)%k%@$K0\F0$9$k$3$H$b=PMh$^$9!#(B @section $B;H$$J}(B @code{wl-expire-alist}$B$r@_Dj$7$F!"%U%)%k%@%b!<%I$G(B @kbd{e}$B!"$b$7$/$O%5%^(B $B%j%b!<%I$G(B @kbd{M-e} $B$r2!$7$^$9!#(B @subsection @code{wl-expire-alist}$B$N@_Dj(B $BJN,$9$k$H(B @var{n1} + 1 $B$K$J$j$^$9!#Nc$($PCM$,(B 510 $B$J$i%a%C%;!<%8$,(B 510 $B0J>e$N$H$-(B $B$K(B expire $B$rl9g!"IQHK$K%a!<%k$,Mh$k%U%)%k%@$G$OKh2s(B expire $B$rl9g!"$3$N(B $B$h$&$J%a%C%;!<%8$b4^$a$F(B 500 $B8D$K$J$k$h$&$K(B expire $B$7$^$9!#(B@code{nil} $B$N>l9g$O>e5-%a%C%;!<%80J30$G(B 500 $B$K$J$k$h$&$K(B expire $B$7$^$9!#(B @item (date @var{d1}) $B%a%C%;!<%8$NF|IU$K$h$j:o=|$r9T$$$^$9!#(B @var{d1} $B$O8=:_$h$j2?F|A0$N%a%C%;!<%8$r:o=|$9$k$I$&$+$G$"$j!"(B $BNc$($PCM$,(B 7 $B$J$i(B 7$BF|$h$jA0$N%a%C%;!<%8$r:o=|$7$^$9!#(B $B$J$*!"$3$NF|IU$H$O%a%C%;!<%8$N(B @samp{Date:} $B%U%#!<%k%I$NF|IU$G$"$j!"(B $B%a%C%;!<%8$,%U%)%k%@$KF~$C$?F|IU$G$O$J$$$3$H$KCm0U$7$F$/$@$5$$!#(B $B$b$7!"%a%C%;!<%8$K(B @samp{Date:} $B%U%#!<%k%I$,$J$+$C$?$j!"(B@samp{Date:} $B%U%#!<(B $B%k%I$,IT@5$JCM$J$i!"(Bexpire $B$5$l$^$;$s$N$G!":o=|$9$k%a%C%;!<%8$N%j%9%H!"(B $B$=$7$F%5%^%j$N(B msgdb $B>pJs$,EO$5$l$^$9!#$^$?!"4X?tL>$N8e$K4X?tFH<+$N0z?t$b(B $B;XDj$G$-$^$9!#$J$*!"$3$N4X?t$K$O(B@code{wl-summary-expire-reserve-marks}$B$G(B $B;XDj$7$?%a%C%;!<%8$b4^$s$@%j%9%H$,EO$5$l$^$9$N$G!"FH<+$K4X?t$r:n$k>l9g$O(B $BCm0U$7$F$/$@$5$$!#(B $B$3$3$G;XDj$G$-$k4X?t$K$O!"I8=`$G]$N%a%C%;!<%8HV9f$KBP$9$k%"!<%+%$%V%U%)%k%@$K%j%U%!%$%k$7$^$9!#Nc(B $B$($P!"(B102 $BHV$G$"$k$J$i(B @file{wl-00100.zip}$B!"(B390 $BHV$G$"$k$J$i(B @file{wl-00300.zip}$B!"$J$I$N$h$&$K$G$9!#$J$*!"(B @code{wl-expire-archive-files} $B$r(B 200 $B$K$9$k$H!"(B@file{wl-00000.zip}, @file{wl-00200.zip}, @file{wl-00400.zip}, @dots{} $B$K%j%U%!%$%k$7$F$$$-$^(B $B$9!#(B $B%j%U%!%$%k@h$N%"!<%+%$%V%U%)%k%@$O:o=|85$N%U%)%k%@L>$K4p$E$$$Fl9g$H$7$F07$o$l$^$9(B) @table @asis @item $B%U%)%k%@%?%$%W$,(Blocaldir$B$N>l9g(B @file{@var{ArchiveDir}/@var{foldername}-xxxxx.zip} $BNc$($P(B @samp{+ml/wl} $B$O(B @samp{$ml/wl;zip} (@file{~/Mail/ml/wl-00100.zip})$B$H$J$j$^$9!#(B @item $B%U%)%k%@%?%$%W$,(Blocaldir$B0J30$N>l9g(B @file{@var{ArchiveDir}/@var{foldertype}/@var{foldername}-xxxxx.zip} $BNc$($P!"(B@samp{%#mh/ml/wl} $B$O(B @samp{$imap4/#mh/ml/wl;zip} (@file{~/Mail/imap4/#mh/ml/wl-00100.zip})$B$H$J$j$^$9!#(B @end table $B$9$J$o$A!"(Blocaldir $B$N>l9g$O$K4^$^$l$^$;$s$,!"$=$l0J30$O$K4^$^$l$k$N$G$9!#(B $B$^$?!"(B@code{wl-expire-archive-folder-prefix} $B$K$h$j!"(B $B%"!<%+%$%V%U%)%k%@$KIU$1$k(B prefix $B$r@)8f$G$-$^$9!#(B @code{wl-expire-archive-folder-prefix}$B$N@bL@$rNI$/8+$F$*$$$F$/$@$5$$!#(B @item wl-expire-archive-number2 $B;XDj$7$?8D?t$4$H$K%"!<%+%$%V%U%)%k%@$K%j%U%!%$%k$7$^$9!#(B @samp{wl-expire-archive-number1} $B$H0[$J$kE@$O%a%C%;!<%8HV9f$K4X78$J$/%"!<%+%$%V%U%)%k%@$,;XDj?t$KC#$9$k$^$G(B $B$=$N%U%)%k%@$K%j%U%!%$%k$9$k!"$H$$$&E@$G$9!#(B $B$J$*!"%j%U%!%$%k@h$N%"!<%+%$%V%U%)%k%@$O(B @code{wl-expire-archive-number1} $B$HF1$8$h$&$K7hDj$5$l$^$9!#(B @item wl-expire-archive-date $B%a%C%;!<%8$NF|IU(B($BG/7n(B)$B$4$H$K%"!<%+%$%V%U%)%k%@$K%j%U%!%$%k$7$^$9!#(B $BNc$($P!"(B1998$BG/(B12$B7n$N%a%C%;!<%8$O(B @code{$folder-199812;zip} $B$K%j%U%!%$%k(B $B$5$l$^$9!#$J$*!"F|IU$NItJ,0J30$N%"!<%+%$%V%U%)%k%@L>$O(B @code{wl-expire-archive-number1}$B$HF1$8$h$&$K7hDj$5$l$^$9!#(B $B$^$?!">e5-$N(B3$B$D$NI8=`4X?t$G$O(B @code{wl-expire-alist} $B$G$NBh(B1$B0z?t$K(B non-nil $B$r;XDj$9$k$H!"%U%)%k%@$N%a%C%;!<%8HV9f$r$=$N$^$^J]B8$G$-$^$9!#Nc(B $B$($P!"$N8e$KB3$1$F;XDj$7$^$9!#(B @lisp ("^\\+ml/wl$" (number 300 310) wl-expire-archive-number1 t) @end lisp $B0z?t$r;XDj$7$J$$>l9g$O!"3F%"!<%+%$%V%U%)%k%@$4$H$K(B 1 $B$+$i=g$KHV9f$rM?$((B $B$FJ]B8$5$l$^$9!#(B @item wl-expire-localdir-date $B%a%C%;!<%8$NF|IU!JG/7n!K$4$H$K!"Nc$($P!"(B@samp{+ml/wl/1999_11/}, @samp{+ml/wl/1999_12/} $B$H$$$C$?(B MH $B%U%)%k%@$K%j%U%!%$%k$7$^$9!#(B @end table @end table @subsection $B=EMW%a%C%;!<%8$dL$FI%a%C%;!<%8$N07$$(B $B:o=|@h$K(B @code{remove} $B$d(B @code{trash}$B!"%U%)%k%@L>!"I8=`4X?t$N$$$:$l$r;X(B $BDj$7$?>l9g$G$b!"(B@code{wl-summary-expire-reserve-marks}$B$G;XDj$7$?%^!<%/$N(B $B%a%C%;!<%8(B($B0J2l9g$O3NG'$;$:$K<+F0$C$F!"(B@samp{Desktop} $B%0%k!<%W$r;XDj$9$l(B $B$P(B@code{wl-expire-alist}$B$K%^%C%A$9$kA4$F$N%U%)%k%@$G(B expire $B$re5-$NI8=`4X?t(B @code{wl-expire-archive-number1} $B$J$I$G:n@.$7$?%"!<%+%$%V(B $B%U%)%k%@$r07$&>l9g$O!"JQ?t(B @code{elmo-archive-treat-file} $B$r(B non-nil $B$K@_(B $BDj$7$F$*$/I,MW$,$"$j$^$9!#(B @subsection $BF0:n3NG'(B @code{remove} $B$r;XDj$9$k>l9g$O!"$^$:(B @code{trash} $B$K$7$F4|BTDL$j$K%a!<%k(B $B$,(B @code{wl-trash-folder} $B$K0\F0$5$l$k$3$H$r3NG'$7$F$+$i(B @code{remove} $B$KJQ$($k$H$h$$$G$7$g$&!#$$$-$J$j(B @code{remove} $B$r;XDj$9$k$N$O4m81$G$9!#(B $B$^$?!"(B@code{wl-expire-archive-number1}$B$J$I$N4X?t$rMxMQ$9$k>l9g!"$^$:$O;H(B $BMQ$9$k%"!<%+%$%P%?%$%W(B(@code{zip} $B$d(B @code{lha})$B$J$I$N%U%)%k%@$r;n$7$K:n(B $B$C$F!"@5$7$/DI2C$G$-$k$+$I$&$+$r3NG'$7$F$/$@$5$$!#$?$H$(!"(B @code{wl-expire-alist} $B$d(B @code{elmo-archive} $B$N@_Dj$,@5$7$/$F$b!"%"!<%+(B $B%$%V%W%m%0%i%`$,@5$7$/F0$+$J$1$l$P$I$3$K$bJ]B8$5$l$:$K%a%C%;!<%8$,>C$($F(B $B$7$^$&$+$bCN$l$^$;$s!#(B $B%"!<%+%$%V%U%)%k%@$NF0:n$,3NG'$G$-!" $ml/wl-00600;tgz;wl (600 601 602) @end group @end example $B:G=i$N9`L\$OF0:n$r<($9$b$N$G!"(B@samp{delete}, @samp{copy}, @samp{move} $B$,(B $B$"$j$^$9!#$G!"(B@samp{copy} $B$H(B @samp{move} $B$N>l9g$O(B@samp{->}$B$KB3$1$F%3%T!<$b$7$/$O0\F0@h$N%U%)%k%@L>$,5-O?$5$l$^$9!#(B $B:G8e$N9`L\$O!"l9g!"0\F08e$G$O$J$/0\F0A0$N%a%C%;!<%8HV9f(B $B$G$9(B)$B!#(B @subsection reserve$B%a%C%;!<%8$N%j%U%!%$%k(B $BI8=`$GMQ0U$5$l$F$$$k(B3$B$D$N4X?t$G$O!"(Breserve $B%a%C%;!<%8$O%"!<%+%$%V%U%)%k%@(B $B$K%3%T!<$7$^$9$,!"85$N%U%)%k%@$+$i$O:o=|$7$J$$$h$&$K$J$C$F$$$^$9!#$J$*!"(B $B=EMW%^!<%/$J$I$O>o$K;D$k$?$a!"2?EY$b%3%T!<$5$l$k$3$H$,$J$$$h$&$K(B @file{~/.elmo/expired-alist} $B$K5-O?$9$k$h$&$K$J$C$F$$$^$9!#$?$@$7$3$l$O(B reserve $B%a%C%;!<%8$,(B refile $BBP>]$K$J$C$?$H$-$NOC$G$9!#(B @code{wl-summary-archive} $B$J$I$G%3%T!<$5$l$k>l9g$O5-O?$r;D$7$^$;$s!#(B $B%m%05!G=$rM-8z$K$7$F$$$?>l9g$O!"%j%U%!%$%k;~$K$ODL>o(B @samp{move} $B$,5-(B $BO?$5$l$^$9$,!"(Breserve $B%a%C%;!<%8$,4^$^$l$F$$$k$H!"(B@samp{copy} $B$H(B @samp{delete} $B$KJ,$1$F5-O?$5$l$^$9!#$3$l$O(B reserve $B%a%C%;!<%8$r4^$a$?%a%C(B $B%;!<%8$r%3%T!<$7$?8e!"(Breserve $B%a%C%;!<%8$r=|$$$?%a%C%;!<%8$r:o=|$9$k!"(B $B$H$$$&=hM}$r9T$C$F$$$k$?$a$G$9!#(B @section $B%+%9%?%^%$%:JQ?t(B @table @code @item wl-expire-alist @vindex wl-expire-alist $B=i4|@_Dj$O(B @code{nil}$B!#(B expire $B$r9T$&%U%)%k%@$H(B expire $BJ}K!$N;XDj$r9T$$$^$9!#>\$7$/$O>e5-$N(B @code{wl-expire-alist}$B$N@_Dj$r$4Mw2<$5$$!#(B @item wl-summary-expire-reserve-marks @vindex wl-summary-expire-reserve-marks $B=i4|@_Dj$O0J2<$N%j%9%H!#(B @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 $B$r9T$C$F$b!"%U%)%k%@$K$O;D$7$F$*$/%a%C%;!<%8$N%^!<%/$r;XDj$7$^$9!#(B $B%^!<%/$K$O1JB3E*%^!<%/$N$_;XDj$G$-$^$9!#(B $B0l;~E*%^!<%/$O;XDj$G$-$^$;$s!#(B $B%G%U%)%k%H$N$h$&$K%j%9%H$G;XDj$9$k$H$=$N%^!<%/$N%a%C%;!<%8$r;D$;$kB>!"0J(B $B2<$N;XDj$b$G$-$^$9!#(B @table @code @item all $B1JB3%^!<%/$NIU$$$?$9$Y$F$N%a%C%;!<%8$r;D$7$^$9!#(B $B$D$^$j!"%G%U%)%k%H$G@_Dj$5$l$F$$$k%^!<%/0J30$K(B @code{wl-summary-read-uncached-mark} $B$,4^$^$l$^$9!#(B @item none $B$I$s$J%^!<%/$NIU$$$?%a%C%;!<%8$G$"$C$F$b!"DL>o$N4{FI%a%C%;!<%8$HF1$807$$(B $B$r$7$^$9!#$9$J$o$A!"(B@samp{$} $B%^!<%/$NIU$$$?=EMW%a%C%;!<%8$G$"$C$F$b:o=|(B $B$5$l$^$9!#(B @end table @item wl-expire-archive-files @vindex wl-expire-archive-files $B=i4|@_Dj$O(B 100$B!#(B $B$R$H$D$N%"!<%+%$%V%U%)%k%@$KJ];}$9$k%a%C%;!<%8?t$r;XDj$7$^$9!#(B @item wl-expire-number-with-reserve-marks @vindex wl-expire-number-with-reserve-marks $B=i4|@_Dj$O(B @code{nil}$B!#(B Non-nil $B$K$9$k$H!"(B $B:o=|%a%C%;!<%8$N;XDj$G(B @code{number} $B$r;XDj$7$?$H$-!"(B $B;D$7$F$*$/%a%C%;!<%8?t$K(B @code{wl-summary-expire-reserve-marks} $B$G@_Dj$5(B $B$l$?%a%C%;!<%8$r4^$a$^$9!#(B @item wl-expire-archive-get-folder-function @vindex wl-expire-archive-get-folder-function $B=i4|@_Dj$O(B @code{wl-expire-archive-get-folder}$B!#(B $B:o=|@h$NI8=`4X?t$G%"!<%+%$%V%U%)%k%@L>$r$NJQ99$G$-$^$9$,!"$b$C$HJ#;($J;XDj$r(B $B$7$?$$>l9g$O?7$?$K4X?t$r:n$C$F$3$NJQ?t$K@_Dj$7$^$9!#(B $B4X?t(B@code{wl-expire-archive-get-folder}$B$N%+%9%?%^%$%:JQ?t$K$Ol9g$O(B @code{wl-expire-archive-folder-num-regexp} $B$b9g$o$;$k$h$&$K$7$F$/$@$5$$!#(B @item wl-expire-archive-date-folder-name-fmt @vindex wl-expire-archive-date-folder-name-fmt $B=i4|@_Dj$O(B @samp{%s-%%04d%%02d;%s}$B!#(B@code{wl-expire-archive-date} $B$G;HMQ(B $B$5$l$k%"!<%+%$%V$N%U%)%k%@$N(B @code{format} $B7A<0$NJ8;zNs$r;XDj$7$^$9!#$J(B $B$*!"(B2$BEY(B @code{format} $B$G;XDj$9$k$?$a!"HV9f$NItJ,$OI,$:(B @samp{%%d} $B$K$7$J(B $B$/$F$O$J$j$^$;$s!#$^$?!"%a%C%;!<%8$NG/$H7n$rM?$($k$?$a!"(B@samp{%%d} $B$O(B2$B$D(B $BI,MW$G$9!#(B $B$b$7!"JQ99$9$k>l9g$O(B @code{wl-expire-archive-date-folder-num-regexp} $B$b9g$o$;$k$h$&$K$7$F$/$@$5$$!#(B @item wl-expire-archive-folder-type @vindex wl-expire-archive-folder-type $B=i4|@_Dj$O(B @code{zip}$B!#(B $B%"!<%+%$%V%U%)%k%@$N%"!<%+%$%P%?%$%W$r;XDj$7$^$9!#(B @item wl-expire-archive-folder-prefix @vindex wl-expire-archive-folder-prefix $B=i4|@_Dj$O(B @code{nil}$B!#(B $B%"!<%+%$%V%U%)%k%@$KIU$1$k(B prefix $B$r;XDj$7$^$9!#(B $B$?$@$7!"%"!<%+%$%V%U%)%k%@$K(B prefix ($B%G%#%l%/%H%j9=B$(B)$B$rIU$1$k;EMM$O(B $B$*$^$15!G=$G$9$N$G!"l9g!$%"!<%+%$%V%U%!%$%k$r2u$962$l$,$"$j$^$9!#(B @table @code @item nil prefix $B$OIU$-$^$;$s!#(B @item short $BNc$($P!"(B@samp{+ml/wl} $B$G$O(B prefix @samp{wl} $B$,IU$-!"(B @samp{$ml/wl-00000;zip;wl} $B$H$J$j$^$9!#(B @item t $BNc$($P!"(B@samp{+ml/wl} $B$G$O(B prefix @samp{ml/wl} $B$,IU$-!"(B @samp{$ml/wl-00000;zip;ml/wl} $B$H$J$j$^$9!#(B @end table @item wl-expire-archive-folder-num-regexp @vindex wl-expire-archive-folder-num-regexp $B=i4|@_Dj$O(B @samp{-\\([-0-9]+\\);}$B!#(B @code{elmo-list-folders} $B$K$h$kJ#?t$N%"!<%+%$%V%U%)%k%@L>$+$i(B $BHV9f$r$+$i(B $BHV9f$rl9g!"4{$KB8:_$7$F$$$k%"!<%+%$%V%U%)%k%@$N:GBg%a%C%;!<%8HV9f$h$j$b(B $B8E$$%a%C%;!<%8$,$"$C$?>l9g$K3NG'$7$F$+$i:o=|$7$^$9!#(B @code{nil} $B$N>l9g$O3NG'$;$:$K:o=|$7$^$9!#(B $B$J$*!"I8=`4X?t$N0z?t$K(B non-nil $B$r;XDj$7$FHV9f$rJ];}$9$k$h$&$K$7$?>l9g$N(B $B$_M-8z$G$9!#(B @item wl-expire-use-log @vindex wl-expire-use-log $B=i4|@_Dj$O(B @code{nil}$B!#(B Non-nil $B$K$9$k$H!"(B@file{~/.elmo/expired-log}$B$K(B expire $B$NC$9I,MW$,$"$j$^$9!#(B @item wl-expire-add-seen-list @vindex wl-expire-add-seen-list $B=i4|@_Dj$O(B @code{t}$B!#(B Non-nil $B$N>l9g!"(Bexpire $B$K$h$j%a%C%;!<%8$r%j%U%!%$%k$7$?>l9g!"4{FI>pJs$r(B $B%j%U%!%$%k@h$N%U%)%k%@$KEA$($k$h$&$K$7$^$9!#(B $B$?$@$7!"%j%U%!%$%k@h$N%U%)%k%@$r(B Wanderlust $B>e$+$iFI$^$J$$$H!"(B @file{~/.elmo/}$B0J2<$K$"$k(B @file{seen} $B%U%!%$%k$,Bg$-$/$J$C$F$$$/$N$G!"(B $B%"!<%+%$%V%U%)%k%@$J$I$KC1$KJ]B8$7$F$*$/$@$1$J$i(B @code{nil} $B$K@_Dj$7$F$*$/$HNI$$$G$7$g$&!#(B@code{nil} $B$K@_Dj$7$F$b!"(B $B%j%U%!%$%k$7$?%"!<%+%$%V%U%)%k%@$rFI$`$H$-$K?75,%a%C%;!<%807$$$5$l$k$@$1$G!"(B expire $B$J$I$NF0:n$K$O1F6A$O$"$j$^$;$s!#(B @item wl-expire-folder-update-msgdb @vindex wl-expire-folder-update-msgdb $B=i4|@_Dj$O(B @code{t}$B!#(B @code{t} $B$N>l9g!"%U%)%k%@%b!<%I$G(B expire $B$rpJs$r(B update $B$7$F$+$i(B expire $B$r$N@55,I=8=$N%j%9%H$r;XDj$7$?>l9g$O!"%^%C%A$7$?%U%)%k%@$N(B $B$_%5%^%j>pJs$r(B update $B$9$k!#(B @end table @node Archive, , Expire, Expire and Archive @section $B%a%C%;!<%8$N%"!<%+%$%V(B @subsection $B%a%C%;!<%8$N%"!<%+%$%V(B @kbd{M-x wl-summary-archive} $B$G%U%)%k%@A4BN$r%"!<%+%$%V%U%)%k%@$K%3%T!<$7$^(B $B$9!#4{$K%"!<%+%$%V%U%)%k%@$,$"$k>l9g!"?75,%a%C%;!<%8$N$_DI2C$7$^$9!#(B @code{wl-expire-alist} $B$HF1$8MM$K!"%U%)%k%@L>$K1~$8$F$I$N$h$&$K%"!<%+%$%V(B $B$9$k$+$r(B @code{wl-archive-alist} $B$G;XDj$7$^$9!#Nc$($P0J2<$N$h$&$K$J$j$^(B $B$9!#(B @lisp @group (setq wl-archive-alist '(("^\\+tmp$" wl-archive-date) ("^\\+outbox$" wl-archive-number2) (".*" wl-archive-number1))) @end group @end lisp $B3F%j%9%H$NMWAG$OA0$+$i$*2r$j$NDL$j!"l9g(B $B$O!"$3$l$i$N4X?t$r;HMQ$9$k$H$h$$$G$7$g$&!#(B $B$^$?!"(Bexpire $B$r9T$&A0$N%P%C%/%"%C%W$dF0:n$r3NG'$9$k$N$K$bM-8z$G$9!#(B $B$b$C$H$b!"%"!<%+%$%V8e$K(B expire $B$G%j%U%!%$%k$9$k$H!"%j%U%!%$%k$;$:$K:o=|(B $B$9$k$@$1$K$J$j$^$9!#(B $B%G%U%)%k%H$G$O%3%T!<@h$N%"!<%+%$%V%U%)%k%@$O(B @code{wl-expire-archive-get-folder-function} $B$K=>$C$F<+F0E*$K7hDj$5$l$^$9$,!"(B prefix argument $B$rIU$1$F(B @kbd{C-u M-x wl-summary-archive} $B$G!"%U%)%k%@Fb$K$"$k%a%C%;!<%8$N%j%9%H!"%5%^%j$N(B msgdb $B>pJs!"$N(B3$B$D(B $B$N0z?t$,EO$5$l$^$9!#$b$A$m$s%f!<%6$,FH<+$K:n$C$F;XDj$9$k$3$H$,$G$-$^$9!#(B @end table @node Scoring, Address Book, Expire and Archive, Top @chapter $B%9%3%"(B @cindex Scoring @c @cindex Kill File $B%9%3%"$H$O!"%a%C%;!<%8$K%9%3%"(B($BCM(B)$B$r$D$1!"(B $B$=$NCM$K$h$j4{FI%^!<%/$rIU$1$?$j%5%^%j$+$i>C$7$?$j$9$k5!G=$G$9!#(B $B$3$N5!G=$K$h$C$F=EMW$J%a%C%;!<%8$K$^$H$a=hM}MQ%^!<%/(B @samp{*} $B$d=EMW%^!<(B $B%/(B@samp{$}$B$r$D$1$?$j!"(Bspam $B5-;v$J$I$NFI$_$?$/$J$$%a%C%;!<%8$K4{FI%^!<%/(B $B$r$D$1$?$j$9$k$3$H$,$G$-$^$9!#(B $B$3$N%9%3%"5!G=$O(B Gnus $B$N%9%3%"$H$[$\F1Ey$N5!G=$r;}$A!"$^$?%9%3%"%U%!%$%k$N(B $B=q<0$b$[$\F1$8$G$9!#$?$@$7!"4v$D$+$OL$BP1~$G$"$C$?$j(B Wanderlust $BFCM-$N5!G=(B $B$,$"$C$?$j$7$^$9!#(B @xref{Scoring, , ,gnus-ja, The gnus Newsreader}. @menu * Score Commands:: $B%9%3%"$K4X$9$k%3%^%s%I(B * Score File Format:: $B%9%3%"%U%!%$%k$N=q<0(B @end menu @node Score Commands, Score File Format, Scoring, Scoring @section $B%9%3%"$K4X$9$k%3%^%s%I(B @cindex Score Commands @subsection $B%9%3%"%U%!%$%k$N;XDjJ}K!(B $BJQ?t(B @code{wl-score-folder-alist} $B$K%U%)%k%@L>$KBP1~$7$?%9%3%"%U%!%$%kL>$+%9%3%"$rDj5A$7$?JQ?t$r@_Dj$7$^$9!#(B @lisp @group (setq wl-score-folder-alist '(("^-.*" "news.SCORE" "my.SCORE") (".*" "all.SCORE"))) @end group @end lisp $B%9%3%"%U%!%$%kL>$N%Q%9$r>JN,$7$?>l9g$O!"(B $BJQ?t(B @code{wl-score-files-directory} $B$G;XDj$7$?%G%#%l%/%H%j$K$"$k$b$N$H$7$^$9!#(B $B$^$?!"(B@code{wl-score-folder-alist} $B$N@_Dj$K4X$o$i$:(B $B%G%U%)%k%H$N%9%3%"%U%!%$%k(B @code{wl-score-default-file} (@file{all.SCORE}) $B$OI,$:FI$_9~$^$l$^$9(B($B%U%!%$%k$,B8:_$7$F$$$J$/$F$b9=$$$^$;$s(B)$B!#(B $B$7$?$,$C$F!">e5-Nc$N(B @samp{^-.*} $B$K%^%C%A$7$?%U%)%k%@$G$O(B @file{news.SCORE}, @file{my.SCORE}, @file{all.SCORE} $B$N(B3$B$D$N%9%3%"%U%!%$%k(B $B$,FI$_9~$^$l$k$3$H$K$J$j$^$9!#(B @subsection $B%9%3%"%U%!%$%k$NBP>]%a%C%;!<%8(B $B%9%3%"$O%5%^%j$N(B update $B;~$K0l;~E*$K(B @code{wl-summary-score-marks} $B$G;XDj$7$?%a%C%;!<%8$N$_$K$D$1$i$l$^$9!#(B $B$D$^$j%5%^%j$+$iH4$1$k$H%a%C%;!<%8$K$D$1$i$l$?%9%3%"$O>C5n$5$l!"(B $B%G%U%)%k%H$N%9%3%"CM$KLa$j$^$9!#(B @subsection $B%9%3%"%U%!%$%k$N:n@.(B $B$^$:%5%^%j%P%C%U%!$GE,Ev$J%a%C%;!<%8$K0\F0$7$F$+$i(B @kbd{L} $B$r%?%$%W$7$^(B $B$9!#$=$N8e%_%K%P%C%U%!$G$NF~NO$r5a$a$i$l$^$9$N$G!"B3$1$F(B @kbd{s}, @kbd{s}, @kbd{p} $B$H%?%$%W$7$F$_$F$/$@$5$$!#$9$k$H(B Subject $B$NJ8;zNs$,F~NO(B $B$5$l$F$$$k>uBV$K$J$j$^$9$N$G!"E,Ev$KJT=8$7$?8e(B @kbd{@key{RET}} $B$r2!$7$^$9!#(B $B$3$l$G!"F~NO$7$?J8;zNs$HF1$8(B @samp{Subject:} $B$r;}$D%a%C%;!<%8$KBP$7$F%9%3%"(B @minus{}1000 $B$,$D$1$i$l$k$h$&$K$J$j$^$9!#(B $B$D$^$j!"$3$N$h$&$J%9%3%"%U%!%$%k$,<+F0E*$K:n@.$5$l$?$3$H$K$J$j$^$9!#(B $BC5n$7$F$+$i(B @kbd{C-c C-c} $B$9$k$HJT=8Cf$N%9%3%"%U%!%$%k$r:o=|$7$^$9!#(B @subsection TIPS @subsubsection $B%9%3%"%U%!%$%k$NA*Br(B @code{wl-summary-increase-score} $B$H(B @code{wl-summary-lower-score} $B$H$GDI(B $B2C$9$k%9%3%"%U%!%$%k$O(B @code{wl-score-change-score-file} $B$GJQ99$9$k$3$H(B $B$,$G$-$^$9!#(B @subsubsection $B%9%3%"$N2C;;(B @code{wl-summary-increase-score} $B$d(B @code{wl-summary-lower-score}$B!"(B @code{wl-score-edit-insert-entry} $B$GF1$8%(%s%H%j$rDI2C$7$?>l9g!"(B $B%9%3%"$,2C;;$5$l$^$9!#(B $B$?$H$($P!"(B@kbd{L a} $B$G%9%3%"$,(B @minus{}1000 $B$N(B @samp{from} $B%(%s%H%j$r:n@.$7$?8e!"(B $B:FEY(B @kbd{C-u 200 L a} $B$G%9%3%"$,(B @minus{}200 $B$N(B @samp{from} $B%(%s%H%j$r:n@.$9$k$H!"(B $B%9%3%"$,(B @minus{}1200 $B$N%(%s%H%j$,(B1$B$D:n@.$5$l$k$3$H$K$J$j$^$9!#(B @subsubsection Thread $B%-!<$N:n@.(B @code{wl-summary-increase-score} $B$+(B @code{wl-summary-lower-score} $B$G(B @samp{Thread}$B%-!<$r:n@.$9$k$H!";R%9%l%C%I$N(B @samp{Message-ID} $B$bA4$F(B $BDI2C$5$l$^$9!#(B @subsubsection Followup $B%-!<$N:n@.(B @code{wl-summary-increase-score} $B$+(B @code{wl-summary-lower-score} $B$G(B @samp{Followup}$B%-!<$r:n@.$9$k$H!"%+!<%=%k>e$N%a%C%;!<%8$N(B @samp{Message-ID} $B$b(B @samp{References} $B%-!<$KDI2C$5$l$^$9!#(B $B$b$7!"(B@code{wl-score-auto-make-followup-entry} $B$,(B non-nil $B$G$"$l$P(B @code{wl-score-expiry-days} $B$G;XDj$7$?F|$K$A0JFb$NA4(B followup $BBP>]$N%a%C%;!<(B $B%8$N(B @samp{Message-ID} $B$,DI2C$5$l$^$9!#(B @subsection $B%-!<%P%$%s%I(B @table @kbd @item K @kindex K (Summary) @findex wl-summary-increase-score $B8=:_$N%a%C%;!<%8$N%9%3%"$r9b$/$7$^$9!#(B $BF1;~$K%9%3%"%(%s%H%j$,%9%3%"%U%!%$%k$KDI2C$5$l$^$9!#(B $B$^$?!"(Bprefix argument $B$G%9%3%"$NCM$r@_Dj$9$k$3$H$,$G$-$^$9!#(B @item L @kindex L (Summary) @findex wl-summary-lower-score $B8=:_$N%a%C%;!<%8$N%9%3%"$rDc$/$7$^$9!#(B $BF1;~$K%9%3%"%(%s%H%j$,%9%3%"%U%!%$%k$KDI2C$5$l$^$9!#(B $B$^$?!"(Bprefix argument $B$G%9%3%"$NCM$r@_Dj$9$k$3$H$,$G$-$^$9!#(B @item h R @kindex h R (Summary) @findex wl-summary-rescore $B%9%3%"$rE,MQ$7D>$7$^$9!#(B $B$?$@$7!"4{$K%9%3%"$,$D$1$i$l$F$$$k%a%C%;!<%8$K$O!"?7$?$K%9%3%"$O$D$-$^$;$s!#(B @item h c @kindex h c (Summary) @findex wl-score-change-score-file $B8=:_A*Br$7$F$$$k%9%3%"%U%!%$%k$rJQ99$7$^$9!#(B @item h e @kindex h e (Summary) @findex wl-score-edit-current-scores $B8=:_A*Br$7$F$$$k%9%3%"%U%!%$%k$rJT=8$7$^$9!#(B $B%9%3%"%U%!%$%k$,J#?t$"$k>l9g@h$K;XDj$5$l$?%U%!%$%k$,A*Br$5$l$^$9!#(B @item h f @kindex h f (Summary) @findex wl-score-edit-file $BG$0U$N%9%3%"%U%!%$%k$rJT=8$7!"$3$N%9%3%"%U%!%$%k$rA*Br$7$^$9!#(B @item h F @kindex h F (Summary) @findex wl-score-flush-cache $BFI$_9~$s$@%9%3%"%U%!%$%k$O0lC6%-%c%C%7%e$5$l$^$9$,!"$=$N%-%c%C%7%e$r>C5n$7$^$9!#(B Wanderlust $B0J30$GD>@\%9%3%"%U%!%$%k$rJQ99$7$?>l9g$O!"(B $B%-%c%C%7%e$r>C5n$7$F:FFI$_9~$_$9$kI,MW$,$"$j$^$9!#(B @item h m @kindex h m (Summary) @findex wl-score-set-mark-below $B4{FI%^!<%/$rIU$1$k(B($BFI$s$@$3$H$K$9$k(B)$B%9%3%"4p=`CM$r@_Dj$7$^$9!#(B $B$3$NCM$h$j$b>.$5$J%9%3%"$,4{FI$K$J$j$^$9!#(B @item h x @kindex h x (Summary) @findex wl-score-set-expunge-below $B%5%^%j$+$i>C5n$9$k%9%3%"4p=`CM$r@_Dj$7$^$9!#(B $B$3$NCM$h$j$b>.$5$J%9%3%"$,>C5n$5$l$^$9!#(B $B>C5n$H$$$C$F$bI=<($5$l$J$$$@$1$G$"$j!"%5%^%j>pJs$d%U%)%k%@$+$i$O:o=|$5$l$^(B $B$;$s!#(B $B>C5n$5$l$?%a%C%;!<%8$O(B rescan-noscore $B$K$h$j:F$SI=<($9$k$3$H$,$G$-$^$9!#(B @end table @subsection $B%9%3%"JT=8%P%C%U%!$N%-!<%P%$%s%I(B @table @kbd @item C-c C-k @kindex C-c C-k (Score Mode) @findex wl-score-edit-kill $BJT=8Cf$N%U%!%$%k$rGK4~$7$^$9!#(B @item C-c C-c @kindex C-c C-c (Score Mode) @findex wl-score-edit-exit $BJT=8Cf$N%U%!%$%k$rJ]B8$7$F!"JT=8%b!<%I$r=*N;$7$^$9!#(B @item C-c C-p @kindex C-c C-p (Score Mode) @findex wl-score-pretty-print $B%9%3%"$re:No$KI=<($7D>$7$^$9!#(B @item C-c C-d @kindex C-c C-d (Score Mode) @findex wl-score-edit-insert-date $B5*85A0(B1$BG/(B12$B7n(B31$BF|$+$i$NF|?t$rA^F~$7$^$9!#(B $B4|8BIU$-$N%9%3%"$r:n$k$H$-$K4|8B$NMWAG(B(3$BHVL\(B)$B$K;HMQ$7$^$9!#(B @item C-c C-s @kindex C-c C-s (Score Mode) @findex wl-score-edit-insert-header $B%5%^%j%P%C%U%!$GA*Br$7$F$$$k%a%C%;!<%8$N%X%C%@$rA^F~$7$^$9!#(B @item C-c C-e @kindex C-c C-e (Score Mode) @findex wl-score-edit-insert-entry $B%5%^%j%P%C%U%!$GA*Br$7$F$$$k%a%C%;!<%8$N%9%3%"%(%s%H%j$rDI2C$7$^$9!#(B @end table @subsection $B%+%9%?%^%$%:JQ?t(B @table @code @item wl-summary-default-score @vindex wl-summary-default-score $B=i4|@_Dj$O(B 0$B!#(B $B%9%3%"$N%G%U%)%k%HCM$r@_Dj$7$^$9!#$3$NCM$r85$K%9%3%"$,2C8:$5$l$^$9!#(B @item wl-summary-important-above @vindex wl-summary-important-above $B=i4|@_Dj$O(B @code{nil}$B!#(B $B$3$NCM$h$jBg$-$$%9%3%"$KBP$7$F=EMW%^!<%/(B(@samp{$}) $B$r$D$1$^$9!#(B @code{nil} $B$N>l9g$O%^!<%/$rIU$1$^$;$s!#(B @item wl-summary-target-above @vindex wl-summary-target-above $B=i4|@_Dj$O(B @code{nil}$B!#(B $B$3$NCM$h$jBg$-$$%9%3%"$KBP$7$F$^$H$a=hM}MQ%^!<%/(B(@samp{*}) $B$r$D$1$^$9!#(B @code{nil} $B$N>l9g$O%^!<%/$rIU$1$^$;$s!#(B @item wl-summary-mark-below @vindex wl-summary-mark-below $B=i4|@_Dj$O(B 0$B!#(B $B$3$NCM$h$j>.$5$J%9%3%"$KBP$7$F4{FI%^!<%/$r$D$1$^$9(B($BFI$s$@$3$H$K$7$^$9(B)$B!#(B @item wl-summary-expunge-below @vindex wl-summary-expunge-below $B=i4|@_Dj$O(B @code{nil}$B!#(B $B$3$NCM$h$j>.$5$J%9%3%"$O%5%^%j$+$i>C5n$7$^$9!#(B @code{nil} $B$N>l9g$O>C5n$7$^$;$s!#(B @item wl-summary-score-marks @vindex wl-summary-score-marks $B=i4|@_Dj$O0J2<$N%j%9%H(B @lisp @group (list wl-summary-new-uncached-mark wl-summary-new-cached-mark) @end group @end lisp @noindent $B%9%3%"$r$D$1$k%a%C%;!<%8$N%^!<%/$r;XDj$7$^$9!#(B @item wl-use-scoring @vindex wl-use-scoring $B=i4|@_Dj$O(B @code{t}$B!#(B Non-nil $B$J$i%9%3%"5!G=$rM-8z$K$7$^$9!#(B @item wl-score-files-directory @vindex wl-score-files-directory $B=i4|@_Dj$O(B @file{~/.elmo/}$B!#(B $B%9%3%"%U%!%$%k$r%G%U%)%k%H$N%G%#%l%/%H%j$r;XDj$7$^$9!#(B @item wl-score-interactive-default-score @vindex wl-score-interactive-default-score $B=i4|@_Dj$O(B 1000$B!#(B $B%9%3%"%U%!%$%k$G%9%3%"MWAG$,(B @code{nil} $B$N;~$KMQ$$$k%9%3%"$r;XDj$7$^$9!#(B $B$^$?!"(B@code{wl-summary-increase-score} $B$d(B @code{wl-summary-lower-score} $B$G$D$1$k%9%3%"CM$G$bMQ$$$i$l$^$9!#$?$@$7!"(B @code{wl-score-header-default-entry} $B$N%9%3%"CM$,(B @code{nil} $B$N;~!#(B @item wl-score-expiry-days @vindex wl-score-expiry-days $B=i4|@_Dj$O(B 7$B!#(B $B4|8BIU$-%9%3%"$r:o=|$9$kF|?t$r;XDj$7$^$9!#(B @item wl-score-update-entry-dates @vindex wl-score-update-entry-dates $B=i4|@_Dj$O(B @code{t}$B!#(B Non-nil $B$J$i4|8BIU$-%9%3%"$r:o=|$9$k5!G=$rM-8z$K$7$^$9!#(B @item wl-score-header-default-entry @vindex wl-score-header-default-entry @code{wl-summary-increase-score} $B$d(B @code{wl-summary-lower-score}$B!"(B @code{wl-score-edit-insert-entry} $B$G%9%3%"%(%s%H%j$r:n@.$9$k>l9g$N(B $B3F%X%C%@$N%G%U%)%k%HCM$r@_Dj$7$^$9!#(B @item wl-score-simplify-fuzzy-regexp @vindex wl-score-simplify-fuzzy-regexp $B%9%3%"%(%s%H%j$N7?$G(B @code{fuzzy} $B$r;XDj$7$?>l9g!"(B $BJ8;zNs$+$i:o=|$9$k@55,I=8=$r;XDj$7$^$9!#(B @code{Subject} $B$G;HMQ$5$l$k$3$H$,B?$$$N$G!"%G%U%)%k%H$G$O(B $B%a!<%j%s%0%j%9%H%W%m%0%i%`$G$D$1$i$l$k(B prefix $B$r;XDj$7$F$$$^$9!#(B @item wl-summary-rescore-partial-threshold @vindex wl-summary-rescore-partial-threshold $B=i4|@_Dj$O(B 200$B!#(B sync-all $B$d(B rescan $B$,l9g!"%5%^%j$N:G8e$+$i;XDj$5$l$??t$N%a%C%;!<%8$@$1!"(B $BItJ,E*$K%9%3%"IU$1$,E,MQ$5$l$^$9!#(B @item wl-summary-auto-sync-marks @vindex wl-summary-auto-sync-marks Non-nil $B$J$i$P!"%5%^%jF14|;~$KL$FI(B/$B=EMW%^!<%/$bF14|$7$^$9!#(B $BL$FI%^!<%/$O!"(BIMAP4 $B%5!<%P>e$NL$FI>pJs$,H?1G$5$l$^$9!#(B $B=EMW%^!<%/$O(B IMAP4 $B%5!<%P>e$N=EMW>pJs(B(Flagged $B%U%i%0$,$D$$$F$$$k$+(B)$B!"(B $B$*$h$S(B @samp{'flag} $B%U%)%k%@$NFbMF$,!"H?1G$5$l$^$9!#(B $B=i4|@_Dj$O(B @code{t}$B!#(B @end table @node Score File Format, , Score Commands, Scoring @section $B%9%3%"%U%!%$%k=q<0(B @cindex Score File Format $B%9%3%"%U%!%$%k$N=q<0$O(B Gnus $B$HF1$8$J$N$G!"(BGnus $B$G;HMQ$7$F$$$?(B $B%9%3%"%U%!%$%k$,$=$N$^$^MxMQ$G$-$^$9!#(B $B$?$@$7!"4v$D$+$N%-!<$OBP1~$7$F$$$J$+$C$?$j(B Wanderlust $BFCM-$N%-!<$,$"$C$?$j(B $B$7$^$9$N$G!"40A4$K8_49@-$,$"$k$o$1$G$O$"$j$^$;$s!#(B @xref{Score File Format, , ,gnus-ja, The gnus Newsreader}. @lisp @group (("subject" ("for sale" -1000 nil s) ("$BLY$1(B" -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 $BJ8;zNs(B (STRING) $B%-!<$,J8;zNs$G$"$k>l9g!"%^%C%A$5$;$k%X%C%@$NL>A0$r;XDj$7$^$9!#(B $B$3$N%-!<$K$OA0$N%U%#!<%k%I$,BP>]$H$J$j$^$9!#(B $B$3$N%-!<$N8e$K%9%3%"%(%s%H%j$rG$0U$N?t$@$1;XDj$7!"(B $B$3$N3F%9%3%"%(%s%H%j$Ol9g$O?t;z$G!"$=(B $B$l0J30$OJ8;zNs$r;XDj$7$^$9!#(B @item $B%9%3%"MWAG!##1HVL\$NMWAG$,%^%C%A$7$?>l9g!"$=$N%a%C%;!<%8$N%9%3%"$r$3$NCMJ,(B $BA}8:$5$;$^$9!#(B @item $B4|8B$NMWAG!#(B@code{nil} $B$J$i1JB3(B(permanent)$B;XDj$G!"(B $B?t;z(B($BF|?t(B)$B$J$i0lDj4|4V(B(@code{wl-score-expiry-days})$B%^%C%A$7$J$$$H:o=|$5$l$^$9!#(B $B$3$NF|?t$O5*85A0(B1$BG/(B12$B7n(B31$BF|$+$i7P2a$7$?F|$K$A$G$9!#(B @item $B7?$NMWAG!##1HVL\$NMWAG$r%^%C%A$5$;$kJ}K!$r;XDj$7$^$9!#(B $B%-!<$K$h$C$F;XDj$G$-$k7?$,0[$J$j$^$9!#(B @table @dfn @item From, Subject, References, Message-Id $B$3$l$i$NJ8;zNs$N%-!<$KBP$7$F$O!"(B@code{r} $B$H(B @code{R} ($B@55,I=8=(B) (regexp) $B$d!"(B@code{s} $B$H(B @code{S} ($BJ8;zNs$N0lIt(B) (substring)$B!"(B@code{e} $B$H(B @code{E} ($B@53N$J9gCW(B) (exact match)$B!"$=$l$K(B @code{f} $B$H(B @code{F} ($B$"$$$^$$(B) (fuzzy) $B$,;XDj$G$-$^$9!#(B @code{R}, @code{S}, @code{E}, @code{F} $B$OBgJ8;z>.J8;z$r6hJL$7$F%^%C%A$5$;$^$9!#(B @item Lines, Chars $B$3$l$i$O?t;z$NBg>.$r;XDj$7$^$9!#$=$N5-9f$O}, @code{=}, @code{>=}, @code{<=} @item Followup $B$3$N%-!<$O!"(B@code{From}$B%X%C%@$K%^%C%A$7!"(B $B$=$N%a%C%;!<%8$X$NA4$F$N%U%)%m!<%"%C%W$KBP$7$F%9%3%"$r$D$1$^$9!#(B $B$?$H$($P!"<+J,<+?H$N5-;v$X$N%U%)%m!<%"%C%W$N%9%3%"$rA}$d$7$?$j$9$k$N$KJXMx$G$9!#(B @code{f} $B$r=|$$$F(B @code{From} $B%-!<$HF1$87?$,;XDj=PMh$^$9!#(B $B$^$?!"<+F0E*$K%9%3%"%U%!%$%k$K(B @samp{Followup} $B%(%s%H%j$,DI2C$5$l$^$9!#(B @item Thread $B$3$N%-!<$O!"(B@code{Message-ID} @var{x} $B$G;O$^$C$F$$$k(B($B%5%V(B)$B%9%l%C%I$K%9%3%"$rIU$1$k>l9g$K;XDj$7$^$9!#(B $B$3$l$O(B @code{References} $B%X%C%@$K(B @var{x} $B$r;}$D$=$l$>$l$N5-;v$K?7$7$$(B @samp{Thread} $B%(%s%H%j$r<+F0E*$KDI2C$7$^$9!#(B $B$3$l$K$h$j!"A4$F$NAD@h$N(B @code{Message-ID} $B$r(B @code{References} $B$K4^$s$G$$$J$$>l9g$G$b!"(B $B3Nl9g$N$_0UL#$r;}$A$^$9!#(B @code{Subject} $B$d(B @code{From} $B$J$I$NI8=`0J30$N%X%C%@$K%^%C%A$5$;$?$$>l9g$K(B $B$=$N%X%C%@$r;XDj$7$^$9!#(B $B$?$@$7!";XDj$7$?%X%C%@$O(B @code{elmo-msgdb-extra-fields} $B$K$b@_Dj$9$kI,MW$,$"$j$^$9!#(B $B$7$?$,$C$F!"3HD%%X%C%@$,.$5$$%9%3%"$N%a%C%;!<%8$K$O4{FI%^!<%/$r$D$1$^$9!#(B $B%G%U%)%k%HCM$O(B @code{wl-summary-mark-below} $B$G;XDj$5$l$^$9!#(B @item expunge $B$3$NCM$h$j>.$5$$%9%3%"$N%a%C%;!<%8$O%5%^%j$+$i>C5n$7$^$9!#(B $B%G%U%)%k%HCM$O(B @code{wl-summary-expunge-below} $B$G;XDj$5$l$^$9!#(B @item mark-and-expunge @code{mark} $B$H(B @code{expunge} $B$rF1;~$K;XDj$7$^$9!#(B $B$D$^$j!"$3$NCM$h$j>.$5$$%9%3%"$N%a%C%;!<%8$O4{FI%^!<%/$r$D$1!"%5%^%j$+$i>C5n$7$^$9!#(B @item target $B$3$NCM$h$jBg$-$$%9%3%"$N%a%C%;!<%8$K$O$^$H$a=hM}MQ%^!<%/(B @samp{*} $B$r$D$1$^$9!#(B $B%G%U%)%k%HCM$O(B @code{wl-summary-target-above} $B$G;XDj$5$l$^$9!#(B @item important $B$3$NCM$h$jBg$-$$%9%3%"$N%a%C%;!<%8$K$O=EMW%^!<%/(B @samp{$} $B$r$D$1$^$9!#(B $B%G%U%)%k%HCM$O(B @code{wl-summary-important-above} $B$G;XDj$5$l$^$9!#(B @end table @subsection $BCm0U;v9`(B @code{extra} $B%-!<$O$b$A$m$s!"(B@code{lines} $B$H(B @code{xref} $B%-!<$r;HMQ$9$k(B $B>l9g$G$b!"(B@code{elmo-msgdb-extra-fields} $B$r@_Dj$9$kI,MW$,$"$j$^$9!#(B @lisp (setq elmo-msgdb-extra-fields '("lines" "xref")) @end lisp $B$=$NB>!"2<5-$N@)8B;v9`$,$"$j$^$9!#(B @itemize @bullet @item $B%5%^%j>pJs$K4^$^$l$k(B@samp{References}$B%U%#!<%k%I$K$O:G8e$N(B @samp{Message-ID}$B$7$+B8:_$7$J$$$?$a!"(B@code{references}$B%-!<$b$=$N(B @samp{Message-ID}$B$K$7$+%^%C%A$7$J$$!#(B @end itemize $B%U%)%k%@H$G$-$k%-!<$N0lMw!#(B @example @group chars lines xref extra localdir,localnews $B!{(B $B"$(B $B"$(B $B"$(B nntp (xover$BBP1~(B) $B!{(B $B"$(B $B"$(B $B!_(B (xover$BHsBP1~(B) $B!_(B $B"$(B $B"$(B $B"$(B imap4 $B!{(B $B"$(B $B"$(B $B"$(B pop3 $B!_(B $B"$(B $B"$(B $B"$(B $B!{(B: $B;2>H$G$-$k(B $B!_(B: $B;2>H$G$-$J$$(B($BL5;k$5$l$k(B) $B"$(B: @code{elmo-msgdb-extra-fields} $B$r@_Dj$9$l$P;2>H$G$-$k(B @end group @end example @node Address Book, Quick Search, Scoring, Top @chapter $B%"%I%l%9D"(B @cindex Address Book $B%"%I%l%9D"$rMxMQ$9$k$3$H$G!"%a!<%k%"%I%l%9$r4JC1$KF~NO$7$?$j!$(B $B%5%^%j$NI=<($K%Z%C%H%M!<%`$rMQ$$$k$3$H$,=PMh$^$9!#(B @menu * Mail Addresses:: $B%"%I%l%9D"$NDj5A(B * Address Manager:: $B%"%I%l%9%^%M!<%8%c(B @end menu @node Mail Addresses, Address Manager, Address Book, Address Book @section $B%"%I%l%9D"$NDj5A(B @cindex Address book Definition @cindex .addresses @cindex Alias, Address $B%"%I%l%9%U%!%$%k(B @file{~/.addresses} $B$r:n@.$7!"<+J,MQ$KJT=8$7$^$9!#(B @file{~/.addresses} $B$K=q$+$l$?%G!<%?$O!"%I%i%U%H:n@.;~$N%"%I%l%9Jd40%G!<(B $B%?$H$7$FMxMQ$5$l$k$[$+!"%5%^%jI=<($G$NL>A0I=<(Ey$K$bMQ$$$i$l$^$9!#$J$*!"(B $B5/F0$7$?>uBV$G%5%^%j%P%C%U%!$+$i(B @file{~/.addresses} $B$K%"%I%l%9$rDI2C(B/ $BJQ99(B/$B:o=|$9$k$3$H$b2DG=$G$9!#(B $B=q$-J}$O$H$F$bC1=c$G$9!#$3$s$J46$8$G$9!#(B @example @group # # @r{@samp{#} $B$G;O$^$k9T$O%3%a%s%H!#(B} # @r{$B6u9T$OL5;k!#(B} # # @var{$B%a!<%k%"%I%l%9(B} "@var{$B$"$@L>(B}" "@var{$BK\L>(B}" # teranisi@@gohome.org "$B$F$i$K$7(B" "$B;{@>M50l(B" foo@@bar.gohome.org "Foo $B$5$s(B" "John Foo" bar@@foo.gohome.org "Bar $B$5$s(B" "Michael Bar" @end group @end example @noindent $B0l9T$,0l?MJ,$NDj5A$G$9!#(B $B(B}$B!"%I%i%U%H:n@.;~$N%"(B $B%I%l%9>pJs$H$7$F(B@var{$BK\L>(B}$B$,;H$o$l$^$9!#;n$7$F$_$F!"3NG'$7$F$+$i$NJ}$,(B $B$o$+$j$d$9$$$H;W$o$l$^$9!#$A$g$C$H=q$$$F;n$7$F$_$F$+$i!"$^$?%"%I%l%9D"$N(B $BDj5A$r$d$jD>$9$N$,NI$$$G$7$g$&!#(B $B$^$?!"JQ?t(B @code{wl-alias-file} $B$K(B MH $B$N(B alias file $B$,;XDj$5$l$F$$$l$P!"(B $B%I%i%U%H:n@.;~$N%"%I%l%9>pJs$H$7$F;H$o$l$^$9!#(B $B$5$i$K!"JQ?t(B @code{wl-use-ldap} ($B=i4|@_Dj$O(B @code{nil}) $B$r(B non-nil $B$K@_(B $BDj$9$k$H!"(BLDAP $B%5!<%P$N>pJs$r%I%i%U%H:n@.;~$N%"%I%l%9>pJs$H$7$FMxMQ$7$^(B $B$9!#(B LDAP $B$rMxMQ$9$k>l9g$O!"(B@code{wl-ldap-server}$B!"(B@code{wl-ldap-port}, @code{wl-ldap-base} $B$bE,@Z$K@_Dj$7$F2<$5$$!#$^$?!"(BLDAP $BBP1~$N(B XEmacs $B0J(B $B30$G$O!"30It%W%m%0%i%`$H$7$F(B @command{ldapsearch} $B$rMxMQ$7$^$9$N$G!"(B @command{ldapsearch} $B$X$"$i$+$8$a%3%^%s%IC$7$^$9!#(B @item x @kindex x (Address Manager) @findex wl-addrmgr-apply $B08@h%^!<%/$,$D$$$F$$$k>l9g!"$=$l$i$N%"%I%l%9$r%I%i%U%H%P%C%U%!$K(B $BH?1G$7$F%"%I%l%9%^%M!<%8%c$r=*N;$7$^$9!#%I%i%U%H%P%C%U%!$,L5$$>l9g!"(B $B$=$l$i$rH?1G$7$F?75,$K%I%i%U%H%P%C%U%!$r3+$-$^$9!#(B $B08@h%^!<%/$,$D$$$F$$$J$$>l9g$OC1$K%"%I%l%9%^%M!<%8%c$r=*N;$7$^$9!#(B @item q @kindex q (Address Manager) @findex wl-addrmgr-quit $B%"%I%l%9%^%M!<%8%c$r=*N;$7$^$9!#(B @item a @kindex a (Address Manager) @findex wl-addrmgr-add $B%"%I%l%9D"$K?7$7$$9`L\$rDI2C$7$^$9!#(B @item d @kindex d (Address Manager) @findex wl-addrmgr-delete $B%"%I%l%9D"$N9`L\$r:o=|$7$^$9!#(B @item e @kindex e (Address Manager) @findex wl-addrmgr-edit $B%"%I%l%9D"$N9`L\$rJT=8$7$^$9!#(B @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:: Setup * Searching:: Searching @end menu @node Setup @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 Searching @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 $B%U%#%k%?(B @cindex Spam Filter @code{wl-spam} $B$O!"30It(B spam $B%U%#%k%?%W%m%0%i%`$X$N%U%m%s%H%(%s%I$rDs6!(B $B$7$^$9!#(BWanderlust $B>e$G$N%a%C%;!<%8$KBP$9$kA`:n$HO"7H$7$F!"%U%#%k%?%W%m(B $B%0%i%`$X$NEPO?$d!"(Bspam $B$NH=Dj$,$G$-$k$h$&$K$J$j$^$9!#(B @menu * Usage of Spam Filter:: $B;H$$J}(B * Spam Filter Processors:: $BBP1~$7$F$$$k(B Spam Filter @end menu @node Usage of Spam Filter, Spam Filter Processors, Spam Filter, Spam Filter @section $B;H$$J}(B @subsection $B=i4|@_Dj(B @code{wl-spam} $B$r;H$&$K$O!"$^$:(B @file{~/.wl} $B$K0J2<$N$h$&$K@_Dj$7$F2<$5(B $B$$!#(B @lisp @group ;; @r{@samp{bogofilter} $B$r;H$&>l9g!#(B} ;; @r{$B$3$3$G!";H$$$?$$(B spam $B%U%#%k%?$N(B @samp{scheme} $B$r@_Dj$7$F2<$5$$!#(B} ;; @r{@xref{Spam Filter Processors}.} (setq elmo-spam-scheme 'bogofilter) (require 'wl-spam) @end group @end lisp @subsection spam $B%^!<%/(B $B0l;~E*%^!<%/$K(B spam $B%^!<%/(B (@samp{s}) $B$,DI2C$5$l$^$9!#$3$N%^!<%/$NIU$$$?(B $B%a%C%;!<%8$O!"%"%/%7%g%s$No$N0\F0$G%9%-%C%W$5$l$k$h(B $B$&$K$J$j$^$9!#(B spam $B%^!<%/$O!"8e=R$9$k(B spam $B$NH=Dj=hM}$G<+F0E*$KIU$/B>!"(B@kbd{k m} $B$H2!(B $B$7$FG$0U$KIU$1$k$3$H$b=PMh$^$9!#(B @subsection spam $B$NH=Dj(B $B0J2<$NJ}K!$G(B spam $B$NH=Dj$r9T$&$3$H$,=PMh$^$9!#(B @enumerate @item $B<+F0%j%U%!%$%k$Nl9g!"(B@code{wl-refile-rule-alist} $B$G?6$jJ,$1@h$,7h$^$i$J$+$C$?;~(B $B$K(B spam $B$+$I$&$+$rH=Dj$9$k$h$&$K$7$F$$$^$9!#(B @item $BFCDj$N%U%)%k%@$N%5%^%j$K0\F0$7$?;~$KH=Dj$9$k!#(B @code{wl-spam-auto-check-folder-regexp-list} $B$K<+F0H=Dj$r9T$$$?$$%U%)%k(B $B%@L>$N@55,I=8=$N%j%9%H$r@_Dj$7$^$9!#(B @lisp (setq wl-spam-auto-check-folder-regexp-list '("\\+inbox")) @end lisp $B$3$NNc$N>l9g!"%U%)%k%@L>$K(B @samp{+inbox} $B$r4^$`%U%)%k%@$N%5%^%j$K0\F0$7(B $B$?;~$KH=Dj=hM}$,]$N%a%C%;!<%8$,(B spam $B$HH=Dj(B $B$5$l$?;~$K??$H$J$j$^$9!#(B @xref{Split messages}. $B$^$?!"H=Dj7k2L$r85$K3X=,$5$;$k$3$H$b=PMh$^$9!#(B($B$"$kDxEY3X=,$,?J$s$G$+$i!"(B $B$3$N@_Dj$rM-8z$K$9$k$H$h$$$G$7$g$&(B) $B0J2<$KNc$r<($7$^$9!#(B @lisp @group (setq elmo-split-rule '(((spam-p) "+spam") ;; @r{$BH=Dj7k2L$r85$K3X=,$5$;$k>l9g$OBe$o$j$K2<$N>r7o$r;H$&(B} ;((spam-p :register t) "+spam") (t "+inbox")) @end group @end lisp @end enumerate @subsection spam $B$N3X=,(B @code{wl-spam} $B$O!"%a%C%;!<%8$r%j%U%!%$%k$9$k$3$H$G!"<+F0E*$K(B spam $B$r3X(B $B=,$7$^$9!#(B $B$^$:!"(B@code{wl-spam} $B$O(B Wanderlust $B$N4IM}$9$k%U%)%k%@$r$=$3$K4^$^$l$k%a%C(B $B%;!<%8$N6hJ,$K$h$C$F!"0J2<$N(B 4$B$D$NNN0h$KJ,N`$7$^$9!#(B @table @samp @item spam spam $B$HH=Dj$5$l$?%a%C%;!<%8$,$"$k%U%)%k%@!#(B (@code{wl-spam-folder} $B$K@_Dj$5$l$?%U%)%k%@(B) @item good non-spam $B$HH=Dj$5$l$?%a%C%;!<%8$,$"$k%U%)%k%@!#(B @item undecide $BL$H=Dj$N%a%C%;!<%8$,$"$k%U%)%k%@!#(B@samp{+inbox} $BEy!"<+?H$G?6$jJ,$1$F$$$J(B $B$$%a%C%;!<%8$,$"$k%U%)%k%@$,3:Ev$7$^$9!#(B (@code{wl-spam-undecided-folder-regexp-list} $B$G@_Dj(B) @item ignored @code{wl-trash-folder} $B$d(B @code{wl-draft-folder} $BEy!"(Bspam $B$N=hM}$H$O4X78(B $B$N$J$$%U%)%k%@!#(B(@code{wl-spam-ignored-folder-regexp-list} $B$G@_Dj(B) @end table $B%a%C%;!<%8$r%j%U%!%$%k$7$?;~!"$=$N%a%C%;!<%8$NB0$9$kNN0h$,JQ$o$C$?>l9g!"(B $BA08e$NNN0h$K=>$C$F(B @samp{spam} $B$^$?$O!"(B@samp{non-spam} $B$H$7$F3X=,$7$^$9!#(B $B6qBNE*$K$O0J2<$NDL$j$G$9!#(B @table @samp @item undecide -> spam spam $B$H$7$F3X=,!#(B @item good -> spam spam $B$H$7$F$N3X=,$K2C$($F!"(Bnon-spam $B$K9T$J$C$?3X=,$r:o=|$7$^$9!#(B @item undecide -> good non-spam $B$H$7$F3X=,!#(B @item spam -> good non-spam $B$H$7$F$N3X=,$K2C$($F!"(Bspam $B$K9T$J$C$?3X=,$r:o=|$7$^$9!#(B @end table $B>e5-0J30$N%j%U%!%$%k$G$O!"3X=,$O9T$o$l$^$;$s!#(B @subsection $B%-!<%P%$%s%I(B @cindex Keybind, spam filter @table @kbd @item k m @kindex k m (Summary) @findex wl-summary-spam $B%+!<%=%k9T$N%a%C%;!<%8$K(B spam $B%^!<%/(B(@samp{s})$B$rIU$1$^$9!#(B @item k c @kindex k c (Summary) @findex wl-summary-test-spam $B%+!<%=%k9T$N%a%C%;!<%8$r%F%9%H$7!"(Bspam $B$HH=Dj$5$l$?>l9g$K(B spam $B%^!<%/$r(B $BIU$1$^$9!#(Bspam $B$G$J$$$HH=Dj$5$l$?>l9g$O(B spam $B%^!<%/$rl9g$O!"%^!<%/$K$+$+$o$i$:(B $BA4$F$N%a%C%;!<%8$rBP>]$H$7$^$9!#(B @item k s @kindex k s (Summary) @findex wl-summary-register-as-spam $B%+!<%=%k9T$N%a%C%;!<%8$r(B spam $B$H$7$FEPO?$7(B spam $B%^!<%/$rIU$1$^$9!#(B @item k S @kindex k S (Summary) @findex wl-summary-register-as-spam-all $B%U%)%k%@Fb$NA4$F$N%a%C%;!<%8$r(B spam $B$H$7$FEPO?$7(B spam $B%^!<%/$rIU$1$^$9!#(B @item k n @kindex k n (Summary) @findex wl-summary-register-as-good $B%+!<%=%k9T$N%a%C%;!<%8$r(B non-spam $B$H$7$FEPO?$7(B spam $B%^!<%/$rl9g$K(B spam $B%^!<%/$r(B $BIU$1$^$9!#(Bspam $B$G$J$$$HH=Dj$5$l$?>l9g$O(B spam $B%^!<%/$rl9g$K(B spam $B%^!<%/$rIU$1$^$9!#(B spam $B$G$J$$$HH=Dj$5$l$?>l9g$O(B spam $B%^!<%/$r$r@_Dj$7$^$9!#(B $B=i4|@_Dj$O!"(B@samp{+spam}$B!#(B @item wl-spam-undecided-folder-regexp-list @vindex wl-spam-undecided-folder-regexp-list spam $B$+(B non-spam $B$+L$H=Dj$N%a%C%;!<%8$,$"$k$H4GJo$9%U%)%k%@$r!"%U%)%k%@(B $BL>$N@55,I=8=$N%j%9%H$G;XDj$7$^$9!#(B $B=i4|@_Dj$O!"(B@code{'("inbox")} @item wl-spam-ignored-folder-regexp-list @vindex wl-spam-ignored-folder-regexp-list $B=i4|@_Dj$O0J2<$NDL$j!#(B @lisp @group (list (regexp-opt (list wl-draft-folder wl-trash-folder wl-queue-folder))) @end group @end lisp spam $BH=Dj$KBP$7$FL58z$J%U%)%k%@$r!"%U%)%k%@L>$N@55,I=8=$N%j%9%H$G;XDj$7(B $B$^$9!#(B @item wl-spam-auto-check-folder-regexp-list @vindex wl-spam-auto-check-folder-regexp-list $B%5%^%j$K0\F0$7$?;~$K<+F0E*$K(B spam $BH=Dj$r9T$&%U%)%k%@$r@55,I=8=$N%j%9%H$G(B $B;XDj$7$^$9!#(B $B=i4|@_Dj$O!"(B@code{nil}$B!#(B @item wl-spam-auto-check-marks @vindex wl-spam-auto-check-marks $B=i4|@_Dj$O0J2<$N%j%9%H!#(B @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} $B$K$h$k<+F0H=Dj$r4^$`!"%U%)(B $B%k%@A4BN$KBP$9$k(B spam $BH=Dj$NBP>]$H$9$k%a%C%;!<%8$N%^!<%/$r;XDj$7$^$9!#%^!<(B $B%/$K$O1JB3%^!<%/$N$_;XDj$G$-$^$9!#0l;~E*%^!<%/$O;XDj$G$-$^$;$s!#(B $B%G%U%)%k%H$N$h$&$K%j%9%H$G;XDj$9$k$H$=$N%^!<%/$N$D$$$?%a%C%;!<%8$@$1$rBP(B $B>]$H$9$kB>!"0J2<$N;XDj$b$G$-$^$9!#(B @table @code @item all $B1JB3%^!<%/$,2?$G$"$C$F$b(B spam $BH=Dj$NBP>]$H$7$^$9!#(B @end table @end table @node Spam Filter Processors, , Usage of Spam Filter, Spam Filter @section $BBP1~$7$F$$$k(B Spam Filter @cindex Spam Filter, Bogofilter @cindex Spam Filter, Spamfilter $B%G%U%)%k%H$G$O!"0J2<$N(B spam $B%U%#%k%?%j%s%0%i%$%V%i%j$KBP1~$7$F$$$^$9!#(B @menu * bogofilter:: bogofilter * spamfilter:: spamfilter.el * bsfilter:: bsfilter * SpamAssassin:: SpamAssassin * SpamOracle:: SpamOracle * Regular Expressions Header Matching:: $B@55,I=8=$K$h$k%X%C%@8!::(B @end menu @node bogofilter, spamfilter, Spam Filter Processors, Spam Filter Processors @subsection bogofilter @cindex bogofilter bogofilter (@uref{http://bogofilter.sourceforge.net/}) $B$O!"(BC$B8@8l$GA0$r@_Dj$7$^$9!#e$K$J$$>l9g$O!"%U%k%Q%9$r@_Dj$9$kI,MW$,$"$j$^$9!#(B @item elmo-spam-bogofilter-args @vindex elmo-spam-bogofilter-args $B=i4|@_Dj$O!"(B@code{nil}$B!#(B bogofilter $B$Ne$K(B @file{spamfilter.el} $B$,$"$l$P!"<+(B $BF0E*$KBP1~%b%8%e!<%k$,%3%s%Q%$%k(B/$B%$%s%9%H!<%k$5$l$^$9!#(B@xref{Install}. @file{spamfilter.el} $B$r;HMQ$9$k$K$O!"(B@file{~/.wl} $B$J$I$K0J2<$N@_Dj$r5-=R(B $B$7$^$9!#(B($B$b$A$m$s!"(B@file{spamfilter.el} $B<+BN$N@_Dj$bI,MW$G$9(B) @lisp @group (setq elmo-spam-scheme 'spamfilter) @end group @end lisp @subsubsection $B%+%9%?%^%$%:JQ?t(B @table @code @item elmo-spam-spamfilter-corpus-filename @vindex elmo-spam-spamfilter-corpus-filename $B=i4|@_Dj$O(B @file{~/.elmo/.spamfilter}$B!#(B $B%3!<%Q%9%U%!%$%k$NL>A0$r@_Dj$7$^$9!#(B @end table @node bsfilter, SpamAssassin, spamfilter, Spam Filter Processors @subsection bsfilter @cindex bsfilter bsfilter (@uref{http://bsfilter.org/}) $B$O!"(BRuby $B$GA0$r@_Dj$7$^$9!#e$K$J$$>l9g$O!"%U%k%Q%9$r@_Dj$9$kI,MW$,$"$j$^$9!#(B @item elmo-spam-bsfilter-args @vindex elmo-spam-bsfilter-args $B=i4|@_Dj$O!"(B@code{nil}$B!#(B bsfilter $B$NA0$r@_Dj$7$^$9!#%7%'%k$,4D6-JQ?t(B @env{PATH} $B>e$K$J$$>l9g$O!"%U%k%Q%9$r@_Dj$9$kI,MW$,$"$j$^$9!#(B @item elmo-spam-bsfilter-shell-switch @vindex elmo-spam-bsfilter-shell-switch $B=i4|@_Dj$O!"(B@code{nil}$B!#(B bsfilter $B$r5/F0$9$k%7%'%k$KM?$($k0z?t$r;XDj$7$^$9!#(B @item elmo-spam-bsfilter-update-switch @vindex elmo-spam-bsfilter-update-switch $B=i4|@_Dj$O!"(B@code{"--auto-update"}$B!#(B $B%a%C%;!<%8$r3X=,$9$k:]$K(B @command{bsfilter} $B$KM?$($k0z?t$r;XDj$7$^$9!#(B @end table @node SpamAssassin, SpamOracle, bsfilter, Spam Filter Processors @subsection SpamAssassin @cindex SpamAssassin SpamAssassin (@uref{http://spamassassin.org/}) $B$O!"(BPerl $B8@8l(B $B$Ge$9$k$3$H$,$G$-$^$9!#(B @file{SpamAssassin} $B$r;HMQ$9$k$K$O!"(B@file{~/.wl} $B$J$I$K0J2<$N@_Dj$r5-=R$7(B $B$^$9!#(B($B$b$A$m$s!"$"$i$+$8$a(B SpamAssassin $B$,%$%s%9%H!<%k$5$l!"@5>o$KF0:n$9(B $B$k$3$H$r3NG'$7$F$/$@$5$$(B) @lisp @group (setq elmo-spam-scheme 'sa) @end group @end lisp @subsubsection $B%+%9%?%^%$%:JQ?t(B @table @code @item elmo-spam-spamassassin-program @vindex elmo-spam-spamassassin-program $B=i4|@_Dj$O(B @file{spamassassin}$B!#(B @command{spamassassin} $B$NA0$r@_Dj$7$^$9!#e$K$J$$>l9g$O!"%U%k%Q%9$r@_Dj$9$kI,MW$,$"$j$^$9!#(B @item elmo-spam-spamassassin-learn-program @vindex elmo-spam-spamassassin-learn-program $B=i4|@_Dj$O(B @file{sa-learn}$B!#(B SpamAssassin $B$K$*$$$F(B Bayesian $B%U%#%k%?$N3X=,$r9T$J$&%W%m%0%i%`!"(B @command{sa-learn} $B$NA0$r@_Dj$7$^$9!#e$K$J$$>l9g$O!"%U%k%Q%9$r@_Dj$9$kI,MW$,$"$j$^$9!#(B @item elmo-spam-spamassassin-program-arguments @vindex elmo-spam-spamassassin-program-arguments $B=i4|@_Dj$O!"(B@code{'("-e")}$B!#(B @command{spamassassin} $Bl9g!"(B@code{'("-c")} $B$r@_Dj$7$J$1$l$P$J$j$^$;$s!#(B @item elmo-spam-spamassassin-learn-program-arguments @vindex elmo-spam-spamassassin-lern-program-arguments $B=i4|@_Dj$O!"(B@code{nil}$B!#(B SpamAssassin $B$N3X=,MQ%W%m%0%i%`(B @command{sa-learn} $Bo$KF0:n$9$k$3$H$r(B $B3NG'$7$F$/$@$5$$(B) @lisp @group (setq elmo-spam-scheme 'spamoracle) @end group @end lisp @subsubsection $B%+%9%?%^%$%:JQ?t(B @table @code @item elmo-spam-spamoracle-program @vindex elmo-spam-spamoracle-program $B=i4|@_Dj$O(B @file{spamoracle}$B!#(B @command{spamoracle} $B$NA0$r@_Dj$7$^$9!#e$K$J$$>l9g$O!"%U%k%Q%9$r@_Dj$9$kI,MW$,$"$j$^$9!#(B @item elmo-spam-spamoracle-config-filename @vindex elmo-spam-spamoracle-config-filename $B=i4|@_Dj$O(B @code{nil}$B!#(B @command{spamoracle} $B$N@_Dj%U%!%$%k$r;XDj$7$^$9(B. @code{nil} $B$r;XDj$9$k$H!"%G%U%)%k%H$N@_Dj%U%!%$%k(B (@file{~/.spamoracle.conf})$B$,;HMQ$5$l$^$9!#(B @item elmo-spam-spamoracle-database-filename @vindex elmo-spam-spamoracle-database-filename $B=i4|@_Dj$O(B @file{~/.elmo/.spamoracle.db}$B!#(B @command{spamoracle} $B$G;HMQ$9$k%G!<%?%Y!<%9%U%!%$%k$N%Q%9$r;XDj$7$^$9!#(B @item elmo-spam-spamoracle-spam-header-regexp @vindex elmo-spam-spamoracle-spam-header-regexp $B=i4|@_Dj$O(B @code{"^X-Spam: yes;"}$B!#(B spam $B%a!<%k$G$"$k$3$H$r<($9%X%C%@$N@55,I=8=$r;XDj$7$^$9!#(B @command{spamoracle} $B$N@_Dj%U%!%$%kFb$G!"(B @code{spam_header} $B%Q%i%a!<%?$N(B $B@_Dj$rJQ99$7$?>l9g$O!"$3$NJQ?t$NCM$r@_Dj$7$F$/$@$5$$!#(B @end table @node Regular Expressions Header Matching, , SpamOracle, Spam Filter Processors @subsection Regular Expressions Header Matching @cindex Regular Expressions Header Matching $B%a%C%;!<%8%X%C%@$N3F%U%#!<%k%I$,@55,I=8=$H9gCW$9$k$+$I$&$+$r8!::$7!"(Bspam $B$+$I$&$+$rH=Dj$7$^$9!#$3$N%P%C%/%(%s%I$r;HMQ$9$k$K$O!"(B@file{~/.wl} $B$J$I(B $B$K0J2<$N@_Dj$r5-=R$7$^$9!#(B @lisp @group (setq elmo-spam-scheme 'header) @end group @end lisp overview $B>pJs$K4^$^$l$J$$%U%#!<%k%I$r8!::$NBP>]$H$9$k>l9g!"(B @code{elmo-msgdb-extra-fields} $B$KDI2C$7$F$*$/$H!"=PMh$k$@$1%a%C%;!<%8K\(B $BBN$rFI$_9~$^$:$K(B overview $B>pJs$r85$K8!::$7$^$9!#(B @subsubsection $B%+%9%?%^%$%:JQ?t(B @table @code @item elmo-spam-header-good-alist @vindex elmo-spam-header-good-alist $B=i4|@_Dj$O0J2<$NDL$j!#(B @lisp '(("X-Spam-Flag" . "No")) @end lisp $B%X%C%@%U%#!<%k%IL>$H9gCW$7$?;~$K(B non-spam $B$HH=Dj$9$k0Y$N@55,I=8=$NAH$r%j(B $B%9%H$G;XDj$7$^$9!#(B@code{elmo-spam-header-spam-alist} $B$h$jM%@h$5$l$^$9!#(B @item elmo-spam-header-spam-alist @vindex elmo-spam-header-spam-alist $B=i4|@_Dj$O0J2<$NDL$j!#(B @lisp '(("X-Spam-Flag" . "Yes")) @end lisp $B%X%C%@%U%#!<%k%IL>$H9gCW$7$?;~$K(B spam $B$HH=Dj$9$k0Y$N@55,I=8=$NAH$r%j%9%H(B $B$G;XDj$7$^$9!#(B @end table @node Advanced Issues, Migration, Spam Filter, Top @chapter $B$h$j?J$s$@;H$$J}(B @cindex Advanced Issues @menu * Living with other packages:: $B%Q%C%1!<%8$N$"$k@83h(B * Highlights:: $B%O%$%i%$%H$N@_Dj(B * Biff:: $B%a!<%k$NCe?.$rCN$i$;$k(B * Password Management:: $B%Q%9%o!<%I$N4IM}(B * Split messages:: $B%a%C%;!<%8$N?6$jJ,$1(B * Batch Processing:: $B%P%C%A=hM}(B * Advanced Settings:: $B%+%9%?%^%$%:!A1~MQJT!A(B * Customizable Valiables:: $B$=$NB>$N%+%9%?%^%$%:JQ?t0lMw(B * Hooks:: $B%U%C%/(B @end menu @node Living with other packages, Highlights, Advanced Issues, Advanced Issues @section $B%Q%C%1!<%8$N$"$k@83h(B $BB>$N%Q%C%1!<%8$r;H$&$?$a$N@_DjNc$G$9!#(B @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} $B$r(B @code{load-path} $B$K$*$$$F0J2<$N$h$&$K@_Dj$9$l$P(B OK $B$G$9!#(B @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://bbdb.sourceforge.net/}) $B$r(B Wanderlust $B$H6&$K;H$&$K$O!"(B @file{util/bbdb-wl.el} $B$r(B @code{load-path} $B$KCV$$$F0J2<$N$h$&$K@_Dj$9$l$P(B OK $B$G$9!#(B $B$?$@$7!"(B@file{util/bbdb-wl.el} $B$O(B @uref{http://savannah.nongnu.org/projects/bbdb/} $B$G(B $B3+H/$5$l$F$$$k!"(BBBDB 3.x $B$H$O8_49@-$,$"$j$^$;$s!#(B $B$3$N>l9g$O!"(BBBDBV3-Wl (@uref{https://gna.org/projects/bbdbv3-wl/}) $B$,!"(B $BM-MQ$+$b$7$l$^$;$s!#(B $B%$%s%9%H!<%k;~$K(B @code{load-path} $B>e$K(B BBDB $B$,$"$l$P!"(B @file{bbdb-wl.el} $B$O%P%$%H%3%s%Q%$%k(B/$B%$%s%9%H!<%k$5$l$^$9!#(B @xref{Install}. @lisp @group (require 'bbdb-wl) (bbdb-wl-setup) ;; @r{$B%]%C%W%"%C%WI=<((B} (setq bbdb-use-pop-up t) ;; @r{$B<+F0<}=8(B} (setq bbdb/mail-auto-create-p t) ;; @r{$B<+F0<}=8$7$J$$%U%)%k%@$N;XDj(B} (setq bbdb-wl-ignore-folder-regexp "^@@") (setq signature-use-bbdb t) (setq bbdb-north-american-phone-numbers-p nil) ;; @r{$B%5%^%j$K(B bbdb $B$NL>A0$rI=<((B} :-)$B!#(B (setq wl-summary-from-function 'bbdb-wl-from-func) ;; @r{$B<+F0E*$K(B ML $B%U%#!<%k%I$r2C$($k(B} (add-hook 'bbdb-notice-hook 'bbdb-auto-notes-hook) (setq bbdb-auto-notes-alist '(("X-ML-Name" (".*$" ML 0)))) @end group @end lisp $B%I%i%U%H%P%C%U%!$G(B @kbd{M-@key{TAB}} $B$K$h$j(B BBDB $B$rMQ$$$?(B $B%"%I%l%9$NJd40$,$G$-$^$9!#(B @node LSDB, supercite, BBDB, Living with other packages @subsection lsdb.el @pindex LSDB The Lovely Sister Database (@uref{http://sourceforge.jp/projects/lsdb/}) $B$r(B Wanderlust $B$H6&$K;H$&$?$a$N@_DjNc$r0J2<$K<($7$^$9!#(B @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 $B$3$NNc$G$O(B LSDB $B$rMQ$$$?%"%I%l%9$NJd40$r(B @kbd{M-@key{TAB}} $B$K3d$jEv$F$F(B $B$$$^$9!#(B @node supercite, mu-cite, LSDB, Living with other packages @subsection sc.el(supercite), sc-register.el @pindex sc @pindex supercite $BIaDL$N%a!<%i$HF1$8@_Dj$G(B OK $B$G$9!#0J2<$O!"@_Dj$N0lNc$G$9!#(B @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 $BIaDL$N%a!<%i$HF1$8@_Dj$G(B OK $B$G$9!#0J2<$O@_Dj$N0lNc$G$9!#(B mu-cite 8.0$B0JA0$N%P!<%8%g%s$r$*;H$$$J$i!"(B $B0J2<$N$h$&$K@_Dj$7$F$/$@$5$$!#(B @lisp @group (autoload 'mu-cite/cite-original "mu-cite" nil t) (setq mail-citation-hook 'mu-cite/cite-original) @end group @end lisp mu-cite 8.1$B0J9_$N%P!<%8%g%s$r$*;H$$$J$i!"(B $B0J2<$N$h$&$K@_Dj$7$F$/$@$5$$!#(B @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 $B0J2<$N$$$:$l$+$r%$%s%9%H!<%k$9$k$3$H$G!"(B $B%a%C%;!<%8%P%C%U%!$N(B @samp{X-Face:} $B%U%#!<%k%I$r%G%3!<%I$7$F!"2hA|$rI=<($9$k$3$H$,$G$-$^$9!#(B @menu * x-face-xmas:: XEmacs $B$N>l9g(B * x-face-mule:: Emacs $B$N>l9g(B @end menu $B$^$?!"%(%s%3!<%I:Q$_$N(B X-Face $BJ8;zNs$r(B @file{~/.xface} ($BJQ?t(B @code{wl-x-face-file} $B$NCM$G$9(B)$B$NFbMF$KMQ0U$7$F$*$/$H!"(B $B%I%i%U%H$,=`Hw$5$l$k$H$-$K<+F0E*$K(B @samp{X-Face:} $B%U%#!<%k%I$H$7$FA^F~$5$l$^$9!#(B ($BJQ?t(B @code{wl-auto-insert-x-face} $B$,(B non-nil $B$N>l9g(B) @node x-face-xmas, x-face-mule, X-Face, X-Face @subsubsection x-face-xmas (XEmacs $B$N>l9g(B) @pindex x-face-xmas x-face (@uref{ftp://jpl.org/pub/elisp/}) 1.3.6.13 $B0J9_$KIUB0$N(B @file{x-face-xmas.el} $B$r;H$&>l9g$O0J2<$N$h$&$K@_Dj$7$F$/$@$5$$!#(B @lisp @group (autoload 'x-face-xmas-wl-display-x-face "x-face") (setq wl-highlight-x-face-function 'x-face-xmas-wl-display-x-face) @end group @end lisp @node x-face-mule, , x-face-xmas, X-Face @subsubsection x-face-mule (Emacs $B$N>l9g(B) @pindex x-face-mule @pindex bitmap-mule bitmap-mule (@uref{ftp://ftp.jpl.org/pub/elisp/bitmap/}) 8.0$B0J9_$K(B $BIUB0$N(B @file{x-face-mule.el} $B$r;H$&>l9g$O0J2<$N$h$&$K@_Dj$7$F$/$@$5$$!#(B @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 (Emacs 21.x $B$N>l9g(B) @pindex x-face-e21 Emacs 21.x $B$N>l9g$K$O!"(B@file{x-face-mule.el} $B$NBe$o$j$K(B @file{x-face-e21.el} (@uref{ftp://jpl.org/pub/elisp/}) $B$r;H$C$F(B X-Face $B$rI=<($9$k$3$H$b$G$-$^$9!#(B $B$=$N>l9g!"(Bbitmap-mule $B$OITMW$G$9!#0J2<$N$h$&$K@_Dj$7$F$/$@$5$$!#(B @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 $B%Q%C%1!<%8$K4^$^$l$k(B @file{dired-dd-mime.el} $B$rAH$_9~$a$P!"(BGNU Emacs $B$GJT=8Cf$NAp9F%P%C%U%!$X(B dired $B$+$i%I%i%C%0(B&$B%I%m%C%W$9$k$@$1$G4JC1(B $B$K%^%k%A%Q!<%H$r:n@.$G$-$^$9(B($B$b$C$H$b!"(BWanderlust $B@lMQ$G$O$J$/(B SEMI $BHFMQ(B $B$G$9$,(B)$B!#(B @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 $B$rMQ$$$k$H!"%a%C%;!<%8$r85$KM=DjI=$r:n$l$^$9!#(B mhc-0.25 $B$N>l9g!'(B @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 $B$N>l9g!'(B @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 $B$N(B Addrbook $B$r(B Wanderlust $B$G;HMQ$G$-$k$h$&$K$9$k$K$O!"(B @file{util/wl-addrbook.el} $B$H(B @file{util/wl-complete.el} $B$r(B @code{load-path} $B$K$*$$$F!"0J2<$N$h$&$K@_Dj$7$^$9!#(B @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/}) $B$KIUB0$N(B @file{mime-w3m.el} $B$r;H$C$F!"%a%C%;!<%8$N(B html $B%Q!<%H$r(B $BI=<($5$;$k$3$H$,=PMh$^$9!#@_DjJ}K!$O(B @file{mime-w3m.el} $B$N(B $B@hF,$N%3%a%s%H$r;2>H$7$F$/$@$5$$!#(B SEMI $B$,(B SEMI-EPG $B$G$"$k>l9g$O!"FCJL$J@_Dj$OITMW$G$9!#(B @node Highlights, Biff, Living with other packages, Advanced Issues @section $B%O%$%i%$%H$N@_Dj(B @subsection $B%+%9%?%^%$%:JQ?t(B @table @code @item wl-summary-highlight @vindex wl-summary-highlight $B=i4|@_Dj$O(B @code{t}$B!#%5%^%j$N%O%$%i%$%H$r9T$&$+$I$&$+!#(B Non-nil $B$J$i%5%^%j$N%O%$%i%$%H$r9T$$$^$9!#(B @item wl-highlight-max-summary-lines @vindex wl-highlight-max-summary-lines $B=i4|@_Dj$O(B 10000$B!#(B $B%5%^%j$N9T?t$,$3$NCM$h$jBg$-$$>l9g!"%5%^%j$N%O%$%i%$%H$r9T$$$^$;$s!#(B @item wl-summary-highlight-partial-threshold @vindex wl-summary-highlight-partial-threshold $B=i4|@_Dj$O(B 1000$B!#(B $B%5%^%jA4BN$r%O%$%i%$%H$9$k$+$I$&$+$NogCM!#(B $B$3$NCM$r1[$($k9T?t$N%a%C%;!<%8$,%5%^%j$KB8:_$9$k>l9g!"(B $BItJ,E*$J%O%$%i%$%H$r9T$$$^$9!#(B @item wl-summary-partial-highlight-above-lines @vindex wl-summary-partial-highlight-above-lines $B=i4|@_Dj$O(B 30$B!#(B@code{wl-summary-highlight-partial-threshold} $B$r1[$($k9T(B $B?t$N%a%C%;!<%8$,%5%^%j$KB8:_$9$k>l9g!"%P%C%U%!Kv$+$i!"%+!<%=%k9T$h$j$3$N(B $BCM$N9T?tJ,$@$1>e$N%a%C%;!<%8$^$GItJ,E*$J%O%$%i%$%H$,9T$J$o$l$^$9!#(B($B$3$N(B $BCM$r(B @code{nil} $B$K$9$k$H%P%C%U%!Kv$+$i(B @code{wl-summary-highlight-partial-threshold}$B9TJ,$@$1%O%$%i%$%H$5$l$k$h(B $B$&$K$J$j$^$9!#(B) @item wl-highlight-body-too @vindex wl-highlight-body-too $B=i4|@_Dj$O(B @code{t}$B!#(B Non-nil $B$J$i%I%i%U%H$*$h$S%a%C%;!<%8$NK\J8$b%O%$%i%$%H$NBP>]$H$7$^$9!#(B @item wl-highlight-message-header-alist @vindex wl-highlight-message-header-alist $B%I%i%U%H$*$h$S%a%C%;!<%8$N%X%C%@$N%O%$%i%$%H$r9T$&:]$K!"(B $B=EMW(B (@code{wl-highlight-message-important-header-contents})$B$J!"(B $BFsHVL\$K=EMW(B (@code{wl-highlight-message-important-header-contents2})$B$J!"(B $B$=$7$F=EMW$G$O$J$$(B (@code{wl-highlight-message-unimportant-header-contents}) $B$3$H$rI=$9(B face $B$r$=$l$>$l$I$N%a%C%;!<%8%X%C%@$K3d$jEv$F$k$+$r@_Dj$7$^$9!#(B $BF1MM$K!"G$0U$N@55,I=8=$KBP$7$FG$0U$N(B face $B$r3d$jEv$F$k$3$H$b$G$-$^$9!#(B @item wl-highlight-citation-prefix-regexp @vindex wl-highlight-citation-prefix-regexp $B%I%i%U%H$*$h$S%a%C%;!<%8$NK\J8Fb$N0zMQ9T$r<($9@55,I=8=$r;XDj$7$^$9!#(B $B$3$N@55,I=8=$K%^%C%A$7$?K\J8$O!"(B (@code{wl-highlight-message-cited-text-*})$B$G;XDj$5$l$k(B face $B$G%O%$%i%$%H$5$l$^$9!#(B @item wl-highlight-highlight-citation-too @vindex wl-highlight-highlight-citation-too $B=i4|@_Dj$O(B @code{nil}$B!#(B Non-nil $B$J$i(B@code{wl-highlight-citation-prefix-regexp}$B$GM?$($i$l$k(B $B0zMQ9T$N0zMQ$r<($9@55,I=8=<+BN$b%O%$%i%$%H$NBP>]$H$7$^$9!#(B @item wl-highlight-citation-header-regexp @vindex wl-highlight-citation-header-regexp $B0zMQ$r;O$a$k$3$H$r<($9%X%C%@$N@55,I=8=$r;XDj$7$^$9!#(B $B$3$N@55,I=8=$K%^%C%A$7$?K\J8$O!"(B @code{wl-highlight-message-headers}$B$G;XDj$5$l$k(B face $B$G%O%$%i%$%H$5$l$^$9!#(B @item wl-highlight-max-header-size @vindex wl-highlight-max-header-size $B=i4|@_Dj$O(B @code{nil}$B!#(B $B%a%C%;!<%8$N%X%C%@%5%$%:$,$3$NCM$h$jBg$-$$>l9g!"%X%C%@$r%O%$%i%$%H$7$^$;(B $B$s!#(B@code{nil} $B$N>l9g!"%5%$%:$K4X78$J$/%O%$%i%$%H$7$^$9!#(B @item wl-highlight-max-message-size @vindex wl-highlight-max-message-size $B=i4|@_Dj$O(B 10000$B!#(B $B%a%C%;!<%8$,$3$NCM$h$jBg$-$$>l9g!"%a%C%;!<%8$N%O%$%i%$%H$r9T$$$^$;$s!#(B $B$3$l$K$h$j(B uuencode $B$dHs>o$KBg$-$J%@%$%8%'%9%H$J$I$N(B $B%O%$%i%$%H$NM^;_$r9T$$$^$9!#(B @item wl-highlight-signature-separator @vindex wl-highlight-signature-separator $B%7%0%K%A%c$N6-3&$rI=$9@55,I=8=$r;XDj$7$^$9!#(B $B@55,I=8=$G$b!"@55,I=8=$N%j%9%H$G$b9=$$$^$;$s!#(B $B$3$N@55,I=8=$K%^%C%A$7$?>l=j0J9_$N%a%C%;!<%8$O!"(B @code{wl-highlight-message-signature}$B$G;XDj$5$l$k(B face $B$G%O%$%i%$%H$5$l$^$9!#(B @item wl-max-signature-size @vindex wl-max-signature-size $B=i4|@_Dj$O(B 400$B!#(B $B%7%0%K%A%c$r%O%$%i%$%H$9$k>l9g!"(B $B%O%$%i%$%H$9$k:GBg$N%7%0%K%A%c$NBg$-$5$r;XDj$7$^$9!#(B @item wl-use-highlight-mouse-line @vindex wl-use-highlight-mouse-line $B=i4|@_Dj$O(B @code{t}$B!#(B Non-nil $B$J$i%U%)%k%@%b!<%I!"%5%^%j%b!<%I$J$I$G(B $B%^%&%9%]%$%s%?$N9T$r%O%$%i%$%H$NBP>]$H$7$^$9!#(B @end table @subsection $BJ8;z$N?'!"%U%)%s%H$N@_Dj(B $BJ8;z$N?'$d!"%U%)%s%H$rJQ$($k$K$O!"(BWanderlust $B$GDj5A$5$l$F$$$k(B face $B$rJQ(B $B99$9$kI,MW$,$"$j$^$9!#%U%)%s%H$rJQ$($?$$$H$-$O(B @code{set-face-font}$B!"(B $B?'$rJQ$($?$$$H$-$O(B @code{set-face-foreground} $B$J$I$r;H$($P$h$$$G$7$g$&!#(B face $B$N@_Dj$O(B @file{.emacs} $B$K=q$/$3$H$O$G$-$J$$$N$G(B @file{~/.wl} $B$K=q$$(B $B$F$/$@$5$$!#(B $B$?$H$($P!"%7%0%K%A%c$N?'$r2+?'$KJQ$($?$$$H$-$O!"(B @lisp (set-face-foreground 'wl-highlight-message-signature "yellow") @end lisp @noindent $B$r(B @file{~/.wl} $B$K=q$-$^$9!#(B $B0J2<$K(B Wanderlust $B$GDj5A$5$l$F$$$k(B face $B$K$D$$$F@bL@$7$^$9!#(B @table @code @item wl-highlight-message-headers $B%a%C%;!<%8%X%C%@$NL>A0ItJ,$N(B face $B$G$9!#(B @item wl-highlight-message-header-contents $B%a%C%;!<%8%X%C%@$NFbMFItJ,$N(B face $B$G$9!#(B @item wl-highlight-message-important-header-contents $B%a%C%;!<%8%X%C%@$NFbMF$N$&$A=EMW$JItJ,$N(B face $B$G$9!#(B $B%G%U%)%k%H$G$O!"(B@samp{Subject:} $B$NFbMFItJ,$,@_Dj$5$l$F$$$^$9!#(B $B$3$NCM$O(B @code{wl-highlight-message-header-alist} $B$rJQ99$9$l$PJQ$($k$3$H$,$G$-$^$9!#(B @item wl-highlight-message-important-header-contents2 $B%a%C%;!<%8%X%C%@$NFbMF$N$&$A=EMW$JItJ,$N(B face $B$=$N#2$G$9!#(B $B%G%U%)%k%H$G$O!"(B@samp{From:} $B$H(B @samp{To:} $B$NFbMFItJ,$,@_Dj$5$l$F$$$^$9!#(B $B$3$NCM$O(B @code{wl-highlight-message-header-alist} $B$rJQ99$9$l$PJQ$($k$3$H$,$G$-$^$9!#(B @item wl-highlight-message-unimportant-header-contents $B%a%C%;!<%8%X%C%@$NFbMF$N$&$A=EMW$G$O$J$$ItJ,$N(B face $B$G$9!#(B $B%G%U%)%k%H$G$O!"(B@samp{X-} $B$G;O$^$k%X%C%@$H(B @samp{User-Agent:} $B$NFbMFItJ,(B $B$,@_Dj$5$l$F$$$^$9!#$3$NCM$O(B @code{wl-highlight-message-header-alist} $B$r(B $BJQ99$9$l$PJQ$($k$3$H$,$G$-$^$9!#(B @item wl-highlight-message-citation-header $B%a%C%;!<%8$N0zMQ%X%C%@ItJ,$N(B face $B$G$9!#(B @item wl-highlight-message-cited-text-* $B%a%C%;!<%8$N0zMQ%F%-%9%HItJ,$N(B face $B$G$9!#(B $B:G8e$K$O(B@var{$B?t;z(B}$B$,$D$-!"(B10 $BCJ3,$^$G0zMQ$4$H$K?'J,$1$G$-$k$h$&$K$7$F$$$^$9!#(B @item wl-highlight-message-signature $B%a%C%;!<%8$N%7%0%K%A%cItJ,$N(B face $B$G$9!#=i4|@_Dj$O!"L@?'%P%C%/$G$O(B @samp{khaki}$B!"0E?'%P%C%/$G$O(B @samp{DarkSlateBule} $B$G$9!#(B @item wl-highlight-header-separator-face $B%I%i%U%H$N%a%C%;!<%8$N%X%C%@%;%Q%l!<%?$N(B face $B$G$9!#(B @item wl-highlight-summary-important-face $B%5%^%j$G=EMW%^!<%/$N$D$$$?%a%C%;!<%89T$N(B face $B$G$9!#(B @item wl-highlight-summary-new-face $B%5%^%j$G?75,%^!<%/$N$D$$$?%a%C%;!<%89T$N(B face $B$G$9!#(B @item wl-highlight-summary-displaying-face $B%5%^%j$G8=:_I=<(Cf$N%a%C%;!<%89T$N(B face $B$G$9!#(B $B$3$N(B face $B$O(B overlay $B$5$l$^$9!#(B @item wl-highlight-thread-indent-face $B%5%^%j$G8=:_I=<(Cf$N%a%C%;!<%89T$N(B face $B$G$9!#(B @item wl-highlight-summary-unread-face $B%5%^%j$GL$FI%^!<%/$N$D$$$?%a%C%;!<%89T$N(B face $B$G$9!#(B @item wl-highlight-summary-deleted-face $B%5%^%j$G:o=|%^!<%/$N$D$$$?%a%C%;!<%89T$N(B face $B$G$9!#(B @item wl-highlight-summary-refiled-face $B%5%^%j$G%j%U%!%$%k%^!<%/$N$D$$$?%a%C%;!<%89T$N(B face $B$G$9!#(B @item wl-highlight-refile-destination-face $B%5%^%j$G%j%U%!%$%k%^!<%/$NIU$$$?%a%C%;!<%89T$N!"(B $B%j%U%!%$%k@h>pJs$NItJ,$K$D$/(B face $B$G$9!#(B @item wl-highlight-summary-copied-face $B%5%^%j$G%3%T!<%^!<%/$N$D$$$?%a%C%;!<%89T$N(B face $B$G$9!#(B @item wl-highlight-summary-target-face $B%5%^%j$G$^$H$a=hM}MQ%^!<%/(B @samp{*} $B$N$D$$$?%a%C%;!<%89T$N(B face $B$G$9!#(B @item wl-highlight-summary-thread-top-face $B%5%^%j$G%9%l%C%I%H%C%W$N%a%C%;!<%89T$N(B face $B$G$9!#(B @item wl-highlight-summary-normal-face $B%5%^%j$G%9%l%C%I%H%C%W$G$O$J$$%a%C%;!<%89T$N(B face $B$G$9!#(B @item wl-highlight-folder-unknown-face $B%U%)%k%@%b!<%I$G!"$$$/$DL$F14|%a%C%;!<%8$,$"$k$+J,$i$J$$%U%)%k%@$N(B face $B$G$9!#(B @item wl-highlight-folder-zero-face $B%U%)%k%@%b!<%I$G!"L$F14|%a%C%;!<%8$,$J$$%U%)%k%@$N(B face $B$G$9!#(B @item wl-highlight-folder-few-face $B%U%)%k%@%b!<%I$G!"L$F14|%a%C%;!<%8$,>/$7$"$k%U%)%k%@$N(B face $B$G$9!#(B @item wl-highlight-folder-many-face $B%U%)%k%@%b!<%I$G!"L$F14|%a%C%;!<%8$,$?$/$5$s$"$k%U%)%k%@$N(B face $B$G$9!#(B $B!V>/$7!W$H!V$?$/$5$s!W$N@Z$lL\$O!"(B $BJQ?t(B @code{wl-folder-many-unsync-threshold} $B$G@_Dj$5$l$^$9!#(B @item wl-highlight-folder-unread-face $B%U%)%k%@%b!<%I$G!"L$F14|%a%C%;!<%8$,$J$/$FL$FI%a%C%;!<%8$,$"$k(B $B%U%)%k%@$N(B face $B$G$9!#(B @item wl-highlight-folder-killed-face $B%U%)%k%@%b!<%I$G!"%"%/%;%9%0%k!<%WCf$N:o=|$5$l$?%U%)%k%@$N(B face $B$G$9!#(B @item wl-highlight-folder-opened-face $B%U%)%k%@%b!<%I$G!"3+$$$?%0%k!<%W$K$D$/(B face $B$G$9!#(B $BJQ?t(B @code{wl-highlight-folder-by-numbers} $B$,(B @code{nil} $B$+(B @var{$B?t(B} $B$N(B $B$H$-M-8z$G$9!#(B @item wl-highlight-folder-closed-face $B%U%)%k%@%b!<%I$G!"JD$8$?%0%k!<%W$K$D$/(B face $B$G$9!#(B $BJQ?t(B @code{wl-highlight-folder-by-numbers} $B$,(B @code{nil} $B$+(B @var{$B?t(B} $B$N(B $B$H$-M-8z$G$9!#(B @item wl-highlight-folder-path-face $B%U%)%k%@%b!<%I$G!"8=:_A*BrCf$N%U%)%k%@$^$G$N%Q%9$K$D$/(B face $B$G$9!#(B @item wl-highlight-logo-face $B%G%b$G%m%4$K$D$/(B face $B$G$9!#(B @item wl-highlight-demo-face $B%G%b$NJ8;zNs(B($B%P!<%8%g%sHV9f$J$I(B)$B$K$D$/(B face $B$G$9!#(B @end table @node Biff, Password Management, Highlights, Advanced Issues @section $B%a!<%k$NCe?.$rCN$i$;$k(B @cindex Biff $B0J2<$N$h$&$K@_Dj$7$F$*$/$H(B @samp{%inbox} $B$K%a!<%k$,FO$$$?$H$-$K!"(B $B%b!<%I%i%$%s$NI=<($K$h$j%a!<%k$NCe?.$rCN$i$;$F$/$l$^$9!#(B @lisp (setq wl-biff-check-folder-list '("%inbox")) @end lisp @subsection $B%+%9%?%^%$%:JQ?t(B @table @code @item wl-biff-check-folder-list @vindex wl-biff-check-folder-list $B=i4|@_Dj$O(B @code{nil}$B!#(B $B%a!<%k$NCe?.$r%A%'%C%/$9$k%U%)%k%@$N%j%9%H!#(B @code{nil} $B$N>l9g$OCe?.$N%A%'%C%/$r9T$J$$$^$;$s!#(B @item wl-biff-check-interval @vindex wl-biff-check-interval $B=i4|@_Dj$O(B 40 ($BC10L(B:$BIC(B)$B!#(B $B$3$NCM$4$H$K%a!<%kCe?.$N%A%'%C%/$r9T$J$$$^$9!#(B @item wl-biff-use-idle-timer @vindex wl-biff-use-idle-timer $B=i4|@_Dj$O(B @code{nil}$B!#(B @code{nil} $B$J$i(B @code{wl-biff-check-interval} $B$G;XDj$7$?;~4V$,7P2a$9$k$H(B $B%a!<%kCe?.$N%A%'%C%/$r9T$$$^$9!#(BNon-nil $B$J$i(B @code{wl-biff-check-interval} $B$G;XDj$7$?;~4V$@$1%"%$%I%k>uBV$,B3$/$H%a!<%kCe?.$N%A%'%C%/$r9T$$$^$9!#(B @item wl-biff-notify-hook @vindex wl-biff-notify-hook $B?7$7$$%a!<%k$,FO$$$?:]$Kl9g$O(B @code{nil} $B$K@_Dj$7$F$/$@$5$$!#(B @end table @node Password Management, Split messages, Biff, Advanced Issues @section $B%Q%9%o!<%I$N4IM}(B $B%5!<%P$K@\B3$9$k0Y$KF~NO$7$?%Q%9%o!<%I$OJQ?t(B @code{elmo-passwd-alist} $B$K(B $B@\B3Kh$KJ];}$5$l$^$9!#$3$NJQ?t$K$O%(%s%3!<%I$5$l$?@8$N%Q%9%o!<%I$,J];}$5(B $B$l$F$*$j!"(BEmacs $B$rB>?M$K?($i$l$k$H%Q%9%o!<%I$r8+$i$l$k4m81@-$,$"$k$N$G==(B $BJ,$KCm0U$7$F2<$5$$!#(B $B%Q%9%o!<%I$,J];}$5$l$F$$$k>uBV$G(B @kbd{M-x elmo-passwd-alist-save} $B$rl9g!"%-!C5n$9$k$K$O(B @kbd{M-x elmo-passwd-alist-clear} $B$N8e!"(B@kbd{M-x elmo-passwd-alist-save} $B$rA0$G$9!#(B $B%3%^%s%I(B @code{elmo-passwd-alist-save} $B$rl9g$O!"?75,$K%Q%9%o!<%I$,F~NO$5$l$F$+$i(B @code{elmo-passwd-life-time} $BIC8e$K%Q%9%o!<%I$r>C5n$9$k%?%$%^$,!"(B $B%;%C%H$5$l$^$9!#(B@code{nil} $B$N>l9g$OF~NO$5$l$?%Q%9%o!<%I$r>C5n$7$^$;$s!#(B @end table @node Split messages, Batch Processing, Password Management, Advanced Issues @section $B%a%C%;!<%8$N?6$jJ,$1(B @cindex Split messages @code{elmo-split} $B$r;H$&$H!"JQ?t(B @code{elmo-split-folder} $B$G;XDj$7$?%U(B $B%)%k%@Fb$N%a%C%;!<%8$rFCDj$N5,B'$K=>$C$F(B @command{procmail} $BIw$K?6$jJ,(B $B$1$k$3$H$,$G$-$^$9!#(B $B$3$N5!G=$r;H$&$K$O!"$^$:(B @file{~/.emacs} $B$K0J2<$N$h$&$K@_Dj$7$F2<$5$$!#(B @lisp (autoload 'elmo-split "elmo-split" "Split messages on the folder." t) @end lisp $B?6$jJ,$185$N%U%)%k%@$r0J2<$N$h$&$K@_Dj$7$^$9!#(B @lisp (setq elmo-split-folder "%inbox") @end lisp $B?6$jJ,$1$N%k!<%k$OJQ?t(B @code{elmo-split-rule} $B$K5-=R$7$^$9(B($B=q$-J}$O8e$G(B $B@bL@$7$^$9(B)$B!#(B $B0J>e$N@_Dj$r$7$?>e$G(B @kbd{M-x elmo-split} $B$9$k$H(B @code{elmo-split-rule} $B$K=>$C$F?6$jJ,$1$r2A$9$k!#(B} ((equal x-ml-name "wanderlust") "%wanderlust" continue) ;; @r{Yahoo $BMxMQl9g$K(B @samp{ACTION} $B$rr7o$r(B S $B<0$G5-=R$7$^$9!#=q<0$K$D$$$F$O(B $B$9$08e$G@bL@$7$^$9!#BhFs$NMWAG(B @samp{ACTION} $B$K$O%a%C%;!<%8$N?6$jJ,$1@h(B $B$N%U%)%k%@L>!"$b$7$/$O%7%s%\%k$r;XDj$7$^$9!#(B $BBh;0$NMWAG(B @code{continue} $B$r%7%s%\%k$H$7$FM?$($k$H!"(B@samp{CONDITION} $B$,(B $BK~$?$5$l$?>l9g$K$b?6$jJ,$15,B'$NI>2A$r7QB3$7$^$9!#(B @samp{CONDITION} $B$N5-K!$O0J2<$N$h$&$K$J$j$^$9!#e$G5s$2$?(B $BNc$r;29M$K$7$F2<$5$$!#(B @enumerate @item @samp{$B%U%#!<%k%IL>(B} $B$*$h$S(B @samp{$BCM(B} $B$r0z?t$H$7$F(B} $B$O%U%#!<%k%IL>$rI=$9%7%s%\%k$G$9(B) @table @code @item @code{equal} $B%U%#!<%k%I$NCM$,(B @samp{$BCM(B} $B$KEy$7$1$l$P??!#(B $BBgJ8;z>.J8;z$N:9$OL5;k$5$l$^$9!#(B @item @code{match} $B%U%#!<%k%I$NCM$,(B @samp{$BCM(B} $B$K%^%C%A$9$l$P??!#(B @samp{$BCM(B} $B$O(B @code{\&} $B$d(B @code{\N} $B$r4^$`$3$H$,$G$-$^$9!#(B $B$=$l$i$O$=$NA0$N(B @samp{$BCM(B} $B$G(B @code{\(\)} $B$K%^%C%A$7$?%Q%?!<%s$K(B $BCV$-49$($i$l$^$9!#(B @item @code{address-equal} $B$=$N%U%#!<%k%I$K$"$k%"%I%l%9$N$$$:$l$+$,(B @samp{$BCM(B} $B$KEy$7$1$l$P??!#(B $BBgJ8;z>.J8;z$N:9$OL5;k$5$l$^$9!#(B @item @code{address-match} $B$=$N%U%#!<%k%I$K$"$k%"%I%l%9$N$$$:$l$+$,(B @samp{$BCM(B} $B$K%^%C%A$9$l$P??!#(B @samp{$BCM(B} $B$O(B @code{\&} $B$d(B @code{\N} $B$r4^$`$3$H$,$G$-$^$9!#(B $B$=$l$i$O$=$NA0$N(B @samp{$BCM(B} $B$G(B @code{\(\)} $B$K%^%C%A$7$?%Q%?!<%s$K(B $BCV$-49$($i$l$^$9!#(B @end table @item 1 $B$D$N@0?t(B (@samp{SIZE}) $B$r0z?t$H$7$F$H$k4X?t!#(B @table @code @item @code{<} $B%a%C%;!<%8$N%5%$%:$,(B @samp{SIZE} $B$h$j>.$5$1$l$P??!#(B @item @code{>} $B%a%C%;!<%8$N%5%$%:$,(B @samp{SIZE} $B$h$jBg$-$1$l$P??!#(B @end table @item $BG$0U?t$N0z?t$r2A$7$^$9!#(B @end enumerate @samp{ACTION} $B$NCM$H$7$F;XDj$G$-$k$N$O0J2<$N$$$:$l$+$G$9!#(B @enumerate @item $B%U%)%k%@L>(B $BJ8;zNs$,;XDj$5$l$k$H$=$l$r?6$jJ,$1@h$N%U%)%k%@L>$H$_$J$7$F!"$=$N%U%)%k%@(B $B$X%a%C%;!<%8$rDI2C$7$^$9!#(B @item @samp{delete} $B%7%s%\%k(B @samp{delete} $B$,;XDj$5$l$k$H(B @code{elmo-split-folder} $BFb$K$"$k(B $B%a%C%;!<%8$Nl9g!"$=$N%a%C%;!<%8$KBP$7$F$O2?$b$;$:!"(B $B$=$N$^$^$N>uBV$KJ]$A$^$9!#(B @item $B4X?t(B $B4X?t$,;XDj$5$l$?>l9g!"$=$l$r$N%j%9%H(B $B$G;XDj$7$^$9!#(B @end table @node Advanced Settings, Customizable Valiables, Batch Processing, Advanced Issues @section $B%+%9%?%^%$%:!A1~MQJT!A(B @menu * Draft for Reply:: $BJV;vMQ%I%i%U%H(B * Thread Format:: $B%9%l%C%I$N8+$?L\(B * User-Agent Field:: @samp{User-Agent:} $B%X%C%@%U%#!<%k%I(B @end menu @node Draft for Reply, Thread Format, Advanced Settings, Advanced Settings @subsection $BJV;vMQ%I%i%U%H(B @vindex wl-draft-reply-with-argument-list @vindex wl-draft-reply-without-argument-list $B%5%^%j%b!<%I$G(B @kbd{a} $B$r2!$9$HJV;vMQ$N%I%i%U%H$,MQ0U$5$l$^$9!#(B $BMQ0U$5$l$kAp9F$N08@h$O!"0J2<$N$h$&$K$7$F@_Dj$9$k$3$H$,$G$-$^$9!#(B $BNc$($P!"(B @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 $B$N$h$&$K@_Dj$7$^$9!#$3$3$G%j%9%H(B @code{wl-draft-reply-without-argument-list} $B$N3FMWAG$O(B @example (key . (to-list cc-list newsgroup-list)) @end example $B$H$J$C$F$*$j!"(B@samp{key} $B$G;XDj$7$?%U%#!<%k%I$,B8:_$9$k$H$-$K!"?F%a%C%;!<%8(B $B$N(B @samp{to-list} $B$G;XDj$5$l$k%X%C%@$r!"Ap9F$N(B @samp{To:} $B$K%3%T!<$7$^$9!#(B $B$^$?F1MM$K!"?F$N(B @samp{cc-list}, @samp{newsgroup-list} $B$OAp9F$N(B @samp{Cc:}, @samp{Newsgroups:} $B$K%3%T!<$5$l$^$9!#(B $BNc$r5s$2$F@bL@$7$^$9!#(B @lisp ("Mail-Followup-To" . (("Mail-Followup-To") nil ("Newsgroups"))) @end lisp $B?F%a%C%;!<%8$K(B @samp{Mail-Followup-To} $B%U%#!<%k%I$,B8:_$7$?$H$-$K%^%C%A$7$^$9!#(B $B?F%a%C%;!<%8$N(B @samp{Mail-Followup-To} $B$*$h$S(B @samp{Newsgroups} $B%U%#!<%k%I$NFbMF$r!"Ap9F$N(B @samp{To} $B$*$h$S(B @samp{Newsgroups} $B$K%3%T!<$7$^$9!#(B @lisp (("X-ML-Name" "Reply-To") . (("Reply-To") nil nil)) @end lisp $B?F%a%C%;!<%8$K(B @samp{X-ML-Name} $B$*$h$S(B @samp{Reply-To} $B$NN>J}$,B8:_$7$?(B $B$H$-$K%^%C%A$7$^$9!#(B $B?F%a%C%;!<%8$N(B @samp{Reply-To} $B$rAp9F$N(B @samp{To} $B$K%3%T!<$7$^$9!#(B @lisp ("From" . (("From") ("To" "Cc") ("Newsgroups"))) @end lisp $B?F%a%C%;!<%8$N(B @samp{From} $B$rAp9F$N(B @samp{To} $B$K!"?F$N(B @samp{To} $B$*$h$S(B @samp{Cc} $B$rAp9F$N(B @samp{Cc} $B$K!"(B@samp{Newsgroups} $B$r(B @samp{Newsgroups} $B$K$=$l$>$l%3%T!<$7$^$9!#(B $B$3$l$i$O=gHV$KI>2A$5$l!":G=i$K%^%C%A$7$?$b$N$,;H$o$l$^$9!#(B $BF1MM$K$7$F!"(Bprefix argument $BIU$-$G(B @kbd{a} $B$r2!$7$?$H$-$NF0:n$,!"(B @code{wl-draft-reply-with-argument-list} $B$G@_Dj$G$-$^$9!#(B $B$^$?!"4X?t(B($B?F%a%C%;!<%8$N%P%C%U%!$GI>2A$5$l$k(B)$B$r(B @samp{key} $B$d(B @samp{to-list} $BEy$NJQ$o$j$KMQ$$$k$3$H$b$G$-$^$9!#(B $B<+J,$N=q$$$?%a%C%;!<%8$X$NJV?.$N>l9g$K%^%C%A$5$;$?$$>l9g$K$O(B @samp{key} $B$H$7$F4X?t(B @code{wl-draft-self-reply-p} $B$r;XDj$7$^$9!#(B @kbd{C-u a} $B$7$?$H$-$K!"(B@code{wl-subscribed-mailing-list} $B$N(B $B%"%I%l%9$,4^$^$l$k%a!<%k$KBP$7$F$O%a!<%j%s%0%j%9%H$K$N$_JV?.$7$?$$>l9g!"(B $B$5$s(B ] 396 09/20($BF|(B)22:11 | +-[ $BDEM8$5$s(B ] 398 09/21($B7n(B)00:17 | +-[ $BDEM8$5$s(B ] 408 09/21($B7n(B)22:37 | +-[ $B1|@>$5$s(B ] 411 09/22($B2P(B)01:34 | +-[ $BDEM8$5$s(B ] 412 09/22($B2P(B)09:28 | +-[ $B$F$i$K$7(B ] 415 09/22($B2P(B)11:52 | +-[ $BDEM8$5$s(B ] 416 09/22($B2P(B)12:38 | +-[ $B$F$i$K$7(B ] 395 09/20($BF|(B)21:49 +-[ $B1|@>$5$s(B ] 397 09/21($B7n(B)00:15 +-[ $B1|@>$5$s(B ] @end group @end example $B%9%l%C%I$N8+$?$a$r>e5-$N$h$&$K$7$?$$>l9g$N@_Dj$O0J2<$NDL$j$G$9!#(B @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 $B;^$rI=<($7$J$$$h$&$K$7$?$$>l9g$N@_Dj$O0J2<$N$h$&$K$7$^$9!#(B @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 $B%U%#!<%k%I(B @cindex X-Mailer @cindex User-Agent @samp{X-Mailer:} $B%U%#!<%k%I$d(B @samp{User-Agent:} $B%U%#!<%k%I$K6E$j$?$$$H(B $B$$$&JQ$o$C$??M$O!"J8;zNs$r@8@.$9$k4X?t$r<+J,$N9%$-$J$h$&$KDj5A$7$F!"JQ?t(B @code{wl-generate-mailer-string-function} $B$K@_Dj$7$F$/$@$5$$!#(B @samp{User-Agent:} $B%U%#!<%k%I$rC;$/$7$?$$$N$G$"$l$P!"0J2<$N@_Dj$r$7$F$/(B $B$@$5$$!#(B @lisp @group (setq wl-generate-mailer-string-function 'wl-generate-user-agent-string-1) @end group @end lisp $B0J2<$O@_Dj$NNc$G$9!#(B @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 $B$=$NB>$N%+%9%?%^%$%:JQ?t0lMw(B $B$=$NB>$N%+%9%?%^%$%:JQ?t0lMw!#(B @table @code @item wl-default-folder @vindex wl-default-folder $B=i4|@_Dj$O(B @samp{%inbox}$B!#%U%)%k%@0\F0;~$J$I$N%G%U%)%k%HCM$H$J$j$^$9!#(B @item wl-draft-folder @vindex wl-draft-folder $B=i4|@_Dj$O(B @samp{+draft}$B!#%I%i%U%H$r%;!<%V$9$k%U%)%k%@$G$9!#(B $B=q$-9~$_$N$G$-$k%U%)%k%@$r;XDj$9$kI,MW$,$"$j$^$9!#(B IMAP $B$N%j%b!<%H%U%)%k%@$d!"(BMaildir $B$J$I$b;XDj2DG=$G$9!#(B $B$J$*!"(B@code{wl-draft-config-exec} $B$G@_Dj$5$l$?JQ?t$O(B @code{elmo-msgdb-directory} $B0J2<$KJ]B8$5$l$^$9!#$7$?$,$C$F!"(B@code{wl-draft-folder} $B$G%j%b!<%H$N%U%)%k%@(B $B$r;XDj$7$?>l9g!"%I%i%U%H$N%;!<%VA0$K(B @code{wl-draft-config-exec} $B$G@_Dj$5$l$?JQ?t(B $B$OJL$N%^%7%s$G(B @code{wl-summary-reedit} $B$G:FJT=8$7$?;~$K$O8z2L$r;}$A$^$;$s!#(B @item wl-trash-folder @vindex wl-trash-folder $B=i4|@_Dj$O(B @samp{+trash}$B!#%4%_H"%U%)%k%@$G$9!#(B $B$3$NCM$rJQ99$7$?$H$-$O(B Wanderlust $B$r:F5/F0$9$k$3$H$r$*4+$a$7$^$9!#(B @item wl-interactive-exit @vindex wl-interactive-exit $B=i4|@_Dj$O(B @code{t}$B!#(B Non-nil $B$J$i$P!"(BWanderlust $B=*N;;~$K3NG'$r9T$$$^$9!#(B @item wl-interactive-send @vindex wl-interactive-send $B=i4|@_Dj$O(B @code{t}$B!#(B Non-nil $B$J$i$P!"%a!<%kAw?.;~$KK\Ev$KAw?.$7$FNI$$$+$r3NG'$7$^$9!#(B @item wl-default-sync-range @vindex wl-default-sync-range $B=i4|@_Dj$O(B @samp{update}$B!#(B $B%G%U%)%k%H$N%5%^%j99?7%l%s%8$G!"(B@samp{all}, @samp{update}, @samp{rescan}, @samp{no-sync} $B$N$$$:$l$+$r;XDj$7$^$9!#(B $B%l%s%8$N0UL#$K$D$$$F$O(B @code{wl-summary-sync} $B$N@bL@$r;2>H$7$F2<$5$$!#(B @item wl-folder-sync-range-alist @vindex wl-folder-sync-range-alist $B=i4|@_Dj$O!"0J2<$NO"A[%j%9%H!#(B @lisp @group (("^&.*$" . "all") ("^\\+draft$\\|^\\+queue$" . "all")) @end group @end lisp @noindent $B%U%)%k%@L>$N@55,I=8=$H%5%^%j99?7%l%s%8$H$NO"A[%j%9%H$G$9!#(B $B99?7%l%s%8$K$O(B @samp{all}, @samp{update}, @samp{rescan}, @samp{no-sync} $B$N$$$:$l$+$r;XDj$7$^$9!#%^%C%A$7$J$+$C$?>l9g$O!"(B@code{wl-default-sync-range} $B$NCM(B($B=i4|CM$O(B @samp{update})$B$r;H$$$^$9!#(B $B%l%s%8$N0UL#$K$D$$$F$O(B @code{wl-summary-sync} $B$N@bL@$r;2>H$7$F2<$5$$!#(B @item wl-ask-range @vindex wl-ask-range $B=i4|@_Dj$O(B @code{t}$B!#(B @code{nil} $B$J$i!"%U%)%k%@0\F0;~$N%5%^%j99?7$G(B @code{wl-folder-sync-range-alist} $B$NCM$r;HMQ$7$^$9!#(B @item wl-mime-charset @vindex wl-mime-charset $B=i4|@_Dj$O(B @code{x-ctext}$B!#(B MIME $B$G$O$J$$%a%C%;!<%8$N>l9g(B (@samp{Content-Type:} $B$,$J$$%a!<%k$J$I(B) $B$d!"(B $B%5%^%j$NI=<($GMQ$$$i$l$k(B MIME charset $B$G$9!#(B (Nemacs $B$H$=$NB>$N(B Emacsen $B$G%5%^%j$r6&M-$7$?$$>l9g$O!"(B $B$3$NCM$r(B @code{iso-2022-jp} $B$H$7$F$/$@$5$$!#(B) @item wl-highlight-folder-with-icon @vindex wl-highlight-folder-with-icon XEmacs $B$^$?$O(B Emacs 21 $B$GM-8z$G$9!#=i4|@_Dj$O$=$N(B Emacs $B$K0MB8$7$^$9(B ($B%"%$%3%s$r;HMQ$G$-$k(B Emacsen $B$G$O(B @code{t} $B$K$J$j$^$9(B)$B!#(B @item wl-strict-diff-folders @vindex wl-strict-diff-folders $B%U%)%k%@L>$N@55,I=8=$N%j%9%H$G$9!#(B $B%U%)%k%@%b!<%I$G(B @kbd{s} $B$r2!$9$J$I$7$FL$FI$N%a%C%;!<%8?t$r(B $B%A%'%C%/$7$?>l9g!"DL>o$O4J0WE*$JJ}K!$G%A%'%C%/$7$F$$$^$9(B($B=hM}$OB.$$$,!"@53N$G$O$J$$(B)$B!#(B $B$3$NJQ?t$K%^%C%A$9$k%U%)%k%@$O87L)$K%A%'%C%/$7$^$9!#(B IMAP4 $B%U%)%k%@$KBP$9$k>r7o%U%#%k%?%U%)%k%@$N$h$&$J>l9g$K$O!"(B $B$3$NJQ?t$K%^%C%A$9$k$h$&@_Dj$9$k$HNI$$$G$7$g$&!#(B $B=i4|@_Dj$O(B @code{nil}$B!#(B @item wl-folder-use-server-diff @vindex wl-folder-use-server-diff $B%U%)%k%@%b!<%I$G(B @kbd{s} $B$r2!$9$J$I$7$FL$FI$N%a%C%;!<%8?t$r%A%'%C%/$7$?(B $B>l9g!"DL>o$O(B($B%5!<%P>e$N%a%C%;!<%8?t(B) @minus{} ($B%m!<%+%k$K$"$k%a%C%;!<%8(B $B?t(B)$B$,L$FI$H$_$J$5$l$^$9!#$7$+$7!"$3$NJQ?t$,(B non-nil $B$J$i$P!"%5!<%P>e$NL$(B $BFI$N%a%C%;!<%8?t$r%A%'%C%/$7$^$9!#(BIMAP4 $B%U%)%k%@$K$N$_1F6A$,$"$j$^$9!#$?(B $B$@$7!"JQ?t(B @code{elmo-imap4-disuse-server-flag-mailbox-regexp} $B$K%^%C%A(B $B$9$k%a!<%k%\%C%/%9$N(B IMAP4 $B%U%)%k%@$O!"$3$NJQ?t$K%^%C%A$7$F$b%5!<%P>e$N(B $BL$FI$N%a%C%;!<%8?t$r%A%'%C%/$7$^$;$s!#=i4|@_Dj$O(B @code{t}$B!#(B @item wl-auto-check-folder-name @vindex wl-auto-check-folder-name $B=i4|@_Dj$O(B @code{nil}$B!#(B $B5/F0;~$KL$FI?t$r%A%'%C%/$9$k%U%)%k%@$d%0%k!<%W$r;XDj$7$^$9!#(B $B%A%'%C%/$r9T$J$$$?$$%U%)%k%@(B($B%0%k!<%W(B)$B$N%j%9%H$r;XDj$9$k$3$H$b$G$-$^$9!#(B @code{nil} $B$J$i$P5/F0;~$K(B Desktop $BA4BN$r%A%'%C%/$7$^$9!#(B @code{none} $B$J$i$P!"5/F0;~$K2?$b%A%'%C%/$7$^$;$s!#(B @item wl-auto-uncheck-folder-list @vindex wl-auto-uncheck-folder-list $B=i4|@_Dj$O0J2<$N%j%9%H!#(B @lisp @group ("\\$.*") @end group @end lisp @noindent @code{wl-auto-check-folder-name} $B$G;XDj$5$l$?%0%k!<%W$K4^$^$l$F$$$F$b(B $B5/F0;~$KL$FI%A%'%C%/$7$J$$%U%)%k%@L>$N@55,I=8=$N%j%9%H$G$9!#(B $B$^$?!"(BDesktop $B$KBP$7$FL$FI%A%'%C%/$r$9$k:]$K$b!"$3$l$i$N%U%)%k%@$O%9%-%C%W$5$l$^$9!#(B @item wl-auto-check-folder-list @vindex wl-auto-check-folder-list $B=i4|@_Dj$O(B @code{nil}$B!#(B @code{wl-auto-uncheck-folder-list} $B$K;XDj$5$l$F$$$?$H$7$F$b(B $BNc30E*$KL$FI%A%'%C%/$7$?$$%U%)%k%@L>$N@55,I=8=$N%j%9%H$r;XDj$7$^$9!#(B @item wl-no-save-folder-list @vindex wl-no-save-folder-list $B=i4|@_Dj$O0J2<$N%j%9%H!#(B @lisp @group ("^/.*$") @end group @end lisp @noindent $B%;!<%V$7$J$$%U%)%k%@L>$N@55,I=8=$N%j%9%H$G$9!#(B @item wl-save-folder-list @vindex wl-save-folder-list $B=i4|@_Dj$O(B @code{nil}$B!#(B $B%;!<%V$9$k%U%)%k%@L>$N@55,I=8=$N%j%9%H$G$9!#(B @code{wl-no-save-folder-list} $B$h$j$bM%@h$7$^$9!#(B @item wl-folder-mime-charset-alist @vindex wl-folder-mime-charset-alist $B=i4|@_Dj$O0J2<$NO"A[%j%9%H!#(B @lisp @group (("^-alt\\.chinese" . big5) ("^-relcom\\." . koi8-r) ("^-tw\\." . big5) ("^-han\\." . euc-kr)) @end group @end lisp @noindent $B%U%)%k%@L>$N@55,I=8=$H(B MIME charset $B$NO"A[%j%9%H$G$9!#(B $B%^%C%A$7$J$+$C$?>l9g$O(B @code{wl-mime-charset} $B$,;H$o$l$^$9!#(B @item wl-folder-init-load-access-folders @vindex wl-folder-init-load-access-folders $B=i4|@_Dj$O(B @code{nil}$B!#(B $B=i4|2=;~$KFCDj$N%"%/%;%9%0%k!<%W$N$_%m!<%I$9$k>l9g$K!"$=$N%0%k!<%W$N%j(B $B%9%H$r;XDj$7$^$9!#(B @code{nil} $B$N>l9g$O(B @code{wl-folder-init-no-load-access-folders} $B$,;2>H$5$l$^$9!#(B @item wl-folder-init-no-load-access-folders @vindex wl-folder-init-no-load-access-folders $B=i4|@_Dj$O(B @code{nil}$B!#(B $B=i4|2=;~$KFCDj$N%"%/%;%9%0%k!<%W$r=|$$$F%m!<%I$9$k>l9g$K!"%m!<%I$7$J$$(B $B%"%/%;%9%0%k!<%W$N%j%9%H$r;XDj$7$^$9!#(B @code{wl-folder-init-load-access-folders} $B$,(B non-nil $B$N>l9g$OL5;k$5$l$^$9!#(B @item wl-dispose-folder-alist @vindex wl-dispose-folder-alist $B=i4|@_Dj$O0J2<$NO"A[%j%9%H!#(B @lisp @group (("^-" . remove) ("^@@" . remove)) @end group @end lisp @noindent $B=hJ,%^!<%/(B @samp{d} $B$r$D$1$?%a%C%;!<%8$r=hJ,$9$kJ}?K$r@_Dj$7$^$9!#(B $B%j%9%H$N3FMWAG$O%U%)%k%@$H=hJ,@h$K$J$C$F$*$j!"=hJ,@h$K$O(B : @code{wl-trash-folder} $B$K0\F0$9$k!#(B @end example @item wl-x-face-file @vindex wl-x-face-file $B=i4|@_Dj$O(B @file{~/.xface}$B!#(B $B%(%s%3!<%I:Q$_$N(B X-Face $BJ8;zNs$rFbMF$H$9$k%U%!%$%kL>$G$9!#(B @xref{x-face-mule}. @item wl-demo-display-logo @vindex wl-demo-display-logo Non-nil $B$J$i$P%*!<%W%K%s%0%G%b$G%S%C%H%^%C%W$N%$%a!<%8$rI=<($7$^$9!#(B @code{xpm}, @code{xbm} $B$r;XDj$9$k$H(B($B2DG=$J$i$P(B)$B!"$=$N2hA|%?%$%W$N%$%a!<(B $B%8$rI=<($7$^$9!#(B @item elmo-use-database @vindex elmo-use-database XEmacs $B$N$_M-8z$G$9!#=i4|@_Dj$O!"(BXEmacs $B$K0MB8$7$^$9!#(B (dbm $B$N5!G=$r$b$D(B XEmacs $B$J$i$P(B @code{t} $B$H$J$j$^$9!#(B) Non-nil $B$J$i$P(B dbm $B$r;H$C$F(B Message-ID $B$N4IM}$r9T$J$$$^$9!#(B @item elmo-nntp-list-folders-use-cache @vindex elmo-nntp-list-folders-use-cache $B=i4|@_Dj$O(B 600 ($BIC(B)$B!#(B NNTP $B$K$*$$$F(B @samp{list} $B$d(B @samp{list active} $B$N7k2L$r(B $B%-%c%C%7%e$7$F$*$/;~4V$rICC10L$G;XDj$7$^$9!#(B @code{nil} $B$J$i%-%c%C%7%e$7$^$;$s!#(B @item elmo-nntp-max-number-precedes-list-active @vindex elmo-nntp-max-number-precedes-list-active $B=i4|@_Dj$O(B @code{nil}$B!#(B NNTP $B$K$*$$$F(B @samp{list active} $B$N7k2LF@$i$l$k5-;vHV9f$r(B $B%U%)%k%@$N:GBg5-;vHV9f$H$7$FMxMQ$7$^$9!#(B NNTP $B%5!<%P$H$7$F(B INN 2.3 $B$J$I$r;HMQ$7$F$$$F!"%U%)%k%@%b!<%I$G$N4{FI?t(B $B$,0lCW$7$J$$>l9g$O(B @code{t} $B$K$7$F$/$@$5$$!#(B @c non-nil means? @item elmo-nntp-default-use-listgroup @vindex elmo-nntp-default-use-listgroup $B=i4|@_Dj$O(B @code{t}$B!#(B Non-nil $B$J$i!"(BNNTP $B$K$*$$$F(B $BAm5-;v?t$rD4$Y$k$?$a$K(B @samp{listgroup} $B$r;H(B $B$$$^$9!#(B@code{nil} $B$J$i$P(B @samp{group} $B$N7k2L$rMQ$$$^$9!#(B@samp{group} $B$r;H$&$H!"(B $B@53N$5$K$O7g$1$^$9$,!"pJs$rl9g$,$"$k$h$&$G$9!#(B POP3 $B;2>H;~$K=hM}$,%O%s%0$9$k$h$&$J>l9g$O!"(B@code{t} $B$K$9$k$HNI$$$+$b$7$l$^$;$s!#(B @item elmo-dop-flush-confirm @vindex elmo-dop-flush-confirm $B=i4|@_Dj$O(B @code{t}$B!#(B Non-nil $B$J$i$P%*%U%i%$%s=hM}$GN/$C$?=hM}$rl9g!"(B $B$=$N%;%C%7%g%s$O:FMxMQ$5$l$^$;$s!#(Bnil $B$J$i!"L5>r7o$K:FMxMQ$7$^$9!#(B @end table @node Hooks, , Customizable Valiables, Advanced Issues @section $B%U%C%/(B (Not yet written) @node Migration, Terminology, Advanced Issues, Top @chapter $B5l%P!<%8%g%s$+$i$N0\9T(B @cindex Migration $B$3$N>O$G$O!"0JA0$N%P!<%8%g%s$+$i0\9T$9$k>l9g$KI,MW$J@_Dj$NJQ99$d!"@)8BEy(B $B$K$D$$$F@bL@$7$^$9!#(B @menu * Before 2.12.0:: 2.12.0 $B$h$jA0$N%P!<%8%g%s$+$i$N0\9T(B @end menu @node Before 2.12.0, , Migration, Migration @section 2.12.0 $B$h$jA0$N%P!<%8%g%s$+$i$N0\9T(B @subsection msgdb $B$NJQ49$K$D$$$F(B 2.12.0 $B$h$jA0$N%P!<%8%g%s$+$i!"(Bmsgdb $B$N9=B$$,JQ99$5$l$F$$$^$9!#0J8e!"?7(B $B$7$/:n@.$7$?%U%)%k%@$N(B msgdb $B$O!"$3$N?7$7$$7A<0$G:n@.(B/$BJ]B8$5$l$^$9!#0JA0(B $B$N(B msgdb $B$N7A<0$r$=$N$^$^;H$$B3$1$k>l9g$K$O!"(B@file{~/.wl} $BEy$K0J2<$N@_Dj(B $B$r5-=R$7$^$9!#(B @lisp @group (setq elmo-msgdb-default-type 'legacy) @end group @end lisp $B0JA0$N%P!<%8%g%s$G:n@.$5$l$?(B msgdb $B$O!"%G%U%)%k%H$N@_Dj$G$O%m!<%I$5$l$?;~(B $B$K<+F0E*$K?7$7$$7A<0$N(B msgdb $B$KJQ49$5$l$^$9!#<+F0E*$K(B msgdb $B$N7A<0$rJQ49(B $B$7$J$$$h$&$K$9$k$K$O!"0J2<$N$$$:$l$+$N@_Dj$r(B @file{~/.wl} $BEy$K5-=R$7$^$9!#(B @lisp @group ;; @r{msgdb $B$r%m!<%I$7$?;~$K(B @code{elmo-msgdb-default-type} $B$H(B} ;; @r{$B0[$J$C$?7A<0$@$C$?>l9g$K<+F0E*$KJQ49$9$k>l9g(B ($B%G%U%)%k%H(B)} (setq elmo-msgdb-convert-type 'auto) ;; @r{$B%5%^%j$G(B @kbd{s all} $B$7$?;~$KJQ49$9$k>l9g(B} (setq elmo-msgdb-convert-type 'sync) ;; @r{$BJQ49$7$J$$>l9g(B} (setq elmo-msgdb-convert-type nil) @end group @end lisp $B>e=R$NMM$K0JA0$N(B msgdb $B$N$^$^;H$$B3$1$k;v$b=PMh$^$9$,!"$=$N>l9g$K$O0J2<(B $B$N@)8B$,$"$j$^$9!#(B @enumerate @item $BE>Aw:Q$_%^!<%/(B (@samp{F}, @samp{f}) $B$,;HMQ=PMh$^$;$s!#(B @item @samp{important} $B0J30$N%0%m!<%P%k%U%i%0$,;HMQ=PMh$^$;$s!#(B @end enumerate @subsection @samp{'mark} $B%U%)%k%@$+$i(B @samp{'flag} $B%U%)%k%@$X$NJQ99(B $B?7$7$$%P!<%8%g%s$N(B Wanderlust $B$r5/F0$7$?;~$K(B @samp{'mark} $B%U%)%k%@$K$"$C(B $B$?%a%C%;!<%8$O!"(B@samp{'flag} $B%U%)%k%@$K<+F0E*$K0z$-7Q$,$l$^$9!#C"$7!"$3(B $B$&$d$C$F0z$-7Q$$$@%a%C%;!<%8$K$O!"0J2<$N@)8B$,$"$j$^$9!#(B @enumerate @item @samp{'flag} $B%U%)%k%@$G%a%C%;!<%8$r>C$7$F$b85$N%a%C%;!<%8$N(B @samp{important} $B%U%i%0$O>C$($^$;$s!#(B @item $B85$N%a%C%;!<%8$N(B @samp{important} $B%U%i%0$r>C$7$F$b(B @samp{'flag} $B%U%)%k%@(B $B$+$i$O:o=|$5$l$^$;$s!#(B @item help-echo $B$G!"85$N%a%C%;!<%8$,I=<($5$l$^$;$s!#(B @end enumerate $B$b$7$b!"<+F0$G$N0z$-7Q$.$,>el9g$O!"(B@kbd{M-x elmo-global-mark-upgrade} $B$ro$N%5%^%j$OGK4~$5$l$^$9$,!"(B @kbd{q} $B$d(B @kbd{g} $B$G%5%^%j$rH4$1$F$bGK4~$5$l$:$K;D$k!"(B $BFCJL$J%5%^%j$r;X$7$^$9!#(B @xref{Sticky Summary}. @item $B%(%/%9%Q%$%"(B (expire) $B4|8B@Z$l%a%C%;!<%8$r<+F0E*$K:o=|$7$?$j%"!<%+%$%V$7$?$j$9$k$3$H!#(B @xref{Expire}. @item $B%9%3%"(B (score) @xref{Scoring}. @item $B%W%j%U%'%C%A(B (prefetch) $B%*%U%i%$%s$G%a%C%;!<%8$rFI$`$?$a$K!"$"$i$+$8$a%a%C%;!<%8$r%-%c%C%7%e(B $B$7$F$*$/$3$H$r$$$$$^$9!#(B @end table @node Mailing List, Addition, Terminology, Top @chapter $B%a!<%j%s%0%j%9%H(B @cindex Bug report @cindex Backtrace Wanderlust $B$K4X$9$k5DO@$O0J2<$N%a!<%j%s%0%j%9%H$G9T$o$l$^$9!#(B $B:G?7%P!<%8%g%s$N%"%J%&%s%9$b$3$A$i$KN.$l$^$9!#(B @display Wanderlust Mailing List @t{} @end display $B$3$3$G$O} @end display $B$b$"$j$^$9(B($B$3$A$i$KEj9F$5$l$?%a%C%;!<%8$OA0l9g$O%P%C%/%H%l!<%9$rl$re$2$^$9!#(B @section $B%"!<%+%$%V(B $B%a!<%j%s%0%j%9%H$KEj9F$5$l$?%a%C%;!<%8$O!"%&%'%V$d(B NetNews $B$G$bFI$`$3$H(B $B$,$G$-$^$9!#(B @t{} $B$KEj9F$5$l$?%a%C%;!<%8(B @example @uref{http://dir.gmane.org/gmane.mail.wanderlust.general.japanese} @uref{news://news.gmane.org/gmane.mail.wanderlust.general.japanese} @end example @t{} $B$KEj9F$5$l$?%a%C%;!<%8(B @example @uref{http://dir.gmane.org/gmane.mail.wanderlust.general} @uref{news://news.gmane.org/gmane.mail.wanderlust.general} @end example @node Addition, Index, Mailing List, Top @chapter $B$*$^$1(B @section $BN,Nr(B @example 1998 3/05 MH $B%a%C%;!<%8$r%9%l%C%II=<($9$k%W%m%H%?%$%W$r:n$C$F$_$k!#(B 3/10 elisp $B$K$h$k(B msgdb $B$N$7$/$_$r$D$/$k!#(B 3/26 IMAP $B$H(B NNTP $B$b%9%l%C%II=<($G$-$k$h$&$K$J$k!#(B 4/13 $B%9%l%C%II=<(MQ%b%8%e!<%k$r(B elmo $B$H$7$F$^$H$a$O$8$a$k!#(B 5/01 0.1.0 $B%\%m%\%m$N(B initial version $B$,40@.!#(B 6/12 tm-ja ML $B$G!"(BIMAP $BBP1~$N(B elisp $B%a!<%i$r:n$C$F$$$k!"(B $B$H$D$$8}$r3j$Y$i$;$F$7$^$&!#(B 6/16 tm-ja, elips ML $B$G(B 0.1.3 $B$r%"%J%&%s%9!#(B 6/22 $BKLL\$5$s$N$*$+$2$G(B northeye.org $B$G%a!<%j%s%0%j%9%H$,%9%?!<%H!#(B 7/01 mm-backend $BBP1~(B(0.3.0)$B!#(B 8/25 multi $B%U%)%k%@DI2C(B(0.5.0)$B!#(B 8/28 filter $B%U%)%k%@DI2C(B(0.5.1)$B!#(B 9/10 $B%9%l%C%I$,3+JD$G$-$k$h$&$K$J$k(B(0.6.0)$B!#(B 9/11 fldmgr by $BB$5$s(B(0.6.3)$B!#(B 9/24 $B%9%l%C%I$N;^$rI=<((B(0.6.5)$B!#(B 9/28 $B05=L%U%)%k%@$,%^%k%A%"!<%+%$%P$KBP1~(B by $B1|@>$5$s!#(B 10/28 $B%*%U%i%$%s=hM}(B (0.7.4)$B!#(B 12/09 $B%Y!<%?%P!<%8%g%s$K!#(B 12/21 wl-expire by $BB$75!G=!u9bB.2=(B with $BB\$7$$JQA+$O(B @file{ChangeLog} $B$r8fMw$/$@$5$$!#(B @section $BL>A0(B Wanderlust $B$K$O!"8&5f(B $BJ|O2JJ!$(B $BN99TG.!$(B $BN9?4!'(B have $B!A(B $BJ|O2JJ$,$"$k!%(B @end display @noindent $B$H$$$&0UL#$,$"$j$^$9!#$,!"L>A0$K$?$$$7$F?<$$0U?^$O$"$j$^$;$s!#(B ($B6/$$$F8@$($P!"(BIMAP @result{} $B$I$3$G$b%a!<%k$,FI$a$k(B @result{} $BJ|O2JJ(B ?) elmo $B$O!"(B@samp{Elisp Library for Message Orchestration} $B$NN,$G$9!#(B $B:G=i$O$"$N@V$$$L$$$0$k$_$N$D$b$j$G$7$?$,!"J|O2(B @result{} $BI:N.(B @result{} $BF;I8(B @result{} St.@: Elmo's fire @result{} elmo $B$H$$$&!"(B $B$=$l$C$]$$O"A[$b2DG=$G$9!#(B @section $B%3!<%I%M!<%`(B $B3F%P!<%8%g%s$K$O%3!<%I%M!<%`$,$D$$$F$$$^$9(B($B$[$H$s$I>iCL$G$9(B)$B!#(B $B$$$^$N$H$3$m(B 1980 $BG/Be$NJF%S%k%\!<%I;o%H%C%W(B 40 $B%R%C%H(B (@uref{http://ntl.matrix.com.br/pfilho/html/top40/}) @noindent $B$+$i%"%k%U%!%Y%C%H=g$KE,Ev$K9%$-$J$b$N$r%T%C%/%"%C%W$7$F;H$C$F$$$^$9!#(B @node Index, , Addition, Top @unnumbered $B:w0z(B @menu * Concept Index:: $B35G0:w0z(B * Key Index:: $B%-!<%P%$%s%I:w0z(B * Variable Index:: $BJQ?t:w0z(B * Function Index:: $B4X?t:w0z(B @end menu @node Concept Index, Key Index, Index, Index @unnumberedsec $B35G0:w0z(B @printindex cp @node Key Index, Variable Index, Concept Index, Index @unnumberedsec $B%-!<%P%$%s%I:w0z(B @printindex ky @node Variable Index, Function Index, Key Index, Index @unnumberedsec $BJQ?t:w0z(B @printindex vr @node Function Index, , Variable Index, Index @unnumberedsec $B4X?t:w0z(B @printindex fn @summarycontents @contents @bye @c Local Variables: @c fill-column: 72 @c End: wanderlust-wanderlust-912c443/doc/wl-refcard-ja.tex000066400000000000000000000312101262320455600222520ustar00rootroot00000000000000% Reference Card for Wanderlust % The format of this file is adapted from the GNU Emacs reference card % % You can compile with: % ptex wl-refcard-ja.tex % dvips wl-refcard-ja.dvi -t landscape -o wl-refcard-ja.ps % pstops '2:0U(21cm,29.7cm),1' wl-refcard-ja.ps wl-refcard-ja-b.ps % 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 $B$N5/F0(B} \key{Wanderlust $B$r5/F0$9$k(B}{M-x wl} \key{$B%a%C%;!<%8$r:n@.(B}{M-x wl-draft} \section{Folder Mode} \key{Wanderlust $B$r$d$a$k(B}{q} \key{$B} \key{$BD>A0$K8+$?%a%C%;!<%8(B}{TAB} \key{$B%a%C%;!<%8$rFI$`(B}{SPC} \key{$B%a%C%;!<%8$N:FFI9~(B}{C-u .} \key{$B%a%C%;!<%8I=<($N%H%0%k(B}{v} \key{$B%a%C%;!<%8$r:n@.(B}{w} \key{$B%a%C%;!<%8$r:n@.(B($B08@h$r?dB,(B)}{W} \key{$BJV?.(B}{a} \key{$B0zMQ$7$FJV?.(B}{A} \key{$B%U%)%o!<%I(B}{f} \key{$B:FJT=8(B}{E} \key{$B0u:~(B}{\#} \key{$B%a%C%;!<%8%P%C%U%!$X(B}{j} \key{$B%"%I%l%9D"$N:FFI9~(B}{Z} \section{mark command} \key{$B=hJ,%^!<%/$rIU$1$k(B}{d} \key{$B:o=|%^!<%/$rIU$1$k(B}{D} \key{$B%j%U%!%$%k%^!<%/$rIU$1$k(B}{o} \key{$B%3%T!<%^!<%/$rIU$1$k(B}{O} \key{$B%W%j%U%'%C%A%^!<%/$rIU$1$k(B}{i} \key{$B:FAw%^!<%/$rIU$1$k(B}{\~{}} \key{$B=EMW%^!<%/$rIU$1$k(B}{\$} \key{$BI8E*%^!<%/$rIU$1$k(B}{*} \key{$BA4$F$N%a%C%;!<%8$rI8E*$K$9$k(B}{m a} \key{$B%9%l%C%I$rI8E*$K$9$k(B}{m t} \key{$B%a%C%;!<%8$rA*$S=P$7$FI8E*$K(B}{?} \key{$BI8E*$NCf$+$i%a%C%;!<%8$rA*$S=P$9(B}{m *} \key{$BI8E*$r%j%U%!%$%k(B}{m o} \key{$BI8E*$r:o=|(B}{m d} \key{$BI8E*$r0u:~(B}{m \#} \key{$BI8E*$N3F!9$r%Q%$%W$KN.$9(B}{m |} \key{$B0l;~E*%^!<%/$N%"%/%7%g%s$r$NA^F~(B}{C-c C-w} \key{$BNN0h$r>J$/(B}{C-c C-d} \key{$B%W%l%S%e!<(B}{C-c C-p} \key{$BAw?.(B}{C-c C-c} \key{$BAp9F$rJ]B8(B}{C-c C-z} \key{$BAp9F$rGK4~(B}{C-c C-k} \key{$BB>$N%I%i%U%H$X(B}{C-c C-o} \key{$B%U%!%$%k$rE:IU(B}{C-c C-x TAB} %\key{Insert a reference to external body}{C-c C-x C-e} \key{MIME $B%?%0$NA^F~(B}{C-c C-x t} %\key{Insert a text message}{C-c C-x C-t} \key{$B%a%C%;!<%8$r0E9f2=(B}{C-c C-x e} \key{$B%a%C%;!<%8$K=pL>(B}{C-c C-x s} \key{MIME-Edit $B$N%X%k%W(B}{C-c C-x ?} \shortcopyrightnotice \newcolumn \section{Plugged Status} \key{$B%W%i%0>uBV$N%H%0%k(B($BA4BN(B)}{M-t} \key{$B%W%i%0%I%b!<%I$X$NF~B`=P(B}{C-t} \key{$B%W%i%0>uBV$N%H%0%k(B($B8DJL(B)}{SPC} \section{Address Book Management} \key{$B%"%I%l%9%^%M!<%8%c$N5/F0(B}{C-c C-a} \key{$B%"%I%l%9%^%M!<%8%c$N=*N;(B}{q} \key{{\tt To:} $B$K;XDj(B}{t} \key{{\tt Cc:} $B$K;XDj(B}{c} \key{{\tt Bcc:} $B$K;XDj(B}{b} \key{$B08@h$N;XDj$r2r=|(B}{u} \key{$B;XDj$K1h$C$F%a%C%;!<%8$r:n@.(B}{x} \key{$B?75,EPO?(B}{a} \key{$BJT=8(B}{e} \key{$B:o=|(B}{d} \copyrightnotice \bye % Local variables: % compile-command: "tex refcard" % End: wanderlust-wanderlust-912c443/doc/wl-refcard.tex000066400000000000000000000312441262320455600216710ustar00rootroot00000000000000% Reference Card for Wanderlust % The format of this file is adapted from the GNU Emacs reference card % % You can compile with: % tex wl-refcard.tex % dvips wl-refcard.dvi -t landscape -o wl-refcard.ps % pstops '2:0U(21cm,29.7cm),1' wl-refcard.ps wl-refcard-b.ps % 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-912c443/doc/wl.texi000066400000000000000000011007061262320455600204370ustar00rootroot00000000000000\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 (XEmacs and Emacs 21). @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 Mule 2.3 based on Emacs 19.34 @item Emacs 20.2 or later @item XEmacs 20.4 or later @item Meadow 1.00 or later @item NTEmacs 20.4 or later @item PMMule @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, FLIM and SEMI beforehand to use Wanderlust. For Emacs 23 or later, downloading from below URLs is highly recommended. SEMI-EPG is corresponding package to SEMI. @example @group APEL: @uref{https://github.com/wanderlust/apel} FLIM: @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, FLIM and SEMI[-EPG] in this order. Generally, @samp{make install} will do the job. (In XEmacs 21, @samp{make install-package}.) Refer to the documents of each package for detailed installation procedure @footnote{If you want to use SEMI on Emacs 19.34. @* @uref{http://www.jpl.org/ftp/attic/INSTALL-SEMI-ja.html} (In Japanese) may help you.}. Recommended combination of APEL, FLIM and SEMI are following: @itemize @minus @item APEL 10.8, FLIM 1.14.9, SEMI-EPG 1.14.7 @end itemize You can also use many other FLIM/SEMI variants. Combination of the latest versions should work. For example, the following combination are confirmed to work. @itemize @minus @item APEL 10.6, SLIM 1.14.9, SEMI 1.14.5 @item APEL 10.6, CLIME 1.14.5, EMIKO 1.14.1 @end itemize You have to re-install Wanderlust if you upgraded APEL, FLIM or SEMI. @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. 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. For the formal SSL (generic SSL), Emacs 24 or later uses built-in GnuTLS if available. if not available, Emacs try to use @file{tls.el}. 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}. 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} neither @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 are using an Emacs variant which does not merge specified directory to @code{load-path} (e.g. Mule 2.3 based on Emacs 19.28), then you will see the error message: @example Cannot open load file: mime-setup @end example @noindent In this case, either add destination directories of custom, APEL, FLIM and SEMI to environmental variable @env{EMACSLOADPATH}, or define @code{load-path} in @file{WL-CFG} in extracted directory. If you want to handle shimbun folders or to use BBDB, add directory where emacs-w3m or BBDB is installed to @code{load-path}. Then necessary modules will be byte-compiled and installed. @xref{Shimbun Folder}, @xref{BBDB}. @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 Install as a XEmacs package @cindex XEmacs package @cindex XEmacs package install @cindex Package, XEmacs @cindex Package install, XEmacs @c @cindex install-package It is possible to install Wanderlust as one of packages of XEmacs (21.0 or later). Configuration for autoload and icon-path in local @file{~/.emacs} files are no longer necessary, if you install Wanderlust as a package. Follow the next example to install Wanderlust as an XEmacs package. @example @group % vi Makefile % make package % make install-package @end group @end example package directory is auto-probed, if SEMI is installed. (you can also specify it with @code{PACKAGEDIR} in @file{Makefile}) @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 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 @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} ;; @r{(Not required if you have installed Wanderlust 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) ;; @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, , ,emacs, The Emacs Editor}. @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 @pindex Mule-UCS @pindex ucs-conv You can use international mailbox names in @var{mailbox} part, if you are using Emacs with UTF-7 support and @code{elmo-imap4-use-modified-utf7} is set to non-nil value (default value is @code{t} on Emacs 23 or later and @code{nil} on other Emacsen). Emacs 23 or later doesn't need additional package. Other Emacsen needs Mule-UCS package to use UTF-7. Mule-UCS works on following Emacsen. @itemize @bullet @item Emacs 20.3 or later @item XEmacs 21.2.37 or later @end itemize You can obtain Mule-UCS package (snapshot of 2004) from following URL. @example @uref{http://www.jpl.org/ftp/pub/tmp/} @end example @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}. On the OS/2, there is a great difference between Mule2.3(19.28) and Emacs20.2 in processing speed. For comfortable use, Emacs20 is recommended. (If re-search's performance is the problem, 19.3x or later may be okay.) 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 To use apop as an @var{authenticate-type}, @file{md5.el} is needed (XEmacs doesn't need @file{md5.el}). @file{md5.el} is included in @file{utils/sasl/lisp/} or Emacs/W3 package (@uref{http://www.cs.indiana.edu/elisp/w3/docs.html}) or LCD archive (GPL2). 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 * 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, mu, namazu, Search Folder @subsection grep @pindex grep 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 @node mu, notmuch, grep, 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. (In XEmacs, it looks much nicer @t{;-)}) @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. A operation to a folder group is treated as operations on the children folders. For example, when you type @kbd{s} on @samp{[-]Emacsen}, six children folders update its 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 folder is 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 group is opened. (@code{wl-folder-open-all}) @item ] @kindex ] (Folder) @findex wl-folder-close-all All folder group is 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 M-s @kindex M-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 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 exists 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 suummary 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 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 %5n -> `1 ' %-05n -> `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 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 in Emacs 20.x. 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:}. If @code{elmo-use-database} is non-nil, other folder is also searched. (@code{wl-summary-jump-to-msg-by-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 descending 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 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-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 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}). 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} (on GNU Emacs) or @code{zmacs-regions} (on XEmacs) 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. You can resume editing by pressing @kbd{E} (@code{wl-summary-reedit}) in the @samp{+draft} folder. (@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). @code{keep} is to use current window, @code{full} is to use full frame window, @code{split} is to split current window and use it. 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. @code{keep} is to use message buffer window, @code{full} is to use full frame window, @code{split} is to split message buffer window and use it. 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 has 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-message-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} hide 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}, 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}. @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 divedes messages depending on its 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. Per default, this variable include 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, The gnus Newsreader}. @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, The gnus Newsreader}. @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 chars lines xref extra localdir,localnews Y E E E nntp (supporting xover) Y E E N (otherwise) N E E E imap4 Y E E E pop3 N E E E 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. If your emacs does not have LDAP feature as built-in feature (Currently only XEmacs can have built-in LDAP feature), you 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:: Setup * Searching:: Searching @end menu @node Setup @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 Searching @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 To use The Insidious Big Brother Database (@uref{http://bbdb.sourceforge.net/}) with Wanderlust, place @file{util/bbdb-wl.el} on the @code{load-path} and do the following settings. But, @file{util/bbdb-wl.el} is not compatible with BBDB 3.x (@uref{http://savannah.nongnu.org/projects/bbdb/}). For BBDB 3.x, BBDBV3-Wl (@uref{https://gna.org/projects/bbdbv3-wl/}) may be useful. If BBDB is on the @code{load-path} at the installation, @file{bbdb-wl.el} is byte-compiled and installed. @xref{Install}. @lisp @group (require 'bbdb-wl) (bbdb-wl-setup) ;; @r{enable pop-ups} (setq bbdb-use-pop-up t) ;; @r{auto collection} (setq bbdb/mail-auto-create-p t) ;; @r{exceptional folders against auto collection} (setq bbdb-wl-ignore-folder-regexp "^@@") (setq signature-use-bbdb t) (setq bbdb-north-american-phone-numbers-p nil) ;; @r{shows the name of bbdb in the summary} :-) (setq wl-summary-from-function 'bbdb-wl-from-func) ;; @r{automatically add mailing list fields} (add-hook 'bbdb-notice-hook 'bbdb-auto-notes-hook) (setq bbdb-auto-notes-alist '(("X-ML-Name" (".*$" ML 0)))) @end group @end lisp You can complete address with BBDB by @kbd{M-@key{TAB}} in draft buffer. @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. If you use mu-cite version 8.0 or earlier: @lisp @group (autoload 'mu-cite/cite-original "mu-cite" nil t) (setq mail-citation-hook 'mu-cite/cite-original) @end group @end lisp If you use mu-cite version 8.1 or later: @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-xmas:: XEmacs case * 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-xmas, x-face-mule, X-Face, X-Face @subsubsection x-face-xmas (for XEmacs) @pindex x-face-xmas If you use @file{x-face-xmas.el} in x-face (@uref{ftp://jpl.org/pub/elisp/}) 1.3.6.13 or later, do the following: @lisp @group (autoload 'x-face-xmas-wl-display-x-face "x-face") (setq wl-highlight-x-face-function 'x-face-xmas-wl-display-x-face) @end group @end lisp @node x-face-mule, , x-face-xmas, X-Face @subsubsection x-face-mule (for Emacs) @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 (for Emacs 21.x) @pindex x-face-e21 With Emacs 21.x, 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-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}. @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-alist} per connection. You should be careful that others might read your passwords if they can touch your Emacs, since encoded plain passwords are there. 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 not 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 @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 This is meaningful for XEmacs or Emacs 21.. The initial setting depends on Emacsen (@code{t} for XEmacs or Emacs 21 with icons). @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-use-database @vindex elmo-use-database This is meaningful for XEmacs only. The initial setting depends on XEmacs (@code{t} for XEmacs with dbm). If non-nil, Message-ID is controlled by dbm. @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 can post to the mailing list even though you are not a member of it. 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 on the web or in NetNews. Read messages posted to @t{} @example @uref{http://dir.gmane.org/gmane.mail.wanderlust.general.japanese} @uref{news://news.gmane.org/gmane.mail.wanderlust.general.japanese} @end example Read messages posted to @t{} @example @uref{http://dir.gmane.org/gmane.mail.wanderlust.general} @uref{news://news.gmane.org/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-912c443/elmo/000077500000000000000000000000001262320455600173045ustar00rootroot00000000000000wanderlust-wanderlust-912c443/elmo/ChangeLog000066400000000000000000013137251262320455600210720ustar00rootroot000000000000002015-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-912c443/elmo/acap.el000066400000000000000000000660201262320455600205360ustar00rootroot00000000000000;;; acap.el --- An ACAP interface. ;; 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: (eval-when-compile (require 'cl)) (require 'pces) (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 passphrase mechanism 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 cont-string) (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 (not (eq (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 (not (eq (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 (not (eq (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 (not (eq (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. (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) (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) (format-time-string "%Y%m%d%H%M%S" (current-time) t)) ; Universal time. (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-912c443/elmo/elmo-access.el000066400000000000000000000105531262320455600220250ustar00rootroot00000000000000;;; elmo-access.el --- Auto Collect Multiple Folder Interface for ELMO. ;; 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 (lambda (f) (elmo-folder-name-internal f)) (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-912c443/elmo/elmo-archive.el000066400000000000000000001126621262320455600222110ustar00rootroot00000000000000;;; elmo-archive.el --- Archive folder of ELMO. -*- coding: euc-japan -*- ;; 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: ;; (eval-when-compile (require 'cl)) (require 'elmo) (require 'elmo-msgdb) ;;; 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 (eq 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")))) ;;; GNU tar (*.tar) (defvar elmo-archive-tar-method-alist (if elmo-archive-lha-dos-compatible '((ls . ("gtar" "-tf")) (cat . ("gtar" "--posix Oxf")) (ext . ("gtar" "-xf")) ;;; (rm . ("gtar" "--posix" "--delete" "-f")) ; well not work ) '((ls . ("gtar" "-tf")) (cat . ("gtar" "-Oxf")) (ext . ("gtar" "-xf")) ;;; (rm . ("gtar" "--delete" "-f")) ; well not work ))) ;;; GNU tar (*.tar.gz, *.tar.Z, *.tar.bz2) (defvar elmo-archive-tgz-method-alist '((ls . ("gtar" "-ztf")) (cat . ("gtar" "-Ozxf")) (create . ("gtar" "-zcf")) ;;; (rm . elmo-archive-tgz-rm-func) (cp . elmo-archive-tgz-cp-func) (mv . elmo-archive-tgz-mv-func) (ext . ("gtar" "-zxf")) ;; tgz special method (decompress . ("gzip" "-d")) (compress . ("gzip")) (append . ("gtar" "-uf")) ;;; (delete . ("gtar" "--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 buf 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 (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)) (prefix (elmo-archive-folder-archive-prefix-internal folder)) (p-method (elmo-archive-get-method dst-type 'cp-pipe)) (n-method (elmo-archive-get-method dst-type 'cp)) src tmp newfile) (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 default-enable-multibyte-characters) (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-create-msgdb (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 (delim2 elmo-unixmail-delimiter) ;; UNIX Mail (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))) ;;; ((looking-at delim2) ; UNIX MAIL ;;; (elmo-msgdb-append ;;; new-msgdb ;;; (elmo-archive-parse-unixmail 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 default-enable-multibyte-characters) (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-912c443/elmo/elmo-cache.el000066400000000000000000000132451262320455600216300ustar00rootroot00000000000000;;; elmo-cache.el --- Cache modules for ELMO. ;; 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) (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 "^[^@]+@[^@]+$" 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-as-binary 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-912c443/elmo/elmo-database.el000066400000000000000000000043631262320455600223320ustar00rootroot00000000000000;;; elmo-database.el --- Database module for ELMO. ;; 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-vars) (defvar elmo-database-msgid nil) (defvar elmo-database-msgid-filename "msgid") (defun elmo-database-get (dbsym dbname) (if (not (and (symbol-value dbsym) (database-live-p (symbol-value dbsym)))) (set dbsym (open-database (expand-file-name dbname elmo-msgdb-directory ))) (symbol-value dbsym))) (defun elmo-database-close () (and elmo-database-msgid (database-live-p elmo-database-msgid) (close-database elmo-database-msgid))) (defun elmo-database-msgid-put (msgid folder number) (let ((db (elmo-database-get 'elmo-database-msgid elmo-database-msgid-filename)) print-length) (and msgid db (progn (remove-database msgid db) (put-database msgid (prin1-to-string (list folder number)) db))))) (defun elmo-database-msgid-delete (msgid) (remove-database msgid (elmo-database-get 'elmo-database-msgid elmo-database-msgid-filename))) (defun elmo-database-msgid-get (msgid) (let ((match (get-database msgid (elmo-database-get 'elmo-database-msgid elmo-database-msgid-filename)))) (and match (read match)))) (require 'product) (product-provide (provide 'elmo-database) (require 'elmo-version)) ;;; elmo-database.el ends here wanderlust-wanderlust-912c443/elmo/elmo-date.el000066400000000000000000000227101262320455600214770ustar00rootroot00000000000000;;; elmo-date.el --- Date processing module for ELMO. ;; 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) (eval-when-compile (require 'cl)) (defmacro elmo-match-substring (pos string from) "Substring of POSth matched string of STRING." `(substring ,string (+ (match-beginning ,pos) ,from) (match-end ,pos))) ;; 2012-08-26 (make-obsolete 'elmo-match-string 'match-string) (defmacro elmo-match-buffer (pos) "Substring POSth matched from the current buffer." (if (fboundp 'match-string-no-properties) `(match-string-no-properties ,pos) `(buffer-substring-no-properties (match-beginning ,pos) (match-end ,pos)))) (eval-and-compile (cond ((fboundp 'replace-regexp-in-string) (defun elmo-replace-in-string (str regexp newtext &optional literal) "Replace all matches in STR for REGEXP with NEWTEXT string. And returns the new string. Optional LITERAL non-nil means do a literal replacement. Otherwise treat \\ in NEWTEXT string as special: \\& means substitute original matched text, \\N means substitute match for \(...\) number N, \\\\ means insert one \\." (replace-regexp-in-string regexp newtext str t literal)) ) (t ;; from subr.el (defun elmo-replace-in-string (str regexp newtext &optional literal) "Replace all matches in STR for REGEXP with NEWTEXT string. And returns the new string. Optional LITERAL non-nil means do a literal replacement. Otherwise treat \\ in NEWTEXT string as special: \\& means substitute original matched text, \\N means substitute match for \(...\) number N, \\\\ means insert one \\." (let ((rtn-str "") (start 0) (special) match prev-start) (while (setq match (string-match regexp str start)) (setq prev-start start start (match-end 0) rtn-str (concat rtn-str (substring str prev-start match) (cond (literal newtext) (t (mapconcat (lambda (c) (if special (progn (setq special nil) (cond ((eq c ?\\) "\\") ((eq c ?&) (match-string 0 str)) ((and (>= c ?0) (<= c ?9)) (if (> c (+ ?0 (length (match-data)))) ;; Invalid match num (error "Invalid match num: %c" c) (setq c (- c ?0)) (match-string c str))) (t (char-to-string c)))) (if (eq c ?\\) (progn (setq special t) nil) (char-to-string c)))) newtext "")))))) (concat rtn-str (substring str start)))) ))) (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-in-string description "-" " ") " 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 mday) (let ((wday (symbol-value (intern (format "elmo-weekday-name-%s" elmo-lang)))) y1 days p) (setq y1 (- year 1)) (setq days (- (+ (* y1 365) (/ y1 400) (/ y1 4)) (/ y1 100))) (setq p 1) (while (< p month) (setq days (+ days (timezone-last-day-of-month p year))) (setq p (+ p 1))) (setq days (+ days mday)) (aref wday (% days 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 (time) (let ((system-time-locale "C")) (format-time-string "%d-%b-%Y %T %z"))) (defun elmo-time-less-p (lhs rhs) (while (and (car lhs) (car rhs)) (cond ((car-less-than-car lhs rhs) (setq lhs nil)) ((= (car lhs) (car rhs)) (setq lhs (cdr lhs) rhs (cdr rhs))) (t (setq rhs nil)))) (not (null rhs))) (defalias 'elmo-time< 'elmo-time-less-p) (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-912c443/elmo/elmo-dop.el000066400000000000000000000335421262320455600213510ustar00rootroot00000000000000;;; elmo-dop.el --- Modules for Disconnected Operations on ELMO. ;; 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: ;; (eval-when-compile (require 'cl)) (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) len) (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 func 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 (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 (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. (mapcar 'car (elmo-delete-if (lambda (pair) (not (string= (cdr pair) (elmo-message-fetch-field folder (car pair) 'message-id)))) number-alist))) t)) ; Always success (If failure, just remain) (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-912c443/elmo/elmo-file.el000066400000000000000000000215241262320455600215030ustar00rootroot00000000000000;;; elmo-file.el --- File interface for ELMO. ;; 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: ;; (eval-when-compile (require 'cl)) (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) (setq 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)) (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-in-string file "/" ":") "@" (system-name)) :number number :size (nth 7 attrs) :date (elmo-file-make-date-string attrs) :subject (file-name-nondirectory file) :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)) (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-as-binary 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: " (concat (user-full-name uid) " <"(user-login-name uid) "@" (system-name) ">") "\n") (insert "Subject: " (file-name-nondirectory file) "\n") (insert "Date: " (elmo-file-make-date-string (file-attributes file)) "\n") (insert "Message-ID: " (concat "<" (elmo-replace-in-string file "/" ":") "@" (system-name) ">\n")) (insert "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-912c443/elmo/elmo-filter.el000066400000000000000000000463371262320455600220620ustar00rootroot00000000000000;;; elmo-filter.el --- Filtered Folder Interface for ELMO. ;; 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 ((killed-list (elmo-folder-killed-list-internal folder)) 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-912c443/elmo/elmo-flag.el000066400000000000000000000437311262320455600215010ustar00rootroot00000000000000;;; elmo-flag.el --- global flag handling. ;; 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) (eval-when-compile (require 'cl)) (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 key) (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))) (folder (elmo-flag-get-folder 'important)) file-cache) (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-912c443/elmo/elmo-imap4.el000066400000000000000000003712771262320455600216130ustar00rootroot00000000000000;;; elmo-imap4.el --- IMAP4 Interface for ELMO. ;; 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) (eval-when-compile (require 'cl)) (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 (coding-system-p 'utf-7-imap) "*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 (if (coding-system-p 'utf-7-imap) (decode-coding-string string 'utf-7-imap) (utf7-decode string 'imap)) string)) (defsubst elmo-imap4-encode-folder-string (string) (if elmo-imap4-use-modified-utf7 (if (coding-system-p 'utf-7-imap) (encode-coding-string string 'utf-7-imap) (utf7-encode string '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 (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 (session command) "Send COMMAND to the SESSION. Returns a TAG string which is assigned to the COMMAND." (let* ((command-args (if (listp command) command (list command))) (process (elmo-network-session-process-internal session)) (tag (elmo-imap4-command-tag session)) cmdlist token kind) (with-current-buffer (process-buffer process) (push tag cmdlist) ;;; No need. ;;; (erase-buffer) (goto-char (point-min)) (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) (while (setq token (car command-args)) (cond ((stringp token) ; formatted (unless (string= "" token) (push token cmdlist))) ((listp token) ; unformatted (setq kind (car token)) (cond ((eq kind 'atom) (push (nth 1 token) cmdlist)) ((eq kind 'quoted) (push (elmo-imap4-format-quoted (nth 1 token)) cmdlist)) ((eq kind 'literal) (push (format (if (elmo-imap4-session-capable-p session 'literal+) "{%d+}" "{%d}") (nth 2 token)) cmdlist) (elmo-imap4-session-process-send-string session (mapconcat #'identity (nreverse cmdlist) " ")) (setq cmdlist nil) (unless (elmo-imap4-session-capable-p session 'literal+) (elmo-imap4-accept-continue-req session)) (cond ((stringp (nth 1 token)) (push (nth 1 token) cmdlist)) ((bufferp (nth 1 token)) (with-current-buffer (nth 1 token) (process-send-region process (point-min) (+ (point-min) (nth 2 token))))) (t (error "Wrong argument for literal")))) (t (error "Unknown token kind %s" kind)))) (t (error "Invalid argument"))) (setq command-args (cdr command-args))) (elmo-imap4-session-process-send-string session (mapconcat #'identity (nreverse cmdlist) " ")) tag))) (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 (elmo-string-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) (case flag ((read unread) (elmo-string-member-ignore-case "\\seen" (elmo-imap4-session-flags-internal session))) (important (elmo-string-member-ignore-case "\\flagged" (elmo-imap4-session-flags-internal session))) (digest (or (elmo-string-member-ignore-case "\\seen" (elmo-imap4-session-flags-internal session)) (elmo-string-member-ignore-case "\\flagged" (elmo-imap4-session-flags-internal session)))) (answered (elmo-string-member-ignore-case (concat "\\" (symbol-name flag)) (elmo-imap4-session-flags-internal session))) (t (elmo-string-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) (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) (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 (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." (let (count cont-list set-list) (setq msg-list (sort (copy-sequence msg-list) '<)) (while msg-list (setq cont-list nil) (setq count 0) (unless chop-length (setq chop-length (length msg-list))) (while (and (not (null msg-list)) (< count chop-length)) (setq cont-list (elmo-number-set-append cont-list (car msg-list))) (incf count) (setq msg-list (cdr msg-list))) (setq set-list (cons (cons count (mapconcat (lambda (x) (cond ((consp x) (format "%s:%s" (car x) (cdr x))) ((integerp x) (number-to-string x)))) cont-list ",")) set-list))) (nreverse set-list))) ;; ;; 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 (elmo-string-member-ignore-case "\\Seen" flags)) '(new)) (and (elmo-string-member-ignore-case "\\Flagged" flags) '(important)) (and (not (elmo-string-member-ignore-case "\\Seen" flags)) '(unread)) (and (elmo-string-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 (eq (elmo-network-stream-type-symbol (elmo-network-session-stream-type-internal session)) 'starttls) (or (elmo-imap4-session-capable-p session 'starttls) (signal 'elmo-open-error '(elmo-imap4-starttls-error))) (elmo-imap4-send-command-wait session "starttls") (starttls-negotiate process) (elmo-imap4-session-set-capability-internal session (elmo-imap4-response-value (elmo-imap4-send-command-wait session "capability") 'capability)))))) (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 (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 tag 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))) (setq tag (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)) (setq tag (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 (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 (not (eq (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))) (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)))) (case token (+ (progn (skip-chars-forward " ") (list 'continue-req (buffer-substring (point) (point-max))))) (* (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 (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)) (case (elmo-imap4-read-token) (OK (progn (setq elmo-imap4-parsing nil) (setq token (symbol-name token)) (elmo-unintern token) (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)) (elmo-unintern token) (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)) (elmo-unintern 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 '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 (not (eq (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 (not (eq (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)))) (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)) (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)) (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-... (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.. (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) (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 (elmo-string-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 " "(") (cdr a) '(")" "(") (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))))) (total 0) print-length print-depth 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 result response tag) (condition-case err (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 (setq result (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 (current-time))) 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 (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 (cadar candidates)) internaldate) (setq result (cons (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 uidnext) (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") (autoload 'utf7-decode "utf7") (autoload 'utf7-encode "utf7") (require 'product) (product-provide (provide 'elmo-imap4) (require 'elmo-version)) ;;; elmo-imap4.el ends here wanderlust-wanderlust-912c443/elmo/elmo-internal.el000066400000000000000000000061361262320455600224020ustar00rootroot00000000000000;;; elmo-internal.el --- Internal Interface for ELMO. ;; 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-912c443/elmo/elmo-localdir.el000066400000000000000000000302611262320455600223530ustar00rootroot00000000000000;;; elmo-localdir.el --- Localdir Interface for ELMO. ;; 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: ;; (eval-when-compile (require 'cl)) (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)) (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) (setq new-number (1+ new-number)))) (message "Packing...done") (elmo-folder-set-msgdb-internal folder new-msgdb))) (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-912c443/elmo/elmo-localnews.el000066400000000000000000000046451262320455600225600ustar00rootroot00000000000000;;; elmo-localnews.el --- Local News Spool Interface for ELMO. ;; 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-in-string name "/" "\\."))) (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-in-string name "\\." "/")) (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-912c443/elmo/elmo-maildir.el000066400000000000000000000505541262320455600222120ustar00rootroot00000000000000;;; elmo-maildir.el --- Maildir interface for ELMO. ;; 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: ;; (eval-when-compile (require 'cl)) (require 'elmo-util) (require 'elmo) (require 'elmo-map) (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-in-string ,string ":" (char-to-string elmo-maildir-separator)))) ;;; 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-char-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) (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-char-list (match-string 2 filename)))) (unless (memq mark flaglist) (setq flaglist (sort (cons mark flaglist) '<)) (rename-file filename (concat (match-string 1 filename) (char-list-to-string flaglist))))) ;; Rescue no info file in maildir. (rename-file filename (concat filename (elmo-maildir-adjust-separator ":2,") (char-to-string 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-char-list (match-string 2 filename)))) (when (memq mark flaglist) (setq flaglist (delq mark flaglist)) (rename-file filename (concat (match-string 1 filename) (if flaglist (char-list-to-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 (function (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) (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)) (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-912c443/elmo/elmo-map.el000066400000000000000000000252551262320455600213460ustar00rootroot00000000000000;;; elmo-map.el --- A ELMO folder class with message number mapping. ;; 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-when-compile (require 'cl)) (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) (let ((alist (elmo-location-map-alist location-map))) (elmo-msgdb-location-save directory (cons (cons (elmo-location-map-max-number location-map) nil) alist)))) (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) (setq number (1+ number)))) (message "Packing...done") (elmo-location-map-setup folder (nreverse location)) (elmo-folder-set-msgdb-internal folder new-msgdb))) (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-912c443/elmo/elmo-mime.el000066400000000000000000000414461262320455600215200ustar00rootroot00000000000000;;; elmo-mime.el --- MIME module for ELMO. ;; 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-vars) (require 'mmbuffer) (require 'mmimap) (require 'mime-view) (eval-when-compile (require 'luna) (require 'elmo) ; elmo-folder-do-each-message-entity (require 'cl)) ;; 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)) contents entity) (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-912c443/elmo/elmo-msgdb.el000066400000000000000000000352111262320455600216560ustar00rootroot00000000000000;;; elmo-msgdb.el --- Message Database for ELMO. ;; 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: ;; (eval-when-compile (require 'cl)) (require 'elmo-vars) (require 'elmo-util) (require 'emu) (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 ;; elmo-folder-get-info ;; elmo-folder-get-info-max ;; elmo-folder-get-info-length ;; elmo-folder-get-info-unread ;;; 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)) (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 (elmo-time< (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) (while (setq field-name (car s-rest)) (goto-char (point-min)) (while (re-search-forward (concat "^" field-name ":[ \t]*") nil t) (setq field-body (nconc field-body (list (buffer-substring-no-properties (match-end 0) (std11-field-end)))))) (setq s-rest (cdr s-rest))) 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 ((killed killed-list) (ret-val 0)) (while (car killed) (if (consp (car killed)) (setq ret-val (+ ret-val 1 (- (cdar killed) (caar killed)))) (setq ret-val (+ ret-val 1))) (setq killed (cdr killed))) ret-val)) (defun elmo-msgdb-max-of-killed (killed-list) (let ((klist killed-list) (max 0) k) (while (car klist) (if (< max (setq k (if (consp (car klist)) (cdar klist) (car klist)))) (setq max k)) (setq klist (cdr klist))) max)) (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-folder-get-info (folder &optional hashtb) (elmo-get-hash-val folder (or hashtb elmo-folder-info-hashtb))) (defun elmo-folder-get-info-max (folder) "Get folder info from cache." (nth 3 (elmo-folder-get-info folder))) (defun elmo-folder-get-info-length (folder) (nth 2 (elmo-folder-get-info folder))) (defun elmo-folder-get-info-unread (folder) (nth 1 (elmo-folder-get-info folder))) (defsubst elmo-msgdb-location-load (dir) (elmo-object-load (expand-file-name elmo-msgdb-location-filename dir))) (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) (elmo-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) (elmo-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-912c443/elmo/elmo-multi.el000066400000000000000000000460541262320455600217230ustar00rootroot00000000000000;;; elmo-multi.el --- Multiple Folder Interface for ELMO. ;; 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: ;; (eval-when-compile (require 'cl)) (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-912c443/elmo/elmo-net.el000066400000000000000000000505211262320455600213510ustar00rootroot00000000000000;;; elmo-net.el --- Network module for ELMO. ;; 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: ;; (eval-when-compile (require 'cl)) (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 '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) (format "%s:%s/%s@%s:%d" (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-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)) (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 (process-kill-without-query process) (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 (quote (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 (quote (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-912c443/elmo/elmo-nntp.el000066400000000000000000001436331262320455600215510ustar00rootroot00000000000000;;; elmo-nntp.el --- NNTP Interface for ELMO. ;; 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: ;; (eval-when-compile (require 'cl)) (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))) pos) (with-current-buffer (get-buffer-create (concat "*NNTP DEBUG*" (if biff "BIFF"))) (goto-char (point-max)) (setq pos (point)) (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 (eq (elmo-network-stream-type-symbol (elmo-network-session-stream-type-internal session)) 'starttls) (elmo-nntp-send-command session "starttls") (or (elmo-nntp-read-response session) (error "Cannot open starttls session")) (starttls-negotiate process))))) (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) command) (process-send-string (elmo-network-session-process-internal session) "\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)) case-fold-search (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-match (concat "^" (regexp-quote (or (nth 2 elmo-nntp-list-folders-cache) ""))) (or server ""))) (let* ((cache-time (car elmo-nntp-list-folders-cache))) (unless (elmo-time-expire cache-time elmo-nntp-list-folders-use-cache) (with-current-buffer buf (erase-buffer) (insert (nth 3 elmo-nntp-list-folders-cache)) (goto-char (point-min)) (or (string= group "") (and group (keep-lines (concat "^" (regexp-quote group) "\\.")))) t ))))) (defsubst elmo-nntp-catchup-msgdb (msgdb max-number) (let ((numbers (elmo-msgdb-list-messages msgdb)) msgdb-max) (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)) (incf i)) (nreverse killed))))) (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)) (case-fold-search nil) response ret-val top-ng username append-serv use-list-active start) (with-temp-buffer (set-buffer-multibyte nil) (if (and (elmo-nntp-folder-group-internal folder) (elmo-nntp-select-group session (elmo-nntp-folder-group-internal folder))) ;; add top newsgroups (setq ret-val (list (elmo-nntp-folder-group-internal folder)))) (unless (setq response (elmo-nntp-list-folders-get-cache (elmo-nntp-folder-group-internal folder) (elmo-net-folder-server-internal folder) (current-buffer))) (when (setq use-list-active (elmo-nntp-list-active-p session)) (elmo-nntp-send-command session (concat "list" (if (and (elmo-nntp-folder-group-internal folder) (not (string= (elmo-nntp-folder-group-internal folder) ""))) (concat " active" (format " %s.*" (elmo-nntp-folder-group-internal folder)))))) (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) (elmo-nntp-folder-group-internal folder) (elmo-net-folder-server-internal folder) response))) (erase-buffer) (insert response)) (elmo-nntp-set-list-active session nil) (setq use-list-active nil))) (when (null use-list-active) (elmo-nntp-send-command session "list") (if (null (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 nil response))) (erase-buffer) (setq start nil) (while (string-match (concat "^" (regexp-quote (or (elmo-nntp-folder-group-internal folder) "")) ".*$") response start) (insert (match-string 0 response) "\n") (setq start (match-end 0))))) (goto-char (point-min)) (elmo-with-progress-display (elmo-nntp-parse-active (count-lines (point-min) (point-max))) "Parsing active" (if one-level (let ((regexp (format "^\\(%s[^. ]+\\)\\([. ]\\).*\n" (if (and (elmo-nntp-folder-group-internal folder) (null (string= (elmo-nntp-folder-group-internal folder) ""))) (concat (elmo-nntp-folder-group-internal folder) "\\.") "")))) (while (looking-at regexp) (setq top-ng (elmo-match-buffer 1)) (if (string= (elmo-match-buffer 2) " ") (if (not (or (member top-ng ret-val) (assoc top-ng ret-val))) (setq ret-val (nconc ret-val (list top-ng)))) (if (member top-ng ret-val) (setq ret-val (delete top-ng ret-val))) (if (not (assoc top-ng ret-val)) (setq ret-val (nconc ret-val (list (list top-ng)))))) (elmo-progress-notify 'elmo-nntp-parse-active) (forward-line))) (while (re-search-forward "\\([^ ]+\\) .*\n" nil t) (setq ret-val (nconc ret-val (list (elmo-match-buffer 1)))) (elmo-progress-notify 'elmo-nntp-parse-active))))) (setq username (or (elmo-net-folder-user-internal folder) "")) (unless (string= username (or elmo-nntp-default-user "")) (setq append-serv (concat append-serv ":" (elmo-quote-syntactical-element username 'user elmo-nntp-folder-name-syntax)))) (unless (string= (elmo-net-folder-server-internal folder) elmo-nntp-default-server) (setq append-serv (concat append-serv "@" (elmo-net-folder-server-internal folder)))) (unless (eq (elmo-net-folder-port-internal folder) elmo-nntp-default-port) (setq append-serv (concat append-serv ":" (number-to-string (elmo-net-folder-port-internal folder))))) (unless (eq (elmo-network-stream-type-symbol (elmo-net-folder-stream-type-internal folder)) elmo-nntp-default-stream-type) (setq append-serv (concat append-serv (elmo-network-stream-type-spec-string (elmo-net-folder-stream-type-internal folder))))) (mapcar (lambda (fld) (if (consp fld) (list (concat "-" (elmo-nntp-decode-group-string (car fld)) append-serv)) (concat "-" (elmo-nntp-decode-group-string fld) append-serv))) 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 (elmo-with-enable-multibyte (eword-decode-string (elmo-delete-char ?\" (or (aref ov-entity 2) elmo-no-from)))) :subject (or (elmo-with-enable-multibyte (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 dir) (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))) (if (null (elmo-nntp-read-response session)) (progn (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)) (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 (elmo-match-buffer 1)) (elmo-match-buffer 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)) newsgroups) (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 (let ((elmo-prefer-std11-parser t)) (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." ;; Escape "." at start of a line (if (eq (string-to-char line) ?.) (process-send-string (elmo-network-session-process-internal session) ".")) (process-send-string (elmo-network-session-process-internal session) line) (process-send-string (elmo-network-session-process-internal session) "\r\n")) (defun elmo-nntp-send-buffer (session databuf) "Send data content of DATABUF to SESSION." (let ((data-continue t) line bol) (with-current-buffer databuf (goto-char (point-min)) (while data-continue (beginning-of-line) (setq bol (point)) (end-of-line) (setq line (buffer-substring bol (point))) (unless (zerop (forward-line)) (setq data-continue nil)) (elmo-nntp-send-data-line session 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 (elmo-date-make-sortable-string (timezone-fix-time (cdr pair) (current-time-zone) nil))) (if (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) (elmo-replace-in-string postfix "\\\\" "\\\\\\\\\\\\\\\\"))))))) (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) (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 (looking-at "^[23]") (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 (elmo-match-buffer 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 ((elmo-prefer-std11-parser t) 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 (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-912c443/elmo/elmo-null.el000066400000000000000000000051511262320455600215340ustar00rootroot00000000000000;;; elmo-null.el --- /dev/null Folder Interface for ELMO. ;; 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) (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-912c443/elmo/elmo-pipe.el000066400000000000000000000405131262320455600215200ustar00rootroot00000000000000;;; elmo-pipe.el --- PIPE Interface for ELMO. ;; 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-912c443/elmo/elmo-pop3.el000066400000000000000000000707341262320455600214540ustar00rootroot00000000000000;;; elmo-pop3.el --- POP3 Interface for ELMO. ;; 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) (eval-when-compile (require 'cl) (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))) pos) (with-current-buffer (get-buffer-create (concat "*POP3 DEBUG*" (if biff "BIFF"))) (goto-char (point-max)) (setq pos (point)) (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 (case-fold-search (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 ((looking-at "\\+") (setq response-continue nil)) ((looking-at "\\-") (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)) (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))) (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)) response mechanism) (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 (eq (elmo-network-stream-type-symbol (elmo-network-session-stream-type-internal session)) 'starttls) (elmo-pop3-send-command process "stls") (if (eq 'ok (car (elmo-pop3-read-response process))) (starttls-negotiate process) (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)) (let (sasl-mechanisms client name step response mechanism sasl-read-passphrase) (require 'sasl) (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)) (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 ((buffer (current-buffer)) number list size) (with-temp-buffer (let (number uid list) (insert string) (goto-char (point-min)) (while (re-search-forward "^\\([0-9]+\\)[\t ]+\\([^ \n]+\\)$" nil t) (setq number (elmo-match-buffer 1)) (setq uid (elmo-match-buffer 2)) (with-current-buffer buffer (elmo-set-hash-val uid number elmo-pop3-uidl-number-hash) (elmo-set-hash-val (concat "#" number) uid elmo-pop3-number-uidl-hash)) (setq list (cons uid list))) (with-current-buffer buffer (setq elmo-pop3-uidl-done t)) (nreverse list))))) (defun elmo-pop3-parse-list-response (string) (let ((buffer (current-buffer)) (count 0) 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 (elmo-match-buffer 1) (elmo-match-buffer 2)) alist)) (setq count (1+ count))) (with-current-buffer buffer (setq elmo-pop3-size-hash (elmo-make-hash (* (length alist) 2))) (while alist (elmo-set-hash-val (concat "#" (car (car alist))) (cdr (car alist)) elmo-pop3-size-hash) (setq alist (cdr alist))) (setq elmo-pop3-list-done t)) count))) (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) ?+) (if (re-search-forward "\n\\.\r?\n" nil t) t nil)) ((looking-at "-") (if (search-forward "\n" nil t) t nil)) (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 default-enable-multibyte-characters) (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 errmsg msg) (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-912c443/elmo/elmo-rss.el000066400000000000000000000475361262320455600214060ustar00rootroot00000000000000;;; elmo-rss --- RSS, Atom and OPML support for Wanderlust ;;; 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) (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 (point-min) (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-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-912c443/elmo/elmo-search.el000066400000000000000000000331201262320455600220240ustar00rootroot00000000000000;;; elmo-search.el --- Search by external program interface for ELMO. ;; 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: ;; (eval-when-compile (require 'cl)) (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)) (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 t t (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-as-binary 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 (list null-device))) (dolist (filename (directory-files dirname)) (unless (string-match "^\\.\\.?" filename) (setq files (cons (expand-file-name filename dirname) files)))) files)) (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." (replace-regexp-in-string "\'" "\"" pattern nil 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 '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-912c443/elmo/elmo-sendlog.el000066400000000000000000000112071262320455600222140ustar00rootroot00000000000000;;; elmo-sendlog.el --- Sendlog folder for ELMO. ;; 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) (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-as-binary 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-912c443/elmo/elmo-shimbun.el000066400000000000000000000423001262320455600222240ustar00rootroot00000000000000;;; elmo-shimbun.el --- Shimbun interface for ELMO. ;; 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-map) (require 'elmo-dop) (require 'shimbun) (eval-when-compile (require 'cl) (defun-maybe shimbun-servers-list ())) (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)) (elmo-with-enable-multibyte (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* ((shimbun (elmo-shimbun-folder-shimbun-internal folder)) (key (concat (shimbun-server shimbun) "." (shimbun-current-group shimbun))) (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)) references) (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) (if (fboundp 'shimbun-group-p) (shimbun-group-p (elmo-shimbun-folder-shimbun-internal folder) (elmo-shimbun-folder-group-internal folder)) (member (elmo-shimbun-folder-group-internal folder) (shimbun-groups (elmo-shimbun-folder-shimbun-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-912c443/elmo/elmo-signal.el000066400000000000000000000147341262320455600220460ustar00rootroot00000000000000;;; elmo-signal.el --- "signal-slot" abstraction for routing events ;; 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: (eval-when-compile (require 'cl)) (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)) signal) (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-912c443/elmo/elmo-spam.el000066400000000000000000000232751262320455600215310ustar00rootroot00000000000000;;; elmo-spam.el --- Spam filtering interface to processor. ;; 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: ;; (eval-when-compile (require 'cl)) (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-912c443/elmo/elmo-split.el000066400000000000000000000336651262320455600217300ustar00rootroot00000000000000;;; elmo-split.el --- Split messages according to the user defined rules. ;; 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: (eval-when-compile (require 'cl)) (require 'elmo) (eval-when-compile ;; Avoid compile warnings (require 'elmo-spam)) (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))) (defun elmo-split-spam-p (buffer &rest plist) (require 'elmo-spam) (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) (incf fcount))) (setq record-log t delete-substance (not (or failure (eq (nth 2 rule) 'continue)))) (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-912c443/elmo/elmo-util.el000066400000000000000000002236771262320455600215560ustar00rootroot00000000000000;;; elmo-util.el --- Utilities for ELMO. ;; 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: ;; (eval-when-compile (require 'cl) (require 'static)) (require 'elmo-vars) (require 'elmo-date) (require 'mcharset) (require 'pces) (require 'std11) (require 'eword-decode) (require 'poem) (require 'emu) (eval-and-compile (autoload 'md5 "md5")) (defvar elmo-work-buf-name " *elmo work*") (defvar elmo-temp-buf-name " *elmo temp*") (or (boundp 'default-enable-multibyte-characters) (defvar default-enable-multibyte-characters (featurep 'mule) "The mock variable except for Emacs 20.")) (defconst elmo-multibyte-buffer-name " *elmo-multibyte-buffer*") (defmacro elmo-with-enable-multibyte (&rest body) "Evaluate BODY with `default-enable-multibyte-character' when needed." ;; Check whether FLIM's MIME-charset string encoder/decoders work on ;; unibyte buffer. (static-if (fboundp 'mime-charset-encode-string) `(progn ,@body) `(with-current-buffer (get-buffer-create elmo-multibyte-buffer-name) ,@body))) (put 'elmo-with-enable-multibyte 'lisp-indent-function 0) (def-edebug-spec elmo-with-enable-multibyte t) (static-cond ((fboundp 'mime-charset-encode-string) (defalias 'elmo-mime-charset-decode-string 'mime-charset-decode-string) (defalias 'elmo-mime-charset-encode-string 'mime-charset-encode-string)) (t (defsubst elmo-mime-charset-decode-string (string charset &optional lbt) "Decode the STRING as MIME CHARSET. Buffer's multibyteness is ignored." (elmo-with-enable-multibyte (decode-mime-charset-string string charset lbt))) (defsubst elmo-mime-charset-encode-string (string charset &optional lbt) "Encode the STRING as MIME CHARSET. Buffer's multibyteness is ignored." (elmo-with-enable-multibyte (encode-mime-charset-string string charset lbt)))) ) (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 default-enable-multibyte-characters) (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)) (static-if (condition-case nil (plist-get '(one) 'other) (error t)) (defmacro elmo-safe-plist-get (plist prop) `(ignore-errors (plist-get ,plist ,prop))) (defalias 'elmo-safe-plist-get 'plist-get)) (eval-when-compile (unless (fboundp 'coding-system-base) (defalias 'coding-system-base 'ignore)) (unless (fboundp 'coding-system-name) (defalias 'coding-system-name 'ignore)) (unless (fboundp 'find-file-coding-system-for-read-from-filename) (defalias 'find-file-coding-system-for-read-from-filename 'ignore)) (unless (fboundp 'find-operation-coding-system) (defalias 'find-operation-coding-system 'ignore))) (defun elmo-set-auto-coding (&optional filename) "Find coding system used to decode the contents of the current buffer. This function looks for the coding system magic cookie or examines the coding system specified by `file-coding-system-alist' being associated with FILENAME which defaults to `buffer-file-name'." (cond ((boundp 'set-auto-coding-function) ;; Emacs (if filename (or (funcall (symbol-value 'set-auto-coding-function) filename (- (point-max) (point-min))) (car (find-operation-coding-system 'insert-file-contents filename))) (let (auto-coding-alist) (condition-case nil (funcall (symbol-value 'set-auto-coding-function) nil (- (point-max) (point-min))) (error nil))))) ((featurep 'file-coding) ;; XEmacs (let ((case-fold-search t) (end (point-at-eol)) codesys start) (or (and (re-search-forward "-\\*-+[\t ]*" end t) (progn (setq start (match-end 0)) (re-search-forward "[\t ]*-+\\*-" end t)) (progn (setq end (match-beginning 0)) (goto-char start) (or (looking-at "coding:[\t ]*\\([^\t ;]+\\)") (re-search-forward "[\t ;]+coding:[\t ]*\\([^\t ;]+\\)" end t))) (find-coding-system (setq codesys (intern (match-string 1)))) codesys) (and (re-search-forward "^[\t ]*;+[\t ]*Local[\t ]+Variables:" nil t) (progn (setq start (match-end 0)) (re-search-forward "^[\t ]*;+[\t ]*End:" nil t)) (progn (setq end (match-beginning 0)) (goto-char start) (re-search-forward "^[\t ]*;+[\t ]*coding:[\t ]*\\([^\t\n\r ]+\\)" end t)) (find-coding-system (setq codesys (intern (match-string 1)))) codesys) (and (progn (goto-char (point-min)) (setq case-fold-search nil) (re-search-forward "^;;;coding system: " ;;; (+ (point-min) 3000) t)) nil t)) (looking-at "[^\t\n\r ]+") (find-coding-system (setq codesys (intern (match-string 0)))) codesys) (and filename (setq codesys (find-file-coding-system-for-read-from-filename filename)) (coding-system-name (coding-system-base codesys)))))))) (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-as-binary 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 (elmo-match-buffer 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 (elmo-match-buffer 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-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)) (defsubst elmo-delete-cr-get-content-type () (save-excursion (elmo-delete-cr-buffer) (goto-char (point-min)) (or (std11-field-body "content-type") t))) (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))) (defun elmo-set-list (vars vals) (while vars (when (car vars) (set (car vars) (car vals))) (setq vars (cdr vars) vals (cdr vals)))) (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)) (rest (and match (cdr (memq after list))))) (if match (progn (setcdr match (list element)) (nconc list rest)) (nconc list (list element))))) (defun elmo-get-file-string (filename &optional remove-final-newline) (elmo-set-work-buf (let (insert-file-contents-pre-hook ; To avoid autoconv-xmas... insert-file-contents-post-hook) (when (file-exists-p filename) (if filename (as-binary-input-file (insert-file-contents filename))) (when (and remove-final-newline (> (buffer-size) 0) (= (char-after (1- (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-concat-path (path filename) (if (not (string= path "")) (elmo-replace-in-string (if (string= elmo-path-sep (substring path (- (length path) 1))) (concat path filename) (concat path elmo-path-sep filename)) (concat (regexp-quote elmo-path-sep)(regexp-quote elmo-path-sep)) elmo-path-sep) filename)) (defvar elmo-passwd-alist nil) (defun elmo-passwd-alist-load () (let ((filename (expand-file-name elmo-passwd-alist-file-name elmo-msgdb-directory))) (if (not (file-readable-p filename)) () (with-temp-buffer (let (insert-file-contents-pre-hook ; To avoid autoconv-xmas... insert-file-contents-post-hook) (insert-file-contents filename) (goto-char (point-min)) (ignore-errors (read (current-buffer)))))))) (defun elmo-passwd-alist-clear () "Clear password cache." (interactive) (dolist (pair elmo-passwd-alist) (when (stringp (cdr-safe pair)) (fillarray (cdr pair) 0))) (setq elmo-passwd-alist nil)) (defun elmo-passwd-alist-save () "Save password into file." (interactive) (with-temp-buffer (let ((filename (expand-file-name elmo-passwd-alist-file-name elmo-msgdb-directory)) print-length print-level) (prin1 elmo-passwd-alist (current-buffer)) (princ "\n" (current-buffer)) ;;; (if (and (file-exists-p filename) ;;; (not (equal 384 (file-modes filename)))) ;;; (error "%s is not safe.chmod 600 %s!" filename filename)) (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))))) (defun elmo-get-passwd (key) "Get password from password pool." (let (pair pass) (if (not elmo-passwd-alist) (setq elmo-passwd-alist (elmo-passwd-alist-load))) (setq pair (assoc key elmo-passwd-alist)) (if pair (elmo-base64-decode-string (cdr pair)) (setq pass (elmo-read-passwd (format "Password for %s: " key) t)) (setq elmo-passwd-alist (append elmo-passwd-alist (list (cons key (elmo-base64-encode-string pass))))) (if elmo-passwd-life-time (run-with-timer elmo-passwd-life-time nil `(lambda () (elmo-remove-passwd ,key)))) pass))) (defun elmo-remove-passwd (key) "Remove password from password pool (for failure)." (let (pass-cons) (while (setq pass-cons (assoc key elmo-passwd-alist)) (unwind-protect (fillarray (cdr pass-cons) 0) (setq elmo-passwd-alist (delete pass-cons elmo-passwd-alist)))))) (defmacro elmo-read-char-exclusive () (cond ((featurep 'xemacs) '(let ((table (quote ((backspace . ?\C-h) (delete . ?\C-?) (left . ?\C-h)))) event key) (while (not (and (key-press-event-p (setq event (next-command-event))) (setq key (or (event-to-character event) (cdr (assq (event-key event) table))))))) key)) ((fboundp 'read-char-exclusive) '(read-char-exclusive)) (t '(read-char)))) (defun elmo-read-passwd (prompt &optional stars) "Read a single line of text from user without echoing, and return it." (let ((ans "") (c 0) (echo-keystrokes 0) (cursor-in-echo-area t) (log-message-max-size 0) message-log-max done msg truncate) (while (not done) (if (or (not stars) (string= "" ans)) (setq msg prompt) (setq msg (concat prompt (make-string (length ans) ?.))) (setq truncate (1+ (- (length msg) (window-width (minibuffer-window))))) (and (> truncate 0) (setq msg (concat "$" (substring msg (1+ truncate)))))) (message "%s" msg) (setq c (elmo-read-char-exclusive)) (cond ((= c ?\C-g) (setq quit-flag t done t)) ((or (= c ?\r) (= c ?\n) (= c ?\e)) (setq done t)) ((= c ?\C-u) (setq ans "")) ((and (/= c ?\b) (/= c ?\177)) (setq ans (concat ans (char-to-string c)))) ((> (length ans) 0) (setq ans (substring ans 0 -1))))) (if quit-flag (prog1 (setq quit-flag nil) (message "Quit") (beep t)) (message "") ans))) (defun elmo-string-to-list (string) (read (concat "(" string ")"))) (defun elmo-list-to-string (list) (let ((tlist list) str) (if (listp tlist) (progn (setq str "(") (while (car tlist) (setq str (concat str (if (symbolp (car tlist)) (symbol-name (car tlist)) (car tlist)))) (if (cdr tlist) (setq str (concat str " "))) (setq tlist (cdr tlist))) (setq str (concat str ")"))) (setq str (if (symbolp tlist) (symbol-name tlist) tlist))) str)) (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 (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 (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 (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 (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) (let ((clist1 (sort (copy-sequence list1) #'<)) (clist2 (sort (copy-sequence list2) #'<)) list1-only list2-only) (while (and clist1 clist2) (cond ((= (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) (static-if (fboundp 'unintern) `(symbol-value (intern-soft ,string ,hashtable)) `(let ((sym (intern-soft ,string ,hashtable))) (and (boundp sym) (symbol-value sym))))) (defmacro elmo-set-hash-val (string value hashtable) `(set (intern ,string ,hashtable) ,value)) (defmacro elmo-clear-hash-val (string hashtable) (static-if (fboundp 'unintern) (list 'unintern string hashtable) (list 'makunbound (list 'intern string hashtable)))) (defmacro elmo-unintern (string) "`unintern' symbol named STRING, When can use `unintern'. Emacs 19.28 or earlier does not have `unintern'." (static-if (fboundp 'unintern) (list 'unintern string))) (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 (elmo-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 nil) (defsubst elmo-replace-string-as-filename (msgid) "Replace string as filename." (setq msgid (elmo-replace-in-string msgid " " " ")) (if (null elmo-filename-replace-chars) (setq elmo-filename-replace-chars (regexp-quote (mapconcat 'car elmo-filename-replace-string-alist "")))) (while (string-match (concat "[" elmo-filename-replace-chars "]") 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 err (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))) (if (fboundp 'display-error) (defalias 'elmo-display-error 'display-error) (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)))) (if (fboundp 'define-error) (defalias 'elmo-define-error 'define-error) (defun elmo-define-error (error doc &optional parents) (or parents (setq parents 'error)) (let ((conds (get parents 'error-conditions))) (or conds (error "Not an error symbol: %s" error)) (setplist error (list 'error-message doc 'error-conditions (cons error conds)))))) (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))) (defun 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 (elmo-safe-plist-get params :total)) (elmo-progress-call-callback counter 'query))) (progn (elmo-progress-counter-set-value counter (or (elmo-safe-plist-get params :set) (+ (elmo-progress-counter-value counter) (or (elmo-safe-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)) (defun elmo-time-expire (before-time diff-time) (let* ((current (current-time)) (rest (when (< (nth 1 current) (nth 1 before-time)) (expt 2 16))) diff) (setq diff (list (- (+ (car current) (if rest -1 0)) (car before-time)) (- (+ (or rest 0) (nth 1 current)) (nth 1 before-time)))) (and (zerop (car diff)) (< diff-time (nth 1 diff))))) (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)))) ;; 2012-07-30 (make-obsolete 'elmo-unfold-field-body 'elmo-unfold-fetch-field) (defun elmo-decoded-fetch-field (field-name &optional mode) (let ((field-body (std11-fetch-field field-name))) (and field-body (or (ignore-errors (elmo-with-enable-multibyte (mime-decode-field-body field-body field-name mode))) field-body)))) ;; 2012-07-30 (make-obsolete 'elmo-decoded-field-body 'elmo-decoded-fetch-field) (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))) (static-cond ((fboundp 'substring-no-properties) (defalias 'elmo-string 'substring-no-properties)) (t (defmacro elmo-string (string &optional from to) "Return a substring of STRING, without text properties. It starts at zero-indexed index FROM and ends before TO." `(let ((obj (substring ,string (or ,from 0) ,to))) (set-text-properties 0 (length obj) nil obj) obj)))) (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))))))) (static-cond ((fboundp 'member-ignore-case) (defalias 'elmo-string-member-ignore-case 'member-ignore-case)) ((fboundp 'compare-strings) (defun elmo-string-member-ignore-case (elt list) "Like `member', but ignores differences in case and text representation. ELT must be a string. Upper-case and lower-case letters are treated as equal. Unibyte strings are converted to multibyte for comparison." (while (and list (not (eq t (compare-strings elt 0 nil (car list) 0 nil t)))) (setq list (cdr list))) list)) (t (defun elmo-string-member-ignore-case (elt list) "Like `member', but ignores differences in case and text representation. ELT must be a string. Upper-case and lower-case letters are treated as equal." (let ((str (downcase elt))) (while (and list (not (string= str (downcase (car list))))) (setq list (cdr list))) list)))) (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) (length string)))) (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 (char-to-string 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-char-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) "" (char-list-to-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 (char-list-to-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 ((number-list (list 'dummy)) elem) (while number-set (setq elem (car number-set)) (cond ((consp elem) (nconc number-list (elmo-make-number-list (car elem) (cdr elem)))) ((integerp elem) (nconc number-list (list elem)))) (setq number-set (cdr number-set))) (cdr number-list))) (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))) (w32-get-true-file-link-count t) ; for Meadow 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 (list) (store-match-data nil) (while (string-match regexp string (match-end 0)) (setq list (cons (substring string (match-beginning matchn) (match-end matchn)) list))) (nreverse list))) (defun elmo-find-list-match-value (specs getter) (lexical-let ((getter getter)) (elmo-map-until-success (lambda (spec) (cond ((symbolp spec) (funcall getter spec)) ((consp spec) (lexical-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-to-msgid (filename) (concat "<" (elmo-recover-string-from-filename filename) ">")) (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-as-binary 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) (method (completing-read (format "Expire by (%s): " elmo-cache-expire-default-method) '(("size" . "size") ("age" . "age")) nil t))) (when (string= method "") (setq method elmo-cache-expire-default-method)) (funcall (intern (concat "elmo-cache-expire-by-" method))))) (defun elmo-read-float-value-from-minibuffer (prompt &optional initial) (let ((str (read-from-minibuffer prompt initial))) (cond ((string-match "[0-9]*\\.[0-9]+" str) (string-to-number str)) ((string-match "[0-9]+" str) (string-to-number (concat str ".0"))) (t (error "%s is not number" str))))) (defun elmo-cache-expire-by-size (&optional kbytes) "Expire cache file by size. If KBYTES is kilo bytes (This value must be float)." (interactive) (let ((size (or kbytes (and (interactive-p) (elmo-read-float-value-from-minibuffer "Enter cache disk size (Kbytes): " (number-to-string (if (integerp elmo-cache-expire-default-size) (float elmo-cache-expire-default-size) elmo-cache-expire-default-size)))) (if (integerp elmo-cache-expire-default-size) (float 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 days (number-to-string days)) (and (interactive-p) (read-from-minibuffer (format "Enter days (%s): " elmo-cache-expire-default-age))) (number-to-string elmo-cache-expire-default-age))) (dirs (directory-files elmo-cache-directory t "^[^\\.]")) (count 0) curtime) (if (string= age "") (setq age elmo-cache-expire-default-age) (setq age (string-to-number age))) (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)) (elmo-replace-string-as-filename (match-string 1 msgid))))) (defun elmo-cache-get-path (msgid &optional folder number) "Get path for cache file associated with MSGID, FOLDER, and NUMBER." (if (setq msgid (elmo-msgid-to-cache msgid)) (expand-file-name (expand-file-name (if folder (format "%s/%s/%s@%s" (elmo-cache-get-path-subr msgid) msgid (or number "") (elmo-safe-filename folder)) (format "%s/%s" (elmo-cache-get-path-subr msgid) msgid)) elmo-cache-directory)))) ;;; ;; Warnings. (static-if (fboundp 'display-warning) (defmacro elmo-warning (&rest args) "Display a warning with `elmo' group." `(display-warning 'elmo (format ,@args))) (defconst elmo-warning-buffer-name "*elmo warning*") (defun elmo-warning (&rest args) "Display a warning. ARGS are passed to `format'." (with-current-buffer (get-buffer-create elmo-warning-buffer-name) (goto-char (point-max)) (funcall #'insert (apply #'format (append args '("\n")))) (ignore-errors (recenter 1)) (display-buffer elmo-warning-buffer-name)))) (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) (static-if (and (fboundp 'defvaralias) (subrp (symbol-function 'defvaralias))) (defvaralias var obsolete) (set var (symbol-value 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)))) (defsubst elmo-msgdb-get-last-message-id (string) (if string (save-match-data (let (beg) (elmo-set-work-buf (insert string) (goto-char (point-max)) (when (search-backward "<" nil t) (setq beg (point)) (if (search-forward ">" nil t) (elmo-replace-in-string (buffer-substring beg (point)) "\n[ \t]*" "")))))))) (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 (let ((msgid (elmo-get-message-id-from-field msgid-field))) (or msgid (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 "<" (if (elmo-unfold-fetch-field "date") (timezone-make-date-sortable (elmo-unfold-fetch-field "date")) (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) insert-file-contents-pre-hook ; To avoid autoconv-xmas... insert-file-contents-post-hook 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-as-binary file nil beg (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) (field-body nil)) (while (re-search-forward (concat "^" name ":[ \t]*") nil t) (setq field-body (nconc field-body (list (buffer-substring-no-properties (match-end 0) (std11-field-end)))))) 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)) (if (and (fboundp 'regexp-opt) (not (featurep 'xemacs))) (defalias 'elmo-regexp-opt 'regexp-opt) (defun elmo-regexp-opt (strings &optional paren) "Return a regexp to match a string in STRINGS. Each string should be unique in STRINGS and should not contain any regexps, quoted or not. If optional PAREN is non-nil, ensure that the returned regexp is enclosed by at least one regexp grouping construct." (let ((open-paren (if paren "\\(" "")) (close-paren (if paren "\\)" ""))) (concat open-paren (mapconcat 'regexp-quote strings "\\|") close-paren)))) (require 'product) (product-provide (provide 'elmo-util) (require 'elmo-version)) ;;; elmo-util.el ends here wanderlust-wanderlust-912c443/elmo/elmo-vars.el000066400000000000000000000360771262320455600215500ustar00rootroot00000000000000;;; elmo-vars.el --- User variables for ELMO. -*- coding: iso-2022-jp-unix -*- ;; 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 'poe) (require 'path-util) ;; silence byte compiler (eval-when-compile (defalias-maybe 'dynamic-link 'ignore) (defalias-maybe 'dynamic-call 'ignore)) ;; bind colon keywords for old Emacsen. (dont-compile (condition-case nil :symbol-for-testing-whether-colon-keyword-is-available-or-not (void-variable (let ((kwds '(:cc :date :extra :message-id :number :references :subject))) (while kwds (set (car kwds) (car kwds)) (setq kwds (cdr kwds))))))) (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) (defvar elmo-passwd-alist-file-name "passwd" "*ELMO Password filename.") (defcustom elmo-passwd-life-time nil "*Duration of ELMO Password in seconds. nil means infinity." :type '(choice (const :tag "Infinity" nil) number) :group 'elmo :group 'elmo-setting) (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 ;; User options (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 ;; 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-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 (defvar elmo-database-dl-module (expand-file-name "database.so" exec-directory)) (defvar elmo-database-dl-handle (if (and (fboundp 'dynamic-link) (file-exists-p elmo-database-dl-module)) (if (fboundp 'open-database) t ;; (dynamic-link elmo-database-dl-module)))) (if (and elmo-database-dl-handle (integerp elmo-database-dl-handle)) (dynamic-call "emacs_database_init" elmo-database-dl-handle)) (defvar elmo-use-database (or (featurep 'dbm) (featurep 'gnudbm) (featurep 'berkdb) (featurep 'berkeley-db) ;; static/dl-database (fboundp 'open-database))) (defvar elmo-date-match t "Date match is available or not.") (defvar elmo-network-stream-type-alist `(("!" ssl ,@(cond ((and (fboundp 'gnutls-available-p) (gnutls-available-p)) '(gnutls open-gnutls-stream)) ((module-installed-p 'tls) '(tls open-tls-stream)) (t '(ssl open-ssl-stream)))) ("!!" starttls starttls starttls-open-stream) ("!socks" socks socks socks-open-network-stream) ("!direct" direct nil 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-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). This must be float value.") (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 Cygwin always return the link count "1" :-( (or (memq system-type '(OS/2 emx cygwin)) ;; Meadow seems to have pseudo link count.(suggestion by S.YAMAGUCHI) (and (eq system-type 'windows-nt) (not (featurep 'meadow))))) "Your file system has link count, or not.") (defvar elmo-use-hardlink ;; Any Emacsen may have add-name-to-file(), because loadup.el ;; requires it. :-p Check make-symbolic-link() instead. (fboundp 'make-symbolic-link) "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 '["$BF|(B" "$B7n(B" "$B2P(B" "$B?e(B" "$BLZ(B" "$B6b(B" "$BEZ(B"]) (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 (featurep 'xemacs) "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 (if (boundp 'MULE) '*autoconv* '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-912c443/elmo/elmo-version.el000066400000000000000000000041451262320455600222510ustar00rootroot00000000000000;;; elmo-version.el --- Version information for ELMO. ;; 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.") (defconst elmo-version (product-version-string (product-find 'elmo-version))) (make-obsolete-variable 'elmo-version "use (product-version-string (product-find 'elmo-version)) instead.") ;;; elmo-version.el ends here wanderlust-wanderlust-912c443/elmo/elmo.el000066400000000000000000002107411262320455600205670ustar00rootroot00000000000000;;; elmo.el --- Elisp Library for Message Orchestration. ;; 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) (eval-when-compile (require 'cl)) (if (or (featurep 'dbm) (featurep 'gnudbm) (featurep 'berkdb) (featurep 'berkeley-db)) (require 'elmo-database)) (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) (elmo-define-error 'elmo-error "Error" 'error) (elmo-define-error 'elmo-open-error "Cannot open" 'elmo-error) (elmo-define-error 'elmo-authenticate-error "Login failed" 'elmo-open-error) (elmo-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 (elmo-string name)) (if type (setq prefix (elmo-string name 0 1) name (elmo-string 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 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))) (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 default-enable-multibyte-characters) (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 (sort (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) (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)))) unseen 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 i 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) (let ((len (length appends)) in) (if (and elmo-folder-update-threshold (> len elmo-folder-update-threshold) elmo-folder-update-confirm) (if (y-or-n-p (format "Too many messages(%d) in %s. Update all? " len (elmo-folder-name-internal folder))) appends (setq in elmo-folder-update-threshold) (catch 'end (while t (setq in (read-from-minibuffer "Update number: " (number-to-string in)) in (string-to-number in)) (if (< len in) (throw 'end len)) (if (y-or-n-p (format "%d messages are killed (not appeared). OK? " (max (- len in) 0))) (throw 'end in)))) (nthcdr (max (- len in) 0) appends)) (if (and elmo-folder-update-threshold (> len elmo-folder-update-threshold) (not elmo-folder-update-confirm)) (nthcdr (max (- len elmo-folder-update-threshold) 0) appends) 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 (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)))) (elmo-set-list '(diff-new diff-del) (elmo-list-diff (elmo-folder-list-messages folder) (elmo-folder-list-messages folder nil 'in-msgdb)))) (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. ;; 2001-12-11: *-dir -> *-directory (defalias 'elmo-folder-make-temp-dir 'elmo-folder-make-temporary-directory) (make-obsolete 'elmo-folder-make-temp-dir 'elmo-folder-make-temporary-directory) (require 'product) (product-provide (provide 'elmo) (require 'elmo-version)) ;;; elmo.el ends here wanderlust-wanderlust-912c443/elmo/elsp-bogofilter.el000066400000000000000000000126621262320455600227320ustar00rootroot00000000000000;;; elsp-bogofilter.el --- Bogofilter support for elmo-spam. ;; 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)))) (defmacro elmo-spam-bogofilter-arguments (type) `(elmo-flatten (mapcar #'eval (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))))) (defsubst elsp-bogofilter-register-buffer (buffer spam restore) (with-current-buffer buffer (elmo-spam-bogofilter-call (elmo-spam-bogofilter-arguments 'register)))) (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-912c443/elmo/elsp-bsfilter.el000066400000000000000000000201001262320455600223720ustar00rootroot00000000000000;;; elsp-bsfilter.el --- Bsfilter support for elmo-spam. ;; 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-912c443/elmo/elsp-sa.el000066400000000000000000000116561262320455600212030ustar00rootroot00000000000000;;; elsp-sa.el --- SpamAssassin support for elmo-spam. ;; 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-912c443/elmo/elsp-spamfilter.el000066400000000000000000000103071262320455600227360ustar00rootroot00000000000000;;; elsp-spamfilter.el --- Spamfilter support for elmo-spam. ;; 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-912c443/elmo/elsp-spamoracle.el000066400000000000000000000074771262320455600227340ustar00rootroot00000000000000;;; elsp-spamoracle.el --- SpamOracle support for elmo-spam. ;; 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-912c443/elmo/mmimap.el000066400000000000000000000211341262320455600211070ustar00rootroot00000000000000;;; mmimap.el --- MIME entity module for IMAP4rev1 (RFC2060). ;; **** 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) ".")))) (eval-and-compile (defun-maybe mime-decode-parameters (attrlist) (let (ret-val) (while attrlist (setq ret-val (append ret-val (list (cons (downcase (car attrlist)) (car (cdr attrlist)))))) (setq attrlist (cdr (cdr attrlist)))) ret-val))) (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 content-type 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 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-content-type-internal entity (make-mime-content-type (intern (downcase (car bodystructure))) (if (nth 1 bodystructure) (intern (downcase (nth 1 bodystructure)))) (mime-decode-parameters (nth 2 bodystructure)))) (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-912c443/elmo/modb-entity.el000066400000000000000000000723101262320455600220640ustar00rootroot00000000000000;;; modb-entity.el --- Message Entity Interface. ;; 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: (eval-when-compile (require 'cl)) (require 'luna) (require 'elmo-vars) (require 'elmo-util) (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 (elmo-mime-charset-decode-string string elmo-mime-charset)) (elmo-set-hash-val string decoded hashtb)))) (elmo-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) (elmo-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) (elmo-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 default-enable-multibyte-characters) (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-in-string (elmo-mime-string (or (std11-fetch-field "from") elmo-no-from)) "\t" " ") subject (elmo-replace-in-string (elmo-mime-string (or (std11-fetch-field "subject") elmo-no-subject)) "\t" " ") 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 (elmo-time< field-date specified-date)) (elmo-time< 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))))))) (luna-define-method elmo-msgdb-create-message-entity-from-header ((handler modb-standard-entity-handler) number args) (let (entity size field-name field-body extractor file-attrib) (save-excursion (set-buffer-multibyte default-enable-multibyte-characters) (setq entity (modb-standard-make-message-entity handler (append args (list :number number :message-id (elmo-msgdb-get-message-id-from-header) :references (elmo-msgdb-get-references-from-header) :from (elmo-replace-in-string (or (elmo-decoded-fetch-field "from" 'summary) elmo-no-from) "\t" " ") :subject (elmo-replace-in-string (or (elmo-decoded-fetch-field "subject" 'summary) elmo-no-subject) "\t" " ") :date (or (elmo-decoded-fetch-field "date" 'summary) (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 (lambda (field-body) (mime-decode-field-body field-body "to" 'summary)) (elmo-multiple-field-body "to") ",") :cc (mapconcat (lambda (field-body) (mime-decode-field-body field-body "cc" 'summary)) (elmo-multiple-field-body "cc") ",") :content-type (elmo-decoded-fetch-field "content-type" 'summary) :size (if (setq size (std11-fetch-field "content-length")) (string-to-number size) (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 (cons "newsgroups" (remove "newsgroups" elmo-msgdb-extra-fields))) (unless (memq (setq field-name (intern (downcase extra))) '(number message-id references from subject date to cc content-type size)) (setq extractor (nth 1 (assq field-name modb-entity-field-extractor-alist)) field-body (if extractor (funcall extractor field-name) (elmo-decoded-fetch-field extra 'summary))) (when field-body (modb-standard-entity-set-field entity field-name field-body)))) entity))) ;; 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 ((key (elmo-filter-key condition)) (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 (elmo-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-912c443/elmo/modb-legacy.el000066400000000000000000000454251262320455600220230ustar00rootroot00000000000000;;; modb-legacy.el --- Legacy Implement of MODB. ;; 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: ;; (eval-when-compile (require 'cl)) (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)))) (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)))) (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) (incf new) (incf unread)) ((member (cadr elem) (modb-legacy-unread-marks)) (incf unread)) ((member (cadr elem) (modb-legacy-answered-marks)) (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) (case flag (new (setq mark-regexp (regexp-quote modb-legacy-new-mark))) (unread (setq mark-regexp (elmo-regexp-opt (modb-legacy-unread-marks)))) (answered (setq mark-regexp (elmo-regexp-opt (modb-legacy-answered-marks)))) (important (setq mark-regexp (regexp-quote modb-legacy-important-mark))) (read (setq mark-regexp (elmo-regexp-opt (modb-legacy-unread-marks)))) (digest (setq mark-regexp (elmo-regexp-opt (append (modb-legacy-unread-marks) (list modb-legacy-important-mark))))) (any (setq mark-regexp (elmo-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-912c443/elmo/modb-standard.el000066400000000000000000000535211262320455600223530ustar00rootroot00000000000000;;; modb-standard.el --- Standartd Implement of MODB. ;; 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: ;; (eval-when-compile (require 'cl)) (require 'elmo-util) (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 ((table (modb-standard-entity-map-internal modb)) (filename (expand-file-name (modb-standard-entity-filename (car section)) path)) (handler (elmo-msgdb-message-entity-handler modb)) entity entities) (dolist (number (or (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) (when (string-match entity-regex x) (string-to-number (match-string 1 x)))) (directory-files path nil entity-regex)))) (dolist (entity (car (elmo-list-diff-nonsortable files entities))) (ignore-errors (delete-file (expand-file-name (modb-standard-entity-filename entity) path)))))) (defun modb-standard-save-entity (modb path) (let ((modified (modb-generic-message-modified-internal modb))) (cond ((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)))) (modified (modb-standard-cleanup-stale-entities 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) (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) (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) (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-912c443/elmo/modb.el000066400000000000000000000234161262320455600205550ustar00rootroot00000000000000;;; modb.el --- Message Orchestration DataBase. ;; 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: ;; (eval-when-compile (require 'cl)) (require 'luna) (require 'modb-entity) (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-method elmo-msgdb-message-number ((msgdb modb-generic) message-id) (elmo-message-entity-number (elmo-msgdb-message-entity msgdb 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-method elmo-msgdb-message-field ((msgdb modb-generic) number field &optional type) (elmo-message-entity-field (elmo-msgdb-message-entity msgdb number) field type)) (luna-define-generic elmo-msgdb-message-entity-handler (msgdb) "Get modb entity handler instance which corresponds to the MSGDB.") ;;; generic implement ;; (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))) (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-912c443/elmo/pldap.el000066400000000000000000001126641262320455600207400ustar00rootroot00000000000000;;; pldap.el --- A portable LDAP support for Emacs. ;; 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: ;; (eval-when-compile (require 'cl)) (defmacro ldap-static-if (cond then &rest else) "`if' expression but COND is evaluated at compile-time." (if (eval cond) then `(progn ,@else))) (ldap-static-if (and (not (featurep 'pldap)) (fboundp 'ldap-open)) ;; You have built-in ldap feature (XEmacs). (require 'ldap) ;; 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) body) ;; search for the line which have name with options. (while (re-search-forward (concat "^" name "\\(;[a-zA-Z0-9-]+\\)?:[ \t]*") 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 (and (fboundp 'decode-coding-string) ldap-coding-system) (decode-coding-string str ldap-coding-system) str)) (defun ldap-encode-string (str) "Encode LDAP STR." (if (and (fboundp 'encode-coding-string) 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.") (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 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-seq 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-seq 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-seq 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))) ;; end of ldap-static-if ) (provide 'pldap) ;;; pldap.el ends here wanderlust-wanderlust-912c443/elmo/slp.el000066400000000000000000000106301262320455600204240ustar00rootroot00000000000000;;; slp.el --- An SLP interface. ;; 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: (eval-when-compile (require 'cl)) (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)) (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 (char-after (point)) ?,) (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-912c443/elmo/utf7.el000066400000000000000000000211271262320455600205160ustar00rootroot00000000000000;;; utf7.el --- UTF-7 encoding/decoding for Emacs -*-coding: iso-8859-1;-*- ;; Copyright (C) 1999, 2000, 2003 Free Software Foundation, Inc. ;; Author: Jon K Hellan ;; Maintainer: bugs@gnus.org ;; Keywords: mail ;; GNU Emacs is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to ;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;;; Commentary: ;; UTF-7 - A Mail-Safe Transformation Format of Unicode - RFC 2152 ;; This is a transformation format of Unicode that contains only 7-bit ;; ASCII octets and is intended to be readable by humans in the limiting ;; case that the document consists of characters from the US-ASCII ;; repertoire. ;; In short, runs of characters outside US-ASCII are encoded as base64 ;; inside delimiters. ;; A variation of UTF-7 is specified in IMAP 4rev1 (RFC 2060) as the way ;; to represent characters outside US-ASCII in mailbox names in IMAP. ;; This library supports both variants, but the IMAP variation was the ;; reason I wrote it. ;; The routines convert UTF-7 -> UTF-16 (16 bit encoding of Unicode) ;; -> current character set, and vice versa. ;; However, until Emacs supports Unicode, the only Emacs character set ;; supported here is ISO-8859.1, which can trivially be converted to/from ;; Unicode. ;; When decoding results in a character outside the Emacs character set, ;; an error is thrown. It is up to the application to recover. ;; UTF-7 should be done by providing a coding system. Mule-UCS does ;; already, but I don't know if it does the IMAP version and it's not ;; clear whether that should really be a coding system. The UTF-16 ;; part of the conversion can be done with coding systems available ;; with Mule-UCS or some versions of Emacs. Unfortunately these were ;; done wrongly (regarding handling of byte-order marks and how the ;; variants were named), so we don't have a consistent name for the ;; necessary coding system. The code below doesn't seem to DTRT ;; generally. E.g.: ;; ;; (utf7-encode "a+£") ;; => "a+ACsAow-" ;; ;; $ echo "a+£"|iconv -f iso-8859-1 -t utf-7 ;; a+-+AKM ;; ;; -- fx ;; Modified 5 May 2004 by Yuuichi Teranishi so that it can run with APEL/FLIM ;; instead of mm-util in Gnus. ;; ;; * Use find-coding-system instead of mm-coding-system-p. ;; * Use mel.el instead of base64.el. ;; * Don't use mm-with-unibyte-current-buffer etc. ;; * Do nothing if utf-16 coding system is not found. ;; Modified 31 Aug 2004 by Yuuichi Teranishi so that it can avoid the bug of ;; Emacs 21.3 release version. ;;; Code: (eval-when-compile (require 'cl)) (require 'pces) (require 'mel) ;; base64 encoding/decoding (defun utf7-base64-encode-region (beg end &optional no-line-break)) (defun utf7-base64-decode-region (beg end)) (fset 'utf7-base64-encode-region (mel-find-function 'mime-encode-region "base64")) (fset 'utf7-base64-decode-region (mel-find-function 'mime-decode-region "base64")) (defconst utf7-direct-encoding-chars " -%'-*,-[]-}" "Character ranges which do not need escaping in UTF-7.") (defconst utf7-imap-direct-encoding-chars (concat utf7-direct-encoding-chars "+\\~") "Character ranges which do not need escaping in the IMAP variant of UTF-7.") (eval-and-compile (defun utf7-find-coding-system-without-bom (cs) (and (fboundp 'find-coding-system) (find-coding-system cs) ;; Avoid versions with BOM. (= 2 (length (encode-coding-string "a" cs))) cs))) (defconst utf7-utf-16-coding-system (or ;; Emacs 22, Emacs 23 (utf7-find-coding-system-without-bom 'utf-16be) ;; (utf7-find-coding-system-without-bom 'utf-16-be) ;; Mule-UCS (utf7-find-coding-system-without-bom 'utf-16-be-no-signature)) "Coding system which encodes big endian UTF-16.") (defsubst utf7-imap-get-pad-length (len modulus) "Return required length of padding for IMAP modified base64 fragment." (mod (- len) modulus)) (defun utf7-encode-internal (&optional for-imap) "Encode text in (temporary) buffer as UTF-7. Use IMAP modification if FOR-IMAP is non-nil." (let ((start (point-min)) (end (point-max))) (narrow-to-region start end) (goto-char start) (let* ((esc-char (if for-imap ?& ?+)) (direct-encoding-chars (if for-imap utf7-imap-direct-encoding-chars utf7-direct-encoding-chars)) (not-direct-encoding-chars (concat "^" direct-encoding-chars))) (while (not (eobp)) (skip-chars-forward direct-encoding-chars) (unless (eobp) (insert esc-char) (let ((p (point)) (fc (following-char)) (run-length (skip-chars-forward not-direct-encoding-chars))) (if (and (= fc esc-char) (= run-length 1)) ; Lone esc-char? (delete-char -1) ; Now there's one too many (utf7-fragment-encode p (point) for-imap)) (insert "-"))))))) (defun utf7-fragment-encode (start end &optional for-imap) "Encode text from START to END in buffer as UTF-7 escape fragment. Use IMAP modification if FOR-IMAP is non-nil." (let ((converter (utf7-get-u16char-converter 'to-utf-16)) (str (buffer-substring start end)) pm) (when converter (delete-region start end) (goto-char start) (insert (with-temp-buffer (insert str) (funcall converter) (set-buffer-multibyte nil) (utf7-base64-encode-region (point-min) (point-max)) (goto-char (point-min)) (setq pm (point-max)) (when for-imap (while (search-forward "/" nil t) (replace-match ","))) (skip-chars-forward "^= \t\n" pm) (delete-region (point) pm) (buffer-string)))))) (defun utf7-decode-internal (&optional for-imap) "Decode UTF-7 text in (temporary) buffer. Use IMAP modification if FOR-IMAP is non-nil." (let ((start (point-min)) (end (point-max))) (goto-char start) (let* ((esc-pattern (concat "^" (char-to-string (if for-imap ?& ?+)))) (base64-chars (concat "A-Za-z0-9+" (char-to-string (if for-imap ?, ?/))))) (while (not (eobp)) (skip-chars-forward esc-pattern) (unless (eobp) (forward-char) (let ((p (point)) (run-length (skip-chars-forward base64-chars))) (when (and (not (eobp)) (= (following-char) ?-)) (delete-char 1)) (unless (= run-length 0) ; Encoded lone esc-char? (save-excursion (utf7-fragment-decode p (point) for-imap) (goto-char p) (delete-char -1))))))))) (defun utf7-fragment-decode (start end &optional for-imap) "Decode base64 encoded fragment from START to END of UTF-7 text in buffer. Use IMAP modification if FOR-IMAP is non-nil." (save-restriction (narrow-to-region start end) (let ((converter (utf7-get-u16char-converter 'from-utf-16))) (when converter (when for-imap (goto-char start) (while (search-forward "," nil 'move-to-end) (replace-match "/"))) (let ((pl (utf7-imap-get-pad-length (- end start) 4))) (insert (make-string pl ?=)) (utf7-base64-decode-region start (+ end pl))) (funcall converter))))) (defun utf7-get-u16char-converter (which-way) "Return a function to convert between UTF-16 and current character set." (if utf7-utf-16-coding-system (if (eq which-way 'to-utf-16) (lambda () (encode-coding-region (point-min)(point-max) utf7-utf-16-coding-system) (set-buffer-multibyte nil) (goto-char (point-min)) ;; Remove BOM (Big-endian UTF-16 FE FF) for Mule-UCS (while (re-search-forward "\376\377" nil t) (delete-region (match-beginning 0) (match-end 0)))) (lambda () (goto-char (point-min)) (decode-coding-region (point-min) (point-max) utf7-utf-16-coding-system))))) (defun utf7-encode (string &optional for-imap) "Encode UTF-7 STRING. Use IMAP modification if FOR-IMAP is non-nil." (let ((default-enable-multibyte-characters t)) (with-temp-buffer (insert string) (utf7-encode-internal for-imap) (buffer-string)))) (defun utf7-decode (string &optional for-imap) "Decode UTF-7 STRING. Use IMAP modification if FOR-IMAP is non-nil." (let ((default-enable-multibyte-characters nil)) (with-temp-buffer (insert string) (utf7-decode-internal for-imap) (set-buffer-multibyte t) (buffer-string)))) (defalias 'utf7-encode-string 'utf7-encode) (defalias 'utf7-decode-string 'utf7-decode) (provide 'utf7) ;;; utf7.el ends here wanderlust-wanderlust-912c443/etc/000077500000000000000000000000001262320455600171235ustar00rootroot00000000000000wanderlust-wanderlust-912c443/etc/ChangeLog.1.ja000066400000000000000000002611341262320455600214340ustar00rootroot000000000000001998-12-02 Yuuichi Teranishi * 0.8.8 - "Veronica" * news $B5-;v$r%-%c%s%;%k$9$k$H$-$b(B wl-mail-send-pre-hook $B$r8F$V(B $B$h$&$K$7$?!#(B * im-wl.el $B$NHsF14|(B imput $B$r;H$C$F$$$k>l9g(B news $B5-;v$r(B $B%-%c%s%;%k$G$-$J$+$C$?$N$r=$@5!#(B * Summary $B$G(B 'E' reedit $B$7$?$H$-!"(Bdraft $B$N%P%C%U%!$,(B read-only $B$K(B $B$J$C$F$7$^$&>l9g$,$"$kLdBj$KBP=h!#(B ($B?@V:$5$s(B $B$h$j8f;XE&!#(B) * $BJD$8$?%9%l%C%I$r:o=|$7$?$H$-$K$=$N;R$I$b$,9TJ}ITL@$K$J$k$N$r(B $B=$@5(B($B?@V:$5$s(B $B$h$j8f;XE&!#(B) * wl-mail-send-pre-hook $B$N8F$P$lJ}$rJQ99!#(B im-wl.el $B$G(B imput $B$r;H$&>l9g$H(B elisp $BHG$N>l9g$G%P%C%U%!$N>uBV$,(B $BF1$8$K$J$k$h$&$K$7$?!#(B 1998-12-01 Yuuichi Teranishi * $BJQ?t(B wl-insert-message-id $B$,$^$k$C$-$jL5;k$5$l$F$$$?$N$r=$@5!#(B 1998-12-01 Masahiro MURATA ($BB * update all $B$G%5%^%j$r:n$jD>$9$H$-!$%9%l%C%I$N?F$h$j;R$,e$N4X?t$r:F5"E*$K8F$S=P$5$J$$$h$&=$@5!#(B * $BJ6$i$o$7$$0l;~JQ?t$NL>A0$r=$@5(B (num -> len, number -> num)$B!#(B * nntp (not xover) $B$G?75,%a%C%;!<%8$K(B "N" $B%^!<%/$,$D$+$J$$$N$r=$@5!#(B * wl-auto-select-next $B$,(B t $B$N$H$-$K%5%^%jFb$r0\F0$7$F$b(B "Updated (-0/+1) message(s)" $B$J$I$NI=<($r>C$5$J$$$h$&$K$7$?!#(B 1998-11-30 Yuuichi Teranishi * msgdb $B$K(B $B:G8e$N(B message-id $B$7$+J]B8$7$J$$$h$&$K$7$?!#(B * wl-summary-weekday-name-lang $B$, * wl-highlight-body-too$B$,(Bnil$B$N;~$O!"%I%i%U%H$N(B body $B$b%O%$%i%$%H$7(B $B$J$$$h$&$K$7$?!#(B 1998-11-30 Yuuichi Teranishi * [elmo]elmo-localdir-msgdb-create-overview-entity-from-file $BCf$N(B insert-file-contents $B$G5/$3$k%(%i!<$rL5;k$9$k$h$&$K$7$?!#(B ($B2,ED$5$s(B $B$h$j8f;XE&!#(B) * wl-summary-mark-collect $B$,!"JD$8$?%9%l%C%I$G%a%C%;!<%8$r=EJ#$7$F(B $B=8$a$F$7$^$&$?$a!":o=|;~$K%9%l%C%I$,$*$+$7$/$J$k$3$H$,$"$k$N$r=$@5!#(B 1998-11-29 OKUNISHI Fujikazu * local[dir|news] $B$@$1(B pack $B$r%5%]!<%H!#(B 1998-11-29 Masahiro MURATA ($BB * wl-thread-insert-entity, wl-thread-update-line-on-buffer, wl-thread-entity-check-prev-mark, wl-thread-entity-check-next-mark $B$N3F4X?t$G:F5"E*$K(B binding $B$5(B $B$l$k%m!<%+%kJQ?t$r:o8:$7$?!#(B * wl-summary.el $B$H(B wl-thread.el $B$N%P%$%H%3%s%Q%$%k;~$N%a%C%;!<%8(B $B$r:o8:$7$?(B($B%m!<%+%kJQ?t$N@0M}$r$7$?(B)$B!#(B * timezone-fix-time $B$G%(%i!<$,5/$3$C$F$b%5%^%j$r:n@.$G$-$k$h$&$K(B $B$7$?!#(B * $BJ#?t%a%C%;!<%8$G$N%9%l%C%I%"%C%W%G!<%H$H%9%l%C%I:o=|$N9bB.2=$r(B $B9T$C$?!#(B * $B%5%^%j>pJs$,$J$$>l9g(B wl-summary-buffer-msgdb $B$,(B '(nil nil nil nil) $B$K$J$k$3$H$,H?1G$5$l$F$$$J$+$C$?$N$rH?1G$7$?!#(B * wl-summary-sync $B$N(B update all $B$G8E$$(B entity $B>pJs$,;D$C$F$7$^$&(B $B$N$r=$@5$7$?!#(Bwl-thread-entities $B$,(B nil $B$K(B set $B$5$l$F$$$J$+$C(B $B$?$?$a!#(B * elmo-util.el $B$H(B wl-util.el $B$N4X?t$G8DJL$K%P%C%U%!$r:n$C$F$$$?$N(B $B$r(B1$B$D$K$^$H$a$F9bB.2=$7$?!#(B * sample.dot.wl $B$r99?7$7$?!#(Bwl-highlight-group-folder-by-numbers $B$NDI2C$H!$(Bmy-wl-summary-from-func-petname $B$N%P%0=$@5!#(B 1998-11-29 Yuuichi Teranishi * wl-ja.texi $B$K2CI.!&=$@5!#(B * [elmo] localdir, archive, pop3, nntp $B$N3F%^!<%/@8@.ItJ,$G(B seen-list $B$rMxMQ$9$k$h$&=$@5!#(B * sync-all, sync-update $B$GA0$NL$FI>uBV$r0z$-7Q$0$h$&$K$7$?!#(B * [elmo] elmo-msgdb-create $B$N0z?t$K(B seen-list $B$rDI2C!#(B 1998-11-28 OKUNISHI Fujikazu * elmo-call-func $B$NJQ99$N$?$a!"5/F0;~$K(Barchive $B%U%)%k%@$N(B $B%U%)%k%@%A%'%C%/$K<:GT$9$k$h$&$K$J$C$F$7$^$C$?$N$r=$@5!#(B 1998-11-28 Yuuichi Teranishi * $B?75,JQ?t(B wl-summary-weekday-name-lang$B!#%G%U%)%k%H$O(B "ja"$B!#(B * wl-summary-wday-use-japanese -> $BGQ;_!#(B * [elmo] elmo-plugged $B$,(B 2 $B2s(B defvar $B$5$l$F$$$?$N$r=$@5(B ($B;{ED$5$s(B $B$h$j8f;XE&!#(B) 1998-11-27 Masayuki TERADA * [elmo] elmo-folder-identical-system-p $B$N%m%8%C%/$,:xAn$7$F$$$?$N(B $B$r2~A1!#(B 1998-11-27 Masahiro MURATA ($BB * wl-interactive-exit $B$,(B t $B$N$H$-!$=*N;3NG'$G(B n $B$HEz$($F$+$i:FEY(B M-x wl $B$r * elmo-date $B$,%$%s%9%H!<%i$KF~$C$F$$$J$+$C$?$N$r=$@5!#(B 1998-11-27 Yuuichi Teranishi * 0.8.6 - "True Colors" * localdir, imap4 $B$O(B since $B$H(B before $B$GF|IU8!:w$G$-$k$h$&$K$7$?!#(B ($BKLL\$5$s(B $B$N8fMWK>$K4p$E$/(B)$B!#(B * $BF|IU$1=hM}%b%8%e!<%kMQ?75,%U%!%$%k(B elmo-date.el $B$rDI2C!#(B * $B%9%l%C%I$,:o=|$5$l$?$H$-!"%9%l%C%I%H%C%W$N%j%9%H$,@5$7$/$J$/$J$k(B $B$N$r=$@5(B ($BB $B$h$j8f;XE&(B)$B!#(B * elmo-localdir-copy-msgs $B$K(B (require 'elmo-archive) $B$rDI2C!#(B ($B;{ED$5$s(B $B$h$j8f;XE&!#(B) 1998-11-27 Masahiro MURATA ($BB * elmo-call-func $B$G(B elmo-folder-get-spec $B$,L5BL$K8F$P$l$F$$$?$N$r(B $B=$@5!#(B * .folders $B$NF,$K$D$1$F$$$?%U%)%k%@%?%$%W$N@bL@$r:o=|!#(B 1998-11-26 Shun-ichi GOTO * elmo-read-passwd $B$G(B prompt $B$K(B '%' $B$,4^$^$l$F$$$k$H%(%i!<$K$J$k(B $B$N$r=$@5!#(B 1998-11-26 Yuuichi Teranishi * $B%9%l%C%I9=B$$N%;!<%V$K$+$+$k;~4V$rC;=L!#(B $B"*(B $B%;!<%V;~$K$$$A$$$A(B obarray $B$+$i%;!<%V$9$k(Blist $B$r@8@.$9$k$N$r$d$a!"(B $B%9%l%C%ILZ9=B$$N%N!<%I$N%j%9%H$r%P%C%U%!%m!<%+%kJQ?t$KJ];}$9$k$3$H(B $B$K$7$?!#(B * $BJD$8$?%9%l%C%I$K1#$5$l$?%a%C%;!<%8$N=hM}$, * 0.8.5 - "Sussudio" * IMAP4 $B$G(B RFC822 $B$N%Q!<%H$,5pBg$G%9%-%C%W$5$l$?>l9g$K(B mime-entity $B$N(B body-start $B$H(B body-end $B$, $B$h$j8fMWK>(B) * $BB $B$h$j8f;XE&(B)$B!#(B 1998-11-25 Shun-ichi GOTO * $B4X?t(B elmo-pop3-get-connection $B$K?7$7$$0z?t(B auth$B$rDI2C!#(B * $B4X?t(B elmo-pop3-open-connection $B$K?7$7$$0z?t(B auth$B$rDI2C!#(B * $B?75,4X?t(B elmo-pop-make-apop-digest $B$rDI2C!#(B * $B?75,JQ?t(B elmo-default-pop3-authenticate-type ($B%G%U%)%k%H$NG'>ZJ}K!(B)$B!#(B * $B4X?t(B elmo-pop3-open-connection $B$K$F!"(BAPOP$B%3%^%s%I$K$h$kG'>Z$N$?$a$N(B $B%3!<%I$rDI2C!#(B * POP $B%U%)%k%@$N=q<0$r(B user[/auth]@host[:port] $B$H$7$?!#(B * [elmo-pop3] APOP $BBP1~!#(B 1998-11-24 Yuuichi Teranishi * 0.8.4 - "Rosanna" * 'mo' 'mO' $B$G%^!<%/$,$J$$$H$-@hF,$K%^!<%/$,$D$$$F$7$^$&$N$r=$@5!#(B * $B%9%l%C%I$,$^$@$&$^$/:o=|$G$-$F$J$+$C$?$N$r=$@5!#(B ($BDEM8$5$s(B $B$N8f;XE&(B) * "#" $B$O$d$C$Q$j$^$:$$$N$G(B pop3 $B$N%U%)%k%@J8;z$r(B "&" $B$KJQ99!#(B ($B8eF#$5$s(BShun-ichi GOTO $B$N8f;XE&(B)$B!#(B 1998-11-24 Shun-ichi GOTO * POP3 $B$O%;%C%7%g%sCf$K?7Ce%a!<%k$r8!=P$9$k5!G=$,$J$$$?$a(B scan: update $B$7$F$b?7Ce$,8=$l$J$$BP:v$H$7$F(B list$B;~$K$O6/@)E*$K0lEY%;%C%7%g%s$r@Z$k$h$&$K$7$?!#(B 1998-11-24 Yuuichi Teranishi * 0.8.3 - "Pop Life" * $B%9%l%C%I$,$&$^$/:o=|$G$-$J$$%P%0$r=$@5!#(B * elmo-maildir.el $B$,%$%s%9%H!<%k$5$l$J$$$N$r=$@5!#(B * 0.8.2 - "Open Arms" 1998-11-23 Yuuichi Teranishi * $B%m!<%+%k%K%e!<%9$N%Q%9$N%G%j%_%?$O(B "." $B$G$b$h$$$3$H$K$7$?!#(B 1998-11-23 OKUNISHI Fujikazu * $B%m!<%+%k%K%e!<%9!"(B'=' $B$N%5%]!<%H!#(B 1998-11-23 Yuuichi Teranishi * update $B;~$K%(%i!<$,$"$k$H(B Summary $B$,(B modified $B$K$J$C$F$7$^$&$N$r(B $B=$@5!#(B * XEmacs $B$G%"%/%;%9%0%k!<%W$K4^$^$l$k<+J,<+?H$N%"%$%3%s$,(B $BI=<($5$l$J$$%P%0$r=$@5!#(B 1998-11-22 Yuuichi Teranishi * wl-thread-{open|close}-all $B$G=hM}$N?JD=$rI=<($9$k$h$&$K$7$?!#(B * $B%9%l%C%I$NF~$l;R4IM}$r$d$a!"%9%l%C%I9=B$$N8!:w$K$O(B obarray (hashtable) $B$r;H$&$h$&$K$7$?!#(B ($B8eF#$5$s(B Shun-ichi GOTO $B$N8f=u8@$K4p$E$/(B) * wl-thread-jump-to-next-unread $B$N(B hereto $B$,$&$^$/F0$+$J$$>l9g$,(B $B$"$C$?$N$r=$@5!#(B * elmo-pop3.el $B$r $B$N8f=u8@$K4p$E$/(B) 1998-11-21 Masahiro MURATA ($BB * [typo] wl-draft-enable-queueing -> wl-draft-enable-queuing$B!#(B * [typo] wl-interacitve-save-folders -> wl-interactive-save-folders$B!#(B * [wl-ja.texi] x-face-mule $B$N@_DjNc$r=$@5!#(B 1998-11-21 OKUNISHI Fujikazu * [wl-ja.texi] $BJd4V(B -> $BJd40!#(B 1998-11-21 Yuuichi Teranishi * elmo-maildir $B$NDI2C$KH<$&JQ99B??t!#(B * $B?75,%U%!%$%k(B elmo-maildir.el$B!#(B * $B?75,JQ?t(B elmo-maildir-list$B!#%^%C%A$9$k(B localdir $B%U%)%k%@$O(B Maildir $B$H$7$F07$&!#(B 1998-11-20 OKUNISHI Fujikazu * sample.dot.wl $B$G(B msgdb $B$K(B jka-compr $B$rMxMQ$9$kNc$rDI2C!#(B 1998-11-19 Susumu Wakabayashi * $B%I%-%e%a%s%H$NJ8>O$G$$$/$D$+$^$k$,H4$1$F$$$?$N$r=$@5!#(B 1998-11-18 Masahiro MURATA ($BB * $B?75,%U%!%$%k(B sample.dot.wl$B!#(B 1998-11-17 Yuuichi Teranishi * elmo-cache-expire-by-size $B$,(B mule-2.3@19.28 $B$G$bF0$/$h$&$K$7$?!#(B * $B%O%$%i%$%H$N%G%U%)%k%H@_Dj$O(B wl-highlight-background-mode $B$NCM$r8+$k(B $B$h$&$K$7$?(B(Takehama Hirohisa $B$5$s!"(B $B85LZ$5$s(B $B$N8f0U8+$K4p$E$/(B)$B!#(B * $B?75,JQ?t(B wl-highlight-background-mode$B!#(B * $B?75,JQ?t(B wl-highlight-group-folder-by-numbers$B!#(B * $B%0%k!<%W%U%)%k%@$r!"%a%C%;!<%8$N?t$K1~$8$F?'$rJQ$($i$l$k$h$&$K(B $B$7$?(B($BBg_7$5$s(B $B!"(B $B85LZ$5$s(B $B$h$j8fMWK>(B)$B!#(B 1998-11-16 Hidekazu NAKAMURA * wl-summary-exit $B$9$k$H$-$K(B Message $B%P%C%U%!$r(B kill $B$9$k$h$&(B $B$K$7$?!#(B 1998-11-16 Masahiro MURATA ($BB * wl-delete-folder-alist $B$N(B docstring $B$N4V0c$$$r=$@5!#(B 1998-11-16 Masahiro MURATA ($BB * summary $B$N(B update $B;~$K(B important mark $B$NIU$$$?%a%C%;!<%8$,4{$K(B $BB8:_$7$J$$$H!$%5%^%j$+$i>C$($F$7$^$&$N$r=$@5$7$?!#(B * $B%a%C%;!<%8$r:o=|$7$?$H$-$N%]%j%7!<$r%f!<%6$,JQ99$G$-$k$h$&$K$7(B $B$?!#(B 1998-11-15 Yuuichi Teranishi * Message $B%P%C%U%!$,(B modified $B$K$J$C$F$7$^$&$N$r=$@5!#(B 1998-11-14 Yuuichi Teranishi * $B%9%l%C%I$,(B closed $B$J$H$-(B prefetch $B$K<:GT$9$k$N$r=$@5!#(B * $B%9%l%C%I$N(B prefetch $B;~!"%a%C%;!<%8?t$,$*$+$7$+$C$?$N$r=$@5!#(B * [elmo-archive] elmo-archive-get-archive-name $B$G!"B8:_$7$J$$(B $B%U%)%k%@$N$H$-$K4|BT$5$l$k%U%!%$%kL>$,JV$C$FMh$J$$$N$r=$@5!#(B ($B1|@>$5$s(B $B$N8f;XE&(B) 1998-11-14 OKUNISHI Fujikazu * typo fix elmo-funcall() -> elmo-call-func()$B!#(B * $B%G%#%l%/%H%j$r7!$kA0$KF1L>$N%U%!%$%k$,B8:_$9$k$+$r??LLL\$K(B $B%A%'%C%/!#(B * [elmo-archive] $BIQHK$K8F$P$l$J$$4X?t$O(B defun $B$KLa$7$?!#(B 1998-11-12 Masahiro MURATA ($BB * elmo-localdir.el, elmo-imap4.el, elmo-nntp.el $B$,5/F0;~$+$i(B load $B$5$l$J$$$h$&$K$7$?!#(B * nntp$B%U%)%k%@$,(B1$B$D$b$J$/$F$b5/F0;~$K(B elmo-nntp.el $B$,(B load $B$5$l(B $B$k$N$r=$@5$7$?!#(B * `wl-summary-prepared-hook' $B$rDI2C!#(B 1998-11-10 Yuuichi Teranishi * 0.8.1 - "Nasty" 1998-11-09 Yuuichi Teranishi * wl-toggle-plugged $B$G(B modeline $B$,IT@53N$JI=<($K$J$C$F$7$^$&>l9g(B $B$,$"$k$N$r=$@5!#(B * ps-print.el $B$,L5$$4D6-MQ$N?75,JQ?t(B wl-print-message-func$B!#(B wl-summary-print-message->wl-summary-print-message-with-ps-print$B!#(B 1998-11-09 Masahiro MURATA ($BB * unplugged $B$J>uBV$G(B local $B%U%)%k%@$N$_$N%0%k!<%W$r%A%'%C%/$9$k(B $B$H!$%A%'%C%/8e$K(B "Unplugged." $B$N%a%C%;!<%8$,=P$k$N$r=$@5!#(B 1998-11-09 OKUNISHI Fujikazu * MsgDB $B$,(B vector $B2=$5$l$?$N$K(B elmo-archive-parse-mmdf() $B$,BP(B $B1~$7$F$J$+$C$?!J(BOS/2 $B$G(B 'zip $B$J>l9g$K(B msgdb $B:n@.Cf$K$3$1$k!K(B $BIT6q9g$r=$@5!#(B 1998-11-08 Yuuichi Teranishi * unplugged $B$J$H$-$O%9%l%C%I%S%e!<$G$b(B wl-summary-cursor-down $B$G(B cache $B$5$l$F$$$k%a%C%;!<%8$KHt$V$h$&$K$7$?(B ($BC.@P$5$s(B$B$N8f;XE&(B)$B!#(B * [elmo] autoload $B2=!#(B * [elmo] elmo-call-func $B$G(B featurep $B$G$J$$(B backend $B$r(B require $B$9$k$h$&$K$7$?(B($BB $B$N8f=u8@(B $B$K4p$E$/(B)$B!#(B 1998-11-06 Yuuichi Teranishi * WL-ELS $B$r(B 0.7.4 $B$N>uBV$KLa$7$?!#(B * elmo-enable-disconnected-operation $B$,(B nil $B$N$H$-$N(B $BIT6q9g$r$$$/$D$+=$@5(B($BC.@P$5$s(B$B!"(B $BB $B$h$j8f;XE&(B) 1998-11-05 $BIpED(B $BK'?.(B * wl-summary-print-message (with ps-print)$B!#(B 1998-11-05 Yuuichi Teranishi * [im-wl] imput $B%W%m%;%9$NHsF14|2=!#(B 1998-11-05 Masahiro MURATA ($BB * rassq -> rassoc$B!#(B * wl-summary-reedit(wl-draft-reedit) $B$,(Binteger$B2=$K$h$jF0$+$J$/(B $B$J$C$?$N$r=$@5!#(B 1998-11-04 Masahiro MURATA ($BB * nntp (not xover) $B$,(Binteger$B2=$KBP1~$7$F$$$J$+$C$?$N$r=$@5!#(B 1998-11-04 Yuuichi Teranishi * $BAjJQ$o$i$:(B easymenu $B$N4X?t$,8+IU$+$i$:%(%i!<$K$J$k>l9g$,$"$k$N$G(B (require 'easymenu) $B$r(B wl-folder.el $B$KDI2C(B(take@isl.ntt.co.jp $B$h$j8f;XE&(B)$B!#(B * reply $B$K<:GT$9$k%P%0$r=$@5!#(B * 0.8.0 - "Manic Monday" * WL-ELS $B$G(B mime-setup $B$N(B require $B$K<:GT$7$?$i!"(Bmail-mime-setup $B$b(B $B;n$9$h$&$K$7$?!#(B($BB $B$h$j8f;XE&(B) 1998-11-03 Yuuichi Teranishi * $B?75,4X?t(B elmo-msgdb-overview-entity-get-extra-field$B!#(B * $B?75,JQ?t(B elmo-msgdb-extra-fields$B!#(B * '*' $B%^!<%/$,%S%e!<%-%c%C%7%e$K;D$C$F$7$^$&%P%0$r=$@5!#(B * $B%P%C%U%!$+$i(B overview $B$r@8@.$9$k4X?t$r0l$D$K$^$H$a$?!#(B * overview $B$r(B vector $B2=!#(B 1998-11-02 Masahiro MURATA ($BB * [fldmgr] access $B%?%$%W0J30$N%0%k!<%W$K$O(B petname $B$,IU$1$i$l$J(B $B$$$h$&$K$7$?!#(B * [fldmgr] $B%"%/%;%9%0%k!<%W$rJQ99$7$F:o=|$7$?8e$K%;!<%V$9$k$H!$(B $B$=$N%"%/%;%9%0%k!<%W$N%j%9%H$,6u$K$J$k$N$r=$@5$7$?!#(B * [fldmgr] append $B$r$G$-$k$+$.$j(B nconc $B$KCV$-49$($?!#(B * wl-folder-access-info-alist $B$r(B wl-folder-entity $B$KE}9g$5$;$?!#(B * 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 $B$N3F%3%^%s%I$r$9$H!$%P%C%U%!(B $B>e$N(B id $B$HJQ?t$N(B id $B$,0[$J$C$F$7$^$&$N$r=$@5$7$?!#(B * wl-folder-exit $B$G=*N;$9$k$H$-!$C$9$h$&$K$7$?!#$^$?!$8uJd$,(B1$B2hLL$K<}$^$i$J$$$H$-$O%9%/(B $B%m!<%k$9$k$h$&$K$7$?!#(B 1998-11-30 Yuuichi Teranishi * [elmo] imap4, multi, dop $B$N(B msg-num $B$b(B integer $B2=!#(B 1998-10-29 OKUNISHI Fujikazu * [wl-*, elmo-*] msg-num $B$N(B integer $B2=!#(B * [wl-*, elmo-*. smtp.el] integer, symbol $B$NHf3S$r(B eq, memq, assq, rassq $B$G$*$3$J$&!#(B * [elmo-archive] macro $B$N5-=R0LCV$rA0$NJ}$K0\F0!#(B 1998-10-29 Yuuichi Teranishi * [elmo] $B%*%U%i%$%s!&%P!<%A%c%k(B(imap4 $B$N$_(B...)$B!#(B * [elmo] $B%*%U%i%$%s!&%U%)%k%@@8@.!#(B 1998-10-28 Yuuichi Teranishi * 0.7.4 - "Luka" 1998-10-27 Yuuichi Teranishi * wl-ja.texi $B$NJ8;z%3!<%I$r(B JIS $B$K$7$?!#(B * [elmo] $B%*%U%i%$%s!&%j%U%!%$%k(B/$B%3%T! * bbdb-wl.el $B$G!"(Bbbdb-user-mail-names $B$,8z$$$F$k$H$-$K(B To $B$K(B encoded-word $B$,$"$k$H$^$:$$$N$r=$@5!#(B 1998-10-26 Masahiro MURATA ($BB * [elmo] wl-match-buffer->elmo-match-buffer. 1998-10-25 Masahiro MURATA ($BB * elmo-nntp.el $B$N(B typo $B=$@5!#(B 1998-10-25 Yuuichi Teranishi * wl-ja.texi $B$K2CI.(B/$B=$@5!#(B * wl-generate-mailer-string-func $B$N(B default $B$r(B 'wl-generate-user-agent-string $B$K$7$?!#(B * Folder 'F' -- $B%-%e!<$K$"$k%a%C%;!<%8$rAw?.!#(B * $B?75,JQ?t(B wl-auto-flush-queue $B%H%0%k$7$?$H$-$K<+F0E*$K%-%e!<$rAw$k!#(B * $B?75,JQ?t(B wl-draft-enable-queueing$B!#(Boffline $B$J$iAw?.$r%-%e!<%$%s%0!#(B * $B%*%U%i%$%s%a%C%;!<%8Aw?.!#(B * Folder $B$G(B'$B%4%_H"$r6u$K(B'$B$7$?$"$H!"%5%^%j$,$*$+$7$/$J$k$N$r=$@5!#(B 1998-10-24 TSUMURA Tomoaki * bbdb-wl.el $B$G!"(Bbbdb-user-mail-names $B$,8z$/$h$&$K$7$?!#(B 1998-10-24 OKUNISHI Fujikazu * elmo-archive.el $B$G(B 'tgz $B0J30$G$OFI$a$J$/$J$C$F$?$N$r=$@5!#(B 1998-10-24 Masahiro MURATA ($BB * $BB??t$N%K%e!<%9%0%k!<%W%U%)%k%@$N%A%'%C%/=hM}$rBgI}$K9bB.2=$7$?!#(B * $BJQ?t(B `wl-folder-newsgroups-alist' $B$rG[Ns(B(vector) `wl-folder-newsgroups-hashtb' $B$KJQ99$7$?!#(B * [elmo-nntp] xover $B$KBP1~$7$F$$$J$$%K%e!<%9%5!<%P$G$b(B overview $B>pJs$,$O$=$l$>$l(B elmo $B$NBP1~$9$k4X?t$N(B alias $B$H$7$?!#(B * elmo-msgdb-get-field-value $B$,(B2$BEY(B narrow-to-region $B$9$k$N$G!$(B SEMI $B$N>l9g$K(B std11-fetch-field $B$,$"$k$J$i$=$l$r;H$&$h$&$K$7$?!#(B 1998-10-24 Yuuichi Teranishi * wl-use-semi $B$N(B default $B$r(B (module-installed-p 'mime-view) $B$K$7$?!#(B * wl-from $B$N(B default $B$r(B user-mail-address $B$K$7$?!#(B * $B3+;O;~$K(B wl-plugged $B$,(B nil $B$J$i%*%U%i%$%s>uBV$+$i3+;O(B $B$9$k$h$&$K$7$?!#(B * view-cache $B$N%;!<%V;~$K0l;~E*%^!<%/$r>C$9$h$&$K$7$?!#(B * Summary $B$KL$=hM}$N(B refile, delete, copy $B$N%^!<%/$,$"$k$N$K(B $B=*N;$7$h$&$H$7$?>l9g$O=hM}$9$k$+$I$&$+3NG'$9$k$h$&$K$7$?!#(B ($BB $B$h$j8f=u8@(B) 1998-10-22 OKUNISHI Fujikazu * [elmo] localdir $B$r$A$g$C$H$@$19bB.2=!#(B 1998-10-20 Yuuichi Teranishi * 0.7.3 - "Kyrie" * access $B%U%)%k%@$N%U%)%k%@>pJs%U%!%$%k$N(B old compatibility $B$N%A%'%C%/ItJ,(B(?)$B$r=$@5!#(B * wl-thread-jump-to-prev-unread $B$r * wl-ja.texi $B$K2CI.!#(B * User-Agent $B%U%#!<%k%I$N@8@.$O4X?t(B wl-generate-user-agent-string $BFb$G(B $B$N$_9T$J$&$h$&$K$7$?!#(Bmime-edit-insert-user-agent-field $B$,(B t $B$J$i(B mime-edit-user-agent-value $B$NCM$r;H$&!#(B * $B%^%k%A%U%)%k%@$G%a%C%;!<%8$,8:$C$?$H$-$K%9%l%C%I9=B$$,$*$+$7$/$J$k(B $B$3$H$,$"$C$?$N$r=$@5!#(B * $BJD$8$?%9%l%C%I$N%"%C%W%G!<%H;~$K%O%$%i%$%H$,$*$+$7$+$C$?$r=$@5!#(B * [elmo] mmelmo-imap4 $B%P%C%/%(%s%I$,%a%=%C%I(B content-entity $B$G%(%i!<$rH/@8$9$k>l9g$,$"$k$N$r=$@5!#(B 1998-10-18 OKUNISHI Fujikazu * eq $B$G:Q$`$H$3$m!J(Bsymbol $B$NHf3S!K$^$G(B equal $B$,;H$o$l$F$?$N$,(B $BL\N)$C$?$N$G!"L@$i$+$K(B symbol $B$NHf3S$H$o$+$k$H$3$m$rCV49$7$?!#(B * wl-folder-accessible-p() $B$K(B 'archive $B$r2C$($?!#(B * wl-ja.texi $B$N%"!<%+%$%V%U%)%k%@It$N5-=R$N=$@5!#(B 1998-10-18 Masahiro MURATA ($BB * fldmgr $B$G3Fl9g!$(BDesktop $B%0%k!<%W$KB?=E$KL$FI?t$,DI2C$5$l$k$N$r(B $B=$@5$7$?!#(B * wl-fldmgr.el $B$N%3!<%I$N(B refine (equal->eq $BEy$r4^$`(B)$B!#(B 1998-10-16 Yuuichi Teranishi * [elmo] capability $B$N%A%'%C%/$,(B XEmacs $B0J30$G$&$^$/F0$+$:!"(B IMAP4rev1 $B$G$b(B IMAP4 $B$H4*0c$$$9$k$h$&$K$J$C$F$$$?$?$a!"(B References $B$r;H$C$?%9%l%C%I2=$,(B XEmacs $B0J30$GF0$+$J$/$J$C$F(B $B$7$^$C$F$$$?$N$r=$@5!#(B * [fldmgr] $B%U%)%k%@$N%;!<%V;~!"(B.folders $B$,B8:_$7$J$$$H$-!"(B .bak $B$K(B rename-file $B$7$h$&$H$7$F%(%i!<$K$J$k$N$r=$@5!#(B * convert-standard-filename $B$G%U%!%$%kL>$K;H$($J$$J8;z$rCV$-49$($k(B $B$h$&$K$7$?!#(BMule for Win32 $B$X$OFH<+$KBP1~!#(B * [elmo] $B%M%C%H%o!<%/%W%m%;%9$N(B process-status $B$,(B 'exit $B$N$H$-$b(B $B%3%M%/%7%g%s$rD%$j$J$*$9$h$&$K$7$?!#(B 1998-10-14 Yuuichi Teranishi * [elmo] XEmacs 21.2 $B$G(B backspace $B$J$I$N(B event $B%-!<$N0lIt$r(B char $B$H$7$FFI$a$k$h$&$K$9$k%3!<%I$r(B x-pgp-sig $B$+$i%Q%/$i$;$F(B $B$$$?$@$$$?!#(B 1998-10-13 Yuuichi Teranishi * 0.7.2 - "Joanna" * [elmo] RFC1730 $B$G$b$=$3$=$3F0$/$h$&$K$7$?!#(B * $B%+%l%s%H%U%)%k%@$N%O%$%i%$%H$N(B regexp $B=$@5!#(B * XEmacs $B$N%Q%C%1!<%8$H$7$F%$%s%9%H!<%k$G$-$k$h$&$K$7$?!#(B (make package; make install-package) * easymenu $B$O(B require $B$9$k$h$&$K$7$?!#(B 1998-10-12 Masahiro MURATA ($BB * wl-folder-open-folder $B$,@5>o$KF0:n$7$J$/$J$C$?$N$r=$@5$7$?!#(B * wl-folder-unread-regex $B$N0z?t(B group $B$,(B nil $B$NF0:n$,JQ$o$C$?$N(B $B$r=$@5$7$?!#(B * wl-folder-move-cur-folder $B$,(B non-nil $B$N;~$NF0:n$,JQ$o$C$?$N$r(B $B=$@5$7$?!#(B * $BF1$8(B entity $B$,J#?t$"$C$?>l9g!$(Bwl-folder-update-unread $B$G$O(B wl-folder-entity-alist $B$d%0%k!<%W$NI=<(?t$,(B1$B$D$N(B entity $B$7$+99(B $B?7$5$l$J$$$N$r=$@5$7$?!#(B 1998-10-12 Yuuichi Teranishi * Folder $B%A%'%C%/;~$KL$FI?t$N99?7$,$*$+$7$+$C$?$N$r=$@5(B * wl-thread- $B7O$N%3%^%s%I$G:G8e$N%a%C%;!<%8$,=hM}$5$l$J$/$J$C$F(B $B$7$^$C$?$N$r=$@5!#(B($BDEM8$5$s(B $B$N8f;XE&(B) * 0.7.1 - "In Too Deep" 1998-10-11 Yuuichi Teranishi * [elmo-archive.el] $B%U%)%k%@$N:G8e$,(B "/" $B$@$H(B .folders $B$K(B $B=q$1$J$$$N$G%U%)%k%@$NBh(B 3 $B%9%Z%C%/(B ($B=q8KFb$N%Q%9>pJs(B)$B$NKvHx$K(B "/" $B$r$D$1$J$/$F$b$h$$$h$&$K$7$?!#(B * [elmo] $B%*%U%i%$%s(B FCC$B!#(B * Message-ID $B$,$J$$$H$-$K(B Summary $B$,$*$+$7$/$J$k$N$r=$@5!#(B * Folder mode $B$G%0%k!<%W$K$bL$FI?tI=<(!#(B * [im-wl.el] Message-Id -> Message-ID$B!#(B 1998-10-11 Masahiro MURATA ($BB * [elmo] filter$B$d(Bmulti$B%U%)%k%@Fb$N(B localdir $B%a%C%;!<%8$O(B cache $B$7$J$$$h$&$K$7$?!#(B * $B%"%/%;%9%0%k!<%W$O(B rename $B$G$-$J$$$h$&$K$7$?!#(B * save $B;~$K;HMQ$5$l$F$$$J$$(B petname $B$O:o=|$9$k$h$&$K$7$?!#(B 1998-10-11 OKUNISHI Fujikazu [elmo-archive.el] * elmo-archive-header-delimiter $B$r=PNO$7$J$$%"!<%+%$%P!J(BGNU tar $B$J$I!K(B $B$N>l9g!"(Blist-folder-subr() $BFbIt$GL58B%k!<%W$K4Y$k$N$r=$@5$7$?!#(B * $B1\Mw@lMQ%b!<%I$r@Q6KE*$K%5%]!<%H$9$k$?$a!"=q8K$N2~JQ$rH<$J$&4X?t$K$D(B $B$$$F$O%a%=%C%I$,Dj5A$5$l$F$k$+$I$&$+$rD4$Y$k$3$H$G%(%i!<$rH/@8$9$k$h(B $B$&$K$7$?!#(B * Info-Zip $B$,:G$bE,$7$F$$$k$H$N7kO@$+$i!"%G%U%)%k%H$r(B 'zip $B$K$7$?!#(B * tar => gtar [elmo-util.el] * elmo-archive-get-spec() $B$G%I%i%$%V%l%?!<$bl9g$K(B Fcc $B$9$k$H(B Fcc $B$5$l$?%a%C%;!<%8$K(B Message-ID: $B$,$D$+$J$$IT6q9g$,H/@8(B $B$7$F$$$?$N$r=$@5$7$?!#(B * more typo fix (s/strucuture/structure/g) 1998-10-10 Yuuichi Teranishi * wl-summary-temp-mark-region $B$NHO0O$rJQ99!#(B ($BDEM8$5$s(B $B$N8f;XE&(B) 1998-10-09 Yuuichi Teranishi * [elmo-archive.el] ':'->';', ange-ftp/efs $B$X$NBP1~(B, tar+gz $BBP1~(B, $B=q8KFb%Q%9>pJs!#(B 1998-10-08 Yuuichi Teranishi * $B$h$/8F$P$l$k(B defun $B$r(B defsubst $B$KCV$-49$($?(B (scan $B$NB.EY$,Ls(B 20% $B$/$i$$8~>e(B)$B!#(B 1998-10-08 pf21 GOTO_Toshiya * wl-summary-temp-mark-copy $B$N%a%C%;!<%8$r=$@5!#(B 1998-10-07 Yuuichi Teranishi * Message-Id -> Message-ID$B!#(B * wl-highlight-message $B$G!"(Bre-search-forward $B$N0z?t$,B-$j$J$+$C$?(B $B$?$a$K%(%i!<$,5/$3$k>l9g$,$"$k$N$r=$@5!#(B 1998-10-05 Yuuichi Teranishi * $B$$$/$D$+$N%a%C%;!<%8$N(B typo $B$r=$@5!#(B ($B;086$5$s(B $B$h$j8f;XE&(B) * 0.7.0 - "Hungry Heart" 1998-10-04 Masahiro MURATA ($BB * $B%K%e!<%95-;v$N9TF,$K$"$k%I%C%H(B(.)$B$r:o$k=hM}$,4V0c$C$F$$$?(B($BM>J,$J(B $B%I%C%H$,IU$$$?$^$^$K$J$k(B)$B$N$r=$@5$7$?!#(B * 1$BDL$b5-;v$,$J$$%K%e!<%9%0%k!<%W$G$O(B elmo-nntp-list-folder $B$NLa$jCM(B $B$,(B nil $B$K$J$k$h$&$K$7$?!#(B 1998-10-04 OKUNISHI Fujikazu * wl-ja.texi $B$N4V0c$$$r=$@5!#(B 1998-10-04 Yuuichi Teranishi * [elmo] $B%^!<%/!&%*%U%i%$%s=hM}$N * $B%0%k!<%W$G$b(B petname $B$r$D$1$i$l$k$h$&$K$7$?!#(B * [elmo] auth->login $B@ZBX$(;~!"(By-or-n-p $B$G3NG'$9$k$h$&$K$7$?!#(B ($BC.@P(B $B$5$s(B $B$N8f=u8@$K4p$E$/(B) * [elmo] imapd $B$N(B capability $B$r%A%'%C%/$9$k$h$&$K$7!"(Bauthenticate $B$,(B $B$G$-$J$1$l$P(B 'auth' $B$G$b(B 'login' $B$GG'>Z$9$k$h$&$K$7$?!#(B * [elmo] append $B;~$K(B append $B2DG=$+$I$&$+%A%'%C%/$9$k$h$&$K$7$?!#(B * [elmo] Cyrus imapd $B$KBP1~!#(B 1998-10-03 OKUNISHI Fujikazu * elmo-archive-default-type $B$,;2>H$5$l$F$J$+$C$?$N$r=$@5!#(B * $B%O!<%I%j%s%/2DG=$+$I$&$+$rD4$Y$k$N$K!"(Badd-name-to-file $B$,$"$k$+(B $B$I$&$+$rD4$Y$k$N$OA4$/0UL#$,$J$$$N$G!"(Bmake-symbolic-link $B$rD4$Y(B $B$k$3$H$GBeMQ$7$?!#(B * elmo-archive-list-folders $B$G:FMxMQ$9$k$?$a$K(B elmo-localdir-list-folders-subr $B$G$N@55,I=8=$rJQ99!#(B * elmo-archive-copy-msgs() $B$r archive $B$N;~$@$1M-8z!#(B 1998-10-02 pf21 GOTO_Toshiya * Mule for win32 $B$G$bG'<1$G$-$k$h$&(B wl-highlight.el $B$N?'Dj5A$r(B $B=$@5!#(B 1998-10-02 TSUMURA Tomoaki OKUNISHI Fujikazu * wl-ja.texi $B$N4V0c$$$r=$@5!#(B 1998-10-01 Yuuichi Teranishi * citation $B$N%O%$%i%$%H?'$r0zMQ$4$H$KJQ$($k$h$&$K$7$?!#(B ($BKLL\$5$s(B $B$N8fMWK>$K4p$E$/(B)$B!#(B * wl-highlight-message-cited-text -> $BGQ;_!#(B * 0.6.6 - "Get It On" 1998-09-30 OKUNISHI Fujikazu * elmo-archive.el 0.09$B!#(B 1998-09-30 Yuuichi Teranishi * Folder, Summary $B$N%a%K%e!<%P!<$r$A$g$C$H@0M}!#(B * Message-Id $B$OAw?.;~$K<+F0E*$K$D$1$k$h$&$K$7$?!#(B 1998-09-30 Masato Taruishi * [elmo] user-login-name -> (user-login-name) $B$N=$@5!#(B 1998-09-30 Masahiro MURATA ($BB * $B%"%/%;%9%0%k!<%W$G$b(B fldmgr $B$+$i$"$@L>$rDI2C$G$-$k$h$&$K$7$?!#(B 1998-09-30 Yuuichi Teranishi * .folders $B$K$"$@L>$N$_$rDj5A$9$k(B syntax $B$rDI2C!#(B * $B%3%^%s%I!"(Bwl-message-refer-article-or-url $B$G(B browse-url $B$r8F$V$N(B $B$r$d$a!"(Btm/SEMI $B$N(B button-dispatcher $B$r8F$V$h$&$K$7$?!#(B 1998-09-29 Yuuichi Teranishi * wl-summary-forward $B$GF|K\8l%5%V%8%'%/%H$,2=$1$k$N$r=$@5!#(B ($BIpED$5$s(B $B$h$j8f;XE&(B) * mime-edit-insert-user-agent-field $B$,(B t $B$J$i(B mime-edit-user-agent-value $B$NCM$r;H$C$F(B User-Agent: $B%U%#!<%k%I$rA^F~$9$k$h$&$K$7$?!#(Bnil $B$J$i=>MhDL$j!#(B 1998-09-28 Yuuichi Teranishi * elmo-util.el $B$K(B (require 'cl) $B$rDI2C!#(B (Hermit-chan ($B$O$_$A$c$s(B) $B$5$s$N8f;XE&(B) * elmo-filter-msgdb-create $B$N4V0c$$$r=$@5!#(B ($B1|@>$5$s(B $B$N8f;XE&(B) 1998-09-28 Masato Taruishi * [elmo] IMAP$B$N%0%k!<%W%U%)%k%@$r(B fetch $B$9$k$H$-$K%f!<%6L>$r(B $BIU2C$7$F$J$$$?$a%f!<%6L>$N0c$&(BIMAP$B%5!<%P$X%"%/%;%9$9$k$HLdBj$,(B $B5/$-$k$N$r=$@5!#(B 1998-09-27 Masahiro MURATA ($BB * $B%/%m%9%]%9%H5-;v$r4{FI=hM}$9$k;~$KL$FI?t$,@5>o$KH?1G$5$l$J$$$N$r(B $B=$@5!#(B * $B%/%m%9%]%9%HBP>]$N%a%C%;!<%8$,JD$8$?%9%l%C%I$NCf$K$"$C$F$bI=<($7(B $B$F=hM}$9$k$h$&$K$7$?!#(B * fldmgr $B$G%U%)%k%@$rDI2C$9$k$H$-!$%U%)%k%@>pJs$NH?1G$,$*$+$7$/$J$k(B $B$N$r=$@5!#(B 1998-09-27 Yuuichi Teranishi * $B?75,JQ?t!"(Bwl-draft-reply-buffer-style$B!#(B $BCM$,(B 'full $B$J$i!"%j%W%i%$;~$K%U%l!<%`A4BN$r;H$&(B ($BKLL\$5$s(B $B$h$j8fMWK>(B)$B!#(B * wl-mail-setup-hook $B$O(B reply $B;~$K$O%P%C%U%!$NFbMF$,3NDj$7$F$+$i(B $B8F$V$h$&$K$7$?!#(B * update $B;~$K;R$I$b%9%l%C%I?t$N(B update $B$,$*$+$7$+$C$?$N$r=$@5!#(B 1998-09-26 OKUNISHI Fujikazu * wl-ja.texi $B$K(B elmo-archive $B$N@bL@$rDI2C!#(B 1998-09-25 OKUNISHI Fujikazu * elmo-lha $B2~$a(B elmo-archive.el(lha, info-zip $BBP1~(B) 1998-09-25 Yuuichi Teranishi * HTML $B$N%a!<%k$r(B cite $B$9$k$H(B w3 $B$N(B keymap $B$N(B text-property $B$,(B $B$D$$$F$-$F$7$^$&$N$r2sHr!#(B 1998-09-24 Yuuichi Teranishi * update $B;~$N%O%$%i%$%HMQ(B regexp $B$,4V0c$C$F$$$?$N$r=$@5!#(B 1998-09-23 Yuuichi Teranishi * 0.6.5 - "Footloose" * [elmo] Reference $B$H(B In-Reply-To $B$+$i(B message-id $B$r@Z$j=P$9(B $B%b%8%e!<%k$N(B regexp $B$r=$@5!#(B * XEmacs $B$G%a%C%;!<%8$N%I%i%C%0!u%I%m%C%W$,I|3h(B (21.0 $B$N(B API $B$K9g$o$;$?(B)$B!#(B * [elmo] imap4 $B$G!"%a%C%;!<%8HV9f$,Ht$s$G$$$k$H$-$K(B overview $B$N(B $B@8@.$K<:GT$9$k$N$r2sHr(B($BKLL\$5$s(B $B$N8f;XE&(B)$B!#(B * elmo-multi-max-of-folder $B$,$J$$$HE\$i$l$k$N$r2sHr!#(B ($B1|@>$5$s(B, $BDEM8$5$s(B $B$h$j8f;XE&(B) * $B%9%l%C%I;^$N2D;k2=$KH<$&JQ99B??t!#(B $B%9%l%C%IFb$N%a%C%;!<%8$,J#?t0lEY$K0\F0$7$?$H$-$KI=<($,$:$l$kLdBj(B ($BB $B$h$j8f;XE&(B)$B$bF1;~$K=$@5!#(B * $B%9%l%C%I$N;^$r2D;k2=!#(B ($BC.@P(B $B$5$s(B $B$N8f=u8@$K4p$E$/(B) * $B?75,JQ?t(B: 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 -> $BGQ;_!#(B 1998-09-22 Yuuichi Teranishi * wl-thread-goto-bottom-of-sub-thread : $B%a%C%;!<%8$,;RB9$+$I$&$+!"8+$?$a$GH=CG$9$k$N$r$d$a$?!#(B * [elmo] IMAP4 $B$@$H(B In-Reply-To $B$K$"$k(B Message-ID $B$r$b$H$K%9%l%C%I(B $B$,:n$i$l$J$+$C$?$N$r=$@5!#(B * $B%U%!%$%k%7%9%F%`$r$^$?$,$k(B local $B$I$&$7$N(B refile $B$,%(%i!<$K$J$k$N(B $B$r=$@5!#(B($B8eF#(B($B$H(B) $B$5$s(B $B$h$j8f;XE&(B) 1998-09-21 Yuuichi Teranishi * $B%4%_H"%U%)%k%@$G$R$H$D$E$D40A4:o=|$7$h$&$H$9$k$HL58B%k!<%W$9$k(B $B$N$r=$@5!#(B ($B8eF#(B($B$H(B) $B$5$s(B $B$+$i$b8f;XE&(B) * 0.6.4 - "Easy Lover" 1998-09-21 TSUMURA Tomoaki * elmo-lha $B$G!"(Bzip $B$J$I$G(B append $B;~$K(B directory $BL>$,$D$+$J$$(B $B$h$&$K$7$?!#(B 1998-09-21 OKUNISHI Fujikazu * $B?75,%P%C%/%(%s%I$r:n$k;~!"4{B8%3!<%I$G$O(B elmo-msgdb $B$@$1$O(B $B%Q%C%AF~$l$J$$$H(B localdir $B$K$J$C$F$7$^$&$N$r2sHr$9$k:v!#(B 1998-09-20 OKUNISHI Fujikazu * lha-prog-arg-get-list $B$@$1$,B>$N%*%W%7%g%sJQ?t$HHsBP>N$@$C$?$N$G!"(B *-getlist $B$K=L$a$?!#(B * LHA $B>(B OS/2 $BHG$H%*%W%7%g%s8_49$+$I$&$+$r(B system-type $B$+$iH=Dj$7$F!"<+F0E*$KE,@Z$JCM$r%;%C%H$9$k$h$&$K$7$?!#(B * lha-file-regexp $B$N(B UN|X $BHG(B LHA $BBP1~$K$h$j(B OS/2 $B$G%^%C%A$7$J$/$J$C$F(B $B$$$?$N$G0BD>$KD>$7$?!#(B * elmo-localdir-folder-path $B$H$NBP>N@-$+$i(B elmo-lha-basedir $B$r(B elmo-lha-folder-path $B$KJQ99!#%G%U%)%k%H$O(B "~/Mail" * $BB8:_$7$J$$(B LHA $B%U%)%k%@$N>l9g$K(B elmo-lha-list-folder() $B$+$i(B elmo-lha-list-folder-subr() $B$r8F$S=P$7$F(B lha $B$,0[>o=*N;$7$F$3$1$F$?(B $B$N$G!"B8:_$7$J$$;~$O%5%V%k!<%A%s$r8F$S=P$5$J$$$h$&$K$7$?!#(B * elmo-lha-get-archive-name() $B$,%U%k%Q%9$N(B LHA $B%U%)%k%@$rDL$;$k$h$&$K(B $B$7$?!#(B$/foo/bar $B$N$h$&$K(B "/" $B$G;O$^$k>l9g$O(B /foo/bar.lzh $B$H8+Pv$9!#(B $B0l;~E*$KG$0U$N%U%)%k%@$r%^%&%s%H$7$?$$$H$-$J$I!#(B 1998-09-20 Yuuichi Teranishi * wl-ja.texi $B$r=q$$$F$_$?!#(B * tm $B$G$O(B wl-use-folder-petname-on-modeline $B$rL5;k$7$F$$$?$N$r=$@5!#(B * tm $B$G%*%U%i%$%s>uBV$G(B IMAP $B$N%a%C%;!<%8$rFI$b$&$H$9$k$H%a%C%;!<%8(B $B%P%C%U%!$K%+!<%=%k$,9T$C$F$7$^$&$N$r=$@5!#(B 1998-09-19 Yuuichi Teranishi * Summary $B$N(B From $BIt$KF|K\8l$,$"$k$HJD$8$?%9%l%C%I$N(B update $B$,(B $B$*$+$7$/$J$k$N$r=$@5!#(B * $BFCDj$N%^!<%/$@$1A4$F>C$9!"(B'U' wl-summary-unmark-all$B!#(B * $B4X?t(B wl-thread-force-open $B$,A4A3%9%l%C%I$r3+$+$J$/$J$C$F$$$?$N$r(B $BD>$9!#(B * local->local, IMAP->IMAP $B$N%3%T!<$r:GE,2=!"%a%C%;!<%8$N0\F0$r(B ($B$?$V$s(B)$B9bB.2=!#(B * $B%*%U%i%$%s>uBV$G$b(B fldmgr $B$G(B IMAP4 $B%U%)%k%@$rIU$1B-$;$k$h$&$K$7$?!#(B * ~/.folders $B$,L5$/$F$b5/F0$G$-$k$h$&$K$7$?!#(B * $B%O%$%i%$%H$,2?$+JQ$@$C$?$N$rD>$7$?(B($B$D$b$j(B)$B!#(B * partial filter $B$J$i(B unsync $B$r(B nil $B$K$;$:!"IaDL$K%A%'%C%/$9$k(B $B$h$&$K$7$?(B ($BB $B$N8f=u8@(B)$B!#(B 1998-09-18 Masahiro MURATA ($BB * Folder $B$NL$FI?t$r%A%'%C%/$9$k$?$S$KL$FI?t$,A}$($F9T$/$3$H$,$"$k(B $B$N$r=$@5!#(B * elmo-folder-info-alist $B$N(B save $B;~$K$O!$B8:_$7$J$$(B entity $B$N>pJs(B $B$r:o=|$9$k$h$&$K$7$?!#(B * fldmgr $B$G@hF,$K%U%)%k%@$rA^F~$7$?>l9g!$(Bwl-folder-entity-alist $B$N99(B $B?7J}K!$,4V0c$C$F$$$?$N$r=$@5$7$?!#(B 1998-09-18 TSUMURA Tomoaki * $BB8:_$7$J$$(B lha folder $B$K(B refile $B$7$?$H$-$J$I$K!"?75,$K(B lha folder $B$,:n@.$5$l$J$$$N$r=$@5!#(B 1998-09-18 Yuuichi Teranishi * 0.6.3 - "Danger Zone" 1998-09-17 Masahiro MURATA ($BB * elmo $B$G(B wl $B$N4X?t$r;HMQ$7$F$$$k$N$rD>$7$?!#(B * Emacs-19 $B$NF1$8J8;zNs$NHf3S(B(equal)$B$G(B nil $B$K$J$k$3$H$,$"$k$?$a!$(B $B0lIt$N(B member $B$H(B assoc $B$r(B wl-string-member $B$d(B wl-string-assoc $B$K(B $BCV$-49$($?!#(Bwl-string-assoc $B$O(B $B?75,4X?t!#(B * wl-folder-goto-first-unread-folder $B$G0lHV:G=i$N(B entity $B$,(B unread $B$N(B $B>l9g!$$=$N%U%)%k%@$K0\F0$7$J$$$N$r=$@5$7$?!#(B * folder mode $B$G$N%U%)%k%@$N8!:w;~$K0[$J$k(B petname $B$,%^%C%A$9$k$3$H$,(B $B$"$k$N$r=$@5$7$?!#(B * wl-summary-mark-as-read-region $B$N$_(B region $B$,9TKv$^$G$K$J$C$F$$$J$$(B $B$N$G!$(Bwl-thread-mark-as-read $B$,@5>o$KF0:n$7$J$$$N$r=$@5$7$?!#(B * $BJ#?t%U%)%k%@$N(B crosspost $B=hM}$K$*$$$F!$(Bmulti $B$d(B filter $B$,J#?t$K$J$C(B $B$?%U%)%k%@$b9MN8$9$k$h$&$K$7$?!#$^$?!$4{FI=hM}$7$?%a%C%;!<%8?t$rI=(B $B<($9$k$h$&$K$7$?!#(B * wl-summary.el $B$K$*$$$F%m!<%+%kJQ?t(B children $B$,(B let $B$G@k8@$5$l$F$$$J(B $B$+$C$?ItJ,$r=$@5!#(B 1998-09-17 Yuuichi Teranishi * multi $B$N$H$-$K(B mmelmo-imap4 $B$,$*$+$7$+$C$?$N$r=$@5!#(B * wl-summary-mark-as-read-all $B$,(B local,uncache $B$rL5;k$7$F$7$^$C$F$$$?(B $B$N$r=$@5!#(B 1998-09-17 OKUNISHI Fujikazu * elmo-lha.el $B$r%^!<%8!#(B 1998-09-17 Yuuichi Teranishi * wl-thread-jump-to-next-unread $B$,(B hereto $B$rL5;k$7$F$$$?$N$r=$@5!#(B * ':' $B$,%U%!%$%kL>$K;H$o$l$F$$$k$H$^$:$$>l9g$,$"$k$N$G;H$o$J$$$h$&(B $B$K=$@5(B($B1|@>$5$s(B $B$N8f;XE&(B)$B!#(B * elmo-lha-search $B$r/=$@5!#(B 1998-09-16 OKUNISHI Fujikazu * $B?75,%U%!%$%k(B elmo-lha.el$B!#(BLHA $BMQ%$%s%?%U%'!<%9!#(B 1998-09-16 Yuuichi Teranishi * 0.6.2 - "China Girl" * wl-stay-folder-window $B$,(B nil $B$J$i(B E $B$G(B trash $B$r6u$K$9$k$H$-$b(B $BJ,3d$7$J$$$h$&$K$7$?(B($BKLL\$5$s(B $B$N8f;XE&(B)$B!#(B * $B?75,JQ?t(B wl-summary-fix-timezone$B!#%5%^%j$N(B Timezone $B$r9g$o$;$k!#(B * $B%9%l%C%IA`:n%3%^%s%I$r@0M}!#(B $B$D$$$G$K%^!<%/A`:n!"%j!<%8%g%sA`:n%3%^%s%I$b@0M}!#(B 1998-09-15 Yuuichi Teranishi * wl-thread-open-close $B$G(B refile $B%^!<%/$D$-$N%9%l%C%I$r3+$$$?;~!"(B refile $B@h$NI=<($,ESCf$^$G$7$+=P$J$+$C$?$N$r=$@5!#(B * 'O' $B$G%3%T!<$r * Emacs-19.34 $B$G$O!$(Bwl-fldmgr-unsubscribe $B$,@5>o$K5!G=$;$:!"(B $B$^$?F1$8%0%k!<%W$KJ#?t$N(B entity $B$,:n$l$F$7$^$&IT6q9g$r=$@5!#(B * XEmacs-21.0 $B$G$O!$(Bunsubscribe $B$d(B remove $B$5$l$?%U%)%k%@$K(B text-property $B$,IU$/$N$r=$@5!#(B * wl-folder.el $B$NJQ99$KH4$1$,$"$C$?$N$r=$@5!#(B * $B0[$J$k(B folder $B$NF1$8(B petname $B$O8!=P$9$k$h$&$K$7$?!#(B * access$B%0%k!<%W$G$b%U%)%k%@$NDI2C!$A^F~!$:o=|$,9T$($k$h$&$K$7$?!#(B * access$B%0%k!<%W$GI=<($7$J$$%U%)%k%@$r;XDj$G$-$k$h$&$K$7$?!#(B * fldmgr $B$N(B region$BA`:n$r9bB.2=$7$?!#(B * access $B%0%k!<%W$N(B fetching $B;~$K?7$7$$%U%)%k%@$H:o=|$5$l$?%U%)%k%@$,(B $BJ,$+$k$h$&$K$7$?!#?7$7$$%U%)%k%@$O@hF,$KI=<($5$l$^$9!#(B * wl-summary-move-order $B$,(B 'new $B0J30$@$H(Bwl-thread-jump-to-next-unread $B$G%(%i!<$K$J$k$N$r=$@5!#(B * wl-summary-read $B$G * Summary $B$G(B o $B$d(B d $B$G%^!<%/$9$k$H$-$K(B gnus, mh-e $BIw$K!"FI$s$G$$$kJ}8~$r0U<1$7$F0\F0$9$k$h$&$K$7$?!#(B * $B?75,JQ?t(B wl-summary-move-direction-downward $B$,(B t $B$N;~!"(B $B:G8e$Ke$+2<$+$r(B $B@Z$jBX$($k!#(B 1998-09-13 OKUNISHI Fujikazu * $B4X?t(B wl-summary-refer-article-or-url$B!#(B 1998-09-12 Yuuichi Teranishi * 0.6.1 - "Billie Jean" * $B%9%l%C%I$r3+JD$7$F$b0l;~E*%^!<%/$,>C$($J$$$h$&!"(Bdelete mark, temp mark $B$rJQ?t$KJ];}$9$k$h$&$K$7$?!#(B * wl-thread-jump-to-next-unread $B$NCY$5$r$@$$$V7Z8:!#(B * $B%9%l%C%I$r:o=|$7$?$H$-$KB>$N%a%C%;!<%89T$b>C$7$F$7$^$&>l9g$,$"$k(B $BIT6q9g$rD>$9!#(B ($B?9;3$5$s(B $B$N8f;XE&$K$h$k!#(B) * wl-address.el $BCf$N(B insert-file $B$r(B insert-file-contents $B$KCV$-49$((B $B$k$N$r$o$9$l$F$?!#(B ($B?9;3$5$s(B $B$N8f;XE&$K$h$k!#(B) * wl-fldmgr.el $B$,(B write-file-as-mime-charset $B$r;H$o$J$$$h$&$K$7$?!#(B * wl-fldmgr.el $B$,(B alist.el $B$r(B require $B$7$J$$$h$&$K$7$?!#(B * wl-fldmgr.el $B$r%^!<%8!#(B 1998-09-11 Masahiro MURATA ($BB * $B?75,%U%!%$%k(B wl-fldmgr.el$B!#(B $B%U%)%k%@%b!<%I$+$i(B .folders $B$NJT=8$,2DG=$K$J$C$?!#(B * wl-folder.el $B$GF1$8(B petname $B$,$"$k$H$-$NIT6q9g$rD>$9!#(B 1998-09-10 Yuuichi Teranishi * mt $B$N$H$-$K%9%l%C%I$r3+$/$h$&$K$7$?!#(B ($BDEM8$5$s(B $B$N8f=u8@$K4p$E$/(B) * 0.6.0 - "Angelia" 1998-09-10 Masahiro MURATA ($BB * wl-summary-jump-to-parent-message $B$G;2>H@h$N(B msg-id $B$rF@$k$H$-$K6u(B $BGr$,4^$^$l$k$?$a$K!$?F%a%C%;!<%8$,;2>H$G$-$J$$>l9g$,$"$k$N$r=$@5$7(B $B$?!#(B * wl-parse-newsgroups $B$G(B split-string $B$NBe$o$j$K(B wl-parse $B$r;H$&$h$&(B $B$K$7$?!#(B 1998-09-09 Yuuichi Teranishi * pick $B$5$l$?%a%C%;!<%8$N%9%l%C%I$O3+$/$h$&$K$7$?!#(B * thread $BA`:nMQ$N%-!<%P%$%s%I$r(B '/' -> wl-thread-open-close '[' -> wl-thread-open-all ']' -> wl-thread-close-all $B$H$9$k!#(B * wl-thread.el $B$K:GDc8BI,MW$J%b%8%e!<%k$,$H$j$"$($:40@.!#(B * $B?75,JQ?t(B wl-thread-insert-opened$B!#(B t $B$J$i%9%l%C%I$r3+$$$FA^F~!#(B nil $B$J$i%9%l%C%I$rJD$8$FA^F~!#%G%U%)%k%H$O(B nil $B$H$7$?!#(B * elmo $B$G$b0lIt(B append $B$r(B nconc $B$KJQ99$G$-$k$H$3$m$rCV$-49$($F$_$?!#(B 1998-09-09 Takaaki MORIYAMA * wl-folder.el $B$G(Bappend$B$7$F$$$k$H$3$m$GJQ99$G$-$kItJ,$r(Bnconc$B$G(B $BCV$-49$($?!#(B * wl-address.el $BCf$N(B insert-file $B$r(B insert-file-contents $B$KCV$-49$($?!#(B 1998-09-08 Yuuichi Teranishi * $B4X?t(B wl-address-setup $B$G(B file-exists-p $B$H(B file-readable-p $B$N(B and $B$r(B $B $B$h$j8f;XE&(B) * $B?75,JQ?t(B wl-use-folder-petname-on-modeline $B$,(B t (default $B$O(B t)$B$J$i(B modeline $B$K(B folder $B$N$"$@L>$r=P$9$h$&$K$7$?!#(B * $B%5%^%j(B/$B%a%C%;!<%8$N%^%&%9%[%$!<%k40A4(B(?)$BBP1~!#(B * multi $B$J$i%/%m%9%]%9%H$N5-;v$r>C$9$h$&$K$7$?!#(B * [elmo] multi $B$O(B Date $B$G(B sort$B!#(B * [elmo] mark-alist $B$r(B ("Message-Number" . "Mark") $B$N(B assoc list $B$K(B $BJQ99!#(B 1998-09-08 Masahiro MURATA ($BB * petname $B$N.J8;z$,6hJL$5$l$F$$$?$N$rL5;k$9$k$h$&(B $B$K$7$?!#(B * filter $B$d(B multi $B$K$J$k$H!$(Bimap, nntp,localdir $B$NH=CG$,$G$-$F$$$J$$(B $BItJ,$,$"$C$?$N$r=$@5!#(B 1998-09-06 Yuuichi Teranishi * wl-folder-diff $B$G(B info-alist $B$NCM$rJQ99$9$k$h$&$K$7$?!#(B * $B?75,%U%!%$%k(B wl-thread.el$B!#(Binteractive $B$J(B thread $BI=<(%b%8%e!<%k72!#(B ($BC.@P$5$s(B Masato Taruishi $B$N8f=u8@$K4p$E$/(B) 1998-09-05 Yuuichi Teranishi * .folders $B$G!"%U%)%k%@L>$N$&$7$m$K(B "" $B$G$/$/$C$F(B Petname $B$rDj5A(B $B$G$-$k$h$&$K$7$?!#(B ($BDEM8$5$s(B $B!"(B $BC.@P$5$s(B Masato Taruishi $B$N8fDs0F$K4p$E$/(B) 1998-09-04 Yuuichi Teranishi * 0.5.4 - "You Might Think" * $B?75,JQ?t(B wl-force-fetch-folders $B$,(B non-nil $B$J$i%"%/%;%97?%U%)%k%@$r(B $B3+$$$?$H$-$K>o$K:G?7$N%j%9%H$r $B$N8f=u8@$K4p$E$/(B) 1998-09-03 Yuuichi Teranishi * unplugged $B$N$H$-$K(B wl-summary-{next|prev} $B$NF0:n$,$*$+$7$/$J$C$F(B $B$$$?$N$rD>$9!#(B * wl-draft-send-mail-with-smtp $B$H(B wl-draft-send-mail-with-qmail $B$b(B wl-mail-send-pre-hook $B$rI>2A$9$k$N$r(B wl-do-fcc() $B $B$N8f;XE&$K$h$k(B) $B$^$@IT40A4!)(B * $BNc$($P(B /last:100/... $B$G(B 100 $B8D$J$+$C$?$i%(%i!<$,=P$k$N$r=$@5!#(B 1998-09-03 Ishikawa Ichiro * Message-Id $B$dK\J8$,$J$$%a%C%;!<%8$,$"$k$H$-$NLdBj$r=$@5!#(B 1998-09-03 TSUMURA Tomoaki * Emacs20.2 $B$G(B update $B$,%(%i!<$K$J$kLdBj$r=$@5!#(B 1998-09-03 OKUNISHI Fujikazu * wl-init() $B$G(B wl-demo() $B$9$k%?%$%_%s%0$r(B ~/.wl $B%m!<%I8e$K!#(B * im-wl.el $B$G(B wl-mail-send-pre-hook $B$rI>2A$9$k$N$r(B wl-do-fcc() $B * $B?75,JQ?t(B wl-draft-reply-without-argument-list $B$*$h$S(B wl-draft-reply-with-argument-list $B$rDI2C!"(Breply $B;~$N%G%U%)%k%H$r(B $B%+%9%?%^%$%:$G$-$k$h$&$K$7$?!#(B * ChangeLog $B$,4V0c$C$F$$$?$N$r=$@5!#(B ($BB $B$h$j8f;XE&(B) * 0.5.3 - "Xanadu" * elmo-nntp-msgdb-create-as-numlist $B$N$3$H$r$o$9$l$F$?$N$G:n$C$?!#(B ($BDEM8$5$s(B $B$h$j8f;XE&(B) 1998-09-01 Yuuichi Teranishi * $B?75,%U%!%$%k!"(BREADME-FOLDER.ja$B!#(B $B%U%)%k%@$N=q<0$r@bL@$9$k%a%b!#(B * Summary $B$G(B "V" $BEy$G:n$i$l$?2>A[%U%)%k%@$+$iC&=P$9$k?75,%3%^%s%I!"(B wl-summary-unvirtual $B$r(B "U" $B$K%P%$%s%I!#(B * [elmo] elmo-filter-search $B$r$A$g$C$H$^$8$a$KpJs$r(B fetch $B$9$k$N$r$d$a!"(B $BEv3:ItJ,$N(B envelope $B$rA4It(B fetch $B$7$?$"$H%/%i%$%"%s%HB&$G(B filter $B$9$k$h$&$K$7$F9bB.2=(B($B%a%b%j;H$&$1$I(B)$B!#(B 1998-09-01 Masahiro MURATA ($BB * wl-auto-select-first $B$,(B nil $B$N$H$-!$:G=i$NL$FI%a%C%;!<%8$K(B $BHt$V$h$&=$@5!#(B 1998-09-01 Yuuichi Teranishi * update $B$N(B message $B$r=P$9%?%$%_%s%0$rJQ99!#(B * [elmo] "Message-ID: <>" $B$@$H:o=|$G$-$J$$$H$$$&LdBj$,;D$C$F$$$?$N(B $B$rD>$9!#(B 1998-08-31 Yuuichi Teranishi * 0.5.2 - "Wild Boys" * [elmo] $B$^$?$b$d(B "Message-ID: <>" $B$@$HF0$+$J$/$J$C$F$$$?$N$rD>$9!#(B * [elmo] localdir $B$G!"?t;z$,O"B3E*$G$J$$$HL5BL$K%k!<%W$r2s$k$N$r=$@5!#(B * wl-summary-goto-folder $B$G!"(Bhighlight $B$N;EJ}$r4V0c$($F$$$?$N$rD>$9!#(B * XEmacs $B$@$H(B .folders $B$K(B filter $B$r;XDj$7$F$$$k$H%(%i!<$K$J$k$N$r=$@5(B ($B%"%$%3%s$N$3$H$o$9$l$F$?(B)$B!#(B ($BDEM8$5$s(B $B$N8f;XE&$K4p$E$/JQ99(B) * [elmo] elmo-folder-diff $B$G!"(Bfilter $B$N$H$-$K(B multi $B$r;XDj$7$F$$$k$H(B $B%(%i!<$K$J$k$N$rD>$9!#(B ($BDEM8$5$s(B $B$N8f;XE&$K4p$E$/JQ99(B) * [elmo] elmo-filter-append-msg $B$rD>$9!#(B 1998-08-28 Yuuichi Teranishi * 0.5.1 - "Valotte" * filter $B$NDI2C$KH<$&JQ99B??t!#(B * $B?75,JQ?t(B wl-folder-no-save-list, wl-folder-save-list$B!#(B * [elmo] $B?75,%U%!%$%k(B elmo-filter.el$B!#(B 1998-08-26 Yuuichi Teranishi * 0.5.0 - "Uptown Girl" 1998-08-25 Yuuichi Teranishi * multi $B$NDI2C$KH<$&JQ99B??t!#(B * [elmo] $B?75,%U%!%$%k(B elmo-multi.el$B!#(B * elmo-cache-expire-by-size $B$r * XEmacs $B$GJ#?t(B frame $B$r;H$C$F$$$k>l9g!"(Bonly one window $B$J(B frame $B$G(B wl-draft-hide $B$9$k$H!"(Bframe $B$4$H>C$($F$7$^$&$N$r2sHr!#(B 1998-08-24 Yuuichi Teranishi * Summary $B$,0lDj9T?t0J>e$"$k>l9g$O!":G=i$KI=<($9$k%a%C%;!<%8$N(B $B$"$?$j$+$i2<$@$1%O%$%i%$%H$9$k$h$&$K$7$?!#(B ($B0lDj?t(B = wl-summary-highlight-partial-threshold, default $B$O(B 1000) * Summary $B$N(B highlight $B$G(B looking-at $B$N2s?t$r8:$i$7$F$A$g$C$H$@$1(B $B9bB.2=(B(15% $B$/$i$$(B?)$B!#(B * Summary $B$N(B $B%a%C%;!<%8HV9f$NI=<(7e?t$N@_Dj$rHFMQ2=!#(B 1998-08-23 Yuuichi Teranishi * wl-folder-info-save $B$,(B t $B$J$iL$FI>pJsI=<($b%j%8%e!<%`$9$k$h$&(B $B$K$7$?!#(B * elmo-folder-info-save -> wl-folder-info-save (default $B$r(B t $B$K(B)$B!#(B * fdbinfo -> finfo. 1998-08-23 Masahiro MURATA ($BB * $B3F%U%)%k%@$N:GBg%a%C%;!<%8HV9f$dL$FI?t$r(B cache $B$7$F(B wl-folder-check-entity $B$r9bB.2=$7$?!#(B elmo-folder-info-save $B$,(B non-nil $B$J$i(B save $B$7$F$,Jd40$G$-$k$h$&$K$7$?!#(B * alias $B%U%!%$%k$N2r@O;~$K9TF,$N(B '#' ';' $B$r%3%a%s%H07$$$K$7$?!#(B * wl-folder-empty-trash $B * important-mark $B$r%0%m!<%P%k$K4IM}$9$k$h$&$K$7$?!#(B 1998-08-21 Yuuichi Teranishi * wl-summary-jump-to-parent-msg-by-message-id $B$G!"Ev3:%a%C%;!<%8$,(B $B0c$&%U%)%k%@$K$"$k>l9g$OHt$V$3$H$b$G$-$k$h$&$K$7$?!#(B (XEmacs $B$G(B elmo-use-database $B$,(B t $B$N>l9g$N$_(B) * [elmo] dbm $B%b%8%e!<%k72MQ?75,%U%!%$%k!"(Belmo-database.el $B:n@.!#(B (XEmacs $B@lMQ(B) 1998-08-20 Yuuichi Teranishi * wl-summary-mark-as-read-all $B$G$$$A$$$A%-%c%C%7%e$,B8:_$9$k$+$I$&$+(B $B%A%'%C%/$7$J$$$h$&$K$7$?!#(B * XEmacs $B8~$1(B Opening Logo $B$r0l?7!#(B * [elmo] elmo-cache-search $B$r?7%-%c%C%7%eJ}<0$KDI=>!#(B 1998-08-19 Yuuichi Teranishi * [elmo] $B%-%c%C%7%e$r%0%m!<%P%k$K4IM}$9$k$h$&$K$7$?!#(B * [elmo] $B%-%c%C%7%e4IM}%b%8%e!<%k72MQ?75,%U%!%$%k!"(Belmo-cache.el $B$r(B $B:n@.!#(B 1998-08-18 OKUNISHI Fujikazu * search-parent $B$N=$@5!#(B 1998-08-17 Yuuichi Teranishi * [elmo] imap4 $B$G(B select $B$;$:$K(B list folder $B$9$k$H!" * search-parent $B$G2?HVA0$N?F$+$r;XDj$G$-$k$h$&$K$7$?!#(B 1998-08-16 Yuuichi Teranishi * wl-mime.el $B$G!"(Bfollow-current-entity $B$NA0$K(B widen $B$9$k$h$&$K$7$?!#(B * original buffer $B$r(B read-only $B$K$7$?!#(B ($B1|@>$5$s(B $B$h$j8f;XE&(B) 1998-08-16 OKUNISHI Fujikazu * wl-break-pages $B$,$A$c$s$HH?1G$5$l$J$$$N$r=$@5!#(B 1998-08-16 Masahiro MURATA ($BB * wl-folder-goto-first-unread-folder, wl-folder-open-all-unread-folder, wl-folder-open-folder $B$r(B wl-folder-get-path $B$r;H$&$h$&JQ99!#(B * wl-highlight-folder-path $B$N2~NI!#(B 1998-08-14 Masahiro MURATA ($BB * localdir $B$J(B access $B%0%k!<%W$r(B fetching $B$9$k$H$-$K!$%0%k!<%WL>$K(B property $B$,$D$$$F$$$k$;$$$G7W$J(B property $B$,IU$/(B $B$N$r=$@5!#(B * wl-folder-goto-folder $B$G0\F0$9$k$H$-$K(B wl-folder-buffer-cur-entity-id $B$r%;%C%H$9$k$h$&$K$7$?!#(B * $B?75,4X?t(B wl-folder-goto-first-unread-folder ('f') $BL$FI%a%C%;!<%8$,$"$k:G=i$N%U%)%k%@$K0\F0$9$k!#(B * $B?75,4X?t(B wl-folder-jump-folder ('J') $B;XDj$7$?%U%)%k%@$K0\F0$9$k!#$=$N;~!$%U%)%k%@$,B0$7$F$$$k%0%k!<%W(B $B$r3+$/!#(B * $B?75,4X?t(B wl-folder-open-all-unread-folder ('o') $BL$FI%a%C%;!<%8$,$"$k%U%)%k%@$N%0%k!<%W$rA4$F3+$/!#(B * $B?75,4X?t(B wl-folder-open-folder $B;XDj$7$?%U%)%k%@$N%0%k!<%W$r3+$/!#(B 1998-08-14 Yuuichi Teranishi * [elmo] delete $B;~!"(Bexpunge $B$N%?%$%_%s%0$rJQ99(B($B$+$J$j9bB.2=(B)$B!#(B * trash folder $B$G$N(B "D" $B%^!<%/$O(B($B??$N(B)$B:o=|$r$5$s(B $B$h$j8f;XE&(B) 1998-08-14 Masahiro MURATA ($BB * msgdb $B$O(B save $B$5$l$F!$(Bsummary-cache $B$O(B save $B$5$l$J$$>u67$,H/@8$9$k(B $B>l9g$,$"$k$N$r2sHr!#(B 1998-08-13 Yuuichi Teranishi * Summary $B$KDI2C$5$l$k9T$N(B highlight $B$NJ}K!$rJQ99(B($BB?>/9bB.2=(B)$B!#(B * $B%G%U%)%k%H$N(B cite $B$@$H(BFrom:$B$K4A;z$,4^$^$l$F$$$k$H(B internal $B$K$J$C$F(B $B$7$^$&$N$r=$@5!#(B(te@gohome.org $B$h$j8f;XE&(B) * no-cache-folder $B$G$b!"(Bimportant-mark $B$r$D$1$k$H$-$K%-%c%C%7%e$9$k(B $B$h$&$K$7$?!#(B($BB $B$h$j8f0U8+(B) * Message-Id: <> $B$N%a!<%k$,%-%c%C%7%e;~$K%(%i!<$K$J$k$N$r2sHr!#(B ($B1-;t$5$s(B $B$h$j8f;XE&(B) * [bbdb-wl.el] bbdb$B%(%s%H%j$r%-%c%C%7%e$9$k$h$&JQ99!#(B 1998-08-13 OKUNISHI Fujikazu * [bbdb-wl.el] Emacs20.x $B$G%(%i!<$,5/$3$k$N$r2sHr!#(B 1998-08-11 Yuuichi Teranishi * wl-set-string-width $B$G!"%;%C%H$7$h$&$H$7$F$$$kD9$5$,(B string $B$H(B $B$A$g$&$IF1$8$@$H(B XEmacs $B$G$O$J$<$+(B1$BJ8;zD9$/$J$C$F$7$^$&$N$r2sHr!#(B * [elmo] imap4 $B$N(B bodystructure $B$,F|K\8l$@$C$?$j$9$k$H(B parse $B$K<:GT$9$k$N$r2sHr!#(B 1998-08-09 Yuuichi Teranishi * v0.4.3 - "Starting Over" * wl-no-cache-folder-list $B$r?7@_!"%^%C%A$7$?%U%)%k%@$O(B $B%a%C%;!<%8$rFI$s$G$b%-%c%C%7%e$7$J$$!#(B * elmo-imap4-msgdb-create-range, elmo-nntp-msgdb-create-range $B$K$*$1$k(B overview $B$N * msgdb $B$N%;!<%V$r!"JQ99$,$"$C$?ItJ,$@$19T$&$h$&$K$7$?!#(B ($BB $B$h$j8f;XE&(B) 1998-08-07 Fumitoshi UKAI * elmo-imap4-msgdb-create-range $B$r9bB.2=!#(B 1998-08-06 Fumitoshi UKAI * msgdb $B$N(B load $B$H(B imap4 select folder $B$rHsF14|$K9T$&(B wl-summary-msgdb-load-async $B$N * v0.4.2 - "Rock Me Amadeus" * imap4, nntp $B$G(B overview $B$r $B$h$j8f=u8@(B) * Summary $B$N(B Update $B$G(B, $BDI2C$5$l$?%a%C%;!<%8$N(B highlight $B$NJ}K!$rJQ99!#(B 1998-08-06 Masahiro MURATA ($BB * wl-summary-reedit $B$r(B draft $B%U%)%k%@$G$N(B $B%X%C%@(B(From$B$J$I(B)$B$rJQ99$9$k5!G=$rDI2C$7$?!#(B 1998-08-06 Yuuichi Teranishi * [elmo] current folder $B$,F1$8$J$i(B select folder $B$7$J$$$h$&$K$7$?!#(B ($B1-;t$5$s(B $B$h$j8f=u8@(B) 1998-08-06 Fumitoshi UKAI * [elmo] elmo-msgdb-list-diff2 $B$r9bB.2=!#(B 1998-08-05 Masahiro MURATA ($BB * $B%a%C%;!<%8%X%C%@$N(B highlight $B$r$b$C$H<+M3$KDj5A$G$-$k$h$&$K$7$?!#(B 1998-08-04 Yuuichi Teranishi * [elmo] scan $B$NB.EY8~>e$N$?$a$K(B overview $B%G!<%?%Y!<%9$O!"%a%b%j>e!"(B HDD$B>e$$$:$l$b(B iso-2022-jp($B$=$N%U%)%k%@$N(B mime-charset)$B$GJ]B8$9$k(B $B$h$&$K$7$?!#(B * wl-summary-toggle-thread $B$r * tm $B$G0zMQ$7$F%j%W%i%$$7$h$&$H$9$k$H(B (void-variable mime::preview/mother-buffer) $B$K$J$k>l9g$,$"$k$N$r(B $B2sHr!#(B 1998-08-04 Yuuichi Teranishi * $BJQ?t(B wl-summary-indent-length-limit $B$r?7@_!#(B $B$I$s$J$K%9%l%C%I$,?<$/$F$b$3$ND9$50J>e%$%s%G%s%H$7$J$$!#(B $B%G%U%)%k%H$O(B 46 ($B:,5r$J$7(B)$B!#(B ($B1|@>$5$s(B $B$h$j8f;XE&(B) 1998-08-03 Yuuichi Teranishi * [elmo] localdir $B$N(B search $B;~!"$A$c$s$H(B elmo-mime-charset $B$G(B decode $B$9$k$h$&$K$7$?!#(B * wl-summary-sort $B$r * $B?75,%a%C%;!<%8$r(B prefetch $B$9$k4X?t(B wl-summary-incorporate $B$rDI2C!#(B * tm $B$G5pBg%a%C%;!<%8$r$9!#(B * prefetch $B$9$k$HL$FI?tI=<($,$*$+$7$/$J$k$N$r=$@5!#(B * wl-folder-sync-entity $B$,@5$7$/%5%^%j%S%e!<%-%c%C%7%e$r99?7$7$J$$(B $B%P%0$r=$@5!#(B * wl-summary-down $B$,(B interrupt $B$5$l$?;~$K%+%l%s%H%U%)%k%@>pJs$,(B $B$*$+$7$/$J$k$N$r=$@5!#(B * 00README.ja $B$K(B install.el $B$K4X$9$kCm0U=q$-$rDI2C!#(B ($B1|@>$5$s(B $B$h$j8f=u8@(B) 1998-07-31 Masahiro MURATA ($BB * [elmo] elmo-nntp-list-folder $B$,(B XEmacs $B0J30$GF0$+$J$$%P%0$r=$@5!#(B 1998-07-31 Yuuichi Teranishi * [elmo] imap4 $B$G!"%7%s%0%k%Q!<%H$N5pBg$J%a%C%;!<%8$N>l9g!"(B $B * $B%0%k!<%W%U%)%k%@>e$K%+!<%=%k$,$"$k$H$-$K%4%_H"$r6u$K$9$k$H!"(B summary window $B$,;D$C$F$7$^$&$N$r2sHr!#(B * get-text-property $B$NB?MQ$G!"(Bwl-folder-update-unread $BEy$,(B $BCY$/$J$C$F$$$?$N$G!"6KNO(B get-text-property $B$r8:$i$7$?!#(B * wl-message-window-size $B$N%G%U%)%k%H$r(B '(1 . 4) $B$K$7$?!#(B * $BJQ?t(B wl-summary-recenter $B$,(B non-nil $B$J$i!"(Bredisplay $B;~$K(B recenter $B$9$k$h$&$K$7$?!#(B * v0.4.0 - "One More Try" 1998-07-29 Yuuichi Teranishi * wl-folder-petname-alist $B$r?7@_!#%^%C%A$7$?$i%U%)%k%@$r$"$@L>I=<(!#(B * wl-auto-select-next $B$,(B non-nil $B$N$H$-!"(BSPC $B$@$1$G$J$/!"(B $B8=:_$N%3%^%s%I$,l9g$G$b * $B%X%C%@$N%U%)%s%H$N%G%U%)%k%H$r(B bold $B$K$7$?!#(B * $B8=:_A*Br$5$l$F$$$k%U%)%k%@(B($B$N%Q%9(B)$B$H%a%C%;!<%8$r%O%$%i%$%H$9$k(B $B$h$&$K$7$?!#(B * wl-summary-auto-select-next $B$G!"e$G$O(B text-property, 'wl-folder-entity-id $B$G;2>H$G$-$k$h$&$K$7$?!#(B wl-folder-entity-alist $B$N9=B$$K$b(B entity-id $B$rDI2C!#(B 1998-07-26 Yuuichi Teranishi * $B%-%c%C%7%e$GK\J88!:w(B($B%-%c%C%7%e8!:w(B)$B$G$-$k$h$&$K$7$?!#(Bimap4 $B$N(B offline $B>uBV!"$*$h$S!"(Bnntp $B$G$O!"$3$N%-%c%C%7%e8!:w$rMQ$$$k!#(B * Message-ID $B$K(B "/" $B$,4^$^$l$k$H$-!"%-%c%C%7%e$N%U%!%$%kL>$G$O(B " " $B$KCV$-49$($k$3$H$K$7$?!#(B * $B%j%U%!%$%k%^!<%/$rIU$1$?$^$^%U%)%k%@$rC&=P$9$k$H!"%4%_$,%;!<%V(B $B$5$l$k$N$r2sHr$7$?(B($B$D$b$j(B)$B!#(B * $B%5%^%j%S%e!<%-%c%C%7%e$N(BHDD$B$X$N=q$-9~$_$r!"JQ99$,$"$k$?$S$G$O$J$/!"(B $B%U%)%k%@!<$r0\F0!&H4$1$k;~$K0l5$$K=q$-=P$9$h$&$K$7$?!#(B * NNTP $B$G$b%U%)%k%@%j%9%H$Nl9g!"L$FI%^!<%/$N?t$,(B $B$*$+$7$/$J$k$N$rD>$7$?(B($B$D$b$j(B)$B!#(B * $B%U%)%k%@%j%9%H$r%-%c%C%7%e$9$k$h$&$K$7$?!#(B $B:G?7%j%9%H$K99?7$9$k$K$O!"(BC-u RET $B$G%U%)%k%@$r3+$-D>$9!#(B unplugged $B>uBV$G$b(B access $B7?%0%k!<%W%U%)%k%@$rMxMQ$G$-$k(B $B$h$&$K$J$C$?!#(B 1998-07-24 Masahiro MURATA ($BB * wl-auto-select-first $B$r(B non-nil $B$K$9$k$H!$(Bwl-folder-empty-trash $B$r * folder-mode-map $B$G(B "P" $B$r(B wl-folder-prev-unread, "N" $B$r(B wl-folder-next-unread $B$K$7$?$[$&$,;H$$$d$9$$5$$,$7$F$-$?$N$G(B $B%G%U%)%k%H$r$=$N$h$&$KJQ99!#(B * [elmo] elmo-localdir $B$G!"(Boverview $B@8@.;~$N%U%!%$%k$+$i$N%G!<%?(B $BFI$_9~$_NL$r:o8:!#%a%b%j;HMQNL$,8:$C$?(B($B$O$:(B)$B!#(B 1998-07-23 Yuuichi Teranishi * v0.3.6 - "Never Surrender" 1998-07-23 Masahiro MURATA ($BB * wl-folder.el $B$G!"(Bget-buffer-{window|buffer} $B$,<:GT$7$?$H$-$K(B $B8mF0:n$9$k$N$r=$@5!#(B 1998-07-22 Yuuichi Teranishi * $B?75,JQ?t(B wl-summary-buffer-mime-charset, wl-folder-mime-charset-alist $B$r@_CV!"(BSummary $B$N@8@.!"K\J8$N%G%3!<%I$GMxMQ$9$k$h$&$K$7$?!#(B * MIME-Version $B$,$J$$$H$-$b@8(B JIS $B%5%V%8%'%/%H$r%G%3!<%I$7$FI=<(!#(B ($B1|@>$5$s(B $B$h$j8f;XE&(B) * wl-draft-normal-send-func $B$G!"(BDate field $B$rA^F~$9$k$h$&$K$7$?!#(B * wl-mail-do-fcc-insert-date-header -> wl-draft-insert-date-field $BL>A0JQ99$HF1;~$K!"(Btimezone.el $B$r;H$&$h$&$K$7$?!#(B * wl-summary-auto-select-next $B$,(B non-nil $B$N$H$-$NF0:n$,(B IMAP4 $B%U%)%k%@$G$*$+$7$/$J$C$F$7$^$&$N$r=$@5!#(B * IMAP4 $B$b%*!<%W%s$9$k$H!$(BEmacs $B$N=*N;;~$K3NG'$r9T$&$N$GL5;k$9$k$h(B $B$&$K$7$?!#(B 1998-07-22 Masahiro MURATA ($BB * $BL$FI%U%)%k%@!<4V$r0\F0$9$k(B wl-folder-(prev|next)-unread $B$r?75,(B $B:n@.$7$?!#(B * $BJQ?t(B `wl-auto-select-first' $B$,(B non-nil $B$J$i!$%U%)%k%@$K0\F08e(B $B:G=i$NL$FI%a%C%;!<%8$rB(I=<($9$k$h$&$K$7$?!#(B * $BJQ?t(B `wl-auto-select-next' $B$,(B non-nil $B$J$i!$:G8e$N%a%C%;!<%8$r(B $BFI$_=*$($?8e$K * [elmo] imap4 $B$NK\J88!:w$GF|K\8l$r%-!<$H$7$FM?$($i$l$k$h$&$K$7$?!#(B 1998-07-21 TSUMURA Tomoaki * wl-folder-empty-trash $B$G%U%)%k%@%G!<%?$r6u$K%;%C%H$9$k$H$-$N(B $B%P%0$rD>$9!#(B 1998-07-21 Yuuichi Teranishi * v0.3.5 - "Miss Me Blind" 1998-07-21 Masahiro MURATA ($BB * WL-ELS $B$G(B ./WL.hack $B$r$A$c$s$H(B load $B$9$k$h$&(B "." $B$r(B load-path $B$K(B $BDI2C$9$k9T$r0\F0!#(B 1998-07-17 Yuuichi Teranishi * Folder $B$K$b(B unread $B?t$rI=<($9$k$h$&$K$7$?!#$$$/$D$+$N4XO"4X?t$b(B $BJQ99!#(B($BB $B$5$s$N8f=u8@$K4p$E$/JQ99(B) * Summary $B$N(B modeline $B$K(B new $B$H(B unread $B$N?t$rI=<($9$k$h$&$K$7$?!#(B $B%P%C%U%!%m!<%+%kJQ?t!"(Bwl-summary-buffer-unread-count, wl-summary-buffer-new-count $B$G4IM}!#(B ($BB $B$5$s$N8f=u8@$K4p$E$/JQ99(B) * $BL$FI%a!<%k$r(B1$BDLFI$`EY$K(B mark $B%U%!%$%k$r(BHDD$B$K=q$-9~$^$:!"(B $B%U%)%k%@!<$r0\F0!&H4$1$k;~$K0l5$$K=q$-=P$9$h$&$K$7$?!#(B ($BB $B$5$s$N8f=u8@$K4p$E$/JQ99(B) * mark $B%U%!%$%k$K$?$^$K(B (("" nil)) $B$,;D$k%P%0$r=$@5(B $B$7$?(B($B$D$b$j(B)$B!#(B($BB $B$5$s$h$j8f;XE&(B) 1998-07-16 Yuuichi Teranishi * Semi-vm $B$Ne$N(B `[ON]' $B$,A}2C$7$F$7$^$&%P%0$r=$@5!#(B ($B1|@>$5$s(B $B$h$j8f;XE&(B) 1998-07-15 Yuuichi Teranishi * v0.3.4 - "La Bamba" wl release. 1998-07-15 OKUNISHI Fujikazu * $BM>7W$J%W%m%Q%F%#$rbuffer-substring-no-properties $B$KCV49!#(B * wl-summary-redisplay() $B$,I,$:$7$bI,MW$G$J$/!"(B wl-summary-set-message-buffer-or-redisplay() $B$G:Q$`$H$3$m$OCV49!#(B 1998-07-14 Yuuichi Teranishi * mh $B7A<0$N(B alias file $B$,(B wl-alias-file $B$K@_Dj$5$l$F$$$?$i!"(B completion $B$G;H$($k$h$&$K$7$?(B($B$D$b$j(B)$B!#(B * modeline $B$N(B toggle-status $B$r(B mode-line-buffer-identification $B$N(B $BA0$K=q$/$3$H$K$7$F$_$?!#(B * wl-draft-insert-message $B$G(B mail-citation-hook $B$H(B mail-yank-hooks $B$r(B nil $B$K94B+$9$k$N$rK:$l$F$?!#(B ($B1|@>$5$s(B $B$h$j8f;XE&(B) * Mule2.3@19.28 $B$K$O(B display-error $B$,$J$$$h$&$J$N$G!"(B $B$=$l$C$]$$4X?t$r<+A0$GMQ0U$7$?!#(B ($B1|@>$5$s(B $B$h$j8f;XE&(B) * wl-summary-redisplay-all-header, wl-summary-redisplay-no-mime $B$G$b(B $BL$FI%^!<%/=hM}$9$k$h$&$K$7$?!#(B 1998-07-14 Masahiro MURATA ($BB * $B?75,4X?t(B wl-folder-goto-folder, wl-folder-suspend$B!#(B 1998-07-14 Yuuichi Teranishi * wl-mmelmo-message-redisplay: $B$9$G$K(B cache $B$5$l$F$$$k$K$b$+$+$o$i$:(B $BA4ItFI$`$+$I$&$+$9!#(B * [elmo] message/partial $B$b%-%c%C%7%e4IM}$G$-$k$h$&$K$7$?!#(B * [elmo] read-msg $B$NJV$jCM$r(B (content-type . message) $B$H$7$?!#(B * wl-draft.el: (insert-body) -> (insert body) 1998-07-13 Yuuichi Teranishi * v0.3.3 - "Karma Chameleon" wl release. 1998-07-13 OKUNISHI Fujikazu * $B?75,4X?t(B wl-summary-jump-to-parent-message$B!#(B 1998-07-13 Yuuichi Teranishi * $BL$FI$,$J$$$H$-$O(B update $B;~$K:G8e$N%a%C%;!<%8$K0\F0!#(B ($BB $B$5$s$N8f;XE&$K4p$E$/JQ99(B) * elmo-nntp-send-mode-reader $B$G(B response $B$rFI$`$h$&$K$7$?!#(B 1998-07-12 Masahiro MURATA ($BB * $B=i$a$F0\F0$9$k(B folder $B$K0\$k$H!$(Bsummary $B%b!<%I$G(B2$B$DL\$N%a%C%;!<%8$K(B $B%+!<%=%k$,0\F0$9$kIT6q9g$r=$@5!#(B * NNTP $B$G:G=i$K(B "mode reader" $B%3%^%s%I$rAw?.$9$k!#(B * from $B$K0[>o(B(?)$B$JJ8;z$,4^$^$l$F$$$k$H!$(Bwl-substring $BFb$N(B sref $B$G%(%i!<(B $B$,=P$k$N$rL5;k!#(B * wl-auto-check-folder-pre-hook $B$rDI2C!#(B * wl-interactive-exit $B$,(B nil $B$J$i=*N;;~$K3NG'$r * News $B5-;v$N%-%c%s%;%k5-;v$r=P$9;~$K(B wl-draft-raw-send $B$r8F$V$h$&$K(B $B$7$?!#(B * $B?75,4X?t(B wl-draft-raw-send$B!#(B * $B?75,4X?t(B wl-mime-request-patrial-message$B!#(B * WL-ELS, install.el $B$,%$%s%9%H!<%k$5$l$F$$$l$P!"(B $B<+F0E*$K(B ELISPDIR $B$r8!=P$G$-$k$h$&$K$9$k!#(B * wl-summary-reedit, wl-draft-open-file $B$N$H$-$O!"(B edit-again $B$r;H$&$h$&$K$7$?!#(B * wl-draft-send $B$GAw?.;~$OJL%P%C%U%!$r;H$&$h$&$K$7$?!#(B ($B $B$5$s$N8f=u8@$K4p$E$/JQ99(B) * semi-wl.el -> wl-mime.el ($B $B$5$s$N8f=u8@$K4p$E$/JQ99(B) * $BJQ?t(B wl-init-file $B$rDI2C!#(Bwl-init $B$G(B load-file $B$9$k!#(B 1998-07-11 OKUNISHI - PatchMan II - Fujikazu * $B5/F0$7$F(B Summary mode $B$K0\9T$;$:!"(BGroup mode $B$+$i$$$-$J$j(B "w" $B$9$k(B $B;~>l9g$K(B tm-wl.el $B$G4X?t$NL$Dj5A%(%i!<$,=P$kIT6q9g$KBP=h!#(B * bbdb $B$,FI$^$l$F$$$k$K$b4X$o$i$:!"0l2sL\$N(B compose $B;~$K(B M-[TAB] $B$,(B $B!J(Btext-mode $B$N!K(Bispell-complete-word() $B$N$^$^!"$H$$$&Ff$N8=>]$KBP=h!#(B * $B4X?t(B wl-summary-pipe-message $B$rDI2C!#(B 1998-07-10 Yuuichi Teranishi * User-Agent $B%U%#!<%k%I$r@8@.$9$k4X?t!"(Bwl-generate-user-agent-string$B!#(B * draft-send $BCf$N(B error, quit $B$r(B resume $B$9$k$h$&$K$7$F$_$?!#(B 1998-07-09 Yuuichi Teranishi * wl-folder-{next|prev}-unsync $B$N(B regexp $B$r=$@5!#(B * Flim-Chao $B$K9g$o$;!"(Bmmelmo $B$N=q$-49$(!#(B mmelmo $B$r(B mmelmo $B$H(B mmelmo-imap4 $B$KJ,3d!#(B mmelmo $B$H(B mmelmo-imap4 $B$N(B dispatch $B$O(B FLIM $BB&$KG$$;$k$h$&$K$7$?!#(B 1998-07-07 Yuuichi Teranishi * v0.3.2 - "Jump" wl release. 1998-07-06 Yuuichi Teranishi * wl-draft-send $B$r=$@5!#%(%i!<$r8!CN$G$-$?$H$-$O!"(Bedit-mode $B$KLa$k!#(B im-wl.el $B$b$=$l$K9g$o$;$F=$@5!#(B * utils/x-face-wl.el, utils/x-pgp-sig-wl.el deleted. * elmo-imap4, elmo-nntp $B$b(B coding-system $B4X78$N94B+$r(B as-binary-* $B$r;H$&$h$&$K$7$?!#(B 1998-07-06 OKUNISHI Fujikazu * coding-system $B4X78$N94B+$r(B as-binary-* $B$r;H$&$h$&$K$9$k!#(B 1998-07-05 OKUNISHI Fujikazu * New im-wl.el 1998-07-05 Yuuichi Teranishi * util/bbdb-wl.el * wl-summary-update $B8e(B folder$B%b!<%I$NA4%a%C%;!<%8?tI=<($,4V0c$C$F(B $B$$$?$N$rD>$9!#(B * wl-message-back-to-summary-hook -> wl-message-exit-hook * wl-message-back-to-summary -> wl-message-exit * wl-summary-toggle-disp-off-hook $BDI2C(B * wl-summary-exit-hook $BDI2C(B * wl-summary-goto-folder-mode -> wl-summary-exit * wl-folder-{next|prev}-unsync $B$N(B regexp $B$r=$@5!#(B * wl-auto-check-folder-name $BDI2C(B * wl-plugged $B$+$I$&$+$r(B Folder $B%b!<%I$H(B Summary $B%b!<%I$N(B modeline $B$KI=<(!#(B * wl-summary-next, wl-summary-prev, wl-summary-cursor-up, wl-summary-cursor-down $B$O(B unplugged $B$N;~$K$OFI$a$J$$%a%C%;!<%8$r(B $B$H$P$9$h$&$K$9$k!#(B * wl-draft-kill $B$G$?$^$K%(%i!<$,=P$k%P%0$r=$@5!#(B * [elmo] imap4, nntp $B$O(B plugged $B$G$J$1$l$P%(%i!<$H$9$k!#(B * $B4X?t(B wl-toggle-plugged $B$r $B$5$s$N8f;XE&$K4p$E$/JQ99(B) 1998-07-04 OKUNISHI Fujikazu * x-face-wl.el, x-pgp-sig-wl.el $B$O(B coding-system $B$r94B+$7$J$/$F$h$$!#(B 1998-07-03 Yuuichi Teranishi * Folder $B$N3+JD$r(B delete-region $B$G$d$k$h$&JQ99$7$?!#(B 1998-07-02 Yuuichi Teranishi * v0.3.1 - "Invisible Touch" wl release. * [elmo] imap4 $B$G(B overview $B $B$5$s$N8f;XE&$K4p$E$/=$@5(B) * wl-draft-send-with-smtp $B$G(B user-mail-address $B$,@_Dj$5$l$F$$$J(B $B$1$l$P!"(Bwl-from $B$+$i%a!<%k%"%I%l%9$r $B$5$s$N8f;XE&$K4p$E$/JQ99(B) 1998-07-01 Yuuichi Teranishi * v0.3.0 - "Human Nature" wl release. * mmelmo backend $B$Nl9g$O(B 1.8.2 $B0J9_$G$J$$$HF0$+$J$$!#(B * wl-mmelmo-display-message $B$re$N%Q!<%H$r!" mmelmo.el * (wl-message-mail-p) $B$+(B (wl-message-news-p) $B$N;~$N$_(B wl-draft-send $B$9$k!#(B 1998-06-28 Yuuichi Teranishi * v0.2.2 - "Girls Just Want To Have Fun" wl release. * imap4, localdir $B$N%"%$%3%s$N3($rJQ99(B(XEmacs)$B!#(B * Folder $B0lMw$NI=<($r!"!XL$F14|%a%C%;!<%8?t(B/$BA4%a%C%;!<%8?t!Y$K$7$?!#(B * [elmo] elmo-localdir-search $B$r * WL-ELS $B$r(B Makefile $B$+$i8F$V$h$&$K$9$k!#(B * WL-ELS $B$K(B install $B$H(B uninstall $B$rDI2C$7$F$_$?!#(B 1998-06-26 OKUNISHI Fujikazu * byte-compile $B$r9bB.$K9T$&$?$a$N(B WL-ELS$B!#(B * $B%-%c%C%7%e%U%!%$%k$NFI$_=q$-$r!"(Bfile-coding-system-for-read $B$G$O$J$/(B {in|out}put-coding-system $B$G94B+!#(B * Makefile $B$N(B bytecomp $B$N%3%^%s%I$r(B -batch $B$,:G=i$KMh$k$h$&$KJQ99!#(B 1998-06-25 Yuuichi Teranishi * folder $B$N3+JD$r$9$3$7%9%`!<%9$KI=<($9$k$h$&$K$7$?!#(B * draft, trash $B%U%)%k%@$K$OFCJL$J%"%$%3%s$r=P$9$h$&$K$7$?(B(XEmacs)$B!#(B 1998-06-24 Yuuichi Teranishi * elmo-imap4-search $B$r * v0.2.1 - "Freedom" wl release. * wl-draft-insert-signature $B$+$i(B signature.el $B$N(B insert-signature $B$r8F$V(B (XEmacs $B%D!<%k%P!l9g(B $B$G$b(B mail-send-hook $B$r(B run-hooks $B$9$k$h$&$K$7$?!#(B ($BDEM88x6G(B $B$5$s$N8f;XE&$K4p$E$/JQ99(B) * wl-organization $B$,(B non-nil $B$J$i(B Organization $B%U%#!<%k%I$r(B $BA^F~$9$k$h$&$K$7$?!#(B ($BDEM88x6G(B $B$5$s$N8f;XE&$K4p$E$/JQ99(B) * 00README.ja $B$K%a!<%j%s%0%j%9%H$N@bL@$rDI2C!#(B 1998-06-22 Yuuichi Teranishi * v0.2.0 - "Every Breath You Take" wl release. * [elmo] nntp $B$G$b%5%$%:$rFI$`$h$&$K$9$k!#(B * $B%W%j%U%'%C%A;~$b(B wl-fetch-confirm-threshold $B$r1[$($k$b$N$O(B $Bl9g!"(B $B:G=i$N%Q!<%H$@$1$rI=<($G$-$k$h$&$K$7$F$_$?!#(B * $BJQ?t(B wl-fetch-confirm-threshold $B$rDI2C!#(B $B$3$N%P%$%H?t0J>e$N%a%C%;!<%8$K$D$$$F$O!"(B $BFI$`$+$I$&$+ * $B4X?t(B semi-elmo-imap4-read-first-part, $B%^%k%A%Q!<%H$N:G=i$N%Q!<%H$@$1$N(B raw-buffer $B$r$D$/$k!#(B * $B4X?t(B semi-elmo-imap4-get-mime-entity, bodystructure $B$rFI$s$G!"(Bmime-parse-message $B$N=PNOAjEv$r:n$k!#(B * [elmo] imap4 $B$G%5%$%:$rFI$`$h$&$K$9$k!#(B * $B%U%!%$%k(B semi-elmo-imap4.el $B$r?75,DI2C!#(B 1998-06-18 Yuuichi Teranishi * v0.1.4 - "Dancing In The Dark" * $BJQ?t(B wl-strict-diff-folders $B$rDI2C!#(B $B$3$NJQ?t$K@_Dj$5$l$?(B IMAP4 $B%U%)%k%@$?$A$O(B $BL$F14|%a%C%;!<%8?t$N%A%'%C%/$r87L)$K$d$k$h$&$K$7$?!#(B "%inbox" $B$J$I!"IQHK$KJQ99$5$l$k%U%)%k%@8~$1!#(B * $B%"%/%;%97?%0%k!<%W%U%)%k%@$r:G=i$K3+$$$?$H$-$K!"(B $BA4%U%)%k%@$NL$FI?t$,=i4|2=$5$l$F$7$^$&%P%0$r2r>C!#(B * [elmo] IMAP4 $B$G(B read-msg $B$N$?$S$K(B select folder $B$9$k$N$r(B $B$d$a$?(B(UW v10.224 $B$h$j8E$$(B imapd $B$@$HLdBj$"$k$+$b(B)$B!#(B * Summary $B$N(B view $B$r(B cache $B$9$k$H$-$K!"$$$A$$$A1JB3E*%^!<%/(B $B$r%j%8%e!<%`$5$;$k$N$r$d$a$?!#(B 1998-06-17 Yuuichi Teranishi * 00README.ja $B$N$$$/$D$+$N4V0c$$$rD>$9!#(B ($B;3LnM5;J(B $B$5$s$h$j8f;XE&(B) 1998-06-16 Yuuichi Teranishi * v0.1.3 - "Centerfold" announced in elips, tm-ja. 1998-06-15 Yuuichi Teranishi * Summary $B$N(B resume-mark $B$H(B highlight $B$r0l2s$N(B scan $B$G(B $B=*$i$;$k$h$&$K$7$?!#(B 1998-06-14 Yuuichi Teranishi * Folder $B%U%!%$%k$K(B "%#mh /" $B$_$?$$$K=q$1$k$h$&$K$9$k!#(B * $B%"%/%;%97?%0%k!<%W%U%)%k%@$N>l9g!"3+$/$^$GFbMF$r wl-stay-folder-window$B!#(B 1998-06-12 Yuuichi Teranishi * toolbar $B$N(B refine$B!#(B * folder-mode $B$NF0:n$r=$@5!#(B * replicate->prefetch$B!#(B * refile $B$N?dB,$G<+J,$r3X=,$NBP>]$+$i30$9!#(B * make $B$r$$$C$Q$D$G!#(B 1998-06-11 Yuuichi Teranishi * $BJV;v$r=q$/;~!"(BCc $B$K<+J,$,;22C$7$F$$$k(B ML $B$H<+J,$,4^$^$l$F$7$^$&(B $B;~$K$O<+J,$O>C$9$h$&$K$9$k(B($B@5$7$$(B?)$B!#(B * Mail-Followup-To, Mail-Reply-To $B$KBP1~$7$F$_$?!#(B 1998-06-10 Yuuichi Teranishi * wl-summary-insert-summary $B$r8+D>$7!"%9%l%C%I@8@.B.EY$r(B $B9bB.2=(B($BLs(B 1.5 $BG\(B)$B!#(B 1998-06-07 Yuuichi Teranishi * Summary $B$G(B News $B5-;v$r%-%c%s%;%k$9$k4X?t(B wl-summary-cancel-message $B$r?7@_!"(B'C' $B$K%P%$%s%I!#(B * Newsgroups $B$,IU$$$F$$$l$P(B News $B$K$b%]%9%H$9$k$h$&$K$7$?(B($B$D$b$j(B)$B!#(B * $B$[$+$N(B SEMI MUA $B$N$3$H$r9M$($F(B toolbar $B$rIU$1$k$N$r(B hook $B$G$O$J$/$9!#(B 1998-06-02 Yuuichi Teranishi * [elmo] "/" $B$r4^$`(B Message-ID $B$r%U%!%$%k$K%;!<%V$9$k$N$K<:GT$9(B $B$k$N$r2sHr!#(B ("_" $B$KCV49$9$k$h$&$K$7$?$,$$$$$N$+!#(B) * wl-summary-redisplay $B$G!"(Brecenter $B$9$k$h$&$K$7$?!#(B * wl-summary-cursor-up $B$G!"(Bimportant-mark $B$r(B regexp-quote $B$9$k$N(B $BK:$l$F$?!#(B 1998-05-31 Yuuichi Teranishi * $BJQ?t(B wl-draft-folder $B$r@_CV!"(BMew $B$HF1$8$h$&$K!"(BDraft $B%b!<%I$G(B $B%;!<%V$9$k$H(B wl-draft-folder $B$G;XDj$5$l$?%U%)%k%@$K(B $B?75,%a%C%;!<%8$H$7$FJ]B8$9$k$h$&$K$7$?!#(B * Summary $B$G(B TAB $B$r2!$9$HA0$KI=<($7$?%a%C%;!<%8$KLa$k$h$&$K$9$k!#(B * Summary $B$G!"(Bdefault-directory $B$r(B wl-tmp-dir $B$K$9$k!#(B * wl-draft-open-file $B$rDI2C!#(B 1998-05-20 Yuuichi Teranishi * v0.1.2 - "Beat It" internal release. * CVS $B$r;H$$$O$8$a$k!#(B * Summary $B$N(B highlight $B$r(B2$B!A(B3$BG\9bB.2=!#(B * te@isl.ntt.co.jp $B$N8f0U8+$K$h$j(B Folder $B$G%P%C%AE*$K(B msgdb $B$r(B Sync $B$9$k(B "S" wl-folder-sync-current-entity $B$rDI2C!#(B 1998-05-19 Yuuichi Teranishi * $B$d$C$FMh$kJV;v$O:G6a$N%a%C%;!<%8$KBP$9$k$b$N$,B?$$$H$$$&(B $B%9%l%C%IDI2C$N6I=j@-$rMxMQ$7$F$A$g$C$H$@$1%9%l%C%I@8@.$r9bB.2=!#(B * qmail-inject $B$r%5%]!<%H!#(B * $BCfESH>C<$K(B miee.el $B$r%5%]!<%H$7$F$$$?$,!"$H$j$"$($:$d$a$F!"(B default $B$O(B Semi-gnus $B$K$D$$$F$$$?(B smtp.el $B$rMxMQ$9$k$h$&$K$9$k!#(B 1998-05-18 Yuuichi Teranishi * Makefile $B$N(B ELMODIR $B$r(B elmo $B$K$9$k(B (Report by te@isl.ntt.co.jp)$B!#(B 1998-05-17 Yuuichi Teranishi * Tiny toolbars for XEmacsen$B!#(B * important $B%^!<%/(B "$" $BIU$-$N%a%C%;!<%8$O!"(Bexpire $B$5$l$F$b>C$5$J$$(B. * Summary $B$G(B "i" $B$r2!$9$H!"(Breplicate-unreplicated-msgs $B$r * Copyright $BI=<($r3F%U%!%$%k$K2C$($k!#(B * [elmo] mule2.3@19.28 $B$N%@%5$$(B string-match $B$G$b$&$4$/$h$&$K(B imap4 $B$G(B search all $B$N7k2L$r * v0.1.1 - "Amanda". internal release. * 00README.ja, sample.addresses, sample.folders$B!#(B * wl-vars.el $B$N@0M}!#(B * $B$O$d$j$K$N$C$F(B X-MimeOLE: $B$r2C$($k$h$&$K$7$F$_$?!#(B * XEmacs $B$N(B 'dragdrop $B$KBP1~!#(Bwl-dnd.el 1998-05-08 Yuuichi Teranishi * wl-folder.el $B:F5"E*(B folder $B%Q!<%5!#(B 1998-05-01 Yuuichi Teranishi * Wanderlust $B$H$7$F%Q%C%1!<%82=(B (v0.1.0)$B!#JQ99$,B?$9$.$F5-O?$G$-$:!#(B (wl-draft.el/wl-address.el/wl-highlight.el $B$NDI2C(B, SEMI/tm $B$N(B API $B$X$NBP1~(B, mule2.3 $B$GF0$/$h$&$K$9$k(B, $BEy(B) 1998-04-17 Yuuichi Teranishi * nntp $B$G(B $BB8:_$7$J$$%0%k!<%W$N(B max-of-folder $B$,$3$1$k%P%0$H$j!#(B 1998-04-13 Yuuichi Teranishi * create-summary-line $B$G(B From $B$,(B nil $B$N>l9g$KBP=h!#(BDate $B$b!#(B * folder-quit $B$G(B kill-buffer $B$K0z?tEO$9$NK:$l$F$?!#(B * nntp $B$GF1$8%0%k!<%W$X$NA`:n$,B3$$$?>l9g$K$3$1$k%P%0$H$j!#(B * Makefile $B$G(B lp.el $B$N0MB84X78$r=$@5(B (Report by te@isl.ntt.co.jp)$B!#(B 1998-03-26 Yuuichi Teranishi * v0.09 * Summary $B$NJ8;z2=$1$r2r>C!"$G$b(B mule2.3 $B$G$&$4$+$J$/$J$C$?!#(B * update $B$7$?$H$-!"8:$C$?%a%C%;!<%8$,%P%C%U%!$+$i>C$($J$$%P%0$r$H$k!#(B * v0.08 * IMAP4 $B$KBP1~!#(B 1998-03-20 Yuuichi Teranishi * folder diff $B$r(B integer list $B$NHf3S$K5"Ce$5$;$k$3$H$K$h$j9bB.2=!#(B 1998-03-19 Yuuichi Teranishi * v0.07 * Mule-2.3 $B$KBP1~!#(B * update $B$H(B scan-all $B$rE}9g!#(B * $B$"$H$G8+D>$7$?$$%a%C%;!<%8$K$D$1$k%^!<%/!"(B"$" -- important mark $B$r(B $B?7@_!#(B * update $B$,I,MW$+$I$&$+$N%A%'%C%/$r(B list $B$NHf3S$K5"Ce$5$;$F9bB.2=!#(B * $B%$%s%G%C%/%9$N%-%c%C%7%eMQ$K(B buffer-local-variable $B$r@_$1!"(B $BF1$8%P%C%U%!$KBP$9$k#22sL\0J9_$N99?7A`:n$r9bB.2=!#(B * mt $B$G8=:_$N%9%l%C%I$K0l3g(B "*" $B%^!<%/!#(B * c $B$GA4$F$N%a%C%;!<%8$r0l3g$7$F4{FI$K!#(B 1998-03-16 Yuuichi Teranishi * v0.06 * $BI=<(I}$r0lDj$K$9$k!#(B * update $B$r7Z$/$9$k!#(B * $B%a%C%;!<%8$,8:$C$?$3$H$b(B update$B!#(B * cache $B%$%s%5!<%H;~$K%^!<%/$r%j%8%e!<%`!#(B * font-lock $B$N(B regexp $B$rJQ99!#(B 1998-03-13 Yuuichi Teranishi * v0.05 * $BL$FI%^!<%/!"(B"!"$B!#(B * update scan$B!#(B * font-lock$B!#(B * $BMKF|$N1Q8l(B/$BF|K\8l@ZBX$($r2DG=$K!#(B * Petname$B!#(B 1998-03-10 Yuuichi Teranishi * v0.04 * $BMKF|$rF|K\8l$GI=<(!#(B * $B%U%#!<%k%ICM$N3MF@$K<:GT$7$J$$$h$&$K(B overview $B:n@.;~$N(B coding-system-for-read $B$r(B 'junet $B$K94B+!#(B 1998-03-10 Yuuichi Teranishi * v0.03 * $B%$%s%G%C%/%9$N(B elisp $B%*%V%8%'%/%H2=$K$h$j9bB.2=!#(B * Date $B$r=P$9(B * $BF1$8%9%l%C%I$G$b!"0c$&(B Subject $B$J$iI=<((B 1998-03-06 Yuuichi Teranishi * v0.02 * $B%9%l%C%I$N4V0c$$$rD>$9(B * indent-level $B$r%+%9%?%^%$%:$G$-$k$h$&$K$9$k!#(B 1998-03-05 Yuuichi Teranishi * v0.01 Summary $B$r%9%l%C%II=<($G$-$k$@$1$N%W%m%H%?%$%W!#(B wanderlust-wanderlust-912c443/etc/ChangeLog.2000066400000000000000000001332401262320455600210400ustar00rootroot000000000000001999-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$B!#(B * Change: rename wl-folder-exit -> wl-exit$B!#(B * 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$B!"(Binternal 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$B!"(Belmo-nntp-use-cache, elmo-imap4-use-cache$B!"(Belmo-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$B!"(Bwl-summary-goto-folder" changes to wl-folder-goto-folder-subr$B!"(Bwl-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$B!"(BELMO_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). ($BKLL\$5$s(B $B$N8fMWK>$K4p$E$/(B)$B!#(B * 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-912c443/etc/ChangeLog.2.ja000066400000000000000000001514171262320455600214370ustar00rootroot000000000000001999-05-18 Yuuichi Teranishi * 1.0.0 - "Kokomo" 1999-05-18 Tsunehiko Baba * $B?75,%U%!%$%k(B ChangeLog.en $BDI2C!#(B 1999-05-18 A. SAGATA * Message $B$G(B mouse-2 $B$,F0$+$J$/$J$C$F$$$?$N$r=$@5!#(B 1999-05-18 Yuuichi Teranishi * 1.0.0 pre2 - "Kokomo-pre2" * Folder $B$G(B $B%0%k!<%W$NCf$NL$FI?t$,8:$k$H%O%$%i%$%H$NHO0O$,JQ$o(B $B$C$F$7$^$&$N$r=$@5!#(B ($B>.6L$5$s(B $B$N8f;XE&(B) * Draft $B$N(B C-cC-s $B$H(B menubar $B$N%-!<%P%$%s%I$O%I%i%U%H%P%C%U%!Kh$K(B local-set-key $B$9$k$h$&$K$7$?!#(B * wl-summary-mark-as-read-all $B$,!$%9%l%C%I$,JD$8$?>uBV$G1#$l$F(B $B$$$k%a%C%;!<%8$KBP$7$F8z$+$J$/$J$C$F$$$?$N$r=$@5!#(B ($BBg_7$5$s(B $B$N8f;XE&(B) 1999-05-18 Masahiro MURATA ($BB * wl-summary-reply-with-citation $B$G$O(B wl-draft-prepared-config-alist $B$G$NK\J8A^F~0LCV$,68$&$N$r=$@5(B $B$7$?!#(B 1999-05-17 $B2,ED(B $B7r0l(B * [bbdb.el] wl-folder-exit-hook -> wl-exit-hook $B$KBP1~!#(B 1999-05-17 Yuuichi Teranishi * pre 1.0.0 - "Kokomo-pre" * replace-match () $B$r;H$o$J$$$h$&$K$7$?!#(B 1999-05-17 $B2,ED(B $B7r0l(B * POP-before-SMTP $B$N%I%-%e%a%s%HDI2C!#(B * POP-before-SMTP $B$KBP1~!#(B 1999-05-17 OKUNISHI Fujikazu * elmo-multi-get-msg-filename() $B$,B8:_$7$J$+$C$?$N$GDI2C!#(B * wl-message-refer-article-or-url() $B$G(B mailto: $B$rDL$9!#(B 1999-05-17 Masahiro MURATA ($BB * wl-summary-goto-folder $B$r(B interactive $B$Gl9g!$(B wl-folder-buffer-cur-{path|entity-id} $B$,JQ99$5$l$J$$$N$r=$@5$7(B $B$?!#(B * wl-expire-alist $B$N(B 2$B!$(B3$BHVL\$NMWAG$N$$$:$l$+$,(B nil $B$N>l9g$O(B expire $B$7$J$$$h$&$K$7$?!#(B 1999-05-17 $B2,ED(B $B7r0l(B * AUTHINFO $B$K4X$9$kItJ,$N%I%-%e%a%s%HDI2C!#(B 1999-05-17 A.SAGATA * $B%^%&%99T%O%$%i%$%H$N%P%0=$@5!#(B 1999-05-17 Yuuichi Teranishi * $B$"$A$3$A$+$i(B BETA $B$r * make uninstall $B$,(B WL_PREFIX, ELMO_PREFIX $B$r9MN8$7$F$$$J$+$C$?$N$r(B $B=$@5!#(B * Mule2.3 $B8~$1$K(B (point-at-bol), (point-at-eol) $B$r;H$o$J$$$h$&$K$7$?!#(B * $BL>A0JQ99(B wl-folder-exit-hook -> wl-exit-hook$B!#(B * $BL>A0JQ99(B wl-folder-exit -> wl-exit$B!#(B * ja.Emacs $B$r99?7!#(B * [wl-ja.texi] wl-summary-print-message $B$N@bL@DI2C!#(B 1999-05-16 Masahiro MURATA ($BB * wl-auto-select-first $B$,(B t $B$G$"$C$F$bL$FI$,$J$$>l9g!$(B $B%a%C%;!<%8%P%C%U%!$,>C$($J$$$N$r=$@5!#(B 1999-05-15 Yuuichi Teranishi * [wl-ja.texi] highlight$B!"(Binternal $B%U%)%k%@$N@bL@$rDI2C!#(B * wl-highlight $B$+$i$$$/$D$+$N(B defvar $B$r(B wl-vars $B$K0\$7!"(B defcustom $B$K$7$?!#(B * unplugged $B$G(B nntp $B%U%)%k%@$rA*Br$9$k$H%(%i!<$,=P$k$N$r=$@5!#(B ($B4];3$5$s(B $B$h$j8f;XE&(B) * wl-stay-folder-window $B$,(B t $B$N$H$-!"(BSticky Summary $B$,Mm$`$H(B $B%-%c%C%7%e$,99?7$5$l$J$$$J$I$NIT6q9g$,H/@8$7$F$$$?$N$r=$@5!#(B * Summary $B$N%^%&%99T$N%O%$%i%$%H$r9TF,$+$i9TKv$^$G$K$7$?!#(B * wl-init $B$N=i4|2=$N=g=x$H%a%C%;!<%8$r0lItJQ99!#(B prefix-arg $B$D$-$G$O!"4pK\%U%)%k%@$NB8:_$r%A%'%C%/$7$J$$$h$&$K$7$?!#(B * Sticky Summary $B$r(B exit $B$9$k$H$-$K!"%S%e!<%-%c%C%7%e$b(B $B%;!<%V$9$k$h$&$K$7$?!#(B 1999-05-14 OKUNISHI Fujikazu * wl-summary-reedit() $B$7$?;~$K(B wl-mail-setup-hook $B$,;2>H$5$l$J$$(B $B$N$r=$@5!#(B 1999-05-14 Masahiro MURATA ($BB * wl-summary-next-folder-or-exit() $B$N=$@5$,(B wl-auto-select-first $B$,(B t $B$N>l9g$,9MN8$5$l$F$J$$$N$r=$@5!#(B * wl-summary-next-no-unread $B$,(B t $B$N$H$-$N0\F0%3%^%s%I$rJQ99$G$-(B $B$k$h$&$K$7$?!#(B 1999-05-14 $B2,ED(B $B7r0l(B * [wl-ja.texi] wl-draft-write-current-newsgroup $B$N%I%-%e%a%s%HDI2C!#(B 1999-05-13 A.SAGATA * mode-motion-hook $B$rMQ$$$:$K(B mouse-face $B$N(Bhighlight $B$r9T$&;v$K$7$?!#(B * wl-version-show $B$rDI2C$7$?!#(B 1999-05-13 Koichiro Ohba * [wl-ja.texi] Sticky Summary $B$N@bL@$rDI2C!#(B 1999-05-13 $B2,ED(B $B7r0l(B * wl-summary-stick$B$7$?%U%)%k%@$G!$(Bwl-summary-forward$B$7$?8e!$(B $BJQ$J%&%$%s%I%&$K9T$C$F$7$^$&$N$r=$@5!#(B 1999-05-13 Masahiro MURATA ($BB * wl-template $B$,(B recursive-edit $B$r;H$o$J$$$h$&$K$7$?!#(B 1999-05-13 Yuuichi Teranishi * wl-draft-config-alist $B$N%5%V4X?t$K(B 'x-face $B$rDI2C!#(B * [wl-template] select $B%P%C%U%!$r%O%$%i%$%H$9$k$h$&$K$7$?!#(B 1999-05-13 Mito * $B%U%)%k%@$r0\F0$7$F$b!"D>A0$N%a%C%;!<%8$,I=<($5$l$?$^$^$J$N$r(B $BHr$1$k$?$a(B wl-summary-next-folder-or-exit() $B$G(B (wl-summary-toggle-disp-msg 'off) $B$9$k$h$&$K$7$?!#(B * wl-summary-toggle-disp-msg() $B$G(B arg $B$K(B off $B$r;XDj$7$F8F(B $B$S=P$7$?>l9g%(%i!<$,=P$k$N$r=$@5!#(B 1999-05-13 Masahiro MURATA ($BB * NNTP $B%U%)%k%@$r(B wl-folder-update-recursive-current-entity $B$G99(B $B?7$9$k$H%(%i!<$K$J$k$N$r=$@5$7$?!#(B 1999-05-13 Yuuichi Teranishi * pop3, imap4, nntp $B$G!"(Belmo-*-use-cache $B$,(B nil $B$N$H$-$K(B uncached $B$K$J$C$F$7$^$&$N$r=$@5!#(B ($BB $B$N8f;XE&(B) 1999-05-12 OKUNISHI -GTO- Fujikazu * localnews $B$,FI$a$J$/$J$C$F$$$?%P%0$r=$@5!#$^$?!"(B elmo-localnews-local-file-p() $B$N0z?t$,B-$j$J$+$C$?$N$r=$@5!#(B 1999-05-12 Yuuichi Teranishi * 0.10.2 - "I'm Your Man" 1999-05-12 A. SAGATA * [wl-ja.texi] $B$$$/$D$+$N%3%^%s%I$N@bL@$rDI2C!#(B 1999-05-12 Koichiro Ohba * [sample.dot.wl] auto-refile $B@_Dj$rDI2C!#(B * [wl-ja.texi] wl-summary-auto-refile-skip-marks $B$N@bL@$rDI2C!#(B 1999-05-12 Masahiro MURATA ($BB * $BBgJ8;z$N%K%e!<%9%0%k!<%WL>$N%A%'%C%/$K<:GT$9$k$N$r=$@5!#(B 1999-05-12 Yuuichi Teranishi * localdir $B$G4{FI%a%C%;!<%8$,(B uncached $B$K$J$C$F$7$^$&$N$r=$@5!#(B * $B?75,JQ?t(B wl-ps-print-buffer-func$B!#(Bps-print $B$G;H$&4X?t$r;XDj!#(B default $B$O(B 'ps-print-buffer-with-faces$B!#(B ($B?e8M$5$s(B $B$N8fMWK>$K4p$E$/(B)$B!#(B * .folders $B2r@O;~$K%0%k!<%W$H(B petname $B$KF1$8L>A0$,$G$F$-$?$i(B $B%(%i!<$r=P$9$h$&$K$7$?!#(B 1999-05-11 Masahiro MURATA ($BB * sample.dot.wl $B$r99?7!#(B * $B%"%/%;%9%0%k!<%W$N5-=R$N=$@5B>!#(B 1999-05-11 OKUNISHI -GTO- Fujikazu * $B%U%#%k%?%U%)%k%@$G(B "$" $B$r$D$1$kBP>]$,%m!<%+%k%U%!%$%k$G$"$k(B $B>l9g$K!"%^!<%/$O$D$/$,%-%c%C%7%e$G$-$J$$%P%0$r=$@5!#(B 1999-05-11 Yuuichi Teranishi * tm $B8~$1(B partial $B7k9g4X?t$rl9g$,$"$C$?$N$r=$@5!#(B * wl-folder-check-one-entity $B$G$9$0$K7k2L$,I=<($5$l$k$h$&(B (sit-for 0) $B$9$k$h$&$K$7$?!#(B * wl-message-redisplay-hook $B$r(B unwind-protect $B$7!"(B bbdb $B$J$I$N(B prompt $B$G(B C-g $B$7$?$H$-$K$b(B Summary $B$K%+!<%=%k$,La$k$h$&$K$7$?!#(B 1999-05-10 Tomokazu Matsumaru * $B$?$/$5$s%a%C%;!<%8$,$"$k(B POP3 $B%U%)%k%@$,%O%s%0$9$kLdBj$r=$@5!#(B 1999-05-10 Yuuichi Teranishi * $B?75,JQ?t(B wl-folder-sync-range-alist, wl-default-sync-range$B!#(B $B%U%)%k%@$4$H$K(B sync $B$N%G%U%)%k%H$rJQ$($i$l$k$h$&$K$7$?!#(B ($B?@V:$5$s(B$B$h$j8fMWK>(B) * Mule 2.3 $B$G(B make $B$K<:GT$9$k$N$r=$@5!#(B ($B>.6L$5$s(B $B$N8f;XE&(B) * wl-vars.el $B$,(B euc $B$K$J$C$F$$$F%9%l%C%I;^$,J8;z2=$1$9$k$N$r=$@5!#(B ($BB $B$N8f;XE&(B) * 0.10.1 - "Harlem Shuffle" 1999-05-09 Yuuichi Teranishi * imap4 $B$G!"(Bselect-folder $BCf$K(B C-g $B$9$k$H!"%+%l%s%H%U%)%k%@$,(B $B$*$+$7$/$J$k$N$r=$@5(B($B$7$?$D$b$j(B)$B!#(B ($B?e86!wI=@i2H(B $B$5$s$N8f;XE&(B) * $B?75,JQ?t!"(Belmo-archive-use-cache$B!"(Belmo-nntp-use-cache elmo-imap4-use-cache$B!"(Belmo-pop3-use-cache$B!#(B $B$=$l$>$l!"FI$s$@;~$K%a%C%;!<%8$r%-%c%C%7%e$9$k$+$I$&$+$r@_Dj!#(B * wl-no-cache-folder-list -> $BGQ;_!#(B * important-mark $B$rIU$1$?=V4V$K%-%c%C%7%e$9$k$h$&$K$7$?!#(B 1999-05-08 Koichiro Ohba * [wl-ja.texi] typo $BB>$N=$@5!#(B 1999-05-08 OKUNISHI Fujikazu * [wl-ja.texi] typo $BB>$N=$@5!#(B 1999-05-05 OKUNISHI Fujikazu * ^L $B$G2~JG$5$l$F$k;~$K8B$j(B wl-message-prev-page() $B$9$k$H%+!<(B $B%=%k$,%a%C%;!<%8%P%C%U%!$+$i%5%^%j$XLa$i$J$$%P%0$r=$@5!#(B * make install $B;~$K$O(B *.elc $B$O(B rename-file() $B$9$k!#(B * mode-motion-hook $B$O(B XEmacs $B8GM-$J$?$a!"(BGNU Emacs $B$G%P%$%H%3(B $B%s%Q%$%k$9$k$H%(%i!<%a%C%;!<%8$,=P$k$N$rL[$i$;$k!#(B 1999-05-05 OKUNISHI -GTO- Fujikazu * wl-summary-refile-region, wl-summary-copy-region, wl-thread-refile, wl-thread-copy $B$,%P%0$C$F$$$?$N$r=$@5!#(B 1999-05-05 Masahiro MURATA ($BB * elmo-{nntp|imap4|pop3}.el $B$G(B case-fold-search $B$,A`:nBP>]%P%C%U%!(B $B$GM-8z$K$J$C$F$$$J$+$C$?$N$r=$@5$7$?!#(B 1999-05-04 Masahiro MURATA ($BB * wl-draft-send $B$r(B1$BEYCfCG$7$?8e$KAw?.$r9T$&$H!$(B wl-draft-config-alist $B$NJQ?t$,E,MQ$5$l$J$$LdBj$r=$@5$7$?!#(B 1999-05-01 OKAZAKI Tetsurou * NNTP $B%U%)%k%@$G(B top $B%+%F%4%j$NF,J8;z$,?t;z$K$J$C$F$$$k(B $B%K%e!<%9%0%k!<%W$rFI$a$kMM$K$7$?!#(B 1999-04-30 Masahiro MURATA ($BB * face $B$r%]!<%?%V%k$KDj5A$9$k4X?t!"(Bwl-defface $B$rDj5A!#(B 1999-04-30 Yuuichi Teranishi * $BJT=8Cf$N%I%i%U%H$r(B Summary $B$+$i(B reedit $B$9$k$H%P%C%U%!L>$N(B $B%U%)%k%@L>ItJ,$,A}?#$7$F$7$^$&$N$r=$@5!#(B ($B2,:j$5$s(B OKAZAKI Tetsurou $B$h$j8f;XE&(B) * $B6u%U%)%k%@$G(B s->rescan $B$9$k$H$I$3$K%8%c%s%W$9$k$+?V$$$F$7$^$&(B $B$N$r=$@5!#(B ($B2,:j$5$s(B OKAZAKI Tetsurou $B$h$j8f;XE&(B) * [bbdb-wl] (require 'wl) $B$9$k$h$&$K$7$?!#(B * Thread $B$N;R$b?F$b$J$$%a%C%;!<%8$G(B wl-thread-open-close $B$9$k$H(B $B$I$3$K%8%c%s%W$9$k$+?V$$$F$7$^$&$N$r=$@5!#(B * $B?75,%3%^%s%I!"(Bwl-summary-drop-unsync, wl-folder-drop-unsync-current-entity$B!#(B $BA4$F$NL$F14|%a%C%;!<%8$r!"$J$+$C$?$3$H$K$9$k!#(B 'D' $B$K3d$jEv$F!#(B 1999-04-28 Masahiro MURATA ($BB * $B?75,JQ?t(B wl-draft-prepared-config-alist$B!#(B wl-draft-config-alist $B$K4v$D$+$N5!G=3HD%$r9T$C$?!#(B * $B?75,%U%!%$%k(B wl-template$B!#(B $B%I%i%U%H$K%F%s%W%l!<%H$rA*Br!&A^F~$9$k5!G=$rDI2C$7$?!#(B 1999-04-28 Yuuichi Teranishi * Nemacs $B0J30$O(B wl-draft-mode-map $B$r;H$&$h$&$K$7$?!#(B ($BB $B$h$j8f=u8@(B) 1999-04-13 Masahiro MURATA ($BB * Summary $B%P%C%U%!$N(B case-fold-search $B$,>o$K(B nil $B$K$J$C$F$7$^$&$N$r(B $B=$@5!#(B * elmo-nntp-open-connection $B$,<:GT$7$?$H$-$NJV$jCM$,(B docstring $B$H(B $B0[$J$C$F$$$?$N$r=$@5!#(B 1999-04-28 Mito * wl-draft-buffer-cur-summary-buffer $B$,(B # $B$K$J$C$?(B $B$H$-$KAw?.%3%^%s%I$,<:GT$7$F$7$^$&$N$r=$@5!#(B 1999-04-27 Mito * Summary $B$+$i(B '#' $B$G%W%j%s%H$9$k;~$K3NG'$r5a$a$k$h$&$K$7$?!#(B 1999-04-27 $B2,ED(B $B7r0l(B * wl-summary-refile-region $B$,$*$+$7$/$J$C$F$?$N$r=$@5!#(B 1999-04-27 Yuuichi Teranishi * Nemacs $B$GF0$+$J$/$J$C$F$$$?$N$r=$@5!#(B * custom $B$,$J$$4D6-$GLdBj$,$"$C$?$N$r=$@5!#(B * $B$$$/$D$+K:$l$F$$$?%Q%C%A$N%^!<%8(B (pop3 $B$,%O%s%0$9$kLdBj$N=$@54^$`(B)$B!#(B ($B:72eED$5$s(B $B$h$j8f;XE&(B) * 0.10.0 - "Got My Mind Set On You" * localnews $B$,(B wl-summary-local-p $B$G(B local $B07$$$5$l$F$$$J$+$C$?$N$r(B $B=$@5(B($B8MED$5$s(B $B$h$j8fJs9p(B) 1999-04-26 Yuuichi Teranishi * elmo-internal.el $B$N3F%P%C%/%(%s%I4X?t$r * SEMI $B$G(B partial $B$r7k9g$9$k4X?t$r=q$-D>$7$?!#(B * [bbdb-wl] Sticky Summary $B$KBP1~!#(B * wl-default-draft-cite $B$,%P%0$C$F$$$?$N$r=$@5!#(B ($B%5%^%j$N%+!<%=%k0LCV$,$:$l$F$$$k$H!"4V0c$C$?(B citation title $B$r(B $B$D$1$F$7$^$&(B) 1999-04-23 A. SAGATA * body $B$N0l$D$N9T$KFs$D(B message-id$B$,$"$k$H$-$K!":8$N(Bmessage-id$B$r(B $B??Cf%/%j%C%/$9$k$H1&$N(B message-id $B$KHt$s$G$7$^$&$N$r=$@5!#(B 1999-04-23 $B2,ED(B $B7r0l(B * wl-summary$B%b!<%I$N:G2<9T$N6u9T$G!$(Bwl-thread-{copy,refile}$B$9$k$H!$(B $B%(%i!<$,=P$k$N$r=$@5!#(B 1999-04-22 Yuuichi Teranishi * prefix arg $B$D$-$G%U%)%k%@0\F0$9$k$H!"(BSticky Summary $B$K(B $B0\F0$9$k$h$&$K$7$?!#(B ($B$3$l$^$G$N(B wl-folder-goto-folder$B!"(Bwl-summary-goto-folder $B$r(B $B$=$l$>$l(B wl-folder-goto-folder-subr$B!"(Bwl-summary-goto-folder-subr $B$KJQ99(B) * wl-highlight-body-too $B$,(B nil $B$N;~$K(B draft-buffer $B$G(B"^L" $B$7$F$b(B re-highlight $B$7$J$$$h$&$K$7$?!#(B ($B:72eED$5$s(B $B$N=$@5(B)$B!#(B * $B$7$D$3$$%5%^%j!"(BSticky Summary$B!#(B ($B?e8M$5$s(B $B$N8fMWK>$K4p$E$/(B)$B!#(B * mmelmo-imap4 $B$O(B mmelmo $B$r7Q>5$9$k$h$&$K$7$?!#(B 1999-04-21 A. SAGATA * wl-folder-close-parent-entity $B$K%P%0$,$"$C$?$N$r=$@5!#(B * wl-thread-open-close $B$N5!G=$r3HD%$7!";R$,$J$$>l9g$O?F$r(B close $B$9$k$h$&$K$7$?!#(B * wl-folder-close-parent-entity -> wl-folder-open-close * wl-folder-open-close $B$r(B "/" $B$K%P%$%s%I!#(B 1999-04-21 Mito * $B%M%9%H$7$F$k(B alias $B$bE83+$9$k$h$&$K$7$?!#(B 1999-04-21 Yuuichi Teranishi * wl-summary-move-order $B$,(B 'new$B!"$+$D:G=i$N%a%C%;!<%8$N%^!<%/$,(B "$" $B$+$D%U%)%k%@Fb$K(B "$" $B0J30$N%^!<%/$,$J$$$H$-!"(B wl-summary-goto-folder $B$G:G=i$N%a%C%;!<%8$K%+!<%=%k$,9T$+$J$$(B $B$N$r=$@5!#(B * wl-summary-goto-folder $B$GL@$i$+$K#22s(B wl-summary-cursor-down $B$r(B $B9T$C$F$$$?(B(!)$B$N$r=$@5!#(B 1999-04-21 Kazuyuki IENAGA * custom $B$KBP1~!#(B 1999-04-21 Masahiro MURATA ($BB * leafnode $B$J$I(B group $B%3%^%s%I$N%l%9%]%s%9$KM>J,$J%a%C%;!<%8$rIU(B $B$1$k%5!<%P$G$O!$%[%9%HL>$rIU2C$7$?%U%)%k%@$N>pJs$, * $B?75,%U%!%$%k(B elmo-internal.el$B!#(B $BFbIt%G!<%?$r%V%i%&%:$9$k$?$a$N%U%)%k%@!#(B 1999-04-19 A. SAGATA * $B?75,4X?t(B wl-draft-highlight-and-recenter$B!#%I%i%U%H$G(B C-l $B$9$k$H!"(B $B%O%$%i%$%H8e(B recenter$B!#(B * [elmo-nntp] elmo-nntp-search $B$N0z?t$,0c$C$F$$$?$N$r=$@5!#(B 1999-04-19 Takaaki MORIYAMA * nntp $B$N(B folder $BDj5A$K%]!<%H;XDj$r$G$-$k$h$&$K$7$?!#(B 1999-04-19 Yuuichi Teranishi * wl-summary-copy-prev-destination $B$r(B \M-O $B$K3d$j?6$C$F$$$?$N$,(B vt-100$B$N%+!<%=%k$^$o$j$GLdBj$,$"$C$?$N$G%-!<%P%$%s%I$r30$7$?!#(B ($B$9$,$N$5$s(B $B$h$j8f;XE&!"(B $B:72eED$5$s(B $B$h$j8f=u8@(B)$B!#(B * nntp $B$G%a%C%;!<%8HV9f$,(B 6 $B7e$r1[$($k$HHV9f$,A4It(B 0 $B$K$J$C$F(B $B$7$^$&$N$r=$@5(B($B:72eED$5$s(B$B$N8f;XE&(B)$B!#(B 1999-04-19 $B2,ED(B $B7r0l(B * $B%*%U%i%$%s!&%j%U%!%$%k(B/$B%3%T!<$N$"$H!"%j%U%!%$%k(B/$B%3%T!<@h$N%U%)%k(B $B%@$rK,$l$k$H!"%*%U%i%$%s$G$b%a%C%;!<%8$,DI2C$5$l$F$$$k$h$&$K8+$($J$$(B $B$N$r=$@5!#(B * $B%*%U%i%$%s;~$NL$FI=hM}$b$9$k$h$&$K=$@5!#(B 1999-04-19 A. SAGATA * $B%5%^%j$N(B \M-O $B$N%P%$%s%I$r30$9!#(B 1999-04-17 Koichiro Ohba * wl-summary-auto-refile $B$N%I%-%e%a%s%HDI2C!#(B * wl-summary-auto-refile $B$N%-!<%P%$%s%IDI2C!#(B * sample.dot.wl $B$G(B Mail-Followup-To $B$H(B Mail-Reply-To $B$r<+A0$GIU$1(B $B$F$$$k$N$r=$@5!#(B 1999-04-14 Yuuichi Teranishi * $B%I%i%U%H%P%C%U%!$N%b!<%I$r(B mail-mode $B$r(B derive $B$7$?(B wl-draft-mode $B$K$7$?!#(B ($B>.NS$5$s(B $B$N8f=u8@(B) * [WL-ELS] $B?75,JQ?t(B WL_PREFIX$B!"(BELMO_PREFIX $B$r@_$1!"(B $B$=$l$>$l$NCM$r(B ELISPDIR $B$+$i$NAjBP%G%#%l%/%H%j$H$7$F(B wl, elmo $B%b%8%e!<%k$r%$%s%9%H!<%k$9$k$h$&$K$7$?!#(Bdefault $B$O(B ""$B!#(B ($B>.NS$5$s(B $B$N8f=u8@(B) * "make clean" $B$,(B WL-ELS $B$r(B load $B$7$F$7$^$&$N$G!"B>$N(B emacs $B$G(B compile $B$7$?(B *.elc $B$N$"$k(B source tree $B$GJL$N(B emacs $B$GF0$+$J$$$N$r(B $B=$@5!#(B * $BJ#?t%a%C%;!<%8$,$"$k$H(B POP $B$,%O%s%0$7$F$7$^$&$N$r=$@5!#(B ($B@P@n$5$s(B $B$h$j8fJs9p(B) 1999-04-13 OKAZAKI Tetsurou * [elmo-nntp] docstring $B$N(B typo $B=$@5!#(B 1999-04-12 A. SAGATA * summary buffer$B$G!"(B"E" $B$r2!$7$F(B reedit $B$9$k$H!"(Bbody $B$,A4It(B signature-face $B$K$J$C$F$7$^$&$N$r=$@5!#(B * summary mode $B$H(B folder mode $B$N;~$K!"(Bmouse $B9T$r(B highlight $B$5$;$k(B(xemacs$B$N$_(B)$B!#(B 1999-04-12 Yuuichi Teranishi * $B%I%i%U%H$G!"%?%V$G;O$^$k9T$NC$5$l$F$7$^$&%P%0$r=$@5(B ($B:72eED$5$s(B$B$N8f;XE&(B)$B!#(B * Summary $B$G(B 'q' $B$r2!$7$?8e$9$+$5$:(B C-g $B$9$k$HJ8;z2=$1$7$?(B $B%P%C%U%!$,;D$C$F$7$^$&$N$r=$@5(B($B0$It$5$s(B $B$N8f;XE&(B)$B!#(B * XEmacs $B$GF|K\8l(B Subject $B$N(B pick $B$,<:GT$9$k$N$r=$@5(B ($B:72eED$5$s(B$B$N8f;XE&(B)$B!#(B * 4/2 $B$N(B elmo-nntp-get-folders-info $B$,%O%s%0$7$F$7$^$&=$@5$r(B ChangeLog $B$K2C$($k$N$rK:$l$F$$$?$N$GDI2C!#(B ($BCf@n$5$s(B $B$h$j8f;XE&(B)$B!#(B * 0.9.8 - "Faith" 1999-04-10 Yuuichi Teranishi * $B?75,JQ?t!"(Belmo-msgid-replace-string-alist Message-id ->$B%-%c%C%7%e$N%U%!%$%kL>$NJQ49%k!<%k$r@_Dj!#(B 1999-04-09 Yuuichi Teranishi * [elmo-imap4] LOGIN $B$G%Q%9%o!<%I$K6uGrJ8;z$,$"$k$P$"$$$K(B $BG'>Z$K<:GT$9$k$N$r=$@5!#(B ($B7'Ln$5$s(B $B$h$j8fJs9p(B) 1999-04-07 $B2,ED(B $B7r0l(B * [NNTP] AUTHINFO $B$KBP1~!#(B 1999-04-07 Yuuichi Teranishi * C-u . $B$G!"%-%c%C%7%e$,$"$C$F$b:FFI$_9~$_$9$k$h$&$K$7$?!#(B * $B=i4|2=;~!"%M%C%H%o!<%/$K$D$J$,$C$F$$$J$/$F$b(B C-g $B$r2!$;$P(B $B5/F0$G$-$k$h$&$K$7$?!#(B 1999-04-06 SHIMADA Mitsunobu * Maildir $B$N%a!<%k$N:o=|!"%j%U%!%$%k$K<:GT$9$k>l9g$,$"$C$?$N$r=$@5!#(B 1999-04-03 OKAZAKI Tetsurou * [wl-ja.texi] $BJQ?t(B wl-insert-mail-(followup|reply)-to $B$N=i4|@_DjCM(B $B$N4V0c$$$r=$@5!#(B 1999-04-02 Masahiro MURATA ($BB * $B?75,JQ?t(B elmo-nntp-get-folders-securely$B!#(BNon-nil $B$K$9$k$H(B elmo-nntp-get-folders-info $B$,La$C$F$3$J$/$J$k$N$r=$@5$9$kJQ99$,(B $BM-8z$K$J$k!#(Bdefault $B$O(B nil$B!#(B 1999-04-02 nakagawa@pochi.tis.co.jp ($BCf@n(B $B@?(B) * cnews(?) $B$@$H(B elmo-nntp-get-folders-info $B$,La$C$F$3$J$/$J$j!"(B $B%O%s%0$7$F$7$^$&$N$r=$@5!#(B 1999-03-31 Yuuichi Teranishi * petname-alist $B$r(B obarray $B2=!#(B * $B?75,JQ?t(B wl-summary-divide-thread-when-subject-changed$B!#(B t $B$J$i%5%V%8%'%/%H$,JQ$o$C$?$H$-$K%9%l%C%I$r@Z$k$h$&$K$7$?!#(B ($B$d$^$@$"$-$i$5$s(B $B$N8fMWK>(B) * $B?75,JQ?t(B wl-summary-subject-filter-func $B%5%V%8%'%/%HHf3SA0$K(B $B=hM}$r9T$&4X?t$r;XDj!#(B * wl-summary-from-func, wl-summary-subject-func, wl-summary-subject-filter-func $B$r(B funcall $B$9$k$N$r$d$a!"(B $B5/F0;~$K(B fset $B$9$k$h$&$K$7$?!#(B * wl-draft-config-exec-flag $B$r%P%C%U%!%m!<%+%kJQ?t$K$7$?!#(B * Summary $B$G(B M->j->q $B$9$k$H%(%i!<$,H/@8$9$k$N$r=$@5!#(B ($B2,ED$5$s(B$B$N8f;XE&(B) * signature $B$N(B face $B$N%G%U%)%k%H$r?'$D$-%U%)%s%H$K$7$?!#(B 1999-03-30 $B2,ED(B $B7r0l(B * $B6u9T$G(B'd'$B$G$-$J$$$h$&$K$7$?!#(B * $B3:Ev$N(BMessage-Id$B$N5-;v$,F1$8%U%)%k%@$KJ#?t$"$k$H$-$K$=$N$&$A0l$D$r(B $B%*%U%i%$%s$G:o=|$7$F(B elmo-dop-queue-flush $B$9$k$H!$(B elmo-imap4-delete-msg-by-id$B$,<:GT$9$k$N$r=$@5!#(B 1999-03-29 A. SAGATA * signature $BNN0h$N8!=P$r8-$/$7$?!#(B * signature $B$r%O%$%i%$%H$9$k$h$&$K$7$?!#(B 1999-03-26 Yuuichi Teranishi * $B8=:_$$$k!JF1$8!K%U%)%k%@$K8m$C$F(B goto-folder $B$9$k$H!"%5%^%j$,(B $B2=$1$F$7$^$&LdBj$r=$@5(B($B1|@>$5$s(B $B$N8f;XE&(B)$B!#(B * $BJQ?t(B wl-draft-clone-local-variable-regexp ($B%G%U%)%k%H$O(B "^mime") $B$K%^%C%A$9$k%m!<%+%kJQ?t$NCM$rAw?.%P%C%U%!$K%3%T!<$9$k$h$&$K$7$?!#(B 1999-03-26 $B2,ED(B $B7r0l(B * $B?75,%3%^%s%I(B wl-summary-write-current-newsgroup () Summary$B%b!<%I$G!$(Bcurrent-folder$B$N%K%e!<%9%0%k!<%W$KEj9F$9$k$H$-$K!$(B Newsgroup: $B%U%#!<%k%I$r$"$i$+$8$aJd4V$7$F$+$i(Bdraft$B%P%C%U%!$rMQ0U(B $B$9$k!#(B"W" $B$K%P%$%s%I!#(B 1999-03-25 Hidekazu NAKAMURA * wl-summary-forward() $B$G!"(Bwl-mail-setup-hook $B$,8F$P$l$J$+$C$?(B $B$N$r=$@5!#(B 1999-03-25 Yuuichi Teranishi * $BB * wl-summary-temp-mark-uudecode $B$G%a%C%;!<%8(B1$B$D$@$1$N%U%!%$%k(B $B$,%G%3!<%I$G$-$J$$$N$r=$@5!#(B 1999-03-24 Yuuichi Teranishi * default-case-fold-search $B$,(B nil $B$N>l9g!"%a%C%;!<%8$,Aw?.$5$l$J$$(B $B$N$r=$@5(B($B3k86$5$s(B$B$N8f;XE&(B)$B!#(B 1999-03-24 $B2,ED(B $B7r0l(B * $B?75,%3%^%s%I(B wl-folder-close-parent-entity$B!"(BM-SPC $B$K%P%$%s%I!#(B * $B?75,JQ?t(B wl-draft-config-exec-flag $B$r@_$1!"(Bwl-draft-config-exec $B$O(B $B0lEY$7$+ * [im-wl.el] ($B:F(B) wl-insert-message-id $B$r(B nil $B$K@_Dj$7$F$b!"(BMessage-Id $B$r$D$1$F$7$^$&=$@5(B($B@P@n$5$s(B $B$N8f;XE&(B)$B!#(B * ($B:F(B)(featurep 'xpm) $B$N(B xemacs $B$r(B -nw $B$G$"$2$?$H$-$K(B wl $B$r5/F0$9$k$H(B warning $B$,=P$k=$@5(B($B:72eED$5$s(B$B$N8f;XE&(B)$B!#(B 1999-03-18 A.SAGATA * wl-ja.texi $B$K@bL@$rDI2C!#(B * $B%I%i%U%H$G!"(B "To:" $B$d(B "Cc:" $B$N%X%C%@<+BN$NJd40$r$9$k$H$-$K!"(B $B>.J8;z$+$i$G$bJd40$9$k$h$&$K$7$?!#(B 1999-03-18 Yuuichi Teranishi * 0.9.7 - "Everything She Wants" * multi $B%U%)%k%@$K$X$s$JF|IU$1$N%a%C%;!<%8$,$"$k$H(B msgdb $B@8@.$,(B $BCfCG$5$l$F$7$^$&$N$r=$@5!#(B 1999-03-17 A.SAGATA * petname $B$r%$%s%?%i%/%F%#%V$KJT=8$9$k4X?t$rDI2C!#(B 1999-03-17 Yuuichi Teranishi * IMAP $B$NB8:_$7$J$$%U%)%k%@$K%j%U%!%$%k$7$h$&$H$7$F$d$a$k$H!"$=$N8e(B $B8=:_$N%U%)%k%@$,A`:nITG=$K$J$C$F$7$^$&%P%0$r=$@5!#(B ($B0$It$5$s(B $B$N8f;XE&(B)$B!#(B * wl-folder-next-unsync $B$,%0%k!<%W$HDL>o%U%)%k%@$r6hJL$7$J$$$h$&(B $B$K$7$?!#(B * XEmacs $B$N%D!<%k%P!<%\%?%s$r2!$7$F(B sync $B$7$?$H$-$K%a%C%;!<%8$,(B $BCfESH>C<$@$C$?$N$r=$@5!#(B 1999-03-12 Tsunehiko Baba * 00README $B$r=$@5!#(B 1999-03-12 Masato Taruishi * 00README $B$rDI2C!#(B 1999-03-12 Yuuichi Teranishi * refile, copy $B$,0lIt<:GT$7$F$bA4BN$K1F6A$7$J$$$h$&$K$7$?!#(B * wl-ja.texi $B$r(B ptex $B$G%U%)!<%^%C%H$7$F8+$d$9$$$h$&(Bsection $B3d$j$r(B $B9=@.$7$J$*$9(B ($B?9F#$5$s(B $B$h$j8f;XE&(B)$B!#(B 1999-03-09 Yuuichi Teranishi * $B$^$.$i$o$7$$$N$G%j%U%!%$%kCf!"%+!<%=%k$,%P%C%U%!KvHx$K(B $B0\F0$7$J$$$h$&$K$7$?!#(B 1999-03-06 Ishikawa Ichiro * [im-wl.el] wl-insert-message-id $B$r(B nil $B$K@_Dj$7$F$b!"(BMessage-Id $B$r$D$1$F$7$^$&$N$r=$@5!#(B 1999-03-04 Yuuichi Teranishi * tm-wl.el $B$N(B tm-wl-setup() $B$G!"(B (fset 'mime-preview/x-face-function-use-highlight-headers nil) $B$7$F$$$?$N$r$d$a$k!#(B ($B:72eED$5$s(B $B$h$j8f;XE&(B) * $B?75,%3%^%s%I(B wl-summary-refile-prev-destination "M-o" $B$K%P%$%s%I!#(B ($B:72eED$5$s(B $B$h$j8fMWK>(B) * $B?75,%3%^%s%I(B wl-summary-copy-prev-destination "M-O" $B$K%P%$%s%I!#(B 1999-03-05 A.SAGATA * tm $B$r;H$C$F$$$k;~$K(B User-Agent: $B$K(B '\n' $B$,F~$C$F$7$^$&$N$r=$@5!#(B * Subject $B$r(B [???, 0000] $B$N$h$&$K$D$1$k(B ML $B$KBP1~!#(B 1999-03-04 A.SAGATA * (featurep 'xpm) $B$N(B xemacs $B$r(B -nw $B$G$"$2$?$H$-$K(B wl $B$r5/F0$9$k$H(B warning $B$,=P$k$N$r=$@5!#(B * $BJQ?t(B wl-auto-insert-x-face $B$NDI2C!#(B(default = t) * wl-auto-insert-x-face t $B$G$+$D!"(B~/.xface $B$,$"$k$H$-$O<+F0E*$KA^F~!#(B ($B:#$^$GDL$j(B,default) * draft $B:n@.;~$K(B wl-draft-insert-x-face-field$B$G(B X-Face: $B$rA^F~2DG=(B $B$H$7$?!#(B(C-c C-a $B$K%P%$%s%I(B) * C-c C-a $B$N;~$K!"(B ~/.xface $B$,L5$1$l$P(B error message $B$rH/@8$5$;$k(B $B$h$&$K$7$?!#(B 1999-03-03 A.SAGATA * $B?75,(B hook wl-summary-refile-hook $B$rDI2C!#(B 1999-03-03 Hajime MORITO * [wl-ja.texi] ptex $B$G@07A$9$k$H%(%i!<$K$J$k$N$r=$@5!#(B * [wl-ja.texi] '{','}' $B$,I=<($5$l$F$$$J$$ItJ,$r=$@5!#(B 1999-03-03 Yuuichi Teranishi * 0.9.6 - "Dirty Diana" * [elmo] $B$X$s$J(B cache $B%U%!%$%k$,$"$C$?$H$-$K(B cache $B$N(B expire $B$,(B $BF0$+$J$+$C$?$N$r2sHr!#(B * $B?75,JQ?t(B wl-summary-auto-refile-skip-marks$B!#L$FI%a%C%;!<%8$O(B auto-refile $B$NBP>]$+$i30$7$?!#(B ($BBg>l$5$s(B $B$h$j8fMWK>(B) * imap4 $B$G%a%C%;!<%8$rI=<($7$?$H$-$KM>J,$KL$FI%U%i%0$r%;%C%H(B $B$7$F$$$?(B(!)$B$N$r=$@5!#(B * [wl-ja.texi] wl-summary-wday-use-japanese $B$N5-=R$r:o=|!#(B wl-summary-weekday-name-lang $B$N@bL@$rDI2C!#(B ($B@P9u$5$s(B $B$h$j8f;XE&(B) * [wl-ja.texi] wl-summary-fix-timezone $B$N5-=R$rDI2C!#(B ($Bl$5$s(B $B$h$j8f;XE&(B) 1999-03-01 Hermit-chan * wl-draft-folder $B$r@_Dj$7$F$$$k>l9g!"(B M-x wl $B$9$kA0$K(B M-x wl-draft $B$9$k$H!"(Berror $B$K$J$k$N$r=$@5!#(B 1999-03-01 Akihiro Motoki * wl-highlight $B$H(B ChangeLog $B$N(B typo $B=$@5!#(B 1999-03-01 Yuuichi Teranishi * $B4X?t(B wl-ask-folder $B$,(B XEmacs $B$N%-!<0J30$N%$%Y%s%H$r$9$Y$F(B $BF1$8$H$_$J$7$F$7$^$&$N$r=$@5!#(B 1999-02-28 Masahiro MURATA ($BB * wl-draft-config-alist $B$N=q<0$r3HD%!#(B 1999-02-26 TSUMURA Tomoaki * [wl-refile] extra-field $B$r * Summary $B$N%a%K%e!<$r=$@5!#(B 1999-02-25 OKUNISHI Fujikazu * $B%U%#%k%?%U%)%k%@$NL$FI%A%'%C%/$,<:GT$9$k$N$r=$@5!#(B 1999-02-10 OKUNISHI Fujikazu * draft $B$G(B font-lock $B$,M-8z$K$J$k$N$r2sHr!#(B 1999-02-24 Yuuichi Teranishi * 0.9.5 - "California Girls" 1999-02-25 Masahiro MURATA ($BB * wl-folder-notify-deleted $B$,(B 'sync $B$J$iIi$N?t$rI=<($;$:(B $BF14|$5$;$k$h$&$K$7$?!#(B 1999-02-24 Yuuichi Teranishi * $B?75,JQ?t(B wl-folder-notify-deleted$B!#%a%C%;!<%8$,:o=|$5$l$F$$$?$H$-(B $B$KIi$N?t;z$rI=<($7$FCN$i$;$k$+$I$&$+!#(Bdefault $B$O(B nil $B$K$7$?!#(B * wl-summary-auto-refile $B$r%G%U%)%k%H$G$O%9%l%C%I$rJD$8$?$^$^(B $B=hM}$9$k$h$&$K$7$?!#(BPrefix argument $B$D$-$J$iA4%9%l%C%I$r3+$$$F(B $B$+$i * $B?75,4X?t(B elmo-passwd-alist-{load,save}$B!#(B $B?75,JQ?t(B elmo-passwd-alist-file-name $B$K@_Dj$5$l$?%U%!%$%k(B{$B$+$i(B|$B$X(B} $B%Q%9%o!<%I$r(B{$B%m!<%I(B|$B%;!<%V(B}$B$9$k!#(B 1999-02-11 Tsunehiko Baba * [wl-ja.texi] $B$K(B "~/.xface" $B$N@bL@$rDI2C!#(B 1999-02-06 TSUMURA Tomoaki * wl-draft-replace-field () $B$G(B header $B$r(B insert $B$9$k$H$-$K(B "\n" $B$r@h$K(B concatinate $B$7$F$+$i(B insert $B$9$k$h$&$K$7$?!#(B 1999-02-06 $B2,ED(B $B7r0l(B * imap $B$GL$FI>pJs$r%3%T!<@h$K$b0z$-7Q$0$h$&$K$7$?!#(B 1999-02-05 Yuuichi Teranishi * refile $B$N08@hMQ$N(B face$B!"(Bwl-highlight-refile-destination-face $B$r?7@_!#(B * [wl-ja.texi] '$' $B$N@bL@J8$r=$@5!#(B ($B8eF#(B($B$H(B)$B$5$s(B $B$h$j8f=u8@(B) 1999-02-04 Yuuichi Teranishi * XEmacs $B$G%U%)%k%@$NL$FI%A%'%C%/8e%O%$%i%$%H$,$*$+$7$/$J$k>l9g$,(B $B$"$C$?$N$r=$@5!#(B 1999-02-03 $B2,ED(B $B7r0l(B * $B?75,4X?t(B wl-folder-prefetch-entity$B!#(B"I" $B$K%P%$%s%I!#(B 1999-02-03 Teruki SHIGITANI * [sample.dot.wl] my-wl-summary-from-func-petname $B$N(B folder $BL>$r;2>H$9$kItJ,$r(B summary-mode $B$G$N$_8F$P$l$k$h$&$K$7$?!#(B 1999-02-03 TSUMURA Tomoaki * $B4X?t(B wl-summary-auto-refile, wl-refile-rule-alist $B$NDI2C!#(B 1999-02-02 IMAI Takeshi * wl-expire $B$G(B imap $B@h$K(B refile $B$9$k$H%(%i!<$K$J$k$N$r=$@5!#(B 1999-01-29 Akihiro Motoki * Summary$B%b!<%I$N(B view $B$r(B cache $B$K%;!<%V$9$k$H$-!$(B widen $B$9$k$h$&$KJQ99!#(B 1999-01-22 Masahiro MURATA ($BB * wl-auto-check-folder-name $B$N3HD%!#(B 1999-01-19 Masahiro MURATA ($BB * $B%U%)%k%@%b!<%I$G(B expire $B$r$9$k;~$K!$%5%^%j>pJs$r(Bupdate$B$7$F$+$i(B expire $B$,9T$($k$h$&$K$7$?!#(B * reserve-marked-msg $B$r>J$$$?7k2L!$(Bexpire$B$9$k%a%C%;!<%8$,$J$/(B $B$J$k$H!$%(%i!<$,5/$3$k$N$r=$@5$7$?!#(B * elmo-datevec-substitute $B$K$*$$$FG/$r$^$?$0>l9g$r9MN8$7$?!#(B 1999-01-19 Yuuichi Teranishi * $B?75,JQ?t(B wl-auto-uncheck-folder-list, wl-auto-check-folder-list$B!#(B $B5/F0;~$N%0%k!<%W%A%'%C%/$G%A%'%C%/$r%9%-%C%W$9$k$+$I$&$+@_Dj$G$-$k(B $B$h$&$K$7$?!#(B($B85LZ$5$s(B $B$h$j8fMWK>(B) $B%G%U%)%k%H$G$O(B archive $B%U%)%k%@$N%A%'%C%/$r%9%-%C%W!#(B * [elmo-nntp] $B%5!<%P$+$i(B Message-ID $B$r$b$i$&ItJ,$,%P%0$C$F$$$?$N$r(B $B=$@5!#(B 1999-01-18 Yuuichi Teranishi * wl-ja.texi $B$r99?7(B (mA, mf $B$N@bL@DI2CEy(B)$B!#(B * wl-folder-{prev,next}-unread $B$G(B unread $B$G$J$$(Bgroup$B$X$OHt$P$J$$(B $B$h$&$K$7$?(B(Prefix ARG $B$D$-$J$i(B group $B$X$bHt$V(B)$B!#(B ($B2,ED$5$s(B $B$N8f;XE&(B) * wl-folder-check-entity $B$G%U%)%k%@$,$J$/$J$C$F$$$?$H$-$J$I(B $B%(%i!<$G;_$^$C$F$7$^$&$N$r2sHr!#(B ($B@P@n$5$s(B $B$h$j8f;XE&(B) 1999-01-16 OKUNISHI Fujikazu * $B?75,4X?t(B wl-summary-temp-mark-uudecode$B!#(B * wl-ja.texi $B$rJQ99(B (@item->@defvar $BEy(B)$B!#(B 1999-01-15 OKUNISHI Fujikazu * wl-{folder|summary}-goto-folder() $B$G(B ~/.folders $B$K$J$$%U%)%k(B $B%@$r;XDj$7$?>l9g$K$b!"B8:_$7$J$$(B property $B$r;2>H$7$h$&$H$7$F(B $B$3$1$k%P%0$r=$@5!#(B 1999-01-15 TSUMURA Tomoaki * [elmo-archive] header-regexp $B$G(B footer $B$b(B check$B!#(B * [elmo-archive] rar $B$N05=LN($r>e$2$?!#(B 1999-01-15 Masahiro MURATA ($BB * 19.28$B%Y!<%9$N(B Emacs $B$G(B wl-expire $B$,=PMh$J$+$C$?$N$r=$@5$7$?!#(B * elmo-date $B$GG/$r$^$?$$$@;XDj$,9T$($k$h$&$K$7$?!#(B * [fldmgr] Emacs-19 $B$G(B wl-fldmgr-add $B$,@5>o$KF0:n$7$J$+$C$?$N$r(B $B=$@5$7$?!#(B 1999-01-14 Masahiro MURATA ($BB * Emacs-19 $B0JA0$G$O%"%/%;%9%0%k!<%W$N3,AX9=B$$,:n$i$l$J$$$N$r=$(B $B@5$7$?!#(B * [fldmgr] $B6u$N%0%k!<%W$K%U%)%k%@$rA^F~$9$k$H%(%i!<$K$J$k$N$r=$(B $B@5$7$?!#(B * [expire] elmo $B$N8F=P$7$G<:GT$7$?>l9g$O%(%i!<$G;_$a$k$h$&$K$7$?!#(B 1999-01-14 Yuuichi Teranishi * wl-summary-temp-mark-prefetch $B$,F0$+$J$/$J$C$F$$$?$N$G:F $B$N8f;XE&(B) * Meadow$B$GF|K\8l(B Subject$B$N%a!<%k$KJV;v$r=q$3$&$H$9$k$H!$(B $B%I%i%U%H$KMQ0U$5$l$?%a!<%k$N%5%V%8%'%/%H$,!$%(%9%1!<%W(B $B%3!<%I4]=P$7$G2=$1$F$7$^$&$N$r=$@5!#(B ($BHSED$5$s(B $B$N8f;XE&(B) 1999-01-13 TSUMURA Tomoaki * Windows $B$G(B LHA archive $B$,F0$/$h$&$K=$@5!#(B 1999-01-13 Yuuichi Teranishi * 0.9.4 - "Broken Wings" * wl-folder-init-no-load-access-folders $B$H(B wl-folder-init-load-access-folders $B$NN>J}$,(B nil $B$N$H$-!"(B $BA4$F$N%U%)%k%@>pJs$r%m!<%I$7$J$+$C$?$N$r=$@5!#(B * NNTP $B$N(B multi $B%U%)%k%@$rC&=P8e!"F1$8%U%)%k%@$K9T$-D>$9$H!"(B fetch error $B$,H/@8$9$k>l9g$,$"$C$?$N$r=$@5!#(B 1999-01-13 Masahiro MURATA ($BB * wl-folder-entity-alist $B$H(B wl-folder-entity-id-name-alist $B$r(B obarray (hashtable) $B$K$7$?!#(B * wl-folder-entity-alist $B$H(B elmo-folder-info-alist $B$rE}9g$7$?!#(B * check $B;~$NI=<(99?7$r9bB.2=$7$?!#$^$?!$JQ?t(B wl-folder-check-fast $B$rGQ;_$7$?!#(B * $B=i4|2=;~$K%m!<%I$9$k%"%/%;%9%0%k!<%W$N%U%)%k%@$r;XDj$G$-$k$h$&$K(B $B$7$?!#(B * $B%"%/%;%9%0%k!<%W$N%j%9%H$r3,AX9=B$$G * wl-tmp-dir $B$,$J$1$l$P5/F0;~$K$D$/$k$h$&$K$7$?!#(B ($BLgOF$5$s(B $B$h$j8f;XE&(B) * wl-queue-folder $B$,$J$1$l$P5/F0;~$K:n$k$h$&$K$7$?!#(B 1999-01-12 $B2,ED(B $B7r0l(B * window-width $B$,(B 100 $B$N;~$J$I$K!$(Bwl-demo $B$G(B xpm $B$,??$sCf$K$G$J$$(B $B$N$r=$@5!#(B 1999-01-12 TSUMURA Tomoaki * [elmo-archive] rar $B$N%Q%i%a!<%?DI2C$H(B windows-nt $B8~$1=$@5!#(B 1999-01-12 Yuuichi Teranishi * [elmo-nntp] "-/" $B$GA4%K%e!<%9%0%k!<%W$rI=<($9$k$h$&$K$7$?!#(B ($B@P@n$5$s(B $B$h$j8f;XE&(B) ($B$7$+$7(B 1999-1-13 $B$NBe=q$-!#(B) * unplugged $B$G(B filter $B%U%)%k%@$NF0:n$,$*$+$7$+$C$?$N$r=$@5!#(B * 'mA' ($B0l;~%^!<%/$D$-%a%C%;!<%8$KBP$9$k%^%k%A0zMQ$D$-%j%W%i%$(B)$B!$(B 'mf' ($B0l;~%^!<%/$D$-%a%C%;!<%8$N%^%k%A%U%)%o!<%I(B)$B!#(B ($BKLL\$5$s(B $B$N8fMWK>$K4p$E$/(B)$B!#(B * unplugged $B$K$7$?$"$H%5%^%j$rC&=P$9$k$H%-%c%C%7%e$,%;!<%V$5$l$J$$(B $B%P%0$r=$@5!#(B * [elmo-nntp] Cancel-Lock $B$KBP1~$7$?$D$b$j!#(B 1999-01-08 Yuuichi Teranishi * wl-dnd.el XEmacs21.2.8 $B$N(B API $B$K9g$o$;$?!#(B 1999-01-08 Masahiro MURATA ($BB * elmo-localdir-list-folders-subr() $B$G(B $B?F%U%)%k%@$,4^$^$l$J$/$J$C$F$7$^$&$N$r=$@5!#(B 1999-01-06 $B2,ED(B $B7r0l(B * $B?75,(B hook$B!$(Bwl-highlight-message-hook $BDI2C!%(B 1999-01-05 OKUNISHI Fujikazu * [elmo-util] elmo-default-imap4-server $B$r(B "hoge%imap_server@gw" $B$N$h$&$J7A<0$G$b;XDj$G$-$k$h$&$K$7$?!#(B 1999-01-05 Hironori Fukuchi * To$B$KB8:_$7$J$$%"%I%l%9$r=q$$$FAw?.$9$k$H!"%_%K%P%C%U%!$K$O(B sending...done$B$HI=<($5$l!"@5>o$KAw?.$5$l$?$+$N$h$&$K8+$($k$,(B $B * wl-draft-edit-string() $B$G(B To: $B%U%#!<%k%I$,>o$K(B nil $B$K$5$l$F(B $B$7$^$&%P%0(B (typo) $B$r=$@5!#(B 1998-12-31 OKUNISHI Fujikazu * elmo-localdir-list-folders-subr() $B$G%5%V%G%#%l%/%H%j$,B8:_$9(B $B$k?F%U%)%k%@$,=EJ#$7$F$7$^$&%P%0$r=$@5!#(B * wl-summary-redisplay-no-mime() $B$G$O(B wl-break-pages $B$r(B nil $B$K(B $BB+G{$9$k!#(B * elmo-localdir-list-folders-subr() $B$G(B link count $B35G0$N$J$$%U%!(B $B%$%k%7%9%F%`$G$bFs3,AX0J>e2C$7$?!#(B 1998-12-27 Masahiro MURATA ($BB * $BF1$8L>A0$N%U%)%k%@$,%0%k!<%W$h$j$bA0$KB8:_$9$k$H%(%i!<$,H/@8$9$k$N$r(B $B=$@5!#(B 1998-12-27 OKUNISHI Fujikazu * [wl-folder] wl-folder-mark-as-read-all-current-entity() $B$GA4(B $B$F$N%U%)%k%@$K0\F0$;$:!"?75,!?L$FI$,B8:_$9$k%U%)%k%@$@$1$r(B catchup $B$9$k$h$&$K$7$?!J9bB.2=$N$?$a!K!#(B 1998-12-25 Yuuichi Teranishi * Meadow $BEy$N(B Emacs20.2 $B0J2<$G%5%^%j$,J8;z2=$1$9$k%P%0$N=$@5$r(B $BH?1G$7K:$l$F$$$?!#(B ($B$P$P$5$s(B $B$h$j8f;XE&(B)$B!#(B 1998-12-24 Yuuichi Teranishi * 0.9.3 - "Last Christmas" $B%/%j%9%^%98BDjHG(B(?) 1998-12-23 Masahiro MURATA ($BB * $B%Q%9%;%Q%l!<%?$H$7$F(B "/" $B$r;H$C$F$$$?$N$r=$@5$7$?!#(B * delete $B$N;HMQ$G(B delq $B$G:Q$`$H$3$m$OCV$-49$($?!#(B 1998-12-21 Masahiro MURATA ($BB * $B?75,%U%!%$%k(B wl-expire$B!#(B $B8E$$%a%C%;!<%8$r<+F0E*$K:o=|!&0\F0$9$k5!G=$rDI2C$7$?!#(B * wl-fldmgr $B$r(B autoload $B2=$7$?!#(B * wl-folder $B$G4v$D$+$N%3%^%s%I(B($B%0%k!<%W$N<+F0(Bopen$B4X78(B)$B$N@0M}!&9b(B $BB.2=$r9T$C$?!#(B * wl-demo.el $B$N%P%$%H%3%s%Q%$%k$G(B XEmacs $B0J30$G$O%m%4%U%!%$%k$r(B $BFI$_9~$^$J$$$h$&$K$7$?!#(B * [elmo-archive] elmo-archive-treat-file $B$,(B non-nil $B$N$H$-!$(B elmo-archive-list-folders $B$G%G%#%l%/%H%j$,B8:_$7$J$$>l9g$K%(%i!<(B $B$K$J$k$3$H$,$"$k$N$r=$@5$7$?!#(B * [WL 838] $B$K$"$k8e$m$N(B2$B$D$N%Q%C%A$,Ev$?$C$F$$$J$+$C$?$N$rH?1G$7(B $B$?!#(B 1998-12-21 Yuuichi Teranishi * $BAw?.;~$K(B XEmacs $B$G%(%i!<$,H/@8$9$k$H(B wrong type argument $B%(%i!<$,(B $BH/@8$9$k$N$r2sHr!#(B($B?@V:$5$s(B$B$h$j8f;XE&(B) 1998-12-18 Yuuichi Teranishi * $B%/%j%9%^%9$i$7$$5$J,$r=P$7$F$_$?!#(B * wl-draft $B$N0z?t$O%G%3!<%I$5$l$?J8;zNs$H$9$k$3$H$K$7$?!#(B ($BCfB<$5$s(B $B$N=$@5$K4p$E$/JQ99(B) * Meadow $BEy$N(B Emacs20.2 $B0J2<$G%5%^%j$,J8;z2=$1$9$k%P%0$N=$@5!#(B ($BCfB<$5$s(B$B!"(B $BF#0f$5$s(B $B$h$j8fJs9p(B) 1998-12-17 Hidekazu NAKAMURA * "Re:" $B$r4^$a$F%(%s%3!<%I$5$l$k>l9g$K(B "Re: Re:" $B$H$J$C$F$7$^$&(B $B$N$r2sHr!#(B 1998-12-17 Yuuichi Teranishi * 0.9.2 - "Addicted To Love" 1998-12-17 Masahiro MURATA ($BB * [fldmgr] $B6u$N%0%k!<%W$r:o=|$9$k$H!$(B wl-folder-entity-id-name-alist $B$,2u$l$k>l9g$,$"$k$N$r=$@5$7$?!#(B * [elmo-archive] method $B$K4X?t$,Dj5A$G$-$k$h$&$K$7$?!#(B * [elmo-archive] 'tgz $B7A<0$G$bDI2C$H:o=|$,9T$($k$h$&$K$7$?!#(B $B$^$?!$(B'tgz $B$N(B suffix $B$r(B ".tar.gz" $B$KJQ99$7$?!#(B * [elmo-archive] elmo-archive-msgdb-create-as-numlist-subr2() $B$,(B prefix $B$r9MN8$7$F$J$+$C$?$N$r=$@5!#(B 1998-12-16 Yuuichi Teranishi * Draft $B%P%C%U%!$G!"(BMail $BMQ%a%K%e!<$N%3%^%s%I$NFbMF$r(B wl $B$N$b$N$KCV$-49$($k$h$&$K$7$?!#(B * smtp.el $B$,:G?7$N(B apel $B$G$J$/$H$bF0:n$9$k$h$&!"(B open-network-stream-as-binary $B$,L$Dj5A$J$iDj5A$9$k$h$&$K$7$?!#(B * smtp.el $B$r:G?7$N(B FLIM $B$N$b$N$K9g$o$;$?!#(B 1998-12-16 Masahiro MURATA ($BB * [fldmgr] nntp$B$G$J$$%U%)%k%@$rDI2C$9$k$H!$(B wl-folder-newsgroups-hashtb $B$,(B nil $B$K$J$k$N$r=$@5$7$?!#(B 1998-12-16 Hidekazu NAKAMURA * SEMI $B$rMxMQ$9$k>l9g(B smtp.el $B$r%$%s%9%H!<%k$7$J$$$h$&(B WL-ELS $B$r(B $BJQ99!#(B 1998-12-15 Yuuichi Teranishi * In-Reply-To: $B$NF|IUItJ,$r(B "" $B$G3g$k$h$&$K$7$?!#(B * wl-summary-rescan $B$G@8@.$5$l$?%5%^%j$NJ]B8$O!"%9%-%c%s=*N;;~$G$O(B $B$J$/%5%^%j=*N;;~$K$^$H$a$F$d$k$h$&$K$7$?!#(B * $B?75,JQ?t(B wl-folder-thread-indent-set-alist$B!#%U%)%k%@$4$H$K(B $B%9%l%C%I$N%$%s%G%s%HJ8;zNs$rA*$Y$k$h$&$K$7$?!#(B 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 $B$O(B $B$3$l$K%^%C%A$7$J$$>l9g$N(B default $BCM$H$7$FMQ$$$k$h$&JQ99!#(B * $B?75,JQ?t(B wl-folder-weekday-name-lang-alist$B!#%U%)%k%@$4$H$K(B $BMKF|I=<($N8@8l$rA*$Y$k$h$&$K$7$?!#(B wl-summary-weekday-name-lang $B$O$3$l$K%^%C%A$7$J$$>l9g$N(B default $BCM$H$7$FMQ$$$k$h$&JQ99!#(B * elmo-nntp.el,elmo-imap4.el,elmo-msgdb.el $B$G!"(Bmsgdb $B$KJ]B8$9$k(B Subject, From $B$NJ8;zNs$N:n$jJ}$,4V0c$C$F$$$?$?$a!"Cf9q8l$d%O%s%0%k(B $B$,2=$1$F$7$^$C$F$$$?$N$r=$@5!#(B * Summary $B$N(B cache $B$N(B{$BA^F~(B|$BJ]B8(B}$B$r(B as-binary-{input|output}-file $B$G9T$J$&$h$&$K$7!"%P%C%U%!$4$H$N(B mime-charset $B$G(B{encode|decode}$B$9$k(B $B$h$&$K$7$?!#(B * wl-init $B$G(B wl-draft-folder $B$,B8:_$7$J$$$H$-$b(B elmo-create-folder () $B$r8F$V$h$&$K$7$?!#(B * wl-generate-user-agent-string $B$r(B Nemacs $BBP1~!#(B $B$D$$$G$K(B tm $B$N%P!<%8%g%s>pJs$bF~$l$k$h$&$K$7$?!#(B * $B%a%C%;!<%8:o=|;~!"Ev3:%a%C%;!<%8$,JD$8$?%9%l%C%I$K1#$l$F$$$?$H$-$K!"(B $B;R$I$b%9%l%C%I$r$*$+$7$J0LCV$KA^F~$7$F$7$^$&$3$H$,$"$k$N$r=$@5(B ($B$7$?$D$b$j!D(B)$B!#(B * bbdb-wl.el $B$G%P%$%H%3%s%Q%$%k$KI,MW$J%b%8%e!<%k$r(B require $B$9$k(B $B$h$&$K$7$?!#(B * smtp-via-smtp $B$r(B (as-binary-process) $B$G3g$C$?!#(B ($B>.6L(B $B$5$s(B $BB>$h$j$$$?$@$$$?(B $B8fJs9p$K4p$E$/(B) * [wl-ja.texi] $B%G%U%)%k%H$G(B @directory $B$,M-8z$K$J$k$h$&$K$7$?!#(B ($B@iED$5$s(B $B$h$j8f;XE&(B) 1998-12-13 Yuuichi Teranishi * $B?75,%U%!%$%k(B wl-mule.el, wl-nemacs.el$B!#(B * wl-nemacs $B%V%i%s%A$r%^!<%8!#(B 1998-12-10 Masahiro MURATA ($BB * message-id $B$,4^$^$l$F$$$J$$(B In-Reply-To $B%U%#!<%k%I$,$"$k$H!$Be(B $B$o$j$K(B Reference $B%U%#!<%k%I$,$"$C$F$b;2>H$5$l$J$$%P%0$r=$@5!#(B 1998-12-11 Yuuichi Teranishi * 0.9.1 - "Yankee Rose" 1998-12-10 Masahiro MURATA ($BB * $B%I%i%U%H%P%C%U%!$NL>A0$rJQ99$7$?!#(B("1" -> "+draft/1") * $B?75,4X?t(B wl-jump-to-draft-buffer$B!#(B * wl-draft-config-alist $B$N=hM}$G(B1$B$D%^%C%A$7$F$bB3$1$F=hM}$r9T$&(B $B$h$&$K$7$?!#(B * wl-draft-config-exec-hook $B$rDI2C!#(B * $B?75,JQ?t(B wl-draft-always-delete-myself$B!#(B * $B%"!<%+%$%V%U%)%k%@$N(B prefix $B$K?t;z$,4^$^$l$F$$$?>l9g!$(B elmo-archive-list-folder $B$,>o$K(B nil $B$rJV$9$N$r=$@5$7$?!#(B * elmo-*-copy-msgs $B$O@.8y$9$l$P(B non-nil $B$rJV$9$h$&$K$7$?!#(B * elmo-move-msgs $B$G$N%3%T!<$K<:GT$9$l$P:o=|$r * elmo-match-string, elmo-match-buffer $B$r;H$($k$H$3$m$O;H$&$h$&$K$7$?!#(B * wl-insert-mail-followup-to, wl-insert-mail-reply-to $B$N(B default $B$r(B nil $B$K$7$?!#(B * wl-ja.info $B$r(B Emacs 20.3 $B$G:n$k$h$&$K$7$?!#(B * "M-x wl-draft" $B$G$b@5$7$/5/F0$G$-$k$h$&$K$7$?!#(B * Mule $B$b%P%$%H%3%s%Q%$%k;~$N(B Warning $B$r8:$i$7$?!#(B 1998-12-10 TSUMURA Tomoaki * pack-number $B8e$K!"(Bmsgdb $B$N(B number-alist $B$,99?7$5$l$F$J$+$C$?(B $B$N$r=$@5!#(B 1998-12-10 Yuuichi Teranishi * wl-bcc $B$,@_Dj$5$l$F$$$l$P(B mail-self-blind $B$NCM$K4X78$J$/(B Bcc: $B$r(B $BA^F~$9$k$h$&$K$7$?(B (wl-fcc $B$HF0:n$r9g$o$;$?(B)$B!#(B 1998-12-10 Akihiro Motoki * $B?75,JQ?t(B wl-bcc$B!#(Bnon-nil $B$N$H$-$O(B wl-bcc $B$NCM$,(B Bcc: $B$KF~$k!#(B 1998-12-10 SENDA Shigeya * XEmacs $B8~$1$K(B wl-ja.texi $B$r=$@5!#(B * wl-ja.texi $B$G(B vindex$B$,0l$DH4$1$F$$$?$N$r=$@5!#(B * WL-ELS $B$G(B xemacs $B$N(B install-package $B$N$H$-(B info $B$,%$%s%9%H!<%k(B $B$5$l$k$h$&$K$7$?!#(B 1998-12-10 Yuuichi Teranishi * $B%9%l%C%I$NESCf$G!"JD$8$?%9%l%C%I$N%a%C%;!<%8$,$"$C$?;~!"(B $B$=$N%a%C%;!<%80J9_$N%9%l%C%I$,A^F~$5$l$J$$%P%0$,$"$C$?$N$r=$@5!#(B 1998-12-09 Masahiro MURATA ($BB * elmo-move-msgs, elmo-copy-msgs $B$G%*%W%7%g%s;XDj$K$h$j!$%U%)%k(B $B%@85$NHV9f$N$^$^0\F0!$%3%T!<$9$k5!G=$NDI2C!#4XO"$7$F!$(B elmo-append-msg $B$b%*%W%7%g%s$G;XDj$7$?HV9f$GDI2C$9$k5!G=$NDI2C!#(B * 'localdir $B$+$i(B 'archive $B$K%3%T!<$9$k>l9g$O(B1$BEY$KJ#?t$N%a%C%;!<(B $B%8$r=hM}$9$k$h$&$K$7$?!#(B 1998-12-09 Yuuichi Teranishi * 0.9.0 - "With Or Without You" * elmo-archive.el $B$N%P%$%H%3%s%Q%$%k;~$K(B Warning $B$,=P$J$$$h$&$K(B $B$7$?!#(B 1998-12-09 OKUNISHI Fujikazu * elmo-archive.el "v0.16 [981208/alpha]"$B!#(B * copy-msgs() $B$G(B dst-spec $B$N%U%)%k%@$,$J$1$l$P:n$k$h$&$K$7$?(B $B!J;{ED$5$s(B Masayuki TERADA $B$N$4;XE&!K!#(B * elmo-archive-treat-file $B$,(B non-nil $B$N;~$K(B get-archive-name() $B$G(B suffix $B$,(B regexp-quote() $B$5$l$F$J$$%P%0$r=$@5!#(B 1998-12-09 Yuuichi Teranishi * wl-folder-check-entity $B$GBP>]%U%)%k%@$,$^$@(B $BB8:_$7$J$$$H$-$O(B elmo-create-folder () $B$r8F$V$h$&$K$7$?!#(B * wl-init $B$G(B wl-trash-folder $B$,B8:_$7$J$$$H$-$O(B elmo-create-folder () $B$r8F$V$h$&$K$7$?!#(B ($B1|@>$5$s(B $B$N8f;XE&(B) 1998-12-08 Yuuichi Teranishi * XEmacs, Emacs $B$G%P%$%H%3%s%Q%$%i$,@8@.$9$k(B Warning $B$r8:$i$7$?!#(B * mmelmo-imap4 $B$N(B mime-entity $B@8@.ItJ,$G(B parent $B$N07$$$,4V0c$C$F$$(B $B$?$?$a%(%i!<$,H/@8$9$k>l9g$,$"$C$?$N$r=$@5!#(B 1998-12-07 Yuuichi Teranishi * 00README.ja $B$N%a!<%j%s%0%j%9%H%"%I%l%9$,8E$$$^$^$@$C$?$N$r=$@5!#(B 1998-12-06 Masahiro MURATA ($BB * wl-summary-buffer-view $B$,(B 'thread $B$N;~!$(Bwl-summary-cursor-up $B$N(B hereto $B$,L5;k$5$l$F$$$?$N$r=$@5$7$?!#(B * wl-thread-jump-to-next-unread, wl-thread-jump-to-prev-unread$B$G(B hereto $B$,(B non-nil $B$N$H$-!$(Bsuccess-mark $B$,$J$/%+!<%=%k$,(B failure-mark $B$N0LCV$K$"$k$H!$La$jCM$,(B nil $B$K$J$k$N$r=$@5$7$?!#(B * $B%5%^%j$N%"%C%W%G!<%H;~$N:o=|$G=hM}$N?JD=$rI=<($9$k$h$&$K$7$?!#(B 1998-12-06 OKUNISHI Fujikazu * elmo-localdir-pack-number() $B$N%G%P%C%0%3!<%I=|5n$H7P2aI=<(!#(B * data scope $BLdBj$G(B free var $B$K$J$i$J$$$h$&$K(B elmo-call-func() $B$G(B SPEC $B$rDL$9$h$&$K$7$?!J(Bbyte-compile warning $B$r>C$9$?$a!K!#(B 1998-12-05 OKUNISHI Fujikazu * wl-ja.texi $B$N$$$/$D$+$N$"$d$^$j$r=$@5!#(B 1998-12-05 Masahiro MURATA ($BB * $B?75,JQ?t(B elmo-archive-treat-file$B!#(Bnon-nil $B$N>l9g(B $B$O(B archive $B%U%)%k%@$,%U%!%$%k$rBP>]$H$9$k$h$&$K$7$?!#(B 1998-12-04 Masahiro MURATA ($BB * elmo $B$G:n@.$9$k0l;~%P%C%U%!$,(B WL $B$r=*N;$7$F$b;D$k>l9g$,$"$k$N(B $B$r=$@5$7$?!#(B * wl-summary-rescan $Bl9g$O%a%C%;!<%8$rI=<($7$J$$$h(B $B$&$K$7$?!#(B * elmo-archive-delete-msgs $B$,:o=|$K@.8y$7$?$H$-(B t $B$rJV$9$h$&$K$7$?!#(B 1998-12-04 Yuuichi Teranishi * wl-summary-unread-message-hook $B$r(B wl-summary-mark-as-read () $B$NCf$G8F$V$h$&JQ99!#(B 1998-12-04 $B2,ED(B $B7r0l(B * $BL$FI5-;v$,FI$^$l$?$H$-$K8F$P$l$k(B wl-summary-unread-message-hook $B$rDI2C!#(B 1998-12-03 Masahiro MURATA ($BB * folder mode $B$G%"!<%+%$%V%U%)%k%@$r(B check $B$7$F$bI=<($,99?7$5$l$J(B $B$$$H$-$,$"$k$N$r=$@5!#(B 1998-12-03 Yuuichi Teranishi * wl_nemacs $B%V%i%s%A$r:n@.!"(BNemacs $BBP1~3+;O!#(B * smtp.el $B$r(B flim-1.12 $BIUB0$N(B smtp.el $B$HF~$l49$(!"(B $BJQ99$5$l$?(B API $B$K9g$o$;$?(B (smtp-do-bcc $B$N:o=|!"(Bsmtp-via-smtp $B$N0z?t$NJQ99(B)$B!#(B * im-wl.el $B$G$bJQ?t(B wl-insert-message-id $B$,$^$k$C$-$jL5;k$5$l$F$$$?(B $B$N$r=$@5!#(B * wl-summary-prefetch-msg $B;~!"Bg$-$J%a%C%;!<%8$G%(%i!<$,$G$F$7$^$&(B $B%(%i!<$r=$@5!#(B * $BIQHK$K;H$o$l$F$$$?(B append $B$r(B nconc $B$KCV$-49$($k$3$H$G(B multi $B%U%)%k%@$NF0:n$rA4HL$K9bB.2=!#(B 1998-12-02 OKUNISHI Fujikazu Hironori Fukuchi * wl-ja.texi $B$N$$$/$D$+$N$"$d$^$j$r=$@5!#(B 1998-12-02 Yuuichi Teranishi * alpha -> beta$B!#(B * $B$3$l$^$G$N(B ChangeLog $B$r(B etc $B$K0\F0!#(B wanderlust-wanderlust-912c443/etc/ChangeLog.3000066400000000000000000003064121262320455600210440ustar00rootroot000000000000002000-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-912c443/etc/ChangeLog.3.ja000066400000000000000000003714531262320455600214440ustar00rootroot000000000000002000-03-24 Yuuichi Teranishi * 1.1.0 - "Overjoyed" 2000-03-23 Yuuichi Teranishi * wl-refile.el (wl-refile-guess-func-list): $BJQ?tDj5A$r=$@5!#(B (KOYAMA Tetsuji $B$5$s$h$j8f;XE&(B) * 1.1.0pre6 - "Overjoyed-pre6" * wl-folder.el (wl-create-folder-entity-from-buffer): localnews $B$NDj5A(B $B$,$"$@L>Dj5A$K$J$C$F$7$^$&$N$r=$@5!#(B (AOXI Tenghe $B$5$sB>$h$j8f;XE&(B) 2000-03-23 OKAZAKI Tetsurou * wl-summary.el (wl-summary-mode-menu-spec): wl-draft $B$r(B wl-summary-write $B$KJQ99!#(B (wl-summary-msg-marked-as-target): wl-summary-msg-marked-as-temp $B$+$i2~L>!#(B * wl-thread.el (wl-thread-close-all): $B6I=jJQ?tL>$rJQ99!#(B 2000-03-22 Akihiro MOTOKI * wl-refile.el (wl-refile-guess-func-list): $B?75,JQ?t!#(B (wl-refile-guess): wl-refile-guess-func-list $B$r;H$&$h$&$K$7$?!#(B 2000-03-22 Yuuichi Teranishi * wl-mime.el: Byte compile $B$N(B Warning $B$r8:$i$7$?!#(B * wl-xmas.el,wl-mule.el,wl-nemacs.el (wl-make-modeline): $BDj5A!#(B XEmacs $B$G$O%W%i%0$N%"%$%3%sI=<($r%G%U%)%k%H$K$7$?!#(B (Daiki Ueno $B$5$s$h$j8f=u8@(B) * wl-util.el (wl-make-modeline-subr): wl-make-modeline $B$+$i2~L>!#(B * utils/bbdb-wl.el (bbdb-wl-update-record): Sticky summary $BBP1~!#(B (bbdb-wl-update-record, bbdb-wl-get-update-record): raw buffer $B$,(B multibyte $B$K$J$i$J$$$h$&$K$7$?!#(B * wl-draft.el (wl-draft-reply): $BF1MM!#(B * 1.1.0pre5 - "Overjoyed-pre5" 2000-03-21 Yuuichi Teranishi * NEWS.ja: $B?75,%U%!%$%k!#(B * elmo-maildir.el (elmo-maildir-list-folders): elmo-have-link-count $B$r(B nil $B$K94B+(B (Masahiro MURATA ($BB $B$5$s$N8f=u8@(B)$B!#(B * wl-summary.el (wl-summary-edit-addresses-subr): $B%"%I%l%9$r(B downcase $B$9$k$h$&$K$7$?!#(B 2000-03-18 TAKAHASHI Kaoru * NEWS: $B?75,%U%!%$%k!#(B 2000-03-17 Yuuichi Teranishi * wl-message.el (wl-message-follow-current-entity): $B%*%j%8%J%k%P%C%U%!$r;2>H$9$k$h$&$K$7$?(B (OKAZAKI Tetsurou $B$5$s$N8f;XE&(B)$B!#(B * elmo-maildir.el (elmo-maildir-list-folders): Maildir $B$K$J$C$F$$$k$+$I$&$+%A%'%C%/$9$k$h$&$K$7$?!#(B ( $B$5$s$N8f;XE&(B) 2000-03-15 Yuuichi Teranishi * wl-folder.el (wl-create-folder-entity-from-buffer): $B6uGr$,#28D0J>e(B $B$"$k>l9g$K2r@O$K<:GT$9$k$N$r=$@5!#(B * wl-summary.el (wl-summary-edit-addresses): $B%*%j%8%J%k%P%C%U%!$+$i(B $B%"%I%l%9>pJs$rF@$k$h$&$K$7$?!#(B (wl-summary-prefetch): wl-prefetch-threshold $B$r(B nil $B$K94B+$9$k$N$O(B $B$d$a$?!#(B 2000-03-14 Yuuichi Teranishi * 1.1.0pre4 - "Overjoyed-pre4" * $B%(%i!<%a%C%;!<%8$N:G8e$,(B "." $B$G=*$i$J$$$h$&$K$7$?!#(B * elmo/elmo-archive.el (elmo-archive-copy-msgs): same-number $B$N$H$-$K(B maildir $B$J$i%U%!%$%kL>$=$N$^$^$@$H;W$o$J$$$h$&$K$7$?!#(B * wl-expire.el (wl-expire-archive-get-folder): elmo-safe-filename $B$N(B $BBe$o$j$K(B elmo-replace-msgid-as-filename $B$r;H$&$h$&$K$7$?!%(B * wl-folder.el (wl-folder-goto-folder-subr): $B%G%U%)%k%H$r(B wl-default-folder $B$H$7$?!%(B (okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) $B$5$s$N8f=u8@(B) * wl-folder.el (wl-create-folder-entity-from-buffer): $B%U%)%k%@L>$K6uGr$,4^$^$l$F$$$F$b$h$$$h$&$K$7$?!#(B * wl-summary.el (wl-summary-jump-to-msg-by-message-id): $B%+%l%s%H%U%)%k%@$G%?!<%2%C%H$,8+IU$+$C$?>l9g$O(B wl-thread-jump-to-msg $B$r;H$&$h$&$K$7$?!%(B 2000-03-13 Yuuichi Teranishi * wl-vars.el (wl-summary-skip-mark-list): $B?75,JQ?t!#(B * wl-summary.el (wl-summary-prefetch): interactive $B$N>l9g$@$1(B wl-prefetch-threshold $B$r(B nil $B$H$9$k$h$&$K$7$?!#(B (Akihiro MOTOKI $B$5$s$N8f;XE&(B) (wl-summary-exec-subr): $B%^!<%/Am?t$N?t$(J}$,4V0c$C$F$$$?$N$r=$@5(B (OKAZAKI Tetsurou $B$5$s$N8f;XE&(B)$B!#(B (wl-summary-next, wl-summary-prev): wl-summary-skip-mark-list $B$r;H$&(B $B$h$&$K$7$?!#(B (wl-summary-move-cached-regex): defmacro->defun$B!#(B * etc/ja.Emacs: $B99?7!#(B * elmo-imap4.el (elmo-imap4-search): from-msgs $B$r9MN8$9$k$h$&$K$7$?!#(B * elmo-maildir.el (elmo-maildir-search): $B=$@5!#(B * mmelmo-imap4-1.el (mmelmo-imap4-parse-bodystructure-string): literal $B$NFI$_ * wl-expire.el: Filter folder $B$G(B expire $B=PMh$J$$>l9g$,$"$k$N$r=$@5$7$?!#(B * wl-fldmgr.el: $B2~9T$r4^$`%U%)%k%@L>$d$"$@L>$J$I$r07$($J$$$h$&$K$7$?!#(B 2000-03-12 Masahiro MURATA ($BB * wl-fldmgr.el (wl-fldmgr-get-path-from-buffer): wl-desktop group $B$,JD$8$F$$$k$H$-$K%(%i!<$,=P$k>l9g$,$"$k$N$r=$@5!#(B 2000-03-11 Masahiro MURATA ($BB * wl-folder.el (wl-folder-mode-menu-spec): $BDI2C!"99?7!#(B 2000-03-08 TAKAHASHI Kaoru * wl-vars.el (wl-score-files-dir): wl-score-files-directory $B$+$i2~L>!#(B * wl-score.el (wl-score-edit-file, wl-score-load-file, wl-score-change-score-file): $BF1>e!#(B 2000-03-08 Yuuichi Teranishi * wl-vars.el (wl-mime-charset): $B%G%U%)%k%HCM$r(B x-ctext $B$H$7$?!#(B 2000-03-08 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * elmo-nntp.el (elmo-nntp-list-folders): $B%k!<%H%U%)%k%@L>$,(B "" $B$N$H$-$NIT6q9g$r=$@5!#(B 2000-03-07 Yuuichi Teranishi * 1.1.0pre3 - "Overjoyed-pre3" * elmo-imap4.el (elmo-imap4-create-msgdb-from-overview-string): $B%m!<%+%k$NL$FI>pJs$r9MN8$7K:$l$F$$$?$N$r=$@5!#(B * elmo2.el (elmo-delete-folder): maildir $B$b%U%)%k%@:o=|2DG=$H$7$?!#(B (elmo-move-msgs): $B%m!<%+%k$NL$FI>pJs$,0z$-7Q$,$l$J$$$N$r=$@5!#(B * elmo-maildir.el (elmo-maildir-delete-folder): $B=q$-D>$7!#(B * mmelmo.el (mime-parse-parameters-from-list): mmelmo-imap4.el $B$+$i(B $B0\F0!#(B * wl-message.el (wl-mmelmo-message-redisplay): mime-display-header-hook $B$r(B nil $B$K94B+!#(B * wl-mime.el (wl-mime-display-message): SEMI $B$N%P!<%8%g%sH=Dj$,(B $B4V0c$C$F$$$?$N$r=$@5!#(B (wl-summary-burst): mime-message-structure $B$r;2>H$7$J$$$h$&$K$7$?!#(B (wl-mime-entity-read-field): $B?75,(B alias/macro$B!#(B (wl-mime-combine-message/partial-pieces): wl-mime-entity-read-field $B$r;H$&$h$&$K$7$?!#(B (mime-edit-user-agent-value): XEmacs beta $B$N%P!<%8%g%sI=<($,=EJ#$9$k(B $B$N$KBP=h(B (For SEMI 1.13.4 or earlier)$B!#(B 2000-03-06 katsuta@cced.mt.nec.co.jp * elmo-util.el (elmo-buffer-field-condition-match): std11-field-body $B$,(B nil $B$rJV$9>l9g$KBP=h!#(B 2000-03-04 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * wl-summary.el (wl-summary-prefetch-msg): $B%^!<%/$r;2>H$7$J$$(B $B$h$&$K$7$?!#(B 2000-03-06 Yuuichi Teranishi * wl-summary.el (wl-summary-read-folder): "" $B$N$H$-$O%G%U%)%k%H$r;H$&(B $B$h$&$K$7$?!#(B * wl-fldmgr.el, wl-folder.el, etc: $B%a%C%;!<%8$OBgJ8;z$G(B $B;O$^$k$h$&$K$7$?!#(B * wl-draft.el (wl-draft-yank-original): kill-ring $B$+$i$N(B yank $B$,(B $BF0$+$J$/$J$C$F$$$?$N$r=$@5!#(B * mmelmo-1.el (insert-header): mmelmo-insert-sorted-header-from-buffer $B$r;H$&$h$&$K$7$?!#(B (insert-text-content): $B?75,%a%=%C%I!#(B (run-hooks 'mmelmo-entity-content-inserted-hook) $B$9$k$h$&$K$7$?!#(B * utils/bbdb-wl.el (bbdb-wl-show-bbdb-buffer): $B?75,4X?t!#(B wl-summary-toggle-disp-folder-message-resumed-hook $B$KDI2C!#(B * 1.1.0pre2 - "Overjoyed-pre2" * elmo-maildir.el (elmo-maildir-sequence-number-internal): $B?75,JQ?t!#(B (elmo-maildir-make-unique-string): v19 $B8~$1$KDj5A$5$l$F$$$J$+$C$?$N$r=$@5!#$^$?!"(B elmo-maildir-sequence-number-internal $B$r;H$&$h$&$K$7$?!#(B (elmo-maildir-temporal-filename): 2 $BICBT$?$J$$$h$&$K$7$?!#(B (toplevel): (eval-when-compile (require 'cl) $B$rDI2C!#(B * wl-summary.el (wl-summary-buffer-number-column-detect): re-search-forward $B$NJV$jCM$r;H$o$J$$$h$&$K$7$?!#(B 2000-03-06 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * elmo-pop3.el (elmo-pop3-port-label): typo $B=$@5(B (port->ssl)$B!#(B * elmo-nntp.el (elmo-nntp-sync-number-alist): folder-mode$B$GL$FI?t$,%^%$%J%9$K$J$C$?$^$^$K$J$k>l9g$,$"$k$N$r=$@5!#(B 2000-03-06 Yuuichi Teranishi * wl-summary.el (wl-summary-switch-to-clone-buffer): wl-summary-buffer-number-column, wl-summary-buffer-number-regexp $B$r0z$-7Q$0$h$&$K$7$?!#(B (wl-summary-write): $B?75,%3%^%s%I!#(B'w' $B$K%P%$%s%I!#(B * wl-draft.el (wl-draft): wl-summary-write $B8~$1$NF0:n$rDI2C!#(B 2000-03-05 Yuuichi Teranishi * elmo-cache.el (elmo-cache-list-folder-subr): $B%G%#%l%/%H%j$rL5;k!#(B * wl-summary.el (wl-summary-insert-line): $B?75,4X?t!#(B (wl-summary-insert-summary, wl-summary-update-thread): `wl-summary-insert-line' $B$r;H$&$h$&$K$7$?!#(B * wl-thread.el (wl-thread-update-line-on-buffer-sub): $BF1>e!#(B * WL-MK (wl-info-lang): list $B$J$i4^$^$l$k(B lang $B$rA4It%$%s%9%H!<%k$9$k(B $B$h$&$K$7$?!#(B * elmo/elmo-maildir.el (elmo-maildir-append-msg): new $B$G(B tmp $B$N%U%!%$%kL>$r$=$N$^$^;H$&$h$&$K$7$?!#(B (elmo-maildir-list-folders): $B%k!<%H$r4^$`$h$&$K$7$?!#(B 2000-03-04 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * wl-summary.el (wl-summary-buffer-set-folder): $B%3%i%`?t$N@_Dj$r:o=|!#(B (wl-summary-goto-folder-subr): $B%3%i%`?t$rF0E*$K8!=P$9$k$h$&$K$7$?!#(B (wl-summary-target-mark-forward): $B%U%)%o!<%I=g=x$r=$@5!#(B (wl-summary-cleanup-temp-marks): $B$^$H$a=hM}%^!<%/$r:o=|$9$k$h$&$K$7$?!#(B 2000-02-29 nisikawa@nisikawa.org ($B@>@n(B $BN * wl-thread.el (wl-thread-update-children-number): wl-thread-update-children-number $B$+$i2~L>!#(B $B?75,(B hook$B!"(Bwl-thread-update-children-number-hook $B$r8F$V$h$&$K$7$?!#(B 2000-03-04 Masahiro MURATA ($BB wl-folder.el (wl-folder-sync-entity, wl-folder-mark-as-read-all-entity, wl-folder-prefetch-entity): Sticky $B8~$1$N%O%$%i%$%H@_Dj$N=$@5!#(B 2000-03-03 Yuuichi Teranishi * elmo2.el (elmo-move-msgs): target $B$,(B 'null $B$N$H$-$OL$FI$NJ]B8$r(B $B%9%-%C%W$9$k$h$&$K$7$?!#(B * elmo-maildir.el (elmo-maildir-make-unique-string): elmo-maildir-create-unique-string $B$+$iJQ99!#(B (OKAZAKI Tetsurou $B$5$s$N8f=u8@(B) * 1.1.0 pre1 - "Overjoyed-pre1" 2000-03-02 Yuuichi Teranishi * wl-draft.el (wl-draft-reply-buffer): $B?75,%P%C%U%!%m!<%+%kJQ?t(B (wl-draft-reply): `wl-draft-reply-buffer' $B$r@_Dj$9$k$h$&$K$7$?!#(B (wl-draft-config-exec): `wl-draft-reply-buffer' $B$r;2>H$9$k$h$&$K$7$?!#(B (wl-draft-reply): $BGQ;_!#(B * WL-MK, WL-CFG (wl-info-lang): $B?75,JQ?t!#(B * wl.texi: $B?75,%U%!%$%k!#(B * Makefile, WL-MK, WL-CFG: ELISPDIR->LISPDIR$B!#(B (TAKAHASHI Kaoru $B$5$s$h$j8fDs0F(B) * elmo-maildir.el: $BBgI}$K=q$-D>$7!#(B * elmo-util.el, elmo-msgdb.el, elmo-vars.el: maildir $B$N5-9f$r(B '.' $B$H$7$?!#(B * wl-folder.el, wl-summary.el, elmo-pop3.el, etc: $B%a%C%;!<%8$,BgJ8;z$G(B $B;O$^$k$h$&$K$7$?!#(B * elmo-vars.el (elmo-maildir-folder-path): $B?75,JQ?t!#(B * elmo-internal.el (elmo-internal-list-folders): 'cache $B$H(B 'mark $B$r(B $BJV5Q$9$k$h$&$K$7$?!#(B 2000-03-02 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * elmo-nntp.el: starttls $BItJ,$N=$@5!#(B * elmo-nntp.el, elmo-imap4.el: list-folders $B$G(B "!" $B%^!<%/$,>C$($F$7$^$&$N$r=$@5!#(B 2000-03-01 TAKAHASHI Kaoru * wl-score.el: $B%(%i!<%a%C%;!<%8$N(B "Illegal" $B$r(B "Invalid" $B$KJQ$($?!#(B 2000-03-01 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * wl-summary.el (wl-summary-refile-subr): $B%-%c%C%7%e%U%)%k%@$X$N(B $B%j%U%!%$%k$GL>A0$rE,@Z$J$b$N$K=$@5!#(B * elmo-nntp.el: starttls $B$KBP1~(B($B * elmo-cache2.el: elmo-cache.el $B$K%^!<%8!#(B * elmo-internal.el, elmo-util.el, elmo-msgdb.el: cache $B%P%C%/%(%s%I$r(B internal $B$N0lIt$H$7$F07$&$h$&$K$7$?!#(B 2000-03-01 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * elmo-cache2.el: $B?75,%P%C%/%(%s%I(B 'cache' $BDI2C!#(B 2000-02-29 IMAI Takeshi * wl-expire.el (wl-folder-expire-entity): Sticky $B8~$1$N(B $B%O%$%i%$%H@_Dj$N=$@5!#(B 2000-02-28 Yuuichi Teranishi * elmo2.el (elmo-move-msgs): $BL$FI>pJs$r0z$-7Q$0$h$&$K$7$?!#(B $B0z?t(B unread-marks $BDI2C!#(B (elmo-msgdb-sync): $B:o=|!#(B * wl-summary.el (wl-summary-exec): elmo-move-msgs $B$KL$FI%^!<%/$rEO$9$h$&$K$7$?!#(B (wl-summary-edit-petname): To $B$d(B Cc $B$bJT=8BP>]$H(B $B$J$k$h$&$K$7$?!#(B (wl-summary-edit-addresses): wl-summary-edit-petname $B$+$iJQL>!#(B (wl-summary-edit-petname): $B:o=|!#(B (wl-summary-mark-as-unread): $B%-%c%C%7%e$rM-8z$+$I$&$+$r9MN8!#(B * wl-vars.el (wl-summary-toggle-disp-folder-message-resumed-hook) (wl-summary-line-inserted-hook): $B?75,(B hook$B!#(B (wl-summary-print-destination): $BHs2D;kNN0h$K(B 'wl-summary-destination $B%W%m%Q%F%#$rDI2C$9$k$h$&$K$7$?!#(B * wl-thread.el, wl-summary.el: $B%5%^%j9T$,(B insert $B$5$l$?8e!"(B wl-summary-line-inserted-hook $B$r8F$V$h$&$K$7$?!#(B * utils/bbdb-wl.el: wl-summary-toggle-disp-folder-message-resumed-hook $B$G%]%C%W%"%C%W$9$k(B $B$h$&$K$7$?!#(B 2000-02-28 Masahiro MURATA ($BB * wl-folder-sync-current-entity $B$G$b(B Scoring $B$9$k$h$&$K$7$?!#(B * sticky$B%U%)%k%@$G(B wl-summary-buffer-disp-msg $B$H%P%C%U%!$NI=<($,(B $B$"$C$F$$$J$$$3$H$,$"$k$N$r=$@5$7$?!#(B 2000-02-25 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * wl-message.el (wl-message-refer-article-or-url): wl-summary-jump-to-msg-by-message-id$B$r8F$V:]!"5-;v$rH/8+$G$-$J$+$C$?(B $B>l9g$O!"(Bwl-summary-redisplay $B$7$J$$$h$&$K$7$?!#(B * wl-vars.el (wl-local-domain): $B=i4|@_DjJQ99!#(B * wl.el (wl-check-environment): wl-local-domain $B$r(B hostname $B$r(B $B=|$$$?ItJ,$H$_$J$9$h$&JQ99!#(B * wl-util.el (wl-draft-make-message-id-string): $BF1>e!#(B 2000-02-25 Yuuichi Teranishi * wl-expire.el (wl-folder-expire-entity): wl-summary-save-status $B$r(B $B8F$V$h$&$K$7$?!#(B 2000-02-24 Yuuichi Teranishi * wl-vars.el (wl-draft-send-hook): $B?75,(B hook$B!#(B * wl-draft.el (wl-draft-send): wl-draft-send-hook $B$r8F$V$h$&$K$7$?!#(B (Kenichi Sato $B$5$s$N8fMWK>(B) 2000-02-23 Yuuichi Teranishi * elmo-cache.el (elmo-cache-save): $B%U%!%$%kL>$,D9$9$.$F%;!<%V$K(B $B<:GT$9$k>l9g$KHw$($F(B (condition-case) $B$G3g$k$h$&$K$7$?!#(B (Mikya Tani $B$5$s$N8fJs9p(B) * wl-draft.el: FCC $B$K(B IMAP $B$NF|K\8l%U%)%k%@$,07$($J$+$C$?$N$r=$@5!#(B (HIRATA Naoto $B$5$s$N8f;XE&(B) 2000-02-21 Yuuichi Teranishi * wl-address.el (wl-address-header-extract-address): '\n' $B$r%"%I%l%9(B $BJ8;zNs$H$_$J$7$F$7$^$&>l9g$,$"$k$N$r=$@5!#(B (Tomotaka SUWA ($B?[K,(B $BM'?r(B) $B$5$s$N8f;XE&(B) * mmelmo.el (mmelmo-header-max-column): $B?75,JQ?t!#(B (Kenichi Sato $B$5$s$h$j8fMWK>(B) (mmelmo-header-inserted-hook): $B?75,(B hook. (mmelmo-entity-content-inserted-hook): $B?75,(B hook. * mmelmo-2.el (mime-insert-text-content): $B?75,(B entity $B%a%=%C%I!#(B mmelmo-entity-content-inserted-hook $B$r8F$V$h$&$K$7$?!#(B * mmelmo.el (mmelmo-insert-sorted-header-from-buffer): elmo-util.el $B$+$i0\F0!"(B`mmelmo-header-max-column' $B$r;H$&$h$&$K$7$?!#(B $B$^$?!"(Bmmelmo-header-inserted-hook $B$r8F$V$h$&$K$7$?!#(B 2000-02-18 Yuuichi Teranishi * wl-message.el (wl-mmelmo-message-redisplay): wl-mime-display-message $B$r;H$&$h$&$K$7$?!#(B (Toshihiko Kodama ($B>.6L(B $BMxI'(B) $B$5$s$N8f;XE&(B) * wl-mime.el (wl-mime-display-message): $B?75,(B macro/alias. * 2.2.18 - "Please Forgive Me" * wl-summary.el (wl-summary-move-cached-regex): unplugged $B$G$b(B 'D' $B%^!<%/$r%9%-%C%W$9$k$h$&$K$7$?!#(B * elmo-msgdb.el (elmo-msgdb-expand-path): IMAP4 $B$N(B INBOX $B$r(B downcase $B$9$k$h$&$K$7$?(B(Takeshi Chiba $B$5$s$N8f;XE&(B)$B!#(B * wl-folder.el (wl-create-folder-entity-from-buffer): $B%"%/%;%9%U%)%k%@Dj5A$K(B '}' $B$r4^$s$G$b$h$$$h$&$K$7$?!#(B * wl-message.el (wl-mmelmo-message-redisplay): mime-display-message $B$K%a%8%c!<%b!<%I$rEO$9$h$&$K$7$?!#(B 2000-02-18 Daiki Ueno * wl-demo.el: Emacs 21 $BBP1~$N=$@5!#(B 2000-02-17 Yuuichi Teranishi * mmelmo-imap4-2.el (mime-entity-buffer): $B%+%l%s%H%P%C%U%!$,(B $BJQ2=$7$J$$$h$&$K$7$?!#(B $B$^$?!"$^$@%U%'%C%A$5$l$F$$$J$$>l9g!"%U%'%C%A$9$k$h$&$K$7$?!#(B * mmelmo-imap4-2.el (mime-write-entity-content): $B?75,%a%=%C%I!#%;!<%V;~$K%9%-%C%W$7$?%Q!<%H$r%U%'%C%A$9$k!#(B * mmelmo-imap4-2.el (mmelmo-imap4-fetched): $B?75,%P%C%U%!%m!<%+%kJQ?t!#(B * elmo-imap4.el (elmo-imap4-server-namespace): $B?75,%P%C%U%!%m!<%+%kJQ?t!#(B (elmo-imap4-open-connection): elmo-imap4-server-namespace $B$r@_Dj$9$k$h$&$K$7$?!#(B (elmo-imap4-parse-namespace): $B?75,4X?t!#(B (elmo-imap4-process-folder-list): elmo-imap4-server-namespace $B$r;H$&$h$&$K$7$?!#(B (elmo-imap4-extra-namespace-alist): $B?75,JQ?t!#(B * wl-util.el (wl-string-member, wl-string-match-member, wl-string-delete-match, wl-string-match-assoc, wl-string-rassoc): elmo-* $B$K2~L>!"(Bdefalias $B$H$7$?!#(B 2000-02-17 Yuuichi Teranishi * bbdb-wl.el: wl-summary-toggle-disp-folder-off-hook $B$N@_Dj$rDI2C!#(B 2000-02-16 Daiki Ueno * wl-demo.el: frame $B$N(B font parameter $B$G(B $B$,(B $BM?$($i$l$F$$$k>l9g$K!"(Bfont-info $B$+$iCf1{$N:BI8$r7W;;$9$k$h$&$K$7$?!#(B 2000-02-14 Yuuichi Teranishi * wl-summary.el (wl-summary-toggle-disp-folder): $B%&%#%s%I%&%5%$%:$,(B $B>.$5$/$J$k>l9g$,$"$k$N$r=$@5!#(B (Shigeru OKUMURA $B$5$s$N8f;XE&(B) * wl-draft.el (wl-draft-insert-x-face-field-here): $B:G=i$N6uGr$r:o=|!#(B (Akihiro MOTOKI $B$5$s$N8f;XE&(B) 2000-02-12 Akihiro MOTOKI * elmo/elmo-localdir.el (elmo-localdir-msgdb-create-overview-entity-from-file): `timezone-make-date-arpa-standard' $B$K(B `current-time-zone' $B$NCM$r(B $BEO$9$h$&$K$7$?!#(B 2000-02-10 Yuuichi Teranishi * elmo/mmelmo-imap4-2.el (mmelmo-imap4-node-id-to-string): "header" -> "0"$B!#(B * elmo/mmelmo-imap4-1.el (mmelmo-imap4-node-id-to-string): $BF1>e!#(B (TSUMURA Tomoaki $B$5$s$N8f;XE&(B) * wl-message.el (wl-message-follow-current-entity): wl-draft-reply $B$N0z?t$K%5%^%j%P%C%U%!$rEO$9$h$&$K$7$?!#(B * wl-summary.el (wl-summary-reply): wl-draft-reply $B$N0z?t$K(B current-buffer $B$rEO$9$h$&$K$7$?!#(B (wl-summary-msgdb-load-async): mailbox $B$r(B "" $B$G3g$k$h$&$K$7$?!#(B * elmo-imap4.el: $BF1>e!#(B 2000-02-09 UENO Kazuaki * wl-draft.el (wl-draft-queue-flush): elmo-dop-flush-confirm $B$r;H$&$h$&$K$7$?!#(B 2000-02-09 Yuuichi Teranishi * wl-draft.el (wl-draft): $B=i4|2=$N=g=xJQ99!#(B (Taiji.Can@atesoft.advantest.co.jp $B$5$s$N8fJs9p$K4p$E$/(B) 2000-02-08 Masahiro MURATA ($BB * wl-score.el (wl-summary-score-update-all-lines): $B4{FI$K$7$?%a%C%;!<%8$K(B read-uncached mark $B$rIU$1$k;~$K%U%)%k%@ * wl-summary.el (wl-summary-target-mark-prefetch): $B4{FIL$%-%c%C%7%e%^!<%/$,>C$($J$$$N$r=$@5!#(B (Hironori Fukuchi $B$5$s$N8f;XE&(B) * wl-summary.el (wl-summary-target-mark-prefetch): $B%W%j%U%'%C%A$N?JD=$rI=<($9$k$h$&$K$7$?!#$^$?!"(B $B%-%c%C%7%e$7$J$+$C$?>l9g$O(B '*' $B%^!<%/$r;D$9$h$&$K$7$?!#(B * wl-dnd.el (start-drag): static-cond $B$GDj5A$7$J$*$7$?!#(B * elmo2.el (elmo-buffer-cache-message): $BFI$_=P$7Cf$K(B quit $B$9$k$H0c$&%a%C%;!<%8$rI=<($7$F$7$^$&$N$r=$@5!#(B * elmo-filter.el (elmo-filter-list-folder-important): elmo-search $B$N2s?t$r8:$i$7$?(B (Akihiro MOTOKI $B$5$s$N8f=u8@(B)$B!#(B 2000-02-07 Daiki Ueno * wl-xmas.el (wl-highlight-folder-current-line): set-extent-properties $B$r;H$o$J$$$h$&$K$7$?!#(B * wl-draft.el (wl-smtp-extension-bind): Fixed. 2000-02-07 Akihiro MOTOKI * elmo-util.el (elmo-buffer-field-condition-match): $B%X%C%@$NCM$r(B eword-decode-string $B$G%G%3!<%I$7$F$+$iHf3S$9$k$h$&$K$7$?!#(B 2000-02-07 Yuuichi Teranishi * wl-dnd.el: $B%P%$%H%3%s%Q%$%k;~$N(B Warning $B$r8:$i$7$?!#(B (okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) $B$5$s$N8f;XE&(B) * utils/sasl/sha1.el, utils/sasl/md5-el.el, utils/sasl/hex-util.el, utils/sasl/sha1-el.el: $B:G?7HG$K(B update$B!#(B (okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) $B$5$s$N8f;XE&(B) * wl-vars.el (wl-demo-use-bitmap): wl-demo-display-logo $B$KJQ99!#(B (wl-demo-display-logo): $B?75,JQ?t!#(B * wl-demo.el: wl-demo-display-logo $B$r;H$&$h$&$K$7$?!#(B 2000-02-07 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * wl-vars.el (wl-demo-use-bitmap): $B=i4|CM@_DjJ}K!$rJQ$($?!#(B 2000-02-07 Yuuichi Teranishi * 2.2.17 - "One Of Us" * elmo-util.el (elmo-y-or-n-p): $B?75,4X?t!#(B * elmo-vars.el (elmo-dop-flush-confirm): $B?75,JQ?t!#(B * elmo-dop.el (elmo-dop-queue-flush): elmo-y-or-n-p, elmo-dop-flush-confirm $B$r;H$&$h$&$K$7$?!#(B * elmo-imap4.el (elmo-delete-msgids): $B?JD=$rI=<($9$k$h$&$K$7$?!#(B $B$^$?!"(Bexpunge $B$O:G8e$K#12s$@$1 * wl-folder.el, wl-xmas.el: -nw $B$G5/F0$5$l$?(B XEmacs $B$G(B frame $B$r(B $B3+$$$?>l9g$G$b%"%$%3%s$,I=<($5$l$k$h$&$K$7$?!#(B 2000-02-06 Yuuichi Teranishi * wl-highlight.el (wl-highlight-summary-target-face): $B?75,(B face$B!#(B (temp-face $B$+$i2~L>(B) * wl-vars.el (wl-demo-use-bitmap): wl-demo.el $B$+$i0\F0!#(B defcustom $B$K$7$?!#$^$?!"=i4|CM$r(B (module-installed-p 'bitmap) $B$H$7$?!#(B * wl-demo.el (wl-demo-use-bitmap): wl-vars.el $B$K0\F0!#(B * WL-CFG: wl-demo-use-bitmap $B$r:o=|!#(B * elmo-vars.el: Require 'poe, $B%P%$%H%3%s%Q%$%k;~$N(B warning $B$r8:$i$9!#(B * wl-nemacs.el (buffer-disable-undo, rassoc, delete, string-to-number, window-live-p, completing-read, accept-process-output, get-buffer-window): $B:o=|!#(B 2000-02-04 TAKAHASHI Kaoru * wl-demo.el (wl-demo): wl-demo-use-bitmap $B$r * INSTALL, INSTALL.ja: tm-8 $B$N(B URL $B$r99?7!#(B * utils/hmac -> utils/sasl $B$K2~L>!#(B * WL-ELS: HMAC->SASL$B!#(B * WL-MK: HMAC->SASL$B!#(B 2000-02-04 Yuuichi Teranishi * elmo-localdir.el (elmo-localdir-msgdb-create-overview-entity-from-file): format-time-string $B$r;H$&$N$r;_$a!"(Btimezone-make-date-arpa-standard $B$r;H$&$h$&$K$7$?!#(B * elmo-vars.el (elmo-time-format): $B:o=|!#(B 2000-02-03 Yuuichi Teranishi * elmo-dop.el (elmo-dop-queue-flush): append-operations $B$N%-%c%s%;%k(B $B=hM}$rDI2C!#(B * wl-summary.el (wl-summary-refile-prev-destination, wl-summary-copy-prev-destination): Fixed. (IMAI Takeshi $B$5$s$N8fJs9p(B) 2000-02-02 Akihiro MOTOKI * wl-vars.el (wl-prefetch-confirm-threshold): $BGQ;_$7!"(B wl-prefetch-confirm $B$H(B wl-prefetch-threshold $B$KJ,N%!#(B (wl-prefetch-confirm, wl-prefetch-threshold): $B?75,JQ?t!#(B * wl-summary.el (wl-summary-prefetch-msg): wl-prefetch-confirm, wl-prefetch-threshold $B$K=>$&$h$&$K$7$?!#(B 2000-02-02 Daiki Ueno * wl-draft.el (wl-smtp-features): smtp-authenticate-type $B$,(B symbol $B$K$J$C$?$N$KBP1~!#(B 2000-01-31 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * elmo-nntp.el (elmo-nntp-get-folders-info): Fixed. 2000-01-31 Daiki Ueno * wl-demo.el: Emacs21 $B$G(B wl-logo.xpm $B$rI=<($9$k$h$&$K$7$?!#(B 2000-01-30 TAKAHASHI Kaoru * INSTALL, INSTALL.ja: Fixed. 2000-01-30 OKUNISHI -GTO- Fujikazu * WL-ELS: $B4{$K(B open-database $B$,Dj5A:Q$_$N>l9g$b(B ELMO-MODULES $B$K(B elmo-database $B$rDI2C$9$k$h$&$K$7$?!#(B 2000-01-30 Akihiro MOTOKI * elmo-loacaldir.el (elmo-localdir-msgdb-create-overview-entity-from-file): Date: $B%U%#!<%k%I$,$J$$>l9g$O!"%U%!%$%k$N:G=*99?7F|$rF|IU$H$7$FI=<($9$k(B $B$h$&$K$7$?!#(B * elmo-msgdb.el (elmo-msgdb-create-overview-from-buffer): $B0z?t(B time $B$rDI2C!#(B * elmo-vars.el (elmo-time-format): $B?75,JQ?t!#(B 2000-01-29 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * wl-summary.el (wl-summary-jump-to-msg-by-message-id): NNTP $B%5!<%P$r;XDj$G$-$k$h$&$K$7$?!#(B (wl-summary-jump-to-msg-by-message-id-via-nntp) $B%5!<%P;XDj;~$K!"C1$J$k%5!<%PL>$@$1$G$J$/!"(B "-:username@servername:8119!"$B$N$h$&$J;XDj$b$G$-$k$h$&$K$7$?!#(B * elmo-nntp.el (elmo-nntp-folder-postfix): $B0z?t(B ssl $BDI2C!#(B 2000-01-29 OKUNISHI -GTO- Fujikazu * elmo-vars.el (elmo-database-dl-module, elmo-database-dl-handle): $B?75,JQ?t!#(B (toplevel): elmo-database-dl-handle $B$,(B non-nil $B$J$i(B emacs_database_init $B$r(B dynamic_call $B$9$k$h$&$K$7$?!#(B (elmo-use-database): open-database $B$,$"$l$P(B elmo-use-database $B$r@_Dj!#(B * WL-ELS: 'dynamic-link $B$,$"$l$P(B ELMO-MODULES $B$K(B elmo-database $B$rDI2C!#(B 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: $BF1>e!#(B 2000-01-26 OKAZAKI Tetsurou * elmo-imap4.el (elmo-imap4-create-folder): UW imapd-4.7 $B$G?7$7$/(B folder $B$,:n$l$J$$LdBj$X$NBP=h!#(B 2000-01-26 Yuuichi Teranishi * mmelmo-imap4-2.el (mmelmo-imap4-parse-bodystructure-string): BODYSTRUCTURE $B$Nl9g$r9MN8$9$k$h$&$K$7$?!#(B * mmelmo-imap4-1.el: $BF1>e!#(B * utils/hmac/unique-id.el: $B?75,%U%!%$%k!#(B * WL-ELS (HMAC-MODULES): scram-md5, digest-md5, unique-id $B$rDI2C!#(B * 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): $B?75,JQ?t!#(B * wl-summary.el: temp-mark -> target-mark $BL>A0JQ99!#(B $B0l;~%^!<%/7O%3%^%s%I$G(B `wl-summary-reserve-mark-list' $B$r;H$&$h$&$K$7$?!#(B * wl-score.el, wl-thread.el: $BF1>e!#(B * wl-folder.el (toplevel): require 'wl $B$9$k$h$&$K$7$?!#(B * elmo-util.el (elmo-imap4-encode-string): optional $B0z?t$rDI2C!#(B 2000-01-24 Yuuichi Teranishi * wl-mule.el, wl-xmas.el, wl-nemacs.el (wl-summary-format-date): $B:o=|!"(Bwl-summary.el $B$X0\F0!#(B * utils/hmac/lisp/sasl.el, utils/hmac/lisp/digest-md5.el, utils/hmac/lisp/scram-md5.el: $B:G?7HG$K(B update$B!#(B * wl-fldmgr.el (wl-fldmgr-ext): $B3NG'%a%C%;!<%8$rJQ99!#(B * doc/TODO.ja: $B99?7!#(B 2000-01-22 OKAZAKI Tetsurou * wl-folder.el (toplevel): Fixed menu. 2000-01-21 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * elmo-imap4.el: DIGEST-MD5 $B$KBP1~!#(B * elmo-pop3: CRAM-MD5, DIGEST-MD5, SCRAM-MD5$B$KBP1~!#(B 2000-01-21 Yuuichi Teranishi * wl-summary.el (toplevel): $B%j!<%8%g%s7O%-!<%P%$%s%I$NDj5A0LCV$rJQ99!#(B (wl-summary-prefetch-region): $BJD$8$?%9%l%C%I$N%a%C%;!<%8$r%W%j%U%'%C%A(B $B$7$J$$$N$r=$@5!#(B(OKAZAKI Tetsurou $B$5$sB>$h$j8fJs9p(B) * elmo: append-msg, move-msgs $B%a%=%C%I$K0z?t(B no-see $B$rDI2C!#(B * elmo-pipe: move-msgs $B$G(B 'no-see $B$r;XDj$9$k$h$&$K$7$?!#(B * wl-folder.el (wl-folder-mimic-kill-buffer): $B?75,%3%^%s%I!#(B (toplevel): C-xk $B$K(B` wl-folder-mimic-kill-buffer' $B$r!"(B C-xC-s $B$K(B `wl-save' $B$r$=$l$>$l3d$jEv$F!#(B 2000-01-19 Yuuichi Teranishi * wl-nemacs.el (accept-process-output): $B?75,4X?t!#(B * Makefile: $B%3%a%s%H=$@5!#(B 2000-01-17 Yuuichi Teranishi * elmo-util.el (elmo-folder-identical-system-p): $BJL%5!<%P$G(B $BF1$8L>A0$N%a!<%k%\%C%/%9$,F10l;k$5$l$F$7$^$&$N$r=$@5!#(B (Tatsuya Matsui $B$5$s$N8f;XE&(B) * wl-address.el (wl-complete-field-body-or-tab): $B0z?t$r$J$/$7$?!#(B 2000-01-13 Yuuichi Teranishi * wl-vars.el (wl-prefetch-confirm-threshold, wl-cache-fetch-threshold): $B?75,JQ?t!#(B * wl-summary.el (wl-summary-prefetch-msg): wl-prefetch-confirm-threshold $B$r;H$&$h$&$K$7$?!#(B (wl-cache-prefetch-message): wl-cache-fetch-threshold $B$r;H$&$h$&(B $B$K$7$?!#(B 2000-01-13 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * wl-message.el (wl-message-decide-backend, wl-normal-message-redisplay): wl-fetch-confirm-threshold $B$,(B nil $B$J$i3NG'$7$J$$$h$&$K$7$?!#(B 2000-01-11 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * wl-draft.el (wl-draft-delete): wl-draft-buffer-file-name $B$,(B nil $B$N;~$r9MN8$9$k$h$&$K$7$?!#(B 2000-01-11 Nishimoto Masaki * wl-draft.el (wl-draft-save-and-exit): $B4X78$J$$%P%C%U%!$r(B kill $B$7$F$7$^$&$3$H$,$"$k$N$r=$@5!#(B 2000-01-11 Yuuichi Teranishi * 2.2.15 - "More Than Words" 2000-01-11 Yoichi NAKAYAMA * samples/ja/dot.folders, samples/en/dot.folders: '$B%"%/%;%9%0%k!<%W(B' $B$N5-=R$r2C$($?!#(B 2000-01-11 Yuuichi Teranishi * wl-mime.el, tm-wl.el (wl-draft-preview-message): $BA4%X%C%@$rI=<((B $B$9$k$h$&$K$7$?!#(B * wl-summary.el (wl-summary-mode): tab-width $B$r@_Dj$7$J$$$h$&$K$7$?!#(B (Yoshinari NOMURA $B$5$s$N8f;XE&(B) (wl-summary-copy, wl-summary-refile): wl-draft-folder $B$K%3%T!<(B $B$G$-$J$$$h$&$K$7$?(B (okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA)$B$5$s$N8f;XE&(B)$B!#(B (wl-summary-overview-entity-compare-by-date): $B%(%i!<$rL5;k(B (MIZUHARA Bun $B$5$s$N8f;XE&(B)$B!#(B * wl.el (wl-plugged-mode): inhibit-read-only $B$N@_Dj$r:o=|!#(B (Shuhei KOBAYASHI $B$5$s$N8f;XE&(B) * wl-vars.el (wl-draft-reedit-hook): $B?75,(B hook$B!#(B * wl-draft.el (wl-draft-save, wl-draft-mimic-kill-buffer): $B?75,4X?t!#(B (wl-draft): $B4{$K;H$o$l$F$$$k%P%C%U%!L>$O;H$o$J$$$h$&$K$7$?!#(B (wl-draft-reedit): wl-mail-setup-hook $B$r(Brun-hook$B$;$:!"$+$o$j$K(B wl-draft-reedit-hook $B$r(B run-hook $B$9$k$h$&$K$7$?!#(B (okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA)$B$5$s$N8f;XE&(B)$B!#(B * wl-xmas.el, wl-mule.el (wl-draft-key-setup): C-xC-s $B$K(B wl-draft-save $B$r!"(BC-xk $B$K(B wl-draft-mimic-kill-buffer $B$r(B $B3d$jEv$F$?!#(B * wl-nemacs.el (wl-draft-overload-functions): $BF1>e!#(B 2000-01-09 TAKAHASHI Kaoru * wl-mule.el, wl-util.el: (require 'static) $B$r(B (eval-when-compile (require 'static)) $B$KJQ99!#(B * wl.el (wl-save): $B$N(B docstring $B$rDI2C!#(B 2000-01-08 Mito * wl-score.el (wl-score-guess-like-gnus): (when (stringp fld-name)..) $B$G3g$C$?!#(B 2000-01-08 Masahiro MURATA ($BB * wl-draft.el (wl-draft-config-info-operation): $B?75,4X?t!#(B (wl-draft-delete, wl-draft-save-and-exit, wl-draft-reedit): `wl-draft-config-info-operation' $B$r;H$&$h$&$K$7$?!#(B 2000-01-08 Yuuichi Teranishi * wl-demo.el (toplevel): bitmap $B$,%$%s%9%H!<%k$5$l$F$$$J$$>l9g$K(B $B%P%$%H%3%s%Q%$%k$G=P$k(B Warning $B$r8:$i$7$?!#(B (wl-demo-use-bitmap): $B?75,JQ?t!#(Bbitmap $B$N%G%b$rI=<($9$k$+$I$&$+$r;XDj!#(B $B%G%U%)%k%H$O(B t$B!#(B * WL-CFG: wl-demo-use-bitmap $B$r(B nil $B$K$9$kNc$rDI2C!#(B * wl-nemacs.el (toplevel): timezone $B$N%(%_%e%l!<%7%g%s$r;_$a$?(B (APEL 10 $B!A(B $B$rA0Ds(B)$B!#(B * wl-demo.el, wl-draft.el, wl-folder.el, wl-util.el, wl-message.el, wl-summary.el (toplevel): $BL$Dj5AJQ?t$O(B make-local-variable $B$GF@$i$l$k%7%s%\%k$KCM$r(B set $B$9$k$h$&$K$7$?!#(B (Shuhei KOBAYASHI $B$5$s$N8f=u8@(B) 2000-01-07 Daiki Ueno * wl-draft.el (wl-smtp-features, wl-smtp-parse-extension): $B=$@5!#(B 2000-01-07 Yuuichi Teranishi * wl-draft.el (wl-user-agent-compose): wl-draft $B$r(B interactive $B$K8F$V(B $B$h$&$K$7$?!#(B(Atsushi Tada $B$5$s$N8f;XE&(B) * Makefile (EMACS): $B%G%U%)%k%H$r(B emacs $B$K$7$?!#(B (XEMACS): $B?75,JQ?t!#(B (package, install-package): $(XEMACS) $B$r;H$&$h$&$K$7$?!#(B * 2.2.14 - "Layla" * wl-summary.el (wl-summary-mode): default-directory $B$r@_Dj$9$k$N$r(B $B$d$a$?!#(B * wl-vars.el (wl-tmp-dir): $B%G%U%)%k%H$r(B"~/tmp/" $B$H$7$?(B (WL-ML 3735 $B$N%9%l%C%I;2>H(B)$B!#(B 2000-01-06 Daiki Ueno * wl-draft.el (wl-smtp-features): $B?75,JQ?t!#(B (wl-smtp-extension-bind): $B?75,%^%/%m!#(B * wl-summary.el (wl-summary-mode-map): wl-summary-prev-page $B$N%-!<%P%$%s%I$r(B backspace $B$K$b3dEv$F$?!#(B 2000-01-06 Kentaro Yoshitomi * elmo-maildir.el (elmo-maildir-create-folder): $B%G%#%l%/%H%jL>$,(B "/" $B$G=*$k$H$-$K(B error $B$K$J$k$N$r=$@5!#(B 2000-01-06 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * wl-draft.el: smtp.el $BJQ?tL>$N(B authenticate $B$X$NJQ99$KBP1~!#(B 2000-01-06 Yuuichi Teranishi * wl-util.el (wl-load-profile): wl.el $B$+$i0\F0!#(B * COPYING: $B?75,%U%!%$%k(B (etc/copyright $B$+$i2~L>(B). * wl-vars.el (wl-smtp-connection-type): wl-smtp-use-tls $B$+$i2~L>!#(B * wl-draft.el (wl-draft-send-mail-with-smtp): smtp-connection-type $B$r(B wl-smtp-connection-type $B$G(B bind $B$9$k$h$&$K$7$?!#(B (wl-draft-queue-save-filename): fixed typo. * wl-vars.el (wl-cs-*): Nemacs $B8~$1$NDj5A$rJQ99!#(B * all files: $BCx:n8"I=<($N99?7!"(Bcheckdoc fix$B!#(B 2000-01-05 TAKAHASHI Kaoru * wl-ja.texi: $BCx:n8"I=<($HJ# * wl-score.el (wl-summary-score-update-all-lines): $B%9%3%"$GFI$s$@$3$H$K$9$k>l9g$K!"L$%-%c%C%7%e$H$9$k$h$&$K$7$?!#(B * elmo-util.el (elmo-imap4-get-spec): elmo-default-imap4-ssl $B$,(B t $B$N>l9g$KBP1~$7$F$$$J$+$C$?$N$r=$@5!#(B (Taro FUNAKI $B$5$s$h$j8fJs9p(B) * tm-wl.el (wl-draft-yank-current-message-entity): mime-viewer/following-method-alist $B$N=$@5$b$l$r=$@5!#(B (Taiji.Can@atesoft.advantest.co.jp $B$5$s$h$j8fJs9p(B) 2000-01-04 OKUNISHI -GTO- Fujikazu * wl-message.el (wl-message-decode): 'no-mime $B$N$H$-$K(B wl-cs-autoconv $B$G%G%3!<%I$9$k$h$&$K$7$?!#(B 1999-12-31 Kentaro Yoshitomi * elmo-maildir.el, elmo-util.el: Maildir $B%U%)%k%@$N:n@.!":o=|!"(B $B%3%T!<$XBP1~!#(B 1999-12-29 Yuuichi Teranishi * wl-draft.el (wl-draft): `wl-load-profile' $B$r8F$V$h$&$K$7$?!#(B (Masahiro MURATA ($BB $B$5$s$N8f;XE&(B) * elmo-imap4.el (elmo-imap4-make-number-set-list): $B?75,4X?t!#(B (elmo-imap4-msgdb-create): `elmo-imap4-make-number-set-list' $B$r;H$&$h$&$K$7$?!#(B (elmo-imap4-mark-set-on-msgs): $BF1>e!#(B 1999-12-11 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * wl-summary.el (wl-summary-get-sync-range): offline $B;~$K(B POP $B%U%)%k%@$KF~$k$?$S$K(B Unplugged $B$HJ86g$r(B $B8@$o$l$J$$$h$&$K$7$?!#(B 1999-12-28 Nishimoto Masaki * elmo-msgdb.el (elmo-msgdb-expand-path): $B%"!<%+%$%V%U%)%k%@$N%Q%9(B $BE83+$K<:GT$7$F$$$?$N$r=$@5!#(B 1999-12-28 Yuuichi Teranishi * 2.2.13 - "Keep The Faith" 1999-12-27 Yuuichi Teranishi * elmo-util.el (elmo-network-get-spec): $B?75,4X?t!#(B (elmo-*-get-spec): $B=q$-D>$7!"%f!<%6L>It$K(B '@' $B$r4^$a$i$l$k$h$&$K$7$?!#(B (okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) $B$5$s$N8f;XE&$K4p$E$/(B) * elmo-imap4.el (elmo-imap4-create-msgdb-from-overview-string): float $B$,07$($J$$(B Emacs $B$X$NBP1~!#(B * elmo-pop3.el (elmo-pop3-get-connection): $B0z?t$rJQ99!#(B * check-paren fix. 1999-12-21 Koga Masato * wl-draft.el (wl-draft-reedit): `wl-draft-use-frame' $B$,8z$/$h$&$K$7$?!#(B 1999-12-21 Yuuichi Teranishi * elmo-vars.el (elmo-imap4-use-modified-utf7): $B?75,JQ?t!#(B $B%G%U%)%k%H$O(B nil$B!#(B 1999-12-20 Yuuichi Teranishi * wl-mime.el, tm-wl.el (wl-mime-save-content): $B:G8e$K%;!<%V$7$?(B $B%G%#%l%/%H%j$r3P$($k$h$&$K$7$?!#(B * wl.el (wl-save): $B?75,%3%^%s%I!#8=:_$N%U%)%k%@>uBVEy$r%;!<%V$9$k!#(B (JINMEI Tatuya $B$5$s$h$j8fMWK>(B) * wl-folder.el (wl-folder-mode-map): "\M-s" $B$K(B `wl-save' $B$r%P%$%s%I!#(B * elmo-util.el (elmo-imap4-get-spec): `utf7-encode-string' $B$r(B $B;H$&$h$&$K$7$?!#(B * elmo-imap4.el (elmo-imap4-list-folders): `utf7-decode-string' $B$r;H$&$h$&$K$7$?!#(B * elmo/utf7.el: $B?75,%U%!%$%k!#(B 1999-12-20 Daiki Ueno * elmo-imap4.el (elmo-imap4-open-connection): starttls $BBP1~$N=$@5!#(B * wl-draft.el: featurep->boundp$B!#(B 1999-12-17 Yuuichi Teranishi * wl-vars.el (wl-search-mime-charset): $B?75,JQ?t!#(B * wl-summary.el (wl-summary-pick): `wl-search-mime-charset' $B$r(B $B;H$&$h$&$K$7$?!#(B 1999-12-16 TAKAHASHI Kaoru * WL-MK (wl-texinfo-format): $B8E$$(B texinfmt.el $B$r;H$C$F$$(B $B$k$H$-$K$O(B `@direntry' $B$r%(%_%e%l!<%7%g%s$9$k$h$&$K$7$?!#(B 1999-12-16 Yuuichi Teranishi * wl-draft.el (wl-draft-config-exec): $B%O%$%i%$%H$7$J$*$9$h$&$K$7$?!#(B (Motomichi Matsuzaki $B$5$s$N8f;XE&(B) * wl-summary.el (toplevel): `wl-summary-temp-mark-region' $B$N(B $B%-!<%P%$%s%I=g$rJQ$($?(B (okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) $B$5$s$N8f=u8@(B)$B!#(B 1999-12-16 okada@opaopa.org ($B2,ED(B $B7r0l(B / 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): $BL5BL$J=hM}$r:o=|!%(B (wl-summary-prefetch-region): wl-summary-message-uncached-marks $B$G(B $BH=CG$9$k$N$r$d$a!"(Belmo-cache-exists-p$B$r;H$&$h$&$K$7$?!#(B * wl-thread.el (wl-thread-get-children-msgs-uncached): $BF1>e!#(B 1999-12-14 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * pop, imap $B$N(B STARTTLS $B$G!"(Btls $B$r;HMQ$9$k$h$&$K;XDj$7$F$$$k$N$K!$(B $B%5!<%P$,5v2D$7$F$$$J$$>l9g$O!$(Berror $B$r=P$9$h$&$K$7$?!#(B 1999-12-14 TSUMURA Tomoaki * dot.wl: wl-default-folder $B$G$O(B ML-name $B$H(B ML-count $B$rI=<($7!"(B $B$=$l0J30$N(B folder $B$G$O(B ML-count $B$N$_I=<($9$kNc$rDI2C!#(B 1999-12-14 Yuuichi Teranishi * mmelmo-imap4-2.el (mmelmo-imap4-parse-bodystructure-string): $B@8(B JIS $B$N%U%!%$%kL>$,$"$C$?$j$9$k$H(B parse $B$K<:GT$9$k$N$r=$@5!#(B * wl-summary.el (wl-summary-copy): $B#22sL\$N%3%T!<;X<($,EPO?$5$l$J$$$N$r(B $B=$@5!#(B(Hiroshi Watanabe $B$5$s$h$j8fJs9p(B) 1999-12-12 Yuuichi Teranishi * wl-summary.el (wl-summary-goto-folder-subr): sticky $B$K$9$k(B $B%?%$%_%s%0$rJQ99(B (Masahiro MURATA ($BB $B$5$s$N8f;XE&(B)$B!#(B * wl-vars.el (wl-folder-sync-range-alist): $B%G%U%)%k%H$G%I%i%U%H$H(B $B%-%e!<$N%l%s%8$r(B "all" $B$H$7$?!#(B 1999-12-11 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * wl-summary.el (wl-summary-get-sync-range): offline $B;~$K(B POP $B%U%)%k%@$KF~$k$?$S$K(B Unplugged $B$HJ86g$r(B $B8@$o$l$J$$$h$&$K$7$?!#(B 1999-12-10 OKUNISHI -GTO- Fujikazu * elmo $B$K$"$k4X?t$r(B defalias $B$7$F$$$k(B wl $B$N4X?t$r(B elmo $B$N4X?t$KCV$-49$($?!#(B 1999-12-07 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * elmo-nntp.el: elmo-nntp-max-number-precedes-list-active $B$,(B t $B$+$D(B list-active $B$,Ds6!$5$l$F$$$J$$>l9g$N5sF0$r=$@5!#(B 1999-12-07 TAKAHASHI Kaoru * INSTALL.ja: $B=$@5!#(B * wl-summary.el (wl-summary-always-sticky-folder-p): $B?75,%^%/%m!#(B (wl-summary-goto-folder-subr): (wl-summary-always-sticky-folder-p) $B$r;H$&$h$&$K$7$?!#(B 1999-12-07 Akihiro MOTOKI * wl-vars.el (wl-summary-always-sticky-folder-list): $B?75,JQ?t!#(B * wl-summary.el (wl-summary-stick): Optional $B0z?t$r2C$($?!#(B (wl-summary-goto-folder-subr): wl-summary-always-sticky-folder-list $B$K%^%C%A$9$k%U%)%k%@$O<+F0E*$K(B Sticky $B$K$J$k$h$&$K$7$?!#(B 1999-12-07 Yuuichi Teranishi * INSTALL.ja: $BJ8;z%3!<%I$r(B ISO-2022-JP $B$K$7$?!#(B * wl-draft.el (wl-draft-send-mail-with-smtp): (default-)?case-fold-search $B$N%P%$%s%I0LCV$rJQ99!#(B (Atsushi Tada $B$5$s!"(B $BDE6b5WNQ(B $B$5$sB>$h$j8fJs9p(B) (wl-draft-send): with-current-buffer $B$r;H$o$J$$$h$&$K$7$?!#(B * 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 $B$,(B nil $B$N$H$-F0$+$J$+$C$?$N$r=$@5!#(B * utils/hmac/scram-md5.el, utils/hmac/hmac-util.el: $B:o=|!#(B * wl-summary.el (wl-summary-mark-as-unread): wrong-type-argument $B%(%i!<$,=P$k$N$r=$@5!#(B * wl-folder.el (wl-folder-empty-trash): $B%5%^%jA}?#8=>]$N=$@5$b$l!#(B (OKAZAKI Tetsurou $B$5$s$N8fJs9p(B) 1999-12-07 Masahiro MURATA ($BB * wl-draft.el (wl-draft-condig-exec): wl-draft-config-exec-flag $B$O(B wl-draft-config-alist $B$,E,MQ$5$l$?(B $B$H$-$N$_(B nil $B$K$9$k$h$&JQ99!#(B 1999-12-06 Shigeru OKUMURA * WL-ELS (HMAC-MODULES): $B99?7!#(B 1999-12-06 Tsunehiko Baba * INSTALL: $B?75,%U%!%$%k!#(B 1999-12-06 Yuuichi Teranishi * elmo-imap4.el (elmo-imap4-create-msgdb-from-overview-string): $B%U%#%k%?$,$&$^$/F0$+$J$$$N$r=$@5!#(B (Kazuyoshi Mii $B$5$s$h$j8fJs9p(B) * 2.2.11 - "Iris" * utils/hmac/lisp/*.el: Sync up with slim-1.13.4. * elmo-imap4.el (elmo-imap4-open-connection): cram-md5 $BG'>Z$G(B sasl-cram-md5 $B$r(B $B;H$&$h$&$K$7$?!#(B (toplevel): (require 'hmac-md5) $B$G$O$J$/!"(B(require 'sasl) $B$H$9$k(B $B$h$&$K$7$?!#$^$?!"(Beval-when-compile $B$r30$7$?!#(B 1999-12-05 Yuuichi Teranishi * wl-summary.el (wl-summary-mark-as-read): msgdb $B$KB8:_$7$J$$(B $B%a%C%;!<%8$K$O%^!<%/$rIU$1$J$$$h$&$K$7$?!#(B * wl-summary.el (wl-summary-pick): msgdb $BBP>]$N$H$-$K$R$H$D$b(B pick $B$G$-$J$+$C$?$H$-$K%a%C%;!<%8$r=P$9$h$&$K$7$?!#(B 1999-12-04 Yuuichi Teranishi * elmo-msgdb.el (elmo-msgdb-overview-get-parent-entity): $B0z?t$rJQ99!#(B * wl-vars.el (wl-smtp-posting-server): $B=i4|CM$r(B nil $B$H$7$?!#(B (okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) $B$5$s$N8f=u8@(B) * elmo-imap4.el (elmo-imap4-create-msgdb-from-overview-string): extra-field $BL>$r(B downcase $B$9$k$h$&$K$7$?!#(B (Takaaki MORIYAMA $B$5$s$h$j8f;XE&(B) * elmo-util.el (elmo-collect-field(-from-string)?): $B0z?t(B downcase-field-name $B$rA}$d$7$?!#(B 1999-12-03 TSUMURA Tomoaki * wl-folder.el (wl-folder-empty-trash): $B%5%^%jA}?#8=>]$N=$@5!#(B 1999-12-03 Nishimoto Masaki * wl-summary.el (wl-summary-default-from): Newsgroup $BL>$,I=<((B $B$5$l$J$+$C$?$N$r=$@5!#(B 1999-12-03 TAKAHASHI Kaoru * INSTALL.ja: $B?75,%U%!%$%k!#(B * draft $B:FJT=8;~$K!"(BNewsgroups: $B%X%C%@$,$"$l$P!"(BTo: $B$rIU2C$7$J$$$h(B $B$&$K$9$k=$@5$N%^!<%8$7K:$l$r=$@5!#(B 1999-12-03 Yuuichi Teranishi * elmo-util.el (elmo-mime-string): elmo-set-work-buf $B$G3g$k$h$&$K$7$?!#(B (Mikiya Tani $B$5$s$N8f;XE&(B) * 2.2.10 - "Human Touch" * etc/icons/wl-logo.xpm: Christmas version. * elmo-imap4.el (elmo-imap4-make-attributes-object): Nemacs $B$G(B read $B$,<:GT$7$F$7$^$&$N$KBP=h!#(B * elmo-dop.el (elmo-dop-list-folder): pipe $BBP1~K:$l$r=$@5!#(B (OKAZAKI Tetsurou $B$5$s$N8f;XE&(B) 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 $B$N%(%i!<$,=P$k$N$r=$@5!#(B * wl-mime.el, tm-wl.el: wl-draft-preview-message $B$N%-!<%P%$%s%I$rJQ99!#(B (Makoto.Nakagawa@jp.compaq.com ($BCf@n(B $B@?(B) $B$5$s$N8fJs9p$K4p$E$/(B) * utils/ssl.el: $B:G?7HG$KF~$l49$(!#(B (okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA)$B$5$s$N8f;XE&(B) * elmo-util.el (elmo-mime-string, elmo-decode-mime-charset-string): $B?75,4X?t!#(B * elmo-imap4.el: FETCH $B7k2L2r@O=hM}ItJ,$rBgI}$K=q$-49$($?!#(B 1999-12-02 Hironori Fukuchi * wl-xmas.el: (featurep 'dragdrop) $B$,(B nil $B$N$H$-$K!"(B wl-dnd-set-drop-target $B$,%(%i!<$rH/@8$9$k>l9g$,$"$k$N$r=$@5!#(B 1999-12-02 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * starttls.el $B$,$J$$$H%(%i!<$,=P$k$N$r=$@5!#(B 1999-12-01 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * smtp auth$B$N$H$3$m$G!$(Bwl-smtp-posting-user$B$,(B nil $B$G$b(B error $B$r=P$5$J$$$h$&$K$7$?!#(B * nntp$B%U%)%k%@$G%]!<%HHV9f$r;XDj$9$k$H%(%i!<$,=P$k$N$r=$@5(B 1999-11-27 Masahiro MURATA ($BB * wl-draft.el (wl-draft-reedit): interactive $B$G$J$$$N$K(B wl-mail-setup-hook $B$r8F$V$+$I$&$+$,(B (interactive-p) $B$GH=JL$5$l$F(B $B$$$?$N$r=$@5!#(B * New command: wl-fldmgr-delete. * Rename: wl-fldmgr-rename-group -> wl-fldmgr-rename. * New function: elmo-folder-creatable-p. * imap4 $B$G(B #mh $B%?%$%W$N%U%)%k%@$r:n$k$H$-!$I,$:%G%#%l%/%H%j$,:n(B $B@.$5$l$k$h$&$K$7$?!#(B * wl-folder-check-one-entity $B$GB8:_$7$J$$%U%)%k%@$r:n@.$9$k$h$&(B $B$K$7$?!#(B * New macro: wl-folder-clear-entity-info. 1999-11-25 TAKAHASHI Kaoru * wl-message.el (wl-message-narrow-to-page): "^L\n^L" $B$r4^$`%a%C%;!<(B $B%8$rFI$`$H$-$K(B `beginning-of-buffer' $B%(%i!<$,=P$J$$$h$&$K$7$?!#(B 1999-11-25 Yuuichi Teranishi * wl-summary-mode $B$N0z?t$r$J$/$7$?!#(B * wl-address.el (wl-address-petname-add-or-change): .addresses $B$N:G8e$N9T$K2~9T$,$J$$>l9g$KBP=h!#(B * elmo-imap4-[12].el (mmelmo-imap4-parse-bodystructure-entity): mime-parse-parameters-from-list $B$r;H$&$h$&$K$7$?!#(B 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 ($B2,ED(B $B7r0l(B / Kenichi OKADA) * wl-vars.el (wl-smtp-authenticate-type, wl-smtp-use-tls): $B?75,JQ?t!#(B * wl-draft.el (wl-draft-send-mail-with-smtp): SMTP $B$N(B TLS $BBP1~!#(B 1999-11-21 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * wl-summary-jump-to-msg-internal$B$,(B wl-summary-jump-to-msg-by-message-id-via-nntp$B$+$i8F$P$l$k$H$-$K!$(B scan-type$B$,(Bupdate$B$K$J$k$h$&$K$7$?!#(B 1999-11-22 Daiki Ueno * elmo-imap4.el, elmo-pop3.el: STARTTLS $BBP1~!#(B 1999-11-20 Masahiro MURATA ($BB * wl-draft.el (wl-draft-send-mail-with-smtp): connection $B$rD%$k;~$K(B process-connection-type $B$r(B nil $B$K94B+$7$?!#(B 1999-11-20 OKUNISHI -GTO- Fujikazu * elmo-util.el (elmo-open-network-stream): connection $B$rD%$k;~$K(B process-connection-type $B$r(B nil $B$K94B+$7$?!#(B 1999-11-20 Nishimoto Masaki * $B4{$K(Bimportant$B%^!<%/$,$D$$$F$$$k%a%C%;!<%8$K(B important$B$J%9%3%"$,$D$/$H%^!<%/$,>C$($F$7$^$&$N$r=$@5!#(B 1999-11-19 Hironori Fukuchi * tm-wl.el: fixed typo. 1999-11-18 Yasuo OKABE * $BI=<($7$F$$$k%a%C%;!<%8$,$J$$>uBV$G(B wl-draft-insert-message $B$r * wl-vars.el: $B?75,JQ?t(B wl-summary-showto-folder-regexp$B!#(B * wl-summary.el (wl-summary-default-from): my-wl-summary-from-func-petname $B$K$7$?!#(B (Masahiro MURATA ($BB $B$5$s$N8f=u8@(B) * wl-summary.el (wl-summary-simple-from): wl-summary-default-from $B$+$iL>A0JQ99!#(B 1999-11-17 Masahiro MURATA ($BB * wl-message.el (wl-message-get-buffer-create): sticky $B%a%C%;!<%8$rI=<($9$k$H$-$K%(%i!<$K$J$k$N$r=$@5$7$?!#(B 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 $B$,$J$$$H$-$K(B t $B$rJV5Q$9$k$h$&$K$7$?!#(B * 2.2.9 - "Gonna Make You Sweat" 1999-11-15 Katsumi Yamaoka * wl-util.el (wl-unique-id): current-time $B$H(B timezone $B$r;H$o$J$$HG!#(B 1999-11-14 Masahiro MURATA ($BB * wl-draft.el, wl-summary.el: reply $B;~$O(B wl-draft-reply $B$r(B t $B$K(B, forward $B;~$O(B wl-draft-forward $B$r(B t $B$K@_Dj$9$k$h$&$K$7$?!#(B * wl-folder.el, wl.el: wl-folder $B$G%U%)%k%@%j%9%H$r@8@.$7$?$H$-$N$_!$(B wl-make-plugged-alist $B$r8F$V$h$&$K$7$?!#(B 1999-11-14 OKAZAKI Tetsurou * elmo-pipe.el (elmo-pipe-use-cache-p): $B * wl-nemacs.el: current-time $B * 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' $B$,4X?t(B $B$@$C$?$i(B funcall $B$9$k$h$&$K$7$?(B; Resent-* $B%U%#!<%k%I$N07$$$r(B `smtp' $B$KG$$;$k$h$&$K$7$?!#(B 1999-11-12 Yuuichi Teranishi * wl-draft (wl-draft-get-fcc-list): FCC $B$K;XDj$5$l$?%U%)%k%@$,(B $BB8:_$7$J$$$H$-$K%(%i!<$H$;$:!":n@.$9$k$+$I$&$+$-$/$h$&$K$7$?!#(B * Rename: wl-summary-confirm-folder-existence -> wl-folder-confirm-existence$B!#(B (Masahiro MURATA ($BB $B$5$s$N8f=u8@$K(B $B4p$E$/(B) * Rename: wl-mime-edit-preview-message-hook -> wl-draft-preview-message-hook * elmo-nntp.el (elmo-nntp-string-to-vector): $B4X?t8F$S=P$7$K$9$k$N$r(B $B;_$a$?!#(B * elmo-util.el (elmo-tokenize-string): $BGQ;_!#(Bsplit-string $B$GBeMQ!#(B * wl-highlight.el: $B?75,(B face$B!"(Bwl-highlight-logo-face$B!#%m%4MQ(B face$B!#(B 1999-11-11 Katsumi Yamaoka * wl-demo.el: bitmap-mule $BBP1~!#(B * wl-logo.xbm: $B?75,%U%!%$%k!#(B * elmo-nntp.el (elmo-nntp-string-to-vector): vector $B$ND9$5$rL5@)8B(B $B$K$7$?!#(B (elmo-nntp-parse-overview-string): `elmo-nntp-string-to-vector' $B$K(B $BBh#20z?t$rM?$($k$N$r$d$a$?!#(B 1999-11-11 Yuuichi Teranishi * elmo-imap4.el: Message-ID $B$K(B '%' $B$,4^$^$l$F$$$k$H8!:w$K<:GT$9$k$N(B $B$r=$@5!#(B (OKAZAKI Tetsurou $B$5$s$N8f=u8@(B) * wl-message.el, mmelmo-[12].el: read-only $B$N@_Dj$r@0M}!#(B * wl-draft-save-and-hide -> wl-draft-save-and-exit $B$H$7!"(B C-c C-z $B$K%P%$%s%I$7$?!#(B 1999-11-11 Yasuo OKABE * wl-summary.el (wl-summary-temp-mark-forward): $B%^!<%/$5$l$F$$$k%a%C%;!<%8$,J#?t$J$i$PA4BN$r(B multipart/digest $B$G0O$`(B $B$h$&$K$7$?!#(B 1999-11-11 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * $B?75,JQ?t(B wl-nntp-posting-port, wl-nntp-posting-ssl wl-nntp-posting-{user,server,port,ssl}$B$H(B elmo-default-nntp-{user,server,port,ssl} $B$rBP1~$5$;$k$h$&$K$7$?!#(B * wl-nntp-posting-* $B$N=i4|@_Dj$O(B nil $B$H$7!"(B nil $B$N$^$^$J$i(B elmo-default-nntp-* $B$rMxMQ$9$k$h$&$K$7$?!#(B * utils/bbdb-wl.el: (setq bbdb-use-pop-up nil) $B$N>l9g!"(B $B%5%^%j$G(B ':' $B$r2!$7$?8e(B q $B$H2!$9$H%(%i!<$,=P$k$N$r=$@5!#(B * wl-draft.el: $B?75,4X?t(B wl-draft-save-and-hide$B!#(B 1999-11-10 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * wl-demo$B$G!$(Bwl-logo.xpm$B$NI=<(0LCV$r$A$c$s$H7W;;$9$k$h$&$K$7$?!#(B 1999-11-10 Tsutomu Okada ($B2,ED(B $BJY(B) * wl-message.el (wl-message-refer-article-or-url): $B%a%C%;!<%8%P%C%U%!$G(B mouse-button-2 $B$r2!$7$F$b%+!<%=%k$,(B $B%a%C%;!<%8%P%C%U%!$K0\F0$7$J$$$h$&$K$7$?!#(B 1999-11-10 Yuuichi Teranishi * wl-summary.el (wl-summary-set-message-buffer-or-redisplay): Sticky Message $B$,$"$k$H%*%j%8%J%k%P%C%U%!$,l9g$,$"$k$N$r=$@5!#(B(Mito $B$5$s$h$j8fJs9p(B) * wl-util.el (wl-string): elmo-string $B$X$N(B alias $B$H$7$?!#(B * elmo-util.el (elmo-string): $B?75,4X?t!#(B * $B?75,JQ?t(B wl-smtp-posting-port$B!#(B * wl-summary-resend-bounced-mail $B$r(B "\eE" $B$K%P%$%s%I!#(B 1999-11-10 OKAZAKI Tetsurou * WL-ELS $B$N(B typo $B$N=$@5$b$l$N=$@5!#(B 1999-11-10 kurati@bigfoot.com * refile $B$G%U%)%k%@:n@.$7$?$H$-$K%U%)%k%@L>Jd408uJd$K2C$o$k$h$&$K$7$?!#(B * FCC: $B$K?75,%U%)%k%@$r;XDj$7$?;~$K:n@.$9$k$+J9$/$h$&$K$7$?!#(B * auto-refile $B$N$H$-!"B8:_$7$J$$%U%)%k%@$,$"$C$?;~$K:n@.$9$k$+J9$/!#(B 1999-11-10 Yasuo OKABE * wl-summary.el (wl-summary-resend-message, wl-summary-resend-bounced-mail): $B?75,%3%^%s%I!#(B * wl-draft.el (wl-draft-dispatch-message): dispatch $B$5$l$?(B $B%a%C%;!<%8$,(B Resent-to $B%X%C%@$r4^$s$G$$$?>l9g$O(B Newsgroups $B%X%C%@(B $B$r;}$C$F$$$F$b%K%e!<%9$K$OAw$i$J$$!#(B 1999-11-09 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * wl-summary.el (wl-summary-jump-to-msg-internal): $B5-;v$,(B $BI=<($5$l$J$$>l9g$,$"$k$N$r=$@5!#(B * wl-summary.el (wl-summary-jump-to-msg-by-message-id-via-nntp): $B0\F0@h$N%K%e!<%9%0%k!<%W$N8uJd$,J#?t$"$k$H$-$K(B wl-folder-newsgroups-hashtb $B$K4^$^$l$k$b$N$rM%@h$9$k$h$&$K$7$?!#(B 1999-11-09 Yuuichi Teranishi * 2.2.8 - "Free As A Bird" 1999-11-08 Yuuichi Teranishi * wl-draft.el (wl-draft-send): $BAw?.8e!"(BC-cC-s $B$,(B insert-signature $B$K(B $B$J$C$F$7$^$&$N$r2sHr!#(B(Akihiro MOTOKI $B$5$s(B $B$h$j8fJs9p(B) * WL-MK: Nemacs $B$G$O(B (fset 'file-executable-p 'file-exists-p) $B$H$7$?!#(B * WL-MK, WL-CFG: WL_PREFIX $B$H(B ELMO_PREFIX $B$N%G%U%)%k%H$r(B "wl" $B$H$7$?!#(B * $B?75,JQ?t(B wl-user-mail-address-list$B!#(B $B%f!<%6$N%a!<%k%"%I%l%9$,J#?t$"$k$H$-$K<+J,$+$I$&$+$NH=Dj$KMQ$$$i$l$k!#(B * $B?75,4X?t(B wl-address-user-mail-address-p wl-user-mail-address-list $B$H(B wl-from $B$r;H$C$F<+J,$N%"%I%l%9$+$I$&$+(B $BH=JL$9$k!#(B * wl-summary.el (wl-summary-cancel-message, wl-summary-supersedes-message): wl-address-user-mail-address-p $B$r;H$C$F%"%I%l%9H=Dj$9$k$h$&$K$7$?!#(B (okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) $B$5$s$NJQ99$K4p$E$/(B) * wl-refile.el (wl-refile-learn, wl-refile-guess-by-history): $BF1>e!#(B * wl-draft.el (wl-draft-make-mail-followup-to, wl-draft-reply wl-draft-delete-myself-from-cc): $BF1>e!#(B * elmo-filter.el (elmo-filter-list-folder-unread, elmo-filter-list-folder-important): $B%U%#%k%?=hM}$,4V0c$C$F$$$?(B $B$N$r=$@5!#(B(Kazuyoshi Mii $B$5$s$h$j8fJs9p(B) 1999-11-08 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * POP-before-SMTP $B4XO"JQ?t$N=i4|2=K!$rJQ99!#(B 1999-11-07 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * elmo-nntp.el: list active $B$,<:GT$7$?$i!$(Blist $B$r * wl-draft-prepared-confi-alist $B$rGQ;_$7!$(B wl-draft-config-alist $B$HE}9g$7$?!#(B * wl-template-select $B$r5$9$k$h(B $B$&$K$7$?!#(B * Fcc $B%U%)%k%@$N=hM}$rAw?.$,@.8y$7$?;~$K9T$&$h$&$K$7$?!#(B * wl-draft-queue-save-variables $B$NJQ?t$r(B user-mail-address $B$+$i(B wl-envelope-from $B$KJQ99$7$?!#(B * wl-draft-insert-from-field $B$K$*$$$F!$(Buser-mail-address $B$,(B nil $B$N$H$-$K%(%i!<$K$J$k$N$r=$@5$7$?!#(B 1999-11-06 Tetsuya Uemura * describe-mode $B$G%b!<%I%^%C%W$,I=<($5$l$k$h$&$K$7$?!#(B 1999-11-06 TAKAHASHI Kaoru * wl-folder.el (wl-folder-mode-map): wl-fldmgr-copy-region $B$N%-!<%P%$%s%I$rJQ$($?!#(B 1999-11-06 Hironori Fukuchi * wl-summary.el (wl-summary-stick): $B3g8L$N0LCV$,$:$l$F$$$?$N$r=$@5!#(B 1999-11-06 Yasuo OKABE * utils/wl-user-agent.el: sendmail-user-agent $B$NF0:n$K9g$o$;$?!#(B 1999-11-06 sen_ml@eccosys.com * utils/wl-user-agent.el: 0.5. 1999-11-05 Yuuichi Teranishi * elmo-imap4.el: $B%=!<%9$r$+$J$j@0M}$7$?!#(B * elmo-imap4.el: $B?75,JQ?t(B elmo-imap4-debug$B!#(B Non-nil $B$J$i(B "*IMAP4 DEBUG*" $B%P%C%U%!$K%G%P%C%0>pJs$r=PNO$9$k!#(B * elmo-imap4.el, elmo-pop3.el, elmo-nntp.el: $B%a%C%;!<%8K\BNFI$_=P$7;~$N%3%T!<2s?t$r:o8:!#(B * elmo-imap4.el: $B%3%^%s%I$NJVEz$,:G8e$^$GF@$i$l$k$^$G%m%C%/$9$k$h$&$K(B $B$7$?!#(B * wl-summary.el: wl-refile-rule-alist $B$,(B nil $B$@$H%*!<%H%j%U%!%$%k$,(B $B%(%i!<$K$J$k$N$r=$@5!#(B * WL-MK: install-package $B$G(B info $B$,%$%s%9%H!<%k$5$l$J$$$N$r=$@5!#(B ("MATSUBAYASHI 'Shaolin' Kohji" $B$5$s(B $B$h$j8fJs9p(B) * elmo-cache.el (elmo-cache-search): $BItJ,%-%c%C%7%e$N8!:w$KBP1~(B $B$7$F$$$J$+$C$?$N$r=$@5(B (Yasuo OKABE $B$5$s$N8f;XE&(B)$B!#(B 1999-11-04 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * POP-before-SMTP $B$N@0M}$H3HD%!#(B * $B?75,JQ?t(B 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$B!#(B * elmo-pop-before-smtp-* -> wl-pop-before-smtp-* 1999-11-04 Yuuichi Teranishi * wl-mime.el (wl-mime-edit-preview-message): $B?75,(B hook: wl-mime-edit-preview-message-hook$B!#(B * elmo-util.el: $B%P%$%H%3%s%Q%$%i$N=P$9(B Warning $B$r:o8:$7$?!#(B * wl-summary.el (wl-summary-sync-marks): $B%^!<%/F14|=hM}$rBgI}$K9bB.2=!#(B * elmo-pipe.el (elmo-pipe-max-of-folder): $BIQHK$K:o=|$5$l$k(B IMAP4 $B%U%)%k%@$G$OL$FI?t$,$*$+$7$/$J$k$N$r=$@5!#(B (Toshihiko Kodama ($B>.6L(B $BMxI'(B) $B$5$s$N8fJs9p$K4p$E$/(B) 1999-11-03 Yuuichi Teranishi * 2.2.7 - "Escapade" * WL-MK: install-info $B$9$k$H(B INFODIR $B$N%a%C%;!<%8$,$*$+$7$/$J$k$N(B $B$r=$@5!#(B * $B5/F0$7$F:G=i$K(B Folder $B%b!<%I$+$i(B prefetch $B$9$k$H%(%i!<$,H/@8$9$k(B $B$N$r=$@5(B ($B2,ED(B $B7r0l(B (Kenichi OKADA) $B$5$s$h$j8fJs9p(B)$B!#(B * mime-elmo-entity $B%/%i%9$r(B mime-buffer-entity $B%/%i%9$N(B $B%5%V%/%i%9$H$7!"B>$N(B MUA $B$K1F6A$,5Z$P$J$$$h$&$K$7$?!#(B * $BJD$8$?%9%l%C%I$K%a%C%;!<%8$,DI2C$5$l$?$H$-$KHV9fItJ,$,(B $B%O%$%i%$%H$5$l$J$+$C$?$N$r=$@5!#(B * pipe $B$KBP1~$7K:$l$F$$$?ItJ,$rBP1~$5$;$?!#(B 1999-11-03 Masahiro MURATA ($BB * $B%U%)%k%@L>$NJd40$J$I$G!$(Bfolder petname $B$r;HMQ$9$k$h$&$K$7$?!#(B * wl-force-fetch-folders $B$,(B non-nil $B$N>l9g!$%"%/%;%9%0%k!<%W$,(B unplugged $B$@$H3+$1$J$/$J$k$N$r=$@5$7$?!#(B * $B%U%)%k%@%b!<%I$N:G2<9T$G(B wl-fldmgr-set-petname $B$,=PMh$J$$$h$&(B $B$K$7$?!#(B * wl-plugged-mode $B$GJQ99$7$J$+$C$?>l9g$O!$(Bwl-toggle-plugged $B$r8F(B $B$P$J$$$h$&$K$7$?!#(B * wl-exit $B$H(B wl-folder-suspend $B;~$N%P%C%U%!>C5n$r@0M}$7$?!#(B * wl-folder.el: $B0lIt$r4X?t(B wl-folder-buffer-group-p $B$GCV$-49$($?!#(B * wl-summary.el: $B0lIt$r4X?t(B wl-summary-entity-info-msg $B$GCV$-49(B $B$($?!#(B * wl-reset-plugged-alist $B$N%G%U%)%k%HCM$r(B t $B$KJQ99$7$?!#(B * wl-plugged-mode $B$G(B plugged $B>uBV$rJQ99$7$F$bA4It%j%;%C%H$5$l$F(B $B$7$^$&$N$r=$@5$7$?!#(B 1999-11-03 TAKAHASHI Kaoru * wl-summary.el (wl-summary-reedit): $B%K%e!<%95-;v$N:FJT(B $B=8;~$K!"(BTo: $B%X%C%@$r2C$($J$$$h$&$K$7$?!#(B 1999-11-03 $B2,ED(B $B7r0l(B (Kenichi OKADA) * wl-summary-write-current-newsgroup $B$G(B elmo-folder-get-primitive-folder-list$B$r;H$&$h$&$K$7$?!#(B * $B?75,%3%^%s%I(B wl-folder-write-current-newsgroup * elmo-folder-get-primitive-folder-list $B$H(B elmo-folder-get-primitive-spec-list $B$r(B pipe $B%U%)%k%@$KBP1~$5$;$?!%(B * elmo-pop3-flush-connection$B$9$kA0$KEEOC$r@Z$k$H!$(B wl-toggle-plugged $B$G$-$J$/$J$k$N$r=$@5!#(B 1999-11-03 sike@ic.netlaputa.ne.jp * Message-Id $B$NESCf$G2~9T$,$"$C$F$bBg>fIW$J$h$&$K$7$?!#(B 1999-11-02 Yuuichi Teranishi * 2.2.6 - "Diamonds And Pearls" * $B5/F0;~$K(B plug status $B$r(B wl-plugged $B$K9g$o$;$k$h$&$K$7$?!#(B (Yasuo OKABE $B$5$s$N8f;XE&(B) * WL-MK: $BBgI}$K=q$-49$($?!#(B * 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 * $B%U%)%k%@%"%$%3%s=i4|2=4X?t$r4JN,2=!#(B * elmo-pipe: New module. 1999-11-01 OKAZAKI Tetsurou * WL-ELS $B$N(B typo $B=$@5!#(B * wl-user-agent.el $B$H(B wl-mailto.el $B$N(B byte-compile $B;~$K(B "Cannot open load file wl" $B$N%(%i!<$,=P$k$N$r=$@5!#(B 1999-10-29 Takaaki MORIYAMA * wl-exit $B$G(B kill-emacs-hook $B$+$i(B wl-save-status $B$r>C$9$h$&$K$7$?!#(B 1999-10-28 OKUNISHI -GTO- Fujikazu * new file: WL-ELS$B!#(B * WL-MK: install.el $B$r;H$&$h$&BgI}$K=q$-49$($?!#(B 1999-10-28 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * wl-ja.texi: wl-template-select $B$N%-!<%P%$%s%I$,4V0c$C$F$$$?$N$r(B $B=$@5!#(B * INN 2.3 $B$G$bL$FI?t$,0lCW$9$k$h$&$K$7$?!#(B 1999-10-28 TAKAHASHI Kaoru ($B9b66(B $B0j(B) * wl-ja.texi: $BBgI}$K=$@5!#(B 1999-10-27 Yuuichi Teranishi * Folder $B%b!<%I$G$b(B 'Z' $B$K(B wl-status-update $B$r%P%$%s%I$7$?!#(B * Fix: wl-summary-goto-last-displayed-msg $B#1$D$7$+I=<($7$?$3$H$,$J$$;~$KA0$N%a%C%;!<%8$KLa$l$J$+$C$?$N$r(B $B=$@5!#(B 1999-10-26 kurati * FCC: $B$GJd40$,8z$/$h$&$K$7$?!#(B 1999-10-26 Yuuichi Teranishi * Unplugged $B;~$G$b=EMW%^!<%/$NF14|$O$9$k$h$&$K$7$?!#(B * auto-refile $B$NA0$KB8:_$9$k$+$I$&$+%A%'%C%/$9$k$h$&$K$7$?!#(B (Toshihiko Kodama ($B>.6L(B $BMxI'(B) $B$5$s$N8fMWK>$K4p$E$/(B) * Fix: score $B$G(B expunge $B$7$?%a%C%;!<%8$O(B IMAP4 $B%5!<%P>e$G$b(B $BFI$s$@$3$H$K$9$k$3$H$K$7$?!#(B 1999-10-22 OKAZAKI Tetsurou * $B%5%^%j%P%C%U%!(B($B%9%l%C%I%b!<%I(B)$B$G%+!<%=%k$,9TF,$K$J$$$H$-$K(B $B%9%l%C%I$KBP$9$k(B mark $BA`:n$r$9$k$HF0:n$,JQ$K$J$k$N$r=$@5!#(B * wl-thread-refile $B$G(B refile $B@h$K(B refile $B85$HF1$8%U%)%k%@$r(B ($B4V0c$C$F(B)$B;XDj$7$F%(%i!<$H$J$C$?$H$-$K%+!<%=%k$r0\F0$7$J$$MM$K$7$?!#(B * wl-summary-jump-to-parent-message $B$G(B message $B$N8!:w$,<:GT$7$?;~$N(B $B%a%C%;!<%8$rJQ$($?!#(B * wl-summary-exec-region $B$G9TC10L$G$J$$(B region $B$r;XDj$7$?;~$N(B region $B$NJd@5J}K!$,D>4QE*$G$J$+$C$?$N$rJQ99$7$?!#(B 1999-10-25 Masahiro MURATA ($BB * fldmgr: $B%0%k!<%W%U%)%k%@$rDI2C$9$k$H%(%i!<$K$J$k$N$r=$@5$7$?!#(B * wl-defface $B$N@_Dj$r(B static $B$K$7$?!#(B * wl-folder-buffer-search-entity, wl-folder-folder-name $B$G(B $BL$FI?t$J$IITL@$N%U%)%k%@$K$b%^%C%A$9$k$h$&$K$7$?!#(B * wl-summary-redisplay-no-mime $B$G$b!$(Bwl-summary-buffer-disp-msg $B$H(B wl-current-summary-buffer $B$r@_Dj$9$k$h$&$K$7$?!#(B 1999-10-25 Yuuichi Teranishi * $B5/F0;~$K%I%a%$%sL>$,@5$7$$$+%A%'%C%/$9$k$h$&$K$7$?!#(B * $B?75,JQ?t(B wl-local-domain$B!#(BFQDN $B$rJV$5$J$$%7%9%F%`MQ$N%I%a%$%sL>(B $B$r@_Dj!#(B * $B%U%)%k%@%b!<%I$N2#%9%/%m!<%k%P!<$r>C$7$?!#(B ("MATSUBAYASHI 'Shaolin' Kohji" $B$N(B $B8fJs9p$K4p$E$/(B) * $B?75,4X?t(B wl-mime-edit-preview-message$B!#%W%l%S%e!<$N?'$D$1!#(B * unplugged $B$+$D!"%-%c%C%7%e$5$l$?L$FI$,$J$$$H$-!"(B $B%+!<%=%k$r%"%/%;%9$G$-$k:G8e$N%a%C%;!<%8$K9g$o$;$k$h$&$K$7$?!#(B * WL-CFG $B$N(B utils $B$N;XDj$N;EJ}$,$^$A$,$C$F$$$?$N$r=$@5!#(B (Taiji.Can@atesoft.advantest.co.jp $B$5$s$N8f;XE&(B) * make info $B$K<:GT$9$k$N$r=$@5!#(B (Kazufumi Hayasaka $B$5$s$N8f;XE&(B) * 2.2.5 - "Come Undone" 1999-10-24 Mikio Nakajima * double negative $B$r(B simplify$B!#(B 1999-10-24 Masahiro MURATA ($BB * FCC $B$,(B unplugged folder $B$J$i(B dop $B%-%e!<$KDI2C$9$k$h$&$K$7$?!#(B * elmo-dop-queue $B$K(B "append-operations" $B$rDI2C$7$?!#(B * wl-summary-flush-pending-append-operations $B$K$*$$$F4{FI%a%C%;!<(B $B%8$r0z$-7Q$0$h$&$K$7$?!#(B 1999-10-24 Yuuichi Teranishi * WL-CFG $B$H$7$F$=$l$C$]$$$N$rMQ0U$7$F$_$?!#(B * $B%*%U%i%$%sAw?.$G(B IMAP4 $B%U%)%k%@$X$N(B FCC $B$,L5;k$5$l$k$N$r=$@5!#(B (Masafumi NAKANE $B$5$s$h$j8fJs9p(B) * Emacs $B$H(B XEmacs $B$G(B refile-alist $B$r6&M-$G$-$J$+$C$?$N$r=$@5!#(B (Takuo KITAME / $BKLL\BsO:(B $B$5$s$h$j8fJs9p(B) * wl-ja.texi: tm, semi $B$NG[I[85$r=$@5!#(B * Folder $B%b!<%I$GJL%5!<%P$GF1$8L>A0$N(B IMAP4 $B%U%)%k%@$,$"$C$?$H$-$K!"(B $BJL$N%U%)%k%@$NL$FI?t$,=q$-JQ$o$C$F$7$^$&$3$H$,$"$k$N$r=$@5!#(B (Kazuyoshi Mii $B$5$s$h$j8fJs9p(B) 1999-10-23 $B2,ED(B $B7r0l(B (Kenichi OKADA) * elmo-dop-merge-funcs $B$K$J$$A`:n$r!$ * port $B$N(B label $B$r<+F0E*$K:n@.$9$k$h$&$K$7$?!#(B * dop queue $B$NI=<($r>/$7$@$1>\:Y$K$7$?!#(B * elmo-dop-queue-merge $B$G(B elmo-dop-queue $B$,(B nil $B$K$J$k$3$H$,$"$k$N(B $B$r=$@5$7$?!#(B 1999-10-23 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * elmo-prefetch-msgs $B$G!$=hM}$N?J$_$0$"$$$r%+%&%s%H$9$k$h$&$K$7$?!%(B 1999-10-23 Yuuichi Teranishi * wl-mime-save-content $B$r(B SEMI $B$KEPO?$9$k$H$-$K(B Wanderlust $B@lMQ(B $B%a%=%C%I$H$9$k$h$&$K$7$?!#(B * FLIM-1.12 $B7O$G(B partial $B$N%^!<%8$K<:GT$9$k$N$r=$@5!#(B * WL-MK: $BBgI}$K=q$-D>$7$?!#(B 1999-10-22 TAKAHASHI Kaoru * Rename: wl-score-edit-exit-function -> wl-score-edit-exit-func 1999-10-22 Takuo KITAME / $BKLL\BsO:(B * etc/ja.Emacs: $B$$$/$D$+CM$,=EJ#$7$F$$$?$N$r=$@5!#(B 1999-10-22 $B2,ED(B $B7r0l(B (Kenichi OKADA) * [wl-ja.texi] wl-summary-save-* wl-summary-jump-to-msg-by-message-id-via-nntp $B%*%U%i%$%s(Bprefetch wl-folder-jump-to-current-entity cram-md5,SSL $B$N@bL@$rDI2C!#(B 1999-10-22 Masahiro MURATA ($BB * XEmacs built-in $B$N(B md5 $B$r8F$V$H$-$N(B CODING $B$r(B 'binary $B$K$7$?!#(B * sticky summary $B$+$i(B "g" $B$GJL$N%U%)%k%@$K0\F0$9$k$H!$(B temp $B%^!<%/$J$I$,>C$($k$K$b4X$o$i$:(B face $B$,85$KLa$i$J$$$N$r=$@5!#(B * $B?75,JQ?t(B wl-prog-uudecode-no-stdout-option$B!#(BNon-nil $B$J$i(B $B;XDj$5$l$?%U%!%$%kL>$G%;!<%V$9$k$h$&$K$7$?!#(B 1999-10-21 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * $B%*%U%i%$%s=hM}%-%e!<$N%^!<%8=hM}!#(B 1999-10-21 Yuuichi Teranishi * wl-address-header-extract-address $B$G(B std11.el $B$rMxMQ$7$J$$$h$&$K(B $B$7$?!#(B 1999-10-20 Masahiro MURATA ($BB * wl-reset-plugged-alist $B$,(B nil $B$J$i%5!<%P!&%]!<%HJL$N%W%i%0>uBV$r(B $B=i4|2=$7$J$$$h$&$K$7$?!#(B 1999-10-20 Yuuichi Teranishi * Emacs 20.2 $B$G$O!"(BFolder $B%b!<%I=i4|2=;~$K(B buffer-read-only $B$N%(%i!<$,H/@8$9$k$N$r=$@5!#(B (Yasuhiro Ohta $B$5$s$h$j8fJs9p!"(B TSUMURA Tomoaki $B$5$s$h$j8f=u8@(B) * XEmacs $B$G(B scrollbar $B$H(B toolbar $B$N%A%'%C%/$r$9$k$h$&$K$7$?!#(B (Shigeru OKUMURA $B$5$s$h$j8f=u8@(B) 1999-10-20 $B2,ED(B $B7r0l(B (Kenichi OKADA) * $BIT@5$J%X%C%@$N%a!<%k$r%j%U%!%$%k$7$h$&$H$9$k$H%(%i!<$,H/@8$9$k$N$r(B $B=$@5!#(B * $B%"%/%;%9%0%k!<%W$r:G=i$K3+$$$?$H$-$KFbMF$,8=$l$J$/$J$C$F$$$?(B $B$N$r=$@5!#(B 1999-10-19 Yuuichi Teranishi * Folder $B%b!<%I$N(B 'E' $B$G(B wl-folder-toggle-disp-summary $B$,%(%i!<(B $B$rH/@8$9$k$N$r=$@5!#(B (Shigeru OKUMURA $B$5$s$N8fJs9p(B) * timezone $B$N(B y2k $BBP:v$G(B eval-after-load $B$r;H$o$J$$$h$&$K$7$?!#(B * 2.2.4 - "Black Or White" 1999-10-19 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * wl-fetch-confirm-threshold$B$r1[$($k%a%C%;!<%8$r(B prefetch$B$7$h$&$H$7$?$H$-$K!"(B'n'$B$r2!$7$F%-%c%s%;%k$7$F$b(B $B%^!<%/$,6u$K$J$C$F$7$^$&%P%0$N=$@5!#(B * Offline Prefetch$B!#(B 1999-10-18 Yuuichi Teranishi * $B%U%)%k%@%b!<%I$N:G8e$N9T$G(B 'm f' $B$G$-$J$$$h$&$K$7$?!#(B * $B%P%$%H%3%s%Q%$%k;~$N(B Warning $B$r8:$i$7$?!#(B * hmac $B%Q%C%1!<%8$H(B ssl.el $B$r(B utils/ $B$K4^$a$F$_$?!#(B (WL-CFG $B$G(B wl-install-hmac $B$,(B t $B$J$i%$%s%9%H!<%k$9$k$h$&$K$7$?!#(B) * FLIM-1.12 $B$G$bF0$/$h$&$K$7$?!#(B * Unplugged $B;~$K(B IMAP4 $B%U%)%k%@$K0\F0$9$k$H%(%i!<$,=P$k$N$r=$@5!%(B * $B%5%^%j99?7;~!"(Bwl-summary-update-confirm-threshold $B$h$j$b99?7?t$,(B $BB?$$$J$i$P!"0lItJ,$@$199?7$K$9$k$+$I$&$+!" * expire $B$,(B number-or-marker-p error $B$rH/@8$9$k>l9g$,$"$k$N$r=$@5!#(B * filter $B@8@.;~$K(B tocc $B$GJd40$G$-$k$h$&$K$7$?!#(B * $B%U%)%k%@%b!<%I$G$N(B filter $B$N:n$jJ}$rJQ99!#(B 1999-10-15 Yuuichi Teranishi * IMAP4 $B%U%)%k%@$NL$FI?t$,@5$7$/H?1G$5$l$k$h$&!$(B elmo-imap4-server-diff $B;~$K!"(Belmo-imap4-commit $B$9$k$h$&$K$7$?!#(B * $B?75,4X?t(B elmo-commit$B!#%5!<%P$N>uBV$r%"%C%W%G!<%H$5$;$k!#(B * wl-folder-check-one-entity $B$,L5BL$K%U%)%k%@$NB8:_$r%A%'%C%/$7$F(B $B$$$?$N$r=$@5!#(B * 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 $B$G(B wl-local-variable-p $BB>$,F0$+$J$$$N$r=$@5!#(B 1999-10-14 Yuuichi Teranishi * $B%-%c%C%7%e$,$"$k$H$$$/$iFI$s$G$bL$FI%^!<%/$,>C$($J$/$J$C$F$7$^$&$N(B $B$r=$@5!#(B (Taiji.Can@atesoft.advantest.co.jp $B$5$s$N8f;XE&(B) * wl-address-header-extract-address $B$G(B std11.el $B$rMxMQ$9$k$h$&$K$7$?!#(B 1999-10-14 Masafumi NAKANE * Fixed Typo: exit-> exist. 1999-10-13 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * unplugged.xpm: $B@V$rF~$l$?!#(B 1999-10-13 OKAZAKI Tetsurou * elmo-filter-get-spec $B$N;EMMJQ99$K4X78$9$k=$@51L$l$N=$@51L$l(B $B$r=$@5(B (elmo-folder-diff)$B!#(B 1999-10-13 Masahiro MURATA ($BB * wl-plugged-mode $B$N%&%#%s%I%&:n@.=hM}$NIi2Y$r7Z$/$7$?!#(B * wl-draft-raw-send $B$G(B wl-draft-config-alist $B$r(B nil $B$K(B $B94B+$7$J$$$h$&$K$7$?!#(B 1999-10-13 Sasaki Toshiya * wl-folder-use-sever-diff-p: $B%^%k%A%U%)%k%@$G!"0l$D$G$b(B IMAP4 $B%U%)%k%@$,$"$l$P(B t $B$K$J$k$h$&$K$7$?!#(B 1999-10-13 Yuuichi Teranishi * 'm U' (wl-summary-temp-mark-uudecode)$B$G!"=PNO@h$N(B $B%U%!%$%kL>$r;XDj$G$-$k$h$&$K$7$?!#(B * $B%U%)%k%@%b!<%I$b%[%$!<%k$KBP1~$5$;$?!#(B * tm-wl.el $B$,JT=8Cf$@$C$?$N$r=$@5!#(B (Toshihiko Kodama ($B>.6L(B $BMxI'(B) $B$5$s(B $B$N8f;XE&(B) * wl-ja.texi: OR $B>r7o$N@bL@$rDI2C!#(B * time-stamp $B$K0MB8$7$J$$$h$&$K$7$?!#(B 1999-10-12 Yuuichi Teranishi * 2.2.3 - "Always" * read-directroy-name -> wl-read-directory-name$B!#(B 1999-10-12 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * $B?75,4X?t(B wl-summary-save-region (ry), wl-thread-save (ty), wl-summary-temp-mark-save (my)$B!#(B 1999-10-11 Masahiro MURATA ($BB * $B?75,JQ?t(B wl-draft-sendlog$B!#(Bnon-nil $B$J$iAw?.%m%0$r@8@.$9$k!#(B * New plugged system $BBh#2CF(B. 1999-10-10 Yuuichi Teranishi * $B?75,4X?t(B wl-summary-temp-mark-pick (m? $B$K%P%$%s%I(B)$B!#(B $B0l;~%^!<%/$,$D$$$?%a%C%;!<%8$rBP>]$H$7$F8!:w!#(B * $B?75,JQ?t(B elmo-imap4-disuse-server-flag-mailbox-regexp$B!#(B $BJ8;zNs$,%^%C%A$7$?%a!<%k%\%C%/%9$N%U%i%0$r;H$o$J$$!#(B $B%G%U%)%k%H$O(B "^#mh"$B!#(B * wl-address-file-name -> wl-address-file$B!#(B * wl-score-default-file-name -> wl-score-default-file$B!#(B * $B?75,JQ?t(B wl-summary-auto-sync-marks$B!#(B Non-nil $B$J$i%5%^%jF14|;~$KL$FI(B/$B=EMW%^!<%/$bF14|$9$k!#(B $B%G%U%)%k%H$O(B t$B!#(B * wl-stirict-diff-folders $B$N%G%U%)%k%H$r(B nil $B$K$7$?!#(B * $B%5%^%j$G=EMW%^!<%/$rF14|$9$k$h$&$K$7$?!#(B * IMAP4 $B%U%)%k%@$GL$FI%U%i%0$rF14|$9$k$h$&$K$7$?!#(B * $B?75,%3%^%s%I(B wl-summary-sync-marks$B!#(B * IMAP4 $B%U%)%k%@$G%5!<%PB&$NL$FI?t$rI=<($G$-$k$h$&$K$7$?!#(B * $B?75,JQ?t(B wl-folder-use-server-diff$B!#(B 1999-10-08 Yuuichi Teranishi * $B?75,JQ?t(B wl-envelope-from$B!#(Benvelope from $B$r@_Dj!#(B nil $B$J$i(B wl-from $B$,(B envelope from $B$H$J$k!#%G%U%)%k%H$O(B nil$B!#(B 1999-10-04 Yuuichi Teranishi * Message $B%P%C%U%!$G(B 'e' $B$r2!$7$?$H$-$N%;!<%V4X?t$r(B $B$A$g$C$H$@$1?F@Z$J$b$N$r%G%U%)%k%H$H$7$?(B (SEMI $BMQ(B)$B!#(B * wl-draft-send $B$G!"(Bsending-buffer $B$,(B buffer-live-p $B$N>l9g$@$1(B kill-buffer $B$9$k$h$&$K$7$F$_$?!#(B * $BL$FI?t%A%'%C%/;~!"%U%)%k%@$NB8:_$r$$$A$$$AD4$Y$k$N$r$d$a!"(B $B%A%'%C%/$K<:GT$7$?$H$-$K%U%)%k%@$NB8:_$rD4$Y$k$h$&$K$7$?!#(B * $B%a%C%;!<%8%P%C%U%!$K%+!<%=%k$,$"$k$H$-$K%[%$!<%k$r2s$9$H%(%i!<(B $B$K$J$k$N$r=$@5!#(B 1999-10-04 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * $B%0%k!<%W%U%)%k%@(B($BHs%"%/%;%9%0%k!<%W(B)$B$KBP$7$F!$(B C-u SPC $B$7$?;~$K!$(Bwl-folder-update-recursive-current-entity $B$r(B $B8F$V$h$&$K$7$?!%(B 1999-10-04 Yuuichi Teranishi * filter $B$5$l$?(B IMAP4 $B%U%)%k%@$N%*%U%i%$%s=hM}$GL5BL$J:o=|=hM}(B $B%-%e!<$,N/$k$N$r=$@5!#(B (OKAZAKI Tetsurou $B$5$s$N8f;XE&(B) 1999-10-04 okada@opaopa.org ($B2,ED(B $B7r0l(B / Kenichi OKADA) * $B%"%/%;%9%0!<%W$K(B Petname $B$r$D$1$k$H(B wl-folder-update-recursive-current-entity $B$,F0$+$J$+$C$?$N$r=$@5!%(B 1999-10-03 TSUMURA Tomoaki * wl-refile-alist $B$KEPO?$9$k:]$N(B key (mail address) $B$K(B downcase $B$r$+$1$k$h$&$K$7$?!#(B 1999-10-02 Tetsuya Uemura * $B%I%i%U%H%P%C%U%!$G%a!<%k$r:n@.Cf$K!"(B C-u 0 C-l $B$J$I$G;XDj$N0LCV$K%+!<%=%k$,9T$/$h$&$K=$@5!#(B 1999-10-01 Yuuichi Teranishi * IMAP4 $B$N%Q!<%H%U%'%C%A$G$O!"$=$N%a%C%;!<%8$rFI$s$@$3$H$K(B $B$7$J$$$h$&$K$7$?!#(B 1999-09-30 OKUNISHI -GTO- Fujikazu * -nw $B$G5/F0$7$?(B Emacs 20 $B$G%W%j%s%H$G$-$J$$$N$r=$@5!#(B 1999-09-28 Masahiro MURATA ($BB * $B%U%)%k%@$+$i%5%^%j$K0\F0$9$k:]!$%U%)%k%@$rI=<($7$F$$$J$$%&%#%s(B $B%I%&$K%5%^%j$,I=<($5$l$k$3$H$,$"$k$N$r=$@5$7$?!#(B * $B%[%9%H$,(B2$B$D0J2<$@$H(B wl-plugged-change $B$G%(%i!<$K$J$k$N$r=$@5!#(B * $B%5%^%j$G$b(B wl-plugged-change $B$G$-$k$h$&$K$7$?!#(B 1999-09-27 Yuuichi Teranishi * $B%3%s%Q%$%k;~$K(B wl.el $B$r(B load $B$7$J$$$h$&$K$7$?!#(B (Masahiro MURATA ($BB$B$5$s$N8f;XE&$K(B $B4p$E$/(B) 1999-09-27 Masahiro MURATA ($BB * New plugged system $B$G(B error $B$,H/@8$9$k>l9g$,$"$k$N$r=$@5!#(B 1999-09-26 Masahiro MURATA ($BB * New plugged system. 1999-09-24 OKUNISHI -GTO- Fujikazu * wl-break-pages $B$r(B nil $B$K94B+$7$F$b(B wl-summary-set-message-buffer-or-redisplay() $B$G$O:FIA2h$5$l$J$$$N$G!"(B wl-summary-redisplay-internal () $B$r * wl-stay-folder-window t$B$G;H$C$F$$$k$H!$9T$,@^$jJV$5$l$F!$(B $BHs>o$K8+?I$$$N$G!$(Btruncate-line t$B$K$7$?!#(B 1999-09-23 OKAZAKI Tetsurou * elmo-filter-get-spec $B$N;EMMJQ99$K4X78$9$k=$@51L$l$r=$@5(B (elmo-folder-diff)$B!#(B 1999-09-23 OKUNISHI -GTO- Fujikazu * localdir $BEy$,@dBP%Q%9$+$I$&$+$r(B file-name-absolute-p $B$GH=Dj$7!"(B .elmo $B0J2<$K(B db $B$r:n$k$h$&$K$7$?!#(B 1999-09-20 Masahiro MURATA ($BB * mime-view-caesar $B$G:n$i$l$?%P%C%U%!$r>C5n$9$k%3!<%I$,(B $BKu;&$5$l$F$7$^$C$?$N$rI|3h!#(B 1999-09-21 OKUNISHI -GTO- Fujikazu * $B4X?t(B elmo-safe-filename $B$G(B OS/2 $B$G$O(B "|<>" $B$r%U%!%$%kL>$H$7$F(B $B;H$($J$$$N$KBP1~!#(B 1999-09-21 Yuuichi Teranishi * 2.2.2 - "You Could Be Mine" * $B%U%)%k%@%b!<%I$K$"$k%U%)%k%@$O!"(Bwl-save-folder-list $B$NCM$K(B $B4X78$J$/%;!<%V$9$k$h$&$K$7$F$_$?!#(B * filter $B$G%U%#!<%k%IL>$K(B 'tocc' $B$r;XDj$9$k$H(B to $B$+(B cc $B$K;XDjJ8;zNs$,(B $B4^$^$l$k%a%C%;!<%8$rr7o!"(BNOT $B>r7o$r;XDj$G$-$k$h$&$K$7$?!#(B * wl-uniq-list -> elmo-uniq-list 1999-09-20 Yuuichi Teranishi * timezone.el $B$N(B y2k $BBP:v$NDj5A$rJQ99!#(B * wl-summary-save $B$G!"%;!<%V8e(B "No message to save." $B$H(B $B8@$o$l$k$N$r=$@5!#(B * local-variable-p $B$NDj5A$r(B wl-util.el $B$X0\F0!#(B (Masahiro MURATA ($BB$B$5$s$N8fJs9p(B $B$K4p$E$/(B) 1999-02-02 IMAI Takeshi * IMAP $B%U%)%k%@$K(B expire $B$G$-$J$+$C$?$N$r=$@5!#(B 1999-09-20 Masahiro MURATA ($BB * mime-view-caesar $B$G:n$i$l$?%P%C%U%!$r>C5n$9$k%3!<%I$,(B $BKu;&$5$l$F$7$^$C$?$N$rI|3h!#(B 1999-09-19 Shigeru OKUMURA * open-network-stream $B$N(B process-buffer $B$r(B unibyte $B$K@_Dj!#(B 1999-09-19 OKAZAKI Tetsurou * wl-ja.texi $B$N=$@5!#(B 1999-09-17 HAYAKAWA akio * $B%m!<%+%k$N%U%)%k%@$@$1$G9=@.$5$l$F$$$k%^%k%A%U%)%k%@(B $B$b%m!<%+%k$H$_$J$9$h$&$K$7$?!#(B 1999-09-16 OKUNISHI -GTO- Fujikazu * typo fix. 1999-09-16 Masahiro MURATA ($BB * 1$B$D$N%U%l!<%`$K$*$$$F%a%C%;!<%8$rI=<($9$k%&%#%s%I%&$O6&M-$9$k(B $B$h$&$K$7$?!#(B * wl-summary-goto-folder $B$7$?;~$K!$(Bwl-summary-buffer-disp-msg $B$NCM$K$h$j%a%C%;!<%8$NI=<($rI|85$9$k$h$&$K$7$?!#(B 1999-09-15 OKAZAKI Tetsurou * make install $B$G(B elmo $B4X78$N(B el $B%U%!%$%k$,L5>r7o$K(B $B%$%s%9%H!<%k$5$l$F$7$^$&$N$r=$@5!#(B * $B?75,4X?t(B wl-install-modules$B!#(B 1999-09-14 Yuuichi Teranishi * 2.2.1 - "Wild World" * typo: stickey -> sticky. * wl-nemacs.el: Nemacs $B8~$1$K(B local-variable-p $B$rDj5A!#(B * Rename: etc/ChangeLog.* -> etc/ChangeLog.*.ja * Rename: etc/ChangeLog.*.en -> etc/ChangeLog.* * XEmacs $B$G%m%4$,=P$J$$$N$r=$@5!#(B * XEmacs $B$N%$%s%9%H!<%k4X?t$,$3$o$l$F$$$?$N$r=$@5!#(B (Hidetomo Machi $B$5$s$N8f;XE&(B) * wl-ja.texi: MIME $BMQ%b%8%e!<%k$N%$%s%9%H!<%k$N9`$r99?7!#(B * $B%$%s%9%H!<%k;~!":n$C$?(B info $B%U%!%$%k$r>C$5$J$$$h$&$K$7$?!#(B * $B?75,4X?t(B wl-kill-buffers$B!#(B * wl-summary-force-exit $B$H(B wl-exit $B$N$H$-$K(B Sticky Message $B$r:o=|(B $B$9$k$h$&$K$7$?!#(B (Masahiro MURATA ($BB$B$5$s$N8f=u8@(B) 1999-09-14 Masahiro MURATA ($BB * XEmacs-21.1.6 $B$G$O(B sticky $B%5%^%j$G(B wl-summary-read $B$,%(%i!<$K$J(B $B$k$N$r=$@5$7$?!#(B 1999-09-14 Koichiro Ohba * ja/dot.wl $B$N(B elmo-eword-decode-string $B$NJQ991L$l$r=$@5!#(B 1999-09-13 Yuuichi Teranishi * tm-wl.el: SEMI API $B$K$"$o$;$F(B defalias-maybe $B$7$?!#(B * $B$h$/9M$($?$i(B smtp.el $B$O(B flim|clime $B$K4^$^$l$F$$$k$N$G:o=|!%(B 1999-09-13 Yuuichi Teranishi * 2.2.0 - "Vogue" * smtp.el: Sync up with flim-1.13.2$B!#(B * $B?75,JQ?t(B wl-install-els$B!#(Bnil $B$J$i(B el $B%U%!%$%k$r%$%s%9%H!<%k$7$J$$!#(B (for WL-CFG) * wl-draft-reply $BEy$r(B Sticky Message $BBP1~!#(B * wl-drfat-buffer-cur-message-buffer -> wl-current-message-buffer $B$H$7!"(Bwl-util.el $B$K0\F0!#(B * elmo-cross-device-link-error-p $B$rJQ99!#(B (pf21 GOTO_Toshiya $B$5$s$N8fJs9p$K4p$E$/(B) 1999-09-13 Mito * Sticky Message$B!#(B * Score $B%U%!%$%k$N(B guess $BJ}K!$N3HD%!#(B * elc $B$@$1$G$J$/(B el $B%U%!%$%k$b%$%s%9%H!<%k$5$l$k$h$&$K$7$?!#(B 1999-09-12 Yuuichi Teranishi * $B%5%s%W%k%U%!%$%k$O(B samples $B%G%#%l%/%H%j$K$^$H$a$k$h$&$K$7$?!#(B * $B%5%s%W%k%U%!%$%k1Q8lHG$rDI2C!#(B * etc/*.xpm -> etc/icons/*.xpm * etc/TODO -> doc/TODO.ja 1999-09-12 OKAZAKI Tetsurou * since, before $B4X78$N=$@5!#(B 1999-09-10 OKUNISHI -GTO- Fujikazu * im-wl-prog-imput-error-msg -> im-wl-dispatcher-error-msg$B!#(B 1999-09-10 Yuuichi Teranishi * convert-standard-filename $B$N(B defmacro $B$rGQ;_!#(B * open-network-stream-as-binary $B$N(B defmacro $B$r:o=|!#(B * with-current-buffer, with-temp-buffer $BEy$N(B defmacro $B$r:o=|!#(B * elmo-eword-decode-string -> $BGQ;_!#(B 1999-09-09 Yuuichi Teranishi * $B?75,JQ?t(B elmo-default-imap4-user$B!%(B (Taiji.Can@atesoft.advantest.co.jp $B$5$s(B $B$N8f=u8@$K4p$E$/(B) * 2.1.5 - "Unbelievable" 1999-09-08 Yuuichi Teranishi * $B?75,JQ?t(B elmo-nntp-max-number-precedes-list-active$B!#(B Non-nil $B$J$i(B list active $B$GF@$i$l$k?t;z$r5-;vHV9f$N:GBgCM$H$7$F07$&!#(B * $B?75,4X?t(B elmo-update-number$B!#(B elmo-nntp-max-number-precedes-list-active $B$,(B non-nil $B$N$H$-$K(B $B%5%^%j$NF14|;~$K!"(Bmsgdb $B$N99?7$,$J$/$F$b5-;vHV9f$N:GBgCM$rF14|(B $B$5$;$k$h$&$K$7$?!#(B ($B2,ED(B $B7r0l(B (Kenichi OKADA) $B$5$s$N8f;XE&$K4p$E$/(B) 1999-09-06 Akihiro Motoki * elmo-localnews-append-msg $B$N0z?t$,B-$j$J$+$C$?$N$r=$@5!#(B 1999-09-06 Yuuichi Teranishi * [im-wl] im-wl-prog-imput-error-msg $B$,%P%C%U%!%m!<%+%k$K$J$C$F$b(B $BBg>fIW$J$h$&!"%W%m%;%9%P%C%U%!$KCM$r%3%T!<$9$k$h$&$K$7$?!#(B * (elmo-folder-local-p) $B$r;H$C$F!"(B'N','P' $B$b(B local $B$J$i(B plug $B>uBV(B $B$K4X78$J$/F0:n$9$k$h$&$K$7$?!#(B (Akihiro Motoki $B$5$s$N8f=u8@(B) 1999-09-03 Akihiro Motoki * 'p' $B$,(B localdir $B$G$bL$FI%a%C%;!<%8$r%9%-%C%W$7$F$7$^$&$N$r=$@5!#(B * $B?75,4X?t(B (elmo-folder-local-p) 1999-09-03 Yuuichi Teranishi * $B%F%s%W%l!<%HA*Br$N%-!<%P%$%s%I$r(B C-cC-j $B$K$7$?!#(B (TSUMURA Tomoaki $B$5$s!"(B Masahiro MURATA ($BB$B$5$s$N8f=u8@(B) 1999-08-31 Yuuichi Teranishi * $B%I%i%U%H$NAw?.;~!"%-%e!<=hM};~$N%a%C%;!<%8$N=P$7J}$rJQ99!#(B 1999-08-31 OKUNISHI -GTO- Fujikazu * [im-wl] $B%5%V%W%m%;%9$N8F$S=P$7;~$K%P%C%U%!$rJQ99$;$:!"(B $B%W%m%;%9$N=PNO$@$1(B" *Wl Watch*" $B$K8~$1$k$h$&$K$7$?!#(B 1999-08-30 Yuuichi Teranishi * [wl-ja.texi] extra-fields $B$,(B IMAP $B%U%)%k%@$GM-8z$K$J$C$F$$$?$N$r(B $BH?1G!#(B(Sasaki Toshiya $B$5$s$N8f;XE&(B) * $BJ,3d$5$l$?(B MIME encode $B$5$l$?%a%C%;!<%8$rAw$m$&$H;W$&$H!"(B $BL58B%k!<%W$K4Y$C$F$7$^$&$N$r=$@5!#(B (Mikio Nakajima $B$5$s$N8f;XE&(B) 1999-08-30 OKUNISHI -GTO- Fujikazu * new im-wl.el 1999-08-27 Yuuichi Teranishi * $B:G2<9T$G(B `K'/`L' (wl-summary-increase/lower-score) $B$9$k$H(B, rule $BF~NO$KFMF~$7$F$7$^$&$N$G(B if $BJ8$r$R$H$DHo$;$?!#(B (TSUMURA Tomoaki $B$5$s$N8f=u8@(B) * EMWAC $BEy$N%5!<%P!<$G$O!"%5!<%P!<$+$i$NJVEz$rBT$DA0$K%3%^%s%I$r(B $BAw$C$F$7$^$&$H$=$N8e%5!<%P!<$+$i$N1~Ez$,$J$/$J$C$F$7$^$&$i$7$$$N$G!"(B $B?75,JQ?t(B elmo-pop3-send-command-synchronously $B$,(B non-nil $B$J$i(B $B%5!<%P$NJVEz$rBT$D$h$&$K$7$?!#(B (Atsushi Tada $B$5$s$N%Q%C%A$K4p$E$/(B) * $B:G6a$N(B SEMI $B$G(B mime-store-message/partial-piece $B$,F0$+$J$/(B $B$J$C$?$N$r=$@5!#(B * XEmacs $B$G%I%i%U%H%b!<%I$N%"%$%3%s$,=P$J$/$J$C$F$$$?$N$r=$@5!#(B 1999-08-26 Teruki SHIGITANI * $B%5%^%j%b!<%I$G:G8e$N9T!J%a%C%;!<%8$,$J$$9T!K$K%+!<%=%k$r$*$$(B $B$F(B "y" $B$rF~NO$9$k!J(Bwl-summary-save$B$r * $BGX7J$,L@?'$N>l9g$N?'$N%G%U%)%k%H$r$A$g$C$HJQ99$7$F$_$?!#(B * $B%U%#%k%?;XDj$G(B /last=200/ $B$H$7$F$7$^$&$H$^$:$$$3$H$K$J$k$N$r=$@5!%(B * % $B$N%"%/%;%9%0%k!<%W$H$7$F(B root $B$r;XDj$G$-$J$+$C$?$N$r=$@5!%(B 1999-08-25 Yuuichi Teranishi * 2.1.4 - "Tears In Heaven" * [wl-ja.texi] Summary $B$N(B C-u . $B$N@bL@$rDI2C(B (susumu-w@ops.dti.ne.jp $B$N8f;XE&(B)$B!#(B 1999-08-24 Yuuichi Teranishi * $B%U%)%k%@C&=P;~$N%^!<%/l9g!"%5%^%j$K%4%_$,(B $B;D$C$F$7$^$&$N$G!"<:GT$7$?>l9g$O%(%i!<$rH/@8$9$k$h$&$K$7$?!#(B * split $B$5$l$?%a%C%;!<%8$N%X%C%@$,(B encode $B$5$l$J$$$3$H$,$"$k$N$r=$@5!#(B * Unplugged $B$G!$%-%c%C%7%e$5$l$?(BIMAP$B%U%)%k%@$NL$FI%a%C%;!<%8$r(B $BFI$s$@$3$H$,!$%*%s%i%$%s$K$J$C$?=V4V$K%5!<%PB&$KH?1G$5$l$J$$$N$r(B $B=$@5!%(B * Unplugged $B$G!$%U%!%$%k%-%c%C%7%e$5$l$F$$$J$$%a%C%;!<%8$rFI$`$H!$(B $BA0$N%a%C%;!<%8$,I=<($5$l$F$7$^$&$N$r=$@5!%(B * $BA4HL$K(B, $B%9%l%C%I$r3+JD$9$k$H(B temp-mark $B$h$j(B mark $B$NJ}$,M%@h(B $B$5$l$F?'$,$D$/$N$r=$@5(B(susumu-w@ops.dti.ne.jp $B$N8f;XE&(B)$B!%(B * wl-thread-insert-message: wl-summary-goto-top-of-current-thread $B$r(B $B;H$o$J$$$h$&$K$7$?!#(B * wl-summary-goto-top-of-current-thread: $B=q$-D>$7!#(B * "W" $B$G%I%i%U%H$r:n@.$7$?$H$-$K!$(B wl-mail-setup-hook $B$,8F$P$l$J$$=$@5$,$J$5$l$F$$$J$+$C$?!%(B ($B2,ED(B $B7r0l(B (Kenichi OKADA) $B$5$s$N8f;XE&(B) * push -> wl-push$B!%(B (Masahiro MURATA ($BB$B$5$s$N8f=u8@(B) 1999-08-23 Yuuichi Teranishi * elmo-eword-decode-string $B$r(B defalias $B$9$k$N$r$d$a$k!#(B * tm $B$G(B flim $B$,;H$o$l$F$$$l$P(B User-Agent $B$K%P!<%8%g%s$rI=<(!%(B * partial merge $B4X?t$N(B ID $BHf3SItJ,$r=$@5!%(B 1999-08-22 Masahiro MURATA ($BB * elmo-nntp.el (elmo-nntp-catchup-msgdb): overview $B$,F@$i$l$J$/$F!$(B msgdb $B$,(B (nil nil nil nil) $B$H$J$k>l9g$KBP=h!#(B 1999-08-20 OKUNISHI -GTO- Fujikazu * elmo-pop3.el: elmo-pop3-list-folder $B$r@0M}!#(B 1999-08-20 Masahiro MURATA ($BB * $B?75,JQ?t(B wl-score-folder-alist-matchone$B!#(B * wl-score-folder-alist $B$N=q<0$r3HD%$7$?!#(B 1999-08-20 Mito * wl-score-folder-alist $B$N(B score file $B$r;XDj$9$k=j$K(B guess $B$H$$$&%7%s%\%k$r;XDj$7$?>l9g$O$=$N%U%)%k%@L>$+$i(B score file $B$r?dB,$9$k$h$&$K$7$?!#(B 1999-08-19 Masahiro MURATA ($BB * (wl-summary-switch-to-clone-buffer): $B%3%T!<$9$kJQ?t$K(B 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 $B$rDI2C$7$?!#(B 1999-08-18 Yuuichi Teranishi * $BK:$l5n$i$l$F$$$?(B wl-thread-exec $B$r $B$5$s$N8f;XE&(B) * sync-all $B$N$H$-$b(B temp-mark $B$,;D$C$F$$$l$P!" $B$5$s$N8f;XE&(B) * timezone-parse-date $B$N(B y2k $BBP:v!#(B (Masahiro MURATA ($BB$B$5$s$N8f;XE&(B) 1999-08-17 Mikio Nakajima * wl-fldmgr.el $B$N(B interactive command $B$N(B autoload $B@_Dj$r@0M}!#(B 1999-08-16 Masahiro MURATA ($BB * Scoring $B=hM}$r9bB.2=$7$?!#(B * wl-summary-sort-by-{from|subject} $B$r9bB.2=$7$?!#(B * wl-summary-switch-to-clone-buffer $B$GJQ?t(B wl-current-score-file $B$H(B wl-score-alist $B$b%3%T!<$9$k$h$&$K$7$?!#(B * $B4X?t(B wl-as-mime-charset $B$rDI2C$7$?!#(B * Use wl-score-mode-mime-charset instead of wl-score-mode-coding-system. * elmo-make-hash $B$N%G%U%)%k%H%F!<%V%k%5%$%:$r(B 1024 $B$H$7$?!#(B 1999-08-14 susumu-w@ops.dti.ne.jp * wl-thread-jump-to-msg $B$,(B interactive $B$G8F$P$l$k$H%(%i!<$K$J$k(B $B$N$r=$@5!%(B * Summary $B$N(B "J" $B$K(B wl-thread-jump-to-msg $B$r3d$jEv$F!%(B * localdir, localnew, maildir $B$K$*$$$F(B unplugged $B$G$b(B plugged $B$HF1$8$h$&$K(B n,p $B$9$k!%(B * t d $B$G$OJ}8~$r9MN8$7$F$/$l$J$$$N$r=$@5!%(B * c-u t d $B$G(B $B$$$C$3A0$N%9%l%C%I$,(B D $B$5$l$F$7$^$&$N$r=$@5!%(B * d $B$@$H * [elmo] UW imapd $B$N%j%b!<%H%U%)%k%@$K%"%/%;%9$G$-$J$+$C$?$N$r=$@5!%(B 1999-08-04 Yuuichi Teranishi * wl-queue-folder $B$K3JG<$5$l$?%a%C%;!<%8$NK\J8$,(B $BI=<($5$l$J$$$N$r=$@5(B($B?\:j(B $B>:(B $B$5$s$N8f;XE&(B)$B!%(B * 2.1.3 - "Sukiyaki" 1999-08-03 $B2,ED(B $B7r0l(B (Kenichi OKADA) * ChangeLog $B$+$iM>J,$J(B Tab/Space $B$r:o=|!#(B * wl-vars.el $B$N(B typo $B=$@5!#(B * wl-ja.texi: wl-folder-{prefetch|mark-as-read-all}-current-entity $B$N@bL@$rDI2C!#(B 1999-08-03 Yuuichi Teranishi * $B%-%e!<$KN/$C$?%a%C%;!<%8$NAw?.;~$K%(%i!<$,H/@8$7$F$b%-%e!<$+$i(B $B>C$($F$7$^$&$N$r=$@5!#(B (Mikio Nakajima $B$5$s$N8f;XE&(B) * mmelmo-imap4.el: mime-goto-header-start-point, mime-goto-header-end-point, mime-entity-header-buffer, mime-entity-body-buffer $B$rl9g$,$"$k$N$r=$@5!#(B (Shuichi Nishioka $B$5$s$N8f;XE&(B) * reedit $B;~$K%^%k%A%Q!<%H$N%a%C%;!<%8$r:FJT=8$G$-$J$/$J$C$F$$$?$N(B $B$r=$@5!#(B * $B0l;~%^!<%/$N=hM}$r(B unwind-protect $B$G0O$^$J$$$h$&$K$7!"(B $B%5%^%jC&=P;~$K0l;~%^!<%/$N=hM}$r(B C-g $B$GCfCG$G$-$k$h$&$K$7$?!#(B (Mito $B$5$s!"(B Masahiro MURATA ($BB$B$5$s(B, Taiji.Can@atesoft.advantest.co.jp $B$5$s$i$N8f;XE&8f=u8@$K4p$E$/(B) 1999-08-02 Mikio Nakajima * POP3 $B$N@\B3$,@Z$l$F$7$^$C$?$H$-$K%*%U%i%$%s$X$N%H%0%k$,(B $B$G$-$J$$$N$r=$@5!#(B * wl-ja.texi $B$G(B wl-toggle-plugged $B$,(B wl-draft-toggle-plugged $B$K(B $B$J$C$F$$$?$N$r=$@5!#(B 1999-08-01 Mikio Nakajima * XEmacs $B$N(B configure $B$K(B --with-database=berkdb $B%*%W%7%g%s$rIU$1(B $B$F%3%s%Q%$%k$7$F$$$k>l9g!"(Belmo-use-database $B$r(B non-nil $B$K%;%C%H$7$F$b(B elmo-database.el $B$,(B load $B$5$l$F$J$$$N$r(B $B=$@5!#(B 1999-07-30 Mito * Summary $B$N(B (window-height) $B$,>.$5$$;~!"(BSPC $B$G%(%i!<$,=P$k$N$r=$@5!#(B 1999-07-29 Masahiro MURATA ($BB * (localdir, maildir, localnews, archive) -> (localdir, localnews, archive) $B$H$$$&%3%T!<$d0\F0$OD>@\(B link(copy) $B$9$k$h$&$K$7$?!#(B * wl-summary-pick $B$K$*$$$F!$F1$8(B Message-ID $B$G$"$kJ#?t$N%a%C%;!<(B $B%8$K%^%C%A$7$F$b(B1$B$DL\$K$7$+(Btemp$B%^!<%/$,IU$+$J$$$N$r=$@5$7$?!#(B * Followup-To: poster $B$KBP1~$7$?!#(B * Superseds $B%a%C%;!<%8$r:n@.$9$k%3%^%s%I(B wl-summary-supersedes-message $B$r?75,:n@.$7$?!#(B * wl-util.el (wl-string): Use set-text-properties instead of format. 1999-07-28 "A. SAGATA" * $B@h$N(B elmo-multiple-field-body $B$N=$@5$G<+J,$,=P$7$?%a!<%k$K(B reply $B$G$-$J$/$J$C$F$$$?$N$r=$@5!#(B 1999-07-27 Masahiro MURATA ($BB * New function: elmo-multiple-field-body and elmo-multiple-fields-body-list. $BF1L>$NJ#?t$N%U%#!<%k%I$r * elmo-localnews-copy-msgs $B$,L$Dj5A$K$b4X$o$i$:8F$P$l$k$N$r=$@5!#(B 1999-07-24 HAYAKAWA akio * wl-(un)plugged-hook $B$rDj5A$9$k$H%(%i!<$K$J$C$F$7$^$&$N$r=$@5!#(B 1999-07-23 $B2,ED(B $B7r0l(B (Kenichi OKADA) * "W"$B$G%I%i%U%H$r:n@.$7$?$H$-$K(B wl-mail-setup-hook $B$,8F$P$l$J$$(B $B$N$r=$@5!#(B 1999-07-22 Yuuichi Teranishi * wl-summary-cancel-message $B$r(B Sticky Summary $B$KBP1~$5$;$?!#(B 1999-07-16 Teruki SHIGITANI * sample.dot.wl$BFb$K!"Aw?.$7$?%a%C%;!<%8$N$H$-$O:9=P?M$NBe$o$j$K(BTo$B$d(B Newsgroups$B$rI=<($9$k5!G=$r * Fix: void-function wl-summary-rescore-msgs. 1999-07-15 Yuuichi Teranishi * elmo-imap4 $B$b(B Emacs20 $B$N(B multibyte $B$N@_Dj$,$*$+$7$/$F(B $BJ8;z2=$1$7$F$$$?$N$r=$@5!#(B * 2.1.2 - "Rico Suave" 1999-07-14 Yuuichi Teranishi * Summary $B$G$N(B "I" $B$b(B prefix-arg $B$D$-$J$i%A%'%C%/$r%9%-%C%W$9$k(B $B$h$&$K$7$?!#(B * elmo-nntp $B$G(B Emacs20 $B$N(B multibyte $B$N@_Dj$,$*$+$7$/$F(B $BJ8;z2=$1$7$F$$$?$N$r=$@5!#(B * 'u' $B$N%a%C%;!<%8$rFI$^$J$+$C$?$3$H$K$G$-$J$+$C$?$N$r=$@5!#(B * XEmacs $B$G$$$-$J$j(B wl-draft $B$r * wl-score: (wl-score-simplify-subject) wl-summary-subject-func $B$r8F$VBe$o$j$K(B wl-score-simplify-fuzzy-regexp $B$r;HMQ$9$k$h$&$K$7$?!#(B * $B%P%C%U%!%-%c%C%7%e5!G=$GF1$8%-%c%C%7%e%P%C%U%!$,J#?t$G$-$k$N$r(B $B=$@5$7$?!#(B 1999-07-13 Masahiro MURATA ($BB * delete-if -> elmo-delete-if$B!#(B 1999-07-13 Yuuichi Teranishi * 'I' $B$G!"%5%$%:$,Bg$-$/$F%W%j%U%'%C%A$r%9%-%C%W$7$F$b(B $B%W%j%U%'%C%A$7$??t$K4^$^$l$F$7$^$&$N$r=$@5!#(B (susumu-w@ops.dti.ne.jp $B$5$s$h$j8fJs9p(B) * 2.1.1 - "Praying For Time" 1999-07-12 Yuuichi Teranishi * wl-draft-insert-signature -> $BGQ;_!#(B * wl-summary-prefetch-all-new -> $B:o=|!#(B * C-g $B$G%Q%9%o!<%IF~NO$rCfCG$9$k$H(B wrong-type-argument databasep nil $B$,=P$k$3$H$,$"$k$N$r=$@5(B($B$7$?$D$b$j(B)$B!#(B ("MATSUBAYASHI 'Shaolin' Kohji" $B$5$s$N8fJs9p$K4p$E$/(B) * $B?75,JQ?t(B wl-summary-incorporate-marks$B!#(B 'I' $B$G%W%j%U%'%C%A$9$k%^!<%/$r;XDj!#%G%U%)%k%H$O!"(B"N" $B$H(B "U"$B!#(B * elmo-nntp.el $B$H(B mmelmo.el $B$+$i(B (elmo-set-buffer-multibyte nil) $B$r:o=|(B (Shigeru OKUMURA $B$5$s$N8f=u8@(B)$B!#(B * wl-mule.el $B$K(B make-face $B$,Dj5A$5$l$F$$$J$$$H$-$K%@%_!<4X?t$rDj5A!#(B (HAYAKAWA akio $B$5$s!"(B OKUNISHI -GTO- Fujikazu $B$5$s$N(B $B8f=u8@$K4p$E$/(B) * pop3 $B%U%)%k%@$,(B unplugged $B$G%(%i!<$rH/@8$9$k$N$r=$@5(B($B$7$?$D$b$j(B)$B!#(B (HAYAKAWA akio $B$5$s$N8f;XE&(B) 1999-07-12 Masahiro MURATA ($BB * elmo-msgdb-extra-fields $B$,(B nil $B$N$H$-!$(Bfetch $B$,<:GT$9$k$N$r=$(B $B@5$7$?!#(B 1999-07-11 Masahiro MURATA ($BB * elmo-crosspost-message-alist $B$r%U%!%$%k$KJ]B8$9$k$h$&$K$7$?!#(B * $BJQ?tCM$rJ]B8$9$k:]$O!$$J$k$Y$/(B elmo-object-load $B$H(B elmo-object-save $B$r;HMQ$9$k$h$&$KJQ99$7$?!#(B * Scoring $B5!G=$G(B wl-summary-rescan $B$d(B sync-all $B;~$K$O(B references $B$d(B thread $B$N%(%s%H%j$r<+F0DI2C$7$J$$$h$&$K$7$?!#(B * imap4 $B%U%)%k%@$G(B extra $B%U%#!<%k%I$, * localnews $B$G$b(B 'W' $B$G(B Newsgrops $B$rJd40$7$F%I%i%U%H$r:n@.$G$-$k$h$&(B $B$K$7$?!#(B 1999-07-08 OKUNISHI -GTO- Fujikazu * Nemacs $B$G(B internal("'mark") $B$,FI$a$J$+$C$?$N$r=$@5!#(B 1999-07-07 Yuuichi Teranishi * wl-summary-mark-below $B$N(Bcustom$B$N%0%k!<%W$r(B 'wl-score $B$K=$@5!#(B (Masahiro MURATA ($BB $B$5$s$N8f;XE&(B) * wl-summary-incorporate $B$G!"(Bwl-summary-prefetch-all-new $B$N$+$o$j$K(B (wl-summary-prefetch-region (point-min) (point-max)) $B$r;H$&$h$&$K$7$?!#(B (Masahiro MURATA ($BB $B$5$s$N8f=u8@(B) * Summary $B$N(B C-u . $B$,8z$+$J$/$J$C$F$$$?$N$r=$@5!#(B (Hideo Matsumoto $B$5$s$h$j8f;XE&(B) 1999-07-06 sen_ml@eccosys.com * rfc2368.el - version 0.3 1999-07-06 Hideo Matsumoto * $B?75,JQ?t(B wl-draft-use-frame$B!#(B draft$B$r3+$/$H$-$K?7$7$$(Bframe$B$r3+$/!#(B 1999-07-06 Masahiro MURATA ($BB * $B4X?t(B wl-day-number $B$N(B mapcar $B$K$"$k(B lambda $B$r(B quote$B!#(B * wl-score.el: wl-summary-{increase|lower}-score $B$G(B Subject $B$N%^%C(B $B%AJ8;zNs$r4JN,2=$9$k$h$&$K$7$?!#(B wl-current-score-file $B$H(B wl-score-alist $B$r(B buffer-local $B$K$7$?!#(B * wl-summary.el: wl-summary-scored $B$r(B nil $B$K$9$k0LCV$rJQ99$7$?!#(B * Rename: wl-score-simplify-subject-fuzzy-regexp -> wl-score-simplify-fuzzy-regexp wl-score-simplify-buffer-fuzzy-step -> elmo-buffer-replace. * wl-ja.texi: $B%9%3%"5!G=$NJQ99!#(B * wl-draft.el: autoload $B@_Dj$NDI2C!#(B * sample.dot.wl: wl-summary-next-no-unread$B$N:o=|!#(Bscore$B5!G=$N@_(B $BDjDI2C!#(B 1999-07-06 Yuuichi Teranishi * Summary $B$N(B C-u . $B$,8z$+$J$/$J$C$F$$$?$N$r=$@5!#(B (Hideo Matsumoto $B$5$s$h$j8f;XE&(B) * Nemacs $B$G$O(B wl-summary-{print|remove}-destination $B$r(B $B%@%_!<4X?t$K$9$k!#(B * Nemacs $BMQ$K(B rassoc $B$rDj5A!#(B * Nemacs $B$N(B Folder $B%b!<%I$G(B 'm' $B$r2!$9$H%(%i!<$K$J$k$N$r=$@5!#(B * Nemacs $B$G$O(B wl-use-scoring $B$N(B default $B$r(B nil $B$K$7$?!#(B * $B?75,4X?t(B elmo-delete-if$B!#(Breplacement of delete-if$B!#(B * Nemacs $B$G%P%$%H%3%s%Q%$%k$9$k$H$J$<$+(B (defvar nil nil) $B$N%(%i!<(B $B$,=P$k$N$r=$@5!#(B (Taiji.Can@atesoft.advantest.co.jp $B$5$s$h$j8f;XE&(B) * 2.1.0 - "Ordinary World" 1999-07-05 Yuuichi Teranishi * partial $B$r%^!<%8$G$-$J$+$C$?$N$r=$@5!#(B (Taiji.Can@atesoft.advantest.co.jp $B$5$s$h$j8f;XE&(B) * wl-summary-rescore $B$b(B wl-summary-rescore-partial-threshold $B$K=>$&(B $B$h$&$K$7$F$_$?!#(B * wl-summary-score-update-all-lines $B$N=hM}Cf%a%C%;!<%8$r=P$9$h$&$K(B $B$7$?!#(B 1999-07-04 Masahiro MURATA ($BB * wl-score.el: date, extra, followup, thread $B%-!<$rDI2C$7$?!#(B * `wl-score-default-file-name' $B$G;XDj$5$l$?%9%3%"%U%!%$%k$rI,$:FI$_(B $B9~$`$h$&$K$7$?!#(B * $B%5%^%j%P%C%U%!!$$*$h$S%9%3%"JT=8%P%C%U%!$G%9%3%"%U%!%$%k$r:n@.$9$k(B $B5!G=$rDI2C$7$?!#(B * wl-vars.el: defcustom $B$r@0M}$7$?!#(B * wl-highlight.el: defface $B$K%0%k!<%W$rDI2C$7$?!#(B 1999-07-01 Yuuichi Teranishi * $B?75,(B sync $B%l%s%8(B rescan-noscore$B!#%9%3%"$rH?1G$;$:I=<($7$J$*$9!#(B * rescan/sync-all $B$G$O4{FI%a%C%;!<%8$G$b(B score $B$rH?1G$9$k$h$&$K$7$?!#(B * $B?75,JQ?t(B wl-summary-rescore-partial-threshold$B!#(Brescan, sync-all $B$G(B $B%9%3%"IU$1$9$k%a%C%;!<%8?t$N>e8B$r;XDj!#(B * wl-edit-again-func->wl-edit-decode-message-func (tomo@etl.go.jp ($BC$9!#(B * wl-refile-alist-setup $B$N * wl-refile-(msgid-)learn $B$d(B, wl-refile-guess-* $B$NCf$G(B, $BKh2s(B wl-refile-(msgid-)alist $B$,(B load $B$5$l$F$k$+$I$&$+D4$Y$k$N$O(B $BL5BL$J$N$G5/F0;~$KI,$:(B load $B$9$k$h$&$K$7$?!#(B * wl-refile-(msgid-)learn $B$,0lEY8F$P$l$kKh$K(B wl-refile-alist-save $B$9$k$N$O(B, $BL5BL$J$N$G(B WL $B=*N;;~$K0l2s$@$1(B save $B$9$k$h$&$K(B $B$7$?!#(B * wl-refile-(msgid-)learn $B$NJV$jCM$rJQ99!#(B 1999-06-29 Shuhei KOBAYASHI * cl $B$N(B require $B$r(B eval-when-compile $B$G3g$j!"=gHV$rJQ$($k!#(B 1999-06-29 OKUNISHI -GTO- Fujikazu * unread $B$,(B 0 $B$N;~(B [Space] $B$G%5%^%j$+$iH4$1$i$l$J$+$C$?$N$r=$@5!#(B * cl.el $B$N(B member () $B$,(B poe-18.el $B$N(B member () $B$r>e=q$-$7$F$7$^$&(B $B$N$r=$@5!#(B 1999-06-29 Yuuichi Teranishi * AIR MAIL(AIRCimapd release 2.00) $B$KBP1~!#(B (Sasaki Toshiya $B$5$s$N8fJs9p(B $B$K4p$E$/(B) 1999-06-29 Yuuichi Teranishi * wl-score $B$G$N(B expunge $B$r!VFI$s$@$3$H$K$7$F!"(B $B%5%^%j%P%C%U%!$+$i>C$9$@$1!W$H$7$?!#(B * update $B;~$K(B expunge $B$7$?$3$H$rJs9p!#(B 1999-06-28 Shuhei KOBAYASHI * elmo-pop3.el $B$G(B md5-encode $B$r;H$o$J$$$h$&$K$7$?!#(B 1999-06-28 OKUNISHI -GTO- Fujikazu * MK-MK: (mapcar (lambda ..)) $B$,(B v18 $B$G$OF0$+$J$$$N$G(B quote $B$9$k!#(B Nemacs $B$G$b(B wl-mule.elc $B$,%$%s%9%H!<%k$5$l$k$3$H$K$J$C$F$?$N$r(B $B=$@5!#(B defgroup(), defcustom() $BLdBj2sHr%3!<%I$rI|3h!#(B * wl-summary.el, wl-demo.el: float $B$,;H$($J$$0lIt$N(B Emacsen $B$G$N%(%i!<2sHr!#(B * wl-nemacs.el: completing-read() $B$O0z?t$r8^$D$^$G$7$+l9g$K%(%i!<$K$J$i$J$$$h$&$K(B $B$9$k!#(B 1999-06-28 Masahiro MURATA ($BB * default-case-fold-search $B$,(B nil $B$N$H$-!$(Bwl-summary-pick $B$,@5>o(B $B$KF0:n$7$J$$$N$r=$@5$7$?!#(B * important $B%^!<%/$,(B2$B$D0J>e$"$k$H!$(Bwl-auto-select-next $B$,(Bnon-nil $B$N$H$-$K * $B4X?t(B wl-summary-delete-all-delete-marks () $BDI2C!#(B * (wl-summary-cleanup-temp-marks) $B$,$J$<$+#22s8F$P$l$F$$$?$N$r=$@5!#(B ($B:72eED$5$s(B $B$N8f;XE&(B) 1999-06-27 Masahiro MURATA ($BB * folder $B%b!<%I$G(B wl-summary-goto-folder-subr $B$r0l;~E*$K%5%^%j$K0\(B $BF0$7$?;~$O!$(BScoring $B$5$l$J$$$h$&$K$7$?!#(B * wl-summary-next-no-unread $B$r:o=|$7!$(Bwl-auto-select-next $B$@$1$G@)(B $B8f$9$k$h$&$K$7$?!#(B * wl-summary-move-order $B$N%G%U%)%k%HCM$r(B 'new $B$+$i(B 'unread $B$KJQ99(B $B$7$?!#(B 1999-06-27 OKUNISHI -GTO- Fujikazu * Nemacs $B$G(B (wrong-type-argument listp 1) $B$,H/@8$9$k$N$r=$@5!#(B * Nemacs $B$,(B timer $B$,$J$/$F%(%i!<$K$J$k$N$r(B condition-case $B$G2sHr!#(B 1999-06-27 Masahiro MURATA ($BB * $B%9%3%"%U%!%$%k$r(B ctext (*ctext) $B$GFI$_=q$-$9$k$h$&$K$7$?!#(B 1999-06-26 $B2,ED(B $B7r0l(B (Kenichi OKADA) * mailto: $B$HF1MM(B nntp: news: $B$KBP1~$5$;$k4X?t!%(B (-> wl-utils.el $B$KDI2C!#(B) 1999-06-25 Masahiro MURATA * wl-score.el: coding-system $B$,%P%0$C$F$$$?$N$r=$@5!#(B 1999-06-25 Masahiro MURATA * wl-score.el: $B?75,%U%!%$%k!#(BScore $B5!G=$rDI2C$7$?!#(B * wl-summary.el: (wl-summary-sync-update3) wl-folder-set-folder-updated $B$N%?%$%_%s%0$rJQ99$7$?!#(B * (wl-summary-update-crosspost) $B%9%l%C%I$r%*!<%W%s$;$:$K4{FI%^!<(B $B%/$rIU$1$k$h$&$KJQ99$7$?!#(B * 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 $B$N@bL@DI2C!#(B 1999-06-24 Kenichi OKADA * elmo-cache-expire $B$,%(%i!<$rH/@8$9$k$N$r=$@5!#(B 1999-06-24 sen_ml@eccosys.com * utils/rfc2368.el $B$N%P%0=$@5!#(B 1999-06-24 Yuuichi Teranishi * 2.0.1 - "Now And Forever" * body $B$K(B --text follows this line-- $B$,$"$k$H$=$N9T0JA0$,$J$/$J$k(B $B$N$r=$@5(B($BIT40A4(B)$B!#(B ($B2,ED(B $B7r0l(B (Kenichi OKADA) $B$5$s(B $B$N8f;XE&(B) 1999-06-24 MAKINO Takashi * $B?75,4X?t(B wl-refile-guess-by-msgid$B!#(B 1999-06-23 Akihiro Motoki * wl $B$r5/F0$7$F$$$J$$>uBV(B $B$+$D(B (setq wl-stay-folder-window t)$B$N>l9g!"(B wl-draft $B$r9T$&$H!"(Bwl-draft-send-and-exit $B$b(B wl-draft-kill $B$b(B $B<:GT$9$k$N$r=$@5!#(B 1999-06-23 $B2,ED(B $B7r0l(B (Kenichi OKADA) * wl-ja.texi: wl-template-alist $B$N@bL@(B: file -> body-file 1999-06-23 Yuuichi Teranishi * Draft $B$G(B prefix $B$D$-$G(B C-c C-y $B$9$k$H%+%C%H%P%C%U%!$+$i(B $B0zMQ$9$k$h$&$K$7$F$_$?!#(B * elmo-imap4-int-string-to-list -> $BGQ;_!#(B (Masahiro MURATA ($BB$B$5$s$N8f=u8@(B) * $B:G6a$h$/4V0c$($k$N$G(B Summary $B$N(B 'e' $B$r(B wl-summary-save $B$K(B $B3d$jEv$F$?!#(B * wl-set-string-width $B$+$iITMW$H;W$o$l$k(B let $B$ruBV$@$H!$(BMH$B%U%)%k%@4V$G$N(Brefile$B$G!$(Belmo-copy-msgs $B$N$"$H$K(B elmo-append-msg $B$b8F$P$l$k$N$r=$@5!#(B (Koji IIDA / $BHSED(B $B9@Fs(B $B$5$s$h$j8f;XE&(B) 1999-06-22 Yuuichi Teranishi * mule/emacs $B$G(B wl-draft-prepared-config-exec $B$,(B C-c C-d $B$H(B C-c C-e $B$NN>J}$K3d$j$"$F$i$l$F$$$?$N$r=$@5!#(B * wl-completion-buf-name $B$NCM$r(B emacs $BI8=`$NJd40MQ%P%C%U%!(B *Completions* $B$K9g$o$;$?!#(B * wl-message-buffer-created-hook $B$r@_Dj$7$F$bE,@Z$K(B hook $B$,(B $B8F$P$l$F$$$J$$$N$r=$@5!#(B (Akihiro Motoki $B$5$s$h$j8f;XE&(B) 1999-06-22 Masahiro MURATA ($BB * elmo-nntp.el: XOVER $B$G$N(B size $B$N * elmo-pop3 $B$N(B max-of-folder $B$r8zN(2=!#(B 1999-06-21 OKUNISHI -GTO- Fujikazu * .wl $B$N(B syntax $BEy$N%(%i!<$r$A$c$s$HEG$+$;$k!J%f!<%6$KCN$i$;$k!K(B $B$h$&$K$7$?!#(B * $B$*$^$1!#(B 1999-06-19 Masahiro MURATA ($BB * (featurep 'tinycustom) $B$J$i(B defface $B$NDj5A$rL5;k$9$k!#(B 1999-06-18 Shigeru OKUMURA * nntp $B$NJ8;z2=$1$,$^$@D>$C$F$$$J$+$C$?$N$r=$@5!#(B 1999-06-18 Masahiro MURATA ($BB * @ $B$G@5$7$/%"%I%l%9$r(B expand $B$9$k$h$&$K$7$?!#(B 1999-06-16 Yuuichi Teranishi * $B?75,JQ?t(B wl-use-dnd$B!#%I%i%C%0%"%s%I%I%m%C%W5!G=$r$D$+$&$+$I$&$+!#(B 1999-06-16 Masahiro MURATA ($BB * [elmo-nntp] elmo-list-folder $B$G(B "LISTGROUP" $B%3%^%s%I$r;H$&$h$&(B $B$K$7$?!#(B * [elmo-nntp] xover $B$N;HMQ2DH]$r%5!<%P$4$H$KJ];}$9$k$h$&$K$7$?!#(B 1999-06-16 Shigeru OKUMURA * Content-Type$B$,(Bsjis$B$d(Beuc$B$@$H(B mail$B$d(Bnews$B$,2=$1$F$7$^$&$N$r=$@5!#(B 1999-06-16 Yuuichi Teranishi * [elmo-imap4] cram-md5 $BBP1~!#(B 1999-06-15 Yuuichi Teranishi * tm $B$G(B error: Split sender is not specified for `wl-draft-mode'. $B$H=P$k$N$r=$@5!#(B (Toshihiko Kodama $B$5$s$N8f;XE&(B) 1999-06-14 Yuuichi Teranishi * `wl-draft-enable-queuing' $B$N@bL@$,%@%V$C$F$$$?$N$r=$@5!#(B (Toshihiko Kodama ($B>.6L(B $BMxI'(B) $B$5$s$h$j8f=u8@(B) 1999-06-14 OKUNISHI -GTO- Fujikazu * wl-detect-info-directory() $B$r$A$g$C$H8-$/$7$F$_$?!#(B 1999-06-13 Masahiro MURATA ($BB * $B%P%C%U%!%-%c%C%7%e!#(B $B?75,JQ?t(B elmo-use-buffer-cache $B$,(B non-nil $B$J$i%-%c%C%7%e!#(B $B%G%U%)%k%H$O(B t$B!#(B $B0lC6FI$s$@%a%C%;!<%8$r%P%C%U%!$K;D$7$F$*$/5!G=!#(B * $B%a%C%;!<%8$N@hFI$_(B(cache-prefetch)$B!#(B $B%a%C%;!<%8$rFI$s$G$$$k4V$K * WL-MK: info $B@8@.;~$N(B codesys $B$N7hDj$O(B wl-vars.el $B$rMxMQ$9$k!#(B info $B$NJ,3d%*%W%7%g%s$rGQ;_!#(B info $B$N%$%s%9%H!<%k;~$K$OJ# * $B?75,%U%!%$%k(B utils/wl-use-agent.el, utils/rfc2368.el 1999-06-11 Yuuichi Teranishi * mmelmo-imap4-get-mime-entity$B$NCf$N(B elmo-imap4-get-connection$B$N0z?t$,>/$J$+$C$?$N$r=$@5!#(B ($B2,ED7r0l$5$s(B$B$N8f=u8@(B) * 2.0.0 - "Mmmbop" * wl-summary-partial-highlight-above-lines $B$,(B nil $B$J$i(B Summary $B3+;O;~$N%+!<%=%k$N0LCV$K4X78$J$/:G8e$+$i(B wl-summary-highlight-partial-threshold $B9T$@$1%O%$%i%$%H$9$k(B $B$h$&$K$7$?!#(B * Sen Nagata $B$5$s:n$N(B util/wl-user-agent.el $B$r(B $B:G?7HG$K99?7!#(B ($B1|@>$5$s(B $B$h$j8f;XE&(B) 1999-06-10 $B2,ED(B $B7r0l(B (Kenichi OKADA) * IAMP4$B$H(BNNTP$B$N%"%/%;%9%0%k!<%W$G!$%]!<%HHV9f$,(B $B%G%U%)%k%H$H0c$&$H%(%i!<$,=P$k$N$r=$@5!#(B 1999-06-10 Yuuichi Teranishi * $B%U%!%$%kL>JQ99(B ChangeLog.en -> ChangeLog ChangeLog -> ChangeLog.ja * [wl-ja.texi] wl-plugged $B$N@bL@$rDI2C!#(B ($BCSED$5$s(B $B$h$j8f=u8@(B) 1999-06-09 Yuuichi Teranishi * $B?75,JQ?t(B elmo-default-pop3-ssl elmo-default-nntp-ssl elmo-default-imap4-ssl$B!#(Bnon-nil $B$J$i(B "!" $B$rIU$1$J$/$F$b(B SSL $B$r;H$&!#(B * $BL>A0JQ99(B elmo-nntp-port -> elmo-default-nntp-port elmo-imap4-port -> elmo-default-imap4-port$B!#(B ($B2,ED$5$s(B $B$N8f=u8@(B) * [elmo] imap4, nntp, pop3 $B$G%U%)%k%@L>$N:G8e$K(B "!" $B$,$D$$$?$i(B SSL $B$r(B $B;H$&$h$&$K$7$?!#(B * [elmo] imap4, nntp, pop3 $B$G%]!<%H$r;XDj$7$F$J$$%5!<%P$H$N%;%C%7%g%s$H(B $B%]!<%H$r;XDj$7$?F1$8%5!<%P$H$N%;%C%7%g%s$G%3%M%/%7%g%s$,(B $B$+$A$"$o$J$$$h$&$K$7$?!#(B 1999-06-09 OKUNISHI -GTO- Fujikazu * POP $B$G$bJQ?t(B elmo-default-pop3-server $B$r?7@_!"(B"&USER" $B$@$1$G(B $B$b%"%/%;%9$G$-$k$h$&$K$7$?!#(B * mmelmo-imap4.el $B$K%]!<%HHV9f;XDj$N=$@5!#(B * [wl-ja.texi] $B=$@5!#(B 1999-06-08 $B2,ED(B $B7r0l(B (Kenichi OKADA) * IMAP4 $B%U%)%k%@$G(B port $BHV9f$r;XDj$G$-$k$h$&$K$7$?!#(B 1999-06-07 Akihiro Motoki * $B%a!<%k$N=g=x$,(B $B:o=|A0$N%U%)%k%@$H(B trash$B%U%)%k%@$G5U$K$J$C$F$7$^$&(B $B$N$r=$@5!#(B * wl-summary-pick $B$G(B field-name $B$H$7$F(B elmo-msgdb-extra-fields $B$r;XDj(B $B$G$-$k$h$&$K$7$?!#(B 1999-06-07 Yuuichi Teranishi * wl-summary-jump-to-parent-message() $B$O!"%9%l%C%I$HF1MM(B In-Reply-To $B$rM%@h$9$k!#(B ($B:72eED$5$s(B $B$N8f;XE&(B) * From $B$,(B wl-from $B$K%^%C%A$9$k%a%C%;!<%8$KJV;v$r=q$/$H$-$O!"(B To, Cc, Newsgroups $B$rJ]B8$9$k!#(B ($BDEM8$5$s(B $B$N8f=u8@(B) 1999-06-06 Masahiro MURATA ($BB * sticky$B%5%^%j$KBP$7$F!$(Bwl-folder-mark-as-read-all-entity, wl-folder-sync-entity, wl-folder-prefetch-entity $B$r * wl-folder-no-auto-check-folder-p $B$G(B wl-auto-check-folder-list $B$r(B $BM%@h$5$;$k$h$&$K$7$?!#(B * wl-summary-switch-to-clone-buffer $B$G(B wl-summary-buffer-new-count $B$H(B wl-summary-buffer-unread-count $B$,(B $B%3%T!<$5$l$J$$$N$r=$@5$7$?!#(B * wl-folder-empty-trash $B$G%5%^%j%P%C%U%!$,I=<($5$l$J$$$N$r=$@5$7$?!#(B * bbdb2 $B$G(B bbdb-wl.el $B$r%3%s%Q%$%k$9$k;~$N(Bwarning$B$r$J$/$7$?!#(B * interactive $B$r(B nil $B$K$7$F(B wl-summary-goto-folder-subr $B$7$?:]!$(B recenter $B$G%(%i!<$,=P$k$3$H$,$"$k$N$r=$@5$7$?!#(B * bbdb2 $B$G(B bbdb-wl.el $B$r%3%s%Q%$%k$9$k;~$N(Bwarning$B$r$J$/$7$?!#(B * wl-folder-suspend-hook $B$rDI2C$7$?!#(B 1999-06-06 OKUNISHI -GTO- Fujikazu * "V" $B$G2>A[%U%)%k%@$r:n@.$9$k$H%5%^%j$,I=<($5$l$:!"(Bsync update $B$7$J$1$l$P$J$i$J$$!#$^$?!"99$K(B "V" $B$7$F$+$i(B "C-u V" $B$G85$N2>A[(B $B%U%)%k%@$KLa$k$H:F$S%5%^%j$,I=<($5$l$J$/$J$C$F$7$^$&!#(B 1999-06-04 OKUNISHI -GTO- Fujikazu * font-lock $B$K$h$kJ@32$rHr$1$k$?$a!"(Bwl-draft-reedit() $B$G$b(B change-major-mode-hook $B$r(B nil $B$KB+G{$9$k!#(B * wl-message-refer-article-or-url() $B$r * sticky $B%5%^%j$+$i0\F0$9$k:]!$(Btemp-mark $B$,$D$$$F$$$k$H$=$N(B $B%^!<%/$O>C$($F$b(B highlight $B$,;D$C$?$^$^$K$J$k$N$r=$@5$7$?!#(B * wl-summary-buffer-copy-list $B$,(B buffer-local-variables $B$K$J$C$F(B $B$$$J$+$C$?$N$r=$@5$7$?!#(B * $B%5%^%j$N0\F0;~$K(B interactive $B$G$J$$>l9g$O(B switch-to-buffer $B$G(B $B$O$J$/!$(Bset-buffer $B$9$k$h$&$K$7$?!#(B 1999-06-03 Yuuichi Teranishi * $B4X?t(B elmo-imap4-identical-name-space-p $B$r $B$N8f;XE&(B) * [mmelmo.el, mmelmo-imap4.el] FLIM 1.13 API $B$KBP1~!#(B 1999-06-03 "A. SAGATA" * sticky summary$B$r;H$&$H!"(Bdraft$B=*N;8e!"JL$N(Bsummary$B$KLa$k;v$,$"$k!#(B * menu $B$K(B mR $B$H(B mf$B$,Fs$D$E$D$"$C$?$N$r=$@5!#(B * wl-summary-jump-to-current-message $B$,$A$g$C$HJQ$@$C$?$N$r=$@5!#(B 1999-06-02 Yuuichi Teranishi * XEmacs package $B$G$b(B BBDB $B$,B8:_$9$l$P(B utils/bbdb-wl.el $B$b(B bytecomp/install $B$9$k!#(B * $B?75,JQ?t(B wl-summary-keep-cursor-command$B!#(B $B%3%^%s%I$4$H$K%+!<%=%k0LCV$r$=$N$^$^$K$9$k$+$I$&$+$r@_Dj$G$-$k(B $B$h$&$K$7$?!#(B 1999-06-02 OKUNISHI -GTO- Fujikazu * BBDB $B$,B8:_$9$l$P(B utils/bbdb-wl.el $B$b(B bytecomp/install $B$9$k!#(B 1999-06-02 $B2,ED(B $B7r0l(B (Kenichi OKADA) * elmo-pop3$B$N%P%$%H%3%s%Q%$%k;~$N%r!<%K%s%0$r$H$k!#(B * [WL-MK] $B0lEY!$(Bmake$B$7$F(Belc$B$r:n$C$?8e$K!$(Belmo-*.el$B$rJQ99$7$F!$(B $B$b$&0lEY(Bmake$B$9$k$H!$%(%i!<$K$J$k$N$r=$@5!#(B 1999-06-02 Masahiro MURATA ($BB * sticky $B%5%^%j$G$N(B update $B;~$K!$?75,%a%C%;!<%8$,(B highlight $B$5$l$J$/(B $B$J$C$?$N$r=$@5$7$?!#(B 1999-06-01 Yuuichi Teranishi * 1.0.1 $B$+$iJ,4t!#(B 1999-06-01 Masahiro MURATA ($BB * $B0\F0@h$N%P%C%U%!$,4{$KB8:_$7$F$$$?>l9g$NF0:n$rJQ99$7!"(B 'g' $B$G8F$P$l$?>l9g$O(B update $B$;$:$K%+!<%=%k0LCV$rJ];}$9$k$h$&$K$7$?!#(B * 'g' $B$G0\F0$9$k:]!$(Bwl-ask-range($B?75,JQ?t(B) $B$,(B nil $B$J$i!$(B wl-folder-sync-range-alist $B$NCM$r;HMQ$9$k$h$&$K$7$?!#(B * wl-summary-read-folder $B$GF~NO$7$?%U%)%k%@L>$N$_$NMzNr$r(B wl-read-folder-hist $B$K5-O?$9$k$h$&$K$7$?!#(B * $B8r8_$K%5%^%j$r@Z$jBX$($k?75,%3%^%s%I!"(B wl-summary-goto-last-visited-folder$B!#(B($B%-!<%P%$%s%I$K$OL$3d$jEv$F(B) 1999-06-01 Yuuichi Teranishi * 1.0.1 - "The Look" * wl-ja.info $B$r%Q%C%1!<%8$+$i:o=|!#(B 1999-06-01 Sen Nagata * compose-mail $B$N%$%s%?!<%U%'!<%9$r%5%]!<%H!#(B ($B?75,%U%!%$%k(B wl-user-agent.el $B$rDI2C(B) 1999-05-31 "A. SAGATA" * wl-stay-folder-window $B$,(B non-nil $B$N$H$-!"(Bfull window $B$G(B draft $B$r:n@.$7$?8e!"(B C-cC-k $B$d(B C-cC-c $B$G!"(Bdraft $B$r=*N;$7$F(B summary mode $B$KLa$C$?;~$K!"(Bfolder window $B$,>C$($F$7$^$o$J$$(B $B$h$&$K$7$?!#(B 1999-05-31 Yuuichi Teranishi * folder $B%b!<%I$J$I$+$i%U%)%k%@0\F0$9$k$H$-!"(B wl-folder-sync-range-alist $B$NCM$rH?1G$9$k$h$&$K$7$?!#(B ($B?@V:$5$s(B $B$N8f=u8@(B) * wl-draft-reply-buffer-style $B$,(B 'full $B$N$H$-!"(Bmulti-reply/forward $B$,%(%i!<$K$J$k$N$r=$@5!#(B ($B:72eED$5$s(B $B$N8f;XE&(B) * sticky summary $B$K0\F0$7$?$H$-$O(B msgdb $B$r%m!<%I$7$J$$$h$&$K$7$?!#(B ($BB $B$N8f=u8@(B) * wl-summary-exit $B$,L5BL$K%;!<%V$7$F$7$^$&$N$r=$@5!#(B 1999-05-29 OKUNISHI -GTO- Fujikazu * [wl-mime.el, tm-wl.el] (tm-)wl-mime-combine-message/partial-pieces() $B$G(B regexp $B$,(B regexp-quote() $B$5$l$F$J$+$C$?$N$r=$@5!#(B 1999-05-28 Yuuichi Teranishi * elmo-localdir-search $B$r$3$3$m$b$A9bB.2=!#(B 1999-05-26 Shuhei KOBAYASHI * elmo-archive-search $B$r$3$3$m$b$A9bB.2=!#(B 1999-05-25 OKUNISHI -GTO- Fujikazu * $B08@h$,(B localdir, localnews $B$N;~$G$b(B elmo-move-msgs() $B$r9bB.(B $B2=$7$?!#$J$*!"(Bprocmail $B$J$I$N(B MDA $B$r;H$C$F$$$k>l9g!"JQ?t(B `elmo-localdir-lockfile-list'$B!J=i4|CM$O(B nil$B!K$K(B MDA $B$,@8@.$9(B $B$k%m%C%/%U%!%$%kL>$r;XDj$9$k!#(B * $B$$$/$D$+$N4X?t$r$3$3$m$b$A9bB.2=(B 1999-05-24 $B2,ED(B $B7r0l(B (Kenichi OKADA) * POP3 $B$r(B SSL $B$KBP1~$5$;$?!#(B * elmo-pop3-get-spec$B$G(B port $B$,(B string $B$@$C$?$N$r(B int $B$K$7$?!#(B * elmo-default-pop3-port,elmo-default-pop3-authenticate-type$B$r(B $BH?1G$7$F$$$J$+$C$?$N$r=$@5!#(B 1999-05-24 "A. SAGATA" * customize $B$G4v$D$+(B `mismatch' $B$,=P$F$$$?$N$r=$@5!#(B 1999-05-21 OKUNISHI -GTO- Fujikazu * WL-ELS $B$r(B WL-MK $B$K2~L>!#(B * make install $B$G(B Emacs $B$,#22s5/F0$5$l$J$$$h$&$K$9$k!#(B 1999-05-20 Yuuichi Teranishi * wl-exit () $BCf$N(B delete-other-windows () $B$r:o=|!#(B * wl-summary-force-exit $B$r(B interactive $B$K$9$k$N$rK:$l$F$$$?!#(B ($B@P@n$5$s(B Ishikawa Ichiro $B$N8f;XE&(B) 1999-05-20 Hidetoshi Shimokawa * device-class $B$,(B color $B$N(B tty $B$N$H$-$NIT6q9g$r=$@5!#(B 1999-05-20 "A. SAGATA" * highlight$B$r(Bcustom$B$KBP1~$7$?(B. * $B%O%$%i%$%HJQ?t$N(Binfo$B$rDI2C$7$?(B. 1999-05-19 "A. SAGATA" * wl-highlight-signature-separator $B$rDI2C!#(B 1999-05-19 TSUMURA Tomoaki * wl-summary-jump-to-message-by-message-id () $B$,(B $B%9%l%C%I$,JD$8$?>uBV$G1#$l$F$$$k%a%C%;!<%8$KHt$P$J$$$N$r=$@5!#(B 1999-05-19 Yuuichi Teranishi * wl-summary-msgdb-load-async () $B$r=$@5!#(B * $B%U%)%k%@0\F0;~$N%P%C%U%!@ZBX$($N%?%$%_%s%0$rJQ99!#(B * wl-summary-mark-as-read-all $B$,!$%9%l%C%I$,JD$8$?>uBV$G1#$l$F(B $B$$$k%a%C%;!<%8$KBP$7$F8z$+$J$/$J$C$F$$$?$N$r=$@5!#(B ($BBg_7$5$s(B $B$N8f;XE&(B) wanderlust-wanderlust-912c443/etc/VERSION000066400000000000000000000042421262320455600201750ustar00rootroot00000000000000[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-912c443/etc/icons/000077500000000000000000000000001262320455600202365ustar00rootroot00000000000000wanderlust-wanderlust-912c443/etc/icons/access.xpm000066400000000000000000000010011262320455600222150ustar00rootroot00000000000000/* 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-912c443/etc/icons/archive.xpm000066400000000000000000000010501262320455600224010ustar00rootroot00000000000000/* 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-912c443/etc/icons/closed.xpm000066400000000000000000000007021262320455600222340ustar00rootroot00000000000000/* 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-912c443/etc/icons/draft.xpm000066400000000000000000000007531262320455600220710ustar00rootroot00000000000000/* 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-912c443/etc/icons/elmo.xpm000066400000000000000000000006121262320455600217170ustar00rootroot00000000000000/* 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-912c443/etc/icons/file.xpm000066400000000000000000000006751262320455600217130ustar00rootroot00000000000000/* XPM */ static char * file_xpm[] = { "16 16 5 1", " c None", ". c #000000", "+ c #FFFFFF", "@ c #CFD3CF", "# c #303030", " ", " ", " ......... ", " .++++++.+. ", " .++++++.++. ", " .++++++....@ ", " .++++++@@@.@ ", " .+++++++++.@ ", " .+++++++++.@ ", " .+++++++++.@ ", " #+++++++++#@ ", " #+++++++++#@ ", " #+++++++++#@ ", " ###########@ ", " @@@@@@@@@@@ ", " "}; wanderlust-wanderlust-912c443/etc/icons/filter.xpm000066400000000000000000000012521262320455600222510ustar00rootroot00000000000000/* 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-912c443/etc/icons/imap.xpm000066400000000000000000000010241262320455600217070ustar00rootroot00000000000000/* 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-912c443/etc/icons/internal.xpm000066400000000000000000000011031262320455600225730ustar00rootroot00000000000000/* 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-912c443/etc/icons/letter.xpm000066400000000000000000000006201262320455600222610ustar00rootroot00000000000000/* 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-912c443/etc/icons/local.xpm000066400000000000000000000010001262320455600220450ustar00rootroot00000000000000/* 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-912c443/etc/icons/localnews.xpm000066400000000000000000000007321262320455600227550ustar00rootroot00000000000000/* 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-912c443/etc/icons/maildir.xpm000066400000000000000000000010021262320455600223760ustar00rootroot00000000000000/* 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-912c443/etc/icons/multi.xpm000066400000000000000000000007531262320455600221230ustar00rootroot00000000000000/* 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-912c443/etc/icons/news.xpm000066400000000000000000000007251262320455600217440ustar00rootroot00000000000000/* 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-912c443/etc/icons/nmz.xpm000066400000000000000000000012771262320455600215770ustar00rootroot00000000000000/* 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-912c443/etc/icons/no-letter.xpm000066400000000000000000000006201262320455600226730ustar00rootroot00000000000000/* 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-912c443/etc/icons/opened.xpm000066400000000000000000000007271262320455600222440ustar00rootroot00000000000000/* 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-912c443/etc/icons/pipe.xpm000066400000000000000000000010511262320455600217160ustar00rootroot00000000000000/* 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-912c443/etc/icons/plugged.xpm000066400000000000000000000013511262320455600224130ustar00rootroot00000000000000/* 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-912c443/etc/icons/pop.xpm000066400000000000000000000007761262320455600215740ustar00rootroot00000000000000/* 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-912c443/etc/icons/queue.xpm000066400000000000000000000010251262320455600221060ustar00rootroot00000000000000/* 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-912c443/etc/icons/shimbun.xpm000066400000000000000000000010351262320455600224300ustar00rootroot00000000000000/* 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-912c443/etc/icons/trash-e.xpm000066400000000000000000000007261262320455600223340ustar00rootroot00000000000000/* 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-912c443/etc/icons/trash.xpm000066400000000000000000000007531262320455600221120ustar00rootroot00000000000000/* 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-912c443/etc/icons/unplugged.xpm000066400000000000000000000013561262320455600227630ustar00rootroot00000000000000/* 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-912c443/etc/icons/wl-alpha-logo.img000066400000000000000000000166221262320455600234060ustar00rootroot00000000000000 0$,0;V>5A"CgF^IF103p7K9t>#?2BiD`HGJn1(B $,0Hr0@|CTGyIU108w;g>xA;DsG%Hy106A9g;Y?}ASC|GSI8103]79'UB7CzFvJ@104M7_9';y>vA;DtFZIT107+97]B5CzFsHx109V;i>uA'DrFNJ,10A3DzFSHx1GQ(B $,0HsJ00F8I}10;V>:A(EPH\Io100|3Z6V: =K@QBjEH'J+10! #`&B)2+x0u1o5u8b:s=k@/B!EGH`Je10#L%Y(S*y.&/82n6&7,:u=j@/C)EMGGJ]10#5$l([*r,i0X2o5t83:"=Q?LC+DjHaK@1(B 0$,08w;W>6A C\FGI%10+].?134-8L9k=B?~AhE|G~Ie10,{/*2a4L8%: IA=E6FZIZ10(}+e.<1m3m7:[<>>^AeE7F{J@10!$$&'')E--.^3"4"7i9:TAzEaFPHw10"c#o&_)`,$/Z1C4<7i;t@sCQF.HiK@10!d#n''*L+`0"1[4 7h9?>0>7@vCUF4Hs10!D#`(&)`+\.Y286/8h;@=X?TB310!0#~' )3,F.Z2}6 8i;R>/>NA1CpF?H~10!o#c(u+U.90v3X677V:);w>>ASCZGrHt10,{.z194(6G:>;y>:BECSFV10GQJ01(B 0$,0!!#_&>(}+\10"~&('<+V,R0w1p657.9S< >s@}CaF3Hs10"z&-(7+S-I/W3D4W8l9t>0?+CPE=HpJZ10#T$Y(k*w.)052&6/74;L=D?IC1EMG>KG10"l$u(Z*r-v/Q334o8%;KSCRF1HdJ410.;6:8};l@_C(E|HfK;10!(#p&G)n,P.z1(678v;Q>,@RCKF"G1J 10!t$P(!*Q,&/)2u608W;FlAKD"GAK@10!B$M'l+;-7.r1Q406o9R;t>C@z10#[&:({)Z+y.H0}>3@sCRF1F210B3ERH1Jp10"/$n&u)4+s.V153t6C9$;c>BA"CYF@I/10!"#a&>(}+\F.HmKH10"?$~']*<-[0Z394h6s9T;t>;10!.#e&D)#+b.A1(3f6S:2>-@dC310!+#l&K)++j.Y183w10!&#a&@(,|0:2y10"&"(n+@-|.B1;3`69;Y>6CS10"O#`&e(~,K.>1Z3`7y=)>6AcCVFQJ210"c#_'%(~-+.>193a6w8z=%>6BCCSGu10"$>'=)|+{0*1I4(6G:N;m?,A+CjFyI(1(B 0$,0">$(&D3Y698w;[>CA(CqF\Io10#9%](r)J,6/Q2h678%;R=M@dAsERH1J010#]$Z(u+<-{/Z291(B 0$,0F4Hs10!!#`&?))+e.Q1.3n6d9p<+@IA)F,HnKO10#:%S(S*i-P/G1n5s8.:e=k@2B_EnH)J(10")$Y(T){-W/R3I5X7W10#?%^']+\.;0z10&I*8.70r3Q4t6s9$;d>;@vCUF2Hq10!>$=&|)++b.A1 3_6>8};\?[B:DyGWK610"F%!&>(}+\.;0z3Y8{;_>9@}C|FFIe10"A%((%+?-b0y3X678n:4BA!C`GOKN10"8$=&|)X+s.R153t6C95;d>SA2Cp10#O&.(m+L,s.v173g6>8y*?-^0y3X5x7W10#?%^(=*|-[/Z10!^$:&m1#O(B 0$,0!'#~&O)\+p1+6\;gA'F:I110"S'&(~+}.?1c3b7!90;z?~AhE9@{CTFZHt10!$$'&@)E,@.K1>4A6J9Y< >wA*E9F7In10$~']*<,{/Z294x7W1(B 0$,0@uF9IR10>LAKD"GAIp1(B 0$,0CSF2Hw10(+].=1(3e6R9ES@zCYF4Hs10)*,y/X3W466U8|;\>;@zCYFhI{10!"#}&\);+j.A1 3k6b9q;x?CCRF1HjJp10!"%+(()R.(//3G4m8b:d>*@^C*F,H^I{10#]&=&|*{,4011U4j7S:u<4?SB0DmGFIK10"o&.'M+<-{0Z396(8o;N>1@pA!E!G`J?10DrH1Jp1(B 0$,0#]$}&|)[+z.Y1'3]6A8{<*>IA>DIG(J^10"j$T(+*j,W022q4h8W;6=U@4B310!^$}({*,+{CaFfK/10#W%^CPDQHTHq106S: <,@QBjDaHLJ.10?TB3Dr1(B 0$,0@tCSF7H{10;m?*BjD`HOJ^1Hs0D&H\Io1(B 0$,0@tCWF6I+10;W>OB"DjHQJp10==@dF210!!#g&O)",D.E1-4M6L9K;?>BGEFFzI`10"i$S('*f,O//2b597"9]<|>JBAC~FMIH10"o$n(]+<-[0:294x7W10;V>6@xC}FWIh106A9:~C'E'F3H}107W:f5CUF5Hu103]6L9==,>ZAgD6@|CVFDI710!g#o''),,@/b1l3_7.9D=1?LB#ErH1J010"K$:'5*,,[0Z2y4x10@tCTF2Ht10;y>FA^CYG'H~1(B 0$,0F3Hx10E:F=Il1(B 0$,0;V@uCZF3101"3[6B9];W>EAUCZFsI 10294xB3D2G1I010;^A7F@10.<3`;gBCCSF?H|10#_&P*C+i.F1u407G;6=UCaHo10#?%^']CCER1(B 0$,0688w;X>9@zC_F4@sC>F%HhKO10!&#e&@(}?TBsERHQK@10#W&.(]+L,k/J21406o9N<->LA/CnF?H~106:8y;X>7@vC]GDHw10!-#d&D)#+b.=0|3[6T9?=r@]C,EMHlK@10!&#m&|+Z.60y3D668S;F=U@pCQF.HQ10"r%}'Z+M-{0:293Y688w10#"% (>*~-\0\3J628p;G10"5$x'M*;,z/Y3S5E8-:#=@@NBhDaFJI&10"=$|(|+[.1//345N8$: =r?~AnEHG;K-10#.%b'=)|-K0*1q6 73;,=K?B EgH'J]10"?B3DrH1Ip1(B 0$,0#_&>+].?0~3]698|;b>M@~CgF\I;10"m$Z'9*t-S0*2)4i8X;7=X@5BzDwGXJ510!"#c&T)Y,R/W1p667,;U=??SC=DQHfIo10"}$v(u*,-{/:395x8W9v>%@#CMDIHpIg10!"#_+\.<0{3\6?9F==@DC3ESGQHs10"i$u(W*y-2.w1$3n6t9AiCADMHgJ_10$~(=+<,[/J3I5H8g:&>%?tCJDGHpIg100z6:8;g@CAEEwGWHs10!,$4&Z*'-y0/2$5u7B:l>"?.CJE?HNI{10";%v(5*,.+0Z1y5x87:v=u?|B#ErH1J010!!#k&H)Y+j/l3Y68;V@tCS10#4%I'Z)g,p0U2f5M7B;4=>@+A}E@GFJ[10"?$~']*<,{/Z294x7W:v=U>vBhE}G0J^10&>(}+].?1#3c6=9K="?oCHEhF;H}10"6%5'K)z-G0V2e4T8-:`OA]CgF{Hz10"a$F']*N,<.E1<48%9r5B]DGG(J_10! #_&?(~+`.C1#3k6L9 =A}E\GfHz10"/$n(]*|-_/-3X5X7W:vEAUD.GIK@10!!#b&H)<@uF3Hu10!q%C'')0+d.<1&3k6>9D;k?zAiE5E'G$I7103Y699&;[?,B$EtH1J210!m#z'9*t,+0*2i3h79Z=%>^AUD{G%J210?TA;D4FEJQ1069;W><@xENGCK010!1#b&N)g,"/h1G5$6c9X= ?$@}DBG[I110"{$v(]*|BSC\GvI#103Z8{;e>yACF'H9J210!!#f&_)-,~.Q1g5$6c9b;y>6A;D4F9JR10"W$6(m+<,{>5@xE9F?Jl10(};f>TB5F;10!!#b&MLA[C^GeHr10"@$")@+\.B0{68;Y>5@vCeF7H|10!O#n'u)4,3.R2)4(7G;6=U@4B310&>+]0}6H;g@{FC10!{#v&u)L,k/:1y4X6W9F;]?T@{D2F3I 10CSFXH~10>DC3ERGQ1(B 0$,0!:#|&h)Z+p.y1.476l9E;r>oA CYF6Hq10#3%\(q*j.7/03U5A7T;?0@"CNE@HpJ,10#W&6(<*x-:09285v8r9l>4@#COF"GQ10!.$M'|+;-Z0e385V8s;F=U10#^&=({+X,k0Z2910"$~6g9&;n>?@yCVF5Ht1087:=;Y>8@zCVF5Hw10;M<5BsDrK@10;N=u@4BsERH1Jp10!,#h&D(~+\.;8w;V>5@vCUF7Ht10"i%U'G+2-H/O1o4M8b; ;>VAEF#Hx10"t$h(T*h-P/G2d4b71;==?BEE@HGI"10"o%N'5+H-//P1f5K8#9mdBeCwH"Io104y879e=v?%C,D_FtJ}10!v$)'4*j,Q0(2'4T8#;T;c?bA.DLFKIj10!"#_&>8~;]>tB/D:FqJ/10#[$v(]*<95;i>DA2CeFBI 10! #a&>(}FA-CmGjIa10#[$v(]*<6o9NtB/DFFqIo10"v%|(9*4.+.z9$<*>TA1CSIK108};o>DA"DrGQI-108y6@wEWF~J810#<%I'R)K+z\B8CyG_IL10"/&#(M(~,#.{1$38E9t=p@6BuETFsIR10!t#h&z*u,k0Z2y8;]?\B{DZFII 10!t%H'2*g,z;T<%>dACD"FaI@10!}%Z'M+<,{:5<>>tB/DZFqJ/10!$#`&>95;i>DA2CcFBI 10!q%3'1*f,`.I8y=[@8B:CVGUJ610!t$I(,*x.+/Z;F;V>5BtCUF3Ht10#?$~:v=V>wA5CtGDI!10!##c&?(}:&=mF9KH10"S$#(&)F,N.y;T='?TCKEbGQKN10#-$:'U+L-[106u9y=V?TB3DsH2IO10!G$C&e)-+b9"=!?^BTA3E2HQIp10# 6:8x;W>7@uCTF3Hr10!c#p'%)a+z8o@TAsKH10!F%<'U+L,{9W<8?7A8DGFJIY10!#&>8y;\?Y@wC^F:J@10!'%?&D){,w8w;\>@B;DzH=IW10"/%~(=:w6@vFQK310!#&?:w<&>5BtECFBJa10"c'p)#,y;R;yCCE"KL10"w$n(]*<9w"(B $,0!!(B $,0!?(B 0$,0!t#h&G(~+\10!?$*(h*P-P/01C3r6B8{;Z10!2$(('*f-E0/2c5E7,: 8@uCS10!o%/(')n-//2c4M6[9k=??fB]DGFcHw10'-*d-/.`2c4M7i9;=??}A]DDGeJU10!C7W9V|AeE=AWE#F{I/10;z>9@}CWF;Hv10"l$S('*f,P0$1s4M8!;,=??)B]EGG~JZ10"?%^(=*|,[0Z2Y4h8':f=E?,BkDJG)J\1(B $,0!^0!t#}10!~&61#W(B 0$,0! #d&B(}+^0z10!t%H'H)v,P0$1n5B72:`5A"CgF^IF103p7K9t>#?2BiD`HGJn1(B $,0Hr0@|CTGyIU108w;g>xA;DsG%Hy106A9g;Y?}ASC|GSI8103]79'UB7CzFvJ@104M7_9';y>vA;DtFZIT107+97]B5CzFsHx109V;i>uA'DrFNJ,10A3DzFSHx1GQ(B $,0HsJ00@xC]FDIt10;V>:A(EPG6A C\FGI%10+].?134-8L9k=B?~AhE|G~Ie10,{/*2a4L8%: HAVA\E=FPI 10!G$C(%)!-D/,2A3}6:H;y>tAzEaFPHw10"c#o&_)`+m/"2[3l6y:6;t@sCQF.HiK@10!d#n'')=-%/j1;4@7`9?>0>7@vCUF4Hs10!)%>&G)m.Y286/8`;H=X?TB310"G#n( )#-F.>3A5z8k;O>/>NA1CpF?H~10"a#f(n+V.70v3X677V:1;v>8C$EVHBJp10!o#f'!(},#.;2]3Y6_8x`A)D.FrHx10,{.z194(6G:>;y>:BECSFV10GQJ01(B $,0F40B;E6G-JX1(B 0$,03Y698z;X>:CS102Y4X6:N<]?,BSEr1(B 0$,0!!#_&>(}+\10"~&('<+V,R0w2d4v7B9t<*>SA(CaF6Hs10#:%Y(r*k.://3T5F8t:a>4?~B2EgGPK%10!t&9'K+7,q0Y2n6'8,;4<`@qAjF/G|J.10"l$u(Z*r-v/Q334o8%;KSCRF1HdJ4100{6:8}<$@?CFE|HfK;10!$#s&G)N-@.z1(678v;Q>$@RCKF"G1J 10!h$S'/*Q,N.i35608W;FlAKD"GAK@10!b$-',+;-7.r1Q406o9R;t>C@z10#[&:({)Z+y.H0}>3@sCRF1F210B3ERH1Jp10"/$n&u)4+s.V153t6C9$;c>BA"CYF@I/10!"#a&>(}+\F.HmKH10"?$~']*<-[0Z394h6s9T;t>;10!.#e&D)#+b.A1(3f6S:2>-@dC310!+#l&K)++j.Y183w10!6#a&@(,|0:2y10#I%^(r+<.$.>193b@vF2Hq10!p#b&^)$,;.L293\7P;>=~@`A,EvHVK410!C#_'%(~-+.>195!9:>FASC[FQHr10"$>'=)|+{0*1I4(6G:N;m?,A+CjFyI(108x;Z>=A%C_FJHr10:6TAsE2G1J01(B 0$,0! &?(}10!w%B(i*T10CUF2Hs10;V>5CSGRJ010dAcDbH!K01(B 0$,0@tD"FJIK10>QC)EaG\J>10?TC+EjFIK@1(B 0$,0"~$(&D3Y688y;[>AA*CoFHJ/10"j&;(t)I,V/Q1x6/75;R=M@dAsERH1J010">%z'U+<-{/Z2910"5%j1(B 0$,0F4Hs10!!#`&B)'+e.P1.4%6b9p<"@OA)F'HnKO10#:%S(*)q.(0/1o5s6n;E;@vCUF2Hq10!>$=&|)++b.A1 3_6>8};\?[B:DyGWK610"F%!&>(}+\.;0z3Y688x;b>=@xClFFI{10"I%0'e+/-b0y3X678v:4BA!C`GOKN10"8$=&|)X+s.R153t6C95;d>SA2Cp10#O&.(m+L,s.v173g6>8y*?-^0y3X5x7\9!;g>XA.D$F6H10#?%^(=*|-[/Z<5@4ASER10!^$:&m1#O(B 0$,0-S0b2q5p8/9~=M@`AnF(HLI~10!"#e&L)++j.A3t6V95;d>;BpE}G.KG10#[&:(y+W.:0B1!408s;N>-@lC2D\H(J*10#'$~'o*<.://345N8V:#=R@cAoF/GzJn10"k$Z())p-I/P37607r9|B@DMFHI=10!&7W:6=U@dAkEHGPJX10"?BkEG0KH10@~EoHhH10B6DqHmJ0106C8|;`@1CRDtF4Hq10?VBnEhGLJ^10! &>;d@sB]EqG;K-10"?$(=*+-v0x1q5p8/;-=T@\BkEjH)K@10"/%~(=*<.;3Y:->4@}FFI010!$$'&@)E,@.K1>3a71:.=l@sANDyFGI>10$~']*<,{/Z294x;F#?S106o;.=L@sCK10:&=p@3CK106893>4@UCS107N;ULAKD"GAIp1(B 0$,0CSF3Hw10&>(+].=1'3s6F9S7@yF210597F:%=4?@B/ENH]H|105x8o;R<4>S@zCYF4Hs10)*,y/X3W466U8|;\>;@zCiFHKK10!"#}&\);+j.A1 3s6J:!;x?CCRF1HjJq10!&%)(')r-U/13N4e8Q;L=b@iCAEgHgI}10#]&=(<*{-X.u1M4n8s:u<4?SB.DiHnIE10"o&.'M+<-{0Z396(8o;N>1@pA!E!G`J?10DrH1Jp1(B 0$,0#]$}&|)[+z.Y1(3]6A9 ;j>_A>D]H If10!J%t&k*j,W02214i8W;7=U@4B310!^$}({*,+{2Y4X7w;6CaFfK/10#W%^CRDQHRHs106S: <,@QB*EAGLJ^10?TB3Dr1(B 0$,0@tCSF7H{10;m?*BjD`HOJ^1Hs0D&H\Io1(B 0$,0+f.H1$3e6F@tCWF6I+10!T#m&G)),f0X2$5N8v;W>aArDjHQJp10#\%)'c*I,R0w2d5u8v==@dHq10#^&.({+X,h0U2&5S8v9@;?)B]E:GzI`10#7%Z'F+5-Z/D2p5r8v9Y=,>:AAC^G-IH10#:%U'K+:,g0r2i5x8710#W;V>6@xC}FWIh10!76A9_;?)C%E'F:Hz107W9f(}+\.A0~3g6F9A6A'CTFZHw10!4$@&E)n+d/~1\4#7^9t;q?LCCErH1J010!k#z(5*,,[0Z2y4x10;i>`A\E%G>J{10&>(~+^.@1$3g6U<=>FAZE)F7In10"v%x'\+L-{/Z2910"4&-(r)*+h.=CTHt10#?$>(=*|-K/J314p6oD:G]IL10&A)!+u.?1#3]6N9"10&})<-{.z2y3x77:v>6CVHr100z3c6Z8}='>5BEGc10(}.=2?5#6FB3D2G1I010#<$i(:+3.:0*395X;V>;@xCYF?I%10!$#i&K)L,"/)286#75;P4@sC.F%HhKO10!&#e&@(}?TBsERHQK@10#W&.(]+L,k/J21406o9N<->LA/CnF?H~106:8y;X>7@vCmG4Hw10!-#d&D)#+b.=0|3_6L9C=N@aC,EMHlK@10!&#m&|+Z.:0o3X6&83;F=U@pCQF.HQ10!r%]'Z+M-{0:293Y688w10#!$(@*~-\0]3J628p;F;V10"4$x'M*;,z/Y245u8":`;~@KB^DIFZJk10"=${(|+[.)/O2f4S8-;+=B@/AiEGG>K*10#.%b'=)|-K/J314 8S:lAA(C}F\I;10"m$Z'9*t-S/J2)4h8X;8=X@5BzDwGXJ510!"#c&T)Z,P/Y2c678L:u=?3CMDIHoIe10"}$v(u*l-{0Z395x77;6=E@cBmF)H KO10!!#_&>+\.;0{3\6?9F==@DC3ESGRHr10#Y$U(7+I,2.W1$3v6l91iC1D]HoJ[10$~(=+<,[/J3I5H8g:&>%?tCJDGHpIg100z6:8;g@CAEEwGWHs10!,$4&Z*'-y0/2$5u7B:l>"?.CJE?HNI{10";%v(5*,.+0Z1y5x87:v=u?|B#ErH1J010!!#k&H)Y+j/l3Y68;V@tCS10#4%I'Z)g,p0U2f5M7B;4=>@+B EuB!EmG(Jn10(+\.@1#3c6A9,IB=CgG'Hu10"c$>'q*<, /]1$5?7%9r5B]DGG|I910! #_&?(~+`.C1#3k6L9 =A}E\GfHz10"/$n(]*|-]//3X5X7W:vEAUD.GIK@10!!#c&P,;@uF6Hr10!g$S(")E+e.>0|3c6N9<;c@*AYE5E'G$I710'-*l,K0j0z699&;[?-B#EsH3J010!M%:'9)T-K0*1I4H7_9j^BUC[G%J210?TA;D7F9JU1068;W>8A8DNGBK010!3$<&N)g+b0(1'5D6C9h9BkF$H5J010#h&M)a+~.A1G4D6C:b;Y?&E5@xE9F?Jl10;e>VB3C[Hr10!"#b'm=%>LA[C^G%Hr10!H'!),+\.>3\;W>5@vC]F7I\10!O#n'u)4,3/21I5H7G;6=U@4B310#_) 0}699&;Y@{F:10!;$6&u)L,k/:1y4X6W9F;]?TA#F5IP10CSF8I^10>DC3ERGQ1(B 0$,0!>#h&|)Q,*.W1T4/6e93<0>KA1CWF810!s&<('*:.%/83Q4M8t;+=P?BCNE@HlJ^10#^&=(|+I.60h3D668t;U>"@oBaF-H KL10#W&6(<*8-:093X5V8R:3=l?SCOF"GQ10!.$M(\*[.:0W2p6683;F=U10#^&=({+X.+0Z2910"$~6g9&;n>?@yCVF5Ht1087:=;[>8@zCVF5Hw10;M;uBsDrK@10;N=u@4BsERH1Jp10".#c&C)!+\.;8w;V>5@vCTF7Ht10!u$k(R*r,h//3/4-8L;;;>VAEF#Hx10"t$h(T*h-P/G2d5B71;==?BEE@HGI"10"o%N'5+H-//P1f5K8#9mdBfCvH#Io104y879e=v?%A|D_H8~;]>tB/DFFqJ/10!{&6(]*<95;i>DA2CeFBI 10! #a&>FA-CmGjIi10#[$v(]*<6o9NtB/DFFqJ/10"v%|(9*4.+.z9$<*>TA1CSIK108};o>DA"DrGQI-108y6@wEWF~J810"l%I'J)w+zdACD"FaI@10#6$((S)E-V/@:5<>>tB/DZFqJ/10!$#`&>95;i>DA2CcFBI 10!q%3'1*f,`.I8y=[@8B:CVGWJ410!t$I(,*x.+/Z;F;V>5BtCUF3Ht10#?$~:v=V>wA5CtGDI!10!##h&B(}:&=mF9KH10!t%B&f)f,N.y;T='?TCKEbGQKN10!m%Z'U+L-[10! 6u9y=V?TB3DsH2IO10!G$C&e)!+b9"=!?^BTA3E2HQIp10#!6:8y;W>6@uCTF3Hs10"?$S&E)A+z8o@TAsKH10!6$\'U+L,{9W<8?7A8DGFJIY10!$&>8y;\?Y@wC^F:J@10$S&@){,w8w;\>@B;DzH=IW10"/%~(=:w6@vFQK310! #b:w<&>5BtECFBJa10!C#_'&*C,y;R;yCCE2KL10!W$n(]*<9w"(B $,0!!(B $,0!?(B 0$,0!t#h&G)!+]10!?$*(g)F-p0(1B4.6D9!;Z10!4%H('*f,P0T1n5C7A9pH@xCS10"_$F'r)m,Q0"1d4L8!9;Hr10A3E"GAJP1(B $,0!?!1(B $,0!!!/(B $,0"?(B $,0!3(B 0$,0)-+o/E1.4#6K9s<(10,{/Z7W:61(B 0$,0#_(}10"_$^'}+<1(B 0$,01#3n6[9_<+?9@}Cp107W:6>@~C\F;Hu10#4%H(2*i-E//3.5B7,:l_A-C\F6Hs10!{%J'9*h,W0&1u5D73:b5A"CgF^IF103p7K9t>#?2BiD`HGJn1(B 0$,0F2Ht10@uC{FCIT108w;y?fA7D;FUJB103\6x9*=6>HBUCZGvIX104=6_:;;e?yA%E3FEIP101Y3m6W9[;]?%@uDFId107+8w5A+D/HmKM109V;i>uA7CbFsI$10A3DzFSJ01GQ(B $,0HsJ00F8J*10;V>9A1E}G.KK100{3[6U:!6@}CWF?I*10+].?134N8,:`X@|DGG#J@10+e.?1B4J7{9+=>?fA7DGF2J*10!!$''g)m-/._1a4M7i9:<6>;BrD1FoJ(10"i#n'')m-/._2K4A699G>3@sCQErHQK010!h%.'')@-+.B1j496b9Y<0@g@vCYF3Hq10!D%&&b*<,90y3X5]8 :L>-10!G$A&T*_+p/b2~5x7Q:n;p><@C^F=H|10"?&3(u+U.70x284w869K=e>SA+C^F=H|10"{#k'))2,B.P1_5+7Z;9T@}D2GYI210!o#f'a)=+c.{0}3i6w9*=BSCWGaHt10,{.z194(6G:>;y>:A5C[FrHt10GQJ01(B 0$,0!"#_&>(}+\10">%s'\+1,z0O285m7V9K<$>nA"C_F4Hs10"n$x(T*9-r/W3D4W8q9m>3?CPDIHoIe10#5%['S*k.0/53V4N8v:`=r?JC.EOHHKJ10"|%t(8+J,V0p1v6#8T:m>"@*C0DhH KG10"u&+(X*y,f0X2n6#75:1=l@3COF"H1J010"u%{(4)w.*08354p8g;6iA~DLHGJZ10")$S(**&,Q0/2d4R8L:a=K?)A}E?HFJ]10"t%H'J*g-E//2&5B7,:#=@?+C1DNH)J 10"m%L'9)x-S/R2)6(8W:vsB2F1HpJ1103Y6>9%;d>7B6DsGSJr101X678v;'=9?hBGE|HQJs10!)#p&B)F-D.d2B6"8@;A>$?RCKF"HQK010!f%=&{)U,./Y255P8':R<4>SA"10#Z&9'Y+8-w.V>-@sCBCYF4Hq10#?B3DrGQJ010!_$^'M)L,3.r113t6S9$;c>CA"CaF@I/10! #_&>(}A3F*HiK@10']*<-[0:394X6v95;d>7@t10!%#l&K)*+i.H1'3t6S;N>%@T10!+#j&C)++j.I1(10!.#a&>*<-{0:2y10#@&"(>*|10!'$@&M)]+o1#6@;W10!?% &e,D2K3`6X8z=6>|E$I410"$>'=)|-;.j1I4(6G9.LBKCjGYI(1(B 0$,0#]$)&D3Y688y;[>?A2CgF`IK10"n&3(|)F,Z.u304w8U:2>-?DC3ERH1J010!}&:'U+<-{/Z291(B 0$,0F2H10CSH2K210! #a&?)*+`.G144"6L:,<"@IBnDHG;J]10",$X((+F,Q0'2.5C8&:mLA!CXF7Hs10!=$|'[)8+g.F1%3d6C92;q>P@C^FMJN10!>#l&D(+^.=0|3[688w10! &C)*-z0y3W678u;<=Z@>CHD\GEIq10#)#c&Q)F,%//2^4O7^:TSARD1FM10#?%^(]+<,k.r1U3f6F8};X10&C(+^.=0|3[7Z:6(-"0y3X6.8710"?$~(=*<,{/Z10">$}&y1#?(B 0$,0!g'/)$+].J1[3h6<;}>6CfHy10%0)A,}._1#4:6Q9`;j?>BHDGG{JZ10"+%:())p-I/02g5F8#:b5@}CVFZHt10!4#_&h)-,@.c1\4!6J9a;x>A&E9F?J^10$~']*<,{/Z294x7W1(B 0$,0@tCv10>LAKD"GAIp1(B 0$,0CSF4Hu10&>(}+^.@1&3s6N935@zCYF4Hq106:95%@dB#D*FA10(+b/Y3X6788:w=V@5AsDRG110&U+Z.90x24~7Z:6J+10!.#e&>+\.;0}3p6L:0=A@QB,F"HQJp10#P&=(y+Z.:0x3P6#8J;=>4@sCRF0HkK;10"t$i(S*v,P002&5C7r;!=|@gCPEKH/IO10"/$n(m+<-{0:2y5X7W:610#[&<(y+X,y/V1U3t6?10(~+\.<0{3e699#;~>_A>DIG(J^10">&=(|*;,w022q4h8W;6=U@4B310#[&6(=CaF\KO10CRDPHTHr106S: I;10;W>KBrDjHQJp10==@dHq10!@#c&O)&+`.d1#3r6a9@=??)B]E:GyIb10!t$S('*f,O0#2b5;7z:A<|>BAAD~FMJh10"/$n(]+<-[0:294x7W10>9@xCeFWJh106A9g=+>]C=DwF;Hy107W9f>A'CSF\Hw10!1%F&?*e+m/#2L4C7n9DlCCErH1J010!k%:&u*,,[0Z2y4x10@uF3Ht10;y>6B^CYGH~1(B $,0F30E:F=Il1(B 0$,0;V@uCZHr100z3c6Z8};w>=AUGeHq10294xB3D2G1I010;]A5F?10(}.>6;9&T@wDrF@I<10!h#_&`)#+i/&155P7G;6=UDAHo10#?%^']CCER1(B 0$,0688y;V>;@yC]F@I%10!&#h&\)R+v/Y2c677D;M;U>4@pCCErHQJp10$~']*<-[/Z295X87;6>%?LAOCnFMI/10"%_(t+[,z/Y1U406o9.;m>@@yCYG8I_10$~(=*|-{0Z2|3\6H9Q=j?UABF1HpKL10! #_&L)&,v/1384f7S:f=u@4BsDr10".$l'Y*l-K0J2V476v:49";h>>@~D'F\I'10"m%J(9)t-S/J2)6)78;7=X@7BxDyGSJ710!"#d&X)J,v.h3T5F7T;A%@#CMDIHpJ_10! &>+\.<0{3\6?9F==@DC3ESGRHq10"y%u'W*i-R.t1(3m6r9C%?4CFDOHhIo100z3Y689!;w@BADEyGSHv10!*$4&Z*'-Q0U2&5N7D;1=K@aAnF'H K+10!{&6(5*,.+/:395x87:v=u?|B#ErH1J010!!#k&S)I,I.M3Y68;V@tCS10"t$i(X*q-J/C305E7Q:a=k@.AhEHG;K'10"?$~']*<,{/Z294x7W:v=U@6BhEAHHIn10(}+^.?0~3e6A9AIB=C|FGHz10"_$B'm*=, /[104?7%9rIAUD.GIK@10!##g&@)<@uCSF5Hq10"Q$R(")E+e.;1&3[6N9,JBYDGGcI410"k%J&Y*4,k0Z2y4x>5@wCsG|JG10+\3Y699&;Z?.B#EsH3J010!M$Z'y)T,k0*1I4H6:J;u?)B7DDFEJR10>TBED6GcIY10688x;V>8A7ELGAK210!1#f'")/,B.h2G4$7#8|5@|E9F?Jl10;e>VB3C[Hu10!"#b&M=%>LA[C^FEIR10!?#`'%+d0{69>9@vCUFGH|10!O#n'u)4,3.r1I4h7G;6=U@4B310! ) 0{3`8w;Y>DCtF910!;#v(5)L,k/:1y4X6W9F;]?T@{CsJ810CSFHJ>10>DC3ERGQ1(B 0$,0!>#k&{)G,:.g1P456f9Q<$>q@~C`F8Hq10#]%I({+7,i0u1x627.;T<`@2C.F!H.KF10"i&=('+[-p/Y3C5W8a:u>+@!CRDGHpKL10#?$v(!)M,v/Y284u8n:d>,@3COF"GQ10!.#l'X+Y.20g1x6683;F=U10#=%M'[*x.+0Z2910#O$~6g9&;n>B@uCVF5Ht1087:=8@zCVF5Hw10;M;wBsDrK@10;N=e@4B3ERH1Jp10!,#h&@)"+].;8w;V>5@uCUF7Ht10"j%T'J*g-u0/2f4"8L;@<>YADEbF9Hx10!t%T'J*g,e0T1o5B8!;1={?~AeElGgI[10"o%N'5*(-o0(2d5m8!:mdBeDGFcI]104y87;%bBNClGkIJ10!!#a&>8~;]>tB/D:FqJ/10#[$v(]*<95;i>DA2CcFBI 10!!#a&>(}HA-CdG*JI10#[&6(]*<6o9N(+\:5tB/D2FqJ/10"v$l(9*4.+.z9$<*>TA1CWIK108};o>DA"DtGQI-108y6@wEWF~J810"y$S'J)S+zDB6CiGIL10#O&((>)D+]/"0|4O8E9t=p@6BuETFsIR10"d#h&{)T.+0Z2y8;]?\B{CzFYI(10!t%H(R*g,z;T=I>TACD"FaI@10!}%Z'M+<,{:5<^>tB/D:G1J/10!)#c&?(}95;i>DA2CkFBI 10"h$((G)F,P.I8y=[>xB:CVGWJ410!t$I(,*x.+/Z;F;V>5BtCUF3Ht10#?$~:v=V>wA5CtH$I!10!)#h&A(~:&=]F9KH10"h$H'r*^-F.y;T='?TCKEbGQKN10!M$Z'U+L-[10! 6u9y=V?TB3DsH2IO10!g#s&])F+b9"=!?^BTA3E2G1Ip10"#_6:8x;W>7@uCTF3Hr10!c#o&_)e+z8o@TBSKH10!.$\'U+L,{9W<8?7A7DGFJIY10#`(}8y;\>9B7C^F;J@10!A$&h)k,w8w;\>@B;DzH=IW10"/%~(=:w6@vFQK310#b&>:w=F>5BtD#FBJa10!'$@&N)+,y;R=9CCCrGQKL10"w$n(]*<9w)+.910![$n(]*<1(B $,0">"(B $,0!?(B 0$,0!s#h&G)!+]10!q$S(&)r-P0$1o4-6D9 ;Z>510!*$('2*f,U0O2c5E7,:k=??/B]D\FFI+10!7$6'M*l-K/J2i5H7/9n=A?*C)E=G,Ie10!'J01!!0(}.;10"h#c(2)f,M/.2c3}8 9@;_>=@uCS10!o$ '1)e-00#2^4"7):J=:>]B]D}AeE'G#JU10!)7W9V|BEC|FzIb10!!A\E$G%I510! >6ADA^E1HiJp10.;3]6_9Y<$@2CCDr10)!,#.|1$4W83;F9@}CXF6Hu10"j$h'2)q-E0/2f5B7,:`=j?.B^E5A"CgF^IF103p7K9t>#?2BiD`HGJn1(B $,0Hr0@|CtGeIY108w;g?x@{DCG[I1106A9g;Y?}ASC|FBIR103]79'UB7DDF9I2104M7_9';y>}@uE:FsI8107+975A-D.HpKN109V;i>uA'D2FFIP10A3DzFSHx1GQ(B $,0HsJ00@xC]FDIt10;V>:A(EPG6A C\FGI%10+].?134-8L9k=B?~AhE|G~Ie10,{/*2a4L8%: HA=DDGeJP10! #_&C(}+e.;1F4C7)9@=9>}BHE;F3J-10!9$J(6)q-U/&335L6`:Z=6>;ARD1H0J.10"Q%B&f)n,?/s2[5-6?9G>3@sCQF.HaK@10!i%.&b)^,#/Z1n3y7"99=0@g@vCYF4Hq10!3%@&F,90y3X678Y;3>-?TB3DrGQ10"O$A&d)/,@@C`F?H~10"D&.(w+X.80x284w6v9U=m>SA/C^F?H~10"=$]'k)B,B.Q1`5+8:;A>(?SARCqFPH10!4$>&O)]+o.z2N8L:6=)@4C=ErHfK@10!a#n'"),,<.N1Y3b6X:>;v?XA$D6FBIP10!o#f'!(},#.;2]3Y6_8x`A)D.FrHx10,{.z194(6G:>;y>:BECSFV10GQJ01(B $,0F40B;E6G-JX1(B 0$,03Y698z;X>:CS102Y4X6:N<]?,BSEr1(B 0$,0!!#_&>(}+\10"~&('<+V,R0w2d4v7B9t<*>SA(CaF6Hs10#:%Y(r*k.://3T5F8t:a>4?~B2EgGPK%10!t&9'K+7,q0Y2n6'8,;4<`@qAjF/G|J.10"l$u(Z*r-v/Q334o8%;KsB2F1HpKO103Y6>9%;d?[B6ESH3Jp101X678v;U>)@>C'EdHYK310!(#c&R)E-E//2C5j8l;A>,?RCKF"HaK@10!f#}&|)[,:/Y255P8/:R<4>SA"CY10#^&=(y+Z-y.X1'>-@sCRF)F4Hq10#?B3ERH1Jp10"/$^'M)T,3.v153t6U9$;d>CA"CaF@I/10! #_&>(}BSF*HmKL10"?$~']*|-[0Z394h6v95;d>;@t10!%#m&L)++j.I1(3w6U;T>1@lCCDr10!-#l&C)++j.I1(3_10!.#e&>*<-{0j395x10#D&6(n+<,[10!)#~'"),,@.J0}6A@vF2Hq10!p#b&^)$,;.L293\7P;>=~@`A,EvHVK410!C#_'%(~-+.>195!9:>FASC[FQHr10"$>'=)|+{0*1I4(6G:N;m?,A+CjFyI(108x;Z>=A%C_FJHr10:6TAsE2G1J01(B 0$,0! &?(}10!w%B(i*T10CUF2Hs10;V>5CSGRJ010dAcDbH!K01(B 0$,0@tD"FJIK10>QC)EaG\J>10?TC+EjFIK@1(B 0$,0"~$(&D3Y688y;[>AA*CoFHJ/10"j&;(t)I,V/Q1x6/75;R=M@dAsERH1J010">%z'U+<-{/Z2910"5%j1(B 0$,0F2H10CSH2K210!!#`&B)'+e.P1.4%6b9p<"@OBiDGG>K+10#:%S(*)q.(0/1o5s6n;ELA!CYF8Hs10!=$}'\)[+i.H1'3f6E94;s>RA!C`FOJN10!>#m&D(+^.=0|3[688w10# $~&C*K-z0y3X678v;U>0@^C8DlGEJ!10#E&2&R)F,E/o3.5C7^9t=1?0AaE0FoKO10#^$}'\*;-Z082U5T6S92;q>SARD1FPH~10#O&.(]+L.+.r1U3v6F8};X>5B3DrGQ10&C(+^.=0|3[7Z:w=U@410#_&>(-"0y3X678r;610"%^(=+<-[0:2y4x6<9!;g>XA.D$F6H10">$}&|):<5@4ASER10#W&.']1(B 0$,0.3/2315P8_:n=m?@BqE}H(Ij10!"#e&L)++j.A3t6V95;d>;CPDIH.K&10#[&:(y+S.:0B1!408s;N>-@lC1D]H0K%10#'$~'o*<.://3H5M8V:,=r@2C=EOG>Jj10"k$Z())p-I/P37607r:c<;?BBD8w;p@SB F)G+K?10"?$(>*'-z0x2a4p8O:l4@}FFI010!$$'&@)E,@.K1>3a7Q9n=L@SB.DyFGJ^10$~']*<,{/Z294x;FEPHFI10!$#m&J(+\91=T@dB)EmH.K'10#@%!'b*C-Z0R215@8o9q=T@\BkDjHAJ 10"$~']:v=s?S106o;.=P@SCK10;FLAKD"GAIp1(B 0$,0CSF3Hw10&>(+].=1'3s6F9S5@zCYF4Hq106:914@sCRF1HnKG10"i$t(*+7-E/G1N6#8T;!=|@gCPF/H/IO10"o&.'M+<-{0:2y5X7W:610#^&<(|+Z,y/Y1W3v6E8z10(}+].<0~3]6A9+;j>IA~CiH(J^10">&=(|*;,z02214i8W;7=U@4B310#^&<(y+<,{2Y4X7w;6CaFfK/10CRDQHRHs106S: <,@QB*EAGLJ^10?TB3Dr1(B 0$,0@tCSF7H{10;m?*BjD`HOJ^1Hs0D&H\Io1(B 0$,0+f.G03g6F@tCTF7I+10!^#c&H)*.&/83T4O8v;Z>IArF*HQJp10#Z%+'d*I-V0P245G8v^AhEfG"I`10#K%V(V*w-u0i2n5w8v:9<<>JA!C~FMIH10#V$](g)z.7/23I4X8710#W;V>6@xC}FWIh10!76A9:~C'E'F3Hu107W:f+^.=1&3g6F9i;d@JA7D=@wCdFRH10!)$N&B*d+]/.1<5#6N:d;q?LCCErH1J010!+%Z&U*,-{0Z2y4x10;i>aA\E%G>J{10&>(}+b.?1$3g6U;e>ZAVCiGwH~10"y&+(<*,-{/Z2910"|&)(z)"+j.=F2Hr10#?$>(=*|-K0j314p6oD:F=IL10&A)!+u.?1#3]6N9"10&})<-{.z2y3x77:v>6CZF5Hr100z3c6Z8}='>5BEGc10(}+\.@2>46FB3D2G1I010#V$[(h)z.:0*395X;V>T@{G`H|10#O$_(`*s.90V1U447S;6=UCYHo10#?%^']CCER1(B 0$,0688y;W>9@zCWF@I%10!$#i&K)Y+r/W2$5v8r9l>4@IBrDgH`Im10!#%](<*{,z0q2p6+8*;G=N?MC@DNHgIn10#^&=(\*?,|.;0z4{7^;U>4@sCQF*HaK@10$~(=*|-[0Z2y5X8W;6>%@lAOCpFOI/10#?%(t+[,z/Y1X466s92;q>A@yCiFXJ10$~(=+<-{0j3L4X6P9A=J?UABF1HpKO10! #`&H)2,X/E385V7S:f=u@TC3ErH1J010">$|'Y*t-S0R2V476v:5r10!!(}+\.;0{4z88:710#Y&+(g+S.50w3X657,:a;~@KB^DHFZJk10"~%](<*+-u//2t4N8,: =s?)A~EoG{Jf10"%^(])|-K0*1q5p8#:l=k?/BhD_G{K+10B3DrH1Ip1(B 0$,0&>(~+].;0~3[6A9 ;j>IA(C]F\I+10"m%J'9*t-S/J2)4h8X;8=X@5BzDwGXJ510!"#c&T)Z,P/Y2c678L:u=?3CMDIHoIe10"}$v(u*l-{0Z395x77;6=E@cBmF)H KO10!!#_&>+\.;0{3\6?9F==@DC3ESGRHr10#Y$U(7+I,2.W1$3v6l91iC1D]HoJ[10$~(=+<,[/J3I5H8g:&>%?tCJDGHpIg100z6:8;g@CAEEwGWHs10!,$4&Z*'-y0/2$5u7B:l>"?.CJE?HNI{10";%v(5*,.+0Z1y5x87:v=u?|B#ErH1J010!!#k&H)Y+j/l3Y68;V@tCS10#4%I'Z)g,p0U2f5M7B;4=>@+B EuB!EmG(Jn10(+\.@1#3c6A9,_C)E@G-Jh10! #_&?(~+`.U1#4b7a9;=">_B=CgF{J:10"a$F'_*L,@.=1l48%9r5B]DGG|I910! #_&?(~+`.<1#3m6L9 IA}EdGfI%10"/$n(]*|-]0%3X5X7W:vEAUD.GIK@10!!#h&P,;@tCTF2Hz10"i%/(#)D+f.>1$3[6N9,<#?zA)E5@wE#GxI;10'-*l,L0j3Y699'<9>MB%ErH2J210!u#z'9*t,+/J2i3h79:=%>YA[E'G"I210>TB;CtFEI11069;W>5A'EOGAK110!3$<&^)'-B.H2g3d8#8x=@>DA]CrFFIR10"{$v(]*|BSC\G"Hw100z3Z8x;}>5BmF"H3J410!'#`&e(},R.A1g3d8#9"=9>6A;D4GYI210"W$v'M+<,{>5@xE9F?Jl10;e>VB3CVHr10!"#b&M=%>LB[C^GUI:10!H'!),+\.>3\;W>5@vC]F7I\10!O#n'u)4,3/21I5H7G;6=U@4B310#_+]3\6G8x>DC3ERGQ1(B 0$,0!>#s&l)Y+q.u1H426f90<,>rA(CaF6Hq10#Z$U({)q.:0$286"8V:k>$@1C>DPHfIo10#Y$U(w*k.80%3W5C8u9k>4?)CRE?@yCVF5Ht1087:=;[>8@zCVF5Hw10;M;uBsDrK@10;N=u@4BsERH1Jp10".#h&@)"+\8w;V>5@vCTF7Ht10",%s'8*r-p0'344"8M;;;>VADF"F9Hx10"u$S'J*g-P/02&5m8!;-=?~AfElGhIZ10"o%N'5*(,O002f4K8#9m8~;]>tB/DFFqJ/10!{&6(]*<95;i>DA2CeFBI 10! #a&>FA-CmGjIi10#[$v(]*<6o9NtB/DFFqJ/10"v%|(9*4.+.z9$<*>TA1CSIK108};o>DA"DrGQI-108y6@wEWF~J810"l%I'J)w+z10"t$S(4*+.73Z6?8w;_>TA^CYG/IL10"1%~(g+p.z2D38E9tDACD"FaI@10#6$((S)E-V/@:5tB/DVFqJ/10!$#c&>(}95;m>DA2CcFBI 10!q$S'1)f,P.I8y=[@8B:CVGWJ410!t$I(,*x.+/Z;F;V>5BtCUF3Ht10#?$~:v=V>wA5CtGDI!10!$#b&>(}:&=mF9KH10!t%0'1)A-f.y;T=7?TCKEZGQKN10!m%Z'U+L-[106u9y=V?TB3DsH2IO10"S%@&R),+b9"=!?^BTA3E2HQIp10"6:8y;W>6@uCTF3Hs10"H$N&B)E+z8o@TAsKH10!v#|'U+L,{9W<8?7A8DGFJIY10!'#_8y;\?Y@wC^F:J@10"G#'d){,w8w;\>@B;DzH=IW10"/%~(=:w6@vFQK310#c:w<&>5BtECFBJa10$G&>)k,y;R;yCCE2KL10!W$n(]*<9w"(B $,0!!(B $,0!?(B 0$,0!t#r&B)!+]10!A$*(R)q-E/G1C3s6L9 ;Z>510!4$S(')q-E/43.4N7,:`=J?*AhD\FKH{10!W$6(-*,-K0*2)5H7/:^>@xCS10"O%>&j)m,Q/~2b5-7,:[;?}AhD|AeE'G#I510!)BXC{F{Ib10!$>=A5DFFvJk108x;v>HA6EQGIIX10! 0z3b6W9[<$>rCCDr10&A(},%.z104W83;FHr10!'A3E"GAJP1(B $,0!?!1(B $,0!!!/(B $,0"?(B $,0!C(B 0$,0)-+o/E1.4#6K9s<(10,{/Z7W:61(B 0$,0#_(}10"_$^'}+<1(B 0$,01#3n6[9_<+?9@}Cp107W:6:@}CWF;Hs10"l%s('*f,P/D1s4M8!9l=?@IB]DGG~Iz10"?%^(=*|,[0Z2Y4h8':f=E?,BkDJG)J\1(B $,0!^0"g#}10"n&610#[#a&C+\10"W$f'5*\-{1(B 0$,0!$#`&H)"10!%.(-)|1(B 0$,0.;3Y10-;/:2Y5x1(B 0$,0!$#`&C(}+].<0z10!t%H(()v-p0$1n5B72:` 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-912c443/etc/icons/wl-folder-prev-entity-up.xpm000066400000000000000000000030771262320455600255740ustar00rootroot00000000000000/* 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-912c443/etc/icons/wl-folder-read-up.xpm000066400000000000000000000031601262320455600242120ustar00rootroot00000000000000/* 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-912c443/etc/icons/wl-folder-select-entity-up.xpm000066400000000000000000000031601262320455600260700ustar00rootroot00000000000000/* 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-912c443/etc/icons/wl-folder-sync-current-entity-up.xpm000066400000000000000000000031551262320455600272510ustar00rootroot00000000000000/* 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-912c443/etc/icons/wl-folder-zoom-entity-up.xpm000066400000000000000000000031471262320455600256020ustar00rootroot00000000000000/* 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-912c443/etc/icons/wl-message-extract-content-up.xpm000066400000000000000000000025551262320455600266010ustar00rootroot00000000000000/* 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-912c443/etc/icons/wl-message-next-content-up.xpm000066400000000000000000000030731262320455600261010ustar00rootroot00000000000000/* 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-912c443/etc/icons/wl-message-play-content-up.xpm000066400000000000000000000025001262320455600260620ustar00rootroot00000000000000/* 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-912c443/etc/icons/wl-message-prev-content-up.xpm000066400000000000000000000030771262320455600261030ustar00rootroot00000000000000/* 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-912c443/etc/icons/wl-message-quit-up.xpm000066400000000000000000000025141262320455600244340ustar00rootroot00000000000000/* 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-912c443/etc/icons/wl-message-read-up.xpm000066400000000000000000000031601262320455600243630ustar00rootroot00000000000000/* 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-912c443/etc/icons/wl-stable-logo.img000066400000000000000000000154051262320455600235710ustar00rootroot00000000000000 0$,0;V>5A"CgF^IF103p7K9t>#?2BiD`HGJn1(B 0$,0F2Ht10@uC{FCIT108w;y?fA7D;FUJB103\6x9*=6>HBUCZGvIX104=6_:;;e?yA%E3FEIQ101Y3m6W9[;]?%@uDFF2Id107+8w5AgCSG%Hq109V;i>uA7CbFsI$10A3DzFSJ01GQ(B $,0HsJ00F8J*10;V>9A1E}G.KK100{3[6U:!6@}CWF?I*10+].?134N8,:`X@|DGG#JD10+e.?1B4J7{9+=>?fA7DGFzJB10!!$''g)m-/._1a4M7i9:<>?&BGC}G0J(10"i#n'')m-/._2K4A6I:_<7?kB1Er10!h%.'')@-,.D1i4=6_9[<4@d10!D%&&b*L, /"2K3\8 9,>-10!I$?&Q*]+o/"2>4H6A;F;X10$S)q,{//4M7W9+>%>;10"c#o'!),,@.J1[3l6x9*<6>HAtC^10!_#g&_*D+|.D2Y3]7'8{=AUCZGsHx10!I&a)\+p1b3x6<9f;Y>T@}D2GYI210!o#f'a)=+c.{0}3i6w9*=BSCWGaHt10,{.z194(6G:>;y>:A5C[FrHt10GQJ01(B 0$,0!"#_&>(}+\10">%s'\+1,z0O285m7V9K<$>nA"C_F4Hs10"n$x(T*9-r/W3D4W8q9m>3?CPDIHoIe10#5%['S*k.0/53V4N8v:`=r?JC.EOHHKJ10"|%t(8+J,V0p1v6#8T:m>"@*C0DhH KG10"u&+(X*y,f0X2n6#75:1=l@3COF"H1J010"u%{(4)w.*08354p8g;6iA~DLHGJZ10")$S(**&,Q0/2d4R8L:a=K?)A}E?HFJ]10"t%H'J*g-E//2&5B7,:#=@?+C1DNH)J 10"m%L'9)x-S/R2)6(8W:vIAgE10!'$@&M)]+o1#6@;W10!?% &e,D2K3`6X8z=6>|E$I410"$>'=)|-;.j1I4(6G9.LBKCjGYI(1(B 0$,0#]$)&D3Y688y;[>?A2CgF`IK10"n&3(|)F,Z.u304w8U:2>-?DC3ERH1J010!}&:'U+<-{/Z291(B 0$,0CSF2Hr10! #a&?)*+`.G144"6L:,<"@IBnDHG;J]10",$X((+F,Q0'2.5C8&:m>A(C\FfI510!)#c&Q)F,%//2^4O8&:d6CfHy10%0)A,}._1#4:6Q9`;j?>BHDGG{JZ10"+%:())p-I/02g5F8#:b5@}CVFZHt10!4#_&h)-,@.c1\4!6J9a;x>A&E9F?J^10$~']*<,{/Z294x7W1(B 0$,0@tCv10>LAKD"GAIp1(B 0$,0CSF4Hu10&>(}+^.@1&3s6N937@xChF^K+10.<0~3s6N:1=D@RB+F#HQJq10!$#i&g)r-X0%3N4f8L;P(~+\.<0{3e699#;~>_A>DIG(J^10!z$U(+*j,W022q4h8W;6=U@4B310"?CaF\KO10CRDPHTHr106S: I;10;W>KBrDjHQJp10==@dHq10!@#c&O)&+`.d1#3r6a9@=??)B]E:GyIb10!t$S('*f,O0#2b5;7z:A<|>BAAD~FMJh10"/$n(]+<-[0:294x7W10>9@xCeFWJh106A9g=+>]C=DwF;Hy107W9f>A'CSF\Hw10!1%F&?*e+m/#2L4C7n9DlCCErH1J010!k%:&u*,,[0Z2y4x10@uF3Ht10;y>6B^CYGH~1(B $,0F30E:F=Il1(B 0$,0;V@uCZHr100z3c6Z8};w>=AUGeHq10294xB3D2G1I010;]A5F?10(}.>6;9&T@wDrF@I<10!h#_&`)#+i/&155P7G;6=UDAHo10#?%^']CCER1(B 0$,0688y;V>;@yC]F@I%10!&#h&\)R+v/Y2c677D;M6@xC`GNIf100|3]6M9Q=l@/CBEPHiK@10! #_&L)&,v/1384f8s:&=u@410".%\'Y+L-{0:2910! #a&?(~+\.<0z3[69;V10"u$k(W*s-p0'2s4O8l:c=??OC D-F[I'10#9$S(X*q,R/F345B7D9q=j@!B(DHG~J%10"%^'=)|,k0J2q5@73:l9";h>>@~D'F\I'10"m%J(9)t-S/J2)6)78;7=X@7BxDyGSJ710!"#d&X)J,v.h3T5F7T;A%@#CMDIHpJ_10! &>+\.<0{3\6?9F==@DC3ESGRHq10"y%u'W*i-R.t1(3m6r9C%?4CFDOHhIo100z3Y689!;w@BADEyGSHv10!*$4&Z*'-Q0U2&5N7D;1=K@aAnF'H K+10!{&6(5*,.+/:395x87:v=u?|B#ErH1J010!!#k&S)I,I.M3Y68;V@tCS10"t$i(X*q-J/C305E7Q:a=k@.AhEHG;K'10"?$~']*<,{/Z294x7W:v=U@6BhEAHHIn10(}+^.?0~3e6A9AIB=C|FGHz10"_$B'm*=, /[104?7%9rIAUD.GIK@10!##g&@)<@uCSF5Hq10"Q$R(")E+e.;1&3[6N9,JBYDGGcI410"k%J&Y*4,k0Z2y4x>5@wCsG|JG10+\3Y699&;Z?.B#EsH3J010!M$Z'y)T,k0*1I4H6:J;u?)B7DDFEJR10>TBED6GcIY10688x;V>8A7ELGAK210!1#f'")/,B.h2G4$7#8|5@|E9F?Jl10;e>VB3C[Hu10!"#b&M=%>LA[C^FEIR10!?#`'%+d0{69>9@vCUFGH|10!O#n'u)4,3.r1I4h7G;6=U@4B310! ) 0{3`8w;Y>DCtF910!;#v(5)L,k/:1y4X6W9F;]?T@{CsJ810CSFHJ>10>DC3ERGQ1(B 0$,0!>#k&{)G,:.g1P456f9Q<$>q@~C`F8Hq10#]%I({+7,i0u1x627.;T<`@2C.F!H.KF10"i&=('+[-p/Y3C5W8a:u>+@!CRDGHpKL10"%V(t+6,j073D5U8n:d>,@3COF"GQ10!*$|((+9,r0g1x6683;F=U10#Z%M'[*x.+0Z2910"$~6g9&;n>B@uCVF5Ht1087:=8@zCVF5Hw10;M;wBsDrK@10;N=e@4B3ERH1Jp10!,#h&@)"+].;8w;V>5@uCUF7Ht10"j%T'J*g-u0/2f4"8L;@<>YADEbF9Hx10!t%T'J*g,e0T1o5B8!;1={?~AeElGgI[10"o%N'5*(-o0(2d5m8!:mdBeDGFcI]104y87;%bBNClGkIJ10!!#a&>8~;]>tB/D:FqJ/10#[$v(]*<95;i>DA2CcFBI 10!!#a&>(}HA-CdG*JI10#[&6(]*<6o9N(+\:5tB/D2FqJ/10"v$l(9*4.+.z9$<*>TA1CWIK108};o>DA"DtGQI-108y6@wEWF~J810"y$S'J)S+zDB6CiGIL10#O&((>)D+]/"0|4O8E9t=p@6BuETFsIR10"d#h&{)T.+0Z2y8;]?\B{CzFYI(10!t%H(R*g,z;T=I>TACD"FaI@10!}%Z'M+<,{:5<^>tB/D:G1J/10!)#c&?(}95;i>DA2CkFBI 10"h$((G)F,P.I8y=[>xB:CVGWJ410!t$I(,*x.+/Z;F;V>5BtCUF3Ht10#?$~:v=V>wA5CtH$I!10!)#h&A(~:&=]F9KH10"h$H'r*^-F.y;T='?TCKEbGQKN10!M$Z'U+L-[10! 6u9y=V?TB3DsH2IO10!g#s&])F+b9"=!?^BTA3E2G1Ip10"#_6:8x;W>7@uCTF3Hr10!c#o&_)e+z8o@TBSKH10!.$\'U+L,{9W<8?7A7DGFJIY10#`(}8y;\>9B7C^F;J@10!A$&h)k,w8w;\>@B;DzH=IW10"/%~(=:w6@vFQK310#b&>:w=F>5BtD#FBJa10!'$@&N)+,y;R=9CCCrGQKL10"w$n(]*<9w)+.910![$n(]*<1(B $,0">"(B $,0!?(B 0$,0!s#h&G)!+]10!q$S(&)r-P0$1o4-6D9 ;Z>510!*$('2*f,U0O2c5E7,:k=??/B]D\FFI+10!7$6'M*l-K/J2i5H7/9n=A?*C)E=G,Ie10!'J01!!0(}.;10"h#c(2)f,M/.2c3}8 9@;_>=@uCS10!o$ '1)e-00#2^4"7):J=:>]B]D}AeE'G#JU10!)7W9V|BEC|FzIb10!!A\E$G%I510! >6ADA^E1HiJp10.;3]6_9Y<$@2CCDr10)!,#.|1$4W83;F9@}CXF6Hu10"j$h'2)q-E0/2f5B7,:`=j?.B^E5A"CgF^IF103p7K9t>#?2BiD`HGJn1(B $,0F20@|CTG%JA108w;g>xA;D3GeHy106A9g;Y?}ASC|GSI8103]79'UB7CzFvJ@104M7_9';y>vA;DtFZIT107+97]B5CzFrHz109V;i>uA'D2FFIP10A3DzFSI 1GQ(B $,0HsJ00@xC]FDIt10;V>;A-EiGOK%100|3Z6V9k6@yC\FGI%10+].?134-8L9k=B?~C(EGG~JZ10,{/*2a4L8%: XA\E'F[Jy10! #_&C(}+e.;1F4C7):K=4@d10!0$H&]*F+l/|1-497k9A>-10!D#`(&)`+m.Z1^4 7\:(;X10!0$ '&) -C.{1-3z68{>%>;10!o#c'-)&-;.?2a3Z78w=?A}CVF210!4$>&F*`+\/.5B9`;u?^A3D{F5I`10!a#f&^)`+d.Z2C3x7`8zaA'EPFQJ410,{.z194(6G:>;y>:A%D3F6J@10GQJ01(B $,0F40B;E6G-JX1(B 0$,03Y698z;X>:CS102Y4X6:N<]?,BSEr1(B 0$,0! #_(}10">%H(|*f.:0O2x6"6n:3< >RA(CaF3Hs10#:%Y(r*k.8/03X5B8v9k>4?~CRDGHpK%10">%s'[+G-R0T2x6-8%:1=B@rB^DhHNJ'10":%K(t*j,p0Y3C4W8l9q>"@*C0EMHHJ.10!|%U'J+R-H/P364c8U:!^BXE'=)|+{0*1I4(7g9.=->LBKCjFyI(108x;Z>=A%C_FJHr10:6TAsE2G1J01(B 0$,0! &?(}10!w%B(i*T10CUF2Hs10;V>5CSGRJ010dAcDbH!K01(B 0$,0@tD"FJIK10>QC)EaG\J>10?TC+EjFIK@1(B 0$,0"~$(&D3Y6:8x;X>CA(CqFFJ/10#<%T(|)1,v.i3T5G7U;2>-?DC3ERH1J010"n&:'U+<-{/Z2910"5%j1(B 0$,0CSF2Hr10! #a&?)*+`.U1.3n6d9p<+@IBiD\G.K;10"*$X(S*q-E/G1s5o8.:e=k@2B_EnH)J(10!u&-'J*O,h0e3-647W10#?%^']1(B 0$,03Y698w;[>9A D$F>IC10!$#x&O)A,T.`2d5C6f:dXA.D$F6H10<5@4ASER1(B 0$,0.3/2315P8_:n=m?@BqE}H(Ij10!"#e&L)++j.A3t6V95;d>;CPDIH+KG10#[&:(y+[.:0B1!408s;N>-@lCBDOH\Jm10"A%.(A*<-Z0d2p4U8n9t>"@2AEoH.Iz10"+%:())p-I0p375P8R:c<;?BBD8w;p@SB F)G+K?10"?$(>*'-z0x2a4p8O:l4@}FFI010!$$'&@)E,@.K1>3a7Q9n=L@SB.DyFGJ^10$~']*<,{/Z294x;FEPHFI10!$#m&J(+\91=T@dB)EmH.K'10#@%!'b*C-Z0R215@8o9q=T@\BkDjHAJ 10"$~']:v=s?S106o;.=P@SCK10;FLAKD"GAIp1(B 0$,0CSF3Hs10&>(}+^.@1&3s6D9U<`?3CJEpH/KL10!v&<'9+X-S0j3I5x87:v7@yF21058779^=-?7@uCpF\K+10.;1 3r6b9m=T@RBkF#HQJq10!$#h&h)R.(//245n8a;4<*@IBnDHH&K;10!y%t(**w,e0'2$5m82;-(~+\.<0{3e699#<*>IA>DIG(J^10!v%u&k*j,W022q4i8W;7=U@4B310"?2Y4X7w;6CaF\KO10CRDQHSHq106S: <,@QB*EAHhIn10?TB3Dr1(B 0$,0@tCSF7H{10;m?*BjD`HOIn1Hs0D&H\Io1(B 0$,0+f.H0~3g6FCUF>I;10!\#e&G)+.%07304f8v;W>IBrDjHQJp10#]%#'l*F-r042(6-8v==@dHq10#^&0(y+X-Q0g374c8v9*<_?)B]DFGyIa10#;$v(V*w-u0i2n5w8v:9<|>JAaC^G-IH10#V$](g)z.7/23I4X8710#W;V>6@xC}FWIh10!76A9:~C'E'F3Hu107W:f5CWF3Hz10! &>+^.=1&3g6F9)=D>ZAgE$F[JT10!u&-(2+;,z0Z294x7W:6DrFqJH10"y%u'Z+R+j.=10#?$~']*|,l0R224$6t8x;^>F@wCcFVHw10!)$N&B*d+]/.1<5#6N9DlCCErH1J010!+%Z&U*,-{0Z2y4x10;i>aA\E%G>J{10&>(}+b.?1$3g6U;e>ZAVCiGwH~10"y&+(<*,-{/Z2910"|&)(z)"+j.=F2Hr10#?$>(=*|-K0j314p6oD:F=IL10&A)!+u.?1#3]6N9"10&})<-{.z2y3x77:v>6CZF5Hr100z3c6Z8}='>5BEGc10(}+\.@2>46FB3D2G1I010#V$[(h)z.:0*395X;]>6A3F@10":%K(t+),~3\68=%B7CsF;H|10#P$_(`*3-Y0V1U447S;6=UCYHo10#?%^']CCER1(B 0$,0688y;W>7@yCaF6I/10!&#h&\)Q,*.t3H5U8b9t>0@!CJEpGFK/10!{&6(5*4.+0*3I4h8g:f>-?,COE>HoJ[1(B $,0Hq0>5@zClFhK=100|3Z6V9@=L@OB2EpGIK@10#a&G)3,h/53X5F7S;F=u@410"n&<(9*,-{0:2910! #a&?(}+^.;0|3Z698w;V10!}$S(2+G,Y//2#5O8a9P;~@KA=DIFZJk10#U$K(2)w-Q0O2o4b8N:r=@@JBhD`HFIj10"%^'=)|-K0j2Q5P7C;,+].<0~3Z6D8{;_>I@~D'F\I'10"m$Z'9*t-S0*2)6)78;7=X@5BzDwGXJ510!"#d&X)R,j/4205u7N;4_CADOH\Jm10$~(=+<,[0j2i4h8g:&>%?4CFEAGLJ_103Y6:9 ;f@CAEEwGTHu10!,$4&X*2,V0p2f5N7D;1=J?CC-EHG>Jg10"{%v'U+L,k0Z395x87:vuC.EIG(K.10&>(}+^.?0~3c6=90=j>OCIE\F>I*10!v$U'K)z-G/62%4T8M:`IA(E'F;Ie10"c$?'m*@+|/e0|4O7e:r==?(B]DGG{Iz10!O$n(]*|-[/Z>5B]DGG|I910! #_&?(~+`.<1#3m6L9 IA}EdGfI%10"/$n(]*|-]0%3X5X7W:vEAUD.GIK@10! #c&H)<@tCSF6Hy10!h$((")F+_.C0~3c6N9<;c?*AiCtG&I410!K%J'9)T.+0Z2y4x>5@wE3F\JG10'-*l,K0j0z699&;[?,B%EtH1J110!M%:'9)T-K0*1I4H7_9jTB;CtFEIQ1069;W>5A'EOGAK110!3$<&^)'-B.H2g3d8#8x=@>DA]CrFFIR10"{$v(]*|BSC\G"Hw103Y698~;W>XBcF'H1J:10!'#`&e(},&/!2G4$6C:b;Y?&B3C|JZ10"W$v'M+<,{>5@xE9F?Jl10;e>VB3C[Hu10!"#b&M=%>LA[C^G%Hr10!H'!),+\.>3];W>5@vC]F7H|10!O#n'u)4,3.R2)4(7G;6=U@4B310(~.>3\689&;Y@{FC10!{$6&u)L,k/:1y4X6W9F;]?T@{D2F3IP10CSFXH~10>DC3ERGQ1(B 0$,0!,#u&z)K,5.i1S4'6q9E<+>oA2CWF8Hq10"4&-':+W-H0q375M8v:`>4?~B2EgGPJZ10"=&)';+W,Q0y2c677,;U=j@3C(DqHHKL10"%V(t*i.60)3V4N8r:e?@yCVF5Ht1087:=;Y>8@zCVF5Hw10;M<5BsDrK@10;N=u@4BsERH1Jp10".#c&B(+].;8w;V>5@vCUF7Ht10"v$h(*)w-P0g1C4#8L;,;~>YA4F"F9Hx10!u%S'J*g,U0/2f4c7,;A=>_AeEmGWIj10"o%N'5*(-o.p2f4K7C9mdAFDVFbIo104y879e=v?%A|D_HBBNClG+JJ10!"#`&>8~;]>tB/DFFqIo10!{&6(]*<95;i>DA2CeFBI 10!!#_&@(}FA-CmGjIa10#[&6(]*<6o9NtB/D6FqJ/10".%|(9*4.+.z9$<*>TA1CSIK108};o>DA"DrGQI-108y6@wEWF~J810#4%Y'2)K+z10"l%I'H){.70z6<9&;Y>|@vDIG_IL10"/&#(M(~,#.{1$38E9t=p@6BuETFsIR10!$$Y&[*u,k0Z2y8;]?\B{CzFYI(10!t$S(')q.:;T<->DACD"FaI@10#6$((S)E-V/@:5tB/DZFqJ/10!$#c&>(}95;m>DA2CcFBI 10!q$S'1)f,P.I8y=[@8B:CVGUJ610!t$I(,*x.+/Z;F;V>5BtCUF3Ht10#?$~:v=V>wA5CtGDI!10!!#b&B(}:&=mF9KH10"h%3'/)A,F.y;T=7?TCKEZGQKN10!M$Z'U+L-[106u9y=V?TB3DsH2IO10!C%''/)@+b9"=!?^BTA3E2HQIp10"6:8x;W>7@uCTF3Hr10"H$N&B)E+z8o@TAsKH10!v#|'U+L,{9W<8?7A8DGFJIY10#c(}8y;\>9B7C^F:I 10$S&@){,w8w;\>@B;DzH=IW10"/%~(=:w6@vFQK310#_:w=F>5BtD#FBJa10!C'0)#,y;R;yCCE2KL10"w$n(]*<9w"(B $,0!!(B $,0!_(B 0$,0!d#x&G(~+\10!?$X('*f,e/51n4"6T8y;[10!H#t(g*f-E//1s5m7,9p=j?AmC|F[I%10!W$6(-*l-K/J2i5H7/:^>@u10!o%/(')n-//2c4!7!9k|AeE&GvI910!)BWD;F[IY10!$>6BGCrF~Ik10DBVEQGIIX10.;3b7g99=$?RCCDr10&?) ,#.|1D577S;FHr10A3E"GAJP1(B $,0!?!!(B $,0! !/(B $,0"?(B $,0"?!_!C(B 0$,0)-+o/E1.4#6K9s<(10,{/Z7W:61(B 0$,0#_(}10"_$^'}+<1(B 0$,01#3n6[9_<+?9@}Cp107W:6>@yCWF;Hv10"l%s('*f,P/D1s4M8!9l=?@IB]DGG|K*10"?%^(=*|,[0Z2Y4h8':f=E?,BkDJG)J\1(B $,0!^0!t#}10!V&610#[#a&C+\10"W$f'5*\-{1(B 0$,0!$#`&H)"10!%.(-)|1(B 0$,0.;3Y10-;/:2Y5x1(B 0$,0! #d&B(~+].<0z10!t%H'2*f-v0$1n5B7,;0< >^A(CgF;Hs10!{%J'9*h,W0&1u5D73:b 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-912c443/etc/icons/wl-summary-next-up.xpm000066400000000000000000000030731262320455600245020ustar00rootroot00000000000000/* 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-912c443/etc/icons/wl-summary-prev-page-up.xpm000066400000000000000000000030771262320455600254160ustar00rootroot00000000000000/* 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-912c443/etc/icons/wl-summary-prev-up.xpm000066400000000000000000000030771262320455600245040ustar00rootroot00000000000000/* 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-912c443/etc/icons/wl-summary-read-up.xpm000066400000000000000000000031601262320455600244340ustar00rootroot00000000000000/* 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-912c443/etc/icons/wl-summary-reply-up.xpm000066400000000000000000000025161262320455600246600ustar00rootroot00000000000000/* 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-912c443/etc/icons/wl-summary-reply-with-citation-up.xpm000066400000000000000000000025341262320455600274410ustar00rootroot00000000000000/* 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-912c443/etc/icons/wl-summary-set-flags-up.xpm000066400000000000000000000024371262320455600254140ustar00rootroot00000000000000/* 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-912c443/etc/icons/wl-summary-sync-force-update-up.xpm000066400000000000000000000031551262320455600270550ustar00rootroot00000000000000/* 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-912c443/etc/icons/wl-write-current-folder-up.xpm000066400000000000000000000025061262320455600261140ustar00rootroot00000000000000/* 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-912c443/etc/ja.Emacs000066400000000000000000000136011262320455600204700ustar00rootroot00000000000000Emacs*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-912c443/samples/000077500000000000000000000000001262320455600200145ustar00rootroot00000000000000wanderlust-wanderlust-912c443/samples/en/000077500000000000000000000000001262320455600204165ustar00rootroot00000000000000wanderlust-wanderlust-912c443/samples/en/dot.addresses000066400000000000000000000005511262320455600231040ustar00rootroot00000000000000# # ~/.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-912c443/samples/en/dot.folders000066400000000000000000000023561262320455600225720ustar00rootroot00000000000000# # ~/.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-912c443/samples/en/dot.wl000066400000000000000000000276511262320455600215630ustar00rootroot00000000000000;;; 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 ; '(lambda () ; (wl-folder-open-unread-folder entity) ; )) ;; 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-912c443/samples/ja/000077500000000000000000000000001262320455600204065ustar00rootroot00000000000000wanderlust-wanderlust-912c443/samples/ja/dot.addresses000066400000000000000000000006241262320455600230750ustar00rootroot00000000000000# # ~/.addresses $B%"%I%l%9D"%U%!%$%k%5%s%W%k(B # # '#' $B$G;O$^$k9T$O%3%a%s%H!#(B # $B6u9T$OL5;k!#(B # # $B=q<0(B: # $B%a!<%k%"%I%l%9(B "$B$"$@L>(B" "$BK\L>(B" # # $B$"$@L>$O%5%^%j$NI=<($K!"K\L>$O(B To: $B%U%#!<%k%I$K;H$o$l$^$9!#(B # teranisi@gohome.org "$B$F$i$K$7(B" "$B;{@>M50l(B" foo@example.com "$B$U!<$5$s(B" "John Foo" bar@example.org "$B$P!<$5$s(B" "Michael Bar" wanderlust-wanderlust-912c443/samples/ja/dot.folders000066400000000000000000000030111262320455600225470ustar00rootroot00000000000000# # ~/.folders $B%U%)%k%@Dj5A%U%!%$%k%5%s%W%k(B # # $B8D!9$N%U%)%k%@$N=q<0$K$D$$$F$O(B Info $B$N(B Folders $B%;%/%7%g%s$r;2>H$N$3$H!#(B # # '#' $B$G;O$^$k9T$O%3%a%s%H!#(B # $B6u9T$OL5;k$5$l$k!#(B # ## IMAP $B%f!<%6$N%a!<%k%\%C%/%9(B # %inbox ## POP $B%f!<%6$N%a!<%k%\%C%/%9(B # &USERNAME@POPSERVER.EXAMPLE.COM ## [ POP $B%f!<%6$K$O%Q%$%W%U%)%k%@$,Lr$KN)$A$^$9(B ] ## [ $B%Q%$%W%U%)%k%@$r;H$($P!"%a!<%k$r$N(B NNTP $B%5!<%P>e$N%K%e!<%:%0%k!<%W(B ] # -jlug.ml.users@NEWS.EXAMPLE.NET # -emacs.auc-tex@NEWS.EXAMPLE.ORG # -ring.openlab.skk@NEWS.EXAMPLE.COM ## $B%0%k!<%W$NDj5A(B ## [ $B%U%)%k%@$rGH3g8L$G$/$/$C$F%0%k!<%W$K$9$k(B ] # Emacsen{ # +to/wl # +to/mew-dist # +to/apel-ja ## [ $B%0%k!<%W$NF~$l;R$b2DG=(B ] # XEmacs{ # +to/xemacs-beta # +to/xemacs-beta-ja # +to/xemacs-mule # } # } ## $B%"%/%;%9%0%k!<%W(B ## [ $B9TKv$K(B '/' $B$,$D$/$H!"$=$N%U%)%k%@$K4^$^$l$k%5%V%U%)%k%@A4$F$,(B ] ## [ $B$R$H$D$N%0%k!<%W$H$J$k!#(B] ## [ `C-u RET' $B$G%"%/%;%9%0%k!<%W$r3+$/$H99?7$G$-$k!#(B ] + / ## IMAP $B%U%)%k%@$N%"%/%;%9%0%k!<%W$NNc(B # % / wanderlust-wanderlust-912c443/samples/ja/dot.wl000066400000000000000000000325701262320455600215470ustar00rootroot00000000000000;;; dot.wl -- sample setting file for Wanderlust -*- emacs-lisp -*- ;; [[ $BF0:n$KI,MW$J@_Dj(B ]] ;; $B$^$:!"l9g$OI,MW$"$j$^$;$s!#(B (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) ;; $B%"%$%3%s$rCV$/%G%#%l%/%H%j(B ;; XEmacs $B$N(B package $B$H$7$F%$%s%9%H!<%k$5$l$F$$$k>l9g$OI,MW$"$j$^$;$s!#(B ;(setq wl-icon-directory "/usr/local/lib/emacs/etc") ;; [[ SEMI $B$N@_Dj(B ]] ;; HTML $B%Q!<%H$rI=<($7$J$$(B ;; mime-setup $B$,%m!<%I$5$l$kA0$K5-=R$9$kI,MW$,$"$j$^$9!#(B (setq mime-setup-enable-inline-html nil) ;; $BBg$-$$%a%C%;!<%8$rAw?.;~$KJ,3d$7$J$$(B (setq mime-edit-split-message nil) ;; $BBg$-$$%a%C%;!<%8$H$_$J$99T?t$N@_Dj(B ;(setq mime-edit-message-default-max-lines 1000) ;;; [[ $B8D?M>pJs$N@_Dj(B ]] ;; From: $B$N@_Dj(B ;(setq wl-from "Your Name ") ;; (system-name) $B$,(B FQDN $B$rJV$5$J$$>l9g!"(B ;; `wl-local-domain' $B$K%[%9%HL>$r=|$$$?%I%a%$%sL>$r@_Dj$7$F$/$@$5$$!#(B ;(setq wl-local-domain "example.com") ;; $B<+J,$N%a!<%k%"%I%l%9$N%j%9%H(B (setq wl-user-mail-address-list (list (wl-address-header-extract-address wl-from) ;; "e-mail2@example.com" ;; "e-mail3@example.net" ... )) ;; $B<+J,$N;22C$7$F$$$k%a!<%j%s%0%j%9%H$N%j%9%H(B (setq wl-subscribed-mailing-list '("wl@ml.gentei.org" "apel-ja@m17n.org" "emacs-mime-ja@m17n.org" ;; "ml@example.com" ... )) ;;; [[ $B%5!<%P$N@_Dj(B ]] ;; IMAP $B%5!<%P$N@_Dj(B (setq elmo-imap4-default-server "localhost") ;; POP $B%5!<%P$N@_Dj(B (setq elmo-pop3-default-server "localhost") ;; SMTP $B%5!<%P$N@_Dj(B (setq wl-smtp-posting-server "localhost") ;; $B%K%e!<%9%5!<%P$N@_Dj(B (setq elmo-nntp-default-server "localhost") ;; $BEj9F@h$N%K%e!<%9%5!<%P(B (setq wl-nntp-posting-server elmo-nntp-default-server) ;; IMAP $B%5!<%P$NG'>ZJ}<0$N@_Dj(B (setq elmo-imap4-default-authenticate-type 'clear) ; $B@8%Q%9%o!<%I(B ;(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) ;;; [[ $B4pK\E*$J@_Dj(B ]] ;; `wl-summary-goto-folder' $B$N;~$KA*Br$9$k%G%U%)%k%H$N%U%)%k%@(B ;(setq wl-default-folder "+inbox") ;; $B%U%)%k%@L>Jd40;~$K;HMQ$9$k%G%U%)%k%H$N%9%Z%C%/(B ;(setq wl-default-spec "+") ;; Folder Carbon Copy ;(setq wl-fcc "+outbox") ;; $B=*N;;~$K3NG'$9$k(B (setq wl-interactive-exit t) ;; $B%a!<%kAw?.;~$K$O3NG'$9$k(B (setq wl-interactive-send t) ;; $B%9%l%C%I$O>o$K3+$/(B ;(setq wl-thread-insert-opened t) ;; $B%5%^%j%P%C%U%!$N:8$K%U%)%k%@%P%C%U%!$rI=<($9$k(B (3$B%Z%$%sI=<((B) ;(setq wl-stay-folder-window t) ;; $BD9$$9T$r@Z$j=L$a$k(B ;(setq wl-message-truncate-lines t) ;(setq wl-draft-truncate-lines t) ;; XEmacs (21.4.6 $B$h$jA0(B) $B$N>l9g!"0J2<$bI,MW!#(B ;(setq truncate-partial-width-windows nil) ;; $B%I%i%U%H$r?7$7$$%U%l!<%`$G=q$/(B ;(setq wl-draft-use-frame t) ;; $B%9%l%C%II=<($N%$%s%G%s%H$rL5@)8B$K$9$k!#(B ;(setq wl-summary-indent-length-limit nil) ;(setq wl-summary-width nil) ;; $B%5%V%8%'%/%H$,JQ$o$C$?$i%9%l%C%I$r@Z$C$FI=<((B ;(setq wl-summary-divide-thread-when-subject-changed t) ;; $B%9%l%C%I$N8+$?L\$rJQ$($k(B ;(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 " ") ;; $B%5%^%j0\F08e$K@hF,%a%C%;!<%8$rI=<($9$k(B ;(setq wl-auto-select-first t) ;; $B%5%^%jFb$N0\F0$GL$FI%a%C%;!<%8$,$J$$$Hl9g$OJXMx(B) ;(setq wl-auto-select-next 'skip-no-unread) ;; $BL$FI%a%C%;!<%8$rM%@hE*$KFI$`(B ;(setq wl-summary-move-order 'unread) ;; $BCe?.DLCN$N@_Dj(B ;(setq wl-biff-check-folder-list '("%inbox")) ;(setq wl-biff-notify-hook '(ding)) ;;; [[ $B%M%C%H%o!<%/(B ]] ;; $B%U%)%k%@uBV$GAw?.$9$k$H!$%-%e!<(B(`wl-queue-folder')$B$K3JG<$9$k(B (setq wl-draft-enable-queuing t) ;; unplugged $B$+$i(B plugged $B$KJQ$($?$H$-$K!$%-%e!<$K$"$k%a%C%;!<%8$rAw?.$9$k(B (setq wl-auto-flush-queue t) ;; $B5/F0;~$O%*%U%i%$%s>uBV$K$9$k(B ;(setq wl-plugged nil) ;; $B5/F0;~$K%]!<%H$4$H$N(Bplug$B>uBV$rJQ99$9$k(B ;(add-hook 'wl-make-plugged-hook ; '(lambda () ; ;; server,port$B$N(Bplug$B>uBV$r?75,DI2C$b$7$/$OJQ99$9$k(B ; (elmo-set-plugged plugged$BCM(B(t/nil) server port) ; ;; port $B$r>JN,$9$k$H(Bserver$B$NA4(Bport$B$,JQ99$5$l$k(B ; ;; (port $B$r>JN,$7$F?75,$NDI2C$O$G$-$J$$(B) ; (elmo-set-plugged plugged$BCM(B(t/nil) server) ; )) ;;; [[ $BFCl9g$KM-MQ!#(B ;(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)))) ;; $B%5%^%jI=<(4X?t$rJQ99$9$k(B ;; `elmo-message-entity-field' $B$G;2>H$7$?$$%U%#!<%k%I!#(B ;; $B<+F0%j%U%!%$%k$G;2>H$7$?$$%U%#!<%k%I$b@_Dj$9$k!#(B (setq elmo-msgdb-extra-fields '(;; elsp-header $B$G;2>H$9$k%U%#!<%k%I(B "x-spam-flag" ;; `modb-entity-field-extractor-alist' $B$GDj5A$5$l$?2>A[%U%#!<%k%I(B "ml-info")) ;; ML $B$N%a%C%;!<%8$G$"$l$P!$%5%^%j$N(B Subject $BI=<($K(B ;; ML$BL>(B $B$d(B ML$B$K$*$1$k%a%C%;!<%8HV9f$bI=<($9$k(B (setq wl-summary-line-format "%n%T%P%M/%D(%W)%h:%m %t%[%17(%c %f%) %] %#%~%s") ;; $B%U%)%k%@Kh$K%5%^%j$NI=<(7A<0$rJQ$($k@_Dj(B ;(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 $B$K$h$jHsF14|$GAw?.$9$k(B ;; (utils/im-wl.el $B$r%$%s%9%H!<%k$7$F$*$/I,MW$,$"$j$^$9!#(B ;; $B$^$?!$(B~/.im/Config $B$N@_Dj(B(Smtpservers)$B$rK:$l$J$$$3$H$H!$(B ;; wl-draft-enable-queuing $B$N5!G=$,F/$+$J$/$J$k$3$H$KCm0U!#(B) ;(autoload 'wl-draft-send-with-imput-async "im-wl") ;(setq wl-draft-send-function 'wl-draft-send-with-imput-async) ;; $BC;$$(B User-Agent: $B%U%#!<%k%I$r;H$&(B ;(setq wl-generate-mailer-string-function ; 'wl-generate-user-agent-string-1) ;; PGP $B$G0E9f2=$9$k;~$K<+J,$N8x3+80$b4^$a$k!#(B ;; ($B$=$N%a%C%;!<%8$r<+J,$G$bFI$a$k$h$&$K(B) ;(setq pgg-encrypt-for-me t) ;;; [[ $B%F%s%W%l!<%H(B ]] ;; $B%F%s%W%l!<%H$N@_Dj(B ;(setq wl-template-alist ; '(("default" ; ("From" . wl-from) ; ("Organization" . "$B%G%U%)%k%H$NAH?%L>(B") ; (body . " $B!{!{$G$9!#(B\n")) ; $BK\J8(B ; ("report" ; ("To" . "boss@example.com") ; ("Subject" . "$BJs9p(B") ; (top . "$B:#=5$NJs9p$G$9!#(B\n") ; $BK\J8@hF,$X$NA^F~(B ; (bottom-file . "~/work/report.txt") ; $BK\J8KvHx$X%U%!%$%k$NA^F~(B ; ) ; )) ;; $B%I%i%U%H%P%C%U%!$NFbMF$K$h$j(B From $B$d(B Organization $B$J$I$N%X%C%@$r<+(B ;; $BF0E*$KJQ99$9$k(B ;(setq wl-draft-config-alist ; '((reply ; $BJV?.85$N%P%C%U%!$r8+$k(B ; "^To: .*test-notsend-wl@lists\\.airs\\.net" ; (template . "default")) ; $B%F%s%W%l!<%H(B ; ("^To: .*test-notsend-wl@lists\\.airs\\.net" ; ding ; $B4X?t(B ; ("From" . wl-from) ; $BJQ?t(B ; ("Organization" . "$BAH?%L>(B")) ; $BJ8;zNs(B ; ("^Newsgroups: test.*" ; ("Organization" . "$B%K%e!<%9Ej9F;~$NAH?%L>(B")) ; )) ;; $B%I%i%U%H:n@.;~(B($BJV?.;~(B)$B$K!$<+F0E*$K%X%C%@$rJQ99$9$k(B ;(add-hook 'wl-mail-setup-hook ; '(lambda () ; (unless wl-draft-reedit ; $B:FJT=8;~$OE,MQ$7$J$$(B ; (wl-draft-config-exec wl-draft-config-alist)))) ;;; [[ $BJV?.;~$N@_Dj(B ]] ;; $BJV?.;~$N%&%#%s%I%&$r9-$/$9$k(B ;(setq wl-draft-reply-buffer-style 'full) ;; $BJV?.;~$N%X%C%@$KAjA0$rF~$l$J$$!#(B ;(setq wl-draft-reply-use-address-with-full-name nil) ;; $B%a!<%k$NJV?.;~$K08@h$rIU$1$kJ}?K$N@_Dj(B ;; $B2<5-JQ?t$N(B alist $B$NMWAG(B ;; ("$BJV?.85$KB8:_$9$k%U%#!<%k%I(B" . ;; ('To$B%U%#!<%k%I(B' 'Cc$B%U%#!<%k%I(B' 'Newsgroups$B%U%#!<%k%I(B')) ;; "a" (without-argument)$B$G$O(B Reply-To: $B$d(B From: $B$J$I$G;XDj$5$l$?M#0l?M(B ;; $B$^$?$OM#0l$D$NEj9F@h$KJV?.$9$k!#$^$?!$(BX-ML-Name: $B$H(B Reply-To: $B$,$D$$(B ;; $B$F$$$k$J$i(B Reply-To: $B08$K$9$k!#(B ;(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 $B0JA0$N%G%U%)%k%H@_Dj(B ;(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)))) ;;; [[ $B%a%C%;!<%8I=<($N@_Dj(B ]] ;; $B1#$7$?$$%X%C%@$N@_Dj(B (setq wl-message-ignored-field-list '(".*Received:" ".*Path:" ".*Id:" "^References:" "^Replied:" "^Errors-To:" "^Lines:" "^Sender:" ".*Host:" "^Xref:" "^Content-Type:" "^Precedence:" "^Status:" "^X-VM-.*:")) ;; $BI=<($9$k%X%C%@$N@_Dj(B ;; 'wl-message-ignored-field-list' $B$h$jM%@h$5$l$k(B (setq wl-message-visible-field-list '("^Message-Id:")) ;; $BJ,3d$5$l$?%a%C%;!<%8$O<+F0E*$K7k9g$9$k(B ;(setq wl-message-auto-reassemble-message/partial t) ;; X-Face $B$rI=<($9$k(B (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)) )) ;; $B%9%3%"5!G=$N@_Dj(B ;; `wl-score-folder-alist' $B$N@_Dj$K4X$o$i$:I,$:(B "all.SCORE" $B$O;HMQ$5$l$k!#(B ;(setq wl-score-folder-alist ; '(("^-comp\\." ; "news.comp.SCORE" ; "news.SCORE") ; ("^-" ; "news.SCORE"))) ;; $B<+F0%j%U%!%$%k$N%k!<%k@_Dj(B ;(setq wl-refile-rule-alist ; '( ; ("x-ml-name" ; ("^Wanderlust" . "+wl") ; ("^Elisp" . "+elisp")) ; ("From" ; ("foo@example\\.com" . "+foo")))) ;; $B<+F0%j%U%!%$%k$7$J$$1JB3%^!<%/$r@_Dj(B ;; $BI8=`$G$O(B "N" "U" "!" $B$K$J$C$F$*$j!"L$FI%a%C%;!<%8$r<+F0%j%U%!%$%k$7(B ;; $B$^$;$s!#(Bnil $B$G$9$Y$F$N%a%C%;!<%8$,BP>]$K$J$j$^$9!#(B ;(setq wl-summary-auto-refile-skip-marks nil) ;;; [[ spam $BMQ$N@_Dj(B ]] ;; $B%P%C%/%(%s%I$K(B bogofilter $B$r;H$&;v$r@_Dj(B ;(setq elmo-spam-scheme 'bogofilter) ;(require 'wl-spam) ;; $B0\F0$7$?;~$K<+F0$G(B spam $B$+$I$&$+%A%'%C%/$9$k%U%)%k%@$r@_Dj(B ;(setq wl-spam-auto-check-folder-regexp-list '("\\+inbox")) ;; $B%5%^%j%P%C%U%!$G(B `o' (wl-summary-refile) $B$7$?;~(B, *$B:G=i(B*$B$K(B spam $B$+$I(B ;; $B$&$+$rH=Dj$9$kMM$K$9$k(B ;(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))) ;; $B%5%^%j%P%C%U%!$G(B `C-o' (wl-summary-auto-refile) $B$7$?;~(B, *$B:G=i(B*$B$K(B ;; spam $B$+$I$&$+$rH=Dj$9$kMM$K$9$k(B ;(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 $B$rM%@h$7$?$$>l9g(B (spamfilter-wl.el $B$d(B bogofilter-wl.el ;; $B$HF1$8@_Dj(B) $B$O(B, $B$3$C$A$N@_Dj$rM-8z$K$9$k(B ;(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-912c443/tests/000077500000000000000000000000001262320455600175125ustar00rootroot00000000000000wanderlust-wanderlust-912c443/tests/ChangeLog000066400000000000000000000243511262320455600212710ustar00rootroot000000000000002012-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-912c443/tests/check-base64.el000066400000000000000000000027741262320455600222050ustar00rootroot00000000000000(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-912c443/tests/check-modules.el000066400000000000000000000146641262320455600225720ustar00rootroot00000000000000(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-912c443/tests/test-dist.el000066400000000000000000000157111262320455600217610ustar00rootroot00000000000000;; -*- 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-912c443/tests/test-elmo-date.el000066400000000000000000000037601262320455600226660ustar00rootroot00000000000000(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." (let ((elmo-lang "en")) (lunit-assert (string= "Fri" (elmo-date-get-week 1582 10 15))) (lunit-assert (string= "Tue" (elmo-date-get-week 2000 2 29))) (lunit-assert (string= "Tue" (elmo-date-get-week 2038 1 19))) (lunit-assert (string= "Wed" (elmo-date-get-week 2038 1 20))) (lunit-assert (string= "Sun" (elmo-date-get-week 2100 2 28))) (lunit-assert (string= "Mon" (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-912c443/tests/test-elmo-imap4.el000066400000000000000000000022611262320455600227560ustar00rootroot00000000000000(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-string "* 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-string "* 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-string "* BYE LOGOUT received\n") (goto-char (point-min)) (lunit-assert (eq 'closed (elmo-imap4-parse-greeting)))))) wanderlust-wanderlust-912c443/tests/test-elmo-localdir.el000066400000000000000000000016701262320455600235400ustar00rootroot00000000000000(require 'lunit) (require 'elmo-localdir) (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-912c443/tests/test-elmo-util.el000066400000000000000000000247241262320455600227310ustar00rootroot00000000000000(require 'lunit) (require 'elmo-util) (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* ((password "cGFzc3dk") (elmo-passwd-alist (list (cons "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 ((password "cGFzc3dk") (elmo-passwd-alist '(("foo" . "key") ("key" . "ok") ("bar" . "baz")))) (elmo-remove-passwd "key") (lunit-assert (equal '(("foo" . "key") ("bar" . "baz")) elmo-passwd-alist)))) (luna-define-method test-elmo-remove-passwd-3 ((case test-elmo-util)) "Multiple same key." (let ((password "cGFzc3dk") (elmo-passwd-alist '(("foo" . "key") ("key" . "ok") ("key" . "ok2") ("bar" . "baz")))) (elmo-remove-passwd "key") (lunit-assert (equal '(("foo" . "key") ("bar" . "baz")) elmo-passwd-alist)))) (luna-define-method test-elmo-passwd-alist-clear-1 ((case test-elmo-util)) "Check shred ALL password." (let* ((password1 "cGFzc3dk") (password2 (copy-sequence password1)) (elmo-passwd-alist (list (cons "key1" password1) (cons "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-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-912c443/tests/test-rfc2368.el000066400000000000000000000031601262320455600221060ustar00rootroot00000000000000(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-912c443/tests/test-utf7.el000066400000000000000000000061641262320455600217050ustar00rootroot00000000000000(require 'lunit) ;; Emacs 21 (unless (and (fboundp 'find-coding-system) (find-coding-system 'utf-16)) (ignore-errors (require 'un-define))) (require 'utf7) ;; Emacs 21.3.50 to 22 (when (fboundp 'utf-translate-cjk-mode) (utf-translate-cjk-mode 1)) (luna-define-class test-utf7 (lunit-test-case)) (luna-define-method test-utf7-encode-string-nihongo ((case test-utf7)) (lunit-assert (string= "+ZeVnLIqe-" (utf7-encode-string (string (make-char 'japanese-jisx0208 70 124) (make-char 'japanese-jisx0208 75 92) (make-char 'japanese-jisx0208 56 108)))))) (luna-define-method test-utf7-encode-string-smiling-face ((case test-utf7)) (lunit-assert (string= "Hi Mom -+Jjo--!" (utf7-encode-string (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-string (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-string "+")))) (luna-define-method test-utf7-encode-string-noconv ((case test-utf7)) (lunit-assert (string= "" (utf7-encode-string ""))) (lunit-assert (string= "a" (utf7-encode-string "a"))) (lunit-assert (string= "-" (utf7-encode-string "-"))) (lunit-assert (string= "=" (utf7-encode-string "=")))) (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-string "+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-string "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-string "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-string "A+ImIDkQ-.")))) (luna-define-method test-utf7-decode-string-plus ((case test-utf7)) (lunit-assert (string= "+" (utf7-decode-string "+-"))) (lunit-assert (string= "++" (utf7-decode-string "+-+-"))) (lunit-assert (string= "+++" (utf7-decode-string "+-+-+-"))) (lunit-assert (string= "++++" (utf7-decode-string "+-+-+-+-")))) (luna-define-method test-utf7-decode-string-noconv ((case test-utf7)) (lunit-assert (string= "" (utf7-decode-string ""))) (lunit-assert (string= "a" (utf7-decode-string "a"))) (lunit-assert (string= "-" (utf7-decode-string "-"))) (lunit-assert (string= "=" (utf7-encode-string "=")))) wanderlust-wanderlust-912c443/tests/test-wl-address.el000066400000000000000000000011041262320455600230520ustar00rootroot00000000000000;; -*- 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-912c443/tests/test-wl-draft.el000066400000000000000000000062631262320455600225400ustar00rootroot00000000000000(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-912c443/tests/test-wl-util.el000066400000000000000000000016011262320455600224040ustar00rootroot00000000000000(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-912c443/utils/000077500000000000000000000000001262320455600175105ustar00rootroot00000000000000wanderlust-wanderlust-912c443/utils/ChangeLog000066400000000000000000000215031262320455600212630ustar00rootroot000000000000002014-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-912c443/utils/bbdb-wl.el000066400000000000000000000423001262320455600213420ustar00rootroot00000000000000;;; bbdb-wl.el -- BBDB interface to Wanderlust ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi ;; Author: Yuuichi Teranishi ;; Keywords: mail, news, database ;;; Commentary: ;; ;; Insert the following lines in your ~/.wl ;; ;; (require 'bbdb-wl) ;; (bbdb-wl-setup) ;;; Code: ;; ;; bbdb setup. (eval-when-compile (require 'static) (require 'mime-setup) (require 'elmo-vars) (require 'elmo-util) (require 'wl-summary) (require 'wl-message) (require 'wl-draft) (require 'wl-address) (require 'bbdb-com) (defvar bbdb-pop-up-elided-display nil)) (require 'bbdb) (defvar bbdb-wl-get-update-record-hook nil) (defvar bbdb-wl-folder-regexp nil) (defvar bbdb-wl-ignore-folder-regexp nil) (defvar bbdb-wl-canonicalize-full-name-function #'bbdb-wl-canonicalize-spaces-and-dots "Way to canonicalize full name.") (defun bbdb-wl-canonicalize-spaces-and-dots (string) (while (and string (string-match " +\\|[\f\t\n\r\v]+\\|\\." string)) (setq string (replace-match " " nil t string))) (and string (string-match "^ " string) (setq string (replace-match "" nil t string))) string) ;;;###autoload (defun bbdb-wl-setup () (add-hook 'wl-message-redisplay-hook 'bbdb-wl-get-update-record) (add-hook 'wl-summary-exit-hook 'bbdb-wl-hide-bbdb-buffer) (add-hook 'wl-message-window-deleted-hook 'bbdb-wl-hide-bbdb-buffer) (add-hook 'wl-exit-hook 'bbdb-wl-exit) (add-hook 'wl-save-hook 'bbdb-offer-save) (add-hook 'wl-summary-toggle-disp-off-hook 'bbdb-wl-hide-bbdb-buffer) (add-hook 'wl-summary-toggle-disp-folder-on-hook 'bbdb-wl-hide-bbdb-buffer) (add-hook 'wl-summary-toggle-disp-folder-off-hook 'bbdb-wl-hide-bbdb-buffer) (add-hook 'wl-summary-toggle-disp-folder-message-resumed-hook 'bbdb-wl-show-bbdb-buffer) (add-hook 'wl-summary-mode-hook (function (lambda () (define-key (current-local-map) ":" 'bbdb-wl-show-sender) (define-key (current-local-map) ";" 'bbdb-wl-edit-notes)))) (add-hook 'wl-summary-exit-hook 'bbdb-flush-all-caches) (add-hook 'wl-summary-exec-hook 'bbdb-flush-all-caches) (add-hook 'wl-mail-setup-hook (function (lambda () ;;; (local-set-key "\M-\t" 'bbdb-complete-name) (define-key (current-local-map) "\M-\t" 'bbdb-complete-name)))) (require 'bbdb) (bbdb-initialize) (if (not (boundp 'bbdb-get-addresses-from-headers)) (defvar bbdb-get-addresses-from-headers '("From" "Resent-From" "Reply-To"))) (if (not (boundp 'bbdb-get-addresses-to-headers)) (defvar bbdb-get-addresses-to-headers '("Resent-To" "Resent-CC" "To" "CC" "BCC"))) (if (not (boundp 'bbdb-get-addresses-headers)) (defvar bbdb-get-addresses-headers (append bbdb-get-addresses-from-headers bbdb-get-addresses-to-headers)))) (defun bbdb-wl-exit () (let (bbdb-buf) (if (setq bbdb-buf (get-buffer bbdb-buffer-name)) (kill-buffer bbdb-buf))) (bbdb-offer-save)) (defun bbdb-wl-get-update-record () (let ((folder-name (with-current-buffer wl-message-buffer-cur-summary-buffer (wl-summary-buffer-folder-name)))) (if (and (or (null bbdb-wl-folder-regexp) (string-match bbdb-wl-folder-regexp folder-name)) (not (and bbdb-wl-ignore-folder-regexp (string-match bbdb-wl-ignore-folder-regexp folder-name)))) (with-current-buffer (wl-message-get-original-buffer) (bbdb-wl-update-record) (run-hooks 'bbdb-wl-get-update-record-hook))))) (defun bbdb-wl-hide-bbdb-buffer () (let (bbdb-buf bbdb-win) (if (setq bbdb-buf (get-buffer bbdb-buffer-name)) (if (setq bbdb-win (get-buffer-window bbdb-buf)) (delete-window bbdb-win))))) (defun bbdb-wl-show-bbdb-buffer () (save-selected-window (if (get-buffer-window bbdb-buffer-name) nil (let ((mes-win (get-buffer-window (save-excursion (if (buffer-live-p wl-current-summary-buffer) (set-buffer wl-current-summary-buffer)) wl-message-buffer))) (cur-win (selected-window)) (b (current-buffer))) (and mes-win (select-window mes-win)) (let ((size (min (- (window-height mes-win) window-min-height 1) (- (window-height mes-win) (max window-min-height (1+ bbdb-pop-up-target-lines)))))) (split-window mes-win (if (> size 0) size window-min-height))) ;; goto the bottom of the two... (select-window (next-window)) ;; make it display *BBDB*... (let ((pop-up-windows nil)) (switch-to-buffer (get-buffer-create bbdb-buffer-name))))))) (defun bbdb-wl-get-petname (from) "For `wl-summary-get-petname-function'." (let* ((address (wl-address-header-extract-address from)) (record (bbdb-search-simple nil address))) (and record (or (bbdb-record-name record) (car (bbdb-record-name record)))))) (defun bbdb-wl-from-func (string) "A candidate From field STRING. For `wl-summary-from-function'." (let ((hit (bbdb-search-simple nil (wl-address-header-extract-address string))) first-name last-name from-str) (if hit (progn (setq first-name (aref hit 0)) (setq last-name (aref hit 1)) (cond ((and (null first-name) (null last-name)) (setq from-str string)) ((and first-name last-name) (setq from-str (concat first-name " " last-name))) ((or first-name last-name) (setq from-str (or first-name last-name)))) from-str) string))) (defun bbdb-wl-get-addresses-1 (&optional only-first-address) "Return real name and email address of sender respectively recipients. If an address matches `bbdb-user-mail-names' it will be ignored. The headers to search can be configured by `bbdb-get-addresses-headers'. For BBDB 2.33 or earlier." (save-excursion (save-restriction (std11-narrow-to-header) (let ((headers bbdb-get-addresses-headers) (uninteresting-senders bbdb-user-mail-names) addrlist header structures structure fn ad) (while headers (setq header (std11-fetch-field (car headers))) (when header (setq structures (std11-parse-addresses-string (std11-unfold-string header))) (while (and (setq structure (car structures)) (eq (car structure) 'mailbox)) (setq fn (std11-full-name-string structure) fn (and fn (with-temp-buffer ; to keep raw buffer unibyte. (set-buffer-multibyte default-enable-multibyte-characters) (eword-decode-string (decode-mime-charset-string fn wl-mime-charset)))) fn (funcall bbdb-wl-canonicalize-full-name-function fn) ad (std11-address-string structure)) ;; ignore uninteresting addresses, this is kinda gross! (when (or (not (stringp uninteresting-senders)) (not (or (and fn (string-match uninteresting-senders fn)) (and ad (string-match uninteresting-senders ad))))) (add-to-list 'addrlist (list fn ad))) (if (and only-first-address addrlist) (setq structures nil headers nil) (setq structures (cdr structures))))) (setq headers (cdr headers))) (nreverse addrlist))))) (defun bbdb-wl-get-addresses-2 (&optional only-first-address) "Return real name and email address of sender respectively recipients. If an address matches `bbdb-user-mail-names' it will be ignored. The headers to search can be configured by `bbdb-get-addresses-headers'. For BBDB 2.34 or later." (save-excursion (save-restriction (std11-narrow-to-header) (let ((headers bbdb-get-addresses-headers) (uninteresting-senders bbdb-user-mail-names) addrlist header structures structure fn ad header-type header-fields header-content) (while headers (setq header-type (caar headers) header-fields (cdar headers)) (while header-fields (setq header-content (std11-fetch-field (car header-fields))) (when header-content (setq structures (std11-parse-addresses-string (std11-unfold-string header-content))) (while (and (setq structure (car structures)) (eq (car structure) 'mailbox)) (setq fn (std11-full-name-string structure) fn (and fn (with-temp-buffer ; to keep raw buffer unibyte. (set-buffer-multibyte default-enable-multibyte-characters) (eword-decode-string (decode-mime-charset-string fn wl-mime-charset)))) fn (funcall bbdb-wl-canonicalize-full-name-function fn) ad (std11-address-string structure)) ;; ignore uninteresting addresses, this is kinda gross! (when (or (not (stringp uninteresting-senders)) (not (or (and fn (string-match uninteresting-senders fn)) (and ad (string-match uninteresting-senders ad))))) (add-to-list 'addrlist (list header-type (car header-fields) (list fn ad)))) (if (and only-first-address addrlist) (setq structures nil headers nil) (setq structures (cdr structures))))) (setq header-fields (cdr header-fields))) (setq headers (cdr headers))) (nreverse addrlist))))) (defun bbdb-wl-get-addresses (&optional only-first-address) "Return real name and email address of sender respectively recipients. If an address matches `bbdb-user-mail-names' it will be ignored. The headers to search can be configured by `bbdb-get-addresses-headers'." (if (string< bbdb-version "2.34") (bbdb-wl-get-addresses-1) (bbdb-wl-get-addresses-2))) (defun bbdb-wl-update-record (&optional offer-to-create) "Returns the record corresponding to the current WL message, creating or modifying it as necessary. A record will be created if bbdb/mail-auto-create-p is non-nil, or if OFFER-TO-CREATE is true and the user confirms the creation." (let* ((bbdb-get-only-first-address-p t) (records (bbdb-wl-update-records offer-to-create))) (if (and records (listp records)) (car records) records))) (defun bbdb-wl-update-records (&optional offer-to-create) "Returns the records corresponding to the current WL message, creating or modifying it as necessary. A record will be created if bbdb/mail-auto-create-p is non-nil, or if OFFER-TO-CREATE is true and the user confirms the creation." (save-excursion (if bbdb-use-pop-up (bbdb-wl-pop-up-bbdb-buffer offer-to-create) (let ((key (save-excursion (set-buffer (save-excursion (if (buffer-live-p wl-current-summary-buffer) (set-buffer wl-current-summary-buffer)) wl-message-buffer)) (intern (format "%s-%d" wl-current-summary-buffer wl-message-buffer-cur-number)))) record) (or (progn (setq record (bbdb-message-cache-lookup key)) (if (listp record) (nth 1 record) record)) (static-if (not (fboundp 'bbdb-update-records)) (let* ((from (or (std11-field-body "From") "")) (addr (and from (nth 1 (std11-extract-address-components from))))) (if (or (null from) (null addr) (string-match (bbdb-user-mail-names) addr)) (setq from (or (std11-field-body "To") from))) (with-temp-buffer ; to keep raw buffer unibyte. (set-buffer-multibyte default-enable-multibyte-characters) (setq from (eword-decode-string (decode-mime-charset-string from wl-mime-charset)))) (if from (bbdb-encache-message key (bbdb-annotate-message-sender from t (or (bbdb-invoke-hook-for-value bbdb/mail-auto-create-p) offer-to-create) offer-to-create)))) (bbdb-encache-message key (bbdb-update-records (bbdb-wl-get-addresses bbdb-get-only-first-address-p) (or (bbdb-invoke-hook-for-value bbdb/mail-auto-create-p) offer-to-create) offer-to-create)))))))) (defun bbdb-wl-annotate-sender (string) "Add a line to the end of the Notes field of the BBDB record corresponding to the sender of this message." (interactive (list (if bbdb-readonly-p (error "The Insidious Big Brother Database is read-only") (read-string "Comments: ")))) (set-buffer (wl-message-get-original-buffer)) (bbdb-annotate-notes (bbdb-wl-update-record t) string)) (defun bbdb-wl-edit-notes (&optional arg) "Edit the notes field or (with a prefix arg) a user-defined field of the BBDB record corresponding to the sender of this message." (interactive "P") (wl-summary-set-message-buffer-or-redisplay) (set-buffer (wl-message-get-original-buffer)) (let ((record (or (bbdb-wl-update-record t) (error "")))) (bbdb-display-records (list record)) (if arg (bbdb-record-edit-property record nil t) (bbdb-record-edit-notes record t)))) (defun bbdb-wl-show-records (&optional headers) "Display the contents of the BBDB for the sender of this message. This buffer will be in `bbdb-mode', with associated keybindings." (interactive) (wl-summary-set-message-buffer-or-redisplay) (set-buffer (wl-message-get-original-buffer)) (let ((bbdb-get-addresses-headers (or headers bbdb-get-addresses-headers)) (bbdb-update-records-mode 'annotating) (bbdb-message-cache nil) (bbdb-user-mail-names nil) records bbdb-win) (setq records (bbdb-wl-update-records t)) (if records (progn (bbdb-wl-pop-up-bbdb-buffer) (bbdb-display-records (if (listp records) records (list records)))) (bbdb-undisplay-records)) (setq bbdb-win (get-buffer-window (get-buffer bbdb-buffer-name))) (and bbdb-win (select-window bbdb-win)) records)) (defun bbdb-wl-address-headers-spec (address-class) "Return address headers structure for ADDRESS-CLASS." (if (string< bbdb-version "2.34") (cond ((eq address-class 'recipients) bbdb-get-addresses-to-headers) ((eq address-class 'authors) bbdb-get-addresses-from-headers) (t (append bbdb-get-addresses-to-headers bbdb-get-addresses-from-headers))) (list (assoc address-class bbdb-get-addresses-headers)))) (defun bbdb-wl-show-all-recipients () "Show all recipients of this message. Counterpart to `bbdb/vm-show-sender'." (interactive) (bbdb-wl-show-records (bbdb-wl-address-headers-spec 'recipients))) (defun bbdb-wl-show-sender (&optional show-recipients) "Display the contents of the BBDB for the senders of this message. With a prefix argument show the recipients instead, with two prefix arguments show all records. This buffer will be in `bbdb-mode', with associated keybindings." (interactive "p") (cond ((= 4 show-recipients) (bbdb-wl-show-all-recipients)) ((= 16 show-recipients) (bbdb-wl-show-records)) (t (if (null (bbdb-wl-show-records (bbdb-wl-address-headers-spec 'authors))) (bbdb-wl-show-all-recipients))))) (defun bbdb-wl-pop-up-bbdb-buffer (&optional offer-to-create) "Make the *BBDB* buffer be displayed along with the WL window(s), displaying the record corresponding to the sender of the current message." (if (get-buffer-window bbdb-buffer-name) nil (let ((mes-win (get-buffer-window (save-excursion (if (buffer-live-p wl-current-summary-buffer) (set-buffer wl-current-summary-buffer)) wl-message-buffer))) (cur-win (selected-window)) (b (current-buffer))) (and mes-win (select-window mes-win)) (let ((size (min (- (window-height mes-win) window-min-height 1) (- (window-height mes-win) (max window-min-height (1+ bbdb-pop-up-target-lines)))))) (split-window mes-win (if (> size 0) size window-min-height))) ;; goto the bottom of the two... (select-window (next-window)) ;; make it display *BBDB*... (let ((pop-up-windows nil)) (switch-to-buffer (get-buffer-create bbdb-buffer-name))) ;; select the original window we were in... (select-window cur-win) ;; and make sure the current buffer is correct as well. (set-buffer b))) (let ((bbdb-gag-messages t) (bbdb-use-pop-up nil) (bbdb-electric-p nil)) (let* ((records (static-if (fboundp 'bbdb-update-records) (bbdb-wl-update-records offer-to-create) (bbdb-wl-update-record offer-to-create))) ;; BBDB versions v2.33 and later. (bbdb-display-layout (cond ((boundp 'bbdb-pop-up-display-layout) (symbol-value 'bbdb-pop-up-display-layout)) ((boundp 'bbdb-pop-up-elided-display) (symbol-value 'bbdb-pop-up-elided-display)))) ;; BBDB versions prior to v2.33, (bbdb-elided-display bbdb-display-layout) (b (current-buffer))) (bbdb-display-records (if (listp records) records (list records))) (set-buffer b) records))) (defun bbdb-wl-send-mail-internal (&optional to subj records) (unwind-protect (wl-draft (wl-address-header-extract-address to) "" (or subj "")) (condition-case nil (delete-other-windows) (error)))) ;;; @ bbdb-extract-field-value -- stolen from tm-bbdb. ;;; (eval-and-compile (if (fboundp 'bbdb-wl-extract-field-value-internal) ;;(if (fboundp 'PLEASE_REPLACE_WITH_SEMI-BASED_MIME-BBDB)) ;; mime-bbdb nil (if (and (string< bbdb-version "1.58") ;;(not (fboundp 'bbdb-extract-field-value) ;; defined as autoload (not (fboundp 'bbdb-header-start))) (load "bbdb-hooks") (require 'bbdb-hooks)) (fset 'bbdb-wl-extract-field-value-internal (cond ((fboundp 'tm:bbdb-extract-field-value) (symbol-function 'tm:bbdb-extract-field-value)) (t (symbol-function 'bbdb-extract-field-value)))) (defun bbdb-extract-field-value (field) (let ((value (bbdb-wl-extract-field-value-internal field))) (with-temp-buffer ; to keep raw buffer unibyte. (set-buffer-multibyte default-enable-multibyte-characters) (and value (eword-decode-string value))))) )) (provide 'bbdb-wl) ;;; bbdb-wl.el ends here wanderlust-wanderlust-912c443/utils/im-wl.el000066400000000000000000000154521262320455600210660ustar00rootroot00000000000000;;; 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-912c443/utils/ptexinfmt.el000066400000000000000000001131611262320455600220530ustar00rootroot00000000000000;;; 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))))) ;; sort -fd (ptexinfmt-broken-facility texinfo-format-printindex "Can't sort on Mule for Windows." (if (and (memq system-type '(windows-nt ms-dos)) ;;; I don't know version threshold. ;;; (string< texinfmt-version "2.37 of 24 May 1997") (boundp 'MULE) (not (featurep 'meadow))) ; Mule for Windows nil t)) ;; @var{METASYNTACTIC-VARIABLE} (defvar texinfo-enclosure-list) (defvar texinfo-alias-list) (ptexinfmt-broken-facility texinfo-format-var "Don't perse @var argument." (condition-case nil (with-temp-buffer (let (texinfo-enclosure-list texinfo-alias-list) (texinfo-mode) (insert "@var{@asis{foo}}\n") (texinfo-format-expand-region (point-min) (point-max)) t)) (error nil))) ;; @xref{NODE-NAME[, CROSS-REFERENCE-NAME, TITLE-OR-TOPIC, ;; INFO-FILE-NAME, PRINTED-MANUAL-TITLE]}. (ptexinfmt-broken-facility texinfo-format-xref "Can't format @xref, 1st argument is empty." (condition-case nil (with-temp-buffer (let (texinfo-enclosure-list texinfo-alias-list) (texinfo-mode) (insert "@xref{, xref, , file}\n") (texinfo-format-expand-region (point-min) (point-max)) t)) (error nil))) ;; @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))) ;; @multitable (ptexinfmt-broken-facility texinfo-multitable-widths "`texinfo-multitable-widths' unsupport wide-char." (if (fboundp 'texinfo-multitable-widths) (with-temp-buffer (let ((str (string (make-char 'japanese-jisx0208 73 125) (make-char 'japanese-jisx0208 57 45) (make-char 'japanese-jisx0208 74 56) (make-char 'japanese-jisx0208 59 122)))) (texinfo-mode) (insert (format " {%s}\n" str)) (goto-char (point-min)) (if (= (car (texinfo-multitable-widths)) (length str)) t nil))) ;; function definition is void nil)) (ptexinfmt-broken-facility texinfo-multitable-item "`texinfo-multitable-item' unsupport wide-char." (not (get 'texinfo-multitable-widths 'broken))) ;;; Hardcopy and HTML (discard) ;; html (put 'documentlanguage 'texinfo-format 'texinfo-discard-line-with-args) (put 'documentencoding 'texinfo-format 'texinfo-discard-line-with-args) (put 'documentdescription 'texinfo-format 'texinfo-discard-line-with-args) ;; size (put 'smallbook 'texinfo-format 'texinfo-discard-line) (put 'letterpaper 'texinfo-format 'texinfo-discard-line) (put 'afourpaper 'texinfo-format 'texinfo-discard-line) (put 'afourlatex 'texinfo-format 'texinfo-discard-line) (put 'afourwide 'texinfo-format 'texinfo-discard-line) (put 'afivepaper 'texinfo-format 'texinfo-discard-line) (put 'pagesizes 'texinfo-format 'texinfo-discard-line-with-args) (put 'fonttextsize 'texinfo-format 'texinfo-discard-line-with-args) ;; style (put 'setchapternewpage 'texinfo-format 'texinfo-discard-line-with-args) (put 'kbdinputstyle 'texinfo-format 'texinfo-discard-line-with-args) ;; flags (put 'setcontentsaftertitlepage 'texinfo-format 'texinfo-discard-line) (put 'setshortcontentsaftertitlepage 'texinfo-format 'texinfo-discard-line) (put 'novalidate 'texinfo-format 'texinfo-discard-line-with-args) (put 'frenchspacing 'texinfo-format 'texinfo-discard-line-with-args) ;; head & foot (put 'headings 'texinfo-format 'texinfo-discard-line-with-args) (put 'evenfooting 'texinfo-format 'texinfo-discard-line-with-args) (put 'evenheading 'texinfo-format 'texinfo-discard-line-with-args) (put 'oddfooting 'texinfo-format 'texinfo-discard-line-with-args) (put 'oddheading 'texinfo-format 'texinfo-discard-line-with-args) (put 'everyfooting 'texinfo-format 'texinfo-discard-line-with-args) (put 'everyheading 'texinfo-format 'texinfo-discard-line-with-args) ;; misc (put 'page 'texinfo-format 'texinfo-discard-line) (put 'hyphenation 'texinfo-format 'texinfo-discard-command-and-arg) ;; @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 " ")) ;;; Directory File ;; @direcategory DIRPART (put 'dircategory 'texinfo-format 'texinfo-format-dircategory) (ptexinfmt-defun-if-void texinfo-format-dircategory () (let ((str (texinfo-parse-arg-discard))) (delete-region (point) (progn (skip-chars-forward " ") (point))) (insert "INFO-DIR-SECTION " str "\n"))) ;; @direntry ... @end direntry (put 'direntry 'texinfo-format 'texinfo-format-direntry) (ptexinfmt-defun-if-void texinfo-format-direntry () (texinfo-push-stack 'direntry nil) (texinfo-discard-line) (insert "START-INFO-DIR-ENTRY\n")) (put 'direntry 'texinfo-end 'texinfo-end-direntry) (ptexinfmt-defun-if-void texinfo-end-direntry () (texinfo-discard-command) (insert "END-INFO-DIR-ENTRY\n\n") (texinfo-pop-stack 'direntry)) ;;; Block Enclosing ;; @detailmenu ... @end detailmenu (put 'detailmenu 'texinfo-format 'texinfo-discard-line) (put 'detailmenu 'texinfo-end 'texinfo-discard-command) ;; @smalldisplay ... @end smalldisplay (put 'smalldisplay 'texinfo-format 'texinfo-format-example) (put 'smalldisplay 'texinfo-end 'texinfo-end-example) ;; @smallformat ... @end smallformat (put 'smallformat 'texinfo-format 'texinfo-format-flushleft) (put 'smallformat 'texinfo-end 'texinfo-end-flushleft) ;; @cartouche ... @end cartouche (put 'cartouche 'texinfo-format 'texinfo-discard-line) (put 'cartouche 'texinfo-end 'texinfo-discard-command) ;;; Conditional ;; @ifnottex ... @end ifnottex (makeinfo 3.11 or later) (put 'ifnottex 'texinfo-format 'texinfo-discard-line) (put 'ifnottex 'texinfo-end 'texinfo-discard-command) ;; @ifnothtml ... @end ifnothtml (makeinfo 3.11 or later) (put 'ifnothtml 'texinfo-format 'texinfo-discard-line) (put 'ifnothtml 'texinfo-end 'texinfo-discard-command) ;; @ifnotplaintext ... @end ifnotplaintext (makeinfo 4.2 or later) (put 'ifnotplaintext 'texinfo-format 'texinfo-discard-line) (put 'ifnotplaintext 'texinfo-end 'texinfo-discard-command) ;; @ifnotdocbook ... @end ifnotdocbook (makeinfo 4.7 or later) (put 'ifnotdocbook 'texinfo-format 'texinfo-discard-line) (put 'ifnotdocbook 'texinfo-end 'texinfo-discard-command) ;; @ifnotinfo ... @end ifnotinfo (makeinfo 3.11 or later) (put 'ifnotinfo 'texinfo-format 'texinfo-format-ifnotinfo) (ptexinfmt-defun-if-void texinfo-format-ifnotinfo () (delete-region texinfo-command-start (progn (re-search-forward "@end ifnotinfo[ \t]*\n") (point)))) ;; @html ... @end html (makeinfo 3.11 or later) (put 'html 'texinfo-format 'texinfo-format-html) (ptexinfmt-defun-if-void texinfo-format-html () (delete-region texinfo-command-start (progn (re-search-forward "@end html[ \t]*\n") (point)))) ;; @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)))) ;; @ifhtml ... @end ifhtml (makeinfo 3.8 or later) (put 'ifhtml 'texinfo-format 'texinfo-format-ifhtml) (defun texinfo-format-ifhtml () (delete-region texinfo-command-start (progn (re-search-forward "@end ifhtml[ \t]*\n") (point)))) ;; @ifplaintext ... @end ifplaintext (makeinfo 4.2 or later) (put 'ifplaintext 'texinfo-format 'texinfo-format-ifplaintext) (ptexinfmt-defun-if-void texinfo-format-ifplaintext () (delete-region texinfo-command-start (progn (re-search-forward "@end ifplaintext[ \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 ;; @env{ENVIRONMENT-VARIABLE} (put 'env 'texinfo-format 'texinfo-format-code) ;; @command{COMMAND-NAME} (put 'command 'texinfo-format 'texinfo-format-code) ;; @indicateurl{INDICATEURL} (put 'indicateurl 'texinfo-format 'texinfo-format-code) ;; @url{URL[, DISPLAYED-TEXT][, REPLACEMENT} (put 'url 'texinfo-format 'texinfo-format-uref) ; Texinfo 4.7 ;; @acronym{ACRONYM} (put 'acronym 'texinfo-format 'texinfo-format-var) ;; @var{METASYNTACTIC-VARIABLE} (ptexinfmt-defun-if-broken texinfo-format-var () (let ((arg (texinfo-parse-expanded-arg))) (texinfo-discard-command) (insert (upcase arg)))) ;; @key{KEY-NAME} (put 'key 'texinfo-format 'texinfo-format-key) (ptexinfmt-defun-if-void texinfo-format-key () (insert (texinfo-parse-arg-discard)) (goto-char texinfo-command-start)) ;; @email{EMAIL-ADDRESS[, DISPLAYED-TEXT]} (put 'email 'texinfo-format 'texinfo-format-email) (ptexinfmt-defun-if-void texinfo-format-email () "Format EMAIL-ADDRESS and optional DISPLAYED-TXT. Insert < ... > around EMAIL-ADDRESS." (let ((args (texinfo-format-parse-args))) (texinfo-discard-command) ;; if displayed-text (if (nth 1 args) (insert (nth 1 args) " <" (nth 0 args) ">") (insert "<" (nth 0 args) ">")))) ;; @option{OPTION-NAME} (put 'option 'texinfo-format 'texinfo-format-option) (ptexinfmt-defun-if-void texinfo-format-option () "Insert ` ... ' around arg unless inside a table; in that case, no quotes." ;; `looking-at-backward' not available in v. 18.57, 20.2 ;; searched-for character is a control-H (if (not (search-backward "\010" (save-excursion (beginning-of-line) (point)) t)) (insert "`" (texinfo-parse-arg-discard) "'") (insert (texinfo-parse-arg-discard))) (goto-char texinfo-command-start)) ;; @verb{TEXT} (makeinfo 4.1 or later) (put 'verb 'texinfo-format 'texinfo-format-verb) (ptexinfmt-defun-if-void texinfo-format-verb () "Format text between non-quoted unique delimiter characters verbatim. Enclose the verbatim text, including the delimiters, in braces. Print text exactly as written (but not the delimiters) in a fixed-width. For example, @verb\{|@|\} results in @ and @verb\{+@'e?`!`+} results in @'e?`!`." (let ((delimiter (buffer-substring-no-properties (1+ texinfo-command-end) (+ 2 texinfo-command-end)))) (unless (looking-at "{") (error "Not found: @verb start brace")) (delete-region texinfo-command-start (+ 2 texinfo-command-end)) (search-forward delimiter)) (delete-char -1) (unless (looking-at "}") (error "Not found: @verb end brace")) (delete-char 1)) ;; @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 ")) ;; @pounds{} ==> # Pounds Sterling (put 'pounds 'texinfo-format 'texinfo-format-pounds) (ptexinfmt-defun-if-void texinfo-format-pounds () (texinfo-parse-arg-discard) (insert "#")) ;; @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")) ;; @OE{} ==> OE French-OE-ligature (put 'OE 'texinfo-format 'texinfo-format-French-OE-ligature) (ptexinfmt-defun-if-void texinfo-format-French-OE-ligature () (insert "OE" (texinfo-parse-arg-discard)) (goto-char texinfo-command-start)) ;; @oe{} ==> oe (put 'oe 'texinfo-format 'texinfo-format-French-oe-ligature) (ptexinfmt-defun-if-void texinfo-format-French-oe-ligature () ; lower case (insert "oe" (texinfo-parse-arg-discard)) (goto-char texinfo-command-start)) ;; @AA{} ==> AA Scandinavian-A-with-circle (put 'AA 'texinfo-format 'texinfo-format-Scandinavian-A-with-circle) (ptexinfmt-defun-if-void texinfo-format-Scandinavian-A-with-circle () (insert "AA" (texinfo-parse-arg-discard)) (goto-char texinfo-command-start)) ;; @aa{} ==> aa (put 'aa 'texinfo-format 'texinfo-format-Scandinavian-a-with-circle) (ptexinfmt-defun-if-void texinfo-format-Scandinavian-a-with-circle () ; lower case (insert "aa" (texinfo-parse-arg-discard)) (goto-char texinfo-command-start)) ;; @AE{} ==> AE Latin-Scandinavian-AE (put 'AE 'texinfo-format 'texinfo-format-Latin-Scandinavian-AE) (ptexinfmt-defun-if-void texinfo-format-Latin-Scandinavian-AE () (insert "AE" (texinfo-parse-arg-discard)) (goto-char texinfo-command-start)) ;; @ae{} ==> ae (put 'ae 'texinfo-format 'texinfo-format-Latin-Scandinavian-ae) (ptexinfmt-defun-if-void texinfo-format-Latin-Scandinavian-ae () ; lower case (insert "ae" (texinfo-parse-arg-discard)) (goto-char texinfo-command-start)) ;; @ss{} ==> ss German-sharp-S (put 'ss 'texinfo-format 'texinfo-format-German-sharp-S) (ptexinfmt-defun-if-void texinfo-format-German-sharp-S () (insert "ss" (texinfo-parse-arg-discard)) (goto-char texinfo-command-start)) ;; @questiondown{} ==> ? upside-down-question-mark (put 'questiondown 'texinfo-format 'texinfo-format-upside-down-question-mark) (ptexinfmt-defun-if-void texinfo-format-upside-down-question-mark () (insert "?" (texinfo-parse-arg-discard)) (goto-char texinfo-command-start)) ;; @exclamdown{} ==> ! upside-down-exclamation-mark (put 'exclamdown 'texinfo-format 'texinfo-format-upside-down-exclamation-mark) (ptexinfmt-defun-if-void texinfo-format-upside-down-exclamation-mark () (insert "!" (texinfo-parse-arg-discard)) (goto-char texinfo-command-start)) ;; @L{} ==> L/ Polish suppressed-L (Lslash) (put 'L 'texinfo-format 'texinfo-format-Polish-suppressed-L) (ptexinfmt-defun-if-void texinfo-format-Polish-suppressed-L () (insert (texinfo-parse-arg-discard) "/L") (goto-char texinfo-command-start)) ;; @l{} ==> l/ Polish suppressed-L (Lslash) (lower case) (put 'l 'texinfo-format 'texinfo-format-Polish-suppressed-l-lower-case) (ptexinfmt-defun-if-void texinfo-format-Polish-suppressed-l-lower-case () (insert (texinfo-parse-arg-discard) "/l") (goto-char texinfo-command-start)) ;; @O{} ==> O/ Scandinavian O-with-slash (put 'O 'texinfo-format 'texinfo-format-Scandinavian-O-with-slash) (ptexinfmt-defun-if-void texinfo-format-Scandinavian-O-with-slash () (insert (texinfo-parse-arg-discard) "O/") (goto-char texinfo-command-start)) ;; @o{} ==> o/ Scandinavian O-with-slash (lower case) (put 'o 'texinfo-format 'texinfo-format-Scandinavian-o-with-slash-lower-case) (ptexinfmt-defun-if-void texinfo-format-Scandinavian-o-with-slash-lower-case () (insert (texinfo-parse-arg-discard) "o/") (goto-char texinfo-command-start)) ;; @,{c} ==> c, cedilla accent (put '\, 'texinfo-format 'texinfo-format-cedilla-accent) (ptexinfmt-defun-if-void texinfo-format-cedilla-accent () (insert (texinfo-parse-arg-discard) ",") (goto-char texinfo-command-start)) ;; @dotaccent{o} ==> .o overdot-accent (put 'dotaccent 'texinfo-format 'texinfo-format-overdot-accent) (ptexinfmt-defun-if-void texinfo-format-overdot-accent () (insert "." (texinfo-parse-arg-discard)) (goto-char texinfo-command-start)) ;; @ubaraccent{o} ==> _o underbar-accent (put 'ubaraccent 'texinfo-format 'texinfo-format-underbar-accent) (ptexinfmt-defun-if-void texinfo-format-underbar-accent () (insert "_" (texinfo-parse-arg-discard)) (goto-char texinfo-command-start)) ;; @udotaccent{o} ==> o-. underdot-accent (put 'udotaccent 'texinfo-format 'texinfo-format-underdot-accent) (ptexinfmt-defun-if-void texinfo-format-underdot-accent () (insert (texinfo-parse-arg-discard) "-.") (goto-char texinfo-command-start)) ;; @H{o} ==> ""o long Hungarian umlaut (put 'H 'texinfo-format 'texinfo-format-long-Hungarian-umlaut) (ptexinfmt-defun-if-void texinfo-format-long-Hungarian-umlaut () (insert "\"\"" (texinfo-parse-arg-discard)) (goto-char texinfo-command-start)) ;; @ringaccent{o} ==> *o ring accent (put 'ringaccent 'texinfo-format 'texinfo-format-ring-accent) (ptexinfmt-defun-if-void texinfo-format-ring-accent () (insert "*" (texinfo-parse-arg-discard)) (goto-char texinfo-command-start)) ;; @tieaccent{oo} ==> [oo tie after accent (put 'tieaccent 'texinfo-format 'texinfo-format-tie-after-accent) (ptexinfmt-defun-if-void texinfo-format-tie-after-accent () (insert "[" (texinfo-parse-arg-discard)) (goto-char texinfo-command-start)) ;; @u{o} ==> (o breve accent (put 'u 'texinfo-format 'texinfo-format-breve-accent) (ptexinfmt-defun-if-void texinfo-format-breve-accent () (insert "(" (texinfo-parse-arg-discard)) (goto-char texinfo-command-start)) ;; @v{o} ==> i dotless i and dotless j (put 'dotless 'texinfo-format 'texinfo-format-dotless) (ptexinfmt-defun-if-void texinfo-format-dotless () (insert (texinfo-parse-arg-discard)) (goto-char texinfo-command-start)) ;; @. (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)) ;;; Cross References ;; @ref{NODE-NAME, ...} ;; @xref{NODE-NAME, ...} (put 'ref 'texinfo-format 'texinfo-format-xref) (ptexinfmt-defun-if-broken texinfo-format-xref () (let ((args (texinfo-format-parse-args))) (texinfo-discard-command) (insert "*Note ") (let ((fname (or (nth 1 args) (nth 2 args)))) (if (null (or fname (nth 3 args))) (insert (nth 0 args) "::") (insert (or fname (nth 0 args)) ": ") (if (nth 3 args) (insert "(" (nth 3 args) ")")) (unless (null (nth 0 args)) (insert (nth 0 args))))))) ;; @uref{URL [,TEXT] [,REPLACEMENT]} (put 'uref 'texinfo-format 'texinfo-format-uref) (ptexinfmt-defun-if-broken texinfo-format-uref () "Format URL and optional URL-TITLE. Insert ` ... ' around URL if no URL-TITLE argument; otherwise, insert URL-TITLE followed by URL in parentheses." (let ((args (texinfo-format-parse-args))) (texinfo-discard-command) ;; if url-title (if (nth 1 args) (insert (nth 1 args) " (" (nth 0 args) ")") (insert "`" (nth 0 args) "'")))) ;; @inforef{NODE-NAME, CROSS-REFERENCE-NAME, INFO-FILE-NAME} (put 'inforef 'texinfo-format 'texinfo-format-inforef) (ptexinfmt-defun-if-void texinfo-format-inforef () (let ((args (texinfo-format-parse-args))) (texinfo-discard-command) (if (nth 1 args) (insert "*Note " (nth 1 args) ": (" (nth 2 args) ")" (car args)) (insert "*Note " "(" (nth 2 args) ")" (car args) "::")))) ;; @anchor{NAME} ;; don't emulation ;; If support @anchor for Mule 2.3, We must fix informat.el and info.el: ;; - Info-tagify suport @anthor-*-refill. ;; - info.el support Ref in Tag table. (unless (get 'anchor 'texinfo-format) (put 'anchor 'texinfo-format 'texinfo-discard-command-and-arg)) ;;; New command definition ;; @alias NEW=EXISTING (put 'alias 'texinfo-format 'texinfo-alias) (ptexinfmt-defun-if-void texinfo-alias () (let ((start (1- (point))) args) (skip-chars-forward " ") (save-excursion (end-of-line) (setq texinfo-command-end (point))) (if (not (looking-at "\\([^=]+\\)=\\(.*\\)")) (error "Invalid alias command") (setq texinfo-alias-list (cons (cons (buffer-substring (match-beginning 1) (match-end 1)) (buffer-substring (match-beginning 2) (match-end 2))) texinfo-alias-list)) (texinfo-discard-command)))) ;;; 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 ;;; Special ;; @image{FILENAME [, WIDTH] [, HEIGHT]} (put 'image 'texinfo-format 'texinfo-format-image) (ptexinfmt-defun-if-void texinfo-format-image () ;; I don't know makeinfo parse FILENAME. (let ((args (texinfo-format-parse-args)) filename) (when (null (nth 0 args)) (error "Invalid image command")) (texinfo-discard-command) ;; makeinfo uses FILENAME.txt (setq filename (format "%s.txt" (nth 0 args))) (message "Reading included file: %s" filename) ;; verbatim for Info output (goto-char (+ (point) (cadr (insert-file-contents filename)))) (message "Reading included file: %s...done" filename))) ;;; @multitable ... @end multitable (ptexinfmt-defvar-if-void texinfo-extra-inter-column-width 0 "*Number of extra spaces between entries (columns) in @multitable.") (ptexinfmt-defvar-if-void texinfo-multitable-buffer-name "*multitable-temporary-buffer*") (ptexinfmt-defvar-if-void texinfo-multitable-rectangle-name "texinfo-multitable-temp-") ;; These commands are defined in texinfo.tex for printed output. (put 'multitableparskip 'texinfo-format 'texinfo-discard-line-with-args) (put 'multitableparindent 'texinfo-format 'texinfo-discard-line-with-args) (put 'multitablecolmargin 'texinfo-format 'texinfo-discard-line-with-args) (put 'multitablelinespace 'texinfo-format 'texinfo-discard-line-with-args) (put 'multitable 'texinfo-format 'texinfo-multitable) (ptexinfmt-defun-if-void texinfo-multitable () "Produce multi-column tables." ;; This function pushes information onto the `texinfo-stack'. ;; A stack element consists of: ;; - type-of-command, i.e., multitable ;; - the information about column widths, and ;; - the position of texinfo-command-start. ;; e.g., ('multitable (1 2 3 4) 123) ;; The command line is then deleted. (texinfo-push-stack 'multitable ;; push width information on stack (texinfo-multitable-widths)) (texinfo-discard-line-with-args)) (put 'multitable 'texinfo-end 'texinfo-end-multitable) (ptexinfmt-defun-if-void texinfo-end-multitable () "Discard the @end multitable line and pop the stack of multitable." (texinfo-discard-command) (texinfo-pop-stack 'multitable)) (ptexinfmt-defun-if-broken texinfo-multitable-widths () "Return list of widths of each column in a multi-column table." (let (texinfo-multitable-width-list) ;; Fractions format: ;; @multitable @columnfractions .25 .3 .45 ;; ;; Template format: ;; @multitable {Column 1 template} {Column 2} {Column 3 example} ;; Place point before first argument (skip-chars-forward " \t") (cond ;; Check for common misspelling ((looking-at "@columnfraction ") (error "In @multitable, @columnfractions misspelled")) ;; Case 1: @columnfractions .25 .3 .45 ((looking-at "@columnfractions") (forward-word 1) (while (not (eolp)) (setq texinfo-multitable-width-list (cons (truncate (1- (* fill-column (read (get-buffer (current-buffer)))))) texinfo-multitable-width-list)))) ;; ;; Case 2: {Column 1 template} {Column 2} {Column 3 example} ((looking-at "{") (let ((start-of-templates (point))) (while (not (eolp)) (skip-chars-forward " \t") (let* ((start-of-template (1+ (point))) (end-of-template ;; forward-sexp works with braces in Texinfo mode (progn (forward-sexp 1) (1- (point))))) (setq texinfo-multitable-width-list (cons (- (progn (goto-char end-of-template) (current-column)) (progn (goto-char start-of-template) (current-column))) texinfo-multitable-width-list)) ;; Remove carriage return from within a template, if any. ;; This helps those those who want to use more than ;; one line's worth of words in @multitable line. (narrow-to-region start-of-template end-of-template) (goto-char (point-min)) (while (search-forward "\n" nil t) (delete-char -1)) (goto-char (point-max)) (widen) (forward-char 1))))) ;; ;; Case 3: Trouble (t (error "\ You probably need to specify column widths for @multitable correctly"))) ;; Check whether columns fit on page. (let ((desired-columns (+ ;; between column spaces (length texinfo-multitable-width-list) ;; additional between column spaces, if any texinfo-extra-inter-column-width ;; sum of spaces for each entry (apply '+ texinfo-multitable-width-list)))) (if (> desired-columns fill-column) (error (format "\ Multi-column table width, %d chars, is greater than page width, %d chars." desired-columns fill-column)))) texinfo-multitable-width-list)) ;; @item A1 @tab A2 @tab A3 (ptexinfmt-defun-if-void texinfo-multitable-extract-row () "Return multitable row, as a string. End of row is beginning of next @item or beginning of @end. Cells within rows are separated by @tab." (skip-chars-forward " \t") (let* ((start (point)) (end (progn (re-search-forward "@item\\|@end") (match-beginning 0))) (row (progn (goto-char end) (skip-chars-backward " ") ;; remove whitespace at end of argument (delete-region (point) end) (buffer-substring start (point))))) (delete-region texinfo-command-start end) row)) (put 'multitable 'texinfo-item 'texinfo-multitable-item) (ptexinfmt-defun-if-void texinfo-multitable-item () "Format a row within a multicolumn table. Cells in row are separated by @tab. Widths of cells are specified by the arguments in the @multitable line. All cells are made to be the same height. This command is executed when texinfmt sees @item inside @multitable." (let ((original-buffer (current-buffer)) (table-widths (reverse (car (cdr (car texinfo-stack))))) (existing-fill-column fill-column) start end (table-column 0) (table-entry-height 0) ;; unformatted row looks like: A1 @tab A2 @tab A3 ;; extract-row command deletes the source line in the table. (unformated-row (texinfo-multitable-extract-row))) ;; Use a temporary buffer (set-buffer (get-buffer-create texinfo-multitable-buffer-name)) (delete-region (point-min) (point-max)) (insert unformated-row) (goto-char (point-min)) ;; 1. Check for correct number of @tab in line. (let ((tab-number 1)) ;; one @tab between two columns (while (search-forward "@tab" nil t) (setq tab-number (1+ tab-number))) (if (/= tab-number (length table-widths)) (error "Wrong number of @tab's in a @multitable row"))) (goto-char (point-min)) ;; 2. Format each cell, and copy to a rectangle ;; buffer looks like this: A1 @tab A2 @tab A3 ;; Cell #1: format up to @tab ;; Cell #2: format up to @tab ;; Cell #3: format up to eob (while (not (eobp)) (setq start (point)) (setq end (save-excursion (if (search-forward "@tab" nil 'move) ;; Delete the @tab command, including the @-sign (delete-region (point) (progn (forward-word -1) (1- (point))))) (point))) ;; Set fill-column *wider* than needed to produce inter-column space (setq fill-column (+ 1 texinfo-extra-inter-column-width (nth table-column table-widths))) (narrow-to-region start end) ;; Remove whitespace before and after entry. (skip-chars-forward " ") (delete-region (point) (save-excursion (beginning-of-line) (point))) (goto-char (point-max)) (skip-chars-backward " ") (delete-region (point) (save-excursion (end-of-line) (point))) ;; Temorarily set texinfo-stack to nil so texinfo-format-scan ;; does not see an unterminated @multitable. (let (texinfo-stack) ;; nil (texinfo-format-scan)) (let (fill-prefix) ;; no fill prefix (fill-region (point-min) (point-max))) (setq table-entry-height (max table-entry-height (count-lines (point-min) (point-max)))) ;; 3. Move point to end of bottom line, and pad that line to fill column. (goto-char (point-min)) (forward-line (1- table-entry-height)) (let* ((beg (point)) ;; beginning of line ;; add one more space for inter-column spacing (needed-whitespace (1+ (- fill-column (progn (end-of-line) (current-column)))))) ;; end of existing line (insert (make-string (if (> needed-whitespace 0) needed-whitespace 1) ? ))) ;; now, put formatted cell into a rectangle (set (intern (concat texinfo-multitable-rectangle-name (int-to-string table-column))) (extract-rectangle (point-min) (point))) (delete-region (point-min) (point)) (goto-char (point-max)) (setq table-column (1+ table-column)) (widen)) ;; 4. Add extra lines to rectangles so all are of same height (let ((total-number-of-columns table-column) (column-number 0) here) (while (> table-column 0) (let ((this-rectangle (int-to-string table-column))) (while (< (length this-rectangle) table-entry-height) (setq this-rectangle (append this-rectangle '(""))))) (setq table-column (1- table-column))) ;; 5. Insert formatted rectangles in original buffer (switch-to-buffer original-buffer) (open-line table-entry-height) (while (< column-number total-number-of-columns) (setq here (point)) (insert-rectangle (eval (intern (concat texinfo-multitable-rectangle-name (int-to-string column-number))))) (goto-char here) (end-of-line) (setq column-number (1+ column-number)))) (kill-buffer texinfo-multitable-buffer-name) (setq fill-column existing-fill-column))) (ptexinfmt-defun-if-broken texinfo-format-printindex () (let ((indexelts (symbol-value (cdr (assoc (texinfo-parse-arg-discard) texinfo-indexvar-alist)))) opoint) (insert "\n* Menu:\n\n") (setq opoint (point)) (texinfo-print-index nil indexelts) (if (memq system-type '(vax-vms windows-nt ms-dos)) (texinfo-sort-region opoint (point)) (shell-command-on-region opoint (point) "sort -fd" 1)))) ;; @copying ... @end copying ;; that Emacs 21.4 and lesser and XEmacs don't support. (if (fboundp 'texinfo-copying) nil (defvar texinfo-copying-text "" "Text of the copyright notice and copying permissions.") (defun texinfo-copying () "Copy the copyright notice and copying permissions from the Texinfo file, as indicated by the @copying ... @end copying command; insert the text with the @insertcopying command." (let ((beg (progn (beginning-of-line) (point))) (end (progn (re-search-forward "^@end copying[ \t]*\n") (point)))) (setq texinfo-copying-text (buffer-substring-no-properties (save-excursion (goto-char beg) (forward-line 1) (point)) (save-excursion (goto-char end) (forward-line -1) (point)))) (delete-region beg end))) (defun texinfo-insertcopying () "Insert the copyright notice and copying permissions from the Texinfo file, which are indicated by the @copying ... @end copying command." (insert (concat "\n" texinfo-copying-text))) (defadvice texinfo-format-scan (before expand-@copying-section activate) "Extract @copying and replace @insertcopying with it." (goto-char (point-min)) (when (search-forward "@copying" nil t) (texinfo-copying)) (while (search-forward "@insertcopying" nil t) (delete-region (match-beginning 0) (match-end 0)) (texinfo-insertcopying)))) ;; @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-912c443/utils/rfc2368.el000066400000000000000000000114171262320455600211330ustar00rootroot00000000000000;;; rfc2368.el --- support for rfc2368 ;; Author: Sen Nagata ;; Keywords: mail ;; Copyright (C) 1998, 2000 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. ;;; Commentary: ;; ;; notes: ;; ;; -repeat after me: "the colon is not part of the header name..." ;; -if w3 becomes part of emacs, then it may make sense to have this ;; file depend on w3 -- the maintainer of w3 says merging w/ Emacs ;; is planned! ;; ;; historical note: ;; ;; this is intended as a replacement for mailto.el ;; ;; acknowledgements: ;; ;; the functions that deal w/ unhexifying in this file were basically ;; taken from w3 -- i hope to replace them w/ something else soon OR ;; perhaps if w3 becomes a part of emacs soon, use the functions from w3. ;;; History: ;; ;; 0.3: ;; ;; added the constant rfc2368-version ;; implemented first potential fix for a bug in rfc2368-mailto-regexp ;; implemented first potential fix for a bug in rfc2368-parse-mailto ;; (both bugs reported by Kenichi OKADA) ;; ;; 0.2: ;; ;; started to use checkdoc ;; ;; 0.1: ;; ;; initial implementation ;;; Code: ;; only an approximation? ;; see rfc 1738 (defconst rfc2368-mailto-regexp "^\\(mailto:\\)\\([^?]+\\)*\\(\\?\\(.*\\)\\)*" "Regular expression to match and aid in parsing a mailto url.") ;; describes 'mailto:' (defconst rfc2368-mailto-scheme-index 1 "Describes the 'mailto:' portion of the url.") ;; i'm going to call this part the 'prequery' (defconst rfc2368-mailto-prequery-index 2 "Describes the portion of the url between 'mailto:' and '?'.") ;; i'm going to call this part the 'query' (defconst rfc2368-mailto-query-index 4 "Describes the portion of the url after '?'.") (defun rfc2368-unhexify-string (string) "Unhexify STRING -- e.g. 'hello%20there' -> 'hello there'." (let ((start 0) (buf)) (while (string-match "+\\|%\\(0D%0A\\|\\([0-9a-fA-F][0-9a-fA-F]\\)\\)" string start) (push (substring string start (match-beginning 0)) buf) (push (cond ((match-beginning 2) (vector (string-to-number (match-string 2 string) 16))) ((match-beginning 1) "\n") (t " ")) buf) (setq start (match-end 0))) (apply 'concat (nreverse (cons (substring string start) buf))))) (defun rfc2368-parse-mailto-url (mailto-url) "Parse MAILTO-URL, and return an alist of header-name, header-value pairs. MAILTO-URL should be a RFC 2368 (mailto) compliant url. A cons cell w/ a key of 'Body' is a special case and is considered a header for this purpose. The returned alist is intended for use w/ the `compose-mail' interface. Note: make sure MAILTO-URL has been 'unhtmlized' (e.g. & -> &), before calling this function." (let ((case-fold-search t) prequery query headers-alist) ;; Remove newline (setq mailto-url (with-temp-buffer (insert mailto-url) (goto-char (point-min)) (while (re-search-forward "\n" nil t) (replace-match "")) (buffer-string))) (if (string-match rfc2368-mailto-regexp mailto-url) (progn (setq prequery (match-string rfc2368-mailto-prequery-index mailto-url)) (setq query (match-string rfc2368-mailto-query-index mailto-url)) ;; build alist of header name-value pairs (if (not (null query)) (setq headers-alist (mapcar (lambda (x) (let* ((temp-list (split-string x "=")) (header-name (car temp-list)) (header-value (cadr temp-list))) ;; return ("Header-Name" . "header-value") (cons (capitalize (rfc2368-unhexify-string header-name)) (rfc2368-unhexify-string header-value)))) (split-string query "&")))) ;; deal w/ multiple 'To' recipients (if prequery (progn (setq prequery (rfc2368-unhexify-string prequery)) (if (assoc "To" headers-alist) (let* ((our-cons-cell (assoc "To" headers-alist)) (our-cdr (cdr our-cons-cell))) (setcdr our-cons-cell (concat prequery ", " our-cdr))) (setq headers-alist (cons (cons "To" prequery) headers-alist))))) headers-alist) (error "Failed to match a mailto: url")) )) (provide 'rfc2368) ;;; rfc2368.el ends here wanderlust-wanderlust-912c443/utils/ssl.el000066400000000000000000000164061262320455600206420ustar00rootroot00000000000000;;; ssl.el,v --- ssl functions for emacsen without them builtin ;; 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. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (eval-when-compile (require 'cl)) (require 'base64) (eval-and-compile (condition-case () (require 'custom) (error nil)) (if (and (featurep 'custom) (fboundp 'custom-declare-variable)) nil ;; We've got what we needed ;; We have the old custom-library, hack around it! (defmacro defgroup (&rest args) nil) (defmacro defcustom (var value doc &rest args) `(devar ,var ,value ,doc)))) (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 'port 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)) (save-excursion (set-buffer (get-buffer-create " *openssl*")) (erase-buffer) (insert certificate) (setq exit-code (condition-case () (call-process-region (point-min) (point-max) ssl-program-name t (list (current-buffer) nil) t "x509" "-subject" ; Print the subject DN "-issuer" ; Print the issuer DN "-dates" ; Both before and after dates "-serial" ; print out serial number "-noout" ; Don't spit out the certificate ) (error -1))) (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)) (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 (int-to-string service))) (let* ((process-connection-type nil) (port service) (proc (eval `(start-process name buffer ssl-program-name ,@ssl-program-arguments)))) (process-kill-without-query proc) proc)) (provide 'ssl) wanderlust-wanderlust-912c443/utils/wl-addrbook.el000066400000000000000000000500371262320455600222440ustar00rootroot00000000000000;; wl-addrbook.el --- Aliases and personal information ;; 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-in-string addr " " "_")) (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 (wl-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 wl-cs-autoconv) (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 (wl-match-buffer 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 (save-match-data (elmo-replace-in-string var (char-to-string 0) " ")))) (defun wl-addrbook-make-alist () (let (alias colon addrs nick name alist) (wl-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 (wl-match-buffer 1))) (setq colon (wl-match-buffer 2)) (setq addrs (wl-addrbook-strsafe (wl-match-buffer 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 (wl-match-buffer 1))) (setq name (wl-addrbook-strsafe (wl-match-buffer 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))) (wl-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) from 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 (wl-match-string 1 address)) (setq name (elmo-replace-in-string name "[ \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-912c443/utils/wl-complete.el000066400000000000000000000304161262320455600222660ustar00rootroot00000000000000;;; wl-complete.el --- Completion magic for Wanderlust ;; 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 "\\([^:]*:\\)") (wl-string-match-assoc (wl-match-buffer 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 ;;; (defun-maybe characterp (form) (numberp form)) (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-912c443/utils/wl-mailto.el000066400000000000000000000067731262320455600217540ustar00rootroot00000000000000;;; wl-mailto.el -- some mailto support for wanderlust ;;; 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 (assoc-ignore-case "to" other-headers))) (subject (cdr (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-912c443/wanderlust-pkg.el000066400000000000000000000001511262320455600216360ustar00rootroot00000000000000(define-package "wanderlust" "2.15.9" "Yet Another Message Interface on Emacsen" '((semi "1.14.7"))) wanderlust-wanderlust-912c443/wl/000077500000000000000000000000001262320455600167725ustar00rootroot00000000000000wanderlust-wanderlust-912c443/wl/.cvsignore000066400000000000000000000000131262320455600207640ustar00rootroot00000000000000wl-news.el wanderlust-wanderlust-912c443/wl/ChangeLog000066400000000000000000014635611262320455600205640ustar00rootroot000000000000002015-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,Ai(Br,At(Bme 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-912c443/wl/wl-acap.el000066400000000000000000000273151262320455600206500ustar00rootroot00000000000000;;; wl-acap.el --- ACAP support for Wanderlust. ;; 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 'custom) (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 folder-top 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 (interactive-p) (message "Store completed.")))) (require 'product) (product-provide (provide 'wl-acap) (require 'wl-version)) ;;; wl-acap.el ends here wanderlust-wanderlust-912c443/wl/wl-action.el000066400000000000000000001003631262320455600212140ustar00rootroot00000000000000;;; wl-action.el --- Mark and actions in the Summary mode for Wanderlust. ;; 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) (eval-when-compile (defalias-maybe 'wl-summary-target-mark 'ignore) (defalias-maybe 'wl-summary-target-mark-region 'ignore)) (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 mark 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) (when wl-summary-highlight (wl-highlight-summary-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)) (when wl-summary-highlight (wl-highlight-summary-current-line)) (when (wl-summary-action-argument-function action) (wl-summary-remove-argument))) (set-buffer-modified-p nil)))) ;;; Move the cursor. ;;; (if (or interactive (interactive-p)) ;;; (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)) (refile-failures 0) dst-msgs ; loop counter 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 cur-mark 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 (interactive-p) 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)) (pos (point)) (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)) (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)) (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 (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))) (let (number) (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 (elmo-string (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 c) (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 (interactive-p) (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) (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 (interactive-p)))) (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)))))) (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-char-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-912c443/wl/wl-address.el000066400000000000000000000624061262320455600213710ustar00rootroot00000000000000;;; wl-address.el --- Tiny address management for Wanderlust. ;; 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) (eval-when-compile (require 'cl)) (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 (wl-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))))) (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) (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 (wl-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) (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 () (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 (wl-string-delete-match expn-str 0)) (if (string-match "^[ \t,]+" expn-str) (setq expn-str (wl-string-delete-match expn-str 0))) (if (string-match "[ \t,]+$" expn) (setq expn (wl-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 (wl-match-buffer 1) expn (wl-match-buffer 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 wl-cs-autoconv)) (insert-file-contents path) (goto-char (point-min)) (while (not (eobp)) (if (looking-at "\ ^\\([^#\n][^ \t\n]+\\)[ \t]+\\(\".*\"\\)[ \t]+\\(\".*\"\\)[ \t]*.*$") (setq ret (cons (list (wl-match-buffer 1) (read (wl-match-buffer 2)) (read (wl-match-buffer 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 <> (wl-match-string 1 str)) ((string-match "\\([^ \t\n]*@[^ \t\n]*\\)" str) (wl-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) (wl-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'." (let ((output-coding-system (mime-charset-to-coding-system wl-mime-charset))) (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 addr-changed) (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 (let ((output-coding-system (mime-charset-to-coding-system wl-mime-charset))) (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) (not (eq (char-after (1- (point-max))) ?\n))) (insert "\n"))) ;; override (while (re-search-forward (concat "^[ \t]*" address) 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-912c443/wl/wl-addrmgr.el000066400000000000000000000513761262320455600213700ustar00rootroot00000000000000;;; wl-addrmgr.el --- Address manager for Wanderlust. ;; 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) (eval-when-compile (require 'cl)) ;; 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 element for sort." :type '(choice '(address realname petname none)) :group 'wl-addrmgr) (defcustom wl-addrmgr-default-sort-order 'ascending "Default element for sort." :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) (when (boundp 'bidi-paragraph-direction) (set '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))) (wl-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 entiry 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) "")))) (wl-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 entiry." (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 addresses 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 (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 beg real pet addr) (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) (unless (one-window-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'." (wl-string (car entry))))) (defun wl-addrmgr-delete () "Delete address entry." (interactive) (let ((addr (wl-string (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 (wl-string (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'." (wl-string (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 (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 (wl-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 (wl-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 (wl-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. beg) (std11-narrow-to-header mail-header-separator) (goto-char (point-min)) (while (re-search-forward (concat "^" (regexp-quote field) ":") 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-912c443/wl/wl-batch.el000066400000000000000000000040201262320455600210110ustar00rootroot00000000000000;;; wl-batch.el --- batch functions for Wanderlust. ;; 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-912c443/wl/wl-demo.el000066400000000000000000000351341262320455600206660ustar00rootroot00000000000000;;; wl-demo.el --- Opening demo on Wanderlust ;; 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.") (eval-when-compile (require 'cl)) (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.") (eval-and-compile (when wl-on-emacs21 ;; `display-images-p' has not been available in Emacs versions ;; prior to Emacs 21.0.105. (defalias-maybe 'display-images-p 'display-graphic-p))) ;; Avoid byte compile warnings. (eval-when-compile (autoload 'bitmap-insert-xbm-file "bitmap" nil t) (autoload 'create-image "image") (autoload 'device-on-window-system-p "device") (autoload 'image-type-available-p "image") (autoload 'insert-image "image") (autoload 'make-glyph "glyphs") (autoload 'set-glyph-face "glyphs") (autoload 'set-specifier "specifier") (defalias-maybe 'face-background-name 'ignore) (defalias-maybe 'frame-char-height 'ignore) (defalias-maybe 'frame-char-width 'ignore) (defalias-maybe 'glyph-height 'ignore) (defalias-maybe 'glyph-width 'ignore) (defalias-maybe 'image-size 'ignore) (defalias-maybe 'make-extent 'ignore) (defalias-maybe 'propertize 'ignore) (defalias-maybe 'set-extent-end-glyph 'ignore) (defalias-maybe 'window-pixel-height 'ignore) (defalias-maybe 'window-pixel-width 'ignore)) (defvar wl-demo-bitmap-mule-available-p 'unknown "Internal variable to say whether the BITMAP-MULE package is available.") (defun wl-demo-image-type-alist () "Return an alist of available logo image types on the current frame." (if (or (and (featurep 'xemacs) (device-on-window-system-p)) window-system) (let ((xpm (when (or (and (featurep 'xemacs) (featurep 'xpm)) (and wl-on-emacs21 (display-images-p) (image-type-available-p 'xpm))) '("xpm" . xpm))) (xbm (when (or (featurep 'xemacs) (and wl-on-emacs21 (display-images-p) (image-type-available-p 'xbm)) (eq t wl-demo-bitmap-mule-available-p) (and (eq 'unknown wl-demo-bitmap-mule-available-p) (module-installed-p 'bitmap) (setq wl-demo-bitmap-mule-available-p t))) '("xbm" . xbm))) (bitmap (when (and (not (featurep 'xemacs)) (or (eq t wl-demo-bitmap-mule-available-p) (and (eq 'unknown wl-demo-bitmap-mule-available-p) (module-installed-p 'bitmap) (setq wl-demo-bitmap-mule-available-p t)))) '("bitmap" . bitmap)))) (if (and wl-on-emacs21 (image-type-available-p 'xbm)) ;; Prefer xbm rather than bitmap on Emacs 21. (delq nil (list xpm xbm bitmap '("ascii"))) (delq nil (list xpm bitmap 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 (image-type) "Insert a logo image at the point and position it to be centered. IMAGE-TYPE 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 image-type) (concat (wl-demo-icon-name) ".xpm")) ((eq 'bitmap image-type) (concat (wl-demo-icon-name) ".img")) ((eq 'xbm image-type) (concat (wl-demo-icon-name) ".xbm")))) image width height) (when (featurep 'xemacs) (when (boundp 'default-gutter-visible-p) (set-specifier (symbol-value 'default-gutter-visible-p) nil (current-buffer))) (when (featurep 'scrollbar) (set-specifier (symbol-value 'scrollbar-height) 0 (current-buffer)) (set-specifier (symbol-value 'scrollbar-width) 0 (current-buffer)))) (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)) (progn (cond ((featurep 'xemacs) (setq width (window-pixel-width) height (window-pixel-height) image (make-glyph (if (eq image-type 'xbm) (vector image-type ':file file) (vector image-type ':data (wl-demo-image-filter file image-type))))) (when (eq 'xbm image-type) (set-glyph-face image 'wl-highlight-logo-face)) (insert-char (string-to-char " ") (max 0 (/ (+ (* (- width (glyph-width image)) (window-width)) width) (* 2 width)))) (set-extent-end-glyph (make-extent (point) (point)) image) (insert "\n") (/ (+ (* 2 (glyph-height image) (window-height)) height) (* 2 height))) ((and wl-on-emacs21 (or (eq 'xpm image-type) (and (eq 'xbm image-type) (image-type-available-p 'xbm)))) ;; Use the new redisplay engine on Emacs 21. (setq image (create-image (wl-demo-image-filter file image-type) image-type t) width (image-size image) height (cdr width) width (car width)) (when (eq 'xbm image-type) (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)) ((eq 'bitmap image-type) ;; Use ready-composed bitmap image. (require 'bitmap) (let ((coding-system-for-read 'iso-2022-7bit) (input-coding-system '*iso-2022-jp*)) (insert-file-contents file)) (goto-char (point-max)) (unless (bolp) (insert "\n")) ;; Emacs 21.x may fail on computing the end of the ;; column if there're bitmap characters. ;;; (setq width 0) ;;; (while (progn ;;; (end-of-line 0) ;;; (not (bobp))) ;;; (setq width (max width (current-column)))) (setq width 1024) (while (progn (end-of-line 0) (not (bobp))) (setq width (min width (current-column)))) ;; Emacs 21.1 would fail to decode composite chars ;; if it has been built without fixing coding.c. (when (and wl-on-emacs21 (>= width 80)) (erase-buffer) (let ((coding-system-for-read 'raw-text)) (insert-file-contents file)) (goto-char (point-max)) (unless (bolp) (insert "\n")) (setq width 0) (while (progn (end-of-line 0) (not (bobp))) ;; Decode bitmap data line by line. (decode-coding-region (line-beginning-position) (point) 'iso-2022-7bit) (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)))) ((eq 'xbm image-type) (message "Composing a bitmap image...") (require 'bitmap) (bitmap-insert-xbm-file file) (backward-char) (indent-rigidly (point-min) (point-max) (max 0 (/ (1+ (- (window-width) (current-column))) 2))) (put-text-property (point-min) (point-max) 'fixed-width t) (message "Composing a bitmap image...done") (count-lines (point-min) (goto-char (point-max)))))) (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." (cond (wl-on-emacs21 ;; 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)))) ((and (featurep 'xemacs) (face-background-name 'wl-highlight-demo-face)) (set-face-background 'default (face-background-name 'wl-highlight-demo-face) (current-buffer))) (t (goto-char (point-max)) (dotimes (i (- (window-height) (count-lines (point-min) (point)))) (insert ?\n)) (let ((start (text-property-any (point-min) (point-max) 'fixed-width t)) end) (if start (progn (put-text-property (point-min) start 'face 'wl-highlight-demo-face) (setq end (or (text-property-not-all start (point-max) 'fixed-width t) (point-max))) (put-text-property start end 'face 'wl-highlight-logo-face) (put-text-property end (point-max) 'face 'wl-highlight-demo-face)) (put-text-property (point-min) (point-max) 'face 'wl-highlight-demo-face)))))) (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 image-type) "Demo on the startup screen. IMAGE-TYPE 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 image-type (interactive-p)) (setq type (completing-read "Image type: " selection nil t) image-type (when (assoc type selection) (cdr (assoc type selection)))) (if (setq type (assoc (format "%s" (or image-type wl-demo-display-logo)) selection)) (setq image-type (cdr type)) (setq image-type (when wl-demo-display-logo (cdr (car selection))))))) (let ((buffer (let ((default-enable-multibyte-characters t) (default-mc-flag t) (default-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 image-type)) (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)) ;; Prune functions provided temporarily to avoid compile warnings. (eval-when-compile (dolist (fn '(face-background-name frame-char-height frame-char-width glyph-height glyph-width image-size make-extent propertize set-extent-end-glyph window-pixel-height window-pixel-width)) (when (and (get fn 'defalias-maybe) (eq (symbol-function fn) 'ignore)) (put fn 'defalias-maybe nil) (fmakunbound fn)))) (require 'product) (product-provide (provide 'wl-demo) (require 'wl-version)) ;;; wl-demo.el ends here wanderlust-wanderlust-912c443/wl/wl-dnd.el000066400000000000000000000065021262320455600205040ustar00rootroot00000000000000;;; wl-dnd.el --- dragdrop support on Wanderlust. ;; 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: ;; (eval-when-compile (require 'static)) (static-cond ((featurep 'offix) (defun start-drag (event what &optional typ) (if (numberp typ) (funcall (intern "offix-start-drag") event what typ) (funcall (intern "offix-start-drag") event what)))) ((featurep 'cde) (defun start-drag (event what &optional typ) (if (not typ) (funcall (intern "cde-start-drag-internal") event nil (list what)) (funcall (intern "cde-start-drag-internal") event t what)))) (t (defun start-drag (event what &optional typ)))) (defun wl-dnd-start-drag (event) (interactive "@e") (mouse-set-point event) (start-drag event (concat wl-summary-buffer-folder-name " " (number-to-string (wl-summary-message-number))))) (defun wl-dnd-drop-func (event object text) (interactive "@e") (mouse-set-point event) (beginning-of-line) (when (looking-at "^[ ]*\\([^\\[].+\\):.*\n") (let* ((src-spec (save-match-data (split-string (nth 2 (car (cdr object))) " "))) (src-fld (nth 0 src-spec)) (number (string-to-number (nth 1 src-spec))) target) (setq target (wl-folder-get-folder-name-by-id (get-text-property (point) 'wl-folder-entity-id))) (message "%s is dropped at %s." number (buffer-substring (match-beginning 1) (match-end 1))) (set-buffer (wl-summary-get-buffer src-fld)) (save-match-data (wl-summary-jump-to-msg number)) (funcall (symbol-function 'wl-summary-refile) number target) (select-window (get-buffer-window (current-buffer))) )) t) (defun wl-dnd-default-drop-message (event object) (message "Dropping here is meaningless.") t) (defun wl-dnd-set-drop-target (beg end) (let (ext substr) (setq ext (make-extent beg end)) (set-extent-property ext 'experimental-dragdrop-drop-functions '((wl-dnd-drop-func t t (buffer-substring beg end)))))) ;;; (set-extent-property ext 'mouse-face 'highlight) (defun wl-dnd-set-drag-starter (beg end) (let (ext kmap) (setq ext (make-extent beg end)) ;;; (set-extent-property ext 'mouse-face 'isearch) (setq kmap (make-keymap)) (define-key kmap [button1] 'wl-dnd-start-drag) (set-extent-property ext 'keymap kmap))) (require 'product) (product-provide (provide 'wl-dnd) (require 'wl-version)) ;;; wl-dnd.el ends here wanderlust-wanderlust-912c443/wl/wl-draft.el000066400000000000000000002752741262320455600210550ustar00rootroot00000000000000;;; wl-draft.el --- Message draft mode for Wanderlust. ;; 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) (require 'elmo-net) (require 'sendmail) (require 'wl-template) (require 'emu) (require 'timezone nil t) (require 'std11) (require 'eword-encode) (require 'wl-util) (require 'wl-vars) (defvar x-face-add-x-face-version-header) (defvar mail-reply-buffer) (defvar mail-from-style) (eval-when-compile (require 'cl) (require 'static) (require 'elmo-pop3) (defalias-maybe 'x-face-insert 'ignore) (defalias-maybe 'x-face-insert-version-header 'ignore) (defalias-maybe 'wl-init 'ignore) (defalias-maybe 'wl-draft-mode 'ignore)) (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.") (defsubst wl-smtp-password-key (user mechanism server) (format "SMTP:%s/%s@%s" user mechanism server)) (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 (eq wl-smtp-connection-type 'starttls)) (smtp-open-connection-function (if (eq wl-smtp-connection-type 'ssl) (let ((stream-type (elmo-get-network-stream-type 'ssl))) (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 (function (lambda (prompt) (elmo-get-passwd (wl-smtp-password-key smtp-sasl-user-name (car smtp-sasl-mechanisms) smtp-server))))) ,@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 err (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 (wl-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 (wl-parse-addresses to) cc (wl-parse-addresses cc)) (with-temp-buffer ; to keep raw buffer unibyte. (set-buffer-multibyte default-enable-multibyte-characters) (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 default-enable-multibyte-characters) (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)) (mail-yank-hooks (run-hooks 'mail-yank-hooks)) (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 ((cur-buf (current-buffer)) (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 body-beg) (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 mail-yank-hooks 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 wl-default-spec 'wl-read-folder-history)) (number (call-interactively (function (lambda (num) (interactive "nNumber: ") num)))) (mail-reply-buffer (get-buffer-create "*wl-draft-insert-get-message*")) mail-citation-hook mail-yank-hooks 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 cite-title) (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 (or (one-window-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") (let ((zrs 'zmacs-region-stays)) (when (and (interactive-p) (boundp zrs)) (set zrs t))) (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"))) (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) addresses address mailbox-list beg seq has-group-list) (goto-char (point-min)) (while (re-search-forward (concat "^" (regexp-quote field) "[\t ]*:") 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) addrs 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)))) ;; ;; 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) (default-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))) (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)))))) (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'." (let ((id (elmo-get-message-id-from-buffer)) (to (std11-field-body "to"))) (run-hooks 'wl-mail-send-pre-hook) (require 'sendmail) (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 (pgg-decrypt-automatically nil)) (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) err) (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))) (if (boundp 'mime-header-encode-method-alist) (symbol-value '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 (wl-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))) (if (boundp 'mime-header-encode-method-alist) (symbol-value '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 ((bufname (read-buffer (format "Kill buffer: (default %s) " (buffer-name)))) 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) beg end) (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))))))) ;;;;;;;;;;;;;;;; ;;;###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 header-alist-internal) (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 (interactive-p) "")) (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 (interactive-p) (run-hooks 'wl-mail-setup-hook)) (goto-char (point-min)) (setq buffer-undo-list nil) (wl-user-agent-compose-internal) ;; user-agent (cond ((and (interactive-p) (string= (cdr (assq 'To header-alist)) "")) (mail-position-on-field "To")) (t (goto-char (point-max)))) buffer)) (defun wl-draft-create-buffer (&optional parent-folder parent-number) (let* ((draft-folder (wl-draft-get-folder)) (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. (set-buffer buffer) ;; switch-buffer according to draft buffer style. (if wl-draft-use-frame (switch-to-buffer-other-frame buffer) (if reply-or-forward (case wl-draft-reply-buffer-style (split (split-window-vertically) (other-window 1) (switch-to-buffer buffer)) (keep (switch-to-buffer buffer)) (full (delete-other-windows) (switch-to-buffer buffer)) (t (if (functionp wl-draft-reply-buffer-style) (funcall wl-draft-reply-buffer-style buffer) (error "Invalid value for wl-draft-reply-buffer-style")))) (case wl-draft-buffer-style (split (when (eq major-mode 'wl-summary-mode) (wl-summary-toggle-disp-msg 'off)) (split-window-vertically) (other-window 1) (switch-to-buffer buffer)) (keep (switch-to-buffer buffer)) (full (delete-other-windows) (switch-to-buffer buffer)) (t (if (functionp wl-draft-buffer-style) (funcall wl-draft-buffer-style buffer) (error "Invalid value for wl-draft-buffer-style")))))) (auto-save-mode -1) (let (change-major-mode-hook) (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) (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")) (let (change-major-mode-hook) (wl-draft-editor-mode) (static-when (boundp 'auto-save-file-name-transforms) (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 (add-hook 'local-write-file-hooks 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 (wl-parse-addresses (std11-field-body "To")) (wl-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 (function (lambda () (wl-draft-trim-ccs (or wl-bcc (and mail-self-blind (user-login-name))))))) (cons 'Fcc (function (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) (num 0) buffer change-major-mode-hook 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) (static-when (boundp 'auto-save-file-name-transforms) (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 (add-hook 'local-write-file-hooks 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 wl-cs-autoconv) (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)) (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 (interactive-p) 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 (wl-sent-message-via) (if wl-draft-verbose-send (message "Queuing...")) (let ((send-buffer (current-buffer)) (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 wl-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 msgid 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 draft if exists." (interactive "P") (if arg (wl-jump-to-draft-folder) (let ((draft-bufs (wl-collect-draft)) buf) (cond ((null draft-bufs) (message "No draft buffer exist.")) (t (setq draft-bufs (sort (mapcar 'buffer-name draft-bufs) (function (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))) (switch-to-buffer 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) (static-when (featurep 'xemacs) ;; Cope with one of many XEmacs bugs that `recenter' takes ;; a long time if there are a lot of invisible text lines. (redraw-frame)) (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 prev 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)) (setq prev (match-string 1)) (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 (wl-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 (wl-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 (wl-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)))) ;; 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) (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 (interactive-p) (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-912c443/wl/wl-e21.el000066400000000000000000000620661262320455600203350ustar00rootroot00000000000000;;; wl-e21.el --- Wanderlust modules for Emacs 21. ;; 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) (eval-when-compile (require 'wl-folder) (require 'wl-summary) (require 'wl-draft) (require 'wl-message) (require 'wl-highlight) (defvar-maybe wl-draft-mode-map (make-sparse-keymap))) (add-hook 'wl-folder-mode-hook 'wl-setup-folder) (add-hook 'wl-folder-mode-hook 'wl-folder-init-icons) (add-hook 'wl-init-hook 'wl-biff-init-icons) (add-hook 'wl-init-hook 'wl-plugged-init-icons) (add-hook 'wl-summary-mode-hook 'wl-setup-summary) (add-hook 'wl-message-display-internal-hook 'wl-setup-message) (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) (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.") (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.") (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.") ;; for draft toolbar. (defalias 'wl-draft-insert-signature (if (and (boundp 'mime-setup-use-signature) 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 (defmacro wl-e21-display-image-p () '(and wl-highlight-folder-with-icon (image-type-available-p 'xpm)))) (eval-and-compile (if (boundp 'image-load-path) (defun wl-e21-find-image (specs) (let ((image-load-path (cons 'wl-icon-directory image-load-path))) (find-image specs))) (defun wl-e21-find-image (specs) (let ((load-path (cons wl-icon-directory 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-e21-setup-folder-toolbar () (when (wl-e21-setup-toolbar wl-folder-toolbar) (wl-e21-make-toolbar-buttons wl-folder-mode-map wl-folder-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))) (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-e21-setup-message-toolbar () (when (wl-e21-setup-toolbar wl-message-toolbar) (wl-e21-make-toolbar-buttons (current-local-map) wl-message-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-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))) (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))) (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))))))) (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))))) (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))))) (defun wl-make-date-string (&optional time) (let ((system-time-locale "C")) (format-time-string "%a, %d %b %Y %T %z" time))) (defalias 'wl-setup-folder 'wl-e21-setup-folder-toolbar) (defalias 'wl-setup-summary 'wl-e21-setup-summary-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) ;; Meadow2 (define-key keymap [mouse-wheel1] 'wl-message-wheel-dispatcher) (define-key keymap [S-mouse-wheel1] 'wl-message-wheel-dispatcher) (set-keymap-parent wl-message-button-map keymap) (define-key wl-message-button-map [mouse-2] 'wl-message-button-dispatcher) keymap)) (defalias 'wl-setup-message 'wl-e21-setup-message-toolbar) ;; Wheel handling for Meadow2 (defun wl-message-wheel-dispatcher (event) (interactive "e") (if (< (nth 4 (nth 1 event)) 0) (wl-message-wheel-up event) (wl-message-wheel-down event))) (defun wl-summary-wheel-dispatcher (event) (interactive "e") (if (< (nth 4 (nth 1 event)) 0) (if (memq 'shift (event-modifiers event)) (wl-summary-down) (wl-summary-next)) (if (memq 'shift (event-modifiers event)) (wl-summary-up) (wl-summary-prev)))) (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)))))) (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)) (defalias 'wl-defface 'defface) (defun wl-read-event-char (&optional prompt) "Get the next event." (let ((event (read-event prompt))) (cons (and (numberp event) event) event))) (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-912c443/wl/wl-expire.el000066400000000000000000000675661262320455600212540ustar00rootroot00000000000000;;; wl-expire.el --- Message expire modules for Wanderlust. ;; 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)))) (defsubst wl-expire-make-sortable-date (date) (timezone-make-sortable-date (aref date 0) (aref date 1) (aref date 2) (timezone-make-time-string (aref date 3) (aref date 4) (aref date 5)))) ;; 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 (wl-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." (let* ((elmo-archive-treat-file t) ;; treat archive folder as a file. (dst-folder-expand (and dst-folder-arg (wl-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 (wl-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 date 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 (wl-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-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 date 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 (interactive-p) (error "No match %s in `wl-expire-alist'" folder-name)) (when (or (not (interactive-p)) (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 (interactive-p) (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 (elmo-time< (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 wl-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 (wl-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) (wl-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 (interactive-p)) (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 (interactive-p)) (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))) (alist wl-archive-alist) 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 (interactive-p) (message "No match %s in wl-archive-alist" (elmo-folder-name-internal folder))) nil)) (or (not (interactive-p)) (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 (interactive-p) (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-912c443/wl/wl-fldmgr.el000066400000000000000000001260021262320455600212100ustar00rootroot00000000000000;;; wl-fldmgr.el --- Folder manager for Wanderlust. ;; 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) (elmo-string 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 (elmo-string key) 'access nil))) (wl-append unsubscribes (list (elmo-string 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 (wl-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 (wl-string-assoc (car (car new2)) unsubscribes) unsubscribes)) (setq unsubscribes (delete (elmo-string (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) folder-path group-type previous-entity 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= (wl-match-buffer 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 (wl-match-buffer 1))) (while (< (point) to) (and (looking-at "^\\([ ]*\\)") (setq indent (wl-match-buffer 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 (wl-match-buffer 1)) (setq opened (wl-match-buffer 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 (wl-match-buffer 1))) (while (< (point) to) (and (looking-at "^\\([ ]*\\)") (setq indent (wl-match-buffer 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 (elmo-string 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)) tmp indent path count new access 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)) ((wl-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 (elmo-string (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 (wl-match-buffer 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 (wl-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 (wl-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 (wl-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 (wl-match-buffer 1)) (setq opened (wl-match-buffer 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 (wl-match-buffer 1) 'access nil)) (if (wl-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 (wl-match-buffer 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 (wl-match-buffer 1)) (setq opened (wl-match-buffer 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 (wl-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 (wl-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 (wl-match-buffer 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 (wl-match-buffer 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 (wl-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 (wl-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)) (let ((output-coding-system (mime-charset-to-coding-system wl-mime-charset))) (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-912c443/wl/wl-folder.el000066400000000000000000003061531262320455600212170ustar00rootroot00000000000000;;; wl-folder.el --- Folder mode for Wanderlust. ;; 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 'wl-vars) (require 'easymenu nil t) ; needed here. (eval-when-compile (require 'cl) (require 'wl-util) (provide 'wl-folder) (require 'wl) (require 'elmo-nntp)) (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-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] )) (if wl-on-xemacs (defun wl-folder-setup-mouse () (define-key wl-folder-mode-map 'button2 'wl-folder-click) (define-key wl-folder-mode-map 'button4 'wl-folder-prev-entity) (define-key wl-folder-mode-map 'button5 'wl-folder-next-entity) (define-key wl-folder-mode-map [(shift button4)] 'wl-folder-prev-unread) (define-key wl-folder-mode-map [(shift button5)] 'wl-folder-next-unread)) (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 "\M-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))) (defmacro 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 (elmo-string ,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))) (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 (elmo-string 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) emptied) (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))))))) (defun wl-folder-maybe-load-folder-list (entity) (when (null (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) (wl-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 err) (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 (wl-match-buffer 1)) (setq opened (wl-match-buffer 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)) ;(condition-case errobj (progn (if (or (wl-folder-force-fetch-p (car entity)) (and (eq 'access (cadr entity)) (null (caddr entity)))) (wl-folder-update-newest indent entity) (wl-folder-insert-entity indent entity)) (wl-highlight-folder-path wl-folder-buffer-cur-path)) ;;; (quit ;;; (setq err t) ;;; (setcdr (assoc fld-name wl-folder-group-alist) nil)) ;;; (error ;;; (elmo-display-error errobj t) ;;; (ding) ;;; (setq err t) ;;; (setcdr (assoc fld-name wl-folder-group-alist) nil))) (if (not err) (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)) error-selecting) (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= (wl-match-buffer 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 (wl-match-buffer 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-hooks 'wl-folder-check-entity-pre-hook) (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) new unread all) (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-hooks 'wl-folder-check-entity-hook) 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 (wl-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) name 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)) summary-buf) (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 (wl-match-buffer 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 (wl-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 (wl-match-buffer 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 (elmo-match-buffer 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 (elmo-match-buffer 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)) (setq ret-val (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 (interactive-p) (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) (when (boundp 'bidi-paragraph-direction) (set 'bidi-paragraph-direction 'left-to-right)) (wl-mode-line-buffer-identification) (easy-menu-add wl-folder-mode-menu) ;; 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 (wl-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 (elmo-string (car x)) 'access)) (t (elmo-string x)))) list)) (defun wl-folder-update-newest (indent entity) (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 ) (setq beg (point)) (if as-opened (let (update-flist flist-unsub new-flist removed group-name-end) (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)) (wl-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)) (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))) (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 (update-flist flist-unsub new-flist 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 (elmo-string 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 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) (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 (wl-string-rassoc petname wl-folder-petname-alist)) petname)) (defun wl-folder-get-petname (name) (or (cdr (wl-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 (wl-match-buffer 2))) (setq cur-unread (string-to-number (wl-match-buffer 3))) (setq cur-all (string-to-number (wl-match-buffer 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 error-selecting) ;;; (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 (elmo-string 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 err) (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= "+" (wl-match-buffer 2)));; closed group (save-excursion (setq indent (wl-match-buffer 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) (len (length wl-folder-group-alist)) (i 0) 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 (wl-match-buffer 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) (wl-match-buffer 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 (elmo-string (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 (wl-string-assoc group wl-folder-group-alist) wl-folder-group-alist)) (wl-append removes (list (list group)))))) (t ;; folder (setq folder (elmo-string (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 (wl-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) (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 summary-buf 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)))) (defun wl-folder-mimic-kill-buffer () "Kill the current (Folder) buffer with query." (interactive) (let ((bufname (read-buffer (format "Kill buffer: (default %s) " (buffer-name)))) 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)))))) (require 'product) (product-provide (provide 'wl-folder) (require 'wl-version)) ;;; wl-folder.el ends here wanderlust-wanderlust-912c443/wl/wl-highlight.el000066400000000000000000001146741262320455600217200ustar00rootroot00000000000000;;; wl-highlight.el --- Hilight modules for Wanderlust. ;; 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) (if (and (featurep 'xemacs) (featurep 'dragdrop)) (require 'wl-dnd)) (require 'wl-vars) (provide 'wl-highlight) ; circular dependency (eval-when-compile (cond (wl-on-xemacs (require 'wl-xmas)) (wl-on-emacs21 (require 'wl-e21)) (t (require 'wl-mule))) (defun-maybe wl-dnd-set-drop-target (a b)) (defun-maybe wl-dnd-set-drag-starter (a b))) (put 'wl-defface 'lisp-indent-function 'defun) (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 (wl-defface wl-highlight-message-headers '( (((type tty) (background dark)) (:foreground "cyan")) (((class color) (background dark)) (:foreground "gray" :bold t)) (((class color) (background light)) (:foreground "gray50" :bold t))) "Face used for displaying header names." :group 'wl-message-faces :group 'wl-faces) (wl-defface wl-highlight-message-header-contents '( (((type tty) (background dark)) (:foreground "green")) (((class color) (background dark)) (:foreground "LightSkyBlue" :bold t)) (((class color) (background light)) (:foreground "purple" :bold t))) "Face used for displaying header content." :group 'wl-message-faces :group 'wl-faces) (wl-defface wl-highlight-message-important-header-contents '( (((type tty) (background dark)) (:foreground "yellow")) (((class color) (background dark)) (:foreground "yellow" :bold t)) (((class color) (background light)) (:foreground "brown" :bold t))) "Face used for displaying contents of special headers." :group 'wl-message-faces :group 'wl-faces) (wl-defface wl-highlight-message-important-header-contents2 '( (((type tty) (background dark)) (:foreground "red")) (((class color) (background dark)) (:foreground "orange" :bold t)) (((class color) (background light)) (:foreground "DarkSlateBlue" :bold t))) "Face used for displaying contents of special headers." :group 'wl-message-faces :group 'wl-faces) (wl-defface wl-highlight-message-citation-header '( (((type tty) (background dark)) (:foreground "cyan")) (((class color) (background dark)) (:foreground "SkyBlue")) (((class color) (background light)) (:foreground "DarkGreen"))) "Face used for displaying header of quoted texts." :group 'wl-message-faces :group 'wl-faces) (wl-defface wl-highlight-message-unimportant-header-contents '( (((type tty) (background dark)) (:foreground "green")) (((class color) (background dark)) (:foreground "GreenYellow" :bold t)) (((class color) (background light)) (:foreground "DarkGreen" :bold t))) "Face used for displaying contents of unimportant headers." :group 'wl-message-faces :group 'wl-faces) (wl-defface wl-highlight-message-signature '((((class color) (background dark)) (:foreground "khaki")) (((class color) (background light)) (:foreground "DarkSlateBlue"))) "Face used for displaying signature." :group 'wl-message-faces :group 'wl-faces) ;; for draft (wl-defface wl-highlight-header-separator-face '( (((type tty) (background dark)) (:foreground "black" :background "yellow")) (((class color)) (:foreground "Black" :background "DarkKhaki"))) "Face used for displaying header separator." :group 'wl-draft :group 'wl-faces) ;; important messages (wl-defface wl-highlight-summary-flagged-face '((((type tty) (background dark)) (:foreground "magenta")) (((class color) (background dark)) (:foreground "orange")) (((class color) (background light)) (:foreground "purple"))) "Face used for displaying flagged messages." :group 'wl-summary-faces :group 'wl-faces) (wl-defface wl-highlight-summary-new-face '( (((type tty) (background dark)) (:foreground "red")) (((class color) (background dark)) (:foreground "tomato")) (((class color) (background light)) (:foreground "tomato"))) "Face used for displaying new messages." :group 'wl-summary-faces :group 'wl-faces) (wl-defface wl-highlight-summary-killed-face '((((type tty) (background dark)) (:foreground "blue")) (((class color) (background dark)) (:foreground "gray")) (((class color)) (:foreground "LightSlateGray"))) "Face used for displaying killed messages." :group 'wl-summary-faces :group 'wl-faces) (wl-defface wl-highlight-summary-displaying-face '((t (:underline t :bold t))) "Face used for displaying message." :group 'wl-summary-faces :group 'wl-faces) (wl-defface wl-highlight-thread-indent-face '((t (:foreground "gray40"))) "Face used for displaying indented thread." :group 'wl-summary-faces :group 'wl-faces) ;; unimportant messages (wl-defface wl-highlight-summary-unread-face '( (((type tty) (background dark)) (:foreground "cyan")) (((class color) (background dark)) (:foreground "LightSkyBlue")) (((class color) (background light)) (:foreground "RoyalBlue"))) "Face used for displaying unread messages." :group 'wl-summary-faces :group 'wl-faces) (wl-defface wl-highlight-summary-disposed-face '( (((type tty) (background dark)) (:foreground "blue")) (((class color) (background dark)) (:foreground "gray")) (((class color) (background light)) (:foreground "DarkKhaki"))) "Face used for displaying messages mark as disposed." :group 'wl-summary-faces :group 'wl-faces) (wl-defface wl-highlight-summary-deleted-face '( (((type tty) (background dark)) (:foreground "blue")) (((class color) (background dark)) (:foreground "SteelBlue")) (((class color) (background light)) (:foreground "RoyalBlue4"))) "Face used for displaying messages mark as deleted." :group 'wl-summary-faces :group 'wl-faces) (wl-defface wl-highlight-summary-prefetch-face '( (((type tty) (background dark)) (:foreground "Green")) (((class color) (background dark)) (:foreground "DeepSkyBlue")) (((class color) (background light)) (:foreground "brown"))) "Face used for displaying messages mark as deleted." :group 'wl-summary-faces :group 'wl-faces) (wl-defface wl-highlight-summary-resend-face '( (((type tty) (background dark)) (:foreground "Yellow")) (((class color) (background dark)) (:foreground "orange3")) (((class color) (background light)) (:foreground "orange3"))) "Face used for displaying messages mark as resend." :group 'wl-summary-faces :group 'wl-faces) (wl-defface wl-highlight-summary-refiled-face '( (((type tty) (background dark)) (:foreground "blue")) (((class color) (background dark)) (:foreground "blue")) (((class color) (background light)) (:foreground "firebrick"))) "Face used for displaying messages mark as refiled." :group 'wl-summary-faces :group 'wl-faces) (wl-defface wl-highlight-summary-copied-face '( (((type tty) (background dark)) (:foreground "blue")) (((class color) (background dark)) (:foreground "cyan")) (((class color) (background light)) (:foreground "blue"))) "Face used for displaying messages mark as copied." :group 'wl-summary-faces :group 'wl-faces) ;; answered (wl-defface wl-highlight-summary-answered-face '((((type tty) (background dark)) (:foreground "yellow")) (((class color) (background dark)) (:foreground "khaki")) (((class color) (background light)) (:foreground "khaki4"))) "Face used for displaying answered messages." :group 'wl-summary-faces :group 'wl-faces) ;; forwarded (wl-defface wl-highlight-summary-forwarded-face '((((type tty) (background dark)) (:foreground "yellow")) (((class color) (background dark)) (:foreground "DarkOliveGreen2")) (((class color) (background light)) (:foreground "DarkOliveGreen4"))) "Face used for displaying forwarded messages." :group 'wl-summary-faces :group 'wl-faces) (wl-defface wl-summary-persistent-mark-face '((((type tty)) (:foreground "blue")) (((class color) (background dark)) (:foreground "SeaGreen4")) (((class color) (background light)) (:foreground "SeaGreen1"))) "Dafault face used for displaying messages with persistent mark." :group 'wl-summary-faces :group 'wl-faces) ;; obsolete. (wl-defface wl-highlight-summary-temp-face '( (((type tty) (background dark)) (:foreground "gold")) (((class color)) (:foreground "HotPink1"))) "Face used for displaying messages mark as temp." :group 'wl-summary-faces :group 'wl-faces) (wl-defface wl-highlight-summary-target-face '( (((type tty) (background dark)) (:foreground "gold")) (((class color)) (:foreground "HotPink1"))) "Face used for displaying messages mark as target." :group 'wl-summary-faces :group 'wl-faces) (wl-defface wl-highlight-summary-low-read-face '( (((type tty) (background dark)) (:foreground "yellow" :italic t)) (((class color) (background dark)) (:foreground "PaleGreen" :italic t)) (((class color) (background light)) (:foreground "Green3" :italic t))) "Face used for displaying low interest read messages." :group 'wl-summary-faces :group 'wl-faces) (wl-defface wl-highlight-summary-high-read-face '( (((type tty)) (:bold t)) (((class color) (background dark)) (:foreground "PaleGreen" :bold t)) (((class color) (background light)) (:foreground "SeaGreen" :bold t))) "Face used for displaying high interest read messages." :group 'wl-summary-faces :group 'wl-faces) (wl-defface wl-highlight-summary-low-unread-face '( (((type tty) (background dark)) (:foreground "cyan" :italic t)) (((class color) (background dark)) (:foreground "LightSkyBlue" :italic t)) (((class color) (background light)) (:foreground "RoyalBlue" :italic t))) "Face used for displaying low interest unread messages." :group 'wl-summary-faces :group 'wl-faces) (wl-defface wl-highlight-summary-high-unread-face '( (((type tty)) (:foreground "red" :bold t)) (((class color) (background dark)) (:foreground "tomato" :bold t)) (((class color) (background light)) (:foreground "tomato" :bold t))) "Face used for displaying high interest unread messages." :group 'wl-summary-faces :group 'wl-faces) ;; ordinary messages (wl-defface wl-highlight-summary-thread-top-face '( (((type tty) (background dark)) (:foreground "green")) (((class color) (background dark)) (:foreground "GreenYellow")) (((class color) (background light)) (:foreground "green4"))) "Face used for displaying top thread message." :group 'wl-summary-faces :group 'wl-faces) (wl-defface wl-highlight-summary-normal-face '( (((type tty) (background dark)) (:foreground "yellow")) (((class color) (background dark)) (:foreground "PaleGreen")) (((class color) (background light)) (:foreground "SeaGreen"))) "Face used for displaying normal message." :group 'wl-summary-faces :group 'wl-faces) ;; folder (wl-defface wl-highlight-folder-unknown-face '( (((type tty) (background dark)) (:foreground "cyan")) (((class color) (background dark)) (:foreground "pink")) (((class color) (background light)) (:foreground "RoyalBlue"))) "Face used for displaying unread folder." :group 'wl-folder-faces :group 'wl-faces) (wl-defface wl-highlight-folder-killed-face '( (((type tty) (background dark)) (:foreground "gray")) (((class color)) (:foreground "gray50"))) "Face used for displaying killed folder." :group 'wl-folder-faces :group 'wl-faces) (wl-defface wl-highlight-folder-zero-face '( (((type tty) (background dark)) (:foreground "green")) (((class color) (background dark)) (:foreground "SkyBlue")) (((class color) (background light)) (:foreground "BlueViolet"))) "Face used for displaying folder needs no sync." :group 'wl-folder-faces :group 'wl-faces) (wl-defface wl-highlight-folder-few-face '( (((type tty) (background dark)) (:foreground "yellow")) (((class color) (background dark)) (:foreground "orange")) (((class color) (background light)) (:foreground "OrangeRed3"))) "Face used for displaying folder contains few unsync messages." :group 'wl-folder-faces :group 'wl-faces) (wl-defface wl-highlight-folder-many-face '( (((type tty) (background dark)) (:foreground "red")) (((class color) (background dark)) (:foreground "HotPink1")) (((class color) (background light)) (:foreground "tomato"))) "Face used for displaying folder contains many unsync messages." :group 'wl-folder-faces :group 'wl-faces) (wl-defface wl-highlight-folder-unread-face '( (((type tty) (background dark)) (:foreground "magenta")) (((class color) (background dark)) (:foreground "gold")) (((class color) (background light)) (:foreground "MediumVioletRed"))) "Face used for displaying unread folder." :group 'wl-folder-faces :group 'wl-faces) (wl-defface wl-highlight-folder-opened-face '( (((type tty) (background dark)) (:foreground "blue")) (((class color) (background dark)) (:foreground "PaleGreen")) (((class color) (background light)) (:foreground "ForestGreen"))) "Face used for displaying opened group folder." :group 'wl-folder-faces :group 'wl-faces) (wl-defface wl-highlight-folder-closed-face '( (((type tty) (background dark)) (:foreground "cyan")) (((class color) (background dark)) (:foreground "GreenYellow")) (((class color) (background light)) (:foreground "DarkOliveGreen4"))) "Face used for displaying closed group folder." :group 'wl-folder-faces :group 'wl-faces) (wl-defface wl-highlight-folder-path-face '((t (:bold t :underline t))) "Face used for displaying path." :group 'wl-folder-faces :group 'wl-faces) (wl-defface wl-highlight-demo-face '((((type tty)) (:foreground "green")) (((class color) (background light)) (:foreground "#006600" :background "#d9ffd9")) (((class color) (background dark)) (:foreground "#d9ffd9" :background "#004400"))) "Face used for displaying demo." :group 'wl-faces) (wl-defface wl-highlight-logo-face '((((type tty) (background dark)) (:foreground "cyan")) (((class color) (background light)) (:foreground "SteelBlue" :background "#d9ffd9")) (((class color) (background dark)) (:foreground "SkyBlue" :background "#004400"))) "Face used for displaying demo." :group 'wl-faces) (wl-defface wl-highlight-action-argument-face '((((class color) (background dark)) (:foreground "pink")) (((class color) (background light)) (:foreground "red"))) "Face used for displaying action argument." :group 'wl-summary-faces :group 'wl-faces) ;; cited face (wl-defface wl-highlight-message-cited-text-1 '( (((type tty) (background dark)) (:foreground "magenta")) (((class color) (background dark)) (:foreground "HotPink1")) (((class color) (background light)) (:foreground "ForestGreen"))) "Face used for displaying quoted text from other messages." :group 'wl-message-faces :group 'wl-faces) (wl-defface wl-highlight-message-cited-text-2 '( (((type tty) (background dark)) (:foreground "blue")) (((class color)) (:foreground "violet"))) "Face used for displaying quoted text from other messages." :group 'wl-message-faces :group 'wl-faces) (wl-defface wl-highlight-message-cited-text-3 '( (((type tty) (background dark)) (:foreground "cyan")) (((class color)) (:foreground "orchid3"))) "Face used for displaying quoted text from other messages." :group 'wl-message-faces :group 'wl-faces) (wl-defface wl-highlight-message-cited-text-4 '( (((type tty) (background dark)) (:foreground "green")) (((class color)) (:foreground "purple1"))) "Face used for displaying quoted text from other messages." :group 'wl-message-faces :group 'wl-faces) (wl-defface wl-highlight-message-cited-text-5 '( (((type tty) (background dark)) (:foreground "yellow")) (((class color)) (:foreground "MediumPurple1"))) "Face used for displaying quoted text from other messages." :group 'wl-message-faces :group 'wl-faces) (wl-defface wl-highlight-message-cited-text-6 '( (((type tty) (background dark)) (:foreground "red")) (((class color)) (:foreground "PaleVioletRed"))) "Face used for displaying quoted text from other messages." :group 'wl-message-faces :group 'wl-faces) (wl-defface wl-highlight-message-cited-text-7 '( (((type tty) (background dark)) (:foreground "magenta")) (((class color)) (:foreground "LightPink"))) "Face used for displaying quoted text from other messages." :group 'wl-message-faces :group 'wl-faces) (wl-defface wl-highlight-message-cited-text-8 '( (((type tty) (background dark)) (:foreground "blue")) (((class color)) (:foreground "salmon"))) "Face used for displaying quoted text from other messages." :group 'wl-message-faces :group 'wl-faces) (wl-defface wl-highlight-message-cited-text-9 '( (((type tty) (background dark)) (:foreground "cyan")) (((class color)) (:foreground "SandyBrown"))) "Face used for displaying quoted text from other messages." :group 'wl-message-faces :group 'wl-faces) (wl-defface wl-highlight-message-cited-text-10 '( (((type tty) (background dark)) (:foreground "green")) (((class color)) (:foreground "wheat"))) "Face used for displaying quoted text from other messages." :group 'wl-message-faces :group 'wl-faces) (defface wl-message-header-narrowing-face '((((class color) (background light)) (:foreground "black" :background "dark khaki")) (((class color) (background dark)) (:foreground "white" :background "dark goldenrod")) (t (:bold t))) "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 (find-face 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) face 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 ",")))) (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 (end-of-line) (setq eol (point)) (beginning-of-line) (setq bol (point)) (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)) (when wl-use-dnd (wl-dnd-set-drag-starter 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))) (let* ((lines (count-lines start end)) (real-end end) gc-message) (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))))))) (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))) (let (lines too-big gc-message e p hend i percent) (save-excursion (unless wl-summary-lazy-highlight (setq lines (count-lines start end) too-big (and wl-highlight-max-summary-lines (> lines wl-highlight-max-summary-lines)))) (goto-char start) (setq i 0) (while (and (not (eobp)) (< (point) end)) (when (or (not lazy) (null (get-text-property (point) 'face))) (wl-highlight-summary-current-line)) (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 (condition-case nil (window-end win t) ;; old emacsen doesn't support 2nd arg. (error (window-end win))))) (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 beg e 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-912c443/wl/wl-message.el000066400000000000000000001013121262320455600213560ustar00rootroot00000000000000;;; wl-message.el --- Message displaying modules for Wanderlust. ;; 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: ;; (eval-when-compile (require 'cl)) (eval-when-compile (require 'static)) (require 'wl-vars) (require 'wl-highlight) (require 'elmo) (require 'elmo-mime) (require 'timer) (eval-when-compile (require 'wl-mime) (require 'mime-view) (defalias-maybe 'event-window 'ignore) (defalias-maybe 'posn-window 'ignore) (defalias-maybe 'event-start 'ignore) (defalias-maybe 'mime-open-entity 'ignore) (defalias-maybe 'itimer-function 'ignore) (defalias-maybe 'delete-itimer 'ignore) (defvar-maybe itimer-list)) (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. (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)))) (if (< whi (+ sum mes)) (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 () (static-if (boundp 'window-pixel-scroll-increment) ;; XEmacs 21.2.20 and later. (let (window-pixel-scroll-increment) (scroll-up (or lines wl-message-scroll-amount))) (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)) (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 (let ((mail-reply-buffer buffer)) (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))) (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 entity summary-win flags) (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)) (ignore-errors (run-hooks 'wl-message-redisplay-hook)) ;; 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) (condition-case err (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)) (quit (wl-message-buffer-cache-delete) (error "Display message %s/%s is quitted" fname number)) (error (wl-message-buffer-cache-delete) (signal (car err) (cdr err)) nil))) ;; will not be used 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) (wl-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 () ;;; cannot use for the bug of fsf-compat package (1.09). ;;; (cancel-function-timers 'wl-message-buffer-prefetch-subr) (if (fboundp 'run-with-idle-timer) (if (featurep 'xemacs) (let ((p itimer-list)) (while (car p) (if (eq 'wl-message-buffer-prefetch-subr (itimer-function (car p))) (delete-itimer (car p))) (setq p (cdr p)))) ;; FSF Emacs is correct (cancel-function-timers 'wl-message-buffer-prefetch-subr)))) (defsubst wl-message-buffer-prefetch-set-timer (folder number count summary charset) (if (not (fboundp 'run-with-idle-timer)) (when (sit-for wl-message-buffer-prefetch-idle-time) (wl-message-buffer-prefetch-subr 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 () (when (boundp 'line-move-ignore-invisible) (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)))))) (require 'product) (product-provide (provide 'wl-message) (require 'wl-version)) ;;; wl-message.el ends here wanderlust-wanderlust-912c443/wl/wl-mime.el000066400000000000000000001145011262320455600206650ustar00rootroot00000000000000;;; wl-mime.el --- SEMI implementations of MIME processing on Wanderlust. ;; 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 'mime-view) (require 'mime-edit) (require 'mime-play) (require 'mime-parse) (eval-when-compile (require 'mmbuffer)) (require 'elmo) (require 'elmo-mime) (require 'wl-vars) (require 'wl-util) (eval-when-compile (require 'cl)) ;;; 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-view-following-method-alist (list (cons 'wl-original-message-mode (function wl-draft-yank-to-draft-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 (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 min beg end (entity (get-text-property (point-min) 'elmo-as-is-entity)) (the-buf (current-buffer)) fields) (save-excursion (goto-char (point-min)) (setq min (point-min) 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 (and (boundp 'mime-edit-temp-message-buffer) ;; for SEMI <= 1.14.6 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))) (if (boundp 'mime-header-encode-method-alist) (symbol-value '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)) (if (fboundp 'make-local-hook) (make-local-hook 'kill-buffer-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-view-content-header-filter-hook 'wl-highlight-headers) (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-view-ignored-field-regexp "^:$") (mime-view-content-header-filter-hook 'wl-highlight-headers) (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 (eval-when-compile (defmacro wl-define-dummy-functions (&rest symbols) `(dolist (symbol (quote ,symbols)) (defalias symbol 'ignore)))) (eval-when-compile ;; split eval-when-compile form for avoid error on `make compile-strict' (unless (require 'epa nil t) (wl-define-dummy-functions epg-make-context epg-decrypt-string epg-verify-string epg-context-set-progress-callback epg-context-result-for epg-verify-result-to-string epa-display-info)) (unless (require 'pgg nil t) (wl-define-dummy-functions pgg-decrypt-region pgg-verify-region pgg-display-output-buffer))) (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)))) (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 wl-cs-autoconv)) (delete-region beg end))))) last-coding-system-used) (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))))) (defun wl-mime-pgp-decrypt-region-with-pgg (beg end &optional no-decode) (require 'pgg) (let ((buffer-file-coding-system wl-cs-autoconv) status) (setq status (pgg-decrypt-region beg end)) (if no-decode (when status (delete-region beg end) (insert-buffer-substring pgg-output-buffer)) (pgg-display-output-buffer beg end status)) (unless status (error "Decryption is failed")) last-coding-system-used)) (defun wl-mime-pgp-verify-region-with-pgg (beg end &optional coding-system) (require 'pgg) (let ((message-buffer (current-buffer)) success) (with-temp-buffer (insert-buffer-substring message-buffer beg end) (when coding-system (encode-coding-region (point-min) (point-max) coding-system)) (setq success (pgg-verify-region (point-min) (point-max) nil 'fetch))) (mime-show-echo-buffer) (set-buffer mime-echo-buffer-name) (set-window-start (get-buffer-window mime-echo-buffer-name) (point-max)) (insert-buffer-substring (if success pgg-output-buffer pgg-errors-buffer)))) (defsubst wl-mime-pgp-decrypt-region (beg end &optional no-decode) (case wl-use-pgp-module (epg (wl-mime-pgp-decrypt-region-with-epg beg end no-decode)) (pgg (wl-mime-pgp-decrypt-region-with-pgg beg end no-decode)) (t (error "Don't support PGP decryption")))) (defsubst wl-mime-pgp-verify-region (beg end &optional coding-system) (case wl-use-pgp-module (epg (wl-mime-pgp-verify-region-with-epg beg end coding-system)) (pgg (wl-mime-pgp-verify-region-with-pgg beg end coding-system)) (t (error "Don't support PGP decryption")))) (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 () (mapc (lambda (buffer) (when (bufferp buffer) (kill-buffer buffer))) wl-mime-pgp-decrypted-buffers)) (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 entity) (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))) (setq entity (car (mime-entity-children message-entity))) (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 overviews (root-dir (expand-file-name (concat "m-prts-" (user-login-name)) temporary-file-directory)) full-file point) (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))) (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-view-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 (and (boundp 'mime-setup-signature-key-alist) (boundp 'mime-setup-use-signature) 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-912c443/wl/wl-mule.el000066400000000000000000000262171262320455600207060ustar00rootroot00000000000000;;; wl-mule.el --- Wanderlust modules for Mule compatible Emacsen. ;; 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: ;; For Mule2.3@19.34, Emacs 20.x ;;; Code: ;; (eval-when-compile (require 'wl-folder) (require 'wl-summary) (require 'wl-draft) (require 'wl-message) (require 'wl-highlight) (require 'wl-vars) (defvar-maybe wl-draft-mode-map (make-sparse-keymap))) (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}")) ;; Common implementations. (defun wl-highlight-folder-current-line (&optional numbers) "Highlight current folder line." (interactive) (save-excursion (end-of-line) (let ((end (point)) (start (progn (beginning-of-line) (point))) (inhibit-read-only t) (text-face (cond ((and (wl-folder-buffer-group-p) (looking-at wl-highlight-folder-opened-regexp)) 'wl-highlight-folder-opened-face) ((and (wl-folder-buffer-group-p) (looking-at wl-highlight-folder-closed-regexp)) 'wl-highlight-folder-closed-face) (t (if (looking-at (format "^[ \t]*\\(%s\\|%s\\)" wl-folder-unsubscribe-mark wl-folder-removed-mark)) 'wl-highlight-folder-killed-face 'wl-highlight-folder-unknown-face))))) (if (and wl-highlight-folder-by-numbers numbers (nth 0 numbers) (nth 1 numbers) (re-search-forward "[0-9-]+/[0-9-]+/[0-9-]+" end 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) (point) 'face face)) ;; Remove previous face. (put-text-property start (point) 'face nil) (put-text-property start (point) 'face face)) (goto-char start)) (put-text-property start end 'face text-face))) (when wl-use-highlight-mouse-line (wl-highlight-folder-mouse-line)))) (defun wl-highlight-plugged-current-line ()) (defun wl-plugged-set-folder-icon (folder string) string) (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)))))) (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-x\C-s" 'wl-draft-save) (define-key wl-draft-mode-map "\C-c\C-a" 'wl-addrmgr) (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-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" . ,(if (and (boundp 'mime-setup-use-signature) mime-setup-use-signature) 'insert-signature 'mime-edit-insert-signature))) (define-key keymap [menu-bar headers fcc] '("Fcc" . wl-draft-fcc)))) (defun wl-draft-overload-functions () (wl-mode-line-buffer-identification) ;;; (local-set-key "\C-c\C-s" 'wl-draft-send) ; override (wl-draft-overload-menubar)) ;; for "ja-mule-canna-2.3.mini" on PocketBSD (defun-maybe make-face (a)) (eval-when-compile (require 'static)) (static-cond ((and (fboundp 'defface) (not (featurep 'tinycustom))) (defalias 'wl-defface 'defface) (eval-when-compile (defun wl-face-spec-set-match-display (display frame)) (defun wl-frame-parameter (frame property &optional default)) (defun wl-get-frame-properties (&optional frame)))) (t (defmacro wl-defface (face spec doc &rest args) (nconc (list 'wl-declare-face (list 'quote face) spec))) (defun wl-declare-face (face spec) (make-face face) (while spec (let* ((entry (car spec)) (display (nth 0 entry)) (atts (nth 1 entry))) (setq spec (cdr spec)) (when (wl-face-spec-set-match-display display nil) (apply 'wl-face-attributes-set face nil atts))))) (defconst wl-face-attributes '((:bold set-face-bold-p) (:italic set-face-italic-p) (:underline set-face-underline-p) (:foreground set-face-foreground) (:background set-face-background) (:stipple set-face-stipple))) (defun wl-face-attributes-set (face frame &rest atts) "For FACE on FRAME set the attributes [KEYWORD VALUE].... Each keyword should be listed in `custom-face-attributes'. If FRAME is nil, set the default face." (while atts (let* ((name (nth 0 atts)) (value (nth 1 atts)) (fun (nth 1 (assq name wl-face-attributes)))) (setq atts (cdr (cdr atts))) (condition-case nil (funcall fun face value frame) (error nil))))) (defun wl-frame-parameter (frame property &optional default) "Return FRAME's value for property PROPERTY." (or (cdr (assq property (frame-parameters frame))) default)) (eval-when-compile (defun-maybe x-display-grayscale-p ())) (defun wl-get-frame-properties (&optional frame) "Return a plist with the frame properties of FRAME used by custom." (list (cons 'type window-system) (cons 'class (or (wl-frame-parameter frame 'display-type) (when window-system (cond ((x-display-color-p) 'color) ((and (fboundp 'x-display-grayscale-p) (x-display-grayscale-p)) 'grayscale) (t 'mono))))) (cons 'background (or (wl-frame-parameter frame 'background-mode) wl-highlight-background-mode)))) (defun wl-face-spec-set-match-display (display frame) "Non-nil iff DISPLAY matches FRAME. If FRAME is nil, the current FRAME is used." ;; This is a kludge to get started, we really should use specifiers! (if (eq display t) t (let* ((props (wl-get-frame-properties frame)) (type (cdr (assq 'type props))) (class (cdr (assq 'class props))) (background (cdr (assq 'background props))) (match t) (entries display) entry req options) (while (and entries match) (setq entry (car entries) entries (cdr entries) req (car entry) options (cdr entry) match (cond ((eq req 'type) (memq type options)) ((eq req 'class) (memq class options)) ((eq req 'background) (memq background options)) (t (message "\ Warning: Unknown req `%S' with options `%S'" req options) nil)))) match))))) (defun wl-read-event-char (&optional prompt) "Get the next event." (let ((event (read-event prompt))) (cons (and (numberp event) event) event))) (require 'product) (product-provide (provide 'wl-mule) (require 'wl-version)) ;;; wl-mule.el ends here wanderlust-wanderlust-912c443/wl/wl-news.el.in000066400000000000000000000235111262320455600213170ustar00rootroot00000000000000;;; wl-news.el --- Create notification from NEWS(.ja) for Wanderlust. -*-coding: iso-2022-jp-unix;-*- ;; 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 (and (boundp 'current-language-environment) (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-912c443/wl/wl-qs.el000066400000000000000000000114351262320455600203630ustar00rootroot00000000000000;;; wl-qs.el --- Prompt for a query string and display search results. ;; 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." (let* ((str1 (elmo-replace-in-string str "'" "\"" t)) (str2 (elmo-replace-in-string str1 "\"" "\\\"" t))) str2)) (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-912c443/wl/wl-refile.el000066400000000000000000000212561262320455600212100ustar00rootroot00000000000000;;; wl-refile.el --- Refile modules for Wanderlust. ;; 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) (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) (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 (elmo-string 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 (wl-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 (elmo-string 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 (elmo-string 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)))))) ;; ;; 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.") ;; 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 (wl-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) (wl-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-912c443/wl/wl-score.el000066400000000000000000001344111262320455600210530ustar00rootroot00000000000000;;; wl-score.el --- Scoring in Wanderlust. ;; 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) (eval-when-compile (require 'cl) ; cadaar, cddaar (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) ;; 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) "")) (defun wl-string> (s1 s2) (not (or (string< s1 s2) (string= s1 s2)))) (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 num entry ov 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 default-enable-multibyte-characters)) (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 (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) (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)) (string-to-number (read-string "Mark below: "))))) (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)) (string-to-number (read-string "Expunge below: "))))) (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))) (decode (nth 3 (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) (char-to-string (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) (char-to-string (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) (char-to-string (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 (string-to-number (read-string "Set score: "))))) (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 (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") (let (number-alist expunged) (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)))) (setq 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 mark-alist) (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 (elmo-string (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 (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])) (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) (char-to-string (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-912c443/wl/wl-spam.el000066400000000000000000000413101262320455600206730ustar00rootroot00000000000000;;; wl-spam.el --- Spam filtering interface for Wanderlust. ;; 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: ;; (eval-when-compile (require 'cl)) (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) (wl-defface wl-highlight-summary-spam-face '((((type tty) (background dark)) (:foreground "blue")) (((class color)) (:foreground "LightSlateGray"))) "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 (wl-string-member string list) (wl-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))))))) (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))) (eval-when-compile ;; Avoid compile warnings (defalias-maybe 'wl-summary-spam 'ignore) (defalias-maybe 'wl-summary-unmark-spam 'ignore)) (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 (interactive-p) (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)) ((interactive-p) (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)) ((interactive-p) (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)) ((interactive-p) (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) (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)) ((interactive-p) (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) (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) (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-912c443/wl/wl-summary.el000066400000000000000000005462301262320455600214430ustar00rootroot00000000000000;;; wl-summary.el --- Summary mode for Wanderlust. ;; 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 'elmo) (require 'elmo-multi) (eval-when-compile (require 'elmo-filter)) (require 'wl-message) (require 'wl-vars) (require 'wl-highlight) (require 'wl-refile) (require 'wl-util) (require 'timezone nil t) (require 'easymenu nil t) (require 'elmo-date) (require 'ps-print nil t) (eval-when-compile (require 'cl) (require 'timer nil t) (defalias-maybe 'ps-print-buffer-with-faces 'ignore) (defalias-maybe 'elmo-database-msgid-put 'ignore) (defalias-maybe 'elmo-database-close 'ignore) (defalias-maybe 'elmo-database-msgid-get 'ignore) (defalias-maybe 'run-with-idle-timer 'ignore) (defalias-maybe 'ps-print-preprint 'ignore)) (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 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])) (if wl-on-xemacs (defun wl-summary-setup-mouse () (define-key wl-summary-mode-map 'button4 'wl-summary-prev) (define-key wl-summary-mode-map 'button5 'wl-summary-next) (define-key wl-summary-mode-map [(shift button4)] 'wl-summary-up) (define-key wl-summary-mode-map [(shift button5)] 'wl-summary-down) (define-key wl-summary-mode-map 'button2 'wl-summary-click)) (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) ;; For Meadow2 (define-key wl-summary-mode-map [mouse-wheel1] 'wl-summary-wheel-dispatcher) (define-key wl-summary-mode-map [S-mouse-wheel1] 'wl-summary-wheel-dispatcher) (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 "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 (condition-case nil (window-end win t) ; old emacsen doesn't support 2nd arg. (error (window-end win))))) (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))) (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)) (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 (interactive-p) (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) (when (boundp 'show-trailing-whitespace) (setq show-trailing-whitespace nil)) ;;; (make-local-variable 'tab-width) ;;; (setq tab-width 1) (buffer-disable-undo (current-buffer)) (setq selective-display t selective-display-ellipses nil) (when (boundp 'bidi-paragraph-direction) (set 'bidi-paragraph-direction 'left-to-right)) (wl-mode-line-buffer-identification '(wl-summary-buffer-mode-line)) (easy-menu-add wl-summary-mode-menu) (setq wl-summary-buffer-window-scroll-functions (wl-summary-window-scroll-functions)) (when wl-summary-buffer-window-scroll-functions (let ((hook (if wl-on-xemacs 'pre-idle-hook 'window-scroll-functions))) (if (fboundp 'make-local-hook) (make-local-hook hook)) (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)) (if (fboundp 'make-local-hook) (make-local-hook 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 (elmo-time< (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) (lexical-let ((entity entity)) (let* ((getter (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 descending 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) gc-message ; for XEmacs (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) "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 (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 (interactive-p) (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 (interactive-p) (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 message-buf message-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) (msgdb-dir (elmo-folder-msgdb-path folder)) (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 (wl-parse-addresses body)) (if body (setq candidates (append candidates body))) (setq fields (cdr fields))) (setq candidates (elmo-uniq-list candidates)) (elmo-with-enable-multibyte (mapcar (lambda (x) (setq components (std11-extract-address-components x)) (cons (nth 1 components) (and (car components) (eword-decode-string (elmo-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)) msg) (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)) (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)))) mark new-mark) (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) "??"))))) " ]") (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 start-pos pos) (save-excursion (setq start-pos (point)) (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 (interactive-p)) (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 (interactive-p)) (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 (interactive-p)) (y-or-n-p "Mark all messages as read? ")) (let ((folder wl-summary-buffer-elmo-folder) (cur-buf (current-buffer))) (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) (len (length msgs)) (i 0) update-list) (elmo-kill-buffer wl-summary-search-buf-name) (while msgs (if (eq wl-summary-buffer-view 'thread) (progn ;; don't use wl-append(nconc), because list is broken. ...why? (setq update-list (append update-list (wl-thread-delete-message (car msgs)))) (setq update-list (delq (car msgs) update-list))) (goto-char (point-min)) (if (wl-summary-jump-to-msg (car msgs)) (progn (delete-region (point-at-bol) (point-at-eol)) (delete-char 1) ; delete '\n' (setq wl-summary-buffer-number-list (delq (car msgs) wl-summary-buffer-number-list))))) (setq msgs (cdr msgs))) (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 (condition-case nil (window-end win t) ; old emacsen doesn't support 2nd arg. (error (window-end win))))) (wl-summary-update-status-marks start end 'check))))) (defun wl-summary-insert-message (&rest args) (if (eq wl-summary-buffer-view 'thread) (apply 'wl-summary-insert-thread args) (apply 'wl-summary-insert-sequential args))) (defun wl-summary-sort (reverse) "Sort summary lines into the selected order; argument means descending order." (interactive "P") (let ((default-value (symbol-name wl-summary-default-sort-spec))) (wl-summary-rescan (wl-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 (interactive-p) (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) gc-message ; for XEmacs 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) (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)) (if elmo-use-database (elmo-database-msgid-put (elmo-message-entity-field entity 'message-id) (elmo-folder-name-internal folder) (elmo-message-entity-number entity)))) (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)) (if elmo-use-database (elmo-database-close)) (run-hooks 'wl-summary-sync-updated-hook) (setq mes (if (and (zerop (length 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 (point-min)) (if (not (wl-summary-cursor-down t)) (progn (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) (if wl-summary-highlight (wl-highlight-summary-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)) regexp) (setq regexp (concat "\r" (number-to-string number) "[^0-9]")) (if (and beg end (or (< pos beg) (< end pos))) (progn (goto-char beg) (if (re-search-forward regexp end t) (progn (backward-char) (beginning-of-line) t) (goto-char pos) nil)) (beginning-of-line) (if (or (and (re-search-forward regexp end t) (progn (backward-char) t)) (re-search-backward regexp beg t)) (progn (beginning-of-line) t) 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 (wl-match-buffer 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 (let (insert-file-contents-pre-hook ; To avoid autoconv-xmas... insert-file-contents-post-hook ret-val) (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) (wl-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 hilit 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-as-binary cache) (set-buffer-multibyte default-enable-multibyte-characters) (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 (and wl-summary-buffer-window-scroll-functions wl-on-xemacs) (sit-for 0)) (when (or (eq t wl-summary-force-prefetch-folder-list) (wl-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) (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)) (elmo-progress-notify 'wl-summary-insert-line) (ignore-errors (run-hooks 'wl-summary-line-inserted-hook))) (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 (point-max)) (wl-summary-insert-line (wl-summary-create-line entity nil nil (elmo-message-status folder number))) (setq 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 (elmo-replace-in-string subject "\\(\\(re\\|was\\)[:>]\\|[ \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 default-enable-multibyte-characters)) (mapc (lambda (number) (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 ((depth 0) this-id parent-entity parent-number number cur-entity linked retval delayed-entity update-list entity-stack thread-entity) (while entity (setq this-id (elmo-message-entity-field entity 'message-id) 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))) (elmo-progress-notify 'wl-summary-insert-line) (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)) (overview-entity entity) (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 (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))))))) (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."))))) (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-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)))))) (when wl-summary-highlight (wl-highlight-summary-current-line number status)) (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 (interactive-p) (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 (interactive-p))) (defun wl-summary-set-persistent-mark (&optional flag number-or-numbers no-modeline-update no-server) "Set persistent mark." (interactive) (when (interactive-p) (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 (interactive-p))) (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 (interactive-p) (elmo-message-flagged-p wl-summary-buffer-elmo-folder (wl-summary-message-number) 'answered)) 'answered number-or-numbers no-modeline-update nil (interactive-p))) (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)))) (wl-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 (interactive-p) (elmo-message-flagged-p wl-summary-buffer-elmo-folder (wl-summary-message-number) 'important)) 'important nil nil nil (interactive-p)))) (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)))) ;;; Summary line. (defvar wl-summary-line-formatter nil) (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 () (wl-set-string-width (- wl-summary-buffer-number-column) (number-to-string (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 (wl-message-entity wl-parent-message-entity wl-temp-mark wl-status &optional wl-thr-children-number wl-thr-indent-string wl-thr-linked) "Create a summary line." (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 (elmo-time-to-datevec (elmo-message-entity-field wl-message-entity 'date) wl-summary-fix-timezone) (make-vector 7 0))) (entity wl-message-entity) ; backward compatibility. line mark) (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) (wl-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)) range) (setq 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 (if (setq fld-buf (get-buffer wl-folder-buffer-name)) (if (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 (if (setq fld-buf (get-buffer wl-folder-buffer-name)) (if (setq fld-win (get-buffer-window fld-buf)) (setq wl-summary-buffer-disp-folder nil) (setq wl-summary-buffer-disp-folder t))) (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 (if (setq fld-buf (get-buffer wl-folder-buffer-name)) (if (setq fld-win (get-buffer-window fld-buf)) (progn (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 summary-win) (cond ((eq arg 'on) (setq wl-summary-buffer-disp-msg t) (save-excursion ;; hide your folder window (if (and (not wl-stay-folder-window) (setq fld-buf (get-buffer wl-folder-buffer-name))) (if (setq fld-win (get-buffer-window fld-buf)) (unless (one-window-p fld-win) (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) (wl-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 message-last-pos) (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)) change-major-mode-hook 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* ((original (wl-summary-message-number)) (msgid (elmo-string (or id (read-from-minibuffer "Message-ID: ")))) (entity (elmo-message-entity wl-summary-buffer-elmo-folder msgid)) msg otherfld 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) ;; for XEmacs! (if (and elmo-use-database (setq errmsg (format "No message with id \"%s\" in the database." msgid)) (setq otherfld (elmo-database-msgid-get msgid))) (if (cdr (wl-summary-jump-to-msg-internal (car otherfld) (nth 1 otherfld) 'no-sync)) t ; succeed. ;; Back to original. (wl-summary-jump-to-msg-internal (wl-summary-buffer-folder-name) original 'no-sync)) (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 (elmo-string (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 (wl-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 (wl-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 (wl-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 current message. See also `wl-draft-reply'." (interactive "P") (let ((folder wl-summary-buffer-elmo-folder) (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) (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) entity subject num) (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 (wl-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 (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 (interactive-p)))) (defun wl-summary-next (&optional interactive) (interactive) (wl-summary-cursor-move-surface t (or interactive (interactive-p)))) (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 (interactive-p)) (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 (interactive-p)) (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 (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 wl-cs-autoconv))) (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 (if (and (not wl-stay-folder-window) (setq fld-buf (get-buffer wl-folder-buffer-name))) (if (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 buf) (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 (wl-parse-addresses from)))) (error "This article is not yours")) ;; Make control message. (setq buf (set-buffer (get-buffer-create " *message cancel*"))) (setq wl-draft-buffer-cur-summary-buffer summary-buf) (buffer-disable-undo (current-buffer)) (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 (wl-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 (toggle-read-only -1) (erase-buffer) (princ raw raw-buffer) (toggle-read-only t) (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 (interactive-p)) (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 ""))))) (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 (interactive-p)) (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 (elmo-string (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") (elmo-folder-pack-numbers wl-summary-buffer-elmo-folder) (let (wl-use-scoring) (wl-summary-rescan nil nil nil t))) (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)))) (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 (interactive-p)) ;;; (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-912c443/wl/wl-template.el000066400000000000000000000157361262320455600215630ustar00rootroot00000000000000;;; wl-template.el --- Draft template feature for Wanderlust. ;; 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) ;; 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-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-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 separater--")) (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-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)))))) (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 'product) (product-provide (provide 'wl-template) (require 'wl-version)) ;;; wl-template.el ends here wanderlust-wanderlust-912c443/wl/wl-thread.el000066400000000000000000001140521262320455600212060ustar00rootroot00000000000000;;; wl-thread.el --- Thread display modules for Wanderlust. ;; 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-summary) (require 'wl-highlight) (eval-when-compile (require 'cl)) ;; 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) ;;;;;;; (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) (while entities (elmo-set-hash-val (format "#%d" (car (car entities))) (car entities) wl-thread-entity-hashtb) (setq entities (cdr 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 (car entity))) msgs-stack children) (while msgs (setq wl-summary-buffer-number-list (cons (car 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))))) (defsubst wl-thread-entity-get-number (entity) (nth 0 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-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 (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 (cddddr entity) (setcar (cddddr entity) linked) (nconc entity (list linked))) entity) (defsubst wl-thread-reparent-children (children parent) (while children (wl-thread-entity-set-parent (wl-thread-get-entity (car children)) parent) (wl-thread-entity-set-linked (wl-thread-get-entity (car children)) t) (setq children (cdr children)))) (defsubst wl-thread-entity-insert-as-top (entity) (when (and entity (car entity)) (wl-append wl-thread-entity-list (list (car entity))) (setq wl-thread-entities (cons entity wl-thread-entities)) (setq wl-summary-buffer-number-list (nconc wl-summary-buffer-number-list (list (car entity)))) (elmo-set-hash-val (format "#%d" (car entity)) entity wl-thread-entity-hashtb))) (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 (nth (- (length curc) 1) curc)))) (wl-thread-entity-get-number curp))) (wl-thread-entity-set-children to (wl-append children (list (car entity)))) (setq wl-thread-entities (cons entity wl-thread-entities)) (elmo-set-hash-val (format "#%d" (car entity)) entity wl-thread-entity-hashtb))) (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 (car 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 (car 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-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 (car 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) (let ((num (or number (string-to-number (read-from-minibuffer "Jump to Message(No.): "))))) (wl-thread-entity-force-open (wl-thread-get-entity num)) (wl-summary-jump-to-msg num))) (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)))) (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 summary-line 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-delete-line-from-buffer (msg) "Simply delete msg line." (let (beg) (if (wl-summary-jump-to-msg msg) (progn (setq beg (point)) (forward-line) (delete-region beg (point)) t) nil))) (defun wl-thread-cleanup-symbols (msgs) (let (entity) (while msgs (when (setq entity (wl-thread-get-entity (car msgs))) ;; delete entity. (setq wl-thread-entities (delq entity wl-thread-entities)) ;; free symbol. (elmo-clear-hash-val (format "#%d" (car msgs)) wl-thread-entity-hashtb)) (setq msgs (cdr msgs))))) (defun wl-thread-get-exist-children (msg &optional include-self) (let ((msgs (list msg)) msgs-stack children entity ret-val) (while msgs (setq children (wl-thread-entity-get-children (setq entity (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)) (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 (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 ((ptr msgs) parent ret) (while (car ptr) (setq parent (wl-thread-entity-get-parent (wl-thread-get-entity (car ptr)))) (when (or (not parent) (not (memq parent msgs))) (setq ret (append ret (list (car ptr))))) (setq ptr (cdr ptr))) 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 ((elist wl-thread-entity-list) (len (length wl-thread-entity-list))) (elmo-with-progress-display (wl-thread-insert-entity (length wl-thread-entity-list)) "Inserting message" (wl-delete-all-overlays) (while elist (wl-thread-insert-entity 0 (wl-thread-get-entity (car elist)) nil len) (elmo-progress-notify 'wl-thread-insert-entity) (setq elist (cdr elist)))))) (defsubst wl-thread-insert-entity-sub (indent entity parent-entity all) (let (msg-num message-entity temp-mark summary-line) (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 (car 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)))))) (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-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 (- 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-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))))))) (when wl-summary-lazy-highlight (wl-highlight-summary-window)) (wl-summary-set-message-modified) (set-buffer-modified-p nil)))) (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)) (incf depth) (setq entity (wl-thread-get-entity number))) depth)) (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)))) (defsubst wl-thread-make-indent-string (entity) (let ((cur entity) (ret-val "") (space-str (wl-repeat-string wl-thread-space-str-internal (- wl-thread-indent-level-internal 1))) 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 (- wl-thread-indent-level-internal 1)))) (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)) (defun wl-thread-set-parent (&optional parent-number) "Set current message's parent interactively." (interactive) (let ((number (wl-summary-message-number)) (dst-parent (if (interactive-p) (read-from-minibuffer "Parent Message (No.): "))) entity dst-parent-entity src-parent children update-msgs buffer-read-only) (if (string= dst-parent "") (setq dst-parent nil) (if (interactive-p) (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 (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-912c443/wl/wl-util.el000066400000000000000000001230701262320455600207140ustar00rootroot00000000000000;;; wl-util.el --- Utility modules for Wanderlust. ;; 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) (eval-when-compile (require 'elmo-pop3)) (eval-when-compile (require 'cl)) (eval-when-compile (require 'static)) (require 'pp nil t) (eval-when-compile (require 'time-stamp) (defalias-maybe 'next-command-event 'ignore) (defalias-maybe 'event-to-character 'ignore) (defalias-maybe 'key-press-event-p 'ignore) (defalias-maybe 'button-press-event-p 'ignore) (defalias-maybe 'set-process-kanji-code 'ignore) (defalias-maybe 'set-process-coding-system 'ignore) (defalias-maybe 'dispatch-event 'ignore)) (defalias 'wl-set-work-buf 'elmo-set-work-buf) (make-obsolete 'wl-set-work-buf 'elmo-set-work-buf) (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) (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) (fillarray hashtable 0) (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) (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-ask-folder (func mes-string) (let* (key keve (cmd (if (featurep 'xemacs) (event-to-character last-command-event) (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." (static-cond ((and (fboundp 'string-width) (fboundp 'truncate-string-to-width) (not (featurep 'xemacs))) (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))))) (t (elmo-set-work-buf (set-buffer-multibyte default-enable-multibyte-characters) (insert string) (when (> (current-column) (abs width)) (when (> (move-to-column (abs width)) (abs width)) (condition-case nil ; ignore error (backward-char) (error))) (setq string (buffer-substring (point-min) (point)))) (if (= (current-column) (abs width)) string (let ((paddings (make-string (- (abs width) (current-column)) (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) (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))) (defun wl-match-string (pos string) "Substring POSth matched STRING." (substring string (match-beginning pos) (match-end pos))) (defun wl-match-buffer (pos) "Substring POSth matched from the current buffer." (buffer-substring-no-properties (match-beginning pos) (match-end pos))) (put 'wl-as-coding-system 'lisp-indent-function 1) (put 'wl-as-mime-charset 'lisp-indent-function 1) (eval-and-compile (cond (wl-on-mule3 (defmacro wl-as-coding-system (coding-system &rest body) `(let ((coding-system-for-read ,coding-system) (coding-system-for-write ,coding-system)) ,@body))) (wl-on-mule (defmacro wl-as-coding-system (coding-system &rest body) `(let ((file-coding-system-for-read ,coding-system) (file-coding-system ,coding-system)) ,@body))) (t (defmacro wl-as-coding-system (coding-system &rest body) `(progn ,@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) (if (not (fboundp 'overlays-in)) (defun overlays-in (beg end) "Return a list of the overlays that overlap the region BEG ... END. Overlap means that at least one character is contained within the overlay and also contained within the specified region. Empty overlays are included in the result if they are located at BEG or between BEG and END." (let ((ovls (overlay-lists)) tmp retval) (if (< end beg) (setq tmp end end beg beg tmp)) (setq ovls (nconc (car ovls) (cdr ovls))) (while ovls (setq tmp (car ovls) ovls (cdr ovls)) (if (or (and (<= (overlay-start tmp) end) (>= (overlay-start tmp) beg)) (and (<= (overlay-end tmp) end) (>= (overlay-end tmp) beg))) (setq retval (cons tmp retval)))) retval))) (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)) (static-unless (fboundp 'pp) (defvar pp-escape-newlines t) (defun pp (object &optional stream) "Output the pretty-printed representation of OBJECT, any Lisp object. Quoting characters are printed when needed to make output that `read' can handle, whenever this is possible. Output stream is STREAM, or value of `standard-output' (which see)." (princ (pp-to-string object) (or stream standard-output))) (defun pp-to-string (object) "Return a string containing the pretty-printed representation of OBJECT, any Lisp object. Quoting characters are used when needed to make output that `read' can handle, whenever this is possible." (save-excursion (set-buffer (generate-new-buffer " pp-to-string")) (unwind-protect (progn (lisp-mode-variables t) (let ((print-escape-newlines pp-escape-newlines)) (prin1 object (current-buffer))) (goto-char (point-min)) (while (not (eobp)) (cond ((looking-at "\\s(\\|#\\s(") (while (looking-at "\\s(\\|#\\s(") (forward-char))) ((and (looking-at "\\(quote[ \t]+\\)\\([^.)]\\)") (> (match-beginning 1) 1) (= ?\( (char-after (1- (match-beginning 1)))) ;; Make sure this is a two-element list. (save-excursion (goto-char (match-beginning 2)) (forward-sexp) ;; Avoid mucking with match-data; does this test work? (char-equal ?\) (following-char)))) ;; -1 gets the paren preceding the quote as well. (delete-region (1- (match-beginning 1)) (match-end 1)) (insert "'") (forward-sexp 1) (if (looking-at "[ \t]*\)") (delete-region (match-beginning 0) (match-end 0)) (error "Malformed quote")) (backward-sexp 1)) ((condition-case err-var (prog1 t (down-list 1)) (error nil)) (backward-char) (skip-chars-backward " \t") (delete-region (point) (progn (skip-chars-forward " \t") (point))) (if (not (char-equal ?' (char-after (1- (point))))) (insert ?\n))) ((condition-case err-var (prog1 t (up-list 1)) (error nil)) (while (looking-at "\\s)") (forward-char)) (skip-chars-backward " \t") (delete-region (point) (progn (skip-chars-forward " \t") (point))) (if (not (char-equal ?' (char-after (1- (point))))) (insert ?\n))) (t (goto-char (point-max))))) (goto-char (point-min)) (indent-sexp) (buffer-string)) (kill-buffer (current-buffer)))))) (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 ((s (current-time-string time))) (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 (wl-match-string 1 s) ", " (timezone-make-date-arpa-standard s (current-time-zone))))) (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)) (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))) (static-if (fboundp 'read-directory-name) (defun wl-read-directory-name (prompt dir) (read-directory-name prompt dir dir)) (defun wl-read-directory-name (prompt dir) (let ((dir (read-file-name prompt dir))) (unless (file-directory-p dir) (error "%s is not directory" dir)) dir))) ;; local variable check. (static-if (fboundp 'local-variable-p) (defalias 'wl-local-variable-p 'local-variable-p) (defmacro wl-local-variable-p (symbol &optional buffer) `(if (assq ,symbol (buffer-local-variables ,buffer)) t))) (defun wl-number-base36 (num len) (if (if (< len 0) (<= num 0) (= len 0)) "" (concat (wl-number-base36 (/ num 36) (1- len)) (char-to-string (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 (static-if (fboundp 'current-time) (current-time) (let* ((cts (split-string (current-time-string) "[ :]")) (m (cdr (assoc (nth 1 cts) '(("Jan" . "01") ("Feb" . "02") ("Mar" . "03") ("Apr" . "04") ("May" . "05") ("Jun" . "06") ("Jul" . "07") ("Aug" . "08") ("Sep" . "09") ("Oct" . "10") ("Nov" . "11") ("Dec" . "12")))))) (list (string-to-number (concat (nth 6 cts) m (substring (nth 2 cts) 0 1))) (string-to-number (concat (substring (nth 2 cts) 1) (nth 4 cts) (nth 5 cts) (nth 6 cts)))))))) (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))) (static-cond (wl-on-xemacs (defvar wl-save-drafts-timer-name "wl-save-drafts") (defun wl-start-save-drafts () (when (numberp wl-auto-save-drafts-interval) (unless (get-itimer wl-save-drafts-timer-name) (start-itimer wl-save-drafts-timer-name 'wl-auto-save-drafts wl-auto-save-drafts-interval wl-auto-save-drafts-interval t)))) (defun wl-stop-save-drafts () (when (get-itimer wl-save-drafts-timer-name) (delete-itimer wl-save-drafts-timer-name)))) (t (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 (interactive-p) (message "Auto save is %s (in this buffer)" (if wl-disable-auto-save "disabled" "enabled")))) ;; Biff (static-cond (wl-on-xemacs (defvar wl-biff-timer-name "wl-biff") (defun wl-biff-stop () (when (get-itimer wl-biff-timer-name) (delete-itimer wl-biff-timer-name))) (defun wl-biff-start () (wl-biff-stop) (when wl-biff-check-folder-list (start-itimer wl-biff-timer-name 'wl-biff-check-folders wl-biff-check-interval wl-biff-check-interval wl-biff-use-idle-timer)))) (t (defun wl-biff-stop () (when (get 'wl-biff 'timer) (cancel-timer (get 'wl-biff 'timer)))) (defun wl-biff-start () (require 'timer) (when wl-biff-check-folder-list (if wl-biff-use-idle-timer (if (get 'wl-biff 'timer) (progn (timer-set-idle-time (get 'wl-biff 'timer) wl-biff-check-interval t) (timer-activate-when-idle (get 'wl-biff 'timer))) (put 'wl-biff 'timer (run-with-idle-timer wl-biff-check-interval t 'wl-biff-event-handler))) (if (get 'wl-biff 'timer) (progn (timer-set-time (get 'wl-biff 'timer) (timer-next-integral-multiple-of-time (current-time) wl-biff-check-interval) wl-biff-check-interval) (timer-activate (get 'wl-biff 'timer))) (put 'wl-biff 'timer (run-at-time (timer-next-integral-multiple-of-time (current-time) wl-biff-check-interval) wl-biff-check-interval 'wl-biff-event-handler)))))) (defun-maybe timer-next-integral-multiple-of-time (time secs) "Yield the next value after TIME that is an integral multiple of SECS. More precisely, the next value, after TIME, that is an integral multiple of SECS seconds since the epoch. SECS may be a fraction. This function is imported from Emacs 20.7." (let ((time-base (ash 1 16))) (if (fboundp 'atan) ;; Use floating point, taking care to not lose precision. (let* ((float-time-base (float time-base)) (million 1000000.0) (time-usec (+ (* million (+ (* float-time-base (nth 0 time)) (nth 1 time))) (nth 2 time))) (secs-usec (* million secs)) (mod-usec (mod time-usec secs-usec)) (next-usec (+ (- time-usec mod-usec) secs-usec)) (time-base-million (* float-time-base million))) (list (floor next-usec time-base-million) (floor (mod next-usec time-base-million) million) (floor (mod next-usec million)))) ;; Floating point is not supported. ;; Use integer arithmetic, avoiding overflow if possible. (let* ((mod-sec (mod (+ (* (mod time-base secs) (mod (nth 0 time) secs)) (nth 1 time)) secs)) (next-1-sec (+ (- (nth 1 time) mod-sec) secs))) (list (+ (nth 0 time) (floor next-1-sec time-base)) (mod next-1-sec time-base) 0))))) (defun wl-biff-event-handler () ;; PAKURing from FSF:time.el (wl-biff-check-folders) ;; Do redisplay right now, if no input pending. (sit-for 0) (let ((timer (get 'wl-biff 'timer)) (access-functions (eval-when-compile (fboundp 'timer--time)))) ;; Only normal timer should be checked for skipping. (unless (if access-functions (timer--idle-delay timer) (aref timer 7)) (let ((current (current-time)) (next-time ;; Compute the time when this timer will run again, next. (if access-functions (timer-relative-time (timer--time timer) (* 5 (timer--repeat-delay timer))) (timer-relative-time (list (aref timer 1) (aref timer 2) (aref timer 3)) (* 5 (aref timer 4)))))) ;; If the activation time is far in the past, ;; skip executions until we reach a time in the future. ;; This avoids a long pause if Emacs has been suspended for hours. (or (> (nth 0 next-time) (nth 0 current)) (and (= (nth 0 next-time) (nth 0 current)) (> (nth 1 next-time) (nth 1 current))) (and (= (nth 0 next-time) (nth 0 current)) (= (nth 1 next-time) (nth 1 current)) (> (nth 2 next-time) (nth 2 current))) (progn (timer-set-time timer (timer-next-integral-multiple-of-time current wl-biff-check-interval) wl-biff-check-interval) (timer-activate timer))))))))) (defsubst wl-biff-notify (new-mails notify-minibuf) (when (and (not wl-modeline-biff-status) (> new-mails 0)) (run-hooks 'wl-biff-notify-hook)) (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))))) ;; Internal variable. (defvar wl-biff-check-folders-running nil) (defun wl-biff-check-folders () (interactive) (if wl-biff-check-folders-running (when (interactive-p) (message "Biff process is running.")) (setq wl-biff-check-folders-running t) (when (interactive-p) (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) (interactive-p)) (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 (interactive-p))))))) (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))) (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))) (if (and (fboundp 'regexp-opt) (not (featurep 'xemacs))) (defalias 'wl-regexp-opt 'regexp-opt) (defun wl-regexp-opt (strings &optional paren) "Return a regexp to match a string in STRINGS. Each string should be unique in STRINGS and should not contain any regexps, quoted or not. If optional PAREN is non-nil, ensure that the returned regexp is enclosed by at least one regexp grouping construct." (let ((open-paren (if paren "\\(" "")) (close-paren (if paren "\\)" ""))) (concat open-paren (mapconcat 'regexp-quote strings "\\|") close-paren)))) (defalias 'wl-expand-newtext 'elmo-expand-newtext) (defalias 'wl-regexp-opt 'elmo-regexp-opt) (defun wl-region-exists-p () "Return non-nil if a region exists on current buffer." (static-if (featurep 'xemacs) (region-active-p) (and transient-mark-mode mark-active))) (defun wl-deactivate-region () "Deactivate region on current buffer" (static-if (not (featurep 'xemacs)) (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)))))) ;;; 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) (message "%s... %d%%" action (if (> total 0) (floor (* (/ current (float total)) 100)) 0))) (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))) (defun wl-progress-callback-function (label action current total) (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 (message "%s..." action)) (done (message "%s...done" action)) (t (when wl-display-progress-function (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) ",")) (static-when (fboundp 'completing-read-multiple) (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)))) (static-cond ((not (fboundp 'completing-read-multiple)) (defalias 'wl-completing-read-multiple 'wl-completing-read-multiple-1)) ((< emacs-major-version 22) (defun wl-completing-read-multiple (prompt table &optional predicate require-match initial-input hist def inherit-input-method) "Read multiple strings in the minibuffer" (if require-match (wl-completing-read-multiple-1 prompt table predicate nil initial-input hist def inherit-input-method) (wl-completing-read-multiple-2 prompt table predicate nil initial-input hist def inherit-input-method)))) (t (defalias 'wl-completing-read-multiple 'completing-read-multiple))) (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))) (require 'product) (product-provide (provide 'wl-util) (require 'wl-version)) ;;; wl-util.el ends here wanderlust-wanderlust-912c443/wl/wl-vars.el000066400000000000000000003167621262320455600207260ustar00rootroot00000000000000;;; wl-vars.el --- Variable definitions for Wanderlust. -*-coding: iso-2022-jp-unix;-*- ;; 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) (require 'custom) ;;; Customizable Variables (defgroup wl nil "Wanderlust, a news and mail reading software." :tag "Wanderlust" :link `(custom-manual ,(if (and (boundp 'current-language-environment) (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 (featurep 'xemacs)) (defconst wl-on-emacs21 (and (not wl-on-xemacs) (>= emacs-major-version 21))) (defconst wl-on-mule (featurep 'mule)) (defconst wl-on-mule3 (and wl-on-mule (or wl-on-xemacs (> emacs-major-version 19)))) (defconst wl-on-nemacs nil) ; backward compatibility. (eval-when-compile (defun-maybe locate-data-directory (a))) (defvar wl-cs-noconv (cond (wl-on-mule3 'binary) (wl-on-mule '*noconv*) (t nil))) (defvar wl-cs-autoconv (cond (wl-on-mule3 'undecided) (wl-on-mule '*autoconv*) (t nil))) (defvar wl-cs-local (cond (wl-on-mule3 'junet) (wl-on-mule '*junet*) (t nil))) (defvar wl-cs-cache wl-cs-local) (defcustom wl-from (and user-mail-address (concat (and (user-full-name) (concat (elmo-address-quote-specials (user-full-name)) " ")) "<" user-mail-address ">")) "*From string used in draft." :type 'string :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 (and (fboundp 'locate-data-directory) (locate-data-directory "wl")) (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) (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-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. XEmacs is not affected." :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-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-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.") (defvar wl-folder-check-entity-hook nil "A hook called when check 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-buffer-style 'full "Style of draft buffer except for `wl-summary-reply' and `wl-summary-forward' 'keep is to use current window, 'full is to use full frame window and 'split is to split current window. If it is a function, it is called with the draft buffer as an argument." :type '(choice (const :tag "Keep window" keep) (const :tag "Split window" split) (const :tag "Full window" full) (sexp :tag "Use Function")) :group 'wl-draft) (defcustom wl-draft-reply-buffer-style 'split "Style of draft buffer for `wl-summary-reply' and `wl-summary-forward' 'keep is to use message buffer window, 'full is to use full frame window and 'split is to split message buffer window. If it is a function, it is called with the draft buffer as an argument." :type '(choice (const :tag "Keep window" keep) (const :tag "Split window" split) (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 (boundp 'window-scroll-functions) "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 (boundp 'window-scroll-functions) "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 (and (boundp 'current-language-environment) (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 default-truncate-lines "*Truncate lines in Message Buffer." :type 'boolean :group 'wl-pref) (defcustom wl-draft-truncate-lines default-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 (if wl-on-mule 'x-ctext 'iso-8859-1) "*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 (if (boundp 'hilit-background-mode) (or hilit-background-mode 'dark) '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 1 "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 'integer :group 'wl-setting) (defcustom wl-biff-use-idle-timer nil "Non-nil to use idle timer instead of strict timer for wl-biff" :type 'boolean :group 'wl-setting) (defcustom wl-biff-state-indicator-on (if (and (featurep 'xemacs) (not (featurep 'mule))) "[Mail]" (decode-coding-string ;; Youbin mark (read "\"[\e$B\\\")\e(B]\"") (if (boundp 'MULE) '*iso-2022-jp* 'iso-2022-jp))) "String used to show biff status ON." :type 'string :group 'wl-setting) (defcustom wl-biff-state-indicator-off (if (and (featurep 'xemacs) (not (featurep 'mule))) "[--]" ;; Japanese short hyphen "[$B!>(B]") "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." :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 (and window-system (>= emacs-major-version 19)) "*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 (or (and (featurep 'xemacs) (featurep 'xpm)) wl-on-emacs21) "*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) (defcustom wl-use-dnd (and wl-on-xemacs (featurep 'dragdrop)) "If Non-nil, support dragdrop feature in XEmacs." :type 'boolean :group 'wl-pref) (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 (if (or (featurep 'xemacs) (module-installed-p 'image) (module-installed-p 'bitmap)) t) "If it is T, show graphic logo in the startup screen. You can set it to a symbol `bitmap', `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) (const :tag "bitmap (using BITMAP-MULE)" bitmap)) :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 (condition-case nil (progn (require 'epg-config) (epg-check-configuration (epg-configuration)) 'epg) (error 'pgg)) "*Which PGG library to be used." :type '(choice (const :tag "EasyPG Library" epg) (const :tag "PGG Library" pgg) (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) ;;; 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 "$B(2(B" "+") "*A string for thread branch line. It should contain one character.") (defvar wl-thread-youngest-child-str (if wl-on-mule "$B(1(B" "+") "*A string for thread branch line. It should contain one character.") (defvar wl-thread-vertical-str (if wl-on-mule "$B(-(B" "|") "*A string for thread branch line. It should contain one character.") (defvar wl-thread-horizontal-str (if wl-on-mule "$B(,(B" "-") "*A string for thread branch line. It should contain one character.") (defvar wl-thread-space-str (if wl-on-mule "$B!!(B" " ") "*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) ;; 1999-11-07: Unified with `wl-draft-config-alist'. (defvar wl-draft-prepared-config-alist nil) (make-obsolete-variable 'wl-draft-prepared-config-alist 'wl-draft-config-alist) ;; 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-912c443/wl/wl-version.el000066400000000000000000000161421262320455600214250ustar00rootroot00000000000000;;; wl-version.el --- Version information for Wanderlust. ;; 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 (interactive-p) (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 mule-version) (defvar emacs-beta-version) (defvar xemacs-codename) (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 (and (boundp 'mime-edit-insert-user-agent-field) 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) ((and (boundp 'mime-edit-user-agent-value) mime-edit-user-agent-value) (concat (product-string-verbose 'wl-version) " " mime-edit-user-agent-value)) ;; error case (t (product-string-1 'wl-version nil)))) ;; from gnus (defun wl-extended-emacs-version (&optional with-codename) "Stringified Emacs version. If WITH-CODENAME add XEmacs codename." (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)) (when (and with-codename (boundp 'xemacs-codename) xemacs-codename) (concat " - \"" xemacs-codename "\"")))) (t emacs-version))) (defun wl-extended-emacs-version2 (&optional delimiter with-codename) "Stringified Emacs version. Separate DELIMITER (default is \" \"). If WITH-CODENAME add XEmacs codename." (cond ((and (boundp 'mule-version) mule-version (string-match "\\([0-9]+\.[0-9]+\\)\\(.*$\\)" mule-version)) (format "Mule%s%s@%d.%d%s" (or delimiter " ") (match-string 1 mule-version) emacs-major-version emacs-minor-version (if with-codename (match-string 2 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)) (when (and with-codename (boundp 'xemacs-codename) xemacs-codename) (format " (%s)" xemacs-codename)))) (t emacs-version))) (defun wl-extended-emacs-version3 (&optional delimiter with-codename) "Stringified Emacs version. Separate DELIMITER (default is \" \"). If WITH-CODENAME add XEmacs codename." (cond ((and (boundp 'mule-version) mule-version (string-match "\\([0-9]+\.[0-9]+\\)\\(.*$\\)" mule-version)) (format "Emacs%s%d.%d Mule%s%s%s" (or delimiter " ") emacs-major-version emacs-minor-version (or delimiter " ") (match-string 1 mule-version) (if with-codename (match-string 2 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)) (when (and with-codename (boundp 'xemacs-codename) xemacs-codename) (format " (%s)" xemacs-codename)))) (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.") (defconst wl-version (product-version-string (product-find 'wl-version))) (make-obsolete-variable 'wl-version "use (product-version-string (product-find 'wl-version)) instead.") (defconst wl-codename (product-code-name (product-find 'wl-version))) (make-obsolete-variable 'wl-codename "use (product-code-name (product-find 'wl-version)) instead.") ;;; wl-version.el ends here wanderlust-wanderlust-912c443/wl/wl-xmas.el000066400000000000000000000515331262320455600207130ustar00rootroot00000000000000;;; wl-xmas.el --- Wanderlust modules for XEmacsen. ;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ;; Yuuichi Teranishi ;; Copyright (C) 2000, 2001, 2002, 2003 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: ;; (eval-when-compile (require 'wl-folder) (require 'wl-summary) (require 'wl-draft) (require 'wl-message) (require 'wl-highlight) (defvar-maybe wl-draft-mode-map (make-sparse-keymap)) (defalias-maybe 'toolbar-make-button-list 'ignore)) (add-hook 'wl-folder-mode-hook 'wl-setup-folder) (add-hook 'wl-folder-mode-hook 'wl-folder-init-icons) (add-hook 'wl-init-hook 'wl-biff-init-icons) (add-hook 'wl-init-hook 'wl-plugged-init-icons) (add-hook 'wl-summary-mode-hook 'wl-setup-summary) (add-hook 'wl-message-display-internal-hook 'wl-setup-message) (defvar wl-use-toolbar (if (featurep 'toolbar) 'default-toolbar nil)) (defvar wl-plugged-glyph nil) (defvar wl-unplugged-glyph nil) (defvar wl-biff-mail-glyph nil) (defvar wl-biff-nomail-glyph nil) (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.") (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.") (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.") ;; for draft toolbar. (defalias 'wl-draft-insert-signature (if (and (boundp 'mime-setup-use-signature) 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.") (defun wl-xmas-setup-toolbar (bar) (let ((dir wl-icon-directory) icon up down disabled name) (when dir (while bar (setq icon (aref (car bar) 0) name (symbol-name icon) bar (cdr bar)) (unless (boundp icon) (setq up (expand-file-name (concat name "-up.xpm") dir) down (expand-file-name (concat name "-down.xpm") dir) disabled (expand-file-name (concat name "-disabled.xpm") dir)) (if (file-exists-p up) (set icon (toolbar-make-button-list up (and (file-exists-p down) down) (and (file-exists-p disabled) disabled))) (setq bar nil dir nil))))) dir)) (defun wl-xmas-make-icon-glyph (icon-string icon-file &optional locale tag-set) (let ((glyph (make-glyph (vector 'string :data icon-string)))) (when wl-highlight-folder-with-icon (set-glyph-image glyph (vector 'xpm :file (expand-file-name icon-file wl-icon-directory)) locale tag-set 'prepend)) glyph)) (eval-when-compile (defsubst wl-xmas-setup-folder-toolbar () (and wl-use-toolbar (wl-xmas-setup-toolbar wl-folder-toolbar) (set-specifier (symbol-value wl-use-toolbar) (cons (current-buffer) wl-folder-toolbar)))) (defsubst wl-xmas-setup-summary-toolbar () (and wl-use-toolbar (wl-xmas-setup-toolbar wl-summary-toolbar) (set-specifier (symbol-value wl-use-toolbar) (cons (current-buffer) wl-summary-toolbar)))) (defsubst wl-xmas-setup-draft-toolbar () (and wl-use-toolbar (wl-xmas-setup-toolbar wl-draft-toolbar) (set-specifier (symbol-value wl-use-toolbar) (cons (current-buffer) wl-draft-toolbar))))) (defun wl-xmas-setup-message-toolbar () (and wl-use-toolbar (wl-xmas-setup-toolbar wl-message-toolbar) (set-specifier (symbol-value wl-use-toolbar) (cons (current-buffer) wl-message-toolbar)))) (defvar wl-folder-toggle-icon-list '((wl-folder-opened-glyph . wl-opened-group-folder-icon) (wl-folder-closed-glyph . wl-closed-group-folder-icon))) (eval-when-compile (defsubst wl-xmas-highlight-folder-group-line (glyph text-face numbers) (let ((start (match-beginning 1)) (end (match-end 1))) (let ((extent (or (map-extents (lambda (extent maparg) (and (eq start (extent-start-position extent)) (eq end (extent-end-position extent)) extent)) nil start start nil nil 'end-glyph) (make-extent start end)))) (set-extent-properties extent `(end-open t start-closed t invisible t)) (set-extent-end-glyph extent (or (get glyph 'glyph) (put glyph 'glyph (wl-xmas-make-icon-glyph (buffer-substring-no-properties start end) (symbol-value (cdr (assq glyph wl-folder-toggle-icon-list)))))))) (let ((inhibit-read-only t)) (when wl-use-highlight-mouse-line (put-text-property start (point-at-eol) 'mouse-face 'highlight)) (setq start end end (point-at-eol)) (if (and wl-highlight-folder-by-numbers numbers (nth 0 numbers) (nth 1 numbers) (re-search-forward "[0-9-]+/[0-9-]+/[0-9-]+" end 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) (point) 'face face)) (put-text-property start end 'face face))) (put-text-property start end 'face text-face)))))) (defun wl-highlight-folder-current-line (&optional numbers) (interactive) (save-excursion (beginning-of-line) (let (fld-name) (cond ;; opened folder group ((and (wl-folder-buffer-group-p) (looking-at wl-highlight-folder-opened-regexp)) (wl-xmas-highlight-folder-group-line 'wl-folder-opened-glyph 'wl-highlight-folder-opened-face numbers)) ;; closed folder group ((and (wl-folder-buffer-group-p) (looking-at wl-highlight-folder-closed-regexp)) (wl-xmas-highlight-folder-group-line 'wl-folder-closed-glyph '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 "[ \t]+\\([^ \t]+\\)")) (let ((start (match-beginning 1))) (let ((extent (or (map-extents (lambda (extent maparg) (and (eq start (extent-start-position extent)) (eq start (extent-end-position extent)) extent)) nil start start nil nil 'begin-glyph) (make-extent start start)))) (let (type) (set-extent-begin-glyph extent (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-glyph 'wl-folder-trash-glyph) 'glyph))) ;; draft folder ((string= fld-name wl-draft-folder) (get 'wl-folder-draft-glyph 'glyph)) ;; queue folder ((string= fld-name wl-queue-folder) (get 'wl-folder-queue-glyph 'glyph)) ;; 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-glyph" type)) 'glyph)))))) (let ((end (point-at-eol))) (when wl-use-highlight-mouse-line (put-text-property start end 'mouse-face 'highlight)) (let ((text-face (if (looking-at (format "^[ \t]*\\(?:%s\\|%s\\)" wl-folder-unsubscribe-mark wl-folder-removed-mark)) 'wl-highlight-folder-killed-face 'wl-highlight-folder-unknown-face))) (if (and wl-highlight-folder-by-numbers numbers (nth 0 numbers) (nth 1 numbers) (re-search-forward "[0-9-]+/[0-9-]+/[0-9-]+" end 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)) ;; Remove previous face. (put-text-property start (match-end 0) 'face nil) (put-text-property start (match-end 0) 'face face))) (put-text-property start end 'face text-face)))))))))) (defun wl-highlight-plugged-current-line () (interactive) (save-excursion (let ((inhibit-read-only t) extent switch) (beginning-of-line) (when (looking-at "[ \t]*\\(\\[\\([^]]+\\)\\]\\)") (setq switch (elmo-match-buffer 2)) (when (and (setq extent (extent-at (match-end 1) nil nil nil 'at)) (extent-end-glyph extent)) (delete-extent extent)) (setq extent (make-extent (match-beginning 1) (match-end 1))) (set-extent-property extent 'end-open t) (set-extent-property extent 'start-closed t) (set-extent-property extent 'invisible t) (set-extent-end-glyph extent (if (string= switch wl-plugged-plug-on) wl-plugged-glyph wl-unplugged-glyph)))))) (defun wl-plugged-set-folder-icon (folder string) (let ((string (copy-sequence string)) (len (length string)) type) (if (string= folder wl-queue-folder) (put-text-property 0 len 'begin-glyph (get 'wl-folder-queue-glyph 'glyph) string) (if (setq type (elmo-folder-type folder)) (put-text-property 0 len 'begin-glyph (get (intern (format "wl-folder-%s-glyph" type)) 'glyph) string))) string)) (defvar wl-folder-internal-icon-list ;; alist of (glyph . icon-file) '((wl-folder-nntp-glyph . wl-nntp-folder-icon) (wl-folder-imap4-glyph . wl-imap-folder-icon) (wl-folder-pop3-glyph . wl-pop-folder-icon) (wl-folder-localdir-glyph . wl-localdir-folder-icon) (wl-folder-localnews-glyph . wl-localnews-folder-icon) (wl-folder-internal-glyph . wl-internal-folder-icon) (wl-folder-multi-glyph . wl-multi-folder-icon) (wl-folder-filter-glyph . wl-filter-folder-icon) (wl-folder-archive-glyph . wl-archive-folder-icon) (wl-folder-pipe-glyph . wl-pipe-folder-icon) (wl-folder-maildir-glyph . wl-maildir-folder-icon) (wl-folder-search-glyph . wl-search-folder-icon) (wl-folder-shimbun-glyph . wl-shimbun-folder-icon) (wl-folder-file-glyph . wl-file-folder-icon) (wl-folder-access-glyph . wl-access-folder-icon) (wl-folder-trash-empty-glyph . wl-empty-trash-folder-icon) (wl-folder-draft-glyph . wl-draft-folder-icon) (wl-folder-queue-glyph . wl-queue-folder-icon) (wl-folder-trash-glyph . wl-trash-folder-icon))) (defun wl-folder-init-icons () (dolist (icon wl-folder-internal-icon-list) (unless (get (car icon) 'glyph) (put (car icon) 'glyph (wl-xmas-make-icon-glyph "" (symbol-value (cdr icon))))))) (defun wl-plugged-init-icons () (unless wl-plugged-glyph (setq wl-plugged-glyph (wl-xmas-make-icon-glyph wl-plug-state-indicator-on wl-plugged-icon) wl-unplugged-glyph (wl-xmas-make-icon-glyph wl-plug-state-indicator-off wl-unplugged-icon)) (let ((extent (make-extent nil nil))) (let ((keymap (make-sparse-keymap))) (define-key keymap 'button2 (make-modeline-command-wrapper 'wl-toggle-plugged)) (set-extent-keymap extent keymap) (set-extent-property extent 'help-echo "button2 toggles plugged status")) (setq wl-modeline-plug-state-on (cons extent wl-plugged-glyph) wl-modeline-plug-state-off (cons extent wl-unplugged-glyph))))) (defun wl-biff-init-icons () (unless wl-biff-mail-glyph (setq wl-biff-mail-glyph (wl-xmas-make-icon-glyph wl-biff-state-indicator-on wl-biff-mail-icon) wl-biff-nomail-glyph (wl-xmas-make-icon-glyph wl-biff-state-indicator-off wl-biff-nomail-icon)) (let ((extent (make-extent nil nil))) (let ((keymap (make-sparse-keymap))) (define-key keymap 'button2 (make-modeline-command-wrapper 'wl-biff-check-folders)) (set-extent-keymap extent keymap) (set-extent-property extent 'help-echo "button2 checks new mails")) (setq wl-modeline-biff-state-on (cons extent wl-biff-mail-glyph) wl-modeline-biff-state-off (cons extent wl-biff-nomail-glyph))))) (defun wl-make-date-string (&optional time) (let ((s (current-time-string time))) (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 (wl-match-string 1 s) ", " (timezone-make-date-arpa-standard s (current-time-zone))))) (defun wl-setup-folder () (and (featurep 'scrollbar) (set-specifier scrollbar-height (cons (current-buffer) 0))) (wl-xmas-setup-folder-toolbar)) (defvar dragdrop-drop-functions) (defun wl-setup-summary () (make-local-variable 'dragdrop-drop-functions) (setq dragdrop-drop-functions '((wl-dnd-default-drop-message t t))) (and (featurep 'scrollbar) (set-specifier scrollbar-height (cons (current-buffer) 0))) (wl-xmas-setup-summary-toolbar)) (defalias 'wl-setup-message 'wl-xmas-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 'button4 'wl-message-wheel-down) (define-key keymap 'button5 'wl-message-wheel-up) (define-key keymap [(shift button4)] 'wl-message-wheel-down) (define-key keymap [(shift button5)] 'wl-message-wheel-up) (set-keymap-parent wl-message-button-map keymap) (define-key wl-message-button-map 'button2 '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-prev-page) (let ((cur-buf (current-buffer)) proceed) (save-selected-window (select-window (event-window event)) (set-buffer cur-buf) (setq proceed (wl-message-next-page))) (when 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 (event-window event)) (set-buffer cur-buf) (setq proceed (wl-message-prev-page))) (when proceed (if (memq 'shift (event-modifiers event)) (wl-summary-up t) (wl-summary-prev t)))))) (defun wl-draft-overload-menubar () (when (featurep 'menubar) (add-menu-item '("Mail") "Send, Keep Editing" 'wl-draft-send t "Send Mail") (add-menu-item '("Mail") "Send Message" 'wl-draft-send-and-exit t "Send and Exit") (delete-menu-item '("Mail" "Send Mail")) (delete-menu-item '("Mail" "Send and Exit")) (add-menu-item '("Mail") "Preview Message" 'wl-draft-preview-message t "Cancel") (add-menu-item '("Mail") "Save Draft and Exit" 'wl-draft-save-and-exit t "Cancel") (add-menu-item '("Mail") "Kill Current Draft" 'wl-draft-kill t "Cancel") (delete-menu-item '("Mail" "Cancel")))) (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}" (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-x\C-s" 'wl-draft-save) (define-key wl-draft-mode-map "\C-c\C-a" 'wl-addrmgr) (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-xmas-setup-draft-toolbar) (wl-draft-overload-menubar)) (defalias 'wl-defface 'defface) (defun wl-read-event-char (&optional prompt) "Get the next event." (let ((event (next-command-event nil prompt))) (sit-for 0) ;; We junk all non-key events. Is this naughty? (while (not (or (key-press-event-p event) (button-press-event-p event))) (dispatch-event event) (setq event (next-command-event))) (cons (and (key-press-event-p event) (event-to-character event)) event))) (require 'product) (product-provide (provide 'wl-xmas) (require 'wl-version)) ;;; wl-xmas.el ends here wanderlust-wanderlust-912c443/wl/wl.el000066400000000000000000001015641262320455600177450ustar00rootroot00000000000000;;; wl.el --- Wanderlust bootstrap. ;; 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 ;; from x-face.el (unless (and (fboundp 'defgroup) (fboundp 'defcustom)) (require 'backquote) (defmacro defgroup (&rest args)) (defmacro defcustom (symbol value &optional doc &rest args) (let ((doc (concat "*" (or doc "")))) `(defvar ,symbol ,value ,doc)))) (require 'wl-vars) (require 'wl-util) (cond (wl-on-xemacs (require 'wl-xmas)) (wl-on-emacs21 (require 'wl-e21)) (t (require 'wl-mule))) (provide 'wl) ; circular dependency (require 'wl-folder) (require 'wl-summary) (require 'wl-action) (require 'wl-thread) (require 'wl-address) (require 'wl-news nil t) (wl-draft-mode-setup) (require 'wl-draft) (wl-draft-key-setup) (require 'wl-demo) (require 'wl-highlight) (eval-when-compile (require 'cl) (require 'smtp) (require 'wl-score) (require 'wl-fldmgr) (require 'wl-mime) (require 'wl-spam)) (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 (if wl-on-xemacs (defun wl-plugged-setup-mouse () (define-key wl-plugged-mode-map 'button2 'wl-plugged-click)) (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") (easy-menu-add wl-plugged-mode-menu) (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* ((count 0) (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 len 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 port plugged time) (goto-char (point-min)) (wl-plugged-redrawing-switch 0 (elmo-plugged-p)) (while alist (setq server (caaar alist) port (cdaar 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))) (when (fboundp 'pos-visible-in-window-p) (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))) (elmo-match-buffer 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)) (not (eq (preceding-char) (string-to-char " ")))) (if (re-search-backward " [^ ]+" nil t) (forward-char) (re-search-backward "^[^ ]+" nil t))) (when (looking-at "\\([^ :[]+\\):?\\[\\([^]]+\\)\\]") (setq name (elmo-match-buffer 1)) (setq switch (not (string= (elmo-match-buffer 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 (elmo-match-buffer 1))) (switch (elmo-match-buffer 2)) (name (elmo-match-buffer 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 '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) (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))) domain) (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 (append '(raise-frame select-frame) (if (fboundp 'x-focus-frame) '(x-focus-frame) '(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) (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)))) ;; for backward compatibility (defalias 'wl-summary-from-func-petname 'wl-summary-default-from) (require 'product) (product-provide (provide 'wl) (require 'wl-version)) ;;; wl.el ends here