在Vim中着色输出:make,:grep等

时间:2012-10-07 00:11:40

标签: vim makefile grep vi

在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中,我认为这不是解决问题的“正确”方法。

1 个答案:

答案 0 :(得分:20)

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

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

所以你要做的就是覆盖这些命令的常用智能,以便它们始终对其输出进行着色。

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

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

并且根据您的颜色设置和grep的版本,这将运作良好。

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

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

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

您可以通过向Vim的grepformat选项添加更多条目以匹配彩色铿锵式诊断来教导Vim从周围的ANSI转义序列中选择文件名等来进行着色。 (与grep类似,如果您的{{1}}颜色为文件名或亚麻布着色。)