Function: make-overlay

make-overlay is a function defined in buffer.c.

Signature

(make-overlay BEG END &optional BUFFER FRONT-ADVANCE REAR-ADVANCE)

Documentation

Create a new overlay with range BEG to END in BUFFER and return it.

If omitted, BUFFER defaults to the current buffer. BEG and END may be integers or markers. The fourth arg FRONT-ADVANCE, if non-nil, makes the marker for the front of the overlay advance when text is inserted there
(which means the text *is not* included in the overlay).
The fifth arg REAR-ADVANCE, if non-nil, makes the marker for the rear of the overlay advance when text is inserted there
(which means the text *is* included in the overlay).

Other relevant functions are documented in the overlay group.

Probably introduced at or before Emacs version 19.30.

Shortdoc

;; overlay
(make-overlay 1 10)
    e.g. => #<overlay from 1 to 10 in *foo*>

Aliases

reftex-make-overlay (obsolete since 28.1) viper-make-overlay (obsolete since 27.1) ediff-make-overlay (obsolete since 27.1) speedbar-make-overlay (obsolete since 27.1) semantic-make-overlay (obsolete since 27.1)

Source Code

// Defined in /usr/src/emacs/src/buffer.c
{
  Lisp_Object overlay;
  struct buffer *b;

  if (NILP (buffer))
    XSETBUFFER (buffer, current_buffer);
  else
    CHECK_BUFFER (buffer);

  if (MARKERP (beg) && !EQ (Fmarker_buffer (beg), buffer))
    signal_error ("Marker points into wrong buffer", beg);
  if (MARKERP (end) && !EQ (Fmarker_buffer (end), buffer))
    signal_error ("Marker points into wrong buffer", end);

  CHECK_FIXNUM_COERCE_MARKER (beg);
  CHECK_FIXNUM_COERCE_MARKER (end);

  if (XFIXNUM (beg) > XFIXNUM (end))
    {
      Lisp_Object temp;
      temp = beg; beg = end; end = temp;
    }

  b = XBUFFER (buffer);

  beg = Fset_marker (Fmake_marker (), beg, buffer);
  end = Fset_marker (Fmake_marker (), end, buffer);

  if (!NILP (front_advance))
    XMARKER (beg)->insertion_type = 1;
  if (!NILP (rear_advance))
    XMARKER (end)->insertion_type = 1;

  overlay = build_overlay (beg, end, Qnil);

  /* Put the new overlay on the wrong list.  */
  end = OVERLAY_END (overlay);
  if (OVERLAY_POSITION (end) < b->overlay_center)
    {
      eassert (b->overlays_after || (XOVERLAY (overlay)->next == NULL));
      XOVERLAY (overlay)->next = b->overlays_after;
      set_buffer_overlays_after (b, XOVERLAY (overlay));
    }
  else
    {
      eassert (b->overlays_before || (XOVERLAY (overlay)->next == NULL));
      XOVERLAY (overlay)->next = b->overlays_before;
      set_buffer_overlays_before (b, XOVERLAY (overlay));
    }
  /* This puts it in the right list, and in the right order.  */
  recenter_overlay_lists (b, b->overlay_center);

  /* We don't need to redisplay the region covered by the overlay, because
     the overlay has no properties at the moment.  */

  return overlay;
}