[Mew-dist 521] new mew-sort.el
Takashi P.KATOH
p-katoh at example.com
1997年 2月 25日 (火) 19:17:02 JST
かとぺ@東北大です。
やっと修論も終ったので、久々に mew-sort.el に手を加えてみま
した。
方針として、昔々のメールの、
From: Kazuhiko Yamamoto 山本和彦 <kazu at example.com>
Subject: Re: sort by subject, author etc.
> Sort なんですが、date 以外のフィールドと region を指定できるようにしよ
> うと思いますが、ちょっと悩んでいます。
> (1) フィールド毎にキーバインディングするのは嫌なので、C-u S ってすると、
> フィールドを聞いてくるようにする。subject とか補完が効くようにする。
> (2) とすると、どうやってリージョンを指定すればいいかな? C-u がもう使
> えないから。
この 2 つをなるべく満すようにということで、次のようにしてみ
ました。
- "S" とすると sort する field を聞いてくる。
- C-u で region に対して sort を行なう。
つまり最低でも 2 ストローク ("S" + [Ret]) 必要になります。
ついでに mark による sort もできるようにしました。
(パッチをあてた状態で "mS" です。ちょっと打ちにくいけど。)
もちろん、field の入力には補完が効きます。
ということで最後に付けます。
パッチは for mew-1.54 (たぶん 1.51 以降) です。
しかし、作ってみたらいろいろ問題が出てきました。
(1) mark が全部消えてしまう
しょうがないのかなぁ。
(2) mew-summary-sort-fields に入ってないと datefield として
sort できない。
(それ以前に mew-summary-sort-fields の形式が格好悪い...)
(3) user が mew-summary-sort-field を加えたいときはどうしま
しょう...
# もともとはその為につくったはずだったんだけど... f(^^;
新しい variable を作ろうかとも思ったのですが、いいネーミング
が思いつかなくって...
それとも「hook で設定する」でいいのかな?
(4) Range の指定ができない
あった方が嬉しいですか?
(4) については、C-u S としたときには Range を聞いてきて、
[Ret] だけだと region に対して行なうようにすればいいかな、と
思ってますが、いかがでしょう?
(で、Range の入力後に field を聞いてくる)
特に (2) (3) についてなにかありましたらお願いいたします (_o_)
--
東北大学大学院 情報科学研究科 白鳥研究室 加藤 貴司
p-katoh at example.com / Takashi P.KATOH
http://www.shiratori.riec.tohoku.ac.jp/~p-katoh/MAIL/
-------------- next part --------------
;;; mew-sort.el
;;;
;;; Copyright (C) 1996 and 1997 Takashi P.KATOH
;;;
;;; This emacs lisp library confirms
;;; GNU GENERAL PUBLIC LICENSE Version 2.
;;;
;;; Author: Takashi P.KATOH <p-katoh at example.com>
;;; Kazuhiko Yamamoto <kazu at example.com>
;;; Created: Febraury 6, 1996
;;; Revised: Febraury 25, 1997
;;;
(defconst mew-sort-version "mew-sort.el version 0.02")
(require 'mew)
(defvar mew-summary-sort-fields
'(("Date" t) ("Subject") ("From") ("To") ("Newsgroups") ("Posted" t))
"*Field list for mew-summary-sort.
(\"Foo\" t) means sortm will be executed with \"-datefield\" option.")
(defvar mew-summary-sort-last-field nil
"Latest field used by mew-summary-sort.")
(defun mew-summary-sort-body (msgs &optional method)
(let* ((folder (buffer-name))
(completion-ignore-case t)
(field
(completing-read
(concat "Sort " method (if method " ") folder " by?"
(if mew-summary-sort-last-field
(concat " (default " mew-summary-sort-last-field "): ")
": ")) mew-summary-sort-fields)))
(setq field (if (string-equal field "") mew-summary-sort-last-field field)
mew-summary-sort-last-field field)
(if (null (mew-summary-exclusive-p))
()
(if (mew-summary-mark-exist-p (list mew-mark-rmm mew-mark-refile))
(if (mew-y-or-n-p
"Marked messages exist. Process mark before scan? ")
(mew-summary-exec)))
(setq mew-summary-buffer-process t)
(message "Sorting %s by %s ... " folder field)
(if (cdr (assoc field mew-summary-sort-fields))
(apply 'call-process mew-prog-sortm nil nil nil
(append (list folder) msgs (list "-datefield" field)))
(apply 'call-process mew-prog-sortm nil nil nil
(append (list folder)
msgs
(list "-textfield" field "-limit" "0"))))
(message "Sorting %s by %s ... done" folder field)
(setq mew-summary-buffer-process nil)
(let ((buffer-read-only nil)) (erase-buffer));; for update
(mew-summary-scan-body folder (mew-input-range folder))
)
))
(defun mew-summary-sort (&optional arg)
(interactive "P")
(if arg
(mew-summary-sort-region (region-beginning) (region-end))
(mew-summary-sort-body "all")))
(defun mew-summary-sort-region (r1 r2)
(interactive "r")
(let (from to msgs)
(save-excursion
(goto-char r1)
(setq from
(or (mew-summary-message-number)
(progn
(re-search-backward mew-summary-message-regex nil t nil)
(mew-summary-message-number))))
(goto-char r2)
(setq to
(or (mew-summary-message-number)
(progn
(re-search-backward mew-summary-message-regex nil t nil)
(mew-summary-message-number))))
(if (string< from to)
(mew-summary-sort-body (concat from "-" to) "region")
(mew-summary-sort-body (concat to "-" from) "region")))))
(defun mew-summary-mark-sort (&optional r1 r2)
(interactive)
(mew-summary-sort-body
(mew-summary-mark-collect
mew-mark-hop (or r1 (point-min)) (or r2 (point-max)))
"marked messages"))
(provide 'mew-sort)
-------------- next part --------------
diff -u mew-1.54.orig/mew-summary.el mew-1.54/mew-summary.el
--- mew-1.54.orig/mew-summary.el Tue Feb 25 17:34:35 1997
+++ mew-1.54/mew-summary.el Tue Feb 25 17:43:41 1997
@@ -72,6 +72,7 @@
(define-key mew-summary-mode-map "mr" 'mew-summary-mark-regexp)
(define-key mew-summary-mode-map "ma" 'mew-summary-mark-all)
(define-key mew-summary-mode-map "mu" 'mew-summary-mark-undo-all)
+ (define-key mew-summary-mode-map "mS" 'mew-summary-mark-sort)
(define-key mew-summary-mode-map "\C-c\C-s" 'mew-summary-isearch-forward)
(define-key mew-summary-mode-map "\C-c\C-r" 'mew-summary-isearch-backward)
(define-key mew-summary-mode-map "\C-c\C-o"
@@ -103,6 +104,7 @@
["Refile" mew-summary-refile t]
["Mark mark" mew-summary-mark-mark t]
["Mark hop" mew-summary-mark-hop t]
+ ["Sort marked msgs" mew-summary-mark-sort t]
["Undo" mew-summary-undo t]
["Undo all" mew-summary-undo-all t]
["Execute" mew-summary-exec t]
@@ -241,6 +243,7 @@
m* Change mark \"@\" into mark \"*\".
m@ Change mark \"*\" into mark \"@\".
ms Swap mark \"@\" and \"*\".
+mS Sort messages whose marks are \"*\".
C-cC-s Incremental search forward on the message buffer.
C-cC-r Incremental search backward on the message buffer.
@@ -1464,27 +1467,27 @@
)
))
-(defun mew-summary-sort ()
- (interactive)
- (let ((folder (buffer-name)))
- (if (null (mew-summary-exclusive-p))
- ()
- (if (mew-summary-mark-exist-p (list mew-mark-rmm mew-mark-refile))
- (if (mew-y-or-n-p
- "Marked messages exist. Process mark before scan? ")
- (mew-summary-exec)))
- (if (null (mew-y-or-n-p (format "Sort %s ? " folder)))
- ()
- (setq mew-summary-buffer-process t)
- (message "Sorting %s ... " folder)
- (call-process mew-prog-sortm nil nil nil folder)
- (message "Sorting %s ... done" folder)
- (setq mew-summary-buffer-process nil)
- (let ((buffer-read-only nil)) (erase-buffer)) ;; for update
- (mew-summary-scan-body folder (mew-input-range folder))
- )
- )
- ))
+;(defun mew-summary-sort ()
+; (interactive)
+; (let ((folder (buffer-name)))
+; (if (null (mew-summary-exclusive-p))
+; ()
+; (if (mew-summary-mark-exist-p (list mew-mark-rmm mew-mark-refile))
+; (if (mew-y-or-n-p
+; "Marked messages exist. Process mark before scan? ")
+; (mew-summary-exec)))
+; (if (null (mew-y-or-n-p (format "Sort %s ? " folder)))
+; ()
+; (setq mew-summary-buffer-process t)
+; (message "Sorting %s ... " folder)
+; (call-process mew-prog-sortm nil nil nil folder)
+; (message "Sorting %s ... done" folder)
+; (setq mew-summary-buffer-process nil)
+; (let ((buffer-read-only nil)) (erase-buffer)) ;; for update
+; (mew-summary-scan-body folder (mew-input-range folder))
+; )
+; )
+; ))
(defun mew-summary-pack ()
(interactive)
diff -u mew-1.54.orig/mew.el mew-1.54/mew.el
--- mew-1.54.orig/mew.el Tue Feb 25 17:34:35 1997
+++ mew-1.54/mew.el Tue Feb 25 17:34:58 1997
@@ -1902,4 +1902,4 @@
(require 'mew-refile)
(require 'mew-ext)
(require 'mew-fib)
-
+(require 'mew-sort)
Mew-dist メーリングリストの案内