VS Code 扩展清单“contribute”破坏了 CompletionItems

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

我正在创建一个扩展,为专有脚本语言执行代码完成和语法突出显示语法。在我尝试将它们组合之前,这两个功能都可以根据需要单独工作。当我向 package.json 添加“contributes”部分以启用突出显示时,完成将停止工作。 “激活”函数仍然被调用,它应该注册这些项目,但它们什么也不做。

作为测试,我从 VS Code 语法突出显示文档及其完成项示例代码

中整理了一个简单的演示

package.json:

    {
        "name": "completions-sample",
        "displayName": "Completion Item Provider Sample",
        "version": "0.0.2",
        "publisher": "vscode-samples",
        "private": true,
        "license": "MIT",
        "repository": {
            "type": "git",
            "url": "https://github.com/Microsoft/vscode-extension-samples"
        },
        "engines": {
            "vscode": "^1.73.0"
        },
        "categories": [
            "Other"
        ],
        "activationEvents": [
            "*"
        ],
        "contributes": {
            "languages": [
            {
                "id": "abc",
                "extensions": [".abc"]
            }
            ],
            "grammars": [
            {
                "language": "abc",
                "scopeName": "source.abc",
                "path": "./syntaxes/abc.tmGrammar.json"
            }
            ]
        },
        "main": "./out/extension.js",
        "scripts": {
            "vscode:prepublish": "npm run compile",
            "compile": "tsc -p ./",
            "lint": "eslint \"src/**/*.ts\"",
            "watch": "tsc -watch -p ./"
        },
        "devDependencies": {
            "@types/node": "^16.11.7",
            "@types/vscode": "^1.73.0",
            "@typescript-eslint/eslint-plugin": "^5.42.0",
            "@typescript-eslint/parser": "^5.42.0",
            "eslint": "^8.26.0",
            "typescript": "^5.0.2"
        }
    }

扩展.ts:

    import * as vscode from 'vscode';
    
    export function activate(context: vscode.ExtensionContext) {
    
        const provider1 = vscode.languages.registerCompletionItemProvider('plaintext', {
    
            provideCompletionItems(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken, context: vscode.CompletionContext) {
    
                const simpleCompletion = new vscode.CompletionItem('Hello World!');
                const snippetCompletion = new vscode.CompletionItem('Good part of the day');
                snippetCompletion.insertText = new vscode.SnippetString('Good ${1|morning,afternoon,evening|}. It is ${1}, right?');
                const docs: any = new vscode.MarkdownString("Inserts a snippet that lets you select [link](x.ts).");
                snippetCompletion.documentation = docs;
                docs.baseUri = vscode.Uri.parse('http://example.com/a/b/c/');
                const commitCharacterCompletion = new vscode.CompletionItem('console');
                commitCharacterCompletion.commitCharacters = ['.'];
                commitCharacterCompletion.documentation = new vscode.MarkdownString('Press `.` to get `console.`');
    
                const commandCompletion = new vscode.CompletionItem('new');
                commandCompletion.kind = vscode.CompletionItemKind.Keyword;
                commandCompletion.insertText = 'new ';
                commandCompletion.command = { command: 'editor.action.triggerSuggest', title: 'Re-trigger completions...' };
    
                return [
                    simpleCompletion,
                    snippetCompletion,
                    commitCharacterCompletion,
                    commandCompletion
                ];
            }
        });
    
        context.subscriptions.push(provider1);

abc.tmGrammar.json:

    {
        "scopeName": "source.abc",
        "patterns": [{ "include": "#expression" }],
        "repository": {
          "expression": {
            "patterns": [{ "include": "#letter" }, { "include": "#paren-expression" }]
          },
          "letter": {
            "match": "a|b|c",
            "name": "keyword.letter"
          },
          "paren-expression": {
            "begin": "\\(",
            "end": "\\)",
            "beginCaptures": {
              "0": { "name": "punctuation.paren.open" }
            },
            "endCaptures": {
              "0": { "name": "punctuation.paren.close" }
            },
            "name": "expression.group",
            "patterns": [{ "include": "#expression" }]
          }
        }
      }

如果我从 package.json 中删除“contributes”部分,则补全工作正常,但需要此部分指向语言语法文件。

如何才能同时使用这两个功能?

任何相关文档也将不胜感激,因为我只能找到大量文档来说明这两个功能都应该有效。

visual-studio-code autocomplete vscode-extensions syntax-highlighting
1个回答
0
投票

通过将我的问题粘贴到 you.com 找到答案:

“查看您的代码,您似乎已经注册了“纯文本”语言的补全项提供程序。但是,在 package.json 文件的贡献部分中,您已将语言 ID 指定为“abc”。这种不匹配可能是完成工作未按预期进行的原因。”

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