编译模式下的ANSI着色

时间:2012-11-15 12:41:46

标签: shell emacs text-coloring ansi-escape compilationmode

有没有人在编译模式Emacs中添加对ansi-color的支持?如果是这样,颜色编写程序必须检查什么属性/属性,以确保其活动终端支持ANSI-escape着色。

5 个答案:

答案 0 :(得分:53)

已经有一个将颜色应用于comint缓冲区的功能。您只需要在编译缓冲区上启用它:

(require 'ansi-color)
(defun colorize-compilation-buffer ()
  (toggle-read-only)
  (ansi-color-apply-on-region compilation-filter-start (point))
  (toggle-read-only))
(add-hook 'compilation-filter-hook 'colorize-compilation-buffer)

颜色编写程序应检查TERM环境变量和terminfo数据库,以检查终端是否支持颜色。在实践中,许多程序忽略了这一点,并依赖于用户设置。默认情况下,Emacs会将编译终端类型设置为dumb,但可以通过设置compilation-environment变量来覆盖它。

更新:请注意,在Emacs 24.5中,不需要在上面的代码中调用(toggle-read-only)两次。

答案 1 :(得分:28)

我的优化解决方案不会污染M-x grep(仅适用于M-x compile):

(ignore-errors
  (require 'ansi-color)
  (defun my-colorize-compilation-buffer ()
    (when (eq major-mode 'compilation-mode)
      (ansi-color-apply-on-region compilation-filter-start (point-max))))
  (add-hook 'compilation-filter-hook 'my-colorize-compilation-buffer))

答案 2 :(得分:3)

在@stribb的solution上乱跳,然后在@gavenkoa的solution上乱跳,这就是如何通过出色的use-package来设置它:

(use-package ansi-color
  :config
  (defun my-colorize-compilation-buffer ()
    (when (eq major-mode 'compilation-mode)
      (ansi-color-apply-on-region compilation-filter-start (point-max))))
  :hook (compilation-filter . my-colorize-compilation-buffer))

答案 3 :(得分:3)

截至2020年,最现代的方式似乎是xterm-color Emacs软件包。

有关详细信息,请参见my answer on the duplicate question

答案 4 :(得分:0)

@gavenkoa的solution横行:

(when (require 'ansi-color nil t)
  (defun my-colorize-compilation-buffer ()
    (when (eq major-mode 'compilation-mode)
      (ansi-color-apply-on-region compilation-filter-start (point-max))))
  (add-hook 'compilation-filter-hook 'my-colorize-compilation-buffer))

这将不会阻止错误,但是如果ansi-color不可用,也不会引发错误。就个人而言,我发现ignore-error的通配符捕获语义令人反感。