═══ AppImage 裡面不能打中文 ═══ ◆ 原理​ 因為 AppImage 幾乎都只帶 ibus 外掛,而不帶 fcitx 外掛。所以把系統的輸入法協定從 fcitx 改成 ibus 就修好了。 實際檢查 MuseScore 4.5.2 的內容: plugins/platforminputcontexts/libcomposeplatforminputcontextplugin.so plugins/platforminputcontexts/libibusplatforminputcontextplugin.so 只有 compose 和 ibus,沒有 fcitx。 而系統原本設定是: GTK_IM_MODULE=fcitx QT_IM_MODULE=fcitx 程式被叫去找 fcitx 外掛,找不到,所以輸入法完全不接,只能打英文。 而 fcitx5 其實有內建一個 ibus 前端模組。 /usr/lib/x86_64-linux-gnu/fcitx5/libibusfrontend.so 它啟動後會去佔用 org.freedesktop.IBus 這個 D-Bus 名稱,等於 fcitx5 對外「假裝自 己是 ibus」。所以程式要 ibus 協定時,fcitx5 的 ibus 前端接住,就還是可以用 fcitx5 的輸入法。 ◆ 改的檔案:~/.xsessionrc​ 在檔案最後面加上這段: # --- Input method: route everything through fcitx5's IBus frontend --- # AppImages bundle their own Qt/GTK without the fcitx plugin, but almost all # of them ship the ibus one. fcitx5 owns org.freedesktop.IBus, so speaking # "ibus" works for both bundled and system toolkits. export XMODIFIERS=@im=fcitx export GTK_IM_MODULE=ibus export QT_IM_MODULE=ibus export CLUTTER_IM_MODULE=ibus export SDL_IM_MODULE=ibus export GLFW_IM_MODULE=ibus XMODIFIERS 刻意保持 @im=fcitx,那是給老式 XIM 程式用的,走另一條路,不要動它。 ◆ 為什麼一定要放 ~/.xsessionrc(重要,別搬到別的地方)​ X11 登入時 /etc/X11/Xsession.d/ 裡的腳本是照編號順序執行的: 40x11-common_xsessionrc ← 這一步會讀 ~/.xsessionrc(我們的設定在這) ... 70im-config_launch ← im-config 在這一步才想設定輸入法變數 而 70im-config_launch 裡面寫著這樣的判斷: # If already tweaked, keep hands off :-) if [ -z "$XMODIFIERS" ] && [ -z "$GTK_IM_MODULE" ] && [ -z "$QT_IM_MODULE" ] && ... 意思是「這些變數如果已經有人設過了,我就不插手」。 所以我們在第 40 步先設好,第 70 步 im-config 自動閃開,我們的設定會留下來。但 im-config 啟動 fcitx5 的那段程式碼在 if 判斷之外,所以 fcitx5 照常會被啟動,兩 全其美。 放 ~/.profile 或 ~/.bashrc 沒用(那些是給終端機用的,圖形程式讀不到,而且時機也 不對)。放 ~/.pam_environment 也不建議(不支援註解與條件判斷,且已被 Ubuntu 淡 出)。 ◆ 怎麼確認有生效​ 環境變數只在登入時讀一次,改完一定要登出重進,不然舊值還留著。 檢查: env | grep -E 'IM_MODULE|XMODIFIERS' 應該要看到: GTK_IM_MODULE=ibus QT_IM_MODULE=ibus CLUTTER_IM_MODULE=ibus SDL_IM_MODULE=ibus GLFW_IM_MODULE=ibus XMODIFIERS=@im=fcitx 檢查 fcitx5 有在跑,而且 ibus-daemon 沒有在跑: ps -ef | grep -E 'fcitx|ibus-daemon' | grep -v grep 應該只看到 /usr/bin/fcitx5 -d 一個。如果看到 ibus-daemon,那是壞事,它會跟 fcitx5 搶 org.freedesktop.IBus,要把它關掉。 檢查 D-Bus 名稱是被 fcitx5 佔著(最關鍵的一項): dbus-send --session --dest=org.freedesktop.DBus --type=method_call --print-reply \ /org/freedesktop/DBus org.freedesktop.DBus.ListNames | grep -iE 'ibus|fcitx' 應該同時看到 org.fcitx.Fcitx5 和 org.freedesktop.IBus。兩個都在 = fcitx5 正在扮 演 ibus 伺服器。 再看一下這個檔: cat ~/.config/ibus/bus/*-unix-0 如果內容裡出現 fcitx_random_string=...,就百分之百確定是 fcitx5 寫的,不是真的 ibus。 檢查:直接開 AppImage 打字 隨便開一個有輸入框的,例如: ~/AppImage/MuseScore-Studio-4.5.2.251141401-x86_64_7265d111740deecd058ce7a99d0902c9.AppImage Ctrl+Space 切輸入法,能打中文就成功。 ◆ 如果不想登出、只想先試單一程式​ 在指令前面臨時加變數即可,不影響系統設定: GTK_IM_MODULE=ibus QT_IM_MODULE=ibus ~/AppImage/某某.AppImage