私が、勝手に設定しているあたり。ちなみに、IMAP も News もつかってません。
;; サマリ表示バッファの高さ (既定値: 10) (setq *kamail-height-summary* 7) ;; 署名表示バッファの高さ (既定値: 10) (setq *kamail-signature-height* 4) ;; 添付ファイルの初期保存フォルダ (setq *kamail-attach-save-directory* "~/temp") ;; header の表示順を変更 ;; To or Cc が長いと、Date が見えなくなるため (setq *kamail-header-check-list* '(("subject" . *kamail-view-subject-forecolor*) ("from" . *kamail-view-from-forecolor*) ("date" . *kamail-view-subject-forecolor*) ("to" . *kamail-view-to-forecolor*) ("cc" . *kamail-view-to-forecolor*) ("bcc" . *kamail-view-to-forecolor*) ("newsgroups" . *kamail-view-to-forecolor*) ("reply-to" . *kamail-view-replyto-forecolor*) ("x-mailer" . *kamail-view-xmailer-forecolor*) ("x-newsreader" . *kamail-view-xmailer-forecolor*) ("x-yzzy-version" . *kamail-view-xmailer-forecolor*) ("user-agent". *kamail-view-xmailer-forecolor*) ))
カスタマイズしたものを .kamail に書くと、バージョンナップ時などに面倒なので、 km-cust.l として保存し、.kamail には、
;; 雑多なカスタマイズを呼ぶ (load-file "~/KaMail/km-cust.l")
としている。
起動時に buffer-bar を消し、終了時に復活させる。
OHKUBO Hiroshi さんに教えてもらった。
しかし、いまは、バッファタブを非表示にしているので、使っていない。
;; 起動時の処理 (add-hook '*kamail-mode-hook* #'(lambda () (hide-command-bar 'buffer-bar))) ;; 終了時の処理 (add-hook '*kamail-exit-hook* #'(lambda () (show-command-bar 'buffer-bar)))
View モードでは、改行マークを消し、行カーソルを表示する。
;; View モードの処理 (add-hook '*kamail-view-mode-hook* 'my-kamail-set-local-window-flags) (add-hook '*kamail-multipart-mode-hook* 'my-kamail-set-local-window-flags) ;; 制御文字等表示設定 (defun my-kamail-set-local-window-flags () (let ((buffer (selected-buffer))) ;改行マークを消す (set-local-window-flags buffer *window-flag-newline* nil) ;行カーソルを表示 (set-local-window-flags buffer *window-flag-cursor-line* t)))
喜多さんの flex-fill を使えるようにする。服部さんに教えてもらった。
(require "flex-fill") (pushnew 'kamail *flexible-fill-mode-list*) (add-hook '*kamail-draft-mode-hook* #'(lambda () (setq fill-column 62) (auto-fill-mode t)))
この設定をする場合は、KaMail の折り返し機能を使わないようにしておいたほうがいいかも。
(setq *kamail-draft-fold-width* nil)
Toy's わがまま Version を参考に。
;; フォルダ選択 (define-key *kamail-list-map* #\g 'kamail-close-folder) ;; メール見る or 次の行へ (or 次のメッセージへ) (defun kamail-view-mail-or-next-line-or-message () (interactive) (let ((num (kamail-summary-getnum))) (kamail-select-view) (if (and (boundp 'kamail-number) (equal kamail-number num)) (unless (scroll-window 1) ;次の行を有効にすると、メール末尾から次のメッセージに移動 ;(kamail-next-message) ) (progn (kamail-select-window-summary) (kamail-view-mail)))) (kamail-select-window-summary)) (define-key *kamail-list-map* #\C-Down 'kamail-view-mail-or-next-line-or-message) ;; メール見る or 前の行へ (or 前のメッセージへ) (defun kamail-view-mail-or-previous-line-or-message () (interactive) (let ((num (kamail-summary-getnum))) (kamail-select-view) (if (and (boundp 'kamail-number) (equal kamail-number num)) (unless (scroll-window -1) ;次の行を有効にすると、メール先頭から前のメッセージに移動 ;(kamail-previous-message) ) (progn (kamail-select-window-summary) (kamail-view-mail)))) (kamail-select-window-summary)) (define-key *kamail-list-map* #\C-Up 'kamail-view-mail-or-previous-line-or-message) ;; 標準ソート (define-key *kamail-list-map* '(#\C-c #\s #\x) 'kamail-summary-sort-dialog) ;; 件名でソート and 番号振り直し (defun kamail-special-sort-by-subject () (interactive) (kamail-summary-sort-by-subject) (kamail-renumber)) (define-key *kamail-list-map* '(#\C-c #\s #\s) 'kamail-special-sort-by-subject) ;; 日付でソート and 番号振り直し (defun kamail-special-sort-by-date () (interactive) (kamail-summary-sort-by-date) (kamail-renumber)) (define-key *kamail-list-map* '(#\C-c #\s #\d) 'kamail-special-sort-by-date) ;; 特別製メール閲覧 ;; RET でメール閲覧時は、サマリウィンドウ(?)にヘッダを表示 (defun kamail-special-view-mail () (interactive) (kamail-view-mail) (kamail-header-toggle) (set-buffer-fold-width t) (beginning-of-buffer) (other-window)) (define-key *kamail-list-map* #\RET 'kamail-special-view-mail)
;; Folder モードへ移動 (define-key *kamail-view-map* #\g 'kamail-select-window-folder) (define-key *kamail-multipart-map* #\g 'kamail-select-window-folder) ;; 添付ファイル保存フォルダを開く (defun open-attach-save-directory () (interactive) (filer *kamail-attach-save-directory* t nil nil)) (define-key *kamail-view-map* '(#\C-x #\d) 'open-attach-save-directory) (define-key *kamail-multipart-map* '(#\C-x #\d) 'open-attach-save-directory)
;; ドラフト作成 (define-key *kamail-folder-map* #\w 'kamail-prepare-draft-as-mail) (define-key *kamail-list-map* #\w 'kamail-prepare-draft-as-mail) (define-key *kamail-view-map* #\w 'kamail-prepare-draft-as-mail) (define-key *kamail-multipart-map* #\w 'kamail-prepare-draft-as-mail)
(defun my-kamail-pop3-get () (interactive) (let ((newmail (kamail-pop3-get))) (if (< 0 newmail) (message-box (concat (format nil "~D" newmail) "通のメールを受信した。") "亀手紙") (message-box "受信すべきメールはないもよう。" "亀手紙") ))) (define-key *kamail-folder-map* #\i 'my-kamail-pop3-get) (define-key *kamail-list-map* #\i 'my-kamail-pop3-get) (define-key *kamail-view-map* #\i 'my-kamail-pop3-get) (define-key *kamail-multipart-map* #\i 'my-kamail-pop3-get)
KaMail で POP 受信時(前)に、サーバから時間を取得し、PC の時刻を合わせる。 [xyzzy:05781](oowada さん)より。
まず、oowada さんのぺーじから、 rtimee10a.lzh を頂き、rtime.exe を xyzzy.exe と同じフォルダに設置する。 その後、以下の設定をしておくとメールを受信するたびに、時刻を合わせてくれる。
サーバの初期設定は、カシオさんのになっているが、つながらなかったので time-nw.nist.gov にしてみた。(もっと近くにあるのかもしれないけど知らない。)
(add-hook '*kamail-pop3-get-pre-hook* #'(lambda () (call-process "rtime.exe")))
もしかすると、ダイヤルアップな環境では、*kamail-pop3-get-post-hook* でないといけないかも。(環境がないのでわからない。)
rtime.exe のログは、同じフォルダにできる rtime.log に記録されるみたい。
人にメールを覗かれそうになったときに b 。
(defun my-kamail-clear-view-buffer () (interactive) (let ((p-window (buffer-name (selected-buffer)))) (kamail-select-window-view) (kamail-view-create-buffer) (cond ((string= p-window "*KaMail: Folder*") (kamail-select-window-folder)) (t (kamail-select-window-summary)) ))) (define-key *kamail-folder-map* #\b 'my-kamail-clear-view-buffer) (define-key *kamail-list-map* #\b 'my-kamail-clear-view-buffer) (define-key *kamail-view-map* #\b 'my-kamail-clear-view-buffer) (define-key *kamail-multipart-map* #\b 'my-kamail-clear-view-buffer)
自動受信の設定と、受信間隔の設定をツールバーからしてみた。
受信時の IME 制御は、 Shinichi Sugiyama さん のを使わせて頂いて、KaMail の関数 kamail-pop3-auto-check をかきかえてみた。
パスワードを保存していない場合は、起動時に ON にしないで、 起動後にツールバーから ON にしたほうがいいかも。 なぜならば、パスワードを保存していない場合に、自動受信を ON にすると、 *kamail-pop3-check-time* 秒経った後にパスワードを聞かれるので、 気付かずにいると、初回受信状態のまま止まっていたりして悲しいため。
;; 自動受信を起動時に ON (kamail-pop3-auto-check-start) ;; 受信間隔(秒単位) (setq *kamail-pop3-check-time* 300) ;; kamail-pop3-auto-check 改 ;; IME の状態を保つため (defun kamail-pop3-auto-check () (interactive) (let ((orgdef (symbol-function 'toggle-ime))) (setf (symbol-function 'toggle-ime) #'(lambda (arg) nil)) (let ((new (kamail-pop3-get))) (when (< 0 new) (message-box (format nil "~D通受信しました。" new)))) (setf (symbol-function 'toggle-ime) orgdef))) ;; kamail-pop3-auto-check-toggle 改 ;; start する前に一度 kamail-pop3-auto-check ;; パスワードを保存していない場合のために (defun kamail-pop3-auto-check-toggle () (interactive) (if *kamail-pop3-auto-check* (kamail-pop3-auto-check-stop) (progn (kamail-pop3-auto-check) (kamail-pop3-auto-check-start)))) ;; 受信間隔を設定 (defun set-kamail-pop3-get-interval () (interactive) (let ((auto *kamail-pop3-auto-check*)) (if auto (kamail-pop3-auto-check-stop)) (message (format nil "現在間隔: ~:D" *kamail-pop3-check-time*)) (let ((interval (read-integer "受信間隔[秒]: "))) (if (< 29 interval) (progn (setq *kamail-pop3-check-time* interval) (if auto (kamail-pop3-auto-check-start))) (message-box "それはあまりにも短すぎない?" "亀手紙" '(:ok :information)))))) ;; ツールバー (define-command-bar 'my-kamail-tool-bar "亀手紙(&K)") (defun update-kamail-pop3-auto-check () (and km::*kamail-pop3-auto-check* :check)) (defun my-kamail-tool-bar () (create-tool-bar 'my-kamail-tool-bar (merge-pathnames "toolbar.bmp" (etc-path)) '( ("自動受信" 44 kamail-pop3-auto-check-toggle update-kamail-pop3-auto-check) ("受信間隔" 54 set-kamail-pop3-get-interval) ))) ;; 起動時設定 (add-hook '*kamail-mode-hook* #'(lambda () ;ツールバーを表示 (show-command-bar 'my-kamail-tool-bar))) ;; 終了時設定 (add-hook '*kamail-exit-hook* #'(lambda () ;自動受信を止める (kamail-pop3-auto-check-stop) ;ツールバーを非表示 (hide-command-bar 'my-kamail-tool-bar)))
思わず、*kamail-pop3-check-time* を 0 にして、自動受信してしまった (-_-;) ので、 できないようにもしておいた。
自動受信をする場合は、*kamail-read-after-get* (POPサーバーから持ってきたらすぐ読む) を t にしておかない方が良いと思う。
ツールバーを削除する場合は、ESC ESCして、以下を実行すれば良いと思う。
(delete-command-bar 'km::my-kamail-tool-bar)
普段わけあって一括受信をしないのだけど、「メール選択取込み」がメンドーだったので、 つまらないものをつくってみた。*kamail-pop3-get-list* にないサーバも登録できる。
*kamail-pop3-get-list* と同じ書式で設定する。使わない場合は、nil にしておく。
;; 鯖(グループ)Aの設定 (setq *kamail-pop3-get-list-a* '(("serverA.domain" "userA" nil t))) ;; 鯖(グループ)Bの設定 (setq *kamail-pop3-get-list-b* '( ("serverA.domain" "userA" nil t) ("serverB.domain" "userB" nil t) )) ;; 鯖(グループ)Cの設定 (setq *kamail-pop3-get-list-c* nil)
TAB a 〜 TAB c でそれぞれ受信する。Folder モード、Summary モードからのみ使用可。
;; 受信には、my-kamail-pop3-get を使っている。 ;; 個々の鯖から受信 (defun my-kamail-pop3-get-s (&optional li) (let (*kamail-pop3-get-list*) (and li (setq *kamail-pop3-get-list* li)) (my-kamail-pop3-get))) ;; 鯖(グループ)Aから受信 (defun my-kamail-pop3-get-a () (interactive) (my-kamail-pop3-get-s *kamail-pop3-get-list-a*)) (define-key *kamail-folder-map* '(#\C-i #\a) 'my-kamail-pop3-get-a) (define-key *kamail-list-map* '(#\C-i #\a) 'my-kamail-pop3-get-a) ;; 鯖(グループ)Bから受信 (defun my-kamail-pop3-get-b () (interactive) (my-kamail-pop3-get-s *kamail-pop3-get-list-b*)) (define-key *kamail-folder-map* '(#\C-i #\b) 'my-kamail-pop3-get-b) (define-key *kamail-list-map* '(#\C-i #\b) 'my-kamail-pop3-get-b) ;; 鯖(グループ)Cから受信 (defun my-kamail-pop3-get-c () (interactive) (my-kamail-pop3-get-s *kamail-pop3-get-list-c*)) (define-key *kamail-folder-map* '(#\C-i #\c) 'my-kamail-pop3-get-c) (define-key *kamail-list-map* '(#\C-i #\c) 'my-kamail-pop3-get-c)
KaMail のアドレス帳に、700 程のアドレス (会社で使われているメーラのアドレス帳を変換したもの:これがないと仕事でつらい) を登録したら、異常に動作が遅くなってしまった。 さらに、「メニュー項目が多すぎます」のエラーが多発し、悲しい状況が続いた。 思い悩んだ挙句、キーワードファイルとしてアドレスリストを別形式で持つことにした。 こんなことをしても良いのだろうかと思いつつも、とりあえず軽快な環境が戻ってきたのでうれしい。 頻繁に変更しない大きなアドレス帳を使うときにはいいかも。
ADDRESS ファイルは、以下のような形式で記述し、etc フォルダに設置する。
friend@domain (ともだち) someone@domain (だれか) ...
C-. で補完する。
;; アドレスファイル (defvar *my-kamail-keyword-file* "ADDRESS") (defvar *my-kamail-keyword-hash-table* nil) (defvar *my-kamail-completion-list* nil) ;; 起動時設定 (add-hook '*kamail-mode-hook* #'(lambda () (and *my-kamail-keyword-file* (null *my-kamail-keyword-hash-table*) (setq *my-kamail-keyword-hash-table* (load-keyword-file *my-kamail-keyword-file* t))) (when *my-kamail-keyword-hash-table* (make-local-variable 'keyword-hash-table) (setq keyword-hash-table *my-kamail-keyword-hash-table*)))) ;; アドレス補完 (C-.) (defun my-kamail-completion () (interactive) (or *my-kamail-completion-list* (setq *my-kamail-completion-list* (make-list-from-keyword-table *my-kamail-keyword-hash-table*)) (return-from my-kamail-completion nil)) (let ((opoint (point))) (when (skip-syntax-spec-backward "w_.") (let ((from (point))) (goto-char opoint) (do-completion from opoint :list *my-kamail-completion-list*))))) (define-key *kamail-draft-map* '#\C-. 'my-kamail-completion)
バッファバーやバッファリストに KaMail 関係のバッファを出さないようにする。 これで良いのかわからないが、一応動いているみたい。
;kamail.l (setq *kamail-buffer-prefix* " *KaMail: ") (setq *kamail-buffer-folder* (concat *kamail-buffer-prefix* "Folder*")) (setq *kamail-buffer-summary* (concat *kamail-buffer-prefix* "Summary*")) (setq *kamail-buffer-view* (concat *kamail-buffer-prefix* "Viewer*")) (setq *kamail-buffer-multipart* (concat *kamail-buffer-prefix* "Multipart*")) (setq *kamail-buffer-get* (concat *kamail-buffer-prefix* "Get*")) (setq *kamail-buffer-draft* (concat *kamail-buffer-prefix* "Draft*")) (setq *kamail-buffer-send* (concat *kamail-buffer-prefix* "Send*")) (setq *kamail-buffer-temp* (concat *kamail-buffer-prefix* "Temp*")) (setq *kamail-buffer-folder-select* (concat *kamail-buffer-prefix* "Folder Select*")) (setq *kamail-buffer-signature* (concat *kamail-buffer-prefix* "Signature*")) (setq *kamail-buffer-group* (concat *kamail-buffer-prefix* "Group*")) (setq *kamail-buffer-grep* (concat *kamail-buffer-prefix* "Grep*")) (setq *kamail-buffer-header* (concat *kamail-buffer-prefix* "Header*")) ;imap4.l (setq *imap4-buffer-prefix* " *IMAP ") (setq *imap4-buffer-output* (concat *imap4-buffer-prefix* "OUTPUT*")) (setq *imap4-buffer-temp* (concat *imap4-buffer-prefix* "TEMP*")) ;nntp.l (setq *nntp-buffer-prefix* " *NNTP ") (setq *nntp-buffer-output* (concat *nntp-buffer-prefix* "OUTPUT*")) (setq *nntp-buffer-temp* (concat *nntp-buffer-prefix* "TEMP*")) ;pop3.l (setq *pop3-buffer-prefix* " *POP3 ") (setq *pop3-buffer-output* (concat *pop3-buffer-prefix* "OUTPUT*")) (setq *pop3-buffer-temp* (concat *pop3-buffer-prefix* "TEMP*")) ;local.l (setq *local-buffer-prefix* " *LOCAL ") (setq *local-buffer-output* (concat *local-buffer-prefix* "OUTPUT*")) (setq *local-buffer-temp* (concat *local-buffer-prefix* "TEMP*")) ;spool.l (setq *spool-buffer-prefix* " *SPOOL ") (setq *spool-buffer-output* (concat *spool-buffer-prefix* "OUTPUT*")) (setq *spool-buffer-temp* (concat *spool-buffer-prefix* "TEMP*")) ;archive.l (setq *archive-buffer-prefix* " *ARCHIVE ") (setq *archive-buffer-output* (concat *archive-buffer-prefix* "OUTPUT*")) (setq *archive-buffer-temp* (concat *archive-buffer-prefix* "TEMP*")) ;cache.l (setq *cache-buffer-prefix* " *CACHE ") (setq *cache-buffer-output* (concat *cache-buffer-prefix* "OUTPUT*")) (setq *cache-buffer-temp* (concat *cache-buffer-prefix* "TEMP*"))
右クリックメニューから「URL を開く」を抜き出したつもり。
(defun kamail-open-url () (interactive) (let (url) (save-excursion (skip-chars-backward *kamail-url-chars*) (when (looking-at ed::*url-scheme-regexp*) (setq url (buffer-substring (point) (progn (goto-char (match-end 0)) (skip-chars-forward *kamail-url-chars*) (point)))))) (when url ;---------------------------------------- ; 1. browser.dll & browserex.l を使う場合 ;(bx::navigate url :position bx::XPIS_BOTTOM :size 200) ; 2. 標準ブラウザを使う場合 ;(shell-execute url t) ; 3. www-mode を使う場合 (user::www-open-url url) ;---------------------------------------- ))) (define-key *kamail-view-map* '(#\C-c #\o) 'kamail-open-url) (define-key *kamail-multipart-map* '(#\C-c #\o) 'kamail-open-url)
ついでに URL をコピー。
(defun kamail-copy-url () (interactive) (let (url) (save-excursion (skip-chars-backward *kamail-url-chars*) (when (looking-at ed::*url-scheme-regexp*) (setq url (buffer-substring (point) (progn (goto-char (match-end 0)) (skip-chars-forward *kamail-url-chars*) (point)))))) (when url (copy-to-clipboard url)))) (define-key *kamail-view-map* '(#\C-c #\c) 'kamail-copy-url) (define-key *kamail-multipart-map* '(#\C-c #\c) 'kamail-copy-url)
i --- まとめてメール受信(受信結果をダイヤログで表示)
w --- ドラフト作成
b --- View バッファをクリア
TAB a --- サーバ(グループ)Aから受信
TAB b --- サーバ(グループ)Bから受信
TAB c --- サーバ(グループ)Cから受信
RET --- 閲覧&サマリウィンドウにヘッダを表示
i --- まとめてメール受信(受信結果をダイヤログで表示)
g --- フォルダウィンドウへ移動
(g g --- まとめてメール受信)
w --- ドラフト作成
b --- View バッファをクリア
TAB a --- サーバ(グループ)Aから受信
TAB b --- サーバ(グループ)Bから受信
TAB c --- サーバ(グループ)Cから受信
C-c s x --- ソート
C-c s s --- 件名でソート and 番号振り直し
C-c s d --- 日付でソート and 番号振り直し
C-Down --- メール見る or 次の行へ (or 次のメッセージへ)
C-Up --- メール見る or 前の行へ (or 前のメッセージへ)
i --- まとめてメール受信(受信結果をダイヤログで表示)
g --- フォルダウィンドウへ移動
(g g --- まとめてメール受信)
w --- ドラフト作成
b --- View バッファをクリア
C-x d --- 添付ファイル保存フォルダを開く
C-c o --- URL を開く
C-c c --- URL をコピー
C-. --- アドレス補完
オリジナルのファイルに対して修正個所を適用した後、 そのファイルだけバイトコンパイルしておけばよいと思う。
・kamail-grep したときに正規表現が効いてない
・kamail-grep-view-mail すると xyzzy から応答がなくなることがある
ことに対する修正。[xyzzy:08571](Yoichi Katogi さん)より。
*** kamail-grep.l Sun Dec 2 13:26:36 2001
--- kamail-grep.l Mon Dec 9 13:38:00 2002
***************
*** 69,74 ****
--- 69,78 ----
(ed::*grep-highlight-match* *kamail-grep-highlight-match*)
(ed::*grep-regexp-search* t)
(ed::*grep-subdir* t))
+ (declare (special ed::*grep-case-fold-search*
+ ed::*grep-highlight-match*
+ ed::*grep-regexp-search*
+ ed::*grep-subdir*))
(switch-to-buffer "*grep*")
(erase-buffer (selected-buffer))
(ed::scan-files *kamail-grep-last-word* "[0-9]*" dir)
ビューバッファで数字を含むヘッダフィールド名が色分けされないことへの修正。
[xyzzy:08656-08657] (Yoichi Katogi さん)より。
kamail-0.0.2.5 2003/01/26 23:50:24 版(version は、03/01/25)との diff をとってみた。
これでいいかな?
*** kamail-view.l Sun Jan 26 06:05:14 2003
--- kamail-view.l Wed Feb 19 23:32:16 2003
***************
*** 554,560 ****
(narrow-to-region (point-min) (point))
(goto-char (point-min))
(loop
! (when (looking-at "^[-a-zA-Z]+[ \t]*:")
(set-text-attribute (match-beginning 0) (match-end 0) 'field
:foreground *kamail-view-field-forecolor*))
(or (forward-line 1) (return))
--- 554,560 ----
(narrow-to-region (point-min) (point))
(goto-char (point-min))
(loop
! (when (looking-at "^[\x21-\x39\x3B-\x7E]+[ \t]*:")
(set-text-attribute (match-beginning 0) (match-end 0) 'field
:foreground *kamail-view-field-forecolor*))
(or (forward-line 1) (return))