Pergunta

Quero usar os recursos Quickfix do VIM com a saída do processo de construção de Devenv do Visual Studio ou MSBuild.

Eu criei um arquivo em lote chamado Build.bat, que executa a construção Devenv como esta:

devenv MySln.sln /Build Debug

Em Vim, apontei o: Make Command a esse arquivo em lote:

:set makeprg=build.bat

Quando eu corro agora: faça, a compilação é executada com sucesso, no entanto, os erros não são analisados. Então, se eu executar: Cl ou: CN, acabo vendo toda a saída do Devenv /Build. Eu deveria ver apenas os erros.

Eu tentei várias configurações diferentes de ErrorFormat que encontrei em vários sites ao redor da rede, mas nenhum deles analisou os erros corretamente. Aqui estão alguns que eu tentei:

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

E é claro que tentei o padrão de Vim.

Aqui está algum exemplo de saída do 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 ==========

ATUALIZAR:Parece que usar o msbuild em vez de Devenv é provavelmente o caminho certo a seguir (conforme o comentário de Jay).

Usando o msbuild, o makeprg seria:

:set makeprg=msbuild\ /nologo\ /v:q

Amostra de saída para quem seria:

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?)

Parece que a parte complicada aqui pode estar no fato de que o caminho é relativo ao arquivo .csproj, não no arquivo .sln que é o diretório atual no VIM e está um diretório acima do arquivo .csproj.

RESPONDA:Eu descobri isso ...

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

Isso capturará a saída para o Devenv /Build e o MSBUILL. No entanto, o MSBuild tem uma captura. Por padrão, sua saída não inclui caminhos completos. Para corrigir isso, você deve adicionar a seguinte linha ao principal grupo de propriedades do seu arquivo CSPROJ:

<GenerateFullPaths>True</GenerateFullPaths>
Foi útil?

Solução

Eu tenho uma postagem de blog que passa por todos os detalhes da criação de projetos C# no VIM, incluindo o formato de erro. Você pode encontrá-lo aqui: http://kevin-berridge.blogspot.com/2008/09/vim-c-compiling.html

Em suma, você precisa do seguinte:

:set errorformat=\ %#%f(%l\\\,%c):\ %m
:set makeprg=msbuild\ /nologo\ /v:q\ /property:GenerateFullPaths=true

Outras dicas

Cópia da pergunta para remover da lista 'sem resposta'

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

Isso capturará a saída para ambos devenv /Build e msbuild. No entanto, o MSBuild tem uma captura. Por padrão, sua saída não inclui caminhos completos. Para corrigir isso, você deve adicionar a seguinte linha ao principal grupo de propriedades do seu arquivo CSPROJ:

<GenerateFullPaths>True</GenerateFullPaths>

Encontrei uma resposta ainda melhor: use :compiler para usar embutido efm definições.

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

Nota: Ele também define o padrão makeprg. Veja $ vimruntime/compilador/

Tente executar o msbuild em vez de Devenv. Isso abrirá uma tonelada de energia na maneira como a construção é executada.

Abra um prompt de comando do Visual Studio para configurar seu caminho. Então faça msbuild MySln.sln /Configuration:Debug.

Ver msbuild /? para ajuda.

Encontrei essa pergunta ao procurar ErrorFormat para compilar C ++ no Visual Studio. As respostas acima não funcionam para mim (também não estou usando o msbuild).

Eu descobri isso de Esta dica Vim e :help errorformat:

" filename(line) : error|warning|fatal error C0000: message
set errorformat=\ %#%f(%l)\ :\ %#%t%[A-z]%#\ %[A-Z\ ]%#%n:\ %m

O que lhe dará um Quickfix parecido com isto:

stats.cpp|604 error 2039| 'getMedian' : is not a member of 'Stats'

(com erro destacado) de

c:\p4\main\stats.cpp(604) : error C2039: 'getMedian' : is not a member of 'Stats'

Como Simon Buchan mencionou, você pode usar isso em seu projeto para gerar os caminhos completos na saída:

<GenerateFullPaths>True</GenerateFullPaths>

Mas você pode torná -lo mais portátil adicionando /property:GenerateFullPaths=true para você makeprg Em vez de adicionar o acima aos seus arquivos de projeto.

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

Nenhum desses formatos de erro funcionou no Visual Studio 2009 v9.0.21022.8 Professional Edition. Usando o Cygwin, teve que ligar para Devenv da Bash, o que tornou a configuração makeprg um pouco complicada (arquivos em lote de parafuso). Também teve que ajustar meu erro de erro quando Devenv se dividir em vários processos e prossegue a mensagem de erro com "1>" ou "2>" etc:

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.'"'

Minha .BashRC define a variável de ambiente MakePath usando o CyGPath para converter em um caminho compatível com DOS:

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

Se você tem vim 6.x, você pode usar : cw O que é muito melhor do que Clist (tente procurar erros entre centenas de avisos e você sabe o que quero dizer). Olhar para vim tweaks me dá vontade de vomitar, mas estou no céu de vim !!! Bye Bye Visual Studio! Obrigado pela base para ajustar Pydave +1.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top