您的位置:首页 - 教程 - Visual Studio - 正文
制作VS插件,对using排序

首先来看看VS自带的using整理功能:

长短不一,看着让人生厌!这是哪个门子的整理?越来越乱了好吗!

难道就没有一款,由短到长——金字塔搬的排序方案吗?

于是各种百度:

“VS 插件 using排序”

“VS 对using由短到长排序”

“难道就没有一款对using排序的插件吗???”

……

大家看我搜索的关键词就知道搜索结果如何了,所以,只好自己动手,丰衣足食。

先看看效果:

 

说干就干,我们来打开VS,新建一个项目……等等,好像少了什么。

“作为菜鸟,不知道怎么入手啊,怎么写VS插件啊?”

这个问题问的好,于是,百度:

“如何编写VS插件?”(并非给百度做广告,而是中文搜索百度确实比较好用……)

通过各种搜索到的文章,我们知道了,需要安装VisualStudio SDK的东西。

接下来创建一个项目,哪,图:

项目创建好之后,会出现这样一个页面:

具体什么意思呢?

我也不知道,不过,大概就是让我们添加新建项,有以下模板:

那么,这些模板有都是些什么玩意儿呢?

没错,我想大家都知道了,其实本人也不知道。

于是,我们又找到这样一篇文章:如何扩展 Visual Studio 编辑器

然后,根据我们的需求呢,选择“Custom Command”。

“不对啊,那篇文章并没有介绍到Custom Command,楼主你是怎么知道选择这个的?”

哎,年轻人就是问题多,我会告诉你我根据文章挨个试了个遍?我只会告诉你,是这样的:

回归正题。

VS自动创建了三个文件:

1、xxx.cs

2、xxxPackage.cs

3、xxxPackage.vsct

“这三个文件又都是做什么的呢?”

年轻人问题真多,不会打开文件看看啊?

具体我也不多做解释了,反正,我们的代码写在“MenuItemCallback”里就对了。

“我看是你解释不了吧?”

我擦,“码艰不拆”(写代码已经如此的艰难,有些事就不要拆穿)好吗!

  private void MenuItemCallback(object sender, EventArgs e)
         {
             var dte = this.ServiceProvider.GetService(typeof(DTE)) as DTE;//获取服务,这玩意儿……可以理解为vs的服务对象吧。
             var selection = dte.ActiveDocument.Selection as TextSelection;//当前文档中选中的部分
             if (selection == null)
                 return;
             var text = selection.Text.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);//分割一下
 
             //var lines = text.OrderBy(l => l.Length);//以这种方式排序,有些字数多的反而比较短,例如 Liiiii 和 Wwww 哪个长?
 
             var bmp = new Bitmap(1200, 60);
             var g = Graphics.FromImage(bmp);// 利用GDI来计算一下字符串的长度
             var font = this.GetFont();//获取vs设置的字体,字体大小
             var temp = new List<dynamic>();
             foreach (var line in text)
             {
                 var size = g.MeasureString(line, font);//计算字符串长度
                 temp.Add(new { Text = line, Width = size.Width });
             }
             font.Dispose();
             g.Dispose();
             bmp.Dispose();
 
             var sb = new StringBuilder();
             foreach (var line in temp.OrderBy(t => t.Width))//排序
             {
                 sb.AppendLine(line.Text);
             }
 
             selection.Insert(sb.ToString(), (int)vsInsertFlags.vsInsertFlagsCollapseToEnd);//重新写入文档
 
         }
 
 private Font GetFont()
         {
             //本来应该通过vs对象来获取到字体的,但是搜了半天,实在找不到该调用哪个API
             //但是以本人的聪明才智,马上就想到了办法
             var setting = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\Visual Studio 2015\\Settings\\CurrentSettings.vssettings";
             var xml = new XmlDocument();
             xml.Load(setting);
             foreach (XmlNode item in xml.GetElementsByTagName("Category"))
             {
                 if (item.Attributes["FontName"] != null && item.Attributes["FontSize"] != null)
                 {
                     return new Font(item.Attributes["FontName"].Value, float.Parse(item.Attributes["FontSize"].Value));
                 }
             }
             return new Font("新宋体", 13);
         }
View Code

代码写完,F5一下:

还真TM不错,你看这代码,多舒服,如金字塔般的堆砌,写代码也是一门艺术啊!

接下来我们继续探究一下.vsct文件,我们又找到一篇文章:

绑定的键盘快捷方式菜单

我们修改一下菜单按钮的文字:

再添加一个快捷键:

 

大功告成!

至此,我们完成了一个“金字塔式排序,艺术化”我们代码的超级牛逼的VS插件!

 

>>点我下载<<


评论: