質問

Visual Studio の devenv ビルド プロセスまたは msbuild からの出力で Vim のクイックフィックス機能を使用したいと考えています。

次のように devenv ビルドを実行する build.bat というバッチ ファイルを作成しました。

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 ==========

アップデート:おそらく devenv の代わりに msbuild を使用するのが正しい方法のようです (Jay のコメントによると)。

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 ファイルに対する相対パスであり、Vim のカレント ディレクトリで .csproj ファイルの 1 つ上のディレクトリにある .sln ファイルではないという事実にあるようです。

答え:私はそれを考え出した...

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

これにより、 devenv /Build と msbuild の両方の出力がキャプチャされます。ただし、msbuild には問題が 1 つあります。デフォルトでは、出力にはフルパスは含まれません。これを修正するには、csproj ファイルのメイン PropertyGroup に次の行を追加する必要があります。

<GenerateFullPaths>True</GenerateFullPaths>
役に立ちましたか?

解決

Vim で C# プロジェクトをビルドする方法を、エラー形式も含めて詳細に説明したブログ投稿があります。ここで見つけることができます: 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 には問題が 1 つあります。デフォルトでは、出力にはフルパスは含まれません。これを修正するには、csproj ファイルのメイン PropertyGroup に次の行を追加する必要があります。

<GenerateFullPaths>True</GenerateFullPaths>

さらに良い答えを見つけました。使用 :compiler 組み込みを使用する efm 設定。

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

注記:デフォルトも設定します makeprg. 。$VIMRUNTIME/compiler/ を参照してください。

devenv の代わりに msbuild を実行してみてください。これにより、ビルドの実行方法が大幅に強化されます。

Visual Studio コマンド プロンプトを開いてパスを設定します。それならそうする msbuild MySln.sln /Configuration:Debug.

見る msbuild /? 助けのために。

Visual Studio で C++ をコンパイルするための errorformat を探していたときに、この質問を見つけました。上記の答えは私にとっては機能しません(私は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'

Simon Buchan が述べたように、これをプロジェクトで使用して、出力に完全なパスを生成できます。

<GenerateFullPaths>True</GenerateFullPaths>

ただし、追加することで移植性を高めることができます /property:GenerateFullPaths=true あなたへ makeprg 上記をプロジェクト ファイルに追加する代わりに。

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

これらのエラー形式はいずれも、Visual Studio 2009 v9.0.21022.8 professional エディションでは機能しませんでした。cygwin を使用すると、bash から devenv を呼び出す必要があったため、makeprg の設定が少し難しくなりました (バッチ ファイルがダメでした)。また、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.'"'

私の .bashrc は、cygpath を使用して MAKEPATH 環境変数を設定し、DOS 互換パスに変換します。

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

vim 6.x をお持ちの場合は使用できます :CW これは clist よりもはるかに優れています (何百もの警告の中からエラーを検索してみてください。そうすれば、私の言いたいことがわかるでしょう)。vim の調整を見ていると吐きそうになりますが、私は vim の天国にいます!!!さようならビジュアルスタジオ!pydave +1 を微調整するためのベースをありがとう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top