X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fextents.c;h=5bc0dc41d2c3f2a6ae4cc6886d2acd72f216583b;hb=5378ab6d2bb24fd8d39025be1574d406cf91f141;hp=95a059b68602c195581b2062196ca061a2c01cef;hpb=40402600969429d5253e62c6314a3eebbb21f027;p=chise%2Fxemacs-chise.git.1 diff --git a/src/extents.c b/src/extents.c index 95a059b..5bc0dc4 100644 --- a/src/extents.c +++ b/src/extents.c @@ -2753,9 +2753,10 @@ invisible_ellipsis_p (REGISTER Lisp_Object propval, Lisp_Object list) face_index extent_fragment_update (struct window *w, struct extent_fragment *ef, - Bytind pos) + Bytind pos, Lisp_Object last_glyph) { int i; + int seen_glyph = NILP (last_glyph) ? 1 : 0; Extent_List *sel = buffer_or_string_stack_of_extents_force (ef->object)->extents; EXTENT lhe = 0; @@ -2796,11 +2797,15 @@ extent_fragment_update (struct window *w, struct extent_fragment *ef, if (extent_start (e) == mempos && !NILP (extent_begin_glyph (e))) { Lisp_Object glyph = extent_begin_glyph (e); - struct glyph_block gb; - - gb.glyph = glyph; - XSETEXTENT (gb.extent, e); - Dynarr_add (ef->begin_glyphs, gb); + if (seen_glyph) { + struct glyph_block gb; + + gb.glyph = glyph; + XSETEXTENT (gb.extent, e); + Dynarr_add (ef->begin_glyphs, gb); + } + else if (EQ (glyph, last_glyph)) + seen_glyph = 1; } } @@ -2811,11 +2816,15 @@ extent_fragment_update (struct window *w, struct extent_fragment *ef, if (extent_end (e) == mempos && !NILP (extent_end_glyph (e))) { Lisp_Object glyph = extent_end_glyph (e); - struct glyph_block gb; + if (seen_glyph) { + struct glyph_block gb; - gb.glyph = glyph; - XSETEXTENT (gb.extent, e); - Dynarr_add (ef->end_glyphs, gb); + gb.glyph = glyph; + XSETEXTENT (gb.extent, e); + Dynarr_add (ef->end_glyphs, gb); + } + else if (EQ (glyph, last_glyph)) + seen_glyph = 1; } } @@ -2951,8 +2960,8 @@ print_extent_1 (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag) strcpy (bp, "detached"); else sprintf (bp, "%ld, %ld", - (long) XINT (Fextent_start_position (obj)), - (long) XINT (Fextent_end_position (obj))); + XINT (Fextent_start_position (obj)), + XINT (Fextent_end_position (obj))); bp += strlen (bp); *bp++ = (extent_end_open_p (anc) ? ')': ']'); if (!NILP (extent_end_glyph (anc))) *bp++ = '*'; @@ -3843,6 +3852,7 @@ See documentation on `detach-extent' for a discussion of undo recording. get_buffer_or_string_range_byte (buffer_or_string, start, end, &s, &e, GB_ALLOW_PAST_ACCESSIBLE); + buffer_or_string_extent_info_force (buffer_or_string); set_extent_endpoints (ext, s, e, buffer_or_string); return extent; } @@ -4574,27 +4584,36 @@ process_extents_for_insertion_mapper (EXTENT extent, void *arg) #endif /* The extent-adjustment code adjusted the extent's endpoints as if - they were markers -- endpoints at the gap (i.e. the insertion - point) go to the left of the insertion point, which is correct - for [) extents. We need to fix the other kinds of extents. + all extents were closed-open -- endpoints at the insertion point + remain unchanged. We need to fix the other kinds of extents: + + 1. Start position of start-open extents needs to be moved. - Note that both conditions below will hold for zero-length (] - extents at the gap. Zero-length () extents would get adjusted - such that their start is greater than their end; we treat them - as [) extents. This is unfortunately an inelegant part of the - extent model, but there is no way around it. */ + 2. End position of end-closed extents needs to be moved. + + Note that both conditions hold for zero-length (] extents at the + insertion point. But under these rules, zero-length () extents + would get adjusted such that their start is greater than their + end; instead of allowing that, we treat them as [) extents by + modifying condition #1 to not fire nothing when dealing with a + zero-length open-open extent. + + Existence of zero-length open-open extents is unfortunately an + inelegant part of the extent model, but there is no way around + it. */ { - Memind new_start, new_end; + Memind new_start = extent_start (extent); + Memind new_end = extent_end (extent); - new_start = extent_start (extent); - new_end = extent_end (extent); - if (indice == extent_start (extent) && extent_start_open_p (extent) && - /* coerce zero-length () extents to [) */ - new_start != new_end) + if (indice == extent_start (extent) && extent_start_open_p (extent) + /* zero-length () extents are exempt; see comment above. */ + && !(new_start == new_end && extent_end_open_p (extent)) + ) new_start += closure->length; if (indice == extent_end (extent) && !extent_end_open_p (extent)) new_end += closure->length; + set_extent_endpoints_1 (extent, new_start, new_end); } @@ -5332,7 +5351,14 @@ The following symbols have predefined meanings: `inside-margin', or `outside-margin') of the extent's begin glyph. - end-glyph-layout The layout policy of the extent's end glyph. + end-glyph-layout The layout policy of the extent's end glyph. + + syntax-table A cons or a syntax table object. If a cons, the car must + be an integer (interpreted as a syntax code, applicable to + all characters in the extent). Otherwise, syntax of + characters in the extent is looked up in the syntax table. + You should use the text property API to manipulate this + property. (This may be required in the future.) */ (extent, property, value)) {