我正在尝试使用动态代码片段构建VSCode扩展。我研究了这个StackOverflow答案:Dynamic snippet evaluation in VSCode,然后尝试使用CompletionItemProvider(https://code.visualstudio.com/api/references/vscode-api#CompletionItemProvider),并由Microsoft https://github.com/microsoft/vscode-extension-samples/tree/master/completions-sample/src
研究了这个示例现在,我的动态代码段扩展调用了一个API(由我制作并且可以正常工作),然后检索数据。但是CompletionItem不会显示在VSCode上
这是扩展名的代码
const provider1 = vscode.languages.registerCompletionItemProvider('plaintext', {
async provideCompletionItems(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken, context: vscode.CompletionContext) {
const linePrefix = document.lineAt(position).text.substr(0, position.character);
console.log(linePrefix);
console.log("in provide")
const val = await callToAPIAndRetrieve("sa")
console.log(val)
// a simple completion item which inserts `Hello World!`
const simpleCompletion = new vscode.CompletionItem(val);
return [simpleCompletion];
}
},'');
context.subscriptions.push(provider1);
该扩展名已注册,所有其他功能均可用。唯一的问题是此完成
在这里,变量val
用我要添加的字符串填充。我的假设是它带有async
函数。如果我对其进行硬编码,则可以正常工作。所以我怀疑async await
可能是问题所在
感谢您的帮助
编辑
这是callToAPIAndRetrieve
的代码:
async function callToAPIAndRetrieve(term: string): Promise<string> {
const apiKey = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1OTU0MTI5NTQsIm5iZiI6MTU5NTQxMjk1NCwianRpIjoiY2EzOThjZDctMmEzOS00NzNjLTlmMGEtM2RjNTEyMTkwOTdiIiwiZXhwIjoxNjI2OTQ4OTU0LCJpZGVudGl0eSI6IkdldENvZGVUZXN0IiwiZnJlc2giOmZhbHNlLCJ0eXBlIjoiYWNjZXNzIn0.Rmjxa4zfzuGGW-DrHEasGfBJ0xZZdVmHGuDyemrrn6s";
var url = "https://getcode.herokuapp.com/api/snippets/2";
const response = await fetch(url,{
method:"GET",
headers:{
"Authorization":"Bearer "+apiKey
}
});
const json = await response.json();
console.log(json.snippet.code)
return (json.snippet.code)
}
编辑,我根据答案编辑了代码,现在我得到了这些日志(这意味着它可以正常工作),但是仍然存在未显示完成项的问题
ex
Object
sdfg
这里ex
是我键入的字符串,sdfg
是要建议的代码段
答案 0 :(得分:0)
我无法复制以下代码和VSC 1.44
const callToAPIAndRetrieve = msg => new Promise(resolve => { setTimeout(() => resolve(msg), 1000); });
context.subscriptions.push(vscode.languages.registerCompletionItemProvider('plaintext', {
async provideCompletionItems(document, position, token, context) {
const val = await callToAPIAndRetrieve('Async Await!!');
console.log(val);
const simpleCompletion = new vscode.CompletionItem(val);
return [simpleCompletion];
}
},''));
它显示一个Loading...
,直到计时器调用resolve
方法为止。
编辑:
不要假设fetch
将成功。
删除此api密钥并创建一个新的
。function callToAPIAndRetrieve(term) {
return new Promise(resolve => {
const apiKey = "eyJ0eX....";
var url = "https://getcode.herokuapp.com/api/snippets/2";
fetch(url,{
method:"GET",
headers:{ "Authorization":"XXX "+apiKey }
})
.then(response => {
if (!response.ok) { resolve(undefined); return; }
const contentType = response.headers.get('content-type');
if (!contentType || !contentType.includes('application/json')) { resolve(undefined); return; }
return response.json();
})
.then(json => {
if (!(json.hasOwnProperty('snippet') && json.snippet.hasOwnProperty('code'))) { resolve(undefined); return; }
resolve(json.snippet.code);
})
.catch( () => resolve(undefined));
});
}
// ...
context.subscriptions.push(vscode.languages.registerCompletionItemProvider('plaintext', {
async provideCompletionItems(document, position, token, context) {
const val = await callToAPIAndRetrieve('sa');
console.log(val);
if (!val) return undefined;
const simpleCompletion = new vscode.CompletionItem(val);
return [simpleCompletion];
}
},''));