我正在尝试使用 MPF 在 VSPackage 中实现语言服务,但它并没有像我理解的那样工作。
我已经有几个实现,例如 ParseSource
使用 ParseRequest
解析输入文件。但是,当它发现错误时,它会添加 AuthoringSink.AddError
。这方面的文档暗示它将它添加到我的错误列表中;它没有。
我还有一个简单的 MySource
类,它是 Source
的子类。我使用重写的 LanguageService.CreateSource
方法返回这个新类。 OnCommand
的文档说它在“输入命令时”被触发。然而,事实并非如此。
显然有一些我没有正确完成的中间步骤。我已经讲得够多了,所以我很乐意应要求提供任何其他详细信息。
任何澄清都非常感谢。
最佳答案
对于 AuthoringSink 错误列表问题,我在语言服务中使用此行为。在 ParseSource 中,ParseRequest 类有一个 AuthoringSink。如果您想在解析器的行为之外工作,您还可以创建一个新的 ErrorListProvider。下面是一些示例代码:
error_list = new ErrorListProvider(this.Site);
error_list.ProviderName = "MyLanguageService Errors";
error_list.ProviderGuid = new Guid(this.errorlistGUIDstring.);
}
ErrorTask task = new ErrorTask();
task.Document = filename;
task.CanDelete = true;
task.Category = TaskCategory.CodeSense;
task.Column = column;
task.Line = line;
task.Text = message;
task.ErrorCategory = TaskErrorCategory.Error;
task.Navigate += NavigateToParseError;
error_list.Tasks.Add(task);
我希望这可以帮到你。
OnCommand 应该在每次有命令时触发,在您的 MySource 类中,您可以执行以下操作(从工作代码中提取):
public override void OnCommand(IVsTextView textView, VsCommands2K command, char ch)
{
if (textView == null || this.LanguageService == null
|| !this.LanguageService.Preferences.EnableCodeSense)
return;
if (command == Microsoft.VisualStudio.VSConstants.VSStd2KCmdID.TYPECHAR)
{
if (char.IsLetterOrDigit(ch))
{
//do something cool
}
}
base.OnCommand(textView, command, ch);
}
如果这不起作用,请在设置 LanguageService 包时仔细检查 ProvideLanguageService 属性中的 CodeSense = true。在 LanguageService 中要做的很多很酷的事情都需要正确打开这些属性。有些甚至免费提供很酷的行为!
另一件需要注意的事情是,根据我的经验,诸如着色器之类的某些行为在 hive 中无法正常运行。我不认为这些给我带来了麻烦,但我几年前实现了这些,所以我主要只是回顾旧代码。
关于c# - Visual Studio 自定义语言服务,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11654744/