c# - 在 LanguageService 实现中禁用 Go To Definition、Go To Declaration 和 Go To Reference
问题描述
我正在创建一个基本的语言服务扩展
以下是语言服务的代码
[ComVisible(true)]
[Guid("5CE7002C-0B61-47AB-9B99-EA0F62E0CE42")]
class CustomLanguageService : LanguageService
{
public const string LanguageName = "Custom Language";
public const string LanguageExtension = ".kav";
private LanguagePreferences _preferences;
public override string Name
{
get
{
return LanguageName;
}
}
public override LanguagePreferences GetLanguagePreferences()
{
if (this._preferences == null)
{
this._preferences = new LanguagePreferences(this.Site, typeof(CustomLanguageService).GUID, this.Name);
this._preferences.Init();
this._preferences.EnableCommenting = true;
}
return this._preferences;
}
public override IScanner GetScanner(IVsTextLines buffer)
{
return null;
}
public override AuthoringScope ParseSource(ParseRequest req)
{
return null;
}
public override string GetFormatFilterList()
{
return "Custom Language (*.kav)\n*.kav";
}
public override Source CreateSource(IVsTextLines buffer)
{
return new CustomLanguageSource(this, buffer, this.GetColorizer(buffer));
}
}
这是我的包裹代码
[PackageRegistration(UseManagedResourcesOnly = true)]
[DefaultRegistryRoot("Software\\Microsoft\\VisualStudio\\10.0")]
[ProvideObject(typeof(GeneralPropertyPage))]
[ProvideProjectFactory(typeof(MyCustomProjectFactory), "My Custom Project", "My Custom Project Files (*.myproj);*.myproj", "myproj", "myproj", @"..\..\Templates\Projects\MyCustomProject", LanguageVsTemplate = "MyCustomProject", NewProjectRequireNewFolderVsTemplate = false)]
[ProvideProjectItem(typeof(MyCustomProjectFactory), "My Items", @"..\..\Templates\ProjectItems\MyCustomProject", 500)]
[Guid(GuidStrings.guidCustomProjectPkgString)]
[ProvideService(typeof(CustomLanguageService))]
[ProvideLanguageExtension(typeof(CustomLanguageService), CustomLanguageService.LanguageExtension)]
[ProvideLanguageService(typeof(CustomLanguageService), CustomLanguageService.LanguageName, 0, EnableCommenting = true)]
public sealed class CustomProjectPackage : ProjectPackage
{
private CustomLanguageService _customLanguageService;
#region Overridden Implementation
protected override void Initialize()
{
base.Initialize();
this.RegisterProjectFactory(new MyCustomProjectFactory(this));
_customLanguageService = new CustomLanguageService();
_customLanguageService.SetSite(this);
IServiceContainer serviceContainer = (IServiceContainer)this;
serviceContainer.AddService(typeof(CustomLanguageService), _customLanguageService, true);
}
public override string ProductUserContext
{
get { return "CustomProj"; }
}
#endregion
}
在编辑器的右键菜单下,可以看到“Go To Definition”、“Go To Declaration”和“Go To Reference”菜单。
由于我现在没有实施这些,我不想要这些选项。
我尝试使用 IOleCommandTarget.QueryStatus 和 IOleCommandTarget.Exec 函数禁用菜单。但是,这样做只会隐藏“转到定义”和“转到声明”菜单,“转到参考”保持可见。我正在使用以下代码来隐藏它们:
int IOleCommandTarget.QueryStatus(ref Guid pguidCmdGroup, uint cCmds, OLECMD[] prgCmds, IntPtr pCmdText)
{
if (Microsoft.VisualStudio.Project.VsMenus.guidStandardCommandSet97 == pguidCmdGroup)
{
switch ((uint)prgCmds[0].cmdID)
{
case (uint)VsCommands.GotoDecl:
case (uint)VsCommands.GotoDefn:
case (uint)VsCommands.GotoRef:
prgCmds[0].cmdID |= (uint)QueryStatusResult.NOTSUPPORTED | (uint)QueryStatusResult.INVISIBLE;
return VSConstants.S_OK;
}
}
return _commandTarget.QueryStatus(ref pguidCmdGroup, cCmds, prgCmds, pCmdText);
}
有没有更好的方法通过语言服务本身来帮助我禁用它?
解决方案
推荐阅读
- json - 在 TStringWriter 中压缩/解压缩数据
- ios - 从 CoreData 填充的自定义 tableView,提供额外的白色单元格
- flume - Apache Flume 在我第一次在 Windows 上安装时没有卡在启动时
- android - 自动镜像在 Android 8 及更高版本的菜单图标中不起作用
- python - matplotlib.pyplot 文档说它是 matplotlib 的基于状态的接口。什么是基于状态的接口?
- c# - 错误 500:SRVE0295E:报告错误:500 - HttpWebResponse
- load-balancing - 如何将一个 HAProxy 服务器用于多个域
- amazon-web-services - 将数据从 Object Storage 存储桶(scaleway)复制到 aws s3 存储桶
- r - 使用 auto.Arima() 和 xreg 问题进行 ARIMA 预测
- scala - Scala检查对象是否是选项