Как реализовать регионы / свернуть код в JavaScript - PullRequest
123 голосов
/ 17 декабря 2009

Как можно реализовать регионы a.k.a. свертывание кода для JavaScript в Visual Studio?

Если в javascript есть сотни строк, это будет более понятно при использовании свертывания кода с регионами, как в vb / C #.

#region My Code

#endregion

Ответы [ 15 ]

52 голосов
/ 13 июня 2011

Microsoft теперь имеет расширение для VS 2010 , которое обеспечивает эту функциональность:

Расширения JScript Editor

46 голосов
/ 15 февраля 2016

Хорошие новости для разработчиков, работающих с последней версией visual studio

Web Essentials поставляется с этой функцией.

Проверьте это

enter image description here

Примечание: для VS 2017 используйте JavaScript Регионы: https://marketplace.visualstudio.com/items?itemName=MadsKristensen.JavaScriptRegions

37 голосов
/ 09 сентября 2015

Это просто!

Отметьте раздел, который вы хотите свернуть и,

CTRL + M + H

И для расширения используйте знак «+» слева.

32 голосов
/ 01 октября 2013

Для тех, кто собирается использовать Visual Studio 2012, существует Web Essentials 2012

Для тех, кто собирается использовать Visual Studio 2015, существует Web Essentials 2015.3

Использование точно так же, как @prasad спросил

25 голосов
/ 06 октября 2014

Помечая часть кода (независимо от логических блоков) и нажимая CTRL + M + H, вы определяете выделение как область, которая является складной и расширяемой.

24 голосов
/ 17 декабря 2009

Запись в блоге объясняет это и этот MSDN вопрос .

Вы должны использовать макросы Visual Studio 2003/2005/2008.

Копировать + Вставить из записи в блоге ради точности:

  1. Открыть Macro Explorer
  2. Создание нового макроса
  3. Назовите это OutlineRegions
  4. Нажмите Редактировать макрос и вставьте следующий код VB:
Option Strict Off
Option Explicit Off

Imports System
Imports EnvDTE
Imports EnvDTE80
Imports System.Diagnostics
Imports System.Collections

Public Module JsMacros

    Sub OutlineRegions()
        Dim selection As EnvDTE.TextSelection = DTE.ActiveDocument.Selection

        Const REGION_START As String = "//#region"
        Const REGION_END As String = "//#endregion"

        selection.SelectAll()
        Dim text As String = selection.Text
        selection.StartOfDocument(True)

        Dim startIndex As Integer
        Dim endIndex As Integer
        Dim lastIndex As Integer = 0
        Dim startRegions As Stack = New Stack()

        Do
            startIndex = text.IndexOf(REGION_START, lastIndex)
            endIndex = text.IndexOf(REGION_END, lastIndex)

            If startIndex = -1 AndAlso endIndex = -1 Then
                Exit Do
            End If

            If startIndex <> -1 AndAlso startIndex < endIndex Then
                startRegions.Push(startIndex)
                lastIndex = startIndex + 1
            Else
                ' Outline region ...
                selection.MoveToLineAndOffset(CalcLineNumber(text, CInt(startRegions.Pop())), 1)
                selection.MoveToLineAndOffset(CalcLineNumber(text, endIndex) + 1, 1, True)
                selection.OutlineSection()

                lastIndex = endIndex + 1
            End If
        Loop

        selection.StartOfDocument()
    End Sub

    Private Function CalcLineNumber(ByVal text As String, ByVal index As Integer)
        Dim lineNumber As Integer = 1
        Dim i As Integer = 0

        While i < index
            If text.Chars(i) = vbCr Then
                lineNumber += 1
                i += 1
            End If

            i += 1
        End While

        Return lineNumber
    End Function

End Module
  1. Сохранить макрос и закрыть редактор
  2. Теперь давайте назначим ярлык макросу. Перейдите в Инструменты-> Параметры-> Среда-> Клавиатура и найдите свой макрос в текстовом поле «Показать команды, содержащее»
  3. Теперь в текстовом поле под «Нажатием клавиш быстрого доступа» вы можете ввести желаемый ярлык. Я использую Ctrl + M + E. Я не знаю почему - я только что ввел его впервые и использую сейчас:)
20 голосов
/ 11 мая 2011

Плагин JSEnhancements для Visual Studio прекрасно справляется с этой задачей.

9 голосов
/ 06 января 2010

Спасибо 0A0D за отличный ответ. Мне повезло с этим. Дарин Димитров также дает хороший аргумент об ограничении сложности ваших файлов JS. Тем не менее, я нахожу случаи, когда сворачивание функций в их определения значительно упрощает просмотр файла.

Что касается #region в целом, этот SO вопрос достаточно хорошо его охватывает.

Я сделал несколько изменений в макросе для поддержки более сложного свертывания кода. Этот метод позволяет поместить описание после ключевого слова // # region ala C # и показать его в коде, как показано:

Пример кода:

//#region InputHandler
var InputHandler = {
    inputMode: 'simple', //simple or advanced

    //#region filterKeys
    filterKeys: function(e) {
        var doSomething = true;
        if (doSomething) {
            alert('something');
        }
    },
    //#endregion filterKeys

    //#region handleInput
    handleInput: function(input, specialKeys) {
        //blah blah blah
    }
    //#endregion handleInput

};
//#endregion InputHandler

Обновлен макрос:

Option Explicit On
Option Strict On

Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics
Imports System.Collections.Generic

Public Module JsMacros


    Sub OutlineRegions()
        Dim selection As EnvDTE.TextSelection = CType(DTE.ActiveDocument.Selection, EnvDTE.TextSelection)

        Const REGION_START As String = "//#region"
        Const REGION_END As String = "//#endregion"

        selection.SelectAll()
        Dim text As String = selection.Text
        selection.StartOfDocument(True)

        Dim startIndex As Integer
        Dim endIndex As Integer
        Dim lastIndex As Integer = 0
        Dim startRegions As New Stack(Of Integer)

        Do
            startIndex = text.IndexOf(REGION_START, lastIndex)
            endIndex = text.IndexOf(REGION_END, lastIndex)

            If startIndex = -1 AndAlso endIndex = -1 Then
                Exit Do
            End If

            If startIndex <> -1 AndAlso startIndex < endIndex Then
                startRegions.Push(startIndex)
                lastIndex = startIndex + 1
            Else
                ' Outline region ...
                Dim tempStartIndex As Integer = CInt(startRegions.Pop())
                selection.MoveToLineAndOffset(CalcLineNumber(text, tempStartIndex), CalcLineOffset(text, tempStartIndex))
                selection.MoveToLineAndOffset(CalcLineNumber(text, endIndex) + 1, 1, True)
                selection.OutlineSection()

                lastIndex = endIndex + 1
            End If
        Loop

        selection.StartOfDocument()
    End Sub

    Private Function CalcLineNumber(ByVal text As String, ByVal index As Integer) As Integer
        Dim lineNumber As Integer = 1
        Dim i As Integer = 0

        While i < index
            If text.Chars(i) = vbLf Then
                lineNumber += 1
                i += 1
            End If

            If text.Chars(i) = vbCr Then
                lineNumber += 1
                i += 1
                If text.Chars(i) = vbLf Then
                    i += 1 'Swallow the next vbLf
                End If
            End If

            i += 1
        End While

        Return lineNumber
    End Function

    Private Function CalcLineOffset(ByVal text As String, ByVal index As Integer) As Integer
        Dim offset As Integer = 1
        Dim i As Integer = index - 1

        'Count backwards from //#region to the previous line counting the white spaces
        Dim whiteSpaces = 1
        While i >= 0
            Dim chr As Char = text.Chars(i)
            If chr = vbCr Or chr = vbLf Then
                whiteSpaces = offset
                Exit While
            End If
            i -= 1
            offset += 1
        End While

        'Count forwards from //#region to the end of the region line
        i = index
        offset = 0
        Do
            Dim chr As Char = text.Chars(i)
            If chr = vbCr Or chr = vbLf Then
                Return whiteSpaces + offset
            End If
            offset += 1
            i += 1
        Loop

        Return whiteSpaces
    End Function

End Module
2 голосов
/ 07 июня 2018

Это теперь изначально в VS2017:

//#region fold this up

//#endregion

Пробел между // и # не имеет значения.

Я не знаю, в какой версии это было добавлено, так как я не могу найти упоминаний об этом в журналах изменений. Я могу использовать его в v15.7.3.

1 голос
/ 26 ноября 2015

На VS 2012 и VS 2015 установите плагин WebEssentials, и вы сможете это сделать.

http://vswebessentials.com/features/javascript

...