做了个 IntelliJ 主题,让我再也不想用 JetBrains 的 IDE 了

360 天前
 anson0370

大家好,前不久分享了下我们的 HardHacker 的主题,有些朋友表示想要 JetBrains 的版本。讲道理我也是写了十几年 Java 的,那还有什么好说的,整💪。

目前已经整了一个算是可用的版本了,大家可以在 Marketplace 里搜索 HardHacker 找到。

这里也丢个图:

只能说真的是无知者无畏,下次谁再让我给 IntelliJ 做主题,我谢谢他🙏。以下都是吐槽,也算是我踩到的坑,分享出来给也想要做 IntelliJ 主题的勇士参考一下,不感兴趣的朋友就可以直接略过了。


出师不利,官方教程跑不通

首先我们打开官方文档,找到 Theme 的部分。IntelliJ 的 Theme 也是 plugin 的一种,JetBrains 专门为 Theme 做了一个简化的工程和创建流程。看起来很简单,next 、next 、run ,喜提 ClassNotFoundException 。经过亿点点研究之后,我发现是 IDEA 在 run Theme plugin 的时候 classpath 里少了个 IDEA 自己的 jar ,但是没找到办法自定义 run Theme plugin 的时候的 classpath 。

于是又经过亿点点搜索之后,我找到了这个:

相关 issue 在这:https://youtrack.jetbrains.com/issue/IDEA-302414 。好嘛,7 months ago 。不过 JB 家 bug 常年不修也是传统了🤷🏻‍♂️,只要有 workaround 那也行。


Schema 困惑之旅

把我的 theme 切换成 gradle 工程之后,总算可以跑起来了。

众所周知,IntelliJ 的样式分成 theme 和 schema 两部分,theme 控制 UI ,而 schema 则控制 editor 的内容。(这里就要给 vscode 磕一个了,它就不分,开发 theme 的体验非常舒爽)

由于我之前在 Github 上找到一个 JB 官方的 schema converter:JetBrains/colorSchemeTool (github.com) 。用它可以把 vscode 的 theme 转换成 IntelliJ 的 schema ,我决定从它的转换结果开始。然后困惑之旅就开始了。

不知道 key 值是什么

IntelliJ 的 schema 是个 XML 文件,大概长这样:

<scheme name="Hard Hacker" parent_scheme="Darcula" version="142">
  <colors>
    <option name="SELECTION_BACKGROUND" value="3f3951"/>
	</colors>
	<attributes>
    <option name="HYPERLINK_ATTRIBUTES">
      <value>
        <option name="FOREGROUND" value="e192ef"/>
        <option name="EFFECT_TYPE" value="1"/>
        <option name="EFFECT_COLOR" value="e192ef"/>
      </value>
    </option>
  </attributes>
</scheme>

看起来挺清晰的,但问题是这个 option 的 name 是完全没有文档的。官方的意思是你看着我们内置的主题文件自己猜吧:intellij-community/highContrastScheme.xml at idea/231.8109.175 · JetBrains/intellij-community · GitHub

这些 name 命名毫无规律,比如:

你想从中找到规律?主打的就是一个没有规律。✌️🤬

那么怎么才能准确找到你想改的 option 呢?特别是上面提到的那个 JB 官方转换工具的转换结果还缺斤少两的情况下?就此事我和 ChatGPT 探讨了一下,它给了我一个建议:你直接在 IDE 的 settings 里改,然后导出,再查找。你别说还真管用……我只需要找到那个配置,然后把颜色改成比如 334554 ,123456 ,然后导出来打开,cmd + f 即可……

默认值逻辑乱七八糟

IntelliJ 的 schema 里,不同 scope 之间是有继承关系的。比如 Java 的 keyword 会继承 default 的 keyword 。这很方便,但同样的,这部分也没规律。简单来说就是有时候你直接不管,它自动就继承了,而有时候你又必须显式声明,否则它就会有一个默认的💩一样的配色:

<option name="XPATH.KEYWORD" baseAttributes="DEFAULT_KEYWORD"/>

魔法数字

注意看我刚才贴的 schema 文件的内容第一行:

<scheme name="Hard Hacker" parent_scheme="Darcula" version="142">

version 是 142 ,但别问我为什么是 142 ,我只知道我改成 143 不行,但我改成 143 再改回 142 似乎可以刷新某种 cache 🧙‍♂️!因为你会发现当你在 devkit 的 IDEA 中改了 schema 并保存后,有一定概率你再改 schema 文件它不生效!此时就可以用这个 143/142 大法。

然后这个 parent_scheme 是 Darcula ( IntelliJ 自己有个 Darcula 主题,并不是那个 Dracula themes ),你改成别的比如 Dark 也是没用的。还有这 Darcula 拼错了吧喂?

不能 hotreload

这就不得不再提一下 vscode 了,保存实时生效,简直太方便了🧎🏻‍♂️。但 IntelliJ 这个你要么重新手动 import 一下,要么直接 rerun plugin ,然后等它重新启动一个 devkit 的 IDEA 。

搞了几次之后我就学乖了,我在 notion 里列了一个 TODO list ,一次改一批然后列进去。重启一次之后对着这个 TODO list 再一个一个检查……

不支持透明度

都 2023 年了。唯一支持透明度的是 editor 里的滚动条。


困惑加倍,快乐归零

说完 schema ,我们来看看 theme 部分。基本上 schema 部分的槽点,theme 部分都占了。比如找不到 key (官方给了一个 LaF 工具,但也只能看到 key 值,并不知道具体对应哪里,得不断修改来尝试);比如不能 hotreload 等等。此外因为 2023 的 New UI 还在 beta 阶段,所以有些 UI 样式改不了,所以如果你安装了主题之后发现有些地方不协调,那很可能就是因为……改不了。

但最让我抓狂的是 code suggestion 的弹出框,就是这个东西:

为了调这个东西,花了我大半天时间。因为……这东西别的都归 theme 管,唯独背景色归 schema 管!我 TM 带着无比的困惑在 LaF 和别人的主题文件里找它的背景色找了两个小时!两个小时!🤬🤬🤬


经过两天的折腾,我算是知道为什么 IntelliJ 的主题这么少了,就这开发体验没点共产主义吃苦耐劳的优良品质都坚持不下去。

写到这里的时候我突然想起来自己以前在 youtrack 上 star 过的一些 issues ,我就去翻了一下。好家伙 9 years ago 的 issue 还开着呢,7 months 简直不值一提。

说实话就 schema 里那些 attribute names 的混乱情况,让我很难相信 IntelliJ 里面的代码不是一坨💩⛰️……

年年更新大版本,就不能解决一下这些历史遗留问题吗?突出一个能跑就行。这么想想好像拿 Fleet 来彻底解决一下是个合理的思路,虽然 JB 说的挺好听的 Fleet 和 IntelliJ 不存在竞争关系,但这不是明摆着前浪后浪的事?

想想自己从 09 年开始用 IntelliJ IDEA ,到今天 IDEA 也显出老态了。Anyway ,欢迎大家试用主题。

11892 次点击
所在节点    程序员
93 条回复
encro
360 天前
IntelliJ 每位员工收入约 35 万美元。
ohmycorolla
360 天前
已下载,配色非常喜欢,这个粉红色很骚
fiveStarLaoliang
360 天前
IDEA 感觉确实就像廉颇老矣, 尚能饭否, 未来真的可能被 vscode 取代了
Doracis
360 天前
老哥 我知道这么说确实很过分,但是能不能再出一个白天版的,重度散光程序员看不清黑啊 TAT
anson0370
360 天前
@ohmycorolla 感谢喜欢,也欢迎使用该配色的 VSCode 、VIM 、emacs 、iTerm2 等等版本 🤣
anson0370
360 天前
@Doracis 我有在考虑这个问题,虽说亮色版的有点不太符合我们 HardHacker 的定位,但确实对散光比较友好。关键得把配色定一下,做一下倒是不麻烦,因为我未雨绸缪都写了脚本来生成。回头弄好了我来 at 你。
anson0370
360 天前
@encro 这就是他们 9 年前的 bug 也不修的底气吗 😂
anson0370
360 天前
@fiveStarLaoliang 实际上我前几年已经在用 VSCode 写 Java 了。
jy02201949
360 天前
哈哈哈 看了楼主心路历程,好奇这 IDE 是怎么做到如今这个地位的
LokiSharp
360 天前
任何项目大了都会成为屎山,哈哈哈
Danswerme
360 天前
心酸的历程🤣 另外我想知道楼主和 ChatGPT 探讨这个问题是怎样提问的呢?
ffkjjj
360 天前
@anson0370 #6 插个眼
scyuns
360 天前
感谢 OP 的踩坑之路,期待楼主分享一下 VSCode 的 Java 实践
Mandyer
360 天前
windows 市场里没搜到呢
Vitta
360 天前
能整个 SynthWave 这样的主题么,我太喜欢这个骚主题了
clf
360 天前
JetBrains 最近的几个版本的 IDE 更新都有毒。我平时也会为我司写 IDEA 开发插件的。

第一次的坑是 2021 到 2022 大版本更新后,IDEA 创建项目的 API 被修改了,之前写的在列表上看不到了,而创建项目的文档还是没变化,最后是直接从社区版的源码里找了一个插件的代码参考的。( 2021 版本能正常创建项目,2022 版本无法在项目列表里看到)

比如 2022.2 到 2022.3 ,印象里是升级了 JDK17 ,结果一堆官方插件没有升级,限制版本号到 2022.2 ,而我开发的插件由于引入了官方的 git 插件,所以被限制 22.3 无法使用。解决方案就是等官方插件升级。最后直接去掉了 git 插件依赖,砍了一部分功能。

————————

之前打算迁移到 VSCode 的,但因为 VSCode Springboot 相关开发以及 Dubbo 开发不如 IDEA 好用,所以最后还是选择继续留在 IDEA 了,团队估计会把大版本停留在 22 或者 23 (因为后面不给报销了)
LongerAng
360 天前
搜不到,是有什么限制吗?
declandragon
360 天前
大佬牛批,我使用的是 PhpStorm 2021.2 ,没法使用你的主题😁
ijaysdev
360 天前
同样在 Marketplace 没有搜到,用的 Android Studio 2023.1.1
caiqichang
360 天前
以前开发过 intellij 插件,那版本兼容性真的是一言难尽

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/937267

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX