I'm finding the built-in Visual Studio Document Explorer less relevant, especially as more of the SDKs I work with have the most up-to-date content on-line. Pressing F1 starts Document Explorer usually with something unhelpful and it's not usable any more for me.
Is there any way that on the press of a key combination in Visual Studio:
- the default browser opens to the URL of a search engine
- query used is the keyword under the current cursor position
- a filter is added such as
site:msdn.microsoft.com
I don't know anything about macros in VS but presumably that's what I need. Does anyone know how to go about setting this up? teh codez would be nice!
Here is another version (based on Alex's answer) that will also select the current word you are on. More like the typical F1 help.
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics
Public Module Search
Sub GoogleSearch()
AnySearch("http://www.google.com/search?q=.net+")
End Sub
Sub BingSearch()
AnySearch("http://www.bing.com/search?q=")
End Sub
Private Sub AnySearch(ByVal searchUrl)
Dim strUrl As String
Dim selection As String = GetSelection()
If selection <> "" Then
strUrl = searchUrl + selection
DTE.ExecuteCommand("nav", strUrl & " /ext")
Else
MsgBox("Select text to search for.")
End If
End Sub
Private Function GetSelection() As String
Dim selection As TextSelection = DTE.ActiveDocument.Selection()
If selection.Text <> "" Then
Return selection.Text
Else
DTE.ExecuteCommand("Edit.SelectCurrentWord")
selection = DTE.ActiveDocument.Selection()
Return selection.Text
End If
End Function
End Module
Using the link Preet provided I came up with this which starts the default browser:
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics
Public Module Search
Sub GoogleSearch()
AnySearch("http://www.google.com/search?q=")
End Sub
Sub BingSearch()
AnySearch("http://www.bing.com/search?q=")
End Sub
Private Sub AnySearch(ByVal searchUrl)
Dim strUrl As String
Dim selection As TextSelection = DTE.ActiveDocument.Selection()
If selection.Text <> "" Then
strUrl = searchUrl + selection.Text
DTE.ExecuteCommand("nav", strUrl & " /ext")
Else
MsgBox("Select text to search for.")
End If
End Sub
End Module
I've come up with this one. As it says, you will need to add a reference to 'System.Web' for HttpUtility.UrlEncode. Also, there's a few 'options' in the code commented out. Parts taken from http://www.codinghorror.com/blog/2005/10/google-search-vsnet-macro.html , but much improved (IMHO).
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics
Public Module HelpFindInBrowser
Sub HelpFindInBrowser()
Dim s As String = ActiveWindowSelection().Trim()
If s.Length > 0 Then
OpenURL("http://www.google.com/search?q=" & _
Web.HttpUtility.UrlEncode(s))
'--------------------------------------------------------------------------
'You will need to add a reference to 'System.Web' for HttpUtility.UrlEncode !!!
'--------------------------------------------------------------------------
End If
End Sub
Private Sub OpenURL(ByVal inURL As String)
'specify a non default browser
'DTE.ExecuteCommand("Tools.Shell", "notepad.exe " & inURL)
'use the default browser:
DTE.ExecuteCommand("nav", inURL & " /ext")
'to have it in a new visual studio window:
'DTE.ItemOperations.Navigate(inURL, EnvDTE.vsNavigateOptions.vsNavigateOptionsNewWindow)
'to have it in the default visual studio browser window:
'DTE.ItemOperations.Navigate(inURL, EnvDTE.vsNavigateOptions.vsNavigateOptionsDefault)
End Sub
'large part taken from http://www.codinghorror.com/blog/2005/10/google-search-vsnet-macro.html
Private Function ActiveWindowSelection() As String
If DTE.ActiveWindow.ObjectKind = EnvDTE.Constants.vsWindowKindOutput Then
Return OutputWindowSelection()
End If
If DTE.ActiveWindow.ObjectKind = "{57312C73-6202-49E9-B1E1-40EA1A6DC1F6}" Then
Return HTMLEditorSelection()
End If
Return SelectionText(DTE.ActiveWindow.Selection)
End Function
Private Function HTMLEditorSelection() As String
Dim hw As HTMLWindow = ActiveDocument.ActiveWindow.Object
Dim tw As TextWindow = hw.CurrentTabObject
Return SelectionText(tw.Selection)
End Function
Private Function OutputWindowSelection() As String
Dim w As Window = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput)
Dim ow As OutputWindow = w.Object
Dim owp As OutputWindowPane = ow.OutputWindowPanes.Item(ow.ActivePane.Name)
Return SelectionText(owp.TextDocument.Selection)
End Function
Private Function SelectionText(ByVal sel As EnvDTE.TextSelection) As String
If sel Is Nothing Then
Return ""
End If
Dim s As String
If sel.Text.Length = 0 Then
s = GetWordUnderCursor(sel)
Else
s = sel.Text
End If
'We could limit the text to some minimal size
'If sel.Text.Length <= 2 Then
'Return ""
'End If
Return s
End Function
Private Function GetWordUnderCursor(ByVal sel As EnvDTE.TextSelection) As String
Dim ptStart As EnvDTE.EditPoint = sel.ActivePoint.CreateEditPoint()
Dim theSelectToRight As Boolean = False
If (ptStart.AtStartOfLine) Then
theSelectToRight = True
Else
'See if there's a space to the left of ptStart
'not at start of line, so moving one left is safe
ptStart.CharLeft()
If (ptStart.GetText(1).Trim() = "") Then
theSelectToRight = True
End If
'Back to original position
ptStart.CharRight()
End If
If (Not theSelectToRight) Then
ptStart.WordLeft(1)
End If
Dim ptEnd As EnvDTE.EditPoint = ptStart.CreateEditPoint()
ptEnd.WordRight(1)
Return ptStart.GetText(ptEnd)
End Function
End Module