(define-key mew-summary-mode-map "t1" 'mew-get-msgid-inrepto)
(define-key mew-summary-mode-map "t2" 'mew-put-msgid-inrepto)
(define-key mew-summary-mode-map "t3" 'mew-remove-msgid-inrepto)
(defvar mew-get-msgid nil)
(defun mew-get-msgid-inrepto ()
"親の Message-ID を取得する"
(interactive)
(setq mew-get-msgid nil)
(if (mew-summary-case1)
(save-excursion
(mew-summary-goto-message)
(beginning-of-line)
(when (looking-at "[^\r]+\r \\(<[^>]+>\\) ")
(setq mew-get-msgid (mew-match-string 1)))
(if mew-get-msgid
(message "Message-Id: %s" mew-get-msgid)
(message "No Message-Id: detect")))
(message "Not execute this buffer")))
(defun mew-put-msgid-inrepto ()
"親の Message-ID を In-Reply-To に無理やり付ける"
(interactive)
(if (not (mew-summary-or-virtual-p))
(message "This command can be used in Mew.")
(let (addrep)
(save-excursion
(mew-summary-not-in-queue
(mew-summary-not-in-draft
(mew-summary-goto-message)
(let* ((fld (mew-summary-folder-name))
(msg (mew-summary-message-number))
(file (mew-expand-folder fld msg))
exist pos end)
(if (and (looking-at "[^\r]+\r \\(<[^>]+>\\) ")
(string= mew-get-msgid (mew-match-string 1)))
(message "Same Message-ID detect.")
(if (null mew-get-msgid)
(message "No Prev Message-Id:")
(when (y-or-n-p (format "Add In-Reply-To: %s? " mew-get-msgid))
(with-temp-buffer
(mew-frwlet
mew-cs-text-for-read mew-cs-text-for-write
(insert-file-contents file)
(setq exist (or (mew-header-get-value "In-Reply-To:")
(mew-header-get-value "References:")))
(if (and exist
(not (y-or-n-p "Exist In-Reply-To: or References: Replace? ")))
(message "Exist In-Reply-To: or References:")
(goto-char (point-min))
(if (re-search-forward "\n\\(\n\\)" nil t)
(setq end (match-beginning 1))
(setq end (point-max)))
(goto-char (point-min))
(if (re-search-forward "^In-Reply-To:" end t)
(progn
(beginning-of-line)
(insert "X-Mew-")
(beginning-of-line))
(goto-char (point-min))
(if (re-search-forward "Message-ID:" end t)
(beginning-of-line)
(if (re-search-forward "\n\\(\n\\)" nil t)
(goto-char (match-beginning 1)))))
(mew-header-insert "In-Reply-To:"
(concat mew-get-msgid " (Inserted Mew)")
'nofold)
(mew-fake-inrep-sub file fld msg)))
(setq addrep t)))))))))
(when addrep
(when (mew-thread-p)
(let ((lines (count-lines (point-min) (point-max))))
(mew-summary-make-thread)
;; "mt" じゃなさそうなので、再表示する
(when (= lines (count-lines (point-min) (point-max)))
(mew-summary-make-thread))))
(message "Add In-Reply-To: %s done" mew-get-msgid)))))
(defun mew-remove-msgid-inrepto ()
"無理やりつけた In-Reply-To をはずす"
(interactive)
(if (not (mew-summary-or-virtual-p))
(message "This command can be used in Mew.")
(let (modp)
(save-excursion
(mew-summary-not-in-queue
(mew-summary-not-in-draft
(mew-summary-goto-message)
(let ((fld (mew-summary-folder-name))
(msg (mew-summary-message-number))
file xinrep mewinrep pos end)
(when (and fld msg)
(setq file (mew-expand-folder fld msg))
(with-temp-buffer
(mew-frwlet
mew-cs-text-for-read mew-cs-text-for-write
(insert-file-contents file)
(set-buffer-modified-p nil)
(goto-char (point-min))
(if (re-search-forward "\n\\(\n\\)" nil t)
(setq end (match-beginning 1))
(setq end (point-max)))
(goto-char (point-min))
(setq xinrep (mew-header-get-value "X-Mew-In-Reply-To:"))
(when (setq mewinrep (mew-header-get-value "In-Reply-To:"))
(setq mewinrep (string-match " (Inserted Mew)$" mewinrep)))
(goto-char (point-min))
(when (and mewinrep
(re-search-forward "^In-Reply-To:" end t))
(goto-char (match-beginning 0))
(setq pos (point))
(forward-line 1)
(mew-header-goto-next)
(delete-region pos (point)))
(goto-char (point-min))
(when (and xinrep
(re-search-forward "^\\(X-Mew-\\)In-Reply-To:" end t))
(delete-region (match-beginning 1) (match-end 1)))
(when (setq modp (buffer-modified-p))
(mew-fake-inrep-sub file fld msg)))))))))
(if modp
(let (lines)
(when (mew-thread-p)
(setq lines (count-lines (point-min) (point-max)))
(mew-summary-make-thread)
(when (= lines (count-lines (point-min) (point-max)))
(mew-summary-make-thread)))
(message "Remove In-Reply-To inserted by Mew."))
(message "No In-Reply-To inserted by Mew.")))))
(defun mew-fake-inrep-sub (file fld msg)
(write-region (point-min) (point-max) file nil 'nomsg)
(save-excursion
(if (get-buffer fld)
(set-buffer fld)
(mew-summary-visit-folder fld)
(while (processp mew-summary-buffer-process)
(sit-for 1)
(discard-input)))
(unless (mew-sinfo-get-scan-form)
(mew-sinfo-set-scan-form (mew-summary-scan-form fld))))
(set-buffer-multibyte t)
(let ((width (1- (mew-scan-width)))
(vec (if (fboundp 'mew-pop-scan-header)
(mew-pop-scan-header)
(mew-scan-header))))
(mew-scan-set-folder vec fld)
(mew-scan-set-message vec msg)
(mew-scan-insert-line fld vec width msg nil))
(set-buffer fld)
(mew-summary-folder-cache-save))