Mercurial > emacs
changeset 70851:9119e54a8121
(ewoc-delete): New function.
(ewoc-filter): Use `ewoc-delete'.
author | Thien-Thi Nguyen <ttn@gnuvola.org> |
---|---|
date | Tue, 23 May 2006 07:30:20 +0000 |
parents | b90abedf3b79 |
children | 426725b2ce9a |
files | lisp/emacs-lisp/ewoc.el |
diffstat | 1 files changed, 26 insertions(+), 19 deletions(-) [+] |
line wrap: on
line diff
--- 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.