-;;; wl.el -- Wanderlust bootstrap.
+;;; wl.el --- Wanderlust bootstrap.
;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi <teranisi@gohome.org>
;; Copyright (C) 1998,1999,2000 Masahiro MURATA <muse@ba2.so-net.ne.jp>
;; from x-face.el
(unless (and (fboundp 'defgroup)
- (fboundp 'defcustom))
+ (fboundp 'defcustom))
(require 'backquote)
(defmacro defgroup (&rest args))
(defmacro defcustom (symbol value &optional doc &rest args)
(require 'wl-xmas))
(wl-on-emacs21
(require 'wl-e21))
- (wl-on-nemacs
- (require 'wl-nemacs))
(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)
(wl-draft-mode-setup)
(require 'wl-draft)
(require 'cl)
(require 'smtp)
(require 'wl-score)
- (unless wl-on-nemacs
- (require 'wl-fldmgr))
- (if wl-use-semi
- (require 'wl-mime)
- (require 'tm-wl)))
+ (require 'wl-fldmgr)
+ (require 'wl-mime)
+ (require 'wl-spam))
(defun wl-plugged-init (&optional make-alist)
(setq elmo-plugged wl-plugged)
(setq wl-plugged t))
((eq arg 'off)
(setq wl-plugged nil))
- (t (setq wl-plugged (null wl-plugged))))
+ (t (setq wl-plugged (not wl-plugged))))
(elmo-set-plugged wl-plugged))
(setq elmo-plugged wl-plugged
wl-modeline-plug-status wl-plugged)
(let ((summaries (wl-collect-summary)))
(while summaries
(set-buffer (pop summaries))
- (elmo-folder-commit wl-summary-buffer-elmo-folder)
- (wl-summary-set-message-modified))))
+ (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 (wl-biff-start))
+ (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))
(if wl-on-xemacs
(defun wl-plugged-setup-mouse ()
(define-key wl-plugged-mode-map 'button2 'wl-plugged-click))
- (if wl-on-nemacs
- (defun wl-plugged-setup-mouse ())
- (defun wl-plugged-setup-mouse ()
- (define-key wl-plugged-mode-map [mouse-2] '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))
(setq last (elmo-dop-queue-fname (car dop-queue)))) ;; first
(while dop-queue
(when (car dop-queue)
- (setq ope (cons (elmo-dop-queue-method (car dop-queue))
- (length
+ (setq ope (cons (elmo-dop-queue-method-name (car dop-queue))
+ (length
(if (listp
- (car
+ (car
(elmo-dop-queue-arguments (car dop-queue))))
(car (elmo-dop-queue-arguments
(car dop-queue))))))))
(wl-folder-get-elmo-folder last))))
(setq alist
(wl-append-assoc-list
- (cons (car server-info) (nth 1 server-info)) ;; server port
+ server-info
(cons last operation)
alist)))
(when (car dop-queue)
(car folder-ope)
(wl-folder-get-petname (car folder-ope)))
"("
- (mapconcat
- '(lambda (ope)
- (if (> (cdr ope) 0)
- (format "%s:%d" (car ope) (cdr ope))
- (format "%s" (car ope))))
- (cdr 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 "")))))
(let ((buffer-read-only nil)
(alist plugged-alist)
(vars wl-plugged-switch-variables)
- last server port label plugged time
+ last server port stream-type label plugged time
line len qinfo column)
(erase-buffer)
(while vars
(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)))
(wl-set-string-width column line)
(wl-plugged-sending-queue-status qinfo))))
;; dop queue status
- ((setq qinfo (assoc (cons server port) wl-plugged-dop-queue-alist))
+ ((setq qinfo (assoc (list server port stream-type)
+ wl-plugged-dop-queue-alist))
(setq line
(concat
(wl-set-string-width column line)
(save-excursion
(beginning-of-line)
(cond
- ;; swtich variable
+ ;; switch variable
((bobp)
(let (variable switch name)
(goto-char cur-point)
(delete-region (match-beginning 2) (match-end 2))
(insert (wl-plugged-string switch))
(set-buffer-modified-p nil)))))
- ;; swtich plug
+ ;; switch plug
((looking-at "^\\( *\\)\\[\\([^]]+\\)\\]\\([^ \n]*\\)")
(let* ((indent (length (elmo-match-buffer 1)))
(switch (elmo-match-buffer 2))
(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...")
- (let (summary-buf)
- (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 keep-summary)
- (elmo-folder-commit wl-summary-buffer-elmo-folder)
- (unless keep-summary
- (kill-buffer (car summaries))))
- (setq summaries (cdr summaries))))))
+ (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 "Quit Wanderlust? "))
+ (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-passwd-alist-clear)
(run-hooks 'wl-exit-hook)
(wl-save-status)
(wl-folder-cleanup-variables)
(list wl-folder-buffer-name
wl-plugged-buf-name)
"\\|")))
- (if (and wl-folder-use-frame
- (> (length (visible-frame-list)) 1))
- (delete-frame))
+ (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)
- (unless wl-on-nemacs
- (remove-hook 'kill-emacs-hook 'wl-save-status))
+ (remove-hook 'kill-emacs-hook 'wl-save-status)
t)
(message "") ; empty minibuffer.
)
(defun wl-init ()
(when (not wl-init)
+ (require 'mime-setup)
(setq elmo-plugged wl-plugged)
- (unless wl-on-nemacs
- (add-hook 'kill-emacs-hook 'wl-save-status))
+ (add-hook 'kill-emacs-hook 'wl-save-status)
(wl-address-init)
(wl-draft-setup)
(wl-refile-alist-setup)
- (if wl-use-semi
- (progn
- (require 'wl-mime)
- (setq elmo-use-semi t))
- (require 'tm-wl)
- (setq elmo-use-semi nil))
+ (require 'wl-mime)
;; defined above.
(wl-mime-setup)
(fset 'wl-summary-from-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-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-no-from wl-summary-no-from-message)
(setq elmo-no-subject wl-summary-no-subject-message)
+ (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
(run-hooks 'wl-init-hook)))
(defun wl-check-environment (no-check-folder)
- (unless (featurep 'mime-setup)
- (require 'mime-setup))
- (unless wl-from
- (error "Please set `wl-from'"))
+ (unless wl-from (error "Please set `wl-from' to your mail address"))
;; Message-ID
- (unless (string-match "[^.]\\.[^.]" (or wl-message-id-domain
- (if wl-local-domain
- (concat (system-name)
- "." wl-local-domain)
- (system-name))))
- (error "Please set `wl-local-domain' to get valid FQDN"))
- (if (string-match "@" (or wl-message-id-domain
- (if wl-local-domain
- (concat (system-name)
- "." wl-local-domain)
- (system-name))))
- (error "Please remove `@' from `wl-message-id-domain'"))
- (if (string= wl-local-domain "localdomain")
- (error "Please set `wl-local-domain'"))
- (if (string= wl-message-id-domain "localhost.localdomain")
- (error "Please set `wl-message-id-domain'"))
+ (when wl-insert-message-id
+ (let ((message-id (funcall wl-message-id-function))
+ domain)
+ (unless (string-match "^<\\([^@]*\\)@\\([^@]*\\)>$" message-id)
+ (cond
+ ((string-match "@" wl-message-id-domain)
+ (error "Please remove `@' from `wl-message-id-domain'"))
+ (t
+ (error
+ "Check around `wl-message-id-function' to get valid Message-ID string"))))
+ (setq domain (match-string 2 message-id))
+ (if (or (not (string-match "[^.]\\.[^.]" domain))
+ (string= domain "localhost.localdomain"))
+ (elmo-warning
+ "Please set `wl-message-id-domain' to get valid Message-ID string."))))
;; 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))
- (trash-folder (wl-folder-get-elmo-folder wl-trash-folder))
(lost+found-folder (wl-folder-get-elmo-folder
elmo-lost+found-folder)))
- (if (not (elmo-folder-message-file-p draft-folder))
- (error "%s is not allowed for draft folder" wl-draft-folder))
(unless (elmo-folder-exists-p draft-folder)
(if (y-or-n-p
(format "Draft Folder %s does not exist, create it? "
(elmo-folder-create queue-folder)
(error "Queue Folder is not created")))
(when (not (eq no-check-folder 'wl-draft))
- (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")))
(unless (elmo-folder-exists-p lost+found-folder)
(elmo-folder-create lost+found-folder)))
;; tmp dir
- (unless (file-exists-p wl-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-tmp-dir))
- (make-directory wl-tmp-dir)
+ 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)
+ (wl-load-profile)
+ (elmo-init))
+ (let (demo-buf check)
(unless wl-init
- (if wl-demo (setq demo-buf (wl-demo))))
+ (if wl-demo (setq demo-buf (wl-demo)))
+ (setq check t))
(wl-init)
- (unless wl-init
- (condition-case nil
- (progn
- (message "Checking environment...")
- (wl-check-environment arg)
- (message "Checking environment...done"))
- (error)
- (quit)))
(condition-case obj
(progn
- (wl-plugged-init (wl-folder arg))
+ (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))
- (unless arg (wl-biff-start)))
- (error
+ (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 mapcar goes through the list below and marks the
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)