我正在为我的C#程序使用Monaco编辑器,并且我想知道如何为Lua添加丰富的智能感知。 例如,如果我键入一些内容,它会要求将其放入。
答案 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.
]
};