Подтвердить что ты не робот

Vim errorformat для Visual Studio

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

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

devenv MySln.sln /Build Debug

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

:set makeprg=build.bat

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

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

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

UPDATE: Похоже, что использование msbuild вместо devenv - это, вероятно, правильный путь (согласно комментарию Jay).

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

<GenerateFullPaths>True</GenerateFullPaths>
4b9b3361

Ответ 1

У меня есть сообщение в блоге, которое просматривает все детали получения проектов С# в 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

Ответ 2

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

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

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

<GenerateFullPaths>True</GenerateFullPaths>

Ответ 3

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

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

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

Ответ 4

Попробуйте запустить msbuild вместо devenv. Это откроет тонну мощности в том, как работает сборка.

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

Обратитесь к msbuild /? за помощью.

Ответ 5

Я нашел этот вопрос при поиске errorformat для компиляции С++ в Visual Studio. Вышеуказанные ответы не работают для меня (я тоже не использую MSBuild).

Я понял это из этот Vim Tip и :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'

Ответ 6

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

<GenerateFullPaths>True</GenerateFullPaths>

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

:set makeprg=msbuild\ /nologo\ /v:q\ /property:GenerateFullPaths=true\

Ответ 7

Ни один из этих ошибок не работал в Visual Studio 2009 v9.0.21022.8 Professional Edition. Используя 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.'"'

My.bashrc устанавливает переменную среды MAKEPATH, используя cygpath для преобразования в DOS-совместимый путь:

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

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