# HG changeset patch # User Thien-Thi Nguyen # Date 1148369420 0 # Node ID 9119e54a8121bc168395fcd316996d53a471e62c # Parent b90abedf3b79a4a4f17c43c146619ec5ade0439b (ewoc-delete): New function. (ewoc-filter): Use `ewoc-delete'. diff -r b90abedf3b79 -r 9119e54a8121 lisp/emacs-lisp/ewoc.el --- a/lisp/emacs-lisp/ewoc.el Tue May 23 07:19:45 2006 +0000 +++ b/lisp/emacs-lisp/ewoc.el Tue May 23 07:30:20 2006 +0000 @@ -107,6 +107,7 @@ ;; (defun ewoc-nth (ewoc n) ;; (defun ewoc-map (map-function ewoc &rest args) ;; (defun ewoc-filter (ewoc predicate &rest args) +;; (defun ewoc-delete (ewoc &rest nodes) ;; (defun ewoc-locate (ewoc &optional pos guess) ;; (defun ewoc-invalidate (ewoc &rest nodes) ;; (defun ewoc-goto-prev (ewoc arg) @@ -376,6 +377,27 @@ (ewoc--refresh-node pp node)) (setq node (ewoc--node-next dll node)))))) +(defun ewoc-delete (ewoc &rest nodes) + "Delete NODES from EWOC." + (ewoc--set-buffer-bind-dll-let* ewoc + ((L nil) (R nil)) + (dolist (node nodes) + ;; If we are about to delete the node pointed at by last-node, + ;; set last-node to nil. + (if (eq (ewoc--last-node ewoc) node) + (setf (ewoc--last-node ewoc) nil)) + (delete-region (ewoc--node-start-marker node) + (ewoc--node-start-marker (ewoc--node-next dll node))) + (set-marker (ewoc--node-start-marker node) nil) + (setf L (ewoc--node-left node) + R (ewoc--node-right node) + ;; Link neighbors to each other. + (ewoc--node-right L) R + (ewoc--node-left R) L + ;; Forget neighbors. + (ewoc--node-left node) nil + (ewoc--node-right node) nil)))) + (defun ewoc-filter (ewoc predicate &rest args) "Remove all elements in EWOC for which PREDICATE returns nil. Note that the buffer for EWOC will be current-buffer when PREDICATE @@ -386,28 +408,13 @@ (ewoc--set-buffer-bind-dll-let* ewoc ((node (ewoc--node-nth dll 1)) (footer (ewoc--footer ewoc)) - (next nil) - (L nil) (R nil) + (goodbye nil) (inhibit-read-only t)) (while (not (eq node footer)) - (setq next (ewoc--node-next dll node)) (unless (apply predicate (ewoc--node-data node) args) - ;; If we are about to delete the node pointed at by last-node, - ;; set last-node to nil. - (if (eq (ewoc--last-node ewoc) node) - (setf (ewoc--last-node ewoc) nil)) - (delete-region (ewoc--node-start-marker node) - (ewoc--node-start-marker (ewoc--node-next dll node))) - (set-marker (ewoc--node-start-marker node) nil) - (setf L (ewoc--node-left node) - R (ewoc--node-right node) - ;; Link neighbors to each other. - (ewoc--node-right L) R - (ewoc--node-left R) L - ;; Forget neighbors. - (ewoc--node-left node) nil - (ewoc--node-right node) nil)) - (setq node next)))) + (push node goodbye)) + (setq node (ewoc--node-next dll node))) + (apply 'ewoc-delete ewoc goodbye))) (defun ewoc-locate (ewoc &optional pos guess) "Return the node that POS (a buffer position) is within.