all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: storm@cua.dk (Kim F. Storm)
Cc: emacs-devel@gnu.org
Subject: Re: Bug in `next-line' when last char in line has after-string property
Date: Thu, 04 Jan 2007 14:07:15 +0100	[thread overview]
Message-ID: <m33b6rq6t8.fsf@kfs-l.imdomain.dk> (raw)
In-Reply-To: <1167760463.459a9c4fbbe73@imp.hosting365.ie> (Ben North's message of "Tue\, 02 Jan 2007 17\:54\:23 +0000")

Ben North <ben@redfrontdoor.org> writes:

> The attached file shows a bug in 22.0.92.  To reproduce, launch "emacs
> -Q".  (The bug is exhibited with or without the "-nw" option.)
> `find-file' the attached file.  Make sure your window is narrow enough
> that the initial line of `-' characters wraps.  Go to the end of the
> buffer (M->) and do `eval-last-sexp' (C-x C-e).  The desired behaviour
> is that point ends up in the first column of the second line.  It in
> fact ends up in the first column of the third line.


Here is a patch which fixes this specific problem, but I don't know
whether it will cause other problems, as the "overshoot" check
on strings was added to fix some other bug.

This just shows that the current overshoot check in vertial-motion
is pretty fragile ... e.g. what if there is another overlay string
after the current string which _does_ have a newline in it.

Hm, we probably need to rework this _after_ the release.


*** indent.c	20 Nov 2006 09:32:04 +0100	1.187
--- indent.c	04 Jan 2007 14:02:39 +0100	
***************
*** 2074,2080 ****
      {
        int it_start;
        int oselective;
!       int it_overshoot_expected_p;
  
        SET_TEXT_POS (pt, PT, PT_BYTE);
        start_display (&it, w, pt);
--- 2074,2080 ----
      {
        int it_start;
        int oselective;
!       int it_overshoot_expected;
  
        SET_TEXT_POS (pt, PT, PT_BYTE);
        start_display (&it, w, pt);
***************
*** 2100,2111 ****
  	  while (s < e && *s != '\n')
  	    ++s;
  
! 	  it_overshoot_expected_p = (s == e);
  	}
        else
! 	it_overshoot_expected_p = (it.method == GET_FROM_IMAGE
! 				   || it.method == GET_FROM_STRETCH
! 				   || it.method == GET_FROM_COMPOSITION);
  
        reseat_at_previous_visible_line_start (&it);
        it.current_x = it.hpos = 0;
--- 2100,2115 ----
  	  while (s < e && *s != '\n')
  	    ++s;
  
! 	  /* If there is no newline in the string, we need to check
! 	     whether there is a newline immediately after the string
! 	     in move_it_to below.  This may happen if there is an
! 	     overlay with an after-string just before the newline.  */
! 	  it_overshoot_expected = (s == e) ? -1 : 0;
  	}
        else
! 	it_overshoot_expected = (it.method == GET_FROM_IMAGE
! 				 || it.method == GET_FROM_STRETCH
! 				 || it.method == GET_FROM_COMPOSITION);
  
        reseat_at_previous_visible_line_start (&it);
        it.current_x = it.hpos = 0;
***************
*** 2119,2125 ****
  	 truncate-lines is on and PT is beyond right margin.
  	 Don't go back if the overshoot is expected (see above).  */
        if (IT_CHARPOS (it) > it_start && XINT (lines) > 0
! 	  && !it_overshoot_expected_p)
  	move_it_by_lines (&it, -1, 0);
  
        it.vpos = 0;
--- 2123,2132 ----
  	 truncate-lines is on and PT is beyond right margin.
  	 Don't go back if the overshoot is expected (see above).  */
        if (IT_CHARPOS (it) > it_start && XINT (lines) > 0
! 	  && (!it_overshoot_expected
! 	      || (it_overshoot_expected < 0
! 		  && it.method == GET_FROM_BUFFER
! 		  && it.c == '\n')))
  	move_it_by_lines (&it, -1, 0);
  
        it.vpos = 0;

>
> You can carry on playing with this: go to the very start of the buffer,
> and hit C-n --- point moves down two lines instead of one.  I looked
> into this a bit, which is what lead to the attached test-case using only
> functions implemented in C, but I don't know the C code well enough to
> dig further I'm afraid.  Hope the report is useful nonetheless.
>
> ; ------------------------------------------------------------------------------------------------------------------------------------
>
> (progn (setq overlay
>              (let ((end-of-first-line (save-excursion (goto-char 1) (end-of-line) (point))))
>                (make-overlay (1- end-of-first-line) end-of-first-line))
>              truncate-lines t)
>        (overlay-put overlay 'after-string "X")
>        (progn
>          (goto-char 1)
>          (goto-char (line-end-position))
>          (vertical-motion 1)))
> _______________________________________________
> Emacs-devel mailing list
> Emacs-devel@gnu.org
> http://lists.gnu.org/mailman/listinfo/emacs-devel

-- 
Kim F. Storm <storm@cua.dk> http://www.cua.dk

  reply	other threads:[~2007-01-04 13:07 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-01-02 17:54 Bug in `next-line' when last char in line has after-string property Ben North
2007-01-04 13:07 ` Kim F. Storm [this message]
2007-01-05  0:31   ` Richard Stallman
2007-01-05 15:06     ` Kim F. Storm
2007-01-07 15:50       ` Ralf Angeli
2007-01-07 22:55         ` Kim F. Storm

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=m33b6rq6t8.fsf@kfs-l.imdomain.dk \
    --to=storm@cua.dk \
    --cc=emacs-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.