Subject: Re: bug#12792: 24.2.50; shell-mode renders all its output in a yellow face

From: Dima Kogan <[email-masked]>
Date: Sun, 4 Nov 2012 00:45:57 -0700

> On Sun, 04 Nov 2012 04:27:35 +0100
> Wolfgang Jenkner <[email-masked]> wrote:
>
> On Sat, Nov 03 2012, Wolfgang Jenkner wrote:
> 
> > On Sat, Nov 03 2012, Eli Zaretskii wrote:
> 
> >> SGR parameter 39 means go back to the default foreground color.  How
> >> can ansi-color not support it and still be useful?
> 
> > I'll fix this omission if nobody beats me to it.
> 
> Here's a rewrite of `ansi-color-apply-sequence' which implements SGR
> codes 39 and 49.  It's straightforward but, sadly, uses side-effects all
> over the place.  At this point, however, I'd just like to know if its
> behaviour meets everybody's expectations, so please test it a bit.
> 
> Wolfgang
> 
> (defun ansi-color-apply-sequence (escape-sequence codes)
>   "Apply ESCAPE-SEQ to CODES and return the new list of codes.
> 
> ESCAPE-SEQ is an escape sequence parsed by `ansi-color-parse-sequence'.
> 
> 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))
> 	(fg (and codes (>= (car codes) 30) (<= (car codes) 37)
> 		 (pop codes)))
> 	(bg (and codes (>= (car codes) 40) (<= (car codes) 47)
> 		 (pop codes))))
>     (while new-codes
>       (let ((new (pop new-codes)))
> 	(cond ((and (>= new 1) (<= new 7))
> 	       (unless (memq new codes)
> 		 (push new codes)))
> 	      ((and (= new 22)
> 		    (setq codes (remq 1 codes))
> 		    nil))
> 	      ((and (= new 25)
> 		    (setq codes (remq 6 codes))
> 		    nil))
> 	      ;; The standard says `21 doubly underlined' while
> 	      ;; http://en.wikipedia.org/wiki/ANSI_escape_code claims
> 	      ;; `21 Bright/Bold: off or Underline: Double'.
> 	      ((and (>= new 21) (<= new 27) (/= new 26))
> 	       (setq codes (remq (- new 20) codes)))
> 	      ((and (>= new 30) (<= new 37))
> 	       (setq fg new))
> 	      ((= new 39)
> 	       (setq fg nil))
> 	      ((and (>= new 40) (<= new 47))
> 	       (setq bg new))
> 	      ((= new 49)
> 	       (setq bg nil))
> 	      (t
> 	       (setq codes nil fg nil bg nil)))))
>     (when bg
>       (push bg codes))
>     (when fg
>       (push fg codes))
>     codes))

I ran a test:

1. I start an 'emacs -Q' with the latest ansi-colors.el
2. I evaluate the defun you pasted
3. M-x shell
4. I run some commands in the shell

Results:

1. The prompt is still not colored at all even though it should be.

2. Everything is still yellow with a 'nil' face UNTIL something with ansi color
   codes is encountered. At that point correct coloring resumes, except for the
   prompt. The prompt also doesn't count as encountering ansi colors.

Are you not able to reproduce this? My setup isn't particularly special.