Domanda

Desidero utilizzare le funzionalità di correzione rapida di Vim con l'output del processo di compilazione devenv di Visual Studio o msbuild.

Ho creato un file batch chiamato build.bat che esegue la build devenv in questo modo:

devenv MySln.sln /Build Debug

In vim ho indirizzato il comando :make a quel file batch:

:set makeprg=build.bat

Quando ora eseguo :make, la build viene eseguita correttamente, tuttavia gli errori non vengono analizzati.Quindi se eseguo :cl o :cn finisco per vedere tutto l'output di devenv /Build.Dovrei vedere solo gli errori.

Ho provato diverse impostazioni di formato errore che ho trovato su vari siti in rete, ma nessuno di loro ha analizzato correttamente gli errori.Eccone alcuni che ho provato:

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 ovviamente ho provato l'impostazione predefinita di Vim.

Ecco alcuni esempi di output da 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 ==========

AGGIORNAMENTO:Sembra che usare msbuild invece di devenv sia probabilmente la strada giusta da percorrere (secondo il commento di Jay).

Usando msbuild il makeprg sarebbe:

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

L'output di esempio potrebbe essere:

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

Sembra che la parte difficile qui potrebbe risiedere nel fatto che il percorso è relativo al file .csproj, non al file .sln che è la directory corrente in Vim e si trova una directory sopra il file .csproj.

RISPOSTA:L'avevo capito...

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

Ciò catturerà l'output sia per devenv /Build che per msbuild.Tuttavia, msbuild ha un problema.Per impostazione predefinita, l'output non include percorsi completi.Per risolvere questo problema devi aggiungere la seguente riga al PropertyGroup principale del tuo file csproj:

<GenerateFullPaths>True</GenerateFullPaths>
È stato utile?

Soluzione

Ho un post sul blog che illustra tutti i dettagli su come ottenere la creazione di progetti C# in Vim, incluso il formato dell'errore.Potete trovare qui: http://kevin-berridge.blogspot.com/2008/09/vim-c-compiling.html

In breve è necessario quanto segue:

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

Altri suggerimenti

Copia dalla domanda per rimuovere dall'elenco "senza risposta".

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

Ciò catturerà l'output per entrambi devenv /Build e msbuild.Tuttavia, msbuild ha un problema.Per impostazione predefinita, l'output non include percorsi completi.Per risolvere questo problema devi aggiungere la seguente riga al PropertyGroup principale del tuo file csproj:

<GenerateFullPaths>True</GenerateFullPaths>

Ho trovato una risposta ancora migliore:utilizzo :compiler per utilizzare il built-in efm impostazioni.

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

Nota:Imposta anche il valore predefinito makeprg.Vedi $VIMRUNTIME/compilatore/

Prova a eseguire msbuild invece di devenv.Ciò aprirà un sacco di potere nel modo in cui viene eseguita la build.

Apri un prompt dei comandi di Visual Studio per impostare il percorso.Quindi fa msbuild MySln.sln /Configuration:Debug.

Vedere msbuild /? per un aiuto.

Ho trovato questa domanda durante la ricerca di errorformat per la compilazione di C++ in Visual Studio.Le risposte di cui sopra non funzionano per me (non sto nemmeno usando MSBuild).

L'ho capito da questo suggerimento di Vim E :help errorformat:

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

Il che ti darà una soluzione rapida simile a questa:

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

(con errore evidenziato) da

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

Come menzionato da Simon Buchan, puoi usarlo nel tuo progetto per generare i percorsi completi nell'output:

<GenerateFullPaths>True</GenerateFullPaths>

Ma puoi renderlo più portabile aggiungendo /property:GenerateFullPaths=true a te makeprg invece di aggiungere quanto sopra ai file di progetto.

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

Nessuno di questi formati di errore ha funzionato nell'edizione professionale di Visual Studio 2009 v9.0.21022.8.Usando Cygwin, ho dovuto chiamare devenv da bash, il che ha reso l'impostazione di makeprg un po' complicata (avvita i file batch).Inoltre ho dovuto modificare il mio formato di errore quando devenv si divide in più processi e procede al messaggio di errore con "1>" o "2>" ecc.:

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

Il mio .bashrc imposta la variabile d'ambiente MAKEPATH utilizzando cygpath per convertire in un percorso compatibile con DOS:

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

Se hai vim 6.x puoi usare :cw che è MOLTO meglio di clist (prova a cercare errori tra centinaia di avvisi e capisci cosa intendo).Guardare le modifiche di Vim mi fa venire voglia di vomitare ma sono in paradiso!!!Addio studio visivo!Grazie per la base per modificare Pydave +1.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top