とまと あんらいぷ…

エンジニアの活動記録とかつぶやきとか

GitHub
スポンサードリンク

【Visual Studio】シンボルの検索結果をすべて取得(コピー)する方法

いつぞやリンクが切れてしまうかもしれないので、引用します
VisualStudioのマクロから"シンボルの検索結果"の一覧を取得したい

やりたいことは、「すべての参照の検索」を実行することで表示される
シンボルの検索結果をすべて選択してコピーすること。
シンボルの検索結果って、なんで全部選択できないん!?
標準機能でできるならそれでいいんだけれど・・・

やりかたは、
マクロを保存して、実行するだけ。

ツール>マクロ>マクロエクスプローラを開く
vsmacro1.png

マクロエクスプローラ上で、適当なモジュールを追加
vsmacro2.png

で、以下の引用コードを貼り付け

Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports EnvDTE90a
Imports EnvDTE100
Imports System.Diagnostics


Public Module Test2
Public Sub Test2()

Dim sb As New System.Text.StringBuilder()
For Each s As String In FindSymbol2.GetAllReferencesSymbolsText()
sb.AppendLine(s)
Next

'ファイル出力
System.IO.File.AppendAllText("C:\symbol.txt", sb.ToString())

End Sub
End Module

Friend Class FindSymbol2
''' エディタの選択位置での「すべての参照の検索」の結果を取得してみる
Shared Function GetAllReferencesSymbolsText() _
As System.Collections.Specialized.StringCollection

Dim retval As New System.Collections.Specialized.StringCollection()

Dim activeWindow As EnvDTE.Window = DTE.ActiveWindow
If DTE.ActiveDocument Is Nothing Then
'Throw New Exception("実行するにはソースコードを表示して選択する必要があります。")
System.Windows.Forms.MessageBox.Show("実行するにはソースコードを表示して選択する必要があります。")

ElseIf Not TypeOf DTE.ActiveDocument.Selection Is TextSelection Then
System.Windows.Forms.MessageBox.Show("実行するにはソースコードを選択する必要があります。")

Else
DTE.ActiveDocument.Activate()

Dim sel As TextSelection = CType(DTE.ActiveDocument.Selection, TextSelection)
Dim pointTop As Integer = sel.TopPoint.AbsoluteCharOffset
Dim pointEnd As Integer = sel.BottomPoint.AbsoluteCharOffset
Dim windowFindResult As EnvDTE.Window = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindFindSymbolResults)
Dim canCopy As Boolean = True

DTE.ExecuteCommand("Edit.FindAllReferences", String.Empty)
windowFindResult.Activate()
Try
DTE.ExecuteCommand("Edit.Copy") '結果がないとエラーをはく?
Catch ex As System.Runtime.InteropServices.COMException
canCopy = False
End Try
If (canCopy) Then
Dim strStart As String = GetClipboard()
Dim str As String = strStart
Do
retval.Add(str)
DTE.ExecuteCommand("Edit.GoToNextLocation")
windowFindResult.Activate()
DTE.ExecuteCommand("Edit.Copy")
str = GetClipboard()
Loop While strStart <> str
End If

activeWindow.Activate()
sel.MoveToAbsoluteOffset(pointTop)
sel.MoveToAbsoluteOffset(pointEnd, True)
End If

Return retval
End Function

Private Shared Function GetClipboard() As String
Dim start As New System.Threading.ParameterizedThreadStart(AddressOf GetClipboardText)
Dim thread As New Threading.Thread(start)
thread.ApartmentState = Threading.ApartmentState.STA
Dim param(0) As String
thread.Start(param)
thread.Join()
Return param(0)
End Function

Private Shared Sub GetClipboardText(ByVal param As Object)
Dim s As String() = DirectCast(param, String())
s(0) = System.Windows.Forms.Clipboard.GetText()
End Sub

End Class

ペロッとな。
※完全な引用じゃなくて申し訳ないんだけど、txtファイルに出力するようにしています。
だもんで、メソッド名の後ろに「2」って書いてます。

vsmacro3.png
そんで、Test2()メソッドをコソコソと実行してやれば、
'ファイル出力 ってコメントのところで指定した場所にファイルができあがります。

しかしだ、実はこのマクロ、すぐに落ちます(笑)
そりゃあ、無理やり「↓」ボタンのキーコード等を送りつけてるんだから仕方ないわな。

機嫌良く動かすには以下の取り扱いが必要。

Visual Studio上で、すべての参照を行いたいシンボルにカーソルを当てる。
右クリックして「すべての参照を検索」するわけではないので注意ねw
あくまでもカーソルを当てるだけ。

で、マクロエクスプローラ上から、Microsoft Visual Studio Macros を開けるので
test2にカーソルが当たっている状態で「マクロの実行」を行う

vsmacro4.png

緑色の右に向いた三角のアイコンを押せばいいよ。

「この状態で放置!」

これ大事!!!
なんせ、裏技っぽく下矢印キーコードを送りつけてるもんだから、他のウィンドウを消したり出したりしてると
動きが・・・ぐぬぬぬ。

不便?
でもどうせこんなもんをコピーしたい時って調査資料を作ったりする場合だけでしょ?

だったらジッと待ってなさい!!!!
▼この記事を読んだ方は、こんな記事も読んでいます。▼

スポンサードリンク

テーマ:プログラミング - ジャンル:コンピュータ

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://dalmore.blog7.fc2.com/tb.php/41-d5a5baac
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad