aboutsummaryrefslogtreecommitdiffstats
path: root/src/undo.c
diff options
context:
space:
mode:
authorStefan Monnier <[email protected]>2002-04-04 20:42:56 +0000
committerStefan Monnier <[email protected]>2002-04-04 20:42:56 +0000
commit6396140ae1bc3a3cec38a7035a31ca9a5436cca1 (patch)
tree94ab1d0dc57136e63b7d89e5547e9b1b0f3900e6 /src/undo.c
parentb3bbfb96761cf5bea428ee08bf41c04cc3b9df06 (diff)
(record_point): New fun.
(record_delete, record_insert): Use it.
Diffstat (limited to 'src/undo.c')
-rw-r--r--src/undo.c120
1 files changed, 63 insertions, 57 deletions
diff --git a/src/undo.c b/src/undo.c
index ec6f9d6b1d..bf0c9f5b66 100644
--- a/src/undo.c
+++ b/src/undo.c
@@ -36,19 +36,15 @@ Lisp_Object Qinhibit_read_only;
an undo-boundary. */
Lisp_Object pending_boundary;
-/* Record an insertion that just happened or is about to happen,
- for LENGTH characters at position BEG.
- (It is possible to record an insertion before or after the fact
- because we don't need to record the contents.) */
+/* 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
+ undo record that will be added just after this command terminates. */
-void
-record_insert (beg, length)
- int beg, length;
+static void
+record_point (pt)
{
- Lisp_Object lbeg, lend;
-
- if (EQ (current_buffer->undo_list, Qt))
- return;
+ int at_boundary;
/* Allocate a cons cell to be the undo boundary after this command. */
if (NILP (pending_boundary))
@@ -59,9 +55,58 @@ record_insert (beg, length)
Fundo_boundary ();
XSETBUFFER (last_undo_buffer, current_buffer);
+ if (CONSP (current_buffer->undo_list))
+ {
+ /* Set AT_BOUNDARY to 1 only when we have nothing other than
+ marker adjustment before undo boundary. */
+
+ Lisp_Object tail = current_buffer->undo_list, elt;
+
+ while (1)
+ {
+ if (NILP (tail))
+ elt = Qnil;
+ else
+ elt = XCAR (tail);
+ if (NILP (elt) || ! (CONSP (elt) && MARKERP (XCAR (elt))))
+ break;
+ tail = XCDR (tail);
+ }
+ at_boundary = NILP (elt);
+ }
+ else
+ at_boundary = 1;
+
if (MODIFF <= SAVE_MODIFF)
record_first_change ();
+ /* If we are just after an undo boundary, and
+ point wasn't at start of deleted range, record where it was. */
+ if (at_boundary
+ && last_point_position != pt
+ /* If we're called from batch mode, this could be nil. */
+ && BUFFERP (last_point_position_buffer)
+ && current_buffer == XBUFFER (last_point_position_buffer))
+ current_buffer->undo_list
+ = Fcons (make_number (last_point_position), current_buffer->undo_list);
+}
+
+/* Record an insertion that just happened or is about to happen,
+ for LENGTH characters at position BEG.
+ (It is possible to record an insertion before or after the fact
+ because we don't need to record the contents.) */
+
+void
+record_insert (beg, length)
+ int beg, length;
+{
+ Lisp_Object lbeg, lend;
+
+ if (EQ (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 (current_buffer->undo_list))
@@ -93,59 +138,20 @@ record_delete (beg, string)
Lisp_Object string;
{
Lisp_Object sbeg;
- int at_boundary;
if (EQ (current_buffer->undo_list, Qt))
return;
- /* Allocate a cons cell to be the undo boundary after this command. */
- if (NILP (pending_boundary))
- pending_boundary = Fcons (Qnil, Qnil);
-
- if (BUFFERP (last_undo_buffer)
- && current_buffer != XBUFFER (last_undo_buffer))
- Fundo_boundary ();
- XSETBUFFER (last_undo_buffer, current_buffer);
-
- if (CONSP (current_buffer->undo_list))
+ if (PT == beg + XSTRING (string)->size)
{
- /* Set AT_BOUNDARY to 1 only when we have nothing other than
- marker adjustment before undo boundary. */
-
- Lisp_Object tail = current_buffer->undo_list, elt;
-
- while (1)
- {
- if (NILP (tail))
- elt = Qnil;
- else
- elt = XCAR (tail);
- if (NILP (elt) || ! (CONSP (elt) && MARKERP (XCAR (elt))))
- break;
- tail = XCDR (tail);
- }
- at_boundary = NILP (elt);
+ XSETINT (sbeg, -beg);
+ record_point (PT);
}
else
- at_boundary = 0;
-
- if (MODIFF <= SAVE_MODIFF)
- record_first_change ();
-
- if (PT == beg + XSTRING (string)->size)
- XSETINT (sbeg, -beg);
- else
- XSETFASTINT (sbeg, beg);
-
- /* If we are just after an undo boundary, and
- point wasn't at start of deleted range, record where it was. */
- if (at_boundary
- && last_point_position != XFASTINT (sbeg)
- /* If we're called from batch mode, this could be nil. */
- && BUFFERP (last_point_position_buffer)
- && current_buffer == XBUFFER (last_point_position_buffer))
- current_buffer->undo_list
- = Fcons (make_number (last_point_position), current_buffer->undo_list);
+ {
+ XSETFASTINT (sbeg, beg);
+ record_point (beg);
+ }
current_buffer->undo_list
= Fcons (Fcons (string, sbeg), current_buffer->undo_list);