2014-10-28 61 views
0

我想包括Visual Studio的自定义语言支持。VS SDK的ContentType不起作用

首先,我需要GoToDefinition支持。我正在努力获得上下文菜单以包含此命令。

我已经定义了一个ContentTypeDefinition,并已列入FileExtensionToContentTypeDefinition如:

internal sealed class GaugeFileContentType 
{ 
    [Export] 
    [Name("Gauge")] 
    [BaseDefinition("code")] 
    internal static ContentTypeDefinition GaugeContentTypeDefinition = null; 

    [Export] 
    [FileExtension(".spec")] 
    [ContentType("Gauge")] 
    internal static FileExtensionToContentTypeDefinition GaugeFileExtensionDefinition = null; 
} 

现在,尽管这样,调试,我看到DTE.ActiveDocument.Typetext,尽管我加入[BaseDefinition('code')]属性。我在这里错过了什么?

以上定义是否足以告诉Visual Studio为代码调出上下文菜单?

我正在使用Visual Studio 2013 Ultimate。

回答

0

经过几天的头撞,我设法找出了一个办法。

我正在使用Experimental Instance进行调试,并没有清理并重新安装扩展,因此Visual Studio继续将ContentType视为“纯文本”,因为这正是我原来的样子。

当我构建一个VSIX并安装时,在Visual Studio的一个新实例中打开了相同的文件,它调出了正确的上下文菜单。

然而,它带来了比我想要的更多的东西(即来自Resharper的Run Unit Tests)。所以我做了更多的挖掘。

为了确保Visual Studio可以处理命令,它通过调用IOleCommandTarget.QueryStatus方法来检查它。

我所要做的就是设置CommandFlag为(uint)OLECMDF.OLECMDF_ENABLED | (uint)OLECMDF.OLECMDF_SUPPORTED,并在cmdIdVSConstants.VSStd97CmdID.GotoDefn时返回VSConstants.S_OK

的最后一个方法是这样的:

public int QueryStatus(ref Guid pguidCmdGroup, uint cCmds, OLECMD[] prgCmds, IntPtr pCmdText) 
{ 
    if ((VSConstants.VSStd97CmdID)prgCmds[0].cmdID == VSConstants.VSStd97CmdID.GotoDefn) 
    { 
     prgCmds[0].cmdf = (uint)OLECMDF.OLECMDF_ENABLED | (uint)OLECMDF.OLECMDF_SUPPORTED; 
     return VSConstants.S_OK; 
    } 
    return Next.QueryStatus(pguidCmdGroup, cCmds, prgCmds, pCmdText); 
}