我正在尝试使用以下方法为 LSP 进行简单的自动完成:
import * as vscode from 'vscode';
export function activate(context: vscode.ExtensionContext) {
const provider = vscode.languages.registerCompletionItemProvider('exa', {
provideCompletionItems(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken, context: vscode.CompletionContext) {
const completions = [];
const linePrefix = document.lineAt(position).text.slice(0, position.character);
if (linePrefix.includes('@')) {
completions.push(new vscode.CompletionItem("@END"));
return completions;
}
}
});
context.subscriptions.push(provider);
}
但是当我输入
@
时,不会触发自动完成:
直到我开始输入字母数字字符时它才会被触发。请注意,它似乎主动忽略
@
符号作为自动完成触发器的一部分:
如果随后选择了字母数字触发器并添加了额外的
@
符号,就可以确认这一点,就好像第一个符号尚未输入一样:
如何更正此代码以接受
@
作为自动完成触发器和完成的一部分?
我不确定为什么你的代码不起作用。这可能与
@
不是 exa
语言中的单词字符有关,因此需要专门列为触发字符。
制作 2
CompletionProviders
确实有效。试试这个代码:
// const provider = vscode.languages.registerCompletionItemProvider('exa', {
const provider = vscode.languages.registerCompletionItemProvider('plaintext', {
provideCompletionItems(document, position, token, context) {
const completions = [];
const linePrefix = document.lineAt(position).text.slice(0, position.character);
let item;
if (linePrefix.startsWith('@')) item = new vscode.CompletionItem("@END");
if (linePrefix.startsWith('!')) item = new vscode.CompletionItem("!START");
if (item) {
item.range = new vscode.Range(position.translate(0, -1), position);
completions.push(item);
return completions;
}
}
},
'@', '!' // list any special characters here
);
context.subscriptions.push(provider);
const provider2 = vscode.languages.registerCompletionItemProvider('plaintext', {
provideCompletionItems(document, position, token, context) {
const completions = [];
const linePrefix = document.lineAt(position).text.slice(0, position.character);
if (linePrefix.includes('H')) {
completions.push(new vscode.CompletionItem("HOWDY"));
return completions;
}
}
});
context.subscriptions.push(provider2);
注意:我使用
'plaintext'
进行测试,因此请更改它。 provider1
因其触发字符列表而被调用。 provider2
因常规单词字符而被调用。
可能与
@
不是单词字符有关,是您看到的双 @@END
。我用解决了这个问题
const item = new vscode.CompletionItem("@END");
item.range = new vscode.Range(position.translate(0, -1), position);
这样范围将包括第一个
@
字符。