annotate src/undo.c @ 16884:36babc489b0c

Change all uses of win95, winnt, and win32 into Windows 95, Windows NT, and W32, respectively. Expand "win" substring in variables referring to Microsoft Windows constructs into "windows". Canonicalize header comments to use same terminology.
author Geoff Voelker <voelker@cs.washington.edu>
date Mon, 20 Jan 1997 00:38:22 +0000
parents 855c8d8ba0f0
children dc2cb454b330
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1 /* undo handling for GNU Emacs.
7307
cd81dba38a49 Update copyright.
Karl Heuer <kwzh@gnu.org>
parents: 6254
diff changeset
2 Copyright (C) 1990, 1993, 1994 Free Software Foundation, Inc.
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4 This file is part of GNU Emacs.
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5
14186
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 12649
diff changeset
6 GNU Emacs is free software; you can redistribute it and/or modify
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 12649
diff changeset
7 it under the terms of the GNU General Public License as published by
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 12649
diff changeset
8 the Free Software Foundation; either version 2, or (at your option)
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 12649
diff changeset
9 any later version.
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
10
14186
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 12649
diff changeset
11 GNU Emacs is distributed in the hope that it will be useful,
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 12649
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 12649
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 12649
diff changeset
14 GNU General Public License for more details.
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 12649
diff changeset
15
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 12649
diff changeset
16 You should have received a copy of the GNU General Public License
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 12649
diff changeset
17 along with GNU Emacs; see the file COPYING. If not, write to
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 12649
diff changeset
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 12649
diff changeset
19 Boston, MA 02111-1307, USA. */
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
20
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
21
4696
1fc792473491 Include <config.h> instead of "config.h".
Roland McGrath <roland@gnu.org>
parents: 3719
diff changeset
22 #include <config.h>
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
23 #include "lisp.h"
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
24 #include "buffer.h"
6180
d369907be635 (record_delete): Save last_point_position in the undo record, rather than the
Karl Heuer <kwzh@gnu.org>
parents: 5762
diff changeset
25 #include "commands.h"
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
26
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
27 /* Last buffer for which undo information was recorded. */
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
28 Lisp_Object last_undo_buffer;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
29
3696
aa9310f06c0f (syms_of_undo): Set up Qinhibit_read_only.
Richard M. Stallman <rms@gnu.org>
parents: 3687
diff changeset
30 Lisp_Object Qinhibit_read_only;
aa9310f06c0f (syms_of_undo): Set up Qinhibit_read_only.
Richard M. Stallman <rms@gnu.org>
parents: 3687
diff changeset
31
6254
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
32 /* The first time a command records something for undo.
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
33 it also allocates the undo-boundary object
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
34 which will be added to the list at the end of the command.
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
35 This ensures we can't run out of space while trying to make
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
36 an undo-boundary. */
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
37 Lisp_Object pending_boundary;
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
38
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
39 /* Record an insertion that just happened or is about to happen,
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
40 for LENGTH characters at position BEG.
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
41 (It is possible to record an insertion before or after the fact
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
42 because we don't need to record the contents.) */
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
43
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
44 record_insert (beg, length)
12088
f0c9d02fb6e4 (record_insert): Change args to be ints, not Lisp_Objects.
Karl Heuer <kwzh@gnu.org>
parents: 10300
diff changeset
45 int beg, length;
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
46 {
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
47 Lisp_Object lbeg, lend;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
48
2194
886a69457557 (record_property_change, record_delete, record_insert):
Richard M. Stallman <rms@gnu.org>
parents: 1968
diff changeset
49 if (EQ (current_buffer->undo_list, Qt))
886a69457557 (record_property_change, record_delete, record_insert):
Richard M. Stallman <rms@gnu.org>
parents: 1968
diff changeset
50 return;
886a69457557 (record_property_change, record_delete, record_insert):
Richard M. Stallman <rms@gnu.org>
parents: 1968
diff changeset
51
6254
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
52 /* Allocate a cons cell to be the undo boundary after this command. */
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
53 if (NILP (pending_boundary))
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
54 pending_boundary = Fcons (Qnil, Qnil);
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
55
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
56 if (current_buffer != XBUFFER (last_undo_buffer))
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
57 Fundo_boundary ();
9281
05b2bd5d5559 (record_insert, record_delete, record_first_change, record_property_change):
Karl Heuer <kwzh@gnu.org>
parents: 9108
diff changeset
58 XSETBUFFER (last_undo_buffer, current_buffer);
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
59
10300
323ad02feb1e (Fprimitive_undo): Use base buffer's modtime field.
Richard M. Stallman <rms@gnu.org>
parents: 9322
diff changeset
60 if (MODIFF <= SAVE_MODIFF)
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
61 record_first_change ();
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
62
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
63 /* If this is following another insertion and consecutive with it
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
64 in the buffer, combine the two. */
9108
c0287cefc0f8 (record_insert, truncate_undo_list, Fprimitive_undo): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 7671
diff changeset
65 if (CONSP (current_buffer->undo_list))
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
66 {
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
67 Lisp_Object elt;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
68 elt = XCONS (current_buffer->undo_list)->car;
9108
c0287cefc0f8 (record_insert, truncate_undo_list, Fprimitive_undo): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 7671
diff changeset
69 if (CONSP (elt)
c0287cefc0f8 (record_insert, truncate_undo_list, Fprimitive_undo): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 7671
diff changeset
70 && INTEGERP (XCONS (elt)->car)
c0287cefc0f8 (record_insert, truncate_undo_list, Fprimitive_undo): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 7671
diff changeset
71 && INTEGERP (XCONS (elt)->cdr)
12088
f0c9d02fb6e4 (record_insert): Change args to be ints, not Lisp_Objects.
Karl Heuer <kwzh@gnu.org>
parents: 10300
diff changeset
72 && XINT (XCONS (elt)->cdr) == beg)
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
73 {
12088
f0c9d02fb6e4 (record_insert): Change args to be ints, not Lisp_Objects.
Karl Heuer <kwzh@gnu.org>
parents: 10300
diff changeset
74 XSETINT (XCONS (elt)->cdr, beg + length);
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
75 return;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
76 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
77 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
78
12088
f0c9d02fb6e4 (record_insert): Change args to be ints, not Lisp_Objects.
Karl Heuer <kwzh@gnu.org>
parents: 10300
diff changeset
79 XSETFASTINT (lbeg, beg);
f0c9d02fb6e4 (record_insert): Change args to be ints, not Lisp_Objects.
Karl Heuer <kwzh@gnu.org>
parents: 10300
diff changeset
80 XSETINT (lend, beg + length);
1524
91454bf15944 * undo.c (record_insert): Use accessors on BEG and LENGTH.
Jim Blandy <jimb@redhat.com>
parents: 1320
diff changeset
81 current_buffer->undo_list = Fcons (Fcons (lbeg, lend),
91454bf15944 * undo.c (record_insert): Use accessors on BEG and LENGTH.
Jim Blandy <jimb@redhat.com>
parents: 1320
diff changeset
82 current_buffer->undo_list);
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
83 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
84
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
85 /* Record that a deletion is about to take place,
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
86 for LENGTH characters at location BEG. */
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
87
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
88 record_delete (beg, length)
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
89 int beg, length;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
90 {
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
91 Lisp_Object lbeg, lend, sbeg;
7395
99e9c133a752 (record_delete): Record the old point value only right after a boundary.
Richard M. Stallman <rms@gnu.org>
parents: 7307
diff changeset
92 int at_boundary;
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
93
2194
886a69457557 (record_property_change, record_delete, record_insert):
Richard M. Stallman <rms@gnu.org>
parents: 1968
diff changeset
94 if (EQ (current_buffer->undo_list, Qt))
886a69457557 (record_property_change, record_delete, record_insert):
Richard M. Stallman <rms@gnu.org>
parents: 1968
diff changeset
95 return;
886a69457557 (record_property_change, record_delete, record_insert):
Richard M. Stallman <rms@gnu.org>
parents: 1968
diff changeset
96
6254
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
97 /* Allocate a cons cell to be the undo boundary after this command. */
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
98 if (NILP (pending_boundary))
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
99 pending_boundary = Fcons (Qnil, Qnil);
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
100
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
101 if (current_buffer != XBUFFER (last_undo_buffer))
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
102 Fundo_boundary ();
9281
05b2bd5d5559 (record_insert, record_delete, record_first_change, record_property_change):
Karl Heuer <kwzh@gnu.org>
parents: 9108
diff changeset
103 XSETBUFFER (last_undo_buffer, current_buffer);
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
104
7395
99e9c133a752 (record_delete): Record the old point value only right after a boundary.
Richard M. Stallman <rms@gnu.org>
parents: 7307
diff changeset
105 at_boundary = (CONSP (current_buffer->undo_list)
99e9c133a752 (record_delete): Record the old point value only right after a boundary.
Richard M. Stallman <rms@gnu.org>
parents: 7307
diff changeset
106 && NILP (XCONS (current_buffer->undo_list)->car));
99e9c133a752 (record_delete): Record the old point value only right after a boundary.
Richard M. Stallman <rms@gnu.org>
parents: 7307
diff changeset
107
10300
323ad02feb1e (Fprimitive_undo): Use base buffer's modtime field.
Richard M. Stallman <rms@gnu.org>
parents: 9322
diff changeset
108 if (MODIFF <= SAVE_MODIFF)
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
109 record_first_change ();
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
110
16039
855c8d8ba0f0 Change all references from point to PT.
Karl Heuer <kwzh@gnu.org>
parents: 14480
diff changeset
111 if (PT == beg + length)
9281
05b2bd5d5559 (record_insert, record_delete, record_first_change, record_property_change):
Karl Heuer <kwzh@gnu.org>
parents: 9108
diff changeset
112 XSETINT (sbeg, -beg);
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
113 else
9322
0dceca89f978 (record_delete, record_first_change): Don't use XFASTINT as an lvalue.
Karl Heuer <kwzh@gnu.org>
parents: 9281
diff changeset
114 XSETFASTINT (sbeg, beg);
0dceca89f978 (record_delete, record_first_change): Don't use XFASTINT as an lvalue.
Karl Heuer <kwzh@gnu.org>
parents: 9281
diff changeset
115 XSETFASTINT (lbeg, beg);
0dceca89f978 (record_delete, record_first_change): Don't use XFASTINT as an lvalue.
Karl Heuer <kwzh@gnu.org>
parents: 9281
diff changeset
116 XSETFASTINT (lend, beg + length);
1248
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
117
7395
99e9c133a752 (record_delete): Record the old point value only right after a boundary.
Richard M. Stallman <rms@gnu.org>
parents: 7307
diff changeset
118 /* If we are just after an undo boundary, and
99e9c133a752 (record_delete): Record the old point value only right after a boundary.
Richard M. Stallman <rms@gnu.org>
parents: 7307
diff changeset
119 point wasn't at start of deleted range, record where it was. */
99e9c133a752 (record_delete): Record the old point value only right after a boundary.
Richard M. Stallman <rms@gnu.org>
parents: 7307
diff changeset
120 if (at_boundary
99e9c133a752 (record_delete): Record the old point value only right after a boundary.
Richard M. Stallman <rms@gnu.org>
parents: 7307
diff changeset
121 && last_point_position != XFASTINT (sbeg)
99e9c133a752 (record_delete): Record the old point value only right after a boundary.
Richard M. Stallman <rms@gnu.org>
parents: 7307
diff changeset
122 && current_buffer == XBUFFER (last_point_position_buffer))
1248
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
123 current_buffer->undo_list
6180
d369907be635 (record_delete): Save last_point_position in the undo record, rather than the
Karl Heuer <kwzh@gnu.org>
parents: 5762
diff changeset
124 = Fcons (make_number (last_point_position), current_buffer->undo_list);
1248
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
125
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
126 current_buffer->undo_list
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
127 = Fcons (Fcons (Fbuffer_substring (lbeg, lend), sbeg),
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
128 current_buffer->undo_list);
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
129 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
130
14480
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
131 /* Record the fact that MARKER is about to be adjusted by ADJUSTMENT.
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
132 This is done only when a marker points within text being deleted,
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
133 because that's the only case where an automatic marker adjustment
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
134 won't be inverted automatically by undoing the buffer modification. */
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
135
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
136 record_marker_adjustment (marker, adjustment)
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
137 Lisp_Object marker;
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
138 int adjustment;
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
139 {
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
140 if (EQ (current_buffer->undo_list, Qt))
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
141 return;
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
142
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
143 /* Allocate a cons cell to be the undo boundary after this command. */
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
144 if (NILP (pending_boundary))
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
145 pending_boundary = Fcons (Qnil, Qnil);
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
146
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
147 if (current_buffer != XBUFFER (last_undo_buffer))
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
148 Fundo_boundary ();
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
149 XSETBUFFER (last_undo_buffer, current_buffer);
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
150
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
151 current_buffer->undo_list
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
152 = Fcons (Fcons (marker, make_number (adjustment)),
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
153 current_buffer->undo_list);
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
154 }
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
155
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
156 /* Record that a replacement is about to take place,
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
157 for LENGTH characters at location BEG.
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
158 The replacement does not change the number of characters. */
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
159
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
160 record_change (beg, length)
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
161 int beg, length;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
162 {
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
163 record_delete (beg, length);
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
164 record_insert (beg, length);
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
165 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
166
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
167 /* Record that an unmodified buffer is about to be changed.
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
168 Record the file modification date so that when undoing this entry
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
169 we can tell whether it is obsolete because the file was saved again. */
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
170
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
171 record_first_change ()
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
172 {
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
173 Lisp_Object high, low;
10300
323ad02feb1e (Fprimitive_undo): Use base buffer's modtime field.
Richard M. Stallman <rms@gnu.org>
parents: 9322
diff changeset
174 struct buffer *base_buffer = current_buffer;
5762
099857a46901 (record_first_change): Check for buffer-undo-list = t.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
175
099857a46901 (record_first_change): Check for buffer-undo-list = t.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
176 if (EQ (current_buffer->undo_list, Qt))
099857a46901 (record_first_change): Check for buffer-undo-list = t.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
177 return;
099857a46901 (record_first_change): Check for buffer-undo-list = t.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
178
099857a46901 (record_first_change): Check for buffer-undo-list = t.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
179 if (current_buffer != XBUFFER (last_undo_buffer))
099857a46901 (record_first_change): Check for buffer-undo-list = t.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
180 Fundo_boundary ();
9281
05b2bd5d5559 (record_insert, record_delete, record_first_change, record_property_change):
Karl Heuer <kwzh@gnu.org>
parents: 9108
diff changeset
181 XSETBUFFER (last_undo_buffer, current_buffer);
5762
099857a46901 (record_first_change): Check for buffer-undo-list = t.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
182
10300
323ad02feb1e (Fprimitive_undo): Use base buffer's modtime field.
Richard M. Stallman <rms@gnu.org>
parents: 9322
diff changeset
183 if (base_buffer->base_buffer)
323ad02feb1e (Fprimitive_undo): Use base buffer's modtime field.
Richard M. Stallman <rms@gnu.org>
parents: 9322
diff changeset
184 base_buffer = base_buffer->base_buffer;
323ad02feb1e (Fprimitive_undo): Use base buffer's modtime field.
Richard M. Stallman <rms@gnu.org>
parents: 9322
diff changeset
185
323ad02feb1e (Fprimitive_undo): Use base buffer's modtime field.
Richard M. Stallman <rms@gnu.org>
parents: 9322
diff changeset
186 XSETFASTINT (high, (base_buffer->modtime >> 16) & 0xffff);
323ad02feb1e (Fprimitive_undo): Use base buffer's modtime field.
Richard M. Stallman <rms@gnu.org>
parents: 9322
diff changeset
187 XSETFASTINT (low, base_buffer->modtime & 0xffff);
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
188 current_buffer->undo_list = Fcons (Fcons (Qt, Fcons (high, low)), current_buffer->undo_list);
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
189 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
190
1968
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
191 /* Record a change in property PROP (whose old value was VAL)
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
192 for LENGTH characters starting at position BEG in BUFFER. */
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
193
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
194 record_property_change (beg, length, prop, value, buffer)
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
195 int beg, length;
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
196 Lisp_Object prop, value, buffer;
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
197 {
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
198 Lisp_Object lbeg, lend, entry;
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
199 struct buffer *obuf = current_buffer;
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
200 int boundary = 0;
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
201
5762
099857a46901 (record_first_change): Check for buffer-undo-list = t.
Richard M. Stallman <rms@gnu.org>
parents: 4696
diff changeset
202 if (EQ (XBUFFER (buffer)->undo_list, Qt))
2194
886a69457557 (record_property_change, record_delete, record_insert):
Richard M. Stallman <rms@gnu.org>
parents: 1968
diff changeset
203 return;
886a69457557 (record_property_change, record_delete, record_insert):
Richard M. Stallman <rms@gnu.org>
parents: 1968
diff changeset
204
6254
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
205 /* Allocate a cons cell to be the undo boundary after this command. */
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
206 if (NILP (pending_boundary))
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
207 pending_boundary = Fcons (Qnil, Qnil);
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
208
1968
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
209 if (!EQ (buffer, last_undo_buffer))
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
210 boundary = 1;
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
211 last_undo_buffer = buffer;
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
212
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
213 /* Switch temporarily to the buffer that was changed. */
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
214 current_buffer = XBUFFER (buffer);
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
215
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
216 if (boundary)
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
217 Fundo_boundary ();
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
218
10300
323ad02feb1e (Fprimitive_undo): Use base buffer's modtime field.
Richard M. Stallman <rms@gnu.org>
parents: 9322
diff changeset
219 if (MODIFF <= SAVE_MODIFF)
1968
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
220 record_first_change ();
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
221
9281
05b2bd5d5559 (record_insert, record_delete, record_first_change, record_property_change):
Karl Heuer <kwzh@gnu.org>
parents: 9108
diff changeset
222 XSETINT (lbeg, beg);
05b2bd5d5559 (record_insert, record_delete, record_first_change, record_property_change):
Karl Heuer <kwzh@gnu.org>
parents: 9108
diff changeset
223 XSETINT (lend, beg + length);
1968
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
224 entry = Fcons (Qnil, Fcons (prop, Fcons (value, Fcons (lbeg, lend))));
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
225 current_buffer->undo_list = Fcons (entry, current_buffer->undo_list);
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
226
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
227 current_buffer = obuf;
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
228 }
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
229
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
230 DEFUN ("undo-boundary", Fundo_boundary, Sundo_boundary, 0, 0, 0,
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
231 "Mark a boundary between units of undo.\n\
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
232 An undo command will stop at this point,\n\
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
233 but another undo command will undo to the previous boundary.")
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
234 ()
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
235 {
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
236 Lisp_Object tem;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
237 if (EQ (current_buffer->undo_list, Qt))
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
238 return Qnil;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
239 tem = Fcar (current_buffer->undo_list);
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 241
diff changeset
240 if (!NILP (tem))
6254
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
241 {
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
242 /* One way or another, cons nil onto the front of the undo list. */
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
243 if (!NILP (pending_boundary))
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
244 {
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
245 /* If we have preallocated the cons cell to use here,
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
246 use that one. */
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
247 XCONS (pending_boundary)->cdr = current_buffer->undo_list;
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
248 current_buffer->undo_list = pending_boundary;
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
249 pending_boundary = Qnil;
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
250 }
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
251 else
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
252 current_buffer->undo_list = Fcons (Qnil, current_buffer->undo_list);
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
253 }
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
254 return Qnil;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
255 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
256
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
257 /* At garbage collection time, make an undo list shorter at the end,
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
258 returning the truncated list.
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
259 MINSIZE and MAXSIZE are the limits on size allowed, as described below.
761
4dffad9d353d entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 544
diff changeset
260 In practice, these are the values of undo-limit and
4dffad9d353d entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 544
diff changeset
261 undo-strong-limit. */
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
262
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
263 Lisp_Object
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
264 truncate_undo_list (list, minsize, maxsize)
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
265 Lisp_Object list;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
266 int minsize, maxsize;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
267 {
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
268 Lisp_Object prev, next, last_boundary;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
269 int size_so_far = 0;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
270
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
271 prev = Qnil;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
272 next = list;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
273 last_boundary = Qnil;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
274
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
275 /* Always preserve at least the most recent undo record.
241
f108a48f6e86 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 223
diff changeset
276 If the first element is an undo boundary, skip past it.
f108a48f6e86 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 223
diff changeset
277
f108a48f6e86 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 223
diff changeset
278 Skip, skip, skip the undo, skip, skip, skip the undo,
970
47f6041d85e6 Doc fix.
Jim Blandy <jimb@redhat.com>
parents: 761
diff changeset
279 Skip, skip, skip the undo, skip to the undo bound'ry.
47f6041d85e6 Doc fix.
Jim Blandy <jimb@redhat.com>
parents: 761
diff changeset
280 (Get it? "Skip to my Loo?") */
9108
c0287cefc0f8 (record_insert, truncate_undo_list, Fprimitive_undo): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 7671
diff changeset
281 if (CONSP (next) && NILP (XCONS (next)->car))
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
282 {
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
283 /* Add in the space occupied by this element and its chain link. */
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
284 size_so_far += sizeof (struct Lisp_Cons);
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
285
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
286 /* Advance to next element. */
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
287 prev = next;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
288 next = XCONS (next)->cdr;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
289 }
9108
c0287cefc0f8 (record_insert, truncate_undo_list, Fprimitive_undo): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 7671
diff changeset
290 while (CONSP (next) && ! NILP (XCONS (next)->car))
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
291 {
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
292 Lisp_Object elt;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
293 elt = XCONS (next)->car;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
294
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
295 /* Add in the space occupied by this element and its chain link. */
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
296 size_so_far += sizeof (struct Lisp_Cons);
9108
c0287cefc0f8 (record_insert, truncate_undo_list, Fprimitive_undo): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 7671
diff changeset
297 if (CONSP (elt))
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
298 {
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
299 size_so_far += sizeof (struct Lisp_Cons);
9108
c0287cefc0f8 (record_insert, truncate_undo_list, Fprimitive_undo): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 7671
diff changeset
300 if (STRINGP (XCONS (elt)->car))
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
301 size_so_far += (sizeof (struct Lisp_String) - 1
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
302 + XSTRING (XCONS (elt)->car)->size);
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
303 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
304
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
305 /* Advance to next element. */
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
306 prev = next;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
307 next = XCONS (next)->cdr;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
308 }
9108
c0287cefc0f8 (record_insert, truncate_undo_list, Fprimitive_undo): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 7671
diff changeset
309 if (CONSP (next))
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
310 last_boundary = prev;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
311
9108
c0287cefc0f8 (record_insert, truncate_undo_list, Fprimitive_undo): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 7671
diff changeset
312 while (CONSP (next))
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
313 {
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
314 Lisp_Object elt;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
315 elt = XCONS (next)->car;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
316
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
317 /* When we get to a boundary, decide whether to truncate
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
318 either before or after it. The lower threshold, MINSIZE,
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
319 tells us to truncate after it. If its size pushes past
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
320 the higher threshold MAXSIZE as well, we truncate before it. */
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 241
diff changeset
321 if (NILP (elt))
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
322 {
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
323 if (size_so_far > maxsize)
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
324 break;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
325 last_boundary = prev;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
326 if (size_so_far > minsize)
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
327 break;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
328 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
329
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
330 /* Add in the space occupied by this element and its chain link. */
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
331 size_so_far += sizeof (struct Lisp_Cons);
9108
c0287cefc0f8 (record_insert, truncate_undo_list, Fprimitive_undo): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 7671
diff changeset
332 if (CONSP (elt))
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
333 {
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
334 size_so_far += sizeof (struct Lisp_Cons);
9108
c0287cefc0f8 (record_insert, truncate_undo_list, Fprimitive_undo): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 7671
diff changeset
335 if (STRINGP (XCONS (elt)->car))
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
336 size_so_far += (sizeof (struct Lisp_String) - 1
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
337 + XSTRING (XCONS (elt)->car)->size);
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
338 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
339
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
340 /* Advance to next element. */
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
341 prev = next;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
342 next = XCONS (next)->cdr;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
343 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
344
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
345 /* If we scanned the whole list, it is short enough; don't change it. */
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 241
diff changeset
346 if (NILP (next))
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
347 return list;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
348
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
349 /* Truncate at the boundary where we decided to truncate. */
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 241
diff changeset
350 if (!NILP (last_boundary))
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
351 {
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
352 XCONS (last_boundary)->cdr = Qnil;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
353 return list;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
354 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
355 else
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
356 return Qnil;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
357 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
358
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
359 DEFUN ("primitive-undo", Fprimitive_undo, Sprimitive_undo, 2, 2, 0,
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
360 "Undo N records from the front of the list LIST.\n\
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
361 Return what remains of the list.")
3719
695181e4bc20 (Fprimitive_undo): Rename arg to N to avoid conflict.
Richard M. Stallman <rms@gnu.org>
parents: 3696
diff changeset
362 (n, list)
695181e4bc20 (Fprimitive_undo): Rename arg to N to avoid conflict.
Richard M. Stallman <rms@gnu.org>
parents: 3696
diff changeset
363 Lisp_Object n, list;
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
364 {
7671
31d444fcae24 (Fprimitive_undo): GCPRO next and list.
Karl Heuer <kwzh@gnu.org>
parents: 7395
diff changeset
365 struct gcpro gcpro1, gcpro2;
31d444fcae24 (Fprimitive_undo): GCPRO next and list.
Karl Heuer <kwzh@gnu.org>
parents: 7395
diff changeset
366 Lisp_Object next;
3696
aa9310f06c0f (syms_of_undo): Set up Qinhibit_read_only.
Richard M. Stallman <rms@gnu.org>
parents: 3687
diff changeset
367 int count = specpdl_ptr - specpdl;
7671
31d444fcae24 (Fprimitive_undo): GCPRO next and list.
Karl Heuer <kwzh@gnu.org>
parents: 7395
diff changeset
368 register int arg;
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
369 #if 0 /* This is a good feature, but would make undo-start
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
370 unable to do what is expected. */
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
371 Lisp_Object tem;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
372
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
373 /* If the head of the list is a boundary, it is the boundary
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
374 preceding this command. Get rid of it and don't count it. */
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
375 tem = Fcar (list);
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 241
diff changeset
376 if (NILP (tem))
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
377 list = Fcdr (list);
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
378 #endif
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
379
7671
31d444fcae24 (Fprimitive_undo): GCPRO next and list.
Karl Heuer <kwzh@gnu.org>
parents: 7395
diff changeset
380 CHECK_NUMBER (n, 0);
31d444fcae24 (Fprimitive_undo): GCPRO next and list.
Karl Heuer <kwzh@gnu.org>
parents: 7395
diff changeset
381 arg = XINT (n);
31d444fcae24 (Fprimitive_undo): GCPRO next and list.
Karl Heuer <kwzh@gnu.org>
parents: 7395
diff changeset
382 next = Qnil;
31d444fcae24 (Fprimitive_undo): GCPRO next and list.
Karl Heuer <kwzh@gnu.org>
parents: 7395
diff changeset
383 GCPRO2 (next, list);
31d444fcae24 (Fprimitive_undo): GCPRO next and list.
Karl Heuer <kwzh@gnu.org>
parents: 7395
diff changeset
384
3696
aa9310f06c0f (syms_of_undo): Set up Qinhibit_read_only.
Richard M. Stallman <rms@gnu.org>
parents: 3687
diff changeset
385 /* Don't let read-only properties interfere with undo. */
aa9310f06c0f (syms_of_undo): Set up Qinhibit_read_only.
Richard M. Stallman <rms@gnu.org>
parents: 3687
diff changeset
386 if (NILP (current_buffer->read_only))
aa9310f06c0f (syms_of_undo): Set up Qinhibit_read_only.
Richard M. Stallman <rms@gnu.org>
parents: 3687
diff changeset
387 specbind (Qinhibit_read_only, Qt);
aa9310f06c0f (syms_of_undo): Set up Qinhibit_read_only.
Richard M. Stallman <rms@gnu.org>
parents: 3687
diff changeset
388
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
389 while (arg > 0)
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
390 {
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
391 while (1)
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
392 {
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
393 next = Fcar (list);
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
394 list = Fcdr (list);
1248
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
395 /* Exit inner loop at undo boundary. */
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 241
diff changeset
396 if (NILP (next))
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
397 break;
1248
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
398 /* Handle an integer by setting point to that value. */
9108
c0287cefc0f8 (record_insert, truncate_undo_list, Fprimitive_undo): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 7671
diff changeset
399 if (INTEGERP (next))
1248
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
400 SET_PT (clip_to_bounds (BEGV, XINT (next), ZV));
9108
c0287cefc0f8 (record_insert, truncate_undo_list, Fprimitive_undo): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 7671
diff changeset
401 else if (CONSP (next))
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
402 {
1248
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
403 Lisp_Object car, cdr;
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
404
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
405 car = Fcar (next);
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
406 cdr = Fcdr (next);
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
407 if (EQ (car, Qt))
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
408 {
1248
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
409 /* Element (t high . low) records previous modtime. */
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
410 Lisp_Object high, low;
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
411 int mod_time;
10300
323ad02feb1e (Fprimitive_undo): Use base buffer's modtime field.
Richard M. Stallman <rms@gnu.org>
parents: 9322
diff changeset
412 struct buffer *base_buffer = current_buffer;
1248
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
413
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
414 high = Fcar (cdr);
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
415 low = Fcdr (cdr);
3687
54381151027d (record_delete): Always use XFASTINT on sbeg.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
416 mod_time = (XFASTINT (high) << 16) + XFASTINT (low);
10300
323ad02feb1e (Fprimitive_undo): Use base buffer's modtime field.
Richard M. Stallman <rms@gnu.org>
parents: 9322
diff changeset
417
323ad02feb1e (Fprimitive_undo): Use base buffer's modtime field.
Richard M. Stallman <rms@gnu.org>
parents: 9322
diff changeset
418 if (current_buffer->base_buffer)
323ad02feb1e (Fprimitive_undo): Use base buffer's modtime field.
Richard M. Stallman <rms@gnu.org>
parents: 9322
diff changeset
419 base_buffer = current_buffer->base_buffer;
323ad02feb1e (Fprimitive_undo): Use base buffer's modtime field.
Richard M. Stallman <rms@gnu.org>
parents: 9322
diff changeset
420
1248
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
421 /* If this records an obsolete save
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
422 (not matching the actual disk file)
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
423 then don't mark unmodified. */
10300
323ad02feb1e (Fprimitive_undo): Use base buffer's modtime field.
Richard M. Stallman <rms@gnu.org>
parents: 9322
diff changeset
424 if (mod_time != base_buffer->modtime)
12649
43434a01d442 (Fprimitive_undo): Don't end inner loop
Richard M. Stallman <rms@gnu.org>
parents: 12088
diff changeset
425 continue;
1598
3e9dadf2d13c * undo.c (Fprimitive_undo): Remove whitespace in front of #ifdef
Jim Blandy <jimb@redhat.com>
parents: 1524
diff changeset
426 #ifdef CLASH_DETECTION
1248
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
427 Funlock_buffer ();
1598
3e9dadf2d13c * undo.c (Fprimitive_undo): Remove whitespace in front of #ifdef
Jim Blandy <jimb@redhat.com>
parents: 1524
diff changeset
428 #endif /* CLASH_DETECTION */
1248
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
429 Fset_buffer_modified_p (Qnil);
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
430 }
3687
54381151027d (record_delete): Always use XFASTINT on sbeg.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
431 #ifdef USE_TEXT_PROPERTIES
54381151027d (record_delete): Always use XFASTINT on sbeg.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
432 else if (EQ (car, Qnil))
1968
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
433 {
3687
54381151027d (record_delete): Always use XFASTINT on sbeg.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
434 /* Element (nil prop val beg . end) is property change. */
1968
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
435 Lisp_Object beg, end, prop, val;
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
436
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
437 prop = Fcar (cdr);
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
438 cdr = Fcdr (cdr);
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
439 val = Fcar (cdr);
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
440 cdr = Fcdr (cdr);
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
441 beg = Fcar (cdr);
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
442 end = Fcdr (cdr);
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
443
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
444 Fput_text_property (beg, end, prop, val, Qnil);
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
445 }
3687
54381151027d (record_delete): Always use XFASTINT on sbeg.
Richard M. Stallman <rms@gnu.org>
parents: 2961
diff changeset
446 #endif /* USE_TEXT_PROPERTIES */
9108
c0287cefc0f8 (record_insert, truncate_undo_list, Fprimitive_undo): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 7671
diff changeset
447 else if (INTEGERP (car) && INTEGERP (cdr))
1248
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
448 {
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
449 /* Element (BEG . END) means range was inserted. */
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
450 Lisp_Object end;
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
451
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
452 if (XINT (car) < BEGV
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
453 || XINT (cdr) > ZV)
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
454 error ("Changes to be undone are outside visible portion of buffer");
1320
c45c4e0cae7d (Fprimitive_undo): When undoing an insert, move point and then delete.
Richard M. Stallman <rms@gnu.org>
parents: 1248
diff changeset
455 /* Set point first thing, so that undoing this undo
c45c4e0cae7d (Fprimitive_undo): When undoing an insert, move point and then delete.
Richard M. Stallman <rms@gnu.org>
parents: 1248
diff changeset
456 does not send point back to where it is now. */
c45c4e0cae7d (Fprimitive_undo): When undoing an insert, move point and then delete.
Richard M. Stallman <rms@gnu.org>
parents: 1248
diff changeset
457 Fgoto_char (car);
1248
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
458 Fdelete_region (car, cdr);
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
459 }
9108
c0287cefc0f8 (record_insert, truncate_undo_list, Fprimitive_undo): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents: 7671
diff changeset
460 else if (STRINGP (car) && INTEGERP (cdr))
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
461 {
1248
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
462 /* Element (STRING . POS) means STRING was deleted. */
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
463 Lisp_Object membuf;
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
464 int pos = XINT (cdr);
544
054dfe2f6327 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
465
1248
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
466 membuf = car;
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
467 if (pos < 0)
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
468 {
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
469 if (-pos < BEGV || -pos > ZV)
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
470 error ("Changes to be undone are outside visible portion of buffer");
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
471 SET_PT (-pos);
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
472 Finsert (1, &membuf);
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
473 }
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
474 else
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
475 {
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
476 if (pos < BEGV || pos > ZV)
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
477 error ("Changes to be undone are outside visible portion of buffer");
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
478 SET_PT (pos);
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
479
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
480 /* Insert before markers so that if the mark is
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
481 currently on the boundary of this deletion, it
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
482 ends up on the other side of the now-undeleted
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
483 text from point. Since undo doesn't even keep
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
484 track of the mark, this isn't really necessary,
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
485 but it may lead to better behavior in certain
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
486 situations. */
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
487 Finsert_before_markers (1, &membuf);
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
488 SET_PT (pos);
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
489 }
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
490 }
14480
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
491 else if (MARKERP (car) && INTEGERP (cdr))
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
492 {
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
493 /* (MARKER . INTEGER) means a marker MARKER
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
494 was adjusted by INTEGER. */
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
495 if (XMARKER (car)->buffer)
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
496 Fset_marker (car,
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
497 make_number (marker_position (car) - XINT (cdr)),
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
498 Fmarker_buffer (car));
50954bb380b6 (record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14186
diff changeset
499 }
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
500 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
501 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
502 arg--;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
503 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
504
7671
31d444fcae24 (Fprimitive_undo): GCPRO next and list.
Karl Heuer <kwzh@gnu.org>
parents: 7395
diff changeset
505 UNGCPRO;
3696
aa9310f06c0f (syms_of_undo): Set up Qinhibit_read_only.
Richard M. Stallman <rms@gnu.org>
parents: 3687
diff changeset
506 return unbind_to (count, list);
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
507 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
508
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
509 syms_of_undo ()
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
510 {
3696
aa9310f06c0f (syms_of_undo): Set up Qinhibit_read_only.
Richard M. Stallman <rms@gnu.org>
parents: 3687
diff changeset
511 Qinhibit_read_only = intern ("inhibit-read-only");
aa9310f06c0f (syms_of_undo): Set up Qinhibit_read_only.
Richard M. Stallman <rms@gnu.org>
parents: 3687
diff changeset
512 staticpro (&Qinhibit_read_only);
aa9310f06c0f (syms_of_undo): Set up Qinhibit_read_only.
Richard M. Stallman <rms@gnu.org>
parents: 3687
diff changeset
513
6254
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
514 pending_boundary = Qnil;
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
515 staticpro (&pending_boundary);
a147d798ed0d (syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents: 6180
diff changeset
516
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
517 defsubr (&Sprimitive_undo);
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
518 defsubr (&Sundo_boundary);
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
519 }