【问题标题】:Vim errorformat for Visual StudioVisual Studio 的 Vim 错误格式
【发布时间】:2010-09-11 04:54:45
【问题描述】:

我想将 Vim 的 quickfix 功能与 Visual Studio 的 devenv 构建过程或 msbuild 的输出一起使用。

我创建了一个名为 build.bat 的批处理文件,它像这样执行 devenv 构建:

devenv MySln.sln /Build Debug

在 vim 中,我已将 :make 命令指向该批处理文件:

:set makeprg=build.bat

当我现在运行 :make 时,构建成功执行,但是错误没有被解析出来。因此,如果我运行 :cl 或 :cn,我最终会看到 devenv /Build 的所有输出。我应该只看到错误。

我尝试了许多不同的错误格式设置,这些设置在网络上的各个站点上都找到了,但没有一个能够正确解析出错误。以下是我尝试过的一些:

set errorformat=%*\\d>%f(%l)\ :\ %t%[A-z]%#\ %m
set errorformat=\ %#%f(%l)\ :\ %#%t%[A-z]%#\ %m
set errorformat=%f(%l,%c):\ error\ %n:\ %f

当然我也试过 Vim 的默认设置。

以下是 build.bat 的一些示例输出:

C:\TFS\KwB Projects\Thingy>devenv Thingy.sln /Build Debug 

Microsoft (R) Visual Studio Version 9.0.30729.1.
Copyright (C) Microsoft Corp. All rights reserved.
------ Build started: Project: Thingy, Configuration: Debug Any CPU ------
c:\WINDOWS\Microsoft.NET\Framework\v3.5\Csc.exe /noconfig /nowarn:1701,1702 /errorreport:prompt /warn:4 /define:DEBUG;TRACE /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\PresentationCore.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\PresentationFramework.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Data.DataSetExtensions.dll" /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Data.Linq.dll" /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Xml.Linq.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\UIAutomationProvider.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\WindowsBase.dll" /debug+ /debug:full /filealign:512 /optimize- /out:obj\Debug\Thingy.exe /resource:obj\Debug\Thingy.g.resources /resource:obj\Debug\Thingy.Properties.Resources.resources /target:winexe App.xaml.cs Controller\FieldFactory.cs Controller\UserInfo.cs Data\ThingGatewaySqlDirect.cs Data\ThingListFetcher.cs Data\UserListFetcher.cs Gui\FieldList.xaml.cs Interfaces\IList.cs Interfaces\IListFetcher.cs Model\ComboBoxField.cs Model\ListValue.cs Model\ThingType.cs Interfaces\IThingGateway.cs Model\Field.cs Model\TextBoxField.cs Model\Thing.cs Gui\MainWindow.xaml.cs Gui\ThingWindow.xaml.cs Interfaces\IField.cs Properties\AssemblyInfo.cs Properties\Resources.Designer.cs Properties\Settings.Designer.cs RequiredValidation.cs "C:\TFS\KwB Projects\Thingy\Thingy\obj\Debug\Gui\FieldList.g.cs" "C:\TFS\KwB Projects\Thingy\Thingy\obj\Debug\Gui\MainWindow.g.cs" "C:\TFS\KwB Projects\Thingy\Thingy\obj\Debug\Gui\ThingWindow.g.cs" "C:\TFS\KwB Projects\Thingy\Thingy\obj\Debug\App.g.cs" "C:\TFS\KwB Projects\Thingy\Thingy\obj\Debug\GeneratedInternalTypeHelper.g.cs"
C:\TFS\KwB Projects\Thingy\Thingy\Controller\FieldFactory.cs(14,19): error CS0246: The type or namespace name 'IFieldNothing' could not be found (are you missing a using directive or an assembly reference?)

Compile complete -- 1 errors, 0 warnings
========== Build: 0 succeeded or up-to-date, 1 failed, 0 skipped ==========

更新: 看起来使用 msbuild 而不是 devenv 可能是正确的方法(根据 Jay 的评论)。

使用 msbuild,makeprg 将是:

:set makeprg=msbuild\ /nologo\ /v:q

样本输出应该是:

Controller\FieldFactory.cs(14,19): error CS0246: The type or namespace name 'IFieldNothing' could not be found (are you missing a using directive or an assembly reference?)

这里看起来棘手的部分可能在于路径是相对于 .csproj 文件的,而不是相对于 .sln 文件的事实,后者是 Vim 中的当前目录并且位于 .csproj 文件上方的一个目录。

回答: 我想通了……

set errorformat=\ %#%f(%l\\\,%c):\ %m

这将捕获 devenv /Build 和 msbuild 的输出。 但是,msbuild 有一个问题。默认情况下,它的输出不包括完整路径。要解决此问题,您必须将以下行添加到您的 csproj 文件的主 PropertyGroup:

<GenerateFullPaths>True</GenerateFullPaths>

【问题讨论】:

  • 对于我们这些不使用 VS2k8 的人来说,一些错误输出会很有用。

标签: visual-studio vim errorformat


【解决方案1】:

我有一篇博文介绍了在 Vim 中构建 C# 项目的所有细节,包括错误格式。你可以在这里找到它:http://kevin-berridge.blogspot.com/2008/09/vim-c-compiling.html

简而言之,您需要以下内容:

:set errorformat=\ %#%f(%l\\\,%c):\ %m
:set makeprg=msbuild\ /nologo\ /v:q\ /property:GenerateFullPaths=true

【讨论】:

  • 这也适用于 .net 核心,即:dotnet build
  • 这些设置加上vim-dimpatch 效果很好。
【解决方案2】:

正如 Simon Buchan 提到的,您可以在项目中使用它来生成输出中的完整路径:

<GenerateFullPaths>True</GenerateFullPaths>

但是您可以通过将/property:GenerateFullPaths=true 添加到您的makeprg 而不是将上述内容添加到您的项目文件中来使其更便携。

:set makeprg=msbuild\ /nologo\ /v:q\ /property:GenerateFullPaths=true\

【讨论】:

    【解决方案3】:

    这些错误格式在 Visual Studio 2009 v9.0.21022.8 专业版中均无效。使用 cygwin,必须从 bash 调用 devenv,这使得设置 makeprg 有点棘手(拧批处理文件)。当 devenv 拆分为多个进程并使用“1>”或“2>”等进行错误消息时,还必须调整我的错误格式:

    set autowrite
    "2>c:\cygwin\home\user\proj/blah.cpp(1657) : error C2065: 'blah' : undeclared identifier
    
    set errorformat=%.%#>\ %#%f(%l)\ :\ %#%t%[A-z]%#\ %[A-Z\ ]%#%n:\ %m
    let prg="devenv"
    let makepath=$MAKEPATH
    let &makeprg='cmd /c "'.prg.' '.makepath.'"'
    

    我的 .bashrc 使用 cygpath 设置 MAKEPATH 环境变量以转换为 DOS 兼容路径:

    export MAKEPATH="$(cygpath -d "proj/VC9/some.sln") /build \"Debug\""
    

    如果你有 vim 6.x,你可以使用:cw,它比 clist 好得多(尝试在数百个警告中搜索错误,你就会明白我的意思)。看着 vim 的调整让我想呕吐,但我在 vim 天堂!!!再见视觉工作室!感谢基础调整 pydave +1。

    【讨论】:

      【解决方案4】:

      我找到了一个更好的答案:使用:compiler 来使用内置的efm 设置。

      " Microsoft C#
      compiler cs
      " Microsoft Visual C++
      compiler msvc
      " mono
      compiler mcs
      " gcc
      compiler gcc
      

      注意:它还设置了默认的makeprg。见 $VIMRUNTIME/compiler/

      【讨论】:

        【解决方案5】:

        我在查找在 Visual Studio 中编译 c++ 的错误格式时发现了这个问题。上面的答案对我不起作用(我也没有使用 MSBuild)。

        我从this Vim Tip:help errorformat 发现了这一点:

        " filename(line) : error|warning|fatal error C0000: message
        set errorformat=\ %#%f(%l)\ :\ %#%t%[A-z]%#\ %[A-Z\ ]%#%n:\ %m
        

        这将为您提供如下所示的快速修复:

        stats.cpp|604 error 2039| 'getMedian' : is not a member of 'Stats'
        

        (突出显示错误)来自

        c:\p4\main\stats.cpp(604) : error C2039: 'getMedian' : is not a member of 'Stats'
        

        【讨论】:

        • 令人沮丧的是,我可以很容易地找到 gcc、jikes 和 javac 的语法 [在一些随机的 vimrc 中][1]。呃,好吧。遗忘是我们这些可怜的 VS C++ 程序员的命运。 [1]:fleiner.com/vim/syntax/myvimrc
        【解决方案6】:

        从问题中复制以从“未回答”列表中删除

        set errorformat=\ %#%f(%l\\\,%c):\ %m
        

        这将捕获devenv /Build 和msbuild 的输出。但是,msbuild 有一个问题。默认情况下,它的输出不包括完整路径。要解决此问题,您必须将以下行添加到您的 csproj 文件的主 PropertyGroup:

        <GenerateFullPaths>True</GenerateFullPaths>
        

        【讨论】:

          【解决方案7】:

          尝试运行 msbuild 而不是 devenv。这将为构建的运行方式提供大量动力。

          打开 Visual Studio 命令提示符以设置您的路径。然后msbuild MySln.sln /Configuration:Debug

          请参阅msbuild /? 寻求帮助。

          【讨论】:

            猜你喜欢
            • 2011-08-17
            • 2011-04-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-09-25
            • 2010-10-13
            • 1970-01-01
            相关资源
            最近更新 更多