annotate src/undo.c @ 2499:da67547eda51

* configure.in: When checking for X windows, search for an X11 subdirectory of ${x_includes}. * configure.in: Check for gettimeofday function, for getdate.y. Change `configure' to a mixture of custom code and autoconf stuff. autoconf can't derive all the information we need, but we'd really like to be able to take advantage of some of its tests, and its file-editing facilities. * configure.in: Renamed from configure. Quote the sections of shell script we want copied literally to the configure script. (compile): Initialize this to make the autoconf macros' code happy. Use AC_PROG_CC, AC_CONST, and AC_RETSIGTYPE instead of writing out code to do their jobs. Use autoconf to produce Makefile and src/config.h. Remove the Makefile-style comment that autoconf places at the top of src/config.h. (config_h_opts): Removed - no longer necessary. * Makefile.in (configname): Renamed to configuration. (CONFIG_CFLAGS): Renamed to DEFS. (CC, DEFS, C_SWITCH_SYSTEM, version, configuration): Adjusted to get values via autoload @cookies@. (libsrc_libs): Get this from autoconf. We used to do nothing about this. (${SUBDIR}): Pass DEFS to submakes instead of CONFIG_CFLAGS.
author Jim Blandy <jimb@redhat.com>
date Sat, 10 Apr 1993 06:02:36 +0000
parents 886a69457557
children e94a593c3952
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.
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2 Copyright (C) 1990 Free Software Foundation, Inc.
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
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6 GNU Emacs is distributed in the hope that it will be useful,
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
7 but WITHOUT ANY WARRANTY. No author or distributor
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
8 accepts responsibility to anyone for the consequences of using it
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
9 or for whether it serves any particular purpose or works at all,
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
10 unless he says so in writing. Refer to the GNU Emacs General Public
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
11 License for full details.
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
12
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
13 Everyone is granted permission to copy, modify and redistribute
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
14 GNU Emacs, but only under the conditions described in the
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
15 GNU Emacs General Public License. A copy of this license is
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
16 supposed to have been given to you along with GNU Emacs so you
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
17 can know your rights and responsibilities. It should be in a
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
18 file named COPYING. Among other things, the copyright notice
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
19 and this notice must be preserved on all copies. */
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
20
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
21
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
22 #include "config.h"
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"
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
25
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
26 /* Last buffer for which undo information was recorded. */
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
27 Lisp_Object last_undo_buffer;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
28
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
29 /* Record an insertion that just happened or is about to happen,
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
30 for LENGTH characters at position BEG.
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
31 (It is possible to record an insertion before or after the fact
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
32 because we don't need to record the contents.) */
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
33
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
34 record_insert (beg, length)
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
35 Lisp_Object beg, length;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
36 {
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
37 Lisp_Object lbeg, lend;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
38
2194
886a69457557 (record_property_change, record_delete, record_insert):
Richard M. Stallman <rms@gnu.org>
parents: 1968
diff changeset
39 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
40 return;
886a69457557 (record_property_change, record_delete, record_insert):
Richard M. Stallman <rms@gnu.org>
parents: 1968
diff changeset
41
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
42 if (current_buffer != XBUFFER (last_undo_buffer))
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
43 Fundo_boundary ();
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
44 XSET (last_undo_buffer, Lisp_Buffer, current_buffer);
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
45
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
46 if (MODIFF <= current_buffer->save_modified)
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
47 record_first_change ();
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
48
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
49 /* If this is following another insertion and consecutive with it
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
50 in the buffer, combine the two. */
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
51 if (XTYPE (current_buffer->undo_list) == Lisp_Cons)
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
52 {
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
53 Lisp_Object elt;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
54 elt = XCONS (current_buffer->undo_list)->car;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
55 if (XTYPE (elt) == Lisp_Cons
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
56 && XTYPE (XCONS (elt)->car) == Lisp_Int
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
57 && XTYPE (XCONS (elt)->cdr) == Lisp_Int
1524
91454bf15944 * undo.c (record_insert): Use accessors on BEG and LENGTH.
Jim Blandy <jimb@redhat.com>
parents: 1320
diff changeset
58 && XINT (XCONS (elt)->cdr) == XINT (beg))
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
59 {
1524
91454bf15944 * undo.c (record_insert): Use accessors on BEG and LENGTH.
Jim Blandy <jimb@redhat.com>
parents: 1320
diff changeset
60 XSETINT (XCONS (elt)->cdr, XINT (beg) + XINT (length));
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
61 return;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
62 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
63 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
64
1524
91454bf15944 * undo.c (record_insert): Use accessors on BEG and LENGTH.
Jim Blandy <jimb@redhat.com>
parents: 1320
diff changeset
65 lbeg = beg;
91454bf15944 * undo.c (record_insert): Use accessors on BEG and LENGTH.
Jim Blandy <jimb@redhat.com>
parents: 1320
diff changeset
66 XSET (lend, Lisp_Int, XINT (beg) + XINT (length));
91454bf15944 * undo.c (record_insert): Use accessors on BEG and LENGTH.
Jim Blandy <jimb@redhat.com>
parents: 1320
diff changeset
67 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
68 current_buffer->undo_list);
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
69 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
70
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
71 /* Record that a deletion is about to take place,
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
72 for LENGTH characters at location BEG. */
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
73
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
74 record_delete (beg, length)
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
75 int beg, length;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
76 {
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
77 Lisp_Object lbeg, lend, sbeg;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
78
2194
886a69457557 (record_property_change, record_delete, record_insert):
Richard M. Stallman <rms@gnu.org>
parents: 1968
diff changeset
79 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
80 return;
886a69457557 (record_property_change, record_delete, record_insert):
Richard M. Stallman <rms@gnu.org>
parents: 1968
diff changeset
81
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
82 if (current_buffer != XBUFFER (last_undo_buffer))
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
83 Fundo_boundary ();
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
84 XSET (last_undo_buffer, Lisp_Buffer, current_buffer);
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
85
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
86 if (MODIFF <= current_buffer->save_modified)
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
87 record_first_change ();
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
88
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
89 if (point == beg + length)
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
90 XSET (sbeg, Lisp_Int, -beg);
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
91 else
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
92 XFASTINT (sbeg) = beg;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
93 XFASTINT (lbeg) = beg;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
94 XFASTINT (lend) = beg + length;
1248
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
95
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
96 /* If point isn't at start of deleted range, record where it is. */
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
97 if (PT != sbeg)
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
98 current_buffer->undo_list
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
99 = Fcons (make_number (PT), current_buffer->undo_list);
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
100
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
101 current_buffer->undo_list
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
102 = Fcons (Fcons (Fbuffer_substring (lbeg, lend), sbeg),
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
103 current_buffer->undo_list);
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
104 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
105
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
106 /* Record that a replacement is about to take place,
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
107 for LENGTH characters at location BEG.
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
108 The replacement does not change the number of characters. */
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
109
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
110 record_change (beg, length)
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
111 int beg, length;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
112 {
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
113 record_delete (beg, length);
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
114 record_insert (beg, length);
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
115 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
116
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
117 /* Record that an unmodified buffer is about to be changed.
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
118 Record the file modification date so that when undoing this entry
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
119 we can tell whether it is obsolete because the file was saved again. */
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
120
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
121 record_first_change ()
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
122 {
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
123 Lisp_Object high, low;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
124 XFASTINT (high) = (current_buffer->modtime >> 16) & 0xffff;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
125 XFASTINT (low) = current_buffer->modtime & 0xffff;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
126 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
127 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
128
1968
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
129 /* 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
130 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
131
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
132 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
133 int beg, length;
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
134 Lisp_Object prop, value, buffer;
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
135 {
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
136 Lisp_Object lbeg, lend, entry;
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
137 struct buffer *obuf = current_buffer;
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
138 int boundary = 0;
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
139
2194
886a69457557 (record_property_change, record_delete, record_insert):
Richard M. Stallman <rms@gnu.org>
parents: 1968
diff changeset
140 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
141 return;
886a69457557 (record_property_change, record_delete, record_insert):
Richard M. Stallman <rms@gnu.org>
parents: 1968
diff changeset
142
1968
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
143 if (!EQ (buffer, last_undo_buffer))
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
144 boundary = 1;
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
145 last_undo_buffer = buffer;
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
146
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
147 /* 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
148 current_buffer = XBUFFER (buffer);
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
149
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
150 if (boundary)
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
151 Fundo_boundary ();
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
152
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
153 if (MODIFF <= current_buffer->save_modified)
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
154 record_first_change ();
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
155
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
156 XSET (lbeg, Lisp_Int, beg);
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
157 XSET (lend, Lisp_Int, beg + length);
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
158 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
159 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
160
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
161 current_buffer = obuf;
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
162 }
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
163
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
164 DEFUN ("undo-boundary", Fundo_boundary, Sundo_boundary, 0, 0, 0,
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
165 "Mark a boundary between units of undo.\n\
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
166 An undo command will stop at this point,\n\
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
167 but another undo command will undo to the previous boundary.")
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
168 ()
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
169 {
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
170 Lisp_Object tem;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
171 if (EQ (current_buffer->undo_list, Qt))
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
172 return Qnil;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
173 tem = Fcar (current_buffer->undo_list);
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 241
diff changeset
174 if (!NILP (tem))
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
175 current_buffer->undo_list = Fcons (Qnil, current_buffer->undo_list);
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
176 return Qnil;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
177 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
178
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
179 /* At garbage collection time, make an undo list shorter at the end,
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
180 returning the truncated list.
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
181 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
182 In practice, these are the values of undo-limit and
4dffad9d353d entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 544
diff changeset
183 undo-strong-limit. */
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
184
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
185 Lisp_Object
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
186 truncate_undo_list (list, minsize, maxsize)
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
187 Lisp_Object list;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
188 int minsize, maxsize;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
189 {
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
190 Lisp_Object prev, next, last_boundary;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
191 int size_so_far = 0;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
192
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
193 prev = Qnil;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
194 next = list;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
195 last_boundary = Qnil;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
196
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
197 /* Always preserve at least the most recent undo record.
241
f108a48f6e86 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 223
diff changeset
198 If the first element is an undo boundary, skip past it.
f108a48f6e86 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 223
diff changeset
199
f108a48f6e86 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 223
diff changeset
200 Skip, skip, skip the undo, skip, skip, skip the undo,
970
47f6041d85e6 Doc fix.
Jim Blandy <jimb@redhat.com>
parents: 761
diff changeset
201 Skip, skip, skip the undo, skip to the undo bound'ry.
47f6041d85e6 Doc fix.
Jim Blandy <jimb@redhat.com>
parents: 761
diff changeset
202 (Get it? "Skip to my Loo?") */
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
203 if (XTYPE (next) == Lisp_Cons
1524
91454bf15944 * undo.c (record_insert): Use accessors on BEG and LENGTH.
Jim Blandy <jimb@redhat.com>
parents: 1320
diff changeset
204 && NILP (XCONS (next)->car))
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
205 {
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
206 /* Add in the space occupied by this element and its chain link. */
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
207 size_so_far += sizeof (struct Lisp_Cons);
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
208
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
209 /* Advance to next element. */
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
210 prev = next;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
211 next = XCONS (next)->cdr;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
212 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
213 while (XTYPE (next) == Lisp_Cons
1524
91454bf15944 * undo.c (record_insert): Use accessors on BEG and LENGTH.
Jim Blandy <jimb@redhat.com>
parents: 1320
diff changeset
214 && ! NILP (XCONS (next)->car))
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
215 {
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
216 Lisp_Object elt;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
217 elt = XCONS (next)->car;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
218
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
219 /* Add in the space occupied by this element and its chain link. */
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
220 size_so_far += sizeof (struct Lisp_Cons);
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
221 if (XTYPE (elt) == Lisp_Cons)
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
222 {
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
223 size_so_far += sizeof (struct Lisp_Cons);
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
224 if (XTYPE (XCONS (elt)->car) == Lisp_String)
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
225 size_so_far += (sizeof (struct Lisp_String) - 1
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
226 + XSTRING (XCONS (elt)->car)->size);
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
227 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
228
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
229 /* Advance to next element. */
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
230 prev = next;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
231 next = XCONS (next)->cdr;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
232 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
233 if (XTYPE (next) == Lisp_Cons)
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
234 last_boundary = prev;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
235
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
236 while (XTYPE (next) == Lisp_Cons)
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
237 {
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
238 Lisp_Object elt;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
239 elt = XCONS (next)->car;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
240
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
241 /* When we get to a boundary, decide whether to truncate
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
242 either before or after it. The lower threshold, MINSIZE,
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
243 tells us to truncate after it. If its size pushes past
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
244 the higher threshold MAXSIZE as well, we truncate before it. */
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 241
diff changeset
245 if (NILP (elt))
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
246 {
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
247 if (size_so_far > maxsize)
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
248 break;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
249 last_boundary = prev;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
250 if (size_so_far > minsize)
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
251 break;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
252 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
253
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
254 /* Add in the space occupied by this element and its chain link. */
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
255 size_so_far += sizeof (struct Lisp_Cons);
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
256 if (XTYPE (elt) == Lisp_Cons)
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
257 {
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
258 size_so_far += sizeof (struct Lisp_Cons);
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
259 if (XTYPE (XCONS (elt)->car) == Lisp_String)
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
260 size_so_far += (sizeof (struct Lisp_String) - 1
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
261 + XSTRING (XCONS (elt)->car)->size);
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
262 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
263
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
264 /* Advance to next element. */
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
265 prev = next;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
266 next = XCONS (next)->cdr;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
267 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
268
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
269 /* 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
270 if (NILP (next))
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
271 return list;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
272
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
273 /* Truncate at the boundary where we decided to truncate. */
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 241
diff changeset
274 if (!NILP (last_boundary))
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
275 {
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
276 XCONS (last_boundary)->cdr = Qnil;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
277 return list;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
278 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
279 else
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
280 return Qnil;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
281 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
282
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
283 DEFUN ("primitive-undo", Fprimitive_undo, Sprimitive_undo, 2, 2, 0,
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
284 "Undo N records from the front of the list LIST.\n\
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
285 Return what remains of the list.")
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
286 (count, list)
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
287 Lisp_Object count, list;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
288 {
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
289 register int arg = XINT (count);
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
290 #if 0 /* This is a good feature, but would make undo-start
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
291 unable to do what is expected. */
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
292 Lisp_Object tem;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
293
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
294 /* If the head of the list is a boundary, it is the boundary
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
295 preceding this command. Get rid of it and don't count it. */
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
296 tem = Fcar (list);
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 241
diff changeset
297 if (NILP (tem))
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
298 list = Fcdr (list);
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
299 #endif
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
300
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
301 while (arg > 0)
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
302 {
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
303 while (1)
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
304 {
1248
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
305 Lisp_Object next;
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
306 next = Fcar (list);
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
307 list = Fcdr (list);
1248
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
308 /* Exit inner loop at undo boundary. */
485
8c615e453683 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 241
diff changeset
309 if (NILP (next))
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
310 break;
1248
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
311 /* Handle an integer by setting point to that value. */
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
312 if (XTYPE (next) == Lisp_Int)
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
313 SET_PT (clip_to_bounds (BEGV, XINT (next), ZV));
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
314 else if (XTYPE (next) == Lisp_Cons)
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
315 {
1248
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
316 Lisp_Object car, cdr;
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
317
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
318 car = Fcar (next);
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
319 cdr = Fcdr (next);
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
320 if (EQ (car, Qt))
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
321 {
1248
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
322 /* 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
323 Lisp_Object high, low;
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
324 int mod_time;
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
325
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
326 high = Fcar (cdr);
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
327 low = Fcdr (cdr);
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
328 mod_time = (high << 16) + low;
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
329 /* If this records an obsolete save
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
330 (not matching the actual disk file)
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
331 then don't mark unmodified. */
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
332 if (mod_time != current_buffer->modtime)
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
333 break;
1598
3e9dadf2d13c * undo.c (Fprimitive_undo): Remove whitespace in front of #ifdef
Jim Blandy <jimb@redhat.com>
parents: 1524
diff changeset
334 #ifdef CLASH_DETECTION
1248
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
335 Funlock_buffer ();
1598
3e9dadf2d13c * undo.c (Fprimitive_undo): Remove whitespace in front of #ifdef
Jim Blandy <jimb@redhat.com>
parents: 1524
diff changeset
336 #endif /* CLASH_DETECTION */
1248
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
337 Fset_buffer_modified_p (Qnil);
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
338 }
1968
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
339 if (EQ (car, Qnil))
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
340 {
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
341 /* Element (t prop val beg . end) records property change. */
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
342 Lisp_Object beg, end, prop, val;
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
343
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
344 prop = Fcar (cdr);
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
345 cdr = Fcdr (cdr);
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
346 val = Fcar (cdr);
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
347 cdr = Fcdr (cdr);
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
348 beg = Fcar (cdr);
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
349 end = Fcdr (cdr);
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
350
de0a0ed7318e (record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents: 1598
diff changeset
351 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
352 }
1248
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
353 else if (XTYPE (car) == Lisp_Int && XTYPE (cdr) == Lisp_Int)
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
354 {
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
355 /* 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
356 Lisp_Object end;
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
357
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
358 if (XINT (car) < BEGV
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
359 || XINT (cdr) > ZV)
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
360 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
361 /* 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
362 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
363 Fgoto_char (car);
1248
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
364 Fdelete_region (car, cdr);
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
365 }
1248
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
366 else if (XTYPE (car) == Lisp_String && XTYPE (cdr) == Lisp_Int)
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
367 {
1248
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
368 /* 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
369 Lisp_Object membuf;
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
370 int pos = XINT (cdr);
544
054dfe2f6327 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 485
diff changeset
371
1248
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
372 membuf = car;
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
373 if (pos < 0)
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
374 {
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
375 if (-pos < BEGV || -pos > ZV)
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
376 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
377 SET_PT (-pos);
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
378 Finsert (1, &membuf);
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
379 }
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
380 else
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
381 {
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
382 if (pos < BEGV || pos > ZV)
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
383 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
384 SET_PT (pos);
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
385
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
386 /* 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
387 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
388 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
389 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
390 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
391 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
392 situations. */
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
393 Finsert_before_markers (1, &membuf);
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
394 SET_PT (pos);
68c77558d34b (record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents: 970
diff changeset
395 }
223
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
396 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
397 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
398 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
399 arg--;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
400 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
401
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
402 return list;
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
403 }
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
404
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
405 syms_of_undo ()
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
406 {
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
407 defsubr (&Sprimitive_undo);
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
408 defsubr (&Sundo_boundary);
dbc50aaa4f08 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
409 }