Mercurial > emacs
changeset 1968:de0a0ed7318e
(record_property_change): Typo in last change.
(Fprimitive_undo): Handle property-change undo entry.
(record_property_change): New function.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Mon, 01 Mar 1993 09:01:13 +0000 |
parents | 239a8c1cb40f |
children | 2c37a16ab05e |
files | src/undo.c |
diffstat | 1 files changed, 49 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/undo.c Mon Mar 01 08:59:36 1993 +0000 +++ b/src/undo.c Mon Mar 01 09:01:13 1993 +0000 @@ -124,6 +124,41 @@ current_buffer->undo_list = Fcons (Fcons (Qt, Fcons (high, low)), current_buffer->undo_list); } +/* Record a change in property PROP (whose old value was VAL) + for LENGTH characters starting at position BEG in BUFFER. */ + +record_property_change (beg, length, prop, value, buffer) + int beg, length; + Lisp_Object prop, value, buffer; +{ + Lisp_Object lbeg, lend, entry; + struct buffer *obuf = current_buffer; + int boundary = 0; + + if (!EQ (buffer, last_undo_buffer)) + boundary = 1; + last_undo_buffer = buffer; + + if (EQ (current_buffer->undo_list, Qt)) + return; + + /* Switch temporarily to the buffer that was changed. */ + current_buffer = XBUFFER (buffer); + + if (boundary) + Fundo_boundary (); + + if (MODIFF <= current_buffer->save_modified) + record_first_change (); + + XSET (lbeg, Lisp_Int, beg); + XSET (lend, Lisp_Int, beg + length); + entry = Fcons (Qnil, Fcons (prop, Fcons (value, Fcons (lbeg, lend)))); + current_buffer->undo_list = Fcons (entry, current_buffer->undo_list); + + current_buffer = obuf; +} + DEFUN ("undo-boundary", Fundo_boundary, Sundo_boundary, 0, 0, 0, "Mark a boundary between units of undo.\n\ An undo command will stop at this point,\n\ @@ -299,6 +334,20 @@ #endif /* CLASH_DETECTION */ Fset_buffer_modified_p (Qnil); } + if (EQ (car, Qnil)) + { + /* Element (t prop val beg . end) records property change. */ + Lisp_Object beg, end, prop, val; + + prop = Fcar (cdr); + cdr = Fcdr (cdr); + val = Fcar (cdr); + cdr = Fcdr (cdr); + beg = Fcar (cdr); + end = Fcdr (cdr); + + Fput_text_property (beg, end, prop, val, Qnil); + } else if (XTYPE (car) == Lisp_Int && XTYPE (cdr) == Lisp_Int) { /* Element (BEG . END) means range was inserted. */