4

VS2010は私を夢中にさせています。再構築するたびに、以前のコンパイルからの「エラー リスト」警告が保持され、新しい警告がリストの最後に追加されるだけです。時間が経つにつれて、このリストはとてつもなく長くなり、扱いにくくなります。

Chirpy 2.0ツールを使用して JS ファイルでJSHintJSLintを実行していますが、これらのツールは多くの誤検知を生成します。

このウィンドウの内容を簡単にクリアする方法を探していましたが、100% の確率で機能する唯一の手動メカニズムは、ソリューションを閉じて再度開くことです。あまりエレガントではありません。

現在ロードされているファイルの新しい警告のみに集中できるように、小さな VS プラグインまたはコンパイルの直前に呼び出されてこのリストをクリアするコードを書きたいと考えています。

出力ウィンドウには.Clear()メソッドが表示されますが、エラー リストには表示されません。これは実行可能ですか?

4

1 に答える 1

2

昔々、私はアドイン/VSIX パッケージ/MEF 開発者でした...

答えはすぐにノーですが、私は長い道のりでそれをしなければなりません:

アドイン、パッケージ (管理されているかどうかに関係なく) は、VS サービス レベルに個別にアクセスできます。すべてのエラーは報告者に属しているため (報告者が Chirpy のように管理している場合)、Chirpy 2.0 によって作成されたエラーを処理することはできません。

そのソース コードをいくつか見てみると、TaskList と呼ばれるシングルトン コレクション内のツールによって得られたエラーが残っていることがわかります。

コレクション要素の削除は、RemoveAll メソッドを使用して、最新リリースのコードのいくつかのポイントで発生しています。

  1. 最初:魂が閉じられた後。

  2. これで:

private static string[] buildCommands = new[] { "Build.BuildSelection", "Build.BuildSolution", "ClassViewContextMenus.ClassViewProject.Build" };

    private void CommandEvents_BeforeExecute(string guid, int id, object customIn, object customOut, ref bool cancelDefault) {
            EnvDTE.Command objCommand = default(EnvDTE.Command);
            string commandName = null;

            try {
                objCommand = this.App.Commands.Item(guid, id);
            } catch (System.ArgumentException) {
            }

            if (objCommand != null) {
                commandName = objCommand.Name;

                var settings = new Settings();
                if (settings.T4RunAsBuild) {
                    if (buildCommands.Contains(commandName)) {
                        if (this.tasks != null) {
                            this.tasks.RemoveAll();
                        }

                        Engines.T4Engine.RunT4Template(this.App, settings.T4RunAsBuildTemplate);
                    }
                }
            }
        }

ご覧のとおり、結果のクリアは多くのことに依存します。最初に設定します(GUIまたは構成のどこに設定するかわかりませんが、チェックボックスから値を取得するようです)。2 番目の名前の配列には、すべてのビルド コマンド名が含まれているわけではありません。

したがって、解決策が表示されますが、Chirpy から独自のバージョンを変更および再構築/再デプロイする (およびプル リクエストを行う) 途中でのみです。

コードはコマンドとその名前に依存しません。(たとえば、再構築が欠落しています)

上記のメソッドを次のように変更できます。

this.eventsOnBuild.OnBuildBegin += ( scope, action ) =>
{
    if (action != vsBuildAction.vsBuildActionDeploy)
    {
        if (this.tasks != null)
        {
            this.tasks.RemoveAll();
        }

        if (settings.T4RunAsBuild && action != vsBuildAction.vsBuildActionClean)
        {
           Engines.T4Engine.RunT4Template(this.App, settings.T4RunAsBuildTemplate);
        }
    }
};

または、ラムダ式の代わりに同等のハンドラー メソッドを使用します。Chirp クラスのサブスクリプション OnStartupComplete メソッドに配置する必要があります。

購読解除は、同じクラスの OnDisconnection メソッドに配置する必要があります。(他のすべてのサブスクライブされたハンドラーについては...)

アップデート:

アドインが切断されても、Studio がすぐに閉じられるわけではありません。アドインをアンロードできました。そのため、OnDisconneconnection からも RemoveAll を呼び出す必要があります。(または、TaskList を削除して破棄する...)

アップデート2:

カスタム コマンドを作成して、ホットキーにバインドすることもできます。

于 2013-12-20T01:32:05.093 に答える