Subject: bug#7485: 23.2; Fix removing unrecognized ANSI sequences in ansi-color-apply

From: Leo <[email-masked]>
Date: Fri, 26 Nov 2010 14:48:20 +0000

In ansi-color-apply, (string-match "\033" string start) finds the wrong
portion of context if unrecognized ANSI sequences is not removed before
the match.

This can cause, for example, eshell's prompt to disappear if
ansi-color-apply is used in eshell-preoutput-filter-functions. The
attached patch tries to fix this.

Leo

diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 146c6c9..8d5cbe1 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,8 @@
+2010-11-26  Leo <[email-masked]>
+
+	* ansi-color.el (ansi-color-apply): Also eliminate unrecognized
+	ANSI sequences for remaining string.
+
 2010-10-03  Chong Yidong  <[email-masked]>
 
 	* minibuffer.el (completion--some, completion--do-completion)
diff --git a/lisp/ansi-color.el b/lisp/ansi-color.el
index 00162c9..40c0066 100644
--- a/lisp/ansi-color.el
+++ b/lisp/ansi-color.el
@@ -341,12 +341,15 @@ See `ansi-color-unfontify-region' for a way around this."
       (put-text-property start (length string) 'ansi-color t string)
       (put-text-property start (length string) 'face face string))
     ;; save context, add the remainder of the string to the result
-    (let (fragment)
-      (if (string-match "\033" string start)
+    (let ((remaining (substring string start))
+	  fragment)
+      (while (string-match ansi-color-drop-regexp remaining)
+	(setq remaining (replace-match "" nil nil remaining)))
+      (if (string-match "\033" remaining)
 	  (let ((pos (match-beginning 0)))
-	    (setq fragment (substring string pos))
-	    (push (substring string start pos) result))
-	(push (substring string start) result))
+	    (setq fragment (substring remaining pos))
+	    (push (substring remaining 0 pos) result))
+	(push remaining result))
       (if (or face fragment)
 	  (setq ansi-color-context (list face fragment))
 	(setq ansi-color-context nil)))