bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#53485: 29.0.50; [PATCH] Implement alternative sub-buffer support in


From: miha
Subject: bug#53485: 29.0.50; [PATCH] Implement alternative sub-buffer support in term.el
Date: Sun, 23 Jan 2022 22:00:07 +0100

In M-x term, try:

  $ seq 100
  $ htop
  Press 'q' to exit htop.

(Instead of 'htop', you could also try with 'emacs -q', 'vi' or any
other full-screen TUI program.)

Current behaviour: htop overwrites a portion of output from the 'seq'
command and htop's contents remain visible on the screen after pressing
'q'.

Proposed behaviour (patch attached): avoid overwriting output from the
'seq' command and erase htop's contents after exiting. This is the
default behaviour of xterm, st and most other terminal emulators.

Best regards.

From 41d2f635612c2ef7e046b8f38bd81d0393a7a730 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Miha=20Rihtar=C5=A1i=C4=8D?= <miha@kamnitnik.top>
Date: Sun, 23 Jan 2022 21:13:24 +0100
Subject: [PATCH] Implement alternative sub-buffer support in term.el

* etc/e/eterm-color.ti: Added termcaps for entering and leaving an
alternative sub-buffer.
* lisp/term.el (term-reset-size): Resize correctly in an alternative
sub-buffer is in use.
(term-handle-ansi-escape):
(term-termcap-format): Handle termcaps for entering and leaving an
alternative sub-buffer.
(term-switch-to-alternate-sub-buffer): New (used to be commented out)
function to enter or leave an alternative sub-buffer.
---
 etc/e/eterm-color    | Bin 1296 -> 1318 bytes
 etc/e/eterm-color.ti |   5 +--
 etc/e/eterm-direct   | Bin 1375 -> 1397 bytes
 lisp/term.el         |  80 ++++++++++++++++++++++++-------------------
 4 files changed, 48 insertions(+), 37 deletions(-)

diff --git a/etc/e/eterm-color b/etc/e/eterm-color
index 
bf44fa0f36de0f6681fa3172db13a83c414aa42a..fadac25ffcb55b3b3f6812e9c80f848e94f3dcc3
 100644
GIT binary patch
delta 283
zcmbQhwTz2fiqV}xl7XKglkwC<?r=^97?_wC?h?-M|9>n)5<@zW&S5BIC<D^}|5r2A
z1L;<VE`|wUK1d7(rU6A}K}F{P>4glF4H;!5mNKjYa@GU!W`-RMd!Y&rGEAPxsAO}L
z;T*$th6g~wmkgg6egkP1MwodJnit9!0Mf#YVvG_{zBJ?Hi;PxGvLNc@WC2EYCM8Co
zk$PO}j7DH3=8Qn=rNkVd>XA)#1!?kP_Gavw9LOBSY+{}<c?Gi?lX=eOQ_OCR0H64e
At^fc4

delta 270
zcmZ3+HGzv;iqV~c9|$uU_f6yupO_Qo{2vIy8Dba`8UFuIW5{MG0Mh^emx9SkhB}58
zFbgCG16@FoKB(vfAU$<rq3GlQMh@|r4D*28#X!8AVGYAZsFJN9=?#p0Hai&(F`Q<&
z0u;W>@QmR-kp2Nx0yCMB5yD~t((H^}j66_2KjY+wj8;s7AnGvCEM6ut#>opA^|+)N
r)xb)$87Dh3N{N|3)x*pK(Uu@hUd;B4b(5o+qbBcWR^I%C*@+PVcS)1K

diff --git a/etc/e/eterm-color.ti b/etc/e/eterm-color.ti
index eeb9b0b6e6..84b27aef5d 100644
--- a/etc/e/eterm-color.ti
+++ b/etc/e/eterm-color.ti
@@ -16,6 +16,7 @@ eterm-color|Emacs term.el terminal emulator 
term-protocol-version 0.96,
        am,
        mir,
        msgr,
+       nrrmc,
        xenl,
        bel=^G,
        blink=\E[5m,
@@ -77,8 +78,8 @@ eterm-color|Emacs term.el terminal emulator 
term-protocol-version 0.96,
        smso=\E[7m,
        u6=\E[%i%d;%dR,
        u7=\E[6n,
-#      smcup=\E[?47h,
-#      rmcup=\E[?47l,
+       smcup=\E[47h,
+       rmcup=\E[47l,
 #       rs2 may need to be added
 
 eterm-direct|Emacs term.el with direct-color indexing term-protocol-version 
0.96,
diff --git a/etc/e/eterm-direct b/etc/e/eterm-direct
index 
c113c3713693b948ae9d52e75df5d89957fd0c77..f4c16621eb185d7d0de14b56fb2e2b73a57adab8
 100644
GIT binary patch
delta 259
zcmcc5^_7cTjwz5ql7XKglkww3?nF)o7?_w{>JrZI|9>n)5<@zW&S5BIC<D^}|5r2A
z1L;<VE`|wUK1d7(rU6A}K}F{P>4gjv8)YPxGOPl!*8}lph8+xhq4EbACLd%}vOdai
zj^R4P1EAnbhEEK?fiw#v%s2?m3*`#{X<<e&MhPfidh$m`Yerchd67{GNa}N{Ga7;A
q%z-><Mh74%%;*Xvy_vlk=S{9;j$$@3&zO9HS&hj&XY(iKTt)x@PJ&SY

delta 260
zcmey$b)Sn{jwz6V9|$uUpHAdXoLE-k{2vIy8Dba`8UFuIW5{MG0Mh^emx9SkhB}58
zFbgCG16@FoKB(vfAU$<rqpbK$hIv5dVjy15u!dnHRC?>gMrG@r42Kv_Gh6`*-DP;j
z@E%D2fJ(zmWMqV}Sb#J;BNrnNl+Qm|ky&{11x5`<K`={zX%F-N|6)*48BS?NHLyx;
kkjTUZ9E>I)2BRfZu?4d|<D|*W%u$mcGb?ZAVaa3!0GjoLTL1t6

diff --git a/lisp/term.el b/lisp/term.el
index 895dfbed6c..e1ace628b2 100644
--- a/lisp/term.el
+++ b/lisp/term.el
@@ -1270,7 +1270,8 @@ term-reset-size
     (when (/= width term-width)
       (save-excursion
         (term--remove-fake-newlines)))
-    (let ((point (point)))
+    (let ((point (point))
+          (home-marker (marker-position term-home-marker)))
       (setq term-height height)
       (setq term-width width)
       (setq term-start-line-column nil)
@@ -1279,11 +1280,20 @@ term-reset-size
       (term--reset-scroll-region)
       ;; `term-set-scroll-region' causes these to be set, we have to
       ;; clear them again since we're changing point (Bug#30544).
+      (term--unwrap-visible-long-lines width)
       (setq term-start-line-column nil)
       (setq term-current-row nil)
       (setq term-current-column nil)
-      (goto-char point))
-    (term--unwrap-visible-long-lines width)))
+      (goto-char point)
+
+      (when (term-using-alternate-sub-buffer)
+        (term-handle-deferred-scroll)
+        ;; When using an alternative sub-buffer, the home marker should
+        ;; not move forward.  Bring it back by deleting text in front of
+        ;; it.
+        (when (> term-home-marker home-marker)
+          (let ((inhibit-read-only t))
+            (delete-region home-marker term-home-marker)))))))
 
 ;; Recursive routine used to check if any string in term-kill-echo-list
 ;; matches part of the buffer before point.
@@ -1611,6 +1621,7 @@ term-termcap-format
   "%s%s:li#%d:co#%d:cl=\\E[H\\E[J:cd=\\E[J:bs:am:xn:cm=\\E[%%i%%d;%%dH\
 :nd=\\E[C:up=\\E[A:ce=\\E[K:ho=\\E[H:pt\
 :al=\\E[L:dl=\\E[M:DL=\\E[%%dM:AL=\\E[%%dL:cs=\\E[%%i%%d;%%dr:sf=^J\
+:NR:te=\\E[47l:ti=\\E[47h\
 :dc=\\E[P:DC=\\E[%%dP:IC=\\E[%%d@:im=\\E[4h:ei=\\E[4l:mi:\
 :mb=\\E[5m:mh=\\E[2m:ZR=\\E[23m:ZH=\\E[3m\
 :so=\\E[7m:se=\\E[m:us=\\E[4m:ue=\\E[m:md=\\E[1m:mr=\\E[7m:me=\\E[m\
@@ -3539,16 +3550,14 @@ term-handle-ansi-escape
    ((eq char ?h)
     (cond ((eq (car params) 4)  ;; (terminfo: smir)
           (setq term-insert-mode t))
-         ;; ((eq (car params) 47) ;; (terminfo: smcup)
-         ;; (term-switch-to-alternate-sub-buffer t))
-         ))
+         ((eq (car params) 47) ;; (terminfo: smcup)
+          (term-switch-to-alternate-sub-buffer t))))
    ;; \E[?l - DEC Private Mode Reset
    ((eq char ?l)
     (cond ((eq (car params) 4)  ;; (terminfo: rmir)
           (setq term-insert-mode nil))
-          ;; ((eq (car params) 47) ;; (terminfo: rmcup)
-         ;; (term-switch-to-alternate-sub-buffer nil))
-         ))
+          ((eq (car params) 47) ;; (terminfo: rmcup)
+          (term-switch-to-alternate-sub-buffer nil))))
 
    ;; Modified to allow ansi coloring -mm
    ;; \E[m - Set/reset modes, set bg/fg
@@ -3595,32 +3604,33 @@ term-set-scroll-region
   (term-move-columns (- (term-current-column)))
   (term-goto 0 0))
 
-;; (defun term-switch-to-alternate-sub-buffer (set)
-;;   ;; If asked to switch to (from) the alternate sub-buffer, and already 
(not)
-;;   ;; using it, do nothing.  This test is needed for some programs (including
-;;   ;; Emacs) that emit the ti termcap string twice, for unknown reason.
-;;   (term-handle-deferred-scroll)
-;;   (if (eq set (not (term-using-alternate-sub-buffer)))
-;;       (let ((row (term-current-row))
-;;         (col (term-horizontal-column)))
-;;     (cond (set
-;;            (goto-char (point-max))
-;;            (if (not (eq (preceding-char) ?\n))
-;;                (term-insert-char ?\n 1))
-;;            (setq term-scroll-with-delete t)
-;;            (setq term-saved-home-marker (copy-marker term-home-marker))
-;;            (set-marker term-home-marker (point)))
-;;           (t
-;;            (setq term-scroll-with-delete
-;;                  (not (and (= term-scroll-start 0)
-;;                            (= term-scroll-end term-height))))
-;;            (set-marker term-home-marker term-saved-home-marker)
-;;            (set-marker term-saved-home-marker nil)
-;;            (setq term-saved-home-marker nil)
-;;            (goto-char term-home-marker)))
-;;     (setq term-current-column nil)
-;;     (setq term-current-row 0)
-;;     (term-goto row col))))
+(defun term-switch-to-alternate-sub-buffer (set)
+  ;; If asked to switch to (from) the alternate sub-buffer, and already (not)
+  ;; using it, do nothing.  This test is needed for some programs (including
+  ;; Emacs) that emit the ti termcap string twice, for unknown reason.
+  (term-handle-deferred-scroll)
+  (when (eq set (not (term-using-alternate-sub-buffer)))
+    (let ((row (term-current-row))
+          (col (term-horizontal-column)))
+      (cond (set
+             (goto-char (point-max))
+             (if (not (eq (preceding-char) ?\n))
+                 (term-insert-char ?\n 1))
+             (setq term-scroll-with-delete t)
+             (setq term-saved-home-marker (copy-marker term-home-marker))
+             (set-marker term-home-marker (point)))
+            (t
+             (setq term-scroll-with-delete
+                   (not (and (= term-scroll-start 0)
+                             (= term-scroll-end (term--last-line)))))
+             (delete-region term-home-marker (point-max))
+             (set-marker term-home-marker term-saved-home-marker)
+             (set-marker term-saved-home-marker nil)
+             (setq term-saved-home-marker nil)
+             (goto-char (point-max))))
+      (setq term-current-column nil)
+      (setq term-current-row nil)
+      (term-goto row col))))
 
 ;; Default value for the symbol term-command-function.
 
-- 
2.34.1

Attachment: signature.asc
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]