Help us understand the problem. What is going on with this article?

ibus-setup-kkcがエラーを吐いて困る

まずはじめに伝えておきたいこと

完全に私が悪いです。
すべてが解決した今、ibus-kkcは安定していますし、何の不満もありません。
私と同じようなミスをしてしまった人のために記録に残そうと思います。

経緯

古くからATOKユーザの私はkkcのキーバインドのATOKにしたい。upstreamにはATOKキーバインドが既にmergeされており、Debianパッケージのバージョンには含まれていなかったため、upstreamから設定部分だけ持ってこようとしました。そして失敗しました。しつこいようですが完全に私が悪いです。

その際、表示されたエラーは下のとおり。

$ /usr/lib/ibus/ibus-setup-kkc 
**
ERROR:setup.c:2389:setup_dialog_populate_shortcut_treeview: assertion failed: (parent_metadata != null)
Bail out! ERROR:setup.c:2389:setup_dialog_populate_shortcut_treeview: assertion failed: (parent_metadata != null)
Aborted (core dumped)

多分、どこかにATOKリファンレスを参照する設定が残っていることが原因と思い、原因を追いました。

ソースコードのエラー箇所を探す

https://github.com/ueno/ibus-kkc/blob/v1.5.22/src/setup.vala

469     void populate_shortcut_treeview (Kkc.InputMode input_mode) {
470         Variant? variant = preferences.get ("typing_rule");
471         assert (variant != null);
472
473         var parent_metadata = Kkc.RuleMetadata.find (variant.get_string ());
474         assert (parent_metadata != null);
475

474行目。parent_metadataがエラー表示されているのと、関数名が一致していることから怪しい。
ここでは、名前"typing_rule"で保存された設定情報に基づいて、kkcのルールを探そうとしています。kkcのルールが存在せずassertされていますので、typing_ruleがどこに保存されているか、今の値が何か、がはっきりすれば修正できそうです。

アクセスするファイルを特定する

どこかのファイルから設定情報を読み込んでいるはず。githubにソースコードはあるもののリコンパイルするのもひと手間なので、とりあえずトレースしてみました。

$ strace -o strace.log /usr/lib/ibus/ibus-setup-kkc

存在しないファイルは除外。/usr,/etcなどシステム全体で扱うようなファイルはPermissionの都合で変更出来無いことから除外。/home以下に存在するファイルに絞っていきます。

$ grep /home/hiromotai/.config strace.log | grep -v NOENT 
openat(AT_FDCWD, "/home/hiromotai/.config/dconf/user", O_RDONLY) = 8
access("/home/hiromotai/.config/gtk-3.0/settings.ini", F_OK) = 0
openat(AT_FDCWD, "/home/hiromotai/.config/gtk-3.0/settings.ini", O_RDONLY) = 13
mkdir("/home/hiromotai/.config/ibus/bus", 0700) = -1 EEXIST (ファイルが存在します)
stat("/home/hiromotai/.config/ibus/bus", {st_mode=S_IFDIR|0700, st_size=4096, ...}) = 0
stat("/home/hiromotai/.config/ibus/bus", {st_mode=S_IFDIR|0700, st_size=4096, ...}) = 0
inotify_add_watch(13, "/home/hiromotai/.config/ibus/bus", IN_MODIFY|IN_ATTRIB|IN_CLOSE_WRITE|IN_MOVED_FROM|IN_MOVED_TO|IN_CREATE|IN_DELETE|IN_DELETE_SELF|IN_MOVE_SELF|IN_UNMOUNT|IN_ONLYDIR) = 1
openat(AT_FDCWD, "/home/hiromotai/.config/ibus/bus/838350fdf26046b0b7dc4b20674d3783-unix-wayland-0", O_RDONLY) = 14

ディレクトリエントリを除くと、"/home/hiromotai/.config/dconf/user" に絞られました。これが怪しいですね。

dconf

wikipediaによると、dconfとはシステム設定の塊のようです。

dconf is a low-level configuration system and settings management tool. Its main purpose is to provide a back end to GSettings on platforms that don't already have configuration storage systems.

探してみるとatokエントリを発見しました。defaultに戻して修正完了です。

$ dconf dump /desktop/ibus/engine/kkc/
[/]
show-annotation=true
typing-rule='atok'

参考文献

以上,誰かの参考になれば幸いです。

hiromotai7
Debian user for 18+ years.
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away