[Mew-dist 06520] a port of mh-f to mew
Linn H. Stanton
lstanton at example.com
1998年 9月 24日 (木) 04:29:02 JST
I short while back someone was asking for an mh-f equivalent for mew,
to show how many messages are in each folder, and for convenient
selection from a long list of folders.
Here's a stab at it, hacked from the existing mh-f.el
-------------- next part --------------
;; mew-f.el --
;; Author : Kai Grossjohann
;; Created On : Fri Oct 29 13:38:34 1993
;; Last Modified By: Linn H. Stanton to translate from mh to mew
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defvar mew-f-folder-list nil
"This is a list of (FOLDERNAME . NUMMSGS) pairs, one for each entry
in mew-folder-alist, containing all the names of the folders together
with the number of messages in each folder.")
(defvar mew-f-buffername "* Mew: Folders *"
"The name of the folder list buffer.")
(defvar mew-f-folder-sets nil
"This is an alist of pairs of a folder set name and a regexp matching
all folder names to be shown.")
(defvar mew-f-current-set "all") ; being defined in function mew-f
(defvar mew-f-default-set "all") ; being defined in function mew-f
(defvar mew-f-show-empty t
"Folders with 0 messages in them will be shown in folder list iff t")
(defun mew-f-folder-size (folder)
(interactive)
(length (directory-files (mew-expand-folder folder)
t
"^[0-9]+$"
nil)))
(defun mew-f-display-folders (regexp)
"Go through the list of folders and display one line for each folder
matching the regexp."
(interactive)
(switch-to-buffer (get-buffer-create mew-f-buffername))
(delete-other-windows)
(erase-buffer)
(mapcar '(lambda (folder)
(if (string-match regexp (car folder))
(if (or mew-f-show-empty (not (zerop (cdr folder))))
(insert (format "%10d : %s\n"
(cdr folder)
(car folder))))))
mew-f-folder-list)
(mew-f-first-folder))
(defun mew-f-define-set (name regexp)
"Add the NAME, REGEXP pair to the mew-f-folder-sets alist if there is no
folder set with this name in it."
(interactive)
(if (assoc name mew-f-folder-sets)
()
(setq mew-f-folder-sets (cons (cons name regexp) mew-f-folder-sets))))
(defun mew-f-current-folder ()
"Return the name of the folder displayed on the line the cursor is on."
(interactive)
(save-excursion
(beginning-of-line)
(looking-at "[ \t]*\\([0-9]+\\)[ \t]*:[ \t]+\\(\\+.*\\)$")
(buffer-substring (match-beginning 2) (match-end 2))))
;;
;; User accessible functions
;;
(defun mew-f-recalculate-folder-list ()
"For each folder in mew-folder-alist, determine the number of messages in
it and update mew-f-folder-list."
(interactive)
(message "Recalculating folder list...")
(setq mew-f-folder-list
(mapcar '(lambda (f)
(cons (car f) (mew-f-folder-size (car f))))
mew-folder-alist))
(setq mew-f-folder-list (sort mew-f-folder-list
'(lambda (a b) (string< (car a) (car b)))))
(message "Recalculating folder list...done"))
(defun mew-f-view-set (&optional name)
"In the list of folders, display folders belonging to folder set NAME
only."
(interactive)
(let ((setname
(or name
(completing-read "Name of folder set: "
mew-f-folder-sets
nil
t))))
(setq mew-f-current-set setname)
(mew-f-display-folders (cdr (assoc setname mew-f-folder-sets)))))
(defun mew-f-previous-folder (num)
"Go up NUM lines in the folder list. Do not go past first line."
(interactive "p")
(forward-line (- num))
(search-forward " : "))
(defun mew-f-next-folder (num)
"Go down NUM lines in the folder list. Do not go past last line."
(interactive "p")
(forward-line num)
(if (not (eobp))
(search-forward " : ")))
(defun mew-f-first-folder ()
"Go to the first folder in the folder list."
(interactive)
(beginning-of-buffer)
(search-forward " : "))
(defun mew-f-last-folder ()
"Go to the last folder in the folder list."
(interactive)
(end-of-buffer)
(if (looking-at "^$")
(forward-line -1))
(search-forward " : "))
(defun mew-f-visit-this-folder ()
"Call mew-goto-folder-subr with folder on the line the cursor is on."
(interactive)
(mew-summary-goto-folder-subr (mew-f-current-folder) t))
(defun mew-f-toggle-show-empty ()
"Invert the mew-f-show-empty variable. See there for more info."
(interactive)
(setq mew-f-show-empty (not mew-f-show-empty))
(mew-f-display-folders (cdr (assoc mew-f-current-set mew-f-folder-sets)))
(message
(if mew-f-show-empty "Showing empty folders." "Not showing empty folders.")))
(defun mew-f-show-empty-on ()
"Show empty folders in the list of folders."
(interactive)
(setq mew-f-show-empty t))
(defun mew-f-show-empty-off ()
"Do not show empty folders in the list of folders."
(interactive)
(setq mew-f-show-empty nil))
;;
;; Keymaps
;;
(defvar mew-f-mode-map (make-keymap))
(suppress-keymap mew-f-mode-map)
(define-key mew-f-mode-map "n" 'mew-f-next-folder)
(define-key mew-f-mode-map "p" 'mew-f-previous-folder)
(define-key mew-f-mode-map "<" 'mew-f-first-folder)
(define-key mew-f-mode-map ">" 'mew-f-last-folder)
(define-key mew-f-mode-map "v" 'mew-f-view-set)
(define-key mew-f-mode-map " " 'mew-f-visit-this-folder)
(define-key mew-f-mode-map "\C-m" 'mew-f-visit-this-folder)
(define-key mew-f-mode-map "e" 'mew-f-toggle-show-empty)
(define-key mew-f-mode-map "m" 'mew-summary-send)
(define-key mew-f-mode-map "f" 'mew-summary-goto-folder)
(define-key mew-f-mode-map "r" 'mew-f-reenter)
(define-key mew-f-mode-map "q" 'mew-f-reenter)
(define-key mew-f-mode-map "g" 'mew-f-reenter)
(define-key mew-summary-mode-map "q" 'mew-f-reenter)
;;
;; entry points
;;
(defun mew-f ()
"Show a list of folders with the number of messages for
each. Variable mew-f-folder-sets contains a number of regexps that match
certain folder names to be displayed. Provides functions to go up and
down the list and to change the regexp."
(interactive)
(message "Mew: reading folder list")
(mew-f-recalculate-folder-list)
(message "Mew: reading folder list...done")
(mew-f-define-set "all" ".*")
(mew-f-view-set mew-f-default-set)
(mew-f-mode))
(defun mew-f-reenter ()
"Like mew-f but assume the list of folders buffer has already been
generated. Just update the numbers of messages in each folder."
(interactive)
(mew-f-recalculate-folder-list)
(mew-f-view-set mew-f-current-set))
(defun mew-f-mode ()
"Show list of folders; extension of mew which is required for this to work.
A list of folders is shown. You can move among the folders and select
a folder. An additional feature is that you can define sets of folders
based on regular expressions and switch among the view of the folder
sets. This works as follows:
In your .emacs file, put lines like the following:
(mew-f-define-set \"news\" \"\\\\+news\\\\.\")
This defines the folder set `news' to be all folders whose names begin
with the string `+news.'. You can switch between the folder sets with
\\[mew-f-view-set].
\\{mew-f-mode-map}
mew-f uses the following variables:
mew-f-buffername (\"* MEW-F: Folders *\")
The name of the folder list buffer.
mew-f-show-empty (t)
Folders with 0 messages in the will be show in folder list iff t.
"
(interactive)
(setq major-mode 'mew-f-mode)
(setq mode-name "mew-f")
(use-local-map mew-f-mode-map))
(mew-f-define-set "incoming" "\\+inbox\\|+auto\\.")
(mew-f-define-set "cypherpunks" "\\+cypherpunks\\.")
(mew-f-define-set "sun-managers" "\\+sun-managers\\.")
(mew-f-define-set "libernet" "\\+libernet\\.")
(mew-f-define-set "porchephiles" "\\+porchephiles\\.")
(mew-f-define-set "sug" "\\+sug\\.")
(provide 'mew-f)
;; -- mew-f ends here
Mew-dist メーリングリストの案内