IntelliJ IDEA 在 Linux 环境中如果不经过设置的话,默认情况下是无法输入中文的。当按照网上的教程设置好后还是会出现候选词面板位置不跟随输入光标的情况。这个问题从我开始接触 Linux 就有,直到现在,仍然是一个 Linux 用户绕不开的话题。

首先是中文输入的问题。这里首先要安装中文输入法。

1
sudo pacman -S fcitx5 fcitx5-im fcitx5-qt fcitx5-gtk fcitx5-chinese-addons fcitx5-configtool fcitx5-rime 

创建文件 ~/.pam_environment,内容如下

1
2
3
4
5
6
GTK_IM_MODULE DEFAULT=fcitx
QT_IM_MODULE DEFAULT=fcitx
XMODIFIERS DEFAULT=\@im=fcitx
INPUT_METHOD DEFAULT=fcitx
SDL_IM_MODULE DEFAULT=fcitx
GLFW_IM_MODULE DEFAULT=ibus

重新启动后将 Rime 添加为第二输入法。至此在终端或浏览器中已经可以正常切换中文输入法输入汉字了。使用 Rime 默认输入的可能是繁体字,可以使用快捷键 F4 切换为简体输入。但是在 IntelliJ IDEA 中,可能会出现输入法无法切出来或者能切出来但是汉字无法输入到编辑器的情况,这里提供一种我的解决方案,供大家参考。

首先检查一下 locale 配置,locale -a 看一下结果中是否有 zh_CN.utf8,如果没有请先修改 /etc/locale.gen 文件将 zh_CN.utf8 取消注释,然后使用 sudo locale-gen 重新生成。然后编辑 idea.sh 文件,加入如下几行,重新启动 IDEA 后应该就能正常输入中文啦,只是会有窗口不跟随的问题。

1
2
3
4
5
6
7
8
9
10
11
12
# ---------------------------------------------------------------------
# Run the IDE.
# ---------------------------------------------------------------------

export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XIM=fcitx
export XIM_PROGRAM=fcitx
export XMODIFIERS="@im=fcitx"
export SDL_IM_MODULE=fcitx
export LC_CTYPE=zh_CN.UTF-8

到这里实际上已经解决了中文输入法基本使用的问题,如果要解决提示窗口不跟随的问题,需要自行编译 Jetbrains 的 JDK 运行环境,打上社区提供的补丁。

https://github.com/JetBrains/JetBrainsRuntime 这是 JetBrainsRuntime 也就是提供给 IDEA 等开发工具的运行时 JDK 环境。其编译步骤和 OpenJDK 一样,编译后得到的产物本质上就是一个 JDK 环境。 详细步骤如下

首先获取 JetBrainsRuntime

1
git clone https://github.com/JetBrains/JetBrainsRuntime

默认在 master 分支,这里网上流传的补丁是 https://github.com/prehonor/myJetBrainsRuntime,此补丁的使用方法可以参考这篇文章 https://zhuanlan.zhihu.com/p/269573929 不再细表。但是这个补丁必须先检出到一个历史的(接近 2 年了)提交 cfc3e87f2ac27a0b8c78c729c113aa52535feff6 然后再打补丁,这意味着我们获取到的代码已经不是最新的了,如果让 IntelliJ IDEA 使用这个两年前的版本编译出来的运行时环境,是有出现意想不到的问题的隐患的。另一方面,对于我来说,最重要的一个问题是根本就无法编译了,因为我的 gcc 和 make 的版本都比较新。我对照着这个 patch 和最新的 JetBrainsRuntime 代码,自己生成了一个新的 patch 文件 https://github.com/uLxy/JetbrainsRuntime-ChineseIMPositionFixed 基于目前最新的提交 d9366800c84eb5cddac8966ea3e246ef0cfff2bc,使得编译正常进行。

编译完成后,在 IDEA 中按 Ctrl+Shift+A 选择 Choose Boot Java Runtime ... 然后选择编译生成的 JDK 目录即可

如果你和我一样屏幕分辨率较高,可能会出现窗口的位置出现在光标偏坐上一点的情况,仔细观察会发现其 XY 坐标正好是正确位置的一半。猜测是由于设置了 2 倍的 DPI 缩放造成的,其实是有不少用户也遇到了同样的问题。

解决这个问题的方法比较简单,将原先的 XY 坐标的值乘以 2 即可。即将 patch 文件中的

1
result = new int[]{point.x - c.getPeer().getLocationOnScreen().x + caret_x, point.y - c.getPeer().getLocationOnScreen().y + font_height + caret_y};

修改为

1
result = new int[]{2*(point.x - c.getPeer().getLocationOnScreen().x + caret_x), 2*(point.y - c.getPeer().getLocationOnScreen().y + font_height + caret_y)};

这个 2 就是缩放的倍数,需要根据实际情况去设置。最终的效果图如下,强迫症患者直呼过瘾。