Visual Studio macro to navigate to T4MVC link

只谈情不闲聊 提交于 2019-12-06 00:31:41

Here's a Visual Studio macro to help.

What it does

Now you probably use T4MVC references in places like this:

  • Layout = MVC.Shared.Views.MasterSiteTheme;
  • ScriptManager.AddResource(Links.Content.Script.jQueryXYZ_js);
  • <link type="text/css" href="@Links.Content.Style.SiteTheme_css" />
  • return View(MVC.Account.Views.SignIn);
  • @Html.Partial(MVC.Common.Views.ContextNavigationTree)
  • @Html.ActionLink("Sign in / Register", MVC.Account.SignIn())

F12 (Go to Definition) already works for the last bullet (actions), but this hack is intended to cover the other scenarios (resources).

Macro

Imports EnvDTE
Imports System.IO

Public Module NavT4Link
    Sub NavigateToLink()
        DTE.ExecuteCommand("Edit.GoToDefinition")
        Dim navpath As String = Path.GetFileName(DTE.ActiveDocument.FullName)
        Dim isContentLink As Boolean = navpath.Equals("T4MVC.cs")
        If (isContentLink Or navpath.EndsWith("Controller.generated.cs")) Then
            Dim t4doc As TextDocument = DTE.ActiveDocument.Object()
            navpath = CurrentLinePathConstant(t4doc)
            If isContentLink Then
                t4doc.Selection.MoveToPoint(t4doc.Selection.ActivePoint.CodeElement(vsCMElement.vsCMElementClass).StartPoint)
                t4doc.Selection.FindText("URLPATH")
                navpath = Path.Combine(CurrentLinePathConstant(t4doc), navpath)
            End If
            If navpath.StartsWith("~") Then
                DTE.ActiveDocument.Close(vsSaveChanges.vsSaveChangesPrompt)
                Dim proj As Object = DTE.Solution.FindProjectItem(DTE.ActiveDocument.FullName).ContainingProject
                navpath = Path.GetDirectoryName(proj.Fullname()) + navpath.TrimStart("~")
                DTE.ItemOperations.OpenFile(navpath)
            End If
        End If
    End Sub

    Function CurrentLinePathConstant(ByVal t4doc As TextDocument) As String
        t4doc.Selection.SelectLine()
        Dim sa() As String = t4doc.Selection.Text().Split("""")
        If sa.Length > 1 Then Return sa(sa.Length - 2) Else Return ""
    End Function
End Module

Installation

  • In Visual Studio, press "Alt-F8" to open Macro Explorer.
  • Right-Click "My Macros", select "New Module...", and click "Add".
  • Replace all the text with the code shown here.
  • Save and exit the Macro Editor.
  • Open "Tools : Options".
  • In the left pane, select "Environment : Keyboard".
  • In the "Show commands containing" text field enter "T4".
  • In the "Press shortcut keys:" field press the "F12" key.
  • Click "Assign" and "OK".

On un-patched VS, this installation process doesn't result in a 'bindable' macro. A workaround was to (CTRL-SHIFT-R-R) to record an empty macro, and paste the code into it without renaming it. If someone knows of a more documentable approach to install a macro in VS, please comment.

Notes/Caveats

It's meant to replace the current F12 functionality, so if it isn't a T4MVC link, it will do the usual, otherwise it continues on to open the resource. It handles the majority of cases, but not T4MVC-generated empty controller methods. Those you get dumped off at the same place you did before.

For Content/Asset/Link resources, navigating to it in Solution Explorer would probably be in order, for image files for example, but I didn't see that functionality in the Visual Studio docs.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!