Visual Studio的Vim错误格式
我想在Visual Studio的devenv生成过程或者msbuild的输出中使用Vim的quickfix功能。
我创建了一个名为build.bat的批处理文件,该文件执行如下所示的devenv构建:
devenv MySln.sln /Build Debug
在vim中,我已将:make命令指向该批处理文件:
:set makeprg=build.bat
当我现在运行:make时,构建会成功执行,但是不会解析错误。因此,如果我运行:cl或者:cn,我最终只会看到devenv / Build的所有输出。我应该只看到错误。
我已经尝试了在网络上各个站点上找到的许多不同的errorformat设置,但是没有一个可以正确解析出错误。这是我尝试过的一些方法:
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>
解决方案
尝试运行msbuild而不是devenv。这将为构建方式打开大量的电源。
打开Visual Studio命令提示符以设置路径。然后执行msbuild MySln.sln / Configuration:Debug
。
参见" msbuild /?"以获取帮助。
从问题中复制以从"未答复"列表中删除
set errorformat=\ %#%f(%l\\,%c):\ %m
这将捕获devenv / Build
和msbuild的输出。但是,msbuild有一个陷阱。默认情况下,其输出不包含完整路径。要解决此问题,我们必须将以下行添加到csproj文件的主PropertyGroup中:
<GenerateFullPaths>True</GenerateFullPaths>
我在寻找用于在Visual Studio中编译c ++的错误格式时发现了这个问题。上面的答案对我不起作用(我也不使用MSBuild)。
我从Vim提示和: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'
我找到了一个更好的答案:使用:compiler
使用内置的efm
设置。
" Microsoft C# compiler cs " Microsoft Visual C++ compiler msvc " mono compiler mcs " gcc compiler gcc
注意:它还设置默认的makeprg
。参见$ VIMRUNTIME / compiler /
这些错误格式均不能在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的基础。
正如Simon Buchan提到的,我们可以在项目中使用它来在输出中生成完整路径:
<GenerateFullPaths>True</GenerateFullPaths>
但是我们可以通过在makeprg中添加/ property:GenerateFullPaths = true
而不是在项目文件中添加以上内容,来使其更易于移植。
:set makeprg=msbuild\ /nologo\ /v:q\ /property:GenerateFullPaths=true\
我有一篇博客文章,介绍了在Vim中构建Cprojects的所有详细信息,包括错误格式。我们可以在这里找到它: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