如何在javascript中实现区域/代码折叠


Answers:


25

这里的博客条目解释了问题以及MSDN问题

您必须使用Visual Studio 2003/2005/2008宏。

为了保真起见,从Blog条目复制+粘贴:

  1. 打开宏浏览器
  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。我不知道为什么-我是第一次输入它,现在就使用它:)

这是有用的,在站点的注释中要注意的重要一点是:“您必须使用新的Macro的名称检查上面代码中的模块名称。这两个名称必须匹配!”
普拉萨德

这在VS2010上有效吗?我无法到达。搜索宏时不会出现。
Flibble先生2010年

@先生。Flibble:不确定。我只有VS2005。

好。我问在这里一个新的问题:stackoverflow.com/questions/2923177/...
Flibble先生

Microsoft现在具有VS2010扩展,它提供了此功能(请参阅下面的链接我的答案)。
BrianFinkel 2011年


50

对于使用最新版本的Visual Studio的开发人员来说是个好消息

网站要点都具有此功能的到来。

看一下这个

在此处输入图片说明

注意:对于VS 2017,请使用JavaScript区域: https : //marketplace.visualstudio.com/items?itemName=MadsKristensen.JavaScriptRegions


@William有一天人们肯定会需要这个;)
Kaushik Thanki

2
随着时间的流逝,这将是事实接受的答案。
哈坎·菲斯塔克(HakanFıstık),

截至2019年6月10日,可与最新版本的VSCode-Typescript完美配合。
Eddy Howard

40

这很简单!

标记要折叠的部分,

Ctrl + M + H

并使用左侧的“ +”号进行扩展。


3
有效!。救了我,因为它使我的代码更苗条,因为在单个ajax调用下有很多ajax调用。
Sorangwala Abbasali

3
这是一个临时解决方案。如果关闭并重新打开文件,则所选区域消失。
oneNic​​eFriend'3




9

感谢0A0D提供了一个很好的答案。我祝你好运。 Darin Dimitrov还就限制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

6
VS 2010具有更新的扩展框架,有人可以在这里创建一个名为“ Visual Studio 2010 JavaScript概述”的代码折叠插件:jsoutlining.codeplex.com
Michael La Voie 2010年

2
我们可以用C#代替VB编写宏吗?
xport 2010年

6

这现在是VS2017的本地版本:

//#region fold this up

//#endregion

//和#之间的空格无关紧要。

我不知道添加了哪个版本,因为在变更日志中找不到任何提及。我可以在v15.7.3中使用它。



0

如果您使用的是Resharper

休憩这张照片中的步骤

在此处输入图片说明 然后在模板编辑器中编写

  //#region $name$
$END$$SELECTION$
  //#endregion $name$

并命名#region为这张照片 在此处输入图片说明

希望这对你有帮助



0

适用于Visual Studio 2017。

    //#region Get Deactivation JS
    .
    .
    //#endregion Get Deactivation JS

之前无法使用,所以我从这里下载了扩展程序


-2

区域应该工作而不更改设置

//#region Optional Naming
    var x = 5 -0; // Code runs inside #REGION
    /* Unnecessary code must be commented out */
//#endregion

启用折叠式注释区域/ ** /

/* Collapse this

*/

设置->搜索“折叠”->编辑器:折叠策略->从“自动”到“缩进”。

标记:Node.js Nodejs Node js Javascript ES5 ECMAScript注释折叠隐藏区域Visual Studio代码vscode 2018版本1.2+ https://code.visualstudio.com/updates/v1_17#_folding-regions


-3

不仅适用于VS,而且几乎适用于所有编辑器。

(function /* RegionName */ () { ... })();

警告:具有范围之类的缺点。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.