编译模式下的ANSI着色

Nor*_*löw 35 emacs shell ansi-escape text-coloring compilationmode

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

ata*_*lor 56

已经有一个将颜色应用于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)
Run Code Online (Sandbox Code Playgroud)

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

  • 使用Emacs 24.5,似乎(切换只读)调用是不必要的。 (3认同)
  • @Nordlöw,我已经解决了这个问题,并更新了帖子。该函数试图为整个缓冲区着色,尽管它应该只过滤从进程溢出的块。尽管新版本更加健壮和快速,但它仍然可能令人困惑,因为不能保证进程不会在转义序列中间切断他的输出。 (2认同)

gav*_*koa 29

我的优化解决方案,不污染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))
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这似乎是一个更好的解决方案.使用`compilation-filter-start`应该比每次重复着色`(point-min)`和`(point-max)`之间的所有内容更有效. (2认同)
  • 为了完成这项工作,我需要将编译环境变量设置为TERM = xterm-256color. (2认同)

小智 15

从 emacs 28.1 开始,它现在是内置的 !

(require 'ansi-color)
(add-hook 'compilation-filter-hook 'ansi-color-compilation-filter)
Run Code Online (Sandbox Code Playgroud)

或者使用 use-package

(use-package ansi-color
    :hook (compilation-filter . ansi-color-compilation-filter)) 
Run Code Online (Sandbox Code Playgroud)


Ada*_*ers 8

重复@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))
Run Code Online (Sandbox Code Playgroud)


小智 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))
Run Code Online (Sandbox Code Playgroud)

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