2008-09-19 20 views
29

Quiero usar las características de quickfix de Vim con el resultado del proceso de construcción devenv de Visual Studio o msbuild.Formato de error Vim para Visual Studio

He creado un archivo por lotes llamado build.bat que ejecuta la devenv construir de esta manera:

devenv MySln.sln /Build Debug 

En vim he señalado el: comando para hacer que ese archivo por lotes:

:set makeprg=build.bat 

Cuando ahora ejecuto: make, la compilación se ejecuta correctamente, sin embargo, los errores no se analizan. Entonces si ejecuto: cl o: cn acabo de ver toda la salida devenv/Build. Debería ver solo los errores.

He intentado varias configuraciones diferentes de formato de error que he encontrado en varios sitios de la red, pero ninguno de ellos ha analizado correctamente los errores. Aquí hay algunos que he intentado:

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 

Y, por supuesto, he probado el valor por defecto de Vim.

He aquí algunos ejemplo del resultado de la 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 ========== 

ACTUALIZACIÓN: Parece que el uso de msbuild en lugar de devenv es probablemente el camino correcto a seguir (según el comentario de Jay).

Usando msbuild la makeprg sería:

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

Salida de ejemplo whould ser:

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 la parte difícil aquí puede estar en el hecho de que la ruta es relativa a la. archivo csproj, no el archivo .sln que es el directorio actual en Vim y se encuentra un directorio sobre el archivo .csproj.

RESPUESTA: lo he descubierto ...

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

Esto captura la salida tanto para devenv/Construir y msbuild. Sin embargo, msbuild tiene una trampa. Por defecto, su salida no incluye rutas completas. Para solucionar esto hay que añadir la siguiente línea a PropertyGroup principal de su archivo csproj:

<GenerateFullPaths>True</GenerateFullPaths> 
+0

Para aquellos de nosotros que no utilizan VS2k8, alguna salida de error sería útil. – Zathrus

Respuesta

17

Tengo una publicación de blog que repasa todos los detalles de la construcción de proyectos de C# en Vim, incluido el formato de error.Lo puedes encontrar aquí: http://kevin-berridge.blogspot.com/2008/09/vim-c-compiling.html

En resumen se necesita lo siguiente:

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

Esto también funciona muy bien para el núcleo .net, es decir .: 'build' dotnet. – lbergnehr

+0

Estos ajustes más [vim-dimpatch] (https://github.com/tpope/vim-dispatch) funcionan muy bien. – Seth

1

intente ejecutar msbuild en lugar de devenv. Esto abrirá una tonelada de poder en cómo se ejecuta la compilación.

Abra un símbolo del sistema de Visual Studio para configurar su ruta. Luego haz msbuild MySln.sln /Configuration:Debug.

Consulte msbuild /? para obtener ayuda.

7

copia de la pregunta para eliminar de la lista 'sin respuesta'

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

Esto capturará la salida tanto para devenv /Build y msbuild. Sin embargo, msbuild tiene una trampa. Por defecto, su salida no incluye rutas completas. Para solucionar esto hay que añadir la siguiente línea a PropertyGroup principal de su archivo csproj:

<GenerateFullPaths>True</GenerateFullPaths> 
1

me encontré con esta pregunta en la búsqueda de errorformat para compilar C++ en Visual Studio. Las respuestas anteriores no funcionan para mí (tampoco estoy usando MSBuild).

me di cuenta de esto desde this Vim Tip y :help errorformat:

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

que le dará un quickfix con este aspecto:

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

(con resaltado de errores) de

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

frustrante, pude encontrar fácilmente sintaxis para gcc, jikes y javac [de alguna vimrc al azar] [1]. Ah bueno. El olvido es el destino de los pobres programadores de VS C++. [1]: http://www.fleiner.com/vim/syntax/myvimrc – idbrii

3

Encontré una respuesta aún mejor: use :compiler para usar construido -en efm configuraciones.

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

Nota: También establece el valor predeterminado makeprg. Ver $ VIMRUNTIME/compilador/

0

Ninguno de estos formatos de error funcionó en Visual Studio 2009 v9.0.21022.8 professional edition. Usando cygwin, tuve que llamar a devenv desde bash, lo que hizo que establecer makeprg fuera un poco complicado (archivos de lotes de tornillos). También tuvo que ajustar mi errorformat cuando devenv se divide en múltiples procesos mensaje de error y continúa con "1>" o "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.'"' 

Mi Bashrc establece la variable de entorno MAKEPATH usando cygpath para convertir a un DOS ruta compatibles:

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

Si tiene 6.x vim puede utilizar :cw que es mucho mejor que clist (intentar la búsqueda de errores entre los cientos de advertencias y sabes lo que quiero decir). Ver los ajustes de vim me dan ganas de vomitar, ¡pero estoy en el cielo! Adiós visual studio! Gracias por la base para ajustar pydave +1.

1

Como Simon Buchan mencionado se puede utilizar esto en su proyecto para generar las rutas completas en la salida:

<GenerateFullPaths>True</GenerateFullPaths> 

Sin embargo, puede que sea más portátil añadiendo /property:GenerateFullPaths=true a que makeprg en lugar de añadir lo anterior a tus archivos de proyecto

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