在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 color和How to color my vimgrep result patterns。前者似乎有相反的问题(即:!command
输出没有着色);后者没有任何替代方法可以下载到shell中,我认为这不是解决问题的“正确”方法。
答案 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}}颜色为文件名或亚麻布着色。)