Load search URL in browser from Visual Studio

2019-01-26 13:43发布

问题:

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!

回答1:

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


回答2:

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


回答3:

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