WebStorm 主题插件被升级覆盖后,自己打一个固定版
WebStorm 升级以后,每天盯着看的颜色突然不对了,比少一个功能按钮还烦。
我之前一直用一套 One Dark 风格的主题。升级 WebStorm 后,它像是被系统顺手带走了:插件市场里搜 one dark theme,能搜到几个名字很像的,但装完以后按钮、编辑器、选中态、弹窗颜色都不是原来的感觉。
后来翻了一圈本地配置,又逐项对比旧版和新版颜色表,才发现问题不只是名字变了。新版还换掉了旧版的 UI 色表,旧的灰蓝背景、硬朗按钮和输入框颜色没有作为一个可选主题保留下来。对我这种已经适应旧色的人来说,升级后的几个 One Dark 主题都不对味,只能把旧主题固定下来继续用。
这次整理出的 固定版插件 可以直接下载。
安装方式:
Settings | Plugins | 齿轮菜单 | Install Plugin from Disk...
选中这个 JAR,重启 WebStorm,然后在 Settings | Appearance & Behavior | Appearance 里选择 Sheng Atom OneDark Theme。
这个包是从旧主题插件整理出来的本地固定版,核心改动是换成私有插件 ID,避免以后再被 Marketplace 上同一条插件线的新版覆盖。
先从本地找旧插件
WebStorm 升级时不会只留下当前界面。用户插件、主题选择、编辑器配色、启动日志、Toolbox 备份,都会留下线索。
macOS 上可以先看这些目录:
~/Library/Application Support/JetBrains/WebStorm2026.1/plugins
~/Library/Application Support/JetBrains/WebStorm2026.1/options
~/Library/Caches/JetBrains/WebStorm2026.1/plugins
~/Library/Logs/JetBrains/WebStorm2026.1/idea.log
如果 WebStorm 是通过 JetBrains Toolbox 升级的,旧版本配置还可能在备份目录里:
~/Library/Application Support/JetBrains/WebStorm2026.1-backup/<timestamp>/plugins
找到可疑 JAR 后,不用急着安装,先拆开看 plugin.xml:
unzip -p atom-onedark-theme.jar META-INF/plugin.xml | sed -n '1,120p'
主题 JSON 也可以直接读:
unzip -p atom-onedark-theme.jar atom_onedark.theme.json \
| python3 -m json.tool \
| sed -n '1,80p'
这次在 Toolbox 备份里找到的旧插件,META-INF/plugin.xml 里是这样的:
<id>github.cweijan.test-theme</id>
<name>Atom OneDark Theme</name>
<version>1.6</version>
这三个字段基本就把旧身份钉住了:它叫 Atom OneDark Theme,插件 ID 是 github.cweijan.test-theme,版本是 1.6。
名字为什么对不上
JetBrains 插件市场里的展示名可以改,插件 ID 才是更稳定的身份。
旧插件的 xmlId 是 github.cweijan.test-theme。2026-06-26 查 JetBrains Marketplace 时,同一个 xmlId 对应的是 One Dark Modern Theme,Marketplace 插件 ID 是 12178,版本线已经到了 2.x。
另一个常见搜索结果 One Dark Theme 是 Mark Skelton 维护的另一套主题,xmlId 是:
com.markskelton.one-dark-theme
它名字很像,但和 github.cweijan.test-theme 不是同一条插件线。所以「装了一个 One Dark 还是不像以前」很正常:搜索命中了同类主题,不一定命中原来那一个。
WebStorm 当前选择了哪个主题,可以看:
~/Library/Application Support/JetBrains/WebStorm2026.1/options/laf.xml
当前编辑器配色可以看:
~/Library/Application Support/JetBrains/WebStorm2026.1/options/colors.scheme.xml
有时候 UI 主题已经变成新的,编辑器配色还挂着旧 scheme 名;也有时候 laf.xml 里记录的主题 ID 对应插件已经不在了。界面看起来「半旧半新」,往往就是这些配置没对齐。
新版丢掉了旧 UI 色表
一开始我也怀疑过:新版插件可能还带着旧颜色,只是我没有选对主题。检查当前 Marketplace 上的 One Dark Modern Theme 2.0.5 后,能看到它只有一个主题入口:
<themeProvider id="one-dark-modern-theme" path="/theme/one_dark_modern.theme.json" />
包里对应的主题文件也只有:
theme/one_dark_modern.theme.json
theme/one_dark_modern.xml
旧版 Atom OneDark Theme 1.6 的 atom_onedark.theme.json 和 atom_onedark.xml 没有作为另一个可选主题保留下来。
更关键的是颜色本身也对不上。旧版最明显的 UI 色是这一组:
主背景 #343C4A
按钮背景 #424954
输入框背景 #454C5C
Search Everywhere 背景 #474C59
Tab 选中背景 #3B4252
Tab 下划线 #848AA1
按钮圆角 0
新版 One Dark Modern 已经换成了另一组:
主背景 #21252b
按钮背景 #2c313c
输入框背景 #252931
Search Everywhere 背景 #252931
Tab 选中背景 #21252b
Tab 下划线 #528bff
按钮圆角 8
另一个插件 One Dark Theme 里的 One Dark / Islands / Vivid 也更接近 #21252b 和 #282c34 这组深底色。它们和旧版的灰蓝 UI 不是同一个方向。
编辑器配色里确实还能看到一些 One Dark 系的相似颜色,比如 selection 和行号颜色有继承关系;但 WebStorm 外壳、按钮、弹窗、侧栏、输入框、Tab 这些每天扫来扫去的 UI 颜色已经换了。新版只保留了 One Dark Modern 这条主题路线,没有继续打包旧的 UI 色表。
这就是这个固定版主题的由来:新版继续往 One Dark Modern 走,旧版用户如果想保留 Atom OneDark Theme 1.6 的视觉,只能把旧颜色整理成一个独立主题。
JetBrains 插件其实是什么
JetBrains IDE 插件最外层通常是一个 ZIP 或 JAR,里面至少会有:
META-INF/plugin.xml
IDE 启动或刷新插件时,会读取这个文件里的插件 ID、名字、版本、兼容范围、依赖和扩展点。
一个很小的插件也可能只有这些东西:
META-INF/plugin.xml
atom_onedark.theme.json
atom_onedark.xml
plugin.xml 负责告诉 IDE:「我提供了一个主题」。真正的颜色规则放在 theme JSON 里,编辑器里的代码高亮、光标行、diff、selection 等配色,通常放在 editor scheme XML 里。
JetBrains 的 Theme Structure 文档里也把主题插件拆成这几部分:
- 必需的 theme JSON;
plugin.xml里的themeProvider声明;- 可选的 editor scheme XML;
- 可选的背景图和图标资源。
主题插件最好保持单一职责。一个主题插件就只管主题,不要顺手塞别的动作、设置页或语言功能。这样升级 IDE 时风险小,自己维护起来也清楚。
主题是怎么被 IDE 加载的
主题入口在 plugin.xml 里:
<extensions defaultExtensionNs="com.intellij">
<themeProvider
id="fun.shengsheng.jetbrains.sheng-atom-onedark-theme.theme"
path="atom_onedark.theme.json"/>
</extensions>
IDE 通过这两个字段识别主题并找到资源:
id是这个主题 provider 的唯一 ID。不要复用别人插件里的 ID,也不要多个主题共用一个 ID。JetBrains 文档里也提醒过,themeProvider的 ID 要保持唯一。path指向 theme JSON,IDE 通过它找到主题描述文件。
theme JSON 里最常见的是这些字段:
{
"name": "Sheng Atom OneDark Theme",
"dark": true,
"author": "Local",
"editorScheme": "/atom_onedark.xml",
"ui": {
"Panel.background": "#343C4A",
"Button.startBackground": "#424954",
"Button.endBackground": "#424954"
}
}
name是在 WebStorm 设置里看到的主题名。dark决定它基于浅色主题还是 Darcula 这类暗色基底。editorScheme指向编辑器配色 XML。没有它也能做 UI 主题,但编辑器高亮就会跟着用户当前 scheme 走。ui用于覆盖 UI 控件颜色,按钮、面板、弹窗、标签页、搜索框和工具窗口的颜色大多从这里改。
还有一个很实用的写法是先定义命名颜色,再在 ui 里引用:
{
"colors": {
"surface": "#343C4A",
"surfaceHover": "#485569",
"text": "#D0D0D9"
},
"ui": {
"Panel.background": "surface",
"Button.startBackground": "surfaceHover",
"Button.endBackground": "surfaceHover",
"Button.foreground": "text"
}
}
命名颜色由具体控件引用,调色时只需修改对应的颜色定义,不用在几十个地方反复改同一个十六进制值。
主题 JSON 负责 UI 配色,editorScheme 指向的 XML 负责编辑器颜色。重新分发前仍要核对原主题许可,修改插件 ID 不会免除许可义务。完整内容见主题规则的调整示例弹窗。
这次固定版改了什么
我没有改旧主题的颜色,只改了插件身份和展示名。
旧插件:
<id>github.cweijan.test-theme</id>
<name>Atom OneDark Theme</name>
<version>1.6</version>
固定版:
<id>fun.shengsheng.jetbrains.sheng-atom-onedark-theme</id>
<name>Sheng Atom OneDark Theme</name>
<version>1.6.0-sheng.1</version>
<extensions defaultExtensionNs="com.intellij">
<themeProvider
id="fun.shengsheng.jetbrains.sheng-atom-onedark-theme.theme"
path="atom_onedark.theme.json"/>
</extensions>
theme JSON 里的名字也改成了:
{
"name": "Sheng Atom OneDark Theme",
"dark": true,
"author": "Local",
"editorScheme": "/atom_onedark.xml"
}
这么改的目的很直接:让 WebStorm 把它当成独立的 Sheng 主题插件,而不是 Marketplace 上的 github.cweijan.test-theme。以后官方插件继续升级、改名、换配色,也不会影响这个固定版。
长期维护主题时,标准 Gradle 工程可以统一处理插件声明、资源和分发产物;只改一个自用固定版时仍可直接重打包。完整内容见最小主题插件模板弹窗。
怎么判断改得对不对
主题插件最容易出错的地方有几个:
plugin.xml里的插件 ID 和themeProvider id跟别人冲突;- theme JSON 的
name没改,导致设置里看不出来装的是哪一版; editorScheme路径写错,UI 主题生效了,编辑器配色没生效;- JAR 里文件路径多套了一层目录,比如
my-theme/META-INF/plugin.xml,IDE 找不到; - 只改了 UI 颜色,没有改 editor scheme,于是代码区还是另一套颜色;
- 旧插件声明的
since-build/until-build卡住了新 IDE。
检查 JAR 结构可以用:
jar tf sheng-atom-onedark-theme.jar | sed -n '1,80p'
META-INF/plugin.xml 必须在根路径下能看到。
检查 JSON:
unzip -p sheng-atom-onedark-theme.jar atom_onedark.theme.json \
| python3 -m json.tool >/dev/null
检查 XML:
unzip -p sheng-atom-onedark-theme.jar META-INF/plugin.xml \
| xmllint --noout -
装完以后,看三个地方:
Settings | Plugins
Settings | Appearance & Behavior | Appearance
Settings | Editor | Color Scheme
如果插件列表能看到,Appearance 里能选到主题,Editor Color Scheme 里也能看到对应 scheme,基本就跑通了。
显示名可能变化,查找插件时应按插件 ID 和实际文件位置区分旧版、新版与固定版。完整内容见插件身份与文件位置速查弹窗。
总结
升级后找不回熟悉的 One Dark,既有显示名与插件身份的差别,也有新版实际替换 UI 色表的变化。这次从本地旧 JAR 找回配色,保留旧颜色,改用独立插件 ID 和 themeProvider ID 打成固定版。主题加载仍依赖 plugin.xml、theme JSON 与 editor scheme XML 的正确引用,UI 外壳和编辑器配色需要分别核对。
只想保留一套旧配色时,直接重打 JAR 就能满足自用需要;需要长期维护、适配 IDE 版本或准备上传 Marketplace 时,建议用 Gradle 工程管理。独立 ID 解决的是后续被同一插件线覆盖的问题,不改变原资源的许可,公开分发仍需核对许可并保留要求的声明。
主题规则的调整示例
怎么自己调整主题规则
如果只是改一套已有主题,最快的办法是拆旧包。
先解压:
mkdir -p /tmp/atom-onedark-theme
cd /tmp/atom-onedark-theme
jar xf /path/to/atom-onedark-theme.jar
通常先看这几个文件:
META-INF/plugin.xml
*.theme.json
*.xml
改 UI 控件颜色,从 theme JSON 的 ui 下手。比如想改主面板、按钮、选中态:
{
"ui": {
"Panel.background": "#343C4A",
"Button.startBackground": "#424954",
"Button.endBackground": "#424954",
"List.selectionBackground": "#4C5870"
}
}
改编辑器里的颜色,要看 editorScheme 指向的 XML。比如光标行、选区、缩进线、diff 背景,很多都在这个文件里:
<scheme name="Sheng Atom OneDark Theme" version="142" parent_scheme="Darcula">
<colors>
<option name="CARET_ROW_COLOR" value="3a414f" />
<option name="SELECTION_BACKGROUND_COLOR" value="4c5870" />
</colors>
</scheme>
更稳的调法是先在 WebStorm 里打开:
Settings | Editor | Color Scheme
复制一份当前 scheme,手动调到差不多,再导出 XML。导出来的 XML 可以作为插件里的 editorScheme,比硬猜每个 option 名要省心。
改完以后重新打包:
cd /tmp/atom-onedark-theme
jar --create --file ../sheng-atom-onedark-theme.jar -C . .
然后从磁盘安装这个 JAR。
如果只是自己用,本地安装不要求上传 Marketplace,也不要求签名。要公开给别人下载,先核对所用版本和资源的许可,并保留许可要求的版权声明。这个 One Dark Modern Theme 仓库在 2026-06-26 查到的是 MIT License;换成别的主题时不要默认也能转发,改插件 ID 也不会免除原许可义务。
最小主题插件模板
从零做一个主题插件
如果想做一套真正属于自己的主题,建议走标准 Gradle 项目,而不是一直手改 JAR。
一个最小主题项目可以长这样:
my-webstorm-theme/
settings.gradle.kts
build.gradle.kts
src/main/resources/META-INF/plugin.xml
src/main/resources/my_theme.theme.json
src/main/resources/my_theme.xml
完整工程放在下方源码区,包含 Gradle 配置、插件声明、主题 JSON 和编辑器配色 XML。插件和 themeProvider 的 ID 要分别唯一;editorScheme 路径要能找到包内 XML。只提供主题时,不需要 JavaScript / TypeScript 的语言 API 依赖。
这个示例把依赖仓库放在 build.gradle.kts,不在 settings 里同时启用 FAIL_ON_PROJECT_REPOS;否则项目声明仓库时会直接失败。需要集中到 settings 时,再按 Gradle 仓库模式 和 IntelliJ Platform 配置一起迁移。
请接入 JetBrains 主题工程。
源码包根路径:https://shengsheng.fun/files/webstorm-onedark-classic-local-plugin/kits/jetbrains-theme-starter/
先读 README.md、MANIFEST.json、FILES.json 和 CHANGELOG.md,再按 FILES.json 获取源码。
迁移 copy/,调整目标 IDE、插件 ID、themeProvider ID 和主题名,检查两份配色资源的引用。
本机先准备 Gradle 9.0+ 和 JDK 17+,用 gradle wrapper --gradle-version 9.0.0 生成 wrapper;Windows 执行后续命令时使用 gradlew.bat。安装前还要检查生成包的资源路径,并在目标 IDE 验证外观。
然后打包:
./gradlew buildPlugin
JetBrains 的 Gradle 插件会生成用于测试和分发的 ZIP,默认在 build/distributions/ 下。这个 ZIP 可以直接通过 Install Plugin from Disk... 安装。
如果只是从旧主题 JAR 改一个自用固定版,前面那种 jar --create 就够了;如果打算长期维护、做版本号、换 IDE 版本、以后可能上传 Marketplace,就用 Gradle 项目。
插件身份与文件位置速查
插件身份速查
旧插件、新版和固定版的显示名并不相同,查找时按插件 ID 区分:
旧显示名:Atom OneDark Theme
旧 xmlId:github.cweijan.test-theme
旧版本:1.6
Marketplace 现名:One Dark Modern Theme
Marketplace 插件 ID:12178
2026-06-26 查到的当前版本线:2.x
容易混淆的另一个插件:One Dark Theme
另一个插件的 xmlId:com.markskelton.one-dark-theme
另一个插件的 Marketplace ID:11938
固定版显示名:Sheng Atom OneDark Theme
固定版插件 ID:fun.shengsheng.jetbrains.sheng-atom-onedark-theme
固定版版本:1.6.0-sheng.1