comparison lisp/vm/vm-virtual.el @ 24:4103f0995bd7 r19-15b95

Import from CVS: tag r19-15b95
author cvs
date Mon, 13 Aug 2007 08:51:03 +0200
parents 859a2309aef8
children 441bb1e64a06
comparison
equal deleted inserted replaced
23:0edd3412f124 24:4103f0995bd7
29 ;; definition. Matching messages are added to 29 ;; definition. Matching messages are added to
30 ;; vm-message-list, instead of replacing it. 30 ;; vm-message-list, instead of replacing it.
31 ;; 31 ;;
32 ;; The messages in new-messages must all be in the same real folder. 32 ;; The messages in new-messages must all be in the same real folder.
33 (defun vm-build-virtual-message-list (new-messages) 33 (defun vm-build-virtual-message-list (new-messages)
34 (let ((clauses (cdr vm-virtual-folder-definition)) 34 (vm-with-virtual-selector-variables
35 35 (let ((clauses (cdr vm-virtual-folder-definition))
36 (message-set (make-vector 311 0)) 36 (message-set (make-vector 311 0))
37 (vbuffer (current-buffer)) 37 (vbuffer (current-buffer))
38 (mirrored vm-virtual-mirror) 38 (mirrored vm-virtual-mirror)
39 (case-fold-search t) 39 (case-fold-search t)
40 (tail-cons (vm-last vm-message-list)) 40 (tail-cons (vm-last vm-message-list))
41 (new-message-list nil) 41 (new-message-list nil)
42 42 virtual location-vector
43 ;; selectors 43 message mp folders folder
44 (any 'vm-vs-any) 44 selectors sel-list selector arglist i
45 (and 'vm-vs-and) 45 real-buffers-used)
46 (or 'vm-vs-or) 46 ;; Since there is at most one virtual message in the folder
47 (not 'vm-vs-not) 47 ;; buffer of a virtual folder, the location data vector (and
48 (header 'vm-vs-header) 48 ;; the markers in it) of all virtual messages in a virtual
49 (label 'vm-vs-label) 49 ;; folder is shared. We initialize the vector here if it
50 (text 'vm-vs-text) 50 ;; hasn't been created already.
51 (recipient 'vm-vs-recipient) 51 (if vm-message-list
52 (author 'vm-vs-author) 52 (setq location-vector (vm-location-data-of (car vm-message-pointer)))
53 (subject 'vm-vs-subject) 53 (setq i 0
54 (sent-before 'vm-vs-sent-before) 54 location-vector (make-vector vm-location-data-vector-length nil))
55 (sent-after 'vm-vs-sent-after) 55 (while (< i vm-location-data-vector-length)
56 (more-chars-than 'vm-vs-more-chars-than) 56 (aset location-vector i (vm-marker nil))
57 (less-chars-than 'vm-vs-less-chars-than) 57 (vm-increment i)))
58 (more-lines-than 'vm-vs-more-lines-than) 58 ;; To keep track of the messages in a virtual folder to
59 (less-lines-than 'vm-vs-less-lines-than) 59 ;; prevent duplicates we create and maintain a set that
60 (new 'vm-vs-new) 60 ;; contain all the real messages.
61 (unread 'vm-vs-unread) 61 (setq mp vm-message-list)
62 (read 'vm-vs-read) 62 (while mp
63 (deleted 'vm-vs-deleted) 63 (intern (vm-message-id-number-of (vm-real-message-of (car mp)))
64 (replied 'vm-vs-replied) 64 message-set)
65 (forwarded 'vm-vs-forwarded) 65 (setq mp (cdr mp)))
66 (filed 'vm-vs-filed) 66 ;; now select the messages
67 (written 'vm-vs-written) 67 (save-excursion
68 (edited 'vm-vs-edited) 68 (while clauses
69 (marked 'vm-vs-marked) 69 (setq folders (car (car clauses))
70 70 selectors (cdr (car clauses)))
71 virtual location-vector 71 (while folders
72 message mp folders folder 72 (setq folder (car folders))
73 selectors sel-list selector arglist i 73 (and (stringp folder)
74 real-buffers-used) 74 (setq folder (expand-file-name folder vm-folder-directory)))
75 ;; Since there is at most one virtual message in the folder 75 (and (listp folder)
76 ;; buffer of a virtual folder, the location data vector (and 76 (setq folder (eval folder)))
77 ;; the markers in it) of all virtual messages in a virtual 77 (cond
78 ;; folder is shared. We initialize the vector here if it 78 ((null folder)
79 ;; hasn't been created already. 79 ;; folder was a s-expr which returned nil
80 (if vm-message-list 80 ;; skip it
81 (setq location-vector (vm-location-data-of (car vm-message-pointer))) 81 nil )
82 (setq i 0 82 ((and (stringp folder) (file-directory-p folder))
83 location-vector (make-vector vm-location-data-vector-length nil)) 83 (setq folders (nconc folders
84 (while (< i vm-location-data-vector-length) 84 (vm-delete-backup-file-names
85 (aset location-vector i (vm-marker nil)) 85 (vm-delete-auto-save-file-names
86 (vm-increment i))) 86 (vm-delete-directory-file-names
87 ;; To keep track of the messages in a virtual folder to 87 (directory-files folder t nil)))))))
88 ;; prevent duplicates we create and maintain a set that 88 ((or (null new-messages)
89 ;; contain all the real messages. 89 ;; If we're assimilating messages into an
90 (setq mp vm-message-list) 90 ;; existing virtual folder, only allow selectors
91 (while mp 91 ;; that would be normally applied to this folder.
92 (intern (vm-message-id-number-of (vm-real-message-of (car mp))) 92 (and (bufferp folder)
93 message-set) 93 (eq (vm-buffer-of (car new-messages)) folder))
94 (setq mp (cdr mp))) 94 (and (stringp folder)
95 ;; now select the messages 95 (eq (vm-buffer-of (car new-messages))
96 (save-excursion 96 ;; letter bomb protection
97 (while clauses 97 ;; set inhibit-local-variables to t for v18 Emacses
98 (setq folders (car (car clauses)) 98 ;; set enable-local-variables to nil
99 selectors (cdr (car clauses))) 99 ;; for newer Emacses
100 (while folders 100 (let ((inhibit-local-variables t)
101 (setq folder (car folders)) 101 (enable-local-variables nil))
102 (and (stringp folder) 102 (find-file-noselect folder)))))
103 (setq folder (expand-file-name folder vm-folder-directory))) 103 (set-buffer (or (and (bufferp folder) folder)
104 (and (listp folder) 104 (vm-get-file-buffer folder)
105 (setq folder (eval folder))) 105 (find-file-noselect folder)))
106 (cond 106 (if (eq major-mode 'vm-virtual-mode)
107 ((null folder) 107 (setq virtual t
108 ;; folder was a s-expr which returned nil 108 real-buffers-used
109 ;; skip it 109 (append vm-real-buffers real-buffers-used))
110 nil ) 110 (setq virtual nil)
111 ((and (stringp folder) (file-directory-p folder)) 111 (if (not (memq (current-buffer) real-buffers-used))
112 (setq folders (nconc folders 112 (setq real-buffers-used (cons (current-buffer)
113 (vm-delete-backup-file-names 113 real-buffers-used)))
114 (vm-delete-auto-save-file-names 114 (if (not (eq major-mode 'vm-mode))
115 (vm-delete-directory-file-names 115 (vm-mode)))
116 (directory-files folder t nil))))))) 116 ;; change (sexpr) into ("/file" "/file2" ...)
117 ((or (null new-messages) 117 ;; this assumes that there will never be (sexpr sexpr2)
118 ;; If we're assimilating messages into an 118 ;; in a virtual folder spec.
119 ;; existing virtual folder, only allow selectors 119 (if (bufferp folder)
120 ;; that would be normally applied to this folder. 120 (if virtual
121 (and (bufferp folder) 121 (setcar (car clauses)
122 (eq (vm-buffer-of (car new-messages)) folder)) 122 (delq nil
123 (and (stringp folder) 123 (mapcar 'buffer-file-name vm-real-buffers)))
124 (eq (vm-buffer-of (car new-messages)) 124 (if buffer-file-name
125 ;; letter bomb protection 125 (setcar (car clauses) (list buffer-file-name)))))
126 ;; set inhibit-local-variables to t for v18 Emacses 126 ;; if new-messages non-nil use it instead of the
127 ;; set enable-local-variables to nil for newer Emacses 127 ;; whole message list
128 (let ((inhibit-local-variables t) 128 (setq mp (or new-messages vm-message-list))
129 (enable-local-variables nil)) 129 (while mp
130 (find-file-noselect folder))))) 130 (if (and (not (intern-soft
131 (set-buffer (or (and (bufferp folder) folder) 131 (vm-message-id-number-of
132 (vm-get-file-buffer folder) 132 (vm-real-message-of (car mp)))
133 (find-file-noselect folder))) 133 message-set))
134 (if (eq major-mode 'vm-virtual-mode) 134 (if virtual
135 (setq virtual t 135 (save-excursion
136 real-buffers-used 136 (set-buffer
137 (append vm-real-buffers real-buffers-used)) 137 (vm-buffer-of
138 (setq virtual nil) 138 (vm-real-message-of
139 (if (not (memq (current-buffer) real-buffers-used)) 139 (car mp))))
140 (setq real-buffers-used (cons (current-buffer) 140 (apply 'vm-vs-or (car mp) selectors))
141 real-buffers-used))) 141 (apply 'vm-vs-or (car mp) selectors)))
142 (if (not (eq major-mode 'vm-mode)) 142 (progn
143 (vm-mode))) 143 (intern
144 ;; change (sexpr) into ("/file" "/file2" ...) 144 (vm-message-id-number-of
145 ;; this assumes that there will never be (sexpr sexpr2) 145 (vm-real-message-of (car mp)))
146 ;; in a virtual folder spec.
147 (if (bufferp folder)
148 (if virtual
149 (setcar (car clauses)
150 (delq nil
151 (mapcar 'buffer-file-name vm-real-buffers)))
152 (if buffer-file-name
153 (setcar (car clauses) (list buffer-file-name)))))
154 ;; if new-messages non-nil use it instead of the
155 ;; whole message list
156 (setq mp (or new-messages vm-message-list))
157 (while mp
158 (if (and (not (intern-soft
159 (vm-message-id-number-of
160 (vm-real-message-of (car mp)))
161 message-set))
162 (if virtual
163 (save-excursion
164 (set-buffer
165 (vm-buffer-of
166 (vm-real-message-of
167 (car mp))))
168 (apply 'vm-vs-or (car mp) selectors))
169 (apply 'vm-vs-or (car mp) selectors)))
170 (progn
171 (intern
172 (vm-message-id-number-of
173 (vm-real-message-of (car mp)))
174 message-set) 146 message-set)
175 (setq message (copy-sequence 147 (setq message (copy-sequence
176 (vm-real-message-of (car mp)))) 148 (vm-real-message-of (car mp))))
177 (if mirrored 149 (if mirrored
178 () 150 ()
179 (vm-set-mirror-data-of 151 (vm-set-mirror-data-of
180 message 152 message
181 (make-vector vm-mirror-data-vector-length nil)) 153 (make-vector vm-mirror-data-vector-length nil))
182 (vm-set-virtual-messages-sym-of 154 (vm-set-virtual-messages-sym-of
183 message (make-symbol "<v>")) 155 message (make-symbol "<v>"))
184 (vm-set-virtual-messages-of message nil) 156 (vm-set-virtual-messages-of message nil)
185 (vm-set-attributes-of 157 (vm-set-attributes-of
186 message 158 message
187 (make-vector vm-attributes-vector-length nil))) 159 (make-vector vm-attributes-vector-length nil)))
188 (vm-set-location-data-of message location-vector) 160 (vm-set-location-data-of message location-vector)
189 (vm-set-softdata-of 161 (vm-set-softdata-of
190 message 162 message
191 (make-vector vm-softdata-vector-length nil)) 163 (make-vector vm-softdata-vector-length nil))
192 (vm-set-real-message-sym-of 164 (vm-set-real-message-sym-of
193 message 165 message
194 (vm-real-message-sym-of (car mp))) 166 (vm-real-message-sym-of (car mp)))
195 (vm-set-message-type-of message vm-folder-type) 167 (vm-set-message-type-of message vm-folder-type)
196 (vm-set-message-id-number-of message 168 (vm-set-message-id-number-of message
197 vm-message-id-number) 169 vm-message-id-number)
198 (vm-increment vm-message-id-number) 170 (vm-increment vm-message-id-number)
199 (vm-set-buffer-of message vbuffer) 171 (vm-set-buffer-of message vbuffer)
200 (vm-set-reverse-link-sym-of message (make-symbol "<--")) 172 (vm-set-reverse-link-sym-of message (make-symbol "<--"))
201 (vm-set-reverse-link-of message tail-cons) 173 (vm-set-reverse-link-of message tail-cons)
202 (if (null tail-cons) 174 (if (null tail-cons)
203 (setq new-message-list (list message) 175 (setq new-message-list (list message)
204 tail-cons new-message-list) 176 tail-cons new-message-list)
205 (setcdr tail-cons (list message)) 177 (setcdr tail-cons (list message))
206 (if (null new-message-list) 178 (if (null new-message-list)
207 (setq new-message-list (cdr tail-cons))) 179 (setq new-message-list (cdr tail-cons)))
208 (setq tail-cons (cdr tail-cons))))) 180 (setq tail-cons (cdr tail-cons)))))
209 (setq mp (cdr mp))))) 181 (setq mp (cdr mp)))))
210 (setq folders (cdr folders))) 182 (setq folders (cdr folders)))
211 (setq clauses (cdr clauses)))) 183 (setq clauses (cdr clauses))))
212 ; this doesn't need to work currently, but it might someday 184 ;; this doesn't need to work currently, but it might someday
213 ; (if virtual 185 ;; (if virtual
214 ; (setq real-buffers-used (vm-delete-duplicates real-buffers-used))) 186 ;; (setq real-buffers-used (vm-delete-duplicates real-buffers-used)))
215 (vm-increment vm-modification-counter) 187 (vm-increment vm-modification-counter)
216 ;; Until this point the user doesn't really have a virtual 188 ;; Until this point the user doesn't really have a virtual
217 ;; folder, as the virtual messages haven't been linked to the 189 ;; folder, as the virtual messages haven't been linked to the
218 ;; real messages, virtual buffers to the real buffers, and no 190 ;; real messages, virtual buffers to the real buffers, and no
219 ;; message list has been installed. 191 ;; message list has been installed.
220 ;; 192 ;;
221 ;; Now we tie it all together, with this section of code being 193 ;; Now we tie it all together, with this section of code being
222 ;; uninterruptible. 194 ;; uninterruptible.
223 (let ((inhibit-quit t) 195 (let ((inhibit-quit t)
224 (label-obarray vm-label-obarray)) 196 (label-obarray vm-label-obarray))
225 (if (null vm-real-buffers) 197 (if (null vm-real-buffers)
226 (setq vm-real-buffers real-buffers-used)) 198 (setq vm-real-buffers real-buffers-used))
227 (save-excursion 199 (save-excursion
228 (while real-buffers-used 200 (while real-buffers-used
229 (set-buffer (car real-buffers-used)) 201 (set-buffer (car real-buffers-used))
230 ;; inherit the global label lists of all the associated 202 ;; inherit the global label lists of all the associated
231 ;; real folders. 203 ;; real folders.
232 (mapatoms (function (lambda (x) (intern (symbol-name x) 204 (mapatoms (function (lambda (x) (intern (symbol-name x)
233 label-obarray))) 205 label-obarray)))
234 vm-label-obarray) 206 vm-label-obarray)
235 (if (not (memq vbuffer vm-virtual-buffers)) 207 (if (not (memq vbuffer vm-virtual-buffers))
236 (setq vm-virtual-buffers (cons vbuffer vm-virtual-buffers))) 208 (setq vm-virtual-buffers (cons vbuffer vm-virtual-buffers)))
237 (setq real-buffers-used (cdr real-buffers-used)))) 209 (setq real-buffers-used (cdr real-buffers-used))))
238 (setq mp new-message-list) 210 (setq mp new-message-list)
239 (while mp 211 (while mp
240 (vm-set-virtual-messages-of 212 (vm-set-virtual-messages-of
241 (vm-real-message-of (car mp)) 213 (vm-real-message-of (car mp))
242 (cons (car mp) (vm-virtual-messages-of (car mp)))) 214 (cons (car mp) (vm-virtual-messages-of (car mp))))
243 (setq mp (cdr mp))) 215 (setq mp (cdr mp)))
244 (if vm-message-list 216 (if vm-message-list
245 (progn 217 (progn
246 (vm-set-summary-redo-start-point new-message-list) 218 (vm-set-summary-redo-start-point new-message-list)
247 (vm-set-numbering-redo-start-point new-message-list)) 219 (vm-set-numbering-redo-start-point new-message-list))
248 (vm-set-summary-redo-start-point t) 220 (vm-set-summary-redo-start-point t)
249 (vm-set-numbering-redo-start-point t) 221 (vm-set-numbering-redo-start-point t)
250 (setq vm-message-list new-message-list))))) 222 (setq vm-message-list new-message-list))))))
251 223
252 (defun vm-create-virtual-folder (selector &optional arg read-only) 224 (defun vm-create-virtual-folder (selector &optional arg read-only)
253 "Create a new virtual folder from messages in the current folder. 225 "Create a new virtual folder from messages in the current folder.
254 The messages will be chosen by applying the selector you specify, 226 The messages will be chosen by applying the selector you specify,
255 which is normally read from the minibuffer. 227 which is normally read from the minibuffer.