答案:自定义CodeLens提供程序需实现接口并注册,通过正则匹配或AST解析在代码上方显示可操作标签,适用于展示版本控制、测试状态等上下文信息。

要在VSCode里搞定一个自定义的代码透镜(CodeLens)提供程序,说白了,就是得写一个VSCode扩展。核心在于实现
CodeLensProvider
搞一个自定义的CodeLens提供程序,其实没想象中那么玄乎,但确实需要一点点耐心去理解VSCode扩展的套路。
初始化项目: 首先,你需要一个VSCode扩展的脚手架。如果你还没装
yo code
npm install -g yo generator-code
yo code
my-custom-codelens
package.json
package.json
activationEvents
"onLanguage:typescript"
contributes.commands
contributes.languages
// package.json 示例
{
"name": "my-custom-codelens",
"displayName": "My Custom CodeLens",
"version": "0.0.1",
"engines": {
"vscode": "^1.80.0"
},
"categories": [
"Other"
],
"activationEvents": [
"onLanguage:typescript", // 当TypeScript文件打开时激活
"onCommand:myCustomCodelens.doSomething" // 当特定命令被执行时激活
],
"main": "./out/extension.js",
"contributes": {
"commands": [
{
"command": "myCustomCodelens.doSomething",
"title": "执行我的自定义操作"
}
]
},
"scripts": {
"vscode:prepublish": "npm run compile",
"compile": "tsc -p ./",
"watch": "tsc -watch -p ./",
"pretest": "npm run compile && npm run lint",
"lint": "eslint src --ext ts",
"test": "node ./out/test/runTest.js"
},
"devDependencies": {
"@types/vscode": "^1.80.0",
"@types/node": "^18.17.1",
"@typescript-eslint/eslint-plugin": "^6.4.1",
"@typescript-eslint/parser": "^6.4.1",
"eslint": "^8.47.0",
"typescript": "^5.1.6"
}
}实现CodeLensProvider
src/extension.ts
vscode.CodeLensProvider
provideCodeLenses
resolveCodeLens
provideCodeLenses(document: vscode.TextDocument, token: vscode.CancellationToken)
vscode.CodeLens
CodeLens
range
range
CodeLens
command
resolveCodeLens
resolveCodeLens?(codeLens: vscode.CodeLens, token: vscode.CancellationToken)
command
// src/extension.ts 示例
import * as vscode from 'vscode';
// 定义一个正则表达式,用于匹配我们想要添加CodeLens的特定模式
// 比如,我们想在所有包含 "TODO:" 的行上方显示一个CodeLens
const TODO_REGEX = /(TODO:)\s*(.*)/g;
class MyCodeLensProvider implements vscode.CodeLensProvider {
// 当文档内容变化或CodeLens需要刷新时,VSCode会调用这个方法
public provideCodeLenses(document: vscode.TextDocument, token: vscode.CancellationToken): vscode.ProviderResult<vscode.CodeLens[]> {
const codeLenses: vscode.CodeLens[] = [];
const text = document.getText();
let match;
// 遍历文档,查找所有匹配我们正则表达式的行
while ((match = TODO_REGEX.exec(text)) !== null) {
// 获取匹配到的行的位置
const line = document.lineAt(document.positionAt(match.index).line);
const range = new vscode.Range(line.range.start, line.range.end);
// 创建一个CodeLens对象。注意,这里我们暂时不设置command,留给resolveCodeLens处理
if (range) {
codeLenses.push(new vscode.CodeLens(range));
}
}
return codeLenses;
}
// VSCode会按需调用这个方法来填充CodeLens的command
public resolveCodeLens(codeLens: vscode.CodeLens, token: vscode.CancellationToken): vscode.ProviderResult<vscode.CodeLens> {
// 在这里,我们可以根据CodeLens的range,获取对应行的文本
// 然后根据文本内容,决定CodeLens要显示什么标题和执行什么命令
const lineText = vscode.window.activeTextEditor?.document.getText(codeLens.range);
if (lineText?.includes("TODO:")) {
codeLens.command = {
title: `找到一个待办事项: ${lineText.trim().substring(5)}`, // 显示CodeLens的标题
command: 'myCustomCodelens.doSomething', // 点击CodeLens时执行的命令
arguments: [lineText] // 命令的参数
};
}
return codeLens;
}
}
// 激活扩展的入口点
export function activate(context: vscode.ExtensionContext) {
console.log('Congratulations, your extension "my-custom-codelens" is now active!');
// 注册CodeLens提供程序
// 'typescript' 是语言ID,确保和 package.json 中的 activationEvents 匹配
context.subscriptions.push(vscode.languages.registerCodeLensProvider(
{ language: 'typescript', scheme: 'file' }, // 也可以是 ['typescript', 'javascript'] 等数组
new MyCodeLensProvider()
));
// 注册一个命令,供CodeLens点击时调用
context.subscriptions.push(vscode.commands.registerCommand(
'myCustomCodelens.doSomething',
(todoText: string) => {
vscode.window.showInformationMessage(`你点击了待办事项: ${todoText}`);
// 在这里可以实现更复杂的逻辑,比如打开一个新的文件、跳转到某个位置等
}
));
}
// 当你的扩展被禁用时,会调用这个方法
export function deactivate() {}调试和测试: 按下F5,VSCode会打开一个新的“扩展开发主机”窗口。在这个新窗口里打开一个TypeScript文件,随便写几行带
TODO:
这套流程走下来,一个基本的自定义CodeLens就搭起来了。实际应用中,你可能需要更复杂的逻辑来解析代码,但核心思路就是这样。
说实话,CodeLens这东西,用好了简直是提升开发体验的神器。它把一些原本需要你手动查找或切换上下文才能获取的信息,直接“钉”在代码旁边,减少了认知负担。
在我看来,最实用的场景包括:
TODO
FIXME
总的来说,CodeLens的价值在于它提供了一种“即时上下文”的信息展示方式,让开发者能更专注于代码本身,同时又不会错过重要的辅助信息。
性能问题,尤其是在VSCode这种高频使用的工具里,是绝对不能忽视的。CodeLens如果写得不好,确实可能让VSCode变得迟钝。这方面,有几个关键点我觉得特别重要:
善用resolveCodeLens
provideCodeLenses
range
command
resolveCodeLens
resolveCodeLens
高效地扫描文档:
provideCodeLenses
异步操作: 确保你的CodeLens提供程序中的任何潜在耗时操作都是异步的(例如,网络请求、文件I/O)。使用
async/await
vscode.CancellationToken
限制CodeLens数量: 如果一个文件中有成百上千个CodeLens,即使每个CodeLens的计算量很小,累积起来也会造成性能问题。考虑对CodeLens的数量进行限制,或者只在用户关注的特定区域显示。
内存管理: 避免在
provideCodeLenses
resolveCodeLens
Debounce和Throttle: 如果你的CodeLens逻辑需要在用户输入时频繁更新,考虑使用
debounce
throttle
总之,CodeLens的性能优化,很大程度上就是权衡“即时性”和“资源消耗”。优先保证用户界面的流畅性,然后才是信息的丰富度。
在VSCode里,有多种方式可以给开发者提供上下文信息,CodeLens、Hover和Diagnostic就是其中最常用的三种。它们各自有其特点和最佳使用场景,了解它们的区别能帮助你选择最合适的扩展点。
CodeLens (代码透镜)
Hover (悬停提示)
Diagnostic (诊断信息)
如何选择?
它们不是互斥的,很多时候,一个功能可能需要结合使用这些扩展点。比如,CodeLens可以显示一个函数有多少个引用,而Hover可以显示这个函数的完整文档。诊断信息则可以指出这个函数有没有潜在的bug。合理搭配,才能提供最棒的开发体验。
以上就是如何为VSCode设置一个自定义的代码透镜(CodeLens)提供程序?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号