VS2010 Extension实践(2)

在上一篇(VS2010 Extension (1)实践)里,主要展示了如何使用MEF扩展VS2010,来扩展编辑控制和展现自己的UI;在实现QuickToolbar的时候,发现MEF仅仅提供了很基本的编辑控制,如果需要高级的操作,比如注释选择的代码,就捉襟见肘,很是麻烦。

本篇我将展示如何深入挖掘VS2010 Extension,使它成为锋利的军刀,而不是绣花枕头。鉴于此,这里就从上面提到了的Feature——注释和取消注释选择的代码来剖析,希望可以为大家拓宽思路,更好的利用VS2010。

首先回顾一下上篇中的实现,当时是基于TextViewLine做注释代码的,这里有两个潜在问题:其一,TextViewLine,顾名思义,是“可视区域”的行,所以如果选择超出可视区域,超出的部分就没有注释掉;其二,当选择的结束位置在行的结尾时,无法实现IDE注释代码后保持Caret在选择结尾而不跳到下一行的行为,当尝试自己重新选择并移动Caret就会收到ITextSpanshot无效的异常。

上面提到了VS2010 Extension对编辑器的编辑行为的控制能力仅仅提供了通用的,比如Cut/Copy/Paste等等,而其他的诸如注释/取消注释代码,添加、删除、导航到Bookmark等程序员常用功能没有暴露出来,具体可以参考IEditorOperationsInterface(http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.text.operations.ieditoroperations_methods%28VS.100%29.aspx),这里的所有Member表达了其所支持的编辑操作。总之,这条路只有这么几个目的地。

那么,还有其他方法吗?貌似走到了死胡同了,但是当我们使用IDE时候,却是可以很容易的通过Edit菜单找到所有的功能的,问题是,它们要怎样才能为我所用呢?

我首先想到的是在VSSDK中找找,结果一个名字看起来很顺眼的接口撞到眼里,它就是IVsUIShellInterface(http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.interop.ivsuishell%28VS.100%29.aspx),MSDN上市这么说的:

This interface provides access to basic windowing functionality, including access to and creation of tool windows and document windowsprovided by the environment.

也就是说这是一个由IDE提供的全局的Service,可以创建、访问工具窗口和编辑窗口。浏览一下这个所有Member,发现了一个叫IVsUIShell.PostExecCommand(...)(http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.interop.ivsuishell.postexeccommand%28VS.100%29.aspx)的方法,MSDN描述说通过它可以异步执行Command,那么,只要找到注释代码的Command,在通过这个接口就可以实现VS IDE一样的注释代码的Feature了。酷毙了,就是它,当怎么得到它呢?现在请留心MSDN上的解释,就是上面我使用红色粗体表示出来的部分——这个由IDE提供的全局的Service,那么可以通过Package.GetGlobalService(...)(http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.package.getglobalservice%28VS.100%29.aspx)来获取:

IVsUIShell shell = Package.GetGlobalService(typeof(IVsUIShell)) as IVsUIShell;

接下来是找到自己需要Command,然后PostExecCommand就搞定了;而VS提供的Command有两部分组成:Guid和CommandID,这个大部分都在VSConstants Class(http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.vsconstants%28VS.100%29.aspx)里面,以注释代码为例,其Guid是:VsConstants.VSStd2k,而CommandID是VSConstants.VSStd2kCmdID.COMMENTBLOCK。下面是我包装的注释和取消注释的代码片段:

public static void ProcessComments(bool comment)

{

    IVsUIShell shell = Package.GetGlobalService(typeof(IVsUIShell)) as IVsUIShell;

    if (shell != null)

    {

        Guid std2k = VSConstants.VSStd2K;

        uint cmdId = comment ?

                  (uint)VSConstants.VSStd2KCmdID.COMMENT_BLOCK :

                  (uint)VSConstants.VSStd2KCmdID.UNCOMMENT_BLOCK;

        object arg = null;

        shell.PostExecCommand(ref std2k, cmdId, 0, ref arg);

    }

}

至此,我们通过VSSDK提供的能力,顺利的挖掘出VS2010 Extension的部分宝藏,你是不是也有点心动,要自己去挖掘一点呢?

PS:

本文所讲解内容是根据练习之作而进行的,如果需要源代码,请自行到GCDN论坛下载,代码和VSIX安装程序均匀更新

[VS2010扩展]浮动工具栏(http://gcdn.grapecity.com/showtopic-345.html

时间: 2024-11-08 04:25:21

VS2010 Extension实践(2)的相关文章

缓存池扩展 (Buffer Pool Extension)实践

SQL Server 2014缓存池扩展 (Buffer Pool Extension)功能可以将缓存池扩展到较快的SSD存储上.为内存比较紧张的系统提供了新的扩展途径. Buffer Pool 扩展可以带来以下好处: 提高随机I/O的吞吐量 降低I/O延迟 提高单位时间内处理事务的吞吐量 显著地提高读性能 以软件方式为客户实现了类似于混合硬盘的效果. 缓存池扩展支持以下两种模式: CW:只向SSD写入干净页. DW:双重写,即同时向SSD和硬盘写入脏页. 下面2张图里,C: 干净页  D:脏页

在VS2010中使用AStyle Extension

最近在做一个C++的SDK项目,对于那些会暴露给第三方开发者使用的接口文件,我们使用了一个叫做AStyle Extension的插件来做代码美颜(其实就是代码格式化). 下载方式1:通过Extension Manager下载 启动VS2010: 主菜单Tools > Extension Manager…: 左边选择Online Gallery,输入关键字“AStyle”. 下载方式2:通过页面下载 下载页面:https://visualstudiogallery.msdn.microsoft.c

VS2010单元测试入门实践教程

摘要:本教程不会介绍单元测试的基本理论知识,也不会和大家讨论在实际项目中是否需要写单元测试代码的问题.但是如果你此时想使用VS中的单元测试的工具来测试某个方法是否正确,可你又从来没真正实践过,那么本教程将带你一步一步使用VS2010集成的Unit Test进行断言(Assert)式验证数据的正确性,及代码覆盖率的查看. 关键词:Unit Test.单元测试.代码覆盖率.Assert.Twifly 正文: 在本入门教程中我们假设来测试一个简单的加法运算方法是否正确.该方法能够接受任意个参数,参数类

( 转)从四分钟到两秒——谈谈客户端性能优化的一些最佳实践

转:http://www.cnblogs.com/marvin/p/WinformOptimizSkill.html 背景 最近跟售后经理吃饭,他跟我再次谈起两年前为公司临时写的一个客户端,仍然非常激动的跟我说,这个客户端完爆了公司其他版本的客户端,包括最老的Delphi写的,Asp.Net写的,以及最新的Wpf写的客户端.无论是多么大的界面(集成的机房多),这个系统都是瞬间打开,而且运行非常稳定,一旦成功部署之后基本没有任何问题. 这个版本的客户端仅仅只是一个临时替代的版本:原来的Delphi

【OSG学习笔记之一:】OSG+VS2010+win7 64位环境搭建

虽然出生的时候,没有说过“Hello World!”,但是自从走上了编程之路,每一次输出“Hello World!”的时候,都觉得好比中了彩票大奖似的: 仔细算算,从2012年暑假到现在,经历了3年半的光阴,这段时间,不仅是知识.阅历.成长获得最大的一段,也是人生的一大转折点.在这期间,得以继续深造学习自己的专业,虽然踏入这行的时候,也是调剂来的,但是我用这3年的时间,恶补自己7年的不足:2015年,发生了三件大事,我毕业了,我工作了,我有女票了(三件事的重要程度递增):吃得苦中苦,方位人上人,

HAWQ实践(一)——为什么选择HAWQ

为了跟上所谓"大数据"技术的脚步,从两年前开始着手实践各种SQL-on-Hadoop技术,从最初的Hive,到SparkSQL,再到Impala,进行了一系列ETL.CDC.多维数据仓库.OLAP的实验.作为一名从业20年以上的DBA,从数据库的角度看,我的总体感觉是这些技术与传统的DBMS相比,功能不完善,性能差距很大,甚至很难找到一个可行的.相对完备的Hadoop数据仓库解决方案.这使我在实际应用中使用这些产品的时候总是感到顾此失彼.捉襟见肘.也可能是我做数据库的时间太长了,只会用

嵌入式实时操作系统μCOS原理与实践任务控制与时间的解析

/***********************************************************************************************************                                                uC/OS-II*                                          The Real-Time Kernel  RTOS* ***************

阿里云centos6.5实践编译安装LNMP架构web环境

LNMP 代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构. 本次测试需求: **实践centos6.5编译安装 LNMP生产环境 架构 web生产环境 使用 ngx_pagespeed 优化前端 xcache 优化php 用 google_perftools 优化nginx 和 php内存分配 ** 作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率. 作为负载均衡服务器:Nginx 既可以在内部直接支持Rail

使用VS2010开发Qt程序的一点经验(转载)

转载:http://www.cnblogs.com/csuftzzk/p/VS_Qt_Experience.html 导读 相比于Qt Creator,我更喜欢用VS2010来进行开发.虽然启动时间相对较慢,但是VS下强大的快捷键和丰富的插件,以及使用多年的经验,都让我觉得在开发过程中得心应手.其中最重要的一点是,有时候Qt Creator报的错误莫名其妙.要根据提示找到错误根源显得无从下手.而VS的一般错误说明都比较人性化,即便在某些时候无从解决,也可以通过搜索引擎大致定位出错误的源头.下面是