+2002-10-27 TAKAHASHI Kaoru <kaoru@kaisei.org>
+
+ * README, README.ja: Update stable branch.
+
2002-10-24 TAKAHASHI Kaoru <kaoru@kaisei.org>
- * INSTALL, INSTALL,ja: Update Recommended combination of MIME
+ * INSTALL, INSTALL.ja: Update Recommended combination of MIME
module package.
2002-10-02 Yoichi NAKAYAMA <yoichi@eken.phys.nagoya-u.ac.jp>
load-path \e$B$N@_Dj\e(B
================
- Emacs 20.3 \e$B0J9_$b$7$/$O\e(B XEmacs \e$B;H$C$FIaDL$K%$%s%9%H!<%k$7$?>l9g$O!"\e(B
+ Emacs 20.3 \e$B0J9_$b$7$/$O\e(B XEmacs \e$B$r;H$C$FIaDL$K%$%s%9%H!<%k$7$?>l9g$O!"\e(B
load-path \e$B$r@_Dj$9$kI,MW$O$"$j$^$;$s!#\e(B
Emacs 20.2 \e$B0JA0$r$*;H$$$J$i!"\e(BWanderlust \e$B$r\e(B install \e$B$7$?>l=j$r\e(B
** 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.
+
* Changes in 2.8.0 from 2.6.1
** Nemacs, Mule 2.3 based on Emacs 19.28 are not supported any longer.
** wl-generate-mailer-string-function \e$B$N;HMQK!$,JQ99$K$J$j$^$7$?!#\e(B
User-Agent \e$B%U%#!<%k%I$KF~$kJ8;zNs$rJV$94X?t$r;XDj$7$F2<$5$$!#\e(B
+** Reference Card (doc/wl-refcard-ja.tex) \e$B$K<g$J%-!<A`:n$rNs5s$7$^$7$?!#\e(B
+
* 2.6.1 \e$B$+$i\e(B 2.8.0 \e$B$X$NJQ99E@\e(B
** Nemacs, Mule 2.3 based on Emacs 19.28 \e$B$O%5%]!<%H$5$l$J$/$J$j$^$7$?!#\e(B
To get Wanderlust from stable branch, do following instead of above
- % cvs -d :pserver:anonymous@cvs.m17n.org:/cvs/root checkout -r wl-2_8 wanderlust
+ % cvs -d :pserver:anonymous@cvs.m17n.org:/cvs/root checkout -r wl-2_10 wanderlust
You can also view CVS repository via
\e$B$^$?!"1Q8l@lMQ$N%j%9%H$H$7$F\e(B
- Wanderlust List in English <wl-en@@lists.airs.net>
+ Wanderlust List in English <wl-en@lists.airs.net>
\e$B$b$"$j$^$9\e(B(\e$B$3$A$i$KEj9F$5$l$?%a%C%;!<%8$OA0<T$K$bG[Aw$5$l$^$9\e(B)\e$B!#\e(B
\e$B0BDjHG$N;^$+$i\e(B Wanderlust \e$B$r<h$j=P$9>l9g$O!"0J2<$NMM$K$7$F$/$@$5$$!#\e(B
- % cvs -d :pserver:anonymous@cvs.m17n.org:/cvs/root checkout -r wl-2_8 wanderlust
+ % cvs -d :pserver:anonymous@cvs.m17n.org:/cvs/root checkout -r wl-2_10 wanderlust
CVS repository \e$B$O0J2<$+$i$b;2>H$G$-$^$9!#\e(B
-* tasks in 2.9.x
+* tasks in 2.11.x
** enable to define folder icons in elmo.el
** reconsider the structure of msgdb and make behavior faster
-* 2.9.x \e$B$N\e(B TODO
+* 2.11.x \e$B$N\e(B TODO
** elmo.el \e$B$G%U%)%k%@$N%"%$%3%s$rDj5A$G$-$k$h$&$K$9$k\e(B
** msgdb \e$B$N9=B$$r8+D>$7!"9bB.2=$r$O$+$k\e(B
@node Editing Header, Editing Message Body, Usage of Draft Mode, Usage of Draft Mode
@subsection \e$B%X%C%@$NJT=8\e(B
+\e$B<B:]$KAw?.A`:n$r9T$J$&$^$G$G$"$l$P!"\e(B@samp{--text follows this line--}
+\e$B$h$j>e$N%X%C%@NN0h$O<+M3$KJT=8$9$k$3$H$,$G$-$^$9!#\e(B
+
\e$B=i4|>uBV$G$O\e(B @samp{To:} \e$B$K%+!<%=%k$,$"$j$^$9!#Aw?.Aj<j$N%"%I%l%9$rF~NO$7\e(B
\e$B$F$/$@$5$$!#%"%I%l%9$rF~NO$9$k:]$K$O!"\e(B@kbd{@key{TAB}} \e$B$GJd40$,$G$-$^$9!#\e(B
@node Editing Message Body, Dynamical Message Re-arrangement, Editing Header, Usage of Draft Mode
@subsection \e$B%a%C%;!<%8$NJT=8\e(B
+\e$B@bL@$9$k$^$G$b$J$$$G$9$,!"%a%C%;!<%8K\J8$NJT=8$O4pK\E*$KDL>o$NJ8>O:n@.$H\e(B
+\e$BF1MM$K9T$J$$$^$9!#K\J8$O\e(B @samp{--text follows this line--} \e$B$N9T$h$j2<$K\e(B
+\e$B5-=R$7$^$9!#\e(B(\e$BCm0U!'\e(B @samp{--text follows this line--} \e$B$N9T$O$$$8$i$J$$$G\e(B
+\e$B2<$5$$!#\e(B)
+
\e$B%^%k%A%Q!<%H$NJT=8$O\e(B SEMI \e$B$N\e(B MIME \e$BJT=8%b!<%I$rMxMQ$7$F$$$^$9!#\e(B
\e$BJT=8$NJ}K!$K$D$$$F$O3F%Q%C%1!<%8IUB0$N%I%-%e%a%s%H$r;2>H$7$F$/$@$5$$!#\e(B
@xref{MIME-Edit, , ,mime-ui-ja, a MIME user interface for GNU Emacs}.
@cindex Split messages
@code{elmo-split} \e$B$r;H$&$H!"%U%)%k%@\e(B @code{elmo-split-folder} \e$BFb$N\e(B
-\e$B%a%C%;!<%8$rFCDj$N5,B'$K=>$C$F\e(B procmail \e$BIw$K?6$jJ,$1$k$3$H$,$G$-$^$9!#\e(B
-\e$B$3$N5!G=$r;H$&$K$O!"$^$:\e(B @file{~/.emacs} \e$B$K0J2<$N$h$&$K@_Dj$7$F2<$5$$!#\e(B
+\e$B%a%C%;!<%8$rFCDj$N5,B'$K=>$C$F\e(B @command{procmail} \e$BIw$K?6$jJ,$1$k$3$H$,\e(B
+\e$B$G$-$^$9!#\e(B \e$B$3$N5!G=$r;H$&$K$O!"$^$:\e(B @file{~/.emacs} \e$B$K0J2<$N$h$&$K@_Dj\e(B
+\e$B$7$F2<$5$$!#\e(B
@lisp
(autoload 'elmo-split "elmo-split" "Split messages on the folder." t)
;; @r{wanderlust \e$B%a!<%j%s%0%j%9%H$+$i$N%a!<%k$r\e(B @samp{%wanderlust} \e$B$X\e(B}
;; @r{\e$B$=$7$FB3$1$F$=$l0J2<$N5,B'$bI>2A$9$k!#\e(B}
((equal x-ml-name "wanderlust") "%wanderlust" continue)
- ;; @r{Yahoo \e$BMxMQ<T$+$i$N%a%C%;!<%8$r\e(B @samp{+yahoo-{username}} \e$B$X\e(B}
+ ;; @r{Yahoo \e$BMxMQ<T$+$i$N%a%C%;!<%8$r\e(B @samp{+yahoo-@{username@}} \e$B$X\e(B}
((match from "\\(.*\\)@@yahoo\\.com")
"+yahoo-\\1")
;; @r{\e$B%^%C%A$7$J$+$C$?;D$j$r\e(B @samp{+inbox} \e$B$X\e(B}
@end lisp
\e$B$H$$$&0lAH$G$9!#\e(B
-\e$BBh0l$NMWAG\e(B @samp{\e$B>r7o\e(B} \e$B$O\e(B sexp \e$B$G$9!#>\$7$/$O$9$08e$G@bL@$7$^$9!#\e(B
+\e$BBh0l$NMWAG\e(B @samp{\e$B>r7o\e(B} \e$B$O\e(B S \e$B<0$G$9!#=q<0$K$D$$$F$O$9$08e$G@bL@$7$^$9!#\e(B
\e$BBhFs$NMWAG\e(B @samp{\e$B%U%)%k%@\e(B} \e$B$O%a%C%;!<%8$N?6$jJ,$1@h$N%U%)%k%@L>$G$9!#\e(B
\e$B$b$7Bh;0$NMWAG\e(B @code{continue} \e$B$,%7%s%\%k$H$7$FM?$($i$l$k$H!"\e(B
\e$B$=$N>r7o$,K~$?$5$l$?$H$7$F$b?6$jJ,$15,B'$NI>2A$rB3$1$^$9!#\e(B
@node Editing Header, Editing Message Body, Usage of Draft Mode, 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.
@node Editing Message Body, Dynamical Message Re-arrangement, Editing Header, Usage of Draft Mode
@subsection Editing Messages
+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}.
@cindex Split messages
You can use @code{elmo-split} to split message in folder
-@code{elmo-split-folder} a la procmail according to some specified rules.
-To use this feature, set as follows in your @file{~/.emacs} at first.
+@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)
;; @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}}}
+ ;; @r{Store messages from Yahoo user into @samp{+yahoo-@{username@}}}
((match from "\\(.*\\)@@yahoo\\.com")
"+yahoo-\\1")
;; @r{Store unmatched mails into @samp{+inbox}}
(@samp{CONDITION} @samp{FOLDER} [@code{continue}])
@end lisp
-The 1st element @samp{CONDITION} is a sexp. Its grammar will be
-explained below. The 2nd element @samp{FOLDER} is the name of the folder
-to split messages into. When the 3rd element @code{continue} is
-specified as symbol, evaluating rules is not stopped even when the
-condition is satisfied.
+The 1st element @samp{CONDITION} is a balanced expression (sexp). Its
+grammar will be explained below. The 2nd element @samp{FOLDER} is the
+name of the folder to split messages into. 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.
* elmo-filter.el (elmo-folder-diff): Use 'flag' instead of 'mark'.
+2002-11-06 Yoichi NAKAYAMA <yoichi@eken.phys.nagoya-u.ac.jp>
+
+ * 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 <yoichi@eken.phys.nagoya-u.ac.jp>
+
+ * elmo-imap4.el: Remove Nemacs hack, replace `elmo-read' by `read'.
+ * elmo-util.el: Ditto.
+
2002-10-26 Yuuichi Teranishi <teranisi@gohome.org>
* elmo-version.el (elmo-version): Up to 2.11.0.
"search %s") flag))
'search)))
-(static-cond
- ((fboundp 'float)
- ;; Emacs can parse dot symbol.
- (defvar elmo-imap4-rfc822-size "RFC822\.SIZE")
- (defvar elmo-imap4-rfc822-text "RFC822\.TEXT")
- (defvar elmo-imap4-rfc822-header "RFC822\.HEADER")
- (defvar elmo-imap4-rfc822-size "RFC822\.SIZE")
- (defvar elmo-imap4-header-fields "HEADER\.FIELDS")
- (defmacro elmo-imap4-replace-dot-symbols ()) ;; noop
- (defalias 'elmo-imap4-fetch-read 'read)
- )
- (t
- ;;; For Nemacs.
- ;; Cannot parse dot symbol.
- (defvar elmo-imap4-rfc822-size "RFC822_SIZE")
- (defvar elmo-imap4-header-fields "HEADER_FIELDS")
- (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-fetch-read (buffer)
- (with-current-buffer buffer
- (let ((beg (point))
- token)
- (when (re-search-forward "[[ ]" nil t)
- (goto-char (match-beginning 0))
- (setq token (buffer-substring beg (point)))
- (cond ((string= token "RFC822.SIZE")
- (intern elmo-imap4-rfc822-size))
- ((string= token "RFC822.HEADER")
- (intern elmo-imap4-rfc822-header))
- ((string= token "RFC822.TEXT")
- (intern elmo-imap4-rfc822-text))
- ((string= token "HEADER\.FIELDS")
- (intern elmo-imap4-header-fields))
- (t (goto-char beg)
- (elmo-read (current-buffer))))))))))
+(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.
(defun elmo-imap4-parse-capability (string)
(if (string-match "^\\*\\(.*\\)$" string)
- (elmo-read
+ (read
(concat "(" (downcase (elmo-match-string 1 string)) ")"))))
(defun elmo-imap4-clear-login (session)
(defun elmo-imap4-parse-response ()
"Parse a IMAP command response."
(let (token)
- (case (setq token (elmo-read (current-buffer)))
+ (case (setq token (read (current-buffer)))
(+ (progn
(skip-chars-forward " ")
(list 'continue-req (buffer-substring (point) (point-max)))))
- (* (case (prog1 (setq token (elmo-read (current-buffer)))
+ (* (case (prog1 (setq token (read (current-buffer)))
(elmo-imap4-forward))
(OK (elmo-imap4-parse-resp-text-code))
(NO (elmo-imap4-parse-resp-text-code))
(LSUB (list 'lsub (elmo-imap4-parse-data-list)))
(SEARCH (list
'search
- (elmo-read (concat "("
+ (read (concat "("
(buffer-substring (point) (point-max))
")"))))
(STATUS (elmo-imap4-parse-status))
;; Added
(NAMESPACE (elmo-imap4-parse-namespace))
(CAPABILITY (list 'capability
- (elmo-read
+ (read
(concat "(" (downcase (buffer-substring
(point) (point-max)))
")"))))
(ACL (elmo-imap4-parse-acl))
- (t (case (prog1 (elmo-read (current-buffer))
+ (t (case (prog1 (read (current-buffer))
(elmo-imap4-forward))
(EXISTS (list 'exists token))
(RECENT (list 'recent token))
(t (list 'garbage (buffer-string)))))))
(t (if (not (string-match elmo-imap4-seq-prefix (symbol-name token)))
(list 'garbage (buffer-string))
- (case (prog1 (elmo-read (current-buffer))
+ (case (prog1 (read (current-buffer))
(elmo-imap4-forward))
(OK (progn
(setq elmo-imap4-parsing nil)
(cond ((search-forward "PERMANENTFLAGS " nil t)
(list 'permanentflags (elmo-imap4-parse-flag-list)))
((search-forward "UIDNEXT " nil t)
- (list 'uidnext (elmo-read (current-buffer))))
+ (list 'uidnext (read (current-buffer))))
((search-forward "UNSEEN " nil t)
- (list 'unseen (elmo-read (current-buffer))))
+ (list 'unseen (read (current-buffer))))
((looking-at "UIDVALIDITY \\([0-9]+\\)")
(list 'uidvalidity (match-string 1)))
((search-forward "READ-ONLY" nil t)
(let (element list)
(while (not (eq (char-after (point)) ?\)))
(elmo-imap4-forward)
- (let ((token (elmo-imap4-fetch-read (current-buffer))))
+ (let ((token (read (current-buffer))))
(elmo-imap4-forward)
(setq element
(cond ((eq token 'UID)
(list 'uid (condition-case nil
- (elmo-read (current-buffer))
+ (read (current-buffer))
(error nil))))
((eq token 'FLAGS)
(list 'flags (elmo-imap4-parse-flag-list)))
((eq token (intern elmo-imap4-rfc822-text))
(list 'rfc822text (elmo-imap4-parse-nstring)))
((eq token (intern elmo-imap4-rfc822-size))
- (list 'rfc822size (elmo-read (current-buffer))))
+ (list 'rfc822size (read (current-buffer))))
((eq token 'BODY)
(if (eq (char-before) ?\[)
(list
(while (not (eq (char-after (point)) ?\)))
(setq status
(cons
- (let ((token (elmo-read (current-buffer))))
+ (let ((token (read (current-buffer))))
(cond ((eq token 'MESSAGES)
- (list 'messages (elmo-read (current-buffer))))
+ (list 'messages (read (current-buffer))))
((eq token 'RECENT)
- (list 'recent (elmo-read (current-buffer))))
+ (list 'recent (read (current-buffer))))
((eq token 'UIDNEXT)
- (list 'uidnext (elmo-read (current-buffer))))
+ (list 'uidnext (read (current-buffer))))
((eq token 'UIDVALIDITY)
(and (looking-at " \\([0-9]+\\)")
(prog1 (list 'uidvalidity (match-string 1))
(goto-char (match-end 1)))))
((eq token 'UNSEEN)
- (list 'unseen (elmo-read (current-buffer))))
+ (list 'unseen (read (current-buffer))))
(t
(message
"Unknown status data %s in mailbox %s ignored"
(nconc
(copy-sequence elmo-imap4-extra-namespace-alist)
(elmo-imap4-parse-namespace-subr
- (elmo-read (concat "(" (buffer-substring
- (point) (point-max))
- ")"))))))
+ (read (concat "(" (buffer-substring
+ (point) (point-max))
+ ")"))))))
(defun elmo-imap4-parse-namespace-subr (ns)
(let (prefix delim namespace-alist default-delim)
(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 FOLDER [continue]\)
+\(CONDITION ACTION [continue]\)
The 1st element CONDITION is a sexp which consists of following.
When a symbol is specified, it is evaluated.
-The 2nd element FOLDER is the name of the folder to split messages into.
+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.
(repeat (string :tag "folder name")))
:group 'elmo)
+(defcustom elmo-split-default-action 'noop
+ "Default action for messages which pass all rules."
+ :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
(let ((elmo-inhibit-display-retrieval-progress t)
(count 0)
(fcount 0)
- msgs fname target-folder failure)
+ (default-rule `((t ,elmo-split-default-action)))
+ msgs action target-folder failure delete-substance
+ record-log log-string)
(message "Splitting...")
(elmo-folder-open-internal folder)
(setq msgs (elmo-folder-list-messages folder))
nil (current-buffer) 'unread))
(setq elmo-split-message-entity (mime-parse-buffer))
(catch 'terminate
- (dolist (rule elmo-split-rule)
+ (dolist (rule (append elmo-split-rule default-rule))
(setq elmo-split-match-string-internal nil)
(when (elmo-split-eval (current-buffer) (car rule))
- (if elmo-split-match-string-internal
- (setq fname (elmo-expand-newtext
- (nth 1 rule)
- elmo-split-match-string-internal))
- (setq fname (nth 1 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)
- (condition-case nil
- (progn
- (setq target-folder (elmo-make-folder fname))
- (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? "
- fname)))
- (elmo-folder-create target-folder)))
- (elmo-folder-open-internal target-folder)
- (elmo-folder-append-buffer target-folder 'unread)
- (elmo-folder-close-internal target-folder))
- (error (setq failure t)
- (incf fcount)))
- (unless failure
+ (setq failure nil
+ delete-substance nil
+ record-log nil
+ log-string nil)
+ (cond
+ ((stringp action)
+ (condition-case nil
+ (progn
+ (setq target-folder (elmo-make-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)
+ (elmo-folder-append-buffer target-folder 'unread)
+ (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))))
- (incf count))
- (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
- " Test: "
- " Folder: ")
- fname "/0" "\n")
- reharsal)
+ (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")
+ ((function action)
+ (format " Test: function:%s\n"
+ (symbol-name 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)))
(filename newname &optional ok-if-already-exists)
(copy-file filename newname ok-if-already-exists t)))
-(defalias 'elmo-read 'read)
-
(defmacro elmo-set-work-buf (&rest body)
"Execute BODY on work buffer. Work buffer remains."
(` (save-excursion
(defun elmo-condition-parse-search-value ()
(cond
((looking-at "\"")
- (elmo-read (current-buffer)))
+ (read (current-buffer)))
((or (looking-at "yesterday") (looking-at "lastweek")
(looking-at "lastmonth") (looking-at "lastyear")
(looking-at "[0-9]+ *daysago")
+2002-10-27 TAKAHASHI Kaoru <kaoru@kaisei.org>
+
+ * test-dist.el (test-version-readme): New testcase.
+ (test-wl-demo-copyright-notice): Ditto.
+
2002-10-24 TAKAHASHI Kaoru <kaoru@kaisei.org>
* check-modules.el (check-modules-flim-content-transfer-encoding):
(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 (beta only)
+(luna-define-method test-wl-demo-copyright-notice ((case test-dist))
+ (require 'wl-demo)
+ (when (string= (wl-version-status) "beta")
+ (lunit-assert
+ (string-match
+ (format-time-string "%Y" (current-time))
+ wl-demo-copyright-notice))))
-2002-10-29 Yuuichi Teranishi <teranisi@gohome.org>
+2002-11-07 Yuuichi Teranishi <teranisi@gohome.org>
- * wl-message.el (wl-message-get-original-buffer): Avoid
- 'Selecting deleted buffer' error when original buffer is killed.
+ * 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-10-28 Yuuichi Teranishi <teranisi@gohome.org>
wl-message-buffer-prefetch-move-spec-unplugged-alist): Abolish.
(wl-message-buffer-prefetch-get-next): Follow the change above.
+2002-11-01 Tomotaka SUWA <cooper@saitama.fujimic.fujisankei-g.co.jp>
+
+ * 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 <teranisi@gohome.org>
+
+ * wl-message.el (wl-message-get-original-buffer): Avoid
+ 'Selecting deleted buffer' error when original buffer is killed.
+
2002-10-26 Yuuichi Teranishi <teranisi@gohome.org>
* wl-version.el (wl-version): Changed codename.
(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)
(setq addr-tuple (car address-list))
(setq cl
(cons
- (cons (nth 0 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)">")))
+ (wl-address-make-completion-entry 0 addr-tuple)
cl))
;; nickname completion.
- (setq cl
- (cons
- (cons (nth 1 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)">")))
- cl))
+ (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)
(let (buf-name header-alist-internal)
(setq buf-name
- (wl-draft-create-buffer
- (or
- (eq this-command 'wl-draft)
- (eq this-command 'wl-summary-write)
- (eq this-command 'wl-summary-write-current-folder)
- (eq this-command 'wl-folder-write-current-folder))
- parent-folder))
+ (wl-draft-create-buffer parent-folder))
(unless (cdr (assq 'From header-alist))
(setq header-alist
(goto-char (point-max))))
buf-name))
-(defun wl-draft-create-buffer (&optional full parent-folder)
+(defun wl-draft-create-buffer (&optional parent-folder)
(let* ((draft-folder (wl-folder-get-elmo-folder wl-draft-folder))
(parent-folder (or parent-folder (wl-summary-buffer-folder-name)))
(summary-buf (wl-summary-get-buffer parent-folder))
- buf-name file-name num change-major-mode-hook)
+ buf-name file-name num change-major-mode-hook
+ (reply-or-forward (or (eq this-command 'wl-summary-reply)
+ (eq this-command 'wl-summary-forward))))
(if (not (elmo-folder-message-file-p draft-folder))
(error "%s folder cannot be used for draft folder" wl-draft-folder))
(setq num (elmo-max-of-list
(elmo-message-file-name
(wl-folder-get-elmo-folder wl-draft-folder)
num))))
+ ;; switch-buffer according to draft buffer style.
(if wl-draft-use-frame
(switch-to-buffer-other-frame buf-name)
- (switch-to-buffer buf-name))
+ (if reply-or-forward
+ (case wl-draft-reply-buffer-style
+ (split
+ (split-window-vertically)
+ (other-window 1)
+ (switch-to-buffer buf-name))
+ (keep
+ (switch-to-buffer buf-name))
+ (full
+ (delete-other-windows)
+ (switch-to-buffer buf-name))
+ (t
+ (if (functionp wl-draft-reply-buffer-style)
+ (funcall wl-draft-reply-buffer-style buf-name)
+ (error "Invalid value for wl-draft-reply-buffer-style"))))
+ (case wl-draft-buffer-style
+ (split
+ (when (and (eq major-mode 'wl-summary-mode)
+ wl-message-buffer
+ (buffer-live-p wl-message-buffer)
+ (get-buffer-window wl-message-buffer))
+ (delete-window (get-buffer-window wl-message-buffer)))
+ (split-window-vertically)
+ (other-window 1)
+ (switch-to-buffer buf-name))
+ (keep
+ (switch-to-buffer buf-name))
+ (full
+ (delete-other-windows)
+ (switch-to-buffer buf-name))
+ (t (if (functionp wl-draft-buffer-style)
+ (funcall wl-draft-buffer-style buf-name)
+ (error "Invalid value for wl-draft-buffer-style"))))))
(set-buffer buf-name)
(if (not (string-match (regexp-quote wl-draft-folder)
(buffer-name)))
(rename-buffer (concat wl-draft-folder "/" (int-to-string num))))
- (if (or (eq wl-draft-reply-buffer-style 'full)
- full)
- (delete-other-windows))
(auto-save-mode -1)
(wl-draft-mode)
(make-local-variable 'truncate-partial-width-windows)
;; 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-reply-buffer-style 'split))
+ (wl-draft-buffer-style switch-function))
(when (eq switch-function 'switch-to-buffer-other-window)
(when (one-window-p t)
(if (window-minibuffer-p) (other-window 1))
(t
(message "Uncheck(unplugged) \"%s\"" entity)))))
(if ret-val
- (message "Checking \"%s\" is done."
+ (message "Checking \"%s\" is done"
(if (consp entity) (car entity) entity)))
(run-hooks 'wl-folder-check-entity-hook)
ret-val))
(wl-message-select-buffer wl-message-buffer)
(set-buffer mes-buf)
(goto-char (point-min))
- (unless wl-draft-use-frame
- (split-window-vertically)
- (other-window 1))
(when (setq mes-buf (wl-message-get-original-buffer))
(wl-draft-reply mes-buf arg summary-buf number)
(unless without-setup-hook
(wl-summary-redisplay-internal folder number))
(setq mes-buf wl-message-buffer)
(wl-message-select-buffer mes-buf)
- (unless wl-draft-use-frame
- (split-window-vertically)
- (other-window 1))
;; get original subject.
(if summary-buf
(save-excursion
: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
- "'split or 'full."
- :type '(radio (const split)
- (const full))
+ "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-queue-save-variables