強迫症的福利——個人第一個VS插件,對using排序!

首先來看看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         }
View Code

代碼寫完,F5一下:

還真TM不錯,你看這代碼,多舒服,如金字塔般的堆砌,寫代碼也是一門藝術啊!

接下來咱們繼續探究一下.vsct文件,咱們又找到一篇文章:

綁定的鍵盤快捷方式菜單

咱們修改一下菜單按鈕的文字:

再添加一個快捷鍵:

 

大功告成!

至此,咱們完成了一個「金字塔式排序,藝術化」咱們代碼的超級牛逼的VS插件!

 

>>點我下載<<

相關文章
相關標籤/搜索