VSCode自定义代码配色完全指南:注释、关键字、函数名颜色随心改

发布时间:2026/9/26 20:47:49
VSCode自定义代码配色完全指南:注释、关键字、函数名颜色随心改
上周帮一位刚入门C语言的朋友调编辑器他抱怨得最多的一句话就是默认主题的注释颜色太深盯着屏幕看半天也分不清注释和正文。这个问题其实很多VSCode用户都会遇到——默认的 Dark 主题里注释是偏暗的绿色#6A9955关键字是蓝色#569CD6变量名是浅蓝色#9CDCFE函数名是带点黄调的浅色#DCDCAA。单看每个颜色都不算难看但组合在一起、再加上长时间盯屏幕视觉疲劳感会很重。更麻烦的是很多人想改的时候第一反应是去装主题插件、或者直接翻主题源码结果要么把整个界面改得乌烟瘴气要么根本不知道该改哪里。实际上VSCode 预留了完全开放的配色修改入口注释颜色、关键字、变量名、函数名这些元素的颜色都可以在settings.json里单独指定想改成什么样就改成什么样。这篇文章我就把整条链路拆开讲清楚先是机制原理再是可抄走的配置最后是那些改了不生效的真实坑。刚接触VSCode的新手可以照着一步步做老手可以直接跳到后半段看排查思路。1. 为什么改注释颜色这桩小事值得专门写一篇先别急着抄代码。很多人觉得改颜色就是个好看不好看的问题但实际上它对你的日常编码效率和眼睛舒适度影响比想象中大得多。第一注释的视觉辨识度直接决定阅读体验。代码是一种非线性文本你读代码时不是从上往下扫而是要跳着看先扫注释理解逻辑再跳到函数定义看实现然后折回调用处。如果注释颜色和正文颜色对比度不够或者整体颜色刺眼眼睛切来切去会非常累。我自己的感觉是把注释颜色调成和正文有明显区分、又不刺眼的色系之后代码瞬间像分区了扫过一眼就知道哪儿是说明、哪儿是逻辑。第二不同人的视觉条件千差万别。红绿色弱的朋友看某些主题里的大段红色报错、绿色关键字基本是灾难在强光环境办公的人会把深色主题里的深色注释完全看成一片黑。这种时候自定义配色不是折腾是必要。第三配色能塑造信息层级。这听起来有点玄但做过一次你就会懂。把函数名定成亮眼的黄色、变量名用浅蓝、关键字用紫色在一份几百行的文件里你扫一眼就能定位到所有函数定义因为那种颜色只属于函数。这不是玄学是人眼对重复颜色的条件反射。我实测下来定位函数、区分变量和属性的速度确实变快了。第四也是一个隐性收益你把这件事搞明白等于顺带理解了VSCode的主题系统。以后遇到任何这个颜色哪来的为什么改不了的问题自己用几分钟就能查清楚不用再到处搜别人截图里那几行代码是干嘛的。2. 先把底层机制搞清楚VSCode里颜色不是写死的这部分是全文的地基。我建议哪怕你想直接抄配置也花五分钟把机制过一遍不然后面踩了坑都不知道为什么。2.1 主题文件其实就是一份JSON你打开设置界面选的每一个颜色主题包括默认的 Dark、Light本质都是一个 JSON 文件。这个 JSON 里装了两类东西colors负责界面UI的颜色比如编辑器背景、边栏、状态栏、选中高亮。tokenColors负责代码文本的颜色也就是注释、关键字、变量名、函数名、字符串这些东西。你平时在主题文件里看到的规则大多长这样{ scope: comment, settings: { foreground: #6A9955 } }意思是所有scope匹配到注释的代码片段文字颜色用#6A9955。2.2 语法颜色的学名TextMate作用域这里的关键概念是scope中文一般叫作用域或语法作用域。你可以把它理解成给代码元素贴的学名标签TextMate 语法规则就是靠这套命名体系来区分这是个注释这是个关键字的。作用域名称是点号连接的多级结构从粗到细逐层精确比如comment.line.double-slash.js拆开看就是注释 → 单行注释 → 双斜杠(//)注释 → 在JavaScript文件里。看你当前所在的编程语言这个学名会继续变化比如 Python 的单行注释一般是comment.line.number-sign.python因为Python用的是#号C语言的关键字可能是storage.type.c或keyword.control.c。你可以把作用域想象成快递地址comment是城市line是街道double-slash是门牌号最后的.js是收件人姓名。地址写得越详细你越能精确地给某一类代码指定颜色。2.3 两个修改入口分得清清楚楚VSCode 设置里有两个很容易混淆的配置项workbench.colorCustomizations改编辑器界面UI的颜色比如背景色、光标色、选中高亮色。它管的是编辑器长得什么样。editor.tokenColorCustomizations改代码文本的颜色注释、关键字、变量名、函数名都归它管。它管的是代码本身什么样。标题里要改的注释颜色、关键字、变量名、函数名全部属于第二类所以主角是editor.tokenColorCustomizations。editor.tokenColorCustomizations里面又分两种写法快捷字段直接写comments、keywords、variables、functionsVSCode官方帮你把这些词映射到一批常用的scope上写法最简单。textMateRules完全自己写scope规则最灵活能精确到某个语言的某种注释。建议两手都会。刚开始图方便用快捷字段遇到快捷字段搞不定的情况再上textMateRules。还有一个顺序问题编辑器加载颜色规则时会先把主题自带的tokenColors铺成一整块画布再用你的editor.tokenColorCustomizations在上面覆盖如果你写了某个编程语言专属的设置块比如[python]它会再叠加一层。理解这个顺序后面排查为什么不生效会快很多。3. 上手实操把注释、关键字、变量名、函数名改成你想要的颜色理论说完了直接进实操。先打开配置文件。3.1 打开settings.json的两种方式第一种快捷键CtrlShiftP打开命令面板输入Open User Settings (JSON)回车就会用JSON格式打开你的用户配置文件。第二种按Ctrl,进入设置界面点右上角的打开设置(JSON)图标效果一样。如果你想改的只是当前项目的颜色不影响到全局其他项目也可以把配置写到项目根目录.vscode/settings.json里。我一般先用用户级配置调好舒舒服服再按项目需要单独覆盖。3.2 方法一用快捷字段快速改在settings.json里加上这一段{ editor.tokenColorCustomizations: { comments: #6A9955, keywords: #C586C0, variables: #9CDCFE, functions: #DCDCAA, strings: #CE9178, numbers: #B5CEA8, types: #4EC9B0 } }保存之后不用重启当前文件立刻就能看到效果。注释、关键字、变量名、函数名分别对应comments、keywords、variables、functions这几个快捷字段。快捷字段的好处是省心坏处是覆盖面有上限。VSCode 只是帮你把它们映射到一批常见scope上不同编程语言对变量函数的定义方式差异极大所以经常出现这个语言效果好、那个语言纹丝不动的情况。3.3 方法二用textMateRules精确指定当快捷字段搞不定时改用textMateRules{ editor.tokenColorCustomizations: { textMateRules: [ { scope: comment, settings: { foreground: #A0DF8C, fontStyle: italic } }, { scope: keyword, settings: { foreground: #C586C0, fontStyle: bold } }, { scope: variable, settings: { foreground: #9CDCFE } }, { scope: entity.name.function, support.function, settings: { foreground: #DCDCAA } } ] } }几个要点说一下scope字段支持写多个scope用逗号分隔比如entity.name.function, support.function意思是这两类元素都按这条规则上色。settings里最常用的是foreground前景色也就是文字颜色。如果你想加粗就写fontStyle: bold想斜体就写italic想取消任何特殊样式就写成空字符串。foreground不只接受#RRGGBB格式的十六进制色也支持#RRGGBBAA八位带透明度的写法不过代码前景色一般用不到透明度直接写六位就行。3.4 常见元素和scope对照表这份表格我按C、Python、JavaScript三种主流语言给出常见例子。注意scope并不能保证每种语言完全一致最准的方法下一节会讲。你要改的元素常用TextMate作用域C语言场景举例Python场景举例JavaScript场景举例单行注释comment.line// 注释# 注释// 注释块注释comment.block/* ... */文档注释三引号/* ... */关键字keyword,keyword.controlif、else、while、returnif、import、return、lambdaif、for、const、let函数定义名entity.name.functionint add(...)里的adddef func():里的funcfunction foo():里的foo内置/库函数调用support.function部分内置库函数print、len等内置函数console.log里的log变量名variable,variable.other.readwriteint x 1;里的xx 1里的xlet value 1里的value字符串stringhellohello、f...hello数字constant.numeric424242类型/类名entity.name.typestruct、typedef命名class Foo里的Fooclass Foo里的Foo看到这个表格你基本就明白机制了你想改某一类元素就先搞清楚它的学名是什么然后把这个学名写进scope字段给它指定颜色。4. 用Inspector让代码开口说话前面提到的scope命名规则在不同语言、不同语法插件里可能都不一样。最稳的做法是直接用VSCode自带的代码作用域探查器看目标元素到底叫什么。4.1 一条命令调出作用域信息打开一个包含你目标语言代码的文件比如一个.c文件或.py文件按CtrlShiftP输入Developer: Inspect Editor Tokens and Scopes回车后把光标移到你想改的元素上比如某个函数的函数名、某个变量的名字、某行注释。编辑器顶部会弹出一个小面板列出这个token的全部信息核心是这几项foreground当前实际生效的颜色值带色块预览。textmate scopes这个token所属的TextMate作用域链通常有一到多个。当前颜色来源这条规则是主题自带、还是你自己的自定义覆盖出来的。比如你把光标放在一行//注释上面板里大概率会看到类似comment.line.double-slash.js、comment这样的scopes。你把这个scope抄下来填到textMateRules的scope字段里颜色就能精准命中那一类元素。4.2 为什么同一个名字在不同语言里scope各不相同这是新手最容易懵的地方。视觉上都是函数名或变量名但不同语言的语法插件给它们起的学名经常不一样。举个例子Python里def hello():中的hello作用域通常是entity.name.function.python。JavaScript里function hello() {}中的hello在部分语法定义里落在entity.name.function.js在另一些场景下前面还会套一层meta.function.js。C语言里printf这类库函数很多主题把它的作用域标成support.function.c而不是entity.name.function所以你用快捷字段functions去改它可能一点都不变。变量名的问题更典型。你在JavaScript里写const name xname的作用域可能是variable.other.constant.js写let count 0count又变成variable.other.readwrite.js访问对象属性时obj.name里的name又可能是variable.other.property.js。这就解释了为什么有些人写了scope: variable之后发现一部分变量改了颜色、另一部分没改。所以最好的习惯是不要只凭记忆写scope强行记忆一大堆命名规则效率也很低。每次想精确改某个语言的某个元素时就用Inspector看一遍把当前语言真实的作用域链抄下来。4.3 查到了但覆盖不全怎么办如果你发现一个颜色改了但在某些地方没生效大概率是两种情况。一是这个元素在不同语境下有好几个scope。解决方法很直接用逗号把它们都列进同一条规则里或者写多条规则。比如想在JavaScript里把所有函数相关元素都改成同色可以这样写{ scope: entity.name.function.js, support.function.js, variable.function.js, settings: { foreground: #DCDCAA } }二是有比你这条规则更具体、又来自更高优先级层的规则把你覆盖了。这就涉及到后面的优先级问题了我们放到踩坑章节细讲。5. 一套可以直接抄走的完整配色配置理论、实操手法都讲完了给你一套我目前实测比较舒服的配置思路是暗色护眼、颜色区分度高、长时间盯屏不累。5.1 配色思路先说清楚这套配色主要做了几件事背景不用纯黑用略带蓝调的深色#1A1B26比纯黑柔和。注释改成灰紫色#565F89既保留这是说明的辨识度又不会像亮绿色那样抢戏。关键字用亮蓝紫#7AA2F7和注释拉开差距。变量名用浅灰蓝#C0CAF5保证日常代码的主体内容清晰。函数名用紫罗兰色#BB9AF7让找函数变得极其容易。字符串用柔和的绿色#9ECE6A数字用橙黄色#FF9E64。类型名用青色#2AC3DE和变量、函数全都区分开。这几个颜色都取自低饱和度色系对眼睛的刺激比高亮纯色小实际体验下来连续看三四个小时代码不会像默认主题那样觉得刺眼、发飘。5.2 完整settings.json示例{ workbench.colorCustomizations: { editor.background: #1A1B26, editor.lineHighlightBackground: #22233A, editor.selectionBackground: #364F6A }, editor.tokenColorCustomizations: { comments: #565F89, keywords: #7AA2F7, variables: #C0CAF5, functions: #BB9AF7, strings: #9ECE6A, numbers: #FF9E64, types: #2AC3DE, textMateRules: [ { scope: comment.line, settings: { foreground: #565F89, fontStyle: } }, { scope: entity.name.function, support.function, settings: { foreground: #BB9AF7 } }, { scope: variable.parameter, settings: { foreground: #FF966C } } ] } }把这段直接放到你的settings.json里保存界面会立刻变样。重点说几个细节我在comment.line里特意把fontStyle写成了空字符串因为很多主题默认给注释加斜体有些人觉得斜体读起来费劲这行就是专门清掉斜体的。如果你喜欢斜体注释把改成italic就行。variable.parameter单独设成橙红色是为了让函数参数在调用时一眼能认出来这个对阅读复杂函数很有帮助。5.3 给特定语言单独开小灶全局一套颜色架不住所有语言都满意。比如你可能觉得Python的注释颜色挺好但C语言里的注释想再深一点。VSCode支持按语言覆盖配置写法是在settings.json里加语言专属设置块{ [python]: { editor.tokenColorCustomizations: { comments: #676E95 } }, [c]: { editor.tokenColorCustomizations: { comments: #5A5A5A } }, [javascript]: { editor.tokenColorCustomizations: { functions: #E0AF68 } } }语言专属设置块的优先级高于全局的editor.tokenColorCustomizations所以在这个语言文件里注释会用块里的颜色其它语言不受影响。这个模式在你看多种语言的代码时特别实用——比如团队项目里C和Python混着写给每种语言一套偏好的配色切换文件时脑子不会乱。5.4 多设备同步和团队分享如果你平时在台式机和笔记本之间切换不用每台机器重复配置一遍。VSCode左下角齿轮菜单里有一个 Turn on Settings Sync设置同步登录微软账号或GitHub账号后可以把配置自动同步到所有设备颜色设置也会跟着走。至于团队协作我的建议是不要让所有人强行使用同一套个人配色。颜色偏好非常主观你喜欢的紫罗兰函数名同事可能看着难受。如果真的想统一一些开发体验最好做成团队主题插件或者先在.vscode/settings.json里放一份强烈建议但不强制的配置说明用途给每个成员自己决定的权利。6. 踩坑记录为什么改了不生效这部分是全文最有价值的地方因为操作本身不难难的是出了问题不知道去哪儿排查。我把这半年被问到最多的问题都列出来你按顺序排查基本能解决。6.1 作用域写得太宽泛被主题自身规则覆盖这是一个高频问题你写了一行scope: comment, settings: { foreground: #FF0000 }结果注释还是绿色的。原因在于主题本身的tokenColors可能对comment.line.double-slash.js这种更具体的scope单独设置过颜色。当两个规则都命中同一个token时VSCode会优先使用作用域链更长、更具体的那条规则。你只写了粗粒度的comment主题写了更细粒度的comment.line你的就输了。解决办法有两个把规则写细比如改成scope: comment.line或直接抄Inspector里显示的完整作用域链。用textMateRules并尽量在scope里带上语言后缀比如comment.line.double-slash.js精确度更高。另外写完配置后用Inspector再查一次面板里会显示当前颜色来自哪条规则。如果显示来源不是你写的自定义规则说明被覆盖了照着调整就行。6.2 快捷字段 functions、variables 覆盖不到某些元素快捷字段的本质是帮你匹配一批常见scope但它并不保证每种语言的所有相关token都能被映射。最典型的两个例子Python内置函数print、len作用域是support.function.builtin.python快捷字段functions未必包得住。JavaScript对象属性obj.name里的name作用域可能是variable.other.property.js快捷字段variables也未必管得到。所以你会发现全局改functions后自己定义的函数名变了色但内置函数调用的颜色纹丝不动。解决办法还是上textMateRules把entity.name.function和support.function并列写进scope一行搞定{ scope: entity.name.function, support.function, settings: { foreground: #BB9AF7 } }6.3 语义高亮劫持了你的颜色这个坑知道的人最少也最隐蔽。VSCode 在近几年引入了语义高亮Semantic Highlighting机制尤其是TypeScript、Python这类有语言服务扩展的场景语言服务器可以返回比TextMate语法识别更准确的信息比如这个token其实是函数参数不是变量。语义高亮生效后它的优先级会覆盖一部分TextMate语法规则。表现为你明明写了entity.name.function的颜色但当前文件里的函数名还是原来主题的颜色。面对这个问题不要直接把语义高亮关闭。正解是用VSCode专门提供的语义token颜色配置在editor.semanticTokenColorCustomizations里设置{ editor.semanticTokenColorCustomizations: { rules: { function: { foreground: #BB9AF7 }, variable: #C0CAF5, parameter: #FF966C } } }语义token也有层级结构你可以写function.declaration去精确匹配函数定义写function匹配所有函数相关的语义tokenvariable.readonly则匹配只读变量。如果你不确定当前文件到底启用了哪些语义token还是老办法用Inspector查它也会把语义token的信息列出来。6.4 fontStyle 残留和主题切换问题另一个常见小坑是你只改了foreground颜色发现注释还是斜体。这说明当前主题给注释的规则里带了fontStyle: italic而你的规则虽然覆盖了前景色但没有覆盖fontStyle。想彻底恢复成正常体把fontStyle显式写成空字符串就行了。还有一个偏经验性的建议尽量选中一个稳定主题作为你的基底主题比如默认的 Dark。因为不同第三方主题的内部scope命名差异很大A主题里entity.name.function有效切到B主题后因为对方改用了另一种命名你那一堆自定义规则可能全部落空。我自己就是常年以 Dark 为基底自定义规则只做增量这样主题升级也好、换机器也好配置都稳定。6.5 改乱了怎么快速恢复自定义配置改花眼是常有的事。恢复的方法是最笨但最有效的直接把editor.tokenColorCustomizations和workbench.colorCustomizations这两个块从settings.json里删掉保存窗口立即恢复成主题默认颜色。如果你开了设置同步记得恢复后把本机的同步覆盖一下避免把坏配置重新传回云端。最后说一点个人体会。改颜色这件事表面看是美化一下IDE本质上是你在驯化编辑器、建立一套属于自己的代码视觉语言。工具用多了颜色不只是好看更是一种条件反射看到这种颜色就知道它是什么角色扫一眼文件结构就能定位目标。我自己也是从一行comments: #808080开始边踩坑边补全一点点把配置养起来的。希望这套思路也能帮你调出一双看得舒服、盯得久不累的眼睛。