修改 Intellij-idea 终端的光标 Cursor 样式

这是一篇我从原来的老博客拷贝过来的,到今天已经 过时 的文章了。

IntelliJ IDEA 2021.2.1 版本之后已经直接有这个配置选项。

Settings -> Tools -> Terminal -> Cursor Shape

原来的时候,由于强迫症,在 Windows + WSL Terminal 上很不习惯终端里默认的方块光标样式。网上搜了一堆都没找到什么解决方案,最后在 StackOverflow 上找到了灵感 🔗

The terminal plugin uses Jediterm, a Java based terminal emulator written by JetBrains

Most of the drawing of the terminal window is handled in TerminalPanel.java and has a nested class called TerminalCursor

我理解的大意是 IDEA 自己写了一个叫 Jediterm 的终端,里面和光标有关的的渲染方法在 TerminalPanel$TerminalCursor 里面。

灵机一动,去安装目录的 lib 目录里果然找到了一个 jediterm-pty-2.32.jar (IntelliJ IDEA 2020.3.2)

把这个 jar 包反编译查看代码,找到 TerminalPanel$TerminalCursor 这个内部类

可以看到类的构造方法里写死了光标类型为 CursorShape.BLINK_BLOCK,字段虽然有 set 方法,但是并没有设置入口。

package com.jediterm.terminal.ui;

public TerminalCursor() {
    this.myShape = CursorShape.BLINK_BLOCK;
    this.myShouldDrawCursor = true;
    this.myBlinking = true;
}

其他可选的枚举值如下

package com.jediterm.terminal;

public enum CursorShape {
    BLINK_BLOCK,
    STEADY_BLOCK,
    BLINK_UNDERLINE,
    STEADY_UNDERLINE,
    BLINK_VERTICAL_BAR,
    STEADY_VERTICAL_BAR;
}

于是很明显的就有了下一个思路,想办法修改 jar 包里的 class 文件


以下内容参考 How to edit class file from a jar

  1. 先备份原文件,然后把 jar 包放到一个新建文件夹里操作解包 jar xvf jediterm-pty-2.32.jar

  2. 下载 Java Bytecode Editor,运行 .\jbe.bat 启动,打开 TerminalPanel$TerminalCursor.class

  3. 按照下图修改为你想要的光标枚举值,这里我选的是 BLINK_VERTICAL_BAR,然后保存修改

  4. 把修改好的 jar 包用 IDEA 或者 jd-gui 检查下

  5. 重新打包 jar cvfm jediterm-pty-2.32.jar ./META-INF/MANIFEST.MF ./

  6. 替换原文件,重启 IDEA,发现光标样式确实变成了闪烁的竖线。