From 276479fd709a6da85bbc6b267264db5c5a570f4e Mon Sep 17 00:00:00 2001 From: Chong Yidong Date: Fri, 30 Nov 2012 16:24:53 +0800 Subject: [PATCH] In Shell mode, reapply ansi colorization if the mode is re-enabled. * 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 | 3 +++ lisp/shell.el | 27 +++++++++++++++++++++++---- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 4a128e10925..7f908129afa 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -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 (tiny change) diff --git a/lisp/shell.el b/lisp/shell.el index 38273311b61..fc8f3dfb940 100644 --- a/lisp/shell.el +++ b/lisp/shell.el @@ -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. -- 2.39.5