GNU bug report logs -
#12792
24.2.50; shell-mode renders all its output in a yellow face
Previous Next
Reported by: Dima Kogan <dima <at> secretsauce.net>
Date: Sat, 3 Nov 2012 08:59:02 UTC
Severity: normal
Tags: patch
Found in version 24.2.50
Done: Paul Eggert <eggert <at> cs.ucla.edu>
Bug is archived. No further changes may be made.
Full log
View this message in rfc822 format
On Tue, Nov 06 2012, Dima Kogan wrote:
>> So, I'd say that the issue at hand is solved. I'll just try to
>> rewrite the new ansi-color-apply-sequence in a less ugly way.
>
> Sounds good. Thanks a lot.
I hope the patch below is less ugly and also correct. Perhaps you could
try it.
Note to the maintainers: This fixes a regression for a feature not
actually present in previous versions of emacs ;-)
2012-11-08 Wolfgang Jenkner <wjenkner <at> inode.at>
* ansi-color.el (ansi-color-apply-sequence): Implement SGR codes
39 and 49 (bug#12792). Also, restore the behavior of revisions
prior to 109621, where unimplemented codes are treated like code 0.
=== modified file 'lisp/ansi-color.el'
--- lisp/ansi-color.el 2012-09-25 04:13:02 +0000
+++ lisp/ansi-color.el 2012-11-09 00:19:00 +0000
@@ -534,34 +534,39 @@
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 ()
This bug report was last modified 12 years and 248 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.