2009-08-09 35 views
13

có cách nào (cài đặt? "Macro"? Extension?) Mà tôi có thể chỉ đơn giản là chuyển đổi phác thảo sao cho chỉ phần sử dụng và phương pháp của tôi thu gọn dòng chữ ký của họ, nhưng ý kiến ​​của tôi (tóm tắt và đôi slash ý kiến) và các lớp học vẫn mở rộng?Visual Studio: Thu gọn phương thức, nhưng không phải Comments (Tóm tắt, vv)

Ví dụ:

1) uncollapsed

using System; 
using MachineGun; 

namespace Animals 
{ 

    /// <summary> 
    /// Angry animal 
    /// Pretty Fast, too 
    /// </summary> 
    public partial class Lion 
    { 
     // 
     // Dead or Alive 
     public Boolean Alive; 

     /// <summary> 
     /// Bad bite 
     /// </summary> 
     public PieceOfAnimal Bite(Animal animalToBite) 
     { 
       return animalToBite.Shoulder; 
     } 

     /// <summary> 
     /// Fatal bite 
     /// </summary> 
     public PieceOfAnimal Kill(Animal animalToKill) 
     { 
       return animalToKill.Head; 
     } 
    } 
} 

2) Collapsed (sau đây là kết quả của tôi mong muốn):

using[...] 

namespace Animals 
{ 

    /// <summary> 
    /// Angry animal 
    /// Pretty Fast, too 
    /// </summary> 
    public partial class Lion 
    { 
     // 
     // Dead or Alive 
     public Boolean Alive; 

     /// <summary> 
     /// Bad bite 
     /// </summary> 
     public PieceOfAnimal Bite(Animal animalToBite)[...] 

     /// <summary> 
     /// Fatal bite 
     /// </summary> 
     public PieceOfAnimal Kill(Animal animalToKill)[...] 
    } 
} 

Đây là cách tôi thích nhìn thấy tôi tệp lớp (biểu mẫu thu gọn). Tôi đã làm việc sụp đổ bằng tay một triệu lần và tôi nghĩ rằng nên có một cách để tự động hóa/tùy chỉnh/mở rộng VS để làm điều đó theo cách tôi muốn?

Mỗi khi tôi gỡ lỗi/nhấn điểm ngắt, nó không thu thập và làm rối tung mọi thứ. Nếu tôi sụp đổ thông qua sự sụp đổ của trình đơn ngữ cảnh để phác thảo vv nó cũng sụp đổ ý kiến ​​của tôi mà không phải là mong muốn.

Đánh giá cao sự trợ giúp của bạn!

Trả lời

8

Ctrl M, Ctrl O

Thu gọn thành định nghĩa.

Từ thời điểm này, macro có thể không quá khó để viết.

Giống như tìm kiếm /// <summary> ... và chuyển đổi phác thảo. Sau đó bọt, rửa sạch, lặp lại.

0

Không có gì tích hợp trong Visual Studio, cho phép bạn thu gọn các vùng mã theo cách này. Nó có thể là có thể với một vĩ mô, nhưng tôi không nghĩ rằng nó sẽ rất đơn giản để viết. Visual Studio 2010 có thể cung cấp một số cứu trợ bằng cách cho phép bạn viết một trình cắm thêm thực tế có khả năng truy cập trực tiếp hơn vào trình phân tích cú pháp cú pháp, nhưng đó là suy đoán thuần túy tại thời điểm này.

1

Có thể liên kết này sẽ giúp bạn: http://weblogs.asp.net/mrdave/archive/2004/09/17/230732.aspx. Bạn có thể bao bọc mọi thứ ở các vùng để bạn có thể quản lý và giữ lại các nhận xét chưa được mở. Ngoài ra, bạn có thể sửa đổi macro đó để phù hợp với nhu cầu của mình.

3

Tôi đã tạo macro sẽ cho phép thu gọn thành viên. bạn có thể đặt bộ lọc tùy chỉnh của bạn trong hàm IncludeMember ví dụ như trong ví dụ này tôi sụp đổ tất cả mọi thứ nhưng ý kiến ​​và sự đếm

' filter some mebers. for example using statemets cannot be collapsed so exclude them. 
Function IncludeMember(ByVal member As EnvDTE.CodeElement) 

    If member.Kind = vsCMElement.vsCMElementIDLImport Then 
     Return False 
    ElseIf member.Kind = vsCMElement.vsCMElementEnum Then 
     Return False ' I do not want to colapse enums 
    End If 

    Return True 

End Function 

Sub CollapseNodes() 

    ' activate working window 
    DTE.Windows.Item(DTE.ActiveDocument.Name).Activate() 

    ' expand everything to start 

    Try 
     DTE.ExecuteCommand("Edit.StopOutlining") 
    Catch 
    End Try 

    Try 
     DTE.ExecuteCommand("Edit.StartAutomaticOutlining") 
    Catch 
    End Try 


    ' get text of document and replace all new lines with \r\n 
    Dim objTextDoc As TextDocument 
    Dim objEditPt As EnvDTE.EditPoint 
    Dim text As String 
    ' Get a handle to the new document and create an EditPoint. 
    objTextDoc = DTE.ActiveDocument.Object("TextDocument") 
    objEditPt = objTextDoc.StartPoint.CreateEditPoint 
    ' Get all Text of active document 
    text = objEditPt.GetText(objTextDoc.EndPoint) 
    text = System.Text.RegularExpressions.Regex.Replace(_ 
        text, _ 
        "(\r\n?|\n\r?)", ChrW(13) & ChrW(10) _ 
       ) 

    ' add new line to text so that lines of visual studio match with index of array 
    Dim lines As String() = System.Text.RegularExpressions.Regex.Split(vbCrLf & text, vbCrLf) 

    ' list where whe will place all colapsable items 
    Dim targetLines As New System.Collections.Generic.List(Of Integer) 

    ' regex that we will use to check if a line contains a #region 
    Dim reg As New System.Text.RegularExpressions.Regex(" *#region(|$)") 

    Dim i As Integer 
    For i = 1 To lines.Length - 1 

     If reg.Match(lines(i)).Success Then 
      targetLines.Add(i) 
     End If 

    Next 


    Dim fileCM As FileCodeModel 
    Dim elts As EnvDTE.CodeElements 
    Dim elt As EnvDTE.CodeElement 

    Dim projectItem = DTE.ActiveDocument.ProjectItem 

    Dim temp = projectItem.Collection.Count 

    Dim b = DirectCast(DirectCast(projectItem.Document, EnvDTE.Document).ActiveWindow, EnvDTE.Window).ContextAttributes 

    fileCM = projectItem.FileCodeModel 
    elts = fileCM.CodeElements 
    For i = 1 To elts.Count 
     elt = elts.Item(i) 
     CollapseE(elt, elts, i, targetLines) 
    Next 

    ' now that we have the lines that we will plan to collapse sort them. it is important to go in order 
    targetLines.Sort() 

    ' go in reverse order so that we can collapse nested regions 
    For i = targetLines.Count - 1 To 0 Step -1 

     GotoLine(targetLines(i) & "") 
     DTE.ExecuteCommand("Edit.ToggleOutliningExpansion") 

    Next 


End Sub 

'' Helper to OutlineCode. Recursively outlines members of elt. 
'' 
Sub CollapseE(ByVal elt As EnvDTE.CodeElement, ByVal elts As EnvDTE.CodeElements, ByVal loc As Integer, ByRef targetLines As System.Collections.Generic.List(Of Integer)) 
    Dim epStart As EnvDTE.EditPoint 
    Dim epEnd As EnvDTE.EditPoint 

    epStart = elt.GetStartPoint(vsCMPart.vsCMPartWholeWithAttributes).CreateEditPoint() 
    epEnd = elt.GetEndPoint(vsCMPart.vsCMPartWholeWithAttributes).CreateEditPoint() ' Copy it because we move it later. 
    epStart.EndOfLine() 
    If ((elt.IsCodeType()) And (elt.Kind <> EnvDTE.vsCMElement.vsCMElementDelegate) Or elt.Kind = EnvDTE.vsCMElement.vsCMElementNamespace) Then 
     Dim i As Integer 
     Dim mems As EnvDTE.CodeElements 

     mems = elt.Members 
     For i = 1 To mems.Count 

      CollapseE(mems.Item(i), mems, i, targetLines) 

     Next 

    End If 


    If (epStart.LessThan(epEnd)) Then 
     If IncludeMember(elt) Then 
      targetLines.Add(epStart.Line) 
     End If 
    End If 



End Sub 
+2

Đây chính là điều tôi cần, nhưng tôi không có ý tưởng làm thế nào để sử dụng các macro. Ông có thể giúp tôi không? Tôi đặt mã này ở đâu và làm thế nào để thực hiện nó? Tôi đang sử dụng Visual Studio 2012. –

0

Tôi biết câu hỏi này là siêu cũ, nhưng tôi đang tìm kiếm một cách để làm điều này bản thân mình mà làm việc với VS 2015. tôi đã xem qua macro này cho Studio mở rộng trực quan làm việc với VS 2013 và 2015 ...

https://marketplace.visualstudio.com/items?itemName=VisualStudioPlatformTeam.MacrosforVisualStudio

tôi đã viết macro này mà sụp đổ tất cả các phương pháp nhưng rời khỏi bình luận Tóm lại, sử dụng các chỉ thị, các lớp học , v.v.

/// <reference path="C:\Users\johnc\AppData\Local\Microsoft\VisualStudio\14.0\Macros\dte.js" /> 
var selection = dte.ActiveDocument.Selection; 

dte.ExecuteCommand("Edit.ExpandAllOutlining"); 
dte.ActiveDocument.Selection.StartOfDocument(); 
dte.ExecuteCommand("Edit.NextMethod"); 

var startLine = selection.CurrentLine; 
dte.ExecuteCommand("Edit.CollapseCurrentRegion"); 
dte.ExecuteCommand("Edit.NextMethod"); 

do { 
    dte.ExecuteCommand("Edit.CollapseCurrentRegion"); 
    dte.ExecuteCommand("Edit.NextMethod"); 
} while (startLine != selection.CurrentLine); 

Hy vọng điều này sẽ giúp ai đó.

0

Mở rộng John'sanswer cho VS2017:

var selection = dte.ActiveDocument.Selection; 

dte.ExecuteCommand("Edit.CollapsetoDefinitions"); 
dte.ActiveDocument.Selection.StartOfDocument(); 
dte.ActiveDocument.Selection.FindText("/// <summary>") 

var startLine = selection.CurrentLine; 
do { 
    dte.ExecuteCommand("Edit.FindNext"); 
} while (startLine != selection.CurrentLine); 
Các vấn đề liên quan