💡

KDE PlasmaでMozcなどIM使うなら・・ 環境変数を書いちゃダメ。自動起動に入れてもダメ。 というおはなし。

2023/04/30に公開

概要 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が動かない理由はこのデーモンが起動しないからで、それが何故かは・・・スクリプトを解析するしかありません・・・

起動スクリプト 一部抜粋

①70im-config_launch 抜粋
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

以下解析したコメント付きです。

②/usr/share/im-config/xinputrc.common 抜粋
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
}
③/etc/X11/xinit/xinputrc
# 自分の.xinpurcが無ければこちらのファイルが読み込まれdefaultを使って呼び出し。
# 省きますが、defaultの場合何を起動するかは判定されて
# im-config(8) generated on Thu, 27 Apr 2023 14:30:16 +0800
run_im default       
# im-config signature: 0b15851290365537fb84060ea19b03dc  -
⑤/usr/share/im-config/data/21_ibus.rc
# 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' /
脚注
  1. IM:Imput Method 英語以外の言語を入力するためのプログラム ↩︎

  2. デーモン:バックグラウンドで動くプログラム ↩︎

Discussion