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

wel*_*elp 23 vi vim grep makefile

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

我有同样的问题grep:运行时:grep,输出没有着色; 在跑步时:!grep,它是.我尝试过使用该--color选项:grep,但无济于事.:set grepprg回报grepprg=grep -n $* /dev/null.

我已经阅读了用彩色打印的VIM Unix命令以及如何为我的vimgrep结果模式着色.前者似乎有相反的问题(即:!command输出没有着色); 后者没有任何替代方法可以下载到shell,我觉得这个问题不是"正确"的解决方案.

Joh*_*all 20

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

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

所以你想要做的就是覆盖这些命令的常用智能,这样它们总能让它们的输出变色.

因为grep,你可以在Vim中--color=always运行它时使用:grep:

:set grepprg=grep\ --color=always\ -n\ $*\ /dev/null
Run Code Online (Sandbox Code Playgroud)

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

对于铛,你可以改变你的Makefile使用clang -fcolor-diagnostics,以迫使colourisation或更灵活地添加一个额外的变量$(CC)时,通过运行,将被覆盖:make的Vim内:

:set makeprg=make\ EXTRA_CFLAGS=-fcolor-diagnostic
Run Code Online (Sandbox Code Playgroud)

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

你可以教Vim从周围的ANSI转义序列中挑选出文件名等,通过在Vim errorformat选项中添加更多条目以匹配彩色铿锵式诊断来进行颜色化.(同样,grepformat如果您的grep颜色为文件名或亚麻布着色.)