emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/lisp/mh-e/mh-utils.el


From: Bill Wohler
Subject: [Emacs-diffs] Changes to emacs/lisp/mh-e/mh-utils.el
Date: Mon, 03 Feb 2003 15:55:55 -0500

Index: emacs/lisp/mh-e/mh-utils.el
diff -c emacs/lisp/mh-e/mh-utils.el:1.1 emacs/lisp/mh-e/mh-utils.el:1.2
*** emacs/lisp/mh-e/mh-utils.el:1.1     Sat Jan 25 21:38:37 2003
--- emacs/lisp/mh-e/mh-utils.el Mon Feb  3 15:55:30 2003
***************
*** 30,36 ****
  
  ;;; Change Log:
  
! ;; $Id: mh-utils.el,v 1.1 2003/01/26 02:38:37 wohler Exp $
  
  ;;; Code:
  
--- 30,36 ----
  
  ;;; Change Log:
  
! ;; $Id: mh-utils.el,v 1.2 2003/02/03 20:55:30 wohler Exp $
  
  ;;; Code:
  
***************
*** 121,127 ****
    "Regexp to find the number of a message in a scan line.
  The message's number must be surrounded with \\( \\)")
  
! (defvar mh-scan-msg-overflow-regexp "^\\?[0-9]"
    "Regexp to find a scan line in which the message number overflowed.
  The message's number is left truncated in this case.")
  
--- 121,127 ----
    "Regexp to find the number of a message in a scan line.
  The message's number must be surrounded with \\( \\)")
  
! (defvar mh-scan-msg-overflow-regexp "^[?0-9][0-9]"
    "Regexp to find a scan line in which the message number overflowed.
  The message's number is left truncated in this case.")
  
***************
*** 149,155 ****
  NOTE: This variable is not an ordinary hook;
  It may not be a list of functions.")
  
! (defvar mh-show-buffer-mode-line-buffer-id "{show-%s} %d"
    "Format string to produce `mode-line-buffer-identification' for show 
buffers.
  First argument is folder name.  Second is message number.")
  
--- 149,155 ----
  NOTE: This variable is not an ordinary hook;
  It may not be a list of functions.")
  
! (defvar mh-show-buffer-mode-line-buffer-id "    {show-%s} %d"
    "Format string to produce `mode-line-buffer-identification' for show 
buffers.
  First argument is folder name.  Second is message number.")
  
***************
*** 464,474 ****
  
  ;;; Internal bookkeeping variables:
  
- ;; The value of `mh-folder-list-change-hook' is called whenever
- ;; mh-folder-list variable is set.
- ;; List of folder names for completion.
- (defvar mh-folder-list nil)
- 
  ;; Cached value of the `Path:' component in the user's MH profile.
  ;; User's mail folder directory.
  (defvar mh-user-path nil)
--- 464,469 ----
***************
*** 492,505 ****
  ;; Name of the Inbox folder.
  (defvar mh-inbox nil)
  
! ;; Name of MH-E scratch buffer.
! (defconst mh-temp-buffer " *mh-temp*")
! 
! ;; Name of the MH-E folder list buffer.
! (defconst mh-temp-folders-buffer "*Folders*")
! 
! ;; Name of the MH-E sequences list buffer.
! (defconst mh-temp-sequences-buffer "*Sequences*")
  
  ;; Window configuration before MH-E command.
  (defvar mh-previous-window-config nil)
--- 487,506 ----
  ;; Name of the Inbox folder.
  (defvar mh-inbox nil)
  
! ;; The names of ephemeral buffers have a " *mh-" prefix (so that they are
! ;; hidden and can be programmatically removed in mh-quit), and the variable
! ;; names have the form mh-temp-.*-buffer.
! (defconst mh-temp-buffer " *mh-temp*")  ;scratch
! 
! ;; The names of MH-E buffers that are not ephemeral and can be used by the
! ;; user (and deleted by the user when no longer needed) have a "*MH-E " prefix
! ;; (so they can be programmatically removed in mh-quit), and the variable
! ;; names have the form mh-.*-buffer.
! (defconst mh-folders-buffer "*MH-E Folders*") ;folder list
! (defconst mh-info-buffer "*MH-E Info*") ;version information buffer
! (defconst mh-log-buffer "*MH-E Log*") ;output of MH commands and so on
! (defconst mh-recipients-buffer "*MH-E Recipients*") ;killed when draft sent
! (defconst mh-sequences-buffer "*MH-E Sequences*") ;sequences list
  
  ;; Window configuration before MH-E command.
  (defvar mh-previous-window-config nil)
***************
*** 530,535 ****
--- 531,549 ----
  (defvar mh-show-folder-buffer nil
    "Keeps track of folder whose message is being displayed.")
  
+ (defvar mh-logo-cache nil)
+ 
+ (defun mh-logo-display ()
+   "Modify mode line to display MH-E logo."
+   (when (fboundp 'find-image)
+     (add-text-properties
+      0 2
+      `(display ,(or mh-logo-cache
+                     (setq mh-logo-cache
+                           (find-image '((:type xpm :ascent center
+                                          :file "mh-logo.xpm"))))))
+      (car mode-line-buffer-identification))))
+ 
  ;;; This holds a documentation string used by describe-mode.
  (defun mh-showing-mode (&optional arg)
    "Change whether messages should be displayed.
***************
*** 1133,1154 ****
      (delete-other-windows)
      (switch-to-buffer edit-buffer)))
  
! (defun mh-decode-quoted-printable ()
!   "Run mimedecode on current buffer, replacing its contents."
!   (let ((case-fold-search t))
      (goto-char (point-min))
!     (when (and (re-search-forward
!                 "^content-transfer-encoding:[ \t]*quoted-printable"
!                 (if mh-decode-mime-flag (mail-header-end) nil) t)
!                (search-forward "\n\n" nil t))
!       (message "Converting quoted-printable characters...")
!       (let ((modified (buffer-modified-p))
!             (command "mimedecode"))
!         (shell-command-on-region (point-min) (point-max) command t t)
!         (if (fboundp 'deactivate-mark)
!             (deactivate-mark))
!         (set-buffer-modified-p modified))
!       (message "Converting quoted-printable characters... done."))))
  
  (defun mh-show-unquote-From ()
    "Decode >From at beginning of lines for `mh-show-mode'."
--- 1147,1171 ----
      (delete-other-windows)
      (switch-to-buffer edit-buffer)))
  
! (defun mh-decode-content-transfer-encoded-message ()
!   "Run mimencode on message body, if needed."
!   (let ((case-fold-search t)
!         (header-end (mail-header-end)))
      (goto-char (point-min))
!     (when (re-search-forward "^content-transfer-encoding: " header-end t)
!       (let ((enc (buffer-substring-no-properties (point) (line-end-position)))
!             cmdline)
!         (setq cmdline
!               (cond ((string-match "base64" enc) (list "-u" "-b" "-p"))
!                     ((string-match "quoted-printable" enc) (list "-u" "-q"))
!                     (t nil)))
!         (when cmdline
!           (beginning-of-line)
!           (insert "Removed-")
!           (setq header-end (mail-header-end))
!           (goto-char (1+ header-end))
!           (apply #'call-process-region (1+ header-end) (point-max) "mimencode"
!                  t t nil cmdline))))))
  
  (defun mh-show-unquote-From ()
    "Decode >From at beginning of lines for `mh-show-mode'."
***************
*** 1208,1216 ****
                                           (if (stringp formfile)
                                               (list "-form" formfile))
                                           msg-filename)
!                (insert-file-contents msg-filename))
!              (if mh-decode-quoted-printable-flag
!                  (mh-decode-quoted-printable))
               ;; Cleanup old mime handles
               (mh-mime-cleanup)
               ;; Use mm to display buffer
--- 1225,1233 ----
                                           (if (stringp formfile)
                                               (list "-form" formfile))
                                           msg-filename)
!                (insert-file-contents-literally msg-filename))
!              (if mh-decode-content-transfer-encoded-message-flag
!                  (mh-decode-content-transfer-encoded-message))
               ;; Cleanup old mime handles
               (mh-mime-cleanup)
               ;; Use mm to display buffer
***************
*** 1248,1253 ****
--- 1265,1271 ----
               (setq mode-line-buffer-identification
                     (list (format mh-show-buffer-mode-line-buffer-id
                                   folder-name msg-num)))
+              (mh-logo-display)
               (set-buffer folder)
               (setq mh-showing-with-headers nil))))))
  
***************
*** 1407,1418 ****
        (setq mh-previous-seq (mh-get-profile-field "Previous-Sequence:"))
        (if mh-previous-seq
            (setq mh-previous-seq (intern mh-previous-seq)))
!       (run-hooks 'mh-find-path-hook)))
!   (and mh-auto-folder-collect-flag
!        (let ((mh-no-install t))         ;only get folders if MH installed
!          (condition-case err
!              (mh-make-folder-list-background)
!            (file-error)))))             ;so don't complain if not installed
  
  (defun mh-file-command-p (file)
    "Return t if file FILE is the name of a executable regular file."
--- 1425,1431 ----
        (setq mh-previous-seq (mh-get-profile-field "Previous-Sequence:"))
        (if mh-previous-seq
            (setq mh-previous-seq (intern mh-previous-seq)))
!       (run-hooks 'mh-find-path-hook))))
  
  (defun mh-file-command-p (file)
    "Return t if file FILE is the name of a executable regular file."
***************
*** 1537,1547 ****
                                 (match-beginning 1) (match-end 1))))))
      width))
  
! (defun mh-add-msgs-to-seq (msgs seq &optional internal-flag)
    "Add MSGS to SEQ.
  Remove duplicates and keep sequence sorted. If optional INTERNAL-FLAG is
  non-nil, do not mark the message in the scan listing or inform MH of the
! addition."
    (let ((entry (mh-find-seq seq)))
      (if (and msgs (atom msgs)) (setq msgs (list msgs)))
      (if (null entry)
--- 1550,1563 ----
                                 (match-beginning 1) (match-end 1))))))
      width))
  
! (defun mh-add-msgs-to-seq (msgs seq &optional internal-flag 
dont-annotate-flag)
    "Add MSGS to SEQ.
  Remove duplicates and keep sequence sorted. If optional INTERNAL-FLAG is
  non-nil, do not mark the message in the scan listing or inform MH of the
! addition.
! 
! If DONT-ANNOTATE-FLAG is non-nil then the annotations in the folder buffer are
! not updated."
    (let ((entry (mh-find-seq seq)))
      (if (and msgs (atom msgs)) (setq msgs (list msgs)))
      (if (null entry)
***************
*** 1552,1558 ****
                                (append msgs (mh-seq-msgs entry))))))
      (cond ((not internal-flag)
             (mh-add-to-sequence seq msgs)
!            (mh-notate-seq seq mh-note-seq (1+ mh-cmd-note))))))
  
  (defun mh-canonicalize-sequence (msgs)
    "Sort MSGS in decreasing order and remove duplicates."
--- 1568,1575 ----
                                (append msgs (mh-seq-msgs entry))))))
      (cond ((not internal-flag)
             (mh-add-to-sequence seq msgs)
!            (unless dont-annotate-flag
!              (mh-notate-seq seq mh-note-seq (1+ mh-cmd-note)))))))
  
  (defun mh-canonicalize-sequence (msgs)
    "Sort MSGS in decreasing order and remove duplicates."
***************
*** 1564,1582 ****
          (setq head (cdr head))))
      sorted-msgs))
  
  (defvar mh-folder-hist nil)
  (defvar mh-speed-folder-map)
  
  (defun mh-prompt-for-folder (prompt default can-create
!                                     &optional default-string)
    "Prompt for a folder name with PROMPT.
  Returns the folder's name as a string. DEFAULT is used if the folder exists
  and the user types return. If the CAN-CREATE flag is t, then a folder is
  created if it doesn't already exist. If optional argument DEFAULT-STRING is
! non-nil, use it in the prompt instead of DEFAULT.
! The value of `mh-folder-list-change-hook' is a list of functions to be called,
! with no arguments, whenever the cached folder list `mh-folder-list' is
! changed."
    (if (null default)
        (setq default ""))
    (let* ((default-string (cond (default-string (format " [%s]? "
--- 1581,1773 ----
          (setq head (cdr head))))
      sorted-msgs))
  
+ (defvar mh-sub-folders-cache (make-hash-table :test #'equal))
+ 
+ (defun mh-normalize-folder-name (folder &optional empty-string-okay
+                                         dont-remove-trailing-slash)
+   "Normalizes FOLDER name.
+ Makes sure that two '/' characters never occur next to each other. Also all
+ occurrences of \"..\" and \".\" are suitably processed. So \"+inbox/../news\"
+ will be normalized to \"+news\".
+ 
+ If optional argument EMPTY-STRING-OKAY is nil then a '+' is added at the
+ front if FOLDER lacks one. If non-nil and FOLDER is the empty string then
+ nothing is added.
+ 
+ If optional argument DONT-REMOVE-TRAILING-SLASH is non-nil then a trailing '/'
+ if present is retained (if present), otherwise it is removed."
+   (when (stringp folder)
+     ;; Replace two or more consecutive '/' characters with a single '/'
+     (while (string-match "//" folder)
+       (setq folder (replace-match "/" nil t folder)))
+     (let* ((length (length folder))
+            (trailing-slash-present (and (> length 0)
+                                         (equal (aref folder (1- length)) 
?/))))
+       (let ((components (split-string folder "/"))
+             (result ()))
+         ;; Remove .. and . from the pathname.
+         (dolist (component components)
+           (cond ((and (equal component "..") result)
+                  (pop result))
+                 ((equal component ".."))
+                 ((equal component "."))
+                 (t (push component result))))
+         (setq folder "")
+         (dolist (component result)
+           (setq folder (concat component "/" folder)))
+         ;; Remove trailing '/' if needed.
+         (unless (and trailing-slash-present dont-remove-trailing-slash)
+           (when (not (equal folder ""))
+             (setq folder (substring folder 0 (1- (length folder))))))))
+     (cond ((and empty-string-okay (equal folder "")))
+           ((equal folder "") (setq folder "+"))
+           ((not (equal (aref folder 0) ?+)) (setq folder (concat "+" 
folder)))))
+   folder)
+ 
+ (defun mh-sub-folders (folder &optional add-trailing-slash-flag)
+   "Find the subfolders of FOLDER.
+ The function avoids running folders unnecessarily by caching the results of
+ the actual folders call.
+ 
+ If optional argument ADD-TRAILING-SLASH-FLAG is non-nil then a slash is added
+ to each of the sub-folder names that may have nested folders within them."
+   (let* ((folder (mh-normalize-folder-name folder))
+          (match (gethash folder mh-sub-folders-cache 'no-result))
+          (sub-folders (cond ((eq match 'no-result)
+                              (setf (gethash folder mh-sub-folders-cache)
+                                    (mh-sub-folders-actual folder)))
+                             (t match))))
+     (if add-trailing-slash-flag
+         (mapcar #'(lambda (x)
+                     (if (cdr x) (cons (concat (car x) "/") (cdr x)) x))
+                 sub-folders)
+       sub-folders)))
+ 
+ (defun mh-sub-folders-actual (folder)
+   "Execute the command folders to return the sub-folders of FOLDER.
+ Filters out the folder names that start with \".\" so that directories that
+ aren't usually mail folders are hidden."
+   (let ((arg-list `(,(expand-file-name "folders" mh-progs)
+                     nil (t nil) nil "-noheader" "-norecurse" "-nototal"
+                     ,@(if (stringp folder) (list folder) ())))
+         (results ())
+         (current-folder (concat
+                          (with-temp-buffer
+                            (call-process (expand-file-name "folder" mh-progs)
+                                          nil '(t nil) nil "-fast")
+                            (buffer-substring (point-min) (1- (point-max))))
+                          "+")))
+     (with-temp-buffer
+       (apply #'call-process arg-list)
+       (goto-char (point-min))
+       (while (not (and (eolp) (bolp)))
+         (goto-char (line-end-position))
+         (let ((has-pos (search-backward " has " (line-beginning-position) t)))
+           (when (integerp has-pos)
+             (while (equal (char-after has-pos) ? )
+               (decf has-pos))
+             (incf has-pos)
+             (let* ((name (buffer-substring (line-beginning-position) has-pos))
+                    (first-char (aref name 0))
+                    (last-char (aref name (1- (length name)))))
+               (unless (member first-char '(?. ?# ?,))
+                 (when (and (equal last-char ?+) (equal name current-folder))
+                   (setq name (substring name 0 (1- (length name)))))
+                 (push
+                  (cons name
+                        (search-forward "(others)" (line-end-position) t))
+                  results))))
+           (forward-line 1))))
+     (setq results (nreverse results))
+     (when (stringp folder)
+       (setq results (cdr results))
+       (let ((folder-name-len (length (format "%s/" (substring folder 1)))))
+         (setq results (mapcar (lambda (f)
+                                 (cons (substring (car f) folder-name-len)
+                                       (cdr f)))
+                               results))))
+     results))
+ 
+ (defun mh-remove-from-sub-folders-cache (folder)
+   "Remove FOLDER and its parent from `mh-sub-folders-cache'.
+ FOLDER should be unconditionally removed from the cache. Also the last 
ancestor
+ of FOLDER present in the cache must be removed as well.
+ 
+ To see why this is needed assume we have a folder +foo which has a single
+ sub-folder qux. Now we create the folder +foo/bar/baz. Here we will need to
+ invalidate the cached sub-folders of +foo, otherwise completion on +foo won't
+ tell us about the option +foo/bar!"
+   (remhash folder mh-sub-folders-cache)
+   (block ancestor-found
+     (let ((parent folder)
+           (one-ancestor-found nil)
+           last-slash)
+       (while (setq last-slash (mh-search-from-end ?/ parent))
+         (setq parent (substring parent 0 last-slash))
+         (unless (eq (gethash parent  mh-sub-folders-cache 'none) 'none)
+           (remhash parent mh-sub-folders-cache)
+           (if one-ancestor-found
+               (return-from ancestor-found)
+             (setq one-ancestor-found t))))
+       (remhash nil mh-sub-folders-cache))))
+ 
  (defvar mh-folder-hist nil)
  (defvar mh-speed-folder-map)
+ (defvar mh-folder-completion-map (copy-keymap 
minibuffer-local-completion-map))
+ (define-key mh-folder-completion-map " " 'minibuffer-complete)
+ 
+ (defun mh-folder-completion-function (name predicate flag)
+   "Programmable completion for folder names.
+ NAME is the partial folder name that has been input. PREDICATE if non-nil is a
+ function that is used to filter the possible choices and FLAG determines
+ whether the completion is over."
+   (let* ((orig-name name)
+          (name (mh-normalize-folder-name name nil t))
+          (last-slash (mh-search-from-end ?/ name))
+          (last-complete (if last-slash (substring name 0 last-slash) nil))
+          (remainder (cond (last-complete (substring name (1+ last-slash)))
+                           ((and (> (length name) 0) (equal (aref name 0) ?+))
+                            (substring name 1))
+                           (t ""))))
+     (cond ((eq flag nil)
+            (let ((try-res (try-completion
+                            name
+                            (mapcar (lambda (x)
+                                      (cons (if (not last-complete)
+                                                (concat "+" (car x))
+                                              (concat last-complete "/" (car 
x)))
+                                            (cdr x)))
+                                    (mh-sub-folders last-complete t))
+                            predicate)))
+              (cond ((eq try-res nil) nil)
+                    ((and (eq try-res t) (equal name orig-name)) t)
+                    ((eq try-res t) name)
+                    (t try-res))))
+           ((eq flag t)
+            (all-completions
+             remainder (mh-sub-folders last-complete t) predicate))
+           ((eq flag 'lambda)
+            (file-exists-p
+             (concat mh-user-path
+                     (substring (mh-normalize-folder-name name) 1)))))))
+ 
+ (defun mh-folder-completing-read (prompt default)
+   "Read folder name with PROMPT and default result DEFAULT."
+   (mh-normalize-folder-name
+    (let ((minibuffer-local-completion-map mh-folder-completion-map))
+      (completing-read prompt 'mh-folder-completion-function nil nil nil
+                       'mh-folder-hist default))
+    t))
  
  (defun mh-prompt-for-folder (prompt default can-create
!                              &optional default-string allow-root-folder-flag)
    "Prompt for a folder name with PROMPT.
  Returns the folder's name as a string. DEFAULT is used if the folder exists
  and the user types return. If the CAN-CREATE flag is t, then a folder is
  created if it doesn't already exist. If optional argument DEFAULT-STRING is
! non-nil, use it in the prompt instead of DEFAULT. If ALLOW-ROOT-FOLDER-FLAG is
! non-nil then the function will accept the folder +, which means all folders
! when used in searching."
    (if (null default)
        (setq default ""))
    (let* ((default-string (cond (default-string (format " [%s]? "
***************
*** 1585,1597 ****
                                 (t (format " [%s]? " default))))
           (prompt (format "%s folder%s" prompt default-string))
           read-name folder-name)
!     (if (null mh-folder-list)
!         (mh-set-folder-list))
!     (while (and (setq read-name (completing-read prompt mh-folder-list nil nil
!                                                  "+" 'mh-folder-hist))
                  (equal read-name "")
                  (equal default "")))
!     (cond ((or (equal read-name "") (equal read-name "+"))
             (setq read-name default))
            ((not (mh-folder-name-p read-name))
             (setq read-name (format "+%s" read-name))))
--- 1776,1786 ----
                                 (t (format " [%s]? " default))))
           (prompt (format "%s folder%s" prompt default-string))
           read-name folder-name)
!     (while (and (setq read-name (mh-folder-completing-read prompt default))
                  (equal read-name "")
                  (equal default "")))
!     (cond ((or (equal read-name "")
!                (and (equal read-name "+") (not allow-root-folder-flag)))
             (setq read-name default))
            ((not (mh-folder-name-p read-name))
             (setq read-name (format "+%s" read-name))))
***************
*** 1609,1709 ****
                             folder-name)))
               (message "Creating %s" folder-name)
               (mh-exec-cmd-error nil "folder" folder-name)
               (when (boundp 'mh-speed-folder-map)
                 (mh-speed-add-folder folder-name))
!              (message "Creating %s...done" folder-name)
!              (setq mh-folder-list (cons (list read-name) mh-folder-list))
!              (run-hooks 'mh-folder-list-change-hook))
              (new-file-flag
               (error "Folder %s is not created" folder-name))
              ((not (file-directory-p (mh-expand-file-name folder-name)))
               (error "\"%s\" is not a directory"
!                     (mh-expand-file-name folder-name)))
!             ((and (null (assoc read-name mh-folder-list))
!                   (null (assoc (concat read-name "/") mh-folder-list)))
!              (setq mh-folder-list (cons (list read-name) mh-folder-list))
!              (run-hooks 'mh-folder-list-change-hook))))
      folder-name))
  
- (defvar mh-make-folder-list-process nil) ;The background process collecting
-                                          ;the folder list.
- 
- (defvar mh-folder-list-temp nil)        ;mh-folder-list as it is being built.
- 
- (defvar mh-folder-list-partial-line "") ;Start of last incomplete line from
-                                         ;folder process.
- 
- (defun mh-set-folder-list ()
-   "Set `mh-folder-list' correctly.
- A useful function for the command line or for when you need to
- sync by hand.  Format is in a form suitable for completing read.
- The value of `mh-folder-list-change-hook' is a list of functions to be called,
- with no arguments, once the list of folders has been created."
-   (message "Collecting folder names...")
-   (if (not mh-make-folder-list-process)
-       (mh-make-folder-list-background))
-   (while (eq (process-status mh-make-folder-list-process) 'run)
-     (accept-process-output mh-make-folder-list-process))
-   (setq mh-folder-list mh-folder-list-temp)
-   (run-hooks 'mh-folder-list-change-hook)
-   (setq mh-folder-list-temp nil)
-   (delete-process mh-make-folder-list-process)
-   (setq mh-make-folder-list-process nil)
-   (message "Collecting folder names...done"))
- 
- (defun mh-make-folder-list-background ()
-   "Start a background process to compute a list of the user's folders.
- Call `mh-set-folder-list' to wait for the result."
-   (cond
-    ((not mh-make-folder-list-process)
-     (unless mh-inbox
-       (mh-find-path))
-     (let ((process-connection-type nil))
-       (setq mh-make-folder-list-process
-             (start-process "folders" nil (expand-file-name "folders" mh-progs)
-                            "-fast"
-                            (if mh-recursive-folders-flag
-                                "-recurse"
-                              "-norecurse")))
-       (set-process-filter mh-make-folder-list-process
-                           'mh-make-folder-list-filter)
-       (process-kill-without-query mh-make-folder-list-process)))))
- 
- (defun mh-make-folder-list-filter (process output)
-   "Given the PROCESS \"folders -fast\", parse OUTPUT.
- See also `set-process-filter'."
-   (let ((position 0)
-         line-end
-         new-folder
-         (prevailing-match-data (match-data)))
-     (unwind-protect
-         ;; make sure got complete line
-         (while (setq line-end (string-match "\n" output position))
-           (setq new-folder (format "+%s%s"
-                                    mh-folder-list-partial-line
-                                    (substring output position line-end)))
-           (setq mh-folder-list-partial-line "")
-           ;; is new folder a subfolder of previous?
-           (if (and mh-folder-list-temp
-                    (string-match
-                     (regexp-quote
-                      (concat (car (car mh-folder-list-temp)) "/"))
-                     new-folder))
-               ;; append slash to parent folder for better completion
-               ;; (undone by mh-prompt-for-folder)
-               (setq mh-folder-list-temp
-                     (cons
-                      (list new-folder)
-                      (cons
-                       (list (concat (car (car mh-folder-list-temp)) "/"))
-                       (cdr mh-folder-list-temp))))
-             (setq mh-folder-list-temp
-                   (cons (list new-folder)
-                         mh-folder-list-temp)))
-           (setq position (1+ line-end)))
-       (set-match-data prevailing-match-data))
-     (setq mh-folder-list-partial-line (substring output position))))
- 
  ;;; Issue commands to MH.
  
  (defun mh-exec-cmd (command &rest args)
--- 1798,1814 ----
                             folder-name)))
               (message "Creating %s" folder-name)
               (mh-exec-cmd-error nil "folder" folder-name)
+              (mh-remove-from-sub-folders-cache folder-name)
               (when (boundp 'mh-speed-folder-map)
                 (mh-speed-add-folder folder-name))
!              (message "Creating %s...done" folder-name))
              (new-file-flag
               (error "Folder %s is not created" folder-name))
              ((not (file-directory-p (mh-expand-file-name folder-name)))
               (error "\"%s\" is not a directory"
!                     (mh-expand-file-name folder-name)))))
      folder-name))
  
  ;;; Issue commands to MH.
  
  (defun mh-exec-cmd (command &rest args)
***************
*** 1712,1725 ****
  Any output is assumed to be an error and is shown to the user.
  The output is not read or parsed by MH-E."
    (save-excursion
!     (set-buffer (get-buffer-create mh-temp-buffer))
      (erase-buffer)
      (apply 'call-process
             (expand-file-name command mh-progs) nil t nil
             (mh-list-to-string args))
      (if (> (buffer-size) 0)
          (save-window-excursion
!           (switch-to-buffer-other-window mh-temp-buffer)
            (sit-for 5)))))
  
  (defun mh-exec-cmd-error (env command &rest args)
--- 1817,1830 ----
  Any output is assumed to be an error and is shown to the user.
  The output is not read or parsed by MH-E."
    (save-excursion
!     (set-buffer (get-buffer-create mh-log-buffer))
      (erase-buffer)
      (apply 'call-process
             (expand-file-name command mh-progs) nil t nil
             (mh-list-to-string args))
      (if (> (buffer-size) 0)
          (save-window-excursion
!           (switch-to-buffer-other-window mh-log-buffer)
            (sit-for 5)))))
  
  (defun mh-exec-cmd-error (env command &rest args)
***************
*** 1743,1766 ****
                      (mh-list-to-string args)))))
        (mh-handle-process-error command status))))
  
! (defun mh-exec-cmd-daemon (command &rest args)
!   "Execute MH command COMMAND with ARGS in the background.
! Any output from command is displayed in an asynchronous pop-up window."
    (save-excursion
!     (set-buffer (get-buffer-create mh-temp-buffer))
      (erase-buffer))
    (let* ((process-connection-type nil)
           (process (apply 'start-process
                           command nil
                           (expand-file-name command mh-progs)
                           (mh-list-to-string args))))
!     (set-process-filter process 'mh-process-daemon)))
  
  (defun mh-process-daemon (process output)
!   "PROCESS daemon that puts OUTPUT into a temporary buffer."
!   (set-buffer (get-buffer-create mh-temp-buffer))
    (insert-before-markers output)
!   (display-buffer mh-temp-buffer))
  
  (defun mh-exec-cmd-quiet (raise-error command &rest args)
    "Signal RAISE-ERROR if COMMAND with ARGS fails.
--- 1848,1877 ----
                      (mh-list-to-string args)))))
        (mh-handle-process-error command status))))
  
! (defun mh-exec-cmd-daemon (command filter &rest args)
!   "Execute MH command COMMAND in the background.
! 
! If FILTER is non-nil then it is used to process the output otherwise the
! default filter `mh-process-daemon' is used. See `set-process-filter' for more
! details of FILTER.
! 
! ARGS are passed to COMMAND as command line arguments."
    (save-excursion
!     (set-buffer (get-buffer-create mh-log-buffer))
      (erase-buffer))
    (let* ((process-connection-type nil)
           (process (apply 'start-process
                           command nil
                           (expand-file-name command mh-progs)
                           (mh-list-to-string args))))
!     (set-process-filter process (or filter 'mh-process-daemon))))
  
  (defun mh-process-daemon (process output)
!   "PROCESS daemon that puts OUTPUT into a temporary buffer.
! Any output from the process is displayed in an asynchronous pop-up window."
!   (set-buffer (get-buffer-create mh-log-buffer))
    (insert-before-markers output)
!   (display-buffer mh-log-buffer))
  
  (defun mh-exec-cmd-quiet (raise-error command &rest args)
    "Signal RAISE-ERROR if COMMAND with ARGS fails.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]