[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: |
Thu, 14 Jan 2021 15:51:47 +0200 |
> From: Liu Hui <liuhui1610@gmail.com>
> Date: Thu, 14 Jan 2021 12:51:12 +0800
> Cc: 45837@debbugs.gnu.org
>
> BTW, in the case above, if the line wraps after a non-whitespace
> character, C-k does not delete this character. How about the following
> change to kill-visual-line?
Yes, good catch. However, this is not entirely right, as the code you
suggest should be _instead_ of skipping the whitespace that follows,
not _in_addition_ to it (imagine that the line is wrapped at a
non-whitespace character followed by whitespace). And while looking
into adapting your patch to avoid removing more than the user
intended, I found more issues with the existing code. So I'm
proposing the patch below instead, which should correctly handle the
following use cases:
. visual line that ends in one or more whitespace characters, and the
following visual line begins with one or more whitespace characters
. visual line that ends with a non-whitespace character (under
word-wrap-by-category) that is followed by one or more whitespace
characters
. line that is continued on the next visual line (visual-line-mode is
off)
. visual line that is wrapped in the middle of a display string or an
overlay string with embedded whitespace characters
. visual line that is wrapped in the middle of intangible text
(The patch also fixes some minor issues with the documentation of this
command.)
WDYT?
diff --git a/lisp/simple.el b/lisp/simple.el
index 54c35c04be..e7421c069f 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -5606,7 +5606,9 @@ zap-to-char
;; kill-line and its subroutines.
(defcustom kill-whole-line nil
- "If non-nil, `kill-line' with no arg at start of line kills the whole line."
+ "If non-nil, `kill-line' with no arg at start of line kills the whole line.
+This variable also affects `kill-visual-line' in the same way as
+it does `kill-line'."
:type 'boolean
:group 'killing)
@@ -7319,6 +7321,9 @@ kill-visual-line
If ARG is zero, kill the text before point on the current visual
line.
+If `kill-whole-line' is non-nil, and this command is invoked at
+start of a line that ands in a newline, kill the newline as well.
+
If you want to append the killed line to the last killed text,
use \\[append-next-kill] before \\[kill-line].
@@ -7331,18 +7336,26 @@ kill-visual-line
;; Like in `kill-line', it's better to move point to the other end
;; of the kill before killing.
(let ((opoint (point))
- (kill-whole-line (and kill-whole-line (bolp))))
+ (kill-whole-line (and kill-whole-line (bolp)))
+ (orig-y (cdr (nth 2 (posn-at-point)))))
(if arg
(vertical-motion (prefix-numeric-value arg))
(end-of-visual-line 1)
(if (= (point) opoint)
(vertical-motion 1)
- ;; Skip any trailing whitespace at the end of the visual line.
- ;; We used to do this only if `show-trailing-whitespace' is
- ;; nil, but that's wrong; the correct thing would be to check
- ;; whether the trailing whitespace is highlighted. But, it's
- ;; OK to just do this unconditionally.
- (skip-chars-forward " \t")))
+ ;; The first condition below verifies we are still on the same
+ ;; screen line, i.e. that the line isn't continued, and that
+ ;; 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 (= (cdr (nth 2 (posn-at-point))) orig-y)
+ ;; Make sure we delete the character where the line wraps
+ ;; under visual-line-mode.
+ (or (looking-at-p "[ \t]")
+ (and word-wrap-by-category
+ (aref (char-category-set (following-char)) ?\|)))
+ (forward-char))))
(kill-region opoint (if (and kill-whole-line (= (following-char) ?\n))
(1+ (point))
(point)))))
- 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 <=
- 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, 2021/01/18
- 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