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

VSCode TypeScript扩展:如何获取查找小部件的所有匹配文本内容

在VSCode TypeScript扩展中实现仅保留查找匹配内容的命令

核心结论

你可以直接获取所有查找匹配内容的数组,完全不需要依赖editor.action.selectHighlights命令——这个命令确实存在仅在正则模式下生效的设计限制,不适合作为稳定的实现方式。

实现思路

通过获取当前查找小部件的搜索配置(包括查询文本、是否正则、大小写敏感、全词匹配等),直接对当前文档内容进行正则匹配,得到所有结果后替换整个文档内容即可。

具体代码实现

import * as vscode from 'vscode';

export function activate(context: vscode.ExtensionContext) {
    const cropCommand = vscode.commands.registerCommand('your-extension.id.cropToMatches', async () => {
        const editor = vscode.window.activeTextEditor;
        if (!editor) {
            vscode.window.showErrorMessage('无活动编辑器');
            return;
        }

        const document = editor.document;
        const fullDocText = document.getText();

        // 获取当前查找小部件的搜索状态
        const searchState = await vscode.commands.executeCommand<{
            query: string;
            isRegex: boolean;
            isCaseSensitive: boolean;
            isWordMatch: boolean;
        }>('vscode.getSearchState');

        if (!searchState || !searchState.query) {
            vscode.window.showErrorMessage('未检测到有效搜索查询');
            return;
        }

        let matchRegex: RegExp;
        try {
            // 根据搜索配置构造正则表达式
            let pattern = searchState.isRegex 
                ? searchState.query 
                : escapeRegExp(searchState.query);
            
            // 处理全词匹配规则
            if (searchState.isWordMatch) {
                pattern = `\\b${pattern}\\b`;
            }

            // 设置正则标志:全局匹配 + 大小写是否敏感
            const flags = searchState.isCaseSensitive ? 'g' : 'gi';
            matchRegex = new RegExp(pattern, flags);
        } catch (err) {
            vscode.window.showErrorMessage('搜索模式无效');
            return;
        }

        // 获取所有匹配结果
        const matches = fullDocText.match(matchRegex) || [];
        if (matches.length === 0) {
            vscode.window.showInformationMessage('未找到匹配内容');
            return;
        }

        // 用换行连接匹配结果,替换整个文档
        const newContent = matches.join('\n');
        await editor.edit(editBuilder => {
            const fullDocRange = new vscode.Range(
                document.positionAt(0),
                document.positionAt(fullDocText.length)
            );
            editBuilder.replace(fullDocRange, newContent);
        });
    });

    context.subscriptions.push(cropCommand);
}

// 辅助函数:转义正则特殊字符(用于普通字符串查找)
function escapeRegExp(str: string): string {
    return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}

关键细节说明

  1. 获取查找状态:通过vscode.getSearchState命令可以直接拿到查找小部件的当前配置,确保你的匹配逻辑和用户在查找框中的设置完全一致。
  2. 正则构造逻辑:根据用户选择的查找模式(正则/普通字符串)、大小写敏感、全词匹配等规则,动态构造对应的正则表达式,覆盖所有查找场景。
  3. 替换文档内容:通过editor.edit方法直接替换整个文档的内容,实现“仅保留匹配项”的效果。

关于editor.action.selectHighlights的限制

这个命令的内部实现只针对正则查找场景做了全匹配选中的逻辑,普通字符串查找下它的行为是不稳定的,因此不建议用它来实现你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 01:13:36