Quiero usar las características de quickfix de Vim con el resultado del proceso de construcción devenv de Visual Studio o msbuild.Formato de error Vim para Visual Studio
He creado un archivo por lotes llamado build.bat que ejecuta la devenv construir de esta manera:
devenv MySln.sln /Build Debug
En vim he señalado el: comando para hacer que ese archivo por lotes:
:set makeprg=build.bat
Cuando ahora ejecuto: make, la compilación se ejecuta correctamente, sin embargo, los errores no se analizan. Entonces si ejecuto: cl o: cn acabo de ver toda la salida devenv/Build. Debería ver solo los errores.
He intentado varias configuraciones diferentes de formato de error que he encontrado en varios sitios de la red, pero ninguno de ellos ha analizado correctamente los errores. Aquí hay algunos que he intentado:
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
Y, por supuesto, he probado el valor por defecto de Vim.
He aquí algunos ejemplo del resultado de la 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 ==========
ACTUALIZACIÓN: Parece que el uso de msbuild en lugar de devenv es probablemente el camino correcto a seguir (según el comentario de Jay).
Usando msbuild la makeprg sería:
:set makeprg=msbuild\ /nologo\ /v:q
Salida de ejemplo whould ser:
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?)
Parece que la parte difícil aquí puede estar en el hecho de que la ruta es relativa a la. archivo csproj, no el archivo .sln que es el directorio actual en Vim y se encuentra un directorio sobre el archivo .csproj.
RESPUESTA: lo he descubierto ...
set errorformat=\ %#%f(%l\\\,%c):\ %m
Esto captura la salida tanto para devenv/Construir y msbuild. Sin embargo, msbuild tiene una trampa. Por defecto, su salida no incluye rutas completas. Para solucionar esto hay que añadir la siguiente línea a PropertyGroup principal de su archivo csproj:
<GenerateFullPaths>True</GenerateFullPaths>
Para aquellos de nosotros que no utilizan VS2k8, alguna salida de error sería útil. – Zathrus