X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/d6b046c9921aa55207f60509f68ecde0e9ae0493..edae7d93ed509aa8a7db3952c70550cf3353d169:/src/undo.c?ds=sidebyside diff --git a/src/undo.c b/src/undo.c index 0a5da853dc..be5b270205 100644 --- a/src/undo.c +++ b/src/undo.c @@ -1,13 +1,13 @@ /* undo handling for GNU Emacs. - Copyright (C) 1990, 1993-1994, 2000-2015 Free Software Foundation, + Copyright (C) 1990, 1993-1994, 2000-2016 Free Software Foundation, Inc. This file is part of GNU Emacs. GNU Emacs is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. +the Free Software Foundation, either version 3 of the License, or (at +your option) any later version. GNU Emacs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -22,10 +22,7 @@ along with GNU Emacs. If not, see . */ #include "lisp.h" #include "buffer.h" - -/* Position of point last time we inserted a boundary. */ -static struct buffer *last_boundary_buffer; -static ptrdiff_t last_boundary_position; +#include "keyboard.h" /* The first time a command records something for undo. it also allocates the undo-boundary object @@ -34,45 +31,42 @@ static ptrdiff_t last_boundary_position; an undo-boundary. */ static Lisp_Object pending_boundary; -void -run_undoable_change (void) +/* Record point as it was at beginning of this command (if necessary) + and prepare the undo info for recording a change. + Prepare the undo info for recording a change. */ +static void +prepare_record (void) { - call0 (Qundo_auto__undoable_change); + /* Allocate a cons cell to be the undo boundary after this command. */ + if (NILP (pending_boundary)) + pending_boundary = Fcons (Qnil, Qnil); + + if (MODIFF <= SAVE_MODIFF) + record_first_change (); } -/* Record point as it was at beginning of this command (if necessary) - and prepare the undo info for recording a change. +/* Record point as it was at beginning of this command. PT is the position of point that will naturally occur as a result of the undo record that will be added just after this command terminates. */ - static void record_point (ptrdiff_t pt) { - bool at_boundary; - /* Don't record position of pt when undo_inhibit_record_point holds. */ if (undo_inhibit_record_point) return; - /* Allocate a cons cell to be the undo boundary after this command. */ - if (NILP (pending_boundary)) - pending_boundary = Fcons (Qnil, Qnil); - - run_undoable_change (); + bool at_boundary; at_boundary = ! CONSP (BVAR (current_buffer, undo_list)) || NILP (XCAR (BVAR (current_buffer, undo_list))); - if (MODIFF <= SAVE_MODIFF) - record_first_change (); + prepare_record (); /* If we are just after an undo boundary, and point wasn't at start of deleted range, record where it was. */ - if (at_boundary - && current_buffer == last_boundary_buffer - && last_boundary_position != pt) + if (at_boundary) bset_undo_list (current_buffer, - Fcons (make_number (last_boundary_position), + Fcons (make_number (pt), BVAR (current_buffer, undo_list))); } @@ -89,7 +83,7 @@ record_insert (ptrdiff_t beg, ptrdiff_t length) if (EQ (BVAR (current_buffer, undo_list), Qt)) return; - record_point (beg); + prepare_record (); /* If this is following another insertion and consecutive with it in the buffer, combine the two. */ @@ -130,8 +124,6 @@ record_marker_adjustments (ptrdiff_t from, ptrdiff_t to) if (NILP (pending_boundary)) pending_boundary = Fcons (Qnil, Qnil); - run_undoable_change (); - for (m = BUF_MARKERS (current_buffer); m; m = m->next) { charpos = m->charpos; @@ -163,7 +155,6 @@ record_marker_adjustments (ptrdiff_t from, ptrdiff_t to) /* Record that a deletion is about to take place, of the characters in STRING, at location BEG. Optionally record adjustments for markers in the region STRING occupies in the current buffer. */ - void record_delete (ptrdiff_t beg, Lisp_Object string, bool record_markers) { @@ -172,15 +163,19 @@ record_delete (ptrdiff_t beg, Lisp_Object string, bool record_markers) if (EQ (BVAR (current_buffer, undo_list), Qt)) return; + if (point_before_last_command_or_undo != beg + && buffer_before_last_command_or_undo == current_buffer) + record_point (point_before_last_command_or_undo); + if (PT == beg + SCHARS (string)) { XSETINT (sbeg, -beg); - record_point (PT); + prepare_record (); } else { XSETFASTINT (sbeg, beg); - record_point (beg); + prepare_record (); } /* primitive-undo assumes marker adjustments are recorded @@ -234,7 +229,7 @@ record_property_change (ptrdiff_t beg, ptrdiff_t length, Lisp_Object buffer) { Lisp_Object lbeg, lend, entry; - struct buffer *obuf = current_buffer, *buf = XBUFFER (buffer); + struct buffer *buf = XBUFFER (buffer); if (EQ (BVAR (buf, undo_list), Qt)) return; @@ -243,11 +238,6 @@ record_property_change (ptrdiff_t beg, ptrdiff_t length, if (NILP (pending_boundary)) pending_boundary = Fcons (Qnil, Qnil); - /* Switch temporarily to the buffer that was changed. */ - set_buffer_internal (buf); - - run_undoable_change (); - if (MODIFF <= SAVE_MODIFF) record_first_change (); @@ -256,9 +246,6 @@ record_property_change (ptrdiff_t beg, ptrdiff_t length, entry = Fcons (Qnil, Fcons (prop, Fcons (value, Fcons (lbeg, lend)))); bset_undo_list (current_buffer, Fcons (entry, BVAR (current_buffer, undo_list))); - - /* Reset the buffer */ - set_buffer_internal (obuf); } DEFUN ("undo-boundary", Fundo_boundary, Sundo_boundary, 0, 0, 0, @@ -286,10 +273,11 @@ but another undo command will undo to the previous boundary. */) bset_undo_list (current_buffer, Fcons (Qnil, BVAR (current_buffer, undo_list))); } - last_boundary_position = PT; - last_boundary_buffer = current_buffer; Fset (Qundo_auto__last_boundary_cause, Qexplicit); + point_before_last_command_or_undo = PT; + buffer_before_last_command_or_undo = current_buffer; + return Qnil; } @@ -432,7 +420,6 @@ void syms_of_undo (void) { DEFSYM (Qinhibit_read_only, "inhibit-read-only"); - DEFSYM (Qundo_auto__undoable_change, "undo-auto--undoable-change"); DEFSYM (Qundo_auto__last_boundary_cause, "undo-auto--last-boundary-cause"); DEFSYM (Qexplicit, "explicit"); @@ -442,8 +429,6 @@ syms_of_undo (void) pending_boundary = Qnil; staticpro (&pending_boundary); - last_boundary_buffer = NULL; - defsubr (&Sundo_boundary); DEFVAR_INT ("undo-limit", undo_limit,