Mercurial > emacs
comparison lisp/mh-e/mh-speed.el @ 49578:b35587af8747
Upgraded to MH-E version 7.2.
See etc/MH-E-NEWS and lisp/mh-e/ChangeLog for details.
author | Bill Wohler <wohler@newt.com> |
---|---|
date | Mon, 03 Feb 2003 20:55:30 +0000 |
parents | 06b77df47802 |
children | 7dd3d5eae9c7 d7ddb3e565de |
comparison
equal
deleted
inserted
replaced
49577:dad6f3184ccd | 49578:b35587af8747 |
---|---|
29 | 29 |
30 ;; Speedbar support for MH-E package. | 30 ;; Speedbar support for MH-E package. |
31 | 31 |
32 ;;; Change Log: | 32 ;;; Change Log: |
33 | 33 |
34 ;; $Id: mh-speed.el,v 1.2 2003/01/08 23:21:16 wohler Exp $ | 34 ;; $Id: mh-speed.el,v 1.37 2003/01/31 03:18:18 satyaki Exp $ |
35 | 35 |
36 ;;; Code: | 36 ;;; Code: |
37 | 37 |
38 ;; Requires | 38 ;; Requires |
39 (require 'cl) | 39 (require 'cl) |
42 | 42 |
43 ;; Global variables | 43 ;; Global variables |
44 (defvar mh-speed-refresh-flag nil) | 44 (defvar mh-speed-refresh-flag nil) |
45 (defvar mh-speed-last-selected-folder nil) | 45 (defvar mh-speed-last-selected-folder nil) |
46 (defvar mh-speed-folder-map (make-hash-table :test #'equal)) | 46 (defvar mh-speed-folder-map (make-hash-table :test #'equal)) |
47 (defvar mh-speed-folders-cache (make-hash-table :test #'equal)) | |
48 (defvar mh-speed-flists-cache (make-hash-table :test #'equal)) | 47 (defvar mh-speed-flists-cache (make-hash-table :test #'equal)) |
49 (defvar mh-speed-flists-process nil) | 48 (defvar mh-speed-flists-process nil) |
50 (defvar mh-speed-flists-timer nil) | 49 (defvar mh-speed-flists-timer nil) |
51 (defvar mh-speed-partial-line "") | 50 (defvar mh-speed-partial-line "") |
52 | 51 |
254 (when directory-end | 253 (when directory-end |
255 (format "+%s" (substring rel-path 0 directory-end))))))))) | 254 (format "+%s" (substring rel-path 0 directory-end))))))))) |
256 | 255 |
257 (defun mh-speed-add-buttons (folder level) | 256 (defun mh-speed-add-buttons (folder level) |
258 "Add speedbar button for FOLDER which is at indented by LEVEL amount." | 257 "Add speedbar button for FOLDER which is at indented by LEVEL amount." |
259 (let ((folder-list (mh-speed-folders folder))) | 258 (let ((folder-list (mh-sub-folders folder))) |
260 (mapc | 259 (mapc |
261 (lambda (f) | 260 (lambda (f) |
262 (let* ((folder-name (format "%s%s%s" (or folder "+") | 261 (let* ((folder-name (format "%s%s%s" (or folder "+") |
263 (if folder "/" "") (car f))) | 262 (if folder "/" "") (car f))) |
264 (counts (gethash folder-name mh-speed-flists-cache))) | 263 (counts (gethash folder-name mh-speed-flists-cache))) |
342 (when (stringp folder) | 341 (when (stringp folder) |
343 (speedbar-with-attached-buffer | 342 (speedbar-with-attached-buffer |
344 (mh-visit-folder folder range) | 343 (mh-visit-folder folder range) |
345 (delete-other-windows))))) | 344 (delete-other-windows))))) |
346 | 345 |
347 (defun mh-speed-folders (folder) | 346 (defvar mh-speed-current-folder nil) |
348 "Find the subfolders of FOLDER. | |
349 The function avoids running folders unnecessarily by caching the results of | |
350 the actual folders call." | |
351 (let ((match (gethash folder mh-speed-folders-cache 'no-result))) | |
352 (cond ((eq match 'no-result) | |
353 (setf (gethash folder mh-speed-folders-cache) | |
354 (mh-speed-folders-actual folder))) | |
355 (t match)))) | |
356 | |
357 (defun mh-speed-folders-actual (folder) | |
358 "Execute the command folders to return the sub-folders of FOLDER. | |
359 Filters out the folder names that start with \".\" so that directories that | |
360 aren't usually mail folders are hidden." | |
361 (let* ((folder (cond ((and (stringp folder) | |
362 (equal (substring folder 0 1) "+")) | |
363 folder) | |
364 (t nil))) | |
365 (arg-list `(,(expand-file-name "folders" mh-progs) | |
366 nil (t nil) nil "-noheader" "-norecurse" | |
367 ,@(if (stringp folder) (list folder) ()))) | |
368 (results ())) | |
369 (with-temp-buffer | |
370 (apply #'call-process arg-list) | |
371 (goto-char (point-min)) | |
372 (while (not (and (eolp) (bolp))) | |
373 (goto-char (line-end-position)) | |
374 (let ((has-pos (search-backward " has " (line-beginning-position) t))) | |
375 (when (integerp has-pos) | |
376 (while (or (equal (char-after has-pos) ? ) | |
377 (equal (char-after has-pos) ?+)) | |
378 (decf has-pos)) | |
379 (incf has-pos) | |
380 (let ((name (buffer-substring (line-beginning-position) has-pos))) | |
381 (let ((first-char (substring name 0 1))) | |
382 (unless (or (string-equal first-char ".") | |
383 (string-equal first-char "#") | |
384 (string-equal first-char ",")) | |
385 (push | |
386 (cons name | |
387 (search-forward "(others)" (line-end-position) t)) | |
388 results))))) | |
389 (forward-line 1)))) | |
390 (setq results (nreverse results)) | |
391 (when (stringp folder) | |
392 (setq results (cdr results)) | |
393 (let ((folder-name-len (length (format "%s/" (substring folder 1))))) | |
394 (setq results (mapcar (lambda (f) | |
395 (cons (substring (car f) folder-name-len) | |
396 (cdr f))) | |
397 results)))) | |
398 results)) | |
399 | 347 |
400 ;;;###mh-autoload | 348 ;;;###mh-autoload |
401 (defun mh-speed-flists (force) | 349 (defun mh-speed-flists (force) |
402 "Execute flists -recurse and update message counts. | 350 "Execute flists -recurse and update message counts. |
403 If FORCE is non-nil the timer is reset." | 351 If FORCE is non-nil the timer is reset." |
416 nil mh-speed-flists-interval | 364 nil mh-speed-flists-interval |
417 (lambda () | 365 (lambda () |
418 (unless (and (processp mh-speed-flists-process) | 366 (unless (and (processp mh-speed-flists-process) |
419 (not (eq (process-status mh-speed-flists-process) | 367 (not (eq (process-status mh-speed-flists-process) |
420 'exit))) | 368 'exit))) |
369 (setq mh-speed-current-folder | |
370 (concat | |
371 (with-temp-buffer | |
372 (call-process (expand-file-name "folder" mh-progs) | |
373 nil '(t nil) nil "-fast") | |
374 (buffer-substring (point-min) (1- (point-max)))) | |
375 "+")) | |
421 (setq mh-speed-flists-process | 376 (setq mh-speed-flists-process |
422 (start-process (expand-file-name "flists" mh-progs) nil | 377 (start-process "*flists*" nil |
423 "flists" "-recurse" | 378 (expand-file-name "flists" mh-progs) |
379 "-recurse" | |
424 "-sequence" (symbol-name mh-unseen-seq))) | 380 "-sequence" (symbol-name mh-unseen-seq))) |
425 (set-process-filter mh-speed-flists-process | 381 (set-process-filter mh-speed-flists-process |
426 'mh-speed-parse-flists-output))))))) | 382 'mh-speed-parse-flists-output))))))) |
427 | 383 |
428 ;; Copied from mh-make-folder-list-filter... | 384 ;; Copied from mh-make-folder-list-filter... |
438 (setq line (format "%s%s" | 394 (setq line (format "%s%s" |
439 mh-speed-partial-line | 395 mh-speed-partial-line |
440 (substring output position line-end)) | 396 (substring output position line-end)) |
441 mh-speed-partial-line "") | 397 mh-speed-partial-line "") |
442 (multiple-value-setq (folder unseen total) | 398 (multiple-value-setq (folder unseen total) |
443 (mh-parse-flist-output-line line)) | 399 (mh-parse-flist-output-line line mh-speed-current-folder)) |
444 (when (and folder unseen total) | 400 (when (and folder unseen total) |
445 (setf (gethash folder mh-speed-flists-cache) (cons unseen total)) | 401 (setf (gethash folder mh-speed-flists-cache) (cons unseen total)) |
446 (save-excursion | 402 (save-excursion |
447 (when (buffer-live-p (get-buffer speedbar-buffer)) | 403 (when (buffer-live-p (get-buffer speedbar-buffer)) |
448 (set-buffer speedbar-buffer) | 404 (set-buffer speedbar-buffer) |
487 (let* ((speedbar-update-flag nil) | 443 (let* ((speedbar-update-flag nil) |
488 (last-slash (mh-search-from-end ?/ folder)) | 444 (last-slash (mh-search-from-end ?/ folder)) |
489 (parent (if last-slash (substring folder 0 last-slash) nil)) | 445 (parent (if last-slash (substring folder 0 last-slash) nil)) |
490 (parent-position (gethash parent mh-speed-folder-map)) | 446 (parent-position (gethash parent mh-speed-folder-map)) |
491 (parent-change nil)) | 447 (parent-change nil)) |
492 (remhash parent mh-speed-folders-cache) | |
493 (remhash folder mh-speed-folders-cache) | |
494 (when parent-position | 448 (when parent-position |
495 (let ((parent-kids (mh-speed-folders parent))) | 449 (let ((parent-kids (mh-sub-folders parent))) |
496 (cond ((null parent-kids) | 450 (cond ((null parent-kids) |
497 (setq parent-change ?+)) | 451 (setq parent-change ?+)) |
498 ((and (null (cdr parent-kids)) | 452 ((and (null (cdr parent-kids)) |
499 (equal (if last-slash | 453 (equal (if last-slash |
500 (substring folder (1+ last-slash)) | 454 (substring folder (1+ last-slash)) |
515 (mh-speed-highlight mh-speed-last-selected-folder | 469 (mh-speed-highlight mh-speed-last-selected-folder |
516 'mh-speedbar-folder-face) | 470 'mh-speedbar-folder-face) |
517 (setq mh-speed-last-selected-folder nil) | 471 (setq mh-speed-last-selected-folder nil) |
518 (setq mh-speed-refresh-flag t))) | 472 (setq mh-speed-refresh-flag t))) |
519 (when (equal folder "") | 473 (when (equal folder "") |
520 (clrhash mh-speed-folders-cache))))) | 474 (clrhash mh-sub-folders-cache))))) |
521 | 475 |
522 ;;;###mh-autoload | 476 ;;;###mh-autoload |
523 (defun mh-speed-add-folder (folder) | 477 (defun mh-speed-add-folder (folder) |
524 "Add FOLDER since it is being created. | 478 "Add FOLDER since it is being created. |
525 The function invalidates the latest ancestor that is present." | 479 The function invalidates the latest ancestor that is present." |
543 (add-text-properties | 497 (add-text-properties |
544 (line-beginning-position) (1+ (line-beginning-position)) | 498 (line-beginning-position) (1+ (line-beginning-position)) |
545 `(mh-children-p t))) | 499 `(mh-children-p t))) |
546 (when (get-text-property (line-beginning-position) 'mh-expanded) | 500 (when (get-text-property (line-beginning-position) 'mh-expanded) |
547 (mh-speed-toggle)) | 501 (mh-speed-toggle)) |
548 (remhash ancestor mh-speed-folders-cache) | |
549 (setq mh-speed-refresh-flag t)))) | 502 (setq mh-speed-refresh-flag t)))) |
550 | 503 |
551 ;; Make it slightly more general to allow for [ ] buttons to be changed to | 504 ;; Make it slightly more general to allow for [ ] buttons to be changed to |
552 ;; [+]. | 505 ;; [+]. |
553 (defun mh-speedbar-change-expand-button-char (char) | 506 (defun mh-speedbar-change-expand-button-char (char) |