強迫症的福利——我的第一個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”里就對了。

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

我擦,“碼艱不拆”(寫代碼已經如此的艱難,有些事就不要拆穿)好嗎!

 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插件!

 

>>點我下載<<


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM