Visual Studio 巨集(Todo加到Tasklist中)
Visual Studio 有個滿不錯的功能,
就是在註解裡打上關鍵字(如TODO之類的),
這行註解就會出現在Tasklist裡面,
可是遇到 .js 的檔案就沒有幫我們自動加到Tasklist裡了,
下面提供用巨集的方式把Todo加到Tasklist裡:
Imports System Imports EnvDTE Imports EnvDTE80 Imports EnvDTE90 Imports System.Diagnostics Imports System.IO Imports System.Text.RegularExpressions Public Module JS_TODO_LIST Delegate Sub DelegateDoParse(ByVal filename As String) Private StrRegex As New Regex("") Sub Parse(ByVal filename As String) Dim reader As StreamReader 'Put in task list Dim tl As TaskList = DTE.Windows.Item(Constants.vsWindowKindTaskList).Object reader = File.OpenText(filename) Dim holefile As String = reader.ReadToEnd holefile = holefile.Replace(vbCrLf, vbCr).Replace(vbLf, vbCr).Replace(vbCr, vbCrLf) '一律換成Dos模式的換行符號 Dim m As System.Text.RegularExpressions.MatchCollection = StrRegex.Matches(holefile, "(^ *//.*TODO.*|^ *//.*#Region.*|^ *//.*#Memo.*)", RegexOptions.Multiline + RegexOptions.IgnoreCase) For Each item As Text.RegularExpressions.Match In m Dim l As Long = Split(holefile.Substring(0, item.Index), vbCrLf).Length '計算行數 Dim ti As TaskItem Select Case True Case item.Value.ToUpper Like "*TODO*" ti = TryCast(tl.TaskItems, TaskItems2).Add2("TODO", "Javascripts", item.Value.Trim, vsTaskPriority.vsTaskPriorityMedium, , False, filename, l, True, False, True) Case item.Value.ToUpper Like "*MEMO*" ti = TryCast(tl.TaskItems, TaskItems2).Add2("MEMO", "Javascripts", item.Value.Trim, vsTaskPriority.vsTaskPriorityMedium, , False, filename, l, True, False, True) Case item.Value.ToUpper Like "*REGION*" ti = TryCast(tl.TaskItems, TaskItems2).Add2("REGION", "Javascripts", item.Value.Trim, vsTaskPriority.vsTaskPriorityMedium, , False, filename, l, True, False, True) End Select Next tl.TaskItems.ForceItemsToTaskList() ' close the file reader.Close() End Sub Sub FindTODOsByFileName(ByVal filename As String) '刪掉舊的 Dim tl As TaskList = DTE.Windows.Item(Constants.vsWindowKindTaskList).Object For Each t As TaskItem In tl.TaskItems If StrRegex.IsMatch(t.Category, "(TODO|MEMO|REGION)") AndAlso t.FileName = filename Then t.Delete() End If Next Parse(filename) End Sub Sub FindAllTODOs() '刪掉舊的 Dim tl As TaskList = DTE.Windows.Item(Constants.vsWindowKindTaskList).Object For Each t As TaskItem In tl.TaskItems If StrRegex.IsMatch(t.Category, "(TODO|MEMO|REGION)") Then t.Delete() End If Next Dim piCollection As New Collection For Each proj As Project In DTE.Solution.Projects '尋找所有專案 If Not IsNothing(proj.ProjectItems) Then FindFiles(proj.ProjectItems, "js", AddressOf Parse) '遞回找所有副檔名是 "JS" 的 End If Next End Sub Sub FindFiles(ByVal pis As ProjectItems, ByVal extendFilename As String, ByRef ParseFunc As DelegateDoParse) '在專案中找特定副檔名的檔案 For Each pi As ProjectItem In pis Try If IsNothing(pi.ProjectItems) Then If Not IsNothing(pi) AndAlso Not IsNothing(pi.Name) Then If System.IO.Path.GetExtension(pi.FileNames(1)).ToUpper = "." + extendFilename.ToUpper Then ParseFunc(pi.FileNames(1)) '尋找 TODO 字串並加到 Tasklist 裡 End If End If Else FindFiles(pi.ProjectItems, extendFilename, ParseFunc) '遞回找所有副檔名是 "JS" 的 End If Catch ex As Exception End Try Next End Sub End Module
再塔配修改 EnvironmentEvents 便可以達到自動載入、更新的功能:
Private Sub DocumentEvents_DocumentSaved(ByVal Document As EnvDTE.Document) Handles DocumentEvents.DocumentSaved If System.IO.Path.GetExtension(Document.FullName).ToUpper = ".JS" Then JS_TODO_LIST.FindTODOsByFileName(Document.FullName) '存檔完成的重Load該檔的TaskList End If End Sub Private Sub SolutionEvents_Opened() Handles SolutionEvents.Opened JS_TODO_LIST.FindAllTODOs() '存檔完成的重Load該檔的TaskList End Sub