lisp/ansi-color.el (ansi-color-apply-sequence): Implement SGR codes 39 and 49.

This fixes bug#12792.  Also, treat unimplemented parameters as 0,
thereby restoring the behavior of revisions prior to 2012-08-15T03:33:55Z!monnier@iro.umontreal.ca.
This commit is contained in:
Wolfgang Jenkner 2012-11-12 18:12:33 +01:00
parent 237b565357
commit 9db94175de
2 changed files with 38 additions and 26 deletions

View file

@ -1,3 +1,10 @@
2012-11-12 Wolfgang Jenkner <wjenkner@inode.at>
* ansi-color.el (ansi-color-apply-sequence): Implement SGR codes
39 and 49. This fixes bug#12792. Also, treat unimplemented
parameters as 0, thereby restoring the behavior of revisions prior
to 2012-08-15T03:33:55Z!monnier@iro.umontreal.ca.
2012-11-12 Fabián Ezequiel Gallina <fgallina@cuca>
Fix end-of-defun misbehavior.

View file

@ -534,34 +534,39 @@ Returns nil only if there's no match for `ansi-color-parameter-regexp'."
ESCAPE-SEQ is an escape sequence parsed by `ansi-color-parse-sequence'.
If the new codes resulting from ESCAPE-SEQ start with 0, then the
old codes are discarded and the remaining new codes are
processed. Otherwise, for each new code: if it is 21-25 or 27-29
delete appropriate parameters from the list of codes; any other
code that makes sense is added to the list of codes. Finally,
the so changed list of codes is returned."
For each new code, the following happens: if it is 1-7, add it to
the list of codes; if it is 21-25 or 27, delete appropriate
parameters from the list of codes; if it is 30-37 resp. 39, the
foreground color code is replaced or added resp. deleted; if it
is 40-47 resp. 49, the background color code is replaced or added
resp. deleted; any other code is discarded together with the old
codes. Finally, the so changed list of codes is returned."
(let ((new-codes (ansi-color-parse-sequence escape-sequence)))
(while new-codes
(setq codes
(let ((new (pop new-codes)))
(cond ((zerop new)
nil)
((or (<= new 20)
(>= new 30))
(if (memq new codes)
codes
(cons new codes)))
;; The standard says `21 doubly underlined' while
;; http://en.wikipedia.org/wiki/ANSI_escape_code claims
;; `21 Bright/Bold: off or Underline: Double'.
((/= new 26)
(remq (- new 20)
(cond ((= new 22)
(remq 1 codes))
((= new 25)
(remq 6 codes))
(t codes))))
(t codes)))))
(let* ((new (pop new-codes))
(q (/ new 10)))
(setq codes
(pcase q
(0 (unless (memq new '(0 8 9))
(cons new (remq new codes))))
(2 (unless (memq new '(20 26 28 29))
;; The standard says `21 doubly underlined' while
;; http://en.wikipedia.org/wiki/ANSI_escape_code claims
;; `21 Bright/Bold: off or Underline: Double'.
(remq (- new 20) (pcase new
(22 (remq 1 codes))
(25 (remq 6 codes))
(_ codes)))))
((or 3 4) (let ((r (mod new 10)))
(unless (= r 8)
(let (beg)
(while (and codes (/= q (/ (car codes) 10)))
(push (pop codes) beg))
(setq codes (nconc (nreverse beg) (cdr codes)))
(if (= r 9)
codes
(cons new codes))))))
(_ nil)))))
codes))
(defun ansi-color-make-color-map ()