Вопрос

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

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

<GenerateFullPaths>True</GenerateFullPaths>
Это было полезно?

Решение

У меня есть запись в блоге, в которой рассматриваются все детали создания проектов 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

Другие советы

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

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

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

<GenerateFullPaths>True</GenerateFullPaths>

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

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

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

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

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

Видишь msbuild /? за помощью.

Я нашел этот вопрос при поиске errorformat для компиляции 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'

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

<GenerateFullPaths>True</GenerateFullPaths>

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

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

Ни один из этих форматов ошибок не работал в Visual Studio 2009 версии 9.0.21022.8 professional edition.Используя cygwin, пришлось вызвать devenv из bash, что немного усложнило настройку makeprg (ввернуть пакетные файлы).Также пришлось настроить мой errorformat, когда 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 что намного лучше, чем clist (попробуйте поискать ошибки среди сотен предупреждений, и вы поймете, что я имею в виду).Глядя на настройки vim, меня тошнит, но я нахожусь в vim-раю!!!Прощай, visual studio!Спасибо за базу для настройки pydave + 1.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top