summaryrefslogtreecommitdiff
path: root/src/undo.c
diff options
context:
space:
mode:
authorPhillip Lord <phillip.lord@russet.org.uk>2015-11-19 15:57:55 +0000
committerPhillip Lord <phillip.lord@russet.org.uk>2015-11-26 17:57:11 +0000
commit7592cb9d2a5d68dcb556c87226e38588ce555bd9 (patch)
treed845f1a53b432956e3c1711b586d938aac50996a /src/undo.c
parent02cd9cb8afd9510e3bdb20ce7148d1b9a6aa9d12 (diff)
downloademacs-7592cb9d2a5d68dcb556c87226e38588ce555bd9.tar.gz
After delete, record point location in undo.
Addresses Bug #21968. * lisp/simple.el (undo-auto--add-boundary): Clean up code to better support intercalating calls. * src/keyboard.c,src/keyboard.h (command_loop_1): Store value of point and current buffer before each command. * src/undo.c (record_point): Now only record the point. * src/undo.c (prepare_record): Functionality removed form record_point. * src/undo.c (record_delete): Check if point needs recording. * src/undo.c (undo-boundary): Record value of point before each boundary. * test/automated/simple-test.el: New tests. Conflicts: src/undo.c
Diffstat (limited to 'src/undo.c')
-rw-r--r--src/undo.c57
1 files changed, 33 insertions, 24 deletions
diff --git a/src/undo.c b/src/undo.c
index 060dbfc97b1..68065750b0f 100644
--- a/src/undo.c
+++ b/src/undo.c
@@ -22,10 +22,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
#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
@@ -36,36 +33,44 @@ static Lisp_Object pending_boundary;
/* 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 ()
+{
+ /* Allocate a cons cell to be the undo boundary after this command. */
+ if (NILP (pending_boundary))
+ pending_boundary = Fcons (Qnil, Qnil);
+
+ run_undoable_change ();
+
+ if (MODIFF <= SAVE_MODIFF)
+ record_first_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);
+ 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)));
+ }
}
/* Record an insertion that just happened or is about to happen,
@@ -81,7 +86,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. */
@@ -153,7 +158,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)
{
@@ -162,15 +166,21 @@ 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
@@ -268,10 +278,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;
}
@@ -423,8 +434,6 @@ syms_of_undo (void)
pending_boundary = Qnil;
staticpro (&pending_boundary);
- last_boundary_buffer = NULL;
-
defsubr (&Sundo_boundary);
DEFVAR_INT ("undo-limit", undo_limit,