26

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

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

我已经阅读了以彩色打印的 VIM Unix 命令以及How to color my vimgrep result patterns。前者似乎有相反的问题(即:!command输出未着色);后者除了下降到外壳之外别无选择,我认为这不是解决该问题的“正确”解决方案。

4

2 回答 2

24

问题是,当 Vim 通过:makeor运行其他命令时:grep,这些命令没有为它们的标准输出获得终端——从某种意义上说,对它们来说isatty (STDOUT_FILENO) 是错误的——因为 Vim 正在捕获输出到显示在终端上。另一方面,当您使用:!makeor:!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强制着色或更灵活地添加一个额外的变量,当在 Vim$(CC)中运行时将覆盖该变量::make

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

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

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

于 2012-10-07T19:09:59.373 回答
0

当您运行:grepor :make(与:!grepor相对:!make)时,输出不仅显示在终端中,而且还发送到处理它的快速修复窗口。您可以使用 vim-command 访问快速修复窗口:copen。快速修复窗口本质上是一个以只读模式打开的文本文件。与任何其他文本文件一样,快速修复文件不支持颜色。相反,它们用转义字符表示,例如[01;34m. make因此,从(or )生成彩色输出grep会弄乱输出,因为它显示在快速修复窗口中,即使您可以让 vim 处理它,并将光标发送到选定的错误/警告/查找消息。

现在输出是否着色的问题变得有点微妙:我建议终端输出应该保持不着色,但快速修复输出应该着色。快速修复窗口中的配色方案不是由文件本身中的任何颜色指示定义的,而是在文件(在我的计算机上) 中定义的快速修复窗口的语法突出显示中。中定义的配色方案不会为快速修复窗口添加太多颜色,但可以通过创建文件来扩展语法高亮方案。我与和/或编译器结合使用 ,并通过以下内容获得漂亮的结果 :qf.vim/usr/share/vim/vim81/syntax/qf.vimqf.vim~/.vim/syntax/after/qf.vimcmakegnuintel~/.vim/syntax/after/qf.vim

syn match qBuilt            "Built target *" nextgroup=qTarget
syn match qTarget           ".*$"   contained

syn match qEnteringLeaving  ": \(Entering\|Leaving\) directory *" nextgroup=qdSeparator
syn match qdSeparator       "'"     nextgroup=qdName contained
syn match qdName            "[^']*" contained

syn match qbProgress        "\[ *[0-9]*%\]"
syn match qBuild            "Building .* object"
syn match qWarn             "warning\( *#[0-9]*\|\):"
syn match qError            "error\( *#[0-9]*\|\):"
syn match qRemark           "remark\( *#[0-9]*\|\):"

hi def link qTarget          Constant
hi def link qError           Error
hi def link qWarn            Error
hi def link qRemark          WarningMsg
hi def link qEnteringLeaving Keyword
hi def link qBuild           Keyword
hi def link qBuilt           Keyword
hi def link qdName           Include
hi def link qbProgress       Special
于 2022-02-20T13:47:48.763 回答