[Mew-dist 08085] Re: Goto next/prev message with same subject

根本 篤志 (Atsushi Nemoto) nemoto at example.com
1999年 3月 15日 (月) 13:05:55 JST


>>>>> On Fri, 12 Mar 1999 20:42:11 +0900, 根本 篤志 (Atsushi Nemoto) <nemoto at example.com> said:

>>> 「カレントメッセージと同じサブジェクトを持つ前後のメッセージに移動」
>>> というコマンドがあると嬉しいです。

一応動くものができました。

(define-key mew-summary-mode-map "\M-p"
  'mew-summary-same-subject-up)
(define-key mew-summary-mode-map "\M-n"
  'mew-summary-same-subject-down)

として試してますが、それなりに使えるようです。ただし Form の %S 部分が
短いとまともに動かないかもしれません。

処理手順そのものがかなりインチキな上に見よう見まねのコーディングなので、
とても見苦しい代物だと思います。添削していただけると嬉しいです。
---
根本 篤志 (Atsushi Nemoto)
E-Mail: anemo at example.com (Home)
E-Mail: nemoto at example.com (Office)  <= アドレスが変わりました

-------------- next part --------------
;; 同じサブジェクトのメッセージに移動
(defun mew-summary-same-subject-up ()
  "Search this subject to above then display."
  (interactive)
  (mew-summary-same-subject 'up))

(defun mew-summary-same-subject-down ()
  "Search this subject to below then display."
  (interactive)
  (mew-summary-same-subject 'down))

(defun mew-summary-same-subject (direction)
  (mew-summary-msg-or-part
   (let (subject)
     (mew-summary-goto-message)
     (mew-summary-display)
     ;; カレントメッセージのサブジェクトを取得
     (save-excursion
       (set-buffer (mew-buffer-message))
       (setq subject (mew-header-get-value mew-subj:)))
     (if (not subject)
	 (error "No searchable subject."))
     ;; サマリバッファのカレント行を見て検索文字列を切り詰め
     (save-excursion
       (end-of-line)
       (let ((limit (point)))
	 (beginning-of-line)
	 (while (and (not (equal subject ""))
		     (not (search-forward subject limit t)))
	   (setq subject (substring subject 0 -1)))))
     ;; ML のラベル、"Re: " を削除
     (while (or (string-match "\\[[a-zA-Z_0-9-]+[ :][0-9]+\\]\\s-*" subject)
		(string-match (concat mew-reply-regex "\\s-*") subject))
       (setq subject (replace-match "" nil  nil subject)))
     ;; "Re: " が付く事を考えて短くする
     (if (> (length subject) 24)
	 (setq subject (substring subject 0 -4)))
     (if (equal subject "")
	 (error "No searchable subject."))
     ;; 同じサブジェクトをもつメッセージが見つかるまで
     (let ((newsubject "")
	   (orgpoint (point)))
       (while (not (string-match (regexp-quote subject) newsubject))
	 (if (eq direction 'down)
	     (end-of-line)
	   (beginning-of-line))
	 ;; サマリバッファで検索
	 (if (not (let ((case-fold-search nil))
		    (if (eq direction 'down)
			(search-forward subject nil t)
		      (search-backward subject nil t))))
	     (progn
	       (goto-char orgpoint)
	       (mew-summary-display)
	       (error (concat "Subject not found: " subject))))
	 (mew-summary-display)
	 ;; 見つけたメッセージのサブジェクトを取得
	 (save-excursion
	   (set-buffer (mew-buffer-message))
	   (setq newsubject (mew-header-get-value mew-subj:))))))))


Mew-dist メーリングリストの案内