标签:
首先来看看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”里就对了。
“我看是你解释不了吧?”
我擦,“码艰不拆”(写代码已经如此的艰难,有些事就不要拆穿)好吗!
1 private void MenuItemCallback(object sender, EventArgs e) 2 { 3 var dte = this.ServiceProvider.GetService(typeof(DTE)) as DTE;//获取服务,这玩意儿……可以理解为vs的服务对象吧。 4 var selection = dte.ActiveDocument.Selection as TextSelection;//当前文档中选中的部分 5 if (selection == null) 6 return; 7 var text = selection.Text.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);//分割一下 8 9 //var lines = text.OrderBy(l => l.Length);//以这种方式排序,有些字数多的反而比较短,例如 Liiiii 和 Wwww 哪个长? 10 11 var bmp = new Bitmap(1200, 60); 12 var g = Graphics.FromImage(bmp);// 利用GDI来计算一下字符串的长度 13 var font = this.GetFont();//获取vs设置的字体,字体大小 14 var temp = new List<dynamic>(); 15 foreach (var line in text) 16 { 17 var size = g.MeasureString(line, font);//计算字符串长度 18 temp.Add(new { Text = line, Width = size.Width }); 19 } 20 font.Dispose(); 21 g.Dispose(); 22 bmp.Dispose(); 23 24 var sb = new StringBuilder(); 25 foreach (var line in temp.OrderBy(t => t.Width))//排序 26 { 27 sb.AppendLine(line.Text); 28 } 29 30 selection.Insert(sb.ToString(), (int)vsInsertFlags.vsInsertFlagsCollapseToEnd);//重新写入文档 31 32 } 33 34 private Font GetFont() 35 { 36 //本来应该通过vs对象来获取到字体的,但是搜了半天,实在找不到该调用哪个API 37 //但是以本人的聪明才智,马上就想到了办法 38 var setting = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\Visual Studio 2015\\Settings\\CurrentSettings.vssettings"; 39 var xml = new XmlDocument(); 40 xml.Load(setting); 41 foreach (XmlNode item in xml.GetElementsByTagName("Category")) 42 { 43 if (item.Attributes["FontName"] != null && item.Attributes["FontSize"] != null) 44 { 45 return new Font(item.Attributes["FontName"].Value, float.Parse(item.Attributes["FontSize"].Value)); 46 } 47 } 48 return new Font("新宋体", 13); 49 }
代码写完,F5一下:
还真TM不错,你看这代码,多舒服,如金字塔般的堆砌,写代码也是一门艺术啊!
接下来我们继续探究一下.vsct文件,我们又找到一篇文章:
我们修改一下菜单按钮的文字:
再添加一个快捷键:
大功告成!
至此,我们完成了一个“金字塔式排序,艺术化”我们代码的超级牛逼的VS插件!
>>点我下载<<
标签:
原文地址:http://www.cnblogs.com/LCHL/p/5519520.html