In Shell mode, reapply ansi colorization if the mode is re-enabled.
authorChong Yidong <cyd@gnu.org>
Fri, 30 Nov 2012 08:24:53 +0000 (16:24 +0800)
committerChong Yidong <cyd@gnu.org>
Fri, 30 Nov 2012 08:24:53 +0000 (16:24 +0800)
* shell.el (shell-apply-ansi-color, shell-reapply-ansi-color): New functions.
(shell-mode): Use them to reapply ansi colorization if Shell mode is re-enabled.

lisp/ChangeLog
lisp/shell.el

index 4a128e1..7f90812 100644 (file)
@@ -2,6 +2,9 @@
 
        * shell.el (shell): For C-u M-x shell, use an inactive shell
        buffer as the default (Bug#1975).
+       (shell-apply-ansi-color, shell-reapply-ansi-color): New functions.
+       (shell-mode): Use them to reapply ansi colorization if Shell mode
+       is re-enabled.
 
 2012-11-30  Yuriy Vostrikov  <delamonpansie@gmail.com>  (tiny change)
 
index 3827331..fc8f3df 100644 (file)
@@ -561,10 +561,8 @@ buffer."
   ;; very inefficient in Shell buffers (e.g. Bug#10835).  We use a
   ;; custom `ansi-color-apply-face-function' to convert color escape
   ;; sequences into `font-lock-face' properties.
-  (set (make-local-variable 'ansi-color-apply-face-function)
-       (lambda (beg end face)
-        (when face
-          (put-text-property beg end 'font-lock-face face))))
+  (setq-local ansi-color-apply-face-function #'shell-apply-ansi-color)
+  (shell-reapply-ansi-color)
 
   ;; This is not really correct, since the shell buffer does not really
   ;; edit this directory.  But it is useful in the buffer list and menus.
@@ -603,6 +601,27 @@ buffer."
                   'shell-filter-ctrl-a-ctrl-b nil t)))
     (comint-read-input-ring t)))
 
+(defun shell-apply-ansi-color (beg end face)
+  "Apply FACE as the ansi-color face for the text between BEG and END."
+  (when face
+    (put-text-property beg end 'ansi-color-face face)
+    (put-text-property beg end 'font-lock-face face)))
+
+(defun shell-reapply-ansi-color ()
+  "Reapply ansi-color faces to the existing contents of the buffer."
+  (save-restriction
+    (widen)
+    (let* ((pos (point-min))
+          (end (or (next-single-property-change pos 'ansi-color-face)
+                   (point-max)))
+          face)
+      (while end
+       (if (setq face (get-text-property pos 'ansi-color-face))
+           (put-text-property pos (or end (point-max))
+                              'font-lock-face face))
+       (setq pos end
+             end (next-single-property-change pos 'ansi-color-face))))))
+
 (defun shell-filter-ctrl-a-ctrl-b (string)
   "Remove `^A' and `^B' characters from comint output.