强制 VS Code 触发以非字母数字符号开头的关键字自动完成

问题描述 投票:0回答:1

我正在尝试使用以下方法为 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);
}

但是当我输入

@
时,不会触发自动完成:

直到我开始输入字母数字字符时它才会被触发。请注意,它似乎主动忽略

@
符号作为自动完成触发器的一部分:

如果随后选择了字母数字触发器并添加了额外的

@
符号,就可以确认这一点,就好像第一个符号尚未输入一样:

如何更正此代码以接受

@
作为自动完成触发器和完成的一部分?

intellisense vscode-extensions
1个回答
0
投票

我不确定为什么你的代码不起作用。这可能与

@
不是
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);

这样范围将包括第一个

@
字符。

© www.soinside.com 2019 - 2024. All rights reserved.