]> code.delx.au - gnu-emacs/blobdiff - lisp/mh-e/mh-init.el
* mh-search.el: New file containing contents of mh-index.el and
[gnu-emacs] / lisp / mh-e / mh-init.el
index 2297fef6a80a43939e26e1ddef4f8d143537f484..6d2f5f5d1375d5cf5df62d4d1b6e56401c008dfe 100644 (file)
@@ -29,7 +29,7 @@
 ;; Sets up the MH variant (currently nmh, MH, or GNU mailutils).
 ;;
 ;; Users may customize `mh-variant' to switch between available variants.
-;; Available MH variants are described in the variable `mh-variants'.
+;; Available MH variants are returned by the function `mh-variants'.
 ;; Developers may check which variant is currently in use with the
 ;; variable `mh-variant-in-use' or the function `mh-variant-p'.
 ;;
 
 (eval-when-compile (require 'mh-acros))
 (mh-require-cl)
+(require 'mh-buffers)
 (require 'mh-utils)
 
-;; Avoid compiler warnings.
-(eval-when-compile (defvar image-load-path))
+(defvar mh-sys-path
+  '("/usr/local/nmh/bin"                ; nmh default
+    "/usr/local/bin/mh/"
+    "/usr/local/mh/"
+    "/usr/bin/mh/"                      ; Ultrix 4.2, Linux
+    "/usr/new/mh/"                      ; Ultrix < 4.2
+    "/usr/contrib/mh/bin/"              ; BSDI
+    "/usr/pkg/bin/"                     ; NetBSD
+    "/usr/local/bin/"
+    "/usr/local/bin/mu-mh/"             ; GNU mailutils - default
+    "/usr/bin/mu-mh/")                  ; GNU mailutils - packaged
+  "List of directories to search for variants of the MH variant.
+The list `exec-path' is searched in addition to this list.
+There's no need for users to modify this list. Instead add extra
+directories to the customizable variable `mh-path'.")
 
 ;; Set for local environment:
 ;; mh-progs and mh-lib used to be set in paths.el, which tried to
@@ -75,7 +89,8 @@ This directory contains, among other things, the mhl program.")
 
 (defvar mh-variants nil
   "List describing known MH variants.
-Created by the function `mh-variants'")
+Do not access this variable directly as it may not have yet been initialized.
+Use the function `mh-variants' instead.")
 
 ;;;###mh-autoload
 (defun mh-variants ()
@@ -98,6 +113,93 @@ is described by the variable `mh-variants'."
                     (add-to-list 'mh-variants variant)))))
       mh-variants)))
 
+(defun mh-variant-info (dir)
+  "Return MH variant found in DIR, or nil if none present."
+  (save-excursion
+    (let ((tmp-buffer (get-buffer-create mh-temp-buffer)))
+      (set-buffer tmp-buffer)
+      (cond
+       ((mh-variant-mh-info dir))
+       ((mh-variant-nmh-info dir))
+       ((mh-variant-mu-mh-info dir))))))
+
+(defun mh-variant-mh-info (dir)
+  "Return info for MH variant in DIR assuming a temporary buffer is setup."
+  ;; MH does not have the -version option.
+  ;; Its version number is included in the output of "-help" as:
+  ;;
+  ;; version: MH 6.8.4 #2[UCI] (burrito) of Fri Jan 15 20:01:39 EST 1999
+  ;; options: [ATHENA] [BIND] [DUMB] [LIBLOCKFILE] [LOCALE] [MAILGROUP] [MHE]
+  ;;          [MHRC] [MIME] [MORE='"/usr/bin/sensible-pager"'] [NLINK_HACK]
+  ;;          [NORUSERPASS] [OVERHEAD] [POP] [POPSERVICE='"pop-3"'] [RENAME]
+  ;;          [RFC1342] [RPATHS] [RPOP] [SENDMTS] [SMTP] [SOCKETS]
+  ;;          [SPRINTFTYPE=int] [SVR4] [SYS5] [SYS5DIR] [TERMINFO]
+  ;;          [TYPESIG=void] [UNISTD] [UTK] [VSPRINTF]
+  (let ((mhparam (expand-file-name "mhparam" dir)))
+    (when (mh-file-command-p mhparam)
+      (erase-buffer)
+      (call-process mhparam nil '(t nil) nil "-help")
+      (goto-char (point-min))
+      (when (search-forward-regexp "version: MH \\(\\S +\\)" nil t)
+        (let ((version (format "MH %s" (match-string 1))))
+          (erase-buffer)
+          (call-process mhparam nil '(t nil) nil "libdir")
+          (goto-char (point-min))
+          (when (search-forward-regexp "^.*$" nil t)
+            (let ((libdir (match-string 0)))
+              `(,version
+                (variant        mh)
+                (mh-lib-progs   ,libdir)
+                (mh-lib         ,libdir)
+                (mh-progs       ,dir)
+                (flists         nil)))))))))
+
+(defun mh-variant-mu-mh-info (dir)
+  "Return info for GNU mailutils variant in DIR.
+This assumes that a temporary buffer is setup."
+  ;; 'mhparam -version' output:
+  ;; mhparam (GNU mailutils 0.3.2)
+  (let ((mhparam (expand-file-name "mhparam" dir)))
+    (when (mh-file-command-p mhparam)
+      (erase-buffer)
+      (call-process mhparam nil '(t nil) nil "-version")
+      (goto-char (point-min))
+      (when (search-forward-regexp "mhparam (\\(GNU [Mm]ailutils \\S +\\))"
+                                   nil t)
+        (let ((version (match-string 1))
+              (mh-progs dir))
+          `(,version
+            (variant        mu-mh)
+            (mh-lib-progs   ,(mh-profile-component "libdir"))
+            (mh-lib         ,(mh-profile-component "etcdir"))
+            (mh-progs       ,dir)
+            (flists         ,(file-exists-p
+                              (expand-file-name "flists" dir)))))))))
+
+(defun mh-variant-nmh-info (dir)
+  "Return info for nmh variant in DIR assuming a temporary buffer is setup."
+  ;; `mhparam -version' outputs:
+  ;; mhparam -- nmh-1.1-RC1 [compiled on chaak at Fri Jun 20 11:03:28 PDT 2003]
+  (let ((mhparam (expand-file-name "mhparam" dir)))
+    (when (mh-file-command-p mhparam)
+      (erase-buffer)
+      (call-process mhparam nil '(t nil) nil "-version")
+      (goto-char (point-min))
+      (when (search-forward-regexp "mhparam -- nmh-\\(\\S +\\)" nil t)
+        (let ((version (format "nmh %s" (match-string 1)))
+              (mh-progs dir))
+          `(,version
+            (variant        nmh)
+            (mh-lib-progs   ,(mh-profile-component "libdir"))
+            (mh-lib         ,(mh-profile-component "etcdir"))
+            (mh-progs       ,dir)
+            (flists         ,(file-exists-p
+                              (expand-file-name "flists" dir)))))))))
+
+(defun mh-file-command-p (file)
+  "Return t if file FILE is the name of a executable regular file."
+  (and (file-regular-p file) (file-executable-p file)))
+
 (defvar mh-variant-in-use nil
   "The MH variant currently in use; a string with variant and version number.
 This differs from `mh-variant' when the latter is set to
@@ -112,7 +214,7 @@ If the VARIANT is \"autodetect\", then first try nmh, then MH and
 finally GNU mailutils."
   (interactive
    (list (completing-read
-          "MH Variant: "
+          "MH variant: "
           (mapcar (lambda (x) (list (car x))) (mh-variants))
           nil t)))
   (let ((valid-list (mapcar (lambda (x) (car x)) (mh-variants))))
@@ -135,17 +237,18 @@ finally GNU mailutils."
      (t
       (message "Unknown variant; use %s"
                (mapconcat '(lambda (x) (format "%s" (car x)))
-                          mh-variants " or "))))))
+                          (mh-variants) " or "))))))
 
 (defun mh-variant-set-variant (variant)
   "Setup the system variables for the MH variant named VARIANT.
-If VARIANT is a string, use that key in the variable `mh-variants'.
+If VARIANT is a string, use that key in the alist returned by the
+function `mh-variants'.
 If VARIANT is a symbol, select the first entry that matches that
 variant."
   (cond
    ((stringp variant)                   ;e.g. "nmh 1.1-RC1"
-    (when (assoc variant mh-variants)
-      (let* ((alist (cdr (assoc variant mh-variants)))
+    (when (assoc variant (mh-variants))
+      (let* ((alist (cdr (assoc variant (mh-variants))))
              (lib-progs (cadr (assoc 'mh-lib-progs alist)))
              (lib       (cadr (assoc 'mh-lib       alist)))
              (progs     (cadr (assoc 'mh-progs     alist)))
@@ -158,7 +261,7 @@ variant."
               mh-progs               progs
               mh-variant-in-use      variant))))
    ((symbolp variant)                   ;e.g. 'nmh (pick the first match)
-    (loop for variant-list in mh-variants
+    (loop for variant-list in (mh-variants)
           when (eq variant (cadr (assoc 'variant (cdr variant-list))))
           return (let* ((version   (car variant-list))
                         (alist (cdr variant-list))
@@ -180,126 +283,83 @@ variant."
   "Return t if variant is any of VARIANTS.
 Currently known variants are 'MH, 'nmh, and 'mu-mh."
   (let ((variant-in-use
-         (cadr (assoc 'variant (assoc mh-variant-in-use mh-variants)))))
+         (cadr (assoc 'variant (assoc mh-variant-in-use (mh-variants))))))
     (not (null (member variant-in-use variants)))))
 
-(defvar mh-sys-path
-  '("/usr/local/nmh/bin"                ; nmh default
-    "/usr/local/bin/mh/"
-    "/usr/local/mh/"
-    "/usr/bin/mh/"                      ; Ultrix 4.2, Linux
-    "/usr/new/mh/"                      ; Ultrix < 4.2
-    "/usr/contrib/mh/bin/"              ; BSDI
-    "/usr/pkg/bin/"                     ; NetBSD
-    "/usr/local/bin/"
-    "/usr/local/bin/mu-mh/"             ; GNU mailutils - default
-    "/usr/bin/mu-mh/")                  ; GNU mailutils - packaged
-  "List of directories to search for variants of the MH variant.
-The list `exec-path' is searched in addition to this list.
-There's no need for users to modify this list. Instead add extra
-directories to the customizable variable `mh-path'.")
-
-(defun mh-variant-mh-info (dir)
-  "Return info for MH variant in DIR assuming a temporary buffer is setup."
-  ;; MH does not have the -version option.
-  ;; Its version number is included in the output of "-help" as:
-  ;;
-  ;; version: MH 6.8.4 #2[UCI] (burrito) of Fri Jan 15 20:01:39 EST 1999
-  ;; options: [ATHENA] [BIND] [DUMB] [LIBLOCKFILE] [LOCALE] [MAILGROUP] [MHE]
-  ;;          [MHRC] [MIME] [MORE='"/usr/bin/sensible-pager"'] [NLINK_HACK]
-  ;;          [NORUSERPASS] [OVERHEAD] [POP] [POPSERVICE='"pop-3"'] [RENAME]
-  ;;          [RFC1342] [RPATHS] [RPOP] [SENDMTS] [SMTP] [SOCKETS]
-  ;;          [SPRINTFTYPE=int] [SVR4] [SYS5] [SYS5DIR] [TERMINFO]
-  ;;          [TYPESIG=void] [UNISTD] [UTK] [VSPRINTF]
-  (let ((mhparam (expand-file-name "mhparam" dir)))
-    (when (and (file-exists-p mhparam) (file-executable-p mhparam))
-      (erase-buffer)
-      (call-process mhparam nil '(t nil) nil "-help")
-      (goto-char (point-min))
-      (when (search-forward-regexp "version: MH \\(\\S +\\)" nil t)
-        (let ((version (format "MH %s" (match-string 1))))
-          (erase-buffer)
-          (call-process mhparam nil '(t nil) nil "libdir")
-          (goto-char (point-min))
-          (when (search-forward-regexp "^.*$" nil t)
-            (let ((libdir (match-string 0)))
-              `(,version
-                (variant        mh)
-                (mh-lib-progs   ,libdir)
-                (mh-lib         ,libdir)
-                (mh-progs       ,dir)
-                (flists         nil)))))))))
-
-(defun mh-variant-mu-mh-info (dir)
-  "Return info for GNU mailutils variant in DIR.
-This assumes that a temporary buffer is setup."
-  ;; 'mhparam -version' output:
-  ;; mhparam (GNU mailutils 0.3.2)
-  (let ((mhparam (expand-file-name "mhparam" dir)))
-    (when (and (file-exists-p mhparam) (file-executable-p mhparam))
-      (erase-buffer)
-      (call-process mhparam nil '(t nil) nil "-version")
-      (goto-char (point-min))
-      (when (search-forward-regexp "mhparam (\\(GNU [Mm]ailutils \\S +\\))"
-                                   nil t)
-        (let ((version (match-string 1)))
-          (erase-buffer)
-          (call-process mhparam nil '(t nil) nil "libdir" "etcdir")
-          (goto-char (point-min))
-          (when (search-forward-regexp "^libdir:\\s-\\(\\S-+\\)\\s-*$" nil t)
-            (let ((libdir (match-string 1)))
-              (goto-char (point-min))
-              (when (search-forward-regexp
-                     "^etcdir:\\s-\\(\\S-+\\)\\s-*$" nil t)
-                (let ((etcdir (match-string 1))
-                      (flists (file-exists-p (expand-file-name "flists" dir))))
-                  `(,version
-                    (variant        mu-mh)
-                    (mh-lib-progs   ,libdir)
-                    (mh-lib         ,etcdir)
-                    (mh-progs       ,dir)
-                    (flists         ,flists)))))))))))
-
-(defun mh-variant-nmh-info (dir)
-  "Return info for nmh variant in DIR assuming a temporary buffer is setup."
-  ;; `mhparam -version' outputs:
-  ;; mhparam -- nmh-1.1-RC1 [compiled on chaak at Fri Jun 20 11:03:28 PDT 2003]
-  (let ((mhparam (expand-file-name "mhparam" dir)))
-    (when (and (file-exists-p mhparam) (file-executable-p mhparam))
-      (erase-buffer)
-      (call-process mhparam nil '(t nil) nil "-version")
-      (goto-char (point-min))
-      (when (search-forward-regexp "mhparam -- nmh-\\(\\S +\\)" nil t)
-        (let ((version (format "nmh %s" (match-string 1))))
-          (erase-buffer)
-          (call-process mhparam nil '(t nil) nil "libdir" "etcdir")
-          (goto-char (point-min))
-          (when (search-forward-regexp "^libdir:\\s-\\(\\S-+\\)\\s-*$" nil t)
-            (let ((libdir (match-string 1)))
-              (goto-char (point-min))
-              (when (search-forward-regexp
-                     "^etcdir:\\s-\\(\\S-+\\)\\s-*$" nil t)
-                (let ((etcdir (match-string 1))
-                      (flists (file-exists-p (expand-file-name "flists" dir))))
-                  `(,version
-                    (variant        nmh)
-                    (mh-lib-progs   ,libdir)
-                    (mh-lib         ,etcdir)
-                    (mh-progs       ,dir)
-                    (flists         ,flists)))))))))))
+\f
 
-(defun mh-variant-info (dir)
-  "Return MH variant found in DIR, or nil if none present."
-  (save-excursion
-    (let ((tmp-buffer (get-buffer-create mh-temp-buffer)))
-      (set-buffer tmp-buffer)
-      (cond
-       ((mh-variant-mh-info dir))
-       ((mh-variant-nmh-info dir))
-       ((mh-variant-mu-mh-info dir))))))
+;;; Read MH Profile
+
+(defvar mh-find-path-run nil
+  "Non-nil if `mh-find-path' has been run already.
+Do not access this variable; `mh-find-path' already uses it to
+avoid running more than once.")
+
+(defun mh-find-path ()
+  "Set variables from user's MH profile.
+
+This function sets `mh-user-path' from your \"Path:\" MH profile
+component (but defaults to \"Mail\" if one isn't present),
+`mh-draft-folder' from \"Draft-Folder:\", `mh-unseen-seq' from
+\"Unseen-Sequence:\", `mh-previous-seq' from
+\"Previous-Sequence:\", and `mh-inbox' from \"Inbox:\" (defaults
+to \"+inbox\").
+
+The hook `mh-find-path-hook' is run after these variables have
+been set. This hook can be used the change the value of these
+variables if you need to run with different values between MH and
+MH-E."
+  (unless mh-find-path-run
+    ;; Sanity checks.
+    (if (and (getenv "MH")
+             (not (file-readable-p (getenv "MH"))))
+        (error "MH environment variable contains unreadable file %s"
+               (getenv "MH")))
+    (if (null (mh-variants))
+        (error "Install MH and run install-mh before running MH-E"))
+    (let ((profile "~/.mh_profile"))
+      (if (not (file-readable-p profile))
+          (error "Run install-mh before running MH-E")))
+    ;; Read MH profile.
+    (setq mh-user-path (mh-profile-component "Path"))
+    (if (not mh-user-path)
+        (setq mh-user-path "Mail"))
+    (setq mh-user-path
+          (file-name-as-directory
+           (expand-file-name mh-user-path (expand-file-name "~"))))
+    (unless mh-x-image-cache-directory
+      (setq mh-x-image-cache-directory
+            (expand-file-name ".mhe-x-image-cache" mh-user-path)))
+    (setq mh-draft-folder (mh-profile-component "Draft-Folder"))
+    (if mh-draft-folder
+        (progn
+          (if (not (mh-folder-name-p mh-draft-folder))
+              (setq mh-draft-folder (format "+%s" mh-draft-folder)))
+          (if (not (file-exists-p (mh-expand-file-name mh-draft-folder)))
+              (error
+               "Draft folder \"%s\" not found; create it and try again"
+               (mh-expand-file-name mh-draft-folder)))))
+    (setq mh-inbox (mh-profile-component "Inbox"))
+    (cond ((not mh-inbox)
+           (setq mh-inbox "+inbox"))
+          ((not (mh-folder-name-p mh-inbox))
+           (setq mh-inbox (format "+%s" mh-inbox))))
+    (setq mh-unseen-seq (mh-profile-component "Unseen-Sequence"))
+    (if mh-unseen-seq
+        (setq mh-unseen-seq (intern mh-unseen-seq))
+      (setq mh-unseen-seq 'unseen))     ;old MH default?
+    (setq mh-previous-seq (mh-profile-component "Previous-Sequence"))
+    (if mh-previous-seq
+        (setq mh-previous-seq (intern mh-previous-seq)))
+    (run-hooks 'mh-find-path-hook)
+    (mh-collect-folder-names)
+    (setq mh-find-path-run t)))
 
 \f
 
+;; Shush compiler.
+(eval-when-compile (defvar image-load-path))
+
 (defvar mh-image-load-path-called-flag nil)
 
 ;;;###mh-autoload
@@ -328,6 +388,8 @@ there. Otherwise, the images directory is added to the
 
 \f
 
+;;; Support routines for mh-customize.el
+
 (defvar mh-min-colors-defined-flag (and (not mh-xemacs-flag)
                                         (>= emacs-major-version 22))
   "Non-nil means defface supports min-colors display requirement.")