aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard M. Stallman <[email protected]>2002-04-22 22:33:36 +0000
committerRichard M. Stallman <[email protected]>2002-04-22 22:33:36 +0000
commitfda3de70e18b1281f685f56ecd9ec4178cbeb5f8 (patch)
tree5de99e9a95c066c115f0b07226438a81dd62243f
parent6be3e0da262fc2d298916972a39cde8d0ffff822 (diff)
(Fend_of_line): Handle intangible text in mid line.
-rw-r--r--src/cmds.c29
1 files changed, 28 insertions, 1 deletions
diff --git a/src/cmds.c b/src/cmds.c
index 09362a7f5d..40990d074b 100644
--- a/src/cmds.c
+++ b/src/cmds.c
@@ -179,6 +179,7 @@ DEFUN ("end-of-line", Fend_of_line, Send_of_line, 0, 1, "p",
doc: /* Move point to end of current line.
With argument N not nil or 1, move forward N - 1 lines first.
If point reaches the beginning or end of buffer, it stops there.
+To ignore intangibility, bind `inhibit-text-motion-hooks' to t.
This command does not move point across a field boundary unless doing so
would move beyond there to a different line; if N is nil or 1, and
@@ -187,12 +188,38 @@ boundaries bind `inhibit-field-text-motion' to t. */)
(n)
Lisp_Object n;
{
+ int newpos;
+
if (NILP (n))
XSETFASTINT (n, 1);
else
CHECK_NUMBER (n);
- SET_PT (XINT (Fline_end_position (n)));
+ while (1)
+ {
+ newpos = XINT (Fline_end_position (n));
+ SET_PT (newpos);
+
+ if (PT > newpos
+ && FETCH_CHAR (PT - 1) == '\n')
+ {
+ /* If we skipped over a newline that follows
+ an invisible intangible run,
+ move back to the last tangible position
+ within the line. */
+
+ SET_PT (PT - 1);
+ break;
+ }
+ else if (PT > newpos && PT < ZV
+ && FETCH_CHAR (PT) != '\n')
+ /* If we skipped something intangible
+ and now we're not really at eol,
+ keep going. */
+ n = make_number (1);
+ else
+ break;
+ }
return Qnil;
}