FEATURED · 精选文章

手写VS Code雅蓝主题:JSON配色、token作用域与AI助手视觉协调指南

发布时间 / 2026/9/9 6:31:19
来源 / 创域科博编辑部
栏目 / 资讯中心
手写VS Code雅蓝主题:JSON配色、token作用域与AI助手视觉协调指南 简介雅蓝配色主题源自HbuilderX编辑器移植到Visual Studio Code后成为一套清爽护眼的代码配色方案特别适合长时间编程、希望降低视觉疲劳的前端与全栈开发者。资源为zip压缩包共3个JSON文件涵盖主题定义与包配置整体仅7KB轻量易用。已有2450人学习下载。主题以深蓝色背景配合淡色文字对关键字、注释、字符串等语法元素作出鲜明而柔和的色彩区分兼顾可读性与专注度同时支持在VS Code内置设置中微调字体大小、行距与代码折叠样式满足个性化开发环境需求。导入时只需将主题文件放置到指定扩展目录并重新加载主题即可复现HbuilderX的经典雅蓝视觉效果。 我数不清自己卸载过多少个蓝色系主题了。每次看到插件市场里新上架的深蓝主题点安装、应用再打开代码写两行然后发现要么高亮色亮得刺眼像荧光笔划过屏幕要么整体灰成一片代码之间的层次感完全消失。最后默默切回默认主题。直到某天我打开VS Code的主题JSON文件看了一眼——原来所谓配色主题就是一个结构清晰的配置文件完全可以在一个晚上调出适合自己的样子。这篇文要聊的就是我自建的VScode雅蓝配色主题色板怎么定、JSON怎么写、token作用域怎么调、以及和AI编程助手一起用的时候怎么让界面保持安静。适合给看腻了默认Dark Modern、又不想被第三方主题牵着走的人参考。1. 为什么是雅蓝默认主题和商店主题的两个典型痛点1.1 默认Dark Modern的蓝色高亮为什么刺眼VS Code默认的Dark Modern主题其实很多细节都做得不错唯独一个地方让我在长时间编码时很难受关键字的蓝色高亮。那个蓝在整个深色背景上非常跳跃遇到一份全是if、return、for的C代码视觉上就像有人在重点词底下画满了蓝色划线。单看一两个词还好连续盯两三个小时眼睛会不自觉地往高亮区域集中注意力很容易被切碎。很多开发者在热搜里搜“vscode配置c/c环境”“vscode配置python”重点关注的是环境怎么搭、插件怎么装但很少人意识到一个问题环境配置好之后你面对最多的其实是配色。C里模板、指针、命名空间层层嵌套Python里装饰器、类型注解、函数调用叠在一起。默认主题在这些场景下要么把所有标识符渲染成一个颜色要么把某种高亮做得过于抢眼。这不是“好不好看”的问题而是阅读代码时的效率问题。1.2 商店里蓝色主题的两个极端插件市场里的蓝色系主题我基本都试过。总体可以分成两类。一类是“展示型主题”。颜色层次非常丰富关键字一个色、函数一个色、类型一个色、字符串又一个色截图放到社区里特别漂亮。但真正写代码时你会发现十几个高亮色同时在抢注意力连注释都用亮色整个编辑器像一个被打翻的调色盘。另一类是“护眼型主题”。背景压得很低文字也压得很低饱和度全部拉低看起来确实柔和。但问题是对比度也一起被拉没了。尤其在笔记本自带屏幕上灰背景上的灰文字根本分不清更别提注释和正文之间的区别。这种主题适合截图发朋友圈不适合干活。这两个极端之间其实存在一个很大的空间蓝灰色系、低饱和、但对比度保持一定层次。这正是我决定自己写一个“雅蓝”的动机。自己做的好处是每一个颜色都能解释清楚为什么是它不满意随时改不用等主题作者更新。1.3 自建主题到底解决什么问题很多人的第一反应是“为了换个颜色自己写一个主题值得吗”我的体验是真正的价值不在于颜色本身而是你被迫去理解VS Code的配色机制。写一遍主题JSON你就知道哪些颜色控制语法高亮、哪些颜色控制侧边栏、哪些颜色控制提示面板。以后任何人给你推荐主题你看一眼JSON结构就知道它会不会踩坑。另一方面不同语言对高亮的需求确实不一样。我自己常用的语言是Python和CPython里装饰器、类型注解、函数参数是高频元素C里则是类型名、模板参数、命名空间。默认主题对这两类场景的处理都比较平。自建主题可以针对自己常用的语言做精确调优这一点是任何通用主题都替代不了的。换句话说写主题的过程也是在重新审视你每天写代码的视觉环境。2. 雅蓝的色板设计与护眼逻辑2.1 核心色值一览先说我最终定下来的色板。主背景不是纯黑也不是发青的深灰而是一种带冷灰蓝调的深色。下面是雅蓝主题的关键色值颜色角色色值使用场景设计意图编辑器背景#1A1F2A代码编辑区冷灰蓝避免纯黑的过强明暗对比前景文字#D8DEE9默认文本带蓝灰的亮色亮度适中关键字#6FB6FFif、for、return等控制流的蓝饱和度压低类型#7FD5D5类名、类型名蓝绿过渡和关键字形成区分函数#A6ACFF函数定义与调用蓝紫色跳但克制字符串#A9C98C字符串字面量柔和的绿色中和整屏蓝色注释#63748F注释灰蓝低存在感不影响视线数字#D3A7E0数值、常量淡紫色提示“非文本数据”装饰器/注解#E2B78DPython装饰器、Java注解暖色点缀但不抢主色这个色板最大的特征是所有颜色都往冷色方向偏但饱和度都压在一定范围内。整个编辑器扫过去主旋律是蓝灰不同语义层通过色相偏移来区分而不是通过“更亮”来区分。2.2 对比度与护眼怎么平衡在选色的时候很多人容易走极端。要么追求极致的对比度文字恨不得亮成白色要么为了护眼把所有颜色都压暗结果注释和背景糊在一起。我参考了WCAG对比度的基本思路但没有完全套用。正文和背景之间的对比度保持在比较高的水平确保长时间阅读不费劲注释文字的对比度刻意压低让它在视觉上退到背景层关键字作为强调色对比度比正文再高一点。这样一个页面里就有三个层次注释在最底层、正文在中间层、关键字和类型在强调层。要注意的是对比度不是越高越好。纯黑背景配纯白文字对比度拉满但看久了眼睛一样累。因为瞳孔在明暗之间反复调节。雅蓝选择#1A1F2A这种带色彩倾向的深色底是为了让背景不是一块“死黑”而是有一点冷灰蓝的过渡眼睛在暗部环境中会舒服很多。2.3 语义色分层的原则如果所有元素都用蓝色系比如关键字蓝、函数蓝、类型也蓝那整个文件看过去就是一片蓝海毫无重点。但如果每个元素都换个颜色就成了商店里那种花哨主题。雅蓝的做法是给颜色分层控制流相关的关键字用主蓝色这是代码结构的主干类型和类名用蓝绿色和关键字在同一色温范围但色相偏移函数和变量用蓝紫色形成第三层。字符串和数字作为数据类元素分别用低饱和绿和淡紫从语法上就和“逻辑”区分开来。装饰器和注解是跨语言的元信息用暖褐色做局部点缀。这套逻辑用一句话总结颜色先分“逻辑”和“数据”再在同一阵营里用色相微调增加辨识度。这样既不会变成彩虹也不会糊成一团。3. 用JSON手写主题从零到能用的完整配置3.1 目录结构与最小工程VS Code的主题本质是一个JSON文件不需要完整写一个扩展工程。但为了能用F5打开调试窗口一个最小目录结构还是有必要的。我的做法是这样的my-elegant-blue/ ├── .vscode/ │ └── launch.json ├── themes/ │ └── elegant-blue-color-theme.json └── package.jsonlaunch.json用来启动扩展开发宿主package.json声明这是一个主题扩展themes目录放主题JSON文件。先写package.json{ name: elegant-blue-theme, displayName: Elegant Blue Theme, description: A calm blue-gray dark theme for long coding sessions, version: 0.1.0, publisher: your-name, engines: { vscode: ^1.80.0 }, categories: [Themes], contributes: { themes: [ { label: Elegant Blue, uiTheme: vs-dark, path: ./themes/elegant-blue-color-theme.json } ] } }注意publisher字段只能用小写字母、数字和连字符。然后写launch.json{ version: 0.2.0, configurations: [ { name: Run Extension, type: extensionHost, request: launch, args: [--extensionDevelopmentPath${workspaceFolder}] } ] }这样按F5VS Code会开一个全新的开发宿主窗口自动加载当前文件夹里的主题扩展。3.2 colors字段工作台组件怎么上色主题JSON里有两个关键字段colors和tokenColors。前者管工作台界面也就是编辑器边框、侧边栏、状态栏、标题栏这些区域后者管代码语法高亮。colors字段的格式是“颜色ID”加“色值”覆盖从侧边栏到状态栏的所有UI组件。我实际调整过的重要颜色如下{ name: Elegant Blue, type: dark, colors: { editor.background: #1A1F2A, editor.foreground: #D8DEE9, editorLineNumber.foreground: #3F4C63, editorLineNumber.activeForeground: #A6B4C8, editor.selectionBackground: #2B4A73, editor.inactiveSelectionBackground: #22334C, editorWidget.background: #202632, editorWidget.border: #313B4E, sideBar.background: #151A23, sideBar.foreground: #AEB6C4, sideBarSectionHeader.background: #1C222E, statusBar.background: #10151D, statusBar.foreground: #8FA0B5, titleBar.activeBackground: #151A23, titleBar.activeForeground: #C5CDDA, input.background: #141922, input.border: #2C3648, focusBorder: #4A7FB5 } }核心原则是侧边栏和标题栏比编辑器背景暗半档形成主次关系状态栏再暗一档让最下面的信息条退出视觉中心。选中背景用半透明的蓝色这样既能看到选区范围又不会完全盖住代码本身。3.3 tokenColors字段让语法高亮听话tokenColors才是代码高亮的核心。它的原理是给一串“作用域名称”指定颜色VS Code会根据文本解析出来的语法作用域匹配最近的一条规则。我常用的几条核心规则{ name: Elegant Blue Token Colors, type: dark, tokenColors: [ { name: Comments, scope: [comment, punctuation.definition.comment], settings: { foreground: #63748F, fontStyle: italic } }, { name: Control Keyword, scope: [keyword.control, storage.type.keyword], settings: { foreground: #6FB6FF } }, { name: Types, scope: [entity.name.type, entity.name.class, support.type], settings: { foreground: #7FD5D5 } }, { name: Functions, scope: [entity.name.function, meta.function-call.generic], settings: { foreground: #A6ACFF } }, { name: Strings, scope: [string, punctuation.definition.string], settings: { foreground: #A9C98C } }, { name: Numbers and Constants, scope: [constant.numeric, constant.language, constant.character], settings: { foreground: #D3A7E0 } }, { name: Decorators, scope: [meta.decorator, entity.name.function.decorator], settings: { foreground: #E2B78D } } ] }这里有几个坑值得注意。一是scope的匹配顺序VS Code会按数组顺序找到第一个匹配的规则所以具体作用域要写在前面通用作用域写在后面兜底。二是注释用斜体在等宽字体下区分度很好但如果你的字体没有真正的斜体字形VS Code会做伪斜体看起来反而有点脏建议测试后再决定要不要保留。3.4 加载与切换主题写完后在开发宿主窗口里按CtrlShiftP输入“Color Theme”就能在列表里看到“Elegant Blue”。主题文件名是VS Code自动读的但显示名称取决于package.json里label字段。有一个必须掌握的技巧修改主题JSON后开发宿主窗口不会自动重载你需要在命令面板里执行“Developer: Reload Window”。如果改了package.json里的主题声明那就得重启开发宿主窗口。这个操作我一开始不知道每次改完颜色都以为没生效浪费了不少时间。4. 调试主题的实战链路让颜色真正符合预期4.1 用Inspect Tool确认token作用域写作主题时最让人头疼的问题不是配色而是“我不知道这个代码元素应该用什么scope”。比如Python的装饰器你以为它走的是entity.name.function实际上它可能是meta.decoratorC里面std::vectorint中的vector在不同语言和不同文本语境下scope也完全不一样。解决办法是VS Code自带的检查工具。在命令面板搜索“Developer: Inspect Editor Tokens and Scopes”开启后鼠标悬停在任意代码上会弹出一个面板显示当前token的文本、语言、以及它匹配到的所有作用域名称。你可以看到类似meta.function-call variable.function这样一串嵌套作用域。我调试装饰器颜色的时候就是先用Inspect工具查了一下才发现Python装饰器实际处在meta.decorator作用域里之前我一直以为它是函数名。这个工具是调主题最核心的工具没有之一。4.2 边改边看的效率操作改主题的过程如果只是“改JSON、重载、看效果”效率其实很低。我实际操作下来最高效的方式是先打开一个真实项目代码窗口保持一种语言再开一个内置终端和一个Diff视图。这样每次Reload之后可以同时检查三个场景代码高亮、终端ANSI颜色、Diff的增删底色。终端颜色由terminal.ansi*系列控制。雅蓝的终端配色也沿用了冷色调比如terminal.ansiBlue和terminal.ansiCyan分别对应#6FB6FF和#7FD5D5。很多人只调了编辑器背景忘记调终端背景结果上下两个区域一深一浅非常割裂。这一点务必检查。Diff视图检查也很重要。改动代码时VS Code会用红色和绿色底纹标出删除和新增行。如果主题的默认设置没有覆盖这些值它会用一套和整体风格完全不搭的亮色很可能刺眼。雅蓝的Dial设置会在后面的章节提到。4.3 常见的三类翻车现场与解决第一类翻车背景压得太深高亮色被“吸”到一起。这个现象我一开始也遇到了。纯黑背景下#6FB6FF这种蓝色会显得特别亮甚至有点荧光感。把背景换成#1A1F2A之后亮度冲击明显下降。第二类翻车注释和背景对比度过低。我一开始为了压低注释的存在感选了#5A6A80结果在低亮度显示器上几乎看不清。后来提到#63748F保留灰蓝气质的同时保证可读性。这里建议测试一下显示器亮度或者用在线对比度工具简单算一下注释文字和背景的对比度至少在3:1左右。第三类翻车括号匹配颜色盖过一切。新版VS Code内置了括号配对颜色默认是三组颜色往往和主题风格不搭。这时需要在colors字段里显式覆盖editorBracketHighlight.foreground1/2/3。我用的是一组低饱和蓝、青、紫既能区分括号层级又不至于满屏彩色。5. 当编辑器里出现AI助手雅蓝主题与AI编程工具的视觉协调5.1 AI工具给编辑器带来哪些新颜色区域最近很多人在搜“vscode配置claude code”“vscode codex插件”“vscode接入deepseek”说明AI编程助手已经成为日常开发的一部分。但很少有人注意到接入这些工具之后编辑器的“信息色彩”会突然多出好几个层次。聊天面板有自己的背景色AI生成的代码块往往带一层强调底色Diff视图里的增删行会用强烈的红绿标注内联建议inline suggestion会用灰底或下划线提示。这些颜色如果不做统一主题是主题、AI是AI界面会显得非常割裂。5.2 低饱和diff与面板背景的调法雅蓝对AI相关区域的调整思路是让这些区域“退后半步”。Diff的增删背景适合用低透明度的色块而不是全饱和的实色。比如diffEditor.insertedTextBackground: #2A4A3A55, diffEditor.removedTextBackground: #4A2A3A44, diffEditor.insertedLineBackground: #2A4A3A22, diffEditor.removedLineBackground: #4A2A3A22注意这里用的是#RRGGBBAA八位十六进制色值后两位是透明度。透明度越低色块越安静。这样在Code Review的时候眼睛不会被大面积的绿色和红色吸走但仍然能清晰分辨增删区域。聊天面板的基调跟随侧边栏。比如VS Code默认的Chat界面可能会使用chat.editorBackground、input.background等颜色把sideBar背景和input背景统一之后整体就协调了。我个人的习惯是AI助手面板只需要“够用”的视觉提示不需要像主题宣传图那样处处发光。5.3 与常用插件的配色配合除了AI工具还有几个高频插件会影响观感。GitLens的悬停信息、代码行号上的Git提示用的是editorOverviewRuler相关的颜色MiniMap里的文字颜色淡容易白茫茫一片可以单独把minimap.background调成和侧边栏一致的深色再调整minimap.selectionHighlight的色值。这里想强调一个容易被忽略的原则主题不是把所有颜色都调得越明显越好而是要懂得“谁该在前台谁该退到后台”。代码本身的语义高亮是前台Git信息、AI建议、MiniMap是辅助层应当降低视觉权重。AI接入之后这一点变得更加重要信息流变多颜色如果再打架效率反而会下降。6. 主题维护魔法文件和打包发布6.1 用“魔法文件”做回归检查主题调整到一定程度后最大的风险是“改了一个颜色另一个地方又变得不和谐了”。我后来养成了一个习惯在主题扩展的目录下放一个rainbow-check文件里面故意写上一段包含这个主题想要覆盖的所有语言特性的代码。比如用Python写一段带装饰器、类型注解、字符串、数字、注释的代码用C写一段带模板、命名空间、类、函数的代码再放一个Markdown文件和一个YAML文件。每次修改主题后打开这个魔法文件扫一遍最多三十秒就能判断有没有引入回归。这个文件还可以作为以后扩充语言的测试基准。6.2 打包vsix仅自用如果主题只在你自己机器上用F5开发宿主窗口其实已经够用。但如果你想在正常的VS Code窗口里用又不想发到插件市场可以打包成vsix文件。需要先安装vscode/vscenpm install -g vscode/vsce然后在扩展根目录执行vsce package会生成一个.vsix文件。在VS Code扩展面板右上角选择“Install from VSIX…”就能安装这个主题。唯一的限制是package.json里不能有private: true字段否则打包会失败。我个人其实很少打包发布。主题JSON就放在一个git仓库里跟着我的dotfiles配置一起管理。换电脑时一键拉下来按F5加载即可比装插件市场里的主题还方便。最后再分享一个使用半年后的个人体会自建主题最大的好处不是“独一无二”而是你在调试过程中慢慢理解了VS Code的色彩体系。之后无论用哪个主题你都能一眼看出它的结构哪里合理、哪里有问题。如果你想下一顿饭自己做饭先从雅蓝开始动手可能比去商店里再逛一圈更有收获。本文还有配套的精品资源点击获取
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻