emacs-diffs
[Top][All Lists]
Advanced

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

master 0707fdd 4/4: In term-mode, handle ANSI codes, specifying italic a


From: Lars Ingebrigtsen
Subject: master 0707fdd 4/4: In term-mode, handle ANSI codes, specifying italic and other modes
Date: Tue, 5 Oct 2021 02:55:42 -0400 (EDT)

branch: master
commit 0707fdd36cffe2211614b921cbc8dcd44e9cd880
Author: Miha Rihtaršič <miha@kamnitnik.top>
Commit: Lars Ingebrigtsen <larsi@gnus.org>

    In term-mode, handle ANSI codes, specifying italic and other modes
    
    * etc/e/eterm-color.ti: Add new capabilities
    * lisp/term.el: New faces and variables to support new ANSI modes.
    (term-termcap-format): Add new capabilities
    (term-emulate-terminal): When saving cursor, additionally save the new
    variables.
    (term--handle-colors-list): Handle ANSI codes, specifying italic other
    modes.
    * test/lisp/term-tests.el (ansi-test-strings): Adjust tests.
---
 etc/NEWS                |   8 ++--
 etc/e/eterm-color       | Bin 1275 -> 1296 bytes
 etc/e/eterm-color.ti    |   4 ++
 etc/e/eterm-direct      | Bin 1354 -> 1375 bytes
 lisp/term.el            | 105 ++++++++++++++++++++++++++++++++++++------------
 test/lisp/term-tests.el |  32 +++++++--------
 6 files changed, 104 insertions(+), 45 deletions(-)

diff --git a/etc/NEWS b/etc/NEWS
index 3c16e2f..2dcd12f 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -92,9 +92,11 @@ filters and displayed with the specified color.
 ** term-mode
 
 ---
-*** Support for ANSI 256-color and 24-bit colors.
-256-color and 24-bit color codes are now displayed with the specified
-color.
+*** Support for ANSI 256-color and 24-bit colors, italic and other fonts.
+Term-mode can now display 256-color and 24-bit color codes.  It can
+also handle ANSI codes for faint, italic and blinking text, displaying
+it with new 'ansi-term-faint/italic/slow-blinking/fast-blinking'
+faces.
 
 
 * New Modes and Packages in Emacs 29.1
diff --git a/etc/e/eterm-color b/etc/e/eterm-color
index 99603ba..bf44fa0 100644
Binary files a/etc/e/eterm-color and b/etc/e/eterm-color differ
diff --git a/etc/e/eterm-color.ti b/etc/e/eterm-color.ti
index 61c29e6..eeb9b0b 100644
--- a/etc/e/eterm-color.ti
+++ b/etc/e/eterm-color.ti
@@ -18,6 +18,7 @@ eterm-color|Emacs term.el terminal emulator 
term-protocol-version 0.96,
        msgr,
        xenl,
        bel=^G,
+       blink=\E[5m,
        bold=\E[1m,
        clear=\E[H\E[J,
        cr=\r,
@@ -31,6 +32,7 @@ eterm-color|Emacs term.el terminal emulator 
term-protocol-version 0.96,
        cup=\E[%i%p1%d;%p2%dH,
        cuu1=\E[A,
        cuu=\E[%p1%dA,
+       dim=\E[2m,
        dch1=\E[P,
        dch=\E[%p1%dP,
        dl1=\E[M,
@@ -60,6 +62,7 @@ eterm-color|Emacs term.el terminal emulator 
term-protocol-version 0.96,
        rc=\E8,
        rev=\E[7m,
        ri=\EM,
+       ritm=\E[23m,
        rmir=\E[4l,
        rmso=\E[27m,
        rmul=\E[24m,
@@ -68,6 +71,7 @@ eterm-color|Emacs term.el terminal emulator 
term-protocol-version 0.96,
        setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m,
        setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m,
        sgr0=\E[m,
+       sitm=\E[3m,
        smir=\E[4h,
        smul=\E[4m,
        smso=\E[7m,
diff --git a/etc/e/eterm-direct b/etc/e/eterm-direct
index 35983ec..c113c37 100644
Binary files a/etc/e/eterm-direct and b/etc/e/eterm-direct differ
diff --git a/lisp/term.el b/lisp/term.el
index 771b732..ce086c3 100644
--- a/lisp/term.el
+++ b/lisp/term.el
@@ -711,10 +711,14 @@ Buffer local variable.")
 (defvar term-ansi-at-save-pwd nil)
 (defvar term-ansi-at-save-anon nil)
 (defvar term-ansi-current-bold nil)
+(defvar term-ansi-current-faint nil)
+(defvar term-ansi-current-italic nil)
+(defvar term-ansi-current-underline nil)
+(defvar term-ansi-current-slow-blink nil)
+(defvar term-ansi-current-fast-blink nil)
 (defvar term-ansi-current-color 0)
 (defvar term-ansi-face-already-done nil)
 (defvar term-ansi-current-bg-color 0)
-(defvar term-ansi-current-underline nil)
 (defvar term-ansi-current-reverse nil)
 (defvar term-ansi-current-invisible nil)
 
@@ -769,12 +773,36 @@ Buffer local variable.")
   :group 'term
   :version "28.1")
 
+(defface term-faint
+  '((t :inherit ansi-color-faint))
+  "Default face to use for faint text."
+  :group 'term
+  :version "28.1")
+
+(defface term-italic
+  '((t :inherit ansi-color-italic))
+  "Default face to use for italic text."
+  :group 'term
+  :version "28.1")
+
 (defface term-underline
   '((t :inherit ansi-color-underline))
   "Default face to use for underlined text."
   :group 'term
   :version "28.1")
 
+(defface term-slow-blink
+  '((t :inherit ansi-color-slow-blink))
+  "Default face to use for slowly blinking text."
+  :group 'term
+  :version "28.1")
+
+(defface term-fast-blink
+  '((t :inherit ansi-color-fast-blink))
+  "Default face to use for rapidly blinking text."
+  :group 'term
+  :version "28.1")
+
 (defface term-color-black
   '((t :inherit ansi-color-black))
   "Face used to render black color code."
@@ -1038,8 +1066,12 @@ is buffer-local."
 
 (defun term-ansi-reset ()
   (setq term-current-face 'term)
-  (setq term-ansi-current-underline nil)
   (setq term-ansi-current-bold nil)
+  (setq term-ansi-current-faint nil)
+  (setq term-ansi-current-italic nil)
+  (setq term-ansi-current-underline nil)
+  (setq term-ansi-current-slow-blink nil)
+  (setq term-ansi-current-fast-blink nil)
   (setq term-ansi-current-reverse nil)
   (setq term-ansi-current-color 0)
   (setq term-ansi-current-invisible nil)
@@ -1581,6 +1613,7 @@ Using \"emacs\" loses, because bash disables editing if 
$TERM == emacs.")
 :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\
 :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\
 :UP=\\E[%%dA:DO=\\E[%%dB:LE=\\E[%%dD:RI=\\E[%%dC\
 :kl=\\EOD:kd=\\EOB:kr=\\EOC:ku=\\EOA:kN=\\E[6~:kP=\\E[5~:@7=\\E[4~:kh=\\E[1~\
@@ -3105,30 +3138,34 @@ See `term-prompt-regexp'."
                                   (term-horizontal-column)
                                   term-ansi-current-bg-color
                                   term-ansi-current-bold
+                                  term-ansi-current-faint
+                                  term-ansi-current-italic
+                                  term-ansi-current-underline
+                                  term-ansi-current-slow-blink
+                                  term-ansi-current-fast-blink
                                   term-ansi-current-color
                                   term-ansi-current-invisible
                                   term-ansi-current-reverse
-                                  term-ansi-current-underline
                                   term-current-face)))
                      (?8 ;; Restore cursor (terminfo: rc, [ctlseqs]
                       ;; "DECRC").
                       (when term-saved-cursor
                         (term-goto (nth 0 term-saved-cursor)
                                    (nth 1 term-saved-cursor))
-                        (setq term-ansi-current-bg-color
-                              (nth 2 term-saved-cursor)
-                              term-ansi-current-bold
-                              (nth 3 term-saved-cursor)
-                              term-ansi-current-color
-                              (nth 4 term-saved-cursor)
-                              term-ansi-current-invisible
-                              (nth 5 term-saved-cursor)
-                              term-ansi-current-reverse
-                              (nth 6 term-saved-cursor)
-                              term-ansi-current-underline
-                              (nth 7 term-saved-cursor)
-                              term-current-face
-                              (nth 8 term-saved-cursor))))
+                        (pcase-setq
+                         `( ,_ ,_
+                            ,term-ansi-current-bg-color
+                            ,term-ansi-current-bold
+                            ,term-ansi-current-faint
+                            ,term-ansi-current-italic
+                            ,term-ansi-current-underline
+                            ,term-ansi-current-slow-blink
+                            ,term-ansi-current-fast-blink
+                            ,term-ansi-current-color
+                            ,term-ansi-current-invisible
+                            ,term-ansi-current-reverse
+                            ,term-current-face)
+                         term-saved-cursor)))
                      (?c ;; \Ec - Reset (terminfo: rs1, [ctlseqs] "RIS").
                       ;; This is used by the "clear" program.
                       (term-reset-terminal))
@@ -3316,11 +3353,20 @@ otherwise use the current foreground color."
   (while parameters
     (pcase (pop parameters)
       (1 (setq term-ansi-current-bold t))       ; (terminfo: bold)
+      (2 (setq term-ansi-current-faint t))      ; (terminfo: dim)
+      (3 (setq term-ansi-current-italic t))     ; (terminfo: sitm)
       (4 (setq term-ansi-current-underline t))  ; (terminfo: smul)
-      (5 (setq term-ansi-current-bold t))       ; (terminfo: bold)
+      (5 (setq term-ansi-current-slow-blink t)) ; (terminfo: blink)
+      (6 (setq term-ansi-current-fast-blink t))
       (7 (setq term-ansi-current-reverse t))    ; (terminfo: smso, rev)
       (8 (setq term-ansi-current-invisible t))  ; (terminfo: invis)
+      (21 (setq term-ansi-current-bold nil))
+      (22 (setq term-ansi-current-bold nil)
+          (setq term-ansi-current-faint nil))
+      (23 (setq term-ansi-current-italic nil))    ; (terminfo: ritm)
       (24 (setq term-ansi-current-underline nil)) ; (terminfo: rmul)
+      (25 (setq term-ansi-current-slow-blink nil)
+          (setq term-ansi-current-fast-blink nil))
       (27 (setq term-ansi-current-reverse nil)) ; (terminfo: rmso)
 
       ;; Foreground (terminfo: setaf)
@@ -3398,13 +3444,20 @@ otherwise use the current foreground color."
              ,@(unless term-ansi-current-invisible
                  (list :inverse-video term-ansi-current-reverse)))))
 
-  (when term-ansi-current-bold
-    (setq term-current-face
-          `(,term-current-face :inherit term-bold)))
-
-  (when term-ansi-current-underline
-    (setq term-current-face
-          `(,term-current-face :inherit term-underline))))
+  (setq term-current-face
+        `(,term-current-face
+          ,@(when term-ansi-current-bold
+              '(term-bold))
+          ,@(when term-ansi-current-faint
+              '(term-faint))
+          ,@(when term-ansi-current-italic
+              '(term-italic))
+          ,@(when term-ansi-current-underline
+              '(term-underline))
+          ,@(when term-ansi-current-slow-blink
+              '(term-slow-blink))
+          ,@(when term-ansi-current-fast-blink
+              '(term-fast-blink)))))
 
 
 ;; Handle a character assuming (eq terminal-state 2) -
@@ -3490,7 +3543,7 @@ otherwise use the current foreground color."
 
    ;; Modified to allow ansi coloring -mm
    ;; \E[m - Set/reset modes, set bg/fg
-   ;;(terminfo: smso,rmso,smul,rmul,rev,bold,sgr0,invis,op,setab,setaf)
+   ;;(terminfo: 
smso,rmso,smul,rmul,rev,bold,dim,sitm,ritm,blink,sgr0,invis,op,setab,setaf)
    ((eq char ?m)
     (term--handle-colors-list params))
 
diff --git a/test/lisp/term-tests.el b/test/lisp/term-tests.el
index b8adc62..73d39cf 100644
--- a/test/lisp/term-tests.el
+++ b/test/lisp/term-tests.el
@@ -48,44 +48,44 @@
 
 (defvar ansi-test-strings
   `(("\e[33mHello World\e[0m"
-     ,(propertize "Hello World" 'font-lock-face yellow-fg-props))
+     ,(propertize "Hello World" 'font-lock-face `(,yellow-fg-props)))
     ("\e[43mHello World\e[0m"
-     ,(propertize "Hello World" 'font-lock-face yellow-bg-props))
+     ,(propertize "Hello World" 'font-lock-face `(,yellow-bg-props)))
     ("\e[93mHello World\e[0m"
-     ,(propertize "Hello World" 'font-lock-face bright-yellow-fg-props))
+     ,(propertize "Hello World" 'font-lock-face `(,bright-yellow-fg-props)))
     ("\e[103mHello World\e[0m"
-     ,(propertize "Hello World" 'font-lock-face bright-yellow-bg-props))
+     ,(propertize "Hello World" 'font-lock-face `(,bright-yellow-bg-props)))
     ("\e[1;33mHello World\e[0m"
      ,(propertize "Hello World" 'font-lock-face
-                  `(,yellow-fg-props :inherit term-bold))
+                  `(,yellow-fg-props term-bold))
      ,(propertize "Hello World" 'font-lock-face
-                  `(,bright-yellow-fg-props :inherit term-bold)))
+                  `(,bright-yellow-fg-props term-bold)))
     ("\e[33;1mHello World\e[0m"
      ,(propertize "Hello World" 'font-lock-face
-                  `(,yellow-fg-props :inherit term-bold))
+                  `(,yellow-fg-props term-bold))
      ,(propertize "Hello World" 'font-lock-face
-                  `(,bright-yellow-fg-props :inherit term-bold)))
+                  `(,bright-yellow-fg-props term-bold)))
     ("\e[1m\e[33mHello World\e[0m"
      ,(propertize "Hello World" 'font-lock-face
-                  `(,yellow-fg-props :inherit term-bold))
+                  `(,yellow-fg-props term-bold))
      ,(propertize "Hello World" 'font-lock-face
-                  `(,bright-yellow-fg-props :inherit term-bold)))
+                  `(,bright-yellow-fg-props term-bold)))
     ("\e[33m\e[1mHello World\e[0m"
      ,(propertize "Hello World" 'font-lock-face
-                  `(,yellow-fg-props :inherit term-bold))
+                  `(,yellow-fg-props term-bold))
      ,(propertize "Hello World" 'font-lock-face
-                  `(,bright-yellow-fg-props :inherit term-bold)))
+                  `(,bright-yellow-fg-props term-bold)))
     ("\e[38;5;3;1mHello World\e[0m"
      ,(propertize "Hello World" 'font-lock-face
-                  `(,yellow-fg-props :inherit term-bold))
+                  `(,yellow-fg-props term-bold))
      ,(propertize "Hello World" 'font-lock-face
-                  `(,bright-yellow-fg-props :inherit term-bold)))
+                  `(,bright-yellow-fg-props term-bold)))
     ("\e[38;5;123;1mHello World\e[0m"
      ,(propertize "Hello World" 'font-lock-face
-                  `(,custom-color-fg-props :inherit term-bold)))
+                  `(,custom-color-fg-props term-bold)))
     ("\e[38;2;135;255;255;1mHello World\e[0m"
      ,(propertize "Hello World" 'font-lock-face
-                  `(,custom-color-fg-props :inherit term-bold)))))
+                  `(,custom-color-fg-props term-bold)))))
 
 (defun term-test-screen-from-input (width height input &optional return-var)
   (with-temp-buffer



reply via email to

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