自定义文档颜色提供程序需创建VSCode扩展,通过实现ColorProvider接口,利用provideDocumentColors识别文件中特定颜色格式,用provideColorPresentations支持颜色选择与格式转换,结合正则解析与颜色空间处理,提升非标准颜色值的可视化与编辑效率。

为VSCode配置一个自定义的文档颜色提供程序,本质上是编写一个VSCode扩展,利用其
ColorProvider
要实现一个自定义的文档颜色提供程序,你需要创建一个VSCode扩展项目,并在其中注册一个
ColorProvider
初始化VSCode扩展项目 使用Yeoman生成器(
yo code
注册ColorProvider
extension.ts
extension.js
vscode.languages.registerColorProvider
DocumentSelector
{ language: 'plaintext' }{ pattern: '**/*.mycss' }实现ColorProvider
ColorProvider
provideDocumentColors(document: vscode.TextDocument, token: vscode.CancellationToken): vscode.ProviderResult<vscode.ColorInformation[]>
vscode.ColorInformation
ColorInformation
vscode.Range
vscode.Color
provideColorPresentations(color: vscode.Color, context: { document: vscode.TextDocument; range: vscode.Range; }, token: vscode.CancellationToken): vscode.ProviderResult<vscode.ColorPresentation[]>vscode.Color
ColorPresentation
label
textEdit
核心代码示例:
import * as vscode from 'vscode';
// 假设我们想识别形如 `my-color(#RRGGBB)` 的自定义颜色格式
const MY_COLOR_REGEX = /my-color\((#([0-9a-fA-F]{3}){1,2}|rgb\(\s*\d{1,3}\s*,\s*\d{1,3}\s*,\s*\d{1,3}\s*\))\)/g;
class MyCustomColorProvider implements vscode.ColorProvider {
provideDocumentColors(document: vscode.TextDocument, token: vscode.CancellationToken): vscode.ProviderResult<vscode.ColorInformation[]> {
const colors: vscode.ColorInformation[] = [];
const text = document.getText();
let match;
while ((match = MY_COLOR_REGEX.exec(text)) !== null) {
const startPos = document.positionAt(match.index);
const endPos = document.positionAt(match.index + match[0].length);
const range = new vscode.Range(startPos, endPos);
// 提取实际的颜色值字符串,这里假设是match[1]
const colorString = match[1];
// 尝试解析颜色字符串为 vscode.Color 对象
let color: vscode.Color | undefined;
if (colorString.startsWith('#')) {
color = this.parseHexColor(colorString);
} else if (colorString.startsWith('rgb')) {
color = this.parseRgbColor(colorString);
}
if (color) {
colors.push(new vscode.ColorInformation(range, color));
}
}
return colors;
}
provideColorPresentations(color: vscode.Color, context: { document: vscode.TextDocument; range: vscode.Range; }, token: vscode.CancellationToken): vscode.ProviderResult<vscode.ColorPresentation[]> {
const presentations: vscode.ColorPresentation[] = [];
// 将 vscode.Color 转换回我们自定义的格式
const { red, green, blue, alpha } = color;
const hex = this.toHex(red) + this.toHex(green) + this.toHex(blue);
const rgb = `rgb(${Math.round(red * 255)}, ${Math.round(green * 255)}, ${Math.round(blue * 255)})`;
// 提供自定义格式的呈现
presentations.push(new vscode.ColorPresentation(`my-color(#${hex})`, new vscode.TextEdit(context.range, `my-color(#${hex})`)));
presentations.push(new vscode.ColorPresentation(`my-color(${rgb})`, new vscode.TextEdit(context.range, `my-color(${rgb})`)));
return presentations;
}
// 辅助函数:将 RGB 分量转换为两位十六进制字符串
private toHex(c: number): string {
const hex = Math.round(c * 255).toString(16);
return hex.length === 1 ? '0' + hex : hex;
}
// 辅助函数:解析十六进制颜色字符串为 vscode.Color
private parseHexColor(hex: string): vscode.Color | undefined {
let r = 0, g = 0, b = 0;
if (hex.length === 4) { // #RGB
r = parseInt(hex[1] + hex[1], 16);
g = parseInt(hex[2] + hex[2], 16);
b = parseInt(hex[3] + hex[3], 16);
} else if (hex.length === 7) { // #RRGGBB
r = parseInt(hex.substring(1, 3), 16);
g = parseInt(hex.substring(3, 5), 16);
b = parseInt(hex.substring(5, 7), 16);
} else {
return undefined;
}
return new vscode.Color(r / 255, g / 255, b / 255, 1);
}
// 辅助函数:解析 RGB 颜色字符串为 vscode.Color
private parseRgbColor(rgb: string): vscode.Color | undefined {
const match = /rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)/.exec(rgb);
if (match) {
const r = parseInt(match[1]);
const g = parseInt(match[2]);
const b = parseInt(match[3]);
return new vscode.Color(r / 255, g / 255, b / 255, 1);
}
return undefined;
}
}
export function activate(context: vscode.ExtensionContext) {
console.log('Congratulations, your extension "my-custom-color-provider" is now active!');
const disposable = vscode.languages.registerColorProvider(
{ language: 'plaintext' }, // 替换为你的文件类型,例如 'css', 'scss', 'less', 或 { pattern: '**/*.mycustom' }
new MyCustomColorProvider()
);
context.subscriptions.push(disposable);
}
export function deactivate() {}在我看来,自定义颜色提供程序最直接的价值,就是它能够将那些原本在VSCode里看起来平平无奇、纯文本的颜色定义,瞬间“活”起来。想象一下,你的项目可能因为某些历史原因或者特定的业务需求,使用了一套非标准的颜色命名规则,比如
theme-primary-500
这时候,一个自定义的颜色提供程序就能大显身手了。它能让你:
my-color(#FF00FF)
provideColorPresentations
它就像是给VSCode装上了一双“慧眼”,让它能理解你项目里那些“方言”式的颜色表达,从而让开发过程更加流畅和愉悦。
要构建一个能工作的自定义颜色提供程序,你主要会围绕以下几个VSCode API和概念打转,它们是整个功能的基石:
vscode.languages.registerColorProvider(selector: DocumentSelector, provider: ColorProvider)
DocumentSelector
ColorProvider
DocumentSelector
'css'
'javascript'
{ pattern: '**/*.myformat' }vscode.ColorProvider
provideDocumentColors(document: vscode.TextDocument, token: vscode.CancellationToken): vscode.ProviderResult<vscode.ColorInformation[]>
vscode.Range
vscode.Color
vscode.ColorInformation
provideColorPresentations(color: vscode.Color, context: { document: vscode.TextDocument; range: vscode.Range; }, token: vscode.CancellationToken): vscode.ProviderResult<vscode.ColorPresentation[]>vscode.Color
vscode.Color
vscode.ColorPresentation
my-color(#RRGGBB)
vscode.Color
#RRGGBB
my-color(#RRGGBB)
label
vscode.TextEdit
vscode.Color
red
green
blue
alpha
0
1
vscode.ColorInformation
vscode.ColorPresentation
ColorInformation
provideDocumentColors
Range
Color
ColorPresentation
provideColorPresentations
label
textEdit
vscode.TextDocument
vscode.Position
vscode.Range
TextDocument
Position
Range
provideDocumentColors
理解并熟练运用这些API和概念,是成功构建自定义颜色提供程序的关键。它要求你不仅要熟悉VSCode扩展开发的基本流程,还要对字符串解析(通常是正则表达式)和颜色空间转换有一定的理解。
开发过程中,我遇到过一些坑,也总结了一些优化思路,希望能帮你少走弯路:
正则表达式的性能与准确性:
provideDocumentColors
provideDocumentColors
颜色解析与转换的鲁棒性:
#RRGGBB
rgb(R,G,B)
vscode.Color
rgb(256,0,0)
parseInt
NaN
vscode.Color
Math.round
provideDocumentColors
provideColorPresentations
用户体验与provideColorPresentations
provideColorPresentations
vscode.ColorPresentation
label
textEdit
textEdit
Range
label
label
textEdit
textEdit.range
context.range
textEdit.newText
my-color(#HEX)
my-color(rgb(R,G,B))
provideColorPresentations
调试技巧:
console.log
provideDocumentColors
provideColorPresentations
console.log
extension.ts
避免过度复杂化:
总之,开发自定义颜色提供程序是一个既有趣又充满挑战的过程。关键在于对VSCode API的理解,以及对字符串处理和颜色转换的细致考量。多测试,多调试,你会发现它能为你的开发工作流带来巨大的便利。
以上就是如何为VSCode配置一个自定义的文档颜色提供程序?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号