Vim errorformat para Visual Studio

Quiero usar las funciones de corrección rápida de Vim con el resultado del proceso de compilación de devenv de Visual Studio o msbuild.

He creado un archivo por lotes llamado build.bat que ejecuta la compilación devenv de la siguiente manera:

<code>devenv MySln.sln /Build Debug
</code>

En vim he señalado el comando: make a ese archivo por lotes:

<code>:set makeprg=build.bat
</code>

Cuando ahora ejecuto: make, la compilación se ejecuta con éxito, sin embargo, los errores no se analizan. Así que si ejecuto: cl o: cn acabo de ver toda la salida de devenv / Build. Debería ver sólo los errores.

He intentado una serie de configuraciones de error diferentes que he encontrado en varios sitios en la red, pero ninguno de ellos ha analizado los errores correctamente. Aquí hay algunos que he probado:

<code>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
</code>

Y, por supuesto, he intentado el defecto de Vim.

Aquí hay un ejemplo de salida del build.bat:

<code>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 ==========
</code>

ACTUALIZAR: Parece que usar msbuild en lugar de devenv es probablemente el camino correcto (según el comentario de Jay).

Usando msbuild el makeprg sería:

<code>:set makeprg=msbuild\ /nologo\ /v:q
</code>

La salida de muestra debería ser:

<code>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?)
</code>

Parece que la parte difícil aquí puede estar en el hecho de que la ruta es relativa al archivo .csproj, no el archivo .sln que es el directorio actual en Vim y se encuentra en un directorio sobre el archivo .csproj.

RESPONDER: Me lo imaginé...

<code>set errorformat=\ %#%f(%l\\\,%c):\ %m
</code>

Esto capturará la salida para ambos devenv / Build y msbuild. Sin embargo, msbuild tiene una captura. Por defecto, su salida no incluye rutas completas. Para solucionar este problema, debe agregar la siguiente línea al grupo de propiedades principal de su archivo csproj:

<code><GenerateFullPaths>True</GenerateFullPaths>
</code>

Respuestas a la pregunta(7)

Su respuesta a la pregunta