最近、世知辛い世の中になってきて、会社で MUA は Becky! をこういう設定で使うように、というお触れが出ている。ちなみに「こういう設定」というのは
だ。Becky! のグループアドレスというのは、hoge で送信したら、hoge に登録してある fooさんも barさんもみんな同時に送信するというものらしいが、それと同等のものは現在の Mew はそもそも対応していないと思うので前者二つに対応してみた
(defvar mew-draft-check-whom-always-ask nil
"宛先に関係なくいつでも質問するときは non-nil")
(defvar mew-draft-check-whom-attaches t
"添付ファイルのチェックをしない時は nil")
(defvar mew-buffer-whom "*Mew whom*")
(add-hook 'mew-make-message-hook 'mew-draft-check-whom)
(defadvice mew-header-make-message (around ask-address activate)
(mew-draft-check-whom)
ad-do-it)
(defadvice mew-header-send-message (around ask-address activate)
(mew-draft-check-whom)
ad-do-it)
(defun mew-draft-check-whom-ask (addr case)
(or mew-draft-check-whom-always-ask
(progn
(setq addr (downcase (or (mew-addrstr-parse-address addr) addr)))
(let ((domain (and (string-match "@\\(.+\\)$" addr)
(downcase (mew-match-string 1 addr)))))
(not (or (not domain)
(member addr (mew-safe-addresses case))
(member domain (member domain (mew-safe-domains case)))))))))
(defun mew-draft-check-whom ()
"Display expanded short names and attaches in other window."
(interactive)
(let ((buf (current-buffer))
(case (mew-tinfo-get-case))
(destination-list
(mew-uniq-list (append '("From:") mew-destination:-list
'("Reply-to:" "Newsgroups:" "Fcc:"
"Resent-To:" "Resent-Cc:"
"Resent-Dcc:" "Resent-Bcc:"))))
(wincfg (current-window-configuration))
(ask nil)
to-cc field head pos attaches)
(mapc (lambda (list)
(setq to-cc (cons (cons list (mew-header-get-value list)) to-cc)))
destination-list)
(setq to-cc (nreverse to-cc))
(when (and mew-draft-check-whom-attaches
(setq pos (next-single-property-change (point-min) 'mew-attach-begin)))
(goto-char pos)
(forward-line 1)
(setq pos (point))
(mew-attach-next)
(while (not (= (point) pos))
(setq pos (point))
(when (mew-attach-not-line012-1-dot)
(let* ((nums (mew-syntax-nums))
(syntax (mew-syntax-get-entry mew-encode-syntax nums))
(name (mew-syntax-get-file syntax))
(cdpl (mew-syntax-get-cdp syntax))
(ctl (mew-syntax-get-ct syntax))
(cdpname (mew-syntax-get-filename cdpl ctl)))
(unless (string-match "/$" name)
(if (or (not cdpname) (string= name cdpname))
(setq attaches (cons (cons nums name) attaches))
(setq attaches (cons (cons nums (format "%s (%s)" cdpname name)) attaches))))))
(mew-attach-next))
(setq attaches (nreverse attaches)))
(message "Checking recipients ... ")
(get-buffer-create mew-buffer-whom)
(switch-to-buffer-other-window mew-buffer-whom)
(mew-erase-buffer)
(while to-cc
(setq field (car (car to-cc)))
(setq head (cdr (car to-cc)))
(setq to-cc (cdr to-cc))
(when head
(setq head (mew-replace-white-space head))
(setq head (mew-split head ?,))
(insert (format "%s %s\n" field (car head)))
(setq ask (or ask (mew-draft-check-whom-ask (car head) case)))
(setq head (cdr head))
(while (setq field (car head))
(setq ask (or ask (mew-draft-check-whom-ask (car head) case)))
(when (string-match "^ +" field)
(setq field (substring field (match-end 0))))
(insert (format "\t%s\n" field))
(setq head (cdr head)))))
(goto-char (point-min))
(while (re-search-forward ",\\([ \t]*[^\n]\\)" nil t)
(goto-char (match-beginning 1))
(insert "\n")
(when (looking-at "^[ \t]+")
(delete-region (match-beginning 0) (match-end 0)))
(insert "\t"))
(goto-char (point-min))
(insert (propertize "ヘッダーチェック" 'face 'mew-face-header-warning))
(insert "\n")
(mew-highlight-header-region (point) (point-max))
(when attaches
(goto-char (point-max))
(insert "\n")
(insert (propertize "添付ファイル" 'face 'mew-face-header-warning))
(insert "\n")
(dolist (alist attaches)
(let ((nums (car alist))
(file (cdr alist)))
(insert (format "%s\t%s\n"
(propertize (concat (mapconcat 'number-to-string nums ".") ".")
'face 'mew-face-header-marginal)
(propertize file 'face 'mew-face-header-from))))))
(goto-char (point-min))
(pop-to-buffer buf)
(mew-buffers-setup (buffer-name))
;;
(when (or ask attaches)
(pop-to-buffer mew-buffer-whom)
(unless (pos-visible-in-window-p (point-max) (selected-window))
(delete-other-windows))
(unwind-protect
(unless (y-or-n-p "Sure? ")
(cond
((and ask attaches)
(error "Edit address or attaches"))
(ask
(error "Edit address"))
(attaches
(error "Edit attaches"))
(t
(error "Edit something"))))
(set-window-configuration wincfg)))))
;; 必要ないかも
(add-hook 'mew-send-hook
(lambda ()
(when (get-buffer mew-buffer-whom)
(kill-buffer mew-buffer-whom))))
(defvar archive-extract-passwd nil)
(make-variable-buffer-local 'archive-extract-passwd)
(defadvice archive-zip-extract (around zip-passwd activate compile)
(if (equal (car archive-zip-extract) "unzip")
(let ((args (append (cdr archive-zip-extract) (list archive name)))
(passwd (with-current-buffer (get-buffer archive-superior-buffer)
archive-extract-passwd))
enc)
(if passwd
(setq enc t)
(with-temp-buffer
(let ((case-fold-search nil)
(coding-system-for-write
(or (and (boundp 'archive-file-name-coding-system)
archive-file-name-coding-system)
file-name-coding-system))
(coding-system-for-read
(or (and (boundp 'archive-file-name-coding-system)
archive-file-name-coding-system)
file-name-coding-system)))
;; zipinfo mode
(apply 'call-process "unzip" nil (current-buffer) nil
(list "-Z" archive name))
(goto-char (point-min))
(when (and (re-search-forward "[0-9] \\([tTbB]\\)[^ ] " nil t)
(string= (upcase (match-string 1)) (match-string 1)))
(setq enc t)))))
(when enc
(unless passwd
(setq passwd (setq passwd (read-passwd "ZIP passwd: "))))
(setq args (append (list "-P" passwd) args)))
(let ((coding-system-for-write
(or (and (boundp 'archive-file-name-coding-system)
archive-file-name-coding-system)
file-name-coding-system))
(coding-system-for-read
(or (and (boundp 'archive-file-name-coding-system)
archive-file-name-coding-system)
file-name-coding-system)))
(apply 'call-process "unzip" nil
t ;; emacs-24 (if stderr-file (list t stderr-file) t)
nil args))
(if (zerop (buffer-size))
(with-current-buffer (get-buffer archive-superior-buffer)
(when enc
(message "may be password wrong"))
(setq archive-extract-passwd nil)
(setq ad-return-value nil))
(with-current-buffer (get-buffer archive-superior-buffer)
(setq archive-extract-passwd passwd)
(setq ad-return-value t))))
ad-do-it))
(defadvice archive-extract-by-stdout (before fix-lha activate)
(when (string= "lha" (car command))
(let ((tmp name))
(setq name "")
(while (string-match "\\\\" tmp)
(setq name (concat name (substring tmp 0 (match-beginning 0)) "/"))
(setq tmp (substring tmp (match-end 0))))
(setq name (concat name tmp))
(setq name (encode-coding-string name default-file-name-coding-system)))))
(add-hook 'archive-zip-mode-hook 'my-archive-set-cs)
(add-hook 'archive-lzh-mode-hook 'my-archive-set-cs)
(defun my-archive-set-cs ()
(make-local-variable 'file-name-coding-system)
(setq file-name-coding-system 'shift_jis))
(when (< emacs-major-version 23)
(defadvice archive-summarize-files (before set-multibyte activate compile)
(set-buffer-multibyte t)))