Формат ошибок Vim для Visual Studio

Я хочу использовать функции quickfix Vim с выходными данными процесса сборки devenv Visual Studio или msbuild.

Я создал командный файл build.bat, который выполняет сборку devenv следующим образом:

devenv MySln.sln /Build Debug

В vim я указал команду: make на этот командный файл:

:set makeprg=build.bat

Теперь, когда я запускаю: make, сборка выполняется успешно, однако ошибки не анализируются. Поэтому, если я запускаю: cl или: cn, я просто вижу весь вывод devenv / Build. Я должен видеть только ошибки.

Я пробовал несколько различных настроек формата ошибок, которые я нашел на разных сайтах в сети, но ни один из них не смог правильно проанализировать ошибки. Вот несколько из них:

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, вероятно, является правильным способом (согласно комментарию Джея).

Используя 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 есть одна загвоздка. По умолчанию вывод не включает полные пути. Чтобы исправить это, вам нужно добавить следующую строку в основную группу PropertyGroup вашего файла csproj:

<GenerateFullPaths>True</GenerateFullPaths>

person Kevin Berridge    schedule 19.09.2008    source источник
comment
Для тех из нас, кто не использует VS2k8, будет полезен вывод ошибок.   -  person Zathrus    schedule 19.09.2008


Ответы (7)


У меня есть сообщение в блоге, в котором подробно описаны все детали создания проектов C # в Vim, включая формат ошибки. Вы можете найти его здесь: 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
person Kevin Berridge    schedule 01.09.2010
comment
Это также отлично работает для ядра .net, то есть: dotnet build. - person lbergnehr; 26.10.2016
comment
Эти настройки плюс vim-dimpatch отлично работают. - person Seth; 28.12.2016

Скопировать из вопроса, чтобы удалить из списка "неотвеченных"

set errorformat=\ %#%f(%l\\\,%c):\ %m

Это захватит вывод как для devenv /Build, так и для msbuild. Однако у msbuild есть одна загвоздка. По умолчанию вывод не включает полные пути. Чтобы исправить это, вам нужно добавить следующую строку в основную группу PropertyGroup вашего файла csproj:

<GenerateFullPaths>True</GenerateFullPaths>
person Community    schedule 02.10.2008

Я нашел еще лучший ответ: используйте :compiler, чтобы использовать встроенные efm настройки.

" Microsoft C#
compiler cs
" Microsoft Visual C++
compiler msvc
" mono
compiler mcs
" gcc
compiler gcc

Примечание. Он также устанавливает значение по умолчанию makeprg. См. $ VIMRUNTIME / compiler /

person idbrii    schedule 26.06.2010

Попробуйте запустить msbuild вместо devenv. Это откроет массу возможностей для запуска сборки.

Откройте командную строку Visual Studio, чтобы настроить путь. Затем сделайте msbuild MySln.sln /Configuration:Debug.

См. msbuild /? для получения помощи.

person Jay Bazuzi    schedule 19.09.2008

Я нашел этот вопрос, когда искал формат ошибок для компиляции c ++ в Visual Studio. Приведенные выше ответы не работают для меня (я тоже не использую 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'
person idbrii    schedule 25.06.2010
comment
К сожалению, я легко смог найти синтаксис для gcc, jikes и javac [в каком-то случайном vimrc] [1]. Ах хорошо. Забвение - удел нас, бедных программистов на VS C ++. [1]: fleiner.com/vim/syntax/myvimrc - person idbrii; 25.06.2010

Как упоминал Саймон Бьюкен, вы можете использовать это в своем проекте для генерации полных путей на выходе:

<GenerateFullPaths>True</GenerateFullPaths>

Но вы можете сделать его более переносимым, добавив /property:GenerateFullPaths=true к вам makeprg вместо того, чтобы добавлять вышеуказанное в файлы вашего проекта.

:set makeprg=msbuild\ /nologo\ /v:q\ /property:GenerateFullPaths=true\
person Tom Miller    schedule 01.09.2010

Ни один из этих форматов ошибок не работал в профессиональной версии Visual Studio 2009 v9.0.21022.8. Используя cygwin, пришлось вызвать devenv из bash, что немного усложнило настройку 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 устанавливает переменную среды MAKEPATH с помощью cygpath для преобразования в путь, совместимый с DOS:

export MAKEPATH="$(cygpath -d "proj/VC9/some.sln") /build \"Debug\""

Если у вас vim 6.x, вы можете использовать : cw, который НАМНОГО лучше, чем clist ( попробуйте поискать ошибки среди сотен предупреждений, и вы понимаете, о чем я). Глядя на твики vim, меня тошнит, но я в раю vim !!! Прощай, визуальная студия! Спасибо за базу для настройки pydave +1.

person manifest    schedule 29.06.2010