]> git.eshelyaron.com Git - emacs.git/commitdiff
Merge from emacs-26
authorNoam Postavsky <npostavs@gmail.com>
Sun, 10 Jun 2018 22:47:27 +0000 (18:47 -0400)
committerNoam Postavsky <npostavs@gmail.com>
Sun, 10 Jun 2018 22:47:27 +0000 (18:47 -0400)
8a1576cc03 Fix term.el cursor movement at bottom margin (Bug#31690)

1  2 
lisp/term.el
test/lisp/term-tests.el

diff --cc lisp/term.el
index 9aa4a20e36e6ca817ef998d36236b6fd52ab4b4b,60cd547f93dfc2db6df87d99b39ab2d1ecc024f8..121a22e79333ca2dd5ac273332cd4a983b4687f5
@@@ -3298,19 -3381,15 +3298,17 @@@ option is enabled.  See `term-set-goto-
           ;; If the amount to move is before scroll start, move
           ;; to scroll start.
           (- term-scroll-start tcr)
 -       (if (>= term-terminal-parameter tcr)
 +         (if (>= scroll-amount tcr)
             (- tcr)
 -         (- (max 1 term-terminal-parameter)))) t)))
 +           (- (max 1 scroll-amount))))
 +       t)))
     ;; \E[B - cursor down (terminfo: cud)
     ((eq char ?B)
 -    (let ((tcr (term-current-row)))
 +    (let ((tcr (term-current-row))
 +          (scroll-amount (car params)))
-       (unless (= tcr (1- term-scroll-end))
+       (unless (>= tcr term-scroll-end)
        (term-down
-          (if (> (+ tcr scroll-amount) term-scroll-end)
-            (- term-scroll-end 1 tcr)
-            (max 1 scroll-amount))
 -         (min (- term-scroll-end tcr) (max 1 term-terminal-parameter))
++         (min (- term-scroll-end tcr) (max 1 scroll-amount))
           t))))
     ;; \E[C - cursor right (terminfo: cuf, cuf1)
     ((eq char ?C)
index 72a9ad1ef7493c0e212733133084dd2b0b7b71e4,7fd8d1293dc16bad3bc64132278ac90cf6405828..ebf48d50a8477369a24217ccb6e506c5c5b8a000
@@@ -131,18 -124,27 +131,38 @@@ line6\
                      40 12 (list "\eAnSiTc /f" "oo/\n") 'default-directory)
                     "/foo/"))))
  
 -
 +(ert-deftest term-line-wrapping-then-motion ()
 +  "Make sure we reset the line-wrapping state after moving cursor.
 +A real-life example is the default zsh prompt which writes spaces
 +to the end of line (triggering line-wrapping state), and then
 +sends a carriage return followed by another space to overwrite
 +the first character of the line."
 +  (let* ((width 10)
 +         (strs (list "x" (make-string (1- width) ?_)
 +                     "\r_")))
 +    (should (equal (term-test-screen-from-input width 12 strs)
 +                   (make-string width ?_)))))
 +
+ (ert-deftest term-to-margin ()
+   "Test cursor movement at the scroll margin.
+ This is a reduced example from GNU nano's initial screen."
+   (let* ((width 10)
+          (x (make-string width ?x))
+          (y (make-string width ?y)))
+     (should (equal (term-test-screen-from-input
+                     width 3
+                     `("\e[1;3r"       ; Setup 3 line scrolling region.
+                       "\e[2;1H"       ; Move to 2nd last line.
+                       ,x              ; Fill with 'x'.
+                       "\r\e[1B"       ; Next line.
+                       ,y))            ; Fill with 'y'.
+                    (concat "\n" x "\n" y)))
+     ;; Same idea, but moving upwards.
+     (should (equal (term-test-screen-from-input
+                     width 3
+                     `("\e[1;3r" "\e[2;1H" ,x "\r\e[1A" ,y))
+                    (concat y "\n" x)))))
  (provide 'term-tests)
  
  ;;; term-tests.el ends here