46

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

4

5 回答 5

71

已经有一个将颜色应用于 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)中,不需要上述代码中的两个调用。

于 2012-11-15T23:23:58.430 回答
34

我优化的不污染解决方案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))
于 2013-12-26T17:19:31.893 回答
7

对@gavenkoa 的解决方案进行评论:

(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令人反感。

于 2019-03-07T13:06:48.290 回答
4

重复@stribb 的解决方案,即重复@gavenkoa 的解决方案,这是使用令人敬畏的使用包进行设置的方法:

(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))
于 2020-06-09T12:05:18.467 回答
3

截至 2020 年,最现代的方式似乎是xterm-colorEmacs 包。

有关详细信息,请参阅我对重复问题的回答。

于 2020-09-02T18:23:06.553 回答