void record_delete (ptrdiff_t beg, Lisp_Object string, bool record_markers) { Lisp_Object sbeg; if (EQ (BVAR (current_buffer, undo_list), Qt)) return; if (PT == beg + SCHARS (string)) { XSETINT (sbeg, -beg); record_point (PT); } else { XSETFASTINT (sbeg, beg); record_point (beg); } /* primitive-undo assumes marker adjustments are recorded immediately before the deletion is recorded. See bug 16818 discussion. */ if (record_markers) record_marker_adjustments (beg, beg + SCHARS (string)); bset_undo_list (current_buffer, Fcons (Fcons (string, sbeg), BVAR (current_buffer, undo_list))); }
void record_insert (ptrdiff_t beg, ptrdiff_t length) { Lisp_Object lbeg, lend; if (EQ (BVAR (current_buffer, undo_list), Qt)) return; record_point (beg); /* If this is following another insertion and consecutive with it in the buffer, combine the two. */ if (CONSP (BVAR (current_buffer, undo_list))) { Lisp_Object elt; elt = XCAR (BVAR (current_buffer, undo_list)); if (CONSP (elt) && INTEGERP (XCAR (elt)) && INTEGERP (XCDR (elt)) && XINT (XCDR (elt)) == beg) { XSETCDR (elt, make_number (beg + length)); return; } } XSETFASTINT (lbeg, beg); XSETINT (lend, beg + length); bset_undo_list (current_buffer, Fcons (Fcons (lbeg, lend), BVAR (current_buffer, undo_list))); }
void record_delete (EMACS_INT beg, Lisp_Object string) { Lisp_Object sbeg; if (EQ (BVAR (current_buffer, undo_list), Qt)) return; if (PT == beg + SCHARS (string)) { XSETINT (sbeg, -beg); record_point (PT); } else { XSETFASTINT (sbeg, beg); record_point (beg); } BVAR (current_buffer, undo_list) = Fcons (Fcons (string, sbeg), BVAR (current_buffer, undo_list)); }