插件介绍

在vs里,对选中的变量定义块进行格式化,效果见下图

开发环境:vs2008

开发语言:C#

插件功能:将以下变量定义

vector<map<int>>vecMap;

vector<map<int>>vecMap;

vector<map<int> >         vecMap;

vector<map<int> >vecMap;

char*p;

char *p;

char*p ;

char *p ;

char* p =null;

doubled=1.0;

unsignedintnCount=0;

格式化为:

vector<map<int>>  vecMap;

vector<map<int>>   vecMap;

vector<map<int> >  vecMap;

vector<map<int> >  vecMap;

char*              p;

char *             p;

char*              p;

char *             p;

char*              p       =null;

double             d       = 1.0;

unsignedint        nCount  = 0;

插件使用方法:

将插件对应的dll和AddIn文件放到“C:\Users\【用户名】\Documents\Visual Studio 2008\addins”目录下。

如果你是用的VS2010,将FormatVariableDefine.AddIn文件中的两处 <Version>9.0 改为 <Version>10.0。其他版本对照着修改应该能行,我没有环境没有测试。

注意:AddIn文件中指定了对应dll的路径,请确保相对路径(或绝对路径)正确。

打开vs2008就可以在tool菜单项看到菜单项:Foramt variable Define,同时在代码编辑区的右键菜单中也有同样的菜单。

鼠标选中要格式化的代码,使用该命令即可。

插件开发过程

一 生成模板工程

打开vs2008,新建工程,选择其他工程类别中的扩展->visual studio add-in模板

点OK,进入下面的界面,点NEXT。

然后一路NEXT,到这个页面。根据情况勾选,我是勾选了上面两个选项。

然后NEXT,到FINISH结束,生成模板工程。

二 添加菜单响应代码

模板代码中已经帮我们在tools菜单项下面添加好了我们要的菜单项,接下来我们只需要编写菜单响应的代码即可。

		public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)
{
handled = false;
if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault)
{
if(commandName == "FormatVariableDefine.Connect.FormatVariableDefine")
{
//Add you code here handled = true;
return;
}
}
}

回头看看我们要实现的功能,格式化选中的代码块,所以要先得到选中的代码块,然后从中分离出数据类型、变量名和等号赋值这3个部分。然后将这3部分对齐就OK了!

以下是相关代码(参照http://www.cnblogs.com/junqilian/archive/2008/04/07/1140963.html这篇文章的代码+自己查阅MSDN,鼠标选中代码中的TextSelection,然后F1 =.=):

                    TextSelection select = ((TextSelection)_applicationObject.ActiveDocument.Selection);
int nTopLine = select.TopLine;
int nBottomLine = select.BottomLine;
bool bLastLineEmpty = select.BottomPoint.AtStartOfLine;
select.GotoLine(nTopLine, true);
select.LineDown(true, nBottomLine - nTopLine);
select.EndOfLine(true); if (bLastLineEmpty)
select.StartOfLine(vsStartOfLineOptions.vsStartOfLineOptionsFirstColumn, true);
string selectedCode = select.Text;
string outCode = CodeSmart.AlignText(selectedCode); //对齐选中文本
select.Insert(outCode, (int)vsInsertFlags.vsInsertFlagsCollapseToEnd);
handled = true;
return;

代码中格式化字符串的具体工作交给CodeSmart类处理了,没啥技术含量,无非是找关键字罢了。

代码写好了,编译OK,F5运行起来会启动一个新的vs工程,我们可以在插件编写的工程里面下断点,在新的vs工程中执行插件的命令来进行调试。

三 添加右键菜单

下面我们更进一步,在代码编辑区的右键菜单中添加一个新的菜单项,执行同样的格式化操作。

首先要创建菜单,然后把菜单添加到右键菜单中,以下是我参考的代码链接(他生成的是二级菜单,我不想那么麻烦,就改成了一级菜单)

http://bbs.csdn.net/topics/330038973

http://download.csdn.net/detail/jingzhongrong/1205140

先在OnConnection函数中添加右键菜单项

                //下面是添加右键菜单的代码
CommandBars commandBars = ((CommandBars)_applicationObject.CommandBars);
CommandBar commandBar = (CommandBar)commandBars["Code Window"]; //下面的代码在右键菜单中建立一级菜单
/*
this.internalInfo.Pop =
(CommandBarPopup)(CommandBarControl)commandBar.Controls.Add(
MsoControlType.msoControlPopup, 1, null, 1, true );
this.internalInfo.Pop.Caption = "&FormatVariableDefine"; //菜单项显示内容
this.internalInfo.Pop.Enabled = true; //可用
this.internalInfo.Pop.Visible = true; //可见
this.internalInfo.Pop.BeginGroup = true;//添加分隔线
*/ try
{
Command cmdFormatVarDef = commands.AddNamedCommand2(
_addInInstance,
"FormatVariableDefineRightClick",
"&FormaT Variable Define",
"Format Variable Define",
true,
0,
ref contextGUIDS,
(int)vsCommandStatus.vsCommandStatusSupported +
(int)vsCommandStatus.vsCommandStatusEnabled,
(int)vsCommandStyle.vsCommandStylePictAndText,
vsCommandControlType.vsCommandControlTypeButton
);
//cmdFormatVarDef.AddControl(this.internalInfo.Pop.CommandBar, 1);//加到右键菜单的internalInfo项下,成为二级菜单
cmdFormatVarDef.AddControl(commandBar, 1);//直接加在右键菜单里面
}
catch (System.ArgumentException)
{
}

然后到Exec函数中,添加对应的响应,把之前的代码:

				if(commandName == "FormatVariableDefine.Connect.FormatVariableDefine")

改成

				if(commandName == "FormatVariableDefine.Connect.FormatVariableDefine" ||
commandName == "FormatVariableDefine.Connect.FormatVariableDefineRightClick")

即可。

四 给插件对应的命令添加快捷键

高手们都是很喜欢用快捷键的,所以我给大家找了个文章,怎么设置vs中菜单项的快捷键,文章在这里

http://blog.csdn.net/tms_li/article/details/7255964

大家应该一看就会啦。=.=

最后

那些想让自己的代码更美观更漂亮而又跟我一样懒的同学们,赶快来试试这个插件吧,虽然这是一个东抄西拼的东西,不过用起来还真是挺顺手的!

下载地址(目前dll不是最新版,有一点代码在公司忘记上传到github上了,下周一去更新一下):

https://raw.github.com/sun2043430/vs2008_format_variable_define_plugin/master/FormatVariableDefine/FormatVariableDefine.AddIn(显示的是文本,复制出来保存为FormatVariableDefine.AddIn)

https://github.com/sun2043430/vs2008_format_variable_define_plugin/raw/master/FormatVariableDefine/Project1.dll

使用方法:

https://raw.github.com/sun2043430/vs2008_format_variable_define_plugin/master/FormatVariableDefine/how_to_use%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E.txt

VS插件开发——格式化变量定义语句块的更多相关文章

  1. [C][变量作用域]语句块

    概述 C语言作用域有点类似于链式结构,就是下层能访问上层声明的变量,但是上层则不能访问下层声明的变量: #include <stdio.h> #define TRUE 1 int main ...

  2. C语言变量声明问题——变量定义一定要放在所有执行语句/语句块的最前面吗?

    报错信息:error C2065: 'salary' : undeclared identifier #include <stdio.h> void main(){ printf(&quo ...

  3. 线程系列07,使用lock语句块或Interlocked类型方法保证自增变量的数据同步

    假设多个线程共享一个静态变量,如果让每个线程都执行相同的方法每次让静态变量自增1,这样的做法线程安全吗?能保证自增变量数据同步吗?本篇体验使用lock语句块和Interlocked类型方法保证自增变量 ...

  4. .NET基础 一步步 一幕幕[循环、逻辑语句块]

    循环.逻辑语句块   好久不写博客了,断更了好几天了,从上周五到今天,从北京到上海,跨越了1213.0公里,从一个熟悉的城市到陌生的城市,还好本人适应力比较好,还有感谢小伙伴的接风咯,一切都不是事,好 ...

  5. static{ }语句块详解

    static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法.举ge例子: public class Test { public static i ...

  6. begin-end语句块在mysql中的使用问题

    在最近在通过navicate连接mysql数据库时,进行查询操作: delimiter $$BEGIN SET @a=1; if (@a > 0) THEN SELECT COUNT(*) fr ...

  7. 转 java中static{}语句块详解

    原文地址:http://blog.csdn.net/lubiaopan/article/details/4802430     感谢原作者! static{}(即static块),会在类被加载的时候执 ...

  8. java中static{}语句块详解

    static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法,下面我们详细的讨论一下该语句块的特性及应用. 一.在程序的一次执行过程中,stati ...

  9. 关于java的static语句块

    声明:转载请注明出处 static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法,下面我们详细的讨论一下该语句块的特性及应用. 一.在程序的一次 ...

随机推荐

  1. iOS网络开发-AFNetworking请求asp.net WebService

    看到园子有位朋友需要使用AFN框架请求 WebService,所以就整理了一下,demo下载链接在底部 编写WebService可以看这篇博客 http://www.cnblogs.com/linmi ...

  2. 两个textarea 同时变化高度

    <html><head><script type="text/javascript" src="/jquery/jquery.js" ...

  3. IOS 表视图(UITableVIew)的使用方法(5)表视图的编辑功能(删除)

    默认的,如果表视图支持编辑,那用户可以通过两种方式来删除某些行,其一为单击左侧的红色按钮后行右侧显示“Delete”按钮,其二为在单元行上的手指向左滑动,“Delete”按钮也会出现供用户单击.无论哪 ...

  4. 基于FPGA的key button等开关消抖,按键消抖电路设计

    最近要用上一个key消抖的功能.于是找到了之前写的并放入博客的程序,发现居然全部有问题.http://www.cnblogs.com/sepeng/p/3477215.html —— 有问题,包括很多 ...

  5. ASP.NET jQuery 随笔 使用jQuery UI的Autocomplete方法实现文本框的自动搜索填充功能

    首先当然是去下载JQuery UI ,这里这里是下载地址http://jqueryui.com/ 第一步是点击这里 第二步选择你想要下载的主题进行下载 我这里是选择的cupertino主题包 点击圆圈 ...

  6. python数据库连接

    现在装python基本都内置了sqlite连接,写成如下形式即可 from sqlite3 import dbapi2 as sqlite 如果需要insert或update东西,之后的cur必须co ...

  7. QQwry

    http://blog.runphp.net/archives/156 http://wenku.baidu.com/link?url=yvd3_EpMM66r6H4qkx3oqcaU2JZNAQv_ ...

  8. 打包mysql、tomcat、jdk为一个软件

    打包mysql.tomcat.jdk为一个软件 博客分类: 成长中的点滴  . 我们在本地开发web应用的时候,直接在IDE里面就可以完成jdk.容器.数据库的配置和集成. 但是如果当我们把应用程序交 ...

  9. php 登录实例演示

    <pre name="code" class="python">一.模板的使用 (重点) a.规则 模板文件夹下[TPL]/[分组文件夹/][模板主 ...

  10. BZOJ 1022 小约翰的游戏 (Anti-Nim游戏)

    题解:注意题目中规定取到最后一粒石子的人算输,所以是Anti-Nim游戏,胜负判断为: 先手必胜: 1.所有堆的石子数都为1且游戏的SG值为0: 2.有些堆的石子数大于1且游戏的SG值不为0. #in ...