首先來看看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插件!
>>點我下載<<