【问题标题】:ANSI Coloring in Compilation Mode编译模式下的 ANSI 着色
【发布时间】:2012-11-04 01:34:27
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

已经有一个函数可以将颜色应用于 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) 的两次调用是不需要的。

【讨论】:

  • 它似乎没有完全工作。我用grep --color 进行了测试,有时较大的区域会被着色,这是不应该的。似乎 Emacs 并不总是检测到禁用 ANSI 控制序列:(
  • @Nordlöw,我已经解决了这个问题,并更新了帖子。该函数试图为整个缓冲区着色,尽管它应该只过滤从进程中溢出的块。尽管新版本更加健壮和快速,但它仍然会让人感到困惑,因为不能保证进程不会在转义序列的中间切断他的输出。
  • 使用 Emacs 24.5,似乎不需要 (toggle-read-only) 调用。
  • 在 emacs 27.2 中,调用 (ansi-color-apply-on-region compilation-filter-start (point)) 似乎不可避免地会导致“标记没有指向任何地方”错误。
【解决方案2】:

我的优化解决方案不污染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))

【讨论】:

  • 谢谢!当我使用更像上面接受的答案的东西时,我的 rgrep 缓冲区以纯红色字体显示。你的版本对我来说效果更好。使用 emacs 24.3.50.1。
  • 谢谢,这似乎是一个更好的解决方案。使用compilation-filter-start 应该比每次在(point-min)(point-max) 之间重新着色更有效。
  • 为了完成这项工作,我需要将编译环境变量设置为 TERM=xterm-256color。
【解决方案3】:

在@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 的通配符捕获语义令人反感。

【讨论】:

    【解决方案4】:

    在@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))
    

    【讨论】:

      【解决方案5】:

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

      详情请见my answer on the duplicate question

      【讨论】:

      • 标记的解决方案在 2019 年之前对我有用,但它今天破坏了我的设置:ansi-color-names-vector 只是被忽略了。我很感激存在替代解决方案。
      猜你喜欢
      • 2013-05-21
      • 2022-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多