如何在Visual Studio Code扩展中禁用可选代码片段集?
解决VS Code扩展代码片段动态禁用问题
问题根源
你当前的写法不生效,是因为VS Code的snippets贡献点中,enabled字段仅支持静态布尔值(true/false),不支持${config:...}这种动态配置变量插值,所以直接引用配置项不会起作用。
可行方案
方案1:给单个代码片段添加when条件(简单直接)
- 先在扩展的
package.json中定义配置项(如果还没加):
"contributes": { "configuration": { "title": "RwMH 扩展配置", "properties": { "RwMH.enableCompletions": { "type": "boolean", "default": true, "description": "启用XML代码补全片段" } } }, "snippets": [ { "language": "xml", "path": "./Snippets/Completions.jsonc" } ] }
- 打开你的代码片段文件
Completions.jsonc,给每个片段添加when条件,关联配置项:
{ "XML 补全片段1": { "prefix": "xml-snippet-1", "body": ["<div>${1:content}</div>"], "description": "示例XML片段", "when": "config.RwMH.enableCompletions" }, "XML 补全片段2": { "prefix": "xml-snippet-2", "body": ["<span>${1:text}</span>"], "description": "另一个XML片段", "when": "config.RwMH.enableCompletions" } }
当用户将RwMH.enableCompletions设为false时,所有带该条件的片段会自动隐藏,不再触发补全。
方案2:动态注册/注销代码片段(适合大量片段)
如果你的代码片段数量很多,不想逐个添加when条件,可以通过扩展的激活逻辑动态控制片段加载:
移除
package.json中静态的snippets贡献项。在扩展的入口文件(如
extension.js或extension.ts)中添加以下逻辑:
const vscode = require('vscode'); const fs = require('fs'); const path = require('path'); let snippetDisposable = null; function activate(context) { // 定义更新代码片段的函数 const updateSnippets = () => { // 获取当前配置 const enableCompletions = vscode.workspace.getConfiguration('RwMH').get('enableCompletions'); // 销毁已注册的片段(避免重复) if (snippetDisposable) { snippetDisposable.dispose(); snippetDisposable = null; } // 若配置启用,则注册片段 if (enableCompletions) { const snippetPath = path.join(context.extensionPath, './Snippets/Completions.jsonc'); const snippets = JSON.parse(fs.readFileSync(snippetPath, 'utf8')); snippetDisposable = vscode.languages.registerSnippets('xml', snippets); context.subscriptions.push(snippetDisposable); } }; // 初始化时执行一次 updateSnippets(); // 监听配置变化,实时更新 context.subscriptions.push(vscode.workspace.onDidChangeConfiguration(e => { if (e.affectsConfiguration('RwMH.enableCompletions')) { updateSnippets(); } })); } function deactivate() {} module.exports = { activate, deactivate };
这种方式会完全根据配置项的状态,决定是否加载整个代码片段文件,无需修改单个片段的定义。
内容的提问来源于stack exchange,提问作者Victor Pointer
相关产品推荐
相关产品推荐

