2008-09-19 33 views
29

Tôi muốn sử dụng tính năng Quickfix của Vim với đầu ra từ quá trình xây dựng devenv của Visual Studio hoặc msbuild.Vim errorformat cho Visual Studio

tôi đã tạo ra một tập tin batch gọi build.bat mà thực thi devenv xây dựng như thế này:

devenv MySln.sln /Build Debug 

Trong vim Tôi đã chĩa: thực hiện lệnh để tập tin batch:

:set makeprg=build.bat 

Khi tôi chạy bây giờ: thực hiện, quá trình xây dựng thực thi thành công, tuy nhiên các lỗi không được phân tích cú pháp. Vì vậy, nếu tôi chạy: cl hoặc: cn Tôi chỉ cần nhìn thấy tất cả các đầu ra từ devenv/Build. Tôi sẽ chỉ thấy các lỗi.

Tôi đã thử một số cài đặt errorformat khác nhau mà tôi đã tìm thấy trên các trang web khác nhau trên mạng, nhưng không có cài đặt nào trong số đó đã phân tích cú pháp chính xác. Dưới đây là một số tôi đã thử:

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 

Và dĩ nhiên tôi đã thử mặc định của Vim.

Dưới đây là một số ví dụ đầu ra từ 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: Dường như sử dụng msbuild thay vì devenv có lẽ là cách đúng đắn để đi (theo bình luận của Jay).

Sử dụng msbuild các makeprg sẽ là:

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

Mẫu đầu ra whould được:

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

Dường như phần khó hiểu ở đây có thể nằm trong thực tế là con đường là tương đối so với. Tệp csproj, không phải tệp .sln là thư mục hiện tại trong Vim và nằm một thư mục phía trên tệp .csproj.

ĐÁP: I figured it out ...

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

này sẽ bắt đầu ra cho cả devenv/Xây dựng và msbuild. Tuy nhiên, msbuild có một cú đánh. Theo mặc định, đầu ra của nó không bao gồm đường dẫn đầy đủ. Để khắc phục điều này, bạn phải thêm dòng sau vào nhóm thuộc tính chính của tệp csproj:

<GenerateFullPaths>True</GenerateFullPaths> 
+0

Đối với những người trong chúng ta không sử dụng VS2k8, một số lượng lỗi sẽ được hữu ích. – Zathrus

Trả lời

17

Tôi có một bài đăng blog hướng dẫn tất cả các chi tiết về việc xây dựng các dự án C# trong Vim, bao gồm định dạng lỗi.Bạn có thể tìm thấy nó ở đây: http://kevin-berridge.blogspot.com/2008/09/vim-c-compiling.html

Nói tóm lại bạn cần như sau:

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

Điều này cũng phù hợp với lõi .net, ví dụ: 'dotnet build'. – lbergnehr

+0

Các cài đặt này cộng với [vim-dimpatch] (https://github.com/tpope/vim-dispatch) hoạt động tốt. – Seth

1

Thử chạy msbuild thay vì devenv. Điều này sẽ mở ra một tấn sức mạnh trong cách xây dựng chạy.

Mở Visual Studio Command Prompt để thiết lập đường dẫn của bạn. Sau đó, hãy thực hiện msbuild MySln.sln /Configuration:Debug.

Xem msbuild /? để được trợ giúp.

7

Copy từ câu hỏi để xóa khỏi danh sách 'chưa được trả lời'

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

này sẽ bắt đầu ra cho cả devenv /Build và msbuild. Tuy nhiên, msbuild có một bắt. Theo mặc định, đầu ra của nó không bao gồm đường dẫn đầy đủ. Để khắc phục điều này, bạn phải thêm dòng sau vào PropertyGroup chính tập tin csproj của bạn:

<GenerateFullPaths>True</GenerateFullPaths> 
1

Tôi tìm thấy câu hỏi này khi tìm kiếm errorformat cho biên dịch C++ trong Visual Studio. Các câu trả lời trên không làm việc cho tôi (tôi cũng không sử dụng MSBuild).

tôi đã tìm ra điều này từ this Vim Tip:help errorformat:

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

Mà sẽ cung cấp cho bạn một QuickFix tìm kiếm như thế này:

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

(với lỗi nhấn mạnh) từ

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

Bực bội, tôi có thể dễ dàng tìm cú pháp cho gcc, jikes và javac [trong một số vimrc ngẫu nhiên] [1]. Ah, tốt. Oblivion là số phận của chúng tôi nghèo VS C + + lập trình viên. [1]: http://www.fleiner.com/vim/syntax/myvimrc – idbrii

3

Tôi đã tìm thấy câu trả lời hay hơn: sử dụng :compiler để sử dụng -in efm cài đặt.

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

Lưu ý: Nó cũng đặt mặc định makeprg. Xem $ VIMRUNTIME/compiler/

0

Không có định dạng lỗi nào trong phiên bản chuyên nghiệp Visual Studio 2009 v9.0.21022.8. Sử dụng Cygwin, đã phải gọi devenv từ bash mà làm cho thiết lập makeprg một chút khó khăn (tập tin batch vít). Cũng phải tinh chỉnh errorformat tôi khi devenv chia thành nhiều quy trình và tiền thu được thông báo lỗi với "1>" hoặc "2>" vv:

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 của tôi đặt biến môi trường MAKEPATH sử dụng cygpath chuyển đổi sang một hệ điều hành DOS tương thích đường dẫn:

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

Nếu bạn có vim 6.x bạn có thể sử dụng :cw đó là sO tốt hơn nhiều so clist (hãy thử tìm kiếm lỗi trong số hàng trăm cảnh báo và bạn biết những gì tôi có nghĩa). Nhìn vào vim chỉnh làm cho tôi muốn nôn mửa nhưng tôi đang ở trong thiên đường! Good bye visual studio! Cảm ơn các cơ sở để tinh chỉnh pydave +1.

1

Theo Simon Buchan nêu bạn có thể sử dụng trong dự án của bạn để tạo ra đường dẫn đầy đủ trong đầu ra:

<GenerateFullPaths>True</GenerateFullPaths> 

Nhưng bạn có thể làm cho nó di động hơn bằng cách thêm /property:GenerateFullPaths=true cho bạn makeprg thay vì thêm ở trên để tệp dự án của bạn.

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