Vim errorformat dla Visual Studio
Chcę używać funkcji szybkiej zmiany Vima z danymi wyjściowymi z procesu budowania devenv Visual Studio lub msbuild.
Stworzyłem plik wsadowy o nazwie build.bat, który wykonuje kompilację devenv taką jak ta:
<code>devenv MySln.sln /Build Debug </code>
W vim wskazałem polecenie: make do tego pliku wsadowego:
<code>:set makeprg=build.bat </code>
Gdy teraz uruchomię: make, kompilacja działa pomyślnie, jednak błędy nie są analizowane. Więc jeśli uruchomię: cl lub: cn, po prostu zobaczę wszystkie dane wyjściowe z devenv / Build. Powinienem zobaczyć tylko błędy.
Wypróbowałem wiele różnych ustawień błędów, które znalazłem w różnych witrynach w sieci, ale żaden z nich nie przeanalizował poprawnie błędów. Oto kilka próbowałem:
<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>
I oczywiście próbowałem domyślnie Vima.
Oto kilka przykładowych wyników z pliku 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>
AKTUALIZACJA: Wygląda na to, że użycie msbuild zamiast devenv jest prawdopodobnie właściwym sposobem (zgodnie z komentarzem Jaya).
Używając msbuild, makeprg będzie:
<code>:set makeprg=msbuild\ /nologo\ /v:q </code>
Przykładowy wynik powinien być:
<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>
Wygląda na to, że trudna część może polegać na tym, że ścieżka jest względna do pliku .csproj, a nie do pliku .sln, który jest bieżącym katalogiem w Vimie i leży w jednym katalogu powyżej pliku .csproj.
ODPOWIEDŹ: Rozgryzłem to...
<code>set errorformat=\ %#%f(%l\\\,%c):\ %m </code>
Spowoduje to przechwycenie danych wyjściowych zarówno dla devenv / Build, jak i msbuild. Jednak msbuild ma jeden haczyk. Domyślnie jego wyjście nie zawiera pełnych ścieżek. Aby to naprawić, musisz dodać następujący wiersz do głównej grupy właściwości pliku csproj:
<code><GenerateFullPaths>True</GenerateFullPaths> </code>