You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VSCode扩展:能否通过when子句匹配编辑器内容控制菜单显示?

实现VSCode上下文菜单根据编辑器内容正则匹配显示的方案

VSCode官方的when子句上下文确实没有直接支持匹配编辑器内容的内置变量,要实现需求,需要通过自定义上下文变量+监听内容变化更新状态的方式来实现,具体步骤如下:

1. 在扩展代码中注册并更新自定义上下文变量

在扩展的activate函数里,监听编辑器的激活状态变化和内容变化,实时检查当前文档是否匹配目标正则,然后通过setContext命令设置自定义上下文变量。

示例代码:

import * as vscode from 'vscode';

export function activate(context: vscode.ExtensionContext) {
    // 定义目标匹配正则
    const matchPattern = /Open me: ([a-zA-Z]{1,3}\d{5})/;

    // 更新上下文变量的逻辑
    const updateMatchStatus = () => {
        const activeEditor = vscode.window.activeTextEditor;
        let isMatch = false;
        
        if (activeEditor) {
            const fullText = activeEditor.document.getText();
            isMatch = matchPattern.test(fullText);
        }
        
        // 设置自定义上下文变量
        vscode.commands.executeCommand('setContext', 'editorContentMatchesTarget', isMatch);
    };

    // 初始化时执行一次
    updateMatchStatus();

    // 订阅编辑器激活和内容变化事件
    context.subscriptions.push(
        vscode.window.onDidChangeActiveTextEditor(updateMatchStatus),
        vscode.workspace.onDidChangeTextDocument(event => {
            // 仅当前激活编辑器的内容变化时更新
            if (vscode.window.activeTextEditor?.document === event.document) {
                updateMatchStatus();
            }
        })
    );
}

2. 修改package.json中的菜单配置

将原来的when条件替换为自定义的上下文变量,结合editorTextFocus确保只有编辑器聚焦时才判断:

"editor/context": [
  {
    "command": "open.something",
    "group": "my.commands",
    "when": "editorTextFocus && editorContentMatchesTarget"
  }
]

额外优化建议

  • 如果需要匹配选中内容而非整个文档,只需把activeEditor.document.getText()改成activeEditor.document.getText(activeEditor.selection)即可
  • 针对大文档场景,可以添加防抖处理,避免内容每变化一次就执行正则匹配,提升性能:
    import debounce from 'lodash.debounce';
    // 将updateMatchStatus包装成防抖函数
    const debouncedUpdate = debounce(updateMatchStatus, 200);
    // 订阅事件时使用debouncedUpdate
    

内容的提问来源于stack exchange,提问作者Skahtpin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 23:10:02