我想仅在插入符号位于Xml注释块中时才在自定义菜单中启用命令
''' ... If caret is here, in a Vb.Net Xml comment block.
或
/// ... If caret is here, in a C# Xml comment block.
然后,期待结果的伪代码:
C#:
private void CmdExample_BeforeQueryStatus(object sender, EventArgs e) {
// Enable this command only if the caret is in a Xml comment block.
((OleMenuCommand)sender).Enabled = IsCaretInXmlComment?();
}
VB:
Private Sub CmdExample_BeforeQueryStatus(ByVal sender As Object, ByVal e As EventArgs) _
Handles cmdExample.BeforeQueryStatus
' Enable this command only if the caret is in a Xml comment block.
DirectCast(sender, OleMenuCommand).Enabled = IsCaretInXmlComment?()
End Sub
只是,我怎么能这样做?在Vb.Net或C#。
我不知道该怎么做,所以我对vsCMElement
枚举的值进行了反复试验,因为我看到了类似的东西 here ,但CodeElement2.Kind
属性始终抛出NullReferenceException
。
C#:
TextPoint tp =
((TextSelection)MyDte.ActiveDocument.Selection).ActivePoint;
CodeElement2 ce =
MyDte.ActiveDocument.ProjectItem.FileCodeModel.
CodeElementFromPoint(tp, vsCMElement.vsCMElementOther);
VB:
Dim tp As TextPoint =
CType(MyDte.ActiveDocument.Selection, TextSelection).ActivePoint
Dim ce As CodeElement2 =
MyDte.ActiveDocument.ProjectItem.FileCodeModel.
CodeElementFromPoint(tp, vsCMElement.vsCMElementOther)
我也发现了这个 question ,但是如果没有说明性的代码示例,我对此非常感兴趣。
答案 0 :(得分:2)
如果您的目标是Visual Studio 2015或更高版本,最好的方法是使用Roslyn。有了它,你可以得到一个语法树,然后弄清楚你是否在评论中。如果你看一下我们IsEntirelyWithinSingleLineDocComment的实现,你可以看到我们今天如何做到这一点。如果您是Roslyn的新手,那么现有的问题可以帮助您获得语法树。
如果您需要定位低于此版本的版本,那么自从Roslyn于2012年首次发货以来您就遇到了麻烦。一种常见的方法是询问分类信息,以确定某些内容是否为评论。分类是驱动编辑器中显示的文本颜色的原因。如果您的文件获得ITextBuffer
,那么您可以MEF导入IClassifierAggregatorService
并要求分类,然后过滤到文档注释类型。 Noah Richard's original spell check sample是如何做到这一点的一个很好的例子。