visual-studio-2010 – Visual Studio 2010插件/代码,用于在每次构建之前清除“错误列表”警告

VS2010让我疯狂:每当我重建时,前一次编译中的“错误列表”警告都会保留,并且任何新警告都会添加到列表的末尾.随着时间的推移,这个列表变得非常冗长和笨拙.

我正在使用Chirpy 2.0工具在我的JS文件上运行JSHint和JSLint,这些工具会产生很多误报.

我一直在寻找一种简单的方法来清除这个窗口的内容,但是100%的时间工作的唯一手动机制是关闭并重新打开解决方案.不是很优雅.

我想编写一个小的VS插件或一些在编译之前调用的代码来清除这个列表,这样我就只能关注当前加载的文件的新警告.

我看到了一个用于Output窗口的.Clear()方法,但没有看到错误列表.这可行吗?

最佳答案 曾几何时我是一个加载项/ VSIX包/ MEF开发人员……

答案很快就会没有,但我必须在很长的路上做到这一点:

加载项,程序包(托管与否)可以分别访问VS服务级别.每个错误都属于报告者(如果他们像Chirpy那样管理它们),那么你就无法处理由Chirpy 2.0创建的错误

我对它的源代码进行了多次研究,并且它坚持使用名为TaskList的Singleton集合中的工具获得的错误.

删除集合元素是通过RemoveAll方法在最新版本的几个代码点中发生的:

>第一:关闭污水后.
>通过这个:

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或配置上设置的位置,但似乎从复选框中获取其值).
其次是不包含每个构建命令名称的名称数组.

所以我看到了一个解决方案,但仅限于从Chirpy修改和重建/重新部署您自己的版本(并发出Pull请求):

代码不依赖于命令及其名称. (例如缺少重建)

您可以更改上面的方法,如下所示:

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);
        }
    }
};

或者使用等效的处理程序方法而不是lambda表达式.
您将其置于Chirp类的订阅OnStartupComplete方法中.

取消订阅必须放在同一类的OnDisconnection方法中. (至于所有其他订阅的处理程序……)

更新:

当加载项断开连接时,并不意味着Studio将立即关闭.可以卸载加载项.所以你也应该从OnDisconneconnection调用RemoveAll. (或者删除并处理TaskList …)

UPDATE2:

您还可以创建自定义命令,并将其绑定到热键.

点赞