Visual Studio: методы сбрасывания, но не комментарии (сводка и т.д.)

есть ли способ (настройки? "macro"? extension?), который я могу просто переключить, чтобы только раздел использования, а мои методы сворачивались к их строке подписи, но мои комментарии (сводка и комментарии с двойной косой чертой), а классы остаются расширенными?

Примеры:

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) Свернуто (следующий мой желаемый результат):

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)[...]
     }
}

Вот как я предпочитаю видеть мои файлы классов (свернутая форма). Я делаю рушится вручную миллион раз, и я думаю, что должен быть способ автоматизировать/настроить/продлить VS, чтобы сделать это так, как я хочу?

Каждый раз, когда я отлаживаю/ударяю точку останова, он разворачивается и испортит вещи. Если я скрою контекстное меню, обрушив его на контур и т.д., Он также разрушит мои комментарии, которые нежелательны.

Цените свою помощь!

Ответы

Ответ 1

Ctrl M, Ctrl O

Свертывается к определениям.

С этого момента макрос может быть не слишком сложным для записи.

Что-то вроде find /// <summary> ... и переключите отображение. Затем промойте, промойте, повторите.

Ответ 2

Я создал макрос, который позволит свернуть члены. вы можете разместить свой собственный фильтр в функции IncludeMember, например, в этом примере я разрушаю все, кроме комментариев и перечислений

' 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

Ответ 3

Возможно, эта ссылка вам поможет: http://weblogs.asp.net/mrdave/archive/2004/09/17/230732.aspx. Вы можете обернуть все в регионах, чтобы вы могли управлять им и оставлять комментарии развернутыми. Также вы можете изменить этот макрос в соответствии с вашими потребностями.

Ответ 4

В Visual Studio нет ничего встроенного, что позволит вам свернуть регионы кода таким образом. Это возможно с помощью макроса, но я не думаю, что было бы очень просто писать. Visual Studio 2010 может обеспечить некоторое облегчение, позволяя вам написать фактический плагин, который имеет более прямую доступность для синтаксического анализатора, но это чистая спекуляция на данный момент.

Ответ 5

Я знаю, что этот вопрос очень стар, но я искал способ сделать это сам, который работает с VS 2015. Я столкнулся с этими макросами для расширения Visual Studio, которые работают с VS 2013 и 2015...

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

Я написал этот макрос, который сворачивает все методы, но оставляет итоговые комментарии, используя только директивы, классы и т.д.

/// <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);

Надеюсь, это поможет кому-то.

Ответ 6

Расширение John answer для 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);