在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 没有任何选择,我认为这不是对该问题的“正确”修复。
最佳答案
问题是,当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)
添加一个额外的变量,当通过Vim中的:make
运行时,该变量将被覆盖::set makeprg=make\ EXTRA_CFLAGS=-fcolor-diagnostic
但是(至少使用clang 3.0和vim 7.3),您会发现clang的颜色样式阻止Vim从诊断程序中选择文件名和行号,因此这样做破坏了使用
:make
而不是:!make
的优势。您可以通过在Vim的
errorformat
选项中添加更多条目以匹配彩色的clang风格的诊断程序,使Vim从周围的ANSI转义序列中选择要进行着色的文件名等。 (如果grepformat
的颜色是文件名或行号的颜色,则类似grep
。)关于vim - 在Vim中为:make,:grep等的输出着色,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12764999/