Shell 编译模式下的ANSI着色

Shell 编译模式下的ANSI着色,shell,emacs,text-coloring,ansi-escape,compilationmode,Shell,Emacs,Text Coloring,Ansi Escape,Compilationmode,是否有人在编译模式Emacs中添加了对ansi颜色的支持?如果是这样,为了确保其活动终端支持ANSI转义着色,颜色写入程序必须检查什么属性/属性。已经有一个函数用于将颜色应用于comint缓冲区。您只需在编译缓冲区上启用它: (需要“ansi颜色”) (defun colorize编译缓冲区() (切换为只读) (ansi颜色应用于区域编译过滤器起点(点)) (切换为只读) (添加钩子“编译过滤器钩子”着色编译缓冲区) 颜色写入程序应检查TERM环境变量和terminfo数据库,以检查终端是否

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

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

(需要“ansi颜色”)
(defun colorize编译缓冲区()
(切换为只读)
(ansi颜色应用于区域编译过滤器起点(点))
(切换为只读)
(添加钩子“编译过滤器钩子”着色编译缓冲区)
颜色写入程序应检查
TERM
环境变量和terminfo数据库,以检查终端是否支持颜色。实际上,许多程序忽略了这一点,而依赖于用户设置。默认情况下,Emacs将编译终端类型设置为
dumb
,但可以通过设置
编译环境
变量来覆盖该类型


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

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

(忽略错误
(需要“ansi颜色”)
(取消我的彩色编译缓冲区()
(何时(eq主模式“编译模式”)
(ansi颜色应用于区域编译过滤器开始(最大点)))
(添加钩子“编译过滤器钩子”我的彩色编译缓冲区)
在@gavenkoa的:

这不会阻止错误,但如果ansi颜色不可用,仍不会引发错误。就我个人而言,我觉得
忽略错误的通配符捕获语义令人厌恶。

在@stribb上进行Riffing,在@gavenkoa上进行riffs,这是如何设置它的:

(使用ansi颜色的软件包
:config
(取消我的彩色编译缓冲区()
(何时(eq主模式“编译模式”)
(ansi颜色应用于区域编译过滤器开始(最大点)))
:hook(编译过滤器.my colorize编译缓冲区))

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


有关详细信息,请参阅。

它似乎不完全起作用。我用grep--color进行了测试,有时较大的区域会被着色,这是不应该的。Emacs似乎并不总是检测到禁用ANSI控制序列:(Nordl Ow,我已经修正了这个问题,并更新了这个帖子。这个函数试图对整个缓存进行着色,虽然它只过滤从进程溢出的块。虽然新版本更健壮和快,但是它仍然会被混淆,因为它不能保证,进程不会在中间胡中删除他的输出。转义序列。使用Emacs 24.5,似乎(切换只读)调用是不必要的。可能重复的I最初将始终看到“竞争模式下的ANSI着色”。谢谢!当我使用更像上面接受的答案的东西时,我的rgrep缓冲区显示为纯红色字体。您的版本对我来说工作得更好。使用emacs 24.3.50.1。谢谢,这似乎是一个更好的解决方案。使用
编译筛选器start
应该比在
(最小点)
(最大点)
每次都是如此。为了完成这项工作,我需要将编译环境变量设置为TERM=xterm-256color。标记的解决方案在2019年之前对我有效,但今天在我的设置中失败了:
ansi颜色名称向量
被忽略。我很感激存在替代解决方案。
(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))