[Mew-dist 1933] mew-sort.el ver 0.09

Takashi P.KATOH p-katoh at example.com
1997年 9月 9日 (火) 16:36:18 JST


かとぺ です。

mew-sort.el version 0.09 です。

さんざん苦労した割に追加されたコードはわずかですが。
# mew-summaru-refile のように、複数の field を読めるようにし
# ようと思って一生懸命書いてたら、imsort は一つの field しか
# 見ない (らしい) ことに後で気付いた... f(^^;


主な変更点は以下の通りです。

1. mew-summary-sort-fields の仕様変更
'(("date" . "date") ("subject") ("x-sequence" . "num"))
のように指定するようになりました。
すでに .emacs などでカスタマイズしている人は変更して下さい 
(t の部分があればそれを "date" にすれば良いはずです)。
詳しくは (describe-variable 'mew-summary-sort-fields) して下
さい (いいかげんな英語ですけど)。

2. minibuffer で mode も completion できるようにした
minibuffer で subject:text のようにすると mode を明示的に指
定できます。completion も可能です。


一部の関数は mew-minibuf.el, mew-complete.el にすぐ移動でき
るように書いてはありますが、移動の必要がなければ変更します
(関数, 変数の位置の変更とコメントの削除くらいですが)。

-- 
  東北大学大学院 情報科学研究科 白鳥研究室    加藤 貴司
  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-1997  Takashi P.KATOH
;;;
;;;		   This emacs lisp library confirms
;;;		GNU GENERAL PUBLIC LICENSE Version 2.
;;;
;;; Author:  Takashi P.KATOH <p-katoh at example.com>
;;; Created: Feb  6, 1996
;;; Revised: Sep  9, 1997
;;;

(defconst mew-sort-version "mew-sort.el version 0.09")

(require 'mew)

(defvar mew-summary-sort-fields
  '(("date" . "date") ("subject") ("from") ("to") ("newsgroups")
    ("posted" . "date") ("x-sequence" . "num"))
  "*List of fields for `mew-summary-sort'.
Each element is (FIELD-NAME) or (FIELD-NAME . MODE).
MODE is one of \"date\" (sort by chronological order) or
               \"num\"  (sort by numerical order) or
               \"text\" (sort by alphabetical order).
(nil means \"text\").")

(defvar mew-sort-modes '("date" "num" "text"))
(defvar mew-summary-sort-last-field "date")

(defun mew-summary-sort-subr (msgs &optional method)
  (let* ((folder (buffer-name)) (field) (mode)
	 (msgs (if (listp msgs) msgs (list msgs)))
	 (completion-ignore-case t)
	 (colonpair
	  (read-from-minibuffer
	   (concat "Sort " method (if method " ") "by?"
		   (if mew-summary-sort-last-field
		       (concat " (default " mew-summary-sort-last-field "): ")
		     ": "))
	   "" mew-mini-sort-field-map nil mew-input-sort-field-hist)))
    (setq colonpair (downcase (if (string-equal colonpair "")
				  mew-summary-sort-last-field colonpair))
	  mew-summary-sort-last-field colonpair
	  field (car (mew-header-split colonpair ?:))
	  mode  (or (car (cdr (mew-header-split colonpair ?:)))
		    (cdr (assoc field mew-summary-sort-fields))
		    "text"))
    (if (not (mew-summary-exclusive-p))
	()
      (mew-mark-clean-up)
      (setq mew-summary-buffer-process t)
      (message "Sorting %s by %s (mode=%s) ... " folder field mode)
      (apply 'call-process mew-prog-imsort nil nil nil
	     (append
	      (list (concat "--src=" folder)
		    (concat "--field=" field)
		    (concat "--mode=" mode))
	      msgs))
      (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 mew-prog-imls
			     'mew-summary-mode
			     folder
			     mew-cs-scan
			     (mew-input-range folder)))))

(defun mew-summary-sort (&optional arg)
  (interactive "P")
  (if arg
      (mew-summary-sort-region (region-beginning) (region-end) "region")
    (mew-summary-sort-region (point-min) (point-max))))

(defun mew-summary-sort-region (r1 r2 &optional method)
  (interactive "r")
  (let (from to)
    (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-to-int from) (string-to-int to))
	  (mew-summary-sort-subr (concat from "-" to) method)
	(mew-summary-sort-subr (concat to "-" from) method)))))

(defun mew-summary-mark-sort (&optional r1 r2)
  (interactive)
  (mew-summary-sort-subr
   (mew-summary-mark-collect
    mew-mark-hop (or r1 (point-min)) (or r2 (point-max)))
   "marked messages"))


;; --> mew-minibuf.el ?
(defvar mew-mini-sort-field-map nil)
(defvar mew-input-sort-field-hist nil)

(if mew-mini-sort-field-map
    ()
  (setq mew-mini-sort-field-map (make-sparse-keymap))
  (define-key mew-mini-sort-field-map " "    'mew-complete-sort-field)
  (define-key mew-mini-sort-field-map "\t"   'mew-complete-sort-field)
  (define-key mew-mini-sort-field-map "\r"   'exit-minibuffer)
  (define-key mew-mini-sort-field-map "\n"   'exit-minibuffer)
  (define-key mew-mini-sort-field-map "\C-g" 'abort-recursive-edit)
  (define-key mew-mini-sort-field-map "\M-p" 'previous-history-element)
  (define-key mew-mini-sort-field-map "\M-n" 'next-history-element)
  )


;; --> mew-complete.el ?
(defun mew-complete-sort-field ()
  (interactive)
  (let* ((mew-address-separator ", \t\n")
	 (word (or (mew-delete-backward-char) ""))
	 (field) (alist))
    (if (string-match ":" (or word ""))
	(progn
	  ;; If WORD contains `:', change alist for completion.
	  (setq field (car (mew-header-split word ?:)))
	  (setq alist 
		(mapcar (lambda (str) (list (concat field ":" str)))
			mew-sort-modes)))
      ;; Otherwise, alist is mew-summary-sort-fields itself.
      (setq alist mew-summary-sort-fields))
    (mew-complete word alist "field" nil)))

(provide 'mew-sort)


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