丰富的Lua智能感知

时间:2018-12-15 14:48:33

标签: lua intellisense monaco-editor

我正在为我的C#程序使用Monaco编辑器,并且我想知道如何为Lua添加丰富的智能感知。 例如,如果我键入一些内容,它会要求将其放入。

3 个答案:

答案 0 :(得分:0)

首先,我必须说这显然并不容易,需要付出巨大的努力。基本上,您将必须自己分析代码,然后根据您通过分析收集的信息提出建议。

我无法详细介绍如何或应该分析代码,因为这是一项艰巨的任务。在分析代码时,您将必须了解什么是什么,并且(可能)您无法通过一些简单的正则表达式来做到这一点。 TypeScript integration是一个非常复杂的示例,但还有更简单的示例,例如HTML plugin。我只能建议去那里寻找灵感。

分析代码后,基本上就可以了。然后,您可以猜测用户下一步要做什么,或者例如,建议用户当前正在访问的对象的方法或字段。

然后您可以建议完成操作,这是通过将Monaco的JSON对象移交给它来完成的(实际上是TypeScript类,但稍后会介绍更多内容)。有example at the Monaco Playground显示了如何完成此操作。简约的提供程序可能看起来像这样:

monaco.languages.registerCompletionItemProvider ("lua", {    // Or any other language...
  provideCompletionItems: (model, position) => {
    // Retrieve the text until the current cursor's position, anything
    // after that doesn't really matter.
    var textToMatch = model.getValueInRange ({
      startLineNumber: 1,
      startColumn: 1,
      endLineNumber: position.lineNumber,
      endColumn: position.column
    });

    // Return JSON array containing all completion suggestions.
    return {
      suggestions: [
        // Example: io.write ()
        {
          label: "io.write (string)",
          kind: monaco.languages.CompletionItemKind.Function,
          documentation: "Writes a string to stdout.",
          insertText: "io.write (\"\")"  // Escape JSON as needed.
        },  // Other items.
      ]
    };
  }
});

CompletionItemKind上查看摩纳哥的文档,以了解不同类型的完成项目,在CompletionItemProvider上查看“类”,我们将其作为JSON对象移交给registerCompletionItemProvider ()。 Monaco文档具有所有这些不同的类型和类,因为Monaco最初是用TypeScript编写的,但是这些类和类型也可以由普通的旧JSON对象类似。

您基本上可以通过调用所有不同的register...Provider ()函数documented here来“构造”一个​​“丰富的” IntelliSense提供程序。

如果您想拥有真正有用的IntelliSense,那么我建议您不要忘记registerSignatureHelpProvider ()方法,该方法将鼠标悬停在可用定义的类型上时显示“窥视定义”窗口。

无论如何,这是一个非常繁琐的任务。并且,如果您查看负责TypeScript IntelliSense的文件(TypeScript集成存储库中的src/lib/typescriptServices.js),则文件大小为6.51 MB。尽管它也包含格式化程序等,但是它给您留下了很好的印象,说明了所需的工作以及为什么我不能在此处详细介绍实现IntelliSense的原因。

答案 1 :(得分:0)

您可以考虑通过TypeFox的language server库将Lua monaco-languageclient连接到摩纳哥。但这仍然不容易。

答案 2 :(得分:0)

在当前版本0.17.1中,返回的对象需要额外的range属性:

return {
   suggestions: [
   // Example: io.write ()
   {
       label: "io.write (string)",
       kind: monaco.languages.CompletionItemKind.Function,
       documentation: "Writes a string to stdout.",
       insertText: "io.write (\"\")",  // Escape JSON as needed.
       range: {
          startLineNumber: position.lineNumber,
          endLineNumber: position.lineNumber,
          startColumn: position.column,
          endColumn: position.column
       }
   },  // Other items.
   ]
};