KaMailV3 で、スレッドの表示順を変える
オリジナルのスレッド表示順は、スレッドの最初のメールで順番付けされるが、それをスレッド中のメールすべてを見て決定するようにできるようにしてみた。
(defvar *kamail3-thread-order-all-mails* t "スレッド内すべてのメールを見てスレッド順を決めるときは t, オリジナルの動作にするときは nil") (defun kamail3-thread-order (key prep response-list) (let ((nval key) (rep (assoc key response-list))) (dolist (i (if (consp rep) (mapcar #'(lambda (y) (kamail3-thread-order y prep response-list)) (cdr rep)))) (if (funcall prep i nval) (setq nval i))) nval)) (defun summary-thread-parse (messages) (let (id-alist rp-alist response-list parent-list) (dolist (x messages) (let* ((num (car x)) (h (cdr x)) (message-id (junk::mail-get-header-value "message-id" h)) (in-reply-to (junk::mail-get-header-value "in-reply-to" h)) (references (junk::mail-get-header-value "references" h)) tmp ) (if (and (stringp in-reply-to) (string-match "\\(<[^>]+>\\)" in-reply-to)) (setq in-reply-to (match-string 1)) (if (stringp references) (progn (while (string-match "<[^>]+>" references) (setq tmp (match-string 0)) (setq references (substring references (match-end 0) (length references)))) (if tmp (setq in-reply-to tmp) (setq in-reply-to nil))))) (push (cons message-id num) id-alist) (push (cons num in-reply-to) rp-alist))) (dolist (x (reverse rp-alist)) (let ((num (car x)) (in-reply-to (cdr x)) parent ) (if (and in-reply-to (setq parent (cdr (assoc in-reply-to id-alist :test #'equal)))) (let ((num-childs (assoc parent response-list))) (if num-childs (push num (cdr num-childs)) (push (cons parent (list num)) response-list))) (push num parent-list)))) (if (and *kamail3-thread-order-all-mails* (query-order *query-last-query*)) (let ((prep (if (string-match "\\<NUMA\\>" (query-order *query-last-query*)) #'> #'<))) ;; スレッドの表示順を変更 (setq parent-list (stable-sort (nreverse parent-list) #'< :key #'(lambda (x) (or (kamail3-thread-order x prep response-list) x) ))) (values parent-list (nreverse response-list))) (values (nreverse parent-list) (nreverse response-list)) )))
う〜、一年ぶりの更新。一応、生きてます。。。