JavaScriptでリージョン/コードの折りたたみを実装する方法


131

Visual StudioでJavaScriptのコードの折りたたみ、つまりリージョンをどのように実装できますか?

JavaScriptに数百行ある場合、vb / C#のように領域を使用してコードを折りたたむと、より理解しやすくなります。

#region My Code

#endregion

1
これらの解決策はどれも、これほどうまくいきませんでした。stackoverflow.com/questions/46267908/...
マイケル・ドラム

回答:


25

ここのブログエントリはそれとこのMSDNの質問を説明しています。

Visual Studio 2003/2005/2008マクロを使用する必要があります。

忠実に再現するために、ブログエントリからコピーして貼り付けます。

  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を使用します。理由はわかりません-初めて入力して今すぐ使用します:)

これは便利で、サイトのコメントから注意すべき重要な点は、「上記のコードでモジュールの名前と新しいマクロの名前を確認する必要があります。両方の名前が一致する必要があります!」です。
Prasad

これはVS2010で機能しますか?私は行くことができません。マクロを検索しても表示されません。
Flibble氏、10

@氏。フリブル:わかりません.. VS2005しか持っていません。

OK。:私はここに新しい質問に求めてきましたstackoverflow.com/questions/2923177/...
氏Flibble

マイクロソフトは現在、この機能を提供するVS2010の拡張機能を備えています(リンクについては、以下の私の回答を参照してください)。
BrianFinkel

52

Microsoftは、この機能を提供するVS 2010の拡張機能を備えています。

JScriptエディタ拡張


これは素晴らしいです!これが次のVSアップデートに含まれることを期待しています。共有してくれてありがとう!
ウィリアムNiu

本当に素晴らしい拡張機能で、サードパーティの拡張機能の概要よりも優れています。
Hovis Biddle 2012

2
VS 2012および2013でこれが起こっていますか?
ジャック

1
これは素晴らしい!VS 2012または2013のバージョンはありますか?
アクセル

50

Visual Studioの最新バージョンを使用している開発者に朗報

ウェブEssentialsは、この機能を使って来ています。

これをチェック

ここに画像の説明を入力してください

注:VS 2017の場合、JavaScriptリージョンを 使用してくださいhttps : //marketplace.visualstudio.com/items?itemName=MadsKristensen.JavaScriptRegions


@ウィリアムいつの日か人々はこれを確実に必要とするでしょう;)
Kaushik Thanki

2
時間が経つにつれて、これは事実上受け入れられた答えになります。
HakanFıstık2017

2019年6月10日現在のVSCode-Typescriptの最新バージョンで完璧に動作します。
Eddy Howard

40

簡単だ!

折りたたむセクションをマークし、

Ctrl + M + H

展開するには、左側にある「+」マークを使用します。


3
出来た!。単一のajax呼び出しで多数のajax呼び出しがあるため、コードがよりスリムに見えるようになり、保存されました。
Sorangwala Abbasali 16

3
これは一時的な解決策です。ファイルを閉じて再度開くと、選択した領域が消えます。
oneNic​​eFriend 2017年

32

Visual Studio 2012を使用しようとしている人のために、Web Essentials 2012が存在します

Visual Studio 2015を使用しようとしている人のために、Web Essentials 2015.3が存在します

使い方は、@ prasadが尋ねたとおりです。


4
+1-ほとんどの人が2012/2013を使用するようになるため、これが答えになるはずです!(2013年にも
Peter Albert 14

26

コードのセクションにマークを付け(論理ブロックに関係なく)、CTRL + M + Hを押して、選択範囲を折りたたみおよび展開可能な領域として定義します。


ありがとうございました!削除または変更したいリージョンを誤って作成した場合、これを元に戻す方法を教えていただけますか?
Tingo

3
CTRL + M + Uで元に戻すことができます-そこにさらにショートカットがあります:msdn.microsoft.com/en-us/library/td6a5x4s.aspx
laurian


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 Outlining
Michael La Voie

2
VBではなくC#でマクロを記述できますか?
xportの

6

これはVS2017でネイティブになりました:

//#region fold this up

//#endregion

//と#の間の空白は関係ありません。

これが追加されたバージョンはわかりません。変更ログでそれについての言及が見つからないためです。v15.7.3で使用できます。



0

Resharperを使用している場合

この写真の手順を休ませる

ここに画像の説明を入力してください 次に、これをテンプレートエディタで記述します

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

#regionこの写真のように名前を付けます ここに画像の説明を入力してください

これがお役に立てば幸い



0

ビジュアルスタジオ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 */ () { ... })();

警告:スコープなどの欠点があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.