2014-10-28 60 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); 
}