zoukankan      html  css  js  c++  java
  • VS插件开发——格式化变量定义语句块


    插件介绍

    在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 ;

       charp =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【用户名】DocumentsVisual Studio 2008addins”目录下。

    如果你是用的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


  • 相关阅读:
    要如何用[ZT]sendmessage來切換PageControl1 的TabSheet2呢
    Delphi 常用API 函数
    [ZT]如何得到其他程序的Richedit中的RTF数据
    转帖一篇关于DELPHI调试的文章AQTime
    讀取股票資料檔與指標計算方法之封裝
    GC的三代回收机制
    SQL语句的解析过程
    .Net 垃圾回收机制整理
    美国人吃了交通罚单怎么办?
    Ihttphandler,Ihttpmodule
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3323137.html
Copyright © 2011-2022 走看看