[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#45837: 28.0.50; incorrect cursor position in visual-line-mode when w
From: |
Eli Zaretskii |
Subject: |
bug#45837: 28.0.50; incorrect cursor position in visual-line-mode when word-wrap-by-category is t |
Date: |
Mon, 18 Jan 2021 19:14:10 +0200 |
> Date: Fri, 15 Jan 2021 10:15:08 +0200
> From: Eli Zaretskii <eliz@gnu.org>
> Cc: 45837@debbugs.gnu.org
>
> > From: Liu Hui <liuhui1610@gmail.com>
> > Date: Fri, 15 Jan 2021 15:28:33 +0800
> > Cc: 45837@debbugs.gnu.org
> >
> > I have tested the patch and found that the condition `(= (cdr (nth 2
> > (posn-at-point))) orig-y)` was sometimes too strict. `posn-at-point`
> > may give slightly different y positions for characters on the same
> > line when different fonts were used (examples can be found in the
> > HELLO file). If there are inline graphics (e.g. latex previews), the y
> > position can also be different.
>
> Hmm... you are right. But that sounds like a bug in posn-at-point, I
> will look into fixing it soon.
Upon looking into this, it isn't a bug: posn-at-point is working as
designed and documented:
Return nil if POS is not visible in WINDOW. Otherwise,
the return value is similar to that returned by ‘event-start’ for
a mouse click at the upper left corner of the glyph corresponding
to POS: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
"At the upper left corner of the glyph". IOW, if we ask about a glyph
from a small font on an otherwise tall visual line, posn-at-point will
try to adjust the Y coordinate for the fact that the glyph is smaller,
and thus its upper left corner is further down from the window top.
So using the (X . Y) part of what posn-at-point returns is unworkable
for the purpose of this issue: a character about which we are asking
can be arbitrarily small, and thus to work in all the cases, we will
have to allow for a very large tolerance, and that could miss some
situations where we really end up on the next visual line.
However, posn-at-point also returns the coordinates in (COLUMN . ROW)
units, and we can use that instead. So I propose to fix the current
code on master as below. WDYT?
diff --git a/lisp/simple.el b/lisp/simple.el
index 37c0885dcc..2c6e3916cd 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -7338,10 +7338,7 @@ kill-visual-line
;; of the kill before killing.
(let ((opoint (point))
(kill-whole-line (and kill-whole-line (bolp)))
- (orig-y (cdr (nth 2 (posn-at-point))))
- ;; FIXME: This tolerance should be zero! It isn't due to a
- ;; bug in posn-at-point, see bug#45837.
- (tol (/ (line-pixel-height) 2)))
+ (orig-vlnum (cdr (nth 6 (posn-at-point)))))
(if arg
(vertical-motion (prefix-numeric-value arg))
(end-of-visual-line 1)
@@ -7352,8 +7349,8 @@ kill-visual-line
;; end-of-visual-line didn't overshoot due to complications
;; like display or overlay strings, intangible text, etc.:
;; otherwise, we don't want to kill a character that's
- ;; unrelated to the place where the visual line wrapped.
- (and (< (abs (- (cdr (nth 2 (posn-at-point))) orig-y)) tol)
+ ;; unrelated to the place where the visual line wraps.
+ (and (= (cdr (nth 6 (posn-at-point))) orig-vlnum)
;; Make sure we delete the character where the line wraps
;; under visual-line-mode, be it whitespace or a
;; character whose category set allows to wrap at it.
- bug#45837: 28.0.50; incorrect cursor position in visual-line-mode when word-wrap-by-category is t, Liu Hui, 2021/01/12
- bug#45837: 28.0.50; incorrect cursor position in visual-line-mode when word-wrap-by-category is t, Eli Zaretskii, 2021/01/13
- bug#45837: 28.0.50; incorrect cursor position in visual-line-mode when word-wrap-by-category is t, Liu Hui, 2021/01/13
- bug#45837: 28.0.50; incorrect cursor position in visual-line-mode when word-wrap-by-category is t, Eli Zaretskii, 2021/01/14
- bug#45837: 28.0.50; incorrect cursor position in visual-line-mode when word-wrap-by-category is t, Liu Hui, 2021/01/15
- bug#45837: 28.0.50; incorrect cursor position in visual-line-mode when word-wrap-by-category is t, Eli Zaretskii, 2021/01/15
- bug#45837: 28.0.50; incorrect cursor position in visual-line-mode when word-wrap-by-category is t,
Eli Zaretskii <=
- bug#45837: 28.0.50; incorrect cursor position in visual-line-mode when word-wrap-by-category is t, Liu Hui, 2021/01/20
- bug#45837: 28.0.50; incorrect cursor position in visual-line-mode when word-wrap-by-category is t, Eli Zaretskii, 2021/01/21