Mercurial > emacs
annotate lisp/emacs-lisp/ewoc.el @ 72863:526dc1f36b09
(produce_image_glyph): Automatically crop wide images at
right window edge so we can draw the cursor on the same row to
avoid confusing redisplay by placing the cursor outside the visible
window area.
author | Kim F. Storm <storm@cua.dk> |
---|---|
date | Thu, 14 Sep 2006 09:37:44 +0000 |
parents | 529644115612 |
children | 1d4b1a32fd66 a8190f7e546e |
rev | line source |
---|---|
38436
b174db545cfd
Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents:
34304
diff
changeset
|
1 ;;; ewoc.el --- utility to maintain a view of a list of objects in a buffer |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
2 |
64751
5b1a238fcbb4
Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
64085
diff
changeset
|
3 ;; Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, |
68648
067115a6e738
Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
64751
diff
changeset
|
4 ;; 2000, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
5 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
6 ;; Author: Per Cederqvist <ceder@lysator.liu.se> |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
7 ;; Inge Wallin <inge@lysator.liu.se> |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
8 ;; Maintainer: monnier@gnu.org |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
9 ;; Created: 3 Aug 1992 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
10 ;; Keywords: extensions, lisp |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
11 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
12 ;; This file is part of GNU Emacs. |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
13 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
14 ;; GNU Emacs is free software; you can redistribute it and/or modify |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
15 ;; it under the terms of the GNU General Public License as published by |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
16 ;; the Free Software Foundation; either version 2, or (at your option) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
17 ;; any later version. |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
18 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
19 ;; GNU Emacs is distributed in the hope that it will be useful, |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
20 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
21 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
22 ;; GNU General Public License for more details. |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
23 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
24 ;; You should have received a copy of the GNU General Public License |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
25 ;; along with GNU Emacs; see the file COPYING. If not, write to the |
64085 | 26 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
27 ;; Boston, MA 02110-1301, USA. | |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
28 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
29 ;;; Commentary: |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
30 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
31 ;; Ewoc Was Once Cookie |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
32 ;; But now it's Emacs' Widget for Object Collections |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
33 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
34 ;; As the name implies this derives from the `cookie' package (part |
32487
d5d7a3fbf10c
(ewoc-location): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
30879
diff
changeset
|
35 ;; of Elib). The changes are pervasive though mostly superficial: |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
36 |
32487
d5d7a3fbf10c
(ewoc-location): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
30879
diff
changeset
|
37 ;; - uses CL (and its `defstruct') |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
38 ;; - separate from Elib. |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
39 ;; - uses its own version of a doubly-linked list which allows us |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
40 ;; to merge the elib-wrapper and the elib-node structures into ewoc-node |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
41 ;; - dropping functions not used by PCL-CVS (the only client of ewoc at the |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
42 ;; time of writing) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
43 ;; - removing unused arguments |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
44 ;; - renaming: |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
45 ;; elib-node ==> ewoc--node |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
46 ;; collection ==> ewoc |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
47 ;; tin ==> ewoc--node |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
48 ;; cookie ==> data or element or elem |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
49 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
50 ;; Introduction |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
51 ;; ============ |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
52 ;; |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
53 ;; Ewoc is a package that implements a connection between an |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
54 ;; dll (a doubly linked list) and the contents of a buffer. |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
55 ;; Possible uses are dired (have all files in a list, and show them), |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
56 ;; buffer-list, kom-prioritize (in the LysKOM elisp client) and |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
57 ;; others. pcl-cvs.el uses ewoc.el. |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
58 ;; |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
59 ;; Ewoc can be considered as the `view' part of a model-view-controller. |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
60 ;; |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
61 ;; A `element' can be any lisp object. When you use the ewoc |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
62 ;; package you specify a pretty-printer, a function that inserts |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
63 ;; a printable representation of the element in the buffer. (The |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
64 ;; pretty-printer should use "insert" and not |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
65 ;; "insert-before-markers"). |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
66 ;; |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
67 ;; A `ewoc' consists of a doubly linked list of elements, a |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
68 ;; header, a footer and a pretty-printer. It is displayed at a |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
69 ;; certain point in a certain buffer. (The buffer and point are |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
70 ;; fixed when the ewoc is created). The header and the footer |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
71 ;; are constant strings. They appear before and after the elements. |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
72 ;; |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
73 ;; Ewoc does not affect the mode of the buffer in any way. It |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
74 ;; merely makes it easy to connect an underlying data representation |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
75 ;; to the buffer contents. |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
76 ;; |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
77 ;; A `ewoc--node' is an object that contains one element. There are |
32487
d5d7a3fbf10c
(ewoc-location): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
30879
diff
changeset
|
78 ;; functions in this package that given an ewoc--node extract the data, or |
d5d7a3fbf10c
(ewoc-location): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
30879
diff
changeset
|
79 ;; give the next or previous ewoc--node. (All ewoc--nodes are linked together |
d5d7a3fbf10c
(ewoc-location): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
30879
diff
changeset
|
80 ;; in a doubly linked list. The `previous' ewoc--node is the one that appears |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
81 ;; before the other in the buffer.) You should not do anything with |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
82 ;; an ewoc--node except pass it to the functions in this package. |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
83 ;; |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
84 ;; An ewoc is a very dynamic thing. You can easily add or delete elements. |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
85 ;; You can apply a function to all elements in an ewoc, etc, etc. |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
86 ;; |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
87 ;; Remember that an element can be anything. Your imagination is the |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
88 ;; limit! It is even possible to have another ewoc as an |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
89 ;; element. In that way some kind of tree hierarchy can be created. |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
90 ;; |
71012
04ef040bae36
Commentary and whitespace munging; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
71006
diff
changeset
|
91 ;; The Emacs Lisp Reference Manual documents ewoc.el's "public interface". |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
92 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
93 ;; Coding conventions |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
94 ;; ================== |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
95 ;; |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
96 ;; All functions of course start with `ewoc'. Functions and macros |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
97 ;; starting with the prefix `ewoc--' are meant for internal use, |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
98 ;; while those starting with `ewoc-' are exported for public use. |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
99 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
100 ;;; Code: |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
101 |
71051
bf1f0ff1e25e
(ewoc--insert-new-node): Use ewoc--refresh-node.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71012
diff
changeset
|
102 (eval-when-compile (require 'cl)) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
103 |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
104 ;; The doubly linked list is implemented as a circular list with a dummy |
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
105 ;; node first and last. The dummy node is used as "the dll". |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
106 (defstruct (ewoc--node |
70994
d3750d5046d7
(ewoc--node-branch): Merge into unique caller.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70992
diff
changeset
|
107 (:type vector) ;ewoc--node-nth needs this |
70997
9a4ed4323ed7
(ewoc--node): Don't define constructor
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70994
diff
changeset
|
108 (:constructor nil) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
109 (:constructor ewoc--node-create (start-marker data))) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
110 left right data start-marker) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
111 |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
112 (defun ewoc--node-next (dll node) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
113 "Return the node after NODE, or nil if NODE is the last node." |
70956
5fd02ab03d96
(ewoc--current-dll): New var.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70851
diff
changeset
|
114 (let ((R (ewoc--node-right node))) |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
115 (unless (eq dll R) R))) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
116 |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
117 (defun ewoc--node-prev (dll node) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
118 "Return the node before NODE, or nil if NODE is the first node." |
70956
5fd02ab03d96
(ewoc--current-dll): New var.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70851
diff
changeset
|
119 (let ((L (ewoc--node-left node))) |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
120 (unless (eq dll L) L))) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
121 |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
122 (defun ewoc--node-nth (dll n) |
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
123 "Return the Nth node from the doubly linked list `dll'. |
70956
5fd02ab03d96
(ewoc--current-dll): New var.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70851
diff
changeset
|
124 N counts from zero. If N is negative, return the -(N+1)th last element. |
5fd02ab03d96
(ewoc--current-dll): New var.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70851
diff
changeset
|
125 If N is out of range, return nil. |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
126 Thus, (ewoc--node-nth dll 0) returns the first node, |
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
127 and (ewoc--node-nth dll -1) returns the last node." |
70994
d3750d5046d7
(ewoc--node-branch): Merge into unique caller.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70992
diff
changeset
|
128 ;; Presuming a node is ":type vector", starting with `left' and `right': |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
129 ;; Branch 0 ("follow left pointer") is used when n is negative. |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
130 ;; Branch 1 ("follow right pointer") is used otherwise. |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
131 (let* ((branch (if (< n 0) 0 1)) |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
132 (node (aref dll branch))) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
133 (if (< n 0) (setq n (- -1 n))) |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
134 (while (and (not (eq dll node)) (> n 0)) |
70994
d3750d5046d7
(ewoc--node-branch): Merge into unique caller.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70992
diff
changeset
|
135 (setq node (aref node branch)) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
136 (setq n (1- n))) |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
137 (unless (eq dll node) node))) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
138 |
32487
d5d7a3fbf10c
(ewoc-location): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
30879
diff
changeset
|
139 (defun ewoc-location (node) |
d5d7a3fbf10c
(ewoc-location): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
30879
diff
changeset
|
140 "Return the start location of NODE." |
d5d7a3fbf10c
(ewoc-location): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
30879
diff
changeset
|
141 (ewoc--node-start-marker node)) |
d5d7a3fbf10c
(ewoc-location): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
30879
diff
changeset
|
142 |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
143 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
144 ;;; The ewoc data type |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
145 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
146 (defstruct (ewoc |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
147 (:constructor nil) |
70990
c54570f9431a
(ewoc--create): No longer take
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70956
diff
changeset
|
148 (:constructor ewoc--create (buffer pretty-printer dll)) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
149 (:conc-name ewoc--)) |
71006
103ed71d4639
(ewoc): Add member `hf-pp' to this structure.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70997
diff
changeset
|
150 buffer pretty-printer header footer dll last-node hf-pp) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
151 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
152 (defmacro ewoc--set-buffer-bind-dll-let* (ewoc varlist &rest forms) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
153 "Execute FORMS with ewoc--buffer selected as current buffer, |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
154 `dll' bound to the dll, and VARLIST bound as in a let*. |
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
155 `dll' will be bound when VARLIST is initialized, but |
70956
5fd02ab03d96
(ewoc--current-dll): New var.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70851
diff
changeset
|
156 the current buffer will *not* have been changed. |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
157 Return value of last form in FORMS." |
70523
bc300a06815f
(ewoc--set-buffer-bind-dll-let*): Use `with-current-buffer'.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70413
diff
changeset
|
158 (let ((hnd (make-symbol "ewoc"))) |
bc300a06815f
(ewoc--set-buffer-bind-dll-let*): Use `with-current-buffer'.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70413
diff
changeset
|
159 `(let* ((,hnd ,ewoc) |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
160 (dll (ewoc--dll ,hnd)) |
41608
45db352a0971
Converted backquote to the new style.
Sam Steingold <sds@gnu.org>
parents:
38436
diff
changeset
|
161 ,@varlist) |
70523
bc300a06815f
(ewoc--set-buffer-bind-dll-let*): Use `with-current-buffer'.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70413
diff
changeset
|
162 (with-current-buffer (ewoc--buffer ,hnd) |
bc300a06815f
(ewoc--set-buffer-bind-dll-let*): Use `with-current-buffer'.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70413
diff
changeset
|
163 ,@forms)))) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
164 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
165 (defmacro ewoc--set-buffer-bind-dll (ewoc &rest forms) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
166 `(ewoc--set-buffer-bind-dll-let* ,ewoc nil ,@forms)) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
167 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
168 (defsubst ewoc--filter-hf-nodes (ewoc node) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
169 "Evaluate NODE once and return it. |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
170 BUT if it is the header or the footer in EWOC return nil instead." |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
171 (unless (or (eq node (ewoc--header ewoc)) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
172 (eq node (ewoc--footer ewoc))) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
173 node)) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
174 |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
175 (defun ewoc--adjust (beg end node dll) |
70707
346a9c09f370
(ewoc--adjust): New func.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70687
diff
changeset
|
176 ;; "Manually reseat" markers for NODE and its successors (including footer |
346a9c09f370
(ewoc--adjust): New func.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70687
diff
changeset
|
177 ;; and dll), in the case where they originally shared start position with |
346a9c09f370
(ewoc--adjust): New func.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70687
diff
changeset
|
178 ;; BEG, to END. BEG and END are buffer positions describing NODE's left |
346a9c09f370
(ewoc--adjust): New func.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70687
diff
changeset
|
179 ;; neighbor. This operation is functionally equivalent to temporarily |
346a9c09f370
(ewoc--adjust): New func.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70687
diff
changeset
|
180 ;; setting these nodes' markers' insertion type to t around the pretty-print |
70956
5fd02ab03d96
(ewoc--current-dll): New var.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70851
diff
changeset
|
181 ;; call that precedes the call to `ewoc--adjust', and then changing them back |
70707
346a9c09f370
(ewoc--adjust): New func.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70687
diff
changeset
|
182 ;; to nil. |
346a9c09f370
(ewoc--adjust): New func.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70687
diff
changeset
|
183 (when (< beg end) |
346a9c09f370
(ewoc--adjust): New func.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70687
diff
changeset
|
184 (let (m) |
346a9c09f370
(ewoc--adjust): New func.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70687
diff
changeset
|
185 (while (and (= beg (setq m (ewoc--node-start-marker node))) |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
186 ;; The "dummy" node `dll' actually holds the marker that |
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
187 ;; points to the end of the footer, so we check `dll' |
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
188 ;; *after* reseating the marker. |
70707
346a9c09f370
(ewoc--adjust): New func.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70687
diff
changeset
|
189 (progn |
346a9c09f370
(ewoc--adjust): New func.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70687
diff
changeset
|
190 (set-marker m end) |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
191 (not (eq dll node)))) |
70707
346a9c09f370
(ewoc--adjust): New func.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70687
diff
changeset
|
192 (setq node (ewoc--node-right node)))))) |
346a9c09f370
(ewoc--adjust): New func.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70687
diff
changeset
|
193 |
70613
3441bcebaad1
(ewoc--node-enter-before, ewoc--create-node): Delete funcs.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70601
diff
changeset
|
194 (defun ewoc--insert-new-node (node data pretty-printer) |
3441bcebaad1
(ewoc--node-enter-before, ewoc--create-node): Delete funcs.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70601
diff
changeset
|
195 "Insert before NODE a new node for DATA, displayed by PRETTY-PRINTER. |
3441bcebaad1
(ewoc--node-enter-before, ewoc--create-node): Delete funcs.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70601
diff
changeset
|
196 Call PRETTY-PRINTER with point at NODE's start, thus pushing back |
3441bcebaad1
(ewoc--node-enter-before, ewoc--create-node): Delete funcs.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70601
diff
changeset
|
197 NODE and leaving the new node's start there. Return the new node." |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
198 (save-excursion |
71051
bf1f0ff1e25e
(ewoc--insert-new-node): Use ewoc--refresh-node.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71012
diff
changeset
|
199 (let ((elemnode (ewoc--node-create |
bf1f0ff1e25e
(ewoc--insert-new-node): Use ewoc--refresh-node.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71012
diff
changeset
|
200 (copy-marker (ewoc--node-start-marker node)) data))) |
bf1f0ff1e25e
(ewoc--insert-new-node): Use ewoc--refresh-node.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71012
diff
changeset
|
201 (setf (ewoc--node-left elemnode) (ewoc--node-left node) |
70613
3441bcebaad1
(ewoc--node-enter-before, ewoc--create-node): Delete funcs.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70601
diff
changeset
|
202 (ewoc--node-right elemnode) node |
3441bcebaad1
(ewoc--node-enter-before, ewoc--create-node): Delete funcs.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70601
diff
changeset
|
203 (ewoc--node-right (ewoc--node-left node)) elemnode |
3441bcebaad1
(ewoc--node-enter-before, ewoc--create-node): Delete funcs.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70601
diff
changeset
|
204 (ewoc--node-left node) elemnode) |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
205 (ewoc--refresh-node pretty-printer elemnode dll) |
70613
3441bcebaad1
(ewoc--node-enter-before, ewoc--create-node): Delete funcs.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70601
diff
changeset
|
206 elemnode))) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
207 |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
208 (defun ewoc--refresh-node (pp node dll) |
28256
06cfa273543d
* pcvs.el: Add a minimal leading commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28088
diff
changeset
|
209 "Redisplay the element represented by NODE using the pretty-printer PP." |
70707
346a9c09f370
(ewoc--adjust): New func.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70687
diff
changeset
|
210 (let ((inhibit-read-only t) |
346a9c09f370
(ewoc--adjust): New func.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70687
diff
changeset
|
211 (m (ewoc--node-start-marker node)) |
346a9c09f370
(ewoc--adjust): New func.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70687
diff
changeset
|
212 (R (ewoc--node-right node))) |
70582
f2d7dbf603c5
(ewoc--refresh-node): No longer save-excursion.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70557
diff
changeset
|
213 ;; First, remove the string from the buffer: |
70707
346a9c09f370
(ewoc--adjust): New func.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70687
diff
changeset
|
214 (delete-region m (ewoc--node-start-marker R)) |
70582
f2d7dbf603c5
(ewoc--refresh-node): No longer save-excursion.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70557
diff
changeset
|
215 ;; Calculate and insert the string. |
70707
346a9c09f370
(ewoc--adjust): New func.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70687
diff
changeset
|
216 (goto-char m) |
346a9c09f370
(ewoc--adjust): New func.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70687
diff
changeset
|
217 (funcall pp (ewoc--node-data node)) |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
218 (ewoc--adjust m (point) R dll))) |
71006
103ed71d4639
(ewoc): Add member `hf-pp' to this structure.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70997
diff
changeset
|
219 |
103ed71d4639
(ewoc): Add member `hf-pp' to this structure.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70997
diff
changeset
|
220 (defun ewoc--wrap (func) |
103ed71d4639
(ewoc): Add member `hf-pp' to this structure.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70997
diff
changeset
|
221 (lexical-let ((ewoc--user-pp func)) |
103ed71d4639
(ewoc): Add member `hf-pp' to this structure.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70997
diff
changeset
|
222 (lambda (data) |
103ed71d4639
(ewoc): Add member `hf-pp' to this structure.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70997
diff
changeset
|
223 (funcall ewoc--user-pp data) |
103ed71d4639
(ewoc): Add member `hf-pp' to this structure.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70997
diff
changeset
|
224 (insert "\n")))) |
103ed71d4639
(ewoc): Add member `hf-pp' to this structure.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70997
diff
changeset
|
225 |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
226 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
227 ;;; =========================================================================== |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
228 ;;; Public members of the Ewoc package |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
229 |
70824
9ce3cc1e5e89
(ewoc-create): Add autoload cookie.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70707
diff
changeset
|
230 ;;;###autoload |
71006
103ed71d4639
(ewoc): Add member `hf-pp' to this structure.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70997
diff
changeset
|
231 (defun ewoc-create (pretty-printer &optional header footer nosep) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
232 "Create an empty ewoc. |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
233 |
28256
06cfa273543d
* pcvs.el: Add a minimal leading commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28088
diff
changeset
|
234 The ewoc will be inserted in the current buffer at the current position. |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
235 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
236 PRETTY-PRINTER should be a function that takes one argument, an |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
237 element, and inserts a string representing it in the buffer (at |
56140
f1046f262259
(ewoc-create, ewoc-map, ewoc-locate, ewoc-invalidate, ewoc-collect):
Juanma Barranquero <lekktu@gmail.com>
parents:
52401
diff
changeset
|
238 point). The string PRETTY-PRINTER inserts may be empty or span |
70707
346a9c09f370
(ewoc--adjust): New func.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70687
diff
changeset
|
239 several lines. The PRETTY-PRINTER should use `insert', and not |
56140
f1046f262259
(ewoc-create, ewoc-map, ewoc-locate, ewoc-invalidate, ewoc-collect):
Juanma Barranquero <lekktu@gmail.com>
parents:
52401
diff
changeset
|
240 `insert-before-markers'. |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
241 |
70707
346a9c09f370
(ewoc--adjust): New func.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70687
diff
changeset
|
242 Optional second and third arguments HEADER and FOOTER are strings, |
346a9c09f370
(ewoc--adjust): New func.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70687
diff
changeset
|
243 possibly empty, that will always be present at the top and bottom, |
71006
103ed71d4639
(ewoc): Add member `hf-pp' to this structure.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70997
diff
changeset
|
244 respectively, of the ewoc. |
103ed71d4639
(ewoc): Add member `hf-pp' to this structure.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70997
diff
changeset
|
245 |
103ed71d4639
(ewoc): Add member `hf-pp' to this structure.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70997
diff
changeset
|
246 Normally, a newline is automatically inserted after the header, |
103ed71d4639
(ewoc): Add member `hf-pp' to this structure.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70997
diff
changeset
|
247 the footer and every node's printed representation. Optional |
103ed71d4639
(ewoc): Add member `hf-pp' to this structure.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70997
diff
changeset
|
248 fourth arg NOSEP non-nil inhibits this." |
70557
84297e870585
(ewoc--dll-create, ewoc--node-delete)
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70523
diff
changeset
|
249 (let* ((dummy-node (ewoc--node-create 'DL-LIST 'DL-LIST)) |
84297e870585
(ewoc--dll-create, ewoc--node-delete)
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70523
diff
changeset
|
250 (dll (progn (setf (ewoc--node-right dummy-node) dummy-node) |
84297e870585
(ewoc--dll-create, ewoc--node-delete)
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70523
diff
changeset
|
251 (setf (ewoc--node-left dummy-node) dummy-node) |
84297e870585
(ewoc--dll-create, ewoc--node-delete)
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70523
diff
changeset
|
252 dummy-node)) |
71006
103ed71d4639
(ewoc): Add member `hf-pp' to this structure.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70997
diff
changeset
|
253 (wrap (if nosep 'identity 'ewoc--wrap)) |
70990
c54570f9431a
(ewoc--create): No longer take
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70956
diff
changeset
|
254 (new-ewoc (ewoc--create (current-buffer) |
71006
103ed71d4639
(ewoc): Add member `hf-pp' to this structure.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70997
diff
changeset
|
255 (funcall wrap pretty-printer) |
70990
c54570f9431a
(ewoc--create): No longer take
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70956
diff
changeset
|
256 dll)) |
71006
103ed71d4639
(ewoc): Add member `hf-pp' to this structure.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70997
diff
changeset
|
257 (hf-pp (funcall wrap 'insert)) |
70613
3441bcebaad1
(ewoc--node-enter-before, ewoc--create-node): Delete funcs.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70601
diff
changeset
|
258 (pos (point)) |
3441bcebaad1
(ewoc--node-enter-before, ewoc--create-node): Delete funcs.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70601
diff
changeset
|
259 head foot) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
260 (ewoc--set-buffer-bind-dll new-ewoc |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
261 ;; Set default values |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
262 (unless header (setq header "")) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
263 (unless footer (setq footer "")) |
70613
3441bcebaad1
(ewoc--node-enter-before, ewoc--create-node): Delete funcs.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70601
diff
changeset
|
264 (setf (ewoc--node-start-marker dll) (copy-marker pos) |
71006
103ed71d4639
(ewoc): Add member `hf-pp' to this structure.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70997
diff
changeset
|
265 foot (ewoc--insert-new-node dll footer hf-pp) |
103ed71d4639
(ewoc): Add member `hf-pp' to this structure.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70997
diff
changeset
|
266 head (ewoc--insert-new-node foot header hf-pp) |
103ed71d4639
(ewoc): Add member `hf-pp' to this structure.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70997
diff
changeset
|
267 (ewoc--hf-pp new-ewoc) hf-pp |
70613
3441bcebaad1
(ewoc--node-enter-before, ewoc--create-node): Delete funcs.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70601
diff
changeset
|
268 (ewoc--footer new-ewoc) foot |
3441bcebaad1
(ewoc--node-enter-before, ewoc--create-node): Delete funcs.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70601
diff
changeset
|
269 (ewoc--header new-ewoc) head)) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
270 ;; Return the ewoc |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
271 new-ewoc)) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
272 |
70685
308a4824e11b
(ewoc-data): Add docstring.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70613
diff
changeset
|
273 (defalias 'ewoc-data 'ewoc--node-data |
308a4824e11b
(ewoc-data): Add docstring.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70613
diff
changeset
|
274 "Extract the data encapsulated by NODE and return it. |
308a4824e11b
(ewoc-data): Add docstring.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70613
diff
changeset
|
275 |
308a4824e11b
(ewoc-data): Add docstring.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70613
diff
changeset
|
276 \(fn NODE)") |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
277 |
70835
fd87105a0d34
(ewoc-set-data): New func.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70824
diff
changeset
|
278 (defun ewoc-set-data (node data) |
fd87105a0d34
(ewoc-set-data): New func.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70824
diff
changeset
|
279 "Set NODE to encapsulate DATA." |
fd87105a0d34
(ewoc-set-data): New func.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70824
diff
changeset
|
280 (setf (ewoc--node-data node) data)) |
fd87105a0d34
(ewoc-set-data): New func.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70824
diff
changeset
|
281 |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
282 (defun ewoc-enter-first (ewoc data) |
63325
d4230208a300
Doc fixes for public funcs:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
56140
diff
changeset
|
283 "Enter DATA first in EWOC. |
d4230208a300
Doc fixes for public funcs:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
56140
diff
changeset
|
284 Return the new node." |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
285 (ewoc--set-buffer-bind-dll ewoc |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
286 (ewoc-enter-after ewoc (ewoc--node-nth dll 0) data))) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
287 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
288 (defun ewoc-enter-last (ewoc data) |
63325
d4230208a300
Doc fixes for public funcs:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
56140
diff
changeset
|
289 "Enter DATA last in EWOC. |
d4230208a300
Doc fixes for public funcs:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
56140
diff
changeset
|
290 Return the new node." |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
291 (ewoc--set-buffer-bind-dll ewoc |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
292 (ewoc-enter-before ewoc (ewoc--node-nth dll -1) data))) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
293 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
294 (defun ewoc-enter-after (ewoc node data) |
32487
d5d7a3fbf10c
(ewoc-location): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
30879
diff
changeset
|
295 "Enter a new element DATA after NODE in EWOC. |
63325
d4230208a300
Doc fixes for public funcs:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
56140
diff
changeset
|
296 Return the new node." |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
297 (ewoc--set-buffer-bind-dll ewoc |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
298 (ewoc-enter-before ewoc (ewoc--node-next dll node) data))) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
299 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
300 (defun ewoc-enter-before (ewoc node data) |
32487
d5d7a3fbf10c
(ewoc-location): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
30879
diff
changeset
|
301 "Enter a new element DATA before NODE in EWOC. |
63325
d4230208a300
Doc fixes for public funcs:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
56140
diff
changeset
|
302 Return the new node." |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
303 (ewoc--set-buffer-bind-dll ewoc |
70613
3441bcebaad1
(ewoc--node-enter-before, ewoc--create-node): Delete funcs.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70601
diff
changeset
|
304 (ewoc--insert-new-node node data (ewoc--pretty-printer ewoc)))) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
305 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
306 (defun ewoc-next (ewoc node) |
63325
d4230208a300
Doc fixes for public funcs:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
56140
diff
changeset
|
307 "Return the node in EWOC that follows NODE. |
d4230208a300
Doc fixes for public funcs:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
56140
diff
changeset
|
308 Return nil if NODE is nil or the last element." |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
309 (when node |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
310 (ewoc--filter-hf-nodes |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
311 ewoc (ewoc--node-next (ewoc--dll ewoc) node)))) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
312 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
313 (defun ewoc-prev (ewoc node) |
63325
d4230208a300
Doc fixes for public funcs:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
56140
diff
changeset
|
314 "Return the node in EWOC that precedes NODE. |
d4230208a300
Doc fixes for public funcs:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
56140
diff
changeset
|
315 Return nil if NODE is nil or the first element." |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
316 (when node |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
317 (ewoc--filter-hf-nodes |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
318 ewoc (ewoc--node-prev (ewoc--dll ewoc) node)))) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
319 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
320 (defun ewoc-nth (ewoc n) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
321 "Return the Nth node. |
42206 | 322 N counts from zero. Return nil if there is less than N elements. |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
323 If N is negative, return the -(N+1)th last element. |
70956
5fd02ab03d96
(ewoc--current-dll): New var.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70851
diff
changeset
|
324 Thus, (ewoc-nth ewoc 0) returns the first node, |
5fd02ab03d96
(ewoc--current-dll): New var.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70851
diff
changeset
|
325 and (ewoc-nth ewoc -1) returns the last node. |
70685
308a4824e11b
(ewoc-data): Add docstring.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70613
diff
changeset
|
326 Use `ewoc-data' to extract the data from the node." |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
327 ;; Skip the header (or footer, if n is negative). |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
328 (setq n (if (< n 0) (1- n) (1+ n))) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
329 (ewoc--filter-hf-nodes ewoc |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
330 (ewoc--node-nth (ewoc--dll ewoc) n))) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
331 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
332 (defun ewoc-map (map-function ewoc &rest args) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
333 "Apply MAP-FUNCTION to all elements in EWOC. |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
334 MAP-FUNCTION is applied to the first element first. |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
335 If MAP-FUNCTION returns non-nil the element will be refreshed (its |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
336 pretty-printer will be called once again). |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
337 |
56140
f1046f262259
(ewoc-create, ewoc-map, ewoc-locate, ewoc-invalidate, ewoc-collect):
Juanma Barranquero <lekktu@gmail.com>
parents:
52401
diff
changeset
|
338 Note that the buffer for EWOC will be the current buffer when |
f1046f262259
(ewoc-create, ewoc-map, ewoc-locate, ewoc-invalidate, ewoc-collect):
Juanma Barranquero <lekktu@gmail.com>
parents:
52401
diff
changeset
|
339 MAP-FUNCTION is called. MAP-FUNCTION must restore the current |
f1046f262259
(ewoc-create, ewoc-map, ewoc-locate, ewoc-invalidate, ewoc-collect):
Juanma Barranquero <lekktu@gmail.com>
parents:
52401
diff
changeset
|
340 buffer before it returns, if it changes it. |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
341 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
342 If more than two arguments are given, the remaining |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
343 arguments will be passed to MAP-FUNCTION." |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
344 (ewoc--set-buffer-bind-dll-let* ewoc |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
345 ((footer (ewoc--footer ewoc)) |
70687
9d6a9b899f95
(ewoc-map, ewoc-invalidate): Compute PP before looping.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70685
diff
changeset
|
346 (pp (ewoc--pretty-printer ewoc)) |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
347 (node (ewoc--node-nth dll 1))) |
70582
f2d7dbf603c5
(ewoc--refresh-node): No longer save-excursion.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70557
diff
changeset
|
348 (save-excursion |
f2d7dbf603c5
(ewoc--refresh-node): No longer save-excursion.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70557
diff
changeset
|
349 (while (not (eq node footer)) |
f2d7dbf603c5
(ewoc--refresh-node): No longer save-excursion.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70557
diff
changeset
|
350 (if (apply map-function (ewoc--node-data node) args) |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
351 (ewoc--refresh-node pp node dll)) |
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
352 (setq node (ewoc--node-next dll node)))))) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
353 |
70851
9119e54a8121
(ewoc-delete): New function.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70835
diff
changeset
|
354 (defun ewoc-delete (ewoc &rest nodes) |
9119e54a8121
(ewoc-delete): New function.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70835
diff
changeset
|
355 "Delete NODES from EWOC." |
9119e54a8121
(ewoc-delete): New function.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70835
diff
changeset
|
356 (ewoc--set-buffer-bind-dll-let* ewoc |
70992
dcab6d42213c
(ewoc-delete): Compute last node once before looping.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70990
diff
changeset
|
357 ((L nil) (R nil) (last (ewoc--last-node ewoc))) |
70851
9119e54a8121
(ewoc-delete): New function.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70835
diff
changeset
|
358 (dolist (node nodes) |
9119e54a8121
(ewoc-delete): New function.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70835
diff
changeset
|
359 ;; If we are about to delete the node pointed at by last-node, |
9119e54a8121
(ewoc-delete): New function.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70835
diff
changeset
|
360 ;; set last-node to nil. |
70992
dcab6d42213c
(ewoc-delete): Compute last node once before looping.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70990
diff
changeset
|
361 (when (eq last node) |
dcab6d42213c
(ewoc-delete): Compute last node once before looping.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70990
diff
changeset
|
362 (setf last nil (ewoc--last-node ewoc) nil)) |
70851
9119e54a8121
(ewoc-delete): New function.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70835
diff
changeset
|
363 (delete-region (ewoc--node-start-marker node) |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
364 (ewoc--node-start-marker (ewoc--node-next dll node))) |
70851
9119e54a8121
(ewoc-delete): New function.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70835
diff
changeset
|
365 (set-marker (ewoc--node-start-marker node) nil) |
9119e54a8121
(ewoc-delete): New function.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70835
diff
changeset
|
366 (setf L (ewoc--node-left node) |
9119e54a8121
(ewoc-delete): New function.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70835
diff
changeset
|
367 R (ewoc--node-right node) |
9119e54a8121
(ewoc-delete): New function.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70835
diff
changeset
|
368 ;; Link neighbors to each other. |
9119e54a8121
(ewoc-delete): New function.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70835
diff
changeset
|
369 (ewoc--node-right L) R |
9119e54a8121
(ewoc-delete): New function.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70835
diff
changeset
|
370 (ewoc--node-left R) L |
9119e54a8121
(ewoc-delete): New function.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70835
diff
changeset
|
371 ;; Forget neighbors. |
9119e54a8121
(ewoc-delete): New function.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70835
diff
changeset
|
372 (ewoc--node-left node) nil |
9119e54a8121
(ewoc-delete): New function.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70835
diff
changeset
|
373 (ewoc--node-right node) nil)))) |
9119e54a8121
(ewoc-delete): New function.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70835
diff
changeset
|
374 |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
375 (defun ewoc-filter (ewoc predicate &rest args) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
376 "Remove all elements in EWOC for which PREDICATE returns nil. |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47549
diff
changeset
|
377 Note that the buffer for EWOC will be current-buffer when PREDICATE |
56140
f1046f262259
(ewoc-create, ewoc-map, ewoc-locate, ewoc-invalidate, ewoc-collect):
Juanma Barranquero <lekktu@gmail.com>
parents:
52401
diff
changeset
|
378 is called. PREDICATE must restore the current buffer before it returns |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
379 if it changes it. |
56140
f1046f262259
(ewoc-create, ewoc-map, ewoc-locate, ewoc-invalidate, ewoc-collect):
Juanma Barranquero <lekktu@gmail.com>
parents:
52401
diff
changeset
|
380 The PREDICATE is called with the element as its first argument. If any |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
381 ARGS are given they will be passed to the PREDICATE." |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
382 (ewoc--set-buffer-bind-dll-let* ewoc |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
383 ((node (ewoc--node-nth dll 1)) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
384 (footer (ewoc--footer ewoc)) |
70851
9119e54a8121
(ewoc-delete): New function.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70835
diff
changeset
|
385 (goodbye nil) |
70557
84297e870585
(ewoc--dll-create, ewoc--node-delete)
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70523
diff
changeset
|
386 (inhibit-read-only t)) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
387 (while (not (eq node footer)) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
388 (unless (apply predicate (ewoc--node-data node) args) |
70851
9119e54a8121
(ewoc-delete): New function.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70835
diff
changeset
|
389 (push node goodbye)) |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
390 (setq node (ewoc--node-next dll node))) |
70851
9119e54a8121
(ewoc-delete): New function.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70835
diff
changeset
|
391 (apply 'ewoc-delete ewoc goodbye))) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
392 |
30879
3a1ff1caafe2
* emacs-lisp/ewoc.el (ewoc-locate): Default POS to (point).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28256
diff
changeset
|
393 (defun ewoc-locate (ewoc &optional pos guess) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
394 "Return the node that POS (a buffer position) is within. |
30879
3a1ff1caafe2
* emacs-lisp/ewoc.el (ewoc-locate): Default POS to (point).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28256
diff
changeset
|
395 POS may be a marker or an integer. It defaults to point. |
56140
f1046f262259
(ewoc-create, ewoc-map, ewoc-locate, ewoc-invalidate, ewoc-collect):
Juanma Barranquero <lekktu@gmail.com>
parents:
52401
diff
changeset
|
396 GUESS should be a node that it is likely to be near POS. |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
397 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
398 If POS points before the first element, the first node is returned. |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
399 If POS points after the last element, the last node is returned. |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
400 If the EWOC is empty, nil is returned." |
30879
3a1ff1caafe2
* emacs-lisp/ewoc.el (ewoc-locate): Default POS to (point).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28256
diff
changeset
|
401 (unless pos (setq pos (point))) |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
402 (ewoc--set-buffer-bind-dll ewoc |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
403 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
404 (cond |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
405 ;; Nothing present? |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
406 ((eq (ewoc--node-nth dll 1) (ewoc--node-nth dll -1)) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
407 nil) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
408 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
409 ;; Before second elem? |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
410 ((< pos (ewoc--node-start-marker (ewoc--node-nth dll 2))) |
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
411 (ewoc--node-nth dll 1)) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
412 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
413 ;; After one-before-last elem? |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
414 ((>= pos (ewoc--node-start-marker (ewoc--node-nth dll -2))) |
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
415 (ewoc--node-nth dll -2)) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
416 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
417 ;; We now know that pos is within a elem. |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
418 (t |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
419 ;; Make an educated guess about which of the three known |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
420 ;; node'es (the first, the last, or GUESS) is nearest. |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
421 (let* ((best-guess (ewoc--node-nth dll 1)) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
422 (distance (abs (- pos (ewoc--node-start-marker best-guess))))) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
423 (when guess |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
424 (let ((d (abs (- pos (ewoc--node-start-marker guess))))) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
425 (when (< d distance) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
426 (setq distance d) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
427 (setq best-guess guess)))) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
428 |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
429 (let* ((g (ewoc--node-nth dll -1)) ;Check the last elem |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
430 (d (abs (- pos (ewoc--node-start-marker g))))) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
431 (when (< d distance) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
432 (setq distance d) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
433 (setq best-guess g))) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
434 |
70956
5fd02ab03d96
(ewoc--current-dll): New var.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70851
diff
changeset
|
435 (when (ewoc--last-node ewoc) ;Check "previous". |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
436 (let* ((g (ewoc--last-node ewoc)) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
437 (d (abs (- pos (ewoc--node-start-marker g))))) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
438 (when (< d distance) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
439 (setq distance d) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
440 (setq best-guess g)))) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
441 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
442 ;; best-guess is now a "best guess". |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
443 ;; Find the correct node. First determine in which direction |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
444 ;; it lies, and then move in that direction until it is found. |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
47549
diff
changeset
|
445 |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
446 (cond |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
447 ;; Is pos after the guess? |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
448 ((>= pos |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
449 (ewoc--node-start-marker best-guess)) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
450 ;; Loop until we are exactly one node too far down... |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
451 (while (>= pos (ewoc--node-start-marker best-guess)) |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
452 (setq best-guess (ewoc--node-next dll best-guess))) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
453 ;; ...and return the previous node. |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
454 (ewoc--node-prev dll best-guess)) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
455 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
456 ;; Pos is before best-guess |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
457 (t |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
458 (while (< pos (ewoc--node-start-marker best-guess)) |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
459 (setq best-guess (ewoc--node-prev dll best-guess))) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
460 best-guess))))))) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
461 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
462 (defun ewoc-invalidate (ewoc &rest nodes) |
63325
d4230208a300
Doc fixes for public funcs:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
56140
diff
changeset
|
463 "Call EWOC's pretty-printer for each element in NODES. |
d4230208a300
Doc fixes for public funcs:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
56140
diff
changeset
|
464 Delete current text first, thus effecting a \"refresh\"." |
70687
9d6a9b899f95
(ewoc-map, ewoc-invalidate): Compute PP before looping.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70685
diff
changeset
|
465 (ewoc--set-buffer-bind-dll-let* ewoc |
9d6a9b899f95
(ewoc-map, ewoc-invalidate): Compute PP before looping.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70685
diff
changeset
|
466 ((pp (ewoc--pretty-printer ewoc))) |
70582
f2d7dbf603c5
(ewoc--refresh-node): No longer save-excursion.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70557
diff
changeset
|
467 (save-excursion |
f2d7dbf603c5
(ewoc--refresh-node): No longer save-excursion.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70557
diff
changeset
|
468 (dolist (node nodes) |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
469 (ewoc--refresh-node pp node dll))))) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
470 |
30879
3a1ff1caafe2
* emacs-lisp/ewoc.el (ewoc-locate): Default POS to (point).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28256
diff
changeset
|
471 (defun ewoc-goto-prev (ewoc arg) |
63325
d4230208a300
Doc fixes for public funcs:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
56140
diff
changeset
|
472 "Move point to the ARGth previous element in EWOC. |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
473 Don't move if we are at the first element, or if EWOC is empty. |
63325
d4230208a300
Doc fixes for public funcs:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
56140
diff
changeset
|
474 Return the node we moved to." |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
475 (ewoc--set-buffer-bind-dll-let* ewoc |
33233
c12aa82daf99
(ewoc-goto-prev, ewoc-goto-next):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32487
diff
changeset
|
476 ((node (ewoc-locate ewoc (point)))) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
477 (when node |
30879
3a1ff1caafe2
* emacs-lisp/ewoc.el (ewoc-locate): Default POS to (point).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28256
diff
changeset
|
478 ;; If we were past the last element, first jump to it. |
3a1ff1caafe2
* emacs-lisp/ewoc.el (ewoc-locate): Default POS to (point).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28256
diff
changeset
|
479 (when (>= (point) (ewoc--node-start-marker (ewoc--node-right node))) |
3a1ff1caafe2
* emacs-lisp/ewoc.el (ewoc-locate): Default POS to (point).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28256
diff
changeset
|
480 (setq arg (1- arg))) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
481 (while (and node (> arg 0)) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
482 (setq arg (1- arg)) |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
483 (setq node (ewoc--node-prev dll node))) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
484 ;; Never step above the first element. |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
485 (unless (ewoc--filter-hf-nodes ewoc node) |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
486 (setq node (ewoc--node-nth dll 1))) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
487 (ewoc-goto-node ewoc node)))) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
488 |
30879
3a1ff1caafe2
* emacs-lisp/ewoc.el (ewoc-locate): Default POS to (point).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28256
diff
changeset
|
489 (defun ewoc-goto-next (ewoc arg) |
63325
d4230208a300
Doc fixes for public funcs:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
56140
diff
changeset
|
490 "Move point to the ARGth next element in EWOC. |
d4230208a300
Doc fixes for public funcs:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
56140
diff
changeset
|
491 Return the node (or nil if we just passed the last node)." |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
492 (ewoc--set-buffer-bind-dll-let* ewoc |
33233
c12aa82daf99
(ewoc-goto-prev, ewoc-goto-next):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32487
diff
changeset
|
493 ((node (ewoc-locate ewoc (point)))) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
494 (while (and node (> arg 0)) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
495 (setq arg (1- arg)) |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
496 (setq node (ewoc--node-next dll node))) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
497 ;; Never step below the first element. |
30879
3a1ff1caafe2
* emacs-lisp/ewoc.el (ewoc-locate): Default POS to (point).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28256
diff
changeset
|
498 ;; (unless (ewoc--filter-hf-nodes ewoc node) |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
499 ;; (setq node (ewoc--node-nth dll -2))) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
500 (ewoc-goto-node ewoc node))) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
501 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
502 (defun ewoc-goto-node (ewoc node) |
63325
d4230208a300
Doc fixes for public funcs:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
56140
diff
changeset
|
503 "Move point to NODE in EWOC." |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
504 (ewoc--set-buffer-bind-dll ewoc |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
505 (goto-char (ewoc--node-start-marker node)) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
506 (if goal-column (move-to-column goal-column)) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
507 (setf (ewoc--last-node ewoc) node))) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
508 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
509 (defun ewoc-refresh (ewoc) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
510 "Refresh all data in EWOC. |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
511 The pretty-printer that was specified when the EWOC was created |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
512 will be called for all elements in EWOC. |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
513 Note that `ewoc-invalidate' is more efficient if only a small |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
514 number of elements needs to be refreshed." |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
515 (ewoc--set-buffer-bind-dll-let* ewoc |
28256
06cfa273543d
* pcvs.el: Add a minimal leading commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28088
diff
changeset
|
516 ((footer (ewoc--footer ewoc))) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
517 (let ((inhibit-read-only t)) |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
518 (delete-region (ewoc--node-start-marker (ewoc--node-nth dll 1)) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
519 (ewoc--node-start-marker footer)) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
520 (goto-char (ewoc--node-start-marker footer)) |
70601
77ae8497591f
(ewoc-refresh): Compute PP once before looping.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70582
diff
changeset
|
521 (let ((pp (ewoc--pretty-printer ewoc)) |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
522 (node (ewoc--node-nth dll 1))) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
523 (while (not (eq node footer)) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
524 (set-marker (ewoc--node-start-marker node) (point)) |
70601
77ae8497591f
(ewoc-refresh): Compute PP once before looping.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70582
diff
changeset
|
525 (funcall pp (ewoc--node-data node)) |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
526 (setq node (ewoc--node-next dll node))))) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
527 (set-marker (ewoc--node-start-marker footer) (point)))) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
528 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
529 (defun ewoc-collect (ewoc predicate &rest args) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
530 "Select elements from EWOC using PREDICATE. |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
531 Return a list of all selected data elements. |
56140
f1046f262259
(ewoc-create, ewoc-map, ewoc-locate, ewoc-invalidate, ewoc-collect):
Juanma Barranquero <lekktu@gmail.com>
parents:
52401
diff
changeset
|
532 PREDICATE is a function that takes a data element as its first |
f1046f262259
(ewoc-create, ewoc-map, ewoc-locate, ewoc-invalidate, ewoc-collect):
Juanma Barranquero <lekktu@gmail.com>
parents:
52401
diff
changeset
|
533 argument. The elements on the returned list will appear in the |
f1046f262259
(ewoc-create, ewoc-map, ewoc-locate, ewoc-invalidate, ewoc-collect):
Juanma Barranquero <lekktu@gmail.com>
parents:
52401
diff
changeset
|
534 same order as in the buffer. You should not rely on the order of |
f1046f262259
(ewoc-create, ewoc-map, ewoc-locate, ewoc-invalidate, ewoc-collect):
Juanma Barranquero <lekktu@gmail.com>
parents:
52401
diff
changeset
|
535 calls to PREDICATE. |
f1046f262259
(ewoc-create, ewoc-map, ewoc-locate, ewoc-invalidate, ewoc-collect):
Juanma Barranquero <lekktu@gmail.com>
parents:
52401
diff
changeset
|
536 Note that the buffer the EWOC is displayed in is the current |
f1046f262259
(ewoc-create, ewoc-map, ewoc-locate, ewoc-invalidate, ewoc-collect):
Juanma Barranquero <lekktu@gmail.com>
parents:
52401
diff
changeset
|
537 buffer when PREDICATE is called. PREDICATE must restore it if it |
f1046f262259
(ewoc-create, ewoc-map, ewoc-locate, ewoc-invalidate, ewoc-collect):
Juanma Barranquero <lekktu@gmail.com>
parents:
52401
diff
changeset
|
538 changes it. |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
539 If more than two arguments are given the |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
540 remaining arguments will be passed to PREDICATE." |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
541 (ewoc--set-buffer-bind-dll-let* ewoc |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
542 ((header (ewoc--header ewoc)) |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
543 (node (ewoc--node-nth dll -2)) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
544 result) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
545 (while (not (eq node header)) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
546 (if (apply predicate (ewoc--node-data node) args) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
547 (push (ewoc--node-data node) result)) |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
548 (setq node (ewoc--node-prev dll node))) |
33233
c12aa82daf99
(ewoc-goto-prev, ewoc-goto-next):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
32487
diff
changeset
|
549 (nreverse result))) |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
550 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
551 (defun ewoc-buffer (ewoc) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
552 "Return the buffer that is associated with EWOC. |
63325
d4230208a300
Doc fixes for public funcs:
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
56140
diff
changeset
|
553 Return nil if the buffer has been deleted." |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
554 (let ((buf (ewoc--buffer ewoc))) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
555 (when (buffer-name buf) buf))) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
556 |
28256
06cfa273543d
* pcvs.el: Add a minimal leading commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28088
diff
changeset
|
557 (defun ewoc-get-hf (ewoc) |
06cfa273543d
* pcvs.el: Add a minimal leading commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28088
diff
changeset
|
558 "Return a cons cell containing the (HEADER . FOOTER) of EWOC." |
06cfa273543d
* pcvs.el: Add a minimal leading commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28088
diff
changeset
|
559 (cons (ewoc--node-data (ewoc--header ewoc)) |
06cfa273543d
* pcvs.el: Add a minimal leading commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28088
diff
changeset
|
560 (ewoc--node-data (ewoc--footer ewoc)))) |
06cfa273543d
* pcvs.el: Add a minimal leading commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28088
diff
changeset
|
561 |
06cfa273543d
* pcvs.el: Add a minimal leading commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28088
diff
changeset
|
562 (defun ewoc-set-hf (ewoc header footer) |
06cfa273543d
* pcvs.el: Add a minimal leading commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28088
diff
changeset
|
563 "Set the HEADER and FOOTER of EWOC." |
70707
346a9c09f370
(ewoc--adjust): New func.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70687
diff
changeset
|
564 (ewoc--set-buffer-bind-dll-let* ewoc |
346a9c09f370
(ewoc--adjust): New func.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70687
diff
changeset
|
565 ((head (ewoc--header ewoc)) |
71006
103ed71d4639
(ewoc): Add member `hf-pp' to this structure.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70997
diff
changeset
|
566 (foot (ewoc--footer ewoc)) |
103ed71d4639
(ewoc): Add member `hf-pp' to this structure.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70997
diff
changeset
|
567 (hf-pp (ewoc--hf-pp ewoc))) |
70707
346a9c09f370
(ewoc--adjust): New func.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70687
diff
changeset
|
568 (setf (ewoc--node-data head) header |
346a9c09f370
(ewoc--adjust): New func.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70687
diff
changeset
|
569 (ewoc--node-data foot) footer) |
346a9c09f370
(ewoc--adjust): New func.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
70687
diff
changeset
|
570 (save-excursion |
71052
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
571 (ewoc--refresh-node hf-pp head dll) |
529644115612
(ewoc--current-dll): Remove. Basically undo the change of 2006-05-26:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71051
diff
changeset
|
572 (ewoc--refresh-node hf-pp foot dll)))) |
28256
06cfa273543d
* pcvs.el: Add a minimal leading commentary.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28088
diff
changeset
|
573 |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
574 |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
575 (provide 'ewoc) |
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
576 |
71051
bf1f0ff1e25e
(ewoc--insert-new-node): Use ewoc--refresh-node.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71012
diff
changeset
|
577 ;; Local Variables: |
bf1f0ff1e25e
(ewoc--insert-new-node): Use ewoc--refresh-node.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71012
diff
changeset
|
578 ;; eval: (put 'ewoc--set-buffer-bind-dll 'lisp-indent-hook 1) |
bf1f0ff1e25e
(ewoc--insert-new-node): Use ewoc--refresh-node.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71012
diff
changeset
|
579 ;; eval: (put 'ewoc--set-buffer-bind-dll-let* 'lisp-indent-hook 2) |
bf1f0ff1e25e
(ewoc--insert-new-node): Use ewoc--refresh-node.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71012
diff
changeset
|
580 ;; End: |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
581 |
71051
bf1f0ff1e25e
(ewoc--insert-new-node): Use ewoc--refresh-node.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
71012
diff
changeset
|
582 ;; arch-tag: d78915b9-9a07-44bf-aac6-04a1fc1bd6d4 |
28088
b442dfc3cef0
*** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
583 ;;; ewoc.el ends here |