次の方法で共有


region で囲んだコードを一括展開するには?

質問

2006年10月27日金曜日 0:48

開発環境:Visual Studio 2003 VB

 ちょっとしたことなのでわざわざ聞くのも恐縮なのですが、「#Region - #End Region」 で囲んだコードは、ファイルを開いたときに1行にまとめられていますが、複数の Region があるときに、それらのコードを一括で展開したいのですが、何かいい方法はあるのでしょうか?

 たとえば1ファイルに数個程度であれば、左の「+」ボタンで展開していっても問題ないのですが、非常に多くの Region があったり、またはネストされていたりすると、以外に展開するのが面倒です(分割表示すると全部勝手に閉じられてしまいますし、閉じられているとクイック検索にもヒットされません)。

 いい方法を知っている方お願いします。

すべての返信 (5)

2006年10月27日金曜日 1:10 ✅回答済み

私の場合は「#Region」で囲まれている部分を全て選択してから

切り取り(Ctrl+X)

貼り付け(Ctrl+V)

全て展開されました。

といったことをしています。


2006年10月27日金曜日 2:45 ✅回答済み

右クリックして、「アウトライン」 -> 「すべてのアウトラインの切り替え」 で展開するようです。


2006年10月27日金曜日 4:34 ✅回答済み

一括でたたむにはマクロを使うしかないんじゃないかと思います。この方法だと、regionだけたたんでくれます。

auto expand/collapse regions
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=327835&SiteID=1

ただ、上記のままでは私の環境では全てのファイルが対象になったので、以下の一文を付け加えました。

DTE.Find.Target = vsFindTarget.vsFindTargetCurrentDocument

これがデフォルトらしいんですけどね。


2006年10月27日金曜日 4:10

 ダッチさん、trapemiyaさん、返答ありがとうございます。

> ダッチさん

>私の場合は「#Region」で囲まれている部分を全て選択してから

> 切り取り(Ctrl+X)

> 貼り付け(Ctrl+V)

> 全て展開されました。

> といったことをしています。

 たしかにこれは意外と楽ですね。「Ctrl+A」「Ctrl+X」「Ctrl+V」でできるのはかなりいいと思います。ただ、どうしてもコードが編集されたことになってしまうので、他にいい方法がない場合に活用したいと思います。

> trapemiyaさん

> 右クリックして、「アウトライン」 -> 「すべてのアウトラインの切り替え」 で展開するようです。

 あのコードの折りたたみは「アウトライン」というんですね。(^^;)

 教えていただいたとおり、ヘルプを見ながらやってみましたが、以下のようなコードですとどうやらうまくいかないみたいです(クラスに対して折りたたみ、展開してしまうようです)。

''' <summary>
''' ○○フォーム
''' </summary>
Public Class ○○Form
    Inherits Form
#Region " Windows フォーム デザイナで生成されたコード "
    Public Sub New()
        MyBase.New()
        ' この呼び出しは Windows フォーム デザイナで必要です。
        InitializeComponent()
        ' InitializeComponent() 呼び出しの後に初期化を追加します。
    End Sub
    ' 以下、よく見るコード    '        :    '        :
#End Region
End Class

 ただ、もう少し調べてみたところ、「アウトラインの展開/縮小」を使ってみたところ、選択した範囲内のコードに対してまとめて操作できることがわかりました。

 しかし、この場合でも、途中に Region で囲まれていないコードがあると一括展開されなかったり、ネストされた Region に対しては効果がないようです。

 

 他に何かいい方法がないかもう少し調べてみることにします。わざわざお答えいただきありがとうございました。


2006年10月27日金曜日 10:10

> 一括でたたむにはマクロを使うしかないんじゃないかと思います。この方法だと、regionだけたたんでくれます。

 すいません。私がしたいのは一括展開のほうです。(^ ^)

 trapemiya さんに教えていただいたリンク先の方を見てみました。Visual Studio の動作ってマクロを使う方法もあったのですね。参考になりました。

 一応マクロの使い方を調べてみて上記リンクのプログラムを使ってみましたが、どうやら、一括折りたたみはできますが、一括展開は難しいようです。
 上記の方法は「#Region」を検索して見つけたらその行をアウトライン操作するみたいですが、折りたたんであると「#Region」の単語が非表示になるため検索にヒットしませんし、逆に非表示も検索可能にして同じ動作をさせると、展開したときに検索位置のずれから無限ループになってしまったりと非常に困った状況になってしまいます。

 そこで ダッチさんと trapemiya さんの意見を組み合わせたものを私なりに書き換えてコードを作ってみました。一括展開のみですが、かなり有効に使えると思います。(使うのは私ぐらいだと思いますが(^ ^;))

''' <summary>
''' #Region の一括展開マクロ
''' </summary>
Sub RegionsAllExpand()

    ' 非表示の文字列も検索可
    DTE.Find.MatchInHiddenText = True

    ' 検索した文字列を置換するようにする
    DTE.Find.Action = vsFindAction.vsFindActionReplaceAll

    ' 検索する文字列
    DTE.Find.FindWhat = "#Region"

    ' 置き換える文字列
    DTE.Find.ReplaceWith = "#_Region"

    ' 実行
    Dim result As vsFindResult = DTE.Find.Execute()

    ' 文字列がひとつでもあった場合
    If result = vsFindResult.vsFindResultReplaceAndNotFound Then

        ' 元に戻すように設定
        DTE.Find.ReplaceWith = "#Region"
        DTE.Find.FindWhat = "#_Region"

        ' 実行
        result = DTE.Find.Execute()

        ' 文字列を2回変更しているので2回元に戻す
        DTE.ActiveDocument.Undo()
        DTE.ActiveDocument.Undo()
    End If
End Sub