所以最近我想创建一个基于浏览器的编辑器,使用自定义语言的monaco
和antlr
。我遵循了这个很棒的教程https://tomassetti.me/writing-a-browser-based-editor-using-monaco-and-antlr/。
摩纳哥已经给出建议时,按ctrl +空格,但我想添加一个智能自动完成(如智能感知)在monaco
。我该怎么做呢?
Monaco支持注册自己的补全提供程序。这是按语言注册的,但适用于所有编辑器实例。电话语言。registerCompletionItemProvider .
提供者类本身非常简单。比如:
export class CodeCompletionProvider implements languages.CompletionItemProvider {
public readonly triggerCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.\@(".split("");
public provideCompletionItems(model: ITextModel, position: Position, context: CompletionContext,
token: CancellationToken): ProviderResult<CompletionList> {
return {
incomplete: false,
suggestions: this.createInternalCompletionItems(replaceRange, model.editorMode),
};
}
return services.getCodeCompletionItems(sourceContext, position);
}
public resolveCompletionItem(item: CompletionItem, token: CancellationToken): ProviderResult<CompletionItem> {
return item;
}
}
真正的工作是生成完成项。一种方法是使用我的antlr4-c3代码完成核心,并通过逻辑修改来创建和使用符号表来提供符号信息。
强烈推荐Mike Lischke的C3代码完成
另外,请参阅关于使用C3代码完成的Strumenta教程
在StackOverflow的答案中包含了更多的细节,但是这个教程很好。
Monaco支持LSP(语言服务器协议)。应该不难找到关于如何将LSP插件绑定到摩纳哥的说明。至于如何在LSP插件中完成代码完成,本教程(再次在Strumenta网站上)(特别是"基础"部分,涵盖了如何绑定LSP代码完成钩子)。