From: Joe K. <jo...@zi...> - 2003-06-07 22:35:08
|
I have finally gone through the latest CVS changes. I must say that I was pleasantly surprised to see that the front and back markers are now overlays onto themselves, although it does complicate things somewhat as far as noweb support goes. Anyway, I wrote a mmm-names-in to produce a list of areas matching a submode name with the ability to include or exclude the delimiter positions as part of the returned list. The complicating factor is that I had to essentially write a special version of mmm-submode-changes-in since I have to look at the presence or absence of the delim overlay property before deciding if I want to include a particular overlay in my list. Here is my function: (defun mmm-names-in (start stop &optional delim) "Return a list of names of regions of the form (NAME BEG END) whose disjoint union covers the region from START to STOP, not including delimiters. The optional parameter DELIM indicates whether or not to include the front and back delimiters in the regions." ;; This is like mmm-regions-in, but we cannot use mmm-submode-changes-in ;; as the basis. Since the front and back delimiters are separate ;; overlays, we have to start with the list of overlapping overlays ;; first, then possibly remove the delimiter regions, then manually ;; form the list from overlay properties. (let ((ovls (mmm-overlays-overlapping start stop))) (maplist #'(lambda (ovl) (list (or (overlay-get ovl 'name) (symbol-name (overlay-get ovl 'mmm-mode))) (overlay-start (or (and delim (overlay-get ovl 'front)) ovl)) (overlay-end (or (and delim (overlay-get ovl 'back)) ovl)))) (if delim (remove-if #'(lambda (ovl) (overlay-get ovl 'delim)) ovls) ovls)))) Similarly, for narrowing, if point is in the delimiter, we want to include both delimiters and the submode area in the narrowed region, otherwise we want to include only the submode region. I still have to tackle being able to narrow a primary-mode region which includes any "quote-like" submode areas so that narrowing includes the quoted areas, but not the next major submode area. (defun mmm-narrow-to-submode-region () "Narrow to the current submode region. If point is in a submode delimiter, then we include both delimiters and the submode region, otherwise we narrow to just the submode region." (interactive) (let ((ovl (mmm-overlay-at (point)))) (if ovl (narrow-to-region (overlay-start (or (and (overlay-get ovl 'delim) (overlay-get (overlay-get ovl 'region) 'front)) ovl)) (overlay-end (or (and (overlay-get ovl 'delim) (overlay-get (overlay-get ovl 'region) 'back)) ovl)))))) Should I put changes like this into mmm-region.el or should I confine all of my changes to mmm-noweb.el? I also want to put back mmm-add-to-group into mmm-classes.el since that did not appear in the last CVS updates. /Joe |