【问题标题】:How can i add auto completion to a browser based editor using monaco如何使用 monaco 将自动完成添加到基于浏览器的编辑器
【发布时间】:2021-12-15 05:27:04
【问题描述】:

所以最近我想使用monacoantlr 为自定义语言创建一个基于浏览器的编辑器。我遵循了这个很棒的教程https://tomassetti.me/writing-a-browser-based-editor-using-monaco-and-antlr/

Monaco 在按下 ctrl + 空格时已经给出了建议,但我想在 monaco 中添加智能自动完成(如智能感知)。我该怎么做?

【问题讨论】:

    标签: typescript autocomplete editor antlr monaco-editor


    【解决方案1】:

    Monaco 支持注册自己的完成提供程序。这是按语言注册的,但适用于所有编辑器实例。使用您的提供者实例调用languages.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 code 完成核心并使用逻辑对其进行修改以创建和使用符号表来提供符号信息。

    【讨论】:

      【解决方案2】:

      强烈推荐Mike Lischke's C3 Code completion

      另外,请参阅Strumenta Tutorial on using C3 Code completion

      StackOverflow 答案中包含的细节比简单的要多,但教程很好。

      Monaco 使用 LSP(语言服务器协议)。不难找到有关如何将 LSP 插件绑定到 Monaco 的说明。至于如何在 LSP 插件中完成代码,this tutorial (once again on the Strumenta site)(特别是“基础”部分,介绍了如何与 LSP 代码完成挂钩)。

      【讨论】:

      • 感谢您的回答。你知道如何在 monaco 中集成补全代码吗?
      • 我已经修改了我的答案以解决与摩纳哥的关系。对于这样的答案,这方面的细节也有点冗长。
      • 使用 LSP 的不是 Monaco,而是 Visual Studio Code。 Monaco 只知道代码完成提供程序。
      • 嗯,这个页面 (github.com/Microsoft/monaco-editor) 表明如果 LSP 是用 JavaScript 编写的,这是可能的。 可能我对“可能”读得太多了。感谢清理。
      • 很有趣,很想知道它是如何工作的,因为到目前为止我所看到的只是完成提供者注册。或者它们意味着您可以使用来自自定义提供商或类似的 LSP ¯\_(ツ)_/¯
      猜你喜欢
      • 1970-01-01
      • 2012-12-10
      • 2020-05-23
      • 2019-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-30
      相关资源
      最近更新 更多