我已经从 microsoft lsp-sample 复制了设置。完成的处理在服务器中。
connection.onCompletion(
(_textDocumentPosition: TextDocumentPositionParams): CompletionItem[] | undefined => {
const document = documents.get(_textDocumentPosition.textDocument.uri);
const linePrefix = document?.getText({
start: { line: _textDocumentPosition.position.line, character: 0 },
end: _textDocumentPosition.position,
});
if(!linePrefix?.startsWith('Record.')){
const yamlComplete: CompletionItem[] = getCompletionFromYaml();
console.log(yamlComplete);
return yamlComplete;
}
const output: CompletionItem[] = [];
let i = 1;
for(const currKey of tableData){
const keys = Object.keys(currKey);
output.push({
label: keys[0],
kind: CompletionItemKind.Field,
data: i,
documentation: 'test'
});
i++;
}
console.log(output);
return output;
}
);
回报正确且格式正确:
This is from the yamlComplete
[
{ label: 'record_get', kind: 2, data: 1 },
{ label: 'record_find', kind: 2, data: 2 }
]
如果前缀不是
Record.
,它就可以工作。如果这是真的,我希望 vscode 给我以下项目作为自动完成:
This is the output
[
{ label: 'test_id', kind: 5, data: 1, documentation: 'test' },
{ label: 'event_id', kind: 5, data: 2, documentation: 'test' }
]
但是我根本没有得到任何建议。我相信这是因为 vscode 正在查找行中并搜索其中包含
Record.
的建议。
所以预期的行为是当我输入 Record 时。我应该获得 test_id 和 event_id 作为该对象的项目的建议。
如果我将 onCompletion() 的标签重写为:
label:
Record.${keys[0]}`` 它有点工作,但对我来说这似乎是一个干净且正确的解决方案。
提前谢谢你:)
问题解决方案:
output.push({
label: keys[0],
kind: CompletionItemKind.Field,
filterText: `Record.${keys[0]}`,
insertText: `Record.${keys[0]}`
});
这对我们有用!