Fix movement to the left in picture-mode
authorEli Zaretskii <eliz@gnu.org>
Sun, 10 Nov 2024 08:56:40 +0000 (10:56 +0200)
committerEli Zaretskii <eliz@gnu.org>
Sun, 10 Nov 2024 08:56:40 +0000 (10:56 +0200)
* lisp/textmodes/picture.el (picture-insert): Measure width by
counting columns on display, not by using 'string-width', because
the latter is inaccurate when TABs are involved.  (Bug#74255)

lisp/textmodes/picture.el

index adb06cb6a29310a0f64fe730c33118df5c072b6f..08bb12cd80c52d3d2aa83becdf81effd915ce2c3 100644 (file)
@@ -264,9 +264,14 @@ Use \"\\[command-apropos] picture-movement\" to see commands which control motio
          (move-to-column picture-desired-column t))
       (let ((col (+ picture-desired-column width)))
        (or (eolp)
-           (let ((pos (point)))
-             (move-to-column col t)
-             (let ((old-width (string-width (buffer-substring pos (point)))))
+           (let ((pos (point))
+                  (col0 (current-column))
+                  col1)
+             (setq col1 (move-to-column col t))
+              ;; We count columns, not width, because move-to-column
+              ;; could insert TABs, which width depends on horizontal
+              ;; position.
+             (let ((old-width (- (max col0 col1) (min col0 col1))))
                (delete-region pos (point))
                (when (> old-width width)
                  (insert-char ?  (- old-width width))