mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-29 08:31:35 -08:00
(ewoc-delete): New function.
(ewoc-filter): Use `ewoc-delete'.
This commit is contained in:
parent
1f5df1f783
commit
f569c26e79
2 changed files with 31 additions and 19 deletions
|
|
@ -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 @@ arguments will be passed to MAP-FUNCTION."
|
|||
(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 @@ ARGS are given they will be passed to the PREDICATE."
|
|||
(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.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue