首先來看看VS自帶的using整理功能:html
長短不一,看着讓人生厭!這是哪一個門子的整理?愈來愈亂了好嗎!編輯器
難道就沒有一款,由短到長——金字塔搬的排序方案嗎?ide
因而各類百度:post
「VS 插件 using排序」字體
「VS 對using由短到長排序」ui
「難道就沒有一款對using排序的插件嗎???」this
……url
你們看我搜索的關鍵詞就知道搜索結果如何了,因此,只好本身動手,豐衣足食。spa
先看看效果:插件
說幹就幹,咱們來打開VS,新建一個項目……等等,好像少了什麼。
「做爲菜鳥,不知道怎麼入手啊,怎麼寫VS插件啊?」
這個問題問的好,因而,百度:
「如何編寫VS插件?」(並不是給百度作廣告,而是中文搜索百度確實比較好用……)
經過各類搜索到的文章,咱們知道了,須要安裝VisualStudio SDK的東西。
接下來建立一個項目,哪,圖:
項目建立好以後,會出現這樣一個頁面:
具體什麼意思呢?
我也不知道,不過,大概就是讓咱們添加新建項,有如下模板:
那麼,這些模板有都是些什麼玩意兒呢?
沒錯,我想你們都知道了,其實本人也不知道。
因而,咱們又找到這樣一篇文章:如何擴展 Visual Studio 編輯器
而後,根據咱們的需求呢,選擇「Custom Command」。
「不對啊,那篇文章並無介紹到Custom Command,樓主你是怎麼知道選擇這個的?」
哎,年輕人就是問題多,我會告訴你我根據文章挨個試了個遍?我只會告訴你,是這樣的:
迴歸正題。
VS自動建立了三個文件:
一、xxx.cs
二、xxxPackage.cs
三、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插件!
>>點我下載<<