【问题标题】:Colorizing the output of :make, :grep, etc., in Vim在 Vim 中为 :make、:grep 等的输出着色
【发布时间】:2026-02-24 06:30:02
【问题描述】:

在 Vim 中使用 :make 命令构建我的应用程序时,输出没有着色。我已将 makefile 配置为使用 clang 作为 C 编译器,并且当在 Vim 之外运行 make 或运行 :!make 时,clang 的输出是彩色的。 :set makeprg返回makeprg=make,仅供参考。

grep 也有同样的问题:运行:grep 时,输出未着色;运行:!grep 时,它是。我曾尝试将--color 选项与:grep 一起使用,但无济于事。 :set grepprg 返回grepprg=grep -n $* /dev/null

我已经阅读了VIM Unix commands printed in colorHow to color my vimgrep result patterns。前者似乎有相反的问题(即:!command 输出未着色);后者除了下降到 shell 之外别无选择,我认为这不是解决问题的“正确”方法。

【问题讨论】:

  • --color 添加到grepprg 会破坏:grep,在这里,我不确定如何安全地将其包含在参数中。在 CLI Vim 中,:!grep foo *:grep foo * “下拉到 shell”。你对:make 做了什么?
  • :!grep foo * 有彩色输出吗?据我所见,没有为clang 输出着色的选项,我计划在今天晚些时候通过将colorgcc 设置为我的makeprg 来进行一些测试,所以我将添加评论结果。我确实尝试将makeprg 设置为echo\ -e\ \"\\033[32m\ Hello\ World\" 以查看它是否会被着色,它是/was/,这很有趣。

标签: vim makefile grep vi


【解决方案1】:

问题在于,当 Vim 通过 :make:grep 运行其他命令时,这些命令没有获得标准输出的终端——从某种意义上说,isatty(STDOUT_FILENO) 是错误的—— - 因为 Vim 正在捕获输出以显示在终端上。另一方面,当您使用:!make:!grep 时,标准输出 只是到终端。

默认情况下 Clang 和 grep --color=auto (这可能是你的别名)使用 stdout 的终端性来决定是否对它们的输出进行着色。这很方便,因为您可以在终端上获得彩色输出,但在将输出重定向到文件时仅捕获文本——所有这些都无需添加额外的命令行选项。

因此,您要做的是覆盖这些命令的常用智能,以便它们始终为输出着色。

对于grep,在Vim 中通过:grep 运行时可以使用--color=always

:set grepprg=grep\ --color=always\ -n\ $*\ /dev/null

根据您的颜色设置和grep 的版本,这将足够好。

对于 clang,您可以将 Makefile 更改为使用 clang -fcolor-diagnostics 以便使用 force colourisation 或更灵活地向 $(CC) 添加一个额外的变量,该变量将在 Vim 中通过 :make 运行时被覆盖:

:set makeprg=make\ EXTRA_CFLAGS=-fcolor-diagnostic

但是(至少对于 clang 3.0 和 vim 7.3)你会发现 clang 的着色风格会阻止 Vim 从诊断中挑选出文件名和行号,所以这样做会破坏使用 :make 而不是 @987654338 的优势@。

您可以通过在 Vim 的 errorformat 选项中添加更多条目以匹配彩色化的 clang 样式诊断,来教 Vim 从周围的 ANSI 转义序列中挑选文件名等进行着色。 (与grepformat 类似,如果您的grep 着色为文件名或行号着色。)

【讨论】:

  • 谢谢,这非常完美!我最初在您编辑之前看到了这一点,并且想到了与您相同的事情。我将看看是否可以提出一个有效的errorformat 选项,并看看我是否可以将其添加到此答案中,因为它可能对其他人有所帮助。
  • @welp,如果你使用:cw,那么 vim 会在 Quickfix 窗口中对结果进行自己的着色。这是否足够,或者我错过了什么