Я делаю расширение vscode, чтобы обеспечить подсветку синтаксиса и предложения для пользовательского языка, расширяющего язык HTML. Я использую API CompletionItemProvider.
На этом языке мы получили команды, обернутые в $% - $ как $% FOR (...) $ или $% IF (...) $ , поэтому я хочу показать предложение доступных команд, когда я набираю $%.
Но по какой-то причине он не работает, когда курсор находится на символе%.
Вот упрощенная версия кода. Я в основном на основе образца завершения (https://github.com/Microsoft/vscode-extension-samples/blob/master/completions-sample/src/extension.ts):
const completionProvider = vscode.languages.registerCompletionItemProvider(
'*',
{
provideCompletionItems(document: vscode.TextDocument, position: vscode.Position) {
let linePrefix = document.lineAt(position).text.substr(0, position.character);
if (!linePrefix.endsWith("$%")) {
return undefined;
}
console.log("should show suggestions");
return [
new vscode.CompletionItem('IF', vscode.CompletionItemKind.Method),
new vscode.CompletionItem('FOR', vscode.CompletionItemKind.Method)
];
}
}
);
context.subscriptions.push(completionProvider);
Функция берет текст, набранный в редакторе, и проверяет, набрал ли пользователь только $%, если да, то показывает список предложений
В результате появляется всплывающее сообщение "Нет предложений":
Но если я проверю другую строку триггера, заканчивающуюся другим символом, отличным от "%", меняю строку
if (!linePrefix.endsWith("$%")) {
к этому
if (!linePrefix.endsWith("$%$")) {
или это
if (!linePrefix.endsWith("$%.")) {
это работает!
Может кто-нибудь объяснить, что я делаю не так?