Commit 8a1576cc authored by Noam Postavsky's avatar Noam Postavsky

Fix term.el cursor movement at bottom margin (Bug#31690)

* lisp/term.el (term-handle-ansi-escape) <\E[B cud>: Allow moving the
cursor to the bottom margin line, rather than stopping one line
before.
parent 4c3fae3c
......@@ -3387,11 +3387,10 @@ option is enabled. See `term-set-goto-process-mark'."
;; \E[B - cursor down (terminfo: cud)
((eq char ?B)
(let ((tcr (term-current-row)))
(unless (= tcr (1- term-scroll-end))
(unless (>= tcr term-scroll-end)
(term-down
(if (> (+ tcr term-terminal-parameter) term-scroll-end)
(- term-scroll-end 1 tcr)
(max 1 term-terminal-parameter)) t))))
(min (- term-scroll-end tcr) (max 1 term-terminal-parameter))
t))))
;; \E[C - cursor right (terminfo: cuf, cuf1)
((eq char ?C)
(term-move-columns
......
......@@ -124,6 +124,27 @@ line6\r
40 12 (list "\eAnSiTc /f" "oo/\n") 'default-directory)
"/foo/"))))
(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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment