在上一篇(VS2010 Extension (1)实践)里,主要展示了如何使用MEF扩展VS2010,来扩展编辑控制和展现自己的UI;在实现QuickToolbar的时候,发现MEF仅仅提供了很基本的编辑控制,如果需要高级的操作,比如注释选择的代码,就捉襟见肘,很是麻烦。
本篇我将展示如何深入挖掘VS2010 Extension,使它成为锋利的军刀,而不是绣花枕头。鉴于此,这里就从上面提到了的Feature——注释和取消注释选择的代码来剖析,希望可以为大家拓宽思路,更好的利用VS2010。
首先回顾一下上篇中的实现,当时是基于TextViewLine做注释代码的,这里有两个潜在问题:其一,TextViewLine,顾名思义,是“可视区域”的行,所以如果选择超出可视区域,超出的部分就没有注释掉;其二,当选择的结束位置在行的结尾时,无法实现IDE注释代码后保持Caret在选择结尾而不跳到下一行的行为,当尝试自己重新选择并移动Caret就会收到ITextSpanshot无效的异常。
上面提到了VS2010 Extension对编辑器的编辑行为的控制能力仅仅提供了通用的,比如Cut/Copy/Paste等等,而其他的诸如注释/取消注释代码,添加、删除、导航到Bookmark等程序员常用功能没有暴露出来,具体可以参考IEditorOperations Interface(http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.text.operations.ieditoroperations_methods%28VS.100%29.aspx),这里的所有Member表达了其所支持的编辑操作。总之,这条路只有这么几个目的地。
那么,还有其他方法吗?貌似走到了死胡同了,但是当我们使用IDE时候,却是可以很容易的通过Edit菜单找到所有的功能的,问题是,它们要怎样才能为我所用呢?
我首先想到的是在VSSDK中找找,结果一个名字看起来很顺眼的接口撞到眼里,它就是IVsUIShell Interface(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 windows. provided 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
分享到:
相关推荐
LabGuide-long-大语言模型基础与Intel Extension for Transformers部署实践
这是一个通用的 hello world 实践。 可以从这里开始最简单的 Python C 扩展示例。 01-嘿人 这是一种从 Python 获取参数的 C 扩展实践。 heyman 函数将回显传递的名称和编号。 02-添加 它是一个加法函数,它不仅会...
概述本次会议向与会者介绍了一个端对端流程,以使用SAP Extension Suite中的最佳实践来构建扩展。 该研讨会将指导您逐步完成使用SAP Cloud应用程序编程模型(CAP)创建新的数据模型和服务集成在SAP API Business Hub...
前几天稍微看了一下Ratchet,并且实践了一下它官方例子。所以现在就将实践的过程记录下来。 在具体实践之前先将Ratchet是什么东东,要先说明一下。以下的英文是从官方copy过来的 Ratchet is a loosely coupled ...
适用于Chrome和Firefox的React Extension样板 仍在开发中!... 使用ESLint,Jest,React-StoryBook,Webpack等实现所有最佳Javascript实践。 资料来源: : 安装 :chequered_flag: 安装此样板
通过准确的数据和快速响应时间,您的实践将消除与传统购买技术相关的常见错误和浪费努力。重要说明:需要订阅方法采购。如果您有任何问题或建议,请访问https://support.methodusa.com以获取有用的资源。想要提高你...
chrome-extension-hands-on 关于 请参阅。 执照 麻省理工学院: :
# go to the extension examples folder cd jupyterlab-extension-examples # create a new environment conda env create # activate the environment conda activate jupyterlab-extension-examples # go to the ...
onepassword-app-extension-xamarin Xamarin.iOS与AgileBits 1Password应用程序扩展库的绑定 用法 下载并将其引用添加到您的项目中。 创建一个按钮并将其添加到您的密码UITextField中: if ( ...
生物识别(用于指纹或面部识别的简便易用的最佳实践) 警报(修复全局警报) SpeechToText(设置用于语音识别的计时器) 权限(使用简单的回调轻松获得权限) 位置(通过回调获取位置,无需担心权限代码) ...
随着教程程序具有易于掌握的内容,深入的说明,更新的版本和实用的功能,可以保证该单一的教程网站将使应聘者获得完整,逐步,系统化和基于实践的知识。支持多个示例。 我们很高兴为所有PHP学习者提供帮助,并始终...
junit-extension 背景 原生的Junit无法满足我们在自动化测试实践过程中的碰到一些需求,比如 管理人员希望统计测试组每个成员开发的用例数目, 要是每个用例都能够有注释 在本地调试测试用例时,测试工程师希望只运行...
适用于Chrome的RockTech Extension 通过在需求点为用户提供业务洞察力,关键笔划指导和最佳实践来提高Salesforce的采用率。根据客户的配置,RockTech:trade_mark:根据用户的角色和流程提供用户需要了解的信息。 支持...
SkySmart助手如果您曾经做过SkySmart测试或家庭作业,那么您就会知道它们在所有现代Web设计实践中有多糟糕: 防止选择文字禁止打开DevTools 在页面上阻止搜索此扩展将帮助您修复SkySmart的所有缺陷。 如“安装”部分...
doctor-jones-extension 链接 · 相关项目 · · More to be developed... 琼斯医生 :pill: 一个能够美化网页中文排版(包括中英文混排)的扩展 特性 遵循 和其他中文排版最佳实践,格式化你正在浏览的页面 ...
TPF-OO2 开发了Web扩展,以最终交付...Web-Extension-Search-Matches # Modulo donde se encuentra el proyecto final de la materia OO2 web-extension-examples # Modulo donde hay ejemplos de pruebas de web e
语言:English (United States...通过在需要时为用户提供业务洞察力,按键指导和最佳实践,从而提高Salesforce的采用率。 RockTech:trade_mark:根据客户的配置量身定制,可根据用户的角色和流程提供用户需要了解的内容。
:ram: @ testing-library / react-hooks -React钩子鼓励鼓励良好测试实践的测试实用程序 :dog_face: 赫斯基-轻松使用git钩子 :high_voltage: 自动安装项目的对等依赖项- :card_index_dividers: 基本模块结构 :...
这是一个启动文件夹,用于创建带有 1 个弹出页面的 chrome 扩展。
特点除了相关资源,样本资料,参考图片,一般最佳实践等,我们还将主要研究以下关键部分:★URL更新的URL(不包括默认的字母数字字符串)可以带来更好的搜索结果。 连同样本和参考图像,查看技巧和一般最佳实践。 ...