Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
emacs
emacs
Commits
6396140a
Commit
6396140a
authored
Apr 04, 2002
by
Stefan Monnier
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
(record_point): New fun.
(record_delete, record_insert): Use it.
parent
b3bbfb96
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
63 additions
and
57 deletions
+63
-57
src/undo.c
src/undo.c
+63
-57
No files found.
src/undo.c
View file @
6396140a
...
...
@@ -36,19 +36,15 @@ Lisp_Object Qinhibit_read_only;
an undo-boundary. */
Lisp_Object
pending_boundary
;
/* Record
an insertion that just happened or is about to happen,
for LENGTH characters at position BEG
.
(It
is pos
s
i
ble to record an insertion before or after the fact
because we don't need to record
th
e
co
ntent
s.
)
*/
/* Record
point as it was at beginning of this command (if necessary)
And prepare the undo info for recording a change
.
PT
is
the
posi
tion of point that will naturally occur as a result of the
undo record that will be added just after
th
is
co
mmand terminate
s. */
void
record_insert
(
beg
,
length
)
int
beg
,
length
;
static
void
record_point
(
pt
)
{
Lisp_Object
lbeg
,
lend
;
if
(
EQ
(
current_buffer
->
undo_list
,
Qt
))
return
;
int
at_boundary
;
/* Allocate a cons cell to be the undo boundary after this command. */
if
(
NILP
(
pending_boundary
))
...
...
@@ -59,9 +55,58 @@ record_insert (beg, length)
Fundo_boundary
();
XSETBUFFER
(
last_undo_buffer
,
current_buffer
);
if
(
CONSP
(
current_buffer
->
undo_list
))
{
/* Set AT_BOUNDARY to 1 only when we have nothing other than
marker adjustment before undo boundary. */
Lisp_Object
tail
=
current_buffer
->
undo_list
,
elt
;
while
(
1
)
{
if
(
NILP
(
tail
))
elt
=
Qnil
;
else
elt
=
XCAR
(
tail
);
if
(
NILP
(
elt
)
||
!
(
CONSP
(
elt
)
&&
MARKERP
(
XCAR
(
elt
))))
break
;
tail
=
XCDR
(
tail
);
}
at_boundary
=
NILP
(
elt
);
}
else
at_boundary
=
1
;
if
(
MODIFF
<=
SAVE_MODIFF
)
record_first_change
();
/* If we are just after an undo boundary, and
point wasn't at start of deleted range, record where it was. */
if
(
at_boundary
&&
last_point_position
!=
pt
/* If we're called from batch mode, this could be nil. */
&&
BUFFERP
(
last_point_position_buffer
)
&&
current_buffer
==
XBUFFER
(
last_point_position_buffer
))
current_buffer
->
undo_list
=
Fcons
(
make_number
(
last_point_position
),
current_buffer
->
undo_list
);
}
/* Record an insertion that just happened or is about to happen,
for LENGTH characters at position BEG.
(It is possible to record an insertion before or after the fact
because we don't need to record the contents.) */
void
record_insert
(
beg
,
length
)
int
beg
,
length
;
{
Lisp_Object
lbeg
,
lend
;
if
(
EQ
(
current_buffer
->
undo_list
,
Qt
))
return
;
record_point
(
beg
);
/* If this is following another insertion and consecutive with it
in the buffer, combine the two. */
if
(
CONSP
(
current_buffer
->
undo_list
))
...
...
@@ -93,59 +138,20 @@ record_delete (beg, string)
Lisp_Object
string
;
{
Lisp_Object
sbeg
;
int
at_boundary
;
if
(
EQ
(
current_buffer
->
undo_list
,
Qt
))
return
;
/* Allocate a cons cell to be the undo boundary after this command. */
if
(
NILP
(
pending_boundary
))
pending_boundary
=
Fcons
(
Qnil
,
Qnil
);
if
(
BUFFERP
(
last_undo_buffer
)
&&
current_buffer
!=
XBUFFER
(
last_undo_buffer
))
Fundo_boundary
();
XSETBUFFER
(
last_undo_buffer
,
current_buffer
);
if
(
CONSP
(
current_buffer
->
undo_list
))
if
(
PT
==
beg
+
XSTRING
(
string
)
->
size
)
{
/* Set AT_BOUNDARY to 1 only when we have nothing other than
marker adjustment before undo boundary. */
Lisp_Object
tail
=
current_buffer
->
undo_list
,
elt
;
while
(
1
)
{
if
(
NILP
(
tail
))
elt
=
Qnil
;
else
elt
=
XCAR
(
tail
);
if
(
NILP
(
elt
)
||
!
(
CONSP
(
elt
)
&&
MARKERP
(
XCAR
(
elt
))))
break
;
tail
=
XCDR
(
tail
);
}
at_boundary
=
NILP
(
elt
);
XSETINT
(
sbeg
,
-
beg
);
record_point
(
PT
);
}
else
at_boundary
=
0
;
if
(
MODIFF
<=
SAVE_MODIFF
)
record_first_change
();
if
(
PT
==
beg
+
XSTRING
(
string
)
->
size
)
XSETINT
(
sbeg
,
-
beg
);
else
XSETFASTINT
(
sbeg
,
beg
);
/* If we are just after an undo boundary, and
point wasn't at start of deleted range, record where it was. */
if
(
at_boundary
&&
last_point_position
!=
XFASTINT
(
sbeg
)
/* If we're called from batch mode, this could be nil. */
&&
BUFFERP
(
last_point_position_buffer
)
&&
current_buffer
==
XBUFFER
(
last_point_position_buffer
))
current_buffer
->
undo_list
=
Fcons
(
make_number
(
last_point_position
),
current_buffer
->
undo_list
);
{
XSETFASTINT
(
sbeg
,
beg
);
record_point
(
beg
);
}
current_buffer
->
undo_list
=
Fcons
(
Fcons
(
string
,
sbeg
),
current_buffer
->
undo_list
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment