Mercurial > emacs
annotate src/undo.c @ 66571:beb6b92a94f6
(mh-compose-space-does-completion-flag, mh-signature-separator-flag)
(mh-interpret-number-as-range-flag, mh-adaptive-cmd-note-flag): Use
"Non-nil means" instead of "On means" to remain checkdoc clean and
consistent with Emacs. I raised this issue with the Emacs developers
and Stallman agrees that "On means" should be allowed in custom
docstrings but that this change requires thought and should wait until
after the Emacs 22 release.
author | Bill Wohler <wohler@newt.com> |
---|---|
date | Mon, 31 Oct 2005 01:37:30 +0000 |
parents | a0d1312ede66 |
children | 7a9d49053af3 2d92f5c9d6ae |
rev | line source |
---|---|
223 | 1 /* undo handling for GNU Emacs. |
64770
a0d1312ede66
Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
64084
diff
changeset
|
2 Copyright (C) 1990, 1993, 1994, 2000, 2002, 2003, 2004, |
a0d1312ede66
Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
64084
diff
changeset
|
3 2005 Free Software Foundation, Inc. |
223 | 4 |
5 This file is part of GNU Emacs. | |
6 | |
14186
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
12649
diff
changeset
|
7 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
|
8 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
|
9 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
|
10 any later version. |
223 | 11 |
14186
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
12649
diff
changeset
|
12 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
|
13 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
|
14 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
|
15 GNU General Public License for more details. |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
12649
diff
changeset
|
16 |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
12649
diff
changeset
|
17 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
|
18 along with GNU Emacs; see the file COPYING. If not, write to |
64084 | 19 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
20 Boston, MA 02110-1301, USA. */ | |
223 | 21 |
22 | |
4696
1fc792473491
Include <config.h> instead of "config.h".
Roland McGrath <roland@gnu.org>
parents:
3719
diff
changeset
|
23 #include <config.h> |
223 | 24 #include "lisp.h" |
25 #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
|
26 #include "commands.h" |
223 | 27 |
59048
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
28 /* Limits controlling how much undo information to keep. */ |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
29 |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
30 EMACS_INT undo_limit; |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
31 EMACS_INT undo_strong_limit; |
59069
27371673eba8
(Vundo_outer_limit): Replaces undo_outer_limit. Uses changed.
Richard M. Stallman <rms@gnu.org>
parents:
59048
diff
changeset
|
32 |
27371673eba8
(Vundo_outer_limit): Replaces undo_outer_limit. Uses changed.
Richard M. Stallman <rms@gnu.org>
parents:
59048
diff
changeset
|
33 Lisp_Object Vundo_outer_limit; |
59048
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
34 |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
35 /* Function to call when undo_outer_limit is exceeded. */ |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
36 |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
37 Lisp_Object Vundo_outer_limit_function; |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
38 |
223 | 39 /* Last buffer for which undo information was recorded. */ |
40 Lisp_Object last_undo_buffer; | |
41 | |
3696
aa9310f06c0f
(syms_of_undo): Set up Qinhibit_read_only.
Richard M. Stallman <rms@gnu.org>
parents:
3687
diff
changeset
|
42 Lisp_Object Qinhibit_read_only; |
aa9310f06c0f
(syms_of_undo): Set up Qinhibit_read_only.
Richard M. Stallman <rms@gnu.org>
parents:
3687
diff
changeset
|
43 |
59832 | 44 /* Marker for function call undo list elements. */ |
45 | |
46 Lisp_Object Qapply; | |
47 | |
6254
a147d798ed0d
(syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents:
6180
diff
changeset
|
48 /* 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
|
49 it also allocates the undo-boundary object |
a147d798ed0d
(syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents:
6180
diff
changeset
|
50 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
|
51 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
|
52 an undo-boundary. */ |
a147d798ed0d
(syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents:
6180
diff
changeset
|
53 Lisp_Object pending_boundary; |
a147d798ed0d
(syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents:
6180
diff
changeset
|
54 |
44391
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
55 /* Record point as it was at beginning of this command (if necessary) |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
56 And prepare the undo info for recording a change. |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
57 PT is the position of point that will naturally occur as a result of the |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
58 undo record that will be added just after this command terminates. */ |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
59 |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
60 static void |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
61 record_point (pt) |
48326 | 62 int pt; |
44391
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
63 { |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
64 int at_boundary; |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
65 |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
66 /* Allocate a cons cell to be the undo boundary after this command. */ |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
67 if (NILP (pending_boundary)) |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
68 pending_boundary = Fcons (Qnil, Qnil); |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
69 |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
70 if (!BUFFERP (last_undo_buffer) |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
71 || current_buffer != XBUFFER (last_undo_buffer)) |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
72 Fundo_boundary (); |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
73 XSETBUFFER (last_undo_buffer, current_buffer); |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
74 |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
75 if (CONSP (current_buffer->undo_list)) |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
76 { |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
77 /* Set AT_BOUNDARY to 1 only when we have nothing other than |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
78 marker adjustment before undo boundary. */ |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
79 |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
80 Lisp_Object tail = current_buffer->undo_list, elt; |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
81 |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
82 while (1) |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
83 { |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
84 if (NILP (tail)) |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
85 elt = Qnil; |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
86 else |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
87 elt = XCAR (tail); |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
88 if (NILP (elt) || ! (CONSP (elt) && MARKERP (XCAR (elt)))) |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
89 break; |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
90 tail = XCDR (tail); |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
91 } |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
92 at_boundary = NILP (elt); |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
93 } |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
94 else |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
95 at_boundary = 1; |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
96 |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
97 if (MODIFF <= SAVE_MODIFF) |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
98 record_first_change (); |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
99 |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
48326
diff
changeset
|
100 /* If we are just after an undo boundary, and |
44391
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
101 point wasn't at start of deleted range, record where it was. */ |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
102 if (at_boundary |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
103 && last_point_position != pt |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
104 /* If we're called from batch mode, this could be nil. */ |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
105 && BUFFERP (last_point_position_buffer) |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
106 && current_buffer == XBUFFER (last_point_position_buffer)) |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
107 current_buffer->undo_list |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
108 = Fcons (make_number (last_point_position), current_buffer->undo_list); |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
109 } |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
110 |
223 | 111 /* Record an insertion that just happened or is about to happen, |
112 for LENGTH characters at position BEG. | |
113 (It is possible to record an insertion before or after the fact | |
114 because we don't need to record the contents.) */ | |
115 | |
20372
259194f66d40
(record_change, record_first_change,
Kenichi Handa <handa@m17n.org>
parents:
17447
diff
changeset
|
116 void |
223 | 117 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
|
118 int beg, length; |
223 | 119 { |
120 Lisp_Object lbeg, lend; | |
121 | |
2194
886a69457557
(record_property_change, record_delete, record_insert):
Richard M. Stallman <rms@gnu.org>
parents:
1968
diff
changeset
|
122 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
|
123 return; |
886a69457557
(record_property_change, record_delete, record_insert):
Richard M. Stallman <rms@gnu.org>
parents:
1968
diff
changeset
|
124 |
44391
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
125 record_point (beg); |
223 | 126 |
127 /* If this is following another insertion and consecutive with it | |
128 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
|
129 if (CONSP (current_buffer->undo_list)) |
223 | 130 { |
131 Lisp_Object elt; | |
25663
a5eaace0fa01
Use XCAR and XCDR instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
21514
diff
changeset
|
132 elt = XCAR (current_buffer->undo_list); |
9108
c0287cefc0f8
(record_insert, truncate_undo_list, Fprimitive_undo): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
7671
diff
changeset
|
133 if (CONSP (elt) |
25663
a5eaace0fa01
Use XCAR and XCDR instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
21514
diff
changeset
|
134 && INTEGERP (XCAR (elt)) |
a5eaace0fa01
Use XCAR and XCDR instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
21514
diff
changeset
|
135 && INTEGERP (XCDR (elt)) |
a5eaace0fa01
Use XCAR and XCDR instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
21514
diff
changeset
|
136 && XINT (XCDR (elt)) == beg) |
223 | 137 { |
39973
579177964efa
Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents:
39798
diff
changeset
|
138 XSETCDR (elt, make_number (beg + length)); |
223 | 139 return; |
140 } | |
141 } | |
142 | |
12088
f0c9d02fb6e4
(record_insert): Change args to be ints, not Lisp_Objects.
Karl Heuer <kwzh@gnu.org>
parents:
10300
diff
changeset
|
143 XSETFASTINT (lbeg, beg); |
f0c9d02fb6e4
(record_insert): Change args to be ints, not Lisp_Objects.
Karl Heuer <kwzh@gnu.org>
parents:
10300
diff
changeset
|
144 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
|
145 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
|
146 current_buffer->undo_list); |
223 | 147 } |
148 | |
149 /* Record that a deletion is about to take place, | |
21237
c5a8ee5b9b39
(record_delete): Replace LENGTH arg with STRING.
Richard M. Stallman <rms@gnu.org>
parents:
20373
diff
changeset
|
150 of the characters in STRING, at location BEG. */ |
223 | 151 |
20373
b6c215dec8c8
(record_delete, record_marker_adjustment): Declare them as void.
Kenichi Handa <handa@m17n.org>
parents:
20372
diff
changeset
|
152 void |
21237
c5a8ee5b9b39
(record_delete): Replace LENGTH arg with STRING.
Richard M. Stallman <rms@gnu.org>
parents:
20373
diff
changeset
|
153 record_delete (beg, string) |
c5a8ee5b9b39
(record_delete): Replace LENGTH arg with STRING.
Richard M. Stallman <rms@gnu.org>
parents:
20373
diff
changeset
|
154 int beg; |
c5a8ee5b9b39
(record_delete): Replace LENGTH arg with STRING.
Richard M. Stallman <rms@gnu.org>
parents:
20373
diff
changeset
|
155 Lisp_Object string; |
223 | 156 { |
21237
c5a8ee5b9b39
(record_delete): Replace LENGTH arg with STRING.
Richard M. Stallman <rms@gnu.org>
parents:
20373
diff
changeset
|
157 Lisp_Object sbeg; |
223 | 158 |
2194
886a69457557
(record_property_change, record_delete, record_insert):
Richard M. Stallman <rms@gnu.org>
parents:
1968
diff
changeset
|
159 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
|
160 return; |
886a69457557
(record_property_change, record_delete, record_insert):
Richard M. Stallman <rms@gnu.org>
parents:
1968
diff
changeset
|
161 |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46285
diff
changeset
|
162 if (PT == beg + SCHARS (string)) |
21272
b1bc69132f55
(record_delete): Record last_point_position when there's
Kenichi Handa <handa@m17n.org>
parents:
21237
diff
changeset
|
163 { |
44391
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
164 XSETINT (sbeg, -beg); |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
165 record_point (PT); |
21272
b1bc69132f55
(record_delete): Record last_point_position when there's
Kenichi Handa <handa@m17n.org>
parents:
21237
diff
changeset
|
166 } |
b1bc69132f55
(record_delete): Record last_point_position when there's
Kenichi Handa <handa@m17n.org>
parents:
21237
diff
changeset
|
167 else |
44391
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
168 { |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
169 XSETFASTINT (sbeg, beg); |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
170 record_point (beg); |
0abb30765386
(record_point): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
40656
diff
changeset
|
171 } |
1248
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
172 |
223 | 173 current_buffer->undo_list |
21237
c5a8ee5b9b39
(record_delete): Replace LENGTH arg with STRING.
Richard M. Stallman <rms@gnu.org>
parents:
20373
diff
changeset
|
174 = Fcons (Fcons (string, sbeg), current_buffer->undo_list); |
223 | 175 } |
176 | |
14480
50954bb380b6
(record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
177 /* 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
|
178 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
|
179 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
|
180 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
|
181 |
20373
b6c215dec8c8
(record_delete, record_marker_adjustment): Declare them as void.
Kenichi Handa <handa@m17n.org>
parents:
20372
diff
changeset
|
182 void |
14480
50954bb380b6
(record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
183 record_marker_adjustment (marker, adjustment) |
50954bb380b6
(record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
184 Lisp_Object marker; |
50954bb380b6
(record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
185 int adjustment; |
50954bb380b6
(record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
186 { |
50954bb380b6
(record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
187 if (EQ (current_buffer->undo_list, Qt)) |
50954bb380b6
(record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
188 return; |
50954bb380b6
(record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
189 |
50954bb380b6
(record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
190 /* 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
|
191 if (NILP (pending_boundary)) |
50954bb380b6
(record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
192 pending_boundary = Fcons (Qnil, Qnil); |
50954bb380b6
(record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
193 |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
48326
diff
changeset
|
194 if (!BUFFERP (last_undo_buffer) |
30961
78ce106d272e
(record_first_change, record_marker_adjustment): Don'use
Gerd Moellmann <gerd@gnu.org>
parents:
30682
diff
changeset
|
195 || current_buffer != XBUFFER (last_undo_buffer)) |
14480
50954bb380b6
(record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
196 Fundo_boundary (); |
50954bb380b6
(record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
197 XSETBUFFER (last_undo_buffer, current_buffer); |
50954bb380b6
(record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
198 |
50954bb380b6
(record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
199 current_buffer->undo_list |
50954bb380b6
(record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
200 = Fcons (Fcons (marker, make_number (adjustment)), |
50954bb380b6
(record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
201 current_buffer->undo_list); |
50954bb380b6
(record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
202 } |
50954bb380b6
(record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
203 |
223 | 204 /* Record that a replacement is about to take place, |
205 for LENGTH characters at location BEG. | |
21237
c5a8ee5b9b39
(record_delete): Replace LENGTH arg with STRING.
Richard M. Stallman <rms@gnu.org>
parents:
20373
diff
changeset
|
206 The replacement must not change the number of characters. */ |
223 | 207 |
20373
b6c215dec8c8
(record_delete, record_marker_adjustment): Declare them as void.
Kenichi Handa <handa@m17n.org>
parents:
20372
diff
changeset
|
208 void |
223 | 209 record_change (beg, length) |
210 int beg, length; | |
211 { | |
21237
c5a8ee5b9b39
(record_delete): Replace LENGTH arg with STRING.
Richard M. Stallman <rms@gnu.org>
parents:
20373
diff
changeset
|
212 record_delete (beg, make_buffer_string (beg, beg + length, 1)); |
223 | 213 record_insert (beg, length); |
214 } | |
215 | |
216 /* Record that an unmodified buffer is about to be changed. | |
217 Record the file modification date so that when undoing this entry | |
218 we can tell whether it is obsolete because the file was saved again. */ | |
219 | |
20372
259194f66d40
(record_change, record_first_change,
Kenichi Handa <handa@m17n.org>
parents:
17447
diff
changeset
|
220 void |
223 | 221 record_first_change () |
222 { | |
223 Lisp_Object high, low; | |
10300
323ad02feb1e
(Fprimitive_undo): Use base buffer's modtime field.
Richard M. Stallman <rms@gnu.org>
parents:
9322
diff
changeset
|
224 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
|
225 |
099857a46901
(record_first_change): Check for buffer-undo-list = t.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
226 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
|
227 return; |
099857a46901
(record_first_change): Check for buffer-undo-list = t.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
228 |
30961
78ce106d272e
(record_first_change, record_marker_adjustment): Don'use
Gerd Moellmann <gerd@gnu.org>
parents:
30682
diff
changeset
|
229 if (!BUFFERP (last_undo_buffer) |
78ce106d272e
(record_first_change, record_marker_adjustment): Don'use
Gerd Moellmann <gerd@gnu.org>
parents:
30682
diff
changeset
|
230 || current_buffer != XBUFFER (last_undo_buffer)) |
5762
099857a46901
(record_first_change): Check for buffer-undo-list = t.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
231 Fundo_boundary (); |
9281
05b2bd5d5559
(record_insert, record_delete, record_first_change, record_property_change):
Karl Heuer <kwzh@gnu.org>
parents:
9108
diff
changeset
|
232 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
|
233 |
10300
323ad02feb1e
(Fprimitive_undo): Use base buffer's modtime field.
Richard M. Stallman <rms@gnu.org>
parents:
9322
diff
changeset
|
234 if (base_buffer->base_buffer) |
323ad02feb1e
(Fprimitive_undo): Use base buffer's modtime field.
Richard M. Stallman <rms@gnu.org>
parents:
9322
diff
changeset
|
235 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
|
236 |
323ad02feb1e
(Fprimitive_undo): Use base buffer's modtime field.
Richard M. Stallman <rms@gnu.org>
parents:
9322
diff
changeset
|
237 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
|
238 XSETFASTINT (low, base_buffer->modtime & 0xffff); |
223 | 239 current_buffer->undo_list = Fcons (Fcons (Qt, Fcons (high, low)), current_buffer->undo_list); |
240 } | |
241 | |
1968
de0a0ed7318e
(record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
1598
diff
changeset
|
242 /* 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
|
243 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
|
244 |
20372
259194f66d40
(record_change, record_first_change,
Kenichi Handa <handa@m17n.org>
parents:
17447
diff
changeset
|
245 void |
1968
de0a0ed7318e
(record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
1598
diff
changeset
|
246 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
|
247 int beg, length; |
de0a0ed7318e
(record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
1598
diff
changeset
|
248 Lisp_Object prop, value, buffer; |
de0a0ed7318e
(record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
1598
diff
changeset
|
249 { |
de0a0ed7318e
(record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
1598
diff
changeset
|
250 Lisp_Object lbeg, lend, entry; |
de0a0ed7318e
(record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
1598
diff
changeset
|
251 struct buffer *obuf = current_buffer; |
de0a0ed7318e
(record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
1598
diff
changeset
|
252 int boundary = 0; |
de0a0ed7318e
(record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
1598
diff
changeset
|
253 |
5762
099857a46901
(record_first_change): Check for buffer-undo-list = t.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
254 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
|
255 return; |
886a69457557
(record_property_change, record_delete, record_insert):
Richard M. Stallman <rms@gnu.org>
parents:
1968
diff
changeset
|
256 |
6254
a147d798ed0d
(syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents:
6180
diff
changeset
|
257 /* 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
|
258 if (NILP (pending_boundary)) |
a147d798ed0d
(syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents:
6180
diff
changeset
|
259 pending_boundary = Fcons (Qnil, Qnil); |
a147d798ed0d
(syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents:
6180
diff
changeset
|
260 |
1968
de0a0ed7318e
(record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
1598
diff
changeset
|
261 if (!EQ (buffer, last_undo_buffer)) |
de0a0ed7318e
(record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
1598
diff
changeset
|
262 boundary = 1; |
de0a0ed7318e
(record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
1598
diff
changeset
|
263 last_undo_buffer = buffer; |
de0a0ed7318e
(record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
1598
diff
changeset
|
264 |
de0a0ed7318e
(record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
1598
diff
changeset
|
265 /* 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
|
266 current_buffer = XBUFFER (buffer); |
de0a0ed7318e
(record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
1598
diff
changeset
|
267 |
de0a0ed7318e
(record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
1598
diff
changeset
|
268 if (boundary) |
de0a0ed7318e
(record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
1598
diff
changeset
|
269 Fundo_boundary (); |
de0a0ed7318e
(record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
1598
diff
changeset
|
270 |
10300
323ad02feb1e
(Fprimitive_undo): Use base buffer's modtime field.
Richard M. Stallman <rms@gnu.org>
parents:
9322
diff
changeset
|
271 if (MODIFF <= SAVE_MODIFF) |
1968
de0a0ed7318e
(record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
1598
diff
changeset
|
272 record_first_change (); |
de0a0ed7318e
(record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
1598
diff
changeset
|
273 |
9281
05b2bd5d5559
(record_insert, record_delete, record_first_change, record_property_change):
Karl Heuer <kwzh@gnu.org>
parents:
9108
diff
changeset
|
274 XSETINT (lbeg, beg); |
05b2bd5d5559
(record_insert, record_delete, record_first_change, record_property_change):
Karl Heuer <kwzh@gnu.org>
parents:
9108
diff
changeset
|
275 XSETINT (lend, beg + length); |
1968
de0a0ed7318e
(record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
1598
diff
changeset
|
276 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
|
277 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
|
278 |
de0a0ed7318e
(record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
1598
diff
changeset
|
279 current_buffer = obuf; |
de0a0ed7318e
(record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
1598
diff
changeset
|
280 } |
de0a0ed7318e
(record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
1598
diff
changeset
|
281 |
223 | 282 DEFUN ("undo-boundary", Fundo_boundary, Sundo_boundary, 0, 0, 0, |
40123
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
283 doc: /* Mark a boundary between units of undo. |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
284 An undo command will stop at this point, |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
285 but another undo command will undo to the previous boundary. */) |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
286 () |
223 | 287 { |
288 Lisp_Object tem; | |
289 if (EQ (current_buffer->undo_list, Qt)) | |
290 return Qnil; | |
291 tem = Fcar (current_buffer->undo_list); | |
485 | 292 if (!NILP (tem)) |
6254
a147d798ed0d
(syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents:
6180
diff
changeset
|
293 { |
a147d798ed0d
(syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents:
6180
diff
changeset
|
294 /* 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
|
295 if (!NILP (pending_boundary)) |
a147d798ed0d
(syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents:
6180
diff
changeset
|
296 { |
a147d798ed0d
(syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents:
6180
diff
changeset
|
297 /* 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
|
298 use that one. */ |
39973
579177964efa
Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents:
39798
diff
changeset
|
299 XSETCDR (pending_boundary, current_buffer->undo_list); |
6254
a147d798ed0d
(syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents:
6180
diff
changeset
|
300 current_buffer->undo_list = pending_boundary; |
a147d798ed0d
(syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents:
6180
diff
changeset
|
301 pending_boundary = Qnil; |
a147d798ed0d
(syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents:
6180
diff
changeset
|
302 } |
a147d798ed0d
(syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents:
6180
diff
changeset
|
303 else |
a147d798ed0d
(syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents:
6180
diff
changeset
|
304 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
|
305 } |
223 | 306 return Qnil; |
307 } | |
308 | |
309 /* At garbage collection time, make an undo list shorter at the end, | |
59048
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
310 returning the truncated list. How this is done depends on the |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
311 variables undo-limit, undo-strong-limit and undo-outer-limit. |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
312 In some cases this works by calling undo-outer-limit-function. */ |
223 | 313 |
59048
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
314 void |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
315 truncate_undo_list (b) |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
316 struct buffer *b; |
223 | 317 { |
59048
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
318 Lisp_Object list; |
223 | 319 Lisp_Object prev, next, last_boundary; |
320 int size_so_far = 0; | |
321 | |
59048
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
322 /* Make sure that calling undo-outer-limit-function |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
323 won't cause another GC. */ |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
324 int count = inhibit_garbage_collection (); |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
325 |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
326 /* Make the buffer current to get its local values of variables such |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
327 as undo_limit. Also so that Vundo_outer_limit_function can |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
328 tell which buffer to operate on. */ |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
329 record_unwind_protect (set_buffer_if_live, Fcurrent_buffer ()); |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
330 set_buffer_internal (b); |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
331 |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
332 list = b->undo_list; |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
333 |
223 | 334 prev = Qnil; |
335 next = list; | |
336 last_boundary = Qnil; | |
337 | |
59048
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
338 /* If the first element is an undo boundary, skip past it. */ |
25663
a5eaace0fa01
Use XCAR and XCDR instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
21514
diff
changeset
|
339 if (CONSP (next) && NILP (XCAR (next))) |
223 | 340 { |
341 /* Add in the space occupied by this element and its chain link. */ | |
342 size_so_far += sizeof (struct Lisp_Cons); | |
343 | |
344 /* Advance to next element. */ | |
345 prev = next; | |
25663
a5eaace0fa01
Use XCAR and XCDR instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
21514
diff
changeset
|
346 next = XCDR (next); |
223 | 347 } |
55839
9e7829a684df
(truncate_undo_list): New arg LIMITSIZE.
Richard M. Stallman <rms@gnu.org>
parents:
52401
diff
changeset
|
348 |
59048
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
349 /* Always preserve at least the most recent undo record |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
350 unless it is really horribly big. |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
351 |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
352 Skip, skip, skip the undo, skip, skip, skip the undo, |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
353 Skip, skip, skip the undo, skip to the undo bound'ry. */ |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
354 |
25663
a5eaace0fa01
Use XCAR and XCDR instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
21514
diff
changeset
|
355 while (CONSP (next) && ! NILP (XCAR (next))) |
223 | 356 { |
357 Lisp_Object elt; | |
25663
a5eaace0fa01
Use XCAR and XCDR instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
21514
diff
changeset
|
358 elt = XCAR (next); |
223 | 359 |
360 /* Add in the space occupied by this element and its chain link. */ | |
361 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
|
362 if (CONSP (elt)) |
223 | 363 { |
364 size_so_far += sizeof (struct Lisp_Cons); | |
25663
a5eaace0fa01
Use XCAR and XCDR instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
21514
diff
changeset
|
365 if (STRINGP (XCAR (elt))) |
223 | 366 size_so_far += (sizeof (struct Lisp_String) - 1 |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46285
diff
changeset
|
367 + SCHARS (XCAR (elt))); |
223 | 368 } |
369 | |
370 /* Advance to next element. */ | |
371 prev = next; | |
25663
a5eaace0fa01
Use XCAR and XCDR instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
21514
diff
changeset
|
372 next = XCDR (next); |
223 | 373 } |
55839
9e7829a684df
(truncate_undo_list): New arg LIMITSIZE.
Richard M. Stallman <rms@gnu.org>
parents:
52401
diff
changeset
|
374 |
59048
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
375 /* If by the first boundary we have already passed undo_outer_limit, |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
376 we're heading for memory full, so offer to clear out the list. */ |
59069
27371673eba8
(Vundo_outer_limit): Replaces undo_outer_limit. Uses changed.
Richard M. Stallman <rms@gnu.org>
parents:
59048
diff
changeset
|
377 if (INTEGERP (Vundo_outer_limit) |
27371673eba8
(Vundo_outer_limit): Replaces undo_outer_limit. Uses changed.
Richard M. Stallman <rms@gnu.org>
parents:
59048
diff
changeset
|
378 && size_so_far > XINT (Vundo_outer_limit) |
59048
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
379 && !NILP (Vundo_outer_limit_function)) |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
380 { |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
381 Lisp_Object temp = last_undo_buffer; |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
382 |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
383 /* Normally the function this calls is undo-outer-limit-truncate. */ |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
384 if (! NILP (call1 (Vundo_outer_limit_function, |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
385 make_number (size_so_far)))) |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
386 { |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
387 /* The function is responsible for making |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
388 any desired changes in buffer-undo-list. */ |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
389 unbind_to (count, Qnil); |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
390 return; |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
391 } |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
392 /* That function probably used the minibuffer, and if so, that |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
393 changed last_undo_buffer. Change it back so that we don't |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
394 force next change to make an undo boundary here. */ |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
395 last_undo_buffer = temp; |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
396 } |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
397 |
9108
c0287cefc0f8
(record_insert, truncate_undo_list, Fprimitive_undo): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
7671
diff
changeset
|
398 if (CONSP (next)) |
223 | 399 last_boundary = prev; |
400 | |
59048
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
401 /* Keep additional undo data, if it fits in the limits. */ |
9108
c0287cefc0f8
(record_insert, truncate_undo_list, Fprimitive_undo): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
7671
diff
changeset
|
402 while (CONSP (next)) |
223 | 403 { |
404 Lisp_Object elt; | |
25663
a5eaace0fa01
Use XCAR and XCDR instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
21514
diff
changeset
|
405 elt = XCAR (next); |
223 | 406 |
407 /* When we get to a boundary, decide whether to truncate | |
59048
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
408 either before or after it. The lower threshold, undo_limit, |
223 | 409 tells us to truncate after it. If its size pushes past |
59048
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
410 the higher threshold undo_strong_limit, we truncate before it. */ |
485 | 411 if (NILP (elt)) |
223 | 412 { |
59048
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
413 if (size_so_far > undo_strong_limit) |
223 | 414 break; |
415 last_boundary = prev; | |
59048
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
416 if (size_so_far > undo_limit) |
223 | 417 break; |
418 } | |
419 | |
420 /* Add in the space occupied by this element and its chain link. */ | |
421 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
|
422 if (CONSP (elt)) |
223 | 423 { |
424 size_so_far += sizeof (struct Lisp_Cons); | |
25663
a5eaace0fa01
Use XCAR and XCDR instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
21514
diff
changeset
|
425 if (STRINGP (XCAR (elt))) |
223 | 426 size_so_far += (sizeof (struct Lisp_String) - 1 |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46285
diff
changeset
|
427 + SCHARS (XCAR (elt))); |
223 | 428 } |
429 | |
430 /* Advance to next element. */ | |
431 prev = next; | |
25663
a5eaace0fa01
Use XCAR and XCDR instead of explicit member access.
Ken Raeburn <raeburn@raeburn.org>
parents:
21514
diff
changeset
|
432 next = XCDR (next); |
223 | 433 } |
434 | |
435 /* If we scanned the whole list, it is short enough; don't change it. */ | |
485 | 436 if (NILP (next)) |
59048
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
437 ; |
223 | 438 /* Truncate at the boundary where we decided to truncate. */ |
59048
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
439 else if (!NILP (last_boundary)) |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
440 XSETCDR (last_boundary, Qnil); |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
441 /* There's nothing we decided to keep, so clear it out. */ |
223 | 442 else |
59048
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
443 b->undo_list = Qnil; |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
444 |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
445 unbind_to (count, Qnil); |
223 | 446 } |
447 | |
448 DEFUN ("primitive-undo", Fprimitive_undo, Sprimitive_undo, 2, 2, 0, | |
40123
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
449 doc: /* Undo N records from the front of the list LIST. |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
450 Return what remains of the list. */) |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
451 (n, list) |
3719
695181e4bc20
(Fprimitive_undo): Rename arg to N to avoid conflict.
Richard M. Stallman <rms@gnu.org>
parents:
3696
diff
changeset
|
452 Lisp_Object n, list; |
223 | 453 { |
7671
31d444fcae24
(Fprimitive_undo): GCPRO next and list.
Karl Heuer <kwzh@gnu.org>
parents:
7395
diff
changeset
|
454 struct gcpro gcpro1, gcpro2; |
31d444fcae24
(Fprimitive_undo): GCPRO next and list.
Karl Heuer <kwzh@gnu.org>
parents:
7395
diff
changeset
|
455 Lisp_Object next; |
46285
3f111801efb4
Rename BINDING_STACK_SIZE to SPECPDL_INDEX.
Juanma Barranquero <lekktu@gmail.com>
parents:
44391
diff
changeset
|
456 int count = SPECPDL_INDEX (); |
7671
31d444fcae24
(Fprimitive_undo): GCPRO next and list.
Karl Heuer <kwzh@gnu.org>
parents:
7395
diff
changeset
|
457 register int arg; |
59970
cf4b913c7074
(Fprimitive_undo): Record max one dummmy apply element.
Kim F. Storm <storm@cua.dk>
parents:
59864
diff
changeset
|
458 Lisp_Object oldlist; |
cf4b913c7074
(Fprimitive_undo): Record max one dummmy apply element.
Kim F. Storm <storm@cua.dk>
parents:
59864
diff
changeset
|
459 int did_apply = 0; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
48326
diff
changeset
|
460 |
223 | 461 #if 0 /* This is a good feature, but would make undo-start |
462 unable to do what is expected. */ | |
463 Lisp_Object tem; | |
464 | |
465 /* If the head of the list is a boundary, it is the boundary | |
466 preceding this command. Get rid of it and don't count it. */ | |
467 tem = Fcar (list); | |
485 | 468 if (NILP (tem)) |
223 | 469 list = Fcdr (list); |
470 #endif | |
471 | |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40123
diff
changeset
|
472 CHECK_NUMBER (n); |
7671
31d444fcae24
(Fprimitive_undo): GCPRO next and list.
Karl Heuer <kwzh@gnu.org>
parents:
7395
diff
changeset
|
473 arg = XINT (n); |
31d444fcae24
(Fprimitive_undo): GCPRO next and list.
Karl Heuer <kwzh@gnu.org>
parents:
7395
diff
changeset
|
474 next = Qnil; |
31d444fcae24
(Fprimitive_undo): GCPRO next and list.
Karl Heuer <kwzh@gnu.org>
parents:
7395
diff
changeset
|
475 GCPRO2 (next, list); |
59970
cf4b913c7074
(Fprimitive_undo): Record max one dummmy apply element.
Kim F. Storm <storm@cua.dk>
parents:
59864
diff
changeset
|
476 /* I don't think we need to gcpro oldlist, as we use it only |
cf4b913c7074
(Fprimitive_undo): Record max one dummmy apply element.
Kim F. Storm <storm@cua.dk>
parents:
59864
diff
changeset
|
477 to check for EQ. ++kfs */ |
7671
31d444fcae24
(Fprimitive_undo): GCPRO next and list.
Karl Heuer <kwzh@gnu.org>
parents:
7395
diff
changeset
|
478 |
37527
d585b711c8d2
(Fprimitive_undo): In a writable buffer, enable undoing
Gerd Moellmann <gerd@gnu.org>
parents:
34965
diff
changeset
|
479 /* In a writable buffer, enable undoing read-only text that is so |
d585b711c8d2
(Fprimitive_undo): In a writable buffer, enable undoing
Gerd Moellmann <gerd@gnu.org>
parents:
34965
diff
changeset
|
480 because of text properties. */ |
d585b711c8d2
(Fprimitive_undo): In a writable buffer, enable undoing
Gerd Moellmann <gerd@gnu.org>
parents:
34965
diff
changeset
|
481 if (NILP (current_buffer->read_only)) |
3696
aa9310f06c0f
(syms_of_undo): Set up Qinhibit_read_only.
Richard M. Stallman <rms@gnu.org>
parents:
3687
diff
changeset
|
482 specbind (Qinhibit_read_only, Qt); |
aa9310f06c0f
(syms_of_undo): Set up Qinhibit_read_only.
Richard M. Stallman <rms@gnu.org>
parents:
3687
diff
changeset
|
483 |
34794
12ca043196d7
(Fprimitive_undo): Bind `inhibit-point-motion-hooks' to t.
Gerd Moellmann <gerd@gnu.org>
parents:
34169
diff
changeset
|
484 /* Don't let `intangible' properties interfere with undo. */ |
12ca043196d7
(Fprimitive_undo): Bind `inhibit-point-motion-hooks' to t.
Gerd Moellmann <gerd@gnu.org>
parents:
34169
diff
changeset
|
485 specbind (Qinhibit_point_motion_hooks, Qt); |
12ca043196d7
(Fprimitive_undo): Bind `inhibit-point-motion-hooks' to t.
Gerd Moellmann <gerd@gnu.org>
parents:
34169
diff
changeset
|
486 |
59970
cf4b913c7074
(Fprimitive_undo): Record max one dummmy apply element.
Kim F. Storm <storm@cua.dk>
parents:
59864
diff
changeset
|
487 oldlist = current_buffer->undo_list; |
cf4b913c7074
(Fprimitive_undo): Record max one dummmy apply element.
Kim F. Storm <storm@cua.dk>
parents:
59864
diff
changeset
|
488 |
223 | 489 while (arg > 0) |
490 { | |
39798
d54a90934144
(Fprimitive_undo): Use XCAR/XCDR.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
37527
diff
changeset
|
491 while (CONSP (list)) |
223 | 492 { |
39798
d54a90934144
(Fprimitive_undo): Use XCAR/XCDR.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
37527
diff
changeset
|
493 next = XCAR (list); |
d54a90934144
(Fprimitive_undo): Use XCAR/XCDR.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
37527
diff
changeset
|
494 list = XCDR (list); |
1248
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
495 /* Exit inner loop at undo boundary. */ |
485 | 496 if (NILP (next)) |
223 | 497 break; |
1248
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
498 /* 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
|
499 if (INTEGERP (next)) |
1248
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
500 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
|
501 else if (CONSP (next)) |
223 | 502 { |
1248
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
503 Lisp_Object car, cdr; |
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
504 |
39798
d54a90934144
(Fprimitive_undo): Use XCAR/XCDR.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
37527
diff
changeset
|
505 car = XCAR (next); |
d54a90934144
(Fprimitive_undo): Use XCAR/XCDR.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
37527
diff
changeset
|
506 cdr = XCDR (next); |
1248
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
507 if (EQ (car, Qt)) |
223 | 508 { |
1248
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
509 /* 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
|
510 Lisp_Object high, low; |
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
511 int mod_time; |
10300
323ad02feb1e
(Fprimitive_undo): Use base buffer's modtime field.
Richard M. Stallman <rms@gnu.org>
parents:
9322
diff
changeset
|
512 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
|
513 |
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
514 high = Fcar (cdr); |
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
515 low = Fcdr (cdr); |
3687
54381151027d
(record_delete): Always use XFASTINT on sbeg.
Richard M. Stallman <rms@gnu.org>
parents:
2961
diff
changeset
|
516 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
|
517 |
323ad02feb1e
(Fprimitive_undo): Use base buffer's modtime field.
Richard M. Stallman <rms@gnu.org>
parents:
9322
diff
changeset
|
518 if (current_buffer->base_buffer) |
323ad02feb1e
(Fprimitive_undo): Use base buffer's modtime field.
Richard M. Stallman <rms@gnu.org>
parents:
9322
diff
changeset
|
519 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
|
520 |
1248
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
521 /* If this records an obsolete save |
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
522 (not matching the actual disk file) |
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
523 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
|
524 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
|
525 continue; |
1598
3e9dadf2d13c
* undo.c (Fprimitive_undo): Remove whitespace in front of #ifdef
Jim Blandy <jimb@redhat.com>
parents:
1524
diff
changeset
|
526 #ifdef CLASH_DETECTION |
1248
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
527 Funlock_buffer (); |
1598
3e9dadf2d13c
* undo.c (Fprimitive_undo): Remove whitespace in front of #ifdef
Jim Blandy <jimb@redhat.com>
parents:
1524
diff
changeset
|
528 #endif /* CLASH_DETECTION */ |
1248
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
529 Fset_buffer_modified_p (Qnil); |
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
530 } |
3687
54381151027d
(record_delete): Always use XFASTINT on sbeg.
Richard M. Stallman <rms@gnu.org>
parents:
2961
diff
changeset
|
531 else if (EQ (car, Qnil)) |
1968
de0a0ed7318e
(record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
1598
diff
changeset
|
532 { |
59777
06bae5eee9dc
(Fprimitive_undo): Handle (FUNNAME . ARGS) by calling FUNNAME.
Richard M. Stallman <rms@gnu.org>
parents:
59069
diff
changeset
|
533 /* 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
|
534 Lisp_Object beg, end, prop, val; |
de0a0ed7318e
(record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
1598
diff
changeset
|
535 |
de0a0ed7318e
(record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
1598
diff
changeset
|
536 prop = Fcar (cdr); |
de0a0ed7318e
(record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
1598
diff
changeset
|
537 cdr = Fcdr (cdr); |
de0a0ed7318e
(record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
1598
diff
changeset
|
538 val = Fcar (cdr); |
de0a0ed7318e
(record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
1598
diff
changeset
|
539 cdr = Fcdr (cdr); |
de0a0ed7318e
(record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
1598
diff
changeset
|
540 beg = Fcar (cdr); |
de0a0ed7318e
(record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
1598
diff
changeset
|
541 end = Fcdr (cdr); |
de0a0ed7318e
(record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
1598
diff
changeset
|
542 |
de0a0ed7318e
(record_property_change): Typo in last change.
Richard M. Stallman <rms@gnu.org>
parents:
1598
diff
changeset
|
543 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
|
544 } |
9108
c0287cefc0f8
(record_insert, truncate_undo_list, Fprimitive_undo): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
7671
diff
changeset
|
545 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
|
546 { |
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
547 /* 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
|
548 |
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
549 if (XINT (car) < BEGV |
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
550 || XINT (cdr) > ZV) |
223 | 551 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
|
552 /* 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
|
553 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
|
554 Fgoto_char (car); |
1248
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
555 Fdelete_region (car, cdr); |
223 | 556 } |
59832 | 557 else if (EQ (car, Qapply)) |
59777
06bae5eee9dc
(Fprimitive_undo): Handle (FUNNAME . ARGS) by calling FUNNAME.
Richard M. Stallman <rms@gnu.org>
parents:
59069
diff
changeset
|
558 { |
59992
6e49a3404a8e
(Fprimitive_undo): Check veracity of delta,start,end.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59970
diff
changeset
|
559 /* Element (apply FUN . ARGS) means call FUN to undo. */ |
60000
bbd61dfcbd2c
(Fprimitive_undo): Check that undo function does not switch buffer.
Kim F. Storm <storm@cua.dk>
parents:
59992
diff
changeset
|
560 struct buffer *save_buffer = current_buffer; |
bbd61dfcbd2c
(Fprimitive_undo): Check that undo function does not switch buffer.
Kim F. Storm <storm@cua.dk>
parents:
59992
diff
changeset
|
561 |
59832 | 562 car = Fcar (cdr); |
59992
6e49a3404a8e
(Fprimitive_undo): Check veracity of delta,start,end.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59970
diff
changeset
|
563 cdr = Fcdr (cdr); |
59832 | 564 if (INTEGERP (car)) |
565 { | |
59992
6e49a3404a8e
(Fprimitive_undo): Check veracity of delta,start,end.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59970
diff
changeset
|
566 /* Long format: (apply DELTA START END FUN . ARGS). */ |
6e49a3404a8e
(Fprimitive_undo): Check veracity of delta,start,end.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59970
diff
changeset
|
567 Lisp_Object delta = car; |
6e49a3404a8e
(Fprimitive_undo): Check veracity of delta,start,end.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59970
diff
changeset
|
568 Lisp_Object start = Fcar (cdr); |
6e49a3404a8e
(Fprimitive_undo): Check veracity of delta,start,end.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59970
diff
changeset
|
569 Lisp_Object end = Fcar (Fcdr (cdr)); |
6e49a3404a8e
(Fprimitive_undo): Check veracity of delta,start,end.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59970
diff
changeset
|
570 Lisp_Object start_mark = Fcopy_marker (start, Qnil); |
6e49a3404a8e
(Fprimitive_undo): Check veracity of delta,start,end.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59970
diff
changeset
|
571 Lisp_Object end_mark = Fcopy_marker (end, Qt); |
6e49a3404a8e
(Fprimitive_undo): Check veracity of delta,start,end.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59970
diff
changeset
|
572 |
6e49a3404a8e
(Fprimitive_undo): Check veracity of delta,start,end.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59970
diff
changeset
|
573 cdr = Fcdr (Fcdr (cdr)); |
6e49a3404a8e
(Fprimitive_undo): Check veracity of delta,start,end.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59970
diff
changeset
|
574 apply1 (Fcar (cdr), Fcdr (cdr)); |
6e49a3404a8e
(Fprimitive_undo): Check veracity of delta,start,end.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59970
diff
changeset
|
575 |
6e49a3404a8e
(Fprimitive_undo): Check veracity of delta,start,end.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59970
diff
changeset
|
576 /* Check that the function did what the entry said it |
6e49a3404a8e
(Fprimitive_undo): Check veracity of delta,start,end.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59970
diff
changeset
|
577 would do. */ |
6e49a3404a8e
(Fprimitive_undo): Check veracity of delta,start,end.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59970
diff
changeset
|
578 if (!EQ (start, Fmarker_position (start_mark)) |
6e49a3404a8e
(Fprimitive_undo): Check veracity of delta,start,end.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59970
diff
changeset
|
579 || (XINT (delta) + XINT (end) |
6e49a3404a8e
(Fprimitive_undo): Check veracity of delta,start,end.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59970
diff
changeset
|
580 != marker_position (end_mark))) |
6e49a3404a8e
(Fprimitive_undo): Check veracity of delta,start,end.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59970
diff
changeset
|
581 error ("Changes to be undone by function different than announced"); |
6e49a3404a8e
(Fprimitive_undo): Check veracity of delta,start,end.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59970
diff
changeset
|
582 Fset_marker (start_mark, Qnil, Qnil); |
6e49a3404a8e
(Fprimitive_undo): Check veracity of delta,start,end.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59970
diff
changeset
|
583 Fset_marker (end_mark, Qnil, Qnil); |
59832 | 584 } |
59992
6e49a3404a8e
(Fprimitive_undo): Check veracity of delta,start,end.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59970
diff
changeset
|
585 else |
6e49a3404a8e
(Fprimitive_undo): Check veracity of delta,start,end.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
59970
diff
changeset
|
586 apply1 (car, cdr); |
60000
bbd61dfcbd2c
(Fprimitive_undo): Check that undo function does not switch buffer.
Kim F. Storm <storm@cua.dk>
parents:
59992
diff
changeset
|
587 |
bbd61dfcbd2c
(Fprimitive_undo): Check that undo function does not switch buffer.
Kim F. Storm <storm@cua.dk>
parents:
59992
diff
changeset
|
588 if (save_buffer != current_buffer) |
bbd61dfcbd2c
(Fprimitive_undo): Check that undo function does not switch buffer.
Kim F. Storm <storm@cua.dk>
parents:
59992
diff
changeset
|
589 error ("Undo function switched buffer"); |
59970
cf4b913c7074
(Fprimitive_undo): Record max one dummmy apply element.
Kim F. Storm <storm@cua.dk>
parents:
59864
diff
changeset
|
590 did_apply = 1; |
59777
06bae5eee9dc
(Fprimitive_undo): Handle (FUNNAME . ARGS) by calling FUNNAME.
Richard M. Stallman <rms@gnu.org>
parents:
59069
diff
changeset
|
591 } |
9108
c0287cefc0f8
(record_insert, truncate_undo_list, Fprimitive_undo): Use type test macros.
Karl Heuer <kwzh@gnu.org>
parents:
7671
diff
changeset
|
592 else if (STRINGP (car) && INTEGERP (cdr)) |
223 | 593 { |
1248
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
594 /* 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
|
595 Lisp_Object membuf; |
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
596 int pos = XINT (cdr); |
544 | 597 |
1248
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
598 membuf = car; |
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
599 if (pos < 0) |
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
600 { |
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
601 if (-pos < BEGV || -pos > ZV) |
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
602 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
|
603 SET_PT (-pos); |
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
604 Finsert (1, &membuf); |
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
605 } |
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
606 else |
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
607 { |
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
608 if (pos < BEGV || pos > ZV) |
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
609 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
|
610 SET_PT (pos); |
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
611 |
17447
dc2cb454b330
(Fprimitive_undo): When inserting, always insert
Richard M. Stallman <rms@gnu.org>
parents:
16039
diff
changeset
|
612 /* Now that we record marker adjustments |
dc2cb454b330
(Fprimitive_undo): When inserting, always insert
Richard M. Stallman <rms@gnu.org>
parents:
16039
diff
changeset
|
613 (caused by deletion) for undo, |
dc2cb454b330
(Fprimitive_undo): When inserting, always insert
Richard M. Stallman <rms@gnu.org>
parents:
16039
diff
changeset
|
614 we should always insert after markers, |
dc2cb454b330
(Fprimitive_undo): When inserting, always insert
Richard M. Stallman <rms@gnu.org>
parents:
16039
diff
changeset
|
615 so that undoing the marker adjustments |
dc2cb454b330
(Fprimitive_undo): When inserting, always insert
Richard M. Stallman <rms@gnu.org>
parents:
16039
diff
changeset
|
616 put the markers back in the right place. */ |
dc2cb454b330
(Fprimitive_undo): When inserting, always insert
Richard M. Stallman <rms@gnu.org>
parents:
16039
diff
changeset
|
617 Finsert (1, &membuf); |
1248
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
618 SET_PT (pos); |
68c77558d34b
(record_delete): Record pos before the deletion.
Richard M. Stallman <rms@gnu.org>
parents:
970
diff
changeset
|
619 } |
223 | 620 } |
14480
50954bb380b6
(record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
621 else if (MARKERP (car) && INTEGERP (cdr)) |
50954bb380b6
(record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
622 { |
50954bb380b6
(record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
623 /* (MARKER . INTEGER) means a marker MARKER |
50954bb380b6
(record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
624 was adjusted by INTEGER. */ |
50954bb380b6
(record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
625 if (XMARKER (car)->buffer) |
50954bb380b6
(record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
626 Fset_marker (car, |
50954bb380b6
(record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
627 make_number (marker_position (car) - XINT (cdr)), |
50954bb380b6
(record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
628 Fmarker_buffer (car)); |
50954bb380b6
(record_marker_adjustment): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
629 } |
223 | 630 } |
631 } | |
632 arg--; | |
633 } | |
634 | |
59970
cf4b913c7074
(Fprimitive_undo): Record max one dummmy apply element.
Kim F. Storm <storm@cua.dk>
parents:
59864
diff
changeset
|
635 |
cf4b913c7074
(Fprimitive_undo): Record max one dummmy apply element.
Kim F. Storm <storm@cua.dk>
parents:
59864
diff
changeset
|
636 /* Make sure an apply entry produces at least one undo entry, |
cf4b913c7074
(Fprimitive_undo): Record max one dummmy apply element.
Kim F. Storm <storm@cua.dk>
parents:
59864
diff
changeset
|
637 so the test in `undo' for continuing an undo series |
cf4b913c7074
(Fprimitive_undo): Record max one dummmy apply element.
Kim F. Storm <storm@cua.dk>
parents:
59864
diff
changeset
|
638 will work right. */ |
cf4b913c7074
(Fprimitive_undo): Record max one dummmy apply element.
Kim F. Storm <storm@cua.dk>
parents:
59864
diff
changeset
|
639 if (did_apply |
cf4b913c7074
(Fprimitive_undo): Record max one dummmy apply element.
Kim F. Storm <storm@cua.dk>
parents:
59864
diff
changeset
|
640 && EQ (oldlist, current_buffer->undo_list)) |
cf4b913c7074
(Fprimitive_undo): Record max one dummmy apply element.
Kim F. Storm <storm@cua.dk>
parents:
59864
diff
changeset
|
641 current_buffer->undo_list |
cf4b913c7074
(Fprimitive_undo): Record max one dummmy apply element.
Kim F. Storm <storm@cua.dk>
parents:
59864
diff
changeset
|
642 = Fcons (list3 (Qapply, Qcdr, Qnil), current_buffer->undo_list); |
cf4b913c7074
(Fprimitive_undo): Record max one dummmy apply element.
Kim F. Storm <storm@cua.dk>
parents:
59864
diff
changeset
|
643 |
7671
31d444fcae24
(Fprimitive_undo): GCPRO next and list.
Karl Heuer <kwzh@gnu.org>
parents:
7395
diff
changeset
|
644 UNGCPRO; |
3696
aa9310f06c0f
(syms_of_undo): Set up Qinhibit_read_only.
Richard M. Stallman <rms@gnu.org>
parents:
3687
diff
changeset
|
645 return unbind_to (count, list); |
223 | 646 } |
59777
06bae5eee9dc
(Fprimitive_undo): Handle (FUNNAME . ARGS) by calling FUNNAME.
Richard M. Stallman <rms@gnu.org>
parents:
59069
diff
changeset
|
647 |
21514 | 648 void |
223 | 649 syms_of_undo () |
650 { | |
3696
aa9310f06c0f
(syms_of_undo): Set up Qinhibit_read_only.
Richard M. Stallman <rms@gnu.org>
parents:
3687
diff
changeset
|
651 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
|
652 staticpro (&Qinhibit_read_only); |
aa9310f06c0f
(syms_of_undo): Set up Qinhibit_read_only.
Richard M. Stallman <rms@gnu.org>
parents:
3687
diff
changeset
|
653 |
59832 | 654 Qapply = intern ("apply"); |
655 staticpro (&Qapply); | |
656 | |
6254
a147d798ed0d
(syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents:
6180
diff
changeset
|
657 pending_boundary = Qnil; |
a147d798ed0d
(syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents:
6180
diff
changeset
|
658 staticpro (&pending_boundary); |
a147d798ed0d
(syms_of_undo): staticpro pending_boundary.
Richard M. Stallman <rms@gnu.org>
parents:
6180
diff
changeset
|
659 |
223 | 660 defsubr (&Sprimitive_undo); |
661 defsubr (&Sundo_boundary); | |
59048
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
662 |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
663 DEFVAR_INT ("undo-limit", &undo_limit, |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
664 doc: /* Keep no more undo information once it exceeds this size. |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
665 This limit is applied when garbage collection happens. |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
666 When a previous command increases the total undo list size past this |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
667 value, the earlier commands that came before it are forgotten. |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
668 |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
669 The size is counted as the number of bytes occupied, |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
670 which includes both saved text and other data. */); |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
671 undo_limit = 20000; |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
672 |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
673 DEFVAR_INT ("undo-strong-limit", &undo_strong_limit, |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
674 doc: /* Don't keep more than this much size of undo information. |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
675 This limit is applied when garbage collection happens. |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
676 When a previous command increases the total undo list size past this |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
677 value, that command and the earlier commands that came before it are forgotten. |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
678 However, the most recent buffer-modifying command's undo info |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
679 is never discarded for this reason. |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
680 |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
681 The size is counted as the number of bytes occupied, |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
682 which includes both saved text and other data. */); |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
683 undo_strong_limit = 30000; |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
684 |
59069
27371673eba8
(Vundo_outer_limit): Replaces undo_outer_limit. Uses changed.
Richard M. Stallman <rms@gnu.org>
parents:
59048
diff
changeset
|
685 DEFVAR_LISP ("undo-outer-limit", &Vundo_outer_limit, |
59048
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
686 doc: /* Outer limit on size of undo information for one command. |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
687 At garbage collection time, if the current command has produced |
59791
fc2f566fb0fd
(syms_of_undo) <undo-outer-limit>: Doc update.
Luc Teirlinck <teirllm@auburn.edu>
parents:
59777
diff
changeset
|
688 more than this much undo information, it discards the info and displays |
fc2f566fb0fd
(syms_of_undo) <undo-outer-limit>: Doc update.
Luc Teirlinck <teirllm@auburn.edu>
parents:
59777
diff
changeset
|
689 a warning. This is a last-ditch limit to prevent memory overflow. |
59048
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
690 |
59791
fc2f566fb0fd
(syms_of_undo) <undo-outer-limit>: Doc update.
Luc Teirlinck <teirllm@auburn.edu>
parents:
59777
diff
changeset
|
691 The size is counted as the number of bytes occupied, which includes |
fc2f566fb0fd
(syms_of_undo) <undo-outer-limit>: Doc update.
Luc Teirlinck <teirllm@auburn.edu>
parents:
59777
diff
changeset
|
692 both saved text and other data. A value of nil means no limit. In |
fc2f566fb0fd
(syms_of_undo) <undo-outer-limit>: Doc update.
Luc Teirlinck <teirllm@auburn.edu>
parents:
59777
diff
changeset
|
693 this case, accumulating one huge undo entry could make Emacs crash as |
fc2f566fb0fd
(syms_of_undo) <undo-outer-limit>: Doc update.
Luc Teirlinck <teirllm@auburn.edu>
parents:
59777
diff
changeset
|
694 a result of memory overflow. |
59048
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
695 |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
696 In fact, this calls the function which is the value of |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
697 `undo-outer-limit-function' with one argument, the size. |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
698 The text above describes the behavior of the function |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
699 that variable usually specifies. */); |
59793
6075baf26c0a
(syms_of_undo) <undo-outer-limit>: Increase value to 3 Meg.
Luc Teirlinck <teirllm@auburn.edu>
parents:
59791
diff
changeset
|
700 Vundo_outer_limit = make_number (3000000); |
59048
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
701 |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
702 DEFVAR_LISP ("undo-outer-limit-function", &Vundo_outer_limit_function, |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
703 doc: /* Function to call when an undo list exceeds `undo-outer-limit'. |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
704 This function is called with one argument, the current undo list size |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
705 for the most recent command (since the last undo boundary). |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
706 If the function returns t, that means truncation has been fully handled. |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
707 If it returns nil, the other forms of truncation are done. |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
708 |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
709 Garbage collection is inhibited around the call to this function, |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
710 so it must make sure not to do a lot of consing. */); |
2daab60919ed
(truncate_undo_list): Return void.
Richard M. Stallman <rms@gnu.org>
parents:
55839
diff
changeset
|
711 Vundo_outer_limit_function = Qnil; |
223 | 712 } |
52401 | 713 |
714 /* arch-tag: d546ee01-4aed-4ffb-bb8b-eefaae50d38a | |
715 (do not change this comment) */ |