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, '\\$&'); }
关键细节说明
- 获取查找状态:通过
vscode.getSearchState命令可以直接拿到查找小部件的当前配置,确保你的匹配逻辑和用户在查找框中的设置完全一致。 - 正则构造逻辑:根据用户选择的查找模式(正则/普通字符串)、大小写敏感、全词匹配等规则,动态构造对应的正则表达式,覆盖所有查找场景。
- 替换文档内容:通过
editor.edit方法直接替换整个文档的内容,实现“仅保留匹配项”的效果。
关于editor.action.selectHighlights的限制
这个命令的内部实现只针对正则查找场景做了全匹配选中的逻辑,普通字符串查找下它的行为是不稳定的,因此不建议用它来实现你的需求。
内容的提问来源于stack exchange,提问作者fmotion1
相关产品推荐
相关产品推荐

