diff options
author | Phillip Lord <phillip.lord@newcastle.ac.uk> | 2015-08-06 21:33:58 +0100 |
---|---|---|
committer | Phillip Lord <phillip.lord@russet.org.uk> | 2015-11-12 21:06:05 +0000 |
commit | 44dfa86b7d382b84564d68472da1448d08f48129 (patch) | |
tree | 778e2228ec90a4401b2be6cd7b258ee44a212b26 /src/undo.c | |
parent | 0aec2aaccd8b745fa7214f3edd453c04a04bfba4 (diff) | |
download | emacs-44dfa86b7d382b84564d68472da1448d08f48129.tar.gz emacs-44dfa86b7d382b84564d68472da1448d08f48129.tar.bz2 emacs-44dfa86b7d382b84564d68472da1448d08f48129.zip |
The heuristic that Emacs uses to add an `undo-boundary' has been
reworked, as it interacts poorly with functions on `post-command-hook'
or `after-change-functions'.
* lisp/simple.el: New section added.
* src/cmds.c (remove_excessive_undo_boundaries): Now in lisp.
(self_insert_command): Calls simple.el to amalgamate.
(delete_char): Calls simple.el to amalgamate.
* src/keyboard.c (last_undo_boundary): Removed.
* src/undo.c (run_undoable_change): New function.
Diffstat (limited to 'src/undo.c')
-rw-r--r-- | src/undo.c | 51 |
1 files changed, 17 insertions, 34 deletions
diff --git a/src/undo.c b/src/undo.c index 750bc8afff2..364b37eeeb4 100644 --- a/src/undo.c +++ b/src/undo.c @@ -26,10 +26,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include "commands.h" #include "window.h" -/* Last buffer for which undo information was recorded. */ -/* BEWARE: This is not traced by the GC, so never dereference it! */ -static struct buffer *last_undo_buffer; - /* Position of point last time we inserted a boundary. */ static struct buffer *last_boundary_buffer; static ptrdiff_t last_boundary_position; @@ -41,6 +37,12 @@ static ptrdiff_t last_boundary_position; an undo-boundary. */ static Lisp_Object pending_boundary; +void +run_undoable_change () +{ + call0 (Qundo_auto__undoable_change); +} + /* Record point as it was at beginning of this command (if necessary) and prepare the undo info for recording a change. PT is the position of point that will naturally occur as a result of the @@ -59,15 +61,7 @@ record_point (ptrdiff_t pt) if (NILP (pending_boundary)) pending_boundary = Fcons (Qnil, Qnil); - if ((current_buffer != last_undo_buffer) - /* Don't call Fundo_boundary for the first change. Otherwise we - risk overwriting last_boundary_position in Fundo_boundary with - PT of the current buffer and as a consequence not insert an - undo boundary because last_boundary_position will equal pt in - the test at the end of the present function (Bug#731). */ - && (MODIFF > SAVE_MODIFF)) - Fundo_boundary (); - last_undo_buffer = current_buffer; + run_undoable_change (); at_boundary = ! CONSP (BVAR (current_buffer, undo_list)) || NILP (XCAR (BVAR (current_buffer, undo_list))); @@ -139,9 +133,7 @@ record_marker_adjustments (ptrdiff_t from, ptrdiff_t to) if (NILP (pending_boundary)) pending_boundary = Fcons (Qnil, Qnil); - if (current_buffer != last_undo_buffer) - Fundo_boundary (); - last_undo_buffer = current_buffer; + run_undoable_change (); for (m = BUF_MARKERS (current_buffer); m; m = m->next) { @@ -228,10 +220,6 @@ record_first_change (void) if (EQ (BVAR (current_buffer, undo_list), Qt)) return; - if (current_buffer != last_undo_buffer) - Fundo_boundary (); - last_undo_buffer = current_buffer; - if (base_buffer->base_buffer) base_buffer = base_buffer->base_buffer; @@ -259,15 +247,10 @@ record_property_change (ptrdiff_t beg, ptrdiff_t length, if (NILP (pending_boundary)) pending_boundary = Fcons (Qnil, Qnil); - if (buf != last_undo_buffer) - boundary = true; - last_undo_buffer = buf; - /* Switch temporarily to the buffer that was changed. */ - current_buffer = buf; + set_buffer_internal (buf); - if (boundary) - Fundo_boundary (); + run_undoable_change (); if (MODIFF <= SAVE_MODIFF) record_first_change (); @@ -278,7 +261,8 @@ record_property_change (ptrdiff_t beg, ptrdiff_t length, bset_undo_list (current_buffer, Fcons (entry, BVAR (current_buffer, undo_list))); - current_buffer = obuf; + /* Reset the buffer */ + set_buffer_internal (obuf); } DEFUN ("undo-boundary", Fundo_boundary, Sundo_boundary, 0, 0, 0, @@ -308,6 +292,8 @@ but another undo command will undo to the previous boundary. */) } last_boundary_position = PT; last_boundary_buffer = current_buffer; + + Fset (Qundo_auto__last_boundary_cause, Qexplicit); return Qnil; } @@ -383,7 +369,6 @@ truncate_undo_list (struct buffer *b) && !NILP (Vundo_outer_limit_function)) { Lisp_Object tem; - struct buffer *temp = last_undo_buffer; /* Normally the function this calls is undo-outer-limit-truncate. */ tem = call1 (Vundo_outer_limit_function, make_number (size_so_far)); @@ -394,10 +379,6 @@ truncate_undo_list (struct buffer *b) unbind_to (count, Qnil); return; } - /* That function probably used the minibuffer, and if so, that - changed last_undo_buffer. Change it back so that we don't - force next change to make an undo boundary here. */ - last_undo_buffer = temp; } if (CONSP (next)) @@ -455,6 +436,9 @@ 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"); /* Marker for function call undo list elements. */ DEFSYM (Qapply, "apply"); @@ -462,7 +446,6 @@ syms_of_undo (void) pending_boundary = Qnil; staticpro (&pending_boundary); - last_undo_buffer = NULL; last_boundary_buffer = NULL; defsubr (&Sundo_boundary); |