Formato de erro do Vim para o Visual Studio

Eu quero usar os recursos de correção rápida do Vim com a saída do processo de construção devenv do Visual Studio ou msbuild.

Eu criei um arquivo de lote chamado build.bat que executa a construção devenv assim:

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

No vim eu apontei o comando: make para esse arquivo batch:

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

Quando eu executo agora: make, a compilação é executada com sucesso, no entanto, os erros não são analisados. Então, se eu correr: cl ou: cn acabei vendo toda a saída do devenv / Build. Eu deveria ver apenas os erros.

Eu tentei um número de diferentes configurações de formato de erro que eu encontrei em vários sites ao redor da rede, mas nenhum deles analisou os erros corretamente. Aqui estão alguns que eu tentei:

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

E, claro, eu tentei o padrão do Vim.

Veja alguns exemplos de saída do 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>

ATUALIZAR: Parece que usar msbuild em vez de devenv é provavelmente o caminho certo a seguir (como no comentário de Jay).

Usando msbuild o makeprg seria:

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

Saída da amostra deve 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 a parte complicada aqui pode estar no fato de que o caminho é relativo ao arquivo .csproj, não ao arquivo .sln que é o diretório atual no Vim e está localizado em um diretório acima do arquivo .csproj.

RESPONDA: Eu percebi isso ...

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

Isto irá capturar a saída para ambos devenv / Build e msbuild. No entanto, msbuild tem um problema. Por padrão, sua saída não inclui caminhos completos. Para corrigir isso, você deve adicionar a seguinte linha ao PropertyGroup principal do seu arquivo csproj:

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

questionAnswers(7)

yourAnswerToTheQuestion