KDE PlasmaでMozcなどIM使うなら・・ 環境変数を書いちゃダメ。自動起動に入れてもダメ。 というおはなし。
概要 Overview
新しく入れたUbuntu23.04Server版にplasma-desktopパッケージを入れてKDEをいじっていたら、いきなり日本語IM[1] (ibus)が起動しなくなりました。
Ubuntu Desktopも入れたから?適当に設定弄ったから?
試しに違う仮想環境にKubuntuパッケージ入れたら、ちゃんと動きます・・・。
仕方ない・・・今回はLinux KDEの日本語設定をレッツハック!
環境 Environment
Hard Ware
Macbook air(2020 M1)
Parallels Desktop 18.2.0
OS
Ubuntu23.04 Server + KDE Plasma-desktop
結論 Conclusion
KDE環境でibusを使用する場合、IM関係の環境変数を自分で設定するのはやめよう!
情報整理
状況
・デスクトップが起動してもibusのアイコンが表示されず、使用もできない。
・ibus設定アプリを起動すると、ibusデーモン[2]動いてないよ。起動する?と聞かれる。
そして起動するとその後はibusが使える。
・デスクトップの設定から自動起動(Auto Start)にデーモン起動コマンドを入れると使える。
・しかし上記2つの方法で起動しても下記問題がでる
1 変換候補などの表示位置がおかしい
2 IMのON/OFFがキーボードでできない
・im-configを使って、ibusを設定しても起動しない。
・aptコマンドでibus-mozcや、im-configを入れ直しても治らない
ドキュメント探索
ネット検索結果では下記のような結果が多かったです。が、この方法はお勧めしません。
・デスクトップ起動時に起動するよう設定すれば良い
・KDEなら自分で$XMODIFIERS
$GTK_IM_MODULE
などの環境変数を設定すれば動く
解決にいたる道
ヒント
覚悟決めて下記の資料を読みました。英語しかありません。
・man ibus
・man im-config
・/usr/share/doc/im-config/README.Debian.gz
・/usr/share/doc/im-config/README.internal.gz
そこに書かれていたIM起動の流れを追いかけて読んだ設定ファイルは
/etc/X11/Xsession.d/70im-config_launch ・・・①
/usr/share/im-config/xinputrc.common ・・・②
/etc/X11/xinit/xinputrc ・・・③ システムデフォルト
~/.xinputrc ・・・③ 個人定義(あればこちら優先)
/etc/default/im-config ・・・④ デフォルトで何を起動するか定義
/usr/share/im-config/data/ ・・・⑤ 最終実行されるファイルはこの中
00_default.conf 00_default.rc 01_auto.conf 01_auto.rc
02_cjkv.conf 02_cjkv.rc 09_REMOVE.conf 09_REMOVE.rc
21_ibus.conf 21_ibus.rc 22_fcitx.conf 22_fcitx.rc
23_fcitx5.conf 23_fcitx5.rc 24_uim.conf 24_uim.rc
25_hime.conf 25_hime.rc 26_gcin.conf 26_gcin.rc
30_maliit.conf 30_maliit.rc 48_scim.conf 48_scim.rc
60_thai.conf 60_thai.rc 78_none.conf 78_none.rc
79_xim.conf 79_xim.rc 80_kinput2.conf 80_kinput2.rc
80_xsunpinyin.conf 80_xsunpinyin.rc 90_bogus.conf 90_bogus.rc
90_custom.conf 90_custom.rc 90_missing.conf 90_missing.rc
判明したIM起動の流れ
まず、Linuxの起動はざっくり下記の図の流れになります。
上記CでXを起動する(あのログイン画面を管理する)Xsessionというプログラムは、起動時に/etc/X11/Xsession.d/
の中にあるファイルをファイル名の最初にある番号順に処理しますが、im-configがインストールされる時、そこに70im-config_launch
を置きます。これがトリガーです。このファイルが各種設定ファイルを読み込み、環境変数を設定し、IMデーモンを起動します。
とはいえ私の環境でibusが動かない理由はこのデーモンが起動しないからで、それが何故かは・・・スクリプトを解析するしかありません・・・
起動スクリプト 一部抜粋
if [ -z "$XMODIFIERS" ] && \ # !これらの環境変数が設定されていなくて!
[ -z "$GTK_IM_MODULE" ] && \ # !②xinpurc.commonが読める時だけ !
[ -z "$QT_IM_MODULE" ] && \
[ -z "$CLUTTER_IM_MODULE" ] && \
[ -z "$SDL_IM_MODULE" ] && \
[ -r /usr/share/im-config/xinputrc.common ]; then
IM_CONFIG_PHASE=1
export IM_CONFIG_PHASE
# initialize all im-config common functions and parameters
. /usr/share/im-config/xinputrc.common # ここで②xinputrc.commonを実行
unset TEXTDOMAIN
unset TEXTDOMAINDIR
# source the first found configuration file
if [ -r "$IM_CONFIG_XINPUTRC_USR" ]; then
. $IM_CONFIG_XINPUTRC_USR # ここで③xinputrcを実行
elif [ -r "$IM_CONFIG_XINPUTRC_SYS" ]; then
. $IM_CONFIG_XINPUTRC_SYS
fi
# always export variables even for manual configuration.
export XMODIFIERS
export GTK_IM_MODULE
export QT_IM_MODULE
export CLUTTER_IM_MODULE
export SDL_IM_MODULE
fi
以下解析したコメント付きです。
IM_CONFIG_VERSION=0.57-1
IM_CONFIG_DATA=/usr/share/im-config/data
IM_CONFIG_XINPUTRC_USR=$HOME/.xinputrc
IM_CONFIG_XINPUTRC_SYS=/etc/X11/xinit/xinputrc
IM_CONFIG_DEFAULT=/etc/default/im-config
IM_CONFIG_VERBOSE=false
. gettext.sh
TEXTDOMAIN="im-config"
export TEXTDOMAIN
TEXTDOMAINDIR="/usr/share/locale/"
export TEXTDOMAINDIR
----
略 snip
----
if [ -r $IM_CONFIG_DEFAULT ]; then # ④im-configを実行。これにより下記で
. $IM_CONFIG_DEFAULT # デフォルト時のIM優先順位を決定。中国語なら
fi # 相性が悪いibusよりfcitx5を優先など。
IM_CONFIG_LC_CTYPE=$(locale | sed -nr 's/LC_CTYPE=\"?([a-zA-Z_]*).*/\1/p')
IM_CONFIG_PREFERRED=$(echo "$IM_CONFIG_PREFERRED_RULE"| sed -rn "s/(^|.*:)${IM_CONFIG_LC_CTYPE},([^:]*)($|:.*$)/\2/p")
----
略 snip
----
# ③xinputrcで実行される関数
# run_im <config>
run_im () {
IM_CONFIG_CODE="run_im"
if [ -r $IM_CONFIG_DATA/[012345678]?_$1.rc ]; then
. $IM_CONFIG_DATA/[012345678]?_$1.rc
IM_CONFIG_NAME=$1
if $IM_CONFIG_VERBOSE ; then
eval_gettext "I: Script for \$IM_CONFIG_NAME started at \$IM_CONFIG_CODE." >&2
echo >&2
fi
else
IM_CONFIG_NAME=$1
eval_gettext "E: Script for \$IM_CONFIG_NAME not found at \$IM_CONFIG_CODE." >&2
echo >&2
fi
}
# 自分の.xinpurcが無ければこちらのファイルが読み込まれdefaultを使って呼び出し。
# 省きますが、defaultの場合何を起動するかは判定されて
# im-config(8) generated on Thu, 27 Apr 2023 14:30:16 +0800
run_im default
# im-config signature: 0b15851290365537fb84060ea19b03dc -
# start IBus #defaultで日本語環境が入っている場合、結局これが呼ばれる
----
略 snip
----
if [ "$IM_CONFIG_PHASE" = 2 ]; then
# start IBus daemon and IM panel # きました!ここがデーモン起動の場所!(涙)
IBUS_ENABLE_SYNC_MODE=0 /usr/bin/ibus-daemon --daemonize --xim
fi
if [ "$IM_CONFIG_PHASE" = 1 ]; then
# set variables for the plain XIM
XMODIFIERS=@im=ibus
# Let's assume all required modules are installed
GTK_IM_MODULE=ibus
QT_IM_MODULE=ibus
CLUTTER_IM_MODULE=ibus
fi
まとめ
結論、私の環境で起動しなかった理由は、環境変数を自分で定義していたからでした。しかも、書き込んだその日はもうIMが起動している為に気づかず、次の日システムを再起動した時にトラップ発動。
もし、同じような人がいたら、究極は下記のコマンドでシステム内全検索して探す手が・・・
ただし、”自己責任”でお願いします。
grep -rsoI '$XMODIFIERS' /
Discussion