Mercurial > emacs
view lisp/mail/mbox-trunk-annotations/rmailsort.el.annotation @ 98151:0db92e8539a8
*** empty log message ***
author | Glenn Morris <rgm@gnu.org> |
---|---|
date | Fri, 12 Sep 2008 03:09:30 +0000 |
parents | 513ae63d6175 |
children |
line wrap: on
line source
1.28 (pj 15-Jul-01): ;;; rmailsort.el --- Rmail: sort messages 1.7 (eric 30-May-92): 1.32 (ttn 06-Aug-05): ;; Copyright (C) 1990, 1993, 1994, 2001, 2002, 2003, 2004, 1.37 (miles 08-Jan-08): ;; 2005, 2006, 2007, 2008 Free Software Foundation, Inc. 1.11 (eric 22-Jul-92): 1.14 (rms 26-May-93): ;; Author: Masanobu UMEDA <umerin@mse.kyutech.ac.jp> 1.26 (rms 10-Feb-97): ;; Maintainer: FSF 1.10 (eric 17-Jul-92): ;; Keywords: mail 1.9 (eric 16-Jul-92): 1.8 (rms 14-Jul-92): ;; This file is part of GNU Emacs. 1.1 (rms 10-Sep-90): 1.39 (gm 06-May-08): ;; GNU Emacs is free software: you can redistribute it and/or modify 1.8 (rms 14-Jul-92): ;; it under the terms of the GNU General Public License as published by 1.39 (gm 06-May-08): ;; the Free Software Foundation, either version 3 of the License, or 1.39 (gm 06-May-08): ;; (at your option) any later version. 1.1 (rms 10-Sep-90): 1.1 (rms 10-Sep-90): ;; GNU Emacs is distributed in the hope that it will be useful, 1.8 (rms 14-Jul-92): ;; but WITHOUT ANY WARRANTY; without even the implied warranty of 1.8 (rms 14-Jul-92): ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1.8 (rms 14-Jul-92): ;; GNU General Public License for more details. 1.8 (rms 14-Jul-92): 1.8 (rms 14-Jul-92): ;; You should have received a copy of the GNU General Public License 1.39 (gm 06-May-08): ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. 1.28 (pj 15-Jul-01): 1.28 (pj 15-Jul-01): ;;; Commentary: 1.1 (rms 10-Sep-90): 1.9 (eric 16-Jul-92): ;;; Code: 1.1 (rms 10-Sep-90): 1.1 (rms 10-Sep-90): (require 'sort) 1.24 (kwzh 20-Jan-96): 1.24 (kwzh 20-Jan-96): ;; For rmail-select-summary 1.24 (kwzh 20-Jan-96): (require 'rmail) 1.1 (rms 10-Sep-90): 1.14 (rms 26-May-93): (autoload 'timezone-make-date-sortable "timezone") 1.14 (rms 26-May-93): 1.14 (rms 26-May-93): ;; Sorting messages in Rmail buffer 1.14 (rms 26-May-93): 1.25 (rms 27-Sep-96): ;;;###autoload 1.1 (rms 10-Sep-90): (defun rmail-sort-by-date (reverse) 1.1 (rms 10-Sep-90): "Sort messages of current Rmail file by date. 1.1 (rms 10-Sep-90): If prefix argument REVERSE is non-nil, sort them in reverse order." 1.1 (rms 10-Sep-90): (interactive "P") 1.1 (rms 10-Sep-90): (rmail-sort-messages reverse 1.1 (rms 10-Sep-90): (function 1.1 (rms 10-Sep-90): (lambda (msg) 1.14 (rms 26-May-93): (rmail-make-date-sortable 1.1 (rms 10-Sep-90): (rmail-fetch-field msg "Date")))))) 1.1 (rms 10-Sep-90): 1.25 (rms 27-Sep-96): ;;;###autoload 1.1 (rms 10-Sep-90): (defun rmail-sort-by-subject (reverse) 1.1 (rms 10-Sep-90): "Sort messages of current Rmail file by subject. 1.1 (rms 10-Sep-90): If prefix argument REVERSE is non-nil, sort them in reverse order." 1.1 (rms 10-Sep-90): (interactive "P") 1.1 (rms 10-Sep-90): (rmail-sort-messages reverse 1.1 (rms 10-Sep-90): (function 1.1 (rms 10-Sep-90): (lambda (msg) 1.1 (rms 10-Sep-90): (let ((key (or (rmail-fetch-field msg "Subject") "")) 1.1 (rms 10-Sep-90): (case-fold-search t)) 1.1 (rms 10-Sep-90): ;; Remove `Re:' 1.18 (kwzh 23-Mar-94): (if (string-match "^\\(re:[ \t]*\\)*" key) 1.18 (kwzh 23-Mar-94): (substring key (match-end 0)) 1.18 (kwzh 23-Mar-94): key)))))) 1.1 (rms 10-Sep-90): 1.25 (rms 27-Sep-96): ;;;###autoload 1.1 (rms 10-Sep-90): (defun rmail-sort-by-author (reverse) 1.1 (rms 10-Sep-90): "Sort messages of current Rmail file by author. 1.1 (rms 10-Sep-90): If prefix argument REVERSE is non-nil, sort them in reverse order." 1.1 (rms 10-Sep-90): (interactive "P") 1.1 (rms 10-Sep-90): (rmail-sort-messages reverse 1.1 (rms 10-Sep-90): (function 1.1 (rms 10-Sep-90): (lambda (msg) 1.14 (rms 26-May-93): (downcase ;Canonical name 1.14 (rms 26-May-93): (mail-strip-quoted-names 1.14 (rms 26-May-93): (or (rmail-fetch-field msg "From") 1.14 (rms 26-May-93): (rmail-fetch-field msg "Sender") ""))))))) 1.1 (rms 10-Sep-90): 1.25 (rms 27-Sep-96): ;;;###autoload 1.1 (rms 10-Sep-90): (defun rmail-sort-by-recipient (reverse) 1.1 (rms 10-Sep-90): "Sort messages of current Rmail file by recipient. 1.1 (rms 10-Sep-90): If prefix argument REVERSE is non-nil, sort them in reverse order." 1.1 (rms 10-Sep-90): (interactive "P") 1.1 (rms 10-Sep-90): (rmail-sort-messages reverse 1.1 (rms 10-Sep-90): (function 1.1 (rms 10-Sep-90): (lambda (msg) 1.14 (rms 26-May-93): (downcase ;Canonical name 1.14 (rms 26-May-93): (mail-strip-quoted-names 1.14 (rms 26-May-93): (or (rmail-fetch-field msg "To") 1.14 (rms 26-May-93): (rmail-fetch-field msg "Apparently-To") "") 1.14 (rms 26-May-93): )))))) 1.1 (rms 10-Sep-90): 1.25 (rms 27-Sep-96): ;;;###autoload 1.3 (rms 03-Dec-90): (defun rmail-sort-by-correspondent (reverse) 1.3 (rms 03-Dec-90): "Sort messages of current Rmail file by other correspondent. 1.3 (rms 03-Dec-90): If prefix argument REVERSE is non-nil, sort them in reverse order." 1.3 (rms 03-Dec-90): (interactive "P") 1.3 (rms 03-Dec-90): (rmail-sort-messages reverse 1.3 (rms 03-Dec-90): (function 1.3 (rms 03-Dec-90): (lambda (msg) 1.3 (rms 03-Dec-90): (rmail-select-correspondent 1.3 (rms 03-Dec-90): msg 1.3 (rms 03-Dec-90): '("From" "Sender" "To" "Apparently-To")))))) 1.3 (rms 03-Dec-90): 1.3 (rms 03-Dec-90): (defun rmail-select-correspondent (msg fields) 1.3 (rms 03-Dec-90): (let ((ans "")) 1.14 (rms 26-May-93): (while (and fields (string= ans "")) 1.14 (rms 26-May-93): (setq ans 1.14 (rms 26-May-93): (rmail-dont-reply-to 1.14 (rms 26-May-93): (mail-strip-quoted-names 1.14 (rms 26-May-93): (or (rmail-fetch-field msg (car fields)) "")))) 1.14 (rms 26-May-93): (setq fields (cdr fields))) 1.14 (rms 26-May-93): ans)) 1.4 (rms 27-Dec-90): 1.25 (rms 27-Sep-96): ;;;###autoload 1.14 (rms 26-May-93): (defun rmail-sort-by-lines (reverse) 1.15 (rms 22-Jun-93): "Sort messages of current Rmail file by number of lines. 1.4 (rms 27-Dec-90): If prefix argument REVERSE is non-nil, sort them in reverse order." 1.4 (rms 27-Dec-90): (interactive "P") 1.4 (rms 27-Dec-90): (rmail-sort-messages reverse 1.4 (rms 27-Dec-90): (function 1.4 (rms 27-Dec-90): (lambda (msg) 1.17 (kwzh 12-Mar-94): (count-lines (rmail-msgbeg msg) 1.17 (kwzh 12-Mar-94): (rmail-msgend msg)))))) 1.21 (kwzh 07-Apr-94): 1.25 (rms 27-Sep-96): ;;;###autoload 1.27 (gerd 07-May-01): (defun rmail-sort-by-labels (reverse labels) 1.21 (kwzh 07-Apr-94): "Sort messages of current Rmail file by labels. 1.21 (kwzh 07-Apr-94): If prefix argument REVERSE is non-nil, sort them in reverse order. 1.21 (kwzh 07-Apr-94): KEYWORDS is a comma-separated list of labels." 1.21 (kwzh 07-Apr-94): (interactive "P\nsSort by labels: ") 1.21 (kwzh 07-Apr-94): (or (string-match "[^ \t]" labels) 1.21 (kwzh 07-Apr-94): (error "No labels specified")) 1.21 (kwzh 07-Apr-94): (setq labels (concat (substring labels (match-beginning 0)) ",")) 1.21 (kwzh 07-Apr-94): (let (labelvec) 1.21 (kwzh 07-Apr-94): (while (string-match "[ \t]*,[ \t]*" labels) 1.29 (lektu 04-Feb-03): (setq labelvec (cons 1.21 (kwzh 07-Apr-94): (concat ", ?\\(" 1.21 (kwzh 07-Apr-94): (substring labels 0 (match-beginning 0)) 1.21 (kwzh 07-Apr-94): "\\),") 1.21 (kwzh 07-Apr-94): labelvec)) 1.21 (kwzh 07-Apr-94): (setq labels (substring labels (match-end 0)))) 1.21 (kwzh 07-Apr-94): (setq labelvec (apply 'vector (nreverse labelvec))) 1.21 (kwzh 07-Apr-94): (rmail-sort-messages reverse 1.21 (kwzh 07-Apr-94): (function 1.21 (kwzh 07-Apr-94): (lambda (msg) 1.21 (kwzh 07-Apr-94): (let ((n 0)) 1.21 (kwzh 07-Apr-94): (while (and (< n (length labelvec)) 1.21 (kwzh 07-Apr-94): (not (rmail-message-labels-p 1.21 (kwzh 07-Apr-94): msg (aref labelvec n)))) 1.21 (kwzh 07-Apr-94): (setq n (1+ n))) 1.21 (kwzh 07-Apr-94): n)))))) 1.14 (rms 26-May-93): 1.14 (rms 26-May-93): ;; Basic functions 1.36 (dann 25-Nov-07): (declare-function rmail-update-summary "rmailsum" (&rest ignore)) 1.1 (rms 10-Sep-90): 1.14 (rms 26-May-93): (defun rmail-sort-messages (reverse keyfun) 1.1 (rms 10-Sep-90): "Sort messages of current Rmail file. 1.14 (rms 26-May-93): If 1st argument REVERSE is non-nil, sort them in reverse order. 1.14 (rms 26-May-93): 2nd argument KEYFUN is called with a message number, and should return a key." 1.26 (rms 10-Feb-97): (save-current-buffer 1.16 (rms 24-Nov-93): ;; If we are in a summary buffer, operate on the Rmail buffer. 1.16 (rms 24-Nov-93): (if (eq major-mode 'rmail-summary-mode) 1.16 (rms 24-Nov-93): (set-buffer rmail-buffer)) 1.16 (rms 24-Nov-93): (let ((buffer-read-only nil) 1.26 (rms 10-Feb-97): (point-offset (- (point) (point-min))) 1.16 (rms 24-Nov-93): (predicate nil) ;< or string-lessp 1.16 (rms 24-Nov-93): (sort-lists nil)) 1.16 (rms 24-Nov-93): (message "Finding sort keys...") 1.16 (rms 24-Nov-93): (widen) 1.16 (rms 24-Nov-93): (let ((msgnum 1)) 1.16 (rms 24-Nov-93): (while (>= rmail-total-messages msgnum) 1.16 (rms 24-Nov-93): (setq sort-lists 1.16 (rms 24-Nov-93): (cons (list (funcall keyfun msgnum) ;Make sorting key 1.16 (rms 24-Nov-93): (eq rmail-current-message msgnum) ;True if current 1.16 (rms 24-Nov-93): (aref rmail-message-vector msgnum) 1.16 (rms 24-Nov-93): (aref rmail-message-vector (1+ msgnum))) 1.16 (rms 24-Nov-93): sort-lists)) 1.16 (rms 24-Nov-93): (if (zerop (% msgnum 10)) 1.16 (rms 24-Nov-93): (message "Finding sort keys...%d" msgnum)) 1.16 (rms 24-Nov-93): (setq msgnum (1+ msgnum)))) 1.16 (rms 24-Nov-93): (or reverse (setq sort-lists (nreverse sort-lists))) 1.16 (rms 24-Nov-93): ;; Decide predicate: < or string-lessp 1.16 (rms 24-Nov-93): (if (numberp (car (car sort-lists))) ;Is a key numeric? 1.16 (rms 24-Nov-93): (setq predicate (function <)) 1.16 (rms 24-Nov-93): (setq predicate (function string-lessp))) 1.16 (rms 24-Nov-93): (setq sort-lists 1.16 (rms 24-Nov-93): (sort sort-lists 1.16 (rms 24-Nov-93): (function 1.16 (rms 24-Nov-93): (lambda (a b) 1.16 (rms 24-Nov-93): (funcall predicate (car a) (car b)))))) 1.16 (rms 24-Nov-93): (if reverse (setq sort-lists (nreverse sort-lists))) 1.16 (rms 24-Nov-93): ;; Now we enter critical region. So, keyboard quit is disabled. 1.16 (rms 24-Nov-93): (message "Reordering messages...") 1.16 (rms 24-Nov-93): (let ((inhibit-quit t) ;Inhibit quit 1.16 (rms 24-Nov-93): (current-message nil) 1.16 (rms 24-Nov-93): (msgnum 1) 1.16 (rms 24-Nov-93): (msginfo nil)) 1.16 (rms 24-Nov-93): ;; There's little hope that we can easily undo after that. 1.20 (kwzh 30-Mar-94): (buffer-disable-undo (current-buffer)) 1.16 (rms 24-Nov-93): (goto-char (rmail-msgbeg 1)) 1.16 (rms 24-Nov-93): ;; To force update of all markers. 1.16 (rms 24-Nov-93): (insert-before-markers ?Z) 1.16 (rms 24-Nov-93): (backward-char 1) 1.16 (rms 24-Nov-93): ;; Now reorder messages. 1.16 (rms 24-Nov-93): (while sort-lists 1.16 (rms 24-Nov-93): (setq msginfo (car sort-lists)) 1.16 (rms 24-Nov-93): ;; Swap two messages. 1.16 (rms 24-Nov-93): (insert-buffer-substring 1.16 (rms 24-Nov-93): (current-buffer) (nth 2 msginfo) (nth 3 msginfo)) 1.16 (rms 24-Nov-93): (delete-region (nth 2 msginfo) (nth 3 msginfo)) 1.16 (rms 24-Nov-93): ;; Is current message? 1.16 (rms 24-Nov-93): (if (nth 1 msginfo) 1.16 (rms 24-Nov-93): (setq current-message msgnum)) 1.16 (rms 24-Nov-93): (setq sort-lists (cdr sort-lists)) 1.16 (rms 24-Nov-93): (if (zerop (% msgnum 10)) 1.16 (rms 24-Nov-93): (message "Reordering messages...%d" msgnum)) 1.16 (rms 24-Nov-93): (setq msgnum (1+ msgnum))) 1.16 (rms 24-Nov-93): ;; Delete the garbage inserted before. 1.16 (rms 24-Nov-93): (delete-char 1) 1.16 (rms 24-Nov-93): (setq quit-flag nil) 1.16 (rms 24-Nov-93): (buffer-enable-undo) 1.16 (rms 24-Nov-93): (rmail-set-message-counters) 1.19 (kwzh 30-Mar-94): (rmail-show-message current-message) 1.26 (rms 10-Feb-97): (goto-char (+ point-offset (point-min))) 1.19 (kwzh 30-Mar-94): (if (rmail-summary-exists) 1.19 (kwzh 30-Mar-94): (rmail-select-summary 1.19 (kwzh 30-Mar-94): (rmail-update-summary))))))) 1.14 (rms 26-May-93): 1.1 (rms 10-Sep-90): (defun rmail-fetch-field (msg field) 1.14 (rms 26-May-93): "Return the value of the header FIELD of MSG. 1.1 (rms 10-Sep-90): Arguments are MSG and FIELD." 1.14 (rms 26-May-93): (save-restriction 1.14 (rms 26-May-93): (widen) 1.14 (rms 26-May-93): (let ((next (rmail-msgend msg))) 1.1 (rms 10-Sep-90): (goto-char (rmail-msgbeg msg)) 1.1 (rms 10-Sep-90): (narrow-to-region (if (search-forward "\n*** EOOH ***\n" next t) 1.1 (rms 10-Sep-90): (point) 1.1 (rms 10-Sep-90): (forward-line 1) 1.1 (rms 10-Sep-90): (point)) 1.1 (rms 10-Sep-90): (progn (search-forward "\n\n" nil t) (point))) 1.1 (rms 10-Sep-90): (mail-fetch-field field)))) 1.1 (rms 10-Sep-90): 1.14 (rms 26-May-93): (defun rmail-make-date-sortable (date) 1.14 (rms 26-May-93): "Make DATE sortable using the function string-lessp." 1.14 (rms 26-May-93): ;; Assume the default time zone is GMT. 1.14 (rms 26-May-93): (timezone-make-date-sortable date "GMT" "GMT")) 1.6 (jimb 16-Mar-92): 1.6 (jimb 16-Mar-92): (provide 'rmailsort) 1.7 (eric 30-May-92): 1.38 (monnier 10-Apr-08): ;; arch-tag: 0d90896b-0c35-46ac-b240-38be5ada2360 1.7 (eric 30-May-92): ;;; rmailsort.el ends here