Вопрос по visual-studio – Vim errorformat для Visual Studio

31

Я хочу использовать функции быстрого исправления 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 ==========

UPDATE: Похоже, что использование 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.

ANSWER: Я понял...

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

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

<GenerateFullPaths>True</GenerateFullPaths>
Для тех из нас, кто не использует VS2k8, некоторые сообщения об ошибках будут полезны. Zathrus

Ваш Ответ

7   ответов
1

Я нашел этот вопрос, когда искал формат ошибки для компиляции c ++ в 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'
Error: User Rate Limit Exceededfleiner.com/vim/syntax/myvimrc
20

в котором рассматриваются все детали создания проектов 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
Error: User Rate Limit Exceededdotnet build.
Error: User Rate Limit Exceededvim-dimpatchError: User Rate Limit Exceeded
1

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

<GenerateFullPaths>True</GenerateFullPaths>

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

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

Ни один из этих форматов ошибок не работал в Visual Studio 2009 v9.0.21022.8 Professional Edition. Используя cygwin, пришлось вызывать devenv из bash, что делало настройку makeprg немного сложной (файлы с винтовыми пакетами). Также пришлось подправить мой формат ошибок, когда devenv распадается на несколько процессов и выдает сообщение об ошибке с «1» & quot; или "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, вы можете использовать: ХО что намного лучше, чем clist (попробуйте поискать ошибки среди сотен предупреждений, и вы поймете, что я имею в виду). Глядя на трюки vim, я хочу рвать, но я нахожусь в vim heaven !!! До свидания визуальная студия! Спасибо за базу для подстройки pydave +1.

1

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

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

Увидетьmsbuild /? за помощью.

3

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

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

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

7

Copy from question to remove from 'unanswered' list

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

<GenerateFullPaths>True</GenerateFullPaths>

Похожие вопросы