如何通过VSCode Extension API获取高亮文本(非选中文本)
获取VSCode中语法高亮文本的方案
要获取VSCode里像HTML标签这类被语法着色的高亮文本(而非选中的文本),VSCode扩展API没有直接的方法,但可以通过解析文档的Token来实现——语法高亮本质是基于Token的作用域(scope)来应用样式的,所以我们可以通过获取Token并筛选有作用域的内容来得到目标文本。
实现步骤
- 获取当前激活的文本编辑器实例
- 获取文档的全部Token信息
- 遍历Token,筛选出带有语法作用域的条目,提取对应的文本内容
代码示例
import * as vscode from 'vscode'; export function retrieveHighlightedSyntaxText() { const activeEditor = vscode.window.activeTextEditor; if (!activeEditor) { vscode.window.showErrorMessage('当前没有激活的编辑器'); return; } const targetDoc = activeEditor.document; // 获取整个文档的Token集合 const docTokens = vscode.languages.getFullTextTokens(targetDoc); const highlightedSegments: { content: string; scopes: string[] }[] = []; docTokens.forEach(token => { // 仅收集带有语法作用域(即被高亮)的文本片段 if (token.scopes.length > 0) { const segmentText = targetDoc.getText(new vscode.Range(token.start, token.end)); highlightedSegments.push({ content: segmentText, scopes: token.scopes }); } }); // 可根据需求处理或返回高亮文本片段 console.log('语法高亮文本片段:', highlightedSegments); return highlightedSegments; }
说明
token.scopes对应的是语法高亮的作用域标识,比如meta.tag.html对应HTML标签、string.quoted.double.html对应HTML中的双引号字符串,通过这些标识可以精准筛选特定类型的高亮文本- 如果只需要获取文档某一范围内的高亮文本,可使用
vscode.languages.getTokensAtPosition结合指定范围来替代getFullTextTokens
内容的提问来源于stack exchange,提问作者Joel Almeida
相关产品推荐
相关产品推荐

