const scarlingProvider = vscode.languages.registerCompletionItemProvider(
        'javascript',
        {
            provideCompletionItems(document, position, token, context) {
                const linePrefix = document.lineAt(position).text.substr(0, position.character);
                if (!hasChinese(linePrefix)) {
                    return undefined;
                }
                const reminds = starling.match(linePrefix)
                console.log('reminds: ', reminds);
                return [reminds].map(val => {
                    try {
                        const item = new vscode.CompletionItem(val, vscode.CompletionItemKind.Method)
                        item.insertText = `$t('${val}', '${linePrefix.trim()}')`
                        return item
                    } catch(err) {
                        console.log('err: ', err);
                    }
                })
            }
        },
        ' '

Как и выше, это фрагмент расширения завершения. Я хочу, чтобы выделенный текст заменял исходный текст, а не вставлял его после исходного текста. Что я должен делать?

0
Sevens Chan 28 Фев 2021 в 10:20

1 ответ

Лучший ответ

Вы должны указать диапазон с вашим элементом завершения. Модель может дать вам позицию исходного текста, для которого был вызван провайдер:

const scarlingProvider = vscode.languages.registerCompletionItemProvider(
        'javascript',
        {
            provideCompletionItems(document, position, token, context) {
                const linePrefix = document.lineAt(position).text.substr(0, position.character);
                if (!hasChinese(linePrefix)) {
                    return undefined;
                }

                const info = model.getWordUntilPosition(position);
                const range = {
                    startLineNumber: position.lineNumber,
                    startColumn: info.startColumn - 1,
                    endLineNumber: position.lineNumber,
                    endColumn: info.endColumn,
                };


                const reminds = starling.match(linePrefix)
                console.log('reminds: ', reminds);
                return [reminds].map(val => {
                    try {
                        return {
                            label: "<a label>",
                            kind: CompletionItemKind.Method,
                            range,
                            insertText: `$t('${val}', '${linePrefix.trim()}')`,
                            detail: "<a description>",
                        }
                    } catch(err) {
                        console.log('err: ', err);
                    }
                })
            }
        },
        ' '
0
Mike Lischke 28 Фев 2021 в 10:03